using HarmonyLib; using UnityEngine; namespace NecromancerTome { /// /// Плата здоровьем за силовую атаку Ножа некроманта (указание 09.10.2026: «обычная силовая - 20 хп, с модификацией /// 40; если здоровья на штраф не хватает - звук сломавшегося инвентаря, а силовая заменится обычной»). /// Саму плату снимает XML (items.xml - 20 при попадании силовой, item_modifiers.xml «Мёртвая буря» - ещё 20). /// Здесь - только проверка до удара: ItemClass.ExecuteAction запускает и обычный удар (действие 0), и силовую /// (действие 1); не хватает здоровья - номер действия меняется на 0 (тот же удар с той же анимацией обычного), /// а при нажатии звучит ванильный itembreak и надпись «Недостаточно здоровья». /// Почему был нужен штраф побольше: лечение обычным ударом - убийства/20, и уже со 100 убийств один удар /// окупал прежнюю плату в 5 здоровья. /// [HarmonyPatch(typeof(ItemClass), nameof(ItemClass.ExecuteAction))] public static class Patch_ItemClass_ExecuteAction_KnifePowerCost { public const string KnifeName = "necroWpnBladeNecroKnife"; public const string StormMod = "necroModKnifeDeadStorm"; /// Должно совпадать с items.xml и item_modifiers.xml. public const int Cost = 20, StormCost = 40; public static void Prefix(ItemClass __instance, ref int _actionIdx, ItemInventoryData _data, bool _bReleased) { if (_actionIdx != 1 || __instance.Name != KnifeName || !(_data?.holdingEntity is EntityPlayerLocal player)) { return; } int cost = HasStorm(_data.itemValue) ? StormCost : Cost; if (BloodTide.Active) { cost /= 2; // кровавый прилив (10.10): плата вдвое меньше - как в items.xml/item_modifiers.xml } if (player.Health > cost) { return; } _actionIdx = 0; if (!_bReleased) { Audio.Manager.PlayInsidePlayerHead("itembreak"); // Надпись (указание 09.10) - сразу, мимо очереди подсказок, чтобы при частых нажатиях не копилась. GameManager.ShowTooltip(player, Localization.Get("necroKnifeNoHealth"), true); Debug.Log("[NecromancerTome] KnifePowerCost: здоровья " + player.Health + ", плата " + cost + " - вместо силовой обычный удар"); } } static bool HasStorm(ItemValue _iv) { if (_iv?.modifications == null) { return false; } foreach (ItemValue m in _iv.modifications) { if (m != null && !m.IsEmpty() && m.ItemClass?.Name == StormMod) { return true; } } return false; } } }