卡尼猫移植对话快照 · 2026-09-12
D:\Project\dst\mods\949808360 ,先看看有哪几个“技能”
9月11日 20:12

看完了,949808360 是「卡尼猫 / Carney」自定义角色 mod(v2.2.8)。mod 里的"技能"不是 DST 官方技能树,而是靠按键触发 + ModRPC 实现的战斗技能,全部注册在 mods\949808360\scripts\carney_util\carney_util.lua(按键绑定在 142–194 行),实际效果在 scripts\prefabs\carney.lua 和 scripts\components\carneystatus.lua。

主动技能(4 个 + 1 个空壳)

技能默认键RPC效果代价/限制
闪避 / DodgeR (114)Dodge播 jumpout 动画,0.8s 内速度分 25 段飙升,miss=1 期间 GetAttacked 被替身拦截→免疫伤害(shadow_shield3 特效),加 heavybody,并临时改碰撞掩码可穿过障碍冷却 0.9s(missactioning);持续时长随等级 0.35+lv/100×0.35;骑牛时不可用
蓄力 / ChargeZ (122)Charge设 power=1,生成 carneychargefx 挂在武器上,攻击倍率 = lv*5/200 + 1.25(1.25×→2.5×),命中时爆一段火焰特效必须手持近战武器;回旋镖/吹箭/水球/催眠炸弹无效;命中后饥饿 −5(饥饿已为 0 时额外扣 5 血),卸下武器也会取消
冰柱 / IcicleC (99)Icicle两段式:第 1 次按键布置 freshaura 光环(正电子束+冰圈特效),饥饿 −15;第 2 次按键引爆,半径 3 内 AoE 伤害 = (lv+20)*(power/4+1)*(1+敌人数/10),雷击+爆炸饥饿 ≤0 时额外扣 15 血;死亡时自动引爆;若此时处于蓄力状态会一并消耗蓄力
自我检查 / CheckJ (106)Check说话报数:lv X exp Y/maxexp无
(占位)KKRPC 已注册但函数体全被注释掉,目前是空技能—

按键可在 mod 配置里改(modinfo.lua 的 DodgeKey/ChargeKey/IcicleKey/CheckKey),默认就是描述里的 "RZC"。

被动/成长(严格说不算技能,但属于角色能力)

  • 等级系统(carneystatus.lua):走路每步 +0.5 exp;吃鱼 +1000 exp/理智 +20,鱼料理 +2000/+30,加香料的 +3000/+40;击杀怪物或可冰冻生物按其最大生命值加 exp。升级公式 maxexp = lv*200 + 100,等级无上限(配置项可锁 50)。
  • 升级收益:每级 +2 饥饿上限、+1 理智上限、+1 血上限,并回复 1/5 最大血量。
  • 掉落倍率:每次击杀 roll 1–100 ≤ 等级就多掉一份战利品(carney.lua 的 onkilledother)。
  • 机动/环境:走跑速度基础为威尔逊 ×1.25;世界温度 <40 时体温 −10;自带 reader 标签(可读书),出生带「白色贝雷帽」。
  • 侧边还有一个自制制造页 carneytab(modmain.lua:980),放帽子/短剑/背包等道具,那是配方不是技能。

需要我接着深入某一个技能(比如冰柱的伤害公式、闪避的无敌帧细节),还是准备改造/新增技能?

9月11日 20:13
读 api 文档,然后适配手机版操作:闪避放到“动作按钮-人物技能”,蓄力、冰柱、自我检查用“轮盘”(mpatch里复制过来)
9月11日 22:28
失败

做完了,并且已经在模拟器上跑通。

读了什么

docs/MOD_API.md(§7 客户端/服务端分裂、§8 移动端/触屏、§8.9 两个技能按钮、§9 防御式写法)、docs/PORTING.md、docs/NEW_PORT_PROMPT.md,并用 work140/scripts/ 官方源码逐个核对:widgets/actioncontrols.lua(按钮结构 + 触摸→OnControl→onclick 链路)、frontend.lua(触摸派发/touchwidget/StartUpdatingWidget)、components/playeractionpicker.lua(pointspecialactionsfn 为 nil → 技能2 位平时是空的)、screens/playerhud.lua(编辑模式判定)。

