This spell is supposed to create a boomerang and send it in a outward spiral around the caster. The boomerang gets made but does not move. I put in game messages and floating text to help debug, and they work fine (it says "running" for several seconds and then "the end", and the floating text does not pop up above the boomerang, it pops up at 0,0 on the map), so it seems like it is just not saving the local variable boom. This is the second time i have used this CSCache system by Vexorian, and the first time it was fine.
So the problem is that the boomerang does not move, and also it does not go away once the loop ends (when "the end" pops up). I think it is because the local variable boom is not set or stored to the cache correctly.
Here's where I think the problem is:
And here's the whole trigger
This is taken and adapted from Emjlr3's dash spell tutorial, btw
If there is other crap that I did inefficiently feel free to let me know
Thanks for the help.
So the problem is that the boomerang does not move, and also it does not go away once the loop ends (when "the end" pops up). I think it is because the local variable boom is not set or stored to the cache correctly.
Here's where I think the problem is:
JASS:
function Boomerang_Effects takes nothing returns nothing
local timer t = GetExpiredTimer()
local string s = GetAttachmentTable(t)
local trigger trig
local string strig
local unit caster = GetTableUnit(s,"caster")
local unit boom = GetTableUnit(s,"boom")
local real boomloop = GetTableReal(s,"boomloop")
call CreateTextTagUnitBJ( "Boomerang", boom, 0, 10, 100, 100, 100, 0 )
call DisplayTimedTextToForce( GetPlayersAll(), 1.00, "running" )
call SetUnitPosition(boom, (GetLocationX(GetUnitLoc(caster))+(50+(7.5*(boomloop)))*Cos((8 * (boomloop))*bj_DEGTORAD)),(GetLocationY(GetUnitLoc(caster))+(50+(7.5*(boomloop)))*Sin((8 * (boomloop))*bj_DEGTORAD)))
set boomloop = boomloop + 1
if boomloop>=200 or GetUnitState(caster,UNIT_STATE_LIFE)<=0 then
call DisplayTimedTextToForce( GetPlayersAll(), 30.00, "the end" )
call RemoveUnit(boom)
set trig = GetTableTrigger(s,"trig")
set strig = GetAttachmentTable(trig)
call TriggerRemoveAction(trig,GetTableTriggerAction(strig,"ta"))
call ClearTable(strig)
call DestroyTrigger(trig)
set trig = null
call ClearTable(s)
call PauseTimer(t)
call DestroyTimer(t)
else
call SetTableReal(s,"boomloop",boomloop)
endif
set caster = null
set boom = null
endfunction
function Trig_Boomerang_Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local real x = GetUnitX(caster)
local real y = GetUnitY(caster)
local location boomloc = Location(x + 50, y)
local trigger trig = CreateTrigger()
local string strig = GetAttachmentTable(trig)
local timer t = CreateTimer()
local string s = GetAttachmentTable(t)
local unit boom
call CreateUnitAtLoc(GetOwningPlayer(GetTriggerUnit()), 039;u001039;, boomloc, bj_UNIT_FACING)
set boom = bj_lastCreatedUnit
call TriggerRegisterUnitInRange(trig,boom,150,null)
call TriggerAddCondition(trig, Condition(function Boomerang_Dam_Cond))
call SetTableObject(strig,"ta", TriggerAddAction(trig, function Boomerang_Dam))
call SetTableObject(strig,"boom",boom)
call SetTableReal(s,"boomloop",1)
call SetTableObject(s,"caster",caster)
call SetTableObject(s,"boom",boom)
call SetTableObject(s,"trig",trig)
call TimerStart(t,.03,true,function Boomerang_Effects)
set caster = null
call RemoveLocation(boomloc)
set boomloc = null
set trig = null
endfunction
And here's the whole trigger
JASS:
function Trig_Boomerang_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 039;A00G039;
endfunction
function Boomerang_Dam_Cond takes nothing returns boolean
local string s = GetAttachmentTable(GetTriggeringTrigger())
return IsUnitEnemy(GetFilterUnit(),GetOwningPlayer(GetTableUnit(s,"boom")))==true and GetUnitState(GetFilterUnit(),UNIT_STATE_LIFE)>0
endfunction
function Boomerang_Dam takes nothing returns nothing
local string s = GetAttachmentTable(GetTriggeringTrigger())
local unit boom = GetTableUnit(s,"boom")
local unit enemy = GetTriggerUnit()
local real dam = 150
call UnitDamageTarget(boom,enemy,dam,false,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,null)
call DestroyEffect(AddSpecialEffectTarget("Objects\\Spawnmodels\\Human\\HumanBlood\\BloodElfSpellThiefBlood.mdl",enemy,"overhead"))
set boom = null
set enemy = null
endfunction
function Boomerang_Effects takes nothing returns nothing
local timer t = GetExpiredTimer()
local string s = GetAttachmentTable(t)
local trigger trig
local string strig
local unit caster = GetTableUnit(s,"caster")
local unit boom = GetTableUnit(s,"boom")
local real boomloop = GetTableReal(s,"boomloop")
call CreateTextTagUnitBJ( "Boomerang", boom, 0, 10, 100, 100, 100, 0 )
call DisplayTimedTextToForce( GetPlayersAll(), 1.00, "running" )
call SetUnitPosition(boom, (GetLocationX(GetUnitLoc(caster))+(50+(7.5*(boomloop)))*Cos((8 * (boomloop))*bj_DEGTORAD)),(GetLocationY(GetUnitLoc(caster))+(50+(7.5*(boomloop)))*Sin((8 * (boomloop))*bj_DEGTORAD)))
set boomloop = boomloop + 1
if boomloop>=200 or GetUnitState(caster,UNIT_STATE_LIFE)<=0 then
call DisplayTimedTextToForce( GetPlayersAll(), 30.00, "the end" )
call RemoveUnit(boom)
set trig = GetTableTrigger(s,"trig")
set strig = GetAttachmentTable(trig)
call TriggerRemoveAction(trig,GetTableTriggerAction(strig,"ta"))
call ClearTable(strig)
call DestroyTrigger(trig)
set trig = null
call ClearTable(s)
call PauseTimer(t)
call DestroyTimer(t)
else
call SetTableReal(s,"boomloop",boomloop)
endif
set caster = null
set boom = null
endfunction
function Trig_Boomerang_Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local real x = GetUnitX(caster)
local real y = GetUnitY(caster)
local location boomloc = Location(x + 50, y)
local trigger trig = CreateTrigger()
local string strig = GetAttachmentTable(trig)
local timer t = CreateTimer()
local string s = GetAttachmentTable(t)
local unit boom
call CreateUnitAtLoc(GetOwningPlayer(GetTriggerUnit()), 039;u001039;, boomloc, bj_UNIT_FACING)
set boom = bj_lastCreatedUnit
call TriggerRegisterUnitInRange(trig,boom,150,null)
call TriggerAddCondition(trig, Condition(function Boomerang_Dam_Cond))
call SetTableObject(strig,"ta", TriggerAddAction(trig, function Boomerang_Dam))
call SetTableObject(strig,"boom",boom)
call SetTableReal(s,"boomloop",1)
call SetTableObject(s,"caster",caster)
call SetTableObject(s,"boom",boom)
call SetTableObject(s,"trig",trig)
call TimerStart(t,.03,true,function Boomerang_Effects)
set caster = null
call RemoveLocation(boomloc)
set boomloc = null
set trig = null
endfunction
//===========================================================================
function InitTrig_Boomerang takes nothing returns nothing
set gg_trg_Boomerang = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Boomerang, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Boomerang, Condition( function Trig_Boomerang_Conditions ) )
call TriggerAddAction( gg_trg_Boomerang, function Trig_Boomerang_Actions )
call Preload("Objects\\Spawnmodels\\Human\\HumanBlood\\BloodElfSpellThiefBlood.mdl")
endfunction
This is taken and adapted from Emjlr3's dash spell tutorial, btw
If there is other crap that I did inefficiently feel free to let me know
Thanks for the help.