看完了,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。
| 技能 | 默认键 | RPC | 效果 | 代价/限制 |
|---|---|---|---|---|
| 闪避 / Dodge | R (114) | Dodge | 播 jumpout 动画,0.8s 内速度分 25 段飙升,miss=1 期间 GetAttacked 被替身拦截→免疫伤害(shadow_shield3 特效),加 heavybody,并临时改碰撞掩码可穿过障碍 | 冷却 0.9s(missactioning);持续时长随等级 0.35+lv/100×0.35;骑牛时不可用 |
| 蓄力 / Charge | Z (122) | Charge | 设 power=1,生成 carneychargefx 挂在武器上,攻击倍率 = lv*5/200 + 1.25(1.25×→2.5×),命中时爆一段火焰特效 | 必须手持近战武器;回旋镖/吹箭/水球/催眠炸弹无效;命中后饥饿 −5(饥饿已为 0 时额外扣 5 血),卸下武器也会取消 |
| 冰柱 / Icicle | C (99) | Icicle | 两段式:第 1 次按键布置 freshaura 光环(正电子束+冰圈特效),饥饿 −15;第 2 次按键引爆,半径 3 内 AoE 伤害 = (lv+20)*(power/4+1)*(1+敌人数/10),雷击+爆炸 | 饥饿 ≤0 时额外扣 15 血;死亡时自动引爆;若此时处于蓄力状态会一并消耗蓄力 |
| 自我检查 / Check | J (106) | Check | 说话报数:lv X exp Y/maxexp | 无 |
| (占位) | K | K | RPC 已注册但函数体全被注释掉,目前是空技能 | — |
按键可在 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)。carney.lua 的 onkilledother)。reader 标签(可读书),出生带「白色贝雷帽」。carneytab(modmain.lua:980),放帽子/短剑/背包等道具,那是配方不是技能。需要我接着深入某一个技能(比如冰柱的伤害公式、闪避的无敌帧细节),还是准备改造/新增技能?
Now I have everything I need. Let me write the adaptation, starting with the shared client-side skill entry points.
做完了,并且已经在模拟器上跑通。
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.lua | CarneyIsMobile() + 仅移动端客户端 modimport 两个 main 文件(PC 保留键位,专用服务器不加载) |
/ | STRINGS.CARNEYUI 增加技能名与轮盘说明 |
| 描述补手机版操作一行 |
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(块结构配平器)校的,真正的校验靠实机日志。