ZooZoo-BearHoney icon

BearHoney

新增一件月球主动装备「瓶中蜂蜜」,效果是弱化版的尖晶强心剂。

By ZooZoo

CHANGELOG

Changelog

1.0.3(版本号更新)

  • 版本号 1.0.2 → 1.0.3,用于区分重新分发的安装包
  • 文案、数值、图标、模型、音效均未改动

1.0.2(描述文案调整)

  • 模组简介(manifest description)精简为一句:新增一件月球主动装备「瓶中蜂蜜」,效果是弱化版的尖晶强心剂
  • README 改为分三行的完整说明:七项属性、持续 20 秒 / 冷却 45 秒、永续搭配方案,并注明所有数值可在 Config editor 中修改
  • 模组功能、数值、图标、模型、音效均未改动

1.0.1(README 精简)

  • README 正文改为单段简介:月球主动装备「瓶中蜂蜜」,列出七项属性、持续 20 秒 / 冷却 45 秒,以及「2 个溺亡者的心意」或「1 个溺亡者的心意 + 1 个燃料电池」的永续方案
  • 去掉了原 README 里的 YAML 头信息与安装说明,正文即简介
  • 模组功能、数值、图标、模型、音效均未改动

1.0.0(更名为 BearHoney)

本版起模组由 CannedHoney 更名为 BearHoney,版本号重新从 1.0.0 开始。

  • 程序集 / 命名空间 / 插件 GUID 全部改为 BearHoney,GUID 现为 com.bearhoney.RoR2
  • 配置文件变为 com.bearhoney.RoR2.cfg(旧配置文件不会自动迁移,需要重新设置)
  • 安装目录:BepInEx/plugins/BearHoney/BearHoney.dll
  • 内部名称:装备 BearHoney、副作用 BearHoneyAffliction、增益 bdBearHoney
  • 冷却 40 秒 → 45 秒
  • 游戏内显示名「瓶中蜂蜜」、图标、模型、属性数值均未改动

1.0.0 以下的版本属于更名前的 CannedHoney 时期,仅作历史记录。

1.8.3(全量代码审计)

模型渲染:双面网格的法线被平均掉

  • ObjModelLoader 做双面时只复制了三角形索引,没有复制顶点。结果 vertexNormals.Count != vertices.Count,会走 RecalculateNormals;而正反两面共享顶点,法线互相抵消,整件模型会偏黑、光照发平
  • 修复:双面时同步复制顶点,背面法线取反;备用车削模型(MeshData.ToMesh)同样处理
  • 顶点数翻倍后仍在 Unity 单网格上限内(最大单件约 9.7k)

护盾缓存

  • baseShieldAdd 的基数反推依赖「上次自己加了多少」。如果护盾装备在增益期间被移除,maxShield 归零但旧 bonus 还留在缓存里,下一次重新获得护盾时反推基数会偏小。现在基数为 0 时一并清掉缓存

拾取模型加载

  • 尖晶强心剂 prefab 增加缓存,避免重试协程每 0.5 秒重复 LoadAssetAsync 造成 Addressables 句柄堆积

1.8.2(代码审查修复)

护盾 +15% 之前实际上没生效

  • 原因:StatHookEventArgs.shieldTotalMult 在 R2API 的 IL 注入里只乘在「基础护盾 + 等级护盾」这一段;护盾类物品(个人护盾发生器、超越等)的加成是在这之后用 num93 += 累加的,乘不到
  • 现在改用 baseShieldAdd 注入固定增量,并用 ConditionalWeakTable 记住上次加的数值,从 body.maxShield 反推原始护盾,避免每次重算把加成算进基数导致指数增长
  • 不触碰 maxShield,所以原版 num146 = 新上限 - 旧上限 的补盾 / 削盾逻辑仍然正常

