Skip to content

Commit 58f6b79

Browse files
committed
feat: fully implement Player#sendFakeBlock
1 parent 63f4fa4 commit 58f6b79

11 files changed

Lines changed: 238 additions & 12 deletions

File tree

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

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@
7676
import net.minecraft.core.Registry;
7777
import net.minecraft.core.SectionPos;
7878
import net.minecraft.core.registries.Registries;
79+
import net.minecraft.nbt.CompoundTag;
80+
import net.minecraft.network.protocol.Packet;
7981
import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket;
8082
import net.minecraft.network.protocol.game.ClientboundEntityEventPacket;
8183
import net.minecraft.resources.ResourceKey;
@@ -104,6 +106,7 @@
104106
import net.minecraft.world.level.block.Block;
105107
import net.minecraft.world.level.block.Blocks;
106108
import net.minecraft.world.level.block.entity.BlockEntity;
109+
import net.minecraft.world.level.block.entity.BlockEntityType;
107110
import net.minecraft.world.level.block.entity.StructureBlockEntity;
108111
import net.minecraft.world.level.block.state.StateDefinition;
109112
import net.minecraft.world.level.block.state.properties.DirectionProperty;
@@ -124,9 +127,11 @@
124127
import org.bukkit.Location;
125128
import org.bukkit.World;
126129
import org.bukkit.World.Environment;
130+
import org.bukkit.block.TileState;
127131
import org.bukkit.block.data.BlockData;
128132
import org.bukkit.craftbukkit.v1_20_R2.CraftServer;
129133
import org.bukkit.craftbukkit.v1_20_R2.CraftWorld;
134+
import org.bukkit.craftbukkit.v1_20_R2.block.CraftBlockEntityState;
130135
import org.bukkit.craftbukkit.v1_20_R2.block.data.CraftBlockData;
131136
import org.bukkit.craftbukkit.v1_20_R2.entity.CraftEntity;
132137
import org.bukkit.craftbukkit.v1_20_R2.entity.CraftPlayer;
@@ -156,6 +161,7 @@
156161

157162
import javax.annotation.Nullable;
158163
import java.lang.ref.WeakReference;
164+
import java.lang.reflect.Constructor;
159165
import java.lang.reflect.Field;
160166
import java.lang.reflect.InvocationTargetException;
161167
import java.lang.reflect.Method;
@@ -188,6 +194,7 @@ public final class PaperweightAdapter implements BukkitImplAdapter<net.minecraft
188194
private final Field serverWorldsField;
189195
private final Method getChunkFutureMethod;
190196
private final Field chunkProviderExecutorField;
197+
private final Constructor<?> blockEntityDataPacketConstructor;
191198
private final Watchdog watchdog;
192199

193200
private static final RandomSource random = RandomSource.create();
@@ -219,6 +226,11 @@ public PaperweightAdapter() throws NoSuchFieldException, NoSuchMethodException {
219226
);
220227
chunkProviderExecutorField.setAccessible(true);
221228

229+
blockEntityDataPacketConstructor = ClientboundBlockEntityDataPacket.class.getDeclaredConstructor(
230+
BlockPos.class, BlockEntityType.class, net.minecraft.nbt.CompoundTag.class
231+
);
232+
blockEntityDataPacketConstructor.setAccessible(true);
233+
222234
new PaperweightDataConverters(CraftMagicNumbers.INSTANCE.getDataVersion(), this).buildUnoptimized();
223235

224236
Watchdog watchdog;
@@ -624,6 +636,30 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData)
624636
));
625637
}
626638

