Есть два примера, один не вызывает утечки, второй вызывает.
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
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, либо ничего. Я такой способ уже давно практикую.
0
2
2 месяца назад
Отредактирован Stray_Lucifer
0
Кстати знающие люди подскажите пожалуйста, первый способ удаления утечек подаёт к любым триггерам где идёт выделение юнитов через отряд или только в указанном примере это будет работать?
Вот например в таком триггере это будет работать?

ScorpioT1000, Спасибо!
Загруженные файлы
0
18
2 месяца назад
0
PT153, Можно, но enum'ить фильтр будет каждый раз всех юнитов, включая дохлых, что лишняя работа )
0
28
2 месяца назад
Отредактирован PT153
0
EugeAl, твой вариант тоже будет перебирать всех подряд, только ещё и группу очищать нужно. В моём варианте как раз наоборот нет лишней работы в виде чистки группы. А всё остальное идентично.
Твой вариант через очистку:
call GroupEnumUnitsOfPlayer(TempGroup, Player(0), null)
call ForGroup(TempGroup, function Actions)
call GroupClear(TempGroup)
Мой вариант через фильтр:
call GroupEnumUnitsOfPlayer(TempGroup, Player(0), Filter(function Actions))
В обоих случаях функция действия такая:
function Actions takes nothing returns nothing
    if /* делаем проверки над юнитом */ then
        /* делаем действия над юнитом */
    endif
endfunction

Фильтры в JASS кешируются, поэтому удалять его не нужно. Но я всегда их заношу в глобалки.
1
18
2 месяца назад
1
PT153, я имел ввиду не такую систему, с очисткой )
Я предлагал иметь группу;
иметь пару триггеров для добавления или удаления каких либо юнитов в или из группы - например, юнитов, нанимаемых в казармах, при смерти юнитов соответственно удалять их из группы;
Действия с юнитами делать через for group;
Не очищать группу после.
Твой же вариант тоже хорош, но он годится для своих абилок аое, например)
Чтобы оставить комментарий, пожалуйста, войдите на сайт.