Skip to content

Commit

Permalink
Entity link cache fixes (GeyserMC#2068)
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Camotoy authored Mar 24, 2021
1 parent 92596b5 commit 7f03446
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,14 @@
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;

/**
Expand Down Expand Up @@ -61,6 +65,33 @@ public SkullPlayerEntity(GameProfile gameProfile, long geyserId, Vector3f positi
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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ public class EntityCache {

public EntityCache(GeyserSession session) {
this.session = session;
cachedPlayerEntityLinks.defaultReturnValue(-1L);
}

public void spawnEntity(Entity entity) {
Expand Down Expand Up @@ -100,6 +101,9 @@ public void removeAllEntities() {
for (Entity entity : entities) {
session.getEntityCache().removeEntity(entity, false);
}

// As a precaution
cachedPlayerEntityLinks.clear();
}

public Entity getEntityByGeyserId(long geyserId) {
Expand Down Expand Up @@ -160,7 +164,7 @@ public void clear() {
}

public long getCachedPlayerEntityLink(long playerId) {
return cachedPlayerEntityLinks.getOrDefault(playerId, -1);
return cachedPlayerEntityLinks.remove(playerId);
}

public void addCachedPlayerEntityLink(long playerId, long linkedEntityId) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,11 @@ public class JavaEntitySetPassengersTranslator extends PacketTranslator<ServerEn

@Override
public void translate(ServerEntitySetPassengersPacket packet, GeyserSession session) {
Entity entity = session.getEntityCache().getEntityByJavaId(packet.getEntityId());
Entity entity;
if (packet.getEntityId() == session.getPlayerEntity().getEntityId()) {
entity = session.getPlayerEntity();
} else {
entity = session.getEntityCache().getEntityByJavaId(packet.getEntityId());
}

if (entity == null) return;
Expand All @@ -66,7 +68,8 @@ public void translate(ServerEntitySetPassengersPacket packet, GeyserSession sess
session.confirmTeleport(passenger.getPosition().sub(0, EntityType.PLAYER.getOffset(), 0).toDouble());
}
}
// Passenger hasn't loaded in and entity link needs to be set later
// Passenger hasn't loaded in (likely since we're waiting for a skin response)
// and entity link needs to be set later
if (passenger == null && passengerId != 0) {
session.getEntityCache().addCachedPlayerEntityLink(passengerId, packet.getEntityId());
}
Expand Down

0 comments on commit 7f03446

Please sign in to comment.