639+
@Override
640+
public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, @Nullable LinCompoundTag nbtData) {
641+
try {
642+
CraftBlockEntityState<?> craftState = (CraftBlockEntityState<?>) tileState;
643+
644+
CompoundTag vanillaNBT;
645+
if (nbtData == null) {
646+
vanillaNBT = craftState.getSnapshotNBT();
647+
} else {
648+
vanillaNBT = (net.minecraft.nbt.CompoundTag) fromNativeLin(nbtData);
649+
}
650+
651+
((CraftPlayer) player).getHandle().connection.send((Packet<?>)
652+
blockEntityDataPacketConstructor.newInstance(
653+
new BlockPos(pos.x(), pos.y(), pos.z()),
654+
craftState.getTileEntity().getType(),
655+
vanillaNBT
656+
)
657+
);
658+
} catch (ReflectiveOperationException e) {
659+
logger.log(Level.WARNING, "Failed to construct ClientboundBlockEntityDataPacket", e);
660+
}
661+
}
662+
627663
@Override
628664
public void sendFakeOP(Player player) {
629665
((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: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@
7676
import net.minecraft.core.Registry;
7777
import net.minecraft.core.SectionPos;
7878
import net.minecraft.core.registries.Registries;
79+
import net.minecraft.nbt.CompoundTag;
80+
import net.minecraft.network.protocol.Packet;
7981
import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket;
8082
import net.minecraft.network.protocol.game.ClientboundEntityEventPacket;
8183
import net.minecraft.resources.ResourceKey;
@@ -104,6 +106,7 @@
104106
import net.minecraft.world.level.block.Block;
105107
import net.minecraft.world.level.block.Blocks;
106108
import net.minecraft.world.level.block.entity.BlockEntity;
109+
import net.minecraft.world.level.block.entity.BlockEntityType;
107110
import net.minecraft.world.level.block.entity.StructureBlockEntity;
108111
import net.minecraft.world.level.block.state.StateDefinition;
109112
import net.minecraft.world.level.block.state.properties.DirectionProperty;
@@ -124,9 +127,11 @@
124127
import org.bukkit.Location;
125128
import org.bukkit.World;
126129
import org.bukkit.World.Environment;
130+
import org.bukkit.block.TileState;
127131
import org.bukkit.block.data.BlockData;
128132
import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
129133
import org.bukkit.craftbukkit.v1_20_R3.CraftWorld;
134+
import org.bukkit.craftbukkit.v1_20_R3.block.CraftBlockEntityState;
130135
import org.bukkit.craftbukkit.v1_20_R3.block.data.CraftBlockData;
131136
import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
132137
import org.bukkit.craftbukkit.v1_20_R3.entity.CraftPlayer;
@@ -156,6 +161,7 @@
156161

157162
import javax.annotation.Nullable;
158163
import java.lang.ref.WeakReference;
164+
import java.lang.reflect.Constructor;
159165
import java.lang.reflect.Field;
160166
import java.lang.reflect.InvocationTargetException;
161167
import java.lang.reflect.Method;
@@ -188,6 +194,7 @@ public final class PaperweightAdapter implements BukkitImplAdapter<net.minecraft
188194
private final Field serverWorldsField;
189195
private final Method getChunkFutureMethod;
190196
private final Field chunkProviderExecutorField;
197+
private final Constructor<?> blockEntityDataPacketConstructor;
191198
private final Watchdog watchdog;
192199

193200
private static final RandomSource random = RandomSource.create();
@@ -219,6 +226,11 @@ public PaperweightAdapter() throws NoSuchFieldException, NoSuchMethodException {
219226
);
220227
chunkProviderExecutorField.setAccessible(true);
221228

229+
blockEntityDataPacketConstructor = ClientboundBlockEntityDataPacket.class.getDeclaredConstructor(
230+
BlockPos.class, BlockEntityType.class, net.minecraft.nbt.CompoundTag.class
231+
);
232+
blockEntityDataPacketConstructor.setAccessible(true);
233+
222234
new PaperweightDataConverters(CraftMagicNumbers.INSTANCE.getDataVersion(), this).buildUnoptimized();
223235

224236
Watchdog watchdog;
@@ -623,6 +635,30 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData)
623635
));
624636
}
625637

638+
@Override
639+
public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, @Nullable LinCompoundTag nbtData) {
640+
try {
641+
CraftBlockEntityState<?> craftState = (CraftBlockEntityState<?>) tileState;
642+
643+
CompoundTag vanillaNBT;
644+
if (nbtData == null) {
645+
vanillaNBT = craftState.getSnapshotNBT();
646+
} else {
647+
vanillaNBT = (net.minecraft.nbt.CompoundTag) fromNativeLin(nbtData);
648+
}
649+
650+
((CraftPlayer) player).getHandle().connection.send((Packet<?>)
651+
blockEntityDataPacketConstructor.newInstance(
652+
new BlockPos(pos.x(), pos.y(), pos.z()),
653+
craftState.getTileEntity().getType(),
654+
vanillaNBT
655+
)
656+
);
657+
} catch (ReflectiveOperationException e) {
658+
logger.log(Level.WARNING, "Failed to construct ClientboundBlockEntityDataPacket", e);
659+
}
660+
}
661+
626662
@Override
627663
public void sendFakeOP(Player player) {
628664
((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: 20 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,24 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData)
633635
));
634636
}
635637

638+
@Override
639+
public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, @Nullable LinCompoundTag nbtData) {
640+
CraftBlockEntityState<?> craftState = (CraftBlockEntityState<?>) tileState;
641+
642+
CompoundTag vanillaNBT;
643+
if (nbtData == null) {
644+
vanillaNBT = craftState.getSnapshotNBT();
645+
} else {
646+
vanillaNBT = (net.minecraft.nbt.CompoundTag) fromNativeLin(nbtData);
647+
}
648+
649+
((CraftPlayer) player).getHandle().connection.send(new ClientboundBlockEntityDataPacket(
650+
new BlockPos(pos.x(), pos.y(), pos.z()),
651+
craftState.getTileEntity().getType(),
652+
vanillaNBT
653+
));
654+
}
655+
636656
@Override
637657
public void sendFakeOP(Player player) {
638658
((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: 20 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,24 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData)
613615
));
614616
}
615617

