XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
FREEZE_ball
Cataclysm => жара
offline
Опыт: 15,247
Активность:
Юнит вступил в бой
Нужно отловить событие, когда юнит вступает в бой. Т.е., его могут атаковать, применить спелл, просто подойти на указанное расстояние, также вызвать в бой его соседа, и на эти события активировать триггер.
Я уже думал по этому поводу, вот мои идеи, и почему они не осуществимы:

1 - Событие на юнита, получившего урон. Не возможно, т.к. его могут и "сагрить", просто подойдя.
2 - Событие на то, что возле юнита в таком-то радиусе вражеский герой. Было бы хорошо, но - на карте более 400 мобов, будет тормозить. Кроме того, можно "сагрить" моба и через его союзников.
3 - Моя лучшая идея. Постоянная проверка координат моба на отличие от изначальных. Но ведь бой могут начать и со стана!

Теперь прошу помощи у вас, Лорды Джазза ув. джассеры.
Старый 23.07.2009, 19:27
Линкольн
Barg Ent.
offline
Опыт: 4,812
Активность:
Можно попробовать следующие:
1. Б/е обнаружил противника в зоне досягаемости.
Код:
call TriggerRegisterUnitEvent(t, u, EVENT_UNIT_TARGET_IN_RANGE)

Иначе, можно определять ближайшего противника.
Цитата:
Сообщение от Shadow Daemon
» раскрыть
Код:
library GNU

globals
  private group ggx = null
  private real gdx = 0
  private real gdy = 0
  private real gds = 0
  private unit gun = null
  private unit gux = null
endglobals

private function ff takes nothing returns boolean
  local unit u  = GetFilterUnit()
  local real dx = GetWidgetX(u) - gdx
  local real dy = GetWidgetY(u) - gdy
  local real ds = dx * dx + dy * dy
  if ds < gds and gux != u and GetWidgetLife(u) > .405 and not IsUnitInGroup(u, ggx) then
    set gds = ds
    set gun = u
  endif
  set u = null
  return false
endfunction

function GetNearestUnit takes unit u, real maxdist, group g, player owner returns unit
  set gds = maxdist * maxdist
  set gdx = GetWidgetX(u)
  set gdy = GetWidgetY(u)
  set gun = null
  set gux = u
  set ggx = g
  call GroupEnumUnitsInRange(gr, gdx, gdy, maxdist, Filter(function ff))
  return gun
endfunction

endlibrary

Виснуть не должно.
2. Б/е Атакован
Код:
call TriggerRegisterPlayerUnitEvent(t, Player(index), EVENT_PLAYER_UNIT_ATTACKED, null)
Старый 23.07.2009, 20:04
FREEZE_ball
Cataclysm => жара
offline
Опыт: 15,247
Активность:
Цитата:
Сообщение от Линкольна
1. Б/е обнаружил противника в зоне досягаемости.

В том всё дело, что эта "зона досягаемости" на моей карте = 300 ст.ед.. Да и начать бой, опять же, можно со стана, с дальней дистанции и проч..

Цитата:
Сообщение от Линкольна
2. Б/е Атакован

Втрое хуже, чем указанное мною событие получения урона юнитом, т.к.:
а) при этом событии триггер начинается от запуска снаряда (дальняя атака), а не от его столкновения с врагом.
б) невозможно регистрировать заклинания.

FREEZE_ball добавил:
Появилась идея отлавливать получение мобом приказа "attack" (или "smart"?), но тут также проблемы:
а) начать бой можно со стана (под станом я имею ввиду и сон в т.ч.). Внимание, вопрос: будет ли ордер получаться мобом во время стана/сна?
б) моб может и сам начать бой со спелла. К примеру, у меня кобольды всегда начинают бой с "замедления".
Старый 23.07.2009, 20:36
FREEZE_ball
Cataclysm => жара
offline
Опыт: 15,247
Активность:
Ещё идея поставить реагирование на несколько событий сразу, включая перечисленные выше. Но - вопрос - не будет ли это тормозить? К тому же всё равно остаётся проблема - сагривание через атаку соседа.
Старый 24.07.2009, 01:28
ELDAR
НИИ 4А-ВО кафедра SPELLS
offline
Опыт: 8,394
Активность:
Цитата:
Ещё идея поставить реагирование на несколько событий сразу, включая перечисленные выше. Но - вопрос - не будет ли это тормозить?

нет не будет
Старый 24.07.2009, 07:45
FREEZE_ball
Cataclysm => жара
offline
Опыт: 15,247
Активность:
Отлично. Тогда пока попробую так сделать. Тему пока не закрывайте, ещё может понадобиться.

FREEZE_ball добавил:
Код:
call TriggerRegisterUnitEvent(asi, u, EVENT_UNIT_TARGET_IN_RANGE)
call TriggerRegisterUnitEvent(asi, u, EVENT_UNIT_DAMAGED)
call TriggerRegisterUnitEvent(asi, u, EVENT_UNIT_ACQUIRED_TARGET)
call TriggerRegisterUnitEvent(asi, u, EVENT_UNIT_SPELL_CAST)


Юзаю это. Теперь проблема такая: как удалить юнитов из этих эвентов. Мне нужно, чтобы в бой они входили, а после этого триггер уже не регистрировал их вход. Ну не создавать же на каждого свой триггер?
Старый 24.07.2009, 11:08
Ranger21
I love beatiul days XD
offline
Опыт: 13,274
Активность:
FREEZE_ball
Эвенты утекать будут, а так можно было бы использовать ресайкл юнитов(отлавливание смерти и перемещение юнитов в "хранилище" на время до следующего респавна их) и заносить юнитов куда-нибудь, а потом добавлять в этот триггер Condition != твоему добавленному юниту.

После того как юнит ресайклится (Воскрешается) мы удаляем кондишн относящийся к этому юниту(слава богу кондишны можно удалять xD, в отличии от эвентов).

А без ресайкла юнитов это будут утечки, утечки, утечки.... =0

Ггг


Если бы мне это надо было, я бы сделал так, как описал тебе.
Старый 24.07.2009, 11:22
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
На самом деле не вижу проблемы, с регистрацией по триггеру на юнита.
Старый 24.07.2009, 21:36
FREEZE_ball
Cataclysm => жара
offline
Опыт: 15,247
Активность:
Hellfim, да, я тоже её перестал видеть. Теперь всё прекрасно работает и не тормозит. Тему можно и прикрыть.
Старый 25.07.2009, 01:01
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 08:13.