跳到正文
← 返回博客
开发记录

随机副本插件更新记录:首领判定修复与副本内命令限制

随机副本自 1.4.9 更新至 1.4.13:新增 PlaceholderAPI 接口与 /dungeon locate,副本内限制使用其它命令,修掉空附魔书,并解决首领被误判为已击败导致的首领消失、结算时有时无与怪物串门。

#NWNDungeon#副本#插件#开源

本文范围

本文记录随机副本(NWNDungeon)自 1.4.9 至 1.4.13 的变化,共五个版本。本文发布时服务器上运行的版本为 1.4.13。最新正式版及下载见插件页,升级需替换 jar 后完整重启。

先给出版本要览,随后按版本依次说明。玩家最该看的是 1.4.13 一节:首领消失、结算时有时无、怪物串门这三个现象是同一个原因,此前遇到过的都可以对照那一节。

版本要点
1.4.9提供 PlaceholderAPI 接口:体力与各难度的进本消耗、通关金币
1.4.10新增 /dungeon locate:查找离自己最近的三个副本入口
1.4.11副本内禁止使用其它命令,只放行 /dungeon 与白名单
1.4.12修复掉落附魔书没有附魔;掉落表新增两种附魔写法;三张奖励表重排
1.4.13修复首领被误判为已击败:首领消失、结算时有时无、怪物串门

1.4.9:体力与金币可以显示在菜单里

安装了 PlaceholderAPI 的服务器会自动注册一组占位符,可用于菜单、记分板与聊天栏:

  • 体力六项:当前体力、体力上限、距离恢复下一点还有多少秒、同样内容的文字版(已满 / 3 分 20 秒)、进度条、是否已满;
  • 各难度进本消耗的体力,以及各难度通关发放的金币。

配合菜单插件,玩家不必先输入指令就能看到自己还剩多少体力、进一次本要花多少。我们服务器的主菜单「玩家信息」中已加入三行体力显示:当前与上限(含进度条)、下一点恢复时间、各难度的进本消耗。未安装 PlaceholderAPI 时这组接口不会注册,其余功能不受影响。

1.4.10:查找最近的副本入口

新增 /dungeon locate [难度|any],列出离玩家最近的三个自然生成入口,每一条包含距离、方位与坐标,跨世界时会额外标注。

这里有一个实现上的取舍值得说明。副本入口的生成密度约为每 400 区块一处,如果靠扫描周围区块来找,一次往往需要加载上万区块,会直接拖垮服务器。因此改为在生成入口时顺手登记一份轻量清单(plugins/NWNDungeon/entrances.yml,记录世界、坐标、难度与是否有效),locate 直接查表返回,不加载任何区块。门被破坏时,登记表里也会自动标记为失效,不会再把人指向一扇已经不存在的大门。

历史上已经生成、当时没有登记的入口,已从服务器日志中一次性补录完成。

1.4.11:副本内禁止使用其它命令

进入副本之后,只有 /dungeon 系列指令可用,其它指令(如 /spawn、/home、/tp、/kit)一律拦下,并提示当前可用的命令。

主要用于避免两种情况:一是进本后用传送类指令直接离开副本、绕过限时与结算;二是把副本内的物品通过指令带出。

默认放行两组命令,可以在配置文件中调整:

  • 聊天与私聊:msg tell w whisper r reply mail;
  • 登录类:login l log、register reg、unregister unreg、changepassword cp、captcha email。

登录类命令必须保留。掉线接续会把玩家直接放回副本世界,那时登录插件会要求先执行 /login;如果连它也拦掉,玩家就会被自己的副本锁住,无法出来。

持有 nwndungeon.admin 权限(默认仅管理员)的玩家不受这条限制,便于在副本内调试。判断依据是「玩家是否正占着一个副本槽位」,因此入口处 3 秒读条期间不算在副本内,也不受影响。该限制可在配置中整体关闭,修改后重载配置即可生效。

1.4.12:掉落附魔书曾经是废纸

这是本次范围内第二个值得单独说明的修复。

以前会发生什么

掉落表原先只能填写物品 ID。生成掉落物时,程序直接按材质构造物品,没有写入任何附加数据。因此配置里写的「附魔书」,实际发出的是一本没有任何附魔的书:名称照常显示「附魔书」,但一条附魔都没有,放进铁砧也读不到东西。这种书在原版正常玩法中根本拿不到,在玩家手里等同于废纸。三个难度的最终奖励箱各有一条这样的条目,所以打完首领后经常会掉出废书。

