Сейчас увидел на хайве использование этого кастом скрипта для предотвращения утечек. Насколько понял, это корректно работает при использовании мгновенных действий с группами, а не для сохранения групп на какое-то время, чтобы потом произвести там действия. Это гораздо удобнее, как мне кажется, чем создавать переменную для группы, которую потом удалять. Но у нас ни разу не видел использования подобного CS. Может он дискредитирован как-то, либо используется лишь на патчах до 1.26а, почему это не предлагают?

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

ForGroupBJ
function ForGroupBJ takes group whichGroup, code callback returns nothing
local boolean wantDestroy = bj_wantDestroyGroup
set bj_wantDestroyGroup = false
call ForGroup(whichGroup, callback)
if (wantDestroy) then
call DestroyGroup(whichGroup)
endif
endfunction
Судя по BJ функции, сразу после первого выбора группы bj_wantDestroyGroup станет фолс, и следующая группа не удалица.

Тобишь перед каждой forgroup нада делать CS: set bj_wantDestroyGroup = true, а не один раз в начале триггера.
`
ОЖИДАНИЕ РЕКЛАМЫ...
1
25
6 лет назад
1
Для мгновенных действий одной глобалки хватает, тоже самое с точками юнитами эффектами и прочим. Завёл по одной переменной каждого типа. И юзай на здоровье вместо локалок.
0
26
6 лет назад
0
Jack-of-shadow, в том и дело, что переменных даже не надо заводить.
0
25
6 лет назад
0

если уж работать с гуи то так намного удобнее чем кс юзать.
2
27
6 лет назад
2
Вы знаете джаз? надо знать где эта переменная используется. И используется не везде. Никогда такую штуку не использовал. Быстрая ли она или нет, вот этого я не знаю.
ForGroupBJ
function ForGroupBJ takes group whichGroup, code callback returns nothing
    // If the user wants the group destroyed, remember that fact and clear
    // the flag, in case it is used again in the callback.
    local boolean wantDestroy = bj_wantDestroyGroup
    set bj_wantDestroyGroup = false

    call ForGroup(whichGroup, callback)

    // If the user wants the group destroyed, do so now.
    if (wantDestroy) then
        call DestroyGroup(whichGroup)
    endif
endfunction
CountUnitsInGroup
function CountUnitsInGroup takes group g returns integer
    // If the user wants the group destroyed, remember that fact and clear
    // the flag, in case it is used again in the callback.
    local boolean wantDestroy = bj_wantDestroyGroup
    set bj_wantDestroyGroup = false

    set bj_groupCountUnits = 0
    call ForGroup(g, function CountUnitsInGroupEnum)

    // If the user wants the group destroyed, do so now.
    if (wantDestroy) then
        call DestroyGroup(g)
    endif
    return bj_groupCountUnits
endfunction
GroupAddGroup
function GroupAddGroup takes group sourceGroup, group destGroup returns nothing
    // If the user wants the group destroyed, remember that fact and clear
    // the flag, in case it is used again in the callback.
    local boolean wantDestroy = bj_wantDestroyGroup
    set bj_wantDestroyGroup = false

    set bj_groupAddGroupDest = destGroup
    call ForGroup(sourceGroup, function GroupAddGroupEnum)

    // If the user wants the group destroyed, do so now.
    if (wantDestroy) then
        call DestroyGroup(sourceGroup)
    endif
endfunction
GroupPickRandomUnit
function GroupPickRandomUnit takes group whichGroup returns unit
    // If the user wants the group destroyed, remember that fact and clear
    // the flag, in case it is used again in the callback.
    local boolean wantDestroy = bj_wantDestroyGroup
    set bj_wantDestroyGroup = false

    set bj_groupRandomConsidered = 0
    set bj_groupRandomCurrentPick = null
    call ForGroup(whichGroup, function GroupPickRandomUnitEnum)

    // If the user wants the group destroyed, do so now.
    if (wantDestroy) then
        call DestroyGroup(whichGroup)
    endif
    return bj_groupRandomCurrentPick
endfunction
GroupRemoveGroup
function GroupRemoveGroup takes group sourceGroup, group destGroup returns nothing
    // If the user wants the group destroyed, remember that fact and clear
    // the flag, in case it is used again in the callback.
    local boolean wantDestroy = bj_wantDestroyGroup
    set bj_wantDestroyGroup = false

    set bj_groupRemoveGroupDest = destGroup
    call ForGroup(sourceGroup, function GroupRemoveGroupEnum)

    // If the user wants the group destroyed, do so now.
    if (wantDestroy) then
        call DestroyGroup(sourceGroup)
    endif
endfunction
IsUnitGroupDeadBJ
function IsUnitGroupDeadBJ takes group g returns boolean
    // If the user wants the group destroyed, remember that fact and clear
    // the flag, in case it is used again in the callback.
    local boolean wantDestroy = bj_wantDestroyGroup
    set bj_wantDestroyGroup = false

    set bj_isUnitGroupDeadResult = true
    call ForGroup(g, function IsUnitGroupDeadBJEnum)

    // If the user wants the group destroyed, do so now.
    if (wantDestroy) then
        call DestroyGroup(g)
    endif
    return bj_isUnitGroupDeadResult
endfunction
IsUnitGroupEmptyBJ
function IsUnitGroupEmptyBJ takes group g returns boolean
    // If the user wants the group destroyed, remember that fact and clear
    // the flag, in case it is used again in the callback.
    local boolean wantDestroy = bj_wantDestroyGroup
    set bj_wantDestroyGroup = false

    set bj_isUnitGroupEmptyResult = true
    call ForGroup(g, function IsUnitGroupEmptyBJEnum)

    // If the user wants the group destroyed, do so now.
    if (wantDestroy) then
        call DestroyGroup(g)
    endif
    return bj_isUnitGroupEmptyResult
endfunction
аргументы функции хоть и являются локалками, но эти аргументы обнуляются. Так что все тут нормально. Утечек нет. Все норм. Насколько это удобно для вас.
Jack-of-shadow:
Для мгновенных действий одной глобалки хватает, тоже самое с точками юнитами эффектами и прочим. Завёл по одной переменной каждого типа. И юзай на здоровье вместо локалок.
согласен проще темповую глобалку на все. так как варкрафт потоки выполняет последовательно. Параллельно не может играть обрабатывать их. Поэтому вряд ли перезапишут эту глобалку
0
26
6 лет назад
Отредактирован 8gabriel8
0
Jack-of-shadow, увидел этот CS в периодическом триггере, где на карте выбиралось много групп, в которых производились действия. Если бы не одна эта строчка в начале триггера, то пришлось бы после работы с каждой группой делать действие Destroy Group, так что никак не намного удобнее.
Steal nerves, как бы посмотреть в Function List могу, но рассматривать и вникать буду очень долго. Просто почти не вижу причин, когда может пригодиться jass, что требуется, то покрывается возможностями GUI, не считая утечек, которые не вызывают забот в кастомных кампаниях, либо очень специфических проблем, типа воспроизведения нестандартно названной анимации, либо сброс уровня сложности кастомной кампании.

Как прочитал по поводу этой строки, она не работает нормально, когда идёт отбор юнитов определённого типа. Отсев производится лишь у первого игрока, потом группа уничтожается.
0
25
6 лет назад
Отредактирован Jack-of-shadow
0
ForGroupBJ
function ForGroupBJ takes group whichGroup, code callback returns nothing
local boolean wantDestroy = bj_wantDestroyGroup
set bj_wantDestroyGroup = false
call ForGroup(whichGroup, callback)
if (wantDestroy) then
call DestroyGroup(whichGroup)
endif
endfunction
Судя по BJ функции, сразу после первого выбора группы bj_wantDestroyGroup станет фолс, и следующая группа не удалица.

Тобишь перед каждой forgroup нада делать CS: set bj_wantDestroyGroup = true, а не один раз в начале триггера.
Принятый ответ
0
26
6 лет назад
0
P. S. И вроде не уничтожает глобальные группы, но тут надо проверить, когда группе нужно назначать переменную, чтобы не назначать её уже уничтоженной группе.
Jack-of-shadow:
и следующая группа не удалица
С самого начала об этом думал, но есть куча ссылок на какой-нибудь helper.net, где об этом нигде не говорится. В любом случае надо проверять.
0
28
6 лет назад
0
8gabriel8:
Но у нас ни разу не видел использования подобного CS.
Даже в картах от близзард этот скрипт используется.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.