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..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; @@ -657,6 +660,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 +674,21 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) )); } + @Override + 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()), + nativeBlockEntityType, + (net.minecraft.nbt.CompoundTag) fromNative(nbtData) + )); + } + @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..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; @@ -637,6 +640,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 +654,21 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) )); } + @Override + 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()), + nativeBlockEntityType, + (net.minecraft.nbt.CompoundTag) fromNative(nbtData) + )); + } + @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..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; @@ -635,6 +638,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 +652,21 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) )); } + @Override + 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()), + nativeBlockEntityType, + (net.minecraft.nbt.CompoundTag) fromNative(nbtData) + )); + } + @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..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; @@ -657,6 +660,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 +674,21 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) )); } + @Override + 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()), + nativeBlockEntityType, + (net.minecraft.nbt.CompoundTag) fromNative(nbtData) + )); + } + @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..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; @@ -656,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( @@ -669,6 +673,21 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) )); } + @Override + 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()), + nativeBlockEntityType, + (net.minecraft.nbt.CompoundTag) fromNative(nbtData) + )); + } + @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..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; @@ -674,6 +677,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 +691,21 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) )); } + @Override + 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()), + nativeBlockEntityType, + (net.minecraft.nbt.CompoundTag) fromNative(nbtData) + )); + } + @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..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; @@ -679,6 +682,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 +696,21 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData) )); } + @Override + 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()), + nativeBlockEntityType, + (net.minecraft.nbt.CompoundTag) fromNative(nbtData) + )); + } + @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..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,6 +48,7 @@ import io.papermc.lib.PaperLib; import org.bukkit.Bukkit; import org.bukkit.Location; +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,31 @@ 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) { + return; + } + 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 caa8ad3a26..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; @@ -188,9 +189,23 @@ 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 tileEntityBlock The block-entity block + * @param nbtData The NBT Data + */ + default void sendFakeNBT(Player player, BlockVector3 pos, TileEntityBlock tileEntityBlock, LinCompoundTag nbtData) { + } + /** * Make the client think it has operator status. * This does not give them any operator capabilities. 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..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 @@ -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,17 +36,18 @@ 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.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.entity.BlockEntityTypes; +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; @@ -229,33 +231,39 @@ 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) { + return; } + final BlockEntityType nativeBlockEntityType = BuiltInRegistries.BLOCK_ENTITY_TYPE + .getValue(Identifier.parse(tileBlock.getNbtId())); + if (nativeBlockEntityType == null) { + return; + } + player.connection.send(AccessorClientboundBlockEntityDataPacket.create( + loc, + nativeBlockEntityType, + NBTConverter.toNative(nbtData) + )); } } 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..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 @@ -322,7 +322,7 @@ 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 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..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 @@ -564,7 +564,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 7811d2fd79..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 @@ -185,7 +185,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); } 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..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 @@ -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; - } + + 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) ); - nativePlayer.connection.send( - ClientboundBlockEntityDataPacket.create(structureBlockEntity, (be, ra) -> nativeNbtData)); + return null; } - } + ); + nativePlayer.connection.send( + ClientboundBlockEntityDataPacket.create(nativeBlockEntity, (_, _) -> nativeNbtData) + ); } }