diff --git a/Config/Localization.csv b/Config/Localization.csv
index db29c9f..b50b1b4 100644
--- a/Config/Localization.csv
+++ b/Config/Localization.csv
@@ -44,6 +44,7 @@ necroThreadTo,UI,Tooltip,,,,Thread: urn to chest - the spirit will bring things
necroThreadRemoved,UI,Tooltip,,,,Threads cut,,Fäden getrennt,Hilos cortados,Fils coupés,Fili tagliati,糸を断った,실을 끊었다,Nici przecięte,Fios cortados,Нити обрезаны,İplikler kesildi,丝线已剪断,絲線已剪斷
necroThreadLimit,UI,Tooltip,,,,This urn already has 8 incoming threads,,Diese Urne hat schon 8 eingehende Fäden,Esta urna ya tiene 8 hilos de entrada,Cette urne a déjà 8 fils entrants,Quest'urna ha già 8 fili in entrata,この骨壺にはすでに入りの糸が8本ある,이 유골함에는 이미 들어오는 실이 8개 있다,Ta urna ma już 8 nici wejściowych,Esta urna já tem 8 fios de entrada,У этой урны уже 8 нитей «откуда»,Bu küllüğün zaten 8 gelen ipliği var,这个骨灰瓮已有8根来源丝线,這個骨灰甕已有8根來源絲線
necroThreadCancel,UI,Tooltip,,,,Thread dropped,,Faden fallen gelassen,Hilo soltado,Fil lâché,Filo lasciato,糸を手放した,실을 놓았다,Nić porzucona,Fio solto,Нить брошена,İplik bırakıldı,丝线已放下,絲線已放下
+necroThreadNeedLogist,UI,Tooltip,,,,Threads tie only to a Logistics Cinerarium,,Fäden nur an ein Logistik-Cinerarium,Los hilos solo se atan a un cinerario logístico,Les fils ne se nouent qu'à un cinéraire logisticien,I fili si legano solo a un cinerario logistico,糸は物流の骨壺にしか張れない,실은 물류 유골함에만 이을 수 있다,Nici łączą się tylko z cinerarium logistycznym,Os fios só se ligam a um cinerário logístico,Нити вяжутся только к цинерарию-логисту,İplikler yalnızca lojistik küllüğe bağlanır,丝线只能连到物流骨灰瓮,絲線只能連到物流骨灰甕
necroGroup0,UI,Tooltip,,,,Cooked food,,Gekochtes Essen,Comida cocinada,Plats cuisinés,Cibo cucinato,料理,요리된 음식,Gotowe jedzenie,Comida pronta,Готовая еда,Pişmiş yemek,熟食,熟食
necroGroup1,UI,Tooltip,,,,Canned food,,Konserven,Conservas,Conserves,Cibo in scatola,缶詰,통조림,Konserwy,Enlatados,Консервы,Konserveler,罐头,罐頭
necroGroup2,UI,Tooltip,,,,Raw food,,Rohe Lebensmittel,Alimentos crudos,Aliments crus,Cibo crudo,生の食材,날것 식재료,Surowe produkty,Alimentos crus,Сырые продукты,Çiğ gıdalar,生食材,生食材
@@ -139,6 +140,9 @@ blockcommand_zone_hide,blocks,Block,,,,Hide Zone,,Zone ausblenden,Ocultar zona,M
necroCinerarium,blocks,Block,,,,Harvest Cinerarium,,Ernte-Cinerarium,Cinerario de cosecha,Cinéraire des moissons,Cinerario del raccolto,収穫の納骨壺,수확의 유골함,Cinerarium żniw,Cinerário da colheita,Цинерарий,Hasat Küllüğü,丰收骨灰瓮,豐收骨灰甕
necroCinerariumDesc,blocks,Block,,,,"A funeral urn that houses a skull taken from a red corpse. Place the skull inside and a spirit rises from the urn to serve its 5 by 5 area, from one block below the urn to four above: it tops up dew collectors, apiaries and chicken coops from the boxes nearby, carries finished goods from workstations and collectors into those boxes, and last of all harvests and replants the garden. The urn's own storage is the spirit's bag for whatever the boxes cannot hold. Hold E on the urn for the bag, the contents or the zone. Picked up, the urn keeps its skull. Zones of two urns cannot overlap, and you may keep one urn for every 500 dead you have put to rest.",,"Eine Grabesurne für einen Schädel aus einer roten Leiche. Leg den Schädel hinein, und ein Geist steigt aus der Urne und versorgt ihre Fläche von 5 mal 5, von einem Block unter der Urne bis vier darüber: Er füllt Taukollektoren, Bienenstöcke und Hühnerställe aus den Kisten in der Nähe auf, trägt fertige Waren aus Werkbänken und Kollektoren in diese Kisten und erntet zuletzt den Garten ab und pflanzt neu. Der Speicher der Urne ist die Tasche des Geistes für alles, was die Kisten nicht fassen. Halte E an der Urne für Tasche, Inhalt oder Zone. Aufgehoben behält die Urne ihren Schädel. Die Zonen zweier Urnen dürfen sich nicht überschneiden, und du darfst je 500 zur Ruhe gebrachte Tote eine Urne halten.","Una urna funeraria que alberga un cráneo sacado de un cadáver rojo. Pon el cráneo dentro y un espíritu surgirá de la urna para atender su área de 5 por 5, desde un bloque bajo la urna hasta cuatro por encima: repone recolectores de rocío, colmenas y gallineros con lo que hay en los cofres cercanos, lleva los productos terminados de las estaciones y recolectores a esos cofres y, por último, cosecha y vuelve a plantar el huerto. El almacén de la urna es la bolsa del espíritu para lo que no quepa en los cofres. Mantén E sobre la urna para la bolsa, el contenido o la zona. Al recogerla, la urna conserva su cráneo. Las zonas de dos urnas no pueden solaparse, y puedes tener una urna por cada 500 muertos a los que hayas dado descanso.","Une urne funéraire qui abrite un crâne pris sur un cadavre rouge. Placez le crâne à l'intérieur et un esprit s'élève de l'urne pour servir sa zone de 5 sur 5, d'un bloc sous l'urne à quatre au-dessus : il réapprovisionne collecteurs de rosée, ruchers et poulaillers à partir des caisses voisines, porte les produits finis des établis et des collecteurs dans ces caisses et, en dernier, récolte et replante le jardin. Le stockage de l'urne est le sac de l'esprit pour ce que les caisses ne peuvent contenir. Maintenez E sur l'urne pour le sac, le contenu ou la zone. Ramassée, l'urne garde son crâne. Les zones de deux urnes ne peuvent pas se chevaucher, et vous pouvez garder une urne pour 500 morts que vous avez mis au repos.","Un'urna funeraria che custodisce un teschio preso da un cadavere rosso. Metti il teschio all'interno e uno spirito sorgerà dall'urna per servire la sua area di 5 per 5, da un blocco sotto l'urna fino a quattro sopra: rifornisce raccoglitori di rugiada, apiari e pollai con ciò che c'è nelle casse vicine, porta i prodotti finiti da stazioni e raccoglitori in quelle casse e, per ultimo, raccoglie e ripianta l'orto. Il deposito dell'urna è la borsa dello spirito per ciò che le casse non contengono. Tieni premuto E sull'urna per la borsa, il contenuto o la zona. Raccolta, l'urna conserva il teschio. Le zone di due urne non possono sovrapporsi, e puoi tenere un'urna ogni 500 morti a cui hai dato riposo.",赤い死体から取った頭蓋骨を納める葬送の壺。頭蓋骨を中に納めると、壺から霊が立ち上り、5×5の範囲(壺の1ブロック下から4ブロック上まで)を世話する。近くの箱から露集め器・養蜂箱・鶏小屋に消耗品を補充し、作業台や収集器の完成品をその箱へ運び、最後に畑の収穫と植え直しを行う。壺の収納は、箱に入りきらない物のための霊の鞄。壺に向けてEを長押しすると、鞄・中身・範囲表示を選べる。拾い上げても頭蓋骨は壺に残る。2つの壺の範囲は重ねられず、眠らせた死者500体ごとに壺を1つ持てる。,"붉은 시체에서 얻은 두개골을 모시는 장례용 항아리. 두개골을 안에 넣으면 항아리에서 영혼이 솟아올라 5×5 구역(항아리 한 칸 아래부터 네 칸 위까지)을 돌본다. 근처 상자에서 이슬 수집기, 양봉장, 닭장에 소모품을 채우고, 작업대와 수집기의 완성품을 그 상자로 옮기며, 마지막으로 밭을 수확하고 다시 심는다. 항아리의 저장 공간은 상자에 들어가지 않는 것을 담는 영혼의 가방이다. 항아리에 E를 길게 누르면 가방, 내용물, 구역 표시를 고를 수 있다. 주워도 두개골은 항아리에 남는다. 두 항아리의 구역은 겹칠 수 없고, 안식시킨 망자 500명마다 항아리를 하나 둘 수 있다.","Urna pogrzebowa, w której spoczywa czaszka wzięta z czerwonych zwłok. Włóż do niej czaszkę, a z urny uniesie się duch, który obsługuje obszar 5 na 5, od bloku pod urną do czterech nad nią: uzupełnia kolektory rosy, pasieki i kurniki tym, co leży w pobliskich skrzyniach, przenosi gotowe wyroby ze stanowisk i kolektorów do tych skrzyń, a na końcu zbiera plony i obsadza ogród na nowo. Schowek urny to torba ducha na to, co nie zmieści się w skrzyniach. Przytrzymaj E na urnie: torba, zawartość lub strefa. Podniesiona urna zachowuje czaszkę. Strefy dwóch urn nie mogą na siebie zachodzić, a jedną urnę możesz mieć na każde 500 zmarłych, których ukoiłeś.","Uma urna funerária que abriga um crânio tirado de um cadáver vermelho. Coloque o crânio dentro e um espírito surge da urna para cuidar da área de 5 por 5, de um bloco abaixo da urna até quatro acima: reabastece coletores de orvalho, apiários e galinheiros com o que há nos baús próximos, leva os produtos prontos das estações e coletores para esses baús e, por último, colhe e replanta a horta. O armazenamento da urna é a bolsa do espírito para o que não couber nos baús. Segure E na urna para a bolsa, o conteúdo ou a zona. Recolhida, a urna mantém o crânio. As zonas de duas urnas não podem se sobrepor, e você pode ter uma urna para cada 500 mortos que pôs para descansar.","Погребальная урна для черепа из красного трупа. Положите в неё череп - и из урны поднимется дух, который обслуживает участок 5 на 5, от блока под урной до четырёх над ней: подкладывает из ящиков рядом расходники сборщикам росы, пасекам и курятникам, переносит готовое из станций и коллекторов в эти ящики, а в последнюю очередь собирает урожай и засаживает грядки. Хранилище урны - сумка духа для того, что не влезло в ящики. Удерживайте E на урне: сумка, содержимое или зона. Поднятая урна сохраняет череп. Зоны двух урн не пересекаются; одну урну можно держать на каждые 500 упокоенных мертвецов.","Kırmızı bir cesetten alınmış kafatasını barındıran bir cenaze küpü. Kafatasını içine koy; küpten bir ruh yükselir ve 5'e 5'lik alana, küpün bir blok altından dört blok üstüne kadar bakar: yakındaki sandıklardan çiy toplayıcılara, arılıklara ve kümeslere sarf malzemesi koyar, tezgâhlardaki ve toplayıcılardaki hazır ürünleri bu sandıklara taşır ve en son bahçeyi hasat edip yeniden eker. Küpün deposu, sandıklara sığmayanlar için ruhun çantasıdır. Çanta, içerik ya da bölge için küpe E'yi basılı tut. Toplanan küp kafatasını korur. İki küpün bölgeleri çakışamaz; huzura kavuşturduğun her 500 ölü için bir küp tutabilirsin.",安放红色尸体头骨的葬瓮。把头骨放进瓮中,瓮中便会升起一个灵魂,照料5×5的范围(瓮下方1格到上方4格):用附近箱子里的物品为集露器、蜂房和鸡舍补充消耗品,把工作台和收集器的成品搬进这些箱子,最后收割并重新种植田地。瓮的储物空间是灵魂的背包,用来存放箱子装不下的东西。对着瓮长按E可选择背包、内容或显示区域。捡起瓮时头骨仍留在其中。两个瓮的区域不能重叠;每安息500个亡者可拥有一个瓮。,安放紅色屍體頭骨的葬甕。把頭骨放進甕中,甕中便會升起一個靈魂,照料5×5的範圍(甕下方1格到上方4格):用附近箱子裡的物品為集露器、蜂房和雞舍補充消耗品,把工作台和收集器的成品搬進這些箱子,最後收割並重新種植田地。甕的儲物空間是靈魂的背包,用來存放箱子裝不下的東西。對著甕長按E可選擇背包、內容或顯示區域。撿起甕時頭骨仍留在其中。兩個甕的區域不能重疊;每安息500個亡者可擁有一個甕。
necroCinerariumSkull,blocks,Block,,,,Harvest Cinerarium (with skull),,Ernte-Cinerarium (mit Schädel),Cinerario de cosecha (con cráneo),Cinéraire des moissons (avec crâne),Cinerario del raccolto (con teschio),収穫の納骨壺(頭蓋骨入り),수확의 유골함 (두개골 포함),Cinerarium żniw (z czaszką),Cinerário da colheita (com crânio),Цинерарий с черепом,Hasat Küllüğü (kafatasıyla),丰收骨灰瓮(含头骨),豐收骨灰甕(含頭骨)
+necroCinerariumLogist,blocks,Block,,,,Logistics Cinerarium,,Logistik-Cinerarium,Cinerario logístico,Cinéraire logisticien,Cinerario logistico,物流の骨壺,물류 유골함,Cinerarium logistyczne,Cinerário logístico,Цинерарий-логист,Lojistik Küllüğü,物流骨灰瓮,物流骨灰甕
+necroCinerariumLogistSkull,blocks,Block,,,,Logistics Cinerarium (with skull),,Logistik-Cinerarium (mit Schädel),Cinerario logístico (con cráneo),Cinéraire logisticien (avec crâne),Cinerario logistico (con teschio),物流の骨壺(頭蓋骨入り),물류 유골함 (두개골 포함),Cinerarium logistyczne (z czaszką),Cinerário logístico (com crânio),Цинерарий-логист (с черепом),Lojistik Küllüğü (kafatasıyla),物流骨灰瓮(含头骨),物流骨灰甕(含頭骨)
+necroCinerariumLogistDesc,blocks,Block,,,,"An urn for a spirit that carries things between chests. It has no zone of its own and can stand right next to other urns. Place a skull inside, then tie it to chests with ghostly threads - the Necromancer's Knife in the thread grip (R). In its Contents, choose which item groups the spirit carries. Counts toward the same urn limit.",,"Eine Urne für einen Geist, der Dinge zwischen Truhen trägt. Sie hat keine eigene Zone und kann direkt neben anderen Urnen stehen. Leg einen Schädel hinein und verbinde sie mit geisterhaften Fäden mit Truhen - mit dem Messer des Nekromanten im Fadengriff (R). Im Inhalt wählst du, welche Gegenstandsgruppen der Geist trägt. Zählt zum selben Urnenlimit.",Una urna para un espíritu que transporta cosas entre cofres. No tiene zona propia y puede estar junto a otras urnas. Pon un cráneo dentro y únela a cofres con hilos fantasmales: el Cuchillo del nigromante con agarre de hilos (R). En su Contenido eliges qué grupos de objetos transporta el espíritu. Cuenta para el mismo límite de urnas.,"Une urne pour un esprit qui transporte des objets entre des coffres. Elle n'a pas de zone propre et peut se placer contre d'autres urnes. Place un crâne à l'intérieur, puis relie-la à des coffres par des fils spectraux - le Couteau du nécromancien en prise des fils (R). Dans son Contenu, choisis les groupes d'objets que l'esprit transporte. Compte dans la même limite d'urnes.",Un'urna per uno spirito che trasporta oggetti tra forzieri. Non ha una zona propria e può stare accanto ad altre urne. Metti dentro un teschio e collegala ai forzieri con fili spettrali - il Coltello del negromante con la presa dei fili (R). Nel suo Contenuto scegli quali gruppi di oggetti trasporta lo spirito. Conta nello stesso limite di urne.,箱から箱へ物を運ぶ霊のための骨壺。自分の範囲を持たず、ほかの骨壺のすぐ隣に置ける。頭蓋骨を納め、ネクロマンサーのナイフの糸の握り(R)で霊の糸を箱へ張る。「中身」で、霊が運ぶ品目グループを選ぶ。骨壺の上限は共通。,"상자 사이로 물건을 옮기는 영혼을 위한 유골함. 자기 구역이 없어 다른 유골함 바로 옆에 놓을 수 있습니다. 두개골을 넣고, 강령술사의 단검 실 쥐기(R)로 상자와 유령 실을 잇습니다. 내용물에서 영혼이 옮길 물품 그룹을 고릅니다. 유골함 한도는 공통입니다.","Urna dla ducha, który przenosi rzeczy między skrzyniami. Nie ma własnej strefy i może stać tuż obok innych urn. Włóż do niej czaszkę i połącz ją ze skrzyniami widmowymi nićmi - nożem nekromanty w chwycie do nici (R). W Zawartości wybierasz, jakie grupy przedmiotów duch przenosi. Wlicza się do wspólnego limitu urn.","Uma urna para um espírito que leva coisas entre baús. Não tem zona própria e pode ficar ao lado de outras urnas. Coloque um crânio dentro e ligue-a a baús com fios fantasmagóricos - a Faca do necromante na pegada de fios (R). No Conteúdo, escolha quais grupos de itens o espírito leva. Conta no mesmo limite de urnas.","Урна для духа, который носит вещи между ящиками. Своей зоны у неё нет, она ставится вплотную к другим урнам. Положите в неё череп и свяжите с ящиками призрачными нитями - ножом некроманта хватом для нитей (R). В «Содержимом» выбирается, какие группы предметов дух носит. Входит в общий лимит урн.","Eşyaları sandıklar arasında taşıyan bir ruh için küllük. Kendi bölgesi yoktur, diğer küllüklerin hemen yanına konabilir. İçine bir kafatası koy ve Nekromantın Bıçağı'nın iplik tutuşuyla (R) onu sandıklara hayalet ipliklerle bağla. İçerik penceresinde ruhun hangi eşya gruplarını taşıyacağını seç. Aynı küllük sınırına sayılır.",供在箱子之间搬运物品的灵所用的骨灰瓮。它没有自己的区域,可以紧挨其他骨灰瓮放置。放入头骨,再用亡灵法师之刃的牵线握法(R)以幽灵丝线连到箱子。在「内容」里选择灵搬运哪些物品分组。与普通骨灰瓮共用数量上限。,供在箱子之間搬運物品的靈所用的骨灰甕。它沒有自己的區域,可以緊挨其他骨灰甕放置。放入頭骨,再用亡靈法師之刃的牽線握法(R)以幽靈絲線連到箱子。在「內容」裡選擇靈搬運哪些物品分組。與普通骨灰甕共用數量上限。
blockcommand_TEFeatureCinerarium:trunk,blocks,Block,,,,Contents,,Inhalt,Contenido,Contenu,Contenuto,中身,내용물,Zawartość,Conteúdo,Содержимое,İçerik,内容,內容
blockcommand_trunk,blocks,Block,,,,Contents,,Inhalt,Contenido,Contenu,Contenuto,中身,내용물,Zawartość,Conteúdo,Содержимое,İçerik,内容,內容
blockcommand_TEFeatureCinerarium:bag,blocks,Block,,,,Bag,,Tasche,Bolsa,Sac,Borsa,鞄,가방,Torba,Bolsa,Сумка,Çanta,背包,背包
diff --git a/Config/blocks.xml b/Config/blocks.xml
index 4c7ace6..56134b7 100644
--- a/Config/blocks.xml
+++ b/Config/blocks.xml
@@ -560,5 +560,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Config/progression.xml b/Config/progression.xml
index 2cb85f2..7579908 100644
--- a/Config/progression.xml
+++ b/Config/progression.xml
@@ -181,7 +181,7 @@
пользуется, вода сидит на necroNecromancyLvl20. -->
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/HarmonySrc/Cinerarium.cs b/HarmonySrc/Cinerarium.cs
index 772b8b2..2052683 100644
--- a/HarmonySrc/Cinerarium.cs
+++ b/HarmonySrc/Cinerarium.cs
@@ -31,6 +31,16 @@ namespace NecromancerTome
{
public const string BlockName = "necroCinerarium";
public const string SkullBlockName = "necroCinerariumSkull";
+ /// Урна-логист (16.10: «Я не могу ставить урны рядом. Может нам для логиста вообще сделать отдельные урны?»):
+ /// без зоны - ставится вплотную к любым урнам, только нити и перевозка, глазницы всегда зелёные. Лимит - общий.
+ public const string LogistBlockName = "necroCinerariumLogist";
+ public const string LogistSkullBlockName = "necroCinerariumLogistSkull";
+
+ public static bool IsLogistBlock(Block _b)
+ {
+ string n = _b?.GetBlockName();
+ return n == LogistBlockName || n == LogistSkullBlockName;
+ }
public const string SkullItemName = "necroSkull";
public const int HalfWidth = 2;
public const int Below = 1;
@@ -44,7 +54,26 @@ namespace NecromancerTome
public readonly List ThreadFrom = new List();
public bool HasThreadTo;
public Vector3i ThreadTo;
- public bool IsLogist => HasThreadTo || ThreadFrom.Count > 0;
+ public bool HasThreads => HasThreadTo || ThreadFrom.Count > 0;
+ /// Урна-логист - по блоку (necroCinerariumLogist / ...Skull); узнаётся при постановке или по миру.
+ public bool IsLogist
+ {
+ get
+ {
+ if (!_logistKnown)
+ {
+ World w = GameManager.Instance?.World;
+ BlockValue bv = w != null ? w.GetBlock(ToWorldPos()) : BlockValue.Air;
+ if (IsUrn(bv.Block))
+ {
+ _logist = IsLogistBlock(bv.Block);
+ _logistKnown = true;
+ }
+ }
+ return _logist;
+ }
+ }
+ bool _logist, _logistKnown;
/// Фильтр логиста: бит на группу CinerariumGroups; по умолчанию все включены.
public uint GroupMask = CinerariumGroups.All;
@@ -76,7 +105,10 @@ namespace NecromancerTome
public override void OnAdded(Vector3i _blockPos, BlockValue _blockValue)
{
base.OnAdded(_blockPos, _blockValue);
- if (_blockValue.Block?.GetBlockName() == SkullBlockName)
+ _logist = IsLogistBlock(_blockValue.Block);
+ _logistKnown = true;
+ string placed = _blockValue.Block?.GetBlockName();
+ if (placed == SkullBlockName || placed == LogistSkullBlockName)
{
HasSkull = true; // поставили урну, поднятую с черепом
}
@@ -290,7 +322,14 @@ namespace NecromancerTome
/// Нити к убранным ящикам снимаются (раз в 2 с); вид перестраивается после изменений.
void SyncThreads(World _world)
{
- if (_world != null && ConnectionManager.Instance.IsServer && IsLogist && Time.time >= _nextThreadCheck)
+ if (_world != null && ConnectionManager.Instance.IsServer && HasThreads && !IsLogist && _logistKnown)
+ {
+ Debug.Log("[NecromancerTome] Cinerarium: нити у обычной урны " + ToWorldPos() + " сняты - нити только у урны-логиста");
+ ThreadFrom.Clear();
+ HasThreadTo = false;
+ ThreadsChanged();
+ }
+ if (_world != null && ConnectionManager.Instance.IsServer && HasThreads && Time.time >= _nextThreadCheck)
{
_nextThreadCheck = Time.time + 2f;
bool gone = false;
@@ -316,7 +355,7 @@ namespace NecromancerTome
ThreadsChanged();
}
}
- if (!_threadsDirty && (_threadView != null || !IsLogist))
+ if (!_threadsDirty && (_threadView != null || !HasThreads))
{
return;
}
@@ -327,7 +366,7 @@ namespace NecromancerTome
}
_threadsDirty = false;
SyncGlow();
- if (!IsLogist)
+ if (!HasThreads)
{
RemoveThreadView();
return;
@@ -545,8 +584,10 @@ namespace NecromancerTome
void SyncGlow()
{
Transform t = ModelTransform();
- int want = HasSkull ? (IsLogist ? 2 : 1) : 0;
- Texture logist = want == 2 ? LogistEmission() : null;
+ // Логист (16.10: «Так сразу будет видно что логистика, а что технолог») - всегда своя текстура свечения (руны и
+ // глазницы зелёные) и зеленоватая глазурь; светится, как и обычная урна, только с черепом.
+ int want = (HasSkull ? 1 : 0) + (IsLogist ? 2 : 0);
+ Texture logist = IsLogist ? LogistEmission() : null;
if (t == null || (_glowState == want && _glowModel == t))
{
return;
@@ -563,20 +604,17 @@ namespace NecromancerTome
if (logist != null)
{
_glowBlock.SetTexture(EmissionMapId, logist);
- }
- else if (_hadLogistTex)
- {
- _glowBlock.Clear(); // вернуть текстуру материала
- _glowBlock.SetColor(EmissionColorId, HasSkull ? GlowColor : Color.black);
+ _glowBlock.SetColor(AlbedoColorId, LogistTint);
}
r.SetPropertyBlock(_glowBlock);
}
_glowState = want;
_glowModel = t;
- _hadLogistTex = logist != null;
}
- bool _hadLogistTex;
+ /// Глазурь урны-логиста - множитель цвета материала (чёрная глазурь с зелёным отливом).
+ public static Color LogistTint = new Color(0.55f, 1f, 0.75f, 1f);
+ static readonly int AlbedoColorId = Shader.PropertyToID("_Color");
static readonly int EmissionMapId = Shader.PropertyToID("_EmissionMap");
static Texture2D _logistTex;
static bool _logistTried;
@@ -704,7 +742,7 @@ namespace NecromancerTome
public static bool IsUrn(Block _b)
{
string n = _b?.GetBlockName();
- return n == BlockName || n == SkullBlockName;
+ return n == BlockName || n == SkullBlockName || n == LogistBlockName || n == LogistSkullBlockName;
}
public static int UrnLimit(EntityPlayer _player)
@@ -714,9 +752,9 @@ namespace NecromancerTome
}
/// Ключ подсказки, почему урну сюда нельзя, или null.
- public static string PlacementRefusal(Vector3i _pos)
+ public static string PlacementRefusal(Vector3i _pos, Block _placing)
{
- if (CinerariumRegistry.Overlaps(_pos))
+ if (!IsLogistBlock(_placing) && CinerariumRegistry.Overlaps(_pos))
{
return "necroCinerariumOverlap";
}
@@ -833,8 +871,13 @@ namespace NecromancerTome
{
int w = TEFeatureCinerarium.HalfWidth * 2;
int h = TEFeatureCinerarium.Below + TEFeatureCinerarium.Above;
+ World world = GameManager.Instance?.World;
foreach (Vector3i p in Urns().Keys)
{
+ if (world != null && TEFeatureCinerarium.IsLogistBlock(world.GetBlock(p).Block))
+ {
+ continue; // у логиста зоны нет
+ }
if (p != _pos && Math.Abs(p.x - _pos.x) <= w && Math.Abs(p.z - _pos.z) <= w && Math.Abs(p.y - _pos.y) <= h)
{
return true;
@@ -886,11 +929,11 @@ namespace NecromancerTome
}
else if (text.EndsWith("bounds_show"))
{
- _commands[i].enabled = !urn.ZoneShown;
+ _commands[i].enabled = !urn.ZoneShown && !urn.IsLogist;
}
else if (text.EndsWith("bounds_hide"))
{
- _commands[i].enabled = urn.ZoneShown;
+ _commands[i].enabled = urn.ZoneShown && !urn.IsLogist;
}
}
}
@@ -968,7 +1011,7 @@ namespace NecromancerTome
{
return;
}
- string why = TEFeatureCinerarium.PlacementRefusal(_blockPos);
+ string why = TEFeatureCinerarium.PlacementRefusal(_blockPos, __instance);
if (why != null)
{
__result = false;
@@ -1029,7 +1072,10 @@ namespace NecromancerTome
GameManager.ShowTooltip(player, Localization.Get("necroCinerariumBagNotEmpty"), string.Empty, "ui_denied");
return false;
}
- ItemValue iv = ItemClass.GetItem(urn.HasSkull ? TEFeatureCinerarium.SkullBlockName : TEFeatureCinerarium.BlockName);
+ bool logist = TEFeatureCinerarium.IsLogistBlock(bv.Block);
+ ItemValue iv = ItemClass.GetItem(logist
+ ? (urn.HasSkull ? TEFeatureCinerarium.LogistSkullBlockName : TEFeatureCinerarium.LogistBlockName)
+ : (urn.HasSkull ? TEFeatureCinerarium.SkullBlockName : TEFeatureCinerarium.BlockName));
if (iv == null || iv.type <= 0)
{
return true;
diff --git a/HarmonySrc/CinerariumThreads.cs b/HarmonySrc/CinerariumThreads.cs
index d21ab6f..67eae3f 100644
--- a/HarmonySrc/CinerariumThreads.cs
+++ b/HarmonySrc/CinerariumThreads.cs
@@ -12,7 +12,8 @@ namespace NecromancerTome
/// ящика. Дух в цинерарии будет забирать всё что лежит в ящике из которого в него тянется провод, и тащить в ящик, в
/// который тянется провод.» Решения: у урны несколько нитей «откуда» и одна «куда»; везётся по образцу (только то, что уже
/// лежит в ящике «куда»; пустой - всё подряд); «куда» полон - дух ждёт; нить призрачная; длина - как у провода (15 м);
- /// ящики - любые. Урна с нитями - «логист»: её дух только перевозит, глазницы черепов светятся зелёным.
+ /// ящики - любые. Нити - только у отдельного блока «урна-логист» (necroCinerariumLogist, 16.10): без зоны, дух только перевозит,
+ /// глазницы всегда зелёные.
///
/// Инструмент - нож некроманта «хватом для нитей»: отдельный предмет necroWpnBladeNecroKnifeThread (класс ножа в сейве
/// менять нельзя), переключение - пункт в меню ножа по R (то же меню, что «человек/змея/чертоги», SnakeMode.cs; 16.10:
@@ -134,6 +135,11 @@ namespace NecromancerTome
}
if (!_start.HasValue)
{
+ if (urn != null && !urn.IsLogist)
+ {
+ GameManager.ShowTooltip(_pl, Localization.Get("necroThreadNeedLogist"));
+ return;
+ }
_start = owner;
_startUrn = urn != null;
_preview = new GameObject("NecroThreadPreview");
@@ -155,6 +161,12 @@ namespace NecromancerTome
GameManager.ShowTooltip(_pl, Localization.Get("necroThreadNeedPair"));
return;
}
+ TEFeatureCinerarium end = sUrn ? UrnAt(w, s) : urn;
+ if (end == null || !end.IsLogist)
+ {
+ GameManager.ShowTooltip(_pl, Localization.Get("necroThreadNeedLogist"));
+ return;
+ }
if (Vector3.Distance(s.ToVector3(), owner.ToVector3()) > MaxLength)
{
GameManager.ShowTooltip(_pl, Localization.Get("necroThreadTooFar"));
diff --git a/NecromancerHarmony.dll b/NecromancerHarmony.dll
index 8b02015..93fd8b8 100644
Binary files a/NecromancerHarmony.dll and b/NecromancerHarmony.dll differ
diff --git a/Resources/necroCinerarium_e_logist.png b/Resources/necroCinerarium_e_logist.png
index ab59367..a691e91 100644
Binary files a/Resources/necroCinerarium_e_logist.png and b/Resources/necroCinerarium_e_logist.png differ
diff --git a/UIAtlases/ItemIconAtlas/necroCinerariumLogist.png b/UIAtlases/ItemIconAtlas/necroCinerariumLogist.png
new file mode 100644
index 0000000..07c0a16
Binary files /dev/null and b/UIAtlases/ItemIconAtlas/necroCinerariumLogist.png differ