From 4d1bea1a5fade7a8d14f47f62d42aa7593e89750 Mon Sep 17 00:00:00 2001 From: Timon Seidel Date: Sat, 8 Nov 2025 19:20:03 +0100 Subject: [PATCH 1/5] feat: fully implement Player#sendFakeBlock --- .../ext/fawe/v1_20_R2/PaperweightAdapter.java | 36 ++++++++++++++++++ .../ext/fawe/v1_20_R3/PaperweightAdapter.java | 36 ++++++++++++++++++ .../ext.fawe/v1_20_R4/PaperweightAdapter.java | 20 ++++++++++ .../ext/fawe/v1_21_R1/PaperweightAdapter.java | 20 ++++++++++ .../ext/fawe/v1_21_4/PaperweightAdapter.java | 20 ++++++++++ .../ext/fawe/v1_21_5/PaperweightAdapter.java | 19 ++++++++++ .../ext/fawe/v1_21_6/PaperweightAdapter.java | 20 ++++++++++ .../ext/fawe/v1_21_9/PaperweightAdapter.java | 20 ++++++++++ .../adapter/IDelegateBukkitImplAdapter.java | 6 +++ .../sk89q/worldedit/bukkit/BukkitPlayer.java | 37 +++++++++++++------ .../bukkit/adapter/BukkitImplAdapter.java | 16 ++++++++ 11 files changed, 238 insertions(+), 12 deletions(-) diff --git a/worldedit-bukkit/adapters/adapter-1_20_2/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_20_R2/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1_20_2/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_20_R2/PaperweightAdapter.java index 28391ee583..71f0d60cf5 100644 --- a/worldedit-bukkit/adapters/adapter-1_20_2/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_20_R2/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_20_2/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_20_R2/PaperweightAdapter.java @@ -76,6 +76,8 @@ import net.minecraft.core.Registry; import net.minecraft.core.SectionPos; import net.minecraft.core.registries.Registries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; import net.minecraft.network.protocol.game.ClientboundEntityEventPacket; import net.minecraft.resources.ResourceKey; @@ -104,6 +106,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.block.state.properties.DirectionProperty; @@ -124,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.v1_20_R2.CraftServer; import org.bukkit.craftbukkit.v1_20_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R2.block.CraftBlockEntityState; import org.bukkit.craftbukkit.v1_20_R2.block.data.CraftBlockData; import org.bukkit.craftbukkit.v1_20_R2.entity.CraftEntity; import org.bukkit.craftbukkit.v1_20_R2.entity.CraftPlayer; @@ -156,6 +161,7 @@ import javax.annotation.Nullable; import java.lang.ref.WeakReference; +import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -188,6 +194,7 @@ public final class PaperweightAdapter implements BukkitImplAdapter blockEntityDataPacketConstructor; private final Watchdog watchdog; private static final RandomSource random = RandomSource.create(); @@ -219,6 +226,11 @@ public PaperweightAdapter() throws NoSuchFieldException, NoSuchMethodException { ); chunkProviderExecutorField.setAccessible(true); + blockEntityDataPacketConstructor = ClientboundBlockEntityDataPacket.class.getDeclaredConstructor( + BlockPos.class, BlockEntityType.class, net.minecraft.nbt.CompoundTag.class + ); + blockEntityDataPacketConstructor.setAccessible(true); + new PaperweightDataConverters(CraftMagicNumbers.INSTANCE.getDataVersion(), this).buildUnoptimized(); Watchdog watchdog; @@ -624,6 +636,30 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) )); } + @Override + public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, @Nullable LinCompoundTag nbtData) { + try { + CraftBlockEntityState craftState = (CraftBlockEntityState) tileState; + + CompoundTag vanillaNBT; + if (nbtData == null) { + vanillaNBT = craftState.getSnapshotNBT(); + } else { + vanillaNBT = (net.minecraft.nbt.CompoundTag) fromNativeLin(nbtData); + } + + ((CraftPlayer) player).getHandle().connection.send((Packet) + blockEntityDataPacketConstructor.newInstance( + new BlockPos(pos.x(), pos.y(), pos.z()), + craftState.getTileEntity().getType(), + vanillaNBT + ) + ); + } catch (ReflectiveOperationException e) { + logger.log(Level.WARNING, "Failed to construct ClientboundBlockEntityDataPacket", e); + } + } + @Override public void sendFakeOP(Player player) { ((CraftPlayer) player).getHandle().connection.send(new ClientboundEntityEventPacket( diff --git a/worldedit-bukkit/adapters/adapter-1_20_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_20_R3/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1_20_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_20_R3/PaperweightAdapter.java index f524676068..fdb68fe5de 100644 --- a/worldedit-bukkit/adapters/adapter-1_20_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_20_R3/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_20_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_20_R3/PaperweightAdapter.java @@ -76,6 +76,8 @@ import net.minecraft.core.Registry; import net.minecraft.core.SectionPos; import net.minecraft.core.registries.Registries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; import net.minecraft.network.protocol.game.ClientboundEntityEventPacket; import net.minecraft.resources.ResourceKey; @@ -104,6 +106,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.block.state.properties.DirectionProperty; @@ -124,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.v1_20_R3.CraftServer; import org.bukkit.craftbukkit.v1_20_R3.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R3.block.CraftBlockEntityState; import org.bukkit.craftbukkit.v1_20_R3.block.data.CraftBlockData; import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity; import org.bukkit.craftbukkit.v1_20_R3.entity.CraftPlayer; @@ -156,6 +161,7 @@ import javax.annotation.Nullable; import java.lang.ref.WeakReference; +import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -188,6 +194,7 @@ public final class PaperweightAdapter implements BukkitImplAdapter blockEntityDataPacketConstructor; private final Watchdog watchdog; private static final RandomSource random = RandomSource.create(); @@ -219,6 +226,11 @@ public PaperweightAdapter() throws NoSuchFieldException, NoSuchMethodException { ); chunkProviderExecutorField.setAccessible(true); + blockEntityDataPacketConstructor = ClientboundBlockEntityDataPacket.class.getDeclaredConstructor( + BlockPos.class, BlockEntityType.class, net.minecraft.nbt.CompoundTag.class + ); + blockEntityDataPacketConstructor.setAccessible(true); + new PaperweightDataConverters(CraftMagicNumbers.INSTANCE.getDataVersion(), this).buildUnoptimized(); Watchdog watchdog; @@ -623,6 +635,30 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) )); } + @Override + public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, @Nullable LinCompoundTag nbtData) { + try { + CraftBlockEntityState craftState = (CraftBlockEntityState) tileState; + + CompoundTag vanillaNBT; + if (nbtData == null) { + vanillaNBT = craftState.getSnapshotNBT(); + } else { + vanillaNBT = (net.minecraft.nbt.CompoundTag) fromNativeLin(nbtData); + } + + ((CraftPlayer) player).getHandle().connection.send((Packet) + blockEntityDataPacketConstructor.newInstance( + new BlockPos(pos.x(), pos.y(), pos.z()), + craftState.getTileEntity().getType(), + vanillaNBT + ) + ); + } catch (ReflectiveOperationException e) { + logger.log(Level.WARNING, "Failed to construct ClientboundBlockEntityDataPacket", e); + } + } + @Override public void sendFakeOP(Player player) { ((CraftPlayer) player).getHandle().connection.send(new ClientboundEntityEventPacket( diff --git a/worldedit-bukkit/adapters/adapter-1_20_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext.fawe/v1_20_R4/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1_20_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext.fawe/v1_20_R4/PaperweightAdapter.java index cb6da03c34..8407ee0128 100644 --- a/worldedit-bukkit/adapters/adapter-1_20_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext.fawe/v1_20_R4/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_20_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext.fawe/v1_20_R4/PaperweightAdapter.java @@ -128,9 +128,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; @@ -633,6 +635,24 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) )); } + @Override + public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, @Nullable LinCompoundTag nbtData) { + CraftBlockEntityState craftState = (CraftBlockEntityState) tileState; + + CompoundTag vanillaNBT; + if (nbtData == null) { + vanillaNBT = craftState.getSnapshotNBT(); + } else { + 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/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 5e8ed03d7e..bd4da68ed8 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 @@ -128,9 +128,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; @@ -613,6 +615,24 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) )); } + @Override + public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, @Nullable LinCompoundTag nbtData) { + CraftBlockEntityState craftState = (CraftBlockEntityState) tileState; + + CompoundTag vanillaNBT; + if (nbtData == null) { + vanillaNBT = craftState.getSnapshotNBT(); + } else { + 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_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 01987f18cb..386fc3d097 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 @@ -123,9 +123,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; @@ -563,6 +565,24 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) )); } + @Override + public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, @Nullable LinCompoundTag nbtData) { + CraftBlockEntityState craftState = (CraftBlockEntityState) tileState; + + CompoundTag vanillaNBT; + if (nbtData == null) { + vanillaNBT = craftState.getSnapshotNBT(); + } else { + 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 7dfb944b6c..7949f049d6 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 @@ -137,9 +137,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; @@ -577,6 +579,23 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) )); } + @Override + public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, @Nullable LinCompoundTag nbtData) { + CraftBlockEntityState craftState = (CraftBlockEntityState) tileState; + + CompoundTag vanillaNBT; + if (nbtData == null) { + vanillaNBT = craftState.getSnapshotNBT(); + } else { + 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 20acb6a704..52514bd3c7 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 @@ -144,9 +144,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; @@ -598,6 +600,24 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) )); } + @Override + public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, @Nullable LinCompoundTag nbtData) { + CraftBlockEntityState craftState = (CraftBlockEntityState) tileState; + + CompoundTag vanillaNBT; + if (nbtData == null) { + vanillaNBT = craftState.getSnapshotNBT(); + } else { + 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 17898f34f4..773aac17ea 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 @@ -143,9 +143,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; @@ -596,6 +598,24 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) )); } + @Override + public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, @Nullable LinCompoundTag nbtData) { + CraftBlockEntityState craftState = (CraftBlockEntityState) tileState; + + CompoundTag vanillaNBT; + if (nbtData == null) { + vanillaNBT = craftState.getSnapshotNBT(); + } else { + 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..10ae0605b0 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, @Nullable 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..a4ba1f67fe 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 @@ -52,10 +52,16 @@ import com.sk89q.worldedit.world.block.BlockTypes; import com.sk89q.worldedit.world.gamemode.GameMode; import com.sk89q.worldedit.world.gamemode.GameModes; +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; import org.apache.logging.log4j.Logger; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.BlockState; +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; @@ -436,21 +442,28 @@ public boolean isPersistent() { @Override public > void sendFakeBlock(BlockVector3 pos, B block) { Location loc = new Location(player.getWorld(), pos.x(), pos.y(), pos.z()); + BlockData data; + BlockState state; + if (block == null) { - player.sendBlockChange(loc, player.getWorld().getBlockAt(loc).getBlockData()); + Pair worldBlock = TaskManager.taskManager().sync(() -> { + Block bukkitBlock = player.getWorld().getBlockAt(loc); + return ImmutablePair.of(bukkitBlock.getBlockData(), bukkitBlock.getState(true)); + }); + + data = worldBlock.getLeft(); + state = worldBlock.getRight(); } 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); - } - } - } + data = BukkitAdapter.adapt(block); + state = data.createBlockState(); + } + + player.sendBlockChange(loc, data); + BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter(); + if (adapter == null || !(state instanceof TileState tileState)) { + return; } + adapter.sendFakeNBT(player, pos, tileState, block == null ? null : block.getNbt()); } //FAWE start 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 f3db4cb9f3..58b7f5032e 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 @@ -62,6 +62,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; @@ -191,9 +192,24 @@ default void tickWatchdog() { * @param player The player * @param pos The position * @param nbtData The NBT Data + * + * @deprecated Only works for structure blocks */ + @Deprecated 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 + * + * @implNote If the {@code nbtData} is null the nbt of the {@code tileEntity} will be used instead + */ + void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, @Nullable LinCompoundTag nbtData); + /** * Make the client think it has operator status. * This does not give them any operator capabilities. From 08d6eb32aba75b15d2decb3cb2549a63fe4edded Mon Sep 17 00:00:00 2001 From: Timon Seidel Date: Sun, 30 Nov 2025 20:52:13 +0100 Subject: [PATCH 2/5] chore: replace apache's pair usage with map entry --- .../java/com/sk89q/worldedit/bukkit/BukkitPlayer.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 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 a4ba1f67fe..a5f0be67dd 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 @@ -52,8 +52,6 @@ import com.sk89q.worldedit.world.block.BlockTypes; import com.sk89q.worldedit.world.gamemode.GameMode; import com.sk89q.worldedit.world.gamemode.GameModes; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; import org.apache.logging.log4j.Logger; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -446,13 +444,13 @@ public > void sendFakeBlock(BlockVector3 pos, B bl BlockState state; if (block == null) { - Pair worldBlock = TaskManager.taskManager().sync(() -> { + Map.Entry worldBlock = TaskManager.taskManager().sync(() -> { Block bukkitBlock = player.getWorld().getBlockAt(loc); - return ImmutablePair.of(bukkitBlock.getBlockData(), bukkitBlock.getState(true)); + return Map.entry(bukkitBlock.getBlockData(), bukkitBlock.getState(true)); }); - data = worldBlock.getLeft(); - state = worldBlock.getRight(); + data = worldBlock.getKey(); + state = worldBlock.getValue(); } else { data = BukkitAdapter.adapt(block); state = data.createBlockState(); From 2fe463c1397bc7094fc357c49ac5ca2801490d02 Mon Sep 17 00:00:00 2001 From: Timon Seidel Date: Wed, 17 Dec 2025 15:09:22 +0100 Subject: [PATCH 3/5] chore: update 1.21.11 --- .../ext/fawe/v1_21_11/PaperweightAdapter.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) 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 57e5a6cc8a..37e49512a2 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 @@ -143,9 +143,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; @@ -589,6 +591,24 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) )); } + @Override + public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, @Nullable LinCompoundTag nbtData) { + CraftBlockEntityState craftState = (CraftBlockEntityState) tileState; + + CompoundTag vanillaNBT; + if (nbtData == null) { + vanillaNBT = craftState.getSnapshotNBT(); + } else { + 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( From 6a3fdcb251f5496f49c30a7c219b2813fce0cbd4 Mon Sep 17 00:00:00 2001 From: Timon Seidel Date: Mon, 22 Dec 2025 15:14:17 +0100 Subject: [PATCH 4/5] chore: use extent instead of accessing the world directly -> fix: rare exception when using CraftBlockEntityState#getSnapshotNBT async (with latest 1.21.10 Paper builds?) --- .../ext/fawe/v1_20_R2/PaperweightAdapter.java | 9 ++---- .../ext/fawe/v1_20_R3/PaperweightAdapter.java | 9 ++---- .../ext.fawe/v1_20_R4/PaperweightAdapter.java | 9 ++---- .../ext/fawe/v1_21_R1/PaperweightAdapter.java | 9 ++---- .../ext/fawe/v1_21_11/PaperweightAdapter.java | 9 ++---- .../ext/fawe/v1_21_4/PaperweightAdapter.java | 9 ++---- .../ext/fawe/v1_21_5/PaperweightAdapter.java | 9 ++---- .../ext/fawe/v1_21_6/PaperweightAdapter.java | 9 ++---- .../ext/fawe/v1_21_9/PaperweightAdapter.java | 10 ++---- .../adapter/IDelegateBukkitImplAdapter.java | 2 +- .../sk89q/worldedit/bukkit/BukkitPlayer.java | 32 ++++++++----------- .../bukkit/adapter/BukkitImplAdapter.java | 6 ++-- .../platform/AbstractPlayerActor.java | 2 +- .../extension/platform/PlayerProxy.java | 2 +- 14 files changed, 37 insertions(+), 89 deletions(-) diff --git a/worldedit-bukkit/adapters/adapter-1_20_2/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_20_R2/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1_20_2/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_20_R2/PaperweightAdapter.java index 71f0d60cf5..bb1ac69f84 100644 --- a/worldedit-bukkit/adapters/adapter-1_20_2/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_20_R2/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_20_2/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_20_R2/PaperweightAdapter.java @@ -637,16 +637,11 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) } @Override - public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, @Nullable LinCompoundTag nbtData) { + public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, LinCompoundTag nbtData) { try { CraftBlockEntityState craftState = (CraftBlockEntityState) tileState; - CompoundTag vanillaNBT; - if (nbtData == null) { - vanillaNBT = craftState.getSnapshotNBT(); - } else { - vanillaNBT = (net.minecraft.nbt.CompoundTag) fromNativeLin(nbtData); - } + CompoundTag vanillaNBT = (net.minecraft.nbt.CompoundTag) fromNativeLin(nbtData); ((CraftPlayer) player).getHandle().connection.send((Packet) blockEntityDataPacketConstructor.newInstance( diff --git a/worldedit-bukkit/adapters/adapter-1_20_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_20_R3/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1_20_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_20_R3/PaperweightAdapter.java index fdb68fe5de..7a4d74554a 100644 --- a/worldedit-bukkit/adapters/adapter-1_20_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_20_R3/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_20_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_20_R3/PaperweightAdapter.java @@ -636,16 +636,11 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) } @Override - public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, @Nullable LinCompoundTag nbtData) { + public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, LinCompoundTag nbtData) { try { CraftBlockEntityState craftState = (CraftBlockEntityState) tileState; - CompoundTag vanillaNBT; - if (nbtData == null) { - vanillaNBT = craftState.getSnapshotNBT(); - } else { - vanillaNBT = (net.minecraft.nbt.CompoundTag) fromNativeLin(nbtData); - } + CompoundTag vanillaNBT = (net.minecraft.nbt.CompoundTag) fromNativeLin(nbtData); ((CraftPlayer) player).getHandle().connection.send((Packet) blockEntityDataPacketConstructor.newInstance( diff --git a/worldedit-bukkit/adapters/adapter-1_20_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext.fawe/v1_20_R4/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1_20_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext.fawe/v1_20_R4/PaperweightAdapter.java index 8407ee0128..d32475a7db 100644 --- a/worldedit-bukkit/adapters/adapter-1_20_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext.fawe/v1_20_R4/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_20_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext.fawe/v1_20_R4/PaperweightAdapter.java @@ -636,15 +636,10 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) } @Override - public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, @Nullable LinCompoundTag nbtData) { + public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, LinCompoundTag nbtData) { CraftBlockEntityState craftState = (CraftBlockEntityState) tileState; - CompoundTag vanillaNBT; - if (nbtData == null) { - vanillaNBT = craftState.getSnapshotNBT(); - } else { - vanillaNBT = (net.minecraft.nbt.CompoundTag) fromNativeLin(nbtData); - } + CompoundTag vanillaNBT = (net.minecraft.nbt.CompoundTag) fromNativeLin(nbtData); ((CraftPlayer) player).getHandle().connection.send(new ClientboundBlockEntityDataPacket( new BlockPos(pos.x(), pos.y(), pos.z()), 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 bd4da68ed8..410aab59c6 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 @@ -616,15 +616,10 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) } @Override - public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, @Nullable LinCompoundTag nbtData) { + public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, LinCompoundTag nbtData) { CraftBlockEntityState craftState = (CraftBlockEntityState) tileState; - CompoundTag vanillaNBT; - if (nbtData == null) { - vanillaNBT = craftState.getSnapshotNBT(); - } else { - vanillaNBT = (net.minecraft.nbt.CompoundTag) fromNativeLin(nbtData); - } + CompoundTag vanillaNBT = (net.minecraft.nbt.CompoundTag) fromNativeLin(nbtData); ((CraftPlayer) player).getHandle().connection.send(new ClientboundBlockEntityDataPacket( new BlockPos(pos.x(), pos.y(), pos.z()), 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 37e49512a2..7f180db7eb 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 @@ -592,15 +592,10 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) } @Override - public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, @Nullable LinCompoundTag nbtData) { + public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, LinCompoundTag nbtData) { CraftBlockEntityState craftState = (CraftBlockEntityState) tileState; - CompoundTag vanillaNBT; - if (nbtData == null) { - vanillaNBT = craftState.getSnapshotNBT(); - } else { - vanillaNBT = (net.minecraft.nbt.CompoundTag) fromNative(nbtData); - } + CompoundTag vanillaNBT = (net.minecraft.nbt.CompoundTag) fromNative(nbtData); ((CraftPlayer) player).getHandle().connection.send(new ClientboundBlockEntityDataPacket( new BlockPos(pos.x(), pos.y(), pos.z()), 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 386fc3d097..4adf27acd2 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 @@ -566,15 +566,10 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) } @Override - public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, @Nullable LinCompoundTag nbtData) { + public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, LinCompoundTag nbtData) { CraftBlockEntityState craftState = (CraftBlockEntityState) tileState; - CompoundTag vanillaNBT; - if (nbtData == null) { - vanillaNBT = craftState.getSnapshotNBT(); - } else { - vanillaNBT = (net.minecraft.nbt.CompoundTag) fromNativeLin(nbtData); - } + CompoundTag vanillaNBT = (net.minecraft.nbt.CompoundTag) fromNativeLin(nbtData); ((CraftPlayer) player).getHandle().connection.send(new ClientboundBlockEntityDataPacket( new BlockPos(pos.x(), pos.y(), pos.z()), 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 7949f049d6..7ef7b67658 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 @@ -580,15 +580,10 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) } @Override - public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, @Nullable LinCompoundTag nbtData) { + public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, LinCompoundTag nbtData) { CraftBlockEntityState craftState = (CraftBlockEntityState) tileState; - CompoundTag vanillaNBT; - if (nbtData == null) { - vanillaNBT = craftState.getSnapshotNBT(); - } else { - vanillaNBT = (net.minecraft.nbt.CompoundTag) fromNative(nbtData); - } + CompoundTag vanillaNBT = (net.minecraft.nbt.CompoundTag) fromNative(nbtData); ((CraftPlayer) player).getHandle().connection.send(new ClientboundBlockEntityDataPacket( new BlockPos(pos.x(), pos.y(), pos.z()), 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 52514bd3c7..0d9eb6d3c4 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 @@ -601,15 +601,10 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) } @Override - public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, @Nullable LinCompoundTag nbtData) { + public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, LinCompoundTag nbtData) { CraftBlockEntityState craftState = (CraftBlockEntityState) tileState; - CompoundTag vanillaNBT; - if (nbtData == null) { - vanillaNBT = craftState.getSnapshotNBT(); - } else { - vanillaNBT = (net.minecraft.nbt.CompoundTag) fromNative(nbtData); - } + CompoundTag vanillaNBT = (net.minecraft.nbt.CompoundTag) fromNative(nbtData); ((CraftPlayer) player).getHandle().connection.send(new ClientboundBlockEntityDataPacket( new BlockPos(pos.x(), pos.y(), pos.z()), 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 773aac17ea..479264884d 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 @@ -599,15 +599,9 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) } @Override - public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, @Nullable LinCompoundTag nbtData) { + public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, LinCompoundTag nbtData) { CraftBlockEntityState craftState = (CraftBlockEntityState) tileState; - - CompoundTag vanillaNBT; - if (nbtData == null) { - vanillaNBT = craftState.getSnapshotNBT(); - } else { - vanillaNBT = (net.minecraft.nbt.CompoundTag) fromNative(nbtData); - } + CompoundTag vanillaNBT = (net.minecraft.nbt.CompoundTag) fromNative(nbtData); ((CraftPlayer) player).getHandle().connection.send(new ClientboundBlockEntityDataPacket( new BlockPos(pos.x(), pos.y(), pos.z()), 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 10ae0605b0..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 @@ -88,7 +88,7 @@ default void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData } @Override - default void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, @Nullable LinCompoundTag nbtData) { + default void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, LinCompoundTag nbtData) { getParent().sendFakeNBT(player, pos, tileState, 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 a5f0be67dd..2b21c65a16 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,15 +49,12 @@ 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.Block; -import org.bukkit.block.BlockState; import org.bukkit.block.TileState; import org.bukkit.block.data.BlockData; import org.bukkit.entity.Item; @@ -438,30 +435,29 @@ 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()); - BlockData data; - BlockState state; - if (block == null) { - Map.Entry worldBlock = TaskManager.taskManager().sync(() -> { - Block bukkitBlock = player.getWorld().getBlockAt(loc); - return Map.entry(bukkitBlock.getBlockData(), bukkitBlock.getState(true)); - }); - - data = worldBlock.getKey(); - state = worldBlock.getValue(); + BaseBlock baseBlock; + if (block != null) { + baseBlock = block.toBaseBlock(); } else { - data = BukkitAdapter.adapt(block); - state = data.createBlockState(); + baseBlock = getExtent().getFullBlock(pos); } + BlockData data = BukkitAdapter.adapt(baseBlock); + player.sendBlockChange(loc, data); + BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter(); - if (adapter == null || !(state instanceof TileState tileState)) { + if (adapter == null) { + return; + } + LinCompoundTag nbtData = baseBlock.getNbt(); + if (nbtData == null || !(data.createBlockState() instanceof TileState tileState)) { return; } - adapter.sendFakeNBT(player, pos, tileState, block == null ? null : block.getNbt()); + adapter.sendFakeNBT(player, pos, tileState, nbtData); } //FAWE start 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 58b7f5032e..8ee6e684e7 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 @@ -195,7 +195,7 @@ default void tickWatchdog() { * * @deprecated Only works for structure blocks */ - @Deprecated + @Deprecated(since = "2.14.4") void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData); /** @@ -205,10 +205,8 @@ default void tickWatchdog() { * @param pos The position * @param tileState The bukkit tile state * @param nbtData The NBT Data - * - * @implNote If the {@code nbtData} is null the nbt of the {@code tileEntity} will be used instead */ - void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, @Nullable LinCompoundTag nbtData); + void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, LinCompoundTag nbtData); /** * Make the client think it has operator status. 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..60953af8a2 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,7 @@ public boolean remove() { } @Override - public > void sendFakeBlock(BlockVector3 pos, B block) { + public > void sendFakeBlock(BlockVector3 pos, @Nullable B block) { } 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..7f1b1e9dcd 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,7 +202,7 @@ 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); } From b328553df1cd3fa1567ac22f413be1489e75a645 Mon Sep 17 00:00:00 2001 From: Timon Seidel Date: Sun, 11 Jan 2026 20:21:43 +0100 Subject: [PATCH 5/5] fix: cui not showing for non-opped players -> decupled from fake block handling chore: up deprecation version --- .../java/com/sk89q/worldedit/bukkit/BukkitPlayer.java | 8 ++++++++ .../sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java | 2 +- .../src/main/java/com/sk89q/worldedit/LocalSession.java | 1 + .../src/main/java/com/sk89q/worldedit/entity/Player.java | 2 ++ .../worldedit/extension/platform/AbstractPlayerActor.java | 4 ++++ .../sk89q/worldedit/extension/platform/PlayerProxy.java | 5 +++++ 6 files changed, 21 insertions(+), 1 deletion(-) 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 2b21c65a16..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 @@ -460,6 +460,14 @@ public > void sendFakeBlock(BlockVector3 pos, @Nul adapter.sendFakeNBT(player, pos, tileState, nbtData); } + @Override + public void sendFakeOP() { + BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter(); + if (adapter != null) { + adapter.sendFakeOP(player); + } + } + //FAWE start @Override public void sendTitle(Component title, Component sub) { 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 8ee6e684e7..693151f2e0 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 @@ -195,7 +195,7 @@ default void tickWatchdog() { * * @deprecated Only works for structure blocks */ - @Deprecated(since = "2.14.4") + @Deprecated(since = "2.15.1") 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 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 60953af8a2..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 @@ -787,4 +787,8 @@ public > void sendFakeBlock(BlockVector3 pos, @Nul } + 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 7f1b1e9dcd..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 @@ -206,6 +206,11 @@ public > void sendFakeBlock(BlockVector3 pos, @Nul basePlayer.sendFakeBlock(pos, block); } + @Override + public void sendFakeOP() { + basePlayer.sendFakeOP(); + } + @Override public void findFreePosition(final Location searchPos) { basePlayer.findFreePosition(searchPos);