Добавлен
Обнулял всё, что только в голову взбрело, даже то, что не нужно, и всё равно они есть.. Как же оно задолбало. Может что-то пропустил, не обнулил, не удалил, я хз.
Научите нуба, пожалуйста, избавляться от этой саранчи. Практически среди всех способностей похожего типа присутствуют эти 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
27
4 года назад
0
Zetox, убийство юнита из-за его красивой анимации. Если ремувнуть его, то не будет взрыва и след от юнита внезапно исчезнет, это не красиво. В любом случае юнит после разложения удаляется. Да, я судил по кол-ву хэндлов. Выше кидали норм карту. Там хэндлы возвращаются на своё изначальное место, сколько бы ты не юзал эту абилку. Но там слишком много новых для меня функций принцип действия которых я не понимаю от слова совсем. Да и структура не очень комфортная для меня, это же c/vJass, что-то могу понять, но не всё
4
16
4 года назад
4
о, люди с частотой глаза 360 герц в треде
0
7
4 года назад
0
Там хэндлы возвращаются на своё изначальное место
Ну он возвращает так сказать id последнего созданного хендла, имей ввиду, что у тебя могут быть пропуски, к примеру возвращает 0x100300, а с 0x100150 по 0x100200 может и не быть объектов с такими хендлами. Если создавать больше объектов, он будет забирать из стека свободные номера.

DracoL1ch:
о, люди с частотой глаза 360 герц в треде
В глазу, в отличие от камер, нет никого таймера обновления кадров. Разница между 144 гц и 60 существенная, между 144 и 360 я не знаю, но думаю что она тоже есть.
0
32
4 года назад
0
Zetox, в варкарвте лок 60 фпс, который надо еще и снимать, а обновление анимации там и того реже бывает, так что не обманывайте себя что там вы чето лучше сделали, или плавнее - нет.

rsfghd, внезапно юниту можно время жизни поставить и он разложится как суммон, сразу после времени смерти.
2
7
4 года назад
Отредактирован Zetox
2
Какой лок в 60 ? написано 298 фпс. (правда монитор 144гц)
Двигать можно и более мелким таймером, а обрабатывать встречу с юнитом с более большим интервалом.
Скрин
Загруженные файлы
1
22
4 года назад
Отредактирован PROSHELDOTU
1
quq_CCCP, и чё такого в таймере 0.01? Почему бы не заюзать его для движения снаряда, который будет лететь от силы сек 3, что в этом такого
Или ты волнуешься за чьи-то калькуляторы? Пусть за них волнуются их обладатели

NazarPunk, я не знаю cJass и vJass, я этим даже воспользоваться не смогу
в той наработке вроде Zinc, если я не путаю с какой-то другой )
0
32
4 года назад
0
Proshel_Doty, нет никакой надобности в подобном, о чем я пытаюсь донести - но кто бы слушал. Да и вовсе рализация не лучшая.
0
22
4 года назад
0
Было 230, стало 233
Правильно, потому что объекты всё ещё присутствуют в игре, хоть их не видно

quq_CCCP, ещё как есть. Попробуй прицепить текст за курсором на 0.02 сек или хп бар у юнита на 0.02 сек, и посмотришь как он будет подёргиваться
1
37
4 года назад
1
quq_CCCP, Тем не менее предлагаешь обновлять 32 раза в секунду)
беды с олдовостью
0
32
4 года назад
0
ScorpioT1000,на 300 мс делать 100 раз все, ок, понятно все с вами.
6
16
4 года назад
Отредактирован DracoL1ch
6
Разницу между 60 и 144 видно, между 144 и 240 - нет, ни один участник исследований не смог определить где какой, с достоверной точностью.
Проблема таймеров 0.01 в высокой нагрузке при нулевом смысле в этой самой скорости. Пару снарядов сделать так можно, но для активно используемых вещей 002 более чем хорошо, даже 0.325 терпимо для не чётких моделей
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.