跳到主要内容

Corpse

玩家尸体保存背包物品与经验,带有战利品菜单、保护、过期和模型后端。

免费v0.7实体与模型
依赖TypeWriter0.9Basic extensionEntity extensionQuest extensionGUIMySQL可选ModelEngine可选BetterModel可选MythicMobs NPC可选BTC Mob NPC可选

概述​

玩家死亡时,Corpse 会接管其掉落物:整个背包(快捷栏、盔甲、副手)和经验都会被转移到倒下之处的一具尸体中,原版掉落物会被清除。尸体会一直保留,直到有人拾取或过期,并且在服务器重启后依然存在。

尸体是一个数据包实体,针对附近的每位玩家分别渲染。它可以是一个处于濒死姿势、穿着死者皮肤和盔甲的普通玩家模型,也可以是任意受支持后端的模型。整个系统由两个 manifest 条目驱动:用于服务器全局规则的 Corpse Global Settings,以及用于尸体外观的 Corpse Model Definition。

功能​

  • 完整战利品捕获 — 背包、盔甲、副手和经验都会进入尸体;原版掉落物和经验被清除。
  • 三种拾取模式 — 分页的战利品菜单、直接转移到拾取者背包,或将所有物品丢在地上。
  • 战利品保护 — 仅限主人拾取,或设置一段保护期,期满后任何人都可拾取。
  • 过期 — 尸体在可配置的时间后消失,也可以永不消失。
  • 持久化 — 尸体在重启后依然存在:有 MySQL 时存入 MySQL,否则存入本地文件。
  • 多种外观 — 按世界和优先级选择定义;支持来自 EntityExtension、ModelEngine、BetterModel、BTC Mob NPC 或 MythicMobs NPC 的模型。
  • 普通玩家后备外观 — 未设置模型时,使用皮肤、盔甲、发光和姿势(躺卧、倒下、濒死或站立)。
  • 任务钩子 — 生成、拾取和过期事件,facts,一个找回目标,以及指引回尸体的路径点。
  • 世界过滤 — 使用 allowedWorlds 和 excludedWorlds,仅在部分世界(例如地牢)留下尸体。
  • 所有文本均可配置 — 消息、菜单标签和材质、路标格式及其箭头,以及命令回复都是字段。
  • 管理员命令 — 列出并清除整个服务器的尸体。
  • 支持 Folia — 对世界的修改会在拥有该尸体的区域线程上执行。

安装​

  1. 在网页面板的 Extensions 选项卡中安装 TypeWriter 扩展 Basic、Quest 和 Entity(参见 TypeWriter 文档)。
  2. 安装 GUI 扩展:战利品菜单基于它构建。
  3. 可选:为尸体外观安装你想要的模型后端(ModelEngine、BetterModel、MythicMobs NPC 或 BTC Mob NPC)。
  4. 可选:安装 MySQL 扩展,将尸体存入数据库。没有它时,尸体保存在 plugins/Typewriter/corpse/corpses.json 中。
  5. 将 Corpse 的 JAR 放入 plugins/Typewriter/extensions/,然后重启服务器。

启动时,控制台会记录检测到了哪些模型后端。如果一个都没找到,尸体仍然会保存战利品,并渲染为普通玩家。

快速上手​

设置持续五分钟、对主人保护一分钟,并能指引回尸体的尸体系统:

  1. 在 TypeWriter 网页面板中,打开一个 manifest 页面,添加一个 Corpse Global Settings 条目。没有它时会使用内置默认值(300 秒、战利品菜单、任何人都可拾取)。
  2. 将 duration 设为 300,onlyOwnerCanLoot 关闭,ownerProtectionSeconds 设为 60。
  3. 选择 lootMode:GUI 在右键点击时打开战利品菜单,DIRECT 将所有物品移入拾取者背包,DROP 将其丢在地上。潜行点击时使用另一种模式(sneakSwapsLootMode)。
  4. 添加一个 Corpse Model Definition。definitionRef 留空表示使用普通玩家模型,或选择一个实体定义以使用模型。如有需要,设置 pose、rotationMode 以及 interaction* 碰撞箱。
  5. 添加一个 Corpse Waypoint audience 条目,在动作栏上显示到尸体的距离和箭头。尸体消失后它也随之消失。
  6. 若要把找回尸体作为任务步骤,请添加一个链接到任务的 Corpse Recovery Objective。
  7. 发布,在测试世界中死一次,然后右键点击尸体。
备注

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)。

配置​

尸体存储在网页面板之外:

存储方式条件位置
MySQLMySQL 扩展提供了数据源表 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
目标1
事实2
受众2
命令1
清单2

故障排查​

右键点击尸体没有任何反应。 尸体是通过一个不可见的碰撞箱来点击的,大小为 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 之前被填充,玩家的名称会被转义,因此永远不会变成可点击的标签。

相关扩展​