Добавлен
Обнулял всё, что только в голову взбрело, даже то, что не нужно, и всё равно они есть.. Как же оно задолбало. Может что-то пропустил, не обнулил, не удалил, я хз.
Научите нуба, пожалуйста, избавляться от этой саранчи. Практически среди всех способностей похожего типа присутствуют эти 1-3 утечки, которые растут при быстром касте абилок
Прикладываю карту

Принятый ответ

quq_CCCP скинул карту с нормальным кодом.
Спасибо большое)
Код:
globals
    hashtable H = InitHashtable()
    real x
    real y
    group g = CreateGroup()
    real MaxX
    real MinX
    real MaxY
    real MinY
    unit bj_lastFilterUnit = null
endglobals

function GetCorX takes real x returns real
    if ( x < MinX ) then
        return MinX
    endif
    if ( x > MaxX ) then
        return MaxY
    endif
    return x
endfunction

function GetCorY takes real y returns real
    if ( y < MinY ) then
        return MinY
    endif
    if ( y > MaxY ) then
        return MaxY
    endif
    return y
endfunction

function Trig_Frost_Conditions takes nothing returns boolean
    return ( GetSpellAbilityId() == 'A000' )
endfunction

function Enemy_Filter takes nothing returns boolean
    set bj_lastFilterUnit = GetFilterUnit( )
    return IsUnitEnemy( bj_lastFilterUnit, bj_groupEnumOwningPlayer ) and GetWidgetLife(bj_lastFilterUnit) > 0.405 and not IsUnitType( bj_lastFilterUnit, UNIT_TYPE_STRUCTURE ) 
endfunction

function Group_Damage_Enemy_Enum takes nothing returns nothing
    local unit enemy = GetEnumUnit()
    call UnitDamageTarget( bj_lastReplacedUnit, enemy, 100.00,  true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_COLD, WEAPON_TYPE_WHOKNOWS )
    call DestroyEffect( AddSpecialEffectTarget( "Abilities\\Spells\\Undead\\FrostArmor\\FrostArmorDamage.mdl", enemy, "chest" ) )
    set enemy = null
endfunction

function Timer_Dummy_Move_Expires takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer id = GetHandleId(t)
    local unit cast = LoadUnitHandle( H, id, 0 )
    local unit dummy = LoadUnitHandle( H, id, 1 )
    local real facing = LoadReal( H, id, 2 )
    local real dist = LoadReal( H, id, 3 ) + 32.00

    set x = GetCorX( GetUnitX(dummy) + 32.00 * Cos( facing ) )
    set y = GetCorY( GetUnitY(dummy) + 32.00 * Sin( facing ) )
    call SetUnitX( dummy, x )
    call SetUnitY( dummy, y )
    call GroupClear( g )
    set bj_groupEnumOwningPlayer = GetOwningPlayer( cast )
    call GroupEnumUnitsInRange( g, x, y, 125.00, Condition( function Enemy_Filter ) )  
    if dist < 1500.00 and FirstOfGroup( g ) == null then
        call SaveReal( H, id, 3, dist )
    else
        call GroupClear( g )
        set bj_groupEnumOwningPlayer = GetOwningPlayer( cast )
        call GroupEnumUnitsInRange( g, x, y, 225.00, Condition( function Enemy_Filter ) ) 
        set bj_lastReplacedUnit = cast
        call ForGroup( g, function Group_Damage_Enemy_Enum )
        call FlushChildHashtable( H, id )
        call PauseTimer(t)
        call DestroyTimer(t)
        call KillUnit(dummy)
    endif

    set t = null
    set cast = null
    set dummy = null
endfunction

function Trig_Frost_Actions takes nothing returns nothing
    local timer t = CreateTimer()
    local integer id = GetHandleId(t)
    local unit cast = GetSpellAbilityUnit()
    local real dx = GetUnitX(cast)
    local real dy = GetUnitY(cast)
    local real facing = Atan2(GetSpellTargetY() - dy, GetSpellTargetX() - dx)
    local unit dummy = CreateUnit( GetOwningPlayer(cast), 'u000', GetCorX( dx + 64.00 * Cos(facing) ), GetCorY( dy + 64.00 * Sin(facing) ), facing * bj_DEGTORAD )
    
    call SetUnitPathing( dummy, false )
    call UnitApplyTimedLife( dummy, 'BTLF', 0.00 )
    
    call SaveUnitHandle( H, id, 0, cast )
    call SaveUnitHandle( H, id, 1, dummy )
    call SaveReal( H, id, 2, facing )
    call SaveReal( H, id, 3, 0.00 )
    call TimerStart( t, 0.03125, true, function Timer_Dummy_Move_Expires )
    
    set cast = null
    set dummy = null
    set t = null
endfunction

//===========================================================================
function InitTrig_Frost takes nothing returns nothing
    set gg_trg_Frost = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Frost, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Frost, Condition( function Trig_Frost_Conditions ) )
    call TriggerAddAction( gg_trg_Frost, function Trig_Frost_Actions )
endfunction
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
19
4 года назад
0
Похожие вопросы:

ответ
Какой ужас
Делай вот так.
бронепоезд
создать.
направить на 128 точек наверх(90)
сделать неперманентным
текст удалится через 3 секунды
текст затухнет до 100% прозрачности через 3 секунды
Вот чёрт. не успел приплюснуть к посту.
ответ
Есть системы, для автоматического удаления локейшенов и групп прям на гуи в 126. Так же можно подгрузить автоочистуюку на луа, для последнего патча.
Пример автоочистки на гуи есть вот тут
Не скажу где, делал мега давно, но точно где то вначале
ответ
AllChosen, строки
TrigSpell = 0
TrigPlayer = null

