library Cooldown initializer Init requires PUI, ABC
globals
constant integer MAX_ABILITY = 4
integer array DisabledAbilities
private constant integer MaxAbilityPlusOne = MAX_ABILITY + 1
private player PLAYER
endglobals
struct Slot extends array
private static integer array Data
static method operator []= takes integer id, integer value returns nothing
set thistype.Data[id-(id/8191)*8191] = value
endmethod
static method operator[] takes integer id returns integer
return thistype.Data[id-(id/8191)*8191]
endmethod
endstruct
struct Cooldown extends array
private static hashtable ht = InitHashtable()
static method operator [] takes integer id returns thistype
return id
endmethod
method operator [] takes integer level returns real
return LoadReal(thistype.ht,this,level)
endmethod
method operator []= takes integer level, real value returns nothing
call SaveReal(thistype.ht,this,level,value)
endmethod
endstruct
struct HeroAbilities extends array
private static hashtable ht = InitHashtable()
static method operator [] takes integer pos returns thistype
return pos
endmethod
method operator [] takes integer pos returns integer
return LoadInteger(thistype.ht,this,pos)
endmethod
method operator []= takes integer pos, integer value returns nothing
call SaveInteger(thistype.ht,this,pos,value)
endmethod
endstruct
public struct Data
unit hero
timer array t [MaxAbilityPlusOne]
boolean array ready [MaxAbilityPlusOne]
integer array uses [MaxAbilityPlusOne]
static method expire takes nothing returns nothing
call PauseTimer(GetExpiredTimer())
endmethod
method reset takes integer pos returns nothing
set .ready[pos] = true
call PauseTimer(.t[pos])
call TimerStart(.t[pos],0.,false,function thistype.expire)
set PLAYER = GetOwningPlayer(.hero)
call SetPlayerAbilityAvailable(PLAYER,DisabledAbilities[pos],false)
call SetPlayerAbilityAvailable(PLAYER,HeroAbilities[GetUnitTypeId(.hero)][pos],true)
call UnitResetCooldown(.hero)
endmethod
method resetall takes nothing returns nothing
local integer i = 1
loop
call .reset(i)
exitwhen i == MAX_ABILITY
set i = i + 1
endloop
endmethod
static method removeCooldown takes nothing returns nothing
call thistype(GetTimerStructA(GetExpiredTimer())).reset(GetTimerStructB(GetExpiredTimer()))
endmethod
method add takes integer id returns nothing
local integer abil_id = id
local integer pos = Slot[abil_id]
local integer lv = GetUnitAbilityLevel(.hero,abil_id)
if .t[pos] == null then
set .t[pos] = CreateTimer()
call SetTimerStructA(.t[pos],this)
call SetTimerStructB(.t[pos],pos)
endif
set .ready[pos] = false
set PLAYER = GetOwningPlayer(.hero)
call SetPlayerAbilityAvailable(PLAYER,abil_id,false)
call SetPlayerAbilityAvailable(PLAYER,DisabledAbilities[pos],true)
call TimerStart(.t[pos],Cooldown[abil_id][lv],false,function thistype.removeCooldown)
set .uses[pos] = .uses[pos] + 1
endmethod
method isReady takes integer abil_id returns boolean
if TimerGetRemaining(.t[Slot[abil_id]]) <= 0 then
return true
endif
return .ready[Slot[abil_id]]
endmethod
method pause takes integer abil_id returns nothing
call PauseTimer(.t[Slot[abil_id]])
endmethod
method remaining takes integer abil_id returns real
if .ready[Slot[abil_id]]==true then
return 0
endif
return TimerGetRemaining(.t[Slot[abil_id]])
endmethod
method multiply takes integer abil_id, real multiplier returns nothing
local integer pos = Slot[abil_id]
local integer lv = GetUnitAbilityLevel(.hero,abil_id)
if .remaining(abil_id)*multiplier >= 0 then
call PauseTimer(.t[Slot[abil_id]])
call TimerStart(.t[pos],.remaining(abil_id)*multiplier,false,function thistype.removeCooldown)
endif
endmethod
method multiplyall takes real multiplier returns nothing
local integer i = 1
local integer id = 0
loop
set id = HeroAbilities[GetUnitTypeId(.hero)]<i>
call .multiply(id,multiplier)
exitwhen i == MAX_ABILITY
set i = i + 1
endloop
endmethod
method increase takes integer abil_id, real inc returns nothing
local integer pos = Slot[abil_id]
local integer lv = GetUnitAbilityLevel(.hero,abil_id)
call PauseTimer(.t[Slot[abil_id]])
call TimerStart(.t[pos],.remaining(abil_id)+inc,false,function thistype.removeCooldown)
endmethod
method increaseall takes real inc returns nothing
local integer i = 1
local integer id = 0
loop
set id = HeroAbilities[GetUnitTypeId(.hero)]<i>
call .increase(id,inc)
exitwhen i == MAX_ABILITY
set i = i + 1
endloop
endmethod
method restart takes integer abil_id returns nothing
local integer i = Slot[abil_id]
call .reset(i)
call .add(abil_id)
endmethod
static method create takes unit hero returns thistype
local thistype this = thistype.allocate()
local integer i = 0
loop
set .uses<i> = 0
exitwhen i == MAX_ABILITY
set i = i + 1
endloop
set .hero = hero
return this
endmethod
//! runtextmacro PUI()
endstruct
private function Cond takes nothing returns boolean
if IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO) == true then
if Data[GetTriggerUnit()] == 0 then
set Data[GetTriggerUnit()] = Data.create(GetTriggerUnit())
endif
call Data(Data[GetTriggerUnit()]).add(GetSpellAbilityId())
endif
//call BJDebugMsg("Casting Player: "+GetPlayerName(GetTriggerPlayer()))
//call BJDebugMsg("Index of casting unit: "+I2S(GetUnitIndex(GetTriggerUnit())))
//call BJDebugMsg("Instance of Data: "+I2S(Data[GetTriggerUnit()]))
//call BJDebugMsg("Initial cooldown: "+R2S(Cooldown[GetSpellAbilityId()][GetUnitAbilityLevel(GetTriggerUnit(),GetSpellAbilityId())]))
//call BJDebugMsg("Timer's value: "+R2S(Data(GetTriggerUnit()).remaining(GetSpellAbilityId())))
return false
endfunction
function Init_Actions takes nothing returns nothing
local integer id
local integer i = 1
if IsUnitType(GetEnumUnit(), UNIT_TYPE_HERO) == true then
set Cooldown_Data[GetEnumUnit()] = Cooldown_Data.create(GetEnumUnit())
if GetUnitAbilityLevel(GetEnumUnit(),DisabledAbilities[1]) == 0 then
loop
call UnitAddAbility(GetEnumUnit(),DisabledAbilities<i>)
call SetPlayerAbilityAvailable(GetOwningPlayer(GetEnumUnit()),DisabledAbilities<i>,false)
exitwhen i == 4
set i = i + 1
endloop
endif
endif
endfunction
function ReturnTrue takes nothing returns boolean
return true
endfunction
function DataInit takes nothing returns nothing
local group g = CreateGroup()
call GroupEnumUnitsInRect(g,bj_mapInitialPlayableArea,Condition(function ReturnTrue))
call ForGroup( g, function Init_Actions )
call DestroyGroup(g)
set g = null
endfunction
private function Init takes nothing returns nothing
local trigger trig = CreateTrigger()
local trigger t= CreateTrigger( )
call TriggerRegisterTimerEvent( t, 0.01,false )
call TriggerAddAction( t, function DataInit )
call TriggerRegisterAnyUnitEventBJ(trig,EVENT_PLAYER_UNIT_SPELL_ENDCAST)
call TriggerAddCondition(trig,Condition(function Cond))
set DisabledAbilities[1] = 039;A000039;
set DisabledAbilities[2] = 039;A001039;
set DisabledAbilities[3] = 039;A002039;
set DisabledAbilities[4] = 039;A003039;
set t = null
set trig = null
endfunction
endlibrary</i></i></i></i></i>
library InitCD initializer InitTrig_Settings requires Cooldown //===========================================================================
private function InitTrig_Settings takes nothing returns nothing
local integer id
//Archmage skills
set id = 039;AHbz039;
set Slot[id] = 1
set Cooldown[id][1] = 6.
set Cooldown[id][2] = 6.
set Cooldown[id][3] = 6.
set id = 039;AHwe039;
set Slot[id] = 2
set Cooldown[id][1] = 6.
set Cooldown[id][2] = 6.
set Cooldown[id][3] = 6.
set HeroAbilities[039;Hamg039;][1] = 039;AHbz039;
set HeroAbilities[039;Hamg039;][2] = 039;AHwe039;
//Mountain King abilities
set id = 039;AHtb039;
set Slot[id] = 1
set Cooldown[id][1] = 6.
set Cooldown[id][2] = 6.
set Cooldown[id][3] = 6.
set id = 039;AHtc039;
set Slot[id] = 2
set Cooldown[id][1] = 6.
set Cooldown[id][2] = 6.
set Cooldown[id][3] = 6.
set id = 039;AHbh039;
set Slot[id] = 3
set Cooldown[id][1] = 0.
set Cooldown[id][2] = 0.
set Cooldown[id][3] = 0.
set id = 039;AHav039;
set Slot[id] = 4
set Cooldown[id][1] = 6.
set Cooldown[id][2] = 6.
set Cooldown[id][3] = 6.
set HeroAbilities[039;Hmkg039;][1] = 039;AHtb039;
set HeroAbilities[039;Hmkg039;][2] = 039;AHtc039;
set HeroAbilities[039;Hmkg039;][3] = 039;AHbh039;
set HeroAbilities[039;Hmkg039;][4] = 039;AHav039;
//Warden skills
set id = 039;AEfk039;
set Slot[id] = 1
set Cooldown[id][1] = 15.
set Cooldown[id][2] = 13.
set Cooldown[id][3] = 11.
set id = 039;AEbl039;
set Slot[id] = 2
set Cooldown[id][1] = 10.
set Cooldown[id][2] = 10.
set Cooldown[id][3] = 1.
set id = 039;AEsh039;
set Slot[id] = 3
set Cooldown[id][1] = 30.
set Cooldown[id][2] = 26.
set Cooldown[id][3] = 22.
set id = 039;AEsv039;
set Slot[id] = 4
set Cooldown[id][1] = 60.
set HeroAbilities[039;E000039;][1] = 039;AEfk039;
set HeroAbilities[039;E000039;][2] = 039;AEbl039;
set HeroAbilities[039;E000039;][3] = 039;AEsh039;
set HeroAbilities[039;E000039;][4] = 039;AEsv039;
endfunction
endlibrary
set Item_Mod[039;I000039;][0] = -1
set Item_Type[039;I000039;][0] = 0.0
struct Item_Type extends array
private static hashtable ht = InitHashtable()
static method operator [] takes integer id returns thistype
return id
endmethod
method operator [] takes integer level returns real
return LoadReal(thistype.ht,this,level)
endmethod
method operator []= takes integer level, real value returns nothing
call SaveReal(thistype.ht,this,level,value)
endmethod
endstruct
struct Item_Mod extends array
private static hashtable ht = InitHashtable()
static method operator [] takes integer id returns thistype
return id
endmethod
method operator [] takes integer level returns real
return LoadReal(thistype.ht,this,level)
endmethod
method operator []= takes integer level, real value returns nothing
call SaveReal(thistype.ht,this,level,value)
endmethod
endstruct