9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2026-01-06 15:52:03 +00:00

添加展示架物品映射

This commit is contained in:
XiaoMoMi
2025-10-23 05:23:40 +08:00
parent 0298bdb8b2
commit fbf9744afb
13 changed files with 193 additions and 152 deletions

View File

@@ -85,7 +85,7 @@ public class SimpleStorageBlockEntity extends BlockEntity {
}
if (VersionHelper.isOrAbove1_20_5()) {
CoreReflections.instance$ItemStack$CODEC.parse(MRegistryOps.SPARROW_NBT, itemTag)
.resultOrPartial((s) -> CraftEngine.instance().logger().severe("Tried to load invalid item: '" + itemTag + "'. " + s))
.resultOrPartial((error) -> CraftEngine.instance().logger().severe("Tried to load invalid item: '" + itemTag + "'. " + error))
.ifPresent(nmsStack -> storageContents[slot] = FastNMS.INSTANCE.method$CraftItemStack$asCraftMirror(nmsStack));
} else {
Object nmsTag = MRegistryOps.SPARROW_NBT.convertTo(MRegistryOps.NBT, itemTag);

View File

@@ -148,7 +148,7 @@ public class BukkitItemManager extends AbstractItemManager<ItemStack> {
jsonObject.addProperty("count", result.count());
jsonObject.add("components", result.components());
Object nmsStack = CoreReflections.instance$ItemStack$CODEC.parse(MRegistryOps.JSON, jsonObject)
.resultOrPartial((itemId) -> plugin.logger().severe("Tried to load invalid item: '" + itemId + "'")).orElse(null);
.resultOrPartial((error) -> plugin.logger().severe("Tried to load invalid item: '" + error + "'")).orElse(null);
if (nmsStack == null) {
return this.emptyItem;
}

View File

@@ -94,6 +94,7 @@ import net.momirealms.craftengine.core.world.chunk.packet.BlockEntityData;
import net.momirealms.craftengine.core.world.chunk.packet.MCSection;
import net.momirealms.craftengine.core.world.collision.AABB;
import net.momirealms.sparrow.nbt.CompoundTag;
import net.momirealms.sparrow.nbt.ListTag;
import net.momirealms.sparrow.nbt.Tag;
import net.momirealms.sparrow.nbt.adventure.NBTDataComponentValue;
import org.bukkit.*;
@@ -365,6 +366,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
registerC2SGamePacketListener(new CustomPayloadListener1_20(), VersionHelper.isOrAbove1_20_2() ? -1 : this.packetIds.serverboundCustomPayloadPacket(), "ServerboundCustomPayloadPacket");
registerS2CGamePacketListener(VersionHelper.isOrAbove1_20_5() ? new MerchantOffersListener1_20_5() : new MerchantOffersListener1_20(), this.packetIds.clientBoundMerchantOffersPacket(), "ClientboundMerchantOffersPacket");
registerS2CGamePacketListener(new AddEntityListener(RegistryUtils.currentEntityTypeRegistrySize()), this.packetIds.clientboundAddEntityPacket(), "ClientboundAddEntityPacket");
registerS2CGamePacketListener(new BlockEntityDataListener(), this.packetIds.clientboundBlockEntityDataPacket(), "ClientboundBlockEntityDataPacket");
registerS2CGamePacketListener(
VersionHelper.isOrAbove1_20_3() ?
new OpenScreenListener1_20_3() :
@@ -4102,4 +4104,61 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
);
}
}
public static class BlockEntityDataListener implements ByteBufferPacketListener {
@Override
public void onPacketSend(NetWorkUser user, ByteBufPacketEvent event) {
if (!Config.interceptItem()) return;
FriendlyByteBuf buf = event.getBuffer();
boolean changed = false;
BlockPos pos = buf.readBlockPos();
int entityType = buf.readVarInt();
boolean named = !VersionHelper.isOrAbove1_20_2();
CompoundTag tag = (CompoundTag) buf.readNbt(named);
// todo 刷怪笼里的物品?
// 展示架
if (VersionHelper.isOrAbove1_21_9() && tag != null && tag.containsKey("Items")) {
BukkitItemManager itemManager = BukkitItemManager.instance();
ListTag itemsTag = tag.getList("Items");
List<Pair<Byte, ItemStack>> items = new ArrayList<>();
for (Tag itemTag : itemsTag) {
if (itemTag instanceof CompoundTag itemCompoundTag) {
byte slot = itemCompoundTag.getByte("Slot");
Object nmsStack = CoreReflections.instance$ItemStack$CODEC.parse(MRegistryOps.SPARROW_NBT, itemCompoundTag)
.resultOrPartial((error) -> CraftEngine.instance().logger().severe("Tried to parse invalid item: '" + error + "'")).orElse(null);
ItemStack bukkitStack = FastNMS.INSTANCE.method$CraftItemStack$asCraftMirror(nmsStack);
Optional<ItemStack> optional = itemManager.s2c(bukkitStack, (BukkitServerPlayer) user);
if (optional.isPresent()) {
changed = true;
items.add(new Pair<>(slot, optional.get()));
} else {
items.add(Pair.of(slot, bukkitStack));
}
}
}
if (changed) {
ListTag newItemsTag = new ListTag();
for (Pair<Byte, ItemStack> pair : items) {
CompoundTag newItemCompoundTag = (CompoundTag) CoreReflections.instance$ItemStack$CODEC.encodeStart(MRegistryOps.SPARROW_NBT, FastNMS.INSTANCE.field$CraftItemStack$handle(pair.right()))
.resultOrPartial((error) -> CraftEngine.instance().logger().severe("Tried to encode invalid item: '" + error + "'")).orElse(null);
if (newItemCompoundTag != null) {
newItemCompoundTag.putByte("Slot", pair.left());
newItemsTag.add(newItemCompoundTag);
}
}
tag.put("Items", newItemsTag);
}
}
if (changed) {
event.setChanged(true);
buf.clear();
buf.writeVarInt(event.packetID());
buf.writeBlockPos(pos);
buf.writeVarInt(entityType);
buf.writeNbt(tag, named);
}
}
}
}

