Добавлен
Вроде все таймеры и юнитов занулил, а течет на 4 за применение, может кто помочь разобраться в чем проблема?
function Trig_Suffer_Conditions takes nothing returns boolean
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
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
===========================================================================
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)
else

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
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)
else

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
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
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)
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
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))
set Targ = null
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
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

Прошу прощения, перепроверил, не течет, занимает 4 хендла на время действия, потом чистит
`
ОЖИДАНИЕ РЕКЛАМЫ...
28
нифига не понятно
за исключением того что это конверт из гуи разбавленный быдлокодом
юзай форматирование код и кат
20
get owning player - игрок не утекает?
ну и так то да, мозги вывихнешь за чтением
13
Прошу прощения, перепроверил, не течет, занимает 4 хендла на время действия, потом чистит
Принятый ответ
28
а ещё лучше прочти статьи про алгоритмизацию ибо код бред
ssbbssc, игроки не утекают
их всего 16 в игре и новые не появляются
Чтобы оставить комментарий, пожалуйста, войдите на сайт.