Skip to content

Commit 306a449

Browse files
committed
feat: fully implement Player#sendFakeBlock
1 parent 57c8ab5 commit 306a449

File tree

11 files changed

+169
-12
lines changed

11 files changed

+169
-12
lines changed

worldedit-bukkit/adapters/adapter-1_20_2/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_20_R2/PaperweightAdapter.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,13 +69,18 @@
6969
import com.sk89q.worldedit.world.generation.ConfiguredFeatureType;
7070
import com.sk89q.worldedit.world.generation.StructureType;
7171
import com.sk89q.worldedit.world.item.ItemType;
72+
73+
import java.lang.reflect.Constructor;
74+
7275
import net.minecraft.Util;
7376
import net.minecraft.core.BlockPos;
7477
import net.minecraft.core.Holder;
7578
import net.minecraft.core.HolderSet;
7679
import net.minecraft.core.Registry;
7780
import net.minecraft.core.SectionPos;
7881
import net.minecraft.core.registries.Registries;
82+
import net.minecraft.nbt.CompoundTag;
83+
import net.minecraft.network.protocol.Packet;
7984
import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket;
8085
import net.minecraft.network.protocol.game.ClientboundEntityEventPacket;
8186
import net.minecraft.resources.ResourceKey;
@@ -104,6 +109,7 @@
104109
import net.minecraft.world.level.block.Block;
105110
import net.minecraft.world.level.block.Blocks;
106111
import net.minecraft.world.level.block.entity.BlockEntity;
112+
import net.minecraft.world.level.block.entity.BlockEntityType;
107113
import net.minecraft.world.level.block.entity.StructureBlockEntity;
108114
import net.minecraft.world.level.block.state.StateDefinition;
109115
import net.minecraft.world.level.block.state.properties.DirectionProperty;
@@ -124,9 +130,11 @@
124130
import org.bukkit.Location;
125131
import org.bukkit.World;
126132
import org.bukkit.World.Environment;
133+
import org.bukkit.block.TileState;
127134
import org.bukkit.block.data.BlockData;
128135
import org.bukkit.craftbukkit.v1_20_R2.CraftServer;
129136
import org.bukkit.craftbukkit.v1_20_R2.CraftWorld;
137+
import org.bukkit.craftbukkit.v1_20_R2.block.CraftBlockEntityState;
130138
import org.bukkit.craftbukkit.v1_20_R2.block.data.CraftBlockData;
131139
import org.bukkit.craftbukkit.v1_20_R2.entity.CraftEntity;
132140
import org.bukkit.craftbukkit.v1_20_R2.entity.CraftPlayer;
@@ -188,6 +196,7 @@ public final class PaperweightAdapter implements BukkitImplAdapter<net.minecraft
188196
private final Field serverWorldsField;
189197
private final Method getChunkFutureMethod;
190198
private final Field chunkProviderExecutorField;
199+
private final Constructor<?> blockEntityDataPacketConstructor;
191200
private final Watchdog watchdog;
192201

193202
private static final RandomSource random = RandomSource.create();
@@ -219,6 +228,11 @@ public PaperweightAdapter() throws NoSuchFieldException, NoSuchMethodException {
219228
);
220229
chunkProviderExecutorField.setAccessible(true);
221230

231+
blockEntityDataPacketConstructor = ClientboundBlockEntityDataPacket.class.getDeclaredConstructor(
232+
BlockPos.class, BlockEntityType.class, net.minecraft.nbt.CompoundTag.class
233+
);
234+
blockEntityDataPacketConstructor.setAccessible(true);
235+
222236
new PaperweightDataConverters(CraftMagicNumbers.INSTANCE.getDataVersion(), this).buildUnoptimized();
223237

224238
Watchdog watchdog;
@@ -624,6 +638,21 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData)
624638
));
625639
}
626640

