package net.md_5.bungee.forge; import java.util.ArrayDeque; import lombok.AccessLevel; import lombok.Getter; import lombok.RequiredArgsConstructor; import net.md_5.bungee.UserConnection; import net.md_5.bungee.api.config.ServerInfo; import net.md_5.bungee.forge.ForgeLogger.LogDirection; import net.md_5.bungee.netty.ChannelWrapper; import net.md_5.bungee.protocol.packet.PluginMessage; /** * Contains data about the Forge server, and handles the handshake. */ @RequiredArgsConstructor public class ForgeServerHandler { private final UserConnection con; @Getter private final ChannelWrapper ch; @Getter(AccessLevel.PACKAGE) private final ServerInfo serverInfo; @Getter private ForgeServerHandshakeState state = ForgeServerHandshakeState.START; @Getter private boolean serverForge = false; private final ArrayDeque<PluginMessage> packetQueue = new ArrayDeque<PluginMessage>(); /** * Handles any {@link PluginMessage} that contains a FML Handshake or Forge * Register. * * @param message The message to handle. * @throws IllegalArgumentException If the wrong packet is sent down. */ public void handle(PluginMessage message) throws IllegalArgumentException { if ( !message.getTag().equalsIgnoreCase( ForgeConstants.FML_HANDSHAKE_TAG ) && !message.getTag().equalsIgnoreCase( ForgeConstants.FORGE_REGISTER ) ) { throw new IllegalArgumentException( "Expecting a Forge REGISTER or FML Handshake packet." ); } message.setAllowExtendedPacket( true ); // FML allows extended packets so this must be enabled ForgeServerHandshakeState prevState = state; packetQueue.add( message ); state = state.send( message, con ); if ( state != prevState ) // send packets { synchronized ( packetQueue ) { while ( !packetQueue.isEmpty() ) { ForgeLogger.logServer( LogDirection.SENDING, prevState.name(), packetQueue.getFirst() ); con.getForgeClientHandler().receive( packetQueue.removeFirst() ); } } } } /** * Receives a {@link PluginMessage} from ForgeClientData to pass to Server. * * @param message The message to being received. */ public void receive(PluginMessage message) throws IllegalArgumentException { state = state.handle( message, ch ); } /** * Flags the server as a Forge server. Cannot be used to set a server back * to vanilla (there would be no need) */ public void setServerAsForgeServer() { serverForge = true; } }