diff --git a/bungee/src/main/java/org/geysermc/floodgate/listener/BungeeListener.java b/bungee/src/main/java/org/geysermc/floodgate/listener/BungeeListener.java index 9dff252b..9b3eea51 100644 --- a/bungee/src/main/java/org/geysermc/floodgate/listener/BungeeListener.java +++ b/bungee/src/main/java/org/geysermc/floodgate/listener/BungeeListener.java @@ -36,6 +36,7 @@ import java.util.UUID; import net.md_5.bungee.api.connection.PendingConnection; import net.md_5.bungee.api.event.LoginEvent; import net.md_5.bungee.api.event.PlayerDisconnectEvent; +import net.md_5.bungee.api.event.PostLoginEvent; import net.md_5.bungee.api.event.PreLoginEvent; import net.md_5.bungee.api.plugin.Listener; import net.md_5.bungee.connection.InitialHandler; @@ -46,6 +47,8 @@ import org.geysermc.floodgate.api.ProxyFloodgateApi; import org.geysermc.floodgate.api.logger.FloodgateLogger; import org.geysermc.floodgate.api.player.FloodgatePlayer; import org.geysermc.floodgate.player.FloodgatePlayerImpl; +import org.geysermc.floodgate.skin.SkinApplier; +import org.geysermc.floodgate.skin.SkinData; import org.geysermc.floodgate.util.BungeeCommandUtil; import org.geysermc.floodgate.util.LanguageManager; import org.geysermc.floodgate.util.ReflectionUtils; @@ -67,6 +70,7 @@ public final class BungeeListener implements Listener { @Inject private ProxyFloodgateApi api; @Inject private LanguageManager languageManager; @Inject private FloodgateLogger logger; + @Inject private SkinApplier skinApplier; @Inject @Named("playerAttribute") @@ -121,6 +125,15 @@ public final class BungeeListener implements Listener { } } + @EventHandler(priority = EventPriority.LOWEST) + public void onPostLogin(PostLoginEvent event) { + // To fix the February 2 2022 Mojang authentication changes + FloodgatePlayer player = api.getPlayer(event.getPlayer().getUniqueId()); + if (player != null) { + skinApplier.applySkin(player, new SkinData("", "")); + } + } + @EventHandler(priority = EventPriority.HIGHEST) public void onPlayerDisconnect(PlayerDisconnectEvent event) { api.playerRemoved(event.getPlayer().getUniqueId()); 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 e0b67f03..3a10b764 100644 --- a/bungee/src/main/java/org/geysermc/floodgate/pluginmessage/BungeeSkinApplier.java +++ b/bungee/src/main/java/org/geysermc/floodgate/pluginmessage/BungeeSkinApplier.java @@ -25,6 +25,10 @@ package org.geysermc.floodgate.pluginmessage; +import static org.geysermc.floodgate.util.ReflectionUtils.getFieldOfType; +import static org.geysermc.floodgate.util.ReflectionUtils.setValue; + +import java.lang.reflect.Field; import lombok.RequiredArgsConstructor; import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.connection.ProxiedPlayer; @@ -38,6 +42,12 @@ import org.geysermc.floodgate.skin.SkinData; @RequiredArgsConstructor public final class BungeeSkinApplier implements SkinApplier { + private static final Field LOGIN_RESULT; + + static { + LOGIN_RESULT = getFieldOfType(InitialHandler.class, LoginResult.class); + } + private final FloodgateLogger logger; @Override @@ -61,6 +71,7 @@ public final class BungeeSkinApplier implements SkinApplier { if (loginResult == null) { // id and name are unused and properties will be overridden loginResult = new LoginResult(null, null, null); + setValue(handler, LOGIN_RESULT, loginResult); } Property property = new Property("textures", skinData.getValue(), skinData.getSignature()); diff --git a/core/src/main/java/org/geysermc/floodgate/platform/command/TranslatableMessage.java b/core/src/main/java/org/geysermc/floodgate/platform/command/TranslatableMessage.java index 306ed564..ee51f498 100644 --- a/core/src/main/java/org/geysermc/floodgate/platform/command/TranslatableMessage.java +++ b/core/src/main/java/org/geysermc/floodgate/platform/command/TranslatableMessage.java @@ -28,8 +28,8 @@ package org.geysermc.floodgate.platform.command; import org.geysermc.floodgate.util.LanguageManager; /** - * TranslatableMessage is the interface for a message that can be translated. - * Messages are generally implemented using enums. + * TranslatableMessage is the interface for a message that can be translated. Messages are generally + * implemented using enums. */ public interface TranslatableMessage { /** @@ -52,7 +52,7 @@ public interface TranslatableMessage { for (int i = 0; i < translateParts.length; i++) { builder.append(manager.getString(translateParts[i], locale, args)); if (translateParts.length != i + 1) { - builder.append(" "); + builder.append(' '); } } return builder.toString(); diff --git a/core/src/main/java/org/geysermc/floodgate/player/UserAudienceArgument.java b/core/src/main/java/org/geysermc/floodgate/player/UserAudienceArgument.java index 6bebeb3b..10d78a74 100644 --- a/core/src/main/java/org/geysermc/floodgate/player/UserAudienceArgument.java +++ b/core/src/main/java/org/geysermc/floodgate/player/UserAudienceArgument.java @@ -111,7 +111,7 @@ public final class UserAudienceArgument extends CommandArgument "textures".equals(prop.getName()))) { + return; + } + + Set properties = new HashSet<>(event.getPlayerProfile().getProperties()); + properties.add(new ProfileProperty("textures", "", "")); + event.setProperties(properties); + } +} diff --git a/spigot/src/main/java/org/geysermc/floodgate/listener/SpigotListenerRegistration.java b/spigot/src/main/java/org/geysermc/floodgate/listener/SpigotListenerRegistration.java index d3052286..acc26c4f 100644 --- a/spigot/src/main/java/org/geysermc/floodgate/listener/SpigotListenerRegistration.java +++ b/spigot/src/main/java/org/geysermc/floodgate/listener/SpigotListenerRegistration.java @@ -38,6 +38,10 @@ public final class SpigotListenerRegistration implements ListenerRegistration
  • >() {}).asEagerSingleton(); + } + + @Singleton + @ProvidesIntoSet + public Listener paperProfileListener() { + return new PaperProfileListener(); + } +} diff --git a/spigot/src/main/java/org/geysermc/floodgate/module/SpigotListenerModule.java b/spigot/src/main/java/org/geysermc/floodgate/module/SpigotListenerModule.java index 41035211..ba9e64e6 100644 --- a/spigot/src/main/java/org/geysermc/floodgate/module/SpigotListenerModule.java +++ b/spigot/src/main/java/org/geysermc/floodgate/module/SpigotListenerModule.java @@ -33,7 +33,7 @@ import org.bukkit.event.Listener; import org.geysermc.floodgate.listener.SpigotListener; import org.geysermc.floodgate.register.ListenerRegister; -public final class SpigotListenerModule extends AbstractModule { +public class SpigotListenerModule extends AbstractModule { @Override protected void configure() { bind(new TypeLiteral>() {}).asEagerSingleton(); diff --git a/velocity/src/main/java/org/geysermc/floodgate/listener/VelocityListener.java b/velocity/src/main/java/org/geysermc/floodgate/listener/VelocityListener.java index 7ee887fa..65287304 100644 --- a/velocity/src/main/java/org/geysermc/floodgate/listener/VelocityListener.java +++ b/velocity/src/main/java/org/geysermc/floodgate/listener/VelocityListener.java @@ -44,10 +44,11 @@ import com.velocitypowered.api.event.connection.PreLoginEvent; import com.velocitypowered.api.event.player.GameProfileRequestEvent; import com.velocitypowered.api.proxy.InboundConnection; import com.velocitypowered.api.util.GameProfile; +import com.velocitypowered.api.util.GameProfile.Property; import io.netty.channel.Channel; import io.netty.util.AttributeKey; import java.lang.reflect.Field; -import java.util.ArrayList; +import java.util.Collections; import java.util.Objects; import java.util.concurrent.TimeUnit; import net.kyori.adventure.text.Component; @@ -141,8 +142,10 @@ public final class VelocityListener { FloodgatePlayer player = playerCache.getIfPresent(event.getConnection()); if (player != null) { playerCache.invalidate(event.getConnection()); - event.setGameProfile(new GameProfile( - player.getCorrectUniqueId(), player.getCorrectUsername(), new ArrayList<>())); + // The texture properties addition is to fix the February 2 2022 Mojang authentication changes + event.setGameProfile(new GameProfile(player.getCorrectUniqueId(), + player.getCorrectUsername(), Collections.singletonList( + new Property("textures", "", "")))); } }