一、背景
偶然看到某鱼上的DST全皮肤mod商家跑路并开源了他的修改版全皮肤mod:
以后不更新了,社区开始查了,也有人倒卖,我对这个市场很失望
我用夸克网盘给你分享了「skin」,点击链接或复制整段内容,打开「夸克APP」即可获取。
/~c8c639XJMp~:/
链接:https://pan.quark.cn/s/55530ffd2d3e
这是模组的源码,可以放到mods文件夹下面,也可以自己上传到创意工坊,以后不再更新了。
该模组通过给官方皮肤 ID 加上 custom_ 前缀制作副本,并在底层伪造所有权检查,让玩家在游戏中免费使用官方的 3000+ 款皮肤。
二、原理解析
通过 skinloader.lua 可以总结出了该模组的四大核心机制:
1. 前缀映射系统
模组在 modmain.lua 中扩展了字符串方法:
local DEFAULT_PREFIX = "custom_"
function string:start_with_that_prefix()
return self:sub(1, #DEFAULT_PREFIX) == DEFAULT_PREFIX
end
function string:trip_that_prefix()
return self:sub(#DEFAULT_PREFIX + 1)
end
所有的皮肤 ID 均采用 custom_ + 官方 ID 的格式(例如:custom_wilson_formal 对应 wilson_formal)。
2. Proxy 函数劫持
为了避免维护庞大的多语言文本表,模组通过 Proxy 模式劫持了游戏的全局查询函数:
local function Proxy(name)
local _fn = rawget(_G, name)
local proxy = function(item, ...)
if item and item:start_with_that_prefix() then
item = item:trip_that_prefix() -- 查询时自动脱去 custom_ 前缀
end
return _fn(item, ...)
end
rawset(_G, name, proxy)
end
Proxy("GetSkinDescription")
Proxy("GetSkinName")
效果:当游戏引擎查询 custom_wilson_formal 的名称时,实际返回的是官方 wilson_formal 的本地化字符串。
3. 所有权伪造
通过 Hook 玩家的库存检查接口,实现“全皮肤解锁”的假象:
CodeBlock Loading...
4. 动画资源的分发
每个拥有独立外观的皮肤需要两个文件:
custom_xxx.zip:动画压缩包(内含build.bin+anim.bin+ 纹理)custom_xxx.dyn:动画元数据
三、如何添加皮肤
官方的皮肤分为多种变体,处理方式截然不同。
一:添加基础角色皮肤(有独立动画)
这类皮肤(如 _d 变体)拥有独立的动画文件,必须声明 assets 块。
CodeBlock Loading...
二:添加 _p 变体皮肤(复用动画)
注意:_p 变体皮肤绝对不能有 assets 块!它们通过 build_name_override 直接复用 _d 版本的动画资源,这为游戏节省了大量内存。
CodeBlock Loading...
三:修补动画文件
千万不要以为把官方的 .zip 复制过来改个名就行了!
.zip 文件内部的 build.bin 嵌入了原始的 build name(如 wilson_spring)。如果代码中传入的是 custom_wilson_spring,游戏引擎会因为名字不匹配而导致皮肤隐身(无贴图、无模型)。
正确做法:
- 解压
.zip,用十六进制编辑器或脚本读取build.bin。 - 找到 build name 字符串,在前面插入
custom_前缀。 - 更新字符串长度字段。
- 重新打包为
.zip。
四、注意事项
1:Assets 块导致游戏崩溃
- 问题:游戏启动直接崩溃,报错
Could not find an asset matching anim/dynamic/custom_armor_wood_rw_gustree.zip。 - 原因:为所有物品条目增加了
assets块。但实际上,官方数据中某些条目属于“引用型皮肤”,它们通过init_fn复用已有动画,根本没有物理文件。必须严格对照官方scripts.zip中的kleiskinprefabs.lua,官方有 assets 模组才能有。
2:隐藏在 Databundle 中的动画文件
- 问题:部分皮肤(如天体瓮、糖果烹饪锅)在游戏中隐身。
- 原因:在游戏的
anim/dynamic/目录中并没有这些文件。官方还有大量动画文件被打包在data/databundles/anim_dynamic.zip中。必须从 databundle 中提取、修补 build name 后再放入模组。