mirror of
https://github.com/2006-Scape/apollo.git
synced 2026-07-06 08:40:03 +00:00
New players will be queued rather than added right away.
This commit is contained in:
@@ -298,24 +298,14 @@ public final class World {
|
|||||||
* Registers the specified player.
|
* Registers the specified player.
|
||||||
*
|
*
|
||||||
* @param player The player.
|
* @param player The player.
|
||||||
* @return A {@link RegistrationStatus}.
|
|
||||||
*/
|
*/
|
||||||
public RegistrationStatus register(Player player) {
|
public void register(Player player) {
|
||||||
String username = player.getUsername();
|
String username = player.getUsername();
|
||||||
if (isPlayerOnline(username)) {
|
|
||||||
return RegistrationStatus.ALREADY_ONLINE;
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean success = playerRepository.add(player);
|
playerRepository.add(player);
|
||||||
if (success) {
|
players.put(NameUtil.encodeBase37(username), player);
|
||||||
players.put(NameUtil.encodeBase37(username), player);
|
|
||||||
|
|
||||||
logger.info("Registered player: " + player + " [count=" + playerRepository.size() + "]");
|
logger.info("Registered player: " + player + " [count=" + playerRepository.size() + "]");
|
||||||
return RegistrationStatus.OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.warning("Failed to register player: " + player + " [count=" + playerRepository.size() + "]");
|
|
||||||
return RegistrationStatus.WORLD_FULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ import org.apollo.game.message.impl.UpdateRunEnergyMessage;
|
|||||||
import org.apollo.game.model.Appearance;
|
import org.apollo.game.model.Appearance;
|
||||||
import org.apollo.game.model.Position;
|
import org.apollo.game.model.Position;
|
||||||
import org.apollo.game.model.World;
|
import org.apollo.game.model.World;
|
||||||
|
import org.apollo.game.model.World.RegistrationStatus;
|
||||||
import org.apollo.game.model.entity.attr.Attribute;
|
import org.apollo.game.model.entity.attr.Attribute;
|
||||||
import org.apollo.game.model.entity.attr.AttributeDefinition;
|
import org.apollo.game.model.entity.attr.AttributeDefinition;
|
||||||
import org.apollo.game.model.entity.attr.AttributeMap;
|
import org.apollo.game.model.entity.attr.AttributeMap;
|
||||||
@@ -602,6 +603,24 @@ public final class Player extends Mob {
|
|||||||
return withdrawingNotes;
|
return withdrawingNotes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines the {@link RegistrationStatus} for this player. This method
|
||||||
|
* can remain lock-free since writes to the player {@link MobRepository} are
|
||||||
|
* only happening on the game thread.
|
||||||
|
*
|
||||||
|
* @return The status.
|
||||||
|
*/
|
||||||
|
public RegistrationStatus getRegistrationStatus() {
|
||||||
|
MobRepository<Player> repository = world.getPlayerRepository();
|
||||||
|
|
||||||
|
if (world.isPlayerOnline(getUsername())) {
|
||||||
|
return RegistrationStatus.ALREADY_ONLINE;
|
||||||
|
} else if (repository.capacity() == repository.size()) {
|
||||||
|
return RegistrationStatus.WORLD_FULL;
|
||||||
|
}
|
||||||
|
return RegistrationStatus.OK;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Logs the player out, if possible.
|
* Logs the player out, if possible.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -15,7 +15,6 @@ import org.apollo.game.GamePulseHandler;
|
|||||||
import org.apollo.game.io.MessageHandlerChainSetParser;
|
import org.apollo.game.io.MessageHandlerChainSetParser;
|
||||||
import org.apollo.game.message.handler.MessageHandlerChainSet;
|
import org.apollo.game.message.handler.MessageHandlerChainSet;
|
||||||
import org.apollo.game.model.World;
|
import org.apollo.game.model.World;
|
||||||
import org.apollo.game.model.World.RegistrationStatus;
|
|
||||||
import org.apollo.game.model.area.Region;
|
import org.apollo.game.model.area.Region;
|
||||||
import org.apollo.game.model.entity.MobRepository;
|
import org.apollo.game.model.entity.MobRepository;
|
||||||
import org.apollo.game.model.entity.Player;
|
import org.apollo.game.model.entity.Player;
|
||||||
@@ -39,6 +38,11 @@ public final class GameService extends Service {
|
|||||||
*/
|
*/
|
||||||
private static final int UNREGISTERS_PER_CYCLE = 50;
|
private static final int UNREGISTERS_PER_CYCLE = 50;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The number of times to register players per cycle.
|
||||||
|
*/
|
||||||
|
private static final int REGISTERS_PER_CYCLE = 25;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The World this Service is for.
|
* The World this Service is for.
|
||||||
*/
|
*/
|
||||||
@@ -49,6 +53,11 @@ public final class GameService extends Service {
|
|||||||
*/
|
*/
|
||||||
private final Queue<Player> oldPlayers = new ConcurrentLinkedQueue<>();
|
private final Queue<Player> oldPlayers = new ConcurrentLinkedQueue<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A queue of players to add.
|
||||||
|
*/
|
||||||
|
private final Queue<Player> newPlayers = new ConcurrentLinkedQueue<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The scheduled executor service.
|
* The scheduled executor service.
|
||||||
*/
|
*/
|
||||||
@@ -85,6 +94,21 @@ public final class GameService extends Service {
|
|||||||
world.unregister(player);
|
world.unregister(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finalizes the registration of a player.
|
||||||
|
*
|
||||||
|
* @param player The player.
|
||||||
|
*/
|
||||||
|
public void finalizePlayerRegistration(Player player) {
|
||||||
|
world.register(player);
|
||||||
|
Region region = world.getRegionRepository().fromPosition(player.getPosition());
|
||||||
|
region.addEntity(player);
|
||||||
|
|
||||||
|
if (player.getSession().isReconnecting()) {
|
||||||
|
player.sendInitialMessages();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the MessageHandlerChainSet
|
* Gets the MessageHandlerChainSet
|
||||||
*
|
*
|
||||||
@@ -97,7 +121,8 @@ public final class GameService extends Service {
|
|||||||
/**
|
/**
|
||||||
* Called every pulse.
|
* Called every pulse.
|
||||||
*/
|
*/
|
||||||
public synchronized void pulse() {
|
public void pulse() {
|
||||||
|
finalizeRegistrations();
|
||||||
finalizeUnregistrations();
|
finalizeUnregistrations();
|
||||||
|
|
||||||
MobRepository<Player> players = world.getPlayerRepository();
|
MobRepository<Player> players = world.getPlayerRepository();
|
||||||
@@ -112,25 +137,6 @@ public final class GameService extends Service {
|
|||||||
synchronizer.synchronize(players, world.getNpcRepository());
|
synchronizer.synchronize(players, world.getNpcRepository());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a {@link Player} (may block!).
|
|
||||||
*
|
|
||||||
* @param player The Player.
|
|
||||||
* @param session The {@link GameSession} of the Player.
|
|
||||||
* @return A {@link RegistrationStatus}.
|
|
||||||
*/
|
|
||||||
public synchronized RegistrationStatus registerPlayer(Player player, GameSession session) {
|
|
||||||
RegistrationStatus status = world.register(player);
|
|
||||||
if (status == RegistrationStatus.OK) {
|
|
||||||
player.setSession(session);
|
|
||||||
|
|
||||||
Region region = world.getRegionRepository().fromPosition(player.getPosition());
|
|
||||||
region.addEntity(player);
|
|
||||||
}
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Shuts down this game service.
|
* Shuts down this game service.
|
||||||
*
|
*
|
||||||
@@ -156,6 +162,15 @@ public final class GameService extends Service {
|
|||||||
oldPlayers.add(player);
|
oldPlayers.add(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers a player. Returns immediately. The player is registered at the start of the next cycle.
|
||||||
|
*
|
||||||
|
* @param player The player.
|
||||||
|
*/
|
||||||
|
public void registerPlayer(Player player) {
|
||||||
|
newPlayers.add(player);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Finalizes the unregistration of Player's queued to be unregistered.
|
* Finalizes the unregistration of Player's queued to be unregistered.
|
||||||
*/
|
*/
|
||||||
@@ -172,6 +187,20 @@ public final class GameService extends Service {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finalizes the registration of Player's queued to be registered.
|
||||||
|
*/
|
||||||
|
private void finalizeRegistrations() {
|
||||||
|
for (int count = 0; count < REGISTERS_PER_CYCLE; count++) {
|
||||||
|
Player player = oldPlayers.poll();
|
||||||
|
if (player == null) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
finalizePlayerRegistration(player);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initializes the game service.
|
* Initializes the game service.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -43,17 +43,24 @@ public final class GameSession extends Session {
|
|||||||
*/
|
*/
|
||||||
private final Player player;
|
private final Player player;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If the player was reconnecting.
|
||||||
|
*/
|
||||||
|
private final boolean reconnecting;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a login session for the specified channel.
|
* Creates a login session for the specified channel.
|
||||||
*
|
*
|
||||||
* @param channel The channel.
|
* @param channel The channel.
|
||||||
* @param context The server context.
|
* @param context The server context.
|
||||||
* @param player The player.
|
* @param player The player.
|
||||||
|
* @param reconnecting If the player was reconnecting.
|
||||||
*/
|
*/
|
||||||
public GameSession(Channel channel, ServerContext context, Player player) {
|
public GameSession(Channel channel, ServerContext context, Player player, boolean reconnecting) {
|
||||||
super(channel);
|
super(channel);
|
||||||
this.context = context;
|
this.context = context;
|
||||||
this.player = player;
|
this.player = player;
|
||||||
|
this.reconnecting = reconnecting;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -111,4 +118,13 @@ public final class GameSession extends Session {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines if this player is reconnecting.
|
||||||
|
*
|
||||||
|
* @return {@code true} if reconnecting, {@code false} otherwise.
|
||||||
|
*/
|
||||||
|
public boolean isReconnecting() {
|
||||||
|
return reconnecting;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -80,14 +80,17 @@ public final class LoginSession extends Session {
|
|||||||
Player player = optional.get();
|
Player player = optional.get();
|
||||||
rights = player.getPrivilegeLevel().toInteger();
|
rights = player.getPrivilegeLevel().toInteger();
|
||||||
|
|
||||||
GameSession session = new GameSession(channel, context, player);
|
RegistrationStatus registration = player.getRegistrationStatus();
|
||||||
RegistrationStatus registration = service.registerPlayer(player, session);
|
|
||||||
|
|
||||||
if (registration != RegistrationStatus.OK) {
|
if (registration != RegistrationStatus.OK) {
|
||||||
optional = Optional.empty();
|
optional = Optional.empty();
|
||||||
rights = 0;
|
rights = 0;
|
||||||
|
|
||||||
status = registration == RegistrationStatus.ALREADY_ONLINE ? LoginConstants.STATUS_ACCOUNT_ONLINE : LoginConstants.STATUS_SERVER_FULL;
|
status = registration == RegistrationStatus.ALREADY_ONLINE ? LoginConstants.STATUS_ACCOUNT_ONLINE : LoginConstants.STATUS_SERVER_FULL;
|
||||||
|
} else {
|
||||||
|
GameSession session = new GameSession(channel, context, player, request.isReconnecting());
|
||||||
|
channel.attr(ApolloHandler.SESSION_KEY).set(session);
|
||||||
|
player.setSession(session);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -107,15 +110,10 @@ public final class LoginSession extends Session {
|
|||||||
|
|
||||||
channel.pipeline().remove("loginDecoder");
|
channel.pipeline().remove("loginDecoder");
|
||||||
channel.pipeline().remove("loginEncoder");
|
channel.pipeline().remove("loginEncoder");
|
||||||
|
service.registerPlayer(optional.get());
|
||||||
channel.attr(ApolloHandler.SESSION_KEY).set(optional.get().getSession());
|
|
||||||
} else {
|
} else {
|
||||||
future.addListener(ChannelFutureListener.CLOSE);
|
future.addListener(ChannelFutureListener.CLOSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (optional.isPresent() && !request.isReconnecting()) {
|
|
||||||
optional.get().sendInitialMessages();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -124,5 +122,4 @@ public final class LoginSession extends Session {
|
|||||||
handleLoginRequest((LoginRequest) message);
|
handleLoginRequest((LoginRequest) message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user