AdamGriffith
You can change this now in User CP.
- Reaction score
- 69
Why don't I need the sorting function? =S
scope TEST initializer Init
struct TEST
unit footman
effect fx
static method create takes player user returns TEST
local TEST data=TEST.allocate()
set data.footman=CreateUnit( user, 039;hfoo039;, 0, 0, 0 )
set data.fx=AddSpellEffectTargetById( 039;BHds039;, EFFECT_TYPE_TARGET, data.footman, "origin" )
call SelectUnit( data.footman, true )
return data
endmethod
method onDestroy takes nothing returns nothing
call KillUnit( .footman )
call DestroyEffect( .fx )
endmethod
endstruct
public function Main takes nothing returns nothing
local TEST data=TEST.create(GetTriggerPlayer())
call BJDebugMsg( "Creating struct instance: "+I2S(data) )
call PolledWait( 10.0 )
call BJDebugMsg( "Destroying struct instance: "+I2S(data) )
call data.destroy()
endfunction
public function Init takes nothing returns nothing
local trigger trig=CreateTrigger()
call TriggerRegisterPlayerEvent(trig, Player(0), EVENT_PLAYER_END_CINEMATIC)
call TriggerAddAction( trig, function Main )
endfunction
endscope
library Test
globals
private integer counter = 0
private constant integer testabilityraw = 039;A000039;
private constant integer testunitraw = 039;n000039;
private constant integer testsperlevel = 10
private constant integer maxtests = 30
private timer testtimer = CreateTimer()
private TestData array data
endglobals
struct TestData
real casterx
real castery
unit caster
unit array tests[maxtests]
endstruct
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == testabilityraw
endfunction
private function TimerCallback takes nothing returns nothing
local TestData a
local integer i1 = 1
local integer i2 = 1
local real angle
local real dist
local real dx
local real dy
local real newx
local real newy
local real x
local real y
loop
exitwhen i1 > counter
set a = data[i1]
loop
exitwhen i2 > maxtests
set x = GetUnitX(a.tests[i2])
set y = GetUnitY(a.tests[i2])
set dx = x - a.casterx
set dy = y - a.castery
set angle = bj_RADTODEG * Atan2(dy, dx)
set dist = SquareRoot(dx * dx + dy * dy)
set newx = a.casterx + dist * Cos((angle + 4.00) * bj_DEGTORAD)
set newy = a.castery + dist * Sin((angle + 4.00) * bj_DEGTORAD)
call SetUnitPosition(a.tests[i2], newx, newy)
set i2 = i2 + 1
endloop
set i2 = 1
set i1 = i1 + 1
endloop
endfunction
private function Actions takes nothing returns nothing
local integer i = 1
local real angle
local real dist
local real x
local real y
local TestData = a
set counter = counter + 1
set data[counter] = TestData.create()
set a = data[counter]
set a.caster = GetTriggerUnit()
set a.casterx = GetUnitX(a.caster)
set a.castery = GetUnitY(a.caster)
if counter == 1 then
call TimerStart(testtimer, 0.035, true, function TimerCallback)
else
endif
loop
exitwhen i > (testsperlevel * (GetUnitAbilityLevel(a.caster, testabilityraw))) or i > maxtests or GetUnitCurrentOrder(a.caster) != String2OrderIdBJ("channel")
set angle = GetRandomReal(0.00, 360.00)
set dist = GetRandomReal(128.00, 256.00)
set x = a.casterx + dist * Cos(angle * bj_DEGTORAD)
set y = a.castery + dist * Sin(angle * bj_DEGTORAD)
set a.tests<i> = CreateUnit(GetOwningPlayer(a.caster), testunitraw, x, y, (angle + 180))
call SetUnitFlyHeight(a.tests<i>, 256.00, dist)
call PolledWait(0.4)
set i = i + 1
endloop
endfunction
//===========================================================================
private function InitTrig_Test takes nothing returns nothing
set gg_trg_Test = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Test, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Test, Condition( function Conditions ) )
call TriggerAddAction( gg_trg_Test, function Actions )
endfunction
endlibrary
</i></i>
Although it doesn't seem to be working atm.
But that's the general idea.
I'm sure it's much easier.