diff --git a/Config/Localization.csv b/Config/Localization.csv
index 0e2660c..83cddf0 100644
--- a/Config/Localization.csv
+++ b/Config/Localization.csv
@@ -229,17 +229,18 @@ necroGeoOssuaryEmpty,UI,Use Prompt,,,,{0} Open {1} ([DECEA3]Empty[-]),,{0} Öffn
necroGeoOssuaryHasItems,UI,Use Prompt,,,,{0} Open {1} ([D04040]Resources[-]),,{0} Öffnen {1} ([D04040]Ressourcen[-]),{0} Abrir {1} ([D04040]Recursos[-]),{0} Ouvrir {1} ([D04040]Ressources[-]),{0} Apri {1} ([D04040]Risorse[-]),{0} 開く {1} ([D04040]資源[-]),{0} 열기 {1} ([D04040]자원[-]),{0} Otwórz {1} ([D04040]Surowce[-]),{0} Abrir {1} ([D04040]Recursos[-]),{0}: открыть ({1}) ([D04040]Ресурсы[-]),{0} Aç {1} ([D04040]Kaynaklar[-]),{0} 打开 {1} ([D04040]资源[-]),{0} 打開 {1} ([D04040]資源[-])
necroBoneSteedPlaceable,items,Item,,,,Bone Steed,,Knochenross,Corcel de hueso,Destrier d'os,Destriero d'ossa,骨の駿馬,뼈 군마,Kościany rumak,Corcel de osso,Костяной скакун,Kemik At,骨骸坐骑,骨骸坐騎
necroBoneSteedPlaceableDesc,items,Item,,,,"A motorcycle grown from bones, sinew and veins, with a cyclops skull for a headlight. Place it to ride, pick it up to carry it.
-Runs on Blood Spheres: one sphere fills the whole tank. Without blood it stalls like any other vehicle.",,"Ein Motorrad aus Knochen, Sehnen und Adern mit einem Zyklopenschädel als Scheinwerfer. Aufstellen zum Fahren, aufheben zum Mitnehmen.
-Fährt mit Blutsphären: eine Sphäre füllt den ganzen Tank. Ohne Blut bleibt es stehen wie jedes andere Fahrzeug.","Una moto crecida de huesos, tendones y venas, con un cráneo cíclope como faro. Colócala para montar, recógela para llevarla.
-Funciona con esferas de sangre: una esfera llena todo el depósito. Sin sangre se cala como cualquier otro vehículo.","Une moto faite d'os, de tendons et de veines, avec un crâne de cyclope en guise de phare. Posez-la pour rouler, ramassez-la pour l'emporter.
-Fonctionne aux sphères de sang : une sphère remplit tout le réservoir. Sans sang, elle cale comme n'importe quel véhicule.","Una moto cresciuta da ossa, tendini e vene, con un teschio di ciclope come faro. Posizionala per guidarla, raccoglila per portarla con te.
-Funziona a sfere di sangue: una sfera riempie tutto il serbatoio. Senza sangue si spegne come qualsiasi altro veicolo.","骨と腱と血管から育ったバイクで、ヘッドライトは単眼の頭蓋骨。置けば乗れ、拾えば持ち運べる。
-燃料は血の球。球1つで満タンになる。血が尽きると他の乗り物と同じく止まる。","뼈와 힘줄과 혈관으로 자라난 오토바이로, 전조등은 외눈 해골이다. 놓으면 탈 수 있고, 주우면 들고 다닐 수 있다.
-피의 구슬로 달린다. 구슬 하나로 연료통이 가득 찬다. 피가 떨어지면 다른 탈것처럼 멈춘다.","Motocykl wyrosły z kości, ścięgien i żył, z czaszką cyklopa zamiast reflektora. Postaw go, by jechać, podnieś, by zabrać ze sobą.
-Jeździ na krwawych sferach: jedna sfera napełnia cały bak. Bez krwi gaśnie jak każdy inny pojazd.","Uma moto crescida de ossos, tendões e veias, com um crânio de ciclope como farol. Coloque-a para pilotar, pegue-a para levá-la.
-Funciona com esferas de sangue: uma esfera enche o tanque inteiro. Sem sangue ela morre como qualquer outro veículo.","Мотоцикл, выросший из костей, сухожилий и сосудов, с черепом-циклопом вместо фары. Поставьте, чтобы ехать, подберите, чтобы нести с собой.
-Ездит на кровавых сферах: одна сфера заполняет весь бак. Без крови глохнет, как любой транспорт.","Kemik, kiriş ve damarlardan büyümüş, farı tek gözlü bir kafatası olan bir motosiklet. Binmek için yerleştir, taşımak için al.
-Kan Küreleriyle çalışır: bir küre bütün depoyu doldurur. Kan bitince her araç gibi stop eder.","一辆由骨头、肌腱与血管生长而成的摩托,车灯是一颗独眼头骨。放置即可骑乘,拾起即可携带。
-以血之球为燃料:一颗血之球加满整个油箱。没有血就会像其他载具一样熄火。","一輛由骨頭、肌腱與血管生長而成的機車,車燈是一顆獨眼頭骨。放置即可騎乘,拾起即可攜帶。
-以血之球為燃料:一顆血之球加滿整個油箱。沒有血就會像其他載具一樣熄火。"
+Runs on Blood Spheres placed in its four mod slots: they burn one after another, one sphere lasts a full tank. Cannot be refueled from a gas can. Repaired with bones (50 per repair).",,"Ein Motorrad aus Knochen, Sehnen und Adern mit einem Zyklopenschädel als Scheinwerfer. Aufstellen zum Fahren, aufheben zum Mitnehmen.
+Fährt mit Blutsphären in seinen vier Modifikationsplätzen: Sie verbrennen nacheinander, eine Sphäre reicht für einen vollen Tank. Kein Nachtanken mit dem Benzinkanister. Reparatur mit Knochen (50 pro Reparatur).","Una moto crecida de huesos, tendones y venas, con un cráneo cíclope como faro. Colócala para montar, recógela para llevarla.
+Funciona con esferas de sangre colocadas en sus cuatro ranuras de modificación: se consumen una tras otra, cada esfera equivale a un depósito lleno. No se reposta con bidón. Se repara con huesos (50 por reparación).","Une moto faite d'os, de tendons et de veines, avec un crâne de cyclope en guise de phare. Posez-la pour rouler, ramassez-la pour l'emporter.
+Fonctionne avec des sphères de sang placées dans ses quatre emplacements de modification : elles se consument l'une après l'autre, une sphère vaut un plein. Pas de plein au bidon. Se répare avec des os (50 par réparation).","Una moto cresciuta da ossa, tendini e vene, con un teschio di ciclope come faro. Posizionala per guidarla, raccoglila per portarla con te.
+Funziona con sfere di sangue inserite nei suoi quattro slot modifica: si consumano una dopo l'altra, una sfera vale un pieno. Non si rifornisce con la tanica. Si ripara con le ossa (50 per riparazione).","骨と腱と血管から育ったバイクで、ヘッドライトは単眼の頭蓋骨。置けば乗れ、拾えば持ち運べる。
+4つの改造スロットに入れた血の球で走る。球は順番に消費され、1個で満タン1回分。ガソリン缶では給油できない。修理には骨を使う(1回50個)。","뼈와 힘줄과 혈관으로 자라난 오토바이로, 전조등은 외눈 해골이다. 놓으면 탈 수 있고, 주우면 들고 다닐 수 있다.
+네 개의 개조 슬롯에 넣은 피의 구슬로 달린다. 구슬은 차례로 소모되며 하나가 연료통 한 번 분량이다. 휘발유 통으로는 주유할 수 없다. 수리는 뼈로 한다(1회 50개).","Motocykl wyrosły z kości, ścięgien i żył, z czaszką cyklopa zamiast reflektora. Postaw go, by jechać, podnieś, by zabrać ze sobą.
+Jeździ na krwawych sferach umieszczonych w czterech slotach modyfikacji: zużywają się po kolei, jedna sfera to pełny bak. Nie da się zatankować z kanistra. Naprawiany kośćmi (50 na naprawę).","Uma moto crescida de ossos, tendões e veias, com um crânio de ciclope como farol. Coloque-a para pilotar, pegue-a para levá-la.
+Funciona com esferas de sangue colocadas em seus quatro espaços de modificação: elas são consumidas uma após a outra, uma esfera equivale a um tanque cheio. Não abastece com galão. É reparado com ossos (50 por reparo).","Мотоцикл, выросший из костей, сухожилий и сосудов, с черепом-циклопом вместо фары. Поставьте, чтобы ехать, подберите, чтобы нести с собой.
+Ездит на кровавых сферах в четырёх ячейках модификаций: они тратятся по очереди, одна сфера — полный бак. Канистрой не заправить. Чинится костями (50 за ремонт).","Kemik, kiriş ve damarlardan büyümüş, farı tek gözlü bir kafatası olan bir motosiklet. Binmek için yerleştir, taşımak için al.
+Dört modifikasyon yuvasına takılan kan küreleriyle çalışır: küreler sırayla tükenir, bir küre bir dolu depodur. Benzin bidonuyla doldurulamaz. Kemikle onarılır (onarım başına 50).","一辆由骨头、肌腱与血管生长而成的摩托,车灯是一颗独眼头骨。放置即可骑乘,拾起即可携带。
+以放入四个改装槽的血球为燃料:血球依次消耗,一颗相当于一满箱。无法用油桶加油。用骨头修理(每次50根)。","一輛由骨頭、肌腱與血管生長而成的機車,車燈是一顆獨眼頭骨。放置即可騎乘,拾起即可攜帶。
+以放入四個改裝槽的血球為燃料:血球依次消耗,一顆相當於一滿箱。無法用油桶加油。用骨頭修理(每次50根)。"
+necroBoneSteedNeedBones,UI,Tooltip,,,,You need {0} bones to repair the Bone Steed.,,"Du brauchst {0} Knochen, um das Knochenross zu reparieren.",Necesitas {0} huesos para reparar el Corcel de hueso.,Il te faut {0} os pour réparer le Destrier d'os.,Servono {0} ossa per riparare il Destriero d'ossa.,骨の駿馬の修理には骨が{0}個必要だ。,뼈 군마를 수리하려면 뼈 {0}개가 필요하다.,Do naprawy Kościanego rumaka potrzeba {0} kości.,Você precisa de {0} ossos para reparar o Corcel de osso.,Для ремонта Костяного скакуна нужно {0} костей.,Kemik Atı onarmak için {0} kemik gerekir.,修理骨骸坐骑需要{0}根骨头。,修理骨骸坐騎需要{0}根骨頭。
necroBoneSteed,entityclasses,Entity,,,,Bone Steed,,Knochenross,Corcel de hueso,Destrier d'os,Destriero d'ossa,骨の駿馬,뼈 군마,Kościany rumak,Corcel de osso,Костяной скакун,Kemik At,骨骸坐骑,骨骸坐騎
diff --git a/Config/items.xml b/Config/items.xml
index 4e44b9f..fea98e7 100644
--- a/Config/items.xml
+++ b/Config/items.xml
@@ -1908,6 +1908,15 @@
+
+
+
+
+
diff --git a/Config/vehicles.xml b/Config/vehicles.xml
index b981234..a31366f 100644
--- a/Config/vehicles.xml
+++ b/Config/vehicles.xml
@@ -2,8 +2,8 @@
+ honkEvent (гудок открывает двери торговца - скакуну незачем). Топливо - кровавые сферы
+ в ячейках модификаций (BoneSteedFuelPatch), канистрой не заправить. -->
@@ -72,9 +72,9 @@
-
-
-
+
+
diff --git a/HarmonySrc/BoneSteedFuelPatch.cs b/HarmonySrc/BoneSteedFuelPatch.cs
new file mode 100644
index 0000000..2fc46c3
--- /dev/null
+++ b/HarmonySrc/BoneSteedFuelPatch.cs
@@ -0,0 +1,260 @@
+using HarmonyLib;
+using UnityEngine;
+
+namespace NecromancerTome
+{
+ ///
+ /// Топливо костяного скакуна - кровавые сферы в ячейках модификаций (указание 01.10.2026:
+ /// «4 ячейки под кровавые сферы, которые будут постепенно по очереди тратиться; заправку
+ /// через канистру убрать»). Ванильный бак (VPFuelTank) остаётся частью машины - двигатель,
+ /// HUD и глохнутие читают его, - но для скакуна его уровень не хранится, а СЧИТАЕТСЯ по
+ /// сферам: каждая сфера - FuelPerSphere единиц, пропорционально остатку прочности.
+ ///
+ /// Расход: двигатель снимает топливо событием FuelRemove -> VPFuelTank.AddFuel ->
+ /// SetFuelLevel(меньше). Префикс SetFuelLevel переводит разницу в прочность первой сферы
+ /// с остатком (ячейки по порядку); выработанная сфера исчезает из ячейки, как в браслете и
+ /// оссуарии. Рост уровня (ванильная заправка, загрузка из Meta) игнорируется - кровь
+ /// приходит только сферами.
+ ///
+ /// Ячейки: у ванили в слот модификации идёт только модификация с подходящими тегами и не
+ /// больше MaxModsAllowed одного вида. Сфера - модификация браслета, поэтому для скакуна
+ /// CanSwap решает сам: только сфера с остатком прочности, прочие моды не ставятся.
+ ///
+ /// Здоровье: Extends не наследует effect_group (ItemClassesFromXml парсит эффекты только
+ /// со своего узла), поэтому у necroBoneSteedPlaceable свой DegradationMax в items.xml. Но
+ /// эффекты установленных модификаций применяются к хозяину, а у сферы DegradationMax
+ /// base_set 500 - со сферами здоровье скакуна упало бы до 500 и прыгало бы при их смене.
+ /// Поэтому MaxUseTimesBase скакуна закреплён кодом.
+ ///
+ public static class BoneSteedFuel
+ {
+ public const int Slots = 4;
+ public const float FuelPerSphere = 120f;
+ public const float MaxFuel = Slots * FuelPerSphere;
+ public const int MaxHealth = 4000;
+
+ static int steedItemType = -1;
+
+ public static int SteedItemType
+ {
+ get
+ {
+ if (steedItemType < 0)
+ {
+ ItemValue iv = ItemClass.GetItem(BoneSteed.ItemName);
+ steedItemType = iv != null ? iv.type : 0;
+ }
+ return steedItemType;
+ }
+ }
+
+ public static bool IsSteedItem(ItemValue iv) =>
+ iv != null && iv.type != 0 && iv.type == SteedItemType;
+
+ public static bool IsSphere(ItemValue iv) =>
+ iv != null && !iv.IsEmpty() && iv.ItemClass != null && iv.ItemClass.Name == BoneSteed.FuelItem;
+
+ /// Остаток сферы 0..1.
+ static float Left(ItemValue sphere)
+ {
+ int max = sphere.MaxUseTimes;
+ if (max <= 0)
+ return 1f;
+ return Mathf.Clamp01(1f - sphere.UseTimes / max);
+ }
+
+ public static float FuelOf(Vehicle v)
+ {
+ ItemValue item = v?.itemValue;
+ if (item == null)
+ return 0f;
+ float fuel = 0f;
+ for (int i = 0; i < item.ModificationCount; i++)
+ {
+ ItemValue m = item.GetModification(i);
+ if (IsSphere(m))
+ fuel += Left(m) * FuelPerSphere;
+ }
+ return fuel;
+ }
+
+ /// Снимает топливо со сфер по очереди. Возвращает остаток топлива.
+ public static float Burn(Vehicle v, float amount)
+ {
+ ItemValue item = v.itemValue;
+ for (int i = 0; i < item.ModificationCount && amount > 0f; i++)
+ {
+ ItemValue m = item.GetModification(i);
+ if (!IsSphere(m))
+ continue;
+ int max = m.MaxUseTimes;
+ if (max <= 0)
+ {
+ item.SetModification(i, ItemValue.None.Clone());
+ amount -= FuelPerSphere;
+ continue;
+ }
+ float have = Left(m) * FuelPerSphere;
+ float take = Mathf.Min(have, amount);
+ m.UseTimes += take / FuelPerSphere * max;
+ amount -= take;
+ if (m.UseTimes >= max - 0.001f)
+ {
+ item.SetModification(i, ItemValue.None.Clone());
+ Debug.Log("[NecromancerTome] BoneSteed: сфера в ячейке " + i + " выработана и исчезла");
+ }
+ }
+ return FuelOf(v);
+ }
+
+ public static bool IsSteedTank(VPFuelTank tank) =>
+ tank?.vehicle != null && BoneSteed.Is(tank.vehicle.entity);
+ }
+
+ [HarmonyPatch(typeof(VPFuelTank), nameof(VPFuelTank.GetFuelLevel))]
+ public static class Patch_VPFuelTank_GetFuelLevel_BoneSteed
+ {
+ public static bool Prefix(VPFuelTank __instance, ref float __result)
+ {
+ if (!BoneSteedFuel.IsSteedTank(__instance))
+ return true;
+ __result = BoneSteedFuel.FuelOf(__instance.vehicle);
+ return false;
+ }
+ }
+
+ [HarmonyPatch(typeof(VPFuelTank), nameof(VPFuelTank.GetMaxFuelLevel))]
+ public static class Patch_VPFuelTank_GetMaxFuelLevel_BoneSteed
+ {
+ public static bool Prefix(VPFuelTank __instance, ref float __result)
+ {
+ if (!BoneSteedFuel.IsSteedTank(__instance))
+ return true;
+ __result = BoneSteedFuel.MaxFuel;
+ return false;
+ }
+ }
+
+ [HarmonyPatch(typeof(VPFuelTank), nameof(VPFuelTank.GetFuelLevelPercent))]
+ public static class Patch_VPFuelTank_GetFuelLevelPercent_BoneSteed
+ {
+ public static bool Prefix(VPFuelTank __instance, ref float __result)
+ {
+ if (!BoneSteedFuel.IsSteedTank(__instance))
+ return true;
+ __result = Mathf.Clamp01(BoneSteedFuel.FuelOf(__instance.vehicle) / BoneSteedFuel.MaxFuel);
+ return false;
+ }
+ }
+
+ [HarmonyPatch(typeof(VPFuelTank), nameof(VPFuelTank.SetFuelLevel))]
+ public static class Patch_VPFuelTank_SetFuelLevel_BoneSteed
+ {
+ public static bool Prefix(VPFuelTank __instance, float _fuelLevel)
+ {
+ if (!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));
+ __instance.fuelLevel = left;
+ if (left <= 0f && EntityVehicle.VehicleFuelUsageModifier > 0f)
+ v.FireEvent(VehiclePart.Event.FuelEmpty, __instance, 0f);
+ return false;
+ }
+ }
+
+ [HarmonyPatch(typeof(Vehicle), nameof(Vehicle.SetItemValue))]
+ public static class Patch_Vehicle_SetItemValue_BoneSteed
+ {
+ public static bool Loading;
+
+ public static void Prefix() => Loading = true;
+
+ public static void Finalizer(Vehicle __instance)
+ {
+ Loading = false;
+ if (BoneSteed.Is(__instance.entity))
+ Debug.Log("[NecromancerTome] BoneSteed: ячеек " + __instance.itemValue.ModificationCount +
+ ", топливо " + BoneSteedFuel.FuelOf(__instance).ToString("0.#") + "/" + BoneSteedFuel.MaxFuel +
+ ", здоровье " + __instance.entity.Health + "/" + __instance.GetMaxHealth() +
+ ", расход x" + __instance.EffectFuelUsePer.ToString("0.##"));
+ }
+ }
+
+ /// В ячейки скакуна - только кровавые сферы с остатком прочности.
+ [HarmonyPatch(typeof(XUiC_ItemPartStack), "CanSwap")]
+ public static class Patch_XUiC_ItemPartStack_CanSwap_BoneSteed
+ {
+ public static bool Prefix(XUiC_ItemPartStack __instance, ItemStack stack, ref bool __result)
+ {
+ ItemStack current = __instance.xui?.AssembleItem?.CurrentItem;
+ if (current == null || !BoneSteedFuel.IsSteedItem(current.itemValue))
+ return true;
+ ItemValue here = __instance.ItemValue;
+ __result = BoneSteedFuel.IsSphere(stack.itemValue) &&
+ stack.itemValue.UseTimes < stack.itemValue.MaxUseTimes &&
+ (here == null || here.IsEmpty() || BoneSteedFuel.IsSphere(here));
+ return false;
+ }
+ }
+
+ /// Здоровье скакуна не зависит от сфер в ячейках (у сферы DegradationMax 500).
+ [HarmonyPatch(typeof(ItemValue), nameof(ItemValue.MaxUseTimesBase), MethodType.Getter)]
+ public static class Patch_ItemValue_MaxUseTimesBase_BoneSteed
+ {
+ public static void Postfix(ItemValue __instance, ref int __result)
+ {
+ if (BoneSteedFuel.IsSteedItem(__instance))
+ __result = BoneSteedFuel.MaxHealth;
+ }
+ }
+
+ /// Ремонт скакуна - костями вместо ремкомплекта (указание 01.10): BonesPerRepair
+ /// костей за ход, как ванильный ремкомплект (1000 здоровья + 10% за уровень «Механика»).
+ [HarmonyPatch(typeof(XUiM_Vehicle), nameof(XUiM_Vehicle.RepairVehicle))]
+ public static class Patch_XUiM_Vehicle_RepairVehicle_BoneSteed
+ {
+ public const string BoneItem = "resourceBone";
+ public const int BonesPerRepair = 50;
+
+ public static bool Prefix(XUi _xui, Vehicle _vehicle, ref bool __result)
+ {
+ Vehicle v = _vehicle ?? _xui.Vehicle.CurrentVehicle?.GetVehicle();
+ if (v == null || !BoneSteed.Is(v.entity))
+ return true;
+ __result = false;
+ EntityPlayerLocal player = _xui.playerUI.entityPlayer;
+ ItemValue bone = ItemClass.GetItem(BoneItem);
+ if (bone == null || bone.IsEmpty() || v.GetRepairAmountNeeded() <= 0)
+ return false;
+ int have = player.bag.GetItemCount(bone) + player.inventory.GetItemCount(bone);
+ if (have < BonesPerRepair)
+ {
+ Audio.Manager.PlayInsidePlayerHead("misc/missingitemtorepair");
+ GameManager.ShowTooltip(player, string.Format(Localization.Get("necroBoneSteedNeedBones"), BonesPerRepair),
+ string.Empty, "ui_denied");
+ return false;
+ }
+ float perk = 0f;
+ ProgressionValue pv = player.Progression.GetProgressionValue("perkGreaseMonkey");
+ if (pv != null)
+ perk += pv.Level * 0.1f;
+ v.RepairParts(1000, perk);
+ int left = BonesPerRepair;
+ left -= player.inventory.DecItem(bone, left);
+ if (left > 0)
+ player.bag.DecItem(bone, left);
+ _xui.CollectedItemList.RemoveItemStack(new ItemStack(bone, BonesPerRepair));
+ Audio.Manager.PlayInsidePlayerHead("craft_complete_item");
+ __result = true;
+ return false;
+ }
+ }
+}
diff --git a/HarmonySrc/BoneSteedPatch.cs b/HarmonySrc/BoneSteedPatch.cs
index c41497c..202068f 100644
--- a/HarmonySrc/BoneSteedPatch.cs
+++ b/HarmonySrc/BoneSteedPatch.cs
@@ -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
}
}
+ /// Канистрой и вообще из рюкзака скакуна не заправить (указание 01.10): кровь
+ /// вставляется только в ячейки. Пустой предмет топлива прячет пункт «Заправить» в меню.
[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;
- }
- }
-
- /// Одна сфера - полный бак.
- [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 = "";
}
}
}
diff --git a/NecromancerHarmony.dll b/NecromancerHarmony.dll
index 99b26d7..9ffd535 100644
Binary files a/NecromancerHarmony.dll and b/NecromancerHarmony.dll differ
diff --git a/NecromancerHarmony.pdb b/NecromancerHarmony.pdb
index 1f8a8b5..ebdb2fb 100644
Binary files a/NecromancerHarmony.pdb and b/NecromancerHarmony.pdb differ
diff --git a/Resources/necrobonesteed b/Resources/necrobonesteed
index 8dbbd3b..ef13e39 100644
Binary files a/Resources/necrobonesteed and b/Resources/necrobonesteed differ
diff --git a/Resources/necrobooks b/Resources/necrobooks
index 067ba7a..4badc93 100644
Binary files a/Resources/necrobooks and b/Resources/necrobooks differ