library Spell requires SpellEffectEvent
/*
* Configuration
*/
globals
private constant integer ABIL_CODE = 'A000'
private constant integer DUMMY_ID_1 = 'h000'
private constant integer DUMMY_ID_2 = 'h001'
private constant integer DUMMY_ID_3 = 'h002'
private constant integer DUMMY_ID_4 = 'h003'
private constant real FALLOW_TROUGHT_TIME = 5.000 /* Make sure it's same like in Object Editor */ + 0.350 /* We add small delay because of effect */
private constant real DURATION_LOOP_TIME = FALLOW_TROUGHT_TIME / 3
private constant hashtable HASH = InitHashtable()
endglobals
/*private function GetChance takes integer level returns real
return 0.000
endfunction
private function GetAoe takes integer level returns real
return 0.000
endfunction
private function GetDamage takes integer level returns real
return 0.000
endfunction*/
private struct Spell extends array
private static method doFixedEffect takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer i = 0
local unit u = LoadUnitHandle(HASH, GetHandleId(t), 0)
local integer player_id = LoadInteger( HASH, GetHandleId(t), 1)
local real spell_target_x = LoadReal( HASH, GetHandleId(t), 2)
local real spell_target_y = LoadReal( HASH, GetHandleId(t), 3)
local real r
local unit u1
local unit u2
local unit u3
local unit u4
loop
exitwhen i > 4
set i = i+1
set u1 = CreateUnit(Player(15), DUMMY_ID_1, spell_target_x + GetRandomReal(-50.000,50.000), spell_target_y + GetRandomReal(-50.000,50.000), GetRandomReal(0.000,360.000))
call UnitApplyTimedLife(u1, 'BTLF', 2.0)
call SetUnitAnimation(u1, "birth")
set r = GetRandomReal(0.500,2.500)
call SetUnitScale(u1, r, r, r)
set u2 = CreateUnit(Player(15), DUMMY_ID_2, spell_target_x + GetRandomReal(-50.000,50.000), spell_target_y + GetRandomReal(-50.000,50.000), GetRandomReal(0.000,360.000))
call UnitApplyTimedLife(u2, 'BTLF', 2.0)
call SetUnitAnimation(u2, "birth")
set r = GetRandomReal(0.500,2.500)
call SetUnitScale(u2, r, r, r)
set u3 = CreateUnit(Player(15), DUMMY_ID_3, spell_target_x + GetRandomReal(-50.000,50.000), spell_target_y + GetRandomReal(-50.000,50.000), GetRandomReal(0.000,360.000))
call UnitApplyTimedLife(u3, 'BTLF', 2.0)
call SetUnitAnimation(u3, "birth")
set r = GetRandomReal(0.500,2.500)
call SetUnitScale(u3, r, r, r)
set u4 = CreateUnit(Player(15), DUMMY_ID_4, spell_target_x + GetRandomReal(-50.000,50.000), spell_target_y + GetRandomReal(-50.000,50.000), GetRandomReal(0.000,360.000))
call UnitApplyTimedLife(u4, 'BTLF', 2.0)
call SetUnitAnimation(u4, "birth")
set r = GetRandomReal(0.500,2.500)
call SetUnitScale(u4, r, r, r)
endloop
call PauseTimer(t)
call DestroyTimer(t)
set t = null
set u = null
set u1 = null
set u2 = null
set u3 = null
set u4 = null
endmethod
private static method doEffect takes nothing returns nothing
local timer t = GetExpiredTimer()
local real x
local real y
local real dist
local real angle
local integer i = 1
local integer j = 1
local real spell_target_x = LoadReal(HASH, GetHandleId(t), 2)
local real spell_target_y = LoadReal(HASH, GetHandleId(t), 3)
local real duration = LoadReal(HASH, GetHandleId(t), 4) - DURATION_LOOP_TIME
if duration < 0 then
call thistype.doFixedEffect()
return
endif
call SaveReal(HASH, GetHandleId(t), 4, duration)
loop
exitwhen i > 8
set j = 1
loop
exitwhen j > 10
set dist = 35.00 * I2R(i) + 25
set angle = (360.00 / 10.00 * I2R(j)) + (10.00 * I2R(i))
set x = spell_target_x + dist * Cos(angle * bj_DEGTORAD)
set y = spell_target_y + dist * Sin(angle * bj_DEGTORAD)
call DestroyEffect(AddSpecialEffect("Objects\\Spawnmodels\\Undead\\CryptFiendEggsack\\CryptFiendEggsack.mdl", x, y))
set j = j + 1
endloop
set i = i + 1
endloop
endmethod
private static method run takes nothing returns nothing
local timer t = CreateTimer()
local real x
local real y
local real dist
local real angle
local integer i = 1
local integer j = 1
local real spell_target_x = GetSpellTargetX()
local real spell_target_y = GetSpellTargetY()
call SaveUnitHandle(HASH, GetHandleId(t), 0, GetTriggerUnit())
call SaveInteger( HASH, GetHandleId(t), 1, GetPlayerId(GetTriggerPlayer()))
call SaveReal( HASH, GetHandleId(t), 2, spell_target_x)
call SaveReal( HASH, GetHandleId(t), 3, spell_target_y)
call SaveReal( HASH, GetHandleId(t), 4, FALLOW_TROUGHT_TIME)
loop
exitwhen i > 8
set j = 1
loop
exitwhen j > 10
set dist = 35.00 * I2R(i) + 25
set angle = (360.00 / 10.00 * I2R(j)) + (10.00 * I2R(i))
set x = spell_target_x + dist * Cos(angle * bj_DEGTORAD)
set y = spell_target_y + dist * Sin(angle * bj_DEGTORAD)
call DestroyEffect(AddSpecialEffect("Objects\\Spawnmodels\\Undead\\CryptFiendEggsack\\CryptFiendEggsack.mdl", x, y))
set j = j + 1
endloop
set i = i + 1
endloop
call TimerStart(t, DURATION_LOOP_TIME, true, function thistype.doEffect)
set t = null
endmethod
private static method onInit takes nothing returns nothing
call RegisterSpellEffectEvent(ABIL_CODE, function thistype.run)
endmethod
endstruct
endlibrary