- Reaction score
- 91
Well, not exactly. What I am trying to do is detect when a certain unit type (Footman to be exact) gets damaged and see if the damage comes from in front of the Footman so I can block it. I'm doing that by comparing the angle between the damager and damaged unit and checking if the footman is facing that angle. If he is, then heal him for a maximum of 7. The problem is that it will block damage only if the footman is facing north and he gets damaged in front. If I turn him south and attack him directly in the face, it does nothing. I'm pretty sure it is because of my math but I'm really bad at it and can't really fix it...
EDIT: Nvm, found my answers
JASS:
scope DefensiveStance initializer Init
globals
private constant integer UID_FOOTMAN = 039;h006039;
private constant real ANGLE = (90. * 0.5) // it is actually 90 but since it's spread in 2 directions, it has to be halved
endglobals
private function OnDamage takes nothing returns boolean
local unit cast = GetEventDamageSource()
local unit targ = GetTriggerUnit()
local real ang
local real face
local real damage = GetEventDamage()
local real life
call BJDebugMsg("hello?..")
if GetUnitTypeId(targ) == UID_FOOTMAN then
call BJDebugMsg("passed footman check..")
set ang = Atan2(GetWidgetY(cast) - GetWidgetY(targ), GetWidgetX(cast) - GetWidgetX(targ)) * bj_RADTODEG
set face = GetUnitFacing(targ)
if (ang > face - ANGLE and ang < face + ANGLE) or (ang < face + ANGLE and ang > face - ANGLE) then // check if damage can be blocked if damaged in front
if damage > 7. then // can reduce a maximum of 7
set damage = 7.
endif
set life = GetWidgetLife(targ)
call BJDebugMsg(R2S(life))
call BJDebugMsg(R2S(life + damage))
call SetWidgetLife(targ, GetWidgetLife(targ) + damage + damage)
endif
endif
set cast = null
set targ = null
return false
endfunction
private function Init takes nothing returns nothing
call AddOnDamageFunc(Condition(function OnDamage))
endfunction
endscope
EDIT: Nvm, found my answers