28

» WarCraft 3 / Проблемы утечек

Ты же задавался уже этим вопросом, почему обрабатываются лишь юниты красного игрока, а остальных нет.
Гхм, залез в код, словил рофл от этого. Совсем не ожидал того, что внутри GroupAddGroup тоже будет проверятся этот флаг.
Мда, ОЧЕНЬ много ошибок в лазурных башнях и в самих bj.
8gabriel8:
Речь о группе, когда юнитов создают
Тут совершенно верно замечено. Я изначально вёл речь о Pick every unit in group and do actions.
28

» WarCraft 3 / Юнит как Герой + его позиция

есть у меня одна мысль, может кто подсказать, как заставить героя использовать способность автоматически, в момент его тренировки/воскрешения?
Событие: юнит входит в карту.
Условия: Вошедший юнит такой-то.
Действия: Приказать вошедшему юниту такой-то приказ.

Для воскрешения аналогичный триггер, а может даже и этого хватит, надо проверить.
Приказ зависит от заклинания.
28

» WarCraft 3 / Проблемы утечек

Обработает лишь красного игрока и удалит группу, а у остальных игроков юнитов нужного типа неоткуда будет брать.
Это было проверено на практике или нет?
Потому что по коду я вижу, что всё будет работать верно. Сначала сработает GetUnitsOfTypeIdAll(), и только потом ForGroupBJ(). Их код я кинул выше.
Если сконвертировать, то будет следующее.
call ForGroupBJ( GetUnitsOfTypeIdAll('hfoo'), function Trig_Untitled_Trigger_001_Func001A )
Это сработает так, как я сказал выше, потому что в JASS, как и во многих языках, передача по значению.

Так это что получается, нужно сначала присвоить глобальную переменную локальной группе, чтобы потом её удалить?
Нет, наоборот. Делаем переменную типа группа, в неё записываем нужную группу, после для неё вызываем Pick every unit in group and do actions, а затем удаляем. Это 3 строчки. Но зачем это, когда можно перед Pick every unit in group and do actions просто написать set bj_wantDestroyGroup = true с таким же результатом? И займет это 2 строчки.
Но это не работает с выбором всех юнитов определённого типа на карте.
Как я уже описал выше, работает, для практической проверки стоит посмотреть карту Лазурные башни, триггер Tech\Zenith Refresh.
28

» WarCraft 3 / Юнит как Герой + его позиция

Если в карте нет героев, то можно заменить некоторые вещи в интерфейсе, а самого юнита сделать героем.
У меня в карте нет героев, потому реализовал так. Если такой способ подойдёт, могу скинуть необходимые параметры и текстуры.
28

» Мир безумного / WarCraft III Reforged - WE (что хотите увидеть?)

Предлагаю

"Юнит выходит из ренджа другого юнита"
  • Пожелание выше.
  • Для событий "Юнит входит в радиус другого юнита" и "Юнит выходит из радиуса другого юнита" добавить следующий функционал:
native GetRegisteredUnit takes nothing returns unit  // возвращает юнита, в радиус которого входят или выходят.
native GetRegisteredRange takes nothing returns real  // возвращает расстояние, на которое нужно подойти или отойти для срабатывания.
  • Добавить функционал для event, в частности возможность удаления события:
native TriggerUnregisterEvent takes trigger whichTrigger, event whichEvent returns nothing  
  • Исправить ситуацию с коллизией триггеров при их динамическом удалении и создании, когда при создании нового триггера у него уже есть события, условия и действия. Однако мои тесты показывают, что такая ситуация невозможна на патче 1.26а, но не факт, что мои тесты верны. Больше об этой ситуации тут.
28

» WarCraft 3 / Юнит как Герой + его позиция

Если в карте нет героев, то можно заменить некоторые вещи в интерфейсе, а самого юнита сделать героем.

8gabriel8:
Обязательно каждые 0.03 секунды группу выбирать, может просто конкретного юнита?
Если на карте есть несколько игроков, и у каждого есть юнит-пустышка, то группа нужна для их перебора. Если юнит один, то группа не нужна.
28

» WarCraft 3 / Юнит как Герой + его позиция

Чтобы сделать обычного юнита героем, достаточно дать ему равкод с прописными (большими) буквами.
8gabriel8:
Тоже такое предполагал сначала, но скрытые юниты не выбираются и триггерно выбор не отлавливается. Аналогично с Москитами не выбрать героя.
Зачем такие сложности, просто модель убираем, в способностях оставляем неяузвимость.
В карте делаем триггер: событие - каждые 0.03 секунды, действия - выбрать всех юнитов в группе (Все юниты типа юнит-пустышка) и сделать дейсвия:
Если Picked Unit выбран своим владельцем то убрать его выделение и выбрать юнита непустышку.

Делаем именно через периодический триггер, потому что события "Юнит выбран" и "Юнит перестают быть выбранным" работают с задержкой.
28

» WarCraft 3 / Проблемы утечек

Но это не работает с выбором всех юнитов определённого типа на карте.
Pick every unit in group and do actions вызывает ForGroupBJ(), в которой при bj_wantDestroyGroup == true группа удаляется.
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
Не работает как раз-таки способ с удалением GetLastCreatedGroup(), потому что все BJ функции групп используют локалки.
Функции
function GetUnitsInRangeOfLocMatching takes real radius, location whichLocation, boolexpr filter returns group
    local group g = CreateGroup()
    call GroupEnumUnitsInRangeOfLoc(g, whichLocation, radius, filter)
    call DestroyBoolExpr(filter)
    return g
endfunction

