TGViewer
L2-SERVERA | Блог о Lineage II L2-SERVERA | Блог о Lineage II @l2servera · 1.85K subscribers
Post #320 341
🔥🔥🔥 Привет, друзья!

Полный разбор эффекта Cancelation, как это работает?

Снять ограниченное количество положительных баффов с цели, с определённым шансом.


➡️ Структура и логика по шагам


1. onStart() — активирует эффект

public boolean onStart()
{
return cancel(getEffector(), getEffected(), this);
}


- При активации эффекта вызывается метод cancel(...), который и занимается снятием эффектов.
- getEffector() — кастующий (L2Character).
- getEffected() — цель (L2Character).
- this — текущий эффект (используется для доступа к параметрам скилла).

2. onActionTime() — у эффекта нет периодического действия


public boolean onActionTime()
{
return false;
}


- Возвращает false, потому что Cancel — моментальный эффект, а не длительный (например, как Poison или Regen).

3. Метод cancel(...) — вся логика отмены баффов

private static boolean cancel(L2Character caster, L2Character target, L2Effect effect)


Этап 1: Проверки

if (!(target instanceof L2PcInstance) || target.isDead())
return false;


- Работает только против игроков (NPC/монстров не касается).

- Цель должна быть жива.

Этап 2: Сбор параметров скилла

final int cancelLvl = effect.getSkill().getMagicLevel();
int count = effect.getSkill().getMaxNegatedEffects(); // максимум снимаемых баффов
double rate = effect.getEffectPower(); // базовый шанс снятия


- cancelLvl — маг. уровень скилла Cancel.

- count — сколько эффектов можно снять (как правило от 1 до 5)

- rate — базовый шанс снятия (в среднем 35-50)

Этап 3: Учет сопротивляемости

final double res = Formulas.calcSkillVulnerability(caster, target, effect.getSkill(), effect.getSkillType());
rate *= res;


- Модификация шанса rate с учётом уязвимости/сопротивляемости цели к Cancel (через резисты, баффы и т.д.).

Этап 4: Два прохода снятия эффектов

if (!eff.getSkill().isDance())
continue;


- На этом этапе Cancel пытается снять обычные положительные эффекты, если остались попытки (count).
- В первый проход денсы/сонги, во второй баффы.

if (eff.getSkill().isDance())
continue;


-На этом этапе Cancel пытается снять обычные положительные эффекты, если остались попытки (count).


➕ Алгоритм расчета шанса снятия одного эффекта

int rate = 2 * (cancelLvl - effect.getSkill().getMagicLevel()); // разница уровней
rate += effect.getPeriod() / 120; // продолжительность эффекта
rate += baseRate;

if (rate < 25) rate = 25;
else if (rate > 75) rate = 75;


int rate = 2 * (cancelLvl - effect.getSkill().getMagicLevel());

- Чем выше уровень Cancel, тем выше шанс.

- Умножается на 2 — чтобы усилить влияние разницы.

- Если Cancel слабее снимаемого эффекта → это даст отрицательное значение.


rate += effect.getPeriod() / 120;

- Чем дольше висит бафф (например, 20 минут), тем выше шанс его снять.

- effect.getPeriod() — длительность эффекта в секундах.

- Делим на 120 (т.е. каждые 2 минуты дают +1 к шансу).



🚩 Вывод:

- Чем выше уровень Cancel по сравнению с уровнем скилла-баффа — тем выше шанс.

- Чем дольше длится эффект — тем выше шанс его снять.

- Есть пределы: шанс будет от 25% до 75%.


Продолжаем, если шанс успешный:

Ограничение шанса: минимум и максимум

if (rate < 25)
rate = 25;
else if (rate > 75)
rate = 75;

return Rnd.get(100) < rate;


Даже если все условия плохие — шанс будет не меньше 25%.

Даже если всё идеально — шанс не больше 75%.


🔖 Финальный расчёт:

return Rnd.get(100) < rate;

- Получаем случайное число от 0 до 99.

- Если оно меньше rate → считается, что успешно снят.



✏️ Пример работы:

- cancelLvl = 12

- Эффект (buff) имеет magicLevel = 10

- Висит уже 10 минут → effect.getPeriod() = 600 сек

- baseRate = 35


Шаги:

rate = 2 * (12 - 10) = 4
rate += 600 / 120 = 5
rate += 35 → всего 44

Значит, шанс снять эффект = 44%.

🖥 Итого, что влияет?

Разница уровней: +2% или -2% за каждый уровень
Длительность эффекта: +1% за каждые 2 минуты
Базовый шанс
Мин/макс: всегда между 25% и 75%
Финальное решение: Rnd.get(100) < rate — успех или нет

Вроде бы ничего не упущено...😰


Новые сервера Lineage 2 ⭐ Блог Lineage 2 ⭐ Телеграм
  • 🔥 6
  • 👍 5
  • ❤ 3
  • ⚡ 2
More from @l2servera
  1. Oct 9, 2026🔥 ZENITH PROJECT 🚀 СТАРТ — 9 ОКТЯБРЯ! Сколько раз ты начинал играть на новом сервере, за…
  2. Oct 8, 2026Всем привет. Собственно на картинке и есть то, о чем мы писали немного выше, именно по это…
  3. Oct 7, 2026🔥 ZENITH PROJECT 🚀 СТАРТ — 9 ОКТЯБРЯ! Сколько раз ты начинал играть на новом сервере, за…
  4. Oct 7, 2026Точить самому или купить уже заточенное? 🛖
  5. Oct 7, 2026Post #1261
  6. Oct 5, 2026Друзья, здравствуйте! Последнюю неделю усиленно работаем над новым направлением в нашем пр…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →