diff --git a/game/src/main/org/apollo/game/model/World.java b/game/src/main/org/apollo/game/model/World.java index 1a45019f..cd494ec2 100644 --- a/game/src/main/org/apollo/game/model/World.java +++ b/game/src/main/org/apollo/game/model/World.java @@ -40,9 +40,11 @@ import org.apollo.util.NameUtil; import com.google.common.base.Preconditions; /** - * The world class is a singleton which contains objects like the {@link MobRepository} for players and NPCs. It should - * only contain things relevant to the in-game world and not classes which deal with I/O and such (these may be better - * off inside some custom {@link Service} or other code, however, the circumstances are rare). + * The world class is a singleton which contains objects like the + * {@link MobRepository} for players and NPCs. It should only contain things + * relevant to the in-game world and not classes which deal with I/O and such + * (these may be better off inside some custom {@link Service} or other code, + * however, the circumstances are rare). * * @author Graham */ @@ -153,8 +155,8 @@ public final class World { } /** - * Gets the {@link Player} with the specified username. Note that this will return {@code null} if the player is - * offline. + * Gets the {@link Player} with the specified username. Note that this will + * return {@code null} if the player is offline. * * @param username The username. * @return The player. @@ -200,12 +202,14 @@ public final class World { } /** - * Initialises the world by loading definitions from the specified file system. + * Initialises the world by loading definitions from the specified file + * system. * * @param release The release number. * @param fs The file system. * @param manager The plugin manager. TODO move this. - * @throws Exception If any definitions could not be loaded or there was a failure when loading plugins. + * @throws Exception If any definitions could not be loaded or there was a + * failure when loading plugins. */ public void init(int release, IndexedFileSystem fs, PluginManager manager) throws Exception { releaseNumber = release; @@ -237,7 +241,9 @@ public final class World { placeEntities(objects); logger.fine("Loaded " + objects.length + " static objects."); - npcMovement = new NpcMovementTask(regions); // Must be exactly here because of ordering issues. + npcMovement = new NpcMovementTask(regions); // Must be exactly here + // because of ordering + // issues. scheduler.schedule(npcMovement); manager.start(); @@ -256,7 +262,8 @@ public final class World { } /** - * Adds an {@link EventListener}, listening for an {@link Event} of the specified type. + * Adds an {@link EventListener}, listening for an {@link Event} of the + * specified type. * * @param type The type of the Event. * @param listener The EventListener. @@ -276,7 +283,8 @@ public final class World { * Registers the specified npc. * * @param npc The npc. - * @return {@code true} if the npc registered successfully, otherwise {@code false}. + * @return {@code true} if the npc registered successfully, otherwise + * {@code false}. */ public boolean register(Npc npc) { boolean success = npcRepository.add(npc); @@ -299,13 +307,13 @@ public final class World { * * @param player The player. */ - public void register(Player player) { + public void register(Player player) { String username = player.getUsername(); - playerRepository.add(player); - players.put(NameUtil.encodeBase37(username), player); + playerRepository.add(player); + players.put(NameUtil.encodeBase37(username), player); - logger.info("Registered player: " + player + " [count=" + playerRepository.size() + "]"); + logger.info("Registered player: " + player + " [count=" + playerRepository.size() + "]"); } /** @@ -319,8 +327,8 @@ public final class World { } /** - * Spawns the specified {@link Entity}, which must not be a {@link Player} or an {@link Npc}, which have their own - * register methods. + * Spawns the specified {@link Entity}, which must not be a {@link Player} + * or an {@link Npc}, which have their own register methods. * * @param entity The Entity. */ @@ -375,12 +383,12 @@ public final class World { } /** - * Adds entities to regions in the {@link RegionRepository}. By default, we do not notify listeners. + * Adds entities to regions in the {@link RegionRepository}. By default, we + * do not notify listeners. * * @param entities The entities. */ private void placeEntities(Entity... entities) { Arrays.stream(entities).forEach(entity -> regions.fromPosition(entity.getPosition()).addEntity(entity, false)); } - } \ No newline at end of file diff --git a/game/src/main/org/apollo/game/model/entity/Player.java b/game/src/main/org/apollo/game/model/entity/Player.java index 63db72cf..66501ebb 100644 --- a/game/src/main/org/apollo/game/model/entity/Player.java +++ b/game/src/main/org/apollo/game/model/entity/Player.java @@ -218,7 +218,8 @@ public final class Player extends Mob { } /** - * Adds a click, represented by a {@link Point}, to the {@link List} of clicks. + * Adds a click, represented by a {@link Point}, to the {@link List} of + * clicks. * * @param point The point. * @return {@code true} if the point was added successfully. @@ -246,7 +247,8 @@ public final class Player extends Mob { } /** - * Adds the specified {@link DynamicGameObject} to this Player's {@link Set} of visible objects. + * Adds the specified {@link DynamicGameObject} to this Player's {@link Set} + * of visible objects. * * @param object The DynamicGameObject. */ @@ -289,10 +291,12 @@ public final class Player extends Mob { } /** - * Indicates whether this player is friends with the player with the specified username or not. + * Indicates whether this player is friends with the player with the + * specified username or not. * * @param username The username of the other player. - * @return {@code true} if the specified username is on this player's friend list, otherwise {@code false}. + * @return {@code true} if the specified username is on this player's friend + * list, otherwise {@code false}. */ public boolean friendsWith(String username) { return friends.contains(username.toLowerCase()); @@ -410,7 +414,8 @@ public final class Player extends Mob { /** * Gets the last known region. * - * @return The last known region, or {@code null} if the player has never known a region. + * @return The last known region, or {@code null} if the player has never + * known a region. */ public Position getLastKnownRegion() { return lastKnownRegion; @@ -508,7 +513,8 @@ public final class Player extends Mob { } /** - * Indicates whether or not the player with the specified username is on this player's ignore list. + * Indicates whether or not the player with the specified username is on + * this player's ignore list. * * @param username The username of the player. * @return {@code true} if the player is ignored, {@code false} if not. @@ -541,7 +547,8 @@ public final class Player extends Mob { } /** - * Increments this player's viewing distance if it is less than the maximum viewing distance. + * Increments this player's viewing distance if it is less than the maximum + * viewing distance. */ public void incrementViewingDistance() { if (viewingDistance < Position.MAX_DISTANCE) { @@ -597,29 +604,30 @@ public final class Player extends Mob { /** * Checks if this player is withdrawing noted items. * - * @return {@code true} if the player is currently withdrawing notes, otherwise {@code false}. + * @return {@code true} if the player is currently withdrawing notes, + * otherwise {@code false}. */ public boolean isWithdrawingNotes() { 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 repository = world.getPlayerRepository(); + /** + * 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 repository = world.getPlayerRepository(); - if (world.isPlayerOnline(getUsername())) { - return RegistrationStatus.ALREADY_ONLINE; - } else if (repository.capacity() == repository.size()) { - return RegistrationStatus.WORLD_FULL; - } - return RegistrationStatus.OK; - } + 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. @@ -661,7 +669,8 @@ public final class Player extends Mob { * Removes the specified username from this player's friend list. * * @param username The username. - * @return {@code true} if the player's friend list contained the specified user, {@code false} if not. + * @return {@code true} if the player's friend list contained the specified + * user, {@code false} if not. */ public boolean removeFriend(String username) { return friends.remove(username.toLowerCase()); @@ -671,14 +680,16 @@ public final class Player extends Mob { * Removes the specified username from this player's ignore list. * * @param username The username. - * @return {@code true} if the player's ignore list contained the specified user, {@code false} if not. + * @return {@code true} if the player's ignore list contained the specified + * user, {@code false} if not. */ public boolean removeIgnore(String username) { return ignores.remove(username.toLowerCase()); } /** - * Removes the specified {@link DynamicGameObject} from this Player's {@link Set} of visible objects. + * Removes the specified {@link DynamicGameObject} from this Player's + * {@link Set} of visible objects. * * @param object The DynamicGameObject. */ @@ -930,7 +941,8 @@ public final class Player extends Mob { /** * Sets whether or not the player is withdrawing notes from the bank. * - * @param withdrawingNotes Whether or not the player is withdrawing noted items. + * @param withdrawingNotes Whether or not the player is withdrawing noted + * items. */ public void setWithdrawingNotes(boolean withdrawingNotes) { this.withdrawingNotes = withdrawingNotes; @@ -951,8 +963,7 @@ public final class Player extends Mob { @Override public String toString() { - return MoreObjects.toStringHelper(this).add("username", getUsername()).add("privilege", privilegeLevel) - .toString(); + return MoreObjects.toStringHelper(this).add("username", getUsername()).add("privilege", privilegeLevel).toString(); } /** @@ -985,16 +996,13 @@ public final class Player extends Mob { * Initialises the player's inventories. */ private void initInventories() { - InventoryListener fullInventoryListener = new FullInventoryListener(this, - FullInventoryListener.FULL_INVENTORY_MESSAGE); + InventoryListener fullInventoryListener = new FullInventoryListener(this, FullInventoryListener.FULL_INVENTORY_MESSAGE); InventoryListener fullBankListener = new FullInventoryListener(this, FullInventoryListener.FULL_BANK_MESSAGE); InventoryListener appearanceListener = new AppearanceInventoryListener(this); - InventoryListener syncInventoryListener = new SynchronizationInventoryListener(this, - SynchronizationInventoryListener.INVENTORY_ID); + InventoryListener syncInventoryListener = new SynchronizationInventoryListener(this, SynchronizationInventoryListener.INVENTORY_ID); InventoryListener syncBankListener = new SynchronizationInventoryListener(this, BankConstants.BANK_INVENTORY_ID); - InventoryListener syncEquipmentListener = new SynchronizationInventoryListener(this, - SynchronizationInventoryListener.EQUIPMENT_ID); + InventoryListener syncEquipmentListener = new SynchronizationInventoryListener(this, SynchronizationInventoryListener.EQUIPMENT_ID); inventory.addListener(syncInventoryListener); inventory.addListener(fullInventoryListener); diff --git a/game/src/main/org/apollo/game/service/GameService.java b/game/src/main/org/apollo/game/service/GameService.java index 68622a46..bc7f207c 100644 --- a/game/src/main/org/apollo/game/service/GameService.java +++ b/game/src/main/org/apollo/game/service/GameService.java @@ -26,22 +26,24 @@ import org.apollo.util.xml.XmlParser; import org.xml.sax.SAXException; /** - * The {@link GameService} class schedules and manages the execution of the {@link GamePulseHandler} class. + * The {@link GameService} class schedules and manages the execution of the + * {@link GamePulseHandler} class. * * @author Graham */ public final class GameService extends Service { /** - * The number of times to unregister players per cycle. This is to ensure the saving threads don't get swamped with - * requests and slow everything down. + * The number of times to unregister players per cycle. This is to ensure + * the saving threads don't get swamped with requests and slow everything + * down. */ 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 number of times to register players per cycle. + */ + private static final int REGISTERS_PER_CYCLE = 25; /** * The World this Service is for. @@ -52,17 +54,16 @@ public final class GameService extends Service { * A queue of players to remove. */ private final Queue oldPlayers = new ConcurrentLinkedQueue<>(); - - /** - * A queue of players to add. - */ - private final Queue newPlayers = new ConcurrentLinkedQueue<>(); + + /** + * A queue of players to add. + */ + private final Queue newPlayers = new ConcurrentLinkedQueue<>(); /** * The scheduled executor service. */ - private final ScheduledExecutorService scheduledExecutor = Executors.newSingleThreadScheduledExecutor(ThreadUtil - .create("GameService")); + private final ScheduledExecutorService scheduledExecutor = Executors.newSingleThreadScheduledExecutor(ThreadUtil.create("GameService")); /** * The {@link MessageHandlerChainSet}. @@ -93,20 +94,20 @@ public final class GameService extends Service { public synchronized void finalizePlayerUnregistration(Player 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(); - } + /** + * 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(); + } } /** @@ -121,8 +122,8 @@ public final class GameService extends Service { /** * Called every pulse. */ - public void pulse() { - finalizeRegistrations(); + public void pulse() { + finalizeRegistrations(); finalizeUnregistrations(); MobRepository players = world.getPlayerRepository(); @@ -144,32 +145,35 @@ public final class GameService extends Service { */ public void shutdown(boolean natural) { scheduledExecutor.shutdownNow(); - // TODO: Other events that should happen upon natural or unexpected shutdown. + // TODO: Other events that should happen upon natural or unexpected + // shutdown. } @Override public void start() { - scheduledExecutor.scheduleAtFixedRate(new GamePulseHandler(this), GameConstants.PULSE_DELAY, - GameConstants.PULSE_DELAY, TimeUnit.MILLISECONDS); + scheduledExecutor.scheduleAtFixedRate(new GamePulseHandler(this), GameConstants.PULSE_DELAY, GameConstants.PULSE_DELAY, + TimeUnit.MILLISECONDS); } /** - * Unregisters a player. Returns immediately. The player is unregistered at the start of the next cycle. + * Unregisters a player. Returns immediately. The player is unregistered at + * the start of the next cycle. * * @param player The player. */ public void unregisterPlayer(Player 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); - } + * 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. @@ -186,27 +190,28 @@ public final class GameService extends Service { loginService.submitSaveRequest(player.getSession(), player); } } - - /** - * Finalizes the registration of Player's queued to be registered. - */ - private void finalizeRegistrations() { - for (int count = 0; count < REGISTERS_PER_CYCLE; count++) { - Player player = newPlayers.poll(); - if (player == null) { - break; - } - finalizePlayerRegistration(player); - } - } + /** + * Finalizes the registration of Player's queued to be registered. + */ + private void finalizeRegistrations() { + for (int count = 0; count < REGISTERS_PER_CYCLE; count++) { + Player player = newPlayers.poll(); + if (player == null) { + break; + } + + finalizePlayerRegistration(player); + } + } /** * Initializes the game service. * * @throws IOException If there is an error accessing the file. * @throws SAXException If there is an error parsing the file. - * @throws ReflectiveOperationException If a MessageHandler could not be created. + * @throws ReflectiveOperationException If a MessageHandler could not be + * created. */ private void init() throws IOException, SAXException, ReflectiveOperationException { try (InputStream input = new FileInputStream("data/messages.xml")) { diff --git a/game/src/main/org/apollo/game/session/GameSession.java b/game/src/main/org/apollo/game/session/GameSession.java index fe277e90..d42779de 100644 --- a/game/src/main/org/apollo/game/session/GameSession.java +++ b/game/src/main/org/apollo/game/session/GameSession.java @@ -42,7 +42,7 @@ public final class GameSession extends Session { * The player. */ private final Player player; - + /** * If the player was reconnecting. */ @@ -56,11 +56,11 @@ public final class GameSession extends Session { * @param player The player. * @param reconnecting If the player was reconnecting. */ - public GameSession(Channel channel, ServerContext context, Player player, boolean reconnecting) { + public GameSession(Channel channel, ServerContext context, Player player, boolean reconnecting) { super(channel); this.context = context; this.player = player; - this.reconnecting = reconnecting; + this.reconnecting = reconnecting; } @Override @@ -118,13 +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; - } + /** + * Determines if this player is reconnecting. + * + * @return {@code true} if reconnecting, {@code false} otherwise. + */ + public boolean isReconnecting() { + return reconnecting; + } } \ No newline at end of file diff --git a/game/src/main/org/apollo/game/session/LoginSession.java b/game/src/main/org/apollo/game/session/LoginSession.java index e8b4bab3..e5df58a3 100644 --- a/game/src/main/org/apollo/game/session/LoginSession.java +++ b/game/src/main/org/apollo/game/session/LoginSession.java @@ -80,17 +80,18 @@ public final class LoginSession extends Session { Player player = optional.get(); rights = player.getPrivilegeLevel().toInteger(); - RegistrationStatus registration = player.getRegistrationStatus(); + RegistrationStatus registration = player.getRegistrationStatus(); if (registration != RegistrationStatus.OK) { optional = Optional.empty(); rights = 0; - 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); + 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); } } @@ -105,12 +106,13 @@ public final class LoginSession extends Session { channel.pipeline().addFirst("messageEncoder", new GameMessageEncoder(release)); channel.pipeline().addBefore("messageEncoder", "gameEncoder", new GamePacketEncoder(randomPair.getEncodingRandom())); - channel.pipeline().addBefore("handler", "gameDecoder", new GamePacketDecoder(randomPair.getDecodingRandom(), context.getRelease())); + channel.pipeline().addBefore("handler", "gameDecoder", + new GamePacketDecoder(randomPair.getDecodingRandom(), context.getRelease())); channel.pipeline().addAfter("gameDecoder", "messageDecoder", new GameMessageDecoder(release)); channel.pipeline().remove("loginDecoder"); channel.pipeline().remove("loginEncoder"); - service.registerPlayer(optional.get()); + service.registerPlayer(optional.get()); } else { future.addListener(ChannelFutureListener.CLOSE); }