641+
@Override
642+
public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, LinCompoundTag nbtData) {
643+
try {
644+
((CraftPlayer) player).getHandle().connection.send((Packet<?>)
645+
blockEntityDataPacketConstructor.newInstance(
646+
new BlockPos(pos.x(), pos.y(), pos.z()),
647+
((CraftBlockEntityState<?>) tileState).getTileEntity().getType(),
648+
(CompoundTag) fromNativeLin(nbtData)
649+
)
650+
);
651+
} catch (ReflectiveOperationException e) {
652+
logger.log(Level.WARNING, "Failed to construct ClientboundBlockEntityDataPacket", e);
653+
}
654+
}
655+
627656
@Override
628657
public void sendFakeOP(Player player) {
629658
((CraftPlayer) player).getHandle().connection.send(new ClientboundEntityEventPacket(

worldedit-bukkit/adapters/adapter-1_20_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_20_R3/PaperweightAdapter.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,13 +69,18 @@
6969
import com.sk89q.worldedit.world.generation.ConfiguredFeatureType;
7070
import com.sk89q.worldedit.world.generation.StructureType;
7171
import com.sk89q.worldedit.world.item.ItemType;
72+
73+
import java.lang.reflect.Constructor;
74+
7275
import net.minecraft.Util;
7376
import net.minecraft.core.BlockPos;
7477
import net.minecraft.core.Holder;
7578
import net.minecraft.core.HolderSet;
7679
import net.minecraft.core.Registry;
7780
import net.minecraft.core.SectionPos;
7881
import net.minecraft.core.registries.Registries;
82+
import net.minecraft.nbt.CompoundTag;
83+
import net.minecraft.network.protocol.Packet;
7984
import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket;
8085
import net.minecraft.network.protocol.game.ClientboundEntityEventPacket;
8186
import net.minecraft.resources.ResourceKey;
@@ -104,6 +109,7 @@
104109
import net.minecraft.world.level.block.Block;
105110
import net.minecraft.world.level.block.Blocks;
106111
import net.minecraft.world.level.block.entity.BlockEntity;
112+
import net.minecraft.world.level.block.entity.BlockEntityType;
107113
import net.minecraft.world.level.block.entity.StructureBlockEntity;
108114
import net.minecraft.world.level.block.state.StateDefinition;
109115
import net.minecraft.world.level.block.state.properties.DirectionProperty;
@@ -124,9 +130,11 @@
124130
import org.bukkit.Location;
125131
import org.bukkit.World;
126132
import org.bukkit.World.Environment;
133+
import org.bukkit.block.TileState;
127134
import org.bukkit.block.data.BlockData;
128135
import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
129136
import org.bukkit.craftbukkit.v1_20_R3.CraftWorld;
137+
import org.bukkit.craftbukkit.v1_20_R3.block.CraftBlockEntityState;
130138
import org.bukkit.craftbukkit.v1_20_R3.block.data.CraftBlockData;
131139
import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
132140
import org.bukkit.craftbukkit.v1_20_R3.entity.CraftPlayer;
@@ -188,6 +196,7 @@ public final class PaperweightAdapter implements BukkitImplAdapter<net.minecraft
188196
private final Field serverWorldsField;
189197
private final Method getChunkFutureMethod;
190198
private final Field chunkProviderExecutorField;
199+
private final Constructor<?> blockEntityDataPacketConstructor;
191200
private final Watchdog watchdog;
192201

193202
private static final RandomSource random = RandomSource.create();
@@ -219,6 +228,11 @@ public PaperweightAdapter() throws NoSuchFieldException, NoSuchMethodException {
219228
);
220229
chunkProviderExecutorField.setAccessible(true);
221230

231+
blockEntityDataPacketConstructor = ClientboundBlockEntityDataPacket.class.getDeclaredConstructor(
232+
BlockPos.class, BlockEntityType.class, net.minecraft.nbt.CompoundTag.class
233+
);
234+
blockEntityDataPacketConstructor.setAccessible(true);
235+
222236
new PaperweightDataConverters(CraftMagicNumbers.INSTANCE.getDataVersion(), this).buildUnoptimized();
223237

224238
Watchdog watchdog;
@@ -623,6 +637,21 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData)
623637
));
624638
}
625639

640+
@Override
641+
public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, LinCompoundTag nbtData) {
642+
try {
643+
((CraftPlayer) player).getHandle().connection.send((Packet<?>)
644+
blockEntityDataPacketConstructor.newInstance(
645+
new BlockPos(pos.x(), pos.y(), pos.z()),
646+
((CraftBlockEntityState<?>) tileState).getTileEntity().getType(),
647+
(CompoundTag) fromNativeLin(nbtData)
648+
)
649+
);
650+
} catch (ReflectiveOperationException e) {
651+
logger.log(Level.WARNING, "Failed to construct ClientboundBlockEntityDataPacket", e);
652+
}
653+
}
654+
626655
@Override
627656
public void sendFakeOP(Player player) {
628657
((CraftPlayer) player).getHandle().connection.send(new ClientboundEntityEventPacket(

worldedit-bukkit/adapters/adapter-1_20_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext.fawe/v1_20_R4/PaperweightAdapter.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,11 @@
128128
import org.bukkit.Location;
129129
import org.bukkit.World;
130130
import org.bukkit.World.Environment;
131+
import org.bukkit.block.TileState;
131132
import org.bukkit.block.data.BlockData;
132133
import org.bukkit.craftbukkit.CraftServer;
133134
import org.bukkit.craftbukkit.CraftWorld;
135+
import org.bukkit.craftbukkit.block.CraftBlockEntityState;
134136
import org.bukkit.craftbukkit.block.data.CraftBlockData;
135137
import org.bukkit.craftbukkit.entity.CraftEntity;
136138
import org.bukkit.craftbukkit.entity.CraftPlayer;
@@ -633,6 +635,15 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData)
633635
));
634636
}
635637