function GetUnitsInRectMatching takes rect r, boolexpr filter returns group
    local group g = CreateGroup()
    call GroupEnumUnitsInRect(g, r, filter)
    call DestroyBoolExpr(filter)
    return g
endfunction

function GetUnitsInRectOfPlayer takes rect r, player whichPlayer returns group
    local group g = CreateGroup()
    set bj_groupEnumOwningPlayer = whichPlayer
    call GroupEnumUnitsInRect(g, r, filterGetUnitsInRectOfPlayer)
    return g
endfunction

function GetUnitsOfPlayerAndTypeId takes player whichPlayer, integer unitid returns group
    local group g = CreateGroup()
    set bj_groupEnumTypeId = unitid
    call GroupEnumUnitsOfPlayer(g, whichPlayer, filterGetUnitsOfPlayerAndTypeId)
    return g
endfunction

function GetUnitsOfPlayerMatching takes player whichPlayer, boolexpr filter returns group
    local group g = CreateGroup()
    call GroupEnumUnitsOfPlayer(g, whichPlayer, filter)
    call DestroyBoolExpr(filter)
    return g
endfunction

function GetUnitsOfTypeIdAll takes integer unitid returns group
    local group   result = CreateGroup()
    local group   g      = CreateGroup()
    local integer index

    set index = 0
    loop
        set bj_groupEnumTypeId = unitid
        call GroupClear(g)
        call GroupEnumUnitsOfPlayer(g, Player(index), filterGetUnitsOfTypeIdAll)
        call GroupAddGroup(g, result)

        set index = index + 1
        exitwhen index == bj_MAX_PLAYER_SLOTS
    endloop
    call DestroyGroup(g)

    return result
endfunction

function GetUnitsSelectedAll takes player whichPlayer returns group
    local group g = CreateGroup()
    call SyncSelections()
    call GroupEnumUnitsSelected(g, whichPlayer, null)
    return g
endfunction
Так что самый верный способ будет через присвоение.
set bj_wantDestroyGroup = true

Локации удалять через RemoveLocation(), а группы через set bj_wantDestroyGroup = true.
28

» WarCraft 3 / Проблемы утечек

По поводу групп: можно не удалять группу через Destroy Group, а перед вызовом (выбрать всех юнитов в группе и сделать то-то) написать в Custom Script
set bj_wantDestroyGroup = true
Тогда группа сама удалится.

Счётчикам особо доверять не стоит, но если что-то постоянно утекает, то они это заметят.
28

» WarCraft 3 / Как запретить выкладывать предмет на землю или отдавать др юниту

Я сделал вот что.
Юзаем спел на юнита и его самый первый предмет продаётся. Юнит должен быть рядом с магазином и быть повёрнутым прямо к нему.
Загруженные файлы
28

» WarCraft 3 / Как запретить выкладывать предмет на землю или отдавать др юниту

Разве нужно спел для этого делать, а не просто продавать невыпадаемые предметы?
А как ты собираешься продать предмет, который нельзя выкинуть?
28

» WarCraft 3 / Как запретить выкладывать предмет на землю или отдавать др юниту

Такого приказа нет.
Можно сделать спел в лавках, который продаёт предмет, а сам предмет сделать невыпадаемым. Выбираешь лавку, используешь спел на предмет, предмет продаётся.
Такого приказа нет.
Он, скорее всего, есть, но его никак нельзя отловить.
28

» RenderEdge / [RenderEdge] Графическая модификация для WarCraft III

что мне .exe файл разблокировать надо чтобы запустить...
Так делает Windows 10 для всех скачанных .ехе.
28

» WarCraft 3 / мини карта

Там даже юниты появляются даже если я поменяю их текстуру
Можно всем юнитам скрыть обозначение на миникарте.
28

» WarCraft 3 / TerrainId

потом перезапустить редактор
Достаточно закрыть и открыть карту вновь.
28

» WarCraft 3 / Проверка Скорости боя героя

Принятый ответ
Name Legion:
а формула какая? integer A это цикл как и integer B
Я тебе сказал формулу. При чём тут циклы? Я просто назвал числа, чтобы было короче писать.

Напишу в твоих буквах.
Result = BaseAs / (1 + AGI * 0.01).
Result -- скорость перезарядки, не путать со скоростью атаки! Скорость атаки величина обратная.
28

» WarCraft 3 / Про Тайники

Так ты открой карту кампании и посмотри, как это сделано, комментарии там есть.
28

» WarCraft 3 / Юнит не сохраняется в структе

Принятый ответ
зачем внешние очишаеш структуру?
Порой это нужно.

Замени GetTriggerUnit() на GetSpellAbilityUnit().
ApaxHoqpuJL:
call SetUnitAnimationReverseFollowed(u, 3, 1, 1, true, FollowUpFunc.AnimationTimerFollowup, animData)
А это что такое? Что за FollowUpFunc.AnimationTimerFollowup?
28

» WarCraft 3 / Проверка Скорости боя героя

У героя есть базовая скорость перезарядки (число А), все процентные бонусы скорости атаки складываем (число В). Тогда новая скорость перезарядки будет А / (1 + B%).
28

» WarCraft 3 / Почему число увеличивается !?

Значит, подчищать эти объекты, что бы хендл не увеличивался возможности нет ?
Они создаются внутри движка игры, их никак нельзя достать без мемхака.
28

» WarCraft 3 / Почему число увеличивается !?

Принятый ответ
Ну так-то при касте создаются некоторые объекты. Если поставить конечную длительность спелу, то через несколько активаций хендл опять упадёт в 92.