diff --git a/src/main/java/net/minecraft/client/world/WorldClient.java b/src/main/java/net/minecraft/client/world/WorldClient.java
index f48ca5388..639f0944d 100644
--- a/src/main/java/net/minecraft/client/world/WorldClient.java
+++ b/src/main/java/net/minecraft/client/world/WorldClient.java
@@ -3,6 +3,7 @@ package net.minecraft.client.world;
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.net.handler.ClientPacketHandler;
 import net.minecraft.client.world.chunk.provider.ChunkProviderClient;
+import net.minecraft.core.data.gamerule.GameRules;
 import net.minecraft.core.data.registry.Registries;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.net.packet.DisconnectPacket;
@@ -67,6 +68,9 @@ public class WorldClient extends World {
                 super.markBlockNeedsUpdate(worldblockpositiontype.x, worldblockpositiontype.y, worldblockpositiontype.z);
                 positionTypesList.remove(l--);
             }
+        }
+        if(getGameRuleValue(GameRules.DO_DAY_CYCLE)) {
+            levelData.setWorldTime(levelData.getWorldTime() + 1L);
         }
 		updateSeasonAndLight();
         if(rainbowTicks > 0)
diff --git a/src/main/java/net/minecraft/core/block/DoorBlock.java b/src/main/java/net/minecraft/core/block/DoorBlock.java
index db5e9d83a..c829e33c5 100644
--- a/src/main/java/net/minecraft/core/block/DoorBlock.java
+++ b/src/main/java/net/minecraft/core/block/DoorBlock.java
@@ -327,6 +327,12 @@ public class DoorBlock extends Block implements IPaintable
         return Material.PISTON_DESTROY_ON_PUSH;
     }
 
