Скакун: расход сфер только событием двигателя, прямые записи бака не сжигают сферу
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
83b1cc47ce
commit
7496aa0944
@@ -10,11 +10,10 @@ namespace NecromancerTome
|
||||
/// HUD и глохнутие читают его, - но для скакуна его уровень не хранится, а СЧИТАЕТСЯ по
|
||||
/// сферам: каждая сфера - FuelPerSphere единиц, пропорционально остатку прочности.
|
||||
///
|
||||
/// Расход: двигатель снимает топливо событием FuelRemove -> VPFuelTank.AddFuel ->
|
||||
/// SetFuelLevel(меньше). Префикс SetFuelLevel переводит разницу в прочность первой сферы
|
||||
/// с остатком (ячейки по порядку); выработанная сфера исчезает из ячейки, как в браслете и
|
||||
/// оссуарии. Рост уровня (ванильная заправка, загрузка из Meta) игнорируется - кровь
|
||||
/// приходит только сферами.
|
||||
/// Расход: двигатель шлёт событие FuelRemove; его префикс переводит количество в прочность
|
||||
/// первой сферы с остатком (ячейки по порядку); выработанная сфера исчезает из ячейки, как в
|
||||
/// браслете и оссуарии. Прямые записи уровня (SetFuelLevel: загрузка, синхронизация,
|
||||
/// заправка) игнорируются - кровь приходит только сферами.
|
||||
///
|
||||
/// Ячейки: у ванили в слот модификации идёт только модификация с подходящими тегами и не
|
||||
/// больше MaxModsAllowed одного вида. Сфера - модификация браслета, поэтому для скакуна
|
||||
@@ -147,24 +146,34 @@ namespace NecromancerTome
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>Любая прямая запись уровня бака (загрузка из Meta, сетевая синхронизация,
|
||||
/// ванильная заправка) для скакуна ничего не меняет: уровень - производная от сфер. Тест 01.10:
|
||||
/// после установки сферы игра записала в бак прежний 0, и сфера сгорала целиком.</summary>
|
||||
[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;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>Расход - только событием двигателя FuelRemove: снимается прочность сфер.</summary>
|
||||
[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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user