From 409113321f4add613cc1c80f50f7e08428bcac92 Mon Sep 17 00:00:00 2001 From: AlexProgrammerDE <40795980+AlexProgrammerDE@users.noreply.github.com> Date: Sun, 2 Feb 2025 20:13:10 +0100 Subject: [PATCH] Handle rare cases of missing entity profile data before spawning remote players Some servers have broken protocol and do that. :shrug: Probably something with Citizens --- .../protocol/bot/SessionDataManager.java | 17 ++++++++------- .../bot/state/entity/EntityFactory.java | 21 ++++++++++--------- 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/server/src/main/java/com/soulfiremc/server/protocol/bot/SessionDataManager.java b/server/src/main/java/com/soulfiremc/server/protocol/bot/SessionDataManager.java index 5b43366e0..fb8a8f992 100644 --- a/server/src/main/java/com/soulfiremc/server/protocol/bot/SessionDataManager.java +++ b/server/src/main/java/com/soulfiremc/server/protocol/bot/SessionDataManager.java @@ -901,14 +901,15 @@ public void onBorderWarningBlocks(ClientboundSetBorderWarningDistancePacket pack @EventHandler public void onEntitySpawn(ClientboundAddEntityPacket packet) { - var entityState = EntityFactory.createEntity( - connection, - EntityType.REGISTRY.getById(packet.getType().ordinal()), - currentLevel(), - packet.getUuid()); - entityState.fromAddEntityPacket(packet); - - entityTrackerState.addEntity(entityState); + EntityFactory.createEntity( + connection, + EntityType.REGISTRY.getById(packet.getType().ordinal()), + currentLevel(), + packet.getUuid()) + .ifPresent(entityState -> { + entityState.fromAddEntityPacket(packet); + entityTrackerState.addEntity(entityState); + }); } @EventHandler diff --git a/server/src/main/java/com/soulfiremc/server/protocol/bot/state/entity/EntityFactory.java b/server/src/main/java/com/soulfiremc/server/protocol/bot/state/entity/EntityFactory.java index 67d1ee296..702149da2 100644 --- a/server/src/main/java/com/soulfiremc/server/protocol/bot/state/entity/EntityFactory.java +++ b/server/src/main/java/com/soulfiremc/server/protocol/bot/state/entity/EntityFactory.java @@ -28,12 +28,13 @@ import java.util.UUID; public class EntityFactory { - public static Entity createEntity(BotConnection connection, EntityType entityType, Level level, UUID uuid) { - if (entityType.playerEntity()) { - return new RemotePlayer(connection, level, connection.getEntityProfile(uuid).orElseThrow().getProfile()); + public static Optional createEntity(BotConnection connection, EntityType entityType, Level level, UUID uuid) { + if (entityType == EntityType.PLAYER) { + return connection.getEntityProfile(uuid).map( + playerListEntry -> new RemotePlayer(connection, level, playerListEntry.getProfile())); } else if (entityType.livingEntity()) { // TODO: Implement entity inventories - return new LivingEntity(entityType, level) { + return Optional.of(new LivingEntity(entityType, level) { @Override public Optional getItemBySlot(EquipmentSlot slot) { return Optional.empty(); @@ -42,17 +43,17 @@ public Optional getItemBySlot(EquipmentSlot slot) { @Override public void setItemSlot(EquipmentSlot slot, @Nullable SFItemStack item) { } - }; + }); } else if (entityType.boatEntity()) { - return new AbstractBoat(entityType, level); + return Optional.of(new AbstractBoat(entityType, level)); } else if (entityType.minecartEntity()) { - return new AbstractMinecart(entityType, level); + return Optional.of(new AbstractMinecart(entityType, level)); } else if (entityType.windChargeEntity()) { - return new AbstractWindCharge(entityType, level); + return Optional.of(new AbstractWindCharge(entityType, level)); } else if (entityType.shulkerEntity()) { - return new Shulker(entityType, level); + return Optional.of(new Shulker(entityType, level)); } else { - return new Entity(entityType, level); + return Optional.of(new Entity(entityType, level)); } } }