Есть два примера, один не вызывает утечки, второй вызывает.
1 пример:
Он не вызыввает утечек, хоть там и не стоит call DestroyGroup. Почему?
2 пример:
Вызывает утечки, почему? Как исправить?

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

Достаточно посмотреть как устроены эти бж функции и все будет понятно.
function OnlyAliveSourcess takes nothing returns boolean // эту функция в кастом код карты, в самом вверху.
    return GetUnitTypeId( GetFilterUnit( ) ) == 'hsor' and not ( GetWidgetLife( GetFilterUnit( ) ) < 0.405 or IsUnitType( GetFilterUnit( ), UNIT_TYPE_DEAD ) )
endfunction
//...
call GroupClear( udg_Group ) // это в кастом скрипт твоего триггера
call GroupEnumUnitsInRect( udg_Group, bj_mapInitialPlayableArea, Condition( function OnlyAliveSourcess )) // это в кастом скрипт твоего триггера
Вот без утечек и локейшинов и прочих ненужных действий.
Далее уже делай что хочешь с юнитами в группе
`
ОЖИДАНИЕ РЕКЛАМЫ...

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

ответ
Патиссончик, про центр области не заметил
точка каждый раз создаётся заново и это утечка
Патиссончик, есть прога на сайте для записи логов
так же есть дебаг через прелоад на сайте
вот счётчик утечек
ответ
тебе для начала надо научится пользоваться группами
прочти статьи ибо ты написал бред в вопросе
ответ
Вот как должен выглядеть полностью правильный триггер без утечек, единственная утечка создастся только при первом использовании, это я так понял переменная группы, ее обнулять нельзя, иначе скил будет работать только раз.
ответ
quq_CCCP:
Спасибо, понял что надо создавать форс единожды, чтобы утечек не было
Мдаа уж, оказывается все дело в том, что забыл поставить исходные позиции другим игрокам, хорошо хоть проверить догадался, засиделся за редактором
ответ
А зачем, мб альтернатива гуи? Ну она есть, jass.
Если использовать группы нормально, а не как нам предлагает гуи, не будет ни утечек, ни проблем.

0
10
7 лет назад
0
Во втором примере утекает точка, которая создаётся при установлении группы. а в первом примере точка удаляется, а группа всего 1 одна, глобальная, поэтому и нет диких утечек
создавай группу через отдельную переменную-точку
потом удаляй
0
19
7 лет назад
0
LordDracula:
Тоесть можно юзать второй вариант, и сильных утечек не будет?
0
10
7 лет назад
0
KaneThaumaturge:
ну лучше через координаты делать, если триггер каждый сек работать будет
2
32
7 лет назад
Отредактирован quq_CCCP
2
Достаточно посмотреть как устроены эти бж функции и все будет понятно.
function OnlyAliveSourcess takes nothing returns boolean // эту функция в кастом код карты, в самом вверху.
    return GetUnitTypeId( GetFilterUnit( ) ) == 'hsor' and not ( GetWidgetLife( GetFilterUnit( ) ) < 0.405 or IsUnitType( GetFilterUnit( ), UNIT_TYPE_DEAD ) )
endfunction
//...
call GroupClear( udg_Group ) // это в кастом скрипт твоего триггера
call GroupEnumUnitsInRect( udg_Group, bj_mapInitialPlayableArea, Condition( function OnlyAliveSourcess )) // это в кастом скрипт твоего триггера
Вот без утечек и локейшинов и прочих ненужных действий.
Далее уже делай что хочешь с юнитами в группе
Принятый ответ
0
19
7 лет назад
0
quq_CCCP:
Спасибо больше, функцию OnlyAliveSourcess вставить в вверх. А триггер сделать таким:
А первый пример можно юзать, если нужно не выбирать в регионе, а пикать радиусом?
quq_CCCP:
Да, я так понял функция фильтрует только волшебниц, но я сделал их для примера просто.
call GroupEnumUnitsInRect( udg_Group, bj_mapInitialPlayableArea, null) Нельзя использовать ли это? А в условие ставить уже в цикле?
Загруженные файлы
1
32
7 лет назад
1
ага, а тебе кого нужно? В функции есть строчка - GetUnitTypeId(GetFilterUnit()) == 'hsor'
Ну то что после == это есть ро код юнита, смотри в редакторе объектов нажав Ctr + D
0
19
7 лет назад
0
quq_CCCP:
Да, я увидел, но я же не ограничиваюсь только этим услвоием, у меня куча триггеров с пиком, и все они вызывают утечки, и у всех разные условия. Исправляю мапу свою
call GroupEnumUnitsInRect( udg_Group, bj_mapInitialPlayableArea, null) Нельзя использовать ли это? А в условие ставить уже в цикле?
1
32
7 лет назад
1
Ну в радиусе нужны координаты, центра окружности и её радиус...
Вам я так понял координаты не даются...
KaneThaumaturge, не надо, это помедленнее в разы + пикать всех, включая дохлых плохая затея - могут быть баги.
Для этого делаются фильтры на все случаи жизни, штук 10, и используются во всех триггерах.
0
19
7 лет назад
0
quq_CCCP:
Хорошо, тогда с ними разберусь уже как-то. Спасибо
1
32
7 лет назад
Отредактирован quq_CCCP
1
Я использую в своей карте вот столько фильтров:
код
function RunnerFilter takes nothing returns boolean
    set bj_lastFilterUnit = GetFilterUnit( )
    return GetUnitState( bj_lastFilterUnit, UNIT_STATE_LIFE ) > 0.405 and GetUnitAbilityLevel( bj_lastFilterUnit, 'Arun' ) > 0 and LoadBoolean( gg_htb_HashData, GetHandleId( bj_lastFilterUnit ), ExKeyHasStaff )
endfunction

function EnemyFilter takes nothing returns boolean
    set bj_lastFilterUnit = GetFilterUnit( )
    return GetUnitState( bj_lastFilterUnit, UNIT_STATE_LIFE ) > 0.405 and IsUnitEnemy( bj_lastFilterUnit, bj_groupEnumOwningPlayer ) and not( IsUnitType( bj_lastFilterUnit, UNIT_TYPE_MAGIC_IMMUNE ) or IsUnitType( bj_lastFilterUnit, UNIT_TYPE_MECHANICAL ) or IsUnitInvulnerable( bj_lastFilterUnit ) or IsUnitWard( bj_lastFilterUnit ) )
endfunction

function Enemy_Summoned_Filter takes nothing returns boolean
    set bj_lastFilterUnit = GetFilterUnit( )
    return GetUnitState( bj_lastFilterUnit, UNIT_STATE_LIFE ) > 0.405 and IsUnitEnemy( bj_lastFilterUnit, bj_groupEnumOwningPlayer ) and ( IsUnitType( bj_lastFilterUnit, UNIT_TYPE_SUMMONED ) or GetUnitAbilityLevel( bj_lastFilterUnit, 'ANsu' ) == 1 )
endfunction

function Chain_Enemy_Filter takes nothing returns boolean
    set bj_lastFilterUnit = GetFilterUnit( )
    return GetUnitState( bj_lastFilterUnit, UNIT_STATE_LIFE ) > 0.405 and IsUnitEnemy( bj_lastFilterUnit, bj_groupEnumOwningPlayer ) and not( IsUnitType( bj_lastFilterUnit, UNIT_TYPE_STRUCTURE )or IsUnitType( bj_lastFilterUnit, UNIT_TYPE_MECHANICAL ) or IsUnitWard( bj_lastFilterUnit )  or IsUnitInGroup( bj_lastFilterUnit, LoadGroupHandle( gg_htb_HashData, GetHandleId( GetExpiredTimer( ) ), ExKeyChainGroup ) ) or IsUnitInvulnerable( bj_lastFilterUnit ) or bj_lastFilterUnit == bj_lastReplacedUnit )
endfunction

function Wave_Enemy_Filter takes nothing returns boolean
    local DamageData dd = GetDataBX( GetExpiredTimer( ) )
    set bj_lastFilterUnit = GetFilterUnit( )
    return GetUnitState( bj_lastFilterUnit, UNIT_STATE_LIFE ) > 0.405 and IsUnitEnemy( bj_lastFilterUnit, bj_groupEnumOwningPlayer ) and not ( IsUnitInGroup( bj_lastFilterUnit, dd.grp ) or IsUnitType( bj_lastFilterUnit, UNIT_TYPE_MAGIC_IMMUNE ) or IsUnitType( bj_lastFilterUnit, UNIT_TYPE_MECHANICAL ) or IsUnitWard( bj_lastFilterUnit )  or IsUnitInvulnerable( bj_lastFilterUnit ) )
endfunction

function Dispel_Enemy_Filter takes nothing returns boolean
    set bj_lastFilterUnit = GetFilterUnit( )
    return GetUnitState( bj_lastFilterUnit, UNIT_STATE_LIFE ) > 0.405 and IsUnitEnemy( bj_lastFilterUnit, bj_groupEnumOwningPlayer ) and not ( IsUnitType( bj_lastFilterUnit, UNIT_TYPE_ANCIENT ) or IsUnitType( bj_lastFilterUnit, UNIT_TYPE_STRUCTURE ) or IsUnitInvulnerable( bj_lastFilterUnit ) or ( IsUnitType( bj_lastFilterUnit, UNIT_TYPE_SAPPER ) and not(GetUnitTypeId( bj_lastFilterUnit ) == 'n005') ) )
endfunction

function Wave_All_Enemy_Filter takes nothing returns boolean
    local DamageData dd = GetDataBX( GetExpiredTimer( ) )
    set bj_lastFilterUnit = GetFilterUnit( )
    return GetUnitState( bj_lastFilterUnit, UNIT_STATE_LIFE ) > 0.405 and IsUnitEnemy( bj_lastFilterUnit, bj_groupEnumOwningPlayer ) and not ( IsUnitInGroup( bj_lastFilterUnit, dd.grp ) or GetUnitAbilityLevel( bj_lastFilterUnit, 'BHav' ) > 0 or IsUnitType( bj_lastFilterUnit, UNIT_TYPE_MECHANICAL ) or IsUnitWard( bj_lastFilterUnit ) or IsUnitInvulnerable( bj_lastFilterUnit ) or ( IsUnitType( bj_lastFilterUnit, UNIT_TYPE_ANCIENT ) or IsUnitType( bj_lastFilterUnit, UNIT_TYPE_STRUCTURE ) or ( IsUnitType( bj_lastFilterUnit, UNIT_TYPE_SAPPER ) and not(GetUnitTypeId( bj_lastFilterUnit ) == 'n005') ) ) )
endfunction

function Enemy_Ward_Filter takes nothing returns boolean
    set bj_lastFilterUnit = GetFilterUnit( )
    return IsUnitEnemy( bj_lastFilterUnit, bj_groupEnumOwningPlayer ) and IsUnitWard( bj_lastFilterUnit ) and not( IsUnitDead( bj_lastFilterUnit ) or IsUnitInvulnerable( bj_lastFilterUnit ) )
endfunction

function Mine_Enemy_Filter takes nothing returns boolean
    set bj_lastFilterUnit = GetFilterUnit( )
    return IsUnitEnemy( bj_lastFilterUnit, bj_groupEnumOwningPlayer ) and not ( IsUnitWard( bj_lastFilterUnit ) or IsUnitDead( bj_lastFilterUnit ) or IsUnitInvulnerable( bj_lastFilterUnit ) or IsUnitType( bj_lastFilterUnit, UNIT_TYPE_ANCIENT ) )
endfunction

function No_Dummy_Filter takes nothing returns boolean
    set bj_lastFilterUnit = GetFilterUnit( )
    return not ( IsUnitWard( bj_lastFilterUnit ) or IsUnitType( bj_lastFilterUnit, UNIT_TYPE_MECHANICAL )  )
endfunction

function All_Enemy_Filter takes nothing returns boolean
    set bj_lastFilterUnit = GetFilterUnit( )
    return GetWidgetLife( bj_lastFilterUnit ) > 0.405  and IsUnitEnemy( bj_lastFilterUnit, bj_groupEnumOwningPlayer ) and not ( IsUnitType( bj_lastFilterUnit, UNIT_TYPE_MECHANICAL) or IsUnitInvulnerable( bj_lastFilterUnit ) )
endfunction

function Group_Kill_Wards_enum takes nothing returns nothing
    call UnitDamageTarget( bj_lastReplacedUnit, GetEnumUnit( ), 1000.00, true, true, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_ENHANCED, WEAPON_TYPE_WHOKNOWS )
endfunction
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.