638+
@Override
639+
public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, LinCompoundTag nbtData) {
640+
((CraftPlayer) player).getHandle().connection.send(new ClientboundBlockEntityDataPacket(
641+
new BlockPos(pos.x(), pos.y(), pos.z()),
642+
((CraftBlockEntityState<?>) tileState).getTileEntity().getType(),
643+
(net.minecraft.nbt.CompoundTag) fromNativeLin(nbtData)
644+
));
645+
}
646+
636647
@Override
637648
public void sendFakeOP(Player player) {
638649
((CraftPlayer) player).getHandle().connection.send(new ClientboundEntityEventPacket(

worldedit-bukkit/adapters/adapter-1_21/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_R1/PaperweightAdapter.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,11 @@
128128
import org.bukkit.Location;
129129
import org.bukkit.World;
130130
import org.bukkit.World.Environment;
131+
import org.bukkit.block.TileState;
131132
import org.bukkit.block.data.BlockData;
132133
import org.bukkit.craftbukkit.CraftServer;
133134
import org.bukkit.craftbukkit.CraftWorld;
135+
import org.bukkit.craftbukkit.block.CraftBlockEntityState;
134136
import org.bukkit.craftbukkit.block.data.CraftBlockData;
135137
import org.bukkit.craftbukkit.entity.CraftEntity;
136138
import org.bukkit.craftbukkit.entity.CraftPlayer;
@@ -613,6 +615,15 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData)
613615
));
614616
}
615617

618+
@Override
619+
public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, LinCompoundTag nbtData) {
620+
((CraftPlayer) player).getHandle().connection.send(new ClientboundBlockEntityDataPacket(
621+
new BlockPos(pos.x(), pos.y(), pos.z()),
622+
((CraftBlockEntityState<?>) tileState).getTileEntity().getType(),
623+
(net.minecraft.nbt.CompoundTag) fromNativeLin(nbtData)
624+
));
625+
}
626+
616627
@Override
617628
public void sendFakeOP(Player player) {
618629
((CraftPlayer) player).getHandle().connection.send(new ClientboundEntityEventPacket(

worldedit-bukkit/adapters/adapter-1_21_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_4/PaperweightAdapter.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,9 +123,11 @@
123123
import org.bukkit.Location;
124124
import org.bukkit.World;
125125
import org.bukkit.World.Environment;
126+
import org.bukkit.block.TileState;
126127
import org.bukkit.block.data.BlockData;
127128
import org.bukkit.craftbukkit.CraftServer;
128129
import org.bukkit.craftbukkit.CraftWorld;
130+
import org.bukkit.craftbukkit.block.CraftBlockEntityState;
129131
import org.bukkit.craftbukkit.block.data.CraftBlockData;
130132
import org.bukkit.craftbukkit.entity.CraftEntity;
131133
import org.bukkit.craftbukkit.entity.CraftPlayer;
@@ -563,6 +565,15 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData)
563565
));
564566
}
565567

568+
@Override
569+
public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, LinCompoundTag nbtData) {
570+
((CraftPlayer) player).getHandle().connection.send(new ClientboundBlockEntityDataPacket(
571+
new BlockPos(pos.x(), pos.y(), pos.z()),
572+
((CraftBlockEntityState<?>) tileState).getTileEntity().getType(),
573+
(net.minecraft.nbt.CompoundTag) fromNativeLin(nbtData)
574+
));
575+
}
576+
566577
@Override
567578
public void sendFakeOP(Player player) {
568579
((CraftPlayer) player).getHandle().connection.send(new ClientboundEntityEventPacket(

worldedit-bukkit/adapters/adapter-1_21_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_5/PaperweightAdapter.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,9 +137,11 @@
137137
import org.bukkit.Location;
138138
import org.bukkit.World;
139139
import org.bukkit.World.Environment;
140+
import org.bukkit.block.TileState;
140141
import org.bukkit.block.data.BlockData;
141142
import org.bukkit.craftbukkit.CraftServer;
142143
import org.bukkit.craftbukkit.CraftWorld;
144+
import org.bukkit.craftbukkit.block.CraftBlockEntityState;
143145
import org.bukkit.craftbukkit.block.data.CraftBlockData;
144146
import org.bukkit.craftbukkit.entity.CraftEntity;
145147
import org.bukkit.craftbukkit.entity.CraftPlayer;
@@ -577,6 +579,15 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData)
577579
));
578580
}
579581