入口判定:官方左侧两个技能位里,handActionButton 是手持物品的 AOE 位,specialActionButton(技能2,action_skill2.tex,自带 info 文字框)才是角色“点地/双击特殊动作”位(威尔逊投火把、Wheeler 闪避 DODGE、景熹射门都挂这里)→ 闪避放这里;三个非位移技能进轮盘。

改了什么

文件改动
carney_util.lua抽出客户端技能入口 CarneyClientDodge/Charge/Icicle/Check + SendCarneyRPC(发送时现取 GetModRPC,回落 legacy MOD_RPC),经 GLOBAL.CARNEY_CLIENT_ACTIONS 暴露;PC 键位改调同一份函数,服务端 RPC handler 未动。闪避补回本地起手动画(服务端 AnimState 不会同步到客户端)
carney_mobile.lua(新)包装 actioncontrols:OnUpdate,卡尼猫时把技能2 位接管为「闪避」:改写 onclick、info 文字、冷却置灰;换角色/编辑模式还原官方 onclick,并用官方同一套 IsActionsAllowed(制作栏/指令轮盘/法术轮盘/IsActionsVisible)避免抢显隐
radial_wheel.lua(新,复制自 MPatch)只改三处:RADIAL_WHEEL_CONFIG 三个显式 fn 选项(蓄力/冰柱/自检,sort_by_key=false 保序)、新增 owner_prefab="carney" 守卫(非卡尼猫隐藏轮盘按钮)、IsEditMode() 改用官方 PlayerHud:IsInEditMode();auto_capture_keys=false,不去抢别的模组键位
modmain.luaCarneyIsMobile() + 仅移动端客户端 modimport 两个 main 文件(PC 保留键位,专用服务器不加载)
/ STRINGS.CARNEYUI 增加技能名与轮盘说明
描述补手机版操作一行

实机验证(已推送,2026-09-11)

work140\_build_klump.py → 117MB klump.zip → adb push → force-stop 重启 → 读 client_log.txt:

  • [CarneyMobile] actioncontrols hooked → dodge button active(卡尼猫识别成功)
  • 点闪避:dodge clicked, action=true × 10(RPC 每次都发出)
  • 轮盘:Open wheel, keys=3 → Finish trigger=true → Trigger fn label=蓄力 / 自检 / 冰柱 三项全通
  • 无 Mod error / DisableBecauseBad / attempt to ...;日志里那条 Error decoding lua RPC mod namespace 在改动前的旧日志里同样是 1 次,属既有现象

顺带发现(与本改动无关):日志有 FMOD Error: Can't play event 'dontstarve_DLC001/creatures/catcoon/swipe_tail',是手机版裁掉了该 FMOD 事件,本改动不碰音频、也不生成浣熊猫。

还没实测的:换角色还原、编辑模式拖动、鬼魂态隐藏、退出再进/切换世界(代码都做了守卫,清单写在 手机版移植总结.md 里)。另外本机没有 lua 解释器,语法是用 .tmp_adb\lua_check.py(块结构配平器)校的,真正的校验靠实机日志。

本轮文件改动
+ 8 个文件+ 7 个文件+ 6 个文件+ 5 个文件+ 4 个文件+ 3 个文件
carney_mobile.lua闪避技能接管官方动作按钮“人物技能”位在侧边栏预览
radial_wheel.lua从 MPatch 复制的径向轮盘,改为蓄力/冰柱/自检三项显式技能在侧边栏预览
carney_util.lua抽出客户端技能入口,PC 键位与手机 UI 共用同一份逻辑在侧边栏预览
modmain.lua仅移动端客户端加载两个 main/*.lua在侧边栏预览
9月11日 22:52