Corpse
Обзор
Когда игрок умирает, Corpse берёт на себя его дроп: весь инвентарь (хотбар, броня, вторая рука) и опыт переносятся в труп, который остаётся на месте смерти. Ванильный дроп очищается. Труп остаётся, пока его не обыщут или пока не истечёт срок, и переживает перезапуск сервера.
Труп — это пакетная сущность, которая отрисовывается отдельно для каждого игрока поблизости. Это может быть обычная модель игрока в позе умирающего со скином и бронёй погибшего либо любая модель из поддерживаемого бэкенда. Всем управляют две записи manifest: Corpse Global Settings для серверных правил и Corpse Model Definition для внешнего вида трупа.
Возможности
- Полный захват добычи — инвентарь, броня, вторая рука и опыт попадают в труп; ванильный дроп и опыт очищаются.
- Три режима добычи — постраничное меню добычи, прямой перенос в инвентарь обыскивающего или выбрасывание всего на землю.
- Защита добычи — обыск только владельцем либо окно защиты, после которого труп может обыскать любой.
- Срок существования — трупы исчезают через настраиваемое время или не исчезают никогда.
- Сохранение — трупы переживают перезапуски: в MySQL, если он доступен, иначе в локальном файле.
- Несколько внешних видов — определения выбираются по миру и приоритету; модели из EntityExtension, ModelEngine, BetterModel, BTC Mob NPC или MythicMobs NPC.
- Запасной вариант с обычным игроком — скин, броня, свечение и поза (лежащий, упавший, умирающий или стоящий), если модель не задана.
- Хуки для квестов — события при появлении, обыске и истечении срока, факты, цель на возвращение и путевая точка, показывающая дорогу назад.
- Фильтр миров — оставлять трупы только в некоторых мирах (например, в подземельях) с помощью
allowedWorldsиexcludedWorlds. - Каждый текст настраивается — сообщения, подписи и материалы меню, формат путевой точки со стрелками и ответы команд являются полями.
- Команда для персонала — просмотр и очистка трупов на всём сервере.
- Готов к Folia — изменения мира выполняются в регионе, которому принадлежит труп.
Установка
- Установите расширения TypeWriter Basic, Quest и Entity на вкладке Extensions веб-панели (см. документацию TypeWriter).
- Установите расширение GUI: меню добычи построено на нём.
- По желанию: установите нужный бэкенд моделей для внешнего вида трупа (ModelEngine, BetterModel, MythicMobs NPC или BTC Mob NPC).
- По желанию: установите расширение MySQL, чтобы хранить трупы в базе данных. Без него трупы сохраняются в
plugins/Typewriter/corpse/corpses.json. - Положите JAR-файл Corpse в
plugins/Typewriter/extensions/и перезапустите сервер.
При запуске консоль выводит, какие бэкенды моделей были найдены. Если ни одного нет, трупы всё равно хранят добычу и отображаются как обычный игрок.
Быстрый старт
Настроим трупы, которые живут пять минут, одну минуту защищены для владельца и показывают дорогу назад:
- В веб-панели TypeWriter откройте страницу manifest и добавьте запись Corpse Global Settings. Без неё действуют встроенные значения по умолчанию (300 секунд, меню добычи, обыскать может любой).
- Установите
durationв300,onlyOwnerCanLootвыключите, аownerProtectionSecondsзадайте60. - Выберите
lootMode:GUIоткрывает меню добычи по правому клику,DIRECTпереносит всё в инвентарь обыскивающего,DROPвыбрасывает всё на землю. Клик с зажатым Shift использует другой режим (sneakSwapsLootMode). - Добавьте Corpse Model Definition. Оставьте
definitionRefпустым для обычной модели игрока или выберите определение сущности для модели. При необходимости настройтеpose,rotationModeи хитбоксinteraction*. - Добавьте запись аудитории Corpse Waypoint, чтобы показывать на панели действий расстояние и стрелку к трупу. Она исчезает, когда трупа больше нет.
- Чтобы сделать возвращение за вещами шагом квеста, добавьте Corpse Recovery Objective, связанную с квестом.
- Опубликуйте, один раз погибните в тестовом мире и кликните правой кнопкой по трупу.
Corpse забирает только то, что выпало бы при смерти. Если включено игровое правило keepInventory, игрок сохраняет предметы и труп не создаётся: смерть остаётся ванильной. Предметы, которые другие плагины сохраняют для игрока (Проклятие утраты, soulbound-предметы), не дублируются в труп.
Ограничение отдельными мирами
По умолчанию труп остаётся в любом мире. Два списка в Corpse Global Settings определяют, где именно:
allowedWorlds: миры, в которых смерть оставляет труп. Пустой список означает все миры.excludedWorlds: миры, в которых смерть никогда не оставляет труп. Всегда имеет приоритет надallowedWorlds.
Чтобы трупы были только в подземельях и больше нигде:
allowedWorlds:
- dungeon_*
Правила для обоих списков:
- Одна запись на мир.
*заменяет любую последовательность символов, а?— ровно один символ:dungeon_*охватывает все миры, которые подземелье создаёт для прохождения, аdgbuild— один конкретный мир. - Каждая запись сравнивается без учёта регистра с названием мира (именем его папки) и с его ключом измерения, например
minecraft:the_nether. - Вне разрешённых миров (или в исключённом мире) смерть остаётся ванильной: обычные дропы и опыт, труп не создаётся.
- Это определяет только то, существует ли труп. Внешний вид по-прежнему выбирается списком
worldsв Corpse Model Definition, который принимает те же записи.
Что видит игрок в отклонённом мире. Это определяет filteredWorldDeath. Не действует, если оба списка пусты.
VANILLA_DEATH_SCREEN(по умолчанию): обычная смерть Minecraft. Тело, лежащее на земле, и экран смерти рисует клиент Minecraft, а не Corpse, и Corpse не может их убрать.INSTANT_RESPAWN: игрок возрождается на следующем тике, без экрана смерти. Предметы и опыт в обоих случаях выпадают на землю, как в ванили.
Чтобы трупы были только в подземельях, а везде остальное — мгновенное возрождение:
allowedWorlds:
- dungeon_*
filteredWorldDeath: INSTANT_RESPAWN
Смерть не оставляет трупа и остаётся ванильной, если:
- мир не разрешён или исключён;
- включено
keepInventory; - другой плагин отменил смерть (тотем или плагин воскрешения): игрок не мёртв;
- забирать нечего: нет ни предметов, ни опыта.
Как это работает
Какое определение использовать, решается в момент смерти: среди записей Corpse Model Definition, в списке worlds которых есть мир смерти (пустой список означает все миры), выбирается запись с наибольшим priority. Если определений нет, используется определение по умолчанию. Время жизни берётся из overrideDuration, если оно больше 0, иначе из глобального duration. Правило защиты владельца фиксируется при создании трупа.
Обыскать труп можно только правым кликом. Обыск опустошает труп, и труп удаляется. Труп, который никто не обыскал, истекает, а его предметы теряются.
Меню
В режиме добычи GUI правый клик по трупу открывает меню на 54 слота, построенное на расширении GUI.
- Первые пять рядов (45 слотов) содержат предметы трупа. Кликните предмет, чтобы забрать его в инвентарь (предмет, который не помещается, падает вам под ноги); труп сохраняется после каждого взятого предмета. Взятие последнего предмета опустошает труп, выдаёт опыт и вызывает
on_corpse_loot. - В нижнем ряду находятся кнопки: предыдущая страница (слева), следующая страница, кнопка «забрать всё» и закрытие (справа). Кнопки перелистывания появляются только при нескольких страницах.
- Сундук «забрать всё» показывает в описании (lore) опыт, хранящийся в трупе (и текущую страницу), и отдаёт обыскивающему всё, включая опыт.
- Заголовок и все подписи можно изменить в Corpse Global Settings (
guiTitle,guiLootAllLabel,guiCloseLabel,guiPreviousPageLabel,guiNextPageLabel,guiExperienceLabel,guiPageLabel).
Если в режиме DIRECT инвентарь обыскивающего полон, излишек выбрасывается у трупа и показывается inventoryFullMessage. Выброшенные предметы можно закрепить за обыскивающим (reserveDroppedItems, reserveDroppedItemsSeconds).
Конфигурация
Трупы хранятся вне веб-панели:
| Хранилище | Когда | Расположение |
|---|---|---|
| MySQL | расширение MySQL предоставляет источник данных | таблица corpse_corpses, создаётся автоматически |
| Локальный файл | нет источника данных или MySQL не удалось инициализировать | plugins/Typewriter/corpse/corpses.json |
Трупы, срок которых истёк, пока сервер был выключен, удаляются при запуске без вызова on_corpse_expire. После перезапуска труп отображается с именем и настройками, являющимися константами: имена и параметры, зависящие от плейсхолдеров, возвращаются к значениям по умолчанию. Восстановленный труп сохраняет позу, свечение, имя и анимацию, но не скин и броню владельца: он показывается простой моделью. Нечитаемый файл хранилища откладывается в сторону (.unreadable-<time>), а не перезаписывается.
Команды
Команда — это запись Corpse Admin Command, которую вы создаёте в веб-панели. Её имя и право являются полями записи; значения по умолчанию приведены ниже.
| Команда | Описание |
|---|---|
/corpses list | Выводит все трупы сервера в любом мире с их владельцем, позицией, миром, числом предметов и опытом. |
/corpses clear | Удаляет все трупы сервера, а не только трупы вашего мира. Не вызывает on_corpse_expire. |
Обе команды действуют на весь сервер, а не на отдельный мир. Их ответы и заголовок списка — редактируемые поля записи.
Права
| Право | Даёт доступ к |
|---|---|
typewriter.corpse.admin | /corpses list и /corpses clear (значение по умолчанию поля permission записи). |
Записи
Записей: 11, сгенерированы из исходного кода расширения.
События3
- On Corpse ExpireWhen a corpse expires unlooted
- On Corpse LootWhen a corpse is looted
- On Corpse SpawnWhen a corpse spawns
Цели1
- Corpse Recovery ObjectiveRecover your corpse
Факты2
- Corpse CountHow many corpses the player has
- Has CorpseWhether the player has a corpse waiting
Аудитории2
- Corpse Owner AudiencePlayers who have a corpse waiting
- Corpse WaypointPoints players back to their corpse
Команды1
- Corpse Admin CommandAdmin command for corpses
Манифесты2
- Corpse DefinitionCorpse Model Definition
- Corpse SettingsCorpse Global Settings
Устранение неполадок
Ничего не происходит, когда я кликаю правой кнопкой по трупу. Клик по трупу работает через невидимый хитбокс размером interactionWidth на interactionHeight блоков, по умолчанию 1.0. Для крупной модели увеличьте его. Включите debugInteractions в Corpse Global Settings, чтобы записывать каждый клик в консоль, а затем снова выключите. Также проверьте onlyOwnerCanLoot и ownerProtectionSeconds: остальные игроки получают cannotLootMessage.
Труп — обычный игрок, а не моя модель. definitionRef пуст или его не удалось разрешить (консоль показывает Failed to resolve entity definition). Убедитесь, что расширение-бэкенд установлено: в журнале запуска перечислены обнаруженные бэкенды.
Меню добычи не открывается. Для меню нужно расширение GUI. Также проверьте lootMode и что вы не приседаете: при включённом sneakSwapsLootMode приседание использует другой режим.
После смерти нет трупа. Проверьте по порядку: мир разрешён списком allowedWorlds и не входит в excludedWorlds (сравнение идёт с именем папки и с ключом измерения); игровое правило keepInventory выключено в этом мире; ни один другой плагин не отменил смерть; у игрока был хотя бы один предмет или немного опыта.
Клик издалека ничего не делает. Клик засчитывается только в пределах interactionReach блоков от трупа (по умолчанию 6, 0 = без ограничения). Повторные клики в пределах interactionCooldownMillis игнорируются как одно действие.
После перезапуска труп пропал. Проверьте в консоли строку Restored n corpse(s) from storage. Если срок трупа истёк, пока сервер был выключен, он удаляется. Если инициализация MySQL завершилась ошибкой, Corpse переключается на локальный файл с предупреждением в логе.
Плейсхолдеры в имени не работают. Используйте {player} для имени владельца в displayName. В respawnMessage используйте <x>, <y>, <z> и <world>; в guiTitle — <player>. Плейсхолдеры в остальных текстах подставляются до MiniMessage, а имя игрока экранируется, чтобы оно никогда не стало кликабельным тегом.
Связанные расширения
- GUI — предоставляет меню добычи.
- BetterModel и MythicMobs NPC — бэкенды моделей для трупа.
- MySQL — хранение трупов в базе данных.