现在怎样

掉落表新增两个键,语法与怪物装备的附魔写法保持一致:

键含义
enchants: { SHARPNESS: 3, UNBREAKING: 2 }写死附魔,等级不做限制(写 6 就按 6 生成)
random-enchants: 2 或 [1, 3]随机附魔条数,附魔名与等级从该难度对应的池子中抽取,随机出的等级按原版上限夹取

此外增加了兜底:两个键都没有写、物品又是附魔书时,插件会自动补上随机附魔,空附魔书不会再出现。附魔名写错时只在日志中警告一次并跳过,既不静默丢弃附魔,也不刷屏日志。

三张奖励表同时按难度递进重排:普通 1 条低级(等级 12)、困难 12 条中级(23)、噩梦 23 条高级(3~4),并各加入一条小概率的经验修补附魔书。

补上会把玩家锁住的登录命令

1.4.11 引入命令限制时,白名单漏掉了 /verification —— 它是登录插件验证码命令 /captcha 的另一个名字。玩家连续登录失败被要求输入验证码、又恰好在副本内掉线重连时,会被这条规则拦在副本里出不来。

本次把名单改成照服务器上真实存在的命令逐个核对:不存在的别名不再写入,/logout 虽然存在但故意不放行(它只会把玩家变成未登录状态,拦掉不影响自救)。服务器上的配置已同步并重载生效;本版 jar 的作用是让打包的默认配置与内置兜底名单一起跟上,覆盖新装与旧配置升级两种场景。

1.4.13:首领消失、结算时有时无、怪物串门

这三件事此前被当成三个问题,实际是同一个原因。

以前会发生什么

插件判断「这支怪物还在不在」时,使用的接口对所在区块没有加载的活怪会返回空值。只要首领所在的区块因为没人靠近而被服务器卸载,活着的首领就会在一瞬间被当成「已消失」从名单中剔除;名单一旦清空,插件就判定本间已清完,直接放行通关:奖励照发,离开副本的木门照常出现。

由此产生三种玩家能看到的现象:

  • 首领直接消失:其实没有被移除,而是被移出了等待名单,不再计入剩余数量;
  • 结算时有时无:取决于结算那一刻首领所在的区块是否恰好处于加载状态;
  • 上一关的怪跑到下一关:被误剔除的怪物并没有死,之后会顺着已经打开的门在副本里乱走。

这个原因在实际环境中可以稳定复现:把首领留在最后一波,只击杀护卫,再把首领传送到没有区块加载的位置,两秒内插件就会判定通关 —— 而那只首领仍然满血存活。

现在怎样

  • 进行中的副本会挂上区块票据,覆盖副本范围,使怪物所在的区块不会被卸载。这样「查不到」只剩下「真的没有了」一种含义;槽位回收或服务器关闭时票据自动撤销。
  • 不再允许立即剔除。插件记录每只怪物最后一次出现的位置,只有当该位置所在区块已加载、且连续 5 秒都查不到时才将其剔除,剔除时会写入日志(含坐标)便于事后追溯。此前是每秒检查一次、查不到就删。
  • 通关必须确认击杀首领。只有收到首领的死亡事件才允许结算,不再用「名单已空」代替;如果首领确实找不回来,会在房间中央补刷一只(最多补刷 3 次,超出才放行并记警告)。奖励必须是打出来的。
  • 卡死兜底:名单为空超过 10 秒仍未推进,或下一波超过 15 秒仍未刷出(例如刷怪任务异常退出),会强制推进或重新刷怪,不会再出现「怪物都清光了却永远不结算」。

顺带说明一点容易误解的现象:开门用的压力板位于门的来路一侧,房间没有清完时会被每秒删除,因此正常情况下怪物无法自己开门串门。此前出现的串门,只可能是上面那种被误剔除的活怪造成的。

获取与更新

随机副本按 MIT 许可开源,下列链接保留本文所述 1.4.13 历史版本,最新版本请前往插件页:

完整的指令表、权限节点与配置说明见仓库 README,更新记录见 CHANGELOG;下载入口同时列在插件页面。安装方式为将 jar 放入服务端的 plugins/ 目录后重启。

上一篇文章记录了 1.4.8 及之前的改动:随机副本插件更新记录:遗迹入口、体力与通关奖金。玩法说明见服务器页面。

这一次修掉的是「打完了却不知道算不算打完」的问题——现在的通关,必须是首领真的倒下。

本文由 断了一只爪子的招财猫 发布,转载请注明出处。 RSS 订阅