From 654a1a6dfdcd624484958a11019c7cef1f4b9252 Mon Sep 17 00:00:00 2001 From: atomicint Date: Sun, 29 Mar 2015 12:52:55 -0400 Subject: [PATCH] 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> 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 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= ObjectDefinition.count()) { - ctx.breakHandlerChain(); + message.terminate(); return; } @@ -54,13 +53,13 @@ public final class ObjectActionVerificationHandler extends MessageHandler objects = region.getEntities(position, EntityType.STATIC_OBJECT, EntityType.DYNAMIC_OBJECT); if (!player.getPosition().isWithinDistance(position, 15) || !containsObject(id, objects)) { - ctx.breakHandlerChain(); + message.terminate(); return; } ObjectDefinition definition = ObjectDefinition.lookup(id); if (message.getOption() >= definition.getMenuActions().length) { - ctx.breakHandlerChain(); + message.terminate(); return; } } diff --git a/src/org/apollo/game/message/handler/impl/PlayerActionVerificationHandler.java b/src/org/apollo/game/message/handler/PlayerActionVerificationHandler.java similarity index 76% rename from src/org/apollo/game/message/handler/impl/PlayerActionVerificationHandler.java rename to src/org/apollo/game/message/handler/PlayerActionVerificationHandler.java index 3c43fe70..25020c45 100644 --- a/src/org/apollo/game/message/handler/impl/PlayerActionVerificationHandler.java +++ b/src/org/apollo/game/message/handler/PlayerActionVerificationHandler.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.PlayerActionMessage; import org.apollo.game.model.World; import org.apollo.game.model.entity.Player; @@ -24,19 +23,19 @@ public final class PlayerActionVerificationHandler extends MessageHandler repository = world.getPlayerRepository(); if (index < 0 || index >= repository.capacity()) { - ctx.breakHandlerChain(); + message.terminate(); return; } Player other = repository.get(index); if (other == null || !player.getPosition().isWithinDistance(other.getPosition(), player.getViewingDistance() + 1)) { // +1 in case it was decremented after the player clicked the action. - ctx.breakHandlerChain(); + message.terminate(); return; } } diff --git a/src/org/apollo/game/message/handler/impl/PlayerDesignMessageHandler.java b/src/org/apollo/game/message/handler/PlayerDesignMessageHandler.java similarity index 73% rename from src/org/apollo/game/message/handler/impl/PlayerDesignMessageHandler.java rename to src/org/apollo/game/message/handler/PlayerDesignMessageHandler.java index d0842ca7..2df3b92b 100644 --- a/src/org/apollo/game/message/handler/impl/PlayerDesignMessageHandler.java +++ b/src/org/apollo/game/message/handler/PlayerDesignMessageHandler.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.CloseInterfaceMessage; import org.apollo.game.message.impl.PlayerDesignMessage; import org.apollo.game.model.World; @@ -24,7 +23,7 @@ public final class PlayerDesignMessageHandler extends MessageHandler { } @Override - public void handle(MessageHandlerContext ctx, Player player, WalkMessage message) { + public void handle(Player player, WalkMessage message) { WalkingQueue queue = player.getWalkingQueue(); Position[] steps = message.getSteps(); diff --git a/src/org/apollo/game/message/handler/impl/package-info.java b/src/org/apollo/game/message/handler/impl/package-info.java deleted file mode 100644 index c6ff1f33..00000000 --- a/src/org/apollo/game/message/handler/impl/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Contains message handler implementations. - */ -package org.apollo.game.message.handler.impl; \ No newline at end of file diff --git a/src/org/apollo/game/message/handler/package-info.java b/src/org/apollo/game/message/handler/package-info.java index 117b2622..67ac6385 100644 --- a/src/org/apollo/game/message/handler/package-info.java +++ b/src/org/apollo/game/message/handler/package-info.java @@ -1,4 +1,4 @@ /** - * Contains the base classes for message handling. + * Contains message handler implementations. */ package org.apollo.game.message.handler; \ No newline at end of file diff --git a/src/org/apollo/game/model/entity/Player.java b/src/org/apollo/game/model/entity/Player.java index bc208ebf..c3234520 100644 --- a/src/org/apollo/game/model/entity/Player.java +++ b/src/org/apollo/game/model/entity/Player.java @@ -46,6 +46,7 @@ import org.apollo.game.model.skill.SynchronizationSkillListener; import org.apollo.game.sync.block.SynchronizationBlock; import org.apollo.net.session.GameSession; import org.apollo.security.PlayerCredentials; +import org.apollo.util.CollectionUtil; import org.apollo.util.Point; import com.google.common.base.MoreObjects; @@ -668,17 +669,16 @@ public final class Player extends Mob { * @param message The message.. */ public void send(Message message) { - if (isActive()) { - if (!queuedMessages.isEmpty()) { - for (Message queuedMessage : queuedMessages) { - session.dispatchMessage(queuedMessage); - } - queuedMessages.clear(); - } - session.dispatchMessage(message); - } else { + if (!isActive()) { queuedMessages.add(message); + return; } + + if (!queuedMessages.isEmpty()) { + CollectionUtil.pollAll(queuedMessages, session::dispatchMessage); + } + + session.dispatchMessage(message); } /** diff --git a/src/org/apollo/game/model/event/EventListenerChain.java b/src/org/apollo/game/model/event/EventListenerChain.java index a2fbca2d..a6dc1fe7 100644 --- a/src/org/apollo/game/model/event/EventListenerChain.java +++ b/src/org/apollo/game/model/event/EventListenerChain.java @@ -63,4 +63,5 @@ final class EventListenerChain { public String toString() { return MoreObjects.toStringHelper(this).add("type", type).add("listeners", listeners).toString(); } + } \ No newline at end of file diff --git a/src/org/apollo/game/model/inter/InterfaceSet.java b/src/org/apollo/game/model/inter/InterfaceSet.java index 420f7c1e..f067952c 100644 --- a/src/org/apollo/game/model/inter/InterfaceSet.java +++ b/src/org/apollo/game/model/inter/InterfaceSet.java @@ -4,6 +4,7 @@ import java.util.HashMap; import java.util.Map; import java.util.Optional; +import org.apollo.game.message.MessageHandlerChain; import org.apollo.game.message.impl.CloseInterfaceMessage; import org.apollo.game.message.impl.EnterAmountMessage; import org.apollo.game.message.impl.OpenDialogueInterfaceMessage; @@ -75,7 +76,7 @@ public final class InterfaceSet { * Called when the player has clicked the specified button. Notifies the current dialogue listener. * * @param button The button. - * @return {@code true} if the message handler chain should be broken. + * @return {@code true} if the {@link MessageHandlerChain} should be broken. */ public boolean buttonClicked(int button) { return dialogueListener.isPresent() && dialogueListener.get().buttonClicked(button); diff --git a/src/org/apollo/game/model/inter/dialogue/DialogueListener.java b/src/org/apollo/game/model/inter/dialogue/DialogueListener.java index c8071df9..ceb6b261 100644 --- a/src/org/apollo/game/model/inter/dialogue/DialogueListener.java +++ b/src/org/apollo/game/model/inter/dialogue/DialogueListener.java @@ -1,5 +1,6 @@ package org.apollo.game.model.inter.dialogue; +import org.apollo.game.message.MessageHandlerChain; import org.apollo.game.model.inter.InterfaceListener; /** @@ -17,7 +18,7 @@ public interface DialogueListener extends InterfaceListener { *

* * @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 messageClass = (Class) 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> handlerClass = (Class>) Class - .forName(handlerClassName); - MessageHandler handler = handlerClass.getConstructor(World.class).newInstance(world); - handlers.add(handler); + Class> handlerClass = (Class>) Class.forName(handlerClassName); + MessageHandler 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 messageType = message.getClass(); - MessageHandlerChain chain = (MessageHandlerChain) chainGroup.getChain(messageType); - - while (chain == null && messageType != null) { - messageType = (Class) 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