618+
@Override
619+
public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, @Nullable LinCompoundTag nbtData) {
620+
CraftBlockEntityState<?> craftState = (CraftBlockEntityState<?>) tileState;
621+
622+
CompoundTag vanillaNBT;
623+
if (nbtData == null) {
624+
vanillaNBT = craftState.getSnapshotNBT();
625+
} else {
626+
vanillaNBT = (net.minecraft.nbt.CompoundTag) fromNativeLin(nbtData);
627+
}
628+
629+
((CraftPlayer) player).getHandle().connection.send(new ClientboundBlockEntityDataPacket(
630+
new BlockPos(pos.x(), pos.y(), pos.z()),
631+
craftState.getTileEntity().getType(),
632+
vanillaNBT
633+
));
634+
}
635+
616636
@Override
617637
public void sendFakeOP(Player player) {
618638
((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: 20 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,24 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData)
563565
));
564566
}
565567

568+
@Override
569+
public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, @Nullable LinCompoundTag nbtData) {
570+
CraftBlockEntityState<?> craftState = (CraftBlockEntityState<?>) tileState;
571+
572+
CompoundTag vanillaNBT;
573+
if (nbtData == null) {
574+
vanillaNBT = craftState.getSnapshotNBT();
575+
} else {
576+
vanillaNBT = (net.minecraft.nbt.CompoundTag) fromNativeLin(nbtData);
577+
}
578+
579+
((CraftPlayer) player).getHandle().connection.send(new ClientboundBlockEntityDataPacket(
580+
new BlockPos(pos.x(), pos.y(), pos.z()),
581+
craftState.getTileEntity().getType(),
582+
vanillaNBT
583+
));
584+
}
585+
566586
@Override
567587
public void sendFakeOP(Player player) {
568588
((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: 19 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,23 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData)
577579
));
578580
}
579581

582+
@Override
583+
public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, @Nullable LinCompoundTag nbtData) {
584+
CraftBlockEntityState<?> craftState = (CraftBlockEntityState<?>) tileState;
585+
586+
CompoundTag vanillaNBT;
587+
if (nbtData == null) {
588+
vanillaNBT = craftState.getSnapshotNBT();
589+
} else {
590+
vanillaNBT = (net.minecraft.nbt.CompoundTag) fromNative(nbtData);
591+
}
592+
593+
((CraftPlayer) player).getHandle().connection.send(new ClientboundBlockEntityDataPacket(
594+
new BlockPos(pos.x(), pos.y(), pos.z()),
595+
craftState.getBlockEntity().getType(),
596+
vanillaNBT
597+
));
598+
}
580599
@Override
581600
public void sendFakeOP(Player player) {
582601
((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: 20 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,24 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData)
598600
));
599601
}
600602

603+
@Override
604+
public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, @Nullable LinCompoundTag nbtData) {
605+
CraftBlockEntityState<?> craftState = (CraftBlockEntityState<?>) tileState;
606+
607+
CompoundTag vanillaNBT;
608+
if (nbtData == null) {
609+
vanillaNBT = craftState.getSnapshotNBT();
610+
} else {
611+
vanillaNBT = (net.minecraft.nbt.CompoundTag) fromNative(nbtData);
612+
}
613+
614+
((CraftPlayer) player).getHandle().connection.send(new ClientboundBlockEntityDataPacket(
615+
new BlockPos(pos.x(), pos.y(), pos.z()),
616+
craftState.getBlockEntity().getType(),
617+
vanillaNBT
618+
));
619+
}
620+
601621
@Override
602622
public void sendFakeOP(Player player) {
603623
((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: 20 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;
@@ -596,6 +598,24 @@ public void sendFakeNBT(Player player, BlockVector3 pos, LinCompoundTag nbtData)
596598
));
597599
}
598600

601+
@Override
602+
public void sendFakeNBT(Player player, BlockVector3 pos, TileState tileState, @Nullable LinCompoundTag nbtData) {
603+
CraftBlockEntityState<?> craftState = (CraftBlockEntityState<?>) tileState;
604+
605+
CompoundTag vanillaNBT;
606+
if (nbtData == null) {
607+
vanillaNBT = craftState.getSnapshotNBT();
608+
} else {
609+
vanillaNBT = (net.minecraft.nbt.CompoundTag) fromNative(nbtData);
610+
}
611+
612+
((CraftPlayer) player).getHandle().connection.send(new ClientboundBlockEntityDataPacket(
613+
new BlockPos(pos.x(), pos.y(), pos.z()),
614+
craftState.getBlockEntity().getType(),
615+
vanillaNBT
616+
));
617+
}
618+
599619
@Override
600620
public void sendFakeOP(Player player) {
601621
((CraftPlayer) player).getHandle().connection.send(new ClientboundEntityEventPacket(

0 commit comments

Comments
 (0)