Corpse
概述
玩家死亡时,Corpse 会接管其掉落物:整个背包(快捷栏、盔甲、副手)和经验都会被转移到倒下之处的一具尸体中,原版掉落物会被清除。尸体会一直保留,直到有人拾取或过期,并且在服务器重启后依然存在。
尸体是一个数据包实体,针对附近的每位玩家分别渲染。它可以是一个处于濒死姿势、穿着死者皮肤和盔甲的普通玩家模型,也可以是任意受支持后端的模型。整个系统由两个 manifest 条目驱动:用于服务器全局规则的 Corpse Global Settings,以及用于尸体外观的 Corpse Model Definition。
功能
- 完整战利品捕获 — 背包、盔甲、副手和经验都会进入尸体;原版掉落物和经验被清除。
- 三种拾取模式 — 分页的战利品菜单、直接转移到拾取者背包,或将所有物品丢在地上。
- 战利品保护 — 仅限主人拾取,或设置一段保护期,期满后任何人都可拾取。
- 过期 — 尸体在可配置的时间后消失,也可以永不消失。
- 持久化 — 尸体在重启后依然存在:有 MySQL 时存入 MySQL,否则存入本地文件。
- 多种外观 — 按世界和优先级选择定义;支持来自 EntityExtension、ModelEngine、BetterModel、BTC Mob NPC 或 MythicMobs NPC 的模型。
- 普通玩家后备外观 — 未设置模型时,使用皮肤、盔甲、发光和姿势(躺卧、倒下、濒死或站立)。
- 任务钩子 — 生成、拾取和过期事件,facts,一个找回目标,以及指引回尸体的路径点。
- 世界过滤 — 使用
allowedWorlds和excludedWorlds,仅在部分世界(例如地牢)留下尸体。 - 所有文本均可配置 — 消息、菜单标签和材质、路标格式及其箭头,以及命令回复都是字段。
- 管理员命令 — 列出并清除整个服务器的尸体。
- 支持 Folia — 对世界的修改会在拥有该尸体的区域线程上执行。
安装
- 在网页面板的 Extensions 选项卡中安装 TypeWriter 扩展 Basic、Quest 和 Entity(参见 TypeWriter 文档)。
- 安装 GUI 扩展:战利品菜单基于它构建。
- 可选:为尸体外观安装你想要的模型后端(ModelEngine、BetterModel、MythicMobs NPC 或 BTC Mob NPC)。
- 可选:安装 MySQL 扩展,将尸体存入数据库。没有它时,尸体保存在
plugins/Typewriter/corpse/corpses.json中。 - 将 Corpse 的 JAR 放入
plugins/Typewriter/extensions/,然后重启服务器。
启动时,控制台会记录检测到了哪些模型后端。如果一个都没找到,尸体仍然会保存战利品,并渲染为普通玩家。
快速上手
设置持续五分钟、对主人保护一分钟,并能指引回尸体的尸体系统:
- 在 TypeWriter 网页面板中,打开一个 manifest 页面,添加一个 Corpse Global Settings 条目。没有它时会使用内置默认值(300 秒、战利品菜单、任何人都可拾取)。
- 将
duration设为300,onlyOwnerCanLoot关闭,ownerProtectionSeconds设为60。 - 选择
lootMode:GUI在右键点击时打开战利品菜单,DIRECT将所有物品移入拾取者背包,DROP将其丢在地上。潜行点击时使用另一种模式(sneakSwapsLootMode)。 - 添加一个 Corpse Model Definition。
definitionRef留空表示使用普通玩家模型,或选择一个实体定义以使用模型。如有需要,设置pose、rotationMode以及interaction*碰撞箱。 - 添加一个 Corpse Waypoint audience 条目,在动作栏上显示到尸体的距离和箭头。尸体消失后它也随之消失。
- 若要把找回尸体作为任务步骤,请添加一个链接到任务的 Corpse Recovery Objective。
- 发布,在测试世界中死一次,然后右键点击尸体。
Corpse 只会取走这次死亡本应掉落的内容。开启 keepInventory 游戏规则时,玩家保留物品,不会生成尸体:死亡保持原版行为。其他插件为玩家保留的物品(消失诅咒、灵魂绑定物品)不会被复制到尸体中。
限制在部分世界
默认情况下,每个世界都会留下尸体。Corpse Global Settings 中的两个列表决定在哪里留下:
allowedWorlds:死亡时会留下尸体的世界。为空表示所有世界。excludedWorlds:死亡时绝不留下尸体的世界。始终优先于allowedWorlds。
若只想在地牢中留下尸体、其他地方都不留:
allowedWorlds:
- dungeon_*
两个列表的规则:
- 每个世界一个条目。
*匹配任意一串字符,?恰好匹配一个字符:dungeon_*涵盖地牢为每次游玩生成的所有世界,dgbuild则是某一个指定名称的世界。 - 每个条目会(忽略大小写)同时与世界名称(其文件夹名)和其维度键(例如
minecraft:the_nether)进行比较。 - 在允许的世界之外(或在被排除的世界中),死亡保持原版行为:正常的掉落和经验,不生成尸体。
- 这只决定是否存在尸体。尸体的外观仍由 Corpse Model Definition 的
worlds列表选择,它接受相同的条目。
玩家在被拒绝的世界中看到什么。 由 filteredWorldDeath 决定。当两个列表都为空时没有效果。
VANILLA_DEATH_SCREEN(默认):普通的 Minecraft 死亡。倒在地上的身体和死亡画面由 Minecraft 客户端绘制,而不是 Corpse,Corpse 无法移除它们。INSTANT_RESPAWN:玩家在下一个 tick 重生,没有死亡画面。两种情况下,物品和经验都像原版一样掉在地上。
若只想在地牢中留下尸体,其他地方则立即重生:
allowedWorlds:
- dungeon_*
filteredWorldDeath: INSTANT_RESPAWN
出现以下情况时,死亡不会留下尸体,并保持原版行为:
- 世界不被允许或被排除;
- 开启了
keepInventory; - 其他插件取消了这次死亡(图腾或复活插件):玩家并未死亡;
- 没有可取走的内容:既没有物品也没有经验。
工作原理
使用哪个定义在死亡时决定:在 worlds 列表包含死亡所在世界(列表为空表示所有世界)的 Corpse Model Definition 条目中,priority 最高者胜出。如果没有任何定义,则使用默认定义。尸体的存在时长在 overrideDuration 大于 0 时取该值,否则取全局的 duration。主人保护规则在尸体创建时就已固定。
只有右键点击尸体才能拾取。拾取会清空尸体,随后尸体被移除。无人拾取的尸体会过期,其中的物品将会丢失。
菜单
在 GUI 拾取模式下,右键点击尸体会打开一个使用 GUI 扩展构建的 54 格菜单。
- 前五行(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。对于大型模型,请将其调大。在 Corpse Global Settings 中开启 debugInteractions 可以把每次点击记录到控制台,用完后请再次关闭。同时检查 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 会回退到本地文件,并在日志中给出警告。
名称中的占位符不起作用。 在 displayName 中使用 {player} 表示主人的名字。在 respawnMessage 中使用 <x>、<y>、<z> 和 <world>;在 guiTitle 中使用 <player>。 其他文本中的占位符会在 MiniMessage 之前被填充,玩家的名称会被转义,因此永远不会变成可点击的标签。
相关扩展
- GUI — 提供战利品菜单。
- BetterModel 和 MythicMobs NPC — 尸体的模型后端。
- MySQL — 尸体的数据库存储。