Вроде все таймеры и юнитов занулил, а течет на 4 за применение, может кто помочь разобраться в чем проблема?
function Trig_Suffer_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'A014' ) ) then
return false
endif
return true
endfunction
if ( not ( GetSpellAbilityId() == 'A014' ) ) then
return false
endif
return true
endfunction
function Suffer_Timer takes nothing returns nothing
local unit Targ = LoadUnitHandle(udg_Hash_Table, GetHandleId(GetExpiredTimer()), StringHash("Targ"))
local integer hTarg = LoadInteger(udg_Hash_Table, GetHandleId(GetExpiredTimer()), StringHash("hTarg"))
local integer i = LoadInteger(udg_Hash_Table, hTarg, StringHash("SufferStacks"))
call SaveInteger(udg_Hash_Table, hTarg, StringHash("SufferStacks"),i - 1)
if i == 1 then
call UnitRemoveAbility(Targ, 'Z000')
call UnitRemoveAbility(Targ, 'B000')
else
call DecUnitAbilityLevel(Targ, 'Z000')
endif
set Targ = null
call FlushChildHashtable(udg_Hash_Table, GetHandleId(GetExpiredTimer()))
call DestroyTimer(GetExpiredTimer())
endfunction
local unit Targ = LoadUnitHandle(udg_Hash_Table, GetHandleId(GetExpiredTimer()), StringHash("Targ"))
local integer hTarg = LoadInteger(udg_Hash_Table, GetHandleId(GetExpiredTimer()), StringHash("hTarg"))
local integer i = LoadInteger(udg_Hash_Table, hTarg, StringHash("SufferStacks"))
call SaveInteger(udg_Hash_Table, hTarg, StringHash("SufferStacks"),i - 1)
if i == 1 then
call UnitRemoveAbility(Targ, 'Z000')
call UnitRemoveAbility(Targ, 'B000')
else
call DecUnitAbilityLevel(Targ, 'Z000')
endif
set Targ = null
call FlushChildHashtable(udg_Hash_Table, GetHandleId(GetExpiredTimer()))
call DestroyTimer(GetExpiredTimer())
endfunction
function Trig_Suffer_Actions takes nothing returns nothing
local timer t = CreateTimer()
local integer ht = GetHandleId(t)
local unit Targ = GetSpellTargetUnit()
local integer hTarg = GetHandleId(Targ)
local unit Cast = GetSpellAbilityUnit()
local integer hCast = GetHandleId(Cast)
local integer i
local real Tick = PriestConst_Suffer_ScaleJ
local integer QAbilA = LoadInteger(udg_Hash_Table, hCast, StringHash("QAbilA"))
local integer QAbilB = LoadInteger(udg_Hash_Table, hCast, StringHash("QAbilB"))
local integer QAbilC = LoadInteger(udg_Hash_Table, hCast, StringHash("QAbilC"))
Damage = (Scale A + Scale B * QAbilA ) * INT per second
local real Dmg = (PriestConst_Suffer_ScaleA + PriestConst_Suffer_ScaleB * I2R(QAbilA)) * I2R(GetHeroInt(Cast, true)) * Tick
Rez Reduction = ScaleC + ScaleD * QAbilB * MAS
local real RezDebuff = PriestConst_Suffer_ScaleC + PriestConst_Suffer_ScaleD * I2R(QAbilB) * I2R(GetHeroAgi(Cast, true))
Heal = (Scale E + Scale F* QAbilA ) * INT per second
local real Heal = (PriestConst_Suffer_ScaleE + PriestConst_Suffer_ScaleF * I2R(QAbilA)) * I2R(GetHeroInt(Cast, true)) * Tick
DmgBuff = ScaleG
local real DmgBuff = PriestConst_Suffer_ScaleG
Duration = ScaleH + ScaleI * QAbilC
local real Dur = PriestConst_Suffer_ScaleH + I2R(QAbilC) * PriestConst_Suffer_ScaleI
if IsPlayerAlly(GetOwningPlayer(Targ), GetOwningPlayer(Cast)) == false then
call MagDoT (Targ, Cast, Dmg, Tick, Dur)
else
call HoT (Targ, Cast, Heal,Tick, Dur)
call SpellChangeStats (Targ, "Dmg%", DmgBuff, Dur)
endif
call SpellChangeStats (Targ, "Rez", -RezDebuff, Dur)
call SaveUnitHandle(udg_Hash_Table, ht, StringHash("Targ"),Targ)
call SaveInteger(udg_Hash_Table, ht, StringHash("hTarg"),hTarg)
set i = LoadInteger(udg_Hash_Table, hTarg, StringHash("SufferStacks"))
call SaveInteger(udg_Hash_Table, hTarg, StringHash("SufferStacks"),i + 1)
if i == 0 then
UnitAddAbility(Targ, 'Z000')
else
IncUnitAbilityLevel(Targ, 'Z000')
endif
call TimerStart(t, Dur, false, function Suffer_Timer)
set Targ = null
set Cast = null
set t = null
endfunction
local timer t = CreateTimer()
local integer ht = GetHandleId(t)
local unit Targ = GetSpellTargetUnit()
local integer hTarg = GetHandleId(Targ)
local unit Cast = GetSpellAbilityUnit()
local integer hCast = GetHandleId(Cast)
local integer i
local real Tick = PriestConst_Suffer_ScaleJ
local integer QAbilA = LoadInteger(udg_Hash_Table, hCast, StringHash("QAbilA"))
local integer QAbilB = LoadInteger(udg_Hash_Table, hCast, StringHash("QAbilB"))
local integer QAbilC = LoadInteger(udg_Hash_Table, hCast, StringHash("QAbilC"))
Damage = (Scale A + Scale B * QAbilA ) * INT per second
local real Dmg = (PriestConst_Suffer_ScaleA + PriestConst_Suffer_ScaleB * I2R(QAbilA)) * I2R(GetHeroInt(Cast, true)) * Tick
Rez Reduction = ScaleC + ScaleD * QAbilB * MAS
local real RezDebuff = PriestConst_Suffer_ScaleC + PriestConst_Suffer_ScaleD * I2R(QAbilB) * I2R(GetHeroAgi(Cast, true))
Heal = (Scale E + Scale F* QAbilA ) * INT per second
local real Heal = (PriestConst_Suffer_ScaleE + PriestConst_Suffer_ScaleF * I2R(QAbilA)) * I2R(GetHeroInt(Cast, true)) * Tick
DmgBuff = ScaleG
local real DmgBuff = PriestConst_Suffer_ScaleG
Duration = ScaleH + ScaleI * QAbilC
local real Dur = PriestConst_Suffer_ScaleH + I2R(QAbilC) * PriestConst_Suffer_ScaleI
if IsPlayerAlly(GetOwningPlayer(Targ), GetOwningPlayer(Cast)) == false then
call MagDoT (Targ, Cast, Dmg, Tick, Dur)
else
call HoT (Targ, Cast, Heal,Tick, Dur)
call SpellChangeStats (Targ, "Dmg%", DmgBuff, Dur)
endif
call SpellChangeStats (Targ, "Rez", -RezDebuff, Dur)
call SaveUnitHandle(udg_Hash_Table, ht, StringHash("Targ"),Targ)
call SaveInteger(udg_Hash_Table, ht, StringHash("hTarg"),hTarg)
set i = LoadInteger(udg_Hash_Table, hTarg, StringHash("SufferStacks"))
call SaveInteger(udg_Hash_Table, hTarg, StringHash("SufferStacks"),i + 1)
if i == 0 then
UnitAddAbility(Targ, 'Z000')
else
IncUnitAbilityLevel(Targ, 'Z000')
endif
call TimerStart(t, Dur, false, function Suffer_Timer)
set Targ = null
set Cast = null
set t = null
endfunction
===========================================================================
function InitTrig_Suffer takes nothing returns nothing
set gg_trg_Suffer = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Suffer, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Suffer, Condition( function Trig_Suffer_Conditions ) )
call TriggerAddAction( gg_trg_Suffer, function Trig_Suffer_Actions )
endfunction
function InitTrig_Suffer takes nothing returns nothing
set gg_trg_Suffer = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Suffer, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Suffer, Condition( function Trig_Suffer_Conditions ) )
call TriggerAddAction( gg_trg_Suffer, function Trig_Suffer_Actions )
endfunction
function MagDoT_Timer takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer ht = GetHandleId(t)
local unit Targ = LoadUnitHandle(udg_Hash_Table, ht, StringHash("Targ"))
local unit Cast = LoadUnitHandle(udg_Hash_Table, ht, StringHash("Cast"))
local real Dmg = LoadReal (udg_Hash_Table, ht, StringHash("Dmg"))
local real Time = LoadReal (udg_Hash_Table, ht, StringHash("Time"))
local real Tick = LoadReal (udg_Hash_Table, ht, StringHash("Tick"))
local real Dur = LoadReal (udg_Hash_Table, ht, StringHash("Dur"))
if Time < Dur then
call SpellMagDmg (Dmg, Targ, Cast)
call SaveReal(udg_Hash_Table, ht, StringHash("Time"), Time + Tick)
local integer ht = GetHandleId(t)
local unit Targ = LoadUnitHandle(udg_Hash_Table, ht, StringHash("Targ"))
local unit Cast = LoadUnitHandle(udg_Hash_Table, ht, StringHash("Cast"))
local real Dmg = LoadReal (udg_Hash_Table, ht, StringHash("Dmg"))
local real Time = LoadReal (udg_Hash_Table, ht, StringHash("Time"))
local real Tick = LoadReal (udg_Hash_Table, ht, StringHash("Tick"))
local real Dur = LoadReal (udg_Hash_Table, ht, StringHash("Dur"))
if Time < Dur then
call SpellMagDmg (Dmg, Targ, Cast)
call SaveReal(udg_Hash_Table, ht, StringHash("Time"), Time + Tick)
else
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash_Table, ht)
endif
set t = null
set Targ = null
set Cast = null
endfunction
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash_Table, ht)
endif
set t = null
set Targ = null
set Cast = null
endfunction
function MagDoT takes unit Targ, unit Cast, real Dmg, real Tick, real Dur returns nothing
local timer t = CreateTimer()
local integer ht = GetHandleId(t)
call SaveUnitHandle(udg_Hash_Table, ht, StringHash("Targ"), Targ)
call SaveUnitHandle(udg_Hash_Table, ht, StringHash("Cast"), Cast)
call SaveReal (udg_Hash_Table, ht, StringHash("Dmg"), Dmg)
call SaveReal (udg_Hash_Table, ht, StringHash("Time"), 0)
call SaveReal (udg_Hash_Table, ht, StringHash("Tick"), Tick)
call SaveReal (udg_Hash_Table, ht, StringHash("Dur"), Dur)
call TimerStart (t, Tick, true, function MagDoT_Timer)
set t = null
set Targ = null
set Cast = null
endfunction
local integer ht = GetHandleId(t)
call SaveUnitHandle(udg_Hash_Table, ht, StringHash("Targ"), Targ)
call SaveUnitHandle(udg_Hash_Table, ht, StringHash("Cast"), Cast)
call SaveReal (udg_Hash_Table, ht, StringHash("Dmg"), Dmg)
call SaveReal (udg_Hash_Table, ht, StringHash("Time"), 0)
call SaveReal (udg_Hash_Table, ht, StringHash("Tick"), Tick)
call SaveReal (udg_Hash_Table, ht, StringHash("Dur"), Dur)
call TimerStart (t, Tick, true, function MagDoT_Timer)
set t = null
set Targ = null
set Cast = null
endfunction
function HoT_Timer takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer ht = GetHandleId(t)
local unit Targ = LoadUnitHandle(udg_Hash_Table, ht, StringHash("Targ"))
local unit Cast = LoadUnitHandle(udg_Hash_Table, ht, StringHash("Cast"))
local real Heal = LoadReal (udg_Hash_Table, ht, StringHash("Heal"))
local real Time = LoadReal (udg_Hash_Table, ht, StringHash("Time"))
local real Tick = LoadReal (udg_Hash_Table, ht, StringHash("Tick"))
local real Dur = LoadReal (udg_Hash_Table, ht, StringHash("Dur"))
if Time < Dur then
call SpellHeal (Heal, Targ, Cast)
call SaveReal(udg_Hash_Table, ht, StringHash("Time"), Time + Tick)
local integer ht = GetHandleId(t)
local unit Targ = LoadUnitHandle(udg_Hash_Table, ht, StringHash("Targ"))
local unit Cast = LoadUnitHandle(udg_Hash_Table, ht, StringHash("Cast"))
local real Heal = LoadReal (udg_Hash_Table, ht, StringHash("Heal"))
local real Time = LoadReal (udg_Hash_Table, ht, StringHash("Time"))
local real Tick = LoadReal (udg_Hash_Table, ht, StringHash("Tick"))
local real Dur = LoadReal (udg_Hash_Table, ht, StringHash("Dur"))
if Time < Dur then
call SpellHeal (Heal, Targ, Cast)
call SaveReal(udg_Hash_Table, ht, StringHash("Time"), Time + Tick)
else
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash_Table, ht)
endif
set t = null
set Targ = null
set Cast = null
endfunction
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash_Table, ht)
endif
set t = null
set Targ = null
set Cast = null
endfunction
function HoT takes unit Targ, unit Cast, real Heal, real Tick, real Dur returns nothing
local timer t = CreateTimer()
local integer ht = GetHandleId(t)
call SaveUnitHandle(udg_Hash_Table, ht, StringHash("Targ"), Targ)
call SaveUnitHandle(udg_Hash_Table, ht, StringHash("Cast"), Cast)
call SaveReal (udg_Hash_Table, ht, StringHash("Heal"), Heal)
call SaveReal (udg_Hash_Table, ht, StringHash("Time"), 0)
call SaveReal (udg_Hash_Table, ht, StringHash("Tick"), Tick)
call SaveReal (udg_Hash_Table, ht, StringHash("Dur"), Dur)
call TimerStart (t, Tick, true, function HoT_Timer)
set t = null
set Targ = null
set Cast = null
endfunction
local integer ht = GetHandleId(t)
call SaveUnitHandle(udg_Hash_Table, ht, StringHash("Targ"), Targ)
call SaveUnitHandle(udg_Hash_Table, ht, StringHash("Cast"), Cast)
call SaveReal (udg_Hash_Table, ht, StringHash("Heal"), Heal)
call SaveReal (udg_Hash_Table, ht, StringHash("Time"), 0)
call SaveReal (udg_Hash_Table, ht, StringHash("Tick"), Tick)
call SaveReal (udg_Hash_Table, ht, StringHash("Dur"), Dur)
call TimerStart (t, Tick, true, function HoT_Timer)
set t = null
set Targ = null
set Cast = null
endfunction
function CreateFloatingTextTagAboveUnit takes string Text, real Size, unit TargetUnit, real LifeTime returns nothing
local texttag tt = CreateTextTag()
SetTextTagText(tt, Text, Size*.0023)
SetTextTagPosUnit(tt, TargetUnit, 20.)
SetTextTagVelocity(tt, .05325*Cos(1.570795), .05325*Sin(1.570795))
SetTextTagPermanent(tt, false)
SetTextTagLifespan(tt, LifeTime)
SetTextTagFadepoint(tt, 0.)
set tt = null
set TargetUnit = null
endfunction
local texttag tt = CreateTextTag()
SetTextTagText(tt, Text, Size*.0023)
SetTextTagPosUnit(tt, TargetUnit, 20.)
SetTextTagVelocity(tt, .05325*Cos(1.570795), .05325*Sin(1.570795))
SetTextTagPermanent(tt, false)
SetTextTagLifespan(tt, LifeTime)
SetTextTagFadepoint(tt, 0.)
set tt = null
set TargetUnit = null
endfunction
function SpellMagDmg takes real Dmg, unit Targ, unit Cast returns nothing
local integer hTarg = GetHandleId(Targ)
local integer hCast = GetHandleId(Cast)
local real Rez = LoadReal(udg_Hash_Table, hTarg, StringHash("Rez%"))
local real Dod = LoadReal(udg_Hash_Table, hTarg, StringHash("Dod%"))
local real SCC = LoadReal(udg_Hash_Table, hCast, StringHash("SCC%"))
local real SCD = LoadReal(udg_Hash_Table, hCast, StringHash("SCD"))
set Dmg = Dmg * Rez
if GetRandomReal(0, 100) <= 100*Dod then
call CreateFloatingTextTagAboveUnit("|c00FFFFFF"+"Dodge"+"|r", 12., Targ, 1.5)
else
if GetRandomReal(0, 100) <= 100*SCC then
set Dmg = Dmg * SCD
call CreateFloatingTextTagAboveUnit("|c000000FF"+I2S(R2I(Dmg))+"!|r", 12., Targ, 1.5)
else
call CreateFloatingTextTagAboveUnit("|c800000FF"+I2S(R2I(Dmg))+"|r", 12., Targ, 1.5)
local integer hCast = GetHandleId(Cast)
local real Rez = LoadReal(udg_Hash_Table, hTarg, StringHash("Rez%"))
local real Dod = LoadReal(udg_Hash_Table, hTarg, StringHash("Dod%"))
local real SCC = LoadReal(udg_Hash_Table, hCast, StringHash("SCC%"))
local real SCD = LoadReal(udg_Hash_Table, hCast, StringHash("SCD"))
set Dmg = Dmg * Rez
if GetRandomReal(0, 100) <= 100*Dod then
call CreateFloatingTextTagAboveUnit("|c00FFFFFF"+"Dodge"+"|r", 12., Targ, 1.5)
else
if GetRandomReal(0, 100) <= 100*SCC then
set Dmg = Dmg * SCD
call CreateFloatingTextTagAboveUnit("|c000000FF"+I2S(R2I(Dmg))+"!|r", 12., Targ, 1.5)
else
call CreateFloatingTextTagAboveUnit("|c800000FF"+I2S(R2I(Dmg))+"|r", 12., Targ, 1.5)
endif
call UnitDamageTarget(Targ, Targ, Dmg, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNIVERSAL, WEAPON_TYPE_WHOKNOWS)
endif
set Targ = null
set Cast = null
endfunction
call UnitDamageTarget(Targ, Targ, Dmg, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNIVERSAL, WEAPON_TYPE_WHOKNOWS)
endif
set Targ = null
set Cast = null
endfunction
function SpellHeal takes real Heal, unit Targ, unit Cast returns nothing
local integer hTarg = GetHandleId(Targ)
local integer hCast = GetHandleId(Cast)
local real SCC = LoadReal(udg_Hash_Table, hCast, StringHash("SCC%"))
local real SCD = LoadReal(udg_Hash_Table, hCast, StringHash("SCD"))
if GetRandomReal(0, 100) <= 100*SCC then
set Heal = Heal * SCD
call CreateFloatingTextTagAboveUnit("|c2000FF00"+I2S(R2I(Heal))+"!|r", 12., Targ, 1.5)
else
call CreateFloatingTextTagAboveUnit("|c8000FF00"+I2S(R2I(Heal))+"|r", 12., Targ, 1.5)
endif
call SetUnitState(Targ, UNIT_STATE_LIFE, (GetUnitState(Targ, UNIT_STATE_LIFE) + Heal))
local integer hCast = GetHandleId(Cast)
local real SCC = LoadReal(udg_Hash_Table, hCast, StringHash("SCC%"))
local real SCD = LoadReal(udg_Hash_Table, hCast, StringHash("SCD"))
if GetRandomReal(0, 100) <= 100*SCC then
set Heal = Heal * SCD
call CreateFloatingTextTagAboveUnit("|c2000FF00"+I2S(R2I(Heal))+"!|r", 12., Targ, 1.5)
else
call CreateFloatingTextTagAboveUnit("|c8000FF00"+I2S(R2I(Heal))+"|r", 12., Targ, 1.5)
endif
call SetUnitState(Targ, UNIT_STATE_LIFE, (GetUnitState(Targ, UNIT_STATE_LIFE) + Heal))
set Targ = null
set Cast = null
endfunction
set Cast = null
endfunction
function SpellChangeStats_Timer takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer ht = GetHandleId(t)
local string stat = LoadStr(udg_Hash_Table, ht, StringHash("Stat"))
local real Val = LoadReal(udg_Hash_Table, ht, StringHash(stat))
local integer hTarg = LoadInteger(udg_Hash_Table, ht, StringHash("hTarg"))
call SaveReal(udg_Hash_Table, hTarg, StringHash(stat), LoadReal(udg_Hash_Table, hTarg, StringHash(stat)) - Val)
call DestroyTimer(t)
set t = null
call FlushChildHashtable(udg_Hash_Table, ht)
endfunction
local timer t = GetExpiredTimer()
local integer ht = GetHandleId(t)
local string stat = LoadStr(udg_Hash_Table, ht, StringHash("Stat"))
local real Val = LoadReal(udg_Hash_Table, ht, StringHash(stat))
local integer hTarg = LoadInteger(udg_Hash_Table, ht, StringHash("hTarg"))
call SaveReal(udg_Hash_Table, hTarg, StringHash(stat), LoadReal(udg_Hash_Table, hTarg, StringHash(stat)) - Val)
call DestroyTimer(t)
set t = null
call FlushChildHashtable(udg_Hash_Table, ht)
endfunction
function SpellChangeStats takes unit Targ, string stat, real Val, real time returns nothing
local timer t = CreateTimer()
local integer ht = GetHandleId(t)
local integer hTarg = GetHandleId(Targ)
call SaveInteger(udg_Hash_Table, ht, StringHash("hTarg"), hTarg)
call SaveStr(udg_Hash_Table, ht, StringHash("Stat"), stat)
call SaveReal(udg_Hash_Table, ht, StringHash(stat), Val)
call SaveReal(udg_Hash_Table, hTarg, StringHash(stat), LoadReal(udg_Hash_Table, hTarg, StringHash(stat)) + Val)
call TimerStart(t, time, false, function SpellChangeStats_Timer)
set t = null
set Targ = null
endfunction
local integer ht = GetHandleId(t)
local integer hTarg = GetHandleId(Targ)
call SaveInteger(udg_Hash_Table, ht, StringHash("hTarg"), hTarg)
call SaveStr(udg_Hash_Table, ht, StringHash("Stat"), stat)
call SaveReal(udg_Hash_Table, ht, StringHash(stat), Val)
call SaveReal(udg_Hash_Table, hTarg, StringHash(stat), LoadReal(udg_Hash_Table, hTarg, StringHash(stat)) + Val)
call TimerStart(t, time, false, function SpellChangeStats_Timer)
set t = null
set Targ = null
endfunction
Принятый ответ
Прошу прощения, перепроверил, не течет, занимает 4 хендла на время действия, потом чистит
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Ред. nvc123
за исключением того что это конверт из гуи разбавленный быдлокодом
юзай форматирование код и кат
ну и так то да, мозги вывихнешь за чтением
ssbbssc, игроки не утекают
их всего 16 в игре и новые не появляются