HomeUser Control Panel (unavailable in archive)ForumsTutorialsArt GalleryResourcesMaps

SS--SpellSystem, group loop stopping while not being done?

09-21-2008, 02:49 PM#1
Vestras
Well, I'm making a SpellSystem, like xe, and I got a problem with a method.
It's a callback method, in which I make a dummy caster cast an ability to GetFilterUnit():

Collapse JASS:
// !!!! START OF SS--SPELLSYSTEM CONFIG !!!! \\
globals
    constant integer ss_dummy           = 'e000'
    constant integer ss_heightenabler   = 'Amrf'
    constant integer ss_player          = 15
endglobals

// !!!! START OF SS--CASTER MODULE !!!! \\
struct sscaster

    //===============================================================================================
    //     Remember, that dummy casters are slow, so you might want to add a minus cooldown and 
    //     casting time to the dummy ability!

    //=====================//
    static unit dummy      //
    //=====================//
    
    //===============================================================================================
    // create method, if time is 0, a life timer won't be added
    //
    static method create takes player p, real x, real y, real time returns sscaster
        local sscaster d = sscaster.allocate()
        set d.dummy = CreateUnit(p, ss_dummy, x, y, 0)
        if time != 0 then
            call UnitApplyTimedLife(d.dummy, 'BTLF', time)
        endif
        return d
    endmethod

    method castXY takes integer abilityid, integer level, string orderstring, real tx, real ty returns nothing
        call UnitAddAbility(.dummy, abilityid)
        call SetUnitAbilityLevel(.dummy, abilityid, level)
        call IssuePointOrder(.dummy, orderstring, tx, ty)
    endmethod

    method castLoc takes integer abilityid, integer level, string orderstring, location l returns nothing
        call UnitAddAbility(.dummy, abilityid)
        call SetUnitAbilityLevel(.dummy, abilityid, level)
        call IssuePointOrderLoc(.dummy, orderstring, l)
    endmethod

    method castTarget takes integer abilityid, integer level, string orderstring, unit target returns nothing
        call UnitAddAbility(.dummy, abilityid)
        call SetUnitAbilityLevel(.dummy, abilityid, level)
        call IssueTargetOrder(.dummy, orderstring, target)
    endmethod

    method castInstant takes integer abilityid, integer level, string orderstring returns nothing
        call UnitAddAbility(.dummy, abilityid)
        call SetUnitAbilityLevel(.dummy, abilityid, level)
        call IssueImmediateOrder(.dummy, orderstring)
    endmethod


    //===============================================================================================
    //
    //
    string caos
    real catime
    real cax
    real cay
    static sscaster cdata
    //
    // 
    //===============================================================================================
    
    static method cAOE_Callback takes nothing returns boolean
        local sscaster a = .cdata
            call IssueTargetOrder(.dummy, a.caos, GetFilterUnit())
        return false
    endmethod
    
    method castAOE takes integer abilityid, integer level,  string orderstring, real x, real y, real radius returns nothing
        local group g = CreateGroup()
            set .caos = orderstring
            set .cax = x
            set .cay = y
            set sscaster.cdata = this
            call UnitAddAbility(.dummy, abilityid)
            call SetUnitAbilityLevel(.dummy, abilityid, level)
            call GroupEnumUnitsInRange(g, x, y, radius, Filter(function sscaster.cAOE_Callback))
        call DestroyGroup(g)
        set g = null
    endmethod

    //===============================================================================================
    //
    //
    string cos
    real ctime
    real cx
    real cy
    static sscaster gdata
    //
    // 
    //===============================================================================================
    
    static method gGroup_Callback takes nothing returns boolean
        local sscaster a = .gdata
        call IssueTargetOrder(.dummy, a.cos, GetFilterUnit())
        return false
    endmethod
    
    method castGroup takes integer abilityid, integer level,  string orderstring, real x, real y, group g returns nothing
        set .cos = orderstring
        set .cx = x
        set .cy = y
        set sscaster.gdata = this
        call UnitAddAbility(.dummy, abilityid)
        call SetUnitAbilityLevel(.dummy, abilityid, level)
        call ForGroup(g, function sscaster.gGroup_Callback)
    endmethod

    method removeDummy takes nothing returns nothing
        call RemoveUnit(.dummy)
    endmethod

    method removeDummyTimed takes real time returns nothing
        call UnitApplyTimedLife(.dummy, 'BTLF', time)
    endmethod

    
    //===============================================================================================
    // 
    //
    static method createAndCastXY takes integer abilityid, integer level, real timed, string orderstring, real x, real y, real tx, real ty returns sscaster
        local sscaster d = sscaster.allocate()
        set d.dummy = CreateUnit(Player(ss_player), ss_dummy, x, y, 0)
            call UnitAddAbility(d.dummy, abilityid)
            call SetUnitAbilityLevel(d.dummy, abilityid, level)
            call IssuePointOrder(d.dummy, orderstring, tx, ty)
            call UnitApplyTimedLife(d.dummy, 'BTLF', timed)
        return d
    endmethod

    static method createAndCastLoc takes integer abilityid, integer level, real timed, string orderstring, real x, real y, location l returns sscaster
        local sscaster d = sscaster.allocate()
        set d.dummy = CreateUnit(Player(ss_player), ss_dummy, x, y, 0)
            call UnitAddAbility(d.dummy, abilityid)
            call SetUnitAbilityLevel(d.dummy, abilityid, level)
            call IssuePointOrderLoc(d.dummy, orderstring, l)
            call UnitApplyTimedLife(d.dummy, 'BTLF', timed)
        return d
    endmethod

    static method createAndCastTarget takes integer abilityid, integer level, real timed, string orderstring, real x, real y, unit target returns sscaster
        local sscaster d = sscaster.allocate()
        set d.dummy = CreateUnit(Player(ss_player), ss_dummy, x, y, 0)
            call UnitAddAbility(d.dummy, abilityid)
            call SetUnitAbilityLevel(d.dummy, abilityid, level)
            call IssueTargetOrder(d.dummy, orderstring, target)
            call UnitApplyTimedLife(d.dummy, 'BTLF', timed)
        return d
    endmethod

    static method createAndCastInstant takes integer abilityid, integer level, real timed, string orderstring, real x, real y returns sscaster
        local sscaster d = sscaster.allocate()
        set d.dummy = CreateUnit(Player(ss_player), ss_dummy, x, y, 0)
            call UnitAddAbility(d.dummy, abilityid)
            call SetUnitAbilityLevel(d.dummy, abilityid, level)
            call IssueImmediateOrder(d.dummy, orderstring)
            call UnitApplyTimedLife(d.dummy, 'BTLF', timed)
        return d
    endmethod

    string os
    integer aid
    integer lvl
    real time
    real x
    real y
    static sscaster adata
    //
    // 
    //===============================================================================================
    
    //
    static method AOE_Callback takes nothing returns boolean
        local sscaster a = .adata
        local unit d = CreateUnit(Player(ss_player), ss_dummy, a.x, a.y, 0)
        call UnitAddAbility(d, a.aid)
        call SetUnitAbilityLevel(d, a.aid, a.lvl)
        call IssueTargetOrder(d, a.os, GetFilterUnit())
        call UnitApplyTimedLife(d, 'BTLF', a.time)
        return false
    endmethod

    static method createAndCastAOE takes integer abilityid, integer level, real timed, string orderstring, real x, real y, real radius returns sscaster
        local sscaster d = sscaster.allocate()
        local group g = CreateGroup()
        local unit s
            set d.os = orderstring
            set d.aid = abilityid
            set d.lvl = level
            set d.time = timed
            set d.x = x
            set d.y = y
            set sscaster.adata = d
            call GroupEnumUnitsInRange(g, x, y, radius, Filter(function sscaster.AOE_Callback))
        call DestroyGroup(g)
        set s = null
        set g = null
        return d
    endmethod

    //===============================================================================================
    // 
    //
    string xos
    integer xaid
    integer xlvl
    real xtime
    real xx
    real xy
    static sscaster grpdata
    //
    // 
    //===============================================================================================
    
    //
    static method Group_Callback takes nothing returns boolean
        local sscaster a = .grpdata
        local unit d = CreateUnit(Player(ss_player), ss_dummy, a.xx, a.xy, 0)
        call UnitAddAbility(d, a.xaid)
        call SetUnitAbilityLevel(d, a.xaid, a.xlvl)
        call IssueTargetOrder(d, a.xos, GetFilterUnit())
        call UnitApplyTimedLife(d, 'BTLF', a.xtime)
        return false
    endmethod

    static method createAndCastGroup takes integer abilityid, integer level, real timed, string orderstring, real x, real y, group g returns sscaster
        local sscaster d = sscaster.allocate()
            set d.xos = orderstring
            set d.xaid = abilityid
            set d.xlvl = level
            set d.xtime = timed
            set d.xx = x
            set d.xy = y
            set sscaster.grpdata = d
            call ForGroup(g, function sscaster.Group_Callback)
        return d
    endmethod
    
    //===============================================================================================
    // SetSource methods
    //
    method SetSourceX takes real x returns nothing
        call SetUnitX(.dummy, x)
    endmethod

    method SetSourceY takes real y returns nothing
        call SetUnitY(.dummy, y)
    endmethod
    
    method SetSourceZ takes real z returns nothing
        call UnitAddAbility(.dummy, ss_heightenabler)
        call SetUnitFlyHeight(.dummy, z, 0)
        call UnitRemoveAbility(.dummy, ss_heightenabler)
    endmethod
    //
    //
    //===============================================================================================
