CloudTotems — тотем, который не заканчивается после первого спасения

Ванильный тотем воскрешения — расходник на один раз. Сработал, исчез, забыт. CloudTotems ломает это правило: тотем держит заряды и переживает не одно спасение, а несколько подряд. И не просто оставляет тебя стоять на пол-сердца посреди толпы — у каждого типа тотема своя способность, которая срабатывает в момент спасения. Волна отброса, взрыв на месте смерти без вреда себе, телепорт подальше от опасности, армия призванных мобов, полное исцеление, зеркальные шипы или банальная, но безотказная неуязвимость на несколько секунд. Один предмет в левой руке — десять разных сценариев «что будет, если тебя убьют».

Плагин ничего не выдумывает поверх ванильной механики: тот же материал предмета, тот же слот, тот же принцип «умер бы — не умер». Но за этим фасадом — точная система приоритетов обработки урона, метки владельца через PersistentDataContainer и десять полностью настраиваемых способностей, где каждое число (радиус, секунда, уровень эффекта, количество мобов) — строка в config.yml, а не константа в коде.

Десять тотемов — десять разных ответов на один и тот же вопрос: «что делать, когда тебя чуть не убили».

Что это и как работает

Внешне тотем CloudTotems — тот же предмет TOTEM_OF_UNDYING, что и в ванили: то же название материала, тот же звук (ITEM_TOTEM_USE) и та же частица (TOTEM_RESURRECT) при срабатывании. Разница — в метаданных предмета. У каждого тотема есть тип, закодированный в PersistentDataContainer (ключи totem_type и totem_charges в неймспейсе totems), собственное цветное имя и счётчик зарядов, который виден прямо в подсказке предмета и уменьшается на единицу с каждым спасением. Заряды и тип хранятся на самом предмете, а не в отдельной базе — поэтому переживают падение на землю, сундук, смерть без использования тотема и перезапуск сервера без каких-либо потерь.

Держать тотем нужно именно в левой руке (offhand) — плагин проверяет только этот слот, в основной руке тотем не сработает никогда. Срабатывает он не от любого урона, а только от смертельного: плагин сравнивает финальный урон удара (уже после брони и зачарований) с текущим здоровьем игрока, и если удар меньше — тотем промолчит, заряд останется цел, событие идёт своим чередом.

Порядок обработки удара

Слушатель урона висит на приоритете HIGHEST и разбирает каждый удар по игроку в строгом порядке — это не деталь для галочки, порядок реально меняет исход:

  • Благословение. Если на игроке активно окно неуязвимости — урон отменяется целиком и сразу, без каких-либо дальнейших проверок. Даже если удар смертельный, а в офф-хенде лежит тотем — заряд не тратится: событие гасится раньше, чем плагин успевает заглянуть в левую руку.
  • Свой призванный моб. Урон от существа, помеченного как призванное этим же игроком (тотем Призыва), отменяется безусловно — независимо от здоровья, благословения и всего остального.
  • Шипы. Если у игрока активно окно шипов — урон атакующему зеркалится в том же объёме. Сам игрок при этом урон всё равно получает, ничего не блокируется — это не щит, а размен.
  • Смертельный урон + тотем в офф-хенде. Только если предыдущие три пункта не сработали и удар всё ещё способен убить — начинается спасение.

Спасение: заряд, здоровье, эффекты

При спасении плагин обнуляет урон, списывает один заряд с предмета в офф-хенде (если заряд был последним — тотем исчезает из инвентаря сам), выставляет здоровье и тушит игрока, если он горел. Здоровье после спасения считается по формуле: Math.max(0.5, Math.min(revive-hp, макс. здоровье игрока)). На практике это значит: значение из конфига (по умолчанию 1.0, то есть пол-сердца — как у ванильного тотема) не даст здоровью превысить максимум игрока сверху и не опустит его ниже 0.5 HP снизу, даже если в конфиге по ошибке стоит 0 или отрицательное число. Мгновенная повторная смерть технически исключена.

Способность запускается не в тот же тик, а на следующий — отдельной задачей планировщика. Сделано специально, чтобы вызов способности (телепорт, взрыв, призыв мобов) не пересекался с ещё не до конца обработанным событием урона.