EnumPlayer = null
EnumUnitType = 0
Строка
EnumUnit = null
тоже лишняя, так как условием выхода из цикла loop является
exitwhen EnumUnit == null
Старайтесь использовать координаты вместо локаций:
GetSpellTargetLoc() -> GetSpellTargetX(), GetSpellTargetY()
GroupEnumUnitsInRangeOfLoc() -> GroupEnumUnitsInRange()
CreateUnitAtLoc() -> CreateUnit()
ответ
думаю из за loop где то цикл не может закончиться...
после этого скилла герой не возрождается

ой я нуб блин гуй триггерщик который писал этот спелл поставил этому скиллу скорость снаряда 0 конечно будет лагать все вопрос закрыт))

0
17
4 года назад
0
Утечки происходят если снаряды улетают за пределы карты. Если попадают по целям, то все норм
0
32
4 года назад
Отредактирован Maniac_91
0
Че это за ахинея?
    local trigger t = CreateTrigger()
    local integer index = 0
    local playerunitevent e = null
    local code c = function Frost_Conditions
    local player p = null
    local boolexpr b = null
    
    loop
    set p = Player(index)
    set e = EVENT_PLAYER_UNIT_SPELL_EFFECT
    call TriggerRegisterPlayerUnitEvent(t,p,e,b)
    set index = index + 1
    exitwhen index == bj_MAX_PLAYER_SLOTS
    set e = null
    set p = null
    endloop
    
    set b = Condition(c)
    call TriggerAddCondition(t,b)
    set c = null
    set c = function Frost_Actions
    call TriggerAddAction(t,c)
    
    set b = null
    set c = null
    set t = null
Ну сами и наплодили непойми чего.

Потом волну силы то не пробовали а?
Тут спелл примитив примитивом, но сделан отвратно, зачем то SteUnitPos - вместо нормального движения по осям, как таймер бредовый 0.01, ну ладно уж 0.02, или 0.03125.
Куда 0.01? Нет никакой обьективной нужды в таких таймерах, как и в прочих вещях вроде SetIUnitPosition.

Vlod, они там улететь немогут, т.к SetUnitPos не выпустит.

Но тут почему то нормально не пострена дальность полета, тупая проверка группой что кто то попалася, а если никто - то оно и дальше тикает....

Полная ахинея, уж блин триггер бы взяли и событие UnitsInRange и вручали его всем даммиками, а триггер был бы 1, если уж дофига оптимизацию охото.
1 пункт от Maniac_91: 1.1 (ненормативная лексика)
1
17
4 года назад
1
quq_CCCP, да ладно, он элементарно написал свою систему создания триггера
rsfghd, добавь ограничение по дальности, а то сейчас дамми умирают только если попадают по врагу
0
27
4 года назад
Отредактирован rsfghd
0
Та не в дальности дело, господи. Я на дальность плевать хотел, главное что при попадании все равно есть утечки (быстро кастуем спелл)
Насчёт таймера в 0.01, та бл, там изначально было 0.03, мне пофигу на таймер, если оно в любом случае криво работает

quq_CCCP, чем ужасен SetUnitPosition? Оно просто совместило в себе 2 функции SetUnitX и SetUnitY, разве нет?
они там улететь немогут, т.к SetUnitPos не выпустит.
За карту юниты спокойно улетают (ну или за пределы камеры, хз)

Вообще не понимаю почему вы придрались к отсутствию дальности, если бы мне это нужно было, я бы добавил

Было 230, стало 233

Тут спелл примитив примитивом, но сделан отвратно, зачем то SteUnitPos - вместо нормального движения по осям, как таймер бредовый 0.01, ну ладно уж 0.02, или 0.03125. Куда 0.01? Нет никакой обьективной нужды в таких таймерах, как и в прочих вещях вроде SetIUnitPosition.
Ну окей, поставил таймер 0.03 обратно, движение по осям. А толку? Всё так же, как и было до этого, вообще ничего не изменилось.
Полная ахинея, уж блин триггер бы взяли и событие UnitsInRange и вручали его всем даммиками, а триггер был бы 1, если уж дофига оптимизацию охото.
Мне охота не оптимизация, а избавление от утечек
Загруженные файлы
2
32
4 года назад
2
rsfghd,
1)SetUnitPosition - значительно более ресурсоемка чем движение по осям, для проверки границ карты проверяйете кординаты на корректность, это элементарно.
  1. Нет никакой надобности юзать таймеры с таким малым периодом, типа 100 раз в сек, 50 или 23 более чем достаточно.
  2. Ты скорее наделал утечики с переменными чем сделал лучше, подобный код бесполезен, уж лучше обынчый БЖ код юзай.

Далее неверный алгоритм, нет иного завершения кроме как попадания. Если у тебя планируется тонны снарядом - то мб не делать как ты для каждого снаряда 1 таймер, еще и переборы группой ?
0
37
4 года назад
Отредактирован ScorpioT1000
0
Нет никакой обьективной нужды в таких таймерах
240гц передает тебе привет)
хотя в классике действительно нет смысла , хотя интерес к классике остался у полутора землекопов
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.