s6652289-EasyWeapon icon

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

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

首个版本。

新增

  1. 装填时间倍率 —— 弩(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)与其它「需要装填」的武器各有独立开关,默认关闭。
  2. 装填不被打断 —— 奔跑 / 跳跃 / 闪避翻滚时不再清掉正在进行的装填动作, 装填进度与进度条都不归零。攻击仍然照原版打断。

实现

  • 功能 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 的「跑步时也能切换武器 / 工具」共存无冲突(两者都是"保留队列"的语义)。