Ты же задавался уже этим вопросом, почему обрабатываются лишь юниты красного игрока, а остальных нет.
Гхм, залез в код, словил рофл от этого. Совсем не ожидал того, что внутри GroupAddGroup тоже будет проверятся этот флаг. Мда, ОЧЕНЬ много ошибок в лазурных башнях и в самих bj. 8gabriel8:
Речь о группе, когда юнитов создают
Тут совершенно верно замечено. Я изначально вёл речь о Pick every unit in group and do actions.
Обработает лишь красного игрока и удалит группу, а у остальных игроков юнитов нужного типа неоткуда будет брать.
Это было проверено на практике или нет?
Потому что по коду я вижу, что всё будет работать верно. Сначала сработает 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.
Для событий "Юнит входит в радиус другого юнита" и "Юнит выходит из радиуса другого юнита" добавить следующий функционал:
native GetRegisteredUnit takes nothing returns unit // возвращает юнита, в радиус которого входят или выходят.
native GetRegisteredRange takes nothing returns real // возвращает расстояние, на которое нужно подойти или отойти для срабатывания.
Добавить функционал для event, в частности возможность удаления события:
Исправить ситуацию с коллизией триггеров при их динамическом удалении и создании, когда при создании нового триггера у него уже есть события, условия и действия. Однако мои тесты показывают, что такая ситуация невозможна на патче 1.26а, но не факт, что мои тесты верны. Больше об этой ситуации тут.
Чтобы сделать обычного юнита героем, достаточно дать ему равкод с прописными (большими) буквами. 8gabriel8:
Тоже такое предполагал сначала, но скрытые юниты не выбираются и триггерно выбор не отлавливается. Аналогично с Москитами не выбрать героя.
Зачем такие сложности, просто модель убираем, в способностях оставляем неяузвимость.
В карте делаем триггер: событие - каждые 0.03 секунды, действия - выбрать всех юнитов в группе (Все юниты типа юнит-пустышка) и сделать дейсвия:
Если Picked Unit выбран своим владельцем то убрать его выделение и выбрать юнита непустышку.
Делаем именно через периодический триггер, потому что события "Юнит выбран" и "Юнит перестают быть выбранным" работают с задержкой.
Но это не работает с выбором всех юнитов определённого типа на карте.
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.
Такого приказа нет.
Можно сделать спел в лавках, который продаёт предмет, а сам предмет сделать невыпадаемым. Выбираешь лавку, используешь спел на предмет, предмет продаётся.
Такого приказа нет.
Он, скорее всего, есть, но его никак нельзя отловить.
а формула какая? integer A это цикл как и integer B
Я тебе сказал формулу. При чём тут циклы? Я просто назвал числа, чтобы было короче писать.
Напишу в твоих буквах.
Result = BaseAs / (1 + AGI * 0.01).
Result -- скорость перезарядки, не путать со скоростью атаки! Скорость атаки величина обратная.
У героя есть базовая скорость перезарядки (число А), все процентные бонусы скорости атаки складываем (число В). Тогда новая скорость перезарядки будет А / (1 + B%).
Ред. PT153
» WarCraft 3 / Проблемы утечек
Мда, ОЧЕНЬ много ошибок в лазурных башнях и в самих bj.
8gabriel8:
Ред. PT153
» WarCraft 3 / Юнит как Герой + его позиция
Условия: Вошедший юнит такой-то.
Действия: Приказать вошедшему юниту такой-то приказ.
Приказ зависит от заклинания.
Ред. PT153
» WarCraft 3 / Проблемы утечек
Потому что по коду я вижу, что всё будет работать верно. Сначала сработает GetUnitsOfTypeIdAll(), и только потом ForGroupBJ(). Их код я кинул выше.
Если сконвертировать, то будет следующее.
» WarCraft 3 / Юнит как Герой + его позиция
Ред. PT153
» Мир безумного / WarCraft III Reforged - WE (что хотите увидеть?)
Предлагаю
Ред. PT153
» WarCraft 3 / Юнит как Герой + его позиция
» WarCraft 3 / Юнит как Герой + его позиция
8gabriel8:
В карте делаем триггер: событие - каждые 0.03 секунды, действия - выбрать всех юнитов в группе (Все юниты типа юнит-пустышка) и сделать дейсвия:
Если Picked Unit выбран своим владельцем то убрать его выделение и выбрать юнита непустышку.
Делаем именно через периодический триггер, потому что события "Юнит выбран" и "Юнит перестают быть выбранным" работают с задержкой.
Ред. PT153
» WarCraft 3 / Проблемы утечек
» WarCraft 3 / Проблемы утечек
» WarCraft 3 / Как запретить выкладывать предмет на землю или отдавать др юниту
Юзаем спел на юнита и его самый первый предмет продаётся. Юнит должен быть рядом с магазином и быть повёрнутым прямо к нему.
» WarCraft 3 / Как запретить выкладывать предмет на землю или отдавать др юниту
Ред. PT153
» WarCraft 3 / Как запретить выкладывать предмет на землю или отдавать др юниту
Можно сделать спел в лавках, который продаёт предмет, а сам предмет сделать невыпадаемым. Выбираешь лавку, используешь спел на предмет, предмет продаётся. Он, скорее всего, есть, но его никак нельзя отловить.
» RenderEdge / [RenderEdge] Графическая модификация для WarCraft III
» XGM Конкурсы / Warcraft III Mini-Game Contest-2018
» WarCraft 3 / мини карта
» WarCraft 3 / TerrainId
» WarCraft 3 / Поворот даммика
» WarCraft 3 / Проверка Скорости боя героя
Result = BaseAs / (1 + AGI * 0.01).
Result -- скорость перезарядки, не путать со скоростью атаки! Скорость атаки величина обратная.
» WarCraft 3 / Про Тайники
» WarCraft 3 / Юнит не сохраняется в структе
ApaxHoqpuJL:
Ред. PT153
» WarCraft 3 / Помогите решить проблему!!
» WarCraft 3 / Проверка Скорости боя героя
» WarCraft 3 / Почему число увеличивается !?
» WarCraft 3 / Почему число увеличивается !?