Checking if unit is facing unit

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...
JASS:
scope DefensiveStance initializer Init 

globals
    private constant integer UID_FOOTMAN = 'h006'
    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
 

the Immortal

I know, I know...
Reaction score
51
As I took my time looking into the problem (even though it was just 5 minutes of time) let me write the answer.

Atan2 returns values in the range (-180;180]
That's why it has to be increased by 180
After that (for simplicity's sake) compute the difference
[FacingAngle] - ( [AngleBetweenUnits] + 180 )
and take its' absolute value. (i = RAbsBJ(val) or inline it)
And the check following must be modified to:
JASS:
if i < ANGLE or i > 360 - ANGLE then
    ...
endif

Due to the nature of angles themselves >:D

/evul and pointless
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Members online

      No members online now.

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top