Inventory.SetStackAt до записи в слот зовёт LogToolBeltUsageEvent, та считает passive_effect без сущности и падает на значении из CVar (@$necroKnifeDamageCVar; в игре так же у мода modMeleeFortifyingGrip и админской одежды). Исключение телеметрии глотается финализатором, слот пишется как обычно. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
33 lines
1.6 KiB
C#
33 lines
1.6 KiB
C#
using System;
|
||
using HarmonyLib;
|
||
using UnityEngine;
|
||
|
||
namespace NecromancerTome
|
||
{
|
||
/// <summary>
|
||
/// Баг игры 3.4 (найден 24.10.2026: «словил ошибку при переключении ножа», #79). Inventory.SetStackAt
|
||
/// ДО записи в слот пояса зовёт новую аналитику LogToolBeltUsageEvent; та считает характеристики
|
||
/// предмета через EffectManager.GetValue без сущности (_entity = null), и у passive_effect со
|
||
/// значением из CVar (у кинжала некроманта value="@$necroKnifeDamageCVar") PassiveEffect.ModifyValue
|
||
/// падает на _ea.Buffs. Исключение вылетает раньше ItemGrid.SetItem - нож не меняется, слот не пишется.
|
||
///
|
||
/// Лечение: аналитика - только телеметрия игры, её исключение глотаем (Finalizer), SetStackAt
|
||
/// продолжает и пишет слот как обычно. Предупреждение в лог - один раз за запуск.
|
||
/// </summary>
|
||
[HarmonyPatch(typeof(Inventory), nameof(Inventory.LogToolBeltUsageEvent))]
|
||
public static class Patch_Inventory_LogToolBeltUsageEvent_Guard
|
||
{
|
||
static bool _warned;
|
||
|
||
public static Exception Finalizer(Exception __exception)
|
||
{
|
||
if (__exception != null && !_warned)
|
||
{
|
||
_warned = true;
|
||
Debug.LogWarning("[NecromancerTome] ToolBeltAnalyticsGuard: game analytics failed in Inventory.LogToolBeltUsageEvent, ignored: " + __exception.Message);
|
||
}
|
||
return null;
|
||
}
|
||
}
|
||
}
|