From 0c60af66b2a6503fc762af2ab215fb8219826e3b Mon Sep 17 00:00:00 2001 From: rtm516 Date: Tue, 12 May 2020 05:45:16 +0100 Subject: [PATCH] Fixed customised skins causing strange display (#534) * Fixed customised skins causing strange display * Cleaned up floodgate player checking * Fixed cape scale Co-authored-by: James Harrison --- .../connector/network/session/GeyserSession.java | 2 +- .../network/session/auth/BedrockClientData.java | 15 +++++++++++++++ .../geysermc/connector/utils/SkinProvider.java | 4 +++- .../org/geysermc/connector/utils/SkinUtils.java | 7 ++++--- 4 files changed, 23 insertions(+), 5 deletions(-) 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 759a0f3b..fa9960f2 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 @@ -341,7 +341,7 @@ public class GeyserSession implements CommandSender { playerEntity.setUuid(profile.getId()); // Check if they are not using a linked account - if (!playerEntity.getUuid().toString().startsWith("00000000-0000-0000")) { + if (connector.getAuthType() == AuthType.OFFLINE || playerEntity.getUuid().getMostSignificantBits() == 0) { SkinUtils.handleBedrockSkin(playerEntity, clientData); } } 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 4ef0fe79..6aeebbaa 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 @@ -32,12 +32,18 @@ public class BedrockClientData { private String capeId; @JsonProperty(value = "CapeData") private byte[] capeData; + @JsonProperty(value = "CapeImageHeight") + private int capeImageHeight; + @JsonProperty(value = "CapeImageWidth") + private int capeImageWidth; @JsonProperty(value = "CapeOnClassicSkin") private boolean capeOnClassicSkin; @JsonProperty(value = "SkinResourcePatch") private String geometryName; @JsonProperty(value = "SkinGeometryData") private String geometryData; + @JsonProperty(value = "PersonaSkin") + private boolean personaSkin; @JsonProperty(value = "PremiumSkin") private boolean premiumSkin; @@ -64,6 +70,15 @@ public class BedrockClientData { @JsonProperty(value = "ClientRandomId") private long clientRandomId; + @JsonProperty(value = "ArmSize") + private String armSize; + @JsonProperty(value = "SkinAnimationData") + private String skinAnimationData; + @JsonProperty(value = "SkinColor") + private String skinColor; + @JsonProperty(value = "ThirdPartyNameOnly") + private boolean thirdPartyNameOnly; + public enum UIProfile { @JsonEnumDefaultValue CLASSIC, diff --git a/connector/src/main/java/org/geysermc/connector/utils/SkinProvider.java b/connector/src/main/java/org/geysermc/connector/utils/SkinProvider.java index 15cccf22..469ae758 100644 --- a/connector/src/main/java/org/geysermc/connector/utils/SkinProvider.java +++ b/connector/src/main/java/org/geysermc/connector/utils/SkinProvider.java @@ -223,7 +223,9 @@ public class SkinProvider { // if the requested image is an cape if (provider != null) { - image = image.getWidth() > 64 ? scale(image) : image; + while(image.getWidth() > 64) { + image = scale(image); + } BufferedImage newImage = new BufferedImage(64, 32, BufferedImage.TYPE_INT_RGB); Graphics g = newImage.createGraphics(); g.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null); diff --git a/connector/src/main/java/org/geysermc/connector/utils/SkinUtils.java b/connector/src/main/java/org/geysermc/connector/utils/SkinUtils.java index 1d0ee216..8e68d3e1 100644 --- a/connector/src/main/java/org/geysermc/connector/utils/SkinUtils.java +++ b/connector/src/main/java/org/geysermc/connector/utils/SkinUtils.java @@ -220,13 +220,14 @@ public class SkinUtils { byte[] geometryNameBytes = com.github.steveice10.mc.auth.util.Base64.decode(clientData.getGeometryName().getBytes("UTF-8")); byte[] geometryBytes = com.github.steveice10.mc.auth.util.Base64.decode(clientData.getGeometryData().getBytes("UTF-8")); - if (skinBytes.length <= (128 * 128 * 4)) { + if (skinBytes.length <= (128 * 128 * 4) && !clientData.isPersonaSkin()) { SkinProvider.storeBedrockSkin(playerEntity.getUuid(), data.getSkinUrl(), skinBytes); + SkinProvider.storeBedrockGeometry(playerEntity.getUuid(), geometryNameBytes, geometryBytes); } else { - GeyserConnector.getInstance().getLogger().info("Unable to load bedrock skin for '" + playerEntity.getUsername() + "' as they are using a customised skin"); + GeyserConnector.getInstance().getLogger().info("Unable to load bedrock skin for '" + playerEntity.getUsername() + "' as they are likely using a customised skin"); GeyserConnector.getInstance().getLogger().debug("The size of '" + playerEntity.getUsername() + "' skin is: " + clientData.getSkinImageWidth() + "x" + clientData.getSkinImageHeight()); } - SkinProvider.storeBedrockGeometry(playerEntity.getUuid(), geometryNameBytes, geometryBytes); + if (!clientData.getCapeId().equals("")) { SkinProvider.storeBedrockCape(playerEntity.getUuid(), capeBytes); }