From 7f03446262540aacf87121bc2d58358b9750085d Mon Sep 17 00:00:00 2001 From: Camotoy <20743703+Camotoy@users.noreply.github.com> Date: Wed, 24 Mar 2021 11:09:24 -0400 Subject: [PATCH] Entity link cache fixes (#2068) Note that this needs to be revisited to see if it's even needed, or perhaps some sort of Guava cache. - `getCachedPlayerEntityLink` now removes the entry if found - Skulls will not have player entity links so we shouldn't bother checking - Clear the entity link cache on dimension switch --- .../entity/player/SkullPlayerEntity.java | 31 +++++++++++++++++++ .../network/session/cache/EntityCache.java | 6 +++- .../JavaEntitySetPassengersTranslator.java | 7 +++-- 3 files changed, 41 insertions(+), 3 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/entity/player/SkullPlayerEntity.java b/connector/src/main/java/org/geysermc/connector/entity/player/SkullPlayerEntity.java index 97f6f15c6..3f8d9ea93 100644 --- a/connector/src/main/java/org/geysermc/connector/entity/player/SkullPlayerEntity.java +++ b/connector/src/main/java/org/geysermc/connector/entity/player/SkullPlayerEntity.java @@ -28,10 +28,14 @@ package org.geysermc.connector.entity.player; import com.github.steveice10.mc.auth.data.GameProfile; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.math.vector.Vector3i; +import com.nukkitx.protocol.bedrock.data.PlayerPermission; +import com.nukkitx.protocol.bedrock.data.command.CommandPermission; import com.nukkitx.protocol.bedrock.data.entity.EntityData; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; +import com.nukkitx.protocol.bedrock.packet.AddPlayerPacket; import lombok.Getter; import lombok.Setter; +import org.geysermc.connector.entity.type.EntityType; import org.geysermc.connector.network.session.GeyserSession; /** @@ -61,6 +65,33 @@ public class SkullPlayerEntity extends PlayerEntity { metadata.getFlags().setFlag(EntityFlag.INVISIBLE, true); // Until the skin is loaded } + /** + * Overwritten so each entity doesn't check for a linked entity + */ + @Override + public void spawnEntity(GeyserSession session) { + AddPlayerPacket addPlayerPacket = new AddPlayerPacket(); + addPlayerPacket.setUuid(getUuid()); + addPlayerPacket.setUsername(getUsername()); + addPlayerPacket.setRuntimeEntityId(geyserId); + addPlayerPacket.setUniqueEntityId(geyserId); + addPlayerPacket.setPosition(position.clone().sub(0, EntityType.PLAYER.getOffset(), 0)); + addPlayerPacket.setRotation(getBedrockRotation()); + addPlayerPacket.setMotion(motion); + addPlayerPacket.setHand(hand); + addPlayerPacket.getAdventureSettings().setCommandPermission(CommandPermission.NORMAL); + addPlayerPacket.getAdventureSettings().setPlayerPermission(PlayerPermission.MEMBER); + addPlayerPacket.setDeviceId(""); + addPlayerPacket.setPlatformChatId(""); + addPlayerPacket.getMetadata().putAll(metadata); + + valid = true; + session.sendUpstreamPacket(addPlayerPacket); + + updateEquipment(session); + updateBedrockAttributes(session); + } + public void despawnEntity(GeyserSession session, Vector3i position) { this.despawnEntity(session); session.getSkullCache().remove(position, this); diff --git a/connector/src/main/java/org/geysermc/connector/network/session/cache/EntityCache.java b/connector/src/main/java/org/geysermc/connector/network/session/cache/EntityCache.java index a2eb60053..4d6750bc0 100644 --- a/connector/src/main/java/org/geysermc/connector/network/session/cache/EntityCache.java +++ b/connector/src/main/java/org/geysermc/connector/network/session/cache/EntityCache.java @@ -59,6 +59,7 @@ public class EntityCache { public EntityCache(GeyserSession session) { this.session = session; + cachedPlayerEntityLinks.defaultReturnValue(-1L); } public void spawnEntity(Entity entity) { @@ -100,6 +101,9 @@ public class EntityCache { for (Entity entity : entities) { session.getEntityCache().removeEntity(entity, false); } + + // As a precaution + cachedPlayerEntityLinks.clear(); } public Entity getEntityByGeyserId(long geyserId) { @@ -160,7 +164,7 @@ public class EntityCache { } public long getCachedPlayerEntityLink(long playerId) { - return cachedPlayerEntityLinks.getOrDefault(playerId, -1); + return cachedPlayerEntityLinks.remove(playerId); } public void addCachedPlayerEntityLink(long playerId, long linkedEntityId) { diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaEntitySetPassengersTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaEntitySetPassengersTranslator.java index b7d6c5e06..da9ce64ff 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaEntitySetPassengersTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaEntitySetPassengersTranslator.java @@ -47,9 +47,11 @@ public class JavaEntitySetPassengersTranslator extends PacketTranslator