Есть два примера, один не вызывает утечки, второй вызывает.
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
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
0
19
7 лет назад
0
quq_CCCP:
Придеться немного поизучать jass
0
2
3 месяца назад
0
Первый пример у меня не работает, может кто то помочь..тупо проверка ошибок не даёт сохранить карту.
Пишет отсутствует оператор кода, хотя все как в примере
Загруженные файлы
0
15
3 месяца назад
0
У тебя точки в место запятых и точка запятая идут сразу
Загруженные файлы
0
13
3 месяца назад
Отредактирован Borodach
0
Во 2 примере, внутри Юниты в (Игровая зона) создается локальная переменная групы, которую никак не удалить. Используй первый пример спокойно
0
18
3 месяца назад
0
Довольно странная реализация - каждый раз создавать группы и точки, а потом удалять. Не лучше ли сразу на старте создать всё необходимое, а потом просто использовать, только группу очищать? Ну и конечно же, точка здесь по идее не нужна, ведь есть GroupEnumUnitsOfRange, по x и y работает.
0
2
2 месяца назад
0
Desgul, спасибо большое за попытку помочь, но к сожалению не помогли Ваши подсказки.
Я и в тот то раз уже все возможные комбинации перепробовал, и в этот раз опять как их только не менял и все точки и все запятые и вместе и тд..всегда ошибка в этой строке при сохранении.
Может кто то её набрать текстом здесь в чате, что бы её можно было скопировать?
И еще, у автора этого поста именно так и стоит в примере...в конце точка, а сразу за ней запятая.

Охренеть...Еще 8 вариаций с точеками, запятыми и пробелами и я нашел нужный )))) Все сохранилось...
Теперь вопрос зачем автор сбивал с толку и выложил скрин где не верно стоят знаки..точка и запятая у него рядом после 99999.
Вот выложу тут рабочий текст строки, думаю кому то может пригодится..
GroupEnumUnitsInRangeOfLoc( udg_Group, udg_Point, 99999, null)
Desgul спасибо Вам что направили мои сомнения что это скрипт вообще рабочий в нужное русло)
0
37
2 месяца назад
Отредактирован ScorpioT1000
0
Stray_Lucifer, это формат описания чисел с плавающей точкой
См real
Он не отменяет разделение аргументов запятыми

Разрешается не ставить число до или после точки, тогда это будет считаться как ноль ( .12 эквивалентно 0.12, 12. эквивалентно 12.0 ).
0
28
2 месяца назад
Отредактирован PT153
0
EugeAl, если не нужно хранить коллекцию юнитов, можно вообще их даже в саму группу не добавлять. Просто в Enum передавать фильтр с нужными дейтсвиями, а самом фильтре либо возвращать false, либо ничего. Я такой способ уже давно практикую.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.