View File

@@ -62,6 +62,8 @@ public interface PacketIds {
int clientBoundMerchantOffersPacket();
int clientboundBlockEntityDataPacket();
int serverboundContainerClickPacket();
int serverboundSetCreativeModeSlotPacket();

View File

@@ -166,6 +166,11 @@ public class PacketIds1_20 implements PacketIds {
return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundMerchantOffersPacket, PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundBlockEntityDataPacket() {
return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundBlockEntityDataPacket, PacketFlow.CLIENTBOUND);
}
@Override
public int serverboundContainerClickPacket() {
return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ServerboundContainerClickPacket, PacketFlow.SERVERBOUND);

View File

@@ -165,6 +165,11 @@ public class PacketIds1_20_5 implements PacketIds {
return PlayPacketIdHelper.byName("minecraft:merchant_offers", PacketFlow.CLIENTBOUND);
}
@Override
public int clientboundBlockEntityDataPacket() {
return PlayPacketIdHelper.byName("minecraft:block_entity_data", PacketFlow.CLIENTBOUND);
}
@Override
public int serverboundContainerClickPacket() {
return PlayPacketIdHelper.byName("minecraft:container_click", PacketFlow.SERVERBOUND);

View File

@@ -4491,4 +4491,9 @@ public final class CoreReflections {
"world.item.trading.IMerchant",
"world.item.trading.Merchant"
));
public static final Class <?> clazz$BlockEntityType = requireNonNull(BukkitReflectionUtils.findReobfOrMojmapClass(
"world.level.block.entity.TileEntityTypes",
"world.level.block.entity.BlockEntityType"
));
}

View File

@@ -0,0 +1,28 @@
package net.momirealms.craftengine.bukkit.plugin.reflection.minecraft;
import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.core.util.MiscUtils;
import net.momirealms.craftengine.core.util.VersionHelper;
public final class MBlockEntityTypes {
private MBlockEntityTypes() {}
// 1.21.9+
public static final Object SHELF ;
public static final int SHELF$registryId;
private static Object getById(String id) {
Object rl = FastNMS.INSTANCE.method$ResourceLocation$fromNamespaceAndPath("minecraft", id);
return FastNMS.INSTANCE.method$Registry$getValue(MBuiltInRegistries.BLOCK_ENTITY_TYPE, rl);
}
private static int getRegistryId(Object type) {
if (type == null) return -1;
return FastNMS.INSTANCE.method$Registry$getId(MBuiltInRegistries.BLOCK_ENTITY_TYPE, type);
}
static {
SHELF = MiscUtils.requireNonNullIf(getById("shelf"), VersionHelper.isOrAbove1_21_9());
SHELF$registryId = getRegistryId("shelf"); // fixme 有问题,怎么是-1
}
}

View File

@@ -18,6 +18,7 @@ public final class MBuiltInRegistries {
public static final Object MOB_EFFECT;
public static final Object SOUND_EVENT;
public static final Object ENTITY_TYPE;
public static final Object BLOCK_ENTITY_TYPE;
public static final Object FLUID;
public static final Object RECIPE_TYPE;
public static final Object PARTICLE_TYPE;
@@ -35,6 +36,7 @@ public final class MBuiltInRegistries {
Object registries$SoundEvent = null;
Object registries$ParticleType = null;
Object registries$EntityType = null;
Object registries$BlockEntityType = null;
Object registries$Item = null;
Object registries$Fluid = null;
Object registries$RecipeType = null;
@@ -42,6 +44,7 @@ public final class MBuiltInRegistries {
Object registries$DataComponentPredicateType = null;
Object registries$LootPoolEntryType = null;
Object registries$GameEvent = null;
for (Field field : fields) {
Type fieldType = field.getGenericType();
if (fieldType instanceof ParameterizedType paramType) {
@@ -54,6 +57,8 @@ public final class MBuiltInRegistries {
registries$EntityType = field.get(null);
} else if (rawType == CoreReflections.clazz$RecipeType) {
registries$RecipeType = field.get(null);
} else if (rawType == CoreReflections.clazz$BlockEntityType) {
registries$BlockEntityType = field.get(null);
} else if (VersionHelper.isOrAbove1_20_5() && rawType == CoreReflections.clazz$DataComponentType && registries$DataComponentType == null) {
registries$DataComponentType = field.get(null);
} else if (VersionHelper.isOrAbove1_21_5() && rawType == CoreReflections.clazz$DataComponentPredicate$Type) {
@@ -87,6 +92,7 @@ public final class MBuiltInRegistries {
SOUND_EVENT = requireNonNull(registries$SoundEvent);
PARTICLE_TYPE = requireNonNull(registries$ParticleType);
ENTITY_TYPE = requireNonNull(registries$EntityType);
BLOCK_ENTITY_TYPE = requireNonNull(registries$BlockEntityType);
FLUID = requireNonNull(registries$Fluid);
RECIPE_TYPE = requireNonNull(registries$RecipeType);
LOOT_POOL_ENTRY_TYPE = requireNonNull(registries$LootPoolEntryType);

View File

@@ -1,81 +1,80 @@
package net.momirealms.craftengine.bukkit.plugin.reflection.minecraft;
import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.core.util.VersionHelper;
public final class MEntityTypes {
private MEntityTypes() {}
public static final Object TEXT_DISPLAY;
public static final int TEXT_DISPLAY$registryId;
public static final Object ITEM_DISPLAY;
public static final int ITEM_DISPLAY$registryId;
public static final Object BLOCK_DISPLAY;
public static final int BLOCK_DISPLAY$registryId;
public static final Object ARMOR_STAND;
public static final int ARMOR_STAND$registryId;
public static final Object FALLING_BLOCK;
public static final int FALLING_BLOCK$registryId;
public static final Object INTERACTION;
public static final int INTERACTION$registryId;
public static final Object SHULKER;
public static final int SHULKER$registryId;
public static final Object OAK_BOAT;
public static final int OAK_BOAT$registryId;
public static final Object TRIDENT;
public static final int TRIDENT$registryId;
public static final Object ARROW;
public static final int ARROW$registryId;
public static final Object SPECTRAL_ARROW;
public static final int SPECTRAL_ARROW$registryId;
public static final Object SNOWBALL;
public static final int SNOWBALL$registryId;
public static final Object FIREBALL;
public static final int FIREBALL$registryId;
public static final Object EYE_OF_ENDER;
public static final int EYE_OF_ENDER$registryId;
public static final Object FIREWORK_ROCKET;
public static final int FIREWORK_ROCKET$registryId;
public static final Object ITEM;
public static final int ITEM$registryId;
public static final Object ITEM_FRAME;
public static final int ITEM_FRAME$registryId;
public static final Object GLOW_ITEM_FRAME;
public static final int GLOW_ITEM_FRAME$registryId;
public static final Object OMINOUS_ITEM_SPAWNER;
public static final int OMINOUS_ITEM_SPAWNER$registryId;
public static final Object SMALL_FIREBALL;
public static final int SMALL_FIREBALL$registryId;
public static final Object EGG;
public static final int EGG$registryId;
public static final Object ENDER_PEARL;
public static final int ENDER_PEARL$registryId;
public static final Object EXPERIENCE_BOTTLE;
public static final int EXPERIENCE_BOTTLE$registryId;
public static final Object POTION;
public static final int POTION$registryId;
public static final Object HAPPY_GHAST;
public static final int HAPPY_GHAST$registryId;
public static final Object PLAYER;
public static final int PLAYER$registryId;
public static final Object ENDERMAN;
public static final int ENDERMAN$registryId;
public static final Object TNT;
public static final int TNT$registryId;
public static final Object CHEST_MINECART;
public static final int CHEST_MINECART$registryId;
public static final Object COMMAND_BLOCK_MINECART;
public static final int COMMAND_BLOCK_MINECART$registryId;
public static final Object FURNACE_MINECART;
public static final int FURNACE_MINECART$registryId;
public static final Object HOPPER_MINECART;
public static final int HOPPER_MINECART$registryId;
public static final Object MINECART;
public static final int MINECART$registryId;
public static final Object SPAWNER_MINECART;
public static final int SPAWNER_MINECART$registryId;
public static final Object TNT_MINECART;
public static final int TNT_MINECART$registryId;
public static final Object TEXT_DISPLAY = getById("text_display");
public static final int TEXT_DISPLAY$registryId = getRegistryId(TEXT_DISPLAY);
public static final Object ITEM_DISPLAY = getById("item_display");
public static final int ITEM_DISPLAY$registryId = getRegistryId(ITEM_DISPLAY);
public static final Object BLOCK_DISPLAY = getById("block_display");
public static final int BLOCK_DISPLAY$registryId = getRegistryId(BLOCK_DISPLAY);
public static final Object ARMOR_STAND = getById("armor_stand");
public static final int ARMOR_STAND$registryId = getRegistryId(ARMOR_STAND);
public static final Object FALLING_BLOCK = getById("falling_block");
public static final int FALLING_BLOCK$registryId = getRegistryId(FALLING_BLOCK);
public static final Object INTERACTION = getById("interaction");
public static final int INTERACTION$registryId = getRegistryId(INTERACTION);
public static final Object SHULKER = getById("shulker");
public static final int SHULKER$registryId = getRegistryId(SHULKER);
public static final Object OAK_BOAT = getById("oak_boat");
public static final int OAK_BOAT$registryId = getRegistryId(OAK_BOAT);
public static final Object TRIDENT = getById("trident");
public static final int TRIDENT$registryId = getRegistryId(TRIDENT);
public static final Object ARROW = getById("arrow");
public static final int ARROW$registryId = getRegistryId(ARROW);
public static final Object SPECTRAL_ARROW = getById("spectral_arrow");
public static final int SPECTRAL_ARROW$registryId = getRegistryId(SPECTRAL_ARROW);
public static final Object SNOWBALL = getById("snowball");
public static final int SNOWBALL$registryId = getRegistryId(SNOWBALL);
public static final Object FIREBALL = getById("fireball");
public static final int FIREBALL$registryId = getRegistryId(FIREBALL);
public static final Object EYE_OF_ENDER = getById("eye_of_ender");
public static final int EYE_OF_ENDER$registryId = getRegistryId(EYE_OF_ENDER);
public static final Object FIREWORK_ROCKET = getById("firework_rocket");
public static final int FIREWORK_ROCKET$registryId = getRegistryId(FIREWORK_ROCKET);
public static final Object ITEM = getById("item");
public static final int ITEM$registryId = getRegistryId(ITEM);
public static final Object ITEM_FRAME = getById("item_frame");
public static final int ITEM_FRAME$registryId = getRegistryId(ITEM_FRAME);
public static final Object GLOW_ITEM_FRAME = getById("glow_item_frame");
public static final int GLOW_ITEM_FRAME$registryId = getRegistryId(GLOW_ITEM_FRAME);
public static final Object OMINOUS_ITEM_SPAWNER = getById("ominous_item_spawner");
public static final int OMINOUS_ITEM_SPAWNER$registryId = getRegistryId(OMINOUS_ITEM_SPAWNER);
public static final Object SMALL_FIREBALL = getById("small_fireball");
public static final int SMALL_FIREBALL$registryId = getRegistryId(SMALL_FIREBALL);
public static final Object EGG = getById("egg");
public static final int EGG$registryId = getRegistryId(EGG);
public static final Object ENDER_PEARL = getById("ender_pearl");
public static final int ENDER_PEARL$registryId = getRegistryId(ENDER_PEARL);
public static final Object EXPERIENCE_BOTTLE = getById("experience_bottle");
public static final int EXPERIENCE_BOTTLE$registryId = getRegistryId(EXPERIENCE_BOTTLE);
public static final Object POTION = getById("potion");
public static final int POTION$registryId = getRegistryId(POTION);
public static final Object HAPPY_GHAST = getById("happy_ghast");
public static final int HAPPY_GHAST$registryId = getRegistryId(HAPPY_GHAST);
public static final Object PLAYER = getById("player");
public static final int PLAYER$registryId = getRegistryId(PLAYER);
public static final Object ENDERMAN = getById("enderman");
public static final int ENDERMAN$registryId = getRegistryId(ENDERMAN);
public static final Object TNT = getById("tnt");
public static final int TNT$registryId = getRegistryId(TNT);
public static final Object CHEST_MINECART = getById("chest_minecart");
public static final int CHEST_MINECART$registryId = getRegistryId(CHEST_MINECART);
public static final Object COMMAND_BLOCK_MINECART = getById("command_block_minecart");
public static final int COMMAND_BLOCK_MINECART$registryId = getRegistryId(COMMAND_BLOCK_MINECART);
public static final Object FURNACE_MINECART = getById("furnace_minecart");
public static final int FURNACE_MINECART$registryId = getRegistryId(FURNACE_MINECART);
public static final Object HOPPER_MINECART = getById("hopper_minecart");
public static final int HOPPER_MINECART$registryId = getRegistryId(HOPPER_MINECART);
public static final Object MINECART = getById("minecart");
public static final int MINECART$registryId = getRegistryId(MINECART);
public static final Object SPAWNER_MINECART = getById("spawner_minecart");
public static final int SPAWNER_MINECART$registryId = getRegistryId(SPAWNER_MINECART);
public static final Object TNT_MINECART = getById("tnt_minecart");
public static final int TNT_MINECART$registryId = getRegistryId(TNT_MINECART);
private static Object getById(String id) {
Object rl = FastNMS.INSTANCE.method$ResourceLocation$fromNamespaceAndPath("minecraft", id);
@@ -86,77 +85,4 @@ public final class MEntityTypes {
if (type == null) return -1;
return FastNMS.INSTANCE.method$Registry$getId(MBuiltInRegistries.ENTITY_TYPE, type);
}
static {
TEXT_DISPLAY = getById("text_display");
TEXT_DISPLAY$registryId = getRegistryId(TEXT_DISPLAY);
ITEM_DISPLAY = getById("item_display");
ITEM_DISPLAY$registryId = getRegistryId(ITEM_DISPLAY);
BLOCK_DISPLAY = getById("block_display");
BLOCK_DISPLAY$registryId = getRegistryId(BLOCK_DISPLAY);
FALLING_BLOCK = getById("falling_block");
FALLING_BLOCK$registryId = getRegistryId(FALLING_BLOCK);
INTERACTION = getById("interaction");
INTERACTION$registryId = getRegistryId(INTERACTION);
SHULKER = getById("shulker");
SHULKER$registryId = getRegistryId(SHULKER);
ARMOR_STAND = getById("armor_stand");
ARMOR_STAND$registryId = getRegistryId(ARMOR_STAND);
OAK_BOAT = getById(VersionHelper.isOrAbove1_21_2() ? "oak_boat" : "boat");
OAK_BOAT$registryId = getRegistryId(OAK_BOAT);
TRIDENT = getById("trident");
TRIDENT$registryId = getRegistryId(TRIDENT);
SNOWBALL = getById("snowball");
SNOWBALL$registryId = getRegistryId(SNOWBALL);
FIREBALL = getById("fireball");
FIREBALL$registryId = getRegistryId(FIREBALL);
EYE_OF_ENDER = getById("eye_of_ender");
EYE_OF_ENDER$registryId = getRegistryId(EYE_OF_ENDER);
FIREWORK_ROCKET = getById("firework_rocket");
FIREWORK_ROCKET$registryId = getRegistryId(FIREWORK_ROCKET);
ITEM = getById("item");
ITEM$registryId = getRegistryId(ITEM);
ITEM_FRAME = getById("item_frame");
ITEM_FRAME$registryId = getRegistryId(ITEM_FRAME);
GLOW_ITEM_FRAME = getById("glow_item_frame");
GLOW_ITEM_FRAME$registryId = getRegistryId(GLOW_ITEM_FRAME);
SMALL_FIREBALL = getById("small_fireball");
SMALL_FIREBALL$registryId = getRegistryId(SMALL_FIREBALL);
EGG = getById("egg");
EGG$registryId = getRegistryId(EGG);
ENDER_PEARL = getById("ender_pearl");
ENDER_PEARL$registryId = getRegistryId(ENDER_PEARL);
EXPERIENCE_BOTTLE = getById("experience_bottle");
EXPERIENCE_BOTTLE$registryId = getRegistryId(EXPERIENCE_BOTTLE);
POTION = getById("potion");
POTION$registryId = getRegistryId(POTION);
OMINOUS_ITEM_SPAWNER = VersionHelper.isOrAbove1_20_5() ? getById("ominous_item_spawner") : null;
OMINOUS_ITEM_SPAWNER$registryId = getRegistryId(OMINOUS_ITEM_SPAWNER);
HAPPY_GHAST = VersionHelper.isOrAbove1_21_6() ? getById("happy_ghast") : null;
HAPPY_GHAST$registryId = getRegistryId(HAPPY_GHAST);
PLAYER = getById("player");
PLAYER$registryId = getRegistryId(PLAYER);
ARROW = getById("arrow");
ARROW$registryId = getRegistryId(ARROW);
SPECTRAL_ARROW = getById("spectral_arrow");
SPECTRAL_ARROW$registryId = getRegistryId(SPECTRAL_ARROW);
ENDERMAN = getById("enderman");
ENDERMAN$registryId = getRegistryId(ENDERMAN);
TNT = getById("tnt");
TNT$registryId = getRegistryId(TNT);
CHEST_MINECART = getById("chest_minecart");
CHEST_MINECART$registryId = getRegistryId(CHEST_MINECART);
COMMAND_BLOCK_MINECART = getById("command_block_minecart");
COMMAND_BLOCK_MINECART$registryId = getRegistryId(COMMAND_BLOCK_MINECART);
FURNACE_MINECART = getById("furnace_minecart");
FURNACE_MINECART$registryId = getRegistryId(FURNACE_MINECART);
HOPPER_MINECART = getById("hopper_minecart");
HOPPER_MINECART$registryId = getRegistryId(HOPPER_MINECART);
MINECART = getById("minecart");
MINECART$registryId = getRegistryId(MINECART);
SPAWNER_MINECART = getById("spawner_minecart");
SPAWNER_MINECART$registryId = getRegistryId(SPAWNER_MINECART);
TNT_MINECART = getById("tnt_minecart");
TNT_MINECART$registryId = getRegistryId(TNT_MINECART);
}
}

View File

@@ -1713,4 +1713,11 @@ public final class NetworkReflections {
throw new ReflectionInitException("Failed to initialize ItemCost$STREAM_CODEC", e);
}
}
public static final Class<?> clazz$ClientboundBlockEntityDataPacket = requireNonNull(
BukkitReflectionUtils.findReobfOrMojmapClass(
"network.protocol.game.PacketPlayOutTileEntityData",
"network.protocol.game.ClientboundBlockEntityDataPacket"
)
);
}