
PalForge(基金会)
用几行Lua为《幻兽帕鲁》添加新的帕鲁、物品和建筑。声明一下,PalForge就将其接入游戏自身事件——放置、使用、制作、生成、受损——并带有能跨重载存续的保存状态。八种内容类型,一种形态。这是模组作者框架,而非游戏玩法模组。仅限单人模式。MIT许可。
查看大图PalForge — 为幻兽帕鲁添加新帕鲁、物品和建筑
这是一个模组制作者的开发工具。它本身不添加任何内容 —— 单独安装它不会改变游戏中的任何东西。它的作用是让某人用几行 Lua 代码编写内容,而不是几百行。
如果你来这里是为了游玩,你想要的应该是基于 PalForge 构建的模组,而不是 PalForge 本身。
描述
修改幻兽帕鲁涉及两个独立的问题。第一个是把新东西放进游戏的数据中 —— 一个物品、生物或建筑对象的条目。第二个,也是最耗费周末时间的问题,是让它产生实际行动:找出放置建筑时触发的内部函数,在不崩溃的情况下挂钩它,搞清楚五十个参数中哪个是你想要的 id,并让你记住的东西在存档和重新加载后依然存在。
PalForge 就是第二个问题,已经解决了。
你在一个代码块中声明一个东西及其行为。PalForge 会注册它,将其连接到幻兽帕鲁已触发的事件,并给它一个在重新加载后依然存在的地方来保存其状态。
require("palforge.api")
Building{
id = "CampFire", -- 游戏自带的篝火
events = {
onRightClick = function(self, ctx) -- 在真实存档中触发
Item.get("Wood"):give(5)
end,
},
}
这是一个完整的、可用的模组。右键点击你基地中的任意篝火,获得五个木材。
PalForge 暴露的每个事件都是通过挂钩正在运行的游戏并观察其触发而找到的 —— 而不是靠猜测一个看似合理的函数名。在某些渠道在当前版本构建中没有对应来源时,PalForge 会在日志中说明,而不是保持沉默,文档也会明确指出。这种差异是信任其余部分的理由。
从这里开始 → 构建内容包 —— 一个完整的教程,从空文件夹开始构建一个可用的模组:一个能反应的建筑、一个声音、一个效果、一个生物、保存状态,以及当它不触发时如何调试。
主要特性
八种内容类型,一种统一形式。 每个领域都以相同的方式调用 —— 调用它来声明,获取一个句柄,对句柄进行操作:
- 帕鲁 —— 生物,包含网格、材质、技能和生命周期
- 物品 —— 物品,包含它们恢复什么以及使用时发生什么
- 建筑 —— 建筑,包含每个建筑独立的运行状态
- 技能 —— 主动技能和被动技能
- 效果 —— 状态异常,包括游戏自带的 38 种
- 音频 —— 从游戏自带声音的 1957 条目目录中选取
- 网格 —— 模型和材质
- UI —— 挂在幻兽帕鲁自身界面上的面板
每个字段都在你输入的地方进行检查。未声明的字段会报错并给出“你是不是想找”的提示,绝不会默默无效 —— 一个不可能对应到游戏数据中任何条目的 id 会在你写它的那一行就被拒绝,而不是三小时后当什么都没有出现时才发现。
一个真正新实体是如何工作的。 在规划基于 PalForge 的模组之前请阅读本节。Lua 无法向幻兽帕鲁的数据表写入条目。因此一个全新的物品、生物或建筑对象需要 PalSchema 来创建数据条目 —— 而 PalForge 的带命名空间的 id 拼写方式正是 PalSchema 会写入的:mypack:Potion 会在每个 id 进入游戏的节点处自动变成数据条目 mypack_Potion。
所以两者是成对工作的。PalSchema 让游戏知道这个东西存在;PalForge 赋予它行为、事件和保存状态。给游戏已有的东西赋予新行为只需要 PalForge —— 上面的篝火例子没有使用任何其他模组。 → 内容包可以发布什么
事件已经接好线。 二十一个渠道,由二十二个挂钩驱动,全部接入游戏本身。你声明一个处理函数;它就会触发。无需编写轮询循环,也无需注册挂钩。
- 建筑 —— 放置、右键点击、加载、逐帧更新、移除、建造完成、世界就绪
- 物品 —— 制作、获得、使用、丢弃
- 帕鲁 —— 生成、受伤、死亡、捕获
- 技能 —— 激活、被动技能装备和卸下
- 世界 —— 就绪、离开、以及共享的心跳信号
建筑运行时也不会轮询查找建筑。它监视游戏自己的放置事件,只有当可能发生了变化时才枚举世界。在一个有 623 个建筑的基地中,这相当于 每次扫描 2.2 毫秒,120 次扫描中只有 4 次执行了实际工作 —— 而没有安装建筑模组的会话则零成本,因为扫描会拒绝运行。 → 生命周期和渠道
能够跨重载保存的状态。 每个已放置的建筑都有自己独立的状态表,你的模组会获得一个存储空间,其 id 已经烘焙在句柄中 —— 无法通过它访问其他模组的数据。
PalForge 从不写入幻兽帕鲁的存档文件。 它自身的数据是纯 JSON,存放在 ue4ss/Mods/PalForge/state/ 下,每个存档一个文件夹,每个模组一个文件。删除模组文件夹,它的所有痕迹也随之消失,对你的世界毫无影响。写入中途崩溃会保留上一个可读版本;无法解析的文件会被原样隔离而不是覆盖;本会话未加载的模组会保留每一个字节,下次加载时完整恢复。
→ 保存状态
开箱即用的编辑器补全。 PalForge 附带一个生成的 types.lua,因此 Lua 语言服务器能够识别每个声明的每个字段和每个句柄的每个方法 —— 包括哪些事件是活跃的,哪些是已声明但没有来源的。无需任何配置。
→ 编辑器设置
⚠️ 仅限单人游戏
PalForge 以单人游戏幻兽帕鲁为目标。不支持专用服务器和合作模式客人,也未经过测试。 没有复制层,物品、生成和事件路由都是客户端权威的。模组可能对主机玩家有效,但对其他人无效。
这是一个刻意的范围决策,不是疏忽或待办事项。请不要将多人游戏行为作为 bug 报告 —— 答案就是本段。
环境要求
- 幻兽帕鲁 —— 针对 v1.0.2.101103(Steam,Win64)版本验证。其他版本很可能也能工作。启动日志会同时打印 PalForge 测试所使用的构建版本和你正在运行的构建版本,因此版本不匹配是你可以直接看到的问题,而不是从模组停止工作后推断出来的。
- UE4SS,附带 Lua 模组加载器。如果你已经在运行其他幻兽帕鲁 Lua 模组,说明你已经有了。不可选。
PalSchema —— 新增内容时的必需品;为已有内容赋予新行为则不需要。请参阅上面的“一个真正新实体是如何工作的”。
CheatManagerEnablerMod —— 可选。 PalForge 会自己构建作弊管理器用于生成,因此它对此不是必需的;它只会改进物品辅助函数(give / take / unlockTech)。
安装说明
- 安装 UE4SS(如果尚未安装)。
- 从“文件”选项卡下载 zip 文件。
- 打开它。里面有一个名为 PalForge 的文件夹,以及许可证和自述文件。
- 将 PalForge 文件夹放入
Palworld/Pal/Binaries/Win64/ue4ss/Mods/。 - 启动游戏。
PalForge 文件夹按原样放入 —— 它的结构就是安装说明。无需配置任何东西,也无需启用任何东西。
检查是否成功,打开 ue4ss/UE4SS.log 并查找:
PalForge v0.3.0 启动 | 游戏构建版本: 声明为 v1.0.2.101103, ... | dev=false debug=false
这就是你会看到的全部内容,也是你应该看到的全部内容。PalForge 默认关闭开发者工具 —— 没有按键绑定、没有测试套件、没有后台运行的东西。安装了基于 PalForge 的模组的玩家应该永远感觉不到它的存在。
卸载,删除 PalForge 文件夹。这会同时移除其保存状态。你的幻兽帕鲁存档无论是否卸载都不会受到影响。
→ 快速开始
没有的功能,直说
一个过度宣传的框架比一个小巧的框架更糟糕,所以:
- 模组不能作为游戏资源发布自带的网格、纹理、声音或材质。 它可以引用游戏已有的数千个资源,也可以从磁盘上的
.obj文件加载几何体。自定义纹理已按照正确的接口接线,但从未被确认能正常工作。 - 有些东西引擎根本不暴露。 此构建版本中没有“建筑被摧毁”事件,也没有“技能命中某物”事件 —— 两者都是通过阅读每个可能拥有该事件的类的每个函数来搜索的。PalForge 会报告它们的缺失,而不是假装存在,建筑消失仍然会以“缺失”为原因的移除事件浮现出来。
- 有一项功能已发布但未经确认: 设置声音的音量可以到达引擎并报告成功,但没有人通过耳朵确认声音是否真的变小了。这个问题被记录为一个未解决的议题,而不是被描述为可用功能。
文档
完整的文档提供英文、日文和中文 —— 每个领域、每个事件、每个诚实的限制:
- 教程:构建内容包 —— 从这里开始
- 快速开始 —— 安装、第一个定义、编辑器设置
- 生命周期和渠道 —— 每个事件,以及哪些是活跃的
- 保存状态 —— 数据存储在哪里以及卸载时会发生什么
- 内容包可以发布什么 —— 诚实的资源表
- API 参考 —— 帕鲁 · 物品 · 建筑 · 技能 · 效果 · 音频 · 网格 · UI
源代码、议题和完整工程记录 —— 包括测量了什么、尝试过什么以及失败了什么、以及故意没有构建什么: github.com/dr-mikan/PalForge
MIT 许可证。 可以基于它构建、分叉、发布、出售。不需要署名,尽管我们非常感谢。如果你用它构建了什么东西,我真的很想看看。
致谢
正在加载版本记录…
正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。