Добавлен EviLInside
Тормозит когда выхожу из зоны от юнитов на которых уже действует "аура".
Смысл абилки: юнит "горит" при нахождении рядом с героем постоянно увеличивается урон по нарастающей с каждой последующей секундой пока юнит стоит рядом.
Смысл абилки: юнит "горит" при нахождении рядом с героем постоянно увеличивается урон по нарастающей с каждой последующей секундой пока юнит стоит рядом.
function Trig_PassiveDmg_Conditions takes nothing returns boolean
return GetLearnedSkill() == 'A00I'
endfunction
function DistanceBetweenUnits takes unit a,unit b returns real
return SquareRoot((GetUnitX(b)-GetUnitX(a))*(GetUnitX(b)-GetUnitX(a))+(GetUnitY(b)-GetUnitY(a))*(GetUnitY(b)-GetUnitY(a)))
endfunction
function PassiveDmg_m takes nothing returns nothing
local timer t=GetExpiredTimer()
local integer id = GetHandleId(t)
local unit caster=LoadUnitHandle(udg_hash,id,0)
local group g=LoadGroupHandle(udg_hash,id,1)
local real x=GetUnitX(caster)
local real y=GetUnitY(caster)
local group gn
local unit f
local real damage
if GetWidgetLife(caster)>0.405 then
set gn=CreateGroup()
call GroupEnumUnitsInRange(gn,x,y,350,null)
loop
set f=FirstOfGroup(gn)
exitwhen f==null
if IsUnitInGroup(f,g) == false and IsUnitEnemy(f, GetOwningPlayer(caster)) == true and GetWidgetLife(f)>0.405 and IsUnitType(f, UNIT_TYPE_STRUCTURE) == false then
call GroupAddUnit(g,f)
endif
call GroupRemoveUnit(gn,f)
endloop
call GroupAddGroup(g,gn)
loop
set f=FirstOfGroup(gn)
exitwhen f==null
if DistanceBetweenUnits(caster, f) <= 350.00 and GetWidgetLife(f)>0.405 then
set damage=LoadReal(udg_hash,GetHandleId(f),StringHash("PassiveDamage")+GetHandleId(caster))
if damage==0 then
call SaveReal(udg_hash,GetHandleId(f),StringHash("PassiveDamage")+GetHandleId(caster),GetUnitAbilityLevel(caster,'A00I')*4)
call UnitDamageTarget(caster,f,damage,true,false,ATTACK_TYPE_CHAOS,DAMAGE_TYPE_DIVINE ,null)
call DisplayTextToForce( GetPlayersAll(), R2S(damage*1.0) )
else
call SaveReal(udg_hash,GetHandleId(f),StringHash("PassiveDamage")+GetHandleId(caster),damage*1.1)
call UnitDamageTarget(caster,f,damage*1.0,true,false,ATTACK_TYPE_CHAOS,DAMAGE_TYPE_UNKNOWN,null)
call DisplayTextToForce( GetPlayersAll(), R2S(damage*1.0) )
endif
call GroupRemoveUnit(gn,f)
else
call GroupRemoveUnit(g,f)
call FlushChildHashtable(udg_hash,GetHandleId(f))
endif
endloop
call DestroyGroup(gn)
endif
set caster=null
set t=null
set g=null
set gn=null
set f=null
endfunction
function Trig_PassiveDmg_Actions takes nothing returns nothing
local timer t=CreateTimer()
call SaveUnitHandle(udg_hash,GetHandleId(t),0,GetTriggerUnit())
call SaveGroupHandle(udg_hash,GetHandleId(t),1,CreateGroup())
call TimerStart(t,1.00,true,function PassiveDmg_m)
set t=null
endfunction
//===============================
function InitTrig_PassiveDmg takes nothing returns nothing
set gg_trg_PassiveDmg = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_PassiveDmg, EVENT_PLAYER_HERO_SKILL )
call TriggerAddCondition( gg_trg_PassiveDmg, Condition( function Trig_PassiveDmg_Conditions ) )
call TriggerAddAction( gg_trg_PassiveDmg, function Trig_PassiveDmg_Actions )
endfunction
Принятый ответ
Bergi_Bear:
Вроде пофиксилГде у тебя момент, что юнит вышел из радиуса? вот тут?-- else call GroupRemoveUnit(g,f) call FlushChildHashtable(udg_hash,GetHandleId(f)) --
оно не должно лагать, тем более на периоде 1 секунда
call GroupRemoveUnit(gn,f) Было g , надо gn
call FlushChildHashtable(udg_hash,GetHandleId(f))
call FlushChildHashtable(udg_hash,GetHandleId(f))
quq_CCCP:
Ну это я её так назвал в этой теме, это же и не аура вовсе.Какая то странная реализация, ауру сделать можно гораздо проще,
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
call FlushChildHashtable(udg_hash,GetHandleId(f))