- Joined
- Apr 24, 2012
- Messages
- 5,111
JASS:
library DummyCaster/*1.0
*************************************************************************************
*
* Creates dummy casters for casting spells
*
* Spells must have 0 manacost. Cast Range and cooldown is not necessary.
* Supports Channeling spells as well as locking dummy channels to units.
* Channeling spells, however, cannot be cancelled forcefully.
* Channeling dummies are locked to their owning unit's position
*
*************************************************************************************
*
* */ uses/*
* */ MissileRecycler /* hiveworkshop.com/forums/jass-resources-412/system-missilerecycler-206086/
* */ RegisterPlayerUnitEvent /* hiveworkshop.com/forums/jass-resources-412/snippet-registerplayerunitevent-203338/
* */ Table/* hiveworkshop.com/forums/jass-resources-412/snippet-new-table-188084/
*
* Recommended
* OrderIds
*
*************************************************************************************
*
* API
*
* static method U2P takes integer abil, integer level, integer order, unit origin, real x, real y returns nothing
* - Creates a dummy unit on origin's position, targeting point (x, y)
* - If the dummy is channeling, it will be locked to its owning unit
*
* static method U2W takes integer abil, integer level, integer order, unit origin, widget target returns nothing
* - Creates a dummy unit on origin's position, targeting widgets
* - If the dummy is channeling ,it will be locked to its owning unit
*
* static method P2P takes integer abil, integer level, integer order, player p_owner, real x, real y, real tx, real ty returns nothing
* - Creates a dummy unit on point (x, y), targeting point (tx, ty)
*
* static method P2W takes integer abil, integer level, integer order, player p_owner, real x, real y, widget target returns nothing
* - Creates a dummy unit on point (x, y), targeting widget
*
* static method PImmediate takes integer abil, integer level, integer order, player p_owner, real x, real y, real facing returns nothing
* - Creates a dummy on point and issues immediate order
*
* static method UImmediate takes integer abil, integer level, integer order, unit origin returns nothing
* - Creates a dummy locked on unit origin, issued immediate order
*
**************************************************************************************
*
* Credits
* Bribe
* Magtheridon96
*
*************************************************************************************/
globals
private constant real TIMEOUT = 0.031250000
private Table tb
endglobals
//native UnitAlive takes unit id returns boolean
private module Init
private static method onInit takes nothing returns nothing
call init()
endmethod
endmodule
struct DummyCaster
private unit u
private unit owner
private boolean caster
private static constant timer t = CreateTimer()
private static thistype array n
private static thistype array p
private static method period takes nothing returns nothing
local thistype this = n[0]
loop
exitwhen this == 0
if UnitAlive(owner) then
call SetUnitX(u, GetUnitX(owner))
call SetUnitY(u, GetUnitY(owner))
endif
set this = n[this]
endloop
endmethod
private method insert takes nothing returns nothing
set n[this] = 0
set p[this] = p[0]
set n[p[0]] = this
set p[0] = this
if p[this] == 0 then
call TimerStart(t, TIMEOUT, true, function thistype.period)
endif
endmethod
private static method new takes real x, real y, real z, real facing, player owner, integer abil, integer level returns thistype
local thistype this = allocate()
set u = GetRecycledMissile(x, y, z, facing)
set tb[GetHandleId(u)] = this
call PauseUnit(u, false)
if abil > 0 then
call UnitAddAbility(u, abil)
endif
if level < 1 then
set level = 1
endif
call SetUnitAbilityLevel(u, abil, level)
if owner != null then
call SetUnitOwner(u, owner, false)
endif
set caster = true
return this
endmethod
static method U2P takes integer abil, integer level, integer order, unit origin, real x, real y returns nothing
local real ox
local real oy
local thistype this
if UnitAlive(origin) then
set ox = GetUnitX(origin)
set oy = GetUnitY(origin)
set this = new(ox, oy, GetUnitFlyHeight(origin), Atan2(y - oy, x - ox)*bj_RADTODEG, GetOwningPlayer(origin), abil, level)
call insert()
set owner = origin
call IssuePointOrderById(u, order, x, y)
endif
endmethod
static method U2W takes integer abil, integer level, integer order, unit origin, widget target returns nothing
local real ox
local real oy
local real tx
local real ty
local thistype this
if UnitAlive(origin) then
set ox = GetUnitX(origin)
set oy = GetUnitY(origin)
set this = new(ox, oy, GetUnitFlyHeight(origin), Atan2(GetWidgetY(target) - oy, GetWidgetX(target) - ox)*bj_RADTODEG, GetOwningPlayer(origin), abil, level)
call insert()
set owner = origin
call IssueTargetOrderById(u, order, target)
endif
endmethod
static method P2P takes integer abil, integer level, integer order, player p_owner, real x, real y, real tx, real ty returns nothing
call IssuePointOrderById(new(x, y, 0, Atan2(ty - y, tx - x)*bj_RADTODEG, p_owner, abil, level).u, order, tx, ty)
endmethod
static method P2W takes integer abil, integer level, integer order, player p_owner, real x, real y, widget target returns nothing
call IssueTargetOrderById(new(x, y, 0, Atan2(GetWidgetY(target) - y, GetWidgetX(target) - x)*bj_RADTODEG, p_owner, abil, level).u, order, target)
endmethod
static method PImmediate takes integer abil, integer level, integer order, player p_owner, real x, real y, real facing returns nothing
call IssueImmediateOrderById(new(x, y, 0, facing, p_owner, abil, level).u, order)
endmethod
static method UImmediate takes integer abil, integer level, integer order, unit origin returns nothing
local thistype this = new(GetUnitX(origin), GetUnitY(origin), GetUnitFlyHeight(origin), GetUnitFacing(origin), GetOwningPlayer(origin), abil, level)
call insert()
set owner = origin
call IssueImmediateOrderById(u, order)
endmethod
private static method onFinish takes nothing returns boolean
local unit dc = GetTriggerUnit()
local thistype this = tb[GetHandleId(dc)]
if caster then
set n[p[this]] = n[this]
set p[n[this]] = p[this]
if n[0] == 0 then
call PauseTimer(t)
endif
call UnitRemoveAbility(dc, GetSpellAbilityId())
call PauseUnit(dc, true)
call RecycleMissile(dc)
set caster = false
endif
return false
endmethod
private static method init takes nothing returns nothing
set tb = Table.create()
call RegisterPlayerUnitEvent(EVENT_PLAYER_UNIT_SPELL_ENDCAST, function thistype.onFinish)
endmethod
implement Init
endstruct
endlibrary
JASS:
struct Test extends array
private static method onCast takes nothing returns boolean
local integer id = GetSpellAbilityId()
local unit u = GetTriggerUnit()
local real i = 36
local real x = GetUnitX(u)
local real y = GetUnitY(u)
if id == 'oblz' then
call DummyCaster.U2P('bliz', 1, ORDER_blizzard, u, GetSpellTargetX(), GetSpellTargetY())
loop
exitwhen i > 360
call DummyCaster.P2P('wave', 1, ORDER_shockwave, Player(0), x, y, x + 500*Cos(i*bj_DEGTORAD), y + 500*Sin(i*bj_DEGTORAD))
set i = i + 36
endloop
elseif id == 'stun' then
call DummyCaster.UImmediate('trun', 1, ORDER_tranquility, u)
call DummyCaster.PImmediate('star', 1, ORDER_starfall, Player(0), x, y, 0)
endif
set u = null
return false
endmethod
private static method onInit takes nothing returns nothing
call RegisterPlayerUnitEvent(EVENT_PLAYER_UNIT_SPELL_EFFECT, function thistype.onCast)
call SetHeroLevel(gg_unit_Hamg_0001, 10, false)
endmethod
endstruct