Десять типов тотемов

Радиусы у способностей (Волна, Слепота, Призыв) — это кубическая область вокруг игрока по осям X/Y/Z, а не идеальная сфера; на практике разница заметна только у самой кромки зоны. Уровень эффектов в конфиге (например, speed-level: 2) — это ровно тот уровень, который увидит игрок на экране (II), пересчёт в амплификатор плагин берёт на себя.

Тотем Силы — buff

Три положительных эффекта разом на 30 секунд (abilities.buff.duration-seconds): Скорость II (speed-level: 2), Прыгучесть III (jump-level: 3), Сила I (strength-level: 1). Все три включаются одним пакетом и держатся ровно полминуты вне зависимости от того, чем именно чуть не убили игрока.

Тотем Волны — shockwave

Отбрасывает всех живых существ в области 8 блоков (radius: 8.0) от игрока — кроме самого игрока. Направление отброса считается от игрока к цели, сила — 2.5 (power), плюс фиксированный вертикальный подкид 0.6 сверху вне зависимости от силы — так толпа не просто разлетается по горизонтали, а ещё и подпрыгивает. Если враг стоит вплотную впритык (нулевой вектор направления) — отброс уходит строго вверх.

Тотем Телепорта — teleport

Переносит в случайную точку в радиусе 50 блоков (radius: 50) — X и Z считаются независимо друг от друга, каждый в диапазоне −50…+50, поэтому по прямой линии от точки смерти игрока иногда может унести и на все 70 блоков по диагонали. Высота точки приземления берётся по фактическому рельефу (самый высокий блок в столбце +1) — игрок гарантированно оказывается на поверхности, а не зависает в воздухе и не застревает в породе. Высота падения перед телепортом обнуляется, так что сам перенос урона не наносит.

Тотем Детонации — detonation

Взрыв прямо на месте спасения силой 4.0 (power, в конфиге отмечена как «уровень крипера»), по умолчанию ломает блоки (break-blocks: true) и не поджигает (set-fire: false). Хозяину взрыв не вредит: плагин на 2 игровых тика (0.1 секунды) делает игрока неуязвимым прямо перед вызовом взрыва и сразу же возвращает прежний статус неуязвимости — защита рассчитана именно на собственный взрыв, а не постоянная броня.

Тотем Благословения — blessing

Открывает окно полной неуязвимости на 5 секунд (abilities.blessing.seconds). Это не снижение урона — это отмена события урона целиком, от любого источника, на самом раннем этапе обработки. Побочный эффект: все 5 секунд любые смертельные удары вообще не доходят до проверки «есть ли тотем в офф-хенде», а значит не тратят заряды ни одного тотема, пока держится это окно.

Тотем Небесной Кары — heavenly_wrath

Подбрасывает игрока строго вверх на 55 блоков (height) от места спасения и сразу накладывает Медленное падение I на 15 секунд (slow-fall-seconds). Высота падения перед телепортом сбрасывается в ноль, так что сам подброс не идёт в счёт последующего урона от падения — а 15 секунд плавного спуска обычно с запасом хватает, чтобы спокойно опуститься на землю.

Тотем Призыва — summoner

Призывает от 10 до 15 мобов (count-min / count-max, число каждый раз случайное в этом диапазоне) в области 5 блоков (radius) вокруг игрока, из набора ZOMBIE, SKELETON, HUSK, CREEPER (types — тот же набор зашит и запасным вариантом, если список в конфиге пуст). Каждый моб приземляется по фактической высоте рельефа, а не парит в воздухе. Хозяина эти мобы не трогают дважды подстрахованно: они физически не выбирают его целью (перехват события нацеливания) и даже случайный урон от помеченного моба или его снаряда отдельно отменяется в обработчике урона. Но метка защищает только хозяина — для других игроков и союзников рядом это самая обычная враждебная толпа.

Тотем Слепоты — blindness

Ослепляет всех живых существ в области 10 блоков (radius) на 5 секунд (seconds) — без разбора «свой-чужой»: под раздачу попадают и мобы-противники, и питомцы, и союзники, и жители, если они оказались достаточно близко в момент спасения.

