diff --git a/bukkit/pom.xml b/bukkit/pom.xml index cb63fe58..88aa979e 100644 --- a/bukkit/pom.xml +++ b/bukkit/pom.xml @@ -16,6 +16,10 @@ spigot-repo https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + Jitpack + https://jitpack.io + @@ -43,6 +47,12 @@ ${project.version} compile + + com.github.ProtocolSupport + ProtocolSupport + 5f712a969a + provided + diff --git a/bukkit/src/main/java/org/geysermc/floodgate/BukkitPlugin.java b/bukkit/src/main/java/org/geysermc/floodgate/BukkitPlugin.java index 54430af0..0f13628a 100644 --- a/bukkit/src/main/java/org/geysermc/floodgate/BukkitPlugin.java +++ b/bukkit/src/main/java/org/geysermc/floodgate/BukkitPlugin.java @@ -14,6 +14,7 @@ import org.geysermc.floodgate.command.LinkAccountCommand; import org.geysermc.floodgate.command.UnlinkAccountCommand; import org.geysermc.floodgate.injector.BukkitInjector; import org.geysermc.floodgate.util.CommandUtil; +import org.geysermc.floodgate.util.ProtocolSupportUtil; import org.geysermc.floodgate.util.ReflectionUtil; import java.util.logging.Level; @@ -52,6 +53,9 @@ public class BukkitPlugin extends JavaPlugin implements Listener { // Register the plugin as an event listener to we get join and leave events Bukkit.getServer().getPluginManager().registerEvents(this, this); + + // Check for ProtocolSupport + ProtocolSupportUtil.checkForProtocolSupport(this); } @Override diff --git a/bukkit/src/main/java/org/geysermc/floodgate/PacketHandler.java b/bukkit/src/main/java/org/geysermc/floodgate/PacketHandler.java index e709c57b..c10038d7 100644 --- a/bukkit/src/main/java/org/geysermc/floodgate/PacketHandler.java +++ b/bukkit/src/main/java/org/geysermc/floodgate/PacketHandler.java @@ -7,7 +7,10 @@ import lombok.RequiredArgsConstructor; import org.geysermc.floodgate.HandshakeHandler.HandshakeResult; import org.geysermc.floodgate.injector.BukkitInjector; import org.geysermc.floodgate.util.BedrockData; +import org.geysermc.floodgate.util.ProtocolSupportUtil; import org.geysermc.floodgate.util.ReflectionUtil; +import protocolsupport.protocol.ConnectionImpl; +import protocolsupport.protocol.packet.handler.AbstractLoginListener; import java.lang.reflect.Constructor; import java.lang.reflect.Field; @@ -94,7 +97,7 @@ public class PacketHandler extends SimpleChannelInboundHandler { } plugin.getLogger().info("Added " + fPlayer.getCorrectUsername() + " " + fPlayer.getCorrectUniqueId()); } else if (isLogin) { - if (!bungee) { + if (!bungee && !ProtocolSupportUtil.isProtocolSupport) { // we have to fake the offline player cycle Object loginListener = packetListenerField.get(networkManager); @@ -106,6 +109,14 @@ public class PacketHandler extends SimpleChannelInboundHandler { fireEventsMethod.invoke(loginHandlerConstructor.newInstance(loginListener)); // new LoginHandler().fireEvents(); setValue(loginListener, protocolStateField, readyToAcceptState); // LoginLister#protocolState = READY_TO_ACCEPT // The tick of LoginListener will do the rest + } else if (ProtocolSupportUtil.isProtocolSupport && !bungee) { // Has to be managed separately or else we get kicked + ConnectionImpl connection = ConnectionImpl.getFromChannel(ctx.channel()); + // Set correct UUID and name on PS's end + connection.getLoginProfile().setName(fPlayer.getCorrectUsername()); + connection.getLoginProfile().setOriginalName(fPlayer.getCorrectUsername()); + connection.getLoginProfile().setUUID(fPlayer.getCorrectUniqueId()); + connection.getLoginProfile().setOriginalUUID(fPlayer.getCorrectUniqueId()); + ((AbstractLoginListener) connection.getNetworkManagerWrapper().getPacketListener()).handleLoginStart(fPlayer.getCorrectUsername()); } } } finally { diff --git a/bukkit/src/main/java/org/geysermc/floodgate/util/ProtocolSupportUtil.java b/bukkit/src/main/java/org/geysermc/floodgate/util/ProtocolSupportUtil.java new file mode 100644 index 00000000..9c6570e6 --- /dev/null +++ b/bukkit/src/main/java/org/geysermc/floodgate/util/ProtocolSupportUtil.java @@ -0,0 +1,34 @@ +package org.geysermc.floodgate.util; + +import org.bukkit.Bukkit; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.plugin.Plugin; +import org.geysermc.floodgate.FloodgateAPI; +import protocolsupport.api.events.PlayerLoginStartEvent; + +public class ProtocolSupportUtil implements Listener { + + public static boolean isProtocolSupport = false; + + public static void checkForProtocolSupport(Plugin floodgate) { + if (Bukkit.getServer().getPluginManager().getPlugin("ProtocolSupport") != null) { + isProtocolSupport = true; + Bukkit.getServer().getPluginManager().registerEvents(new ProtocolSupportUtil(), floodgate); + } + } + + /** + * Force ProtocolSupport to handle Bedrock users in offline mode, otherwise they kick us + * @param event ProtocolSupport's player login start event + */ + @EventHandler(priority = EventPriority.MONITOR) + public void onLoginStart(final PlayerLoginStartEvent event) { + if (event.getConnection().getProfile().getUUID() == null) return; // A normal player that doesn't have a UUID set + if (FloodgateAPI.isBedrockPlayer(event.getConnection().getProfile().getUUID())) { + event.setOnlineMode(false); // Otherwise ProtocolSupport attempts to connect with online mode + } + } + +} diff --git a/bukkit/src/main/resources/plugin.yml b/bukkit/src/main/resources/plugin.yml index f2f6bb79..5dc87e30 100644 --- a/bukkit/src/main/resources/plugin.yml +++ b/bukkit/src/main/resources/plugin.yml @@ -5,6 +5,7 @@ author: ${project.organization.name} website: ${project.url} main: org.geysermc.floodgate.BukkitPlugin api-version: 1.13 +softdepend: ["ProtocolSupport"] commands: linkaccount: description: Link your Java and Bedrock accounts