diff --git a/worldedit-bukkit/adapters/adapter-1_21/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_R1/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1_21/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_R1/PaperweightAdapter.java index 9ede4bafa3..eeec5360d0 100644 --- a/worldedit-bukkit/adapters/adapter-1_21/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_R1/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_21/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_R1/PaperweightAdapter.java @@ -135,9 +135,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; @@ -620,6 +622,19 @@ 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) fromNativeLin(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_11/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_11/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1_21_11/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_11/PaperweightAdapter.java index f1d65c8da8..6ee08a16b8 100644 --- a/worldedit-bukkit/adapters/adapter-1_21_11/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_11/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_21_11/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_11/PaperweightAdapter.java @@ -148,9 +148,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; @@ -594,6 +596,19 @@ 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/ext/fawe/v1_21_4/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1_21_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_4/PaperweightAdapter.java index 70fbe27937..ded03be03c 100644 --- a/worldedit-bukkit/adapters/adapter-1_21_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_4/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_21_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_4/PaperweightAdapter.java @@ -127,9 +127,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; @@ -567,6 +569,19 @@ 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) fromNativeLin(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/ext/fawe/v1_21_5/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1_21_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_5/PaperweightAdapter.java index 0d95e3fa40..4376a34f33 100644 --- a/worldedit-bukkit/adapters/adapter-1_21_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_5/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_21_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_5/PaperweightAdapter.java @@ -141,9 +141,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; @@ -581,6 +583,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/ext/fawe/v1_21_6/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1_21_6/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_6/PaperweightAdapter.java index 8b8529b8f5..07a1bc9eaa 100644 --- a/worldedit-bukkit/adapters/adapter-1_21_6/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_6/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_21_6/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_6/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; @@ -606,6 +608,19 @@ 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/ext/fawe/v1_21_9/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1_21_9/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_9/PaperweightAdapter.java index 78b86d485b..7ec7aacf81 100644 --- a/worldedit-bukkit/adapters/adapter-1_21_9/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_9/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_21_9/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_9/PaperweightAdapter.java @@ -148,9 +148,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; @@ -601,6 +603,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 9c6321f209..7e982ef179 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 @@ -142,9 +142,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; @@ -618,6 +620,19 @@ 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/fastasyncworldedit/bukkit/adapter/IDelegateBukkitImplAdapter.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/IDelegateBukkitImplAdapter.java index 49329f2cca..333ae05d1b 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/IDelegateBukkitImplAdapter.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/IDelegateBukkitImplAdapter.java @@ -26,6 +26,7 @@ import org.bukkit.World; import org.bukkit.WorldCreator; import org.bukkit.block.Biome; +import org.bukkit.block.TileState; import org.bukkit.block.data.BlockData; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; @@ -86,6 +87,11 @@ default void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData getParent().sendFakeNBT(player, pos, nbtData); } + @Override + default void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, LinCompoundTag nbtData) { + getParent().sendFakeNBT(player, pos, tileState, nbtData); + } + @Override default void sendFakeOP(Player player) { getParent().sendFakeOP(player); 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 a7a680b68b..13a904a063 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 @@ -49,13 +49,14 @@ 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 org.apache.logging.log4j.Logger; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.block.TileState; +import org.bukkit.block.data.BlockData; import org.bukkit.entity.Item; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerDropItemEvent; @@ -434,22 +435,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) { - LinCompoundTag nbt = ((BaseBlock) block).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 2fe28534b6..84e3a95f00 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 @@ -64,6 +64,7 @@ import org.bukkit.World; import org.bukkit.WorldCreator; import org.bukkit.block.Biome; +import org.bukkit.block.TileState; import org.bukkit.block.data.BlockData; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; @@ -193,9 +194,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 fe0e807795..51228a02ac 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java @@ -1530,6 +1530,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 11561f313d..0c79171542 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 @@ -342,6 +342,8 @@ default boolean trySetPosition(Vector3 pos, float pitch, float yaw) { */ > void sendFakeBlock(BlockVector3 pos, @Nullable B block); + void sendFakeOP(); + //FAWE start /** * Get the player's current allowed WorldEdit regions. 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 58935df46b..e25d8248ce 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 @@ -783,7 +783,11 @@ public boolean remove() { } @Override - public > void sendFakeBlock(BlockVector3 pos, B block) { + public > void sendFakeBlock(BlockVector3 pos, @Nullable B block) { + + } + + 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 960c8b8d9e..a1dfe276e1 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 @@ -202,10 +202,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 findFreePosition(final Location searchPos) { basePlayer.findFreePosition(searchPos);