Тотем Крепости Духа — fortress

Единственный тип без отдельных числовых настроек в конфиге и единственный, где здоровье после спасения не ограничено значением revive-hp. На тик спасения здоровье, как и у всех, сначала падает до общего значения (по умолчанию пол-сердца), а уже на следующий такт способность жёстко выставляет его на максимум игрока (атрибут GENERIC_MAX_HEALTH, 20 по умолчанию) — визуально это ощущается как мгновенный полный хилл сразу после спасения.

Тотем Шипов — thorns

Открывает окно на 10 секунд (abilities.thorns.seconds), в течение которого каждый удар, полученный игроком от существа (в том числе от снаряда — тогда достаётся стрелку, а не стреле), зеркалится обратно в том же объёме финального урона. Принципиально: это не блокировка — сам игрок урон получает как обычно, тотем лишь наказывает атакующего тем же числом. От падения, лавы, голода или удушья отражать нечего — эффект реагирует только на удары от существ.

Как отличить тотемы в инвентаре

У каждого типа — своё цветное имя предмета, чтобы не перепутать в горячке боя:

  • buff — жёлтый
  • shockwave — голубой (aqua)
  • teleport — светло-фиолетовый
  • detonation — красный
  • blessing — белый
  • heavenly_wrath — синий
  • summoner — тёмно-зелёный
  • blindness — тёмно-серый
  • fortress — золотой
  • thorns — тёмно-красный

Подсказка предмета всегда собрана из четырёх строк: описание способности, пустая строка, «Заряды: N» и напоминание «Держи в левой руке.» — счётчик зарядов обновляется в подсказке при каждом спасении.

Окна и комбинации

Восемь способностей из десяти срабатывают один раз, в момент спасения, и на этом всё. Благословение и Шипы устроены иначе — они не «стреляют» один раз, а открывают окно во времени, внутри которого действует правило (полная неуязвимость или зеркалирование урона), заданное отдельным таймером на игрока.

Из этого вытекает несколько нетривиальных комбинаций:

  • Плагин смотрит только на предмет в офф-хенде в момент удара — держать в инвентаре сразу несколько типов можно свободно, эффект даст только тот, что физически переложен в левую руку.
  • Тотем с несколькими зарядами спасает столько раз, сколько зарядов есть: три смертельных удара подряд — три спасения, три запуска способности, три списанных заряда.
  • Благословение, сработав, на 5 секунд фактически ставит на паузу расход зарядов любых тотемов вообще — урон гасится раньше, чем плагин успевает посмотреть на офф-хенд.
  • Шипы, наоборот, не мешают следующему спасению: если в течение их 10 секунд прилетает новый смертельный удар, а в офф-хенде лежит тотем — сработают оба эффекта одновременно: игрока спасают, а атакующему одновременно прилетает зеркальный урон.
  • revive-hp действует на девять типов из десяти — Крепость Духа его игнорирует и лечит в полный запас здоровья тиком позже.

Как использовать: сценарии

Тип тотема стоит выбирать под ситуацию, а не носить один на все случаи — благо смена типа — это просто «переложить другой предмет в левую руку».

PvP и арены. Шипы — наказывают того, кто пытается добить сразу после спасения. Благословение — 5 секунд железной брони, чтобы выйти из окружения или, наоборот, довести бой самому. Волна — расшвыривает столпившихся вокруг противников. Слепота — снимает толпу на 5 секунд, но учти: заденет и союзников, если они рядом.

Фарм и гринд (мобовые фермы, опасные вылазки). Крепость Духа — полный хилл без зелий и еды, самый предсказуемый вариант для долгого фарма. Тотем Призыва — 10–15 мобов отвлекают опасность на себя и дают опыт/дроп, но не разбирают, где союзники, а где случайные игроки рядом. Небесная Кара — уйти вертикально из плотной толпы, 15 секунд в воздухе на подумать.

Выживание и экспедиции. Телепорт — увести игрока подальше от лавы, обвала или очередной волны мобов, до 70 блоков по диагонали. Детонация — расчистить завал или площадку взрывом без риска зацепить себя. Сила — после спасения 30 секунд скорости, прыгучести и урона, чтобы быстро уйти с опасного места или, наоборот, добить то, что чуть не убило.

