| 09-21-2008, 02:49 PM | #1 |
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(): 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 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 |
.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 |
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 | |
Quote:
|
