Доброе времени суток!
Имеется моб, под контролем пустого игрока. Когда в его Asquisition Range заходит враг, моб идет его бить. Можно ли отловить это событие? Я попробовал отследить номер приказа, который он выполняет в этом момент (до того как моб дошел до врага и ударил), но
I2S(order) + " " + OrderId2String(order) выдает 0. И очень редко, при "загадочных" обстоятельствах, удается получить smart.
P.S. Переодически проверять наличие врагов в радиусе моба и триггерно отдавать приказ - хотелось бы избежать.

Есть же события на отлов обнаружения, например Юнит обнаружил врага в зоне досягаемости. В случае с конкретным мобом сгодятся и они (просто они требуют в качестве аргумента определенного юнита).
В случае со случайным или любым мобом сложнее, но есть событие Юнит атакован на отлов начала атаки.
native TriggerRegisterUnitEvent (trigger whichTrigger, unit whichUnit, unitevent whichEvent) returns event
constant unitevent EVENT_UNIT_ACQUIRED_TARGET
constant unitevent EVENT_UNIT_DETECTED
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
30
В случае со случайным или любым мобом сложнее
Не так уже и сложнее. Вешаешь в один триггер события на каждого юнита и наслаждаешься. Как собственно с отловом урона на ваниле делают.
23
nazarpunk, Ну да, наподобие этой системы. Собственно вся сложность в большом количестве событий. И ещё утечки. В этой системе события не удаляются после смерти юнита, и остаются висеть в памяти.
30
В этой системе события не удаляются после смерти юнита
Событие это часть юнита, оно удаляется вместе с юнитом.
23
nazarpunk, А как это проверить? Проверял ли кто? Событие перестанет работать после смерти - это да, а вот удалится ли? Оно ведь создаётся как отдельный handle
30
А как это проверить?
native TriggerRegisterUnitEvent takes trigger whichTrigger, unit whichUnit, unitevent whichEvent returns event
Проверить, жив ли event после разложения юнита.
Тупо посчитать хэндлы через WFE.
  • Спамим 100 юниов, считаем.
  • Добавляем их в триггер, считаем.
  • Убиваем этих юнитов, ждём разложения, считаем.
Проверял ли кто?
Вроди проверяли, но это неточно. Зато всегда есть возможность проверить самому и пополнить список Jass MythBusters.
23
nazarpunk, Провел небольшое исследование. Вот тестовая карта. Код вроде корректный. По итогу получается какая то фигня: как будто хэндлы и юнита и события остаются...
Загруженные файлы
30
EugeAl, у меня опять не варкрафта. Так что я выступаю в роли теоретика.
Если хэндлы юнита остаются, то значит игра их не удалила. Соответственно и событие никуда не должно исчезнуть.
23
nazarpunk, Жаль конечно, что варика нет. Но код можно в блокноте открыть, для проверки корректности методологии. Можешь глянуть его?
Если Переменная типа unit или handle не обнулена, при этом после смерти юнита и даже принудительного удаления(!) GetHandleId(Переменная) не выдает 0, причём после проверки условием Переменная != null, это говорит о том, что handle или unit существуют в игре? Или это неверная проверка данных?
8
Если Переменная типа unit или handle не обнулена, при этом после смерти юнита и даже принудительного удаления(!) GetHandleId(Переменная) не выдает 0, причём после проверки условием Переменная != null, это говорит о том, что handle или unit существуют в игре? Или это неверная проверка данных?
По разному. Но для хэндла не требуется наличие юнита. Т.е если у вас есть ненулевой хэндл с типом юнит, но юнит был удален - есть все шансы что юнита в игре уже не существует.
Более того, далеко не все объекты, созданные в игре будут иметь хэндлы. Например если создан предмет, далеко не факт, что у него будет хэндл вообще, до того, как вы к нему обратитесь.
Собственно, проверка на то, остался ли за хэндлом юнит - GetUnitTypeId(h)!=null
Еще удаленные юниты автоматически выходят из всех групп, например.
30
Или это неверная проверка данных?
По этому принципу старый Handle Counter работал с ощутимой погрешностью. Посему я и написал, что хэндлы нужно ловить с помощью WFE, который берёт значения из движка игры.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.