diff --git a/Config/Localization.csv b/Config/Localization.csv
index 814ef0e..aede098 100644
--- a/Config/Localization.csv
+++ b/Config/Localization.csv
@@ -187,6 +187,7 @@ necroCinerariumTrunk,UI,XUI,,,,Contents,,Inhalt,Contenido,Contenu,Contenuto,中
necroCinerariumPlaced,UI,XUI,,,,Cineraria placed: {0},,Aufgestellte Cinerarien: {0},Cinerarios colocados: {0},Cinéraires posés : {0},Cinerari posati: {0},設置した骨壺:{0},설치한 유골함: {0},Postawione cineraria: {0},Cinerários colocados: {0},Всего цинерариев: {0},Kurulan küllükler: {0},已放置骨灰瓮:{0},已放置骨灰甕:{0}
necroCinerariumAvailable,UI,XUI,,,,Available to place: {0},,Noch aufstellbar: {0},Disponibles para colocar: {0},Encore disponibles : {0},Ancora disponibili: {0},まだ置ける骨壺:{0},더 설치 가능: {0},Można jeszcze postawić: {0},Ainda disponíveis: {0},Доступно цинерариев: {0},Daha kurulabilir: {0},还可放置:{0},還可放置:{0}
necroCinerariumNext,UI,XUI,,,,One more unlocks after {0} more dead put to rest,,Eine weitere nach {0} weiteren zur Ruhe gebrachten Toten,Otra más tras dar descanso a {0} muertos más,Une de plus après {0} morts de plus mis au repos,Un'altra dopo aver messo a riposo altri {0} morti,あと{0}体の死者を眠らせると、もう1つ置ける,망자를 {0}명 더 안식시키면 하나 더 열린다,Kolejne po ukojeniu jeszcze {0} zmarłych,Mais uma após pôr em descanso mais {0} mortos,До разблокировки ещё одного: упокоить {0},{0} ölü daha huzura erdirince bir tane daha,再让{0}名死者安息即可解锁下一座,再讓{0}名死者安息即可解鎖下一座
+necroCinerariumRepairNeed,UI,XUI,,,,"Not enough for repairs - put it in a box with a thread to the urn",,"Fehlt für Reparaturen - in eine Kiste mit Faden zur Urne legen","Falta para reparar: ponlo en un cofre con hilo a la urna","Manque pour réparer - mettez-le dans un coffre relié à l'urne","Manca per le riparazioni: mettilo in una cassa con filo verso l'urna",修理に足りない - 骨壺と糸でつながった箱に入れる,수리에 부족함 - 유골함과 실로 이어진 상자에 넣기,"Brakuje do napraw - włóż do skrzyni z nicią do urny","Falta para reparos - coloque num baú com fio até a urna","Не хватает для ремонта - положите в ящик с нитью к урне","Onarım için eksik - urneye iplikle bağlı sandığa koyun",修理所缺 - 放进与骨灰瓮有丝线相连的箱子,修理所缺 - 放進與骨灰甕有絲線相連的箱子
blockcommand_TEFeatureCinerarium:bounds_show,blocks,Block,,,,Show Zone,,Zone anzeigen,Mostrar zona,Afficher la zone,Mostra zona,範囲を表示,구역 표시,Pokaż strefę,Mostrar zona,Показать зону,Bölgeyi göster,显示区域,顯示區域
blockcommand_bounds_show,blocks,Block,,,,Show Zone,,Zone anzeigen,Mostrar zona,Afficher la zone,Mostra zona,範囲を表示,구역 표시,Pokaż strefę,Mostrar zona,Показать зону,Bölgeyi göster,显示区域,顯示區域
blockcommand_TEFeatureCinerarium:bounds_hide,blocks,Block,,,,Hide Zone,,Zone ausblenden,Ocultar zona,Masquer la zone,Nascondi zona,範囲を非表示,구역 숨기기,Ukryj strefę,Ocultar zona,Скрыть зону,Bölgeyi gizle,隐藏区域,隱藏區域
diff --git a/Config/XUi_InGame/windows.xml b/Config/XUi_InGame/windows.xml
index cb52834..8c62e65 100644
--- a/Config/XUi_InGame/windows.xml
+++ b/Config/XUi_InGame/windows.xml
@@ -282,6 +282,19 @@
+
+
+
+
+
+
+
+
+
+
+
+ 1039
diff --git a/HarmonySrc/CinerariumRepairNeed.cs b/HarmonySrc/CinerariumRepairNeed.cs
new file mode 100644
index 0000000..ba1977b
--- /dev/null
+++ b/HarmonySrc/CinerariumRepairNeed.cs
@@ -0,0 +1,64 @@
+using UnityEngine;
+using UnityEngine.Scripting;
+
+namespace NecromancerTome
+{
+ ///
+ /// Чего не хватает ремонтнику (24.10.2026, пользователь: «сделать в его урне блок текста, который показывает какой материал
+ /// нужен в данный момент? А то не угадать», «Пусть показывает в виде ячейки с материалом», «И восклицательный знак. Чтобы
+ /// было понятно что именно это требуется»). Ячейка дописана в окно игры windowBagStorage (Config/XUi_InGame/windows.xml)
+ /// под блоком лимита урн: иконка материала, сколько доложить в ящики с нитями, красный «!». Только показ - не ячейка
+ /// сумки, взять из неё нечего. Видна у ремонтника, пока он ждёт материал (TEFeatureCinerarium.LackType/LackCount).
+ ///
+ [Preserve]
+ public class XUiC_NecroRepairNeed : XUiController
+ {
+ XUiV_Sprite _icon;
+ XUiV_Label _count;
+ float _nextRefresh;
+
+ public override void Init()
+ {
+ base.Init();
+ _icon = GetChildById("icon")?.ViewComponent as XUiV_Sprite;
+ _count = GetChildById("count")?.ViewComponent as XUiV_Label;
+ }
+
+ public override void OnOpen()
+ {
+ base.OnOpen();
+ _nextRefresh = 0f;
+ Refresh();
+ }
+
+ public override void Update(float _dt)
+ {
+ base.Update(_dt);
+ if (Time.time >= _nextRefresh)
+ {
+ Refresh();
+ }
+ }
+
+ void Refresh()
+ {
+ _nextRefresh = Time.time + 0.5f;
+ TEFeatureCinerarium urn = CinerariumContents.Urn;
+ ItemClass ic = urn != null && urn.IsRepairer && urn.ZoneLacking && urn.LackType > 0 ? ItemClass.GetForId(urn.LackType) : null;
+ ViewComponent.IsVisible = ic != null;
+ if (ic == null)
+ {
+ return;
+ }
+ if (_icon != null)
+ {
+ _icon.SpriteName = ic.GetIconName();
+ _icon.Color = ic.GetIconTint();
+ }
+ if (_count != null)
+ {
+ _count.Text = urn.LackCount.ToString();
+ }
+ }
+ }
+}
diff --git a/HarmonySrc/CinerariumZone.cs b/HarmonySrc/CinerariumZone.cs
index e295f44..36fa1e7 100644
--- a/HarmonySrc/CinerariumZone.cs
+++ b/HarmonySrc/CinerariumZone.cs
@@ -75,6 +75,9 @@ namespace NecromancerTome
public int ZonePressedBy = -1;
/// Не хватает материалов / ящик полон - кнопка мигает жёлтым.
public bool ZoneLacking;
+ /// Ремонтник: какого материала и сколько не хватило последней проверке (ячейка в «Содержимом»,
+ /// XUiC_NecroRepairNeed). Не сохраняется.
+ public int LackType, LackCount;
public static float RepairSeconds = 2.5f;
public static float LootSeconds = 1.5f;
@@ -403,6 +406,8 @@ namespace NecromancerTome
}
if (have < n)
{
+ LackType = iv.type;
+ LackCount = n - have;
return false;
}
}
diff --git a/NecromancerHarmony.dll b/NecromancerHarmony.dll
index c1214ba..8164cba 100644
Binary files a/NecromancerHarmony.dll and b/NecromancerHarmony.dll differ
diff --git a/NecromancerHarmony.pdb b/NecromancerHarmony.pdb
index 8b87b22..1f00886 100644
Binary files a/NecromancerHarmony.pdb and b/NecromancerHarmony.pdb differ