• 🏆 Texturing Contest #33 is OPEN! Contestants must re-texture a SD unit model found in-game (Warcraft 3 Classic), recreating the unit into a peaceful NPC version. 🔗Click here to enter!
  • It's time for the first HD Modeling Contest of 2024. Join the theme discussion for Hive's HD Modeling Contest #6! Click here to post your idea!

[General] Change the angle of the caster towards the mouse location

Status
Not open for further replies.
Level 7
Joined
Feb 9, 2021
Messages
301
I wanted to ask for help to make a function for the following:
The caster's facing angle increases or decreases until its facing angle is not similar to the angle between the caster and the mouse.

Here is my attempt, but it did not work:
JASS:
function GetAngle takes real x1, real x2, real y1, real y2 returns real
        return  bj_RADTODEG * Atan2(y2 - y1, x2 - x1)
    endfunction

    function GetXWithOffset takes real x, real distance, real angle returns real
        return x + distance * Cos(angle * bj_DEGTORAD)
    endfunction

    function GetYWithOffset takes real y, real distance, real angle returns real
        return y + distance * Sin(angle * bj_DEGTORAD)
    endfunction

   function AngleDiff takes real r1 , real r2 returns real
         return Acos( Cos(r1) * Cos(r2) + Sin(r1) * Sin(r2) ) * bj_RADTODEG
    endfunction


JASS:
    set caster = GetUnitById(this)
    set cX = GetUnitX(caster)
    set cY = GetUnitY(caster)
    set cZ = GetUnitFlyHeight(caster)
               
    set mouseX = GetMouseWorldX()
    set mouseY = GetMouseWorldY()

    set mouseAngle = GetAngle(cX, mouseX, cY, mouseY)
    set cAngle = GetUnitFacing(caster)
               
    if AngleDiff(mouseAngle, cAngle) > AIM_TURN_SPEED then
         if mouseAngle > cAngle then
               set newAngle = cAngle + AIM_TURN_SPEED
         else
               set newAngle = cAngle - AIM_TURN_SPEED

        endif
                   
                set aimNewX = GetXWithOffset(cX, AIM_SFX_DIST, newAngle)
                set aimNewY = GetYWithOffset(cY, AIM_SFX_DIST, newAngle)
                call SetEffectX(this.aimSfx, aimNewX)
                call SetEffectY(this.aimSfx, aimNewY)
                call SetUnitFacing(caster, newAngle)
     endif
 
Level 7
Joined
Feb 9, 2021
Messages
301
I solved it. It seems to work, but the solution does not look very efficient.

JASS:
set caster = GetUnitById(this)
                set cX = GetUnitX(caster)
                set cY = GetUnitY(caster)
                set cZ = GetUnitFlyHeight(caster)
                
                set mouseX = GetMouseWorldX()
                set mouseY = GetMouseWorldY()
                set angle = GetAngle(cX, this.endX, cY, this.endY)
                
                set mouseAngle = GetAngle(cX, mouseX, cY, mouseY)
                set cAngle = GetUnitFacing(caster)
                
                if mouseAngle < 0 then
                    set mouseAngle360 = 180 + RAbsBJ(-180 - mouseAngle)
                else 
                    set mouseAngle360 = mouseAngle
                endif
                
                if AngleDiff(mouseAngle360, cAngle) > AIM_TURN_SPEED then 
                    if cAngle >= 0 and cAngle <= 180 then
                        if mouseAngle360 > cAngle and mouseAngle360 < (cAngle+180) then
                            set newAngle = cAngle + AIM_TURN_SPEED 
                        else
                            set newAngle = cAngle - AIM_TURN_SPEED
                        endif
                    else
                        if (mouseAngle360 >= 0 and mouseAngle360 <= ModuloReal(cAngle+180,360)) or (mouseAngle360 > cAngle and mouseAngle360 < 360) then
                            set newAngle = cAngle + AIM_TURN_SPEED 
                        else
                            set newAngle = cAngle - AIM_TURN_SPEED
                    endif

                    set aimNewX = GetXWithOffset(cX, AIM_SFX_DIST, newAngle)
                    set aimNewY = GetYWithOffset(cY, AIM_SFX_DIST, newAngle)
                    call SetEffectX(this.aimSfx, aimNewX)
                    call SetEffectY(this.aimSfx, aimNewY)
                    call SetUnitFacing(caster, newAngle)
                else
                    set aimNewX = GetXWithOffset(cX, AIM_SFX_DIST, mouseAngle)
                    set aimNewY = GetYWithOffset(cY, AIM_SFX_DIST, mouseAngle)
                    call SetEffectX(this.aimSfx, aimNewX)
                    call SetEffectY(this.aimSfx, aimNewY)
                    call SetUnitFacing(caster, mouseAngle)
                endif
 
Status
Not open for further replies.
Top