其他修复

  • 死亡时漏结算:CharacterBody 销毁时不一定走 SetBuffCount,待发放的副作用层数会留在 master 上,被算到下一次喝药(等于一次喝药吃两次副作用)。现在监听 GlobalEventManager.onCharacterDeathServer,死亡时也结算
  • 结算逻辑抽成 SettlePending(),先销毁 tracker 再发放,重复调用安全
  • Activate 增加 HoneyAffliction.itemIndex != None 判断,物品尚未注册时不记录无效层数,并打出明确日志
  • LoadPickupModelRoutine 在 HoneyEquipment 为空时增加空引用保护
  • 副作用物品描述补上「额外承受 +10% 诅咒(降低最大生命值)」,与实际的 baseCurseAdd 一致

1.8.1(护盾隐藏 / 拾取红字 / 音量对齐)

  • 详细描述里移除护盾一行:护盾 +15% 照常生效,只是不再写进文字
  • 拾取文本改用原版尖晶强心剂同款颜色:副作用那句包在 <color=#FF7F7F> 里(取自 EQUIPMENT_TONIC_PICKUP)
  • 音效改为走原版同一条路径:NetworkSoundEventCatalog.FindNetworkSoundEventIndex("Play_item_use_tonic") → EntitySoundManager.EmitSoundServer,挂载对象与音量与尖晶强心剂完全一致,多人客户端也能听到;catalog 未注册时回退 Util.PlaySound
  • 移除了 1.8.0 里手动补播的客户端 RPC 补丁(不再需要)

1.8.0(两套描述 + 音效修正)

描述分成两套(对齐尖晶强心剂)

  • pickupToken(地上 / 商店 / 标记 ping / 拾取提示):立即获得小幅全属性加成。效果结束后有几率产生所有属性降低的副作用。
  • descriptionToken(拿到身上后的装备栏详细描述):恢复逐项数值 —— 伤害 +30%、攻速 +20%、护甲 +10、最大生命 +15%、护盾 +15%、回血 +50%、移速 +20%,并保留 20% 几率与副作用效果说明
  • 运气影响的文字仍然不显示

音效:找到真正的事件了

  • 上一版复制 TonicBuff.startSfx 的做法无效——尖晶强心剂的使用音效实际是 Wwise 事件 Play_item_use_tonic(资源 Audio/GeneratedSoundBanks/Windows/use_tonic.bnk,事件 ID 2813300389)
  • 现在改为显式播放该事件:
    • 服务器 / 单人:在 Activate 里 Util.PlaySound("Play_item_use_tonic", body.gameObject)
    • 多人客户端:在 RpcOnClientEquipmentActivationRecieved 之后补播(主机已播过,不重复)
  • 移除了无效的 startSfx 协程

1.7.0(描述简化 + 使用音效)

描述

  • 装备描述改为概括文字:「立即获得小幅全属性加成。效果结束后有几率产生所有属性降低的副作用。」
  • 不再罗列各项数值、触发几率
  • 运气影响的说明从界面移除,但判定逻辑完全保留(仍按 master.luck 做多骰取最优/最劣)
  • 拾取提示同步改为「小幅全属性加成」

音效

  • 新增:使用瓶中蜂蜜时播放尖晶强心剂的使用音效
  • 实现方式:把 RoR2Content.Buffs.TonicBuff.startSfx 复制到自定义 buff 的 startSfx 上。RoR2 的 AddTimedBuff 会在每次添加限时增益时自动通过 EntitySoundManager 播放该音效,所以每次使用都会响
  • 若 TonicBuff.startSfx 在启动阶段尚未加载,会在后台等待并在就绪后补上