endstruct

// !!!! START OF SS--DAMAGE MODULE !!!! \\
struct ssdamage
    unit damager
    unit target

    static method DamageUnit takes unit damager, unit target, real damage, boolean armor returns ssdamage
        local ssdamage d = ssdamage.allocate()
        set d.damager = damager
        set d.target = target
        if armor == false then
            call UnitDamageTarget(damager, target, damage, false, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNIVERSAL, null)
        else
            call UnitDamageTarget(damager, target, damage, false, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, null)
        endif
        return d
    endmethod

    unit xdmgr
    real xdmg
    boolean xrm
    static ssdamage dpedata
    
    static method DPE_Callback takes nothing returns boolean
        local ssdamage a = .dpedata
        local ssdamage d = ssdamage.DamageUnit(a.xdmgr, GetEnumUnit(), a.xdmg, a.xrm)
        return false
    endmethod

    static method DamagePointEnemies takes unit damager, real x, real y, real radius, real damage, boolean armor returns ssdamage
        local ssdamage d = ssdamage.allocate()
        local group g = CreateGroup()
        set d.xdmgr = damager
        set d.xdmg = damage
        set d.xrm = armor
        set d.damager = damager
        set ssdamage.dpedata = d
            call GroupEnumUnitsInRange(g, x, y, radius, Filter(function ssdamage.DPE_Callback))
        call DestroyGroup(g)
        set g = null
        return d
    endmethod

    static method DamagePointEnemiesLoc takes unit damager, location l, real radius, real damage, boolean armor returns ssdamage
        local ssdamage d = ssdamage.allocate()
        local real x = GetLocationX(l)
        local real y = GetLocationY(l)
        set d.damager = damager
            call ssdamage.DamagePointEnemies(damager, x, y, radius, damage, armor)
        return d
    endmethod

    unit xxdmgr
    real xxdmg
    boolean xxrm
    static ssdamage dpadata
    
    static method DPA_Callback takes nothing returns boolean
        local ssdamage a = .dpadata
        local ssdamage d = ssdamage.DamageUnit(a.xxdmgr, GetEnumUnit(), a.xxdmg, a.xxrm)
        return false
    endmethod

    static method DamagePointAllies takes unit damager, real x, real y, real radius, real damage, boolean armor returns ssdamage
        local ssdamage d = ssdamage.allocate()
        local group g = CreateGroup()
        set d.xxdmgr = damager
        set d.xxdmg = damage
        set d.xxrm = armor
        set d.damager = damager
        set ssdamage.dpadata = d
            call GroupEnumUnitsInRange(g, x, y, radius, Filter(function ssdamage.DPA_Callback))
        call DestroyGroup(g)
        set g = null
        return d
    endmethod

    static method DamagePointAlliesLoc takes unit damager, location l, real radius, real damage, boolean armor returns ssdamage
        local ssdamage d = ssdamage.allocate()
        local real x = GetLocationX(l)
        local real y = GetLocationY(l)
        set d.damager = damager
            call ssdamage.DamagePointAllies(damager, x, y, radius, damage, armor)
        return d
    endmethod

    unit xxxdmgr
    real xxxdmg
    boolean xxxrm
    static ssdamage dpalldata
    
    static method DPALL_Callback takes nothing returns boolean
        local ssdamage a = .dpedata
        local ssdamage d = ssdamage.DamageUnit(a.xxdmgr, GetEnumUnit(), a.xxdmg, a.xxrm)
        return false
    endmethod

    static method DamagePointAll takes unit damager, real x, real y, real radius, real damage, boolean armor returns ssdamage
        local ssdamage d = ssdamage.allocate()
        local group g = CreateGroup()
        set d.xxxdmgr = damager
        set d.xxxdmg = damage
        set d.xxxrm = armor
        set d.damager = damager
        set ssdamage.dpalldata = d
            call GroupEnumUnitsInRange(g, x, y, radius, Filter(function ssdamage.DPALL_Callback))
        call DestroyGroup(g)
        set g = null
        return d
    endmethod

    static method DamagePointAllLoc takes unit damager, location l, real radius, real damage, boolean armor returns ssdamage
        local ssdamage d = ssdamage.allocate()
        local real x = GetLocationX(l)
        local real y = GetLocationY(l)
        set d.damager = damager
            call ssdamage.DamagePointAll(damager, x, y, radius, damage, armor)
        return d
    endmethod

