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.
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() == 039;A005039;
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, "attackonce", 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 >= 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;A005039;)
set dat.continue = true
if dat.strikes < (StrikesBase + ( level * StrikesPerLevel)) and dat.continue == true then
call DisplayTextToPlayer(Player(0),0,0,("ran " + I2S(dat.strikes) + " times."))
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("Abilities\\Spells\\Human\\MarkOfChaos\\MarkOfChaosDone.mdl", dat.caster, "origin")
call SetUnitPosition(dat.caster,GetUnitX(dat.target),GetUnitY(dat.target))
set e = AddSpecialEffectTarget("Abilities\\Spells\\Human\\MarkOfChaos\\MarkOfChaosDone.mdl", dat.caster, "origin")
call IssueTargetOrder( dat.caster, "attackonce", 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 >= (StrikesBase + ( level * StrikesPerLevel)) then
call DisplayTextToPlayer(Player(0),0,0,"Omni Data Destroyed, hit strike limit " + 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,"Creating trigger . . .")
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>