1.7.0: скакун на сферах в ячейках, ремонт костями; правки моделей скакуна и книги крысы

- Топливо скакуна - кровавые сферы в 4 ячейках модификаций, тратятся по очереди
  (одна сфера = 120 ед., бак 480); уровень бака считается по прочности сфер,
  выработанная сфера исчезает. Заправка канистрой убрана. В ячейки - только сферы.
- Причина «не едет» и «-2147483648%»: Extends не наследует effect_group, у предмета
  скакуна не было ни ячеек, ни прочности. Своя группа: ModSlots 4, DegradationMax 4000;
  здоровье закреплено кодом (DegradationMax сфер в ячейках его перебивал бы).
- Ремонт - 50 костей за ход вместо ремкомплекта; подсказка при нехватке, 13 языков.
- Модель скакуна: сиденье и рама прогнуты по ванили, рога по оси руля,
  череп меньше и короче, свет фары в глазнице, крыло над передним колесом,
  зубы под черепом убраны.
- Книга крысы: повёрнута как ванильная (палец на корешке), без металлических уголков.

В игре не проверено.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
AlexCube
2026-10-01 10:51:03 +03:00
co-authored by Claude Opus 5.5
parent 11db1116b0
commit 24d6e9f675
9 changed files with 295 additions and 50 deletions
+7 -32
View File
@@ -9,10 +9,8 @@ namespace NecromancerTome
/// кровавых сферах. Сущность necroBoneSteed в entityclasses.xml - наследник vehicleMotorcycle
/// со своей моделью (бандл necrobonesteed, собран из копии ванильного VMotorcycleP.prefab).
///
/// Топливо у транспорта игры в XML не задаётся: Vehicle.GetFuelItem() возвращает "ammoGasCan"
/// строкой в коде. Отсюда два патча: предмет топлива - сфера, и заправка - одна сфера на полный
/// бак (ваниль берёт по канистре на 1/25 единицы бака - 120 сфер на бак было бы абсурдом).
/// Без сфер скакун глохнет как обычный транспорт (решение 01.10) - это ваниль, кода не нужно.
/// Топливо - кровавые сферы в четырёх ячейках модификаций, ремонт - костями: всё это в
/// BoneSteedFuelPatch. Здесь только запрет заправки канистрой (GetFuelItem).
///
/// Модель выросла из рипнутого префаба, и у неё те же две беды, что у оссуария: игровые теги
/// коллайдеров потеряны (без них на скакуна не сесть и по нему не попасть) и шейдер-заглушка.
@@ -22,6 +20,7 @@ namespace NecromancerTome
{
public const string EntityClassName = "necroBoneSteed";
public const string FuelItem = "resourceBloodSphere";
public const string ItemName = "necroBoneSteedPlaceable";
const string VanillaPrefab = "@:Entities/Vehicles/VMotorcycle/VMotorcycleP.prefab";
public static bool Is(Entity e)
@@ -110,39 +109,15 @@ namespace NecromancerTome
}
}
/// <summary>Канистрой и вообще из рюкзака скакуна не заправить (указание 01.10): кровь
/// вставляется только в ячейки. Пустой предмет топлива прячет пункт «Заправить» в меню.</summary>
[HarmonyPatch(typeof(Vehicle), nameof(Vehicle.GetFuelItem))]
public static class Patch_Vehicle_GetFuelItem_BoneSteed
{
public static void Postfix(Vehicle __instance, ref string __result)
{
if (__result != "" && BoneSteed.Is(__instance.entity))
__result = BoneSteed.FuelItem;
}
}
/// <summary>Одна сфера - полный бак.</summary>
[HarmonyPatch(typeof(EntityVehicle), nameof(EntityVehicle.AddFuelFromInventory))]
public static class Patch_EntityVehicle_AddFuelFromInventory_BoneSteed
{
public static bool Prefix(EntityVehicle __instance, EntityAlive entity, ref bool __result)
{
if (!BoneSteed.Is(__instance))
return true;
__result = false;
Vehicle v = __instance.GetVehicle();
if (v.GetFuelPercent() >= 1f || !(entity is EntityPlayer player))
return false;
ItemValue sphere = ItemClass.GetItem(BoneSteed.FuelItem);
int taken = player.inventory.DecItem(sphere, 1);
if (taken == 0)
taken = player.bag.DecItem(sphere, 1);
if (taken == 0)
return false;
v.AddFuel(v.GetMaxFuelLevel() - v.GetFuelLevel());
__instance.PlayOneShot("useactions/gas_refill");
Debug.Log("[NecromancerTome] BoneSteed: сфера залита - полный бак");
__result = true;
return false;
if (BoneSteed.Is(__instance.entity))
__result = "";
}
}
}