Added async PreLoginEvent to change online mode per connection.

This commit is contained in:
zh32 2013-11-04 13:47:35 +01:00 committed by md_5
parent b4cd88c13d
commit a201b5897a
3 changed files with 81 additions and 8 deletions

View File

@ -43,4 +43,18 @@ public interface PendingConnection extends Connection
* @return the UUID * @return the UUID
*/ */
String getUUID(); String getUUID();
/**
* Get this connection's online mode.
*
* @return the online mode
*/
boolean isOnlineMode();
/**
* Set this connection's online mode.
*
* @param onlineMode
*/
void setOnlineMode(boolean onlineMode);
} }

View File

@ -0,0 +1,37 @@
package net.md_5.bungee.api.event;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import net.md_5.bungee.api.Callback;
import net.md_5.bungee.api.connection.PendingConnection;
import net.md_5.bungee.api.plugin.Cancellable;
/**
* Event called to represent a player first making their presence and username
* known.
*/
@Data
@ToString(callSuper = false)
@EqualsAndHashCode(callSuper = false)
public class PreLoginEvent extends AsyncEvent<PreLoginEvent> implements Cancellable {
/**
* Cancelled state.
*/
private boolean cancelled;
/**
* Message to use when kicking if this event is canceled.
*/
private String cancelReason;
/**
* Connection attempting to login.
*/
private final PendingConnection connection;
public PreLoginEvent(PendingConnection connection, Callback<PreLoginEvent> done)
{
super( done );
this.connection = connection;
}
}

View File

@ -13,6 +13,7 @@ import javax.crypto.Cipher;
import javax.crypto.SecretKey; import javax.crypto.SecretKey;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.Setter;
import net.md_5.bungee.BungeeCord; import net.md_5.bungee.BungeeCord;
import net.md_5.bungee.EncryptionUtil; import net.md_5.bungee.EncryptionUtil;
import net.md_5.bungee.UserConnection; import net.md_5.bungee.UserConnection;
@ -44,6 +45,7 @@ import net.md_5.bungee.protocol.packet.EncryptionRequest;
import net.md_5.bungee.protocol.packet.Kick; import net.md_5.bungee.protocol.packet.Kick;
import net.md_5.bungee.api.AbstractReconnectHandler; import net.md_5.bungee.api.AbstractReconnectHandler;
import net.md_5.bungee.api.event.PlayerHandshakeEvent; import net.md_5.bungee.api.event.PlayerHandshakeEvent;
import net.md_5.bungee.api.event.PreLoginEvent;
import net.md_5.bungee.protocol.Protocol; import net.md_5.bungee.protocol.Protocol;
import net.md_5.bungee.protocol.packet.LegacyPing; import net.md_5.bungee.protocol.packet.LegacyPing;
import net.md_5.bungee.protocol.packet.LoginRequest; import net.md_5.bungee.protocol.packet.LoginRequest;
@ -251,7 +253,21 @@ public class InitialHandler extends PacketHandler implements PendingConnection
// TODO: Nuuuu Mojang why u do this // TODO: Nuuuu Mojang why u do this
// unsafe().sendPacket( PacketConstants.I_AM_BUNGEE ); // unsafe().sendPacket( PacketConstants.I_AM_BUNGEE );
// unsafe().sendPacket( PacketConstants.FORGE_MOD_REQUEST ); // unsafe().sendPacket( PacketConstants.FORGE_MOD_REQUEST );
if ( this.onlineMode ) Callback<PreLoginEvent> callback = new Callback<PreLoginEvent>()
{
@Override
public void done(PreLoginEvent result, Throwable error)
{
if ( result.isCancelled() )
{
disconnect( result.getCancelReason() );
}
if ( ch.isClosed() )
{
return;
}
if ( InitialHandler.this.onlineMode )
{ {
unsafe().sendPacket( request = EncryptionUtil.encryptRequest() ); unsafe().sendPacket( request = EncryptionUtil.encryptRequest() );
} else } else
@ -260,6 +276,11 @@ public class InitialHandler extends PacketHandler implements PendingConnection
} }
thisState = State.ENCRYPT; thisState = State.ENCRYPT;
} }
};
// fire pre login event
bungee.getPluginManager().callEvent( new PreLoginEvent( InitialHandler.this, callback ) );
}
@Override @Override
public void handle(final EncryptionResponse encryptResponse) throws Exception public void handle(final EncryptionResponse encryptResponse) throws Exception
@ -417,9 +438,10 @@ public class InitialHandler extends PacketHandler implements PendingConnection
return unsafe; return unsafe;
} }
@Override
public void setOnlineMode(boolean onlineMode) public void setOnlineMode(boolean onlineMode)
{ {
Preconditions.checkState( thisState == State.HANDSHAKE, "Can only set online mode status whilst handshaking" ); Preconditions.checkState( thisState == State.USERNAME, "Can only set online mode status whilst state is username" );
this.onlineMode = onlineMode; this.onlineMode = onlineMode;
} }