Problem with non-moving dummies

0zaru

Learning vJASS ;)
Reaction score
60
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.

JASS:
scope PhoenixMastery

globals
private integer PhoenixId='A000'
private integer DummyBarrierId='h001'
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 :p 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 :p
-And the trigger never ends.. Or i don't remove the dummies (That's what i think :p)
 

Waaaaagh

I lost all my rep and my title being a jerk
Reaction score
70
It would be totally awesome if you would indent your code so I could read it.
 

Waaaaagh

I lost all my rep and my title being a jerk
Reaction score
70
errr.... It still isn't indented. At least for me.
 

PurgeandFire

zxcvmkgdfg
Reaction score
509
Shazaamm!!

JASS:
scope PhoenixMastery

globals
    private integer PhoenixId='A000'
    private integer DummyBarrierId='h001'
    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
 

Waaaaagh

I lost all my rep and my title being a jerk
Reaction score
70
In your loop, have you tried not doing all the function calls? Just do:

JASS:
call SetUnitX(w,x+PhoenixAoE*Cos(angle))
call SetUnitY(w,y+PhoenixAoE*Sin(angle))
 
A

Aw2k6

Guest
Also, make sure the units have at least 1 movespeed. That's caused myself some issues with SetUnitX and Y, but I don't know if it still bugs with SetUnitPosition.
 

0zaru

Learning vJASS ;)
Reaction score
60
In your loop, have you tried not doing all the function calls? Just do:

JASS:
call SetUnitX(w,x+PhoenixAoE*Cos(angle))
call SetUnitY(w,y+PhoenixAoE*Sin(angle))
Yes i have tried that it's the same.

Also i doubt that will bug with set unt position

EDIT:i am watching PurgeAndFire thing :p..
EDIT2: Well the one of PurgeAndFire doesn't moves the units either
 

PurgeandFire

zxcvmkgdfg
Reaction score
509
Yes i have tried that it's the same.

Also i doubt that will bug with set unt position

EDIT:i am watching PurgeAndFire thing :p..
EDIT2: Well the one of PurgeAndFire doesn't moves the units either

That's because I all I did was indent it. I didn't fix anything. :p
 

0zaru

Learning vJASS ;)
Reaction score
60
Oh that's why i didn't notice anything :p

Any ideas of how to fix it ? Well i have never make a moving circle so i really don't have any idea :p (not in jass =/)
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Members online

      No members online now.

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top