В функции
PositionUtils как раз и «зашиты» углы, по которым движок решает: ты спереди, сбоку или сзади цели. Это напрямую влияет на применяемые множители урона (×1.2 со спины, ×1.1 сбоку), потому что ваш расчёт урона вызывает PositionUtils.getDirectionTo(...).🟠 Константы:
*
FRONT_MAX_ANGLE = 100 → фронт считается, если ты в секторе ±100° относительно направления взгляда цели (итого 200° спереди).*
BACK_MAX_ANGLE = 40 → «со спины» считается, если ты в секторе ±40° относительно «затылка» цели (угол её взгляда + 180°), итого 80° сзади.* Остаток от 360° уходит в «бока»: 360 − (200 + 80) = 80° на бока суммарно, то есть примерно по 40° на каждый бок.
🟠Логика определения стороны:
public static TargetDirection getDirectionTo(Creature target, Creature attacker) {
if (isBehind(target, attacker)) return BEHIND; // сначала проверяют «со спины» (±40°)
if (isInFrontOf(target, attacker)) return FRONT; // потом фронт (±100°)
return SIDE; // иначе — бок
}
🟠Как считают угол:
*
calculateAngleFrom(A,B) даёт абсолютный азимут от A к B в градусах \[0..360).*
convertHeadingToDegree(heading) переводит «клиентский» heading (0..65535) в градусы делителем 182.044444444 (это 65536/360).* В
isInFrontOf и isBehind берут разницу между «углом взгляда цели» и «азимутом на атакующего», нормализуют её через ±360 и сверяют с порогами (100° для фронта, 40° для спины).ℹ️ Итог по секторам (для ваших множителей урона)
Спина (BEHIND, ×1.2 урона)
Ты должен находиться в «конусе» ±40° относительно линии, противоположной взгляду цели (вектор назад). Узкий «коридор», попадать сложнее, но бонус самый жирный.
* Бок (SIDE, ×1.1 урона)
Всё, что не попало ни в спину (±40°), ни во фронт (±100°), — это «бок». В сумме 80° на оба бока, т.е. около ±40° относительно границы между фронтом и спиной с каждой стороны.
* Фронт (FRONT, ×1.0)
Широкий сектор ±100° по направлению взгляда цели (всего 200°). Проще всего «поймать», но без бонуса.
✏️ Практические выводы и советы
🟢 Чтобы стабильно ловить ×1.2, танк должен держать моба «лицом на себя», а дамагеры — стоять в узком коридоре за спиной (±40°). Любой поворот цели — и множитель пропадёт.
🟢 ×1.1 сбоку проще получить, чем «спину», но сектор всё равно узкий. Это награда за позиционирование, а не «автоматический» бонус.
🟢 Для blow/Backstab позиция критична: кроме внутренних правил самих скиллов, сверху ещё применится ваш позиционный множитель (если попадаешь в сектор).
Ну как вышло? Не сильно большая портянка? 😨
🤦♂ Новые сервера Lineage 2 😎 Телеграм
