mirror of
https://github.com/2006-Scape/apollo.git
synced 2026-07-03 00:38:21 +00:00
Merge branch 'master' of bitbucket.org:Major-/apollo
This commit is contained in:
+24
-24
@@ -2,110 +2,110 @@
|
||||
<message>
|
||||
<type>org.apollo.game.message.impl.ButtonMessage</type>
|
||||
<chain>
|
||||
<handler>org.apollo.game.message.handler.impl.DialogueButtonHandler</handler>
|
||||
<handler>org.apollo.game.message.handler.impl.BankButtonMessageHandler</handler>
|
||||
<handler>org.apollo.game.message.handler.DialogueButtonHandler</handler>
|
||||
<handler>org.apollo.game.message.handler.BankButtonMessageHandler</handler>
|
||||
</chain>
|
||||
</message>
|
||||
<message>
|
||||
<type>org.apollo.game.message.impl.ChatMessage</type>
|
||||
<chain>
|
||||
<handler>org.apollo.game.message.handler.impl.ChatVerificationHandler</handler>
|
||||
<handler>org.apollo.game.message.handler.impl.ChatMessageHandler</handler>
|
||||
<handler>org.apollo.game.message.handler.ChatVerificationHandler</handler>
|
||||
<handler>org.apollo.game.message.handler.ChatMessageHandler</handler>
|
||||
</chain>
|
||||
</message>
|
||||
<message>
|
||||
<type>org.apollo.game.message.impl.ClosedInterfaceMessage</type>
|
||||
<chain>
|
||||
<handler>org.apollo.game.message.handler.impl.ClosedInterfaceMessageHandler</handler>
|
||||
<handler>org.apollo.game.message.handler.ClosedInterfaceMessageHandler</handler>
|
||||
</chain>
|
||||
</message>
|
||||
<message>
|
||||
<type>org.apollo.game.message.impl.CommandMessage</type>
|
||||
<chain>
|
||||
<handler>org.apollo.game.message.handler.impl.CommandMessageHandler</handler>
|
||||
<handler>org.apollo.game.message.handler.CommandMessageHandler</handler>
|
||||
</chain>
|
||||
</message>
|
||||
<message>
|
||||
<type>org.apollo.game.message.impl.DialogueContinueMessage</type>
|
||||
<chain>
|
||||
<handler>org.apollo.game.message.handler.impl.DialogueContinueMessageHandler</handler>
|
||||
<handler>org.apollo.game.message.handler.DialogueContinueMessageHandler</handler>
|
||||
</chain>
|
||||
</message>
|
||||
<message>
|
||||
<type>org.apollo.game.message.impl.EnteredAmountMessage</type>
|
||||
<chain>
|
||||
<handler>org.apollo.game.message.handler.impl.EnteredAmountMessageHandler</handler>
|
||||
<handler>org.apollo.game.message.handler.EnteredAmountMessageHandler</handler>
|
||||
</chain>
|
||||
</message>
|
||||
<message>
|
||||
<type>org.apollo.game.message.impl.ItemActionMessage</type>
|
||||
<chain>
|
||||
<handler>org.apollo.game.message.handler.impl.ItemVerificationHandler</handler>
|
||||
<handler>org.apollo.game.message.handler.impl.RemoveEquippedItemHandler</handler>
|
||||
<handler>org.apollo.game.message.handler.impl.BankMessageHandler</handler>
|
||||
<handler>org.apollo.game.message.handler.ItemVerificationHandler</handler>
|
||||
<handler>org.apollo.game.message.handler.RemoveEquippedItemHandler</handler>
|
||||
<handler>org.apollo.game.message.handler.BankMessageHandler</handler>
|
||||
</chain>
|
||||
</message>
|
||||
<message>
|
||||
<type>org.apollo.game.message.impl.ItemOnItemMessage</type>
|
||||
<chain>
|
||||
<handler>org.apollo.game.message.handler.impl.ItemVerificationHandler</handler>
|
||||
<handler>org.apollo.game.message.handler.impl.ItemOnItemVerificationHandler</handler>
|
||||
<handler>org.apollo.game.message.handler.ItemVerificationHandler</handler>
|
||||
<handler>org.apollo.game.message.handler.ItemOnItemVerificationHandler</handler>
|
||||
</chain>
|
||||
</message>
|
||||
<message>
|
||||
<type>org.apollo.game.message.impl.ItemOnObjectMessage</type>
|
||||
<chain>
|
||||
<handler>org.apollo.game.message.handler.impl.ItemOnObjectVerificationHandler</handler>
|
||||
<handler>org.apollo.game.message.handler.ItemOnObjectVerificationHandler</handler>
|
||||
</chain>
|
||||
</message>
|
||||
<message>
|
||||
<type>org.apollo.game.message.impl.ItemOptionMessage</type>
|
||||
<chain>
|
||||
<handler>org.apollo.game.message.handler.impl.ItemVerificationHandler</handler>
|
||||
<handler>org.apollo.game.message.handler.impl.EquipItemHandler</handler>
|
||||
<handler>org.apollo.game.message.handler.ItemVerificationHandler</handler>
|
||||
<handler>org.apollo.game.message.handler.EquipItemHandler</handler>
|
||||
</chain>
|
||||
</message>
|
||||
<message>
|
||||
<type>org.apollo.game.message.impl.MagicOnItemMessage</type>
|
||||
<chain>
|
||||
<handler>org.apollo.game.message.handler.impl.ItemVerificationHandler</handler>
|
||||
<handler>org.apollo.game.message.handler.ItemVerificationHandler</handler>
|
||||
</chain>
|
||||
</message>
|
||||
<message>
|
||||
<type>org.apollo.game.message.impl.NpcActionMessage</type>
|
||||
<chain>
|
||||
<handler>org.apollo.game.message.handler.impl.NpcActionVerificationHandler</handler>
|
||||
<handler>org.apollo.game.message.handler.NpcActionVerificationHandler</handler>
|
||||
</chain>
|
||||
</message>
|
||||
<message>
|
||||
<type>org.apollo.game.message.impl.ObjectActionMessage</type>
|
||||
<chain>
|
||||
<handler>org.apollo.game.message.handler.impl.ObjectActionVerificationHandler</handler>
|
||||
<handler>org.apollo.game.message.handler.ObjectActionVerificationHandler</handler>
|
||||
</chain>
|
||||
</message>
|
||||
<message>
|
||||
<type>org.apollo.game.message.impl.PlayerActionMessage</type>
|
||||
<chain>
|
||||
<handler>org.apollo.game.message.handler.impl.PlayerActionVerificationHandler</handler>
|
||||
<handler>org.apollo.game.message.handler.PlayerActionVerificationHandler</handler>
|
||||
</chain>
|
||||
</message>
|
||||
<message>
|
||||
<type>org.apollo.game.message.impl.PlayerDesignMessage</type>
|
||||
<chain>
|
||||
<handler>org.apollo.game.message.handler.impl.PlayerDesignVerificationHandler</handler>
|
||||
<handler>org.apollo.game.message.handler.impl.PlayerDesignMessageHandler</handler>
|
||||
<handler>org.apollo.game.message.handler.PlayerDesignVerificationHandler</handler>
|
||||
<handler>org.apollo.game.message.handler.PlayerDesignMessageHandler</handler>
|
||||
</chain>
|
||||
</message>
|
||||
<message>
|
||||
<type>org.apollo.game.message.impl.SwitchItemMessage</type>
|
||||
<chain>
|
||||
<handler>org.apollo.game.message.handler.impl.SwitchItemMessageHandler</handler>
|
||||
<handler>org.apollo.game.message.handler.SwitchItemMessageHandler</handler>
|
||||
</chain>
|
||||
</message>
|
||||
<message>
|
||||
<type>org.apollo.game.message.impl.WalkMessage</type>
|
||||
<chain>
|
||||
<handler>org.apollo.game.message.handler.impl.WalkMessageHandler</handler>
|
||||
<handler>org.apollo.game.message.handler.WalkMessageHandler</handler>
|
||||
</chain>
|
||||
</message>
|
||||
</messages>
|
||||
@@ -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
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
@@ -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?
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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]
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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];
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -10,21 +10,22 @@ 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;
|
||||
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.
|
||||
*
|
||||
@@ -39,9 +40,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 +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}.
|
||||
@@ -82,12 +82,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 +101,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 +143,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 +180,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")) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
+9
-10
@@ -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 <M> The type of message handled by this class.
|
||||
* @author Ryley
|
||||
* @param <M> The type of Message this class is listening for.
|
||||
*/
|
||||
public abstract class MessageHandler<M extends Message> {
|
||||
|
||||
@@ -18,7 +18,7 @@ public abstract class MessageHandler<M extends Message> {
|
||||
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<M extends Message> {
|
||||
}
|
||||
|
||||
/**
|
||||
* 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);
|
||||
|
||||
}
|
||||
@@ -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 <M> The Message type this chain represents.
|
||||
*/
|
||||
public final class MessageHandlerChain<M extends Message> {
|
||||
|
||||
/**
|
||||
* The handlers.
|
||||
*/
|
||||
private final List<MessageHandler<M>> handlers = new ArrayList<>();
|
||||
|
||||
/**
|
||||
* The Class type of this chain.
|
||||
*/
|
||||
private final Class<M> type;
|
||||
|
||||
/**
|
||||
* Constructs a new {@link MessageHandlerChain}.
|
||||
*
|
||||
* @param type The Class type of this chain.
|
||||
*/
|
||||
public MessageHandlerChain(Class<M> type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the specified {@link MessageHandler} to this chain.
|
||||
*
|
||||
* @param handler The MessageHandler.
|
||||
*/
|
||||
public void addHandler(MessageHandler<M> 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<M> 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();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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<Class<? extends Message>, 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 <M extends Message> boolean notify(Player player, M message) {
|
||||
@SuppressWarnings("unchecked")
|
||||
MessageHandlerChain<M> chain = (MessageHandlerChain<M>) 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 <M extends Message> void putHandler(Class<M> clazz, MessageHandler<? extends Message> handler) {
|
||||
MessageHandlerChain<M> chain = (MessageHandlerChain<M>) chains.computeIfAbsent(clazz, MessageHandlerChain::new);
|
||||
chain.addHandler((MessageHandler<M>) handler);
|
||||
}
|
||||
|
||||
}
|
||||
+3
-4
@@ -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<ButtonMessage
|
||||
private static final int WITHDRAW_AS_NOTE = 5386;
|
||||
|
||||
@Override
|
||||
public void handle(MessageHandlerContext ctx, Player player, ButtonMessage message) {
|
||||
public void handle(Player player, ButtonMessage message) {
|
||||
if (message.getWidgetId() == WITHDRAW_AS_ITEM) {
|
||||
player.setWithdrawingNotes(false);
|
||||
} else if (message.getWidgetId() == WITHDRAW_AS_NOTE) {
|
||||
+9
-12
@@ -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.ItemActionMessage;
|
||||
import org.apollo.game.model.World;
|
||||
import org.apollo.game.model.entity.Player;
|
||||
@@ -52,12 +51,12 @@ public final class BankMessageHandler extends MessageHandler<ItemActionMessage>
|
||||
}
|
||||
|
||||
@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<ItemActionMessage>
|
||||
/**
|
||||
* 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();
|
||||
}
|
||||
}
|
||||
|
||||
+3
-4
@@ -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<ChatMessage> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handle(MessageHandlerContext ctx, Player player, ChatMessage message) {
|
||||
public void handle(Player player, ChatMessage message) {
|
||||
player.getBlockSet().add(SynchronizationBlock.createChatBlock(player, message));
|
||||
}
|
||||
|
||||
+4
-5
@@ -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<ChatMessage> {
|
||||
}
|
||||
|
||||
@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();
|
||||
}
|
||||
}
|
||||
|
||||
+3
-4
@@ -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<ClosedIn
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handle(MessageHandlerContext ctx, Player player, ClosedInterfaceMessage message) {
|
||||
public void handle(Player player, ClosedInterfaceMessage message) {
|
||||
player.getInterfaceSet().interfaceClosed();
|
||||
}
|
||||
|
||||
+3
-4
@@ -1,9 +1,8 @@
|
||||
package org.apollo.game.message.handler.impl;
|
||||
package org.apollo.game.message.handler;
|
||||
|
||||
import org.apollo.game.command.Command;
|
||||
import org.apollo.game.message.Message;
|
||||
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.CommandMessage;
|
||||
import org.apollo.game.model.World;
|
||||
import org.apollo.game.model.entity.Player;
|
||||
@@ -25,7 +24,7 @@ public final class CommandMessageHandler extends MessageHandler<CommandMessage>
|
||||
}
|
||||
|
||||
@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];
|
||||
|
||||
+4
-5
@@ -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<ButtonMessage> {
|
||||
}
|
||||
|
||||
@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();
|
||||
}
|
||||
}
|
||||
}
|
||||
+3
-4
@@ -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<Dialogu
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handle(MessageHandlerContext ctx, Player player, DialogueContinueMessage message) {
|
||||
public void handle(Player player, DialogueContinueMessage message) {
|
||||
if (player.getInterfaceSet().contains(InterfaceType.DIALOGUE)) {
|
||||
player.getInterfaceSet().continueRequested();
|
||||
}
|
||||
+3
-4
@@ -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.EnteredAmountMessage;
|
||||
import org.apollo.game.model.World;
|
||||
import org.apollo.game.model.entity.Player;
|
||||
@@ -23,7 +22,7 @@ public final class EnteredAmountMessageHandler extends MessageHandler<EnteredAmo
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handle(MessageHandlerContext ctx, Player player, EnteredAmountMessage message) {
|
||||
public void handle(Player player, EnteredAmountMessage message) {
|
||||
player.getInterfaceSet().enteredAmount(message.getAmount());
|
||||
}
|
||||
|
||||
+5
-6
@@ -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.ItemOptionMessage;
|
||||
import org.apollo.game.model.Item;
|
||||
import org.apollo.game.model.World;
|
||||
@@ -37,7 +36,7 @@ public final class EquipItemHandler extends MessageHandler<ItemOptionMessage> {
|
||||
}
|
||||
|
||||
@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<ItemOptionMessage> {
|
||||
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<ItemOptionMessage> {
|
||||
if (definition.isTwoHanded()) {
|
||||
int slotsRequired = weapon != null && shield != null ? 1 : 0;
|
||||
if (inventory.freeSlots() < slotsRequired) {
|
||||
ctx.breakHandlerChain();
|
||||
message.terminate();
|
||||
return;
|
||||
}
|
||||
|
||||
+6
-7
@@ -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<ItemOnIt
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handle(MessageHandlerContext ctx, Player player, ItemOnItemMessage message) {
|
||||
public void handle(Player player, ItemOnItemMessage message) {
|
||||
Inventory inventory;
|
||||
|
||||
switch (message.getInterfaceId()) {
|
||||
@@ -42,19 +41,19 @@ public final class ItemOnItemVerificationHandler extends MessageHandler<ItemOnIt
|
||||
inventory = player.getBank();
|
||||
break;
|
||||
default:
|
||||
ctx.breakHandlerChain();
|
||||
message.terminate();
|
||||
return;
|
||||
}
|
||||
|
||||
int slot = message.getTargetSlot();
|
||||
if (slot < 0 || slot >= inventory.capacity()) {
|
||||
ctx.breakHandlerChain();
|
||||
message.terminate();
|
||||
return;
|
||||
}
|
||||
|
||||
Item item = inventory.get(slot);
|
||||
if (item == null || item.getId() != message.getTargetId()) {
|
||||
ctx.breakHandlerChain();
|
||||
message.terminate();
|
||||
}
|
||||
}
|
||||
|
||||
+6
-7
@@ -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<ItemOn
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handle(MessageHandlerContext ctx, Player player, ItemOnObjectMessage message) {
|
||||
public void handle(Player player, ItemOnObjectMessage message) {
|
||||
if (message.getInterfaceId() != SynchronizationInventoryListener.INVENTORY_ID
|
||||
&& message.getInterfaceId() != BankConstants.SIDEBAR_INVENTORY_ID) {
|
||||
ctx.breakHandlerChain();
|
||||
message.terminate();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -38,13 +37,13 @@ public final class ItemOnObjectVerificationHandler extends MessageHandler<ItemOn
|
||||
|
||||
int slot = message.getSlot();
|
||||
if (slot < 0 || slot >= inventory.capacity()) {
|
||||
ctx.breakHandlerChain();
|
||||
message.terminate();
|
||||
return;
|
||||
}
|
||||
|
||||
Item item = inventory.get(slot);
|
||||
if (item == null || item.getId() != message.getId()) {
|
||||
ctx.breakHandlerChain();
|
||||
message.terminate();
|
||||
return;
|
||||
}
|
||||
}
|
||||
+6
-7
@@ -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<InventoryItemM
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handle(MessageHandlerContext ctx, Player player, InventoryItemMessage message) {
|
||||
public void handle(Player player, InventoryItemMessage message) {
|
||||
InventorySupplier supplier = inventories.get(message.getInterfaceId());
|
||||
if (supplier == null) {
|
||||
ctx.breakHandlerChain();
|
||||
message.terminate();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -83,13 +82,13 @@ public final class ItemVerificationHandler extends MessageHandler<InventoryItemM
|
||||
|
||||
int slot = message.getSlot();
|
||||
if (slot < 0 || slot >= inventory.capacity()) {
|
||||
ctx.breakHandlerChain();
|
||||
message.terminate();
|
||||
return;
|
||||
}
|
||||
|
||||
Item item = inventory.get(slot);
|
||||
if (item == null || item.getId() != message.getId()) {
|
||||
ctx.breakHandlerChain();
|
||||
message.terminate();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 <M> The type of message handled by this chain.
|
||||
*/
|
||||
public final class MessageHandlerChain<M extends Message> {
|
||||
|
||||
/**
|
||||
* The handlers.
|
||||
*/
|
||||
private final Deque<MessageHandler<M>> handlers;
|
||||
|
||||
/**
|
||||
* Creates the message handler chain.
|
||||
*
|
||||
* @param handlers The handlers.
|
||||
*/
|
||||
@SafeVarargs
|
||||
public MessageHandlerChain(MessageHandler<M>... 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<M> 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<M> handler : handlers) {
|
||||
handler.handle(context, player, message);
|
||||
|
||||
if (context.isBroken()) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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<Class<? extends Message>, MessageHandlerChain<?>> chains;
|
||||
|
||||
/**
|
||||
* Creates the message handler chain group.
|
||||
*
|
||||
* @param chains The chains map.
|
||||
*/
|
||||
public MessageHandlerChainGroup(Map<Class<? extends Message>, 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 <M extends Message> MessageHandlerChain<M> getChain(Class<M> clazz) {
|
||||
return (MessageHandlerChain<M>) 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 <M extends Message> void register(Class<M> clazz, MessageHandlerChain<M> chain) {
|
||||
chains.put(clazz, chain);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
+6
-7
@@ -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<NpcAction
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handle(MessageHandlerContext ctx, Player player, NpcActionMessage message) {
|
||||
public void handle(Player player, NpcActionMessage message) {
|
||||
int index = message.getIndex();
|
||||
MobRepository<Npc> repository = world.getNpcRepository();
|
||||
|
||||
if (index < 0 || index >= repository.capacity()) {
|
||||
ctx.breakHandlerChain();
|
||||
message.terminate();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -40,13 +39,13 @@ public final class NpcActionVerificationHandler extends MessageHandler<NpcAction
|
||||
|
||||
if (npc == null || !player.getPosition().isWithinDistance(npc.getPosition(), player.getViewingDistance() + 1)) {
|
||||
// +1 in case it was decremented after the player clicked the action.
|
||||
ctx.breakHandlerChain();
|
||||
message.terminate();
|
||||
return;
|
||||
}
|
||||
|
||||
NpcDefinition definition = npc.getDefinition();
|
||||
if (message.getOption() >= definition.getInteractions().length) {
|
||||
ctx.breakHandlerChain();
|
||||
message.terminate();
|
||||
return;
|
||||
}
|
||||
}
|
||||
+6
-7
@@ -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<Object
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handle(MessageHandlerContext ctx, Player player, ObjectActionMessage message) {
|
||||
public void handle(Player player, ObjectActionMessage message) {
|
||||
int id = message.getId();
|
||||
if (id < 0 || id >= ObjectDefinition.count()) {
|
||||
ctx.breakHandlerChain();
|
||||
message.terminate();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -54,13 +53,13 @@ public final class ObjectActionVerificationHandler extends MessageHandler<Object
|
||||
Set<GameObject> 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;
|
||||
}
|
||||
}
|
||||
+5
-6
@@ -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<Player
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handle(MessageHandlerContext ctx, Player player, PlayerActionMessage message) {
|
||||
public void handle(Player player, PlayerActionMessage message) {
|
||||
int index = message.getIndex();
|
||||
MobRepository<Player> 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;
|
||||
}
|
||||
}
|
||||
+3
-4
@@ -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<PlayerDesig
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handle(MessageHandlerContext ctx, Player player, PlayerDesignMessage message) {
|
||||
public void handle(Player player, PlayerDesignMessage message) {
|
||||
player.setAppearance(message.getAppearance());
|
||||
player.send(new CloseInterfaceMessage());
|
||||
}
|
||||
+4
-5
@@ -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.PlayerDesignMessage;
|
||||
import org.apollo.game.model.Appearance;
|
||||
import org.apollo.game.model.World;
|
||||
@@ -25,9 +24,9 @@ public final class PlayerDesignVerificationHandler extends MessageHandler<Player
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handle(MessageHandlerContext ctx, Player player, PlayerDesignMessage message) {
|
||||
public void handle(Player player, PlayerDesignMessage message) {
|
||||
if (!valid(message.getAppearance())) {
|
||||
ctx.breakHandlerChain();
|
||||
message.terminate();
|
||||
}
|
||||
}
|
||||
|
||||
+4
-5
@@ -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.ItemActionMessage;
|
||||
import org.apollo.game.model.Item;
|
||||
import org.apollo.game.model.World;
|
||||
@@ -27,7 +26,7 @@ public final class RemoveEquippedItemHandler extends MessageHandler<ItemActionMe
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handle(MessageHandlerContext ctx, Player player, ItemActionMessage message) {
|
||||
public void handle(Player player, ItemActionMessage message) {
|
||||
if (message.getOption() == 1 && message.getInterfaceId() == SynchronizationInventoryListener.EQUIPMENT_ID) {
|
||||
Inventory inventory = player.getInventory();
|
||||
Inventory equipment = player.getEquipment();
|
||||
@@ -38,7 +37,7 @@ public final class RemoveEquippedItemHandler extends MessageHandler<ItemActionMe
|
||||
|
||||
if (inventory.freeSlots() == 0 && !item.getDefinition().isStackable()) {
|
||||
inventory.forceCapacityExceeded();
|
||||
ctx.breakHandlerChain();
|
||||
message.terminate();
|
||||
return;
|
||||
}
|
||||
|
||||
+3
-4
@@ -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.SwitchItemMessage;
|
||||
import org.apollo.game.model.World;
|
||||
import org.apollo.game.model.entity.Player;
|
||||
@@ -27,7 +26,7 @@ public final class SwitchItemMessageHandler extends MessageHandler<SwitchItemMes
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handle(MessageHandlerContext ctx, Player player, SwitchItemMessage message) {
|
||||
public void handle(Player player, SwitchItemMessage message) {
|
||||
Inventory inventory;
|
||||
boolean insertPermitted = false;
|
||||
|
||||
+3
-4
@@ -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.WalkMessage;
|
||||
import org.apollo.game.model.Position;
|
||||
import org.apollo.game.model.World;
|
||||
@@ -25,7 +24,7 @@ public final class WalkMessageHandler extends MessageHandler<WalkMessage> {
|
||||
}
|
||||
|
||||
@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();
|
||||
@@ -1,4 +0,0 @@
|
||||
/**
|
||||
* Contains message handler implementations.
|
||||
*/
|
||||
package org.apollo.game.message.handler.impl;
|
||||
@@ -1,4 +1,4 @@
|
||||
/**
|
||||
* Contains the base classes for message handling.
|
||||
* Contains message handler implementations.
|
||||
*/
|
||||
package org.apollo.game.message.handler;
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -63,4 +63,5 @@ final class EventListenerChain<E extends Event> {
|
||||
public String toString() {
|
||||
return MoreObjects.toStringHelper(this).add("type", type).add("listeners", listeners).toString();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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 {
|
||||
* </p>
|
||||
*
|
||||
* @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);
|
||||
|
||||
|
||||
@@ -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<ScheduledTask> newTasks = new ArrayDeque<>();
|
||||
private final Queue<ScheduledTask> pendingTasks = new ArrayDeque<>();
|
||||
|
||||
/**
|
||||
* A list of currently active tasks.
|
||||
* An {@link ArrayList} of currently active tasks.
|
||||
*/
|
||||
private List<ScheduledTask> tasks = new ArrayList<>();
|
||||
private final List<ScheduledTask> 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<ScheduledTask> it = tasks.iterator(); it.hasNext();) {
|
||||
task = it.next();
|
||||
for (Iterator<ScheduledTask> 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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
+13
-25
@@ -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<Class<? extends Message>, 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<MessageHandler<?>> 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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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}.
|
||||
|
||||
@@ -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<LoginDecoderState>
|
||||
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<LoginDecoderState>
|
||||
|
||||
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<LoginDecoderState>
|
||||
* @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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
|
||||
/**
|
||||
|
||||
@@ -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<Message> chain = (MessageHandlerChain<Message>) chainGroup.getChain(messageType);
|
||||
|
||||
while (chain == null && messageType != null) {
|
||||
messageType = (Class<? extends Message>) messageType.getSuperclass();
|
||||
if (messageType == Message.class) {
|
||||
messageType = null;
|
||||
} else {
|
||||
chain = (MessageHandlerChain<Message>) 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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 <T> void pollAll(Queue<T> queue, Consumer<T> 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() {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -49,11 +49,11 @@ public final class MobRepository<T extends Mob> implements Iterable<T> {
|
||||
|
||||
@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<T extends Mob> implements Iterable<T> {
|
||||
|
||||
@Override
|
||||
public T next() {
|
||||
return repository.get(currentIndex);
|
||||
return get(currentIndex);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -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.
|
||||
* <p>
|
||||
* 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 + "]");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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 <M extends Message> void addLastMessageHandler(Class<M> message, MessageHandler<M> handler) {
|
||||
MessageHandlerChainGroup chains = context.getService(GameService.class).getMessageHandlerChains();
|
||||
MessageHandlerChain<M> chain = chains.getChain(message);
|
||||
if (chain == null) {
|
||||
chain = new MessageHandlerChain<>(handler);
|
||||
chains.register(message, chain);
|
||||
} else {
|
||||
chain.addLast(handler);
|
||||
}
|
||||
public <M extends Message> void addMessageHandler(Class<M> message, MessageHandler<M> handler) {
|
||||
MessageHandlerChainSet chains = context.getService(GameService.class).getMessageHandlerChainSet();
|
||||
chains.putHandler(message, handler);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user