EasyWeapon
[AI-generated] Client-only weapon tweaks: faster reload (crossbows/grappling hook), reloads that survive run/jump/dodge, and a tuned chain lightning (weapon proc chance + ChainLightningRed effect parameters).Changelog
1.1.0
新增功能 3:连锁闪电强化 —— 改 prefab 静态数据,纯客户端生效。
武器侧:凡「命中时生成连锁预制体」的攻击槽,主/副攻击的 m_spawnOnHitChance
统一成同一个值(默认 0.66;原版主攻击 0.25、副攻击 0.20)。
特效侧:ChainLightningRed(雷血 / BloodLightning 那一族武器用的连锁特效)的参数可配:
| 参数 | 原版 | 本版默认 |
|---|---|---|
起始判定 m_chainStartChance |
0.9 | 1.0 |
每目标几率 m_chainChancePerTarget |
0.3 | 0.66 |
目标数 m_chainMinTargets ~ m_chainMaxTargets |
2 ~ 4 | 4 ~ 6 |
逐跳衰减 m_chainStartChanceFalloff |
0.6 | 0.8 |
起始延迟 m_chainStartDelay |
0.18 s | 0.18 s |
判定半径 m_radius |
8 m | 12 m |
特效存活 m_ttl |
3 s | 不改(保持游戏默认,本模组完全不碰该字段) |
每跳闪电伤害 m_damage.m_lightning |
75 | 90 |
实现
- 武器侧挂
ObjectDB.Awake的 postfix,特效侧挂ZNetScene.Awake的 postfix (反汇编确认ZNetScene.Awake开头就填m_namedPrefabs,postfix 时GetPrefab(name)可用; 且 ZNetScene 没有"运行时注册预制体"的方法 ⇒ 名字表在 Awake 后固定,必须赶在实例化前改)。 - 识别判据与游戏自己的
Attack.SpawnOnHit()完全一致 (m_spawnOnHitChance > 0且m_spawnOnHit != null,再加"目标预制体名以ChainLightning开头") ⇒ 不写死武器名单,游戏日后新增连锁武器会自动跟上。 - ⚠️ 特效存活时长
m_ttl不修改 —— 保持游戏默认值(3 秒)。 配置项RedTtl的默认值是-1,含义就是"保持游戏默认、完全不碰这个字段", 只有填正数才覆盖 ⇒ 将来游戏改了默认值也不会被本模组顶掉。 - 全部是绝对值赋值(不是乘倍率)⇒ 天然幂等;另有"已应用"标记防止场景重建时重复刷日志。
注意
- ⚠️ 只改
ChainLightningRed一族。另一族ChainLightning(闪电附魔$item_*_lightning那批武器用的)的参数本模组不动 —— 但它们的触发几率同样受WeaponProcChance影响。 - ⚠️ 改的是 prefab 静态数据 ⇒ 效果只体现在装了本模组的一端:伤害由攻击者本地计算后同步, 但别人屏幕上看到的连锁范围/存活时长仍按他们自己的 prefab 数据。
- 三项功能互相独立,
3 - Chain Lightning节的Enabled可单独关闭。
1.0.1
仅文档与源码注释,行为不变(因此 DLL 重新编译、指纹变化,但功能与 1.0.0 完全一致)。
- EasyGear 1.0.5 已把「跑步时也能切换武器 / 工具」整体剔除 ⇒ 本模组 README 与源码注释里
"与 EasyGear 共存"的说明随之过时,改为中性描述:本模组不依赖任何上游,
Priority.Low保留给将来可能出现的同类模组(让别人的判定先做)。 - 版本号一并升 —— 保持「版本号唯一标识内容」,避免同一个 1.0.0 对应两份不同的文件。
1.0.0
首个版本。
新增
- 装填时间倍率 —— 弩(8 把:Arbalest / Ripper×4 变体 / Gold×3 变体)与钩索默认减半 (时间 ×0.5)。钩索 2.0 s → 1.0 s;弩 3.5 s → 1.75 s(弩技能满级时 1.75 s → 0.875 s)。 法杖(闪电法杖充能 1.9 s)与其它「需要装填」的武器各有独立开关,默认关闭。
- 装填不被打断 —— 奔跑 / 跳跃 / 闪避翻滚时不再清掉正在进行的装填动作, 装填进度与进度条都不归零。攻击仍然照原版打断。
实现
- 功能 1 挂
ItemData.GetWeaponLoadingTime()的 postfix(该方法是全程序集 唯一调用点为Player.QueueReloadAction的纯计算函数,改动影响面被天然圈死)。 绕开了!m_requiresReload返回常量1f的分支。 - 功能 2 挂
Player.ClearActionQueue(override,实际执行的那份;Humanoid上的是空实现)。原版该方法只有m_actionQueue.Clear()一条语句、无其它副作用, 所以「只清空非装填动作」与整体清空在其它方面完全等价。 队列字段Player.m_actionQueue为私有,用AccessTools.FieldRefAccess反射。 来源判定用深度计数(非 bool),标Priority.Low让其它模组的判定先执行。
兼容
- 纯客户端;无
NetworkCompatibilityAttribute、无 Jotunn、无 ServerSync / CCS。 - 与 EasyGear 的「跑步时也能切换武器 / 工具」共存无冲突(两者都是"保留队列"的语义)。
