diff --git a/common/src/main/java/org/geysermc/floodgate/util/Base64Utils.java b/common/src/main/java/org/geysermc/floodgate/util/Base64Utils.java index 4c527b94837..326fa2590d0 100644 --- a/common/src/main/java/org/geysermc/floodgate/util/Base64Utils.java +++ b/common/src/main/java/org/geysermc/floodgate/util/Base64Utils.java @@ -25,7 +25,7 @@ package org.geysermc.floodgate.util; -public class Base64Utils { +public final class Base64Utils { public static int getEncodedLength(int length) { if (length <= 0) { return -1; diff --git a/common/src/main/java/org/geysermc/floodgate/util/FloodgateConfigHolder.java b/common/src/main/java/org/geysermc/floodgate/util/FloodgateConfigHolder.java index 386213adaa8..d33840bb4ac 100644 --- a/common/src/main/java/org/geysermc/floodgate/util/FloodgateConfigHolder.java +++ b/common/src/main/java/org/geysermc/floodgate/util/FloodgateConfigHolder.java @@ -28,7 +28,7 @@ import lombok.Getter; import lombok.Setter; -public class FloodgateConfigHolder { +public final class FloodgateConfigHolder { @Getter @Setter private static Object config; diff --git a/common/src/main/java/org/geysermc/floodgate/util/LinkedPlayer.java b/common/src/main/java/org/geysermc/floodgate/util/LinkedPlayer.java index 7d67a44a077..f91bfafbcda 100644 --- a/common/src/main/java/org/geysermc/floodgate/util/LinkedPlayer.java +++ b/common/src/main/java/org/geysermc/floodgate/util/LinkedPlayer.java @@ -48,7 +48,7 @@ public final class LinkedPlayer implements Cloneable { */ private final UUID bedrockId; /** - * If the LinkedPlayer is send from a different platform. For example the LinkedPlayer is from + * If the LinkedPlayer is sent from a different platform. For example the LinkedPlayer is from * Bungee but the data has been sent to the Bukkit server. */ private boolean fromDifferentPlatform = false; diff --git a/connector/pom.xml b/connector/pom.xml index 1ed01a0c41b..b7bfc9d3af5 100644 --- a/connector/pom.xml +++ b/connector/pom.xml @@ -39,6 +39,7 @@ org.java-websocket Java-WebSocket 1.5.1 + compile com.github.CloudburstMC.Protocol @@ -214,11 +215,13 @@ org.reflections reflections 0.9.11 + compile org.dom4j dom4j 2.1.3 + compile net.kyori @@ -254,6 +257,7 @@ com.github.GeyserMC MCAuthLib 0e48a094f2 + compile diff --git a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java index 87a698be3fe..8dfa12eb474 100644 --- a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java +++ b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java @@ -109,7 +109,7 @@ public class GeyserConnector { @Setter private AuthType defaultAuthType; - private TimeSyncer timeSyncer; + private final TimeSyncer timeSyncer; private FloodgateCipher cipher; private FloodgateSkinUploader skinUploader; private final NewsHandler newsHandler; @@ -202,6 +202,7 @@ private GeyserConnector(PlatformType platformType, GeyserBootstrap bootstrap) { defaultAuthType = AuthType.getByName(config.getRemote().getAuthType()); + TimeSyncer timeSyncer = null; if (defaultAuthType == AuthType.FLOODGATE) { timeSyncer = new TimeSyncer(Constants.NTP_SERVER); try { @@ -214,6 +215,7 @@ private GeyserConnector(PlatformType platformType, GeyserBootstrap bootstrap) { logger.severe(LanguageUtils.getLocaleStringLog("geyser.auth.floodgate.bad_key"), exception); } } + this.timeSyncer = timeSyncer; String branch = "unknown"; int buildNumber = -1; diff --git a/connector/src/main/java/org/geysermc/connector/command/CommandManager.java b/connector/src/main/java/org/geysermc/connector/command/CommandManager.java index 71eb2c742f0..f62fd853943 100644 --- a/connector/src/main/java/org/geysermc/connector/command/CommandManager.java +++ b/connector/src/main/java/org/geysermc/connector/command/CommandManager.java @@ -53,7 +53,7 @@ public CommandManager(GeyserConnector connector) { registerCommand(new VersionCommand(connector, "version", "geyser.commands.version.desc", "geyser.command.version")); registerCommand(new SettingsCommand(connector, "settings", "geyser.commands.settings.desc", "geyser.command.settings")); registerCommand(new StatisticsCommand(connector, "statistics", "geyser.commands.statistics.desc", "geyser.command.statistics")); - registerCommand(new AdvancementsCommand( "advancements", "geyser.commands.advancements.desc", "geyser.command.advancements")); + registerCommand(new AdvancementsCommand("advancements", "geyser.commands.advancements.desc", "geyser.command.advancements")); } public void registerCommand(GeyserCommand command) { 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 ead9d183418..f901fe9a184 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 @@ -140,10 +140,10 @@ public class GeyserSession implements CommandSender { private ChunkCache chunkCache; private EntityCache entityCache; private EntityEffectCache effectCache; + private final FormCache formCache; private final PreferencesCache preferencesCache; private final TagCache tagCache; private WorldCache worldCache; - private FormCache formCache; private final Int2ObjectMap teleportMap = new Int2ObjectOpenHashMap<>(); private final PlayerInventory playerInventory; @@ -445,12 +445,13 @@ public GeyserSession(GeyserConnector connector, BedrockServerSession bedrockServ this.chunkCache = new ChunkCache(this); this.entityCache = new EntityCache(this); this.effectCache = new EntityEffectCache(); + this.formCache = new FormCache(this); this.preferencesCache = new PreferencesCache(this); this.tagCache = new TagCache(); this.worldCache = new WorldCache(this); - this.formCache = new FormCache(this); this.collisionManager = new CollisionManager(this); + this.playerEntity = new SessionPlayerEntity(this); collisionManager.updatePlayerBoundingBox(this.playerEntity.getPosition()); @@ -851,7 +852,6 @@ public void disconnect(String reason) { this.entityCache = null; this.effectCache = null; this.worldCache = null; - this.formCache = null; closed = true; } diff --git a/connector/src/main/java/org/geysermc/connector/network/session/auth/BedrockClientData.java b/connector/src/main/java/org/geysermc/connector/network/session/auth/BedrockClientData.java index d87590e5f7b..fc4d1164a63 100644 --- a/connector/src/main/java/org/geysermc/connector/network/session/auth/BedrockClientData.java +++ b/connector/src/main/java/org/geysermc/connector/network/session/auth/BedrockClientData.java @@ -25,26 +25,18 @@ package org.geysermc.connector.network.session.auth; -import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.JsonNode; -import com.google.common.base.Charsets; import lombok.Getter; -import org.geysermc.connector.skin.SkinProvider; import org.geysermc.floodgate.util.DeviceOs; import org.geysermc.floodgate.util.InputMode; import org.geysermc.floodgate.util.UiProfile; -import java.util.Base64; import java.util.UUID; @JsonIgnoreProperties(ignoreUnknown = true) @Getter public final class BedrockClientData { - @JsonIgnore - private JsonNode jsonData; - @JsonProperty(value = "GameVersion") private String gameVersion; @JsonProperty(value = "ServerAddress") @@ -115,27 +107,6 @@ public final class BedrockClientData { @JsonProperty(value = "PlayFabId") private String playFabId; - public void setJsonData(JsonNode data) { - if (this.jsonData == null && data != null) { - this.jsonData = data; - } - } - - public boolean isAlex() { - try { - byte[] bytes = Base64.getDecoder().decode(geometryName.getBytes(Charsets.UTF_8)); - String geometryName = - SkinProvider.OBJECT_MAPPER - .readTree(bytes) - .get("geometry").get("default") - .asText(); - return "geometry.humanoid.customSlim".equals(geometryName); - } catch (Exception exception) { - exception.printStackTrace(); - return false; - } - } - public DeviceOs getDeviceOs() { return deviceOs != null ? deviceOs : DeviceOs.UNKNOWN; } diff --git a/connector/src/main/java/org/geysermc/connector/network/session/cache/AdvancementsCache.java b/connector/src/main/java/org/geysermc/connector/network/session/cache/AdvancementsCache.java index d20eb11dd64..98ec5b26258 100644 --- a/connector/src/main/java/org/geysermc/connector/network/session/cache/AdvancementsCache.java +++ b/connector/src/main/java/org/geysermc/connector/network/session/cache/AdvancementsCache.java @@ -29,7 +29,6 @@ import com.github.steveice10.mc.protocol.packet.ingame.client.window.ClientAdvancementTabPacket; import lombok.Getter; import lombok.Setter; -import lombok.experimental.Accessors; import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.network.translators.chat.MessageTranslator; import org.geysermc.connector.utils.GeyserAdvancement; @@ -58,7 +57,7 @@ public class AdvancementsCache { /** * Stores player's chosen advancement's ID and title for use in form creators. */ - @Setter @Accessors(chain = true) + @Setter private String currentAdvancementCategoryId = null; private final GeyserSession session; diff --git a/connector/src/main/java/org/geysermc/connector/network/session/cache/FormCache.java b/connector/src/main/java/org/geysermc/connector/network/session/cache/FormCache.java index cdd8a01ac01..1cdcf228b43 100644 --- a/connector/src/main/java/org/geysermc/connector/network/session/cache/FormCache.java +++ b/connector/src/main/java/org/geysermc/connector/network/session/cache/FormCache.java @@ -33,6 +33,7 @@ import lombok.RequiredArgsConstructor; import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.cumulus.Form; +import org.geysermc.cumulus.SimpleForm; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; @@ -58,13 +59,15 @@ public int showForm(Form form) { formRequestPacket.setFormData(form.getJsonData()); session.sendUpstreamPacket(formRequestPacket); - // Hack to fix the url image loading bug - NetworkStackLatencyPacket latencyPacket = new NetworkStackLatencyPacket(); - latencyPacket.setFromServer(true); - latencyPacket.setTimestamp(-System.currentTimeMillis()); - session.getConnector().getGeneralThreadPool().schedule( - () -> session.sendUpstreamPacket(latencyPacket), - 500, TimeUnit.MILLISECONDS); + // Hack to fix the (url) image loading bug + if (form instanceof SimpleForm) { + NetworkStackLatencyPacket latencyPacket = new NetworkStackLatencyPacket(); + latencyPacket.setFromServer(true); + latencyPacket.setTimestamp(-System.currentTimeMillis()); + session.getConnector().getGeneralThreadPool().schedule( + () -> session.sendUpstreamPacket(latencyPacket), + 500, TimeUnit.MILLISECONDS); + } return windowId; } diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockNetworkStackLatencyTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockNetworkStackLatencyTranslator.java index 577469fdd03..208e7c75d8a 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockNetworkStackLatencyTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockNetworkStackLatencyTranslator.java @@ -52,7 +52,6 @@ public void translate(NetworkStackLatencyPacket packet, GeyserSession session) { // PS4 divides the network stack latency timestamp FOR US!!! // WTF if (session.getClientData().getDeviceOs().equals(DeviceOs.PS4)) { - // Ignore the weird DeviceOS, our order is wrong and will be fixed in Floodgate 2.0 pingId = packet.getTimestamp(); } else { pingId = packet.getTimestamp() / 1000; diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaAdvancementsTabTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaAdvancementsTabTranslator.java index 80b9f915564..aa22ae46579 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaAdvancementsTabTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaAdvancementsTabTranslator.java @@ -27,6 +27,7 @@ import com.github.steveice10.mc.protocol.packet.ingame.server.ServerAdvancementTabPacket; import org.geysermc.connector.network.session.GeyserSession; +import org.geysermc.connector.network.session.cache.AdvancementsCache; import org.geysermc.connector.network.translators.PacketTranslator; import org.geysermc.connector.network.translators.Translator; @@ -37,8 +38,8 @@ public class JavaAdvancementsTabTranslator extends PacketTranslator { @Override public void translate(ServerAdvancementTabPacket packet, GeyserSession session) { - session.getAdvancementsCache() - .setCurrentAdvancementCategoryId(packet.getTabId()) - .buildAndShowListForm(); + AdvancementsCache advancementsCache = session.getAdvancementsCache(); + advancementsCache.setCurrentAdvancementCategoryId(packet.getTabId()); + advancementsCache.buildAndShowListForm(); } } diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaStatisticsTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaStatisticsTranslator.java index 5d3164c0d29..24780804124 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaStatisticsTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaStatisticsTranslator.java @@ -33,6 +33,7 @@ @Translator(packet = ServerStatisticsPacket.class) public class JavaStatisticsTranslator extends PacketTranslator { + @Override public void translate(ServerStatisticsPacket packet, GeyserSession session) { session.updateStatistics(packet.getStatistics()); diff --git a/connector/src/main/java/org/geysermc/connector/utils/LoginEncryptionUtils.java b/connector/src/main/java/org/geysermc/connector/utils/LoginEncryptionUtils.java index ce9f232722f..d3d5fa67d03 100644 --- a/connector/src/main/java/org/geysermc/connector/utils/LoginEncryptionUtils.java +++ b/connector/src/main/java/org/geysermc/connector/utils/LoginEncryptionUtils.java @@ -134,7 +134,6 @@ private static void encryptConnectionWithCert(GeyserConnector connector, GeyserS JsonNode clientDataJson = JSON_MAPPER.readTree(clientJwt.getPayload().toBytes()); BedrockClientData data = JSON_MAPPER.convertValue(clientDataJson, BedrockClientData.class); - data.setJsonData(clientDataJson); session.setClientData(data); if (EncryptionUtils.canUseEncryption()) { @@ -243,7 +242,7 @@ public static void buildAndShowLoginDetailsWindow(GeyserSession session) { } /** - * Promts the user between either OAuth code login or manual password authentication + * Prompts the user between either OAuth code login or manual password authentication */ public static void buildAndShowMicrosoftAuthenticationWindow(GeyserSession session) { session.sendForm( diff --git a/connector/src/main/java/org/geysermc/connector/utils/StatisticsUtils.java b/connector/src/main/java/org/geysermc/connector/utils/StatisticsUtils.java index f2181d87152..e59807d7536 100644 --- a/connector/src/main/java/org/geysermc/connector/utils/StatisticsUtils.java +++ b/connector/src/main/java/org/geysermc/connector/utils/StatisticsUtils.java @@ -180,8 +180,8 @@ public static void buildAndSendStatisticsMenu(GeyserSession session) { session.sendForm( builder.content(content.toString()) .button("gui.back", FormImage.Type.PATH, "textures/gui/newgui/undo") - .responseHandler((form1, responseData1) -> { - SimpleFormResponse response1 = form.parseResponse(responseData1); + .responseHandler((form1, subFormResponseData) -> { + SimpleFormResponse response1 = form.parseResponse(subFormResponseData); if (response1.isCorrect()) { buildAndSendStatisticsMenu(session); }