Ванильный тотем воскрешения — расходник на один раз. Сработал, исчез, забыт. 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» и напоминание «Держи в левой руке.» — счётчик зарядов обновляется в подсказке при каждом спасении.
Восемь способностей из десяти срабатывают один раз, в момент спасения, и на этом всё. Благословение и Шипы устроены иначе — они не «стреляют» один раз, а открывают окно во времени, внутри которого действует правило (полная неуязвимость или зеркалирование урона), заданное отдельным таймером на игрока.
Из этого вытекает несколько нетривиальных комбинаций:
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 и reload | op |
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 даёт десять способов решить, что будет дальше — и оставляет право переписать под себя любую цифру за этим решением.