直接把服务器mod改成客户端mod的核心,就是修改mod文件夹里的modinfo.lua文件,把权限声明从服务器专属改成客户端通用,并关掉所有服务器强制同步选项。 听起来像改配置,但实际上有一半的mod改了也没用,因为底层通信逻辑根本不支持,下面我会把原理、具体改法、以及改了之后不生效的原因全部拆开讲清楚。
为什么要区分服务器mod和客户端mod
饥荒联机版的mod分成三类:纯服务器mod、纯客户端mod、以及同时支持两者的通用mod,这个分类由modinfo.lua文件里的几行代码决定,不搞清楚直接改,十有八九进游戏就报错。
服务器mod 指代码在服务器端运行,所有玩家加入房间时都会被动下载并强制运行,这类mod通常会影响世界生成、生物AI、掉落物、商店NPC之类的全局逻辑。
客户端mod 指代码在你本地机器运行,只影响你看到的画面、UI、操作方式,比如显示血量数值、物品栏整理、地图标记、滤镜美化,这类mod不需要服务器配合,也不会强制别人加载。
行业共识认为,区分两者的关键不是你“想让它怎么工作”,而是它实际调用了哪些接口,如果mod代码里写了AddPrefabPostInit去修改生物属性,那它就是服务器的逻辑;如果只是AddClassInitializer修改客户端类,那它才能跑在客户端。
饥荒怎么把服务器mod变成客户端mod:改modinfo.lua的具体步骤
首先找到mod的文件夹,Steam创意工坊下载的mod都在:
SteamsteamappscommonDon't Starve Togethermods
里面每个数字文件夹对应一个mod,进入后找到modinfo.lua,用记事本或者Notepad++打开,千万别用系统自带的写字板,编码容易乱。
第一步:先看权限声明的五行代码
在modinfo.lua里,一般会有以下五个关键字段,把它们的值都列出来:
client_only_modserver_only_modall_clients_require_modapi_versiondst_compatible
这是饥荒mod里面权限控制的核心,后面的操作就是围绕这几个字段来的,我把常见写法和含义整理成一张表,方便你对照自己的文件。
| 写法 | 含义 | 当前mod类型 |
|---|---|---|
client_only_mod = true |
只作为客户端mod | 不需要改,已经是了 |
server_only_mod = true |
只作为服务器mod | 要改成false |
all_clients_require_mod = true |
强制所有人加载 | 要改成false |
| 两者都写了且为true | 冲突 | 必须先删掉一行 |
第二步:改掉服务器专属声明
找到 server_only_mod = true 这一行,直接把true改成false,或者整行删除,同时把 all_clients_require_mod = true 改成false。
改完之后,保存文件,然后重启游戏,进入mod管理界面看状态,如果这个mod出现在客户端mod列表里,说明声明部分已经成功,这时候套用网上说的“饥荒服务器mod怎么用”的经验,你就能在本地单独激活它了。
第三步:检查是否还需要改modmain.lua
这一步是真正的分水岭,声明改完只是第一步,modmain.lua里写的逻辑才是决定能不能跑在客户端的关键。
打开同文件夹下的modmain.lua,搜索关键词GLOBAL、require、AddPrefabPostInit、AddComponentPostInit、AddRecipe。
- 如果大量出现
AddPrefabPostInit、AddRecipe、AddSimWorldGenRecipe改完也白改,这些接口只能在服务器端执行。 - 如果主要是
AddClassInitializer、AddScreenIndicators、Modifier:AddWidget之类完全可以跑在客户端。
只改声明不改代码的后果就是:mod在列表里显示为客户端mod,但进游戏后完全没效果,甚至直接红字报错,这种半吊子状态在“饥荒联机版mod客户端不显示”的求助帖里非常常见。
改完之后不生效的坑:哪些mod永远改不了
如果modmain.lua里用了下面这些API,直接放弃改成客户端mod这条路,因为你等于让一台没网线的电脑去连服务器,根本做不到。
绑定世界生成的mod
饥荒服务器mod里的地图生成、洞穴扩展、地形改造,全部发生在世界创建阶段,客户端mod启动的时候,世界早就生成完毕了,就算你强行跑,本地生成的地图和服务器地图完全不同步,轻则显示错位,重则崩溃。饥荒mod文件夹在哪这个问题很多人都会搜,但搜到了也不代表能解决这个本质矛盾。
依赖服务器数据的mod
模组如果每次运行都要从服务器拉取全局变量、读取世界存档数据,或者监听服务器的网络事件,那客户端这边就是无源之水,这类mod的代码通常长这样:
AddEventReceiver("ms_sendmods", function() ... end)
这种事件监听写在客户端代码里,服务器那边根本不会往你这边发消息,所以永远触发不了。
临时替代方案:把mod塞进服务器mod位置
多数情况下,遇到这种情况建议别硬改,直接换方案,在Steam创意工坊里搜“Client Only”标签,或者去Nexus Mods找对应版本的客户端替代mod,比如你想看生物血量,与其硬改服务器mod,不如去找“Combined Status”这种本身就是客户端向的mod,订阅后直接在客户端mod列表里勾选即可。
常见问题解答
饥荒服务器mod变成客户端mod之后朋友需要下载吗
不需要,客户端mod只影响你本地的显示和操作,房主创房时不会把它设为强制下载,其他人进房也不会被自动拉取,你的画面和操作变了,但别人看到的还是没有mod的样子。
修改modinfo.lua之后创意工坊更新会把改动覆盖掉吗
会,而且相当一部分mod开发者会定期推送更新,一旦Steam自动更新了这个mod,modinfo.lua会恢复成原版服务器声明,你的改动全部白费,而且Steam创意工坊mod的文件夹是只读状态,你改完之后有时候需要右键文件夹把只读属性去掉,否则保存都存不上,要长期用,建议把整个mod文件夹复制到mods目录的根下,改个新名字,这样就能绕过创意工坊的更新检控,但代价是失效了需要手动删。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/686437.html