endstruct

// !!!! START OF SS--SHAPES MODULE !!!! \\
interface shapecompare
    real cx
    real cy
    
    method comparex takes ssshapes a, ssshapes b returns real defaults 0.00
    method comparey takes ssshapes a, ssshapes b returns real defaults 0.00
endinterface

struct ssshapes extends shapecompare

    unit caster
    real cx
    real cy
    integer n

    static method line takes real x, real y, real tx, real ty, unit c, string fx, integer n, real dmg, real dmgaoe, boolean armor returns ssshapes
        local ssshapes l = ssshapes.allocate()
        local ssdamage d
        local integer i = 0
        local real dx = tx - x
        local real dy = ty - y
        local real dist = SquareRoot(dx * dx + dy * dy) / n
        local real angle = Atan2(ty - y, tx - x)
        local real px
        local real py
        set l.caster = c
        set l.cx = x
        set l.cy = y
        set l.n = n
                
            loop
                set i = i + 1
                exitwhen i > n
                    set px = x + (dist * i) * Cos(angle)
                    set py = y + (dist * i) * Sin(angle)
                    call DestroyEffect(AddSpecialEffect(fx, px, py))
                    set d = ssdamage.DamagePointEnemies(c, px, py, dmgaoe, dmg, armor)
            endloop
        return l
    endmethod

    static method circle takes real x, real y, real radius, unit c, string fx, integer n, real dmg, real dmgaoe, boolean armor returns ssshapes
        local ssshapes s = ssshapes.allocate()
        local ssdamage d
        local integer i = 0
        local real angle
        local real px
        local real py
        set s.caster = c
        set s.cx = x
        set s.cy = y
        set s.n = n
                
            set px = x + radius * Cos(0 * bj_DEGTORAD)
            set py = y + radius * Sin(0 * bj_DEGTORAD)
            call DestroyEffect(AddSpecialEffect(fx, px, py))
            call UnitDamagePoint(c, 0, dmgaoe, px, py, dmg, false, true, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, null)
            loop
                set i = i + 1
                exitwhen i > n
                    set angle = i * (360 / n)
                    set px = x + radius * Cos(angle * bj_DEGTORAD)
                    set py = y + radius * Sin(angle * bj_DEGTORAD)
                    call DestroyEffect(AddSpecialEffect(fx, px, py))
                    set d = ssdamage.DamagePointEnemies(c, px, py, dmgaoe, dmg, armor)
            endloop
        return s
    endmethod
    
    method DistanceBetweenCoords takes real x, real y, real tx, real ty returns real
        local real dx = tx - x
        local real dy = ty - y
        return SquareRoot(dx * dx + dy * dy)
    endmethod
    
    method comparexy takes ssshapes a, ssshapes b returns real
        return .DistanceBetweenCoords(a.cx, a.cy, b.cx, b.cy)
    endmethod
    
endstruct]
(It's in the sscaster struct, it's the cAOE_Callback method.)
(It's not done yet, and if you could maybe also comment the code... :))

Any ideas? Basicly, it can maximum hit 2 units, even though there's more. And after first cast, it hits the same units it hit the first cast even though the units are not even close.
09-21-2008, 03:35 PM#2
Ammorth
.cdata doesn't work in a static method, as the local variable this doesn't exist in static methods (this.cdata == .cdata).
09-21-2008, 03:45 PM#3
Vestras
What? It doesn't give any syntax errors, and if I create a new unit for each unit in the group, it works perfectly.
09-21-2008, 03:55 PM#4
Vexorian
Quote:
Originally Posted by Ammorth
.cdata doesn't work in a static method, as the local variable this doesn't exist in static methods (this.cdata == .cdata).
cdata is static.