- Книга некроманта: главы «Нож некроманта» и «Могильная крыса» - лист-чертёж сверху (Textures/, три вида из Blender, подписи на эсперанто), управление и лор; окно книги непрозрачное, текст с контуром - «Дух крысы» переименован в «Могильную крысу» на 13 языках (ключи прежние) - Блоки (Dev): плакат-синька ножа (necroPosterKnife, 3:2 под полотно рамки), грифельная доска necroChalkboard (надписи - TEFeatureSignable, писать только в редакторе/творческом; шрифт Neucha OFL, свой шейдер текста с тестом глубины), дверь-книжный шкаф necroBookDoor (своя модель с аниматором, хитбокс створки через RootTransformRefParent) - Чертоги: префаб 25x8x25 (промежуточный); открываются только межкомнатные двери; надписи на досках по дням игры: «Отомсти архимагу!», с 5-го дня «Берегись излучения красной луны» - Нож: силовая атака стоит 20 здоровья, с «Мёртвой бурей» 40; не хватает - itembreak, «Недостаточно здоровья» и обычный удар; описания на 13 языках - Консольная команда necromodel - устройство модели блока в лог Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
62 lines
2.9 KiB
C#
62 lines
2.9 KiB
C#
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 (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;
|
||
}
|
||
}
|
||
}
|