First time with structs, would like help.

Evan1993

Ultra Cool Member
Reaction score
30
I can't seem to find what is wrong with my trigger so I can't explain my problem very well.

I'll I can figure out is it don't work right the first time, then works buggy the second time. Ever after that it thinks it hit max amount of strikes.

Thanks. :)


JASS:

scope Omnislash

private function Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A005'
endfunction

globals
    private integer OmniTotal = -1
    private OmniData array Data
    private trigger move
    private constant integer StrikesPerLevel = 2
    private constant integer StrikesBase = 3
endglobals

struct OmniData
    unit target=null
    unit caster=null
    trigger wait=null
    trigger nocancel=null
    boolean continue=true
    integer strikes=0
    integer order=0
endstruct

private function Random takes group rg returns unit
    local integer i = 1
    local unit array r
    local unit temp
    local integer counted = 1
    local group g = rg
    loop
        exitwhen FirstOfGroup(g) == null
        set r<i> = FirstOfGroup(g)
        set temp = FirstOfGroup(g)
        set counted = counted + 1
        call GroupRemoveUnit(g,temp)
        set i = i + 1
    endloop
    call GroupClear(g)
    set g = null
    return r[GetRandomInt(1,counted)]
endfunction

private function filter takes nothing returns boolean
    return ( IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) == false ) and ( IsUnitEnemy(GetFilterUnit(), Player(0)) == true )
endfunction

private function Retry takes nothing returns nothing
    local integer i=0
    local OmniData dat
    call DisableTrigger(GetTriggeringTrigger())
    loop
        exitwhen i == OmniTotal
        set dat = Data<i>

        if GetIssuedOrderId() != dat.order and dat.continue == false and GetTriggeringTrigger() != null then
            call IssueTargetOrder( dat.caster, &quot;attackonce&quot;, dat.target )
            set dat.order = GetUnitCurrentOrder(dat.caster)
        endif
        set i = i + 1
        
    endloop
    call EnableTrigger(GetTriggeringTrigger())        
endfunction

private function WaitOnAttack takes nothing returns nothing
    local OmniData dat
    local integer i = 0
    
    loop 
        exitwhen i &gt;= OmniTotal
        set dat = Data<i>
        set i = i + 1
        if dat.caster == GetEventDamageSource() and GetTriggeringTrigger() != null then
            set dat.continue = true
            call DisplayTextToPlayer(Player(0),0,0,I2S(OmniTotal) + I2S(i))
            call TriggerClearActions(GetTriggeringTrigger())
            call TriggerExecute(move)
        endif
    endloop
endfunction

private function attack takes nothing returns nothing
    local group g = CreateGroup()
    local unit x
    local effect e
    local integer i=0
    local integer level
    local boolexpr filter2 = Condition(function filter)
    local OmniData dat
    loop
        exitwhen i == OmniTotal
        set dat = Data<i>
        set level = GetUnitAbilityLevel(dat.caster,&#039;A005&#039;)
        set dat.continue = true
        if dat.strikes &lt; (StrikesBase + ( level * StrikesPerLevel)) and dat.continue == true then
            call DisplayTextToPlayer(Player(0),0,0,(&quot;ran &quot; + I2S(dat.strikes) + &quot; times.&quot;))
            set dat.strikes = dat.strikes + 1
            if dat.wait == null then
            set dat.wait = CreateTrigger()
            endif
            set dat.continue = false
            call GroupEnumUnitsInRangeOfLoc(g, GetUnitLoc(dat.caster), 250.0, filter2)
            call DestroyBoolExpr(filter2)
            set dat.target = GroupPickRandomUnit(g)
            set e = AddSpecialEffectTarget(&quot;Abilities\\Spells\\Human\\MarkOfChaos\\MarkOfChaosDone.mdl&quot;, dat.caster, &quot;origin&quot;)
            call SetUnitPosition(dat.caster,GetUnitX(dat.target),GetUnitY(dat.target))
            set e = AddSpecialEffectTarget(&quot;Abilities\\Spells\\Human\\MarkOfChaos\\MarkOfChaosDone.mdl&quot;, dat.caster, &quot;origin&quot;)
            call IssueTargetOrder( dat.caster, &quot;attackonce&quot;, dat.target ) 
            set dat.order = GetUnitCurrentOrder(dat.caster)
            call TriggerAddAction( dat.nocancel, function Retry )
            call TriggerRegisterUnitEvent( dat.wait, dat.target, EVENT_UNIT_DAMAGED )
            call TriggerAddAction( dat.wait, function WaitOnAttack )
            call DisplayTextToPlayer(Player(0),0,0,I2S(OmniTotal))

        elseif dat.strikes &gt;= (StrikesBase + ( level * StrikesPerLevel)) then
            call DisplayTextToPlayer(Player(0),0,0,&quot;Omni Data Destroyed, hit strike limit &quot; + I2S(dat.strikes))
            call DestroyTrigger(dat.wait)
            call DestroyTrigger(dat.nocancel)
            call dat.destroy()
            set OmniTotal = OmniTotal - 1
            set Data<i> = Data[OmniTotal]
            set i = i - 1
        endif
        set i = i + 1
    endloop
    
endfunction




private function Actions takes nothing returns nothing
    local unit u = GetSpellAbilityUnit()
    local integer i = 0
    local OmniData dat
    local trigger t
    
    if OmniTotal == -1 then
        set OmniTotal = OmniTotal + 1
        set move = CreateTrigger()
        call DisplayTextToPlayer(Player(0),0,0,&quot;Creating trigger . . .&quot;)
        call TriggerAddAction( move, function attack )
    endif

    set dat = SlideData.create()
    set OmniTotal = OmniTotal + 1
    set dat.caster = u
    set dat.nocancel = CreateTrigger()
    set Data[OmniTotal] = dat
    call TriggerRegisterUnitEvent( dat.nocancel, u, EVENT_UNIT_ISSUED_TARGET_ORDER )
    call TriggerRegisterUnitEvent( dat.nocancel, u, EVENT_UNIT_ISSUED_POINT_ORDER )
    call TriggerRegisterUnitEvent( dat.nocancel, u, EVENT_UNIT_ISSUED_ORDER )
    call TriggerExecute(move)
    
    set t = null
    set u = null

endfunction

//===========================================================================
function InitTrig_Omnislash takes nothing returns nothing
    set gg_trg_Omnislash = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Omnislash, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Omnislash, Condition( function Conditions ) )
    call TriggerAddAction( gg_trg_Omnislash, function Actions )
endfunction

endscope
</i></i></i></i></i>
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Staff online

      • Ghan
        Administrator - Servers are fun

      Members online

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top