Массовые умения: сколько целей они бьют (affect_scope и affect_limit)
Почему «Туча Стрел» иногда задевает шесть монстров, а иногда восемнадцать? Почему массовое умение по монстру не трогает белых игроков рядом, а по игроку во флаге — бьёт всех вокруг? Всё это решают два параметра умения: форма зоны (affect_scope) и лимит целей (affect_limit). Разберём, как они работают, на примере умений лучника и мага.
Механика сбора целей перенесена с кода официального сервера и проверена на оффе: лимит, «+1 монстр», правила для игроков и форма веера совпадают.
Лимит целей: что значат два числа
У массовых умений лимит записан двумя числами, например
affect_limit = 5;12:- Первое число — гарантированная часть лимита.
- Второе число — случайная добавка от 0 до этого числа включительно. Бросается заново при каждом применении.
Для
5;12 лимит каждый раз получается от 5 до 17.Монстров умение задевает на одного больше лимита — так устроено на официальном сервере. Для
5;12 это от 6 до 18 монстров за применение. Если умение бьёт вокруг цели, веером или полосой, сама цель добавляется сверх этого числа.Игроков и их питомцев лимит не ограничивает. Умение задевает всех подходящих игроков в зоне, сколько бы их ни было. Исключение — редкие умения с третьим числом (например
8;0;1): у них игроки тоже идут в счёт лимита.| affect_limit | Лимит | Монстров в зоне | Игроков в зоне |
|---|---|---|---|
| 5;12 | 5–17 | 6–18 | все |
| 5;5 | 5–10 | 6–11 | все |
| 10;0 | 10 | 11 | все |
| 8;0;1 | 8 | 9 вместе с игроками | в счёт лимита |
Если лимита у умения нет совсем, оно бьёт всех в зоне.
Форма зоны: где именно бьёт умение
| Форма | Где бьёт | Основная цель |
|---|---|---|
| single | Только цель | — |
| range | Круг вокруг цели (или выбранной точки на земле) | Сверх лимита |
| point_blank | Круг вокруг себя (или вокруг цели) | Не задевается |
| fan | Веер перед собой в сторону цели | Сверх лимита |
| fan_pb | Веер перед собой | Не задевается |
| square | Прямоугольник (полоса) перед собой в сторону цели | Сверх лимита |
| square_pb | Прямоугольник перед собой | Не задевается |
| ring_range | Кольцо вокруг точки: внутри кольца не бьёт | — |
| range_sort_by_hp | Круг вокруг цели, цели отбираются по HP | Сверх лимита |
| range_sort_by_dist | Ближайшие к цели, ровно столько, сколько лимит | Входит в лимит |
| party, pledge | Группа / клан в радиусе (баффы, лечение) | — |
Размеры зоны задают ещё два параметра:
affect_range— радиус круга (range, point_blank, party, pledge).fan_range— для веера и прямоугольника: поворот, дальность и угол веера (для прямоугольника — ширина полосы).
Умения на группу и клан (party, pledge) работают иначе: у них нет лимита, им не мешают стены, и они задевают только своих.
Умения по земле (target_type = ground)
Некоторые массовые умения применяются не на цель, а на точку на земле: зажмите Shift и кликните по месту, куда хотите ударить.
- Основной цели нет — зона строится вокруг выбранной точки.
- Все монстры в зоне идут в счёт лимита: никто не добавляется «сверх» него. Для
5;12это от 6 до 18 монстров. - Из игроков задеваются все, кого можно атаковать. Если вы PK — только другие PK.
- Видимость проверяется от выбранной точки, а не от персонажа (подробнее — в разделе про стены ниже).
Примеры: умения лучника
Туча Стрел (Multiple Arrow) — веер от лучника в сторону цели: дальность 900, угол 90°,
affect_limit = 5;12.- Бьёт всех в секторе перед лучником — по 45° влево и вправо от направления на цель, на 900 вперёд.
- Цель задевается в любом случае, сверх лимита; монстров в секторе — от 6 до 18.
- Цель, стоящую выше вашей головы (на уступе, на возвышении), веер не заденет.
- Удобно, когда монстры бегут на вас: они собираются перед лучником, и веер накрывает всех сразу.
Проливной Дождь Стрел (Heavy Arrow Rain) — круг радиусом 200 вокруг цели,
affect_limit = 5;12.- Задевает саму цель и от 6 до 18 монстров вокруг неё — каждый выстрел по-разному.
- Центр круга — цель, а не лучник: монстры дальше 200 от цели не попадут, даже если стоят рядом с вами.
- Лучше всего работает по плотной пачке: выбирайте целью монстра в середине толпы.
Примеры: умения мага
Вихревое Разрушение (Updraft Destruction) — круг радиусом 200 вокруг цели,
affect_limit = 5;12.- Работает так же, как Проливной Дождь Стрел: цель плюс от 6 до 18 монстров в радиусе 200 от неё.
- Если монстры стоят дальше 200 от цели, они не попадут, даже если стоят рядом с вами.
Тайный Удар Кометы (Arcane Comet Strike) — прямоугольник от мага в сторону цели: длина 1100, ширина 100,
affect_limit = 5;12.- Бьёт полосой: все, кто стоит на линии от мага в сторону цели на 1100 вперёд и не дальше 50 в стороны от неё.
- Цель задевается в любом случае, сверх лимита; монстров на линии — от 6 до 18.
- Выгодно, когда монстры тянутся за вами «паровозом»: развернитесь к ним, и полоса заденет всю цепочку.
| Умение | Форма | Размер | Монстров |
|---|---|---|---|
| Туча Стрел | Веер от лучника | 900, угол 90° | цель + 6–18 |
| Проливной Дождь Стрел | Круг вокруг цели | радиус 200 | цель + 6–18 |
| Вихревое Разрушение | Круг вокруг цели | радиус 200 | цель + 6–18 |
| Тайный Удар Кометы | Полоса от мага | 1100 × 100 | цель + 6–18 |
Кого из игроков задевает массовое умение
Здесь решает основная цель, а не только форма. Правила действуют вне поля битвы:
- Бьёте монстра — из игроков в зоне задеваются только PK. Белые игроки и игроки во флаге рядом с монстром не пострадают.
- Бьёте PK — из игроков задеваются тоже только PK.
- Бьёте игрока во флаге или белого игрока — задеваются все игроки в зоне, которых умение может атаковать.
- Массовое умение вокруг себя в мирной зоне — игроков не задевает вообще.
- На поле битвы этих ограничений нет.
Кого именно умение считает целью — врагов, союзников, мёртвых — задаёт отдельный параметр (affect_object). Атакующее умение не бьёт членов своей группы и клана, лечащее не лечит врагов.
Пример: Проливной Дождь Стрел по игроку во флаге посреди толпы заденет всех атакуемых игроков в радиусе 200 от него — лимит на игроков не распространяется. То же умение по монстру в той же толпе заденет из игроков только PK.
Что ещё мешает попасть: стены и видимость
Умение задевает только тех, кого видно из центра зоны. Цель за стеной, скалой или колонной не попадёт, даже если она внутри круга или веера.
Важно, откуда проверяется видимость — не всегда от вас:
| Форма | Видимость проверяется от |
|---|---|
| Круг вокруг цели (range) | основной цели |
| Круг вокруг себя (point_blank) | персонажа |
| Веер, полоса (fan, square) | персонажа |
| Умение по земле (ground) | выбранной точки |
Что это значит на практике:
- Проливной Дождь Стрел или Вихревое Разрушение по монстру у угла заденут тех, кого видно от этого монстра — даже если вам из-за угла их не видно. И наоборот: монстр за колонной рядом с целью не попадёт, хотя вы его прекрасно видите.
- Туча Стрел и Тайный Удар Кометы бьют только тех, кого видно от вас: в узком коридоре или за дверным проёмом часть монстров останется вне удара.
- Высота тоже важна: цель, которая стоит намного выше или ниже (на уступе, на лестнице), может не попасть в зону. Например, цель выше вашей головы веер не задевает.
- Если в зоне больше монстров, чем лимит, умение задевает первых найденных, а не ближайших и не самых раненых (кроме форм с сортировкой).
Цели собирает функция
Фильтр игроков —
У нас механика сверена с кодом официального сервера и работает так же. Единственное отличие — порядок обхода зоны: когда монстров больше лимита, у нас и на оффе могут быть задеты разные монстры из толпы, но их количество одинаковое.
CSkillAction2::GatherSkillTarget. Упрощённо:
Code:
лимит = первое + целое(случайное[0..1) × (второе + 1))
обход существ в форме зоны (основная цель и сам персонаж пропускаются):
игрок / питомец:
вне поля битвы — фильтр по основной цели:
цель монстр или PK → только PK
AoE вокруг себя в мирной зоне → никого
в счёт лимита не идёт (если нет третьего числа)
монстр:
добавляется, пока счётчик <= лимит → до лимит + 1
проверка стен (CGeoData::CanSee)
видимость — от центра зоны: цель (range), персонаж (point_blank, fan, square), точка (ground)
range, fan, square, range_sort_by_hp → основная цель добавляется в конец, вне лимита
range_sort_by_hp → сортировка по HP, обрезка до лимит + 1
range_sort_by_dist → сортировка по дистанции, обрезка ровно до лимита
Фильтр игроков —
AreaBasedRule::RangeTargetOfSkill, добавление с проверкой лимита и стен — CCreature::PushCreatureAfterCheckRangeAndCanSee.У нас механика сверена с кодом официального сервера и работает так же. Единственное отличие — порядок обхода зоны: когда монстров больше лимита, у нас и на оффе могут быть задеты разные монстры из толпы, но их количество одинаковое.
Last edited: