From 92596b5b74ae60f4594b7725f2e8a35abe00df54 Mon Sep 17 00:00:00 2001 From: Rhodri <24809571+rhld16@users.noreply.github.com> Date: Wed, 24 Mar 2021 15:04:41 +0000 Subject: [PATCH 1/3] Update dwyl domain without ci skip (#2065) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 65a1261bd..a21a1b6c9 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) [![Build Status](https://ci.opencollab.dev/job/Geyser/job/master/badge/icon)](https://ci.opencollab.dev/job/GeyserMC/job/Geyser/job/master/) [![Discord](https://img.shields.io/discord/613163671870242838.svg?color=%237289da&label=discord)](http://discord.geysermc.org/) -[![HitCount](http://hits.dwyl.io/Geyser/GeyserMC.svg)](http://hits.dwyl.io/Geyser/GeyserMC) +[![HitCount](http://hits.dwyl.com/Geyser/GeyserMC.svg)](http://hits.dwyl.com/Geyser/GeyserMC) [![Crowdin](https://badges.crowdin.net/geyser/localized.svg)](https://translate.geysermc.org/) Geyser is a bridge between Minecraft: Bedrock Edition and Minecraft: Java Edition, closing the gap from those wanting to play true cross-platform. 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 2/3] 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 Date: Wed, 24 Mar 2021 20:03:51 -0400 Subject: [PATCH 3/3] Prevent NPEs from GeyserConnector.getPlayerByUuid (#2070) - If GeyserConnector.getPlayerByUuid is given null, it will return null - Never set a session's UUID to null if possible - but have precautions if for some reason it is --- .../java/org/geysermc/connector/GeyserConnector.java | 8 +++++++- .../connector/network/session/GeyserSession.java | 12 +++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java index f0dd696f6..26b07583b 100644 --- a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java +++ b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java @@ -57,6 +57,7 @@ import org.geysermc.connector.network.translators.world.block.BlockTranslator; import org.geysermc.connector.network.translators.world.block.entity.BlockEntityTranslator; import org.geysermc.connector.network.translators.world.block.entity.SkullBlockEntityTranslator; import org.geysermc.connector.utils.*; +import org.jetbrains.annotations.Contract; import javax.naming.directory.Attribute; import javax.naming.directory.InitialDirContext; @@ -351,9 +352,14 @@ public class GeyserConnector { * @param uuid the uuid * @return the player or null if there is no player online with this UUID */ + @Contract("null -> null") public GeyserSession getPlayerByUuid(UUID uuid) { + if (uuid == null) { + return null; + } + for (GeyserSession session : players) { - if (session.getPlayerEntity().getUuid().equals(uuid)) { + if (uuid.equals(session.getPlayerEntity().getUuid())) { return session; } } diff --git a/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java index c7f13398e..de6fb94b5 100644 --- a/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java +++ b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java @@ -100,6 +100,7 @@ import org.geysermc.floodgate.util.EncryptionUtil; import java.io.IOException; import java.net.InetAddress; import java.net.InetSocketAddress; +import java.nio.charset.StandardCharsets; import java.security.NoSuchAlgorithmException; import java.security.PublicKey; import java.security.spec.InvalidKeySpecException; @@ -686,7 +687,16 @@ public class GeyserSession implements CommandSender { return; } connector.getLogger().info(LanguageUtils.getLocaleStringLog("geyser.network.remote.connect", authData.getName(), protocol.getProfile().getName(), remoteAddress)); - playerEntity.setUuid(protocol.getProfile().getId()); + UUID uuid = protocol.getProfile().getId(); + if (uuid == null) { + // Set what our UUID *probably* is going to be + if (remoteAuthType == AuthType.FLOODGATE) { + uuid = new UUID(0, Long.parseLong(authData.getXboxUUID())); + } else { + uuid = UUID.nameUUIDFromBytes(("OfflinePlayer:" + protocol.getProfile().getName()).getBytes(StandardCharsets.UTF_8)); + } + } + playerEntity.setUuid(uuid); playerEntity.setUsername(protocol.getProfile().getName()); String locale = clientData.getLanguageCode();