[jass]library MSASModifier initializer Init
// By Marcos_M
// Agradecimientos a MuSe por librería Slow que sirvió de base

globals
// ID DEL DUMMY
private constant integer DUMMY_ID = 'h000'
// HABILIDADES IDs
private constant integer REDUCCION_MOVIMIENTO_ID = 'A008'
private constant integer AUMENTO_MOVIMIENTO_ID = 'A009'
private constant integer REDUCCION_ATAQUE_ID = 'A007'
private constant integer AUMENTO_ATAQUE_ID = 'A006'
//Estas habilidades solo sirven para mostrar el BUFF de AS
private constant integer BUFF_DUMMY_REDUCCION_AS_ID = 'A005'
private constant integer BUFF_DUMMY_AUMENTO_AS_ID = 'A004'
//BUFF IDs
private constant integer REDUCCION_MOVIMIENTO_BUFF_ID = 'B003'
private constant integer AUMENTO_MOVIMIENTO_BUFF_ID = 'B002'
private constant integer REDUCCION_ATAQUE_BUFF_ID = 'B000'
private constant integer AUMENTO_ATAQUE_BUFF_ID = 'B001'
////////////////////////////////////
private constant string SLOWORDER_ID = "slow"
private hashtable HTAS = InitHashtable()
private hashtable HTMS = InitHashtable()
private timer t1 = CreateTimer()
private timer t2 = CreateTimer()
private integer c = 0
private group GROUPAS = CreateGroup()
private group GROUPMS = CreateGroup()
private real PERIODIC = 0.05
private unit DUMMY
endglobals
private function ApplyAS takes unit u, integer slow returns nothing
if slow == 0 then
call UnitRemoveAbility(u, AUMENTO_ATAQUE_ID)
call UnitRemoveAbility(u, AUMENTO_ATAQUE_BUFF_ID)
call UnitRemoveAbility(u, BUFF_DUMMY_AUMENTO_AS_ID)
call UnitRemoveAbility(u, REDUCCION_ATAQUE_ID)
call UnitRemoveAbility(u, REDUCCION_ATAQUE_BUFF_ID)
call UnitRemoveAbility(u, BUFF_DUMMY_REDUCCION_AS_ID)
elseif slow > 0 then
call UnitRemoveAbility(u, AUMENTO_ATAQUE_ID)
call UnitRemoveAbility(u, AUMENTO_ATAQUE_BUFF_ID)
call UnitRemoveAbility(u, BUFF_DUMMY_AUMENTO_AS_ID)
if GetUnitAbilityLevel(u, BUFF_DUMMY_REDUCCION_AS_ID) > 0 then
call SetUnitAbilityLevel(u, REDUCCION_ATAQUE_ID, slow)
else
call UnitAddAbility(u, REDUCCION_ATAQUE_ID)
call UnitAddAbility(u, BUFF_DUMMY_REDUCCION_AS_ID)
call SetUnitAbilityLevel(u, REDUCCION_ATAQUE_ID, slow)
endif
else
call UnitRemoveAbility(u, REDUCCION_ATAQUE_ID)
call UnitRemoveAbility(u, REDUCCION_ATAQUE_BUFF_ID)
call UnitRemoveAbility(u, BUFF_DUMMY_REDUCCION_AS_ID)
if GetUnitAbilityLevel(u, BUFF_DUMMY_AUMENTO_AS_ID) > 0 then
call SetUnitAbilityLevel(u, AUMENTO_ATAQUE_ID, -slow)
else
call UnitAddAbility(u, AUMENTO_ATAQUE_ID)
call UnitAddAbility(u, BUFF_DUMMY_AUMENTO_AS_ID)
call SetUnitAbilityLevel(u, AUMENTO_MOVIMIENTO_ID, -slow)
endif
endif
endfunction
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
private function ApplyMS takes unit u, integer slow returns nothing
if slow == 0 then
call UnitRemoveAbility(u, AUMENTO_MOVIMIENTO_BUFF_ID)
call UnitRemoveAbility(u, REDUCCION_MOVIMIENTO_BUFF_ID)
elseif slow > 0 then
call UnitRemoveAbility(u, AUMENTO_MOVIMIENTO_BUFF_ID)
call UnitAddAbility(DUMMY, REDUCCION_MOVIMIENTO_ID)
call SetUnitAbilityLevel(DUMMY, REDUCCION_MOVIMIENTO_ID, slow)
else
call UnitRemoveAbility(u, REDUCCION_MOVIMIENTO_BUFF_ID)
call UnitAddAbility(DUMMY, AUMENTO_MOVIMIENTO_ID)
call SetUnitAbilityLevel(DUMMY, AUMENTO_MOVIMIENTO_ID, -slow)
endif
call IssueTargetOrder(DUMMY, SLOWORDER_ID, u)
call UnitRemoveAbility(DUMMY, AUMENTO_MOVIMIENTO_ID)
call UnitRemoveAbility(DUMMY, REDUCCION_MOVIMIENTO_ID)
endfunction
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
private function LoopAS takes nothing returns nothing
local unit u = GetEnumUnit()
local integer Id = GetHandleId(u)
local integer i = LoadInteger(HTAS, Id, StringHash("0"))
local integer Slow = LoadInteger(HTAS, Id, 0)
local real duration
local integer slow
local effect e
local integer n = LoadInteger(HTAS, Id, StringHash("0"))
local boolean B = true
local integer N = 0
loop
exitwhen i == 0
if LoadBoolean(HTAS, Id, StringHash(("Bool" + I2S(i)))) then
set duration = LoadReal(HTAS, Id, StringHash(("Dur" + I2S(i)))) - PERIODIC
call SaveReal(HTAS, Id, StringHash(("Dur" + I2S(i))), duration)
if duration <= 0.00 then
call SaveBoolean(HTAS, Id, StringHash(("Bool" + I2S(i))), false)
set slow = Slow - LoadInteger(HTAS, Id, StringHash(("Lenteo" + I2S(i))))
set e = LoadEffectHandle(HTAS, Id, StringHash(("Efecto" + I2S(i))))
call SaveInteger(HTAS, Id, 0, slow)
call RemoveSavedInteger(HTAS, Id, StringHash(("Buff" + I2S(i))))
call DestroyEffect(e)
call ApplyAS(u, slow)
loop
set B = LoadBoolean(HTAS,Id, StringHash(("Bool" + I2S(n))))
set n = n - 1
exitwhen n < 0
if not(B) then
set N = N + 1
endif
set B = true
endloop
if N == LoadInteger(HTAS, Id, StringHash("0")) then
call GroupRemoveUnit(GROUPAS, u)
call FlushChildHashtable(HTAS, Id)
if FirstOfGroup(GROUPAS) == null then
call PauseTimer(t1)
endif
endif
endif
endif
set i = i - 1
endloop
////////////////////////
////////////////////////
set e = null
set u = null
endfunction
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
private function LoopMS takes nothing returns nothing
local unit u = GetEnumUnit()
local integer Id = GetHandleId(u)
local integer i = LoadInteger(HTMS, Id, StringHash("0"))
local integer Slow = LoadInteger(HTMS, Id, 0)
local real duration
local integer buff1
local integer slow
local effect e
local integer n = LoadInteger(HTMS, Id, StringHash("0"))
local boolean B = true
local integer N = 0
loop
exitwhen i == 0
if LoadBoolean(HTMS, Id, StringHash(("Bool" + I2S(i)))) then
set duration = LoadReal(HTMS, Id, StringHash(("Dur" + I2S(i)))) - PERIODIC
call SaveReal(HTMS, Id, StringHash(("Dur" + I2S(i))), duration)
if duration <= 0.00 then
call SaveBoolean(HTMS, Id, StringHash(("Bool" + I2S(i))), false)
set slow = Slow - LoadInteger(HTMS, Id, StringHash(("Lenteo" + I2S(i))))
set e = LoadEffectHandle(HTMS, Id, StringHash(("Efecto" + I2S(i))))
call SaveInteger(HTMS, Id, 0, slow)
call RemoveSavedInteger(HTMS, Id, StringHash(("Buff" + I2S(i))))
call DestroyEffect(e)
call ApplyMS(u, slow)
loop
set B = LoadBoolean(HTMS,Id, StringHash(("Bool" + I2S(n))))
set n = n - 1
exitwhen n < 0
if not(B) then
set N = N + 1
endif
set B = true
endloop
if N == LoadInteger(HTMS, Id, StringHash("0")) then
call GroupRemoveUnit(GROUPMS, u)
call FlushChildHashtable(HTMS, Id)
if FirstOfGroup(GROUPMS) == null then
call PauseTimer(t2)
endif
endif
endif
endif
set i = i - 1
endloop
////////////////////////
////////////////////////
set e = null
set u = null
endfunction
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
private function TimerAS takes nothing returns nothing
call ForGroup(GROUPAS, function LoopAS)
endfunction
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
private function TimerMS takes nothing returns nothing
call ForGroup(GROUPMS, function LoopMS)
endfunction
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
function RemoveBuffAS takes unit u, integer buff1 returns nothing
local integer Id = GetHandleId(u)
local integer i = LoadInteger(HTAS, Id, StringHash("0"))
local integer Slow = LoadInteger(HTAS, Id, 0)
local effect e
local real duration
local integer slow
local integer n
local integer n1 = LoadInteger(HTAS, Id, StringHash("0"))
local integer N = 0
local boolean B = true
loop
exitwhen i == 0
set n = LoadInteger(HTAS, Id, StringHash(("Buff" + I2S(i))))
if n == buff1 then
call SaveBoolean(HTAS, Id, StringHash(("Bool" + I2S(i))), false)
set slow = Slow - LoadInteger(HTAS, Id, StringHash(("Lenteo" + I2S(i))))
set e = LoadEffectHandle(HTAS, Id, StringHash(("Efecto" + I2S(i))))
call SaveInteger(HTAS, Id, 0, slow)
call RemoveSavedInteger(HTAS, Id, StringHash(("Buff" + I2S(i))))
call DestroyEffect(e)
call ApplyAS(u, slow)
loop
set B = LoadBoolean(HTAS,Id, StringHash(("Bool" + I2S(n1))))
set n1 = n1 - 1
exitwhen n1 < 0
if not(B) then
set N = N + 1
endif
set B = true
endloop
if N == LoadInteger(HTAS, Id, StringHash("0")) then
call GroupRemoveUnit(GROUPAS, u)
call FlushChildHashtable(HTAS, Id)
if FirstOfGroup(GROUPAS) == null then
call PauseTimer(t1)
endif
endif
endif
set i = i - 1
endloop
/////////////////////
/////////////////////
set e = null
endfunction
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
function RemoveSlowAS takes unit u returns nothing
local integer Id = GetHandleId(u)
local integer i = LoadInteger(HTAS, Id, StringHash("0"))
local effect e
loop
exitwhen i == 0
set e = LoadEffectHandle(HTAS, Id, StringHash(("Efecto" + I2S(i))))
call RemoveSavedInteger(HTAS, Id, StringHash(("Buff" + I2S(i))))
call DestroyEffect(e)
set i = i - 1
endloop
call UnitRemoveAbility(u, REDUCCION_ATAQUE_ID)
call UnitRemoveAbility(u, BUFF_DUMMY_REDUCCION_AS_ID)
call UnitRemoveAbility(u, REDUCCION_ATAQUE_BUFF_ID)
call UnitRemoveAbility(u, AUMENTO_ATAQUE_ID)
call UnitRemoveAbility(u, BUFF_DUMMY_AUMENTO_AS_ID)
call UnitRemoveAbility(u, AUMENTO_ATAQUE_BUFF_ID)
call GroupRemoveUnit(GROUPAS, u)
call FlushChildHashtable(HTAS, Id)
if FirstOfGroup(GROUPAS) == null then
call PauseTimer(t1)
endif
/////////////////////
/////////////////////
set e = null
endfunction
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
function AddSlowAS takes unit u, real duration, integer slow, integer buff1, string attachpoint returns nothing
local integer Id = GetHandleId(u)
local integer NewSlow = LoadInteger(HTAS, Id, 0) + slow
local effect e = AddSpellEffectTargetById(buff1, EFFECT_TYPE_TARGET, u, attachpoint)
local integer i = LoadInteger(HTAS, Id, StringHash("0"))
local boolean B = false
local integer buff2
loop
set buff2 = LoadInteger(HTAS,Id, StringHash(("Buff" + I2S(i))))
set i = i - 1
exitwhen i < 0
if buff1 == buff2 then
set B = true
endif
endloop
if not(B) then
if FirstOfGroup(GROUPAS) == null then
call TimerStart(t1, PERIODIC, true, function TimerAS)
endif
call ApplyAS(u, NewSlow)
call SaveInteger(HTAS, Id, 0, NewSlow)
set i = LoadInteger(HTAS, Id, StringHash("0")) + 1
call SaveInteger(HTAS, Id, StringHash("0"), i)
call SaveReal(HTAS, Id, StringHash(("Dur" + I2S(i))), duration)
call SaveInteger(HTAS, Id, StringHash(("Buff" + I2S(i))), buff1)
call SaveEffectHandle(HTAS, Id, StringHash(("Efecto" + I2S(i))), e)
call SaveInteger(HTAS, Id, StringHash(("Lenteo" + I2S(i))), slow)
call SaveBoolean(HTAS, Id, StringHash(("Bool" + I2S(i))), true)
call GroupAddUnit(GROUPAS, u)
else
call DestroyEffect(e)
endif
///////////////////////////////////////////////////////
set e = null
endfunction
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
function AddBonusAS takes unit u, real duration, integer slow, integer buff1, string attachpoint returns nothing
call AddSlowAS(u, duration, -slow, buff1, attachpoint)
endfunction
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
function GetSlowAS takes unit u returns integer
return LoadInteger(HTAS, GetHandleId(u), 0)
endfunction
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
function GetBonusAS takes unit u returns integer
return -LoadInteger(HTAS, GetHandleId(u), 0)
endfunction
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
function RemoveBuffMS takes unit u, integer buff1 returns nothing
local integer Id = GetHandleId(u)
local integer i = LoadInteger(HTMS, Id, StringHash("0"))
local integer Slow = LoadInteger(HTMS, Id, 0)
local effect e
local real duration
local integer slow
local integer n
local integer n1 = LoadInteger(HTMS, Id, StringHash("0"))
local integer N = 0
local boolean B = true
loop
exitwhen i == 0
set n = LoadInteger(HTMS, Id, StringHash(("Buff" + I2S(i))))
if n == buff1 then
call SaveBoolean(HTMS, Id, StringHash(("Bool" + I2S(i))), false)
set slow = Slow - LoadInteger(HTMS, Id, StringHash(("Lenteo" + I2S(i))))
set e = LoadEffectHandle(HTMS, Id, StringHash(("Efecto" + I2S(i))))
call SaveInteger(HTMS, Id, 0, slow)
call RemoveSavedInteger(HTMS, Id, StringHash(("Buff" + I2S(i))))
call DestroyEffect(e)
call ApplyMS(u, slow)
loop
set B = LoadBoolean(HTMS,Id, StringHash(("Bool" + I2S(n1))))
set n1 = n1 - 1
exitwhen n1 < 0
if not(B) then
set N = N + 1
endif
set B = true
endloop
if N == LoadInteger(HTMS, Id, StringHash("0")) then
call GroupRemoveUnit(GROUPMS, u)
call FlushChildHashtable(HTMS, Id)
if FirstOfGroup(GROUPMS) == null then
call PauseTimer(t2)
endif
endif
endif
set i = i - 1
endloop
/////////////////////
/////////////////////
set e = null
endfunction
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
function RemoveSlowMS takes unit u returns nothing
local integer Id = GetHandleId(u)
local integer i = LoadInteger(HTMS, Id, StringHash("0"))
local effect e
loop
exitwhen i == 0
set e = LoadEffectHandle(HTMS, Id, StringHash(("Efecto" + I2S(i))))
call RemoveSavedInteger(HTMS, Id, StringHash(("Buff" + I2S(i))))
call DestroyEffect(e)
set i = i - 1
endloop
call UnitRemoveAbility(u, REDUCCION_MOVIMIENTO_ID)
call UnitRemoveAbility(u, REDUCCION_MOVIMIENTO_BUFF_ID)
call GroupRemoveUnit(GROUPMS, u)
call FlushChildHashtable(HTMS, Id)
if FirstOfGroup(GROUPMS) == null then
call PauseTimer(t2)
endif
/////////////////////
/////////////////////
set e = null
endfunction
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
function AddSlowMS takes unit u, real duration, integer slow, integer buff1, string attachpoint returns nothing
local integer Id = GetHandleId(u)
local integer NewSlow = LoadInteger(HTMS, Id, 0) + slow
local effect e = AddSpellEffectTargetById(buff1, EFFECT_TYPE_TARGET, u, attachpoint)
local integer i = LoadInteger(HTMS, Id, StringHash("0"))
local boolean B = false
local integer buff2
loop
set buff2 = LoadInteger(HTAS,Id, StringHash(("Buff" + I2S(i))))
set i = i - 1
exitwhen i < 0
if buff1 == buff2 then
set B = true
endif
endloop
if not(B) then
if FirstOfGroup(GROUPMS) == null then
call TimerStart(t2, PERIODIC, true, function TimerMS)
endif
call ApplyMS(u, NewSlow)
call SaveInteger(HTMS, Id, 0, NewSlow)
set i = LoadInteger(HTMS, Id, StringHash("0")) + 1
call SaveInteger(HTMS, Id, StringHash("0"), i)
call SaveReal(HTMS, Id, StringHash(("Dur" + I2S(i))), duration)
call SaveInteger(HTMS, Id, StringHash(("Buff" + I2S(i))), buff1)
call SaveEffectHandle(HTMS, Id, StringHash(("Efecto" + I2S(i))), e)
call SaveInteger(HTMS, Id, StringHash(("Lenteo" + I2S(i))), slow)
call SaveBoolean(HTMS, Id, StringHash(("Bool" + I2S(i))), true)
call GroupAddUnit(GROUPMS, u)
else
call DestroyEffect(e)
endif
///////////////////////////////////////////////////////
set e = null
endfunction
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
function AddBonusMS takes unit u, real duration, integer slow, integer buff1, string attachpoint returns nothing
call AddSlowMS(u, duration, -slow, buff1, attachpoint)
endfunction
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
function GetSlowMS takes unit u returns integer
return LoadInteger(HTMS, GetHandleId(u), 0)
endfunction
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
function GetBonusMS takes unit u returns integer
return -LoadInteger(HTMS, GetHandleId(u), 0)
endfunction
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
private function Init takes nothing returns nothing
set DUMMY = CreateUnit(Player(15), DUMMY_ID, 0,0,0)
call UnitAddAbility(DUMMY, REDUCCION_MOVIMIENTO_ID)
call UnitAddAbility(DUMMY, AUMENTO_MOVIMIENTO_ID)
call UnitAddAbility(DUMMY, AUMENTO_ATAQUE_ID)
call UnitAddAbility(DUMMY, REDUCCION_ATAQUE_ID)
call UnitRemoveAbility(DUMMY, REDUCCION_MOVIMIENTO_ID)
call UnitRemoveAbility(DUMMY, AUMENTO_MOVIMIENTO_ID)
call UnitRemoveAbility(DUMMY, AUMENTO_ATAQUE_ID)
call UnitRemoveAbility(DUMMY, REDUCCION_ATAQUE_ID)
endfunction
endlibrary[/jass]