Fix combat not working after logout; Fix DDS hits

* Removes the use of the MOB_STATE_CACHE and instead monkey patches a
  get_combat_state method onto Mob.
This commit is contained in:
Gary Tierney
2016-01-03 23:31:34 +00:00
parent 3082fade1d
commit 9f47fae6a9
5 changed files with 17 additions and 22 deletions
+3 -3
View File
@@ -93,9 +93,9 @@ class AttackDSL
## ##
# Deal melee damage. # Deal melee damage.
def damage!(damage_modifier: 1, delay: 0) def damage!(damage_modifier: 1, delay: 0, secondary: false)
@subattacks.push lambda { |source, target| @subattacks.push lambda { |source, target|
do_damage! source, target, 1, delay do_damage! source, target, 1, delay, secondary
} }
end end
@@ -124,7 +124,7 @@ def do_damage!(source, target, amount, delay = 0, secondary = false, &_block)
schedule delay do |task| schedule delay do |task|
task.stop && return if source.dead || target.dead task.stop && return if source.dead || target.dead
target_combat_state = get_combat_state target target_combat_state = target.get_combat_state
target_hitpoints = target.skill_set.get_skill(Skill::HITPOINTS).get_current_level target_hitpoints = target.skill_set.get_skill(Skill::HITPOINTS).get_current_level
amount = target_hitpoints if target_hitpoints < amount amount = target_hitpoints if target_hitpoints < amount
+1 -1
View File
@@ -10,7 +10,7 @@ on :message, :npc_action do |player, message|
# target.start_action CombatAction.new(target) # target.start_action CombatAction.new(target)
# end # end
player_combat_state = get_combat_state player player_combat_state = player.get_combat_state
player_combat_state.target = target player_combat_state.target = target
player.send HintIconMessage.for_npc(target.index) player.send HintIconMessage.for_npc(target.index)
+1 -1
View File
@@ -7,7 +7,7 @@ class CombatAction < Action
mob.attacking = true mob.attacking = true
@combat_state = get_combat_state(source) @combat_state = source.get_combat_state
@attack_timer = 100 @attack_timer = 100
@once = once @once = once
end end
+10 -15
View File
@@ -1,13 +1,17 @@
def get_combat_state(mob) java_import 'org.apollo.game.model.entity.Mob'
mob.is_a?(Player) ? type = :player : type = :npc
unless MOB_COMBAT_STATE_CACHE[type].key? mob.index module MobCombatState
MOB_COMBAT_STATE_CACHE[type][mob.index] = CombatState.new(mob) def get_combat_state
if @combat_state.nil?
@combat_state = CombatState.new(self, true)
end
@combat_state
end end
MOB_COMBAT_STATE_CACHE[type][mob.index]
end end
Mob.include MobCombatState
private private
class CombatState class CombatState
@@ -58,12 +62,3 @@ class CombatState
end end
end end
end end
MOB_COMBAT_STATE_CACHE = {
player: {},
npc: {}
}
on :logout do |event|
MOB_COMBAT_STATE_CACHE[:player].delete event.player.index
end
+2 -2
View File
@@ -31,7 +31,7 @@ end
create_weapon /(?:drag|dragon) dagger.*/, :dragon_dagger do create_weapon /(?:drag|dragon) dagger.*/, :dragon_dagger do
set_special_attack speed: 4, energy_requirement: 25, animation: 1062, graphic: { id: 252, height: 100 } do set_special_attack speed: 4, energy_requirement: 25, animation: 1062, graphic: { id: 252, height: 100 } do
damage! delay: 0 damage!
damage! delay: 1 damage! secondary: true
end end
end end