diff --git a/bungee/src/main/java/org/geysermc/floodgate/pluginmessage/BungeeSkinApplier.java b/bungee/src/main/java/org/geysermc/floodgate/pluginmessage/BungeeSkinApplier.java index ee10c47a..5c0dce97 100644 --- a/bungee/src/main/java/org/geysermc/floodgate/pluginmessage/BungeeSkinApplier.java +++ b/bungee/src/main/java/org/geysermc/floodgate/pluginmessage/BungeeSkinApplier.java @@ -26,6 +26,7 @@ package org.geysermc.floodgate.pluginmessage; import static com.google.common.base.Preconditions.checkNotNull; +import static org.geysermc.floodgate.util.ReflectionUtils.getConstructor; import static org.geysermc.floodgate.util.ReflectionUtils.getFieldOfType; import static org.geysermc.floodgate.util.ReflectionUtils.getMethodByName; @@ -46,6 +47,7 @@ import org.geysermc.floodgate.util.ReflectionUtils; @RequiredArgsConstructor public final class BungeeSkinApplier implements SkinApplier { + private static final Constructor LOGIN_RESULT_CONSTRUCTOR; private static final Field LOGIN_RESULT_FIELD; private static final Method SET_PROPERTIES_METHOD; @@ -53,15 +55,20 @@ public final class BungeeSkinApplier implements SkinApplier { private static final Constructor PROPERTY_CONSTRUCTOR; static { + PROPERTY_CLASS = ReflectionUtils.getClassOrFallbackPrefixed( + "protocol.Property", "connection.LoginResult$Property" + ); + + LOGIN_RESULT_CONSTRUCTOR = getConstructor( + LoginResult.class, true, + String.class, String.class, Array.newInstance(PROPERTY_CLASS, 0).getClass() + ); + LOGIN_RESULT_FIELD = getFieldOfType(InitialHandler.class, LoginResult.class); checkNotNull(LOGIN_RESULT_FIELD, "LoginResult field cannot be null"); SET_PROPERTIES_METHOD = getMethodByName(LoginResult.class, "setProperties", true); - PROPERTY_CLASS = ReflectionUtils.getClassOrFallbackPrefixed( - "protocol.Property", "connection.LoginResult.Property" - ); - PROPERTY_CONSTRUCTOR = ReflectionUtils.getConstructor( PROPERTY_CLASS, true, String.class, String.class, String.class @@ -91,7 +98,9 @@ public final class BungeeSkinApplier implements SkinApplier { // which Floodgate players don't have if (loginResult == null) { // id and name are unused and properties will be overridden - loginResult = new LoginResult(null, null, null); + loginResult = (LoginResult) ReflectionUtils.newInstance( + LOGIN_RESULT_CONSTRUCTOR, null, null, null + ); ReflectionUtils.setValue(handler, LOGIN_RESULT_FIELD, loginResult); } diff --git a/core/src/main/java/org/geysermc/floodgate/config/FloodgateConfig.java b/core/src/main/java/org/geysermc/floodgate/config/FloodgateConfig.java index 167c40f6..b7b6b866 100644 --- a/core/src/main/java/org/geysermc/floodgate/config/FloodgateConfig.java +++ b/core/src/main/java/org/geysermc/floodgate/config/FloodgateConfig.java @@ -40,7 +40,7 @@ import org.geysermc.configutils.loader.callback.GenericPostInitializeCallback; @Getter public class FloodgateConfig implements GenericPostInitializeCallback { private String keyFileName; - private String usernamePrefix; + private String usernamePrefix = ""; private boolean replaceSpaces; private String defaultLocale;