9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-25 09:59:20 +00:00

refactor(network): 重构实体相关的网络包处理

This commit is contained in:
jhqwqmc
2025-04-07 22:07:16 +08:00
parent 5c37f95e5a
commit 0ae08a496a
9 changed files with 140 additions and 53 deletions

View File

@@ -141,7 +141,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
registerNMSPacketConsumer(PacketConsumers.LOGIN, Reflections.clazz$ClientboundLoginPacket);
registerNMSPacketConsumer(PacketConsumers.RESPAWN, Reflections.clazz$ClientboundRespawnPacket);
registerNMSPacketConsumer(PacketConsumers.INTERACT_ENTITY, Reflections.clazz$ServerboundInteractPacket);
// registerNMSPacketConsumer(PacketConsumers.REMOVE_ENTITY, Reflections.clazz$ClientboundRemoveEntitiesPacket);
registerNMSPacketConsumer(PacketConsumers.REMOVE_ENTITY, Reflections.clazz$ClientboundRemoveEntitiesPacket);
registerNMSPacketConsumer(PacketConsumers.SYNC_ENTITY_POSITION, Reflections.clazz$ClientboundEntityPositionSyncPacket);
registerNMSPacketConsumer(PacketConsumers.MOVE_ENTITY, Reflections.clazz$ClientboundMoveEntityPacket$Pos);
registerNMSPacketConsumer(PacketConsumers.PICK_ITEM_FROM_ENTITY, Reflections.clazz$ServerboundPickItemFromEntityPacket);
@@ -157,8 +157,10 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
registerByteBufPacketConsumer(PacketConsumers.LEVEL_PARTICLE, this.packetIds.clientboundLevelParticlesPacket());
registerByteBufPacketConsumer(PacketConsumers.LEVEL_EVENT, this.packetIds.clientboundLevelEventPacket());
registerByteBufPacketConsumer(PacketConsumers.OPEN_SCREEN, this.packetIds.clientboundOpenScreenPacket());
registerByteBufPacketConsumer(PacketConsumers.REMOVE_ENTITY, this.packetIds.clientboundRemoveEntitiesPacket());
// registerByteBufPacketConsumer(PacketConsumers.REMOVE_ENTITY, this.packetIds.clientboundRemoveEntitiesPacket());
registerByteBufPacketConsumer(PacketConsumers.ADD_ENTITY_BYTEBUFFER, this.packetIds.clientboundAddEntityPacket());
// registerByteBufPacketConsumer(PacketConsumers.SOUND, this.packetIds.clientboundSoundPacket());
// registerByteBufPacketConsumer(PacketConsumers.SET_ENTITY_DATA, this.packetIds.clientboundSetEntityDataPacket());
}
public static BukkitNetworkManager instance() {

View File

@@ -673,6 +673,7 @@ public class PacketConsumers {
if (type == Reflections.instance$EntityType$FALLING_BLOCK$registryId) {
int remapped = remap(data);
if (remapped != data) {
event.setChanged(true);
buf.clear();
buf.writeVarInt(event.packetID());
buf.writeVarInt(id);
@@ -747,12 +748,13 @@ public class PacketConsumers {
}
};
public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> REMOVE_ENTITY = (user, event) -> {
// TODO USE bytebuffer
public static final TriConsumer<NetWorkUser, NMSPacketEvent, Object> REMOVE_ENTITY = (user, event, packet) -> {
try {
FriendlyByteBuf buf = event.getBuffer();
IntList intList = buf.readIntIdList();
IntList intList = FastNMS.INSTANCE.field$ClientboundRemoveEntitiesPacket$entityIds(packet);
for (int i = 0, size = intList.size(); i < size; i++) {
List<Integer> entities = user.furnitureView().remove(intList.getInt(i));
System.out.println("Removing " + entities);
if (entities == null) continue;
for (int entityId : entities) {
intList.add(entityId);
@@ -1039,38 +1041,83 @@ public class PacketConsumers {
}
};
// TODO 使用bytebuffer
// public static final TriConsumer<NetWorkUser, NMSPacketEvent, Object> SET_ENTITY_DATA = (user, event, packet) -> {
// try {
// int id = FastNMS.INSTANCE.field$ClientboundSetEntityDataPacket$id(packet);
// Object entityType = user.entityView().get(id);
// if (entityType == Reflections.instance$EntityType$BLOCK_DISPLAY) {
// List<Object> packedItems = FastNMS.INSTANCE.field$ClientboundSetEntityDataPacket$packedItems(packet);
// for (int i = 0; i < packedItems.size(); i++) {
// Object packedItem = packedItems.get(i);
// int entityDataId = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$id(packedItem);
// if (entityDataId != EntityDataUtils.BLOCK_STATE_DATA_ID) {
// continue;
// }
// Object blockState = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$value(packedItem);
// int stateId = BlockStateUtils.blockStateToId(blockState);
// int newStateId;
// if (!user.clientModEnabled()) {
// newStateId = remap(stateId);
// } else {
// newStateId = remapMOD(stateId);
// }
// Object serializer = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$serializer(packedItem);
// packedItems.set(i, FastNMS.INSTANCE.constructor$SynchedEntityData$DataValue(
// entityDataId, serializer, BlockStateUtils.idToBlockState(newStateId)
// ));
// break;
// }
// }
// } catch (Exception e) {
// CraftEngine.instance().logger().warn("Failed to handle ClientboundSetEntityDataPacket", e);
// }
// };
// TODO 需要修复
// @SuppressWarnings("unchecked")
// public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> SET_ENTITY_DATA = (user, event) -> {
// try {
// FriendlyByteBuf buf = event.getBuffer();
// int id = buf.readVarInt();
// Object entityType = user.entityView().get(id);
// if (entityType == Reflections.instance$EntityType$BLOCK_DISPLAY) {
// Object registryFriendlyByteBuf = FastNMS.INSTANCE.constructor$RegistryFriendlyByteBuf(buf, Reflections.instance$registryAccess);
// boolean isChanged = false;
// List<Object> packedItems = (List<Object>) Reflections.method$ClientboundSetEntityDataPacket$unpack.invoke(null, registryFriendlyByteBuf);
// for (int i = 0; i < packedItems.size(); i++) {
// Object packedItem = packedItems.get(i);
// int entityDataId = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$id(packedItem);
// if (entityDataId != EntityDataUtils.BLOCK_STATE_DATA_ID) {
// continue;
// }
// Object blockState = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$value(packedItem);
// int stateId = BlockStateUtils.blockStateToId(blockState);
// int newStateId;
// if (!user.clientModEnabled()) {
// newStateId = remap(stateId);
// } else {
// newStateId = remapMOD(stateId);
// }
// Object serializer = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$serializer(packedItem);
// packedItems.set(i, FastNMS.INSTANCE.constructor$SynchedEntityData$DataValue(
// entityDataId, serializer, BlockStateUtils.idToBlockState(newStateId)
// ));
// isChanged = true;
// break;
// }
// if (isChanged) {
// System.out.println("Changed");
// event.setChanged(true);
// buf.clear();
// buf.writeVarInt(event.packetID());
// Reflections.method$ClientboundSetEntityDataPacket$pack.invoke(null, packedItems, registryFriendlyByteBuf);
// }
// }
// } catch (Exception e) {
// CraftEngine.instance().logger().warn("Failed to handle ClientboundSetEntityDataPacket", e);
// }
// };
// 之前的旧东西经供参考需要改成使用bytebuffer的
// public static final TriConsumer<NetWorkUser, NMSPacketEvent, Object> SET_ENTITY_DATA = (user, event, packet) -> {
// try {
// int id = FastNMS.INSTANCE.field$ClientboundSetEntityDataPacket$id(packet);
// Object entityType = user.entityView().get(id);
// if (entityType == Reflections.instance$EntityType$BLOCK_DISPLAY) {
// List<Object> packedItems = FastNMS.INSTANCE.field$ClientboundSetEntityDataPacket$packedItems(packet);
// for (int i = 0; i < packedItems.size(); i++) {
// Object packedItem = packedItems.get(i);
// int entityDataId = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$id(packedItem);
// if (entityDataId != EntityDataUtils.BLOCK_STATE_DATA_ID) {
// continue;
// }
// Object blockState = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$value(packedItem);
// int stateId = BlockStateUtils.blockStateToId(blockState);
// int newStateId;
// if (!user.clientModEnabled()) {
// newStateId = remap(stateId);
// } else {
// newStateId = remapMOD(stateId);
// }
// Object serializer = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$serializer(packedItem);
// packedItems.set(i, FastNMS.INSTANCE.constructor$SynchedEntityData$DataValue(
// entityDataId, serializer, BlockStateUtils.idToBlockState(newStateId)
// ));
// break;
// }
// }
// } catch (Exception e) {
// CraftEngine.instance().logger().warn("Failed to handle ClientboundSetEntityDataPacket", e);
// }
// };
// public static final TriConsumer<NetWorkUser, NMSPacketEvent, Object> OPEN_SCREEN = (user, event, packet) -> {
// try {

View File

@@ -14,7 +14,9 @@ public interface PacketIds {
int clientboundOpenScreenPacket();
int clientboundEntityPositionSyncPacket();
int clientboundSoundPacket();
int clientboundRemoveEntitiesPacket();
int clientboundSetEntityDataPacket();
}

View File

@@ -35,12 +35,17 @@ public class PacketIds1_20 implements PacketIds {
}
@Override
public int clientboundEntityPositionSyncPacket() {
return -1;
public int clientboundSoundPacket() {
return 98;
}
@Override
public int clientboundRemoveEntitiesPacket() {
return 62;
}
@Override
public int clientboundSetEntityDataPacket() {
return 82;
}
}

View File

@@ -35,12 +35,17 @@ public class PacketIds1_20_2 implements PacketIds {
}
@Override
public int clientboundEntityPositionSyncPacket() {
return -1;
public int clientboundSoundPacket() {
return 100;
}
@Override
public int clientboundRemoveEntitiesPacket() {
return 64;
}
@Override
public int clientboundSetEntityDataPacket() {
return 84;
}
}

View File

@@ -35,12 +35,17 @@ public class PacketIds1_20_3 implements PacketIds {
}
@Override
public int clientboundEntityPositionSyncPacket() {
return -1;
public int clientboundSoundPacket() {
return 102;
}
@Override
public int clientboundRemoveEntitiesPacket() {
return 64;
}
@Override
public int clientboundSetEntityDataPacket() {
return 86;
}
}

View File

@@ -35,12 +35,17 @@ public class PacketIds1_20_5 implements PacketIds {
}
@Override
public int clientboundEntityPositionSyncPacket() {
return -1;
public int clientboundSoundPacket() {
return 104;
}
@Override
public int clientboundRemoveEntitiesPacket() {
return 66;
}
@Override
public int clientboundSetEntityDataPacket() {
return 88;
}
}

View File

@@ -35,12 +35,17 @@ public class PacketIds1_21 implements PacketIds {
}
@Override
public int clientboundEntityPositionSyncPacket() {
return PacketIdFinder.clientboundByName("minecraft:entity_position_sync");
public int clientboundSoundPacket() {
return PacketIdFinder.clientboundByName("minecraft:sound");
}
@Override
public int clientboundRemoveEntitiesPacket() {
return PacketIdFinder.clientboundByName("minecraft:remove_entities");
}
@Override
public int clientboundSetEntityDataPacket() {
return PacketIdFinder.clientboundByName("minecraft:set_entity_data");
}
}

View File

@@ -6269,17 +6269,28 @@ public class Reflections {
ReflectionUtils.getMethod(clazz$Registry, int.class, Object.class)
);
public static final int instance$EntityType$FALLING_BLOCK$registryId;
public static final int instance$EntityType$BLOCK_DISPLAY$registryId;
public static final int instance$EntityType$FALLING_BLOCK$registryId;
static {
try {
Object blockDisplay = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "block_display");
instance$EntityType$BLOCK_DISPLAY$registryId = (int) Reflections.method$Registry$getId.invoke(Reflections.instance$BuiltInRegistries$ENTITY_TYPE, blockDisplay);
Object fallingBlock = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "falling_block");
instance$EntityType$FALLING_BLOCK$registryId = (int) Reflections.method$Registry$getId.invoke(Reflections.instance$BuiltInRegistries$ENTITY_TYPE, fallingBlock);
instance$EntityType$BLOCK_DISPLAY$registryId = (int) Reflections.method$Registry$getId.invoke(Reflections.instance$BuiltInRegistries$ENTITY_TYPE, instance$EntityType$BLOCK_DISPLAY);
instance$EntityType$FALLING_BLOCK$registryId = (int) Reflections.method$Registry$getId.invoke(Reflections.instance$BuiltInRegistries$ENTITY_TYPE, instance$EntityType$FALLING_BLOCK);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
// 先注释后面再说
// public static final Method method$ClientboundSetEntityDataPacket$pack = requireNonNull(
// ReflectionUtils.getDeclaredMethod(
// clazz$ClientboundSetEntityDataPacket, void.class, List.class, clazz$RegistryFriendlyByteBuf
// )
// );
//
// public static final Method method$ClientboundSetEntityDataPacket$unpack = requireNonNull(
// ReflectionUtils.getDeclaredMethod(
// clazz$ClientboundSetEntityDataPacket, List.class, clazz$RegistryFriendlyByteBuf
// )
// );
}