From bfb1bcce8a918f3c69dfc9f326d405333d9fdc94 Mon Sep 17 00:00:00 2001 From: Timon Seidel Date: Sat, 15 Aug 2026 11:57:53 +0200 Subject: [PATCH 1/5] feat: init fully implementing Player#sendFakeBlock (cherry picked from https://github.com/IntellectualSites/FastAsyncWorldEdit/pull/3367) --- .../impl/v1_21_11/PaperweightAdapter.java | 15 +++++++ .../impl/v1_21_4/PaperweightAdapter.java | 15 +++++++ .../impl/v1_21_5/PaperweightAdapter.java | 15 +++++++ .../impl/v1_21_6/PaperweightAdapter.java | 15 +++++++ .../impl/v1_21_9/PaperweightAdapter.java | 15 +++++++ .../impl/v26_1/PaperweightAdapter.java | 15 +++++++ .../impl/v26_2/PaperweightAdapter.java | 15 +++++++ .../sk89q/worldedit/bukkit/BukkitPlayer.java | 45 ++++++++++++------- .../bukkit/adapter/BukkitImplAdapter.java | 14 ++++++ .../com/sk89q/worldedit/LocalSession.java | 1 + .../com/sk89q/worldedit/entity/Player.java | 13 +++++- .../platform/AbstractPlayerActor.java | 7 ++- .../extension/platform/PlayerProxy.java | 7 ++- 13 files changed, 174 insertions(+), 18 deletions(-) diff --git a/worldedit-bukkit/adapters/adapter-1.21.11/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_11/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1.21.11/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_11/PaperweightAdapter.java index fdce051ad0..c76bd42e6a 100644 --- a/worldedit-bukkit/adapters/adapter-1.21.11/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_11/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1.21.11/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_11/PaperweightAdapter.java @@ -151,9 +151,11 @@ import org.bukkit.Location; import org.bukkit.World; import org.bukkit.World.Environment; +import org.bukkit.block.TileState; import org.bukkit.block.data.BlockData; import org.bukkit.craftbukkit.CraftServer; import org.bukkit.craftbukkit.CraftWorld; +import org.bukkit.craftbukkit.block.CraftBlockEntityState; import org.bukkit.craftbukkit.block.data.CraftBlockData; import org.bukkit.craftbukkit.entity.CraftEntity; import org.bukkit.craftbukkit.entity.CraftPlayer; @@ -657,6 +659,7 @@ yield new EnumProperty(state.getName(), return properties; } + @SuppressWarnings("deprecation") // -Werror @Override public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) { var structureBlock = new StructureBlockEntity( @@ -670,6 +673,18 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) )); } + @Override + public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, LinCompoundTag nbtData) { + CraftBlockEntityState craftState = (CraftBlockEntityState) tileState; + CompoundTag vanillaNBT = (net.minecraft.nbt.CompoundTag) fromNative(nbtData); + + ((CraftPlayer) player).getHandle().connection.send(new ClientboundBlockEntityDataPacket( + new BlockPos(pos.x(), pos.y(), pos.z()), + craftState.getBlockEntity().getType(), + vanillaNBT + )); + } + @Override public void sendFakeOP(Player player) { ((CraftPlayer) player).getHandle().connection.send(new ClientboundEntityEventPacket( diff --git a/worldedit-bukkit/adapters/adapter-1.21.4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_4/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1.21.4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_4/PaperweightAdapter.java index 07b10f53b5..473c6dd7c4 100644 --- a/worldedit-bukkit/adapters/adapter-1.21.4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_4/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1.21.4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_4/PaperweightAdapter.java @@ -149,9 +149,11 @@ import org.bukkit.Location; import org.bukkit.World; import org.bukkit.World.Environment; +import org.bukkit.block.TileState; import org.bukkit.block.data.BlockData; import org.bukkit.craftbukkit.CraftServer; import org.bukkit.craftbukkit.CraftWorld; +import org.bukkit.craftbukkit.block.CraftBlockEntityState; import org.bukkit.craftbukkit.block.data.CraftBlockData; import org.bukkit.craftbukkit.entity.CraftEntity; import org.bukkit.craftbukkit.entity.CraftPlayer; @@ -637,6 +639,7 @@ yield new EnumProperty(state.getName(), return properties; } + @SuppressWarnings("deprecation") // -Werror @Override public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) { var structureBlock = new StructureBlockEntity( @@ -650,6 +653,18 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) )); } + @Override + public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, LinCompoundTag nbtData) { + CraftBlockEntityState craftState = (CraftBlockEntityState) tileState; + CompoundTag vanillaNBT = (net.minecraft.nbt.CompoundTag) fromNative(nbtData); + + ((CraftPlayer) player).getHandle().connection.send(new ClientboundBlockEntityDataPacket( + new BlockPos(pos.x(), pos.y(), pos.z()), + craftState.getTileEntity().getType(), + vanillaNBT + )); + } + @Override public void sendFakeOP(Player player) { ((CraftPlayer) player).getHandle().connection.send(new ClientboundEntityEventPacket( diff --git a/worldedit-bukkit/adapters/adapter-1.21.5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_5/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1.21.5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_5/PaperweightAdapter.java index 1dd1595d30..ce03443a6b 100644 --- a/worldedit-bukkit/adapters/adapter-1.21.5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_5/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1.21.5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_5/PaperweightAdapter.java @@ -149,9 +149,11 @@ import org.bukkit.Location; import org.bukkit.World; import org.bukkit.World.Environment; +import org.bukkit.block.TileState; import org.bukkit.block.data.BlockData; import org.bukkit.craftbukkit.CraftServer; import org.bukkit.craftbukkit.CraftWorld; +import org.bukkit.craftbukkit.block.CraftBlockEntityState; import org.bukkit.craftbukkit.block.data.CraftBlockData; import org.bukkit.craftbukkit.entity.CraftEntity; import org.bukkit.craftbukkit.entity.CraftPlayer; @@ -635,6 +637,7 @@ yield new EnumProperty(state.getName(), return properties; } + @SuppressWarnings("deprecation") // -Werror @Override public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) { var structureBlock = new StructureBlockEntity( @@ -648,6 +651,18 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) )); } + @Override + public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, LinCompoundTag nbtData) { + CraftBlockEntityState craftState = (CraftBlockEntityState) tileState; + CompoundTag vanillaNBT = (net.minecraft.nbt.CompoundTag) fromNative(nbtData); + + ((CraftPlayer) player).getHandle().connection.send(new ClientboundBlockEntityDataPacket( + new BlockPos(pos.x(), pos.y(), pos.z()), + craftState.getBlockEntity().getType(), + vanillaNBT + )); + } + @Override public void sendFakeOP(Player player) { ((CraftPlayer) player).getHandle().connection.send(new ClientboundEntityEventPacket( diff --git a/worldedit-bukkit/adapters/adapter-1.21.6/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_6/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1.21.6/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_6/PaperweightAdapter.java index dc75fb35e0..8d50663028 100644 --- a/worldedit-bukkit/adapters/adapter-1.21.6/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_6/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1.21.6/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_6/PaperweightAdapter.java @@ -152,9 +152,11 @@ import org.bukkit.Location; import org.bukkit.World; import org.bukkit.World.Environment; +import org.bukkit.block.TileState; import org.bukkit.block.data.BlockData; import org.bukkit.craftbukkit.CraftServer; import org.bukkit.craftbukkit.CraftWorld; +import org.bukkit.craftbukkit.block.CraftBlockEntityState; import org.bukkit.craftbukkit.block.data.CraftBlockData; import org.bukkit.craftbukkit.entity.CraftEntity; import org.bukkit.craftbukkit.entity.CraftPlayer; @@ -657,6 +659,7 @@ yield new EnumProperty(state.getName(), return properties; } + @SuppressWarnings("deprecation") // -Werror @Override public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) { var structureBlock = new StructureBlockEntity( @@ -670,6 +673,18 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) )); } + @Override + public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, LinCompoundTag nbtData) { + CraftBlockEntityState craftState = (CraftBlockEntityState) tileState; + CompoundTag vanillaNBT = (net.minecraft.nbt.CompoundTag) fromNative(nbtData); + + ((CraftPlayer) player).getHandle().connection.send(new ClientboundBlockEntityDataPacket( + new BlockPos(pos.x(), pos.y(), pos.z()), + craftState.getBlockEntity().getType(), + vanillaNBT + )); + } + @Override public void sendFakeOP(Player player) { ((CraftPlayer) player).getHandle().connection.send(new ClientboundEntityEventPacket( diff --git a/worldedit-bukkit/adapters/adapter-1.21.9/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_9/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1.21.9/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_9/PaperweightAdapter.java index c9959eef6f..c3515fac8e 100644 --- a/worldedit-bukkit/adapters/adapter-1.21.9/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_9/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1.21.9/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_9/PaperweightAdapter.java @@ -151,9 +151,11 @@ import org.bukkit.Location; import org.bukkit.World; import org.bukkit.World.Environment; +import org.bukkit.block.TileState; import org.bukkit.block.data.BlockData; import org.bukkit.craftbukkit.CraftServer; import org.bukkit.craftbukkit.CraftWorld; +import org.bukkit.craftbukkit.block.CraftBlockEntityState; import org.bukkit.craftbukkit.block.data.CraftBlockData; import org.bukkit.craftbukkit.entity.CraftEntity; import org.bukkit.craftbukkit.entity.CraftPlayer; @@ -656,6 +658,7 @@ yield new EnumProperty(state.getName(), return properties; } + @SuppressWarnings("deprecation") // -Werror @Override public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) { var structureBlock = new StructureBlockEntity( @@ -669,6 +672,18 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) )); } + @Override + public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, LinCompoundTag nbtData) { + CraftBlockEntityState craftState = (CraftBlockEntityState) tileState; + CompoundTag vanillaNBT = (net.minecraft.nbt.CompoundTag) fromNative(nbtData); + + ((CraftPlayer) player).getHandle().connection.send(new ClientboundBlockEntityDataPacket( + new BlockPos(pos.x(), pos.y(), pos.z()), + craftState.getBlockEntity().getType(), + vanillaNBT + )); + } + @Override public void sendFakeOP(Player player) { ((CraftPlayer) player).getHandle().connection.send(new ClientboundEntityEventPacket( diff --git a/worldedit-bukkit/adapters/adapter-26.1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v26_1/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-26.1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v26_1/PaperweightAdapter.java index ac79eb3e3a..224a9416f4 100644 --- a/worldedit-bukkit/adapters/adapter-26.1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v26_1/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-26.1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v26_1/PaperweightAdapter.java @@ -151,9 +151,11 @@ import org.bukkit.Location; import org.bukkit.World; import org.bukkit.World.Environment; +import org.bukkit.block.TileState; import org.bukkit.block.data.BlockData; import org.bukkit.craftbukkit.CraftServer; import org.bukkit.craftbukkit.CraftWorld; +import org.bukkit.craftbukkit.block.CraftBlockEntityState; import org.bukkit.craftbukkit.block.data.CraftBlockData; import org.bukkit.craftbukkit.entity.CraftEntity; import org.bukkit.craftbukkit.entity.CraftPlayer; @@ -674,6 +676,7 @@ yield new EnumProperty(state.getName(), return properties; } + @SuppressWarnings("deprecation") // -Werror @Override public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) { var structureBlock = new StructureBlockEntity( @@ -687,6 +690,18 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) )); } + @Override + public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, LinCompoundTag nbtData) { + CraftBlockEntityState craftState = (CraftBlockEntityState) tileState; + CompoundTag vanillaNBT = (net.minecraft.nbt.CompoundTag) fromNative(nbtData); + + ((CraftPlayer) player).getHandle().connection.send(new ClientboundBlockEntityDataPacket( + new BlockPos(pos.x(), pos.y(), pos.z()), + craftState.getBlockEntity().getType(), + vanillaNBT + )); + } + @Override public void sendFakeOP(Player player) { ((CraftPlayer) player).getHandle().connection.send(new ClientboundEntityEventPacket( diff --git a/worldedit-bukkit/adapters/adapter-26.2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v26_2/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-26.2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v26_2/PaperweightAdapter.java index 9d9f0f66d4..800a6abd99 100644 --- a/worldedit-bukkit/adapters/adapter-26.2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v26_2/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-26.2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v26_2/PaperweightAdapter.java @@ -151,9 +151,11 @@ import org.bukkit.Location; import org.bukkit.World; import org.bukkit.World.Environment; +import org.bukkit.block.TileState; import org.bukkit.block.data.BlockData; import org.bukkit.craftbukkit.CraftServer; import org.bukkit.craftbukkit.CraftWorld; +import org.bukkit.craftbukkit.block.CraftBlockEntityState; import org.bukkit.craftbukkit.block.data.CraftBlockData; import org.bukkit.craftbukkit.entity.CraftEntity; import org.bukkit.craftbukkit.entity.CraftPlayer; @@ -679,6 +681,7 @@ yield new EnumProperty(state.getName(), return properties; } + @SuppressWarnings("deprecation") // -Werror @Override public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) { var structureBlock = new StructureBlockEntity( @@ -692,6 +695,18 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) )); } + @Override + public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, LinCompoundTag nbtData) { + CraftBlockEntityState craftState = (CraftBlockEntityState) tileState; + CompoundTag vanillaNBT = (net.minecraft.nbt.CompoundTag) fromNative(nbtData); + + ((CraftPlayer) player).getHandle().connection.send(new ClientboundBlockEntityDataPacket( + new BlockPos(pos.x(), pos.y(), pos.z()), + craftState.getBlockEntity().getType(), + vanillaNBT + )); + } + @Override public void sendFakeOP(Player player) { ((CraftPlayer) player).getHandle().connection.send(new ClientboundEntityEventPacket( diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java index bc366ebd4e..4f019baee1 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java @@ -42,12 +42,13 @@ import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockStateHolder; -import com.sk89q.worldedit.world.block.BlockTypes; import com.sk89q.worldedit.world.gamemode.GameMode; import com.sk89q.worldedit.world.gamemode.GameModes; import io.papermc.lib.PaperLib; import org.bukkit.Bukkit; import org.bukkit.Location; +import org.bukkit.block.TileState; +import org.bukkit.block.data.BlockData; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.enginehub.linbus.tree.LinCompoundTag; @@ -305,22 +306,36 @@ public boolean isPersistent() { } @Override - public > void sendFakeBlock(BlockVector3 pos, B block) { + public > void sendFakeBlock(BlockVector3 pos, @Nullable B block) { Location loc = new Location(player.getWorld(), pos.x(), pos.y(), pos.z()); - if (block == null) { - player.sendBlockChange(loc, player.getWorld().getBlockAt(loc).getBlockData()); + + BaseBlock baseBlock; + if (block != null) { + baseBlock = block.toBaseBlock(); } else { - player.sendBlockChange(loc, BukkitAdapter.adapt(block)); - BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter(); - if (adapter != null) { - if (block.getBlockType() == BlockTypes.STRUCTURE_BLOCK && block instanceof BaseBlock baseBlock) { - LinCompoundTag nbt = baseBlock.getNbt(); - if (nbt != null) { - adapter.sendFakeNBT(player, pos, nbt); - adapter.sendFakeOP(player); - } - } - } + baseBlock = getExtent().getFullBlock(pos); + } + + BlockData data = BukkitAdapter.adapt(baseBlock); + + player.sendBlockChange(loc, data); + + BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter(); + if (adapter == null) { + return; + } + LinCompoundTag nbtData = baseBlock.getNbt(); + if (nbtData == null || !(data.createBlockState() instanceof TileState tileState)) { + return; + } + adapter.sendFakeNBT(player, pos, tileState, nbtData); + } + + @Override + public void sendFakeOP() { + BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter(); + if (adapter != null) { + adapter.sendFakeOP(player); } } } diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java index caa8ad3a26..57e8437c1b 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java @@ -49,6 +49,7 @@ import com.sk89q.worldedit.world.registry.BlockMaterial; import org.bukkit.Location; import org.bukkit.World; +import org.bukkit.block.TileState; import org.bukkit.block.data.BlockData; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; @@ -188,9 +189,22 @@ default void tickWatchdog() { * @param player The player * @param pos The position * @param nbtData The NBT Data + * + * @deprecated Only works for structure blocks */ + @Deprecated(since = "2.15.1") void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData); + /** + * Send the given NBT data to the player. + * + * @param player The player + * @param pos The position + * @param tileState The bukkit tile state + * @param nbtData The NBT Data + */ + void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, LinCompoundTag nbtData); + /** * Make the client think it has operator status. * This does not give them any operator capabilities. diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java b/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java index 3219cab9e1..fa6b4cafa6 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java @@ -924,6 +924,7 @@ public void updateServerCUI(Actor actor) { } cuiTemporaryBlock = tempCuiTemporaryBlock; player.sendFakeBlock(cuiTemporaryBlock, block); + player.sendFakeOP(); } else if (cuiTemporaryBlock != null) { // Remove the old block player.sendFakeBlock(cuiTemporaryBlock, null); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/entity/Player.java b/worldedit-core/src/main/java/com/sk89q/worldedit/entity/Player.java index da435da12b..3a1c932a37 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/entity/Player.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/entity/Player.java @@ -322,11 +322,22 @@ default boolean trySetPosition(Vector3 pos, float pitch, float yaw) { * Sends a fake block to the client. * *

