@Override public ForgeClientHandshakeState send(PluginMessage message, UserConnection con) { // Client Hello. if ( message.getData()[0] == 1 ) { return this; } // Mod list. if ( message.getData()[0] == 2 ) { if ( con.getForgeClientHandler().getClientModList() == null ) { // This is the first Forge connection - so get the mods now. // Once we've done it, no point doing it again. Map<String, String> clientModList = ForgeUtils.readModList( message ); con.getForgeClientHandler().setClientModList( clientModList ); } return WAITINGSERVERDATA; } return this; }
@Override public ForgeServerHandshakeState send(PluginMessage message, UserConnection con) { if ( message.getData()[0] == 3 && message.getTag().equals( ForgeConstants.FML_HANDSHAKE_TAG ) ) { con.getForgeClientHandler().setServerIdList( message ); return this; } if ( message.getData()[0] == -1 && message.getTag().equals( ForgeConstants.FML_HANDSHAKE_TAG ) ) // transition to COMPLETE after sending ACK { return this; } if ( message.getTag().equals( ForgeConstants.FORGE_REGISTER ) ) // wait for Forge channel registration { return COMPLETE; } return this; } },
@Override public void handle(LoginSuccess loginSuccess) throws Exception { Preconditions.checkState( thisState == State.LOGIN_SUCCESS, "Not expecting LOGIN_SUCCESS" ); ch.setProtocol( Protocol.GAME ); thisState = State.LOGIN; // Only reset the Forge client when: // 1) The user is switching servers (so has a current server) // 2) The handshake is complete // 3) The user is currently on a modded server (if we are on a vanilla server, // we may be heading for another vanilla server, so we don't need to reset.) // // user.getServer() gets the user's CURRENT server, not the one we are trying // to connect to. // // We will reset the connection later if the current server is vanilla, and // we need to switch to a modded connection. However, we always need to reset the // connection when we have a modded server regardless of where we go - doing it // here makes sense. if ( user.getServer() != null && user.getForgeClientHandler().isHandshakeComplete() && user.getServer().isForgeServer() ) { user.getForgeClientHandler().resetHandshake(); } throw CancelSendSignal.INSTANCE; }
/** * 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() ); } } } }
@Override public ForgeClientHandshakeState handle(PluginMessage message, UserConnection con) { ForgeLogger.logClient( ForgeLogger.LogDirection.RECEIVED, this.name(), message ); con.unsafe().sendPacket( message ); con.getForgeClientHandler().setState( HELLO ); return HELLO; }
if ( user.getServer() != null && user.getForgeClientHandler().isHandshakeComplete() ) user.getForgeClientHandler().resetHandshake();
con.getForgeClientHandler().handle( pluginMessage ); throw CancelSendSignal.INSTANCE;
if ( user.getForgeClientHandler().getClientModList() == null && !user.getForgeClientHandler().isHandshakeComplete() ) // Vanilla user.getForgeClientHandler().setHandshakeComplete();
@Override public ForgeServerHandshakeState send(PluginMessage message, UserConnection con) { if ( message.getData()[0] == 3 && message.getTag().equals( ForgeConstants.FML_HANDSHAKE_TAG ) ) { con.getForgeClientHandler().setServerIdList( message ); return this; } if ( message.getData()[0] == -1 && message.getTag().equals( ForgeConstants.FML_HANDSHAKE_TAG ) ) // transition to COMPLETE after sending ACK { return this; } if ( message.getTag().equals( ForgeConstants.FORGE_REGISTER ) ) // wait for Forge channel registration { return COMPLETE; } return this; } },
@Override public void handle(LoginSuccess loginSuccess) throws Exception { Preconditions.checkState( thisState == State.LOGIN_SUCCESS, "Not expecting LOGIN_SUCCESS" ); ch.setProtocol( Protocol.GAME ); thisState = State.LOGIN; // Only reset the Forge client when: // 1) The user is switching servers (so has a current server) // 2) The handshake is complete // 3) The user is currently on a modded server (if we are on a vanilla server, // we may be heading for another vanilla server, so we don't need to reset.) // // user.getServer() gets the user's CURRENT server, not the one we are trying // to connect to. // // We will reset the connection later if the current server is vanilla, and // we need to switch to a modded connection. However, we always need to reset the // connection when we have a modded server regardless of where we go - doing it // here makes sense. if ( user.getServer() != null && user.getForgeClientHandler().isHandshakeComplete() && user.getServer().isForgeServer() ) { user.getForgeClientHandler().resetHandshake(); } throw CancelSendSignal.INSTANCE; }
@Override public ForgeClientHandshakeState handle(PluginMessage message, UserConnection con) { ForgeLogger.logClient( LogDirection.RECEIVED, this.name(), message ); con.unsafe().sendPacket( message ); con.getForgeClientHandler().setState( HELLO ); return HELLO; }
/** * 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() ); } } } }
if ( con.getForgeClientHandler().getClientModList() == null ) con.getForgeClientHandler().setClientModList( clientModList ); con.getForgeClientHandler().setForgeOutdated( true );
if ( user.getServer() != null && user.getForgeClientHandler().isHandshakeComplete() ) user.getForgeClientHandler().resetHandshake(); if (user.getForgeClientHandler().checkUserOutdated()) { ch.close(); user.getPendingConnects().remove(target);
con.getForgeClientHandler().handle( pluginMessage ); throw CancelSendSignal.INSTANCE;
if ( user.getForgeClientHandler().isFmlTokenInHandshake() )
if ( user.getForgeClientHandler().getClientModList() == null && !user.getForgeClientHandler().isHandshakeComplete() ) // Vanilla user.getForgeClientHandler().setHandshakeComplete();