Игра 3.4: аналитика пояса падала на кинжале некроманта - нож не переключался (#79)

Inventory.SetStackAt до записи в слот зовёт LogToolBeltUsageEvent, та считает
passive_effect без сущности и падает на значении из CVar (@$necroKnifeDamageCVar;
в игре так же у мода modMeleeFortifyingGrip и админской одежды). Исключение
телеметрии глотается финализатором, слот пишется как обычно.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
AlexCube
2026-10-24 14:21:09 +03:00
co-authored by Claude Opus 5.5
parent a747f5aa8d
commit 3938f1786a
3 changed files with 32 additions and 0 deletions
+32
View File
@@ -0,0 +1,32 @@
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;
}
}
}