mirror of
https://github.com/2006-Scape/apollo.git
synced 2026-07-07 16:49:12 +00:00
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:
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user