I'm creating a spell that is a half sphere and then it implodes but now I have an extremely weird bug.
When I cast it once then it fucks up totally, when that instance finish and I casts it again then it fucks up but in another way, BUT if I first cast it and it fucks up and then casts it again while the other is still running then it works.
How I can see the bug: If the instance is fucked up then the units moves totally randomly.
My awesome code
When I cast it once then it fucks up totally, when that instance finish and I casts it again then it fucks up but in another way, BUT if I first cast it and it fucks up and then casts it again while the other is still running then it works.
How I can see the bug: If the instance is fucked up then the units moves totally randomly.
My awesome code
JASS:
library OtherSummon initializer Init requires HSAS
globals
private constant integer SPELL_ID = 039;A002039;
private constant integer DUMMY_ID = 039;o001039;
private constant real RADIUS = 400
private constant integer UNITS_PER_LAYER = 16
private constant real TIMER_PERIOD = 0.025
private constant real DECREASE_TIME = 4
endglobals
//! runtextmacro HSAS_Static("Other", "8190", "private")
private struct otherdata
real x
real y
group g
unit u
player p
real array xyspeeds[200]
real array heightspeeds[200]
integer iterator
static method create takes unit u, real x, real y returns otherdata
local otherdata d = .allocate()
set d.x = x
set d.y = y
set d.u = u
set d.g = CreateGroup()
set d.p = GetOwningPlayer(u)
set d.iterator = 0
return d
endmethod
endstruct
globals
private otherdata dddddd
endglobals
private function CallbackForgroup takes nothing returns nothing
local unit u = GetEnumUnit()
local real x = GetUnitX(u)
local real y = GetUnitY(u)
local otherdata d = dddddd
local real angle = (Atan2(y - d.y, x - d.x))
local real height = GetUnitFlyHeight(u)
local real distance = SquareRoot((x - d.x) * (x - d.x) + (y - d.y) * (y - d.y))
if distance == 0 then
set distance = 1
endif
if distance >= 20 then
call SetUnitX(u, d.x + (distance - d.xyspeeds[d.iterator]) * Cos(angle))
call SetUnitY(u, d.y + (distance - d.xyspeeds[d.iterator]) * Sin(angle))
endif
if height > 10 then
call SetUnitFlyHeight(u, height - d.heightspeeds[d.iterator], 0 )
endif
if distance < 20 and height <= 10 then
call GroupRemoveUnit(d.g, u)
endif
set d.iterator = d.iterator + 1
endfunction
private function Callback takes nothing returns nothing
local otherdata d = GetAttachedStructOther(GetExpiredTimer())
set dddddd = d
if FirstOfGroup(d.g) == null then
call d.destroy()
call PauseTimer(GetExpiredTimer())
call DestroyTimer(GetExpiredTimer())
else
call ForGroup(d.g , function CallbackForgroup)
endif
set d.iterator = 0
endfunction
private function Act takes nothing returns nothing
local location loc = GetSpellTargetLoc()
local unit u = GetTriggerUnit()
local otherdata d = otherdata.create(u, GetLocationX(loc), GetLocationY(loc))
local integer i = 0
local real angleBetween = (360/UNITS_PER_LAYER) // The amount of units on the height = this/2
local real angleDone = 0
local real angleDoneHeight = 0
local real cz = 1
local timer t = CreateTimer()
local real dist
loop
exitwhen cz < 0
loop
exitwhen angleDone >= 360. or cz < 0
set cz = RADIUS * Cos(angleDoneHeight*bj_DEGTORAD)
set u = CreateUnit(d.p, DUMMY_ID, d.x + RADIUS * Sin(angleDoneHeight*bj_DEGTORAD) * Cos(angleDone*bj_DEGTORAD) , d.y + RADIUS * Sin(angleDoneHeight*bj_DEGTORAD) * Sin(angleDone*bj_DEGTORAD) , 270)
call UnitApplyTimedLife( u, 039;BTLF039;, 6)
call SetUnitFlyHeight(u, cz + 10, 0)
call GroupAddUnit(d.g, u)
set angleDone = angleDone + angleBetween
set dist = SquareRoot((GetUnitX(u) - d.x) * (GetUnitX(u) - d.x) + (GetUnitY(u) - d.y) * (GetUnitY(u) - d.y))
set d.xyspeeds<i> = (dist * TIMER_PERIOD) / DECREASE_TIME
set d.heightspeeds<i> = (GetUnitFlyHeight(u) * TIMER_PERIOD) / DECREASE_TIME
set u = null
set i = i + 1
endloop
set angleDone = 0
set angleDoneHeight = angleDoneHeight+angleBetween
endloop
call AttachStructOther(t, d)
call TimerStart(t, TIMER_PERIOD, true, function Callback)
endfunction
private function Cond takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
private function Init takes nothing returns nothing
local trigger Trig = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(Trig, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(Trig, Condition(function Cond))
call TriggerAddAction(Trig, function Act)
endfunction
endlibrary</i></i>