diff --git a/gameserver/src/main/java/brainwine/gameserver/entity/player/PlayerManager.java b/gameserver/src/main/java/brainwine/gameserver/entity/player/PlayerManager.java index d8f9534..d2516f2 100644 --- a/gameserver/src/main/java/brainwine/gameserver/entity/player/PlayerManager.java +++ b/gameserver/src/main/java/brainwine/gameserver/entity/player/PlayerManager.java @@ -16,7 +16,6 @@ import com.fasterxml.jackson.databind.InjectableValues; import brainwine.gameserver.GameServer; import brainwine.gameserver.server.pipeline.Connection; -import brainwine.gameserver.zone.Zone; import brainwine.shared.JsonHelper; public class PlayerManager { @@ -139,35 +138,8 @@ public class PlayerManager { return false; } - public void onPlayerAuthenticate(Connection connection, String version, String name, String authToken) { - if(!SUPPORTED_VERSIONS.contains(version)) { - connection.kick("Sorry, this version of Deepworld is not supported.", false); - return; - } - - Player player = getPlayer(name); - - if(!verifyAuthToken(name, authToken)) { - connection.kick("The session token is either invalid or has expired. Please try relogging."); - return; - } - - player.setConnection(connection); - player.setClientVersion(version); - playersByConnection.put(connection, player); - Zone zone = player.getZone(); - - if(zone == null) { - // TODO default zone 'n stuff. - zone = GameServer.getInstance().getZoneManager().getRandomZone(); - } - - if(zone == null) { - player.kick("No default zone could be found."); - return; - } - - zone.addPlayer(player); + public void onPlayerConnect(Player player) { + playersByConnection.put(player.getConnection(), player); } public void onPlayerDisconnect(Player player) { diff --git a/gameserver/src/main/java/brainwine/gameserver/server/pipeline/Connection.java b/gameserver/src/main/java/brainwine/gameserver/server/pipeline/Connection.java index dc68d8a..d4a8056 100644 --- a/gameserver/src/main/java/brainwine/gameserver/server/pipeline/Connection.java +++ b/gameserver/src/main/java/brainwine/gameserver/server/pipeline/Connection.java @@ -2,6 +2,7 @@ package brainwine.gameserver.server.pipeline; import java.net.SocketAddress; import java.nio.channels.ClosedChannelException; +import java.util.concurrent.Callable; import java.util.concurrent.TimeUnit; import org.apache.logging.log4j.LogManager; @@ -17,6 +18,8 @@ import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; +import io.netty.util.concurrent.Future; +import io.netty.util.concurrent.FutureListener; public class Connection extends SimpleChannelInboundHandler { @@ -60,6 +63,14 @@ public class Connection extends SimpleChannelInboundHandler { //kick(error); } + public Future submitTask(Runnable task) { + return channel.eventLoop().submit(task); + } + + public Future submitTask(Callable task) { + return channel.eventLoop().submit(task); + } + public ChannelFuture sendMessage(Message message) { return channel.writeAndFlush(message).addListener(ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE); } diff --git a/gameserver/src/main/java/brainwine/gameserver/server/requests/AuthenticateRequest.java b/gameserver/src/main/java/brainwine/gameserver/server/requests/AuthenticateRequest.java index 6768e7d..be8f7a5 100644 --- a/gameserver/src/main/java/brainwine/gameserver/server/requests/AuthenticateRequest.java +++ b/gameserver/src/main/java/brainwine/gameserver/server/requests/AuthenticateRequest.java @@ -2,8 +2,11 @@ package brainwine.gameserver.server.requests; import brainwine.gameserver.GameServer; import brainwine.gameserver.server.OptionalField; +import brainwine.gameserver.entity.player.Player; +import brainwine.gameserver.entity.player.PlayerManager; import brainwine.gameserver.server.Request; import brainwine.gameserver.server.pipeline.Connection; +import brainwine.gameserver.zone.Zone; public class AuthenticateRequest extends Request { @@ -16,6 +19,40 @@ public class AuthenticateRequest extends Request { @Override public void process(Connection connection) { - GameServer.getInstance().getPlayerManager().onPlayerAuthenticate(connection, version, name, authToken); + GameServer server = GameServer.getInstance(); + PlayerManager playerManager = server.getPlayerManager(); + + if(!PlayerManager.SUPPORTED_VERSIONS.contains(version)) { + connection.kick("Sorry, this version of Deepworld is not supported."); + return; + } + + connection.submitTask(() -> playerManager.verifyAuthToken(name, authToken)).addListener(future -> { + // TODO can this err? + if(!(boolean)future.get()) { + connection.kick("The provided session token is invalid or has expired. Please try relogging."); + return; + } + + server.queueSynchronousTask(() -> { + Player player = playerManager.getPlayer(name); + player.setConnection(connection); + player.setClientVersion(version); + playerManager.onPlayerConnect(player); + Zone zone = player.getZone(); + + if(zone == null) { + // TODO default zone 'n stuff. + zone = server.getZoneManager().getRandomZone(); + } + + if(zone == null) { + player.kick("No default zone could be found."); + return; + } + + zone.addEntity(player); + }); + }); } }