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;
}