Files
necromants-tome-7d2d-3-2/HarmonySrc/KnifePowerCostPatch.cs
T
AlexCubeandClaude Opus 5.5 b13759908e Кровавый прилив: нож-меч (статы, хват мачете), бег, восстановление, пульс, сердце
В прилив: урон, скорость ударов и вампиризм ножа вдвое, плата за силовую
вдвое меньше, выносливость вчетверо меньше, дальность 2.8, хват мачете
(модели меча пока нет). С ножом в руке: бег +50%, восстановление здоровья
и выносливости вдвое, полоски пульсируют фиолетовым, сердце 120 уд/мин.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 13:21:46 +03:00

66 lines
3.1 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using HarmonyLib;
using UnityEngine;
namespace NecromancerTome
{
/// <summary>
/// Плата здоровьем за силовую атаку Ножа некроманта (указание 09.10.2026: «обычная силовая - 20 хп, с модификацией
/// 40; если здоровья на штраф не хватает - звук сломавшегося инвентаря, а силовая заменится обычной»).
/// Саму плату снимает XML (items.xml - 20 при попадании силовой, item_modifiers.xml «Мёртвая буря» - ещё 20).
/// Здесь - только проверка до удара: ItemClass.ExecuteAction запускает и обычный удар (действие 0), и силовую
/// (действие 1); не хватает здоровья - номер действия меняется на 0 (тот же удар с той же анимацией обычного),
/// а при нажатии звучит ванильный itembreak и надпись «Недостаточно здоровья».
/// Почему был нужен штраф побольше: лечение обычным ударом - убийства/20, и уже со 100 убийств один удар
/// окупал прежнюю плату в 5 здоровья.
/// </summary>
[HarmonyPatch(typeof(ItemClass), nameof(ItemClass.ExecuteAction))]
public static class Patch_ItemClass_ExecuteAction_KnifePowerCost
{
public const string KnifeName = "necroWpnBladeNecroKnife";
public const string StormMod = "necroModKnifeDeadStorm";
/// <summary>Должно совпадать с items.xml и item_modifiers.xml.</summary>
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;
}
}
}