582+
@Override
583+
public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, LinCompoundTag nbtData) {
584+
((CraftPlayer) player).getHandle().connection.send(new ClientboundBlockEntityDataPacket(
585+
new BlockPos(pos.x(), pos.y(), pos.z()),
586+
((CraftBlockEntityState<?>) tileState).getBlockEntity().getType(),
587+
(net.minecraft.nbt.CompoundTag) fromNative(nbtData)
588+
));
589+
}
590+
580591
@Override
581592
public void sendFakeOP(Player player) {
582593
((CraftPlayer) player).getHandle().connection.send(new ClientboundEntityEventPacket(

worldedit-bukkit/adapters/adapter-1_21_6/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_6/PaperweightAdapter.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,9 +144,11 @@
144144
import org.bukkit.Location;
145145
import org.bukkit.World;
146146
import org.bukkit.World.Environment;
147+
import org.bukkit.block.TileState;
147148
import org.bukkit.block.data.BlockData;
148149
import org.bukkit.craftbukkit.CraftServer;
149150
import org.bukkit.craftbukkit.CraftWorld;
151+
import org.bukkit.craftbukkit.block.CraftBlockEntityState;
150152
import org.bukkit.craftbukkit.block.data.CraftBlockData;
151153
import org.bukkit.craftbukkit.entity.CraftEntity;
152154
import org.bukkit.craftbukkit.entity.CraftPlayer;
@@ -598,6 +600,15 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData)
598600
));
599601
}
600602

603+
@Override
604+
public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, LinCompoundTag nbtData) {
605+
((CraftPlayer) player).getHandle().connection.send(new ClientboundBlockEntityDataPacket(
606+
new BlockPos(pos.x(), pos.y(), pos.z()),
607+
((CraftBlockEntityState<?>) tileState).getBlockEntity().getType(),
608+
(net.minecraft.nbt.CompoundTag) fromNative(nbtData)
609+
));
610+
}
611+
601612
@Override
602613
public void sendFakeOP(Player player) {
603614
((CraftPlayer) player).getHandle().connection.send(new ClientboundEntityEventPacket(

worldedit-bukkit/adapters/adapter-1_21_9/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_9/PaperweightAdapter.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,9 +143,11 @@
143143
import org.bukkit.Location;
144144
import org.bukkit.World;
145145
import org.bukkit.World.Environment;
146+
import org.bukkit.block.TileState;
146147
import org.bukkit.block.data.BlockData;
147148
import org.bukkit.craftbukkit.CraftServer;
148149
import org.bukkit.craftbukkit.CraftWorld;
150+
import org.bukkit.craftbukkit.block.CraftBlockEntityState;
149151
import org.bukkit.craftbukkit.block.data.CraftBlockData;
150152
import org.bukkit.craftbukkit.entity.CraftEntity;
151153
import org.bukkit.craftbukkit.entity.CraftPlayer;
@@ -606,6 +608,15 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData)
606608
));
607609
}
608610

611+
@Override
612+
public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, LinCompoundTag nbtData) {
613+
((CraftPlayer) player).getHandle().connection.send(new ClientboundBlockEntityDataPacket(
614+
new BlockPos(pos.x(), pos.y(), pos.z()),
615+
((CraftBlockEntityState<?>) tileState).getBlockEntity().getType(),
616+
(net.minecraft.nbt.CompoundTag) fromNative(nbtData)
617+
));
618+
}
619+
609620
@Override
610621
public void sendFakeOP(Player player) {
611622
((CraftPlayer) player).getHandle().connection.send(new ClientboundEntityEventPacket(

worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/IDelegateBukkitImplAdapter.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.bukkit.World;
2727
import org.bukkit.WorldCreator;
2828
import org.bukkit.block.Biome;
29+
import org.bukkit.block.TileState;
2930
import org.bukkit.block.data.BlockData;
3031
import org.bukkit.entity.Entity;
3132
import org.bukkit.entity.EntityType;
@@ -86,6 +87,11 @@ default void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData
8687
getParent().sendFakeNBT(player, pos, nbtData);
8788
}
8889

90+
@Override
91+
default void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, LinCompoundTag nbtData) {
92+
getParent().sendFakeNBT(player, pos, tileState, nbtData);
93+
}
94+
8995
@Override
9096
default void sendFakeOP(Player player) {
9197
getParent().sendFakeOP(player);

0 commit comments

Comments
 (0)