- * This block isn't real. + * This change is client-side only and will not actually change the world in any way. *

* * @param pos The position of the block * @param block The block to send, null to reset */ > void sendFakeBlock(BlockVector3 pos, @Nullable B block); + + /** + * Make the client think it has operator status. + * + *

+ * This change is client-side only and will not actually grant the player operator status. + *

+ * + * @since TODO + */ + void sendFakeOP(); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/AbstractPlayerActor.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/AbstractPlayerActor.java index ef4ba0ae02..b67eadab28 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/AbstractPlayerActor.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/AbstractPlayerActor.java @@ -564,7 +564,12 @@ public boolean remove() { } @Override - public > void sendFakeBlock(BlockVector3 pos, B block) { + public > void sendFakeBlock(BlockVector3 pos, @Nullable B block) { + + } + + @Override + public void sendFakeOP() { } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlayerProxy.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlayerProxy.java index 7811d2fd79..bc5e4e969e 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlayerProxy.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlayerProxy.java @@ -185,10 +185,15 @@ public void setGameMode(GameMode gameMode) { } @Override - public > void sendFakeBlock(BlockVector3 pos, B block) { + public > void sendFakeBlock(BlockVector3 pos, @Nullable B block) { basePlayer.sendFakeBlock(pos, block); } + @Override + public void sendFakeOP() { + basePlayer.sendFakeOP(); + } + @Override public void floatAt(int x, int y, int z, boolean alwaysGlass) { basePlayer.floatAt(x, y, z, alwaysGlass); From 75bad75eb92bf87cc8962796f3878b601cd0a95c Mon Sep 17 00:00:00 2001 From: Timon Seidel Date: Sat, 15 Aug 2026 18:06:43 +0200 Subject: [PATCH 2/5] chore: internalize fake-op setting again --- .../java/com/sk89q/worldedit/bukkit/BukkitPlayer.java | 8 ++------ .../worldedit/bukkit/adapter/BukkitImplAdapter.java | 2 +- .../main/java/com/sk89q/worldedit/LocalSession.java | 1 - .../main/java/com/sk89q/worldedit/entity/Player.java | 11 ----------- .../extension/platform/AbstractPlayerActor.java | 4 ---- .../worldedit/extension/platform/PlayerProxy.java | 5 ----- 6 files changed, 3 insertions(+), 28 deletions(-) diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java index 4f019baee1..7b6edbe805 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java @@ -42,6 +42,7 @@ import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockStateHolder; +import com.sk89q.worldedit.world.block.BlockTypes; import com.sk89q.worldedit.world.gamemode.GameMode; import com.sk89q.worldedit.world.gamemode.GameModes; import io.papermc.lib.PaperLib; @@ -329,12 +330,7 @@ public > void sendFakeBlock(BlockVector3 pos, @Nul return; } adapter.sendFakeNBT(player, pos, tileState, nbtData); - } - - @Override - public void sendFakeOP() { - BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter(); - if (adapter != null) { + if (block != null && block.getBlockType() == BlockTypes.STRUCTURE_BLOCK) { adapter.sendFakeOP(player); } } diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java index 57e8437c1b..edc9173dd8 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java @@ -192,7 +192,7 @@ default void tickWatchdog() { * * @deprecated Only works for structure blocks */ - @Deprecated(since = "2.15.1") + @Deprecated void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData); /** diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java b/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java index fa6b4cafa6..3219cab9e1 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java @@ -924,7 +924,6 @@ public void updateServerCUI(Actor actor) { } cuiTemporaryBlock = tempCuiTemporaryBlock; player.sendFakeBlock(cuiTemporaryBlock, block); - player.sendFakeOP(); } else if (cuiTemporaryBlock != null) { // Remove the old block player.sendFakeBlock(cuiTemporaryBlock, null); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/entity/Player.java b/worldedit-core/src/main/java/com/sk89q/worldedit/entity/Player.java index 3a1c932a37..52dc1de50f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/entity/Player.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/entity/Player.java @@ -329,15 +329,4 @@ default boolean trySetPosition(Vector3 pos, float pitch, float yaw) { * @param block The block to send, null to reset */ > void sendFakeBlock(BlockVector3 pos, @Nullable B block); - - /** - * Make the client think it has operator status. - * - *

- * This change is client-side only and will not actually grant the player operator status. - *

- * - * @since TODO - */ - void sendFakeOP(); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/AbstractPlayerActor.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/AbstractPlayerActor.java index b67eadab28..7b03aa6ce7 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/AbstractPlayerActor.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/AbstractPlayerActor.java @@ -568,8 +568,4 @@ public > void sendFakeBlock(BlockVector3 pos, @Nul } - @Override - public void sendFakeOP() { - - } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlayerProxy.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlayerProxy.java index bc5e4e969e..3f9667435e 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlayerProxy.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlayerProxy.java @@ -189,11 +189,6 @@ public > void sendFakeBlock(BlockVector3 pos, @Nul basePlayer.sendFakeBlock(pos, block); } - @Override - public void sendFakeOP() { - basePlayer.sendFakeOP(); - } - @Override public void floatAt(int x, int y, int z, boolean alwaysGlass) { basePlayer.floatAt(x, y, z, alwaysGlass); From 2adc9268a62028dbab64669db77d8adb74696d76 Mon Sep 17 00:00:00 2001 From: Timon Seidel Date: Sun, 16 Aug 2026 20:17:29 +0200 Subject: [PATCH 3/5] feat: impl for native platforms (tested on fabric dev client) --- .../coremc/internal/CoreMcPlayer.java | 50 +++++++++++-------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/worldedit-core-mc/src/main/java/com/sk89q/worldedit/coremc/internal/CoreMcPlayer.java b/worldedit-core-mc/src/main/java/com/sk89q/worldedit/coremc/internal/CoreMcPlayer.java index 12c2cfa658..36856f4762 100644 --- a/worldedit-core-mc/src/main/java/com/sk89q/worldedit/coremc/internal/CoreMcPlayer.java +++ b/worldedit-core-mc/src/main/java/com/sk89q/worldedit/coremc/internal/CoreMcPlayer.java @@ -20,6 +20,7 @@ package com.sk89q.worldedit.coremc.internal; import com.sk89q.worldedit.blocks.BaseItemStack; +import com.sk89q.worldedit.blocks.TileEntityBlock; import com.sk89q.worldedit.coremc.mixin.AccessorClientboundBlockEntityDataPacket; import com.sk89q.worldedit.entity.BaseEntity; import com.sk89q.worldedit.extension.platform.AbstractPlayerActor; @@ -35,9 +36,7 @@ import com.sk89q.worldedit.util.formatting.text.Component; import com.sk89q.worldedit.util.formatting.text.serializer.gson.GsonComponentSerializer; import com.sk89q.worldedit.world.World; -import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockStateHolder; -import com.sk89q.worldedit.world.block.BlockTypes; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.network.protocol.game.ClientboundBlockUpdatePacket; @@ -45,7 +44,9 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.entity.BlockEntityTypes; +import net.minecraft.world.level.block.EntityBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; import org.enginehub.linbus.tree.LinCompoundTag; import org.enginehub.worldeditcui.protocol.CUIPacket; @@ -229,33 +230,38 @@ public void setFlying(boolean flying) { } @Override - public > void sendFakeBlock(BlockVector3 pos, B block) { + public > void sendFakeBlock(BlockVector3 pos, @Nullable B block) { World world = getWorld(); if (!(world instanceof CoreMcWorld coreMcWorld)) { return; } BlockPos loc = platform.getAdapter().toBlockPos(pos); if (block == null) { - final ClientboundBlockUpdatePacket packetOut = new ClientboundBlockUpdatePacket( - coreMcWorld.getWorld(), loc - ); - player.connection.send(packetOut); + player.connection.send(new ClientboundBlockUpdatePacket( + coreMcWorld.getWorld(), + loc + )); } else { - final ClientboundBlockUpdatePacket packetOut = new ClientboundBlockUpdatePacket( - loc, - platform.getAdapter().toNativeBlockState(block.toImmutableState()) - ); - player.connection.send(packetOut); - if (block instanceof BaseBlock baseBlock && block.getBlockType().equals(BlockTypes.STRUCTURE_BLOCK)) { - final LinCompoundTag nbtData = baseBlock.getNbt(); - if (nbtData != null) { - player.connection.send(AccessorClientboundBlockEntityDataPacket.create( - new BlockPos(pos.x(), pos.y(), pos.z()), - BlockEntityTypes.STRUCTURE_BLOCK, - NBTConverter.toNative(nbtData) - )); - } + final BlockState nativeState = platform.getAdapter().toNativeBlockState(block.toImmutableState()); + + player.connection.send(new ClientboundBlockUpdatePacket(loc, nativeState)); + + if (!(block instanceof final TileEntityBlock tileBlock)) { + return; + } + final LinCompoundTag nbtData = tileBlock.getNbt(); + if (nbtData == null || !(nativeState.getBlock() instanceof final EntityBlock entityBlock)) { + return; + } + final BlockEntity blockEntity = entityBlock.newBlockEntity(loc, nativeState); + if (blockEntity == null) { + return; } + player.connection.send(AccessorClientboundBlockEntityDataPacket.create( + loc, + blockEntity.getType(), + NBTConverter.toNative(nbtData) + )); } } From 1ab67d33ddd6894640efc667985782be2f9d7f2a Mon Sep 17 00:00:00 2001 From: Timon Seidel Date: Mon, 17 Aug 2026 15:28:59 +0200 Subject: [PATCH 4/5] feat: impl for sponge fix: impl in general -> was missing a setLevel call -> using public factory method instead of internal constructor like in core module tested on spongevanilla-1.21.10-17.0.0 (sponge's stable) (26.2 and their latest snapshot 26.3 both have issues) --- .../sk89q/worldedit/sponge/SpongePlayer.java | 61 +++++++++++-------- 1 file changed, 37 insertions(+), 24 deletions(-) diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongePlayer.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongePlayer.java index 5108163dc3..beb051f4dc 100644 --- a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongePlayer.java +++ b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongePlayer.java @@ -22,6 +22,7 @@ import com.sk89q.util.StringUtil; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.blocks.BaseItemStack; +import com.sk89q.worldedit.blocks.TileEntityBlock; import com.sk89q.worldedit.entity.BaseEntity; import com.sk89q.worldedit.extension.platform.AbstractPlayerActor; import com.sk89q.worldedit.extent.inventory.BlockBag; @@ -34,7 +35,6 @@ import com.sk89q.worldedit.util.HandSide; import com.sk89q.worldedit.util.Location; import com.sk89q.worldedit.util.formatting.text.Component; -import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockStateHolder; import com.sk89q.worldedit.world.gamemode.GameMode; import com.sk89q.worldedit.world.gamemode.GameModes; @@ -42,8 +42,10 @@ import net.kyori.adventure.text.format.TextColor; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; -import net.minecraft.world.level.block.entity.StructureBlockEntity; +import net.minecraft.world.level.block.EntityBlock; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.storage.TagValueInput; import org.enginehub.linbus.tree.LinCompoundTag; import org.spongepowered.api.ResourceKey; @@ -240,29 +242,40 @@ public > void sendFakeBlock(BlockVector3 pos, B bl } else { BlockState spongeBlock = SpongeAdapter.adapt(block.toImmutableState()); player.sendBlockChange(pos.x(), pos.y(), pos.z(), spongeBlock); - if (block instanceof final BaseBlock baseBlock - && block.getBlockType().equals(com.sk89q.worldedit.world.block.BlockTypes.STRUCTURE_BLOCK)) { - final LinCompoundTag nbtData = baseBlock.getNbt(); - if (nbtData != null) { - net.minecraft.world.level.block.state.BlockState nativeBlock = - (net.minecraft.world.level.block.state.BlockState) spongeBlock; - net.minecraft.nbt.CompoundTag nativeNbtData = NbtAdapter.adaptNMSToWorldEdit(nbtData); - net.minecraft.server.level.ServerPlayer nativePlayer = - ((net.minecraft.server.level.ServerPlayer) player); - - StructureBlockEntity structureBlockEntity = - new StructureBlockEntity(new BlockPos(pos.x(), pos.y(), pos.z()), nativeBlock); - SpongeLoggingProblemReporter.with( - () -> "loading structure block entity for fake player " + player.uniqueId(), - reporter -> { - structureBlockEntity.loadWithComponents(TagValueInput.create(reporter, nativePlayer.level().registryAccess(), nativeNbtData)); - return null; - } - ); - nativePlayer.connection.send( - ClientboundBlockEntityDataPacket.create(structureBlockEntity, (be, ra) -> nativeNbtData)); - } + + if (!(block instanceof TileEntityBlock tileEntityBlock)) { + return; + } + final LinCompoundTag nbtData = tileEntityBlock.getNbt(); + if (nbtData == null) { + return; + } + net.minecraft.world.level.block.state.BlockState nativeBlock = + (net.minecraft.world.level.block.state.BlockState) spongeBlock; + if (!(nativeBlock.getBlock() instanceof EntityBlock nativeEntityBlock)) { + return; } + BlockEntity nativeBlockEntity = nativeEntityBlock.newBlockEntity(new BlockPos(pos.x(), pos.y(), pos.z()), nativeBlock); + if (nativeBlockEntity == null) { + return; + } + net.minecraft.server.level.ServerPlayer nativePlayer = (net.minecraft.server.level.ServerPlayer) player; + nativeBlockEntity.setLevel(nativePlayer.level()); + CompoundTag nativeNbtData = NbtAdapter.adaptNMSToWorldEdit(nbtData); + + SpongeLoggingProblemReporter.with( + () -> "loading block entity for fake player " + player.uniqueId(), + reporter -> { + //noinspection DataFlowIssue + nativeBlockEntity.loadWithComponents( + TagValueInput.create(reporter, nativeBlockEntity.getLevel().registryAccess(), nativeNbtData) + ); + return null; + } + ); + nativePlayer.connection.send( + ClientboundBlockEntityDataPacket.create(nativeBlockEntity, (_, _) -> nativeNbtData) + ); } } From 0b07f617674b84bc964f4a35a66d2a018635f8b3 Mon Sep 17 00:00:00 2001 From: Timon Seidel Date: Tue, 18 Aug 2026 14:35:35 +0200 Subject: [PATCH 5/5] chore: refactor bukkit impl relying on paper-specific accesswidener (getBlockEntity), also different name in spigot -> replace round-tripping through TileState with only the type parsing chore: refactor core impl to also directly parse the BE type id chore: fixup indentation tested on paper 26.2-112 & spigot 26.2 4647-Spigot-8db49a2-efaae75 (spigot has issues unrelated to this pr though) --- .../impl/v1_21_11/PaperweightAdapter.java | 20 ++++++++++------- .../impl/v1_21_4/PaperweightAdapter.java | 18 +++++++++------ .../impl/v1_21_5/PaperweightAdapter.java | 18 +++++++++------ .../impl/v1_21_6/PaperweightAdapter.java | 18 +++++++++------ .../impl/v1_21_9/PaperweightAdapter.java | 18 +++++++++------ .../impl/v26_1/PaperweightAdapter.java | 18 +++++++++------ .../impl/v26_2/PaperweightAdapter.java | 18 +++++++++------ .../sk89q/worldedit/bukkit/BukkitPlayer.java | 5 ++--- .../bukkit/adapter/BukkitImplAdapter.java | 13 ++++++----- .../coremc/internal/CoreMcPlayer.java | 22 ++++++++++--------- .../platform/AbstractPlayerActor.java | 1 - .../sk89q/worldedit/sponge/SpongePlayer.java | 18 +++++++-------- 12 files changed, 108 insertions(+), 79 deletions(-) diff --git a/worldedit-bukkit/adapters/adapter-1.21.11/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_11/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1.21.11/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_11/PaperweightAdapter.java index c76bd42e6a..d019a65f01 100644 --- a/worldedit-bukkit/adapters/adapter-1.21.11/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_11/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1.21.11/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_11/PaperweightAdapter.java @@ -33,6 +33,7 @@ import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.blocks.BaseItem; import com.sk89q.worldedit.blocks.BaseItemStack; +import com.sk89q.worldedit.blocks.TileEntityBlock; import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.bukkit.adapter.BukkitImplAdapter; import com.sk89q.worldedit.entity.BaseEntity; @@ -82,6 +83,7 @@ import net.minecraft.core.Registry; import net.minecraft.core.SectionPos; import net.minecraft.core.component.DataComponentPatch; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.nbt.ByteArrayTag; import net.minecraft.nbt.ByteTag; @@ -126,6 +128,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.entity.StructureBlockEntity; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.chunk.ChunkAccess; @@ -151,11 +154,9 @@ import org.bukkit.Location; import org.bukkit.World; import org.bukkit.World.Environment; -import org.bukkit.block.TileState; import org.bukkit.block.data.BlockData; import org.bukkit.craftbukkit.CraftServer; import org.bukkit.craftbukkit.CraftWorld; -import org.bukkit.craftbukkit.block.CraftBlockEntityState; import org.bukkit.craftbukkit.block.data.CraftBlockData; import org.bukkit.craftbukkit.entity.CraftEntity; import org.bukkit.craftbukkit.entity.CraftPlayer; @@ -674,14 +675,17 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) } @Override - public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, LinCompoundTag nbtData) { - CraftBlockEntityState craftState = (CraftBlockEntityState) tileState; - CompoundTag vanillaNBT = (net.minecraft.nbt.CompoundTag) fromNative(nbtData); + public void sendFakeNBT(Player player, BlockVector3 pos, TileEntityBlock tileEntityBlock, LinCompoundTag nbtData) { + BlockEntityType nativeBlockEntityType = BuiltInRegistries.BLOCK_ENTITY_TYPE + .getValue(Identifier.parse(tileEntityBlock.getNbtId())); + if (nativeBlockEntityType == null) { + return; + } ((CraftPlayer) player).getHandle().connection.send(new ClientboundBlockEntityDataPacket( - new BlockPos(pos.x(), pos.y(), pos.z()), - craftState.getBlockEntity().getType(), - vanillaNBT + new BlockPos(pos.x(), pos.y(), pos.z()), + nativeBlockEntityType, + (net.minecraft.nbt.CompoundTag) fromNative(nbtData) )); } diff --git a/worldedit-bukkit/adapters/adapter-1.21.4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_4/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1.21.4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_4/PaperweightAdapter.java index 473c6dd7c4..9e40e483b0 100644 --- a/worldedit-bukkit/adapters/adapter-1.21.4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_4/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1.21.4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_4/PaperweightAdapter.java @@ -33,6 +33,7 @@ import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.blocks.BaseItem; import com.sk89q.worldedit.blocks.BaseItemStack; +import com.sk89q.worldedit.blocks.TileEntityBlock; import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.bukkit.adapter.BukkitImplAdapter; import com.sk89q.worldedit.entity.BaseEntity; @@ -83,6 +84,7 @@ import net.minecraft.core.Registry; import net.minecraft.core.SectionPos; import net.minecraft.core.component.DataComponentPatch; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.nbt.ByteArrayTag; import net.minecraft.nbt.ByteTag; @@ -127,6 +129,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.entity.StructureBlockEntity; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.chunk.ChunkAccess; @@ -149,11 +152,9 @@ import org.bukkit.Location; import org.bukkit.World; import org.bukkit.World.Environment; -import org.bukkit.block.TileState; import org.bukkit.block.data.BlockData; import org.bukkit.craftbukkit.CraftServer; import org.bukkit.craftbukkit.CraftWorld; -import org.bukkit.craftbukkit.block.CraftBlockEntityState; import org.bukkit.craftbukkit.block.data.CraftBlockData; import org.bukkit.craftbukkit.entity.CraftEntity; import org.bukkit.craftbukkit.entity.CraftPlayer; @@ -654,14 +655,17 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) } @Override - public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, LinCompoundTag nbtData) { - CraftBlockEntityState craftState = (CraftBlockEntityState) tileState; - CompoundTag vanillaNBT = (net.minecraft.nbt.CompoundTag) fromNative(nbtData); + public void sendFakeNBT(Player player, BlockVector3 pos, TileEntityBlock tileEntityBlock, LinCompoundTag nbtData) { + BlockEntityType nativeBlockEntityType = BuiltInRegistries.BLOCK_ENTITY_TYPE + .getValue(ResourceLocation.parse(tileEntityBlock.getNbtId())); + if (nativeBlockEntityType == null) { + return; + } ((CraftPlayer) player).getHandle().connection.send(new ClientboundBlockEntityDataPacket( new BlockPos(pos.x(), pos.y(), pos.z()), - craftState.getTileEntity().getType(), - vanillaNBT + nativeBlockEntityType, + (net.minecraft.nbt.CompoundTag) fromNative(nbtData) )); } diff --git a/worldedit-bukkit/adapters/adapter-1.21.5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_5/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1.21.5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_5/PaperweightAdapter.java index ce03443a6b..118848b5a7 100644 --- a/worldedit-bukkit/adapters/adapter-1.21.5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_5/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1.21.5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_5/PaperweightAdapter.java @@ -33,6 +33,7 @@ import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.blocks.BaseItem; import com.sk89q.worldedit.blocks.BaseItemStack; +import com.sk89q.worldedit.blocks.TileEntityBlock; import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.bukkit.adapter.BukkitImplAdapter; import com.sk89q.worldedit.entity.BaseEntity; @@ -83,6 +84,7 @@ import net.minecraft.core.Registry; import net.minecraft.core.SectionPos; import net.minecraft.core.component.DataComponentPatch; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.nbt.ByteArrayTag; import net.minecraft.nbt.ByteTag; @@ -127,6 +129,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.entity.StructureBlockEntity; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.chunk.ChunkAccess; @@ -149,11 +152,9 @@ import org.bukkit.Location; import org.bukkit.World; import org.bukkit.World.Environment; -import org.bukkit.block.TileState; import org.bukkit.block.data.BlockData; import org.bukkit.craftbukkit.CraftServer; import org.bukkit.craftbukkit.CraftWorld; -import org.bukkit.craftbukkit.block.CraftBlockEntityState; import org.bukkit.craftbukkit.block.data.CraftBlockData; import org.bukkit.craftbukkit.entity.CraftEntity; import org.bukkit.craftbukkit.entity.CraftPlayer; @@ -652,14 +653,17 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) } @Override - public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, LinCompoundTag nbtData) { - CraftBlockEntityState craftState = (CraftBlockEntityState) tileState; - CompoundTag vanillaNBT = (net.minecraft.nbt.CompoundTag) fromNative(nbtData); + public void sendFakeNBT(Player player, BlockVector3 pos, TileEntityBlock tileEntityBlock, LinCompoundTag nbtData) { + BlockEntityType nativeBlockEntityType = BuiltInRegistries.BLOCK_ENTITY_TYPE + .getValue(ResourceLocation.parse(tileEntityBlock.getNbtId())); + if (nativeBlockEntityType == null) { + return; + } ((CraftPlayer) player).getHandle().connection.send(new ClientboundBlockEntityDataPacket( new BlockPos(pos.x(), pos.y(), pos.z()), - craftState.getBlockEntity().getType(), - vanillaNBT + nativeBlockEntityType, + (net.minecraft.nbt.CompoundTag) fromNative(nbtData) )); } diff --git a/worldedit-bukkit/adapters/adapter-1.21.6/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_6/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1.21.6/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_6/PaperweightAdapter.java index 8d50663028..698ce57626 100644 --- a/worldedit-bukkit/adapters/adapter-1.21.6/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_6/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1.21.6/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_6/PaperweightAdapter.java @@ -33,6 +33,7 @@ import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.blocks.BaseItem; import com.sk89q.worldedit.blocks.BaseItemStack; +import com.sk89q.worldedit.blocks.TileEntityBlock; import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.bukkit.adapter.BukkitImplAdapter; import com.sk89q.worldedit.entity.BaseEntity; @@ -83,6 +84,7 @@ import net.minecraft.core.Registry; import net.minecraft.core.SectionPos; import net.minecraft.core.component.DataComponentPatch; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.nbt.ByteArrayTag; import net.minecraft.nbt.ByteTag; @@ -127,6 +129,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.entity.StructureBlockEntity; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.chunk.ChunkAccess; @@ -152,11 +155,9 @@ import org.bukkit.Location; import org.bukkit.World; import org.bukkit.World.Environment; -import org.bukkit.block.TileState; import org.bukkit.block.data.BlockData; import org.bukkit.craftbukkit.CraftServer; import org.bukkit.craftbukkit.CraftWorld; -import org.bukkit.craftbukkit.block.CraftBlockEntityState; import org.bukkit.craftbukkit.block.data.CraftBlockData; import org.bukkit.craftbukkit.entity.CraftEntity; import org.bukkit.craftbukkit.entity.CraftPlayer; @@ -674,14 +675,17 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) } @Override - public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, LinCompoundTag nbtData) { - CraftBlockEntityState craftState = (CraftBlockEntityState) tileState; - CompoundTag vanillaNBT = (net.minecraft.nbt.CompoundTag) fromNative(nbtData); + public void sendFakeNBT(Player player, BlockVector3 pos, TileEntityBlock tileEntityBlock, LinCompoundTag nbtData) { + BlockEntityType nativeBlockEntityType = BuiltInRegistries.BLOCK_ENTITY_TYPE + .getValue(ResourceLocation.parse(tileEntityBlock.getNbtId())); + if (nativeBlockEntityType == null) { + return; + } ((CraftPlayer) player).getHandle().connection.send(new ClientboundBlockEntityDataPacket( new BlockPos(pos.x(), pos.y(), pos.z()), - craftState.getBlockEntity().getType(), - vanillaNBT + nativeBlockEntityType, + (net.minecraft.nbt.CompoundTag) fromNative(nbtData) )); } diff --git a/worldedit-bukkit/adapters/adapter-1.21.9/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_9/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1.21.9/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_9/PaperweightAdapter.java index c3515fac8e..4a09109a35 100644 --- a/worldedit-bukkit/adapters/adapter-1.21.9/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_9/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1.21.9/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_9/PaperweightAdapter.java @@ -33,6 +33,7 @@ import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.blocks.BaseItem; import com.sk89q.worldedit.blocks.BaseItemStack; +import com.sk89q.worldedit.blocks.TileEntityBlock; import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.bukkit.adapter.BukkitImplAdapter; import com.sk89q.worldedit.entity.BaseEntity; @@ -83,6 +84,7 @@ import net.minecraft.core.Registry; import net.minecraft.core.SectionPos; import net.minecraft.core.component.DataComponentPatch; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.nbt.ByteArrayTag; import net.minecraft.nbt.ByteTag; @@ -126,6 +128,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.entity.StructureBlockEntity; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.chunk.ChunkAccess; @@ -151,11 +154,9 @@ import org.bukkit.Location; import org.bukkit.World; import org.bukkit.World.Environment; -import org.bukkit.block.TileState; import org.bukkit.block.data.BlockData; import org.bukkit.craftbukkit.CraftServer; import org.bukkit.craftbukkit.CraftWorld; -import org.bukkit.craftbukkit.block.CraftBlockEntityState; import org.bukkit.craftbukkit.block.data.CraftBlockData; import org.bukkit.craftbukkit.entity.CraftEntity; import org.bukkit.craftbukkit.entity.CraftPlayer; @@ -673,14 +674,17 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) } @Override - public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, LinCompoundTag nbtData) { - CraftBlockEntityState craftState = (CraftBlockEntityState) tileState; - CompoundTag vanillaNBT = (net.minecraft.nbt.CompoundTag) fromNative(nbtData); + public void sendFakeNBT(Player player, BlockVector3 pos, TileEntityBlock tileEntityBlock, LinCompoundTag nbtData) { + BlockEntityType nativeBlockEntityType = BuiltInRegistries.BLOCK_ENTITY_TYPE + .getValue(ResourceLocation.parse(tileEntityBlock.getNbtId())); + if (nativeBlockEntityType == null) { + return; + } ((CraftPlayer) player).getHandle().connection.send(new ClientboundBlockEntityDataPacket( new BlockPos(pos.x(), pos.y(), pos.z()), - craftState.getBlockEntity().getType(), - vanillaNBT + nativeBlockEntityType, + (net.minecraft.nbt.CompoundTag) fromNative(nbtData) )); } diff --git a/worldedit-bukkit/adapters/adapter-26.1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v26_1/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-26.1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v26_1/PaperweightAdapter.java index 224a9416f4..28dd2c2766 100644 --- a/worldedit-bukkit/adapters/adapter-26.1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v26_1/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-26.1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v26_1/PaperweightAdapter.java @@ -32,6 +32,7 @@ import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.blocks.BaseItem; import com.sk89q.worldedit.blocks.BaseItemStack; +import com.sk89q.worldedit.blocks.TileEntityBlock; import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.bukkit.adapter.BukkitImplAdapter; import com.sk89q.worldedit.entity.BaseEntity; @@ -83,6 +84,7 @@ import net.minecraft.core.Registry; import net.minecraft.core.SectionPos; import net.minecraft.core.component.DataComponentPatch; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.nbt.ByteArrayTag; import net.minecraft.nbt.ByteTag; @@ -126,6 +128,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.entity.StructureBlockEntity; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.chunk.ChunkAccess; @@ -151,11 +154,9 @@ import org.bukkit.Location; import org.bukkit.World; import org.bukkit.World.Environment; -import org.bukkit.block.TileState; import org.bukkit.block.data.BlockData; import org.bukkit.craftbukkit.CraftServer; import org.bukkit.craftbukkit.CraftWorld; -import org.bukkit.craftbukkit.block.CraftBlockEntityState; import org.bukkit.craftbukkit.block.data.CraftBlockData; import org.bukkit.craftbukkit.entity.CraftEntity; import org.bukkit.craftbukkit.entity.CraftPlayer; @@ -691,14 +692,17 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) } @Override - public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, LinCompoundTag nbtData) { - CraftBlockEntityState craftState = (CraftBlockEntityState) tileState; - CompoundTag vanillaNBT = (net.minecraft.nbt.CompoundTag) fromNative(nbtData); + public void sendFakeNBT(Player player, BlockVector3 pos, TileEntityBlock tileEntityBlock, LinCompoundTag nbtData) { + BlockEntityType nativeBlockEntityType = BuiltInRegistries.BLOCK_ENTITY_TYPE + .getValue(Identifier.parse(tileEntityBlock.getNbtId())); + if (nativeBlockEntityType == null) { + return; + } ((CraftPlayer) player).getHandle().connection.send(new ClientboundBlockEntityDataPacket( new BlockPos(pos.x(), pos.y(), pos.z()), - craftState.getBlockEntity().getType(), - vanillaNBT + nativeBlockEntityType, + (net.minecraft.nbt.CompoundTag) fromNative(nbtData) )); } diff --git a/worldedit-bukkit/adapters/adapter-26.2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v26_2/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-26.2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v26_2/PaperweightAdapter.java index 800a6abd99..c44c437072 100644 --- a/worldedit-bukkit/adapters/adapter-26.2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v26_2/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-26.2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v26_2/PaperweightAdapter.java @@ -32,6 +32,7 @@ import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.blocks.BaseItem; import com.sk89q.worldedit.blocks.BaseItemStack; +import com.sk89q.worldedit.blocks.TileEntityBlock; import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.bukkit.adapter.BukkitImplAdapter; import com.sk89q.worldedit.entity.BaseEntity; @@ -83,6 +84,7 @@ import net.minecraft.core.Registry; import net.minecraft.core.SectionPos; import net.minecraft.core.component.DataComponentPatch; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.nbt.ByteArrayTag; import net.minecraft.nbt.ByteTag; @@ -126,6 +128,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.entity.StructureBlockEntity; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.chunk.ChunkAccess; @@ -151,11 +154,9 @@ import org.bukkit.Location; import org.bukkit.World; import org.bukkit.World.Environment; -import org.bukkit.block.TileState; import org.bukkit.block.data.BlockData; import org.bukkit.craftbukkit.CraftServer; import org.bukkit.craftbukkit.CraftWorld; -import org.bukkit.craftbukkit.block.CraftBlockEntityState; import org.bukkit.craftbukkit.block.data.CraftBlockData; import org.bukkit.craftbukkit.entity.CraftEntity; import org.bukkit.craftbukkit.entity.CraftPlayer; @@ -696,14 +697,17 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) } @Override - public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, LinCompoundTag nbtData) { - CraftBlockEntityState craftState = (CraftBlockEntityState) tileState; - CompoundTag vanillaNBT = (net.minecraft.nbt.CompoundTag) fromNative(nbtData); + public void sendFakeNBT(Player player, BlockVector3 pos, TileEntityBlock tileEntityBlock, LinCompoundTag nbtData) { + BlockEntityType nativeBlockEntityType = BuiltInRegistries.BLOCK_ENTITY_TYPE + .getValue(Identifier.parse(tileEntityBlock.getNbtId())); + if (nativeBlockEntityType == null) { + return; + } ((CraftPlayer) player).getHandle().connection.send(new ClientboundBlockEntityDataPacket( new BlockPos(pos.x(), pos.y(), pos.z()), - craftState.getBlockEntity().getType(), - vanillaNBT + nativeBlockEntityType, + (net.minecraft.nbt.CompoundTag) fromNative(nbtData) )); } diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java index 7b6edbe805..8f384c72bb 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java @@ -48,7 +48,6 @@ import io.papermc.lib.PaperLib; import org.bukkit.Bukkit; import org.bukkit.Location; -import org.bukkit.block.TileState; import org.bukkit.block.data.BlockData; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -326,10 +325,10 @@ public > void sendFakeBlock(BlockVector3 pos, @Nul return; } LinCompoundTag nbtData = baseBlock.getNbt(); - if (nbtData == null || !(data.createBlockState() instanceof TileState tileState)) { + if (nbtData == null) { return; } - adapter.sendFakeNBT(player, pos, tileState, nbtData); + adapter.sendFakeNBT(player, pos, baseBlock, nbtData); if (block != null && block.getBlockType() == BlockTypes.STRUCTURE_BLOCK) { adapter.sendFakeOP(player); } diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java index edc9173dd8..87d090d30f 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java @@ -23,6 +23,7 @@ import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.blocks.BaseItem; import com.sk89q.worldedit.blocks.BaseItemStack; +import com.sk89q.worldedit.blocks.TileEntityBlock; import com.sk89q.worldedit.entity.BaseEntity; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.internal.wna.WorldNativeAccess; @@ -49,7 +50,6 @@ import com.sk89q.worldedit.world.registry.BlockMaterial; import org.bukkit.Location; import org.bukkit.World; -import org.bukkit.block.TileState; import org.bukkit.block.data.BlockData; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; @@ -198,12 +198,13 @@ default void tickWatchdog() { /** * Send the given NBT data to the player. * - * @param player The player - * @param pos The position - * @param tileState The bukkit tile state - * @param nbtData The NBT Data + * @param player The player + * @param pos The position + * @param tileEntityBlock The block-entity block + * @param nbtData The NBT Data */ - void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, LinCompoundTag nbtData); + default void sendFakeNBT(Player player, BlockVector3 pos, TileEntityBlock tileEntityBlock, LinCompoundTag nbtData) { + } /** * Make the client think it has operator status. diff --git a/worldedit-core-mc/src/main/java/com/sk89q/worldedit/coremc/internal/CoreMcPlayer.java b/worldedit-core-mc/src/main/java/com/sk89q/worldedit/coremc/internal/CoreMcPlayer.java index 36856f4762..b78b66056f 100644 --- a/worldedit-core-mc/src/main/java/com/sk89q/worldedit/coremc/internal/CoreMcPlayer.java +++ b/worldedit-core-mc/src/main/java/com/sk89q/worldedit/coremc/internal/CoreMcPlayer.java @@ -39,13 +39,14 @@ import com.sk89q.worldedit.world.block.BlockStateHolder; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.protocol.game.ClientboundBlockUpdatePacket; +import net.minecraft.resources.Identifier; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.EntityBlock; -import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import org.enginehub.linbus.tree.LinCompoundTag; import org.enginehub.worldeditcui.protocol.CUIPacket; @@ -238,8 +239,8 @@ public > void sendFakeBlock(BlockVector3 pos, @Nul BlockPos loc = platform.getAdapter().toBlockPos(pos); if (block == null) { player.connection.send(new ClientboundBlockUpdatePacket( - coreMcWorld.getWorld(), - loc + coreMcWorld.getWorld(), + loc )); } else { final BlockState nativeState = platform.getAdapter().toNativeBlockState(block.toImmutableState()); @@ -250,17 +251,18 @@ public > void sendFakeBlock(BlockVector3 pos, @Nul return; } final LinCompoundTag nbtData = tileBlock.getNbt(); - if (nbtData == null || !(nativeState.getBlock() instanceof final EntityBlock entityBlock)) { + if (nbtData == null) { return; } - final BlockEntity blockEntity = entityBlock.newBlockEntity(loc, nativeState); - if (blockEntity == null) { + final BlockEntityType nativeBlockEntityType = BuiltInRegistries.BLOCK_ENTITY_TYPE + .getValue(Identifier.parse(tileBlock.getNbtId())); + if (nativeBlockEntityType == null) { return; } player.connection.send(AccessorClientboundBlockEntityDataPacket.create( - loc, - blockEntity.getType(), - NBTConverter.toNative(nbtData) + loc, + nativeBlockEntityType, + NBTConverter.toNative(nbtData) )); } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/AbstractPlayerActor.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/AbstractPlayerActor.java index 7b03aa6ce7..6654e66bb4 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/AbstractPlayerActor.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/AbstractPlayerActor.java @@ -565,7 +565,6 @@ public boolean remove() { @Override public > void sendFakeBlock(BlockVector3 pos, @Nullable B block) { - } } diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongePlayer.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongePlayer.java index beb051f4dc..c9b785d845 100644 --- a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongePlayer.java +++ b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongePlayer.java @@ -264,17 +264,17 @@ public > void sendFakeBlock(BlockVector3 pos, B bl CompoundTag nativeNbtData = NbtAdapter.adaptNMSToWorldEdit(nbtData); SpongeLoggingProblemReporter.with( - () -> "loading block entity for fake player " + player.uniqueId(), - reporter -> { - //noinspection DataFlowIssue - nativeBlockEntity.loadWithComponents( - TagValueInput.create(reporter, nativeBlockEntity.getLevel().registryAccess(), nativeNbtData) - ); - return null; - } + () -> "loading block entity for fake player " + player.uniqueId(), + reporter -> { + //noinspection DataFlowIssue + nativeBlockEntity.loadWithComponents( + TagValueInput.create(reporter, nativeBlockEntity.getLevel().registryAccess(), nativeNbtData) + ); + return null; + } ); nativePlayer.connection.send( - ClientboundBlockEntityDataPacket.create(nativeBlockEntity, (_, _) -> nativeNbtData) + ClientboundBlockEntityDataPacket.create(nativeBlockEntity, (_, _) -> nativeNbtData) ); } }