luorax
Invasion in Duskwood
- Reaction score
- 67
There're many ways to do it, this one is simple and I guess works:
A little off-topic here: does anyone know how can I edit my signature?
JASS:
scope NoAutoCast initializer NACInit
globals
//--- Locals ---
private unit nacUnit
private player nacPlayer
private timer nacTimer = CreateTimer()
private integer nacAbil
//--- Spell Stack ---
private string array orderStack
private integer array abilityStack
private integer stackLevel = 0
//--- Type Stack ---
private integer array typeStack
private integer typeStackLevel = 0
endglobals
private function Check takes string s returns boolean
local integer i = 0
loop
exitwhen i >= stackLevel
if s == orderStack<i> then
return true
endif
set i = i + 1
endloop
return false
endfunction
private function TypeCheck takes integer id returns boolean
local integer i = 0
loop
exitwhen i >= typeStackLevel
if id == typeStack<i> then
return true
endif
set i = i + 1
endloop
return false
endfunction
private function GetAbilityByOrder takes string s, unit u returns integer
local integer i = 0
loop
exitwhen i >= stackLevel
if s == orderStack<i> and GetUnitAbilityLevel(u, abilityStack<i>) > 0 then
return abilityStack<i>
endif
set i = i + 1
endloop
return 0
endfunction
private function AddToStack takes string s, integer id returns nothing
set orderStack[stackLevel] = s
set abilityStack[stackLevel] = id
set stackLevel = stackLevel + 1
endfunction
private function AddTypeToStack takes integer id returns nothing
set typeStack[typeStackLevel] = id
set typeStackLevel = typeStackLevel + 1
endfunction
private function CallBack takes nothing returns nothing
call SetPlayerAbilityAvailable(nacPlayer, nacAbil, true)
endfunction
private function Conditions takes nothing returns boolean
local string s = ""
if TypeCheck(GetUnitTypeId(GetTriggerUnit())) then
set nacUnit = GetTriggerUnit()
set nacPlayer = GetOwningPlayer(nacUnit)
set s = OrderId2String(GetIssuedOrderId())
if Check(s) then
set nacAbil = GetAbilityByOrder(s, nacUnit)
call SetPlayerAbilityAvailable(nacPlayer, nacAbil, false)
call TimerStart(nacTimer, 0.00, false, function CallBack)
call SimError(nacPlayer, "This spell isn039;t auto-cast!")
endif
endif
return false
endfunction
private function NACInit takes nothing returns nothing
local trigger t = CreateTrigger()
local integer index = 0
loop
call TriggerRegisterPlayerUnitEvent(t, Player(index), EVENT_PLAYER_UNIT_ISSUED_ORDER, null)
set index = index + 1
exitwhen index == bj_MAX_PLAYER_SLOTS
endloop
call TriggerAddCondition(t, Condition(function Conditions))
//Adding spells
call AddToStack("poisonarrows", 039;A00C039;)
call AddToStack("coldarrows", 039;A00D039;)
//Adding unit types
call AddTypeToStack(mDruid)
call AddTypeToStack(mRogue)
set t = null
endfunction
endscope
</i></i></i></i></i>
A little off-topic here: does anyone know how can I edit my signature?