Есть два примера, один не вызывает утечки, второй вызывает.
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 )) // это в кастом скрипт твоего триггера
Вот без утечек и локейшинов и прочих ненужных действий.
Далее уже делай что хочешь с юнитами в группе
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
10
KaneThaumaturge:
ну лучше через координаты делать, если триггер каждый сек работать будет
32
Достаточно посмотреть как устроены эти бж функции и все будет понятно.
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 )) // это в кастом скрипт твоего триггера
Вот без утечек и локейшинов и прочих ненужных действий.
Далее уже делай что хочешь с юнитами в группе
Принятый ответ
20
quq_CCCP:
Спасибо больше, функцию OnlyAliveSourcess вставить в вверх. А триггер сделать таким:
А первый пример можно юзать, если нужно не выбирать в регионе, а пикать радиусом?
quq_CCCP:
Да, я так понял функция фильтрует только волшебниц, но я сделал их для примера просто.
call GroupEnumUnitsInRect( udg_Group, bj_mapInitialPlayableArea, null) Нельзя использовать ли это? А в условие ставить уже в цикле?
Загруженные файлы
32
ага, а тебе кого нужно? В функции есть строчка - GetUnitTypeId(GetFilterUnit()) == 'hsor'
Ну то что после == это есть ро код юнита, смотри в редакторе объектов нажав Ctr + D
20
quq_CCCP:
Да, я увидел, но я же не ограничиваюсь только этим услвоием, у меня куча триггеров с пиком, и все они вызывают утечки, и у всех разные условия. Исправляю мапу свою
call GroupEnumUnitsInRect( udg_Group, bj_mapInitialPlayableArea, null) Нельзя использовать ли это? А в условие ставить уже в цикле?
32
Ну в радиусе нужны координаты, центра окружности и её радиус...
Вам я так понял координаты не даются...
KaneThaumaturge, не надо, это помедленнее в разы + пикать всех, включая дохлых плохая затея - могут быть баги.
Для этого делаются фильтры на все случаи жизни, штук 10, и используются во всех триггерах.
20
quq_CCCP:
Хорошо, тогда с ними разберусь уже как-то. Спасибо
32
Я использую в своей карте вот столько фильтров:
код
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
2
Первый пример у меня не работает, может кто то помочь..тупо проверка ошибок не даёт сохранить карту.
Пишет отсутствует оператор кода, хотя все как в примере
Загруженные файлы
15
У тебя точки в место запятых и точка запятая идут сразу
Загруженные файлы
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.