Тормозит когда выхожу из зоны от юнитов на которых уже действует "аура".
Смысл абилки: юнит "горит" при нахождении рядом с героем постоянно увеличивается урон по нарастающей с каждой последующей секундой пока юнит стоит рядом.
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))


quq_CCCP:
Какая то странная реализация, ауру сделать можно гораздо проще,
Ну это я её так назвал в этой теме, это же и не аура вовсе.
`
ОЖИДАНИЕ РЕКЛАМЫ...
2
32
4 года назад
2
В коде ничего подозрительного не вижу, надо продебажить лагающее место

может вообще не этот код а ещё какой-то другой
0
10
4 года назад
0
Карта практически пустая, маловероятно что это какой то другой код. Может кто проверить у себя? Подойти к вражеским юнитам потом отойти от них, в этот момент начинаются фризы.

Bergi_Bear:
В коде ничего подозрительного не вижу, надо продебажить лагающее место
Это не для моих познаний :) Я самоучка и не разу не программист
2
32
4 года назад
2
Где у тебя момент, что юнит вышел из радиуса? вот тут?
--
else
    call GroupRemoveUnit(g,f)
    call FlushChildHashtable(udg_hash,GetHandleId(f))
--
оно не должно лагать, тем более на периоде 1 секунда
1
32
4 года назад
1
Какая то странная реализация, ауру сделать можно гораздо проще,
globals
    timer AuraTimer = null
    boolexpr AuraFilter
    constant player bj_AllyPlayer = Player( 9 )
endglobals

function Boolexpr_Resistance_Aura_Conditions takes nothing returns boolean
    set bj_lastFilterUnit = GetFilterUnit( )
    return GetUnitState( bj_lastFilterUnit, UNIT_STATE_LIFE ) > 0.405 and IsUnitAlly( bj_lastFilterUnit, bj_AllyPlayer ) and not ( GetOwningPlayer( bj_lastFilterUnit ) == bj_PLAYER_NEUTRAL_AGGRESSIVE or IsUnitType( bj_lastFilterUnit, UNIT_TYPE_STRUCTURE ) )
endfunction

function AddOrDeleteResistance takes nothing returns nothing
    set bj_lastReplacedUnit = GetEnumUnit( )
    set bj_forLoopBIndex = GetUnitAbilityLevel( bj_lastReplacedUnit, 'B00F' ) // бафф защитной ауры
    set bj_forLoopBIndexEnd = GetUnitAbilityLevel( bj_lastReplacedUnit, 'A03U' ) // спеллбук
   
   
    if bj_forLoopBIndex == 1 and bj_forLoopBIndexEnd == 0 then
        call UnitAddAbility( bj_lastReplacedUnit, 'A03U' )
        call UnitMakeAbilityPermanent( bj_lastReplacedUnit, true, 'A03U' )
        call UnitMakeAbilityPermanent( bj_lastReplacedUnit, true, 'A03T' )
        call SetUnitAbilityLevel( bj_lastReplacedUnit, 'A03T', bj_forLoopAIndex )
    endif

    if bj_forLoopBIndex == 0 and bj_forLoopBIndexEnd == 1 then
        call SetUnitAbilityLevel( bj_lastReplacedUnit, 'A03T', 1 )
    endif
    
    if bj_forLoopBIndex == 1 and bj_forLoopBIndexEnd == 1 then
        call SetUnitAbilityLevel( bj_lastReplacedUnit, 'A03T', bj_forLoopAIndex )
    endif
    
    set bj_lastReplacedUnit = null
    set bj_forLoopBIndex = 0
    set bj_forLoopBIndexEnd = 0
endfunction

function Timer_Resistance_Aura_Actions takes nothing returns nothing
    set bj_forLoopAIndex = GetDataBX( GetExpiredTimer( ) )
    call GroupClear( gg_grp_TempGroup )
    call GroupEnumUnitsInRect( gg_grp_TempGroup, bj_mapInitialPlayableArea, AuraFilter )
    call ForGroup( gg_grp_TempGroup, function AddOrDeleteResistance )
endfunction

function Trig_Resistance_Aura_Actions takes nothing returns nothing
    local unit Runner = GetTriggerUnit( )
    local integer Level = GetUnitAbilityLevel( Runner, 'A03S' )
    
    if Level == 1 then
        if AuraTimer != null then
            call RemoveDataBX( AuraTimer )
            call DestroyTimer( AuraTimer )
        endif
        set AuraTimer = CreateTimer( )
        set AuraFilter = Condition( function Boolexpr_Resistance_Aura_Conditions )
        call SetDataBX( AuraTimer, Level + 1 )
        call TimerStart( AuraTimer, 1.01, true, function Timer_Resistance_Aura_Actions )
        call UnitAddAbility( Runner, 'A03U' )
        call SetUnitAbilityLevel( Runner, 'A03T', Level+1 )
    else
        call SetDataBX( AuraTimer, Level + 1 )
    endif
    set Runner = null
endfunction

//===========================================================================
function InitTrig_Resistance_Aura takes nothing returns nothing
endfunction
Банально на основе ауры пустышки.
0
10
4 года назад
0
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))


quq_CCCP:
Какая то странная реализация, ауру сделать можно гораздо проще,
Ну это я её так назвал в этой теме, это же и не аура вовсе.
Принятый ответ
Чтобы оставить комментарий, пожалуйста, войдите на сайт.