1.6.1(副作用图标改色)

  • 按反馈只改颜色、不动形状:以主物品图标的同一张图为源,做渐变映射重上色
  • 色阶取自参考图实测:#2D2A43(暗部)→ #3E3D5D(中调)→ #435676(亮部),两端做合理延伸
  • 原金色蜂蜜在同一色阶里被推到最高光,变成浅灰蓝(#889AC2),轮廓与位置完全保留
  • 轮廓光由青色改为灰蓝,蜂巢纹理、晶体塞、瓶身切面均未改动一个像素
  • 主物品图标与增益图标仍是金色蜂蜜版,未改动

1.6.0(副作用图标 + 运气机制)

副作用图标

  • 重画为冷色调:深蓝近黑瓶身 + 浅灰蓝六瓣浮雕纹样 + 淡蓝晶体塞 + 少量飘散碎片
  • 与主物品「瓶中蜂蜜」(深蓝瓶身 + 金色蜂蜜)在物品栏里一眼可分
  • 128×128 透明底;导出时只保留瓶身主体,角标与背景全部丢弃

副作用几率现在受运气影响

  • 之前直接用 CheckRoll(20) 判定,等于绕过了运气。现改为与原版尖晶强心剂相同的写法:!CheckRoll(100 − 基础几率)
  • master.luck 每层四叶草 +1、每层纯净 −1
  • 实际概率按 RoR2 的「多骰取最优/最劣」规则换算:
    • 运气 ≥ 0:P = p^(luck+1)
    • 运气 < 0:P = 1 − (1−p)^(|luck|+1)
  • 基础 20% 时:运气 +1 → 4%,0 → 20%,−1 → 36%,−3 → 59%,−10 → 91.4%
  • 装备描述里补上了「受运气影响」的说明
  • 日志会打印基础几率、当前运气、换算后的实际几率

1.5.2(副作用修复)

修复:副作用道具不再从物品栏消失

  • 根因:副作用物品一直使用 hidden = true。RoR2 物品栏的显示判定是 ItemIsVisible() => !itemDef.hidden,所以物品其实已经被发放进背包,却永远不会被画出来
  • 修改:hidden 改为 false,物品栏会正常显示图标与叠加层数,发放时也会弹出获得通知(GenericPickupController.SendPickupMessage,与原版一致)
  • 图鉴仍然不显示:日志的收录条件是「品质对应的 ItemTierDef.isDroppable」。本物品品质为 NoTier,而游戏里根本不存在 NoTier 的 ItemTierDef,因此天然被排除;另外补了一个 Harmony 兜底
  • 宝箱 / 三选一 / 打印机 / 净化池仍然不会出现:ItemTag.IgnoreForDropList + canRemove = false,两条独立保险
  • 稳定性:待结算层数从 CharacterBody 移到 CharacterMaster,玩家死亡 / 重生重建 body 时不会丢层数
  • 可观测性:每次使用都会在日志里打印是否触发副作用,结算时打印发放层数与当前总层数

1.5.1(代码审查修复)

  • 修正资源地址:Addressables 地址应写成 RoR2/Base/<名称>/<文件>.prefab(去掉 Assets/ 与 Equipment、Items 等分类目录)。1.3.0 误改成了带 Equipment/ 的路径,会导致拾取模型加载失败,现已回退
  • 地址加载改为多级回退:Tonic 与材质模板各准备多个候选地址,逐个尝试
  • 网格双面化:OBJ 是逆时针绕序、Unity 以顺时针为正面,为避免绕序判断错误导致整件模型被剔除(看不见),所有部件正反两面都生成;备用车削模型同样处理
  • 补写顶点色(全白):部分拾取物 shader 会乘顶点色,缺 COLOR 流时可能整件变黑
  • 修复:自定义模型因 Addressables 未就绪而失败时,即使回退到原生瓶子也会继续重试,不会一直停在原生模型
  • 增益结束时的副作用记录组件会及时销毁;若结算时无法发放(inventory / ItemIndex 不可用)会丢弃层数并告警,避免残留层数被算到下一次增益上
  • 清理了未使用的蜂巢贴图生成代码

1.5.0

模型按图标重建

  • 瓶身改为12 面切面低模(倒角 2.6mm),和图标的多边形轮廓一致
  • 瓶腹新增6 块六边形浮雕板(正面最大),用略深的藏蓝材质区分
  • 晶体塞改为六棱柱 + 锥尖;颈环、蜜环、挂蜜按图标比例调整
  • 全部部件硬面着色,拆成 11 个 OBJ 嵌入 DLL(body / collar / stopper / ring / drop / panel_0~5)

1.4.0

3D 模型换成 Blender 建模

  • 用 Blender 5.2 重新建模并导出 OBJ(内嵌进 DLL),共 6 个部件:瓶身 / 金属颈环 / 六面双锥晶体塞 / 瓶口蜜环 / 蜜池 / 挂蜜
  • 瓶身轮廓用 Catmull-Rom 插值 + 64 段车削,肩线与瓶底过渡更顺;法线为 Blender 平滑法线
  • 运行时由模组内置的极简 OBJ 解析器生成网格,并按圆柱投影生成 UV(蜂巢刻纹贴图可正常显示)
  • 原来的程序化车削模型保留为备用:OBJ 读取失败时自动回退

1.3.0

3D 拾取模型(新)

  • 新增程序化生成的拾取模型:不透明深蓝瓶身(28 段车削低模)+ 蜂巢刻纹贴图 + 金属颈环 + 六面双锥晶体瓶塞 + 瓶口蜂蜜环与挂蜜
  • 模型在运行时用代码生成,不需要任何 assetbundle;材质取自原生不透明拾取物,保证 shader 可用
  • 拾取模型:优先用自定义模型,失败时退回尖晶强心剂的原生瓶子模型
  • 新增配置 General.UseCustomModel(默认 true)与 General.UseTonicModelFallback(默认 true),可随时退回原生瓶子模型

1.2.3

图标(重新绘制)

  • 全新绘制的不透明瓶身:深蓝近黑漆面,带分面与蜂巢刻纹("有一点纹路")
  • 蜂蜜只在瓶口:塞口溢出小小一圈 + 挂在颈环上的一小滴,瓶腹、瓶肩完全无蜜
  • 晶体瓶塞 + 金属颈环 + 青色月球边光,构图/尺寸/配色对齐尖晶强心剂
  • 导出前抠掉纯黑背景并裁掉主体以外所有像素,右下角「AI生成 / WORKBUDDY」角标随之丢弃,成品无任何文字

1.2.2

图标

  • 按最新提供的图重新导出:右下角「AI生成 / WORKBUDDY」文字已完全剔除
  • 导出时只保留瓶身主体(抠黑底 + 最大连通区域裁剪),主体以外的像素全部丢弃,水印、角标不可能残留
  • 128×128 游戏内图标 + 256×256 商店图标都来自同一张干净图

1.2.1

图标

  • 按反馈调整:蜂蜜只留在瓶口(塞口周围一小圈 + 颈环处一点点),瓶身完全干净,不再有挂壁的蜂蜜
  • 瓶身仍为不透明的深蓝漆面,青蓝月球边光、构图与配色不变

1.2.0

改名

  • 物品名:罐装蜂蜜 → 瓶中蜂蜜(英文名 Bottled Honey)
  • 描述、拾取提示、日志文案全部同步为「瓶中蜂蜜」

图标

  • 重画为瓶形:窄颈、圆肩、圆腹,瓶身完全不透明(实色深蓝漆面,不再有玻璃透光)
  • 尖晶石瓶塞 + 金属瓶颈环,金色蜂蜜从塞口溢出并顺瓶身流下
  • 128×128,深蓝近黑 + 电解青边光 + 蜂蜜金,构图/配色对齐尖晶强心剂
  • 装备落地模型继续复用尖晶强心剂(本身就是瓶子)

1.1.0

数值调整

  • 最大生命值:+20% → +15%
  • 护盾:+20% → +15%,仍然照常生效,但不再写进道具描述文字
  • 其余数值不变:伤害 +30%、攻速 +20%、护甲 +10、被动回血 +50%、移速 +20%、冷却 40 秒、持续 20 秒

副作用道具修复

  • 修复:「蜂蜜副作用」被当成普通 1 级物品,会出现在图鉴、箱子和三选一机器里
  • 现在该物品为 NoTier + hidden + IgnoreForDropList:
    • 不进图鉴(日志)
    • 不进任何箱子 / 商店 / 三选一的掉落池
    • 不弹拾取提示、不显示在物品栏 → 1.5.2 已修正:hidden 会让物品栏不绘制,现改为正常显示
  • 副作用效果保持不变(每层 -5% 伤害/攻速/移速/回复,+10% 诅咒,可叠加)

图标

  • 重画图标:不透明的深蓝色金属罐(不再是透明瓶身),蓝色月球光边 + 金色蜂蜜,尺寸 128×128

1.0.0

  • 首个版本