Record units hit by a shockwave

jube1412

New Member
Reaction score
2
Edit: PROBLEM SOLVED!!!

More searches take me to [thread=42918]this[/thread], which gave me a solution. Apparently one can have a filter function inside a struct (or at least that's what I've understood).

Thank you all who have taken a look. Please close the thread and have a great day <3.

===================================================================

The spell is a Shockwave made from scratch. It would create a dummy unit with the Shockwave model and move it on a straight line, dealing damage to those on its path.

The movement part of the spell is finished, what is left now is the damage part.

My idea is simply: Pick all units in an area around the dummy Shockwave, run them through a Filter function, deal damage to those units who pass the filter, add them to a separate group to avoid hitting the same units twice, and finally release the group when the Shockwave ends.

That is exactly the wall I'm hitting. With my current JASS knowledge I can't find an efficient way to implement that concept.

I'm using Timer32 and GroupUtils for the spell.

The (working) initial code with just the "movement" part:

JASS:
scope CustomShockwave initializer init
private struct MoveShockwave
    unit d
    real x
    real y
    real ang
    real dist
    real limDist
    real curDist = 0
    real dmg
    
    private method periodic takes nothing returns nothing
        if .curDist &gt;= .limDist then
            call .stopPeriodic()
            call .destroy()
        endif
        set .curDist = .curDist+.dist
        set .x = .x+.dist*Cos(.ang*bj_DEGTORAD)
        set .y = .y+.dist*Sin(.ang*bj_DEGTORAD)
        call SetUnitX(.d,.x)
        call SetUnitY(.d,.y)
    endmethod
    static method create takes unit d, real x, real y, real ang, real dist, real limDist, real dmg returns MoveShockwave
        local MoveShockwave data = MoveShockwave.allocate()
        set data.d = d
        set data.x = x
        set data.y = y
        set data.ang = ang
        set data.dist = dist
        set data.limDist = limDist
        set data.dmg = dmg
        call data.startPeriodic()
        return data
    endmethod
    method onDestroy takes nothing returns nothing
        call KillUnit(.d)
        set .d = null
    endmethod
    implement T32x
endstruct
private function CustomShockwave takes nothing returns boolean
    local unit c = GetTriggerUnit()
    local unit d
    local real x = GetSpellTargetX()
    local real y = GetSpellTargetY()
    local real ang = bj_RADTODEG*Atan2(y-GetUnitY(c),x-GetUnitX(c))
    local real dist = 30.
    local real limDist = 800.
    local real dmg = 300.
    local player p = GetOwningPlayer(c)
    local MoveShockwave data
    if GetSpellAbilityId() == &#039;A003&#039; then
        set d = CreateUnit(p,&#039;e005&#039;,x,y,ang)
        set data = MoveShockwave.create(d,x,y,ang,dist,limDist,dmg)
    endif
    set c = null
    set d = null
    return false
endfunction
private function init takes nothing returns nothing
    local trigger t = CreateTrigger()
    local integer i = 0
    loop
        call TriggerRegisterPlayerUnitEvent(t,Player(i),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
        set i = i+1
        exitwhen i == bj_MAX_PLAYER_SLOTS
    endloop
    call TriggerAddCondition(t,Condition(function CustomShockwave))
endfunction
endscope


Any help or input would be much appreciated. <3 Thank you and have a nice day.
 
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