From 7496aa0944e4b3ddeb6ec654f33902fd9085e319 Mon Sep 17 00:00:00 2001 From: AlexCube Date: Thu, 1 Oct 2026 11:26:57 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=BA=D0=B0=D0=BA=D1=83=D0=BD:=20=D1=80?= =?UTF-8?q?=D0=B0=D1=81=D1=85=D0=BE=D0=B4=20=D1=81=D1=84=D0=B5=D1=80=20?= =?UTF-8?q?=D1=82=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE=20=D1=81=D0=BE=D0=B1=D1=8B?= =?UTF-8?q?=D1=82=D0=B8=D0=B5=D0=BC=20=D0=B4=D0=B2=D0=B8=D0=B3=D0=B0=D1=82?= =?UTF-8?q?=D0=B5=D0=BB=D1=8F,=20=D0=BF=D1=80=D1=8F=D0=BC=D1=8B=D0=B5=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=BF=D0=B8=D1=81=D0=B8=20=D0=B1=D0=B0=D0=BA=D0=B0?= =?UTF-8?q?=20=D0=BD=D0=B5=20=D1=81=D0=B6=D0=B8=D0=B3=D0=B0=D1=8E=D1=82=20?= =?UTF-8?q?=D1=81=D1=84=D0=B5=D1=80=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- HarmonySrc/BoneSteedFuelPatch.cs | 39 ++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/HarmonySrc/BoneSteedFuelPatch.cs b/HarmonySrc/BoneSteedFuelPatch.cs index e7722c2..51468aa 100644 --- a/HarmonySrc/BoneSteedFuelPatch.cs +++ b/HarmonySrc/BoneSteedFuelPatch.cs @@ -10,11 +10,10 @@ namespace NecromancerTome /// HUD и глохнутие читают его, - но для скакуна его уровень не хранится, а СЧИТАЕТСЯ по /// сферам: каждая сфера - FuelPerSphere единиц, пропорционально остатку прочности. /// - /// Расход: двигатель снимает топливо событием FuelRemove -> VPFuelTank.AddFuel -> - /// SetFuelLevel(меньше). Префикс SetFuelLevel переводит разницу в прочность первой сферы - /// с остатком (ячейки по порядку); выработанная сфера исчезает из ячейки, как в браслете и - /// оссуарии. Рост уровня (ванильная заправка, загрузка из Meta) игнорируется - кровь - /// приходит только сферами. + /// Расход: двигатель шлёт событие FuelRemove; его префикс переводит количество в прочность + /// первой сферы с остатком (ячейки по порядку); выработанная сфера исчезает из ячейки, как в + /// браслете и оссуарии. Прямые записи уровня (SetFuelLevel: загрузка, синхронизация, + /// заправка) игнорируются - кровь приходит только сферами. /// /// Ячейки: у ванили в слот модификации идёт только модификация с подходящими тегами и не /// больше MaxModsAllowed одного вида. Сфера - модификация браслета, поэтому для скакуна @@ -147,24 +146,34 @@ namespace NecromancerTome } } + /// Любая прямая запись уровня бака (загрузка из Meta, сетевая синхронизация, + /// ванильная заправка) для скакуна ничего не меняет: уровень - производная от сфер. Тест 01.10: + /// после установки сферы игра записала в бак прежний 0, и сфера сгорала целиком. [HarmonyPatch(typeof(VPFuelTank), nameof(VPFuelTank.SetFuelLevel))] public static class Patch_VPFuelTank_SetFuelLevel_BoneSteed { - public static bool Prefix(VPFuelTank __instance, float _fuelLevel) + public static bool Prefix(VPFuelTank __instance) { if (!BoneSteedFuel.IsSteedTank(__instance)) return true; + __instance.fuelLevel = BoneSteedFuel.FuelOf(__instance.vehicle); + return false; + } + } + + /// Расход - только событием двигателя FuelRemove: снимается прочность сфер. + [HarmonyPatch(typeof(VPFuelTank), nameof(VPFuelTank.HandleEvent))] + public static class Patch_VPFuelTank_HandleEvent_BoneSteed + { + public static bool Prefix(VPFuelTank __instance, VehiclePart.Event _event, float _amount) + { + if (_event != VehiclePart.Event.FuelRemove || !BoneSteedFuel.IsSteedTank(__instance)) + return true; Vehicle v = __instance.vehicle; - float have = BoneSteedFuel.FuelOf(v); - // Загрузка (SetItemValue -> Meta/50) приходит, пока LoadingItem; её не трогаем. - if (Patch_Vehicle_SetItemValue_BoneSteed.Loading || _fuelLevel >= have) - { - __instance.fuelLevel = have; - return false; - } - float left = BoneSteedFuel.Burn(v, have - Mathf.Max(0f, _fuelLevel)); + bool had = BoneSteedFuel.FuelOf(v) > 0f; + float left = _amount > 0f ? BoneSteedFuel.Burn(v, _amount) : BoneSteedFuel.FuelOf(v); __instance.fuelLevel = left; - if (left <= 0f && EntityVehicle.VehicleFuelUsageModifier > 0f) + if (had && left <= 0f && EntityVehicle.VehicleFuelUsageModifier > 0f) v.FireEvent(VehiclePart.Event.FuelEmpty, __instance, 0f); return false; }