持续伤害致死来源与奖励分派

后续:普通与冠军怪初始经验和声望已接通奖励初始数据,当前剩余池/正式致死事务仍继续。

接续周期 HP 更新。本批将原版致死分派写成 CoreSim 可执行核,并以机器码核对;正式周期致死/奖励消费者尚未接通,不是全 DoT 武器已经完成。

精确选择与回调次序

入口前提:外部 health tick 已经执行,HP≤0,未被状态5/6的外层门跳过。

  1. 无 effect manager 直接返回。不能用一个空 manager 替代,否则会多清池/发事件/死亡。
  2. 按 passive、dynamic 顺序找候选:TYPE52/156,或 slot0<0 的 TYPE7/124。52先查slot0但无论正负仍候选;156不查询slot0。
  3. 每表仅处理第一条具有 character 或 item source 的候选。item 非 CEquipment/没有 owner 也消耗该表机会,不继续找“更好”的来源。
  4. 尚未选择来源时,取 character 或 equipment owner;已有来源时,对新候选的来源发 XP(0)、fame(0),保持原选择。
  5. 清当前槽效果 source 并重新取值一次,然后进入下一张表。
  6. 活跃 TYPE80 用首条效果的 character source 覆盖最终选择,包括覆盖成 null。
  7. 最终来源有 owning player 时,对最终来源发奖励回调;否则 target+0x204 若存在且状态非5/6,回落给它。回落不改死亡回调的 source
  8. 清 XP/fame 剩余池 +0x5A0+0x5A4;通知 event(4,0);本地权威且非 INVINCIBLE 时调用死亡虚函数。

最后的权威/无敌门只管死亡调用,不跳过前面的奖励与事件步骤。奖励参数是 signed int;是否真正增加、如何乘倍率/分享/升级由接收器内部决定。

为什么不能省掉金额为零的回调

玩家 XP override 5B4350 在调用基础 52F970 后,仍可能转入保存统计 6BD4E0,并不以金额非零为总前提。即使基础经验处理没有增加点数,该调用仍可能有其他作用。因此不能把第二张表来源的 XP(0)/fame(0)当空操作删掉。

回调后要重新读取

在 character 来源分支,原代码 XP 回调后重新读当前表槽,再获取 source 发 fame、清 source。如果回调改变了该槽,后续操作针对新的槽对象。

target+0x204 回落也是如此:XP之后重新读一次再发fame,所以特殊回调可以使经验接收者与声望接收者不同。可执行核分别保留 XP 接收者、fame 接收者和死亡来源。

参考用例:passive前两项来源1、2;dynamic前两项来源3、2;回落玩家4。只处理来源1和3的效果,来源3得到两次零金额回调,来源4接收剩余奖励,但死亡 source 仍为1。

清来源不是清等级

7A8CA0(null,true) 清除 live reference,并重新取值一次;即使旧 SOURCE 已经为空仍会重新取值。此时 USEOWNERLEVEL 不重设 LEVEL,因为新 source 为空。

CoreSim 的 NativeDotEffects.ClearSource 保留原槽、曲线、LEVEL和历史 SourceKey/SourceLevel,执行一次 TransferEffects.Reroll。v32 的 SourceCleared 区分“明确清除的 Source=0”与身份缺失;保存/读取不重掷,模板数组不共享。

尚未完整表示的来源相关 STATMODIFY 清除仍受保护,不把旧倍率冒充新计算。

原生验证范围

EXE SHA256:186472c3057b38f4cdff4696959a943c396ae6166995f7418997b5ea853e8a5e

388组原 53C2F0 致死分派与实际 7A8CA0 清来源路径,来源、signed奖励参数、清池和被观察回调顺序一致。包括无管理器、无来源、item无法转为equipment、TYPE80、无敌/非权威及三组回调中更改表槽/回落玩家的用例。

modifyHealth强制HP为0;类型转换/owner查找/槽求值/奖励/事件回调为输入边界。清来源用例没有旧source-definition handle,弱引用注销和reroll算术为边界。不声称执行了整个XP升级/分享、全部source-definition/modifier分支或Godot主场景致死。

1515条核心断言、304项相关Python回归与Godot C#构建通过。核心另验证一次真实MWC取值、清来源后LEVEL保留、already-null再次取值和v32重放。

仍需接入

生产循环目前仍保留 periodic_death_context_missing。需完成剩余奖励池的生产/维护及事件消费者,再把致死核心纳入同一事务。

已定位:522BE0初始化/重算XP和fame;53D5A0直接伤害死亡;52F9705B4350经验接收、52FF10声望接收;513960(4,0)观察者通知。直接伤害段先死亡再奖励,持续死亡先奖励再通知/死亡,两者不能简单合并。

577BF0 owner查询先看+0x280关联对象的+0x40,只有关联对象不存在才回落+0x48C→7D02407CADF0。当前装备栏位置不等于这条完整查询。

控制/外部dynamic混排、正式死亡表现/任务/掉落及UNITTHEME仍继续。武器构造仍为1053/1419,TYPE52准入未开放。