Well, I'm making a spell system, like Vexorian's CasterSystem, just simpler, not so messed up, well, I want to know if the method I'm using with dummy casters is MUI. (I use bj_ghoul[...].)
I don't really know myself...
(It's not done, at all, yet.)
JASS:
// !!!! START OF SS--SPELLSYSTEM CONFIG !!!! \\
constant function ss_dummy takes nothing returns integer
// Raw code of the dummy unit
return 039;e000039;
endfunction
constant function ss_heightenabler takes nothing returns integer
// Raw code of Medivh's Raven Form ability
return 039;Amrf039;
endfunction
constant function ss_integer takes nothing returns integer
// Just a random integer, the more random the better
return 6594
endfunction
constant function ss_player takes nothing returns integer
// The player which should own all dummy units
return 15
endfunction
// !!!! START OF SS--sscache FUNCTION !!!! \\
function ss takes nothing returns gamecache
if udg_sscache == null then
call FlushGameCache(InitGameCache("data.ss"))
set udg_sscache = InitGameCache("data.ss")
endif
return udg_sscache
endfunction
// !!!! START OF SS--SPECIFIC FUNCTIONS !!!! \\
function EnemyFilter takes nothing returns boolean
local integer i = GetStoredInteger(ss(), "ss", "enemy_playerid")
return IsUnitEnemy(GetFilterUnit(), Player(i)) == true
endfunction
function AllyFilter takes nothing returns boolean
local integer i = GetStoredInteger(ss(), "ss", "ally_playerid")
return IsUnitAlly(GetFilterUnit(), Player(i)) == true
endfunction
constant function H2I takes handle h returns integer
return h
return 0
endfunction
constant function I2U takes integer i returns unit
return i
return null
endfunction
// !!!! START OF SS--CASTER MODULE !!!! \\
function create takes real x, real y returns unit
set bj_ghoul[ss_integer()] = CreateUnit(Player(ss_player()), ss_dummy(), x, y, 0)
return bj_ghoul[ss_integer()]
endfunction
function castXY takes integer abilityid, integer level, string orderstring, real tx, real ty returns nothing
call UnitAddAbility(bj_ghoul[ss_integer()], abilityid)
call SetUnitAbilityLevel(bj_ghoul[ss_integer()], abilityid, level)
call IssuePointOrder(bj_ghoul[ss_integer()], orderstring, tx, ty)
endfunction
function castLoc takes integer abilityid, integer level, string orderstring, location l returns nothing
call UnitAddAbility(bj_ghoul[ss_integer()], abilityid)
call SetUnitAbilityLevel(bj_ghoul[ss_integer()], abilityid, level)
call IssuePointOrderLoc(bj_ghoul[ss_integer()], orderstring, l)
endfunction
function castTarget takes integer abilityid, integer level, string orderstring, unit target returns nothing
call UnitAddAbility(bj_ghoul[ss_integer()], abilityid)
call SetUnitAbilityLevel(bj_ghoul[ss_integer()], abilityid, level)
call IssueTargetOrder(bj_ghoul[ss_integer()], orderstring, target)
endfunction
function castInstant takes integer abilityid, integer level, string orderstring returns nothing
call UnitAddAbility(bj_ghoul[ss_integer()], abilityid)
call SetUnitAbilityLevel(bj_ghoul[ss_integer()], abilityid, level)
call IssueImmediateOrder(bj_ghoul[ss_integer()], orderstring)
endfunction
function castAOE takes integer abilityid, integer level, real timed, string orderstring, real x, real y, real radius returns nothing
local group g = CreateGroup()
local unit s
call GroupEnumUnitsInRange(g, x, y, radius, null)
call UnitAddAbility(bj_ghoul[ss_integer()], abilityid)
call SetUnitAbilityLevel(bj_ghoul[ss_integer()], abilityid, level)
call UnitApplyTimedLife(bj_ghoul[ss_integer()], 039;BTLF039;, timed)
loop
set s = FirstOfGroup(g)
exitwhen s == null
call IssueTargetOrder(bj_ghoul[ss_integer()], orderstring, s)
endloop
call DestroyGroup(g)
set s = null
set g = null
endfunction
function castGroup takes integer abilityid, integer level, real timed, string orderstring, real x, real y, group g returns nothing
local unit s
call UnitAddAbility(bj_ghoul[ss_integer()], abilityid)
call SetUnitAbilityLevel(bj_ghoul[ss_integer()], abilityid, level)
call UnitApplyTimedLife(bj_ghoul[ss_integer()], 039;BTLF039;, timed)
loop
set s = FirstOfGroup(g)
exitwhen s == null
call IssueTargetOrder(bj_ghoul[ss_integer()], orderstring, s)
endloop
set s = null
endfunction
function removeDummy takes nothing returns nothing
call RemoveUnit(bj_ghoul[ss_integer()])
endfunction
function removeDummyTimed takes real time returns nothing
call UnitApplyTimedLife(bj_ghoul[ss_integer()], 039;BTLF039;, time)
endfunction
function createAndCastXY takes integer abilityid, integer level, real timed, string orderstring, real x, real y, real tx, real ty returns unit
set bj_ghoul[ss_integer()] = CreateUnit(Player(ss_player()), ss_dummy(), x, y, 0)
call UnitAddAbility(bj_ghoul[ss_integer()], abilityid)
call SetUnitAbilityLevel(bj_ghoul[ss_integer()], abilityid, level)
call IssuePointOrder(bj_ghoul[ss_integer()], orderstring, tx, ty)
call UnitApplyTimedLife(bj_ghoul[ss_integer()], 039;BTLF039;, timed)
return bj_ghoul[ss_integer()]
endfunction
function createAndCastLoc takes integer abilityid, integer level, real timed, string orderstring, real x, real y, location l returns unit
set bj_ghoul[ss_integer()] = CreateUnit(Player(ss_player()), ss_dummy(), x, y, 0)
call UnitAddAbility(bj_ghoul[ss_integer()], abilityid)
call SetUnitAbilityLevel(bj_ghoul[ss_integer()], abilityid, level)
call IssuePointOrderLoc(bj_ghoul[ss_integer()], orderstring, l)
call UnitApplyTimedLife(bj_ghoul[ss_integer()], 039;BTLF039;, timed)
return bj_ghoul[ss_integer()]
endfunction
function createAndCastTarget takes integer abilityid, integer level, real timed, string orderstring, real x, real y, unit target returns unit
set bj_ghoul[ss_integer()] = CreateUnit(Player(ss_player()), ss_dummy(), x, y, 0)
call UnitAddAbility(bj_ghoul[ss_integer()], abilityid)
call SetUnitAbilityLevel(bj_ghoul[ss_integer()], abilityid, level)
call IssueTargetOrder(bj_ghoul[ss_integer()], orderstring, target)
call UnitApplyTimedLife(bj_ghoul[ss_integer()], 039;BTLF039;, timed)
return bj_ghoul[ss_integer()]
endfunction
function createAndCastInstant takes integer abilityid, integer level, real timed, string orderstring, real x, real y returns unit
set bj_ghoul[ss_integer()] = CreateUnit(Player(ss_player()), ss_dummy(), x, y, 0)
call UnitAddAbility(bj_ghoul[ss_integer()], abilityid)
call SetUnitAbilityLevel(bj_ghoul[ss_integer()], abilityid, level)
call IssueImmediateOrder(bj_ghoul[ss_integer()], orderstring)
call UnitApplyTimedLife(bj_ghoul[ss_integer()], 039;BTLF039;, timed)
return bj_ghoul[ss_integer()]
endfunction
function AOE_Callback takes nothing returns nothing
local string orderstring = GetStoredString(ss(), "ss", "aoe_order")
local integer abilityid = GetStoredInteger(ss(), "ss", "aoe_id")
local integer level = GetStoredInteger(ss(), "ss", "aoe_lvl")
local real timed = GetStoredReal(ss(), "ss", "aoe_time")
local real x = GetStoredReal(ss(), "ss", "aoe_x")
local real y = GetStoredReal(ss(), "ss", "aoe_y")
set bj_ghoul[ss_integer()] = CreateUnit(Player(ss_player()), ss_dummy(), x, y, 0)
call UnitAddAbility(bj_ghoul[ss_integer()], abilityid)
call SetUnitAbilityLevel(bj_ghoul[ss_integer()], abilityid, level)
call IssueTargetOrder(bj_ghoul[ss_integer()], orderstring, GetEnumUnit())
call UnitApplyTimedLife(bj_ghoul[ss_integer()], 039;BTLF039;, timed)
endfunction
function createAndCastAOE takes integer abilityid, integer level, real timed, string orderstring, real x, real y, real radius returns nothing
local group g = CreateGroup()
local unit s
call GroupEnumUnitsInRange(g, x, y, radius, null)
call StoreString(ss(), "ss", "aoe_order", orderstring)
call StoreInteger(ss(), "ss", "aoe_id", abilityid)
call StoreInteger(ss(), "ss", "aoe_lvl", level)
call StoreReal(ss(), "ss", "aoe_time", timed)
call StoreReal(ss(), "ss", "aoe_x", x)
call StoreReal(ss(), "ss", "aoe_y", y)
call ForGroup(g, function AOE_Callback)
call DestroyGroup(g)
set s = null
set g = null
endfunction
function Group_Callback takes nothing returns nothing
local string orderstring = GetStoredString(ss(), "ss", "grp_order")
local integer abilityid = GetStoredInteger(ss(), "ss", "grp_id")
local integer level = GetStoredInteger(ss(), "ss", "grp_lvl")
local real timed = GetStoredReal(ss(), "ss", "grp_time")
local real x = GetStoredReal(ss(), "ss", "grp_x")
local real y = GetStoredReal(ss(), "ss", "grp_y")
set bj_ghoul[ss_integer()] = CreateUnit(Player(ss_player()), ss_dummy(), x, y, 0)
call UnitAddAbility(bj_ghoul[ss_integer()], abilityid)
call SetUnitAbilityLevel(bj_ghoul[ss_integer()], abilityid, level)
call IssueTargetOrder(bj_ghoul[ss_integer()], orderstring, GetEnumUnit())
call UnitApplyTimedLife(bj_ghoul[ss_integer()], 039;BTLF039;, timed)
endfunction
function createAndCastGroup takes integer abilityid, integer level, real timed, string orderstring, real x, real y, group g returns nothing
local unit s
call StoreString(ss(), "ss", "grp_order", orderstring)
call StoreInteger(ss(), "ss", "grp_id", abilityid)
call StoreInteger(ss(), "ss", "grp_lvl", level)
call StoreReal(ss(), "ss", "grp_time", timed)
call StoreReal(ss(), "ss", "grp_x", x)
call StoreReal(ss(), "ss", "grp_y", y)
call ForGroup(g, function Group_Callback)
set s = null
endfunction
function SetSourceZ takes real z returns nothing
call UnitAddAbility(bj_ghoul[ss_integer()], ss_heightenabler())
call SetUnitFlyHeight(bj_ghoul[ss_integer()], z, 0)
call UnitRemoveAbility(bj_ghoul[ss_integer()], ss_heightenabler())
endfunction
constant function GetLastCreatedDummy takes nothing returns unit
return bj_ghoul[ss_integer()]
endfunction
// !!!! START OF SS--DAMAGE MODULE !!!! \\
function DamageUnit takes unit damager, unit target, real damage, boolean armor returns boolean
if armor == false then
return UnitDamageTarget(damager, target, damage, false, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNIVERSAL, null)
else
return UnitDamageTarget(damager, target, damage, false, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, null)
endif
return false
endfunction
function DPE_Callback takes nothing returns nothing
local boolean armor = GetStoredBoolean(ss(), "ss", "dpe_armor")
local real damage = GetStoredReal(ss(), "ss", "dpe_damage")
local unit damager = I2U(GetStoredInteger(ss(), "ss", "dpe_damager"))
call DamageUnit(null, GetEnumUnit(), damage, armor)
endfunction
function DamagePointEnemies takes unit damager, real x, real y, real radius, real damage, boolean armor returns nothing
local group g = CreateGroup()
call StoreInteger(ss(), "ss", "enemy_playerid", GetPlayerId(GetOwningPlayer(damager)))
call StoreBoolean(ss(), "ss", "dpe_armor", armor)
call StoreReal(ss(), "ss", "dpe_damage", damage)
call StoreInteger(ss(), "ss", "dpe_damager", H2I(damager))
call GroupEnumUnitsInRange(g, x, y, radius, Filter(function EnemyFilter))
call ForGroup(g, function DPE_Callback)
call DestroyGroup(g)
set g = null
endfunction
function DamagePointEnemiesLoc takes unit damager, location l, real radius, real damage, boolean armor returns nothing
local real x = GetLocationX(l)
local real y = GetLocationY(l)
call DamagePointEnemies(damager, x, y, radius, damage, armor)
endfunction
function DPA_Callback takes nothing returns nothing
local boolean armor = GetStoredBoolean(ss(), "ss", "dpa_armor")
local real damage = GetStoredReal(ss(), "ss", "dpa_damage")
local unit damager = I2U(GetStoredInteger(ss(), "ss", "dpa_damager"))
call DamageUnit(null, GetEnumUnit(), damage, armor)
endfunction
function DamagePointAllies takes unit damager, real x, real y, real radius, real damage, boolean armor returns nothing
local group g = CreateGroup()
call StoreInteger(ss(), "ss", "ally_playerid", GetPlayerId(GetOwningPlayer(damager)))
call StoreBoolean(ss(), "ss", "dpa_armor", armor)
call StoreReal(ss(), "ss", "dpa_damage", damage)
call StoreInteger(ss(), "ss", "dpa_damager", H2I(damager))
call GroupEnumUnitsInRange(g, x, y, radius, Filter(function AllyFilter))
call ForGroup(g, function DPA_Callback)
call DestroyGroup(g)
set g = null
endfunction
function DamagePointAlliesLoc takes unit damager, location l, real radius, real damage, boolean armor returns nothing
local real x = GetLocationX(l)
local real y = GetLocationY(l)
call DamagePointAllies(damager, x, y, radius, damage, armor)
endfunction
function DPALL_Callback takes nothing returns nothing
local boolean armor = GetStoredBoolean(ss(), "ss", "dpall_armor")
local real damage = GetStoredReal(ss(), "ss", "dpall_damage")
local unit damager = I2U(GetStoredInteger(ss(), "ss", "dpall_damager"))
call DamageUnit(null, GetEnumUnit(), damage, armor)
endfunction
function DamagePointAll takes unit damager, real x, real y, real radius, real damage, boolean armor returns nothing
local group g = CreateGroup()
call StoreBoolean(ss(), "ss", "dpall_armor", armor)
call StoreReal(ss(), "ss", "dpall_damage", damage)
call StoreInteger(ss(), "ss", "dpall_damager", H2I(damager))
call GroupEnumUnitsInRange(g, x, y, radius, null)
call ForGroup(g, function DPALL_Callback)
call DestroyGroup(g)
set g = null
endfunction
function DamagePointAllLoc takes unit damager, location l, real radius, real damage, boolean armor returns nothing
local real x = GetLocationX(l)
local real y = GetLocationY(l)
call DamagePointAll(damager, x, y, radius, damage, armor)
endfunction
// !!!! START OF SS--SHAPES MODULE !!!! \\
function line takes real x, real y, real tx, real ty, unit c, string fx, integer n, real dmg, real dmgaoe, boolean armor returns nothing
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
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))
call DamagePointEnemies(c, px, py, dmgaoe, dmg, armor)
endloop
endfunction
function circle takes real x, real y, real radius, unit c, string fx, integer n, real dmg, real dmgaoe, boolean armor returns nothing
local integer i = 0
local real angle
local real px
local real py
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))
call DamagePointEnemies(c, px, py, dmgaoe, dmg, armor)
endloop
endfunction
I don't really know myself...
(It's not done, at all, yet.)