Well i am making a new spell called Phoenix Mastery That is basically a barrier spell that does damage per second to units inside the barrier( or heal allies) but i have some weird issues.. for example any dummy unit doesn't want to move.. I am sure that the problem is with the groups (Basically they are groups and loops but well..) inside the timer event. Here is my trigger:
I use Kattan Handle Vars. I use PolarX and PolarY functions.
It does the damage, it creates the dummy units, it heals allies too.. but the dummy doesn't move in the circle.. I am new to this moving circles thing Also how can i make so that the circle rotates ? That would be also a great idea..
-Question: DO i have to attach again in the timer function UpdateAndDamage the Caster unit ?
So the problem is:
-The dummies don't move to the current position of the caster
-And the trigger never ends.. Or i don't remove the dummies (That's what i think )
I use Kattan Handle Vars. I use PolarX and PolarY functions.
JASS:
scope PhoenixMastery
globals
private integer PhoenixId=039;A000039;
private integer DummyBarrierId=039;h001039;
private real HDMGBase=1
private string AppearBarrierEffect="Abilities\\Spells\\Human\\MarkOfChaos\\MarkOfChaosTarget.mdl"
private integer duration=50
private real PhoenixAoE=200
private integer MaxUnits=36 // This creates a Perfect Circle
endglobals
private function Trig_Phoenix_Mastery_Conditions takes nothing returns boolean
return GetSpellAbilityId()==PhoenixId
endfunction
private function DamageAndUpdate takes nothing returns nothing
local timer t=GetExpiredTimer()
local unit Caster=GetHandleUnit(t,"Caster")
local group dummygroup=GetHandleGroup(t,"Group")
local integer count=GetHandleInt(t,"Count")
local group g=CreateGroup()
local group Units=CreateGroup()
local unit w
local real x=GetUnitX(Caster)
local real y=GetUnitY(Caster)
local real newx
local real newy
local real angle
local real divide=(HDMGBase*GetUnitAbilityLevel(Caster,PhoenixId))*100
//Basically to here it crates the variables and set one of them..
set angle=0
set count=count+1
//If the trigger run 50 times it will destroy all (Exept the dummies that i forget =.=)
if count>duration then
call FlushHandleLocals(t)
call DestroyTimer(t)
set t=null
set Caster=null
set w=null
call DestroyGroup(dummygroup)
call DestroyGroup(Units)
call DestroyGroup(g)
return
endif
//Well here start's the problems..
//This loop is for move the dummies (Think that doesn't work)
loop
set w=FirstOfGroup(dummygroup)
exitwhen w==null
set angle=angle+10
call GroupRemoveUnit(dummygroup,w)
call GroupAddUnit(g,w)
set newx=PolarX(x,PhoenixAoE,angle)
set newy=PolarY(y,PhoenixAoE,angle)
call SetUnitPosition(w,newx,newy)
endloop
//This is for put back all the dummies in dummygroup Group..
loop
set w=FirstOfGroup(g)
exitwhen w==null
call GroupRemoveUnit(g,w)
call GroupAddUnit(dummygroup,w)
endloop
//Here i enum the units..
call GroupEnumUnitsInRange(Units,x,y,PhoenixAoE,null)
//Damage or Heal thing..
loop
set w=FirstOfGroup(Units)
exitwhen w==null
call GroupRemoveUnit(Units,w)
if IsUnitEnemy(w,GetOwningPlayer(Caster))==true then
call UnitDamageTarget(Caster,w,GetUnitState(w,UNIT_STATE_LIFE)/divide,true,false,ATTACK_TYPE_CHAOS,DAMAGE_TYPE_UNIVERSAL,WEAPON_TYPE_WHOKNOWS)
else
call SetUnitState(w,UNIT_STATE_LIFE,GetUnitState(w,UNIT_STATE_LIFE)+(GetUnitState(w,UNIT_STATE_LIFE)/divide))
endif
endloop
//Set back all variables (Count and the group variable that i modified)
call SetHandleInt(t,"Count",count)
call SetHandleHandle(t,"Group",dummygroup)
call DestroyGroup(g)
call DestroyGroup(dummygroup)
set Caster=null
call DestroyGroup(Units)
//Destroy all the rest
endfunction
//The basic function
private function Trig_Phoenix_Mastery_Actions takes nothing returns nothing
local unit Caster=GetSpellAbilityUnit()
local unit dummy
local timer t=CreateTimer()
local integer i=0
local group dummygroup=CreateGroup()
local real x=GetUnitX(Caster)
local real y=GetUnitY(Caster)
local real angle
local real newx
local real newy
set angle=0
//Creates the circle of units
loop
exitwhen i>MaxUnits
set newx=x+PhoenixAoE*Cos(angle*bj_DEGTORAD)
set newy=y+PhoenixAoE*Sin(angle*bj_DEGTORAD)
set dummy=CreateUnit(GetOwningPlayer(Caster),DummyBarrierId,newx,newy,270)
call GroupAddUnit(dummygroup,dummy)
set i=i+1
set angle=angle+10
call DestroyEffect(AddSpecialEffect(AppearBarrierEffect,newx,newy))
endloop
//Attach all the things..
call SetHandleHandle(t,"Caster",Caster)
call SetHandleHandle(t,"Group",dummygroup)
//Starts timer..
call TimerStart(t,1,true,function DamageAndUpdate)
//Null the rest
set Caster=null
set dummy=null
call DestroyGroup(dummygroup)
set t=null
endfunction
//===========================================================================
function InitTrig_Phoenix_Mastery takes nothing returns nothing
set gg_trg_Phoenix_Mastery = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Phoenix_Mastery, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Phoenix_Mastery, Condition( function Trig_Phoenix_Mastery_Conditions ) )
call TriggerAddAction( gg_trg_Phoenix_Mastery, function Trig_Phoenix_Mastery_Actions )
endfunction
endscope
It does the damage, it creates the dummy units, it heals allies too.. but the dummy doesn't move in the circle.. I am new to this moving circles thing Also how can i make so that the circle rotates ? That would be also a great idea..
-Question: DO i have to attach again in the timer function UpdateAndDamage the Caster unit ?
So the problem is:
-The dummies don't move to the current position of the caster
-And the trigger never ends.. Or i don't remove the dummies (That's what i think )