+
+    @Override
+    public boolean canBePainted() {
+        return blockMaterial == Material.wood;
+    }
+
     @Override
     public void setColor(World world, int x, int y, int z, DyeColor color) {
         final int meta = world.getBlockMetadata(x, y, z);
diff --git a/src/main/java/net/minecraft/core/block/IPaintable.java b/src/main/java/net/minecraft/core/block/IPaintable.java
index 8accbcf5b..f1a4dba35 100644
--- a/src/main/java/net/minecraft/core/block/IPaintable.java
+++ b/src/main/java/net/minecraft/core/block/IPaintable.java
@@ -4,5 +4,6 @@ import net.minecraft.core.util.helper.DyeColor;
 import net.minecraft.core.world.World;
 
 public interface IPaintable {
+    default boolean canBePainted() { return true; }
     void setColor(World world, int x, int y, int z, DyeColor color);
 }
diff --git a/src/main/java/net/minecraft/core/block/RedstoneWireBlock.java b/src/main/java/net/minecraft/core/block/RedstoneWireBlock.java
index 71ffae273..f6e1339a0 100644
--- a/src/main/java/net/minecraft/core/block/RedstoneWireBlock.java
+++ b/src/main/java/net/minecraft/core/block/RedstoneWireBlock.java
@@ -102,10 +102,13 @@ public class RedstoneWireBlock extends Block {
             }
         }
         if (strength != newStrength) {
-            world.noNeighborUpdate = true;
-            world.setBlockMetadataWithNotify(x0, y0, z0, newStrength);
-            world.markBlocksDirty(x0, y0, z0, x0, y0, z0);
-            world.noNeighborUpdate = false;
+            int blockId = world.getBlockId(x0, y0, z0);
+            if (blockId == id || blockId == Blocks.FLUID_LAVA_STILL.id || blockId == Blocks.FLUID_LAVA_FLOWING.id) { // Intentionally keeping lava transmutation, do not delete carelessly
+                world.noNeighborUpdate = true;
+                world.setBlockMetadataWithNotify(x0, y0, z0, newStrength);
+                world.markBlocksDirty(x0, y0, z0, x0, y0, z0);
+                world.noNeighborUpdate = false;
+            }
             for (int i = 0; i < 4; i++) {
                 int xi = x0;
                 int zi = z0;
diff --git a/src/main/java/net/minecraft/core/block/TrapDoorBlock.java b/src/main/java/net/minecraft/core/block/TrapDoorBlock.java
index 6c824e5a3..151b538de 100644
--- a/src/main/java/net/minecraft/core/block/TrapDoorBlock.java
+++ b/src/main/java/net/minecraft/core/block/TrapDoorBlock.java
@@ -8,6 +8,7 @@ import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.item.tag.ItemTags;
 import net.minecraft.core.util.helper.Direction;
+import net.minecraft.core.util.helper.DyeColor;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.util.phys.HitResult;
@@ -18,7 +19,7 @@ import net.minecraft.core.world.WorldSource;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
-public class TrapDoorBlock extends Block {
+public class TrapDoorBlock extends Block implements IPaintable {
     public static final int DIRECTION_SOUTH = 0;
     public static final int DIRECTION_NORTH = 1;
     public static final int DIRECTION_EAST = 2;
@@ -212,4 +213,15 @@ public class TrapDoorBlock extends Block {
     public Direction getDirectionForMeta(int meta) {
         return Direction.getDirectionById(meta & MASK_DIRECTION);
     }
+
+    @Override
+    public boolean canBePainted() {
+        return blockMaterial == Material.wood;
+    }
+
+    @Override
+    public void setColor(World world, int x, int y, int z, DyeColor color) {
+        final int meta = world.getBlockMetadata(x, y, z);
+        world.setBlockAndMetadataWithNotify(x, y, z, Blocks.TRAPDOOR_PLANKS_PAINTED.id, meta & 0xF | color.blockMeta << 4);
+    }
 }
diff --git a/src/main/java/net/minecraft/core/item/PaintBrushItem.java b/src/main/java/net/minecraft/core/item/PaintBrushItem.java
index 39a3d2b42..90d02620c 100644
--- a/src/main/java/net/minecraft/core/item/PaintBrushItem.java
+++ b/src/main/java/net/minecraft/core/item/PaintBrushItem.java
@@ -3,6 +3,7 @@ package net.minecraft.core.item;
 import com.mojang.nbt.CompoundTag;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.block.IPaintable;
+import net.minecraft.core.block.IPainted;
 import net.minecraft.core.block.entity.ActivatorBlockEntity;
 import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.entity.player.Player;
@@ -35,8 +36,12 @@ public class PaintBrushItem extends Item {
 
         if (block instanceof IPaintable) {
             final IPaintable paintable = (IPaintable) block;
+            if (!paintable.canBePainted()) return false;
             final DyeColor color = getColor(itemstack);
             if (color != null) {
+                if (paintable instanceof IPainted && ((IPainted)paintable).getColor(world, blockX, blockY, blockZ) == color) {
+                   return false;
+                }
                 paintable.setColor(world, blockX, blockY, blockZ, color);
                 itemstack.damageItem(1, player);
                 return true;
@@ -79,7 +84,7 @@ public class PaintBrushItem extends Item {
                 if (grabbedItem.stackSize <= 0) {
                     player.inventory.setHeldItemStack(null);
                 }
-            } else {
+            } else if (dyeCount < getMaxDamage()) {
                 final int newDyeCount = Math.min(dyeCount + DAMAGE_PER_DYE, stackInSlot.getMaxDamage());
                 setDyeCount(stackInSlot, newDyeCount);
                 grabbedItem.stackSize--;
diff --git a/src/main/java/net/minecraft/core/net/command/commands/GameRuleCommand.java b/src/main/java/net/minecraft/core/net/command/commands/GameRuleCommand.java
index b05c38594..3805858a9 100644
--- a/src/main/java/net/minecraft/core/net/command/commands/GameRuleCommand.java
+++ b/src/main/java/net/minecraft/core/net/command/commands/GameRuleCommand.java
@@ -11,6 +11,8 @@ import net.minecraft.core.data.gamerule.GameRuleBoolean;
 import net.minecraft.core.data.registry.Registries;
 import net.minecraft.core.net.command.CommandSource;
 import net.minecraft.core.net.command.arguments.GenericGameRuleArgumentType;
+import net.minecraft.core.net.packet.GameRulePacket;
+import net.minecraft.server.net.command.ServerCommandSource;
 
 public class GameRuleCommand {
     public static void register(CommandDispatcher<CommandSource> dispatcher) {
@@ -21,6 +23,9 @@ public class GameRuleCommand {
                 gameRuleValueArgument = RequiredArgumentBuilder.<CommandSource, Boolean>argument("value", BoolArgumentType.bool())
                         .executes(c -> {
                             c.getSource().getWorld().getLevelData().getGameRules().setValue((GameRule<? super Object>) gameRule, BoolArgumentType.getBool(c, "value"));
+                            if (c.getSource() instanceof ServerCommandSource) {
+                                ((ServerCommandSource)c.getSource()).server.playerList.sendPacketToAllPlayers(new GameRulePacket(c.getSource().getWorld().getLevelData().getGameRules()));
+                            }
                             c.getSource().sendTranslatableMessage("command.commands.gamerule.set", gameRule.getKey(), BoolArgumentType.getBool(c, "value"));
                             return Command.SINGLE_SUCCESS;
                         });
@@ -29,6 +34,9 @@ public class GameRuleCommand {
                         .executes(c -> {
                             Object o = c.getArgument("value", Object.class);
                             c.getSource().getWorld().getLevelData().getGameRules().setValue((GameRule<? super Object>) gameRule, o);
+                            if (c.getSource() instanceof ServerCommandSource) {
+                                ((ServerCommandSource)c.getSource()).server.playerList.sendPacketToAllPlayers(new GameRulePacket(c.getSource().getWorld().getLevelData().getGameRules()));
+                            }
                             c.getSource().sendTranslatableMessage("command.commands.gamerule.set", gameRule.getKey(), o);
                             return Command.SINGLE_SUCCESS;
                         });
