From 7f345fffacaa0e7404aefa6fce5a5afaca3e3d84 Mon Sep 17 00:00:00 2001
From: atomicint
Date: Sun, 29 Mar 2015 12:33:39 -0400
Subject: [PATCH 1/6] Better name for "tribyte" -> "medium"
---
src/org/apollo/fs/archive/Archive.java | 8 ++++----
src/org/apollo/util/BufferUtil.java | 20 ++++++++++----------
2 files changed, 14 insertions(+), 14 deletions(-)
diff --git a/src/org/apollo/fs/archive/Archive.java b/src/org/apollo/fs/archive/Archive.java
index c43f391f..76448df9 100644
--- a/src/org/apollo/fs/archive/Archive.java
+++ b/src/org/apollo/fs/archive/Archive.java
@@ -22,8 +22,8 @@ public final class Archive {
* @throws IOException If there is an error decompressing the archive.
*/
public static Archive decode(ByteBuffer buffer) throws IOException {
- int extractedSize = BufferUtil.readUnsignedTriByte(buffer);
- int size = BufferUtil.readUnsignedTriByte(buffer);
+ int extractedSize = BufferUtil.readUnsignedMedium(buffer);
+ int size = BufferUtil.readUnsignedMedium(buffer);
boolean extracted = false;
if (size != extractedSize) {
@@ -42,8 +42,8 @@ public final class Archive {
for (int i = 0; i < entryCount; i++) {
identifiers[i] = buffer.getInt();
- extractedSizes[i] = BufferUtil.readUnsignedTriByte(buffer);
- sizes[i] = BufferUtil.readUnsignedTriByte(buffer);
+ extractedSizes[i] = BufferUtil.readUnsignedMedium(buffer);
+ sizes[i] = BufferUtil.readUnsignedMedium(buffer);
}
ArchiveEntry[] entries = new ArchiveEntry[entryCount];
diff --git a/src/org/apollo/util/BufferUtil.java b/src/org/apollo/util/BufferUtil.java
index c5c10f65..4b4d4361 100644
--- a/src/org/apollo/util/BufferUtil.java
+++ b/src/org/apollo/util/BufferUtil.java
@@ -20,11 +20,10 @@ public final class BufferUtil {
* @return The 'smart'.
*/
public static int readSmart(ByteBuffer buffer) {
+ // Reads a single byte from the buffer without modifying the current position.
int peek = buffer.get(buffer.position()) & 0xFF;
- if (peek < 128) {
- return buffer.get() & 0xFF;
- }
- return (buffer.getShort() & 0xFFFF) - 32768;
+ int value = peek > Byte.MAX_VALUE ? (buffer.getShort() & 0xFFFF) + Short.MIN_VALUE : buffer.get() & 0xFF;
+ return value;
}
/**
@@ -58,13 +57,14 @@ public final class BufferUtil {
}
/**
- * Reads an unsigned tri-byte from the specified {@link ByteBuffer}.
- *
- * @param buffer The buffer.
- * @return The tri-byte.
+ * Reads a 24-bit medium integer from the specified {@link ByteBuffer}s current position and increases the buffers
+ * position by 3.
+ *
+ * @param buffer The {@link ByteBuffer} to read from.
+ * @return The read 24-bit medium integer.
*/
- public static int readUnsignedTriByte(ByteBuffer buffer) {
- return (buffer.get() & 0xFF) << 16 | (buffer.get() & 0xFF) << 8 | buffer.get() & 0xFF;
+ public static int readUnsignedMedium(ByteBuffer buffer) {
+ return (buffer.getShort() & 0xFFFF) << 8 | buffer.get() & 0xFF;
}
/**
From 654a1a6dfdcd624484958a11019c7cef1f4b9252 Mon Sep 17 00:00:00 2001
From: atomicint
Date: Sun, 29 Mar 2015 12:52:55 -0400
Subject: [PATCH 2/6] Rebase the MessageHandler, MessageHandlerChain and
MessageHandlerChainSet Rebased several other pieces of code
---
data/plugins/bank/bank.rb | 8 +--
data/plugins/bootstrap.rb | 15 ++--
data/plugins/chat/privacy/privacy.rb | 2 +-
data/plugins/chat/private-messaging/friend.rb | 4 +-
data/plugins/chat/private-messaging/ignore.rb | 4 +-
.../chat/private-messaging/messaging.rb | 2 +-
data/plugins/consumables/consumable.rb | 4 +-
data/plugins/dialogue/dialogue.rb | 6 +-
data/plugins/dummy/dummy.rb | 2 +-
data/plugins/emote-tab/emote-tab.rb | 4 +-
.../location/tutorial-island/survival.rb | 6 +-
data/plugins/navigation/door/door.rb | 4 +-
data/plugins/skill/fishing/fishing.rb | 4 +-
data/plugins/skill/herblore/herblore.rb | 14 ++--
data/plugins/skill/herblore/ingredient.rb | 2 +-
data/plugins/skill/magic/magic.rb | 12 ++--
data/plugins/skill/mining/mining.rb | 4 +-
data/plugins/skill/prayer/bury.rb | 4 +-
data/plugins/skill/prayer/prayers.rb | 2 +-
data/plugins/skill/runecraft/altar.rb | 10 +--
data/plugins/skill/runecraft/talisman.rb | 4 +-
data/plugins/skill/runecraft/tiara.rb | 16 ++---
data/plugins/util/intercept.rb | 2 +-
data/plugins/util/item-on-item-intercept.rb | 6 +-
src/org/apollo/game/GamePulseHandler.java | 2 -
src/org/apollo/game/GameService.java | 28 ++++----
src/org/apollo/game/message/Message.java | 22 ++++++
.../message/{handler => }/MessageHandler.java | 19 +++--
.../game/message/MessageHandlerChain.java | 72 +++++++++++++++++++
.../game/message/MessageHandlerChainSet.java | 47 ++++++++++++
.../{impl => }/BankButtonMessageHandler.java | 7 +-
.../{impl => }/BankMessageHandler.java | 21 +++---
.../{impl => }/ChatMessageHandler.java | 7 +-
.../{impl => }/ChatVerificationHandler.java | 9 ++-
.../ClosedInterfaceMessageHandler.java | 7 +-
.../{impl => }/CommandMessageHandler.java | 7 +-
.../{impl => }/DialogueButtonHandler.java | 9 ++-
.../DialogueContinueMessageHandler.java | 7 +-
.../EnteredAmountMessageHandler.java | 7 +-
.../handler/{impl => }/EquipItemHandler.java | 11 ++-
.../ItemOnItemVerificationHandler.java | 13 ++--
.../ItemOnObjectVerificationHandler.java | 13 ++--
.../{impl => }/ItemVerificationHandler.java | 13 ++--
.../message/handler/MessageHandlerChain.java | 62 ----------------
.../handler/MessageHandlerChainGroup.java | 49 -------------
.../handler/MessageHandlerContext.java | 32 ---------
.../NpcActionVerificationHandler.java | 13 ++--
.../ObjectActionVerificationHandler.java | 13 ++--
.../PlayerActionVerificationHandler.java | 11 ++-
.../PlayerDesignMessageHandler.java | 7 +-
.../PlayerDesignVerificationHandler.java | 9 ++-
.../{impl => }/RemoveEquippedItemHandler.java | 9 ++-
.../{impl => }/SwitchItemMessageHandler.java | 7 +-
.../{impl => }/WalkMessageHandler.java | 7 +-
.../message/handler/impl/package-info.java | 4 --
.../game/message/handler/package-info.java | 2 +-
src/org/apollo/game/model/entity/Player.java | 18 ++---
.../game/model/event/EventListenerChain.java | 1 +
.../apollo/game/model/inter/InterfaceSet.java | 3 +-
.../inter/dialogue/DialogueListener.java | 3 +-
src/org/apollo/game/scheduling/Scheduler.java | 25 ++++---
...java => MessageHandlerChainSetParser.java} | 38 ++++------
.../r317/FirstNpcActionMessageDecoder.java | 5 +-
.../r317/SecondNpcActionMessageDecoder.java | 5 +-
.../r317/ThirdNpcActionMessageDecoder.java | 6 +-
.../r377/FirstNpcActionMessageDecoder.java | 5 +-
.../r377/SecondNpcActionMessageDecoder.java | 5 +-
src/org/apollo/net/session/GameSession.java | 38 +++-------
src/org/apollo/util/CollectionUtil.java | 40 +++++++++++
src/org/apollo/util/plugin/PluginContext.java | 20 ++----
src/org/apollo/util/xml/XmlNode.java | 10 ++-
71 files changed, 452 insertions(+), 457 deletions(-)
rename src/org/apollo/game/message/{handler => }/MessageHandler.java (50%)
create mode 100644 src/org/apollo/game/message/MessageHandlerChain.java
create mode 100644 src/org/apollo/game/message/MessageHandlerChainSet.java
rename src/org/apollo/game/message/handler/{impl => }/BankButtonMessageHandler.java (79%)
rename src/org/apollo/game/message/handler/{impl => }/BankMessageHandler.java (78%)
rename src/org/apollo/game/message/handler/{impl => }/ChatMessageHandler.java (72%)
rename src/org/apollo/game/message/handler/{impl => }/ChatVerificationHandler.java (70%)
rename src/org/apollo/game/message/handler/{impl => }/ClosedInterfaceMessageHandler.java (70%)
rename src/org/apollo/game/message/handler/{impl => }/CommandMessageHandler.java (78%)
rename src/org/apollo/game/message/handler/{impl => }/DialogueButtonHandler.java (74%)
rename src/org/apollo/game/message/handler/{impl => }/DialogueContinueMessageHandler.java (74%)
rename src/org/apollo/game/message/handler/{impl => }/EnteredAmountMessageHandler.java (70%)
rename src/org/apollo/game/message/handler/{impl => }/EquipItemHandler.java (92%)
rename src/org/apollo/game/message/handler/{impl => }/ItemOnItemVerificationHandler.java (80%)
rename src/org/apollo/game/message/handler/{impl => }/ItemOnObjectVerificationHandler.java (77%)
rename src/org/apollo/game/message/handler/{impl => }/ItemVerificationHandler.java (87%)
delete mode 100644 src/org/apollo/game/message/handler/MessageHandlerChain.java
delete mode 100644 src/org/apollo/game/message/handler/MessageHandlerChainGroup.java
delete mode 100644 src/org/apollo/game/message/handler/MessageHandlerContext.java
rename src/org/apollo/game/message/handler/{impl => }/NpcActionVerificationHandler.java (78%)
rename src/org/apollo/game/message/handler/{impl => }/ObjectActionVerificationHandler.java (84%)
rename src/org/apollo/game/message/handler/{impl => }/PlayerActionVerificationHandler.java (76%)
rename src/org/apollo/game/message/handler/{impl => }/PlayerDesignMessageHandler.java (73%)
rename src/org/apollo/game/message/handler/{impl => }/PlayerDesignVerificationHandler.java (89%)
rename src/org/apollo/game/message/handler/{impl => }/RemoveEquippedItemHandler.java (85%)
rename src/org/apollo/game/message/handler/{impl => }/SwitchItemMessageHandler.java (86%)
rename src/org/apollo/game/message/handler/{impl => }/WalkMessageHandler.java (82%)
delete mode 100644 src/org/apollo/game/message/handler/impl/package-info.java
rename src/org/apollo/io/{MessageHandlerChainParser.java => MessageHandlerChainSetParser.java} (64%)
create mode 100644 src/org/apollo/util/CollectionUtil.java
diff --git a/data/plugins/bank/bank.rb b/data/plugins/bank/bank.rb
index 5f23e044..d473bb80 100644
--- a/data/plugins/bank/bank.rb
+++ b/data/plugins/bank/bank.rb
@@ -30,17 +30,17 @@ class BankAction < DistancedAction
end
# Intercepts the object action message
-on :message, :second_object_action do |ctx, player, message|
+on :message, :second_object_action do |player, message|
if message.id == BANK_BOOTH_ID
player.start_action(BankAction.new(player, message.position))
- ctx.break_handler_chain
+ message.terminate
end
end
-on :message, :second_npc_action do |ctx, player, message|
+on :message, :second_npc_action do |player, message|
npc = $world.npc_repository.get(message.index)
if BANKER_NPCS.include?(npc.id)
player.start_action(BankAction.new(player, npc.position))
- ctx.break_handler_chain
+ message.terminate
end
end
\ No newline at end of file
diff --git a/data/plugins/bootstrap.rb b/data/plugins/bootstrap.rb
index da4a123c..89e520c7 100644
--- a/data/plugins/bootstrap.rb
+++ b/data/plugins/bootstrap.rb
@@ -15,7 +15,7 @@
require 'java'
java_import 'org.apollo.game.command.CommandListener'
-java_import 'org.apollo.game.message.handler.MessageHandler'
+java_import 'org.apollo.game.message.MessageHandler'
java_import 'org.apollo.game.model.World'
java_import 'org.apollo.game.model.entity.Player'
java_import 'org.apollo.game.model.event.EventListener'
@@ -75,11 +75,10 @@ class ProcEventListener
end
-# A MessageHandler which executes a Proc object with three arguments: the chain
-# context, the player and the message.
+# A MessageHandler which executes a Proc object with two arguments: the player and the message.
class ProcMessageHandler < MessageHandler
- # Creates the ProcMessageListener.
+ # Creates the ProcMessageHandler.
def initialize(block, option)
super($world)
@block = block
@@ -87,8 +86,8 @@ class ProcMessageHandler < MessageHandler
end
# Handles the message.
- def handle(ctx, player, message)
- @block.call(ctx, player, message) if (@option == 0 || @option == message.option)
+ def handle(player, message)
+ @block.call(player, message) if (@option == 0 || @option == message.option)
end
end
@@ -166,7 +165,7 @@ def on_button(args, proc)
id = args[0].to_i
- on :message, :button do |ctx, player, message|
+ on :message, :button do |player, message|
proc.call(player) if message.widget_id == id
end
end
@@ -192,7 +191,7 @@ def on_message(args, proc)
class_name = message.to_s.camelize.concat('Message')
message = Java::JavaClass.for_name("org.apollo.game.message.impl.#{class_name}")
- $ctx.add_last_message_handler(message, ProcMessageHandler.new(proc, option))
+ $ctx.add_message_handler(message, ProcMessageHandler.new(proc, option))
end
# Defines an action to be taken upon a command.
diff --git a/data/plugins/chat/privacy/privacy.rb b/data/plugins/chat/privacy/privacy.rb
index 8200fce7..26eda98f 100644
--- a/data/plugins/chat/privacy/privacy.rb
+++ b/data/plugins/chat/privacy/privacy.rb
@@ -3,7 +3,7 @@ require 'java'
java_import 'org.apollo.game.model.entity.setting.PrivacyState'
java_import 'org.apollo.game.message.impl.SendFriendMessage'
-on :message, :privacy_option do |ctx, player, message|
+on :message, :privacy_option do |player, message|
player.chat_privacy = message.chat_privacy
player.friend_privacy = message.friend_privacy
player.trade_privacy = message.trade_privacy
diff --git a/data/plugins/chat/private-messaging/friend.rb b/data/plugins/chat/private-messaging/friend.rb
index 9433659a..7e18a872 100644
--- a/data/plugins/chat/private-messaging/friend.rb
+++ b/data/plugins/chat/private-messaging/friend.rb
@@ -11,7 +11,7 @@ java_import 'org.apollo.game.model.entity.Player'
# Processes an add friend message, updating the logged-in status of the player (and the person they added) if necessary.
-on :message, :add_friend do |ctx, player, message|
+on :message, :add_friend do |player, message|
friend_username = message.username
player_username = player.username
@@ -30,7 +30,7 @@ on :message, :add_friend do |ctx, player, message|
end
# Processes a remove friend message, updating the logged-in status of the player if necessary.
-on :message, :remove_friend do |ctx, player, message|
+on :message, :remove_friend do |player, message|
friend_username = message.username
player_username = player.username
diff --git a/data/plugins/chat/private-messaging/ignore.rb b/data/plugins/chat/private-messaging/ignore.rb
index 327e7987..a903c9f8 100644
--- a/data/plugins/chat/private-messaging/ignore.rb
+++ b/data/plugins/chat/private-messaging/ignore.rb
@@ -1,9 +1,9 @@
-on :message, :add_ignore do |ctx, player, message|
+on :message, :add_ignore do |player, message|
username = message.username
player.add_ignore(username)
end
-on :message, :remove_ignore do |ctx, player, message|
+on :message, :remove_ignore do |player, message|
username = message.username
player.remove_ignore(username)
end
diff --git a/data/plugins/chat/private-messaging/messaging.rb b/data/plugins/chat/private-messaging/messaging.rb
index 87cbdb65..bb85e06e 100644
--- a/data/plugins/chat/private-messaging/messaging.rb
+++ b/data/plugins/chat/private-messaging/messaging.rb
@@ -4,7 +4,7 @@ java_import 'org.apollo.game.message.impl.ForwardPrivateChatMessage'
java_import 'org.apollo.game.model.World'
java_import 'org.apollo.game.model.entity.setting.PrivacyState'
-on :message, :private_chat do |ctx, player, message|
+on :message, :private_chat do |player, message|
friend = $world.get_player(message.username)
friend.send(ForwardPrivateChatMessage.new(player.username, player.privilege_level, message.compressed_chat)) if interaction_permitted(player, friend)
end
diff --git a/data/plugins/consumables/consumable.rb b/data/plugins/consumables/consumable.rb
index 14375d35..dfab0df7 100644
--- a/data/plugins/consumables/consumable.rb
+++ b/data/plugins/consumables/consumable.rb
@@ -54,11 +54,11 @@ class ConsumeAction < Action
end
# Intercepts the first item option message and consumes the consumable, if necessary.
-on :message, :first_item_option do |ctx, player, message|
+on :message, :first_item_option do |player, message|
consumable = CONSUMABLES[message.id]
unless consumable.nil?
player.start_action(ConsumeAction.new(player, message.slot, consumable))
- ctx.break_handler_chain
+ message.terminate
end
end
\ No newline at end of file
diff --git a/data/plugins/dialogue/dialogue.rb b/data/plugins/dialogue/dialogue.rb
index 926b19b5..54bf87f3 100644
--- a/data/plugins/dialogue/dialogue.rb
+++ b/data/plugins/dialogue/dialogue.rb
@@ -71,13 +71,13 @@ class Conversation
raise 'Npc cannot be null when opening a dialogue.' if npc_index.nil?
@starters << dialogue
- on :message, :first_npc_action do |ctx, player, event|
- npc = $world.npc_repository.get(event.index)
+ on :message, :first_npc_action do |player, message|
+ npc = $world.npc_repository.get(message.index)
if npc_index == npc.id
@starters.each do |start|
if dialogue.precondition(player)
player.start_action(OpenDialogueAction.new(player, npc, dialogue))
- ctx.break_handler_chain()
+ message.terminate
break
end
end
diff --git a/data/plugins/dummy/dummy.rb b/data/plugins/dummy/dummy.rb
index fb0d0fb8..9f6418f0 100644
--- a/data/plugins/dummy/dummy.rb
+++ b/data/plugins/dummy/dummy.rb
@@ -45,6 +45,6 @@ class DummyAction < DistancedAction
end
end
-on :message, :second_object_action do |ctx, player, message|
+on :message, :second_object_action do |player, message|
player.start_action(DummyAction.new(player, message.position)) if message.id == DUMMY_ID
end
\ No newline at end of file
diff --git a/data/plugins/emote-tab/emote-tab.rb b/data/plugins/emote-tab/emote-tab.rb
index 30c4286f..c9f4bf3b 100644
--- a/data/plugins/emote-tab/emote-tab.rb
+++ b/data/plugins/emote-tab/emote-tab.rb
@@ -12,10 +12,10 @@ ANIMATIONS = {
}
# Intercept the button message.
-on :message, :button do |ctx, player, message|
+on :message, :button do |player, message|
anim = ANIMATIONS[message.widget_id]
unless anim == nil
player.play_animation(anim)
- ctx.break_handler_chain
+ message.terminate
end
end
\ No newline at end of file
diff --git a/data/plugins/location/tutorial-island/survival.rb b/data/plugins/location/tutorial-island/survival.rb
index 3db06877..615f1632 100644
--- a/data/plugins/location/tutorial-island/survival.rb
+++ b/data/plugins/location/tutorial-island/survival.rb
@@ -126,7 +126,7 @@ def add_survival_items(player)
end
# Intercept the FirstObjectActionMessage to send tutorial-only events if the player is chopping down a tree.
-on :message, :first_object_action do |ctx, player, message|
+on :message, :first_object_action do |player, message|
if (player.in_tutorial_island && message.id == SurvivalConstants::TREE_ID)
progress = player.tutorial_island_progress
if (progress < :cut_tree)
@@ -138,9 +138,9 @@ on :message, :first_object_action do |ctx, player, message|
end
# Intercept the FlashingTabClickedMessage to update the player's progress, if applicable.
-on :message, :flashing_tab_clicked do |ctx, player, message|
+on :message, :flashing_tab_clicked do |player, message|
if (player.in_tutorial_island && message.tab == SurvivalConstants::INVENTORY_TAB_INDEX && player.tutorial_island_progress == :given_axe)
player.tutorial_island_progress = :cut_tree
- ctx.break_handler_chain()
+ message.terminate
end
end
\ No newline at end of file
diff --git a/data/plugins/navigation/door/door.rb b/data/plugins/navigation/door/door.rb
index cd00e50e..3bb5f564 100644
--- a/data/plugins/navigation/door/door.rb
+++ b/data/plugins/navigation/door/door.rb
@@ -23,8 +23,8 @@ class OpenDoorAction < DistancedAction
end
-# Message handler for opening and closing doors.
-on :message, :first_object_action do |ctx, player, message|
+# MessageListener for opening and closing doors.
+on :message, :first_object_action do |player, message|
if DoorUtil::is_door?(message.id)
puts "Player: #{player.position}, door: #{message.position}"
door = DoorUtil::get_door_object(message.position, message.id)
diff --git a/data/plugins/skill/fishing/fishing.rb b/data/plugins/skill/fishing/fishing.rb
index 00375bea..e5f12e75 100644
--- a/data/plugins/skill/fishing/fishing.rb
+++ b/data/plugins/skill/fishing/fishing.rb
@@ -100,12 +100,12 @@ class FishingAction < DistancedAction
end
# Intercepts the NpcAction message to determine whether or not a clicked npc was a fishing spot.
-on :message, :npc_action do |ctx, player, message|
+on :message, :npc_action do |player, message|
npc = $world.npc_repository.get(message.index)
spot = FISHING_SPOTS[npc.id]
unless spot.nil?
player.start_action(FishingAction.new(player, npc.position, spot, message.option))
- ctx.break_handler_chain
+ message.terminate
end
end
\ No newline at end of file
diff --git a/data/plugins/skill/herblore/herblore.rb b/data/plugins/skill/herblore/herblore.rb
index 0aa4b445..6992d059 100644
--- a/data/plugins/skill/herblore/herblore.rb
+++ b/data/plugins/skill/herblore/herblore.rb
@@ -25,8 +25,8 @@ module HerbloreMethod
end
end
-# The ItemOnItemMessage handler for all Herblore-related functions.
-on :message, :item_on_item do |ctx, player, message|
+# The ItemOnItemMessage listener for all Herblore-related functions.
+on :message, :item_on_item do |player, message|
primary = message.id
secondary = message.target_id
hash = HERBLORE_ITEM_ON_ITEM[primary]
@@ -41,25 +41,25 @@ on :message, :item_on_item do |ctx, player, message|
method = hash[secondary]
unless method.nil?
method.invoke(player, primary, secondary)
- ctx.break_handler_chain
+ message.terminate
end
end
end
-# The ItemOptionMessage handler for all Herblore-related functions.
-on :message, :first_item_option do |ctx, player, message|
+# The ItemOptionMessage listener for all Herblore-related functions.
+on :message, :first_item_option do |player, message|
id = message.id
method = HERBLORE_ITEM[id]
unless method.nil?
method.invoke(player, id, message.slot)
- ctx.break_handler_chain
+ message.terminate
end
method = DRINK_ITEM[id]
unless method.nil?
method.invoke(player, id, message.slot)
- ctx.break_handler_chain
+ message.terminate
end
end
diff --git a/data/plugins/skill/herblore/ingredient.rb b/data/plugins/skill/herblore/ingredient.rb
index c25c4438..51725de4 100644
--- a/data/plugins/skill/herblore/ingredient.rb
+++ b/data/plugins/skill/herblore/ingredient.rb
@@ -223,7 +223,7 @@ class GrindingAction < Action
end
end
-# Appends a ground ingredient to the ItemOnItemMessage handler interception.
+# Appends a ground ingredient to the ItemOnItemMessage listener interception.
def append_ground(id, raw)
ground = GroundIngredient.new(id, raw)
append_herblore_item(ground, PESTLE_MORTAR, raw)
diff --git a/data/plugins/skill/magic/magic.rb b/data/plugins/skill/magic/magic.rb
index 60b1e939..697716c0 100644
--- a/data/plugins/skill/magic/magic.rb
+++ b/data/plugins/skill/magic/magic.rb
@@ -118,7 +118,7 @@ class ItemSpellAction < SpellAction
end
# Intercepts the magic on item message.
-on :message, :magic_on_item do |ctx, player, message|
+on :message, :magic_on_item do |player, message|
spell = message.spell_id
alch = ALCHEMY_SPELLS[spell]
@@ -126,7 +126,7 @@ on :message, :magic_on_item do |ctx, player, message|
slot = message.slot
item = player.inventory.get(slot)
player.start_action(AlchemyAction.new(player, alch, slot, item))
- ctx.break_handler_chain
+ message.terminate
return
end
@@ -135,18 +135,18 @@ on :message, :magic_on_item do |ctx, player, message|
slot = message.slot
item = player.inventory.get(slot)
player.start_action(EnchantAction.new(player, ench, slot, item, ENCHANT_ITEMS[item.id]))
- ctx.break_handler_chain
+ message.terminate
end
end
# Intercepts the button message
-on :message, :button do |ctx, player, message|
+on :message, :button do |player, message|
button = message.widget_id
tele = TELEPORT_SPELLS[button]
unless tele.nil?
player.start_action(TeleportingAction.new(player, tele))
- ctx.break_handler_chain
+ message.terminate
return
end
@@ -155,6 +155,6 @@ on :message, :button do |ctx, player, message|
slots = bone_slots player
if slots.length == 0 then player.send_message("You can't convert these bones!") else player.start_action(ConvertingAction.new(player, conv, slots)) end
- ctx.break_handler_chain
+ message.terminate
end
end
\ No newline at end of file
diff --git a/data/plugins/skill/mining/mining.rb b/data/plugins/skill/mining/mining.rb
index e5b7670b..24113f6d 100644
--- a/data/plugins/skill/mining/mining.rb
+++ b/data/plugins/skill/mining/mining.rb
@@ -134,7 +134,7 @@ class ProspectingAction < DistancedAction
end
-on :message, :first_object_action do |ctx, mob, message|
+on :message, :first_object_action do |mob, message|
ore = ORES[message.id]
unless ore.nil?
@@ -142,7 +142,7 @@ on :message, :first_object_action do |ctx, mob, message|
end
end
-on :message, :second_object_action do |ctx, mob, message|
+on :message, :second_object_action do |mob, message|
ore = ORES[message.id]
if !ore.nil?
diff --git a/data/plugins/skill/prayer/bury.rb b/data/plugins/skill/prayer/bury.rb
index 620ef6ce..620ec181 100644
--- a/data/plugins/skill/prayer/bury.rb
+++ b/data/plugins/skill/prayer/bury.rb
@@ -51,11 +51,11 @@ class BuryBoneAction < Action
end
# Intercepts the first item option message.
-on :message, :first_item_option do |ctx, player, message|
+on :message, :first_item_option do |player, message|
bone = BONES[message.id]
unless bone == nil
player.start_action(BuryBoneAction.new(player, message.slot, bone))
- ctx.break_handler_chain
+ message.terminate
end
end
diff --git a/data/plugins/skill/prayer/prayers.rb b/data/plugins/skill/prayer/prayers.rb
index 788b843e..4dc5d742 100644
--- a/data/plugins/skill/prayer/prayers.rb
+++ b/data/plugins/skill/prayer/prayers.rb
@@ -9,7 +9,7 @@ declare_attribute(:active_prayer, -1, :persistent)
PRAYERS = {}
# Intercept the ButtonMessage to toggle a prayer.
-on :message, :button do |ctx, player, message|
+on :message, :button do |player, message|
button = message.widget_id
prayer = PRAYERS[button]
diff --git a/data/plugins/skill/runecraft/altar.rb b/data/plugins/skill/runecraft/altar.rb
index d7b090e4..18ca5138 100644
--- a/data/plugins/skill/runecraft/altar.rb
+++ b/data/plugins/skill/runecraft/altar.rb
@@ -24,26 +24,26 @@ end
# Intercepts the item on object message.
-on :message, :item_on_object do |ctx, player, message|
+on :message, :item_on_object do |player, message|
talisman = TALISMANS[message.id]; altar = ENTRANCE_ALTARS[message.object_id]
unless (talisman.nil? || altar.nil?)
player.start_action(TeleportAction.new(player, message.position, 2, altar.entrance_position))
- ctx.break_handler_chain
+ message.terminate
end
end
# Intercepts the first object action message.
-on :message, :object_action do |ctx, player, message|
+on :message, :object_action do |player, message|
if (message.option == 1)
object_id = message.id
if (altar = PORTALS[object_id]) != nil # Get the altar associated with this exit portal.
player.start_action(TeleportAction.new(player, altar.entrance_position, 1, altar.exit_position))
- ctx.break_handler_chain
+ message.terminate
elsif (rune = RUNES[object_id]) != nil # Get the rune associated with this altar.
altar = CRAFTING_ALTARS[object_id]
player.start_action(RunecraftingAction.new(player, rune, altar.crafting_centre))
- ctx.break_handler_chain
+ message.terminate
end
end
end
diff --git a/data/plugins/skill/runecraft/talisman.rb b/data/plugins/skill/runecraft/talisman.rb
index 13efe474..54a8067c 100644
--- a/data/plugins/skill/runecraft/talisman.rb
+++ b/data/plugins/skill/runecraft/talisman.rb
@@ -30,11 +30,11 @@ def append_talisman(hash)
end
# Intercepts the item option message.
-on :message, :fourth_item_option do |ctx, player, message|
+on :message, :fourth_item_option do |player, message|
talisman = TALISMANS[message.id]
if (talisman != nil)
player.send_message(talisman.get_message(player.position))
- ctx.break_handler_chain
+ message.terminate
end
end
diff --git a/data/plugins/skill/runecraft/tiara.rb b/data/plugins/skill/runecraft/tiara.rb
index 9e1559f9..380e2085 100644
--- a/data/plugins/skill/runecraft/tiara.rb
+++ b/data/plugins/skill/runecraft/tiara.rb
@@ -62,7 +62,7 @@ on :login do |event, player|
end
# Intercepts the SecondObjectAction message to support left-click access to the altar when wielding the correct tiara.
-on :message, :second_object_action do |ctx, player, message|
+on :message, :second_object_action do |player, message|
object_id = message.id
tiara = TIARAS_BY_ALTAR[object_id]
next if tiara.nil?
@@ -73,37 +73,37 @@ on :message, :second_object_action do |ctx, player, message|
altar = ENTRANCE_ALTARS[tiara.altar]
player.start_action(TeleportAction.new(player, message.position, 2, altar.entrance_position)) unless altar.nil?
- ctx.break_handler_chain
+ message.terminate
end
end
# Intercepts the SecondItemAction message to allow for config sending.
-on :message, :second_item_option do |ctx, player, message|
+on :message, :second_item_option do |player, message|
tiara = TIARAS_BY_ID[message.id]
unless tiara.nil?
tiara.send_config(player)
- ctx.break_handler_chain
+ message.terminate
end
end
# Intercepts the FirstItemAction message to allow for config sending.
-on :message, :first_item_action do |ctx, player, message|
+on :message, :first_item_action do |player, message|
tiara = TIARAS_BY_ID[message.id]
unless tiara.nil?
send_empty_config(player)
- ctx.break_handler_chain
+ message.terminate
end
end
# Intercepts the ItemOnObject message to create the tiara.
-on :message, :item_on_object do |ctx, player, message|
+on :message, :item_on_object do |player, message|
tiara= TIARAS_BY_TALISMAN[message.id]; altar = CRAFTING_ALTARS[message.object_id]
return if (tiara.nil? || altar.nil?)
player.start_action(CreateTiaraAction.new(player, message.position, tiara, altar))
- ctx.break_handler_chain
+ message.terminate
end
# An action lets the player create a tiara when it comes within the specified distance of a specified position.
diff --git a/data/plugins/util/intercept.rb b/data/plugins/util/intercept.rb
index b2c570de..14bea1f9 100644
--- a/data/plugins/util/intercept.rb
+++ b/data/plugins/util/intercept.rb
@@ -5,7 +5,7 @@
#
# If you only wish to intercept a message, use the intercept method, e.g.
#
-# intercept :item_on_item, used_id, target_id, :irreversible do |ctx, player, message|
+# intercept :item_on_item, used_id, target_id, :irreversible do |player, message|
# # code here
# end
diff --git a/data/plugins/util/item-on-item-intercept.rb b/data/plugins/util/item-on-item-intercept.rb
index ac46bed3..de8f8244 100644
--- a/data/plugins/util/item-on-item-intercept.rb
+++ b/data/plugins/util/item-on-item-intercept.rb
@@ -36,11 +36,11 @@ class ItemOnItemPair
end
-# Adds a message handler to the item on item message.
-on :message, :item_on_item do |ctx, player, message|
+# Adds a message listener to the item on item message.
+on :message, :item_on_item do |player, message|
used, target = message.id, message.target_id
pair = ItemOnItemPair.new(used, target)
block = ITEM_PAIRS[pair]
- block.call(ctx, player, message) unless block == nil
+ block.call(player, message) unless block == nil
end
\ No newline at end of file
diff --git a/src/org/apollo/game/GamePulseHandler.java b/src/org/apollo/game/GamePulseHandler.java
index 5c5a5144..2222cda0 100644
--- a/src/org/apollo/game/GamePulseHandler.java
+++ b/src/org/apollo/game/GamePulseHandler.java
@@ -35,8 +35,6 @@ public final class GamePulseHandler implements Runnable {
service.pulse();
} catch (Throwable reason) {
logger.log(Level.SEVERE, "Exception occured during pulse!", reason);
- } finally {
- service.shutdown(false);
}
}
diff --git a/src/org/apollo/game/GameService.java b/src/org/apollo/game/GameService.java
index e939d889..d6bdee08 100644
--- a/src/org/apollo/game/GameService.java
+++ b/src/org/apollo/game/GameService.java
@@ -10,13 +10,13 @@ import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import org.apollo.Service;
-import org.apollo.game.message.handler.MessageHandlerChainGroup;
+import org.apollo.game.message.MessageHandlerChainSet;
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.entity.Player;
import org.apollo.game.sync.ClientSynchronizer;
-import org.apollo.io.MessageHandlerChainParser;
+import org.apollo.io.MessageHandlerChainSetParser;
import org.apollo.login.LoginService;
import org.apollo.net.session.GameSession;
import org.apollo.util.MobRepository;
@@ -39,9 +39,9 @@ public final class GameService extends Service {
private static final int UNREGISTERS_PER_CYCLE = 50;
/**
- * The {@link MessageHandlerChainGroup}.
+ * The {@link MessageHandlerChainSet}.
*/
- private MessageHandlerChainGroup chainGroup;
+ private MessageHandlerChainSet messageHandlerChainSet;
/**
* A queue of players to remove.
@@ -51,8 +51,7 @@ public final class GameService extends Service {
/**
* The scheduled executor service.
*/
- private final ScheduledExecutorService scheduledExecutor = Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory(
- "GameService"));
+ private final ScheduledExecutorService scheduledExecutor = Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory("GameService"));
/**
* The {@link ClientSynchronizer}.
@@ -82,12 +81,12 @@ public final class GameService extends Service {
}
/**
- * Gets the message handler chains.
+ * Gets the MessageHandlerChainSet
*
- * @return The message handler chains.
+ * @return The set of MessageHandlerChain's.
*/
- public MessageHandlerChainGroup getMessageHandlerChains() {
- return chainGroup;
+ public MessageHandlerChainSet getMessageHandlerChainSet() {
+ return messageHandlerChainSet;
}
/**
@@ -101,7 +100,7 @@ public final class GameService extends Service {
for (Player player : players) {
GameSession session = player.getSession();
if (session != null) {
- session.handlePendingMessages(chainGroup);
+ session.handlePendingMessages(messageHandlerChainSet);
}
}
@@ -143,8 +142,7 @@ public final class GameService extends Service {
@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);
}
/**
@@ -181,8 +179,8 @@ public final class GameService extends Service {
*/
private void init() throws IOException, SAXException, ReflectiveOperationException {
try (InputStream input = new FileInputStream("data/messages.xml")) {
- MessageHandlerChainParser chainGroupParser = new MessageHandlerChainParser(input);
- chainGroup = chainGroupParser.parse(world);
+ MessageHandlerChainSetParser chainSetParser = new MessageHandlerChainSetParser(input);
+ messageHandlerChainSet = chainSetParser.parse(world);
}
try (InputStream input = new FileInputStream("data/synchronizer.xml")) {
diff --git a/src/org/apollo/game/message/Message.java b/src/org/apollo/game/message/Message.java
index 0b7ce3a6..13b0c59f 100644
--- a/src/org/apollo/game/message/Message.java
+++ b/src/org/apollo/game/message/Message.java
@@ -4,7 +4,29 @@ package org.apollo.game.message;
* A message sent by the client that can be intercepted.
*
* @author Graham
+ * @author Major
*/
public abstract class Message {
+ /**
+ * Indicates whether or not the Message chain has been terminated.
+ */
+ private boolean terminated;
+
+ /**
+ * Terminates the Message chain.
+ */
+ public final void terminate() {
+ terminated = true;
+ }
+
+ /**
+ * Returns whether or not the Message chain has been terminated.
+ *
+ * @return {@code true} if the Message chain has been terminated, otherwise {@code false}.
+ */
+ public final boolean terminated() {
+ return terminated;
+ }
+
}
\ No newline at end of file
diff --git a/src/org/apollo/game/message/handler/MessageHandler.java b/src/org/apollo/game/message/MessageHandler.java
similarity index 50%
rename from src/org/apollo/game/message/handler/MessageHandler.java
rename to src/org/apollo/game/message/MessageHandler.java
index 3e425835..ec787281 100644
--- a/src/org/apollo/game/message/handler/MessageHandler.java
+++ b/src/org/apollo/game/message/MessageHandler.java
@@ -1,14 +1,14 @@
-package org.apollo.game.message.handler;
+package org.apollo.game.message;
-import org.apollo.game.message.Message;
import org.apollo.game.model.World;
import org.apollo.game.model.entity.Player;
/**
- * Handles messages received from the client.
+ * Listens for {@link Message}s received from the client.
*
* @author Graham
- * @param The type of message handled by this class.
+ * @author Ryley
+ * @param The type of Message this class is listening for.
*/
public abstract class MessageHandler {
@@ -18,7 +18,7 @@ public abstract class MessageHandler {
protected final World world;
/**
- * Creates the MessageHandler.
+ * Creates the MessageListener.
*
* @param world The {@link World} the {@link Message} occurred in.
*/
@@ -27,12 +27,11 @@ public abstract class MessageHandler {
}
/**
- * Handles a message.
+ * Handles the Message that was received.
*
- * @param ctx The context.
- * @param player The player.
- * @param message The message.
+ * @param player The player to handle the Message for.
+ * @param message The Message.
*/
- public abstract void handle(MessageHandlerContext ctx, Player player, M message);
+ public abstract void handle(Player player, M message);
}
\ No newline at end of file
diff --git a/src/org/apollo/game/message/MessageHandlerChain.java b/src/org/apollo/game/message/MessageHandlerChain.java
new file mode 100644
index 00000000..413a4ecf
--- /dev/null
+++ b/src/org/apollo/game/message/MessageHandlerChain.java
@@ -0,0 +1,72 @@
+package org.apollo.game.message;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apollo.game.model.entity.Player;
+
+import com.google.common.base.MoreObjects;
+
+/**
+ * A chain of {@link MessageHandler}s
+ *
+ * @author Graham
+ * @author Ryley
+ * @param The Message type this chain represents.
+ */
+public final class MessageHandlerChain {
+
+ /**
+ * The handlers.
+ */
+ private final List> handlers = new ArrayList<>();
+
+ /**
+ * The Class type of this chain.
+ */
+ private final Class type;
+
+ /**
+ * Constructs a new {@link MessageHandlerChain}.
+ *
+ * @param type The Class type of this chain.
+ */
+ public MessageHandlerChain(Class type) {
+ this.type = type;
+ }
+
+ /**
+ * Adds the specified {@link MessageHandler} to this chain.
+ *
+ * @param handler The MessageHandler.
+ */
+ public void addHandler(MessageHandler handler) {
+ handlers.add(handler);
+ }
+
+ /**
+ * Notifies each {@link MessageHandler} in this chain that a {@link Message} has been received.
+ *
+ * @param player The Player to handle this message for.
+ * @param message The Message.
+ * @return {@code true} if and only if the Message propagated down the chain without being terminated, otherwise
+ * {@code false}.
+ */
+ public boolean notify(Player player, M message) {
+ for (MessageHandler handler : handlers) {
+ handler.handle(player, message);
+
+ if (message.terminated()) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(this).add("type", type).add("handlers", handlers).toString();
+ }
+
+}
\ No newline at end of file
diff --git a/src/org/apollo/game/message/MessageHandlerChainSet.java b/src/org/apollo/game/message/MessageHandlerChainSet.java
new file mode 100644
index 00000000..5f2f5582
--- /dev/null
+++ b/src/org/apollo/game/message/MessageHandlerChainSet.java
@@ -0,0 +1,47 @@
+package org.apollo.game.message;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apollo.game.model.entity.Player;
+
+/**
+ * A group of {@link MessageHandlerChain}s classified by the {@link Message} type.
+ *
+ * @author Graham
+ * @author Ryley
+ * @author Major
+ */
+public final class MessageHandlerChainSet {
+
+ /**
+ * The {@link Map} of Message types to {@link MessageHandlerChain}s
+ */
+ private final Map, MessageHandlerChain extends Message>> chains = new HashMap<>();
+
+ /**
+ * Notifies the appropriate {@link MessageHandlerChain} that a {@link Message} has been received.
+ *
+ * @param message The Message.
+ * @return {@code true} if the Message propagated down the chain without being terminated or if the chain for the
+ * Message was not found, otherwise {@code false}.
+ */
+ public boolean notify(Player player, M message) {
+ @SuppressWarnings("unchecked")
+ MessageHandlerChain chain = (MessageHandlerChain) chains.get(message.getClass());
+ return (chain == null) || chain.notify(player, message);
+ }
+
+ /**
+ * Places the {@link MessageHandlerChain} into this set.
+ *
+ * @param clazz The {@link Class} to associate the MessageHandlerChain with.
+ * @param handler The MessageHandlerChain.
+ */
+ @SuppressWarnings("unchecked")
+ public void putHandler(Class clazz, MessageHandler extends Message> handler) {
+ MessageHandlerChain chain = (MessageHandlerChain) chains.computeIfAbsent(clazz, MessageHandlerChain::new);
+ chain.addHandler((MessageHandler) handler);
+ }
+
+}
\ No newline at end of file
diff --git a/src/org/apollo/game/message/handler/impl/BankButtonMessageHandler.java b/src/org/apollo/game/message/handler/BankButtonMessageHandler.java
similarity index 79%
rename from src/org/apollo/game/message/handler/impl/BankButtonMessageHandler.java
rename to src/org/apollo/game/message/handler/BankButtonMessageHandler.java
index 23223019..730b4e3e 100644
--- a/src/org/apollo/game/message/handler/impl/BankButtonMessageHandler.java
+++ b/src/org/apollo/game/message/handler/BankButtonMessageHandler.java
@@ -1,7 +1,6 @@
-package org.apollo.game.message.handler.impl;
+package org.apollo.game.message.handler;
-import org.apollo.game.message.handler.MessageHandler;
-import org.apollo.game.message.handler.MessageHandlerContext;
+import org.apollo.game.message.MessageHandler;
import org.apollo.game.message.impl.ButtonMessage;
import org.apollo.game.model.World;
import org.apollo.game.model.entity.Player;
@@ -33,7 +32,7 @@ public final class BankButtonMessageHandler extends MessageHandler
}
@Override
- public void handle(MessageHandlerContext ctx, Player player, ItemActionMessage message) {
+ public void handle(Player player, ItemActionMessage message) {
if (player.getInterfaceSet().contains(BankConstants.BANK_WINDOW_ID)) {
if (message.getInterfaceId() == BankConstants.SIDEBAR_INVENTORY_ID) {
- deposit(ctx, player, message);
+ deposit(player, message);
} else if (message.getInterfaceId() == BankConstants.BANK_INVENTORY_ID) {
- withdraw(ctx, player, message);
+ withdraw(player, message);
}
}
}
@@ -65,36 +64,34 @@ public final class BankMessageHandler extends MessageHandler
/**
* Handles a deposit action.
*
- * @param ctx The message handler context.
* @param player The player.
* @param message The message.
*/
- private void deposit(MessageHandlerContext ctx, Player player, ItemActionMessage message) {
+ private void deposit(Player player, ItemActionMessage message) {
int amount = optionToAmount(message.getOption());
if (amount == -1) {
EnterAmountListener listener = new BankDepositEnterAmountListener(player, message.getSlot(), message.getId());
player.getInterfaceSet().openEnterAmountDialogue(listener);
} else if (!BankUtils.deposit(player, message.getSlot(), message.getId(), amount)) {
- ctx.breakHandlerChain();
+ message.terminate();
}
}
/**
* Handles a withdraw action.
*
- * @param ctx The message handler context.
* @param player The player.
* @param message The message.
*/
- private void withdraw(MessageHandlerContext ctx, Player player, ItemActionMessage message) {
+ private void withdraw(Player player, ItemActionMessage message) {
int amount = optionToAmount(message.getOption());
if (amount == -1) {
EnterAmountListener listener = new BankWithdrawEnterAmountListener(player, message.getSlot(), message.getId());
player.getInterfaceSet().openEnterAmountDialogue(listener);
} else if (!BankUtils.withdraw(player, message.getSlot(), message.getId(), amount)) {
- ctx.breakHandlerChain();
+ message.terminate();
}
}
diff --git a/src/org/apollo/game/message/handler/impl/ChatMessageHandler.java b/src/org/apollo/game/message/handler/ChatMessageHandler.java
similarity index 72%
rename from src/org/apollo/game/message/handler/impl/ChatMessageHandler.java
rename to src/org/apollo/game/message/handler/ChatMessageHandler.java
index 05b5deeb..a8bdaf4c 100644
--- a/src/org/apollo/game/message/handler/impl/ChatMessageHandler.java
+++ b/src/org/apollo/game/message/handler/ChatMessageHandler.java
@@ -1,7 +1,6 @@
-package org.apollo.game.message.handler.impl;
+package org.apollo.game.message.handler;
-import org.apollo.game.message.handler.MessageHandler;
-import org.apollo.game.message.handler.MessageHandlerContext;
+import org.apollo.game.message.MessageHandler;
import org.apollo.game.message.impl.ChatMessage;
import org.apollo.game.model.World;
import org.apollo.game.model.entity.Player;
@@ -24,7 +23,7 @@ public final class ChatMessageHandler extends MessageHandler {
}
@Override
- public void handle(MessageHandlerContext ctx, Player player, ChatMessage message) {
+ public void handle(Player player, ChatMessage message) {
player.getBlockSet().add(SynchronizationBlock.createChatBlock(player, message));
}
diff --git a/src/org/apollo/game/message/handler/impl/ChatVerificationHandler.java b/src/org/apollo/game/message/handler/ChatVerificationHandler.java
similarity index 70%
rename from src/org/apollo/game/message/handler/impl/ChatVerificationHandler.java
rename to src/org/apollo/game/message/handler/ChatVerificationHandler.java
index a52d6f8e..7b0a8902 100644
--- a/src/org/apollo/game/message/handler/impl/ChatVerificationHandler.java
+++ b/src/org/apollo/game/message/handler/ChatVerificationHandler.java
@@ -1,7 +1,6 @@
-package org.apollo.game.message.handler.impl;
+package org.apollo.game.message.handler;
-import org.apollo.game.message.handler.MessageHandler;
-import org.apollo.game.message.handler.MessageHandlerContext;
+import org.apollo.game.message.MessageHandler;
import org.apollo.game.message.impl.ChatMessage;
import org.apollo.game.model.World;
import org.apollo.game.model.entity.Player;
@@ -23,11 +22,11 @@ public final class ChatVerificationHandler extends MessageHandler {
}
@Override
- public void handle(MessageHandlerContext ctx, Player player, ChatMessage message) {
+ public void handle(Player player, ChatMessage message) {
int color = message.getTextColor();
int effects = message.getTextEffects();
if (color < 0 || color > 11 || effects < 0 || effects > 5) {
- ctx.breakHandlerChain();
+ message.terminate();
}
}
diff --git a/src/org/apollo/game/message/handler/impl/ClosedInterfaceMessageHandler.java b/src/org/apollo/game/message/handler/ClosedInterfaceMessageHandler.java
similarity index 70%
rename from src/org/apollo/game/message/handler/impl/ClosedInterfaceMessageHandler.java
rename to src/org/apollo/game/message/handler/ClosedInterfaceMessageHandler.java
index 3831c654..50dbacff 100644
--- a/src/org/apollo/game/message/handler/impl/ClosedInterfaceMessageHandler.java
+++ b/src/org/apollo/game/message/handler/ClosedInterfaceMessageHandler.java
@@ -1,7 +1,6 @@
-package org.apollo.game.message.handler.impl;
+package org.apollo.game.message.handler;
-import org.apollo.game.message.handler.MessageHandler;
-import org.apollo.game.message.handler.MessageHandlerContext;
+import org.apollo.game.message.MessageHandler;
import org.apollo.game.message.impl.ClosedInterfaceMessage;
import org.apollo.game.model.World;
import org.apollo.game.model.entity.Player;
@@ -23,7 +22,7 @@ public final class ClosedInterfaceMessageHandler extends MessageHandler
}
@Override
- public void handle(MessageHandlerContext ctx, Player player, CommandMessage message) {
+ public void handle(Player player, CommandMessage message) {
String[] components = message.getCommand().split(" ");
String name = components[0];
diff --git a/src/org/apollo/game/message/handler/impl/DialogueButtonHandler.java b/src/org/apollo/game/message/handler/DialogueButtonHandler.java
similarity index 74%
rename from src/org/apollo/game/message/handler/impl/DialogueButtonHandler.java
rename to src/org/apollo/game/message/handler/DialogueButtonHandler.java
index 5bb7e825..f348f990 100644
--- a/src/org/apollo/game/message/handler/impl/DialogueButtonHandler.java
+++ b/src/org/apollo/game/message/handler/DialogueButtonHandler.java
@@ -1,7 +1,6 @@
-package org.apollo.game.message.handler.impl;
+package org.apollo.game.message.handler;
-import org.apollo.game.message.handler.MessageHandler;
-import org.apollo.game.message.handler.MessageHandlerContext;
+import org.apollo.game.message.MessageHandler;
import org.apollo.game.message.impl.ButtonMessage;
import org.apollo.game.model.World;
import org.apollo.game.model.entity.Player;
@@ -25,12 +24,12 @@ public final class DialogueButtonHandler extends MessageHandler {
}
@Override
- public void handle(MessageHandlerContext ctx, Player player, ButtonMessage message) {
+ public void handle(Player player, ButtonMessage message) {
if (player.getInterfaceSet().contains(InterfaceType.DIALOGUE)) {
boolean terminate = player.getInterfaceSet().buttonClicked(message.getWidgetId());
if (terminate) {
- ctx.breakHandlerChain();
+ message.terminate();
}
}
}
diff --git a/src/org/apollo/game/message/handler/impl/DialogueContinueMessageHandler.java b/src/org/apollo/game/message/handler/DialogueContinueMessageHandler.java
similarity index 74%
rename from src/org/apollo/game/message/handler/impl/DialogueContinueMessageHandler.java
rename to src/org/apollo/game/message/handler/DialogueContinueMessageHandler.java
index df3c8fce..afdb57a9 100644
--- a/src/org/apollo/game/message/handler/impl/DialogueContinueMessageHandler.java
+++ b/src/org/apollo/game/message/handler/DialogueContinueMessageHandler.java
@@ -1,7 +1,6 @@
-package org.apollo.game.message.handler.impl;
+package org.apollo.game.message.handler;
-import org.apollo.game.message.handler.MessageHandler;
-import org.apollo.game.message.handler.MessageHandlerContext;
+import org.apollo.game.message.MessageHandler;
import org.apollo.game.message.impl.DialogueContinueMessage;
import org.apollo.game.model.World;
import org.apollo.game.model.entity.Player;
@@ -24,7 +23,7 @@ public final class DialogueContinueMessageHandler extends MessageHandler {
}
@Override
- public void handle(MessageHandlerContext ctx, Player player, ItemOptionMessage message) {
+ public void handle(Player player, ItemOptionMessage message) {
if (message.getOption() != EQUIP_OPTION || message.getInterfaceId() != SynchronizationInventoryListener.INVENTORY_ID) {
return;
}
@@ -60,7 +59,7 @@ public final class EquipItemHandler extends MessageHandler {
String article = LanguageUtil.getIndefiniteArticle(name);
player.sendMessage("You need " + article + " " + name + " level of " + requirement + " to equip this item.");
- ctx.breakHandlerChain();
+ message.terminate();
return;
}
}
@@ -78,7 +77,7 @@ public final class EquipItemHandler extends MessageHandler {
if (definition.isTwoHanded()) {
int slotsRequired = weapon != null && shield != null ? 1 : 0;
if (inventory.freeSlots() < slotsRequired) {
- ctx.breakHandlerChain();
+ message.terminate();
return;
}
diff --git a/src/org/apollo/game/message/handler/impl/ItemOnItemVerificationHandler.java b/src/org/apollo/game/message/handler/ItemOnItemVerificationHandler.java
similarity index 80%
rename from src/org/apollo/game/message/handler/impl/ItemOnItemVerificationHandler.java
rename to src/org/apollo/game/message/handler/ItemOnItemVerificationHandler.java
index 0b5deb99..fe202073 100644
--- a/src/org/apollo/game/message/handler/impl/ItemOnItemVerificationHandler.java
+++ b/src/org/apollo/game/message/handler/ItemOnItemVerificationHandler.java
@@ -1,7 +1,6 @@
-package org.apollo.game.message.handler.impl;
+package org.apollo.game.message.handler;
-import org.apollo.game.message.handler.MessageHandler;
-import org.apollo.game.message.handler.MessageHandlerContext;
+import org.apollo.game.message.MessageHandler;
import org.apollo.game.message.impl.ItemOnItemMessage;
import org.apollo.game.model.Item;
import org.apollo.game.model.World;
@@ -27,7 +26,7 @@ public final class ItemOnItemVerificationHandler extends MessageHandler= inventory.capacity()) {
- ctx.breakHandlerChain();
+ message.terminate();
return;
}
Item item = inventory.get(slot);
if (item == null || item.getId() != message.getTargetId()) {
- ctx.breakHandlerChain();
+ message.terminate();
}
}
diff --git a/src/org/apollo/game/message/handler/impl/ItemOnObjectVerificationHandler.java b/src/org/apollo/game/message/handler/ItemOnObjectVerificationHandler.java
similarity index 77%
rename from src/org/apollo/game/message/handler/impl/ItemOnObjectVerificationHandler.java
rename to src/org/apollo/game/message/handler/ItemOnObjectVerificationHandler.java
index 6e17d237..33e530f8 100644
--- a/src/org/apollo/game/message/handler/impl/ItemOnObjectVerificationHandler.java
+++ b/src/org/apollo/game/message/handler/ItemOnObjectVerificationHandler.java
@@ -1,7 +1,6 @@
-package org.apollo.game.message.handler.impl;
+package org.apollo.game.message.handler;
-import org.apollo.game.message.handler.MessageHandler;
-import org.apollo.game.message.handler.MessageHandlerContext;
+import org.apollo.game.message.MessageHandler;
import org.apollo.game.message.impl.ItemOnObjectMessage;
import org.apollo.game.model.Item;
import org.apollo.game.model.World;
@@ -27,10 +26,10 @@ public final class ItemOnObjectVerificationHandler extends MessageHandler= inventory.capacity()) {
- ctx.breakHandlerChain();
+ message.terminate();
return;
}
Item item = inventory.get(slot);
if (item == null || item.getId() != message.getId()) {
- ctx.breakHandlerChain();
+ message.terminate();
return;
}
}
diff --git a/src/org/apollo/game/message/handler/impl/ItemVerificationHandler.java b/src/org/apollo/game/message/handler/ItemVerificationHandler.java
similarity index 87%
rename from src/org/apollo/game/message/handler/impl/ItemVerificationHandler.java
rename to src/org/apollo/game/message/handler/ItemVerificationHandler.java
index a9754433..6da1c09b 100644
--- a/src/org/apollo/game/message/handler/impl/ItemVerificationHandler.java
+++ b/src/org/apollo/game/message/handler/ItemVerificationHandler.java
@@ -1,10 +1,9 @@
-package org.apollo.game.message.handler.impl;
+package org.apollo.game.message.handler;
import java.util.HashMap;
import java.util.Map;
-import org.apollo.game.message.handler.MessageHandler;
-import org.apollo.game.message.handler.MessageHandlerContext;
+import org.apollo.game.message.MessageHandler;
import org.apollo.game.message.impl.InventoryItemMessage;
import org.apollo.game.model.Item;
import org.apollo.game.model.World;
@@ -72,10 +71,10 @@ public final class ItemVerificationHandler extends MessageHandler= inventory.capacity()) {
- ctx.breakHandlerChain();
+ message.terminate();
return;
}
Item item = inventory.get(slot);
if (item == null || item.getId() != message.getId()) {
- ctx.breakHandlerChain();
+ message.terminate();
}
}
diff --git a/src/org/apollo/game/message/handler/MessageHandlerChain.java b/src/org/apollo/game/message/handler/MessageHandlerChain.java
deleted file mode 100644
index 7954d7ef..00000000
--- a/src/org/apollo/game/message/handler/MessageHandlerChain.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package org.apollo.game.message.handler;
-
-import java.util.ArrayDeque;
-import java.util.Arrays;
-import java.util.Deque;
-
-import org.apollo.game.message.Message;
-import org.apollo.game.model.entity.Player;
-
-/**
- * A chain of message handlers.
- *
- * @author Graham
- * @author Ryley
- * @param The type of message handled by this chain.
- */
-public final class MessageHandlerChain {
-
- /**
- * The handlers.
- */
- private final Deque> handlers;
-
- /**
- * Creates the message handler chain.
- *
- * @param handlers The handlers.
- */
- @SafeVarargs
- public MessageHandlerChain(MessageHandler... handlers) {
- this.handlers = new ArrayDeque<>(Arrays.asList(handlers));
- }
-
- /**
- * Dynamically adds a message handler to the end of the chain.
- *
- * @param handler The handler.
- */
- public void addLast(MessageHandler handler) {
- handlers.addLast(handler);
- }
-
- /**
- * Handles the message, passing it down the chain until the chain is broken or the message reaches the end of the
- * chain.
- *
- * @param player The player.
- * @param message The message.
- */
- public void handle(Player player, M message) {
- MessageHandlerContext context = new MessageHandlerContext();
-
- for (MessageHandler handler : handlers) {
- handler.handle(context, player, message);
-
- if (context.isBroken()) {
- break;
- }
- }
- }
-
-}
\ No newline at end of file
diff --git a/src/org/apollo/game/message/handler/MessageHandlerChainGroup.java b/src/org/apollo/game/message/handler/MessageHandlerChainGroup.java
deleted file mode 100644
index a9d9611a..00000000
--- a/src/org/apollo/game/message/handler/MessageHandlerChainGroup.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package org.apollo.game.message.handler;
-
-import java.util.Map;
-
-import org.apollo.game.message.Message;
-
-/**
- * A group of {@link MessageHandlerChain}s classified by the {@link Message} type.
- *
- * @author Graham
- */
-public final class MessageHandlerChainGroup {
-
- /**
- * The map of message classes to message handler chains.
- */
- private final Map, MessageHandlerChain>> chains;
-
- /**
- * Creates the message handler chain group.
- *
- * @param chains The chains map.
- */
- public MessageHandlerChainGroup(Map, MessageHandlerChain>> chains) {
- this.chains = chains;
- }
-
- /**
- * Gets a {@link MessageHandlerChain} from this group.
- *
- * @param clazz The message class.
- * @return The {@link MessageHandlerChain} if one was found, {@code null} otherwise.
- */
- @SuppressWarnings("unchecked")
- public MessageHandlerChain getChain(Class clazz) {
- return (MessageHandlerChain) chains.get(clazz);
- }
-
- /**
- * Registers a {@link MessageHandlerChain} associated with the specified {@link Class} to this group.
- *
- * @param clazz The message class.
- * @param chain The message handler chain.
- */
- public void register(Class clazz, MessageHandlerChain chain) {
- chains.put(clazz, chain);
- }
-
-}
\ No newline at end of file
diff --git a/src/org/apollo/game/message/handler/MessageHandlerContext.java b/src/org/apollo/game/message/handler/MessageHandlerContext.java
deleted file mode 100644
index 4fda61db..00000000
--- a/src/org/apollo/game/message/handler/MessageHandlerContext.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package org.apollo.game.message.handler;
-
-/**
- * Provides operations specific to a {@link MessageHandler} in a {@link MessageHandlerChain}.
- *
- * @author Graham
- * @author Ryley
- */
-public final class MessageHandlerContext {
-
- /**
- * Denotes whether or not this handler chain is broken.
- */
- private boolean broken;
-
- /**
- * Breaks the handler chain.
- */
- public void breakHandlerChain() {
- broken = true;
- }
-
- /**
- * Returns whether or not this handler chain is broken.
- *
- * @return {@code true} if this handler chain is broken, otherwise {@code false}.
- */
- public boolean isBroken() {
- return broken;
- }
-
-}
\ No newline at end of file
diff --git a/src/org/apollo/game/message/handler/impl/NpcActionVerificationHandler.java b/src/org/apollo/game/message/handler/NpcActionVerificationHandler.java
similarity index 78%
rename from src/org/apollo/game/message/handler/impl/NpcActionVerificationHandler.java
rename to src/org/apollo/game/message/handler/NpcActionVerificationHandler.java
index f1e22e01..f2109e1a 100644
--- a/src/org/apollo/game/message/handler/impl/NpcActionVerificationHandler.java
+++ b/src/org/apollo/game/message/handler/NpcActionVerificationHandler.java
@@ -1,7 +1,6 @@
-package org.apollo.game.message.handler.impl;
+package org.apollo.game.message.handler;
-import org.apollo.game.message.handler.MessageHandler;
-import org.apollo.game.message.handler.MessageHandlerContext;
+import org.apollo.game.message.MessageHandler;
import org.apollo.game.message.impl.NpcActionMessage;
import org.apollo.game.model.World;
import org.apollo.game.model.def.NpcDefinition;
@@ -27,12 +26,12 @@ public final class NpcActionVerificationHandler extends MessageHandler repository = world.getNpcRepository();
if (index < 0 || index >= repository.capacity()) {
- ctx.breakHandlerChain();
+ message.terminate();
return;
}
@@ -40,13 +39,13 @@ public final class NpcActionVerificationHandler extends MessageHandler= definition.getInteractions().length) {
- ctx.breakHandlerChain();
+ message.terminate();
return;
}
}
diff --git a/src/org/apollo/game/message/handler/impl/ObjectActionVerificationHandler.java b/src/org/apollo/game/message/handler/ObjectActionVerificationHandler.java
similarity index 84%
rename from src/org/apollo/game/message/handler/impl/ObjectActionVerificationHandler.java
rename to src/org/apollo/game/message/handler/ObjectActionVerificationHandler.java
index 6e8a516e..e9b2bd3f 100644
--- a/src/org/apollo/game/message/handler/impl/ObjectActionVerificationHandler.java
+++ b/src/org/apollo/game/message/handler/ObjectActionVerificationHandler.java
@@ -1,10 +1,9 @@
-package org.apollo.game.message.handler.impl;
+package org.apollo.game.message.handler;
import java.util.List;
import java.util.Set;
-import org.apollo.game.message.handler.MessageHandler;
-import org.apollo.game.message.handler.MessageHandlerContext;
+import org.apollo.game.message.MessageHandler;
import org.apollo.game.message.impl.ObjectActionMessage;
import org.apollo.game.model.Position;
import org.apollo.game.model.World;
@@ -42,10 +41,10 @@ public final class ObjectActionVerificationHandler extends MessageHandler
*
* @param button The button interface id.
- * @return {@code true} if the message handler chain should be broken, {@code false} if it should be continued.
+ * @return {@code true} if the {@link MessageHandlerChain} should be broken, {@code false} if it should be continued.
*/
public boolean buttonClicked(int button);
diff --git a/src/org/apollo/game/scheduling/Scheduler.java b/src/org/apollo/game/scheduling/Scheduler.java
index 8c71d6e3..c3af4301 100644
--- a/src/org/apollo/game/scheduling/Scheduler.java
+++ b/src/org/apollo/game/scheduling/Scheduler.java
@@ -6,6 +6,8 @@ import java.util.Iterator;
import java.util.List;
import java.util.Queue;
+import org.apollo.util.CollectionUtil;
+
/**
* A class which manages {@link ScheduledTask}s.
*
@@ -14,29 +16,26 @@ import java.util.Queue;
public final class Scheduler {
/**
- * A queue of new tasks that should be added.
+ * An {@link ArrayDeque} of tasks that are pending execution.
*/
- private Queue newTasks = new ArrayDeque<>();
+ private final Queue pendingTasks = new ArrayDeque<>();
/**
- * A list of currently active tasks.
+ * An {@link ArrayList} of currently active tasks.
*/
- private List tasks = new ArrayList<>();
+ private final List tasks = new ArrayList<>();
/**
* Called every pulse: executes tasks that are still pending, adds new tasks and stops old tasks.
*/
public void pulse() {
- ScheduledTask task;
- while ((task = newTasks.poll()) != null) {
- tasks.add(task);
- }
+ CollectionUtil.pollAll(pendingTasks, tasks::add);
- for (Iterator it = tasks.iterator(); it.hasNext();) {
- task = it.next();
+ for (Iterator iterator = tasks.iterator(); iterator.hasNext();) {
+ ScheduledTask task = iterator.next();
task.pulse();
- if (!task.isRunning()) {
- it.remove();
+ if (task.isRunning()) {
+ iterator.remove();
}
}
}
@@ -48,7 +47,7 @@ public final class Scheduler {
* @return {@code true} if the task was added successfully.
*/
public boolean schedule(ScheduledTask task) {
- return newTasks.add(task);
+ return pendingTasks.add(task);
}
}
\ No newline at end of file
diff --git a/src/org/apollo/io/MessageHandlerChainParser.java b/src/org/apollo/io/MessageHandlerChainSetParser.java
similarity index 64%
rename from src/org/apollo/io/MessageHandlerChainParser.java
rename to src/org/apollo/io/MessageHandlerChainSetParser.java
index df14262c..73cf3c2c 100644
--- a/src/org/apollo/io/MessageHandlerChainParser.java
+++ b/src/org/apollo/io/MessageHandlerChainSetParser.java
@@ -2,26 +2,22 @@ package org.apollo.io;
import java.io.IOException;
import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
import org.apollo.game.message.Message;
-import org.apollo.game.message.handler.MessageHandler;
-import org.apollo.game.message.handler.MessageHandlerChain;
-import org.apollo.game.message.handler.MessageHandlerChainGroup;
+import org.apollo.game.message.MessageHandler;
+import org.apollo.game.message.MessageHandlerChain;
+import org.apollo.game.message.MessageHandlerChainSet;
import org.apollo.game.model.World;
import org.apollo.util.xml.XmlNode;
import org.apollo.util.xml.XmlParser;
import org.xml.sax.SAXException;
/**
- * A class that parses the {@code messages.xml} file to produce {@link MessageHandlerChainGroup}s.
+ * A class that parses the {@code messages.xml} file to produce {@link MessageHandlerChainSet}s.
*
* @author Graham
*/
-public final class MessageHandlerChainParser {
+public final class MessageHandlerChainSetParser {
/**
* The source {@link InputStream}.
@@ -39,7 +35,7 @@ public final class MessageHandlerChainParser {
* @param is The source {@link InputStream}.
* @throws SAXException If a SAX error occurs.
*/
- public MessageHandlerChainParser(InputStream is) throws SAXException {
+ public MessageHandlerChainSetParser(InputStream is) throws SAXException {
this.is = is;
}
@@ -47,18 +43,18 @@ public final class MessageHandlerChainParser {
* Parses the XML and produces a group of {@link MessageHandlerChain}s.
*
* @param world The {@link World} this MessageHandlerChainGroup is for.
- * @return A {@link MessageHandlerChainGroup}.
+ * @return A {@link MessageHandlerChainSet}.
* @throws IOException If an I/O error occurs.
* @throws SAXException If a SAX error occurs.
* @throws ReflectiveOperationException If a reflection error occurs.
*/
- public MessageHandlerChainGroup parse(World world) throws IOException, SAXException, ReflectiveOperationException {
+ public MessageHandlerChainSet parse(World world) throws IOException, SAXException, ReflectiveOperationException {
XmlNode messages = parser.parse(is);
if (!messages.getName().equals("messages")) {
throw new IOException("Root node name is not 'messages'.");
}
- Map, MessageHandlerChain>> chains = new HashMap<>();
+ MessageHandlerChainSet chainSet = new MessageHandlerChainSet();
for (XmlNode message : messages) {
if (!message.getName().equals("message")) {
@@ -81,7 +77,6 @@ public final class MessageHandlerChainParser {
@SuppressWarnings("unchecked")
Class extends Message> messageClass = (Class extends Message>) Class.forName(messageClassName);
- List> handlers = new ArrayList<>();
for (XmlNode handlerNode : chainNode) {
if (!handlerNode.getName().equals("handler")) {
@@ -94,20 +89,13 @@ public final class MessageHandlerChainParser {
}
@SuppressWarnings("unchecked")
- Class extends MessageHandler>> handlerClass = (Class extends MessageHandler>>) Class
- .forName(handlerClassName);
- MessageHandler> handler = handlerClass.getConstructor(World.class).newInstance(world);
- handlers.add(handler);
+ Class extends MessageHandler extends Message>> handlerClass = (Class extends MessageHandler extends Message>>) Class.forName(handlerClassName);
+ MessageHandler extends Message> handler = handlerClass.getConstructor(World.class).newInstance(world);
+ chainSet.putHandler(messageClass, handler);
}
-
- MessageHandler>[] handlersArray = handlers.toArray(new MessageHandler>[handlers.size()]);
- @SuppressWarnings({ "rawtypes", "unchecked" })
- MessageHandlerChain> chain = new MessageHandlerChain(handlersArray);
-
- chains.put(messageClass, chain);
}
- return new MessageHandlerChainGroup(chains);
+ return chainSet;
}
}
\ No newline at end of file
diff --git a/src/org/apollo/net/release/r317/FirstNpcActionMessageDecoder.java b/src/org/apollo/net/release/r317/FirstNpcActionMessageDecoder.java
index 2711d7ce..fbe8fb45 100644
--- a/src/org/apollo/net/release/r317/FirstNpcActionMessageDecoder.java
+++ b/src/org/apollo/net/release/r317/FirstNpcActionMessageDecoder.java
@@ -1,7 +1,10 @@
package org.apollo.net.release.r317;
import org.apollo.game.message.impl.FirstNpcActionMessage;
-import org.apollo.net.codec.game.*;
+import org.apollo.net.codec.game.DataOrder;
+import org.apollo.net.codec.game.DataType;
+import org.apollo.net.codec.game.GamePacket;
+import org.apollo.net.codec.game.GamePacketReader;
import org.apollo.net.release.MessageDecoder;
/**
diff --git a/src/org/apollo/net/release/r317/SecondNpcActionMessageDecoder.java b/src/org/apollo/net/release/r317/SecondNpcActionMessageDecoder.java
index bb8d3f32..7b25cd13 100644
--- a/src/org/apollo/net/release/r317/SecondNpcActionMessageDecoder.java
+++ b/src/org/apollo/net/release/r317/SecondNpcActionMessageDecoder.java
@@ -1,7 +1,10 @@
package org.apollo.net.release.r317;
import org.apollo.game.message.impl.SecondNpcActionMessage;
-import org.apollo.net.codec.game.*;
+import org.apollo.net.codec.game.DataTransformation;
+import org.apollo.net.codec.game.DataType;
+import org.apollo.net.codec.game.GamePacket;
+import org.apollo.net.codec.game.GamePacketReader;
import org.apollo.net.release.MessageDecoder;
/**
diff --git a/src/org/apollo/net/release/r317/ThirdNpcActionMessageDecoder.java b/src/org/apollo/net/release/r317/ThirdNpcActionMessageDecoder.java
index f5462c19..b85c2396 100644
--- a/src/org/apollo/net/release/r317/ThirdNpcActionMessageDecoder.java
+++ b/src/org/apollo/net/release/r317/ThirdNpcActionMessageDecoder.java
@@ -1,7 +1,11 @@
package org.apollo.net.release.r317;
import org.apollo.game.message.impl.ThirdNpcActionMessage;
-import org.apollo.net.codec.game.*;
+import org.apollo.net.codec.game.DataOrder;
+import org.apollo.net.codec.game.DataTransformation;
+import org.apollo.net.codec.game.DataType;
+import org.apollo.net.codec.game.GamePacket;
+import org.apollo.net.codec.game.GamePacketReader;
import org.apollo.net.release.MessageDecoder;
/**
diff --git a/src/org/apollo/net/release/r377/FirstNpcActionMessageDecoder.java b/src/org/apollo/net/release/r377/FirstNpcActionMessageDecoder.java
index c9d66859..2b5b4f4f 100644
--- a/src/org/apollo/net/release/r377/FirstNpcActionMessageDecoder.java
+++ b/src/org/apollo/net/release/r377/FirstNpcActionMessageDecoder.java
@@ -1,7 +1,10 @@
package org.apollo.net.release.r377;
import org.apollo.game.message.impl.FirstNpcActionMessage;
-import org.apollo.net.codec.game.*;
+import org.apollo.net.codec.game.DataOrder;
+import org.apollo.net.codec.game.DataType;
+import org.apollo.net.codec.game.GamePacket;
+import org.apollo.net.codec.game.GamePacketReader;
import org.apollo.net.release.MessageDecoder;
/**
diff --git a/src/org/apollo/net/release/r377/SecondNpcActionMessageDecoder.java b/src/org/apollo/net/release/r377/SecondNpcActionMessageDecoder.java
index a345064e..79d87516 100644
--- a/src/org/apollo/net/release/r377/SecondNpcActionMessageDecoder.java
+++ b/src/org/apollo/net/release/r377/SecondNpcActionMessageDecoder.java
@@ -1,7 +1,10 @@
package org.apollo.net.release.r377;
import org.apollo.game.message.impl.SecondNpcActionMessage;
-import org.apollo.net.codec.game.*;
+import org.apollo.net.codec.game.DataTransformation;
+import org.apollo.net.codec.game.DataType;
+import org.apollo.net.codec.game.GamePacket;
+import org.apollo.net.codec.game.GamePacketReader;
import org.apollo.net.release.MessageDecoder;
/**
diff --git a/src/org/apollo/net/session/GameSession.java b/src/org/apollo/net/session/GameSession.java
index b5416245..05a487c9 100644
--- a/src/org/apollo/net/session/GameSession.java
+++ b/src/org/apollo/net/session/GameSession.java
@@ -13,10 +13,10 @@ import org.apollo.ServerContext;
import org.apollo.game.GameConstants;
import org.apollo.game.GameService;
import org.apollo.game.message.Message;
-import org.apollo.game.message.handler.MessageHandlerChain;
-import org.apollo.game.message.handler.MessageHandlerChainGroup;
+import org.apollo.game.message.MessageHandlerChainSet;
import org.apollo.game.message.impl.LogoutMessage;
import org.apollo.game.model.entity.Player;
+import org.apollo.util.CollectionUtil;
/**
* A game session.
@@ -81,34 +81,16 @@ public final class GameSession extends Session {
/**
* Handles pending messages for this session.
*
- * @param chainGroup The message chain group.
+ * @param chainSet The {@link MessageHandlerChainSet}
*/
- @SuppressWarnings("unchecked")
- public void handlePendingMessages(MessageHandlerChainGroup chainGroup) {
- Message message;
- while ((message = messageQueue.poll()) != null) {
- // this lookup code really sucks!
- // TODO improve it!
- Class extends Message> messageType = message.getClass();
- MessageHandlerChain chain = (MessageHandlerChain) chainGroup.getChain(messageType);
-
- while (chain == null && messageType != null) {
- messageType = (Class extends Message>) messageType.getSuperclass();
- if (messageType == Message.class) {
- messageType = null;
- } else {
- chain = (MessageHandlerChain) chainGroup.getChain(messageType);
- }
+ public void handlePendingMessages(MessageHandlerChainSet chainSet) {
+ CollectionUtil.pollAll(messageQueue, message -> {
+ try {
+ chainSet.notify(player, message);
+ } catch (Exception reason) {
+ logger.log(Level.SEVERE, "Uncaught exception thrown while handling message: " + message, reason);
}
-
- if (chain != null) {
- try {
- chain.handle(player, message);
- } catch (Exception ex) {
- logger.log(Level.SEVERE, "Error handling message: ", ex);
- }
- }
- }
+ });
}
/**
diff --git a/src/org/apollo/util/CollectionUtil.java b/src/org/apollo/util/CollectionUtil.java
new file mode 100644
index 00000000..9c1d17dc
--- /dev/null
+++ b/src/org/apollo/util/CollectionUtil.java
@@ -0,0 +1,40 @@
+package org.apollo.util;
+
+import java.util.Collection;
+import java.util.Queue;
+import java.util.function.Consumer;
+
+import com.google.common.base.Preconditions;
+
+/**
+ * A utility class containing helper methods for various {@link Collection} objects.
+ *
+ * @author Ryley
+ */
+public final class CollectionUtil {
+
+ /**
+ * Polls every element within the specified {@link Queue} and performs the specified {@link Consumer} event for each
+ * element.
+ *
+ * @param queue The Queue to poll each element for, may not be {@code null}.
+ * @param consumer The Consumer event to execute for each polled element, may not be {@code null}.
+ */
+ public static void pollAll(Queue queue, Consumer consumer) {
+ Preconditions.checkNotNull(queue, "Queue may not be null");
+ Preconditions.checkNotNull(consumer, "Consumer may not be null");
+
+ T element;
+ while ((element = queue.poll()) != null) {
+ consumer.accept(element);
+ }
+ }
+
+ /**
+ * Suppresses the default public constructor to discourage normal instantiation outside of this class.
+ */
+ private CollectionUtil() {
+
+ }
+
+}
\ No newline at end of file
diff --git a/src/org/apollo/util/plugin/PluginContext.java b/src/org/apollo/util/plugin/PluginContext.java
index 8fa6fc05..7ec9096b 100644
--- a/src/org/apollo/util/plugin/PluginContext.java
+++ b/src/org/apollo/util/plugin/PluginContext.java
@@ -3,9 +3,9 @@ package org.apollo.util.plugin;
import org.apollo.ServerContext;
import org.apollo.game.GameService;
import org.apollo.game.message.Message;
-import org.apollo.game.message.handler.MessageHandler;
-import org.apollo.game.message.handler.MessageHandlerChain;
-import org.apollo.game.message.handler.MessageHandlerChainGroup;
+import org.apollo.game.message.MessageHandler;
+import org.apollo.game.message.MessageHandlerChain;
+import org.apollo.game.message.MessageHandlerChainSet;
/**
* The {@link PluginContext} contains methods a plugin can use to interface with the server, for example, by adding
@@ -31,20 +31,14 @@ public final class PluginContext {
}
/**
- * Adds a {@link MessageHandler} to the end of the chain.
+ * Adds a {@link MessageHandler} to the {@link MessageHandlerChainSet}.
*
* @param message The message.
* @param handler The handler.
*/
- public void addLastMessageHandler(Class message, MessageHandler handler) {
- MessageHandlerChainGroup chains = context.getService(GameService.class).getMessageHandlerChains();
- MessageHandlerChain chain = chains.getChain(message);
- if (chain == null) {
- chain = new MessageHandlerChain<>(handler);
- chains.register(message, chain);
- } else {
- chain.addLast(handler);
- }
+ public void addMessageHandler(Class message, MessageHandler handler) {
+ MessageHandlerChainSet chains = context.getService(GameService.class).getMessageHandlerChainSet();
+ chains.putHandler(message, handler);
}
}
\ No newline at end of file
diff --git a/src/org/apollo/util/xml/XmlNode.java b/src/org/apollo/util/xml/XmlNode.java
index fceab153..670961c1 100644
--- a/src/org/apollo/util/xml/XmlNode.java
+++ b/src/org/apollo/util/xml/XmlNode.java
@@ -1,6 +1,14 @@
package org.apollo.util.xml;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
/**
* A class which represents a single node in the DOM tree, maintaining information about its children, attributes, value
From 8a558a8200a1ea28798afa682cc884f2743f5d0d Mon Sep 17 00:00:00 2001
From: atomicint
Date: Sun, 29 Mar 2015 15:11:47 -0400
Subject: [PATCH 3/6] Use Guava for building thread factory, remove reudndant
utility
---
src/org/apollo/game/GameService.java | 5 ++-
.../game/sync/ParallelClientSynchronizer.java | 5 ++-
src/org/apollo/login/LoginService.java | 5 ++-
src/org/apollo/util/NamedThreadFactory.java | 42 -------------------
4 files changed, 9 insertions(+), 48 deletions(-)
delete mode 100644 src/org/apollo/util/NamedThreadFactory.java
diff --git a/src/org/apollo/game/GameService.java b/src/org/apollo/game/GameService.java
index d6bdee08..b85a7b91 100644
--- a/src/org/apollo/game/GameService.java
+++ b/src/org/apollo/game/GameService.java
@@ -20,11 +20,12 @@ import org.apollo.io.MessageHandlerChainSetParser;
import org.apollo.login.LoginService;
import org.apollo.net.session.GameSession;
import org.apollo.util.MobRepository;
-import org.apollo.util.NamedThreadFactory;
import org.apollo.util.xml.XmlNode;
import org.apollo.util.xml.XmlParser;
import org.xml.sax.SAXException;
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
+
/**
* The {@link GameService} class schedules and manages the execution of the {@link GamePulseHandler} class.
*
@@ -51,7 +52,7 @@ public final class GameService extends Service {
/**
* The scheduled executor service.
*/
- private final ScheduledExecutorService scheduledExecutor = Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory("GameService"));
+ private final ScheduledExecutorService scheduledExecutor = Executors.newSingleThreadScheduledExecutor(new ThreadFactoryBuilder().setNameFormat("GameService").build());
/**
* The {@link ClientSynchronizer}.
diff --git a/src/org/apollo/game/sync/ParallelClientSynchronizer.java b/src/org/apollo/game/sync/ParallelClientSynchronizer.java
index 49ddc088..325a2ce3 100644
--- a/src/org/apollo/game/sync/ParallelClientSynchronizer.java
+++ b/src/org/apollo/game/sync/ParallelClientSynchronizer.java
@@ -22,7 +22,8 @@ import org.apollo.game.sync.task.PreNpcSynchronizationTask;
import org.apollo.game.sync.task.PrePlayerSynchronizationTask;
import org.apollo.game.sync.task.SynchronizationTask;
import org.apollo.util.MobRepository;
-import org.apollo.util.NamedThreadFactory;
+
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
/**
* An implementation of {@link ClientSynchronizer} which runs in a thread pool. A {@link Phaser} is used to ensure that
@@ -52,7 +53,7 @@ public final class ParallelClientSynchronizer extends ClientSynchronizer {
*/
public ParallelClientSynchronizer() {
int processors = Runtime.getRuntime().availableProcessors();
- ThreadFactory factory = new NamedThreadFactory("ClientSynchronizer");
+ ThreadFactory factory = new ThreadFactoryBuilder().setNameFormat("ClientSynchronizer").build();
executor = Executors.newFixedThreadPool(processors, factory);
}
diff --git a/src/org/apollo/login/LoginService.java b/src/org/apollo/login/LoginService.java
index d0984dc1..873e265d 100644
--- a/src/org/apollo/login/LoginService.java
+++ b/src/org/apollo/login/LoginService.java
@@ -16,11 +16,12 @@ import org.apollo.net.codec.login.LoginRequest;
import org.apollo.net.release.Release;
import org.apollo.net.session.GameSession;
import org.apollo.net.session.LoginSession;
-import org.apollo.util.NamedThreadFactory;
import org.apollo.util.xml.XmlNode;
import org.apollo.util.xml.XmlParser;
import org.xml.sax.SAXException;
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
+
/**
* The {@link LoginService} manages {@link LoginRequest}s.
*
@@ -32,7 +33,7 @@ public final class LoginService extends Service {
/**
* The {@link ExecutorService} to which workers are submitted.
*/
- private final ExecutorService executor = Executors.newCachedThreadPool(new NamedThreadFactory("LoginService"));
+ private final ExecutorService executor = Executors.newCachedThreadPool(new ThreadFactoryBuilder().setNameFormat("LoginService").build());
/**
* The current {@link PlayerSerializer}.
diff --git a/src/org/apollo/util/NamedThreadFactory.java b/src/org/apollo/util/NamedThreadFactory.java
deleted file mode 100644
index 78181380..00000000
--- a/src/org/apollo/util/NamedThreadFactory.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.apollo.util;
-
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.atomic.AtomicInteger;
-
-/**
- * A {@link ThreadFactory} which gives each thread a unique name made up of the name supplied in the constructor and
- * postfixed with an id.
- *
- * For example, if the name {@code MyThread} was given and a third thread was created by the factory, the resulting name
- * would be {@code MyThread [id=2]}.
- *
- * @author Graham
- */
-public final class NamedThreadFactory implements ThreadFactory {
-
- /**
- * The next id.
- */
- private AtomicInteger id = new AtomicInteger(0);
-
- /**
- * The unique name.
- */
- private final String name;
-
- /**
- * Creates the named thread factory.
- *
- * @param name The unique name.
- */
- public NamedThreadFactory(String name) {
- this.name = name;
- }
-
- @Override
- public Thread newThread(Runnable runnable) {
- int currentId = id.getAndIncrement();
- return new Thread(runnable, name + " [id=" + currentId + "]");
- }
-
-}
\ No newline at end of file
From cf2f06c702c28da58c2bb30289bb3bdd7276341c Mon Sep 17 00:00:00 2001
From: atomicint
Date: Sun, 29 Mar 2015 18:25:56 -0400
Subject: [PATCH 4/6] Fixed package location for message handlers in
messages.xml
---
data/messages.xml | 48 +++++++++++++++++++++++------------------------
1 file changed, 24 insertions(+), 24 deletions(-)
diff --git a/data/messages.xml b/data/messages.xml
index edffdefa..df5ddd1b 100644
--- a/data/messages.xml
+++ b/data/messages.xml
@@ -2,110 +2,110 @@
org.apollo.game.message.impl.ButtonMessage
- org.apollo.game.message.handler.impl.DialogueButtonHandler
- org.apollo.game.message.handler.impl.BankButtonMessageHandler
+ org.apollo.game.message.handler.DialogueButtonHandler
+ org.apollo.game.message.handler.BankButtonMessageHandler
org.apollo.game.message.impl.ChatMessage
- org.apollo.game.message.handler.impl.ChatVerificationHandler
- org.apollo.game.message.handler.impl.ChatMessageHandler
+ org.apollo.game.message.handler.ChatVerificationHandler
+ org.apollo.game.message.handler.ChatMessageHandler
org.apollo.game.message.impl.ClosedInterfaceMessage
- org.apollo.game.message.handler.impl.ClosedInterfaceMessageHandler
+ org.apollo.game.message.handler.ClosedInterfaceMessageHandler
org.apollo.game.message.impl.CommandMessage
- org.apollo.game.message.handler.impl.CommandMessageHandler
+ org.apollo.game.message.handler.CommandMessageHandler
org.apollo.game.message.impl.DialogueContinueMessage
- org.apollo.game.message.handler.impl.DialogueContinueMessageHandler
+ org.apollo.game.message.handler.DialogueContinueMessageHandler
org.apollo.game.message.impl.EnteredAmountMessage
- org.apollo.game.message.handler.impl.EnteredAmountMessageHandler
+ org.apollo.game.message.handler.EnteredAmountMessageHandler
org.apollo.game.message.impl.ItemActionMessage
- org.apollo.game.message.handler.impl.ItemVerificationHandler
- org.apollo.game.message.handler.impl.RemoveEquippedItemHandler
- org.apollo.game.message.handler.impl.BankMessageHandler
+ org.apollo.game.message.handler.ItemVerificationHandler
+ org.apollo.game.message.handler.RemoveEquippedItemHandler
+ org.apollo.game.message.handler.BankMessageHandler
org.apollo.game.message.impl.ItemOnItemMessage
- org.apollo.game.message.handler.impl.ItemVerificationHandler
- org.apollo.game.message.handler.impl.ItemOnItemVerificationHandler
+ org.apollo.game.message.handler.ItemVerificationHandler
+ org.apollo.game.message.handler.ItemOnItemVerificationHandler
org.apollo.game.message.impl.ItemOnObjectMessage
- org.apollo.game.message.handler.impl.ItemOnObjectVerificationHandler
+ org.apollo.game.message.handler.ItemOnObjectVerificationHandler
org.apollo.game.message.impl.ItemOptionMessage
- org.apollo.game.message.handler.impl.ItemVerificationHandler
- org.apollo.game.message.handler.impl.EquipItemHandler
+ org.apollo.game.message.handler.ItemVerificationHandler
+ org.apollo.game.message.handler.EquipItemHandler
org.apollo.game.message.impl.MagicOnItemMessage
- org.apollo.game.message.handler.impl.ItemVerificationHandler
+ org.apollo.game.message.handler.ItemVerificationHandler
org.apollo.game.message.impl.NpcActionMessage
- org.apollo.game.message.handler.impl.NpcActionVerificationHandler
+ org.apollo.game.message.handler.NpcActionVerificationHandler
org.apollo.game.message.impl.ObjectActionMessage
- org.apollo.game.message.handler.impl.ObjectActionVerificationHandler
+ org.apollo.game.message.handler.ObjectActionVerificationHandler
org.apollo.game.message.impl.PlayerActionMessage
- org.apollo.game.message.handler.impl.PlayerActionVerificationHandler
+ org.apollo.game.message.handler.PlayerActionVerificationHandler
org.apollo.game.message.impl.PlayerDesignMessage
- org.apollo.game.message.handler.impl.PlayerDesignVerificationHandler
- org.apollo.game.message.handler.impl.PlayerDesignMessageHandler
+ org.apollo.game.message.handler.PlayerDesignVerificationHandler
+ org.apollo.game.message.handler.PlayerDesignMessageHandler
org.apollo.game.message.impl.SwitchItemMessage
- org.apollo.game.message.handler.impl.SwitchItemMessageHandler
+ org.apollo.game.message.handler.SwitchItemMessageHandler
org.apollo.game.message.impl.WalkMessage
- org.apollo.game.message.handler.impl.WalkMessageHandler
+ org.apollo.game.message.handler.WalkMessageHandler
\ No newline at end of file
From 218739a4fff333bdced9ddd4932ceb5483edfdc4 Mon Sep 17 00:00:00 2001
From: atomicint
Date: Sun, 29 Mar 2015 18:59:25 -0400
Subject: [PATCH 5/6] Remove redundant MobRepository access
---
src/org/apollo/util/MobRepository.java | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/org/apollo/util/MobRepository.java b/src/org/apollo/util/MobRepository.java
index 4b1e537d..f8df976f 100644
--- a/src/org/apollo/util/MobRepository.java
+++ b/src/org/apollo/util/MobRepository.java
@@ -49,11 +49,11 @@ public final class MobRepository implements Iterable {
@Override
public boolean hasNext() {
- if (foundIndex == repository.size()) {
+ if (foundIndex == size()) {
return false;
}
- while (currentIndex < repository.capacity()) {
+ while (currentIndex < capacity()) {
if (mobs[currentIndex++] != null) {
foundIndex++;
return true;
@@ -64,7 +64,7 @@ public final class MobRepository implements Iterable {
@Override
public T next() {
- return repository.get(currentIndex);
+ return get(currentIndex);
}
@Override
From bdec06a4ca0fe396b66c6909a02ba8a12f03705e Mon Sep 17 00:00:00 2001
From: atomicint
Date: Tue, 31 Mar 2015 19:45:20 -0400
Subject: [PATCH 6/6] Let PlayerCredentials house the connecting remote
address.
---
.../apollo/net/codec/login/LoginDecoder.java | 9 +++++++--
src/org/apollo/security/PlayerCredentials.java | 18 +++++++++++++++++-
2 files changed, 24 insertions(+), 3 deletions(-)
diff --git a/src/org/apollo/net/codec/login/LoginDecoder.java b/src/org/apollo/net/codec/login/LoginDecoder.java
index 39aa11be..1bb136ce 100644
--- a/src/org/apollo/net/codec/login/LoginDecoder.java
+++ b/src/org/apollo/net/codec/login/LoginDecoder.java
@@ -6,6 +6,7 @@ import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandlerContext;
import java.math.BigInteger;
+import java.net.InetSocketAddress;
import java.security.SecureRandom;
import java.util.List;
@@ -18,6 +19,8 @@ import org.apollo.security.PlayerCredentials;
import org.apollo.util.BufferUtil;
import org.apollo.util.StatefulFrameDecoder;
+import com.google.common.net.InetAddresses;
+
/**
* A {@link StatefulFrameDecoder} which decodes the login request frames.
*
@@ -174,6 +177,8 @@ public final class LoginDecoder extends StatefulFrameDecoder
int uid = secure.readInt();
String username = BufferUtil.readString(secure);
String password = BufferUtil.readString(secure);
+ InetSocketAddress socketAddress = (InetSocketAddress) ctx.channel().remoteAddress();
+ String hostAddress = InetAddresses.toAddrString(socketAddress.getAddress());
if (password.length() < 6 || password.length() > 20 || username.isEmpty() || username.length() > 12) {
writeResponseCode(ctx, LoginConstants.STATUS_INVALID_CREDENTIALS);
@@ -193,7 +198,7 @@ public final class LoginDecoder extends StatefulFrameDecoder
IsaacRandom encodingRandom = new IsaacRandom(seed);
- PlayerCredentials credentials = new PlayerCredentials(username, password, usernameHash, uid);
+ PlayerCredentials credentials = new PlayerCredentials(username, password, usernameHash, uid, hostAddress);
IsaacRandomPair randomPair = new IsaacRandomPair(encodingRandom, decodingRandom);
out.add(new LoginRequest(credentials, randomPair, reconnecting, lowMemory, release, crcs, version));
@@ -207,7 +212,7 @@ public final class LoginDecoder extends StatefulFrameDecoder
* @param response The response code to write.
*/
private void writeResponseCode(ChannelHandlerContext ctx, int response) {
- ByteBuf buffer = ctx.alloc().buffer(1);
+ ByteBuf buffer = ctx.alloc().buffer(Byte.BYTES);
buffer.writeByte(response);
ctx.write(buffer).addListener(ChannelFutureListener.CLOSE);
diff --git a/src/org/apollo/security/PlayerCredentials.java b/src/org/apollo/security/PlayerCredentials.java
index 84aac362..80dd4fb5 100644
--- a/src/org/apollo/security/PlayerCredentials.java
+++ b/src/org/apollo/security/PlayerCredentials.java
@@ -34,6 +34,11 @@ public final class PlayerCredentials {
*/
private final int usernameHash;
+ /**
+ * The Player's host address, represented as a String.
+ */
+ private final String hostAddress;
+
/**
* Creates a new {@link PlayerCredentials} object with the specified name, password and uid.
*
@@ -41,13 +46,15 @@ public final class PlayerCredentials {
* @param password The player's password.
* @param usernameHash The hash of the player's username.
* @param uid The computer's uid.
+ * @param hostAddress The Player's connecting host address.
*/
- public PlayerCredentials(String username, String password, int usernameHash, int uid) {
+ public PlayerCredentials(String username, String password, int usernameHash, int uid, String hostAddress) {
this.username = username;
encodedUsername = NameUtil.encodeBase37(username);
this.password = password;
this.usernameHash = usernameHash;
this.uid = uid;
+ this.hostAddress = hostAddress;
}
/**
@@ -104,6 +111,15 @@ public final class PlayerCredentials {
return usernameHash;
}
+ /**
+ * Gets the Player's connecting host address.
+ *
+ * @return The Player's host address, represented as a String.
+ */
+ public String getHostAddress() {
+ return hostAddress;
+ }
+
@Override
public int hashCode() {
return Long.hashCode(encodedUsername);