Общее правило: держать 2–3 типа под рукой (в соседних слотах хотбара) и перекладывать нужный в офф-хенд заранее, перед рискованным действием — а не после того, как удар уже прилетел.

Команды

КомандаЧто делает
/totem give <игрок> <тип> [заряды]Выдаёт тотем указанного типа. Число зарядов не указано — берётся default-charges из конфига (по умолчанию 3)
/totem listСписок всех десяти id тотемов с расшифровкой способности каждого
/totem reloadПеречитывает config.yml без перезапуска сервера

Примеры: /totem give Виталий buff 5 — выдаст «Тотем Силы» с 5 зарядами; /totem give Виталий fortress без числа — выдаст «Тотем Крепости Духа» с зарядами по умолчанию из конфига; /totem list покажет все id разом: buff, shockwave, teleport, detonation, blessing, heavenly_wrath, summoner, blindness, fortress, thorns.

Важный нюанс give: игрок ищется только среди тех, кто сейчас на сервере (точное совпадение ника) — офлайн-игроку тотем так не выдать. Число зарядов, если указано, не может быть меньше 1 — плагин сам поднимет любое меньшее значение до 1. Неизвестный тип ответит «Неизвестный тип: … (см. /totem list)», нечисловые заряды — «Заряды — число.».

Команда откликается на алиасы /totems, /тотем, /тотемы. Автодополнение по Tab работает на всех трёх аргументах: первый — give/list/reload, второй (после give) — ники игроков онлайн, третий — id типов тотемов.

Права

ПравоДаётПо умолчанию
totem.adminкоманды give и reloadop
totem.useописано как «пользоваться тотемами»true (у всех)

Нюанс стоит знать заранее: право totem.use объявлено в plugin.yml и выдано всем по умолчанию, но сама механика спасения в коде его отдельно не проверяет — сработает у любого, у кого физически есть тотем в офф-хенде, вне зависимости от прав. На практике это редко играет роль, право и так включено всем, но если понадобится точечно запретить пользование тотемами конкретной группе — штатной проверки на это внутри плагина нет, потребуется внешняя надстройка над правами.

Настройка и совместимость

CloudTotems — плагин под Paper 1.19.4 (api-version: "1.19"). Каждое число из разбора выше — не константа в коде, а строка в config.yml: здоровье после спасения, заряды по умолчанию, длительности и уровни эффектов, радиусы, сила взрыва и отброса, состав призываемых мобов. Поменял значение — выполнил /totem reload — сервер подхватил новые правила без перезапуска. Список из десяти типов зашит в код (это не настраивается), а вот вся сила и продолжительность каждого — целиком в конфиге.

Полный список настраиваемых блоков config.yml:

  • revive-hp — здоровье после спасения (по умолчанию 1.0)
  • default-charges — заряды по умолчанию при /totem give без числа (3)
  • abilities.buff — длительность и уровни скорости/прыгучести/силы
  • abilities.shockwave — радиус и сила отброса
  • abilities.teleport — радиус телепорта
  • abilities.detonation — сила взрыва, ломает ли блоки, поджигает ли
  • abilities.blessing — длительность неуязвимости
  • abilities.heavenly-wrath — высота подброса и секунды плавного падения
  • abilities.summoner — минимум/максимум мобов, радиус, список типов
  • abilities.blindness — радиус и секунды слепоты
  • abilities.thorns — секунды отражения

Отдельным блоком в конфиге живёт license — лицензионная проверка плагина: enabled (по умолчанию false — для теста лицензия выключена, плагин стартует без каких-либо ограничений), key и url сервера лицензий, grace-hours (по умолчанию 24) — сколько часов плагин продолжит работать по локальному кэшу, если сервер лицензий временно недоступен. Проверка выполняется один раз, в момент включения плагина, до регистрации команд и обработчиков событий.

Ванильный тотем даёт один шанс не умереть. CloudTotems даёт десять способов решить, что будет дальше — и оставляет право переписать под себя любую цифру за этим решением.