9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-25 01:49:30 +00:00

feat(network): 实现方块展示实体映射方块状态

This commit is contained in:
jhqwqmc
2025-04-03 21:03:34 +08:00
parent db9d7516b6
commit a2e9d2caf8
3 changed files with 79 additions and 0 deletions

View File

@@ -128,6 +128,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
registerNMSPacketConsumer(PacketConsumers.SIGN_UPDATE, Reflections.clazz$ServerboundSignUpdatePacket);
registerNMSPacketConsumer(PacketConsumers.EDIT_BOOK, Reflections.clazz$ServerboundEditBookPacket);
registerNMSPacketConsumer(PacketConsumers.CUSTOM_PAYLOAD, Reflections.clazz$ServerboundCustomPayloadPacket);
registerNMSPacketConsumer(PacketConsumers.SET_ENTITY_DATA, Reflections.clazz$ClientboundSetEntityDataPacket);
registerByteBufPacketConsumer(PacketConsumers.SECTION_BLOCK_UPDATE, this.packetIds.clientboundSectionBlocksUpdatePacket());
registerByteBufPacketConsumer(PacketConsumers.BLOCK_UPDATE, this.packetIds.clientboundBlockUpdatePacket());
registerByteBufPacketConsumer(PacketConsumers.LEVEL_PARTICLE, this.packetIds.clientboundLevelParticlesPacket());

View File

@@ -961,4 +961,41 @@ public class PacketConsumers {
CraftEngine.instance().logger().warn("Failed to handle ServerboundCustomPayloadPacket", e);
}
};
@SuppressWarnings("unchecked")
public static final TriConsumer<NetWorkUser, NMSPacketEvent, Object> SET_ENTITY_DATA = (user, event, packet) -> {
try {
int id = (int) Reflections.field$ClientboundSetEntityDataPacket$id.get(packet);
Object player = user.serverPlayer();
Object level = Reflections.method$Entity$level.invoke(player);
Object entityLookup = Reflections.method$Level$moonrise$getEntityLookup.invoke(level);
Object entity = Reflections.method$EntityLookup$get.invoke(entityLookup, id);
if (entity == null) return;
Object entityType = Reflections.method$Entity$getType.invoke(entity);
if (entityType != Reflections.instance$EntityType$BLOCK_DISPLAY) return;
List<Object> packedItems = (List<Object>) Reflections.field$ClientboundSetEntityDataPacket$packedItems.get(packet);
for (int i = 0; i < packedItems.size(); i++) {
Object packedItem = packedItems.get(i);
int entityDataId = (int) Reflections.field$SynchedEntityData$DataValue$id.get(packedItem);
if ((VersionHelper.isVersionNewerThan1_20_2() && entityDataId != 23)
|| (!VersionHelper.isVersionNewerThan1_20_2() && entityDataId != 22)) {
continue;
}
Object blockState = Reflections.field$SynchedEntityData$DataValue$value.get(packedItem);
Object serializer = Reflections.field$SynchedEntityData$DataValue$serializer.get(packedItem);
int stateId = BlockStateUtils.blockStateToId(blockState);
int newStateId;
if (!user.clientModEnabled()) {
newStateId = remap(stateId);
} else {
newStateId = remapMOD(stateId);
}
packedItems.set(i, Reflections.constructor$SynchedEntityData$DataValue.newInstance(
entityDataId, serializer, BlockStateUtils.idToBlockState(newStateId)
));
}
} catch (Exception e) {
CraftEngine.instance().logger().warn("Failed to handle ClientboundSetEntityDataPacket", e);
}
};
}

View File

@@ -809,6 +809,12 @@ public class Reflections {
)
);
public static final Field field$SynchedEntityData$DataValue$serializer = requireNonNull(
ReflectionUtils.getDeclaredField(
clazz$SynchedEntityData$DataValue, 1
)
);
public static final Field field$SynchedEntityData$DataValue$value = requireNonNull(
ReflectionUtils.getDeclaredField(
clazz$SynchedEntityData$DataValue, 2
@@ -3666,6 +3672,7 @@ public class Reflections {
public static final Object instance$EntityType$TEXT_DISPLAY;
public static final Object instance$EntityType$ITEM_DISPLAY;
public static final Object instance$EntityType$BLOCK_DISPLAY;
public static final Object instance$EntityType$FALLING_BLOCK;
public static final Object instance$EntityType$INTERACTION;
public static final Object instance$EntityType$SHULKER;
@@ -3676,6 +3683,8 @@ public class Reflections {
instance$EntityType$TEXT_DISPLAY = Reflections.method$Registry$get.invoke(Reflections.instance$BuiltInRegistries$ENTITY_TYPE, textDisplay);
Object itemDisplay = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "item_display");
instance$EntityType$ITEM_DISPLAY = Reflections.method$Registry$get.invoke(Reflections.instance$BuiltInRegistries$ENTITY_TYPE, itemDisplay);
Object blockDisplay = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "block_display");
instance$EntityType$BLOCK_DISPLAY = Reflections.method$Registry$get.invoke(Reflections.instance$BuiltInRegistries$ENTITY_TYPE, blockDisplay);
Object fallingBlock = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "falling_block");
instance$EntityType$FALLING_BLOCK = Reflections.method$Registry$get.invoke(Reflections.instance$BuiltInRegistries$ENTITY_TYPE, fallingBlock);
Object interaction = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "interaction");
@@ -6056,4 +6065,36 @@ public class Reflections {
clazz$ClientboundMoveEntityPacket$Pos, int.class, short.class, short.class, short.class, boolean.class
)
);
public static final Method method$Entity$getType = requireNonNull(
ReflectionUtils.getMethod(
clazz$Entity, clazz$EntityType
)
);
public static final Constructor<?> constructor$SynchedEntityData$DataValue = requireNonNull(
ReflectionUtils.getConstructor(
clazz$SynchedEntityData$DataValue, int.class, clazz$EntityDataSerializer, Object.class
)
);
public static final Class<?> clazz$EntityLookup = requireNonNull(
ReflectionUtils.getClazz(
"ca.spottedleaf.moonrise.patches.chunk_system.level.entity.EntityLookup",
"io.papermc.paper.chunk.system.entity.EntityLookup"
)
);
public static final Method method$Level$moonrise$getEntityLookup = requireNonNull(
ReflectionUtils.getMethod(
VersionHelper.isVersionNewerThan1_21() ? clazz$Level : clazz$ServerLevel,
clazz$EntityLookup
)
);
public static final Method method$EntityLookup$get = requireNonNull(
ReflectionUtils.getMethod(
clazz$EntityLookup, clazz$Entity, int.class
)
);
}