SableCraft标准

SableCraft标准

你有标准吗?每个服务器最终需要的所有服务器命令,以及其他模组可以驱动的经济系统。/fly、/god、/home、/warp、/tpa、/back、/top、/kit、/vanish、/invsee、邮件、禁言、封禁——每个服务器都安装的这套功能,设计为与其他模组协同工作!

SableCraft Standards —— 基础功能,精益求精

你有 Standards 吗?

每个服务器最终都会需要的命令,以及一个可供其他模组驱动的经济系统。 /fly、/god、/home、/warp、/tpa、/back、/top、/kit、/vanish、/invsee、邮件、禁言、封禁 —— 每个服务器都会为了这些功能而安装某个模组,而本模组旨在一次性构建好,并让其他模组能够驱动它,而非仅仅与之共存。

你的玩家不需要安装任何东西。 每条命令都能在未修改的 Mojang 启动器客户端上正常使用:无需客户端模组、无需资源包、无需下载任何内容。网络通道存在,但特意保持为空。


又是一个基础功能模组?

是的。这正是名字里的玩笑 —— 参见 xkcd 927 —— 但它的存在是为了解决两个具体且可以修复的抱怨:

  • FTB Essentials 没有 /top 命令。
  • FTB Essentials 和 EssentialsX 都将 /fly 和 /god 做成纯切换模式,没有明确的 on 或 off 参数。

第二点可不是吹毛求疵。一个纯粹的切换命令无法由命令方块、数据包或其他模组的技能驱动:一个想要飞行效果开启二十秒然后关闭的法术,只能去猜测状态,并且有一半的几率猜错 —— 导致玩家在半空中被解除飞行。所以这里的每个开关都接受 on / off / toggle 参数,并且可以选择是否指定目标:

/fly            /fly on            /fly @a on
/god Steve      /god Steve off

玩家手动输入 /fly 时仍然获得切换行为。而其他一切情况都会得到一个可靠的答案。整个模组的开发都源于认真对待这两个抱怨。

几个出乎意料的功能

  • /top 是扫描,而不是读取高度图 —— 因此它在下界和洞穴内都能使用,并且会停在基岩层顶部,而不是因为世界地形崎岖而责怪你。
  • /tpa 会在双方端都给出提示。 设置了预热时间后,请求者一旦被接受,就会立即看到实时刷新的动作条倒计时;接受者则会被告知对方何时到达,或者为什么没有到达。提示信息带有可点击的 [接受] / [拒绝] 按钮,在原版客户端上即可使用。这修复的经典问题是:之前有长达五秒的“无可见反馈”阶段,导致双方都重复执行命令。
  • /back 是一个栈,而不是一个书签。 每次传送都会压入一个记录;/back <n> 可以回退更多步,而 /back list 会显示栈中实际内容 —— 包括距离和产生该记录的命令。其他模组的传送也会被标记,而无需那些模组做任何事。
  • /vanish 能真正隐藏你 —— 从其他玩家的实体追踪器中解绑,从标签列表中移除,不会被怪物 AI 发现。这不是数据包技巧。物品拾取默认被抑制,因为如果一支箭凭空消失而那里却没人,这和被发现本人一样容易暴露。
  • /pay 可以附带理由 —— /pay Steve 500 half of what we dug —— 如果对方离线,该理由会存入其邮箱,这样周二支付的款项到了周五仍能说明来由。
  • 便携工作台默认对所有人禁用,包括管理员。 这是设计使然:一个可以随时随地打开的工作台是一种应当被授予的能力,而不是一种理所当然的便利设施。

底层系统

   
经济 内置账本,以及一个提供者 API,使得专门的经济模组可以取代它,而双方互不知晓彼此的存在。余额存储在存档数据中,因此 /eco give 可以作用于睡觉中的玩家,/baltop 能查询所有玩家的余额。
家、传送点和出生点 通过权限节点设置每个玩家的家的数量上限,支持命名传送点、服务器出生点,以及安全降落搜索,确保你不会掉进岩浆或溺水。
传送 支持带实时倒计时的预热、冷却时间、受伤取消、移动取消 —— 所有这些功能对其他模组同样开放,因此任何传送玩家的模组都能继承这些特性。
分组 内置一个轻量级分组系统 —— 共享的家、聊天标签、团队传送 —— 并且提供供其他模组注册的接口,使得派系和队伍可以共存而无需互相裁决。
聊天 支持多个模组同时贡献名称装饰器,并根据与名称的接近程度排序;还包含一个频道路由器,无法用它来绕过禁言。
礼包 (Kits) /setkit <名称> armour|hotbar|inventory|all 会捕捉你当前穿戴和携带的物品 —— 礼包是通过装备好自己来制作,而不是通过向文件写入物品 ID。
管理 支持禁言、临时禁言、封禁、带有重新连接时显示理由的临时封禁、/invsee、/socialspy,以及能真正隐藏公共聊天的 /ignore。
离开 支持通过命令或计时器触发 /afk,移动或说话(包括在其他模组的聊天频道中)即可清除状态。

所有文本都归你所有

玩家能看到的所有内容都存放在 config/standards/messages.yml 中,首次运行时生成。这不是原版的翻译键 —— 原版客户端没有我们的语言文件,会显示原始键名 —— 因此这是在服务器端解析的,在任何地方都有效。

{term.*} 键可以整体替换词汇:将 term.balance 设置为 积分 (credits),所有提到金钱的提示信息都会跟着改变,无需编辑上百行内容。 & 颜色代码全面支持,包括 &#RRGGBB 十六进制颜色。

升级时会保留你的修改。 新的键会被追加在标题下方,这样“这个版本有什么新内容”可以通过滚动到底部来回答;而你未编辑过的提示信息会被静默更新为当前措辞,任何你修改过的内容则会被完全保留。

权限,以及一个需要首先了解的要点

Standards 使用 NeoForge 自带的 PermissionAPI,这意味着 LuckPerms 开箱即用 —— 同样,完全不装权限模组也能工作。这两种情况都经过验证:一个未安装任何权限插件的新服务器,会给予普通玩家所有通用命令,给予管理员提升权限的命令;而 LuckPerms 的授权无需重启即可实时生效。

每个权限门控都是一个权限节点,而非硬编码的操作员检查,因此捐赠者等级可以拥有十个家的上限,建筑师等级可以拥有 standards.craft 权限,而无需授予任何人 /stop 权限。

为其他模组而生

五个接口,全部为软依赖 —— 只需添加 compileOnly,Standards 甚至可以在运行时完全缺席:

API 用途
api.economy 消耗金钱,或者充当经济系统
api.chat 同时从多个模组获取名称前后缀;尊重禁言规则的聊天频道
api.groups 按类型分组,以及“谁拥有这个区块”
api.PlayerSwitches / api.Stations 从代码层面驱动 /fly、/god、/vanish 和工作站
api.combat 计划于 1.1 版本推出 —— 战斗标记,确保没有任何东西能让玩家脱离战斗状态

开关 API 的存在,是因为一个授予飞行能力的技能不应该去拼凑命令字符串并祈祷成功:技能本身已经是权威,因此它直接调用 API,并跳过验证输入命令所需的权限检查。

Factions ReForged 完全建立在这些 API 之上 —— 领地、分组、聊天和经济 —— 并且证明了它们可以供外部模组使用。

环境要求

我的世界 NeoForge Java
1.21.11 21.11.42+ 21

在服务器上安装即可。就这么简单。 没有依赖项。你的玩家无需安装任何东西,也不会阻止他们从原版客户端加入服务器。

鸣谢与许可证

MIT 许可证。全部为原创作品。

灵感来源于 Essentials / EssentialsX 和 FTB Essentials —— 阅读其设计意图,然后构建得更好。没有使用其中任何一个的代码。

作者:Sablednah。源代码、问题追踪器和完整设计说明可在 GitHub 上找到。