From a902b44bdfc0f95f0a477dc4a66f2132d42b5fdb Mon Sep 17 00:00:00 2001 From: AlexCube Date: Thu, 15 Oct 2026 15:28:04 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A7=D0=B5=D1=80=D0=B5=D0=BF=20=D1=81=D1=82?= =?UTF-8?q?=D0=B0=D0=B2=D0=B8=D1=82=D1=81=D1=8F=20=D0=B4=D0=B5=D0=BA=D0=BE?= =?UTF-8?q?=D1=80=D0=BE=D0=BC=20=D0=BF=D1=80=D1=8F=D0=BC=D0=BE=20=D0=B8?= =?UTF-8?q?=D0=B7=20=D1=80=D1=83=D0=BA=D0=B8:=20R=20-=20=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=8E=20=D0=B2=D0=B8=D0=B4=D0=B0=20(=D0=BF=D1=80=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D0=BE=20=D1=87=D0=B5=D1=80=D0=B5=D0=BF=20/=20=D0=BF?= =?UTF-8?q?=D0=BE=20=D1=86=D0=B5=D0=BD=D1=82=D1=80=D1=83=20/=20=D1=83=20?= =?UTF-8?q?=D1=81=D1=82=D0=B5=D0=BD=D1=8B),=20=D0=9F=D0=9A=D0=9C=20-=20?= =?UTF-8?q?=D0=BF=D0=BE=D1=81=D1=82=D0=B0=D0=B2=D0=B8=D1=82=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Предмет necroSkull остаётся ItemClass, добавлено Action1 PlaceAsBlock (в ItemValue не пишется - сейвы целы). R для черепа ловится постфиксом PlayerMoveController.Update, выбор - cvar necroSkullDecorMode. Поднятый и разрушенный блок - снова череп. Помощник necroSkullDecor спрятан (CreativeMode None), рецепт «череп -> декор» убран, обратный оставлен для уже сделанных помощников. Описание черепа дополнено (13 языков), подсказка и пункт меню «Просто череп». Co-Authored-By: Claude Opus 5.5 --- Config/Localization.csv | 4 +- Config/blocks.xml | 5 +- Config/items.xml | 7 ++ Config/recipes.xml | 5 +- HarmonySrc/SkullDecorPlace.cs | 116 ++++++++++++++++++++++++++++++++++ 5 files changed, 131 insertions(+), 6 deletions(-) create mode 100644 HarmonySrc/SkullDecorPlace.cs diff --git a/Config/Localization.csv b/Config/Localization.csv index f5df3c6..5af4c4e 100644 --- a/Config/Localization.csv +++ b/Config/Localization.csv @@ -431,7 +431,7 @@ plantedNecroBloodRose3HarvestPlayer,blocks,Block,,,,Blood Rose (in bloom),,Blutr plantedNecroBloodRose3HarvestPlayerDesc,blocks,Block,,,,The bud has opened into a black flower. Harvest it to get a Black Rose.,,"Die Knospe hat sich zu einer schwarzen Blüte geöffnet. Ernte sie, um eine Schwarze Rose zu erhalten.",El capullo se ha abierto en una flor negra. Coséchala para obtener una Rosa negra.,Le bouton s'est ouvert en une fleur noire. Récoltez-la pour obtenir une Rose noire.,Il bocciolo si è aperto in un fiore nero. Raccoglilo per ottenere una Rosa nera.,つぼみが黒い花を開いた。収穫すると黒いバラが手に入る。,꽃봉오리가 검은 꽃으로 피었다. 수확하면 검은 장미를 얻는다.,"Pąk rozwinął się w czarny kwiat. Zbierz go, aby zdobyć Czarną różę.",O botão se abriu em uma flor negra. Colha-a para obter uma Rosa negra.,"Бутон раскрылся чёрным цветком. Собери его, чтобы получить чёрную розу.",Tomurcuk kara bir çiçek olarak açtı. Kara Gül elde etmek için hasat et.,花苞绽放成了一朵黑花。收获即可获得黑玫瑰。,花苞綻放成了一朵黑花。收穫即可獲得黑玫瑰。 resourceNecroBlackRose,items,Item,,,,Black Rose,,Schwarze Rose,Rosa negra,Rose noire,Rosa nera,黒いバラ,검은 장미,Czarna róża,Rosa negra,Чёрная роза,Kara Gül,黑玫瑰,黑玫瑰 necroSkull,items,Item,,,,Skull,,Schädel,Cráneo,Crâne,Teschio,頭蓋骨,두개골,Czaszka,Crânio,Череп,Kafatası,头骨,頭骨 -necroSkullDesc,items,Item,,,,"Remains sometimes found when searching a victim's red corpse. Something of the dead one's will still clings to it. Placed in a cinerarium, it becomes a spirit worker.",,"Überreste, die man beim Durchsuchen der roten Leiche eines Opfers manchmal findet. Etwas vom Willen des Toten haftet noch daran. In ein Cinerarium gelegt, wird daraus ein Geisterarbeiter.","Restos que a veces aparecen al registrar el cadáver rojo de una víctima. Aún conservan algo de la voluntad del muerto. Colocado en un cinerario, se convierte en un espíritu trabajador.","Restes que l'on trouve parfois en fouillant le cadavre rouge d'une victime. Il y subsiste un peu de la volonté du mort. Placé dans un cinéraire, il devient un esprit travailleur.","Resti che a volte si trovano perquisendo il cadavere rosso di una vittima. Vi resta ancora qualcosa della volontà del morto. Posto in un cinerario, diventa uno spirito lavoratore.",生贄の赤い死体を漁ると、まれに見つかる遺骸。死者の意志がまだ宿っている。納骨壺に納めると、働く霊になる。,제물의 붉은 시체를 뒤지면 가끔 발견되는 유해. 죽은 자의 의지가 아직 남아 있다. 유골함에 넣으면 일하는 영혼이 된다.,"Szczątki, które czasem znajduje się, przeszukując czerwone ciało ofiary. Wciąż tkwi w nich coś z woli zmarłego. Umieszczona w cinerarium staje się duchem-robotnikiem.","Restos que às vezes aparecem ao revistar o cadáver vermelho de uma vítima. Ainda guardam algo da vontade do morto. Colocado num cinerário, torna-se um espírito trabalhador.","Останки, которые изредка находятся при обыске красного трупа жертвы. В них ещё держится что-то от воли умершего. Положенный в цинерарий, череп становится духом-работником.",Bir kurbanın kırmızı cesedi aranırken bazen bulunan kalıntılar. Ölünün iradesinden bir şeyler hâlâ üzerinde. Bir küllüğe konduğunda çalışan bir ruha dönüşür.,搜刮祭品的红色尸体时偶尔能找到的遗骸。死者的意志仍残留其上。放入骨灰瓮后,会化为劳作的灵魂。,搜刮祭品的紅色屍體時偶爾能找到的遺骸。死者的意志仍殘留其上。放入骨灰甕後,會化為勞作的靈魂。 +necroSkullDesc,items,Item,,,,"Remains sometimes found when searching a victim's red corpse. Something of the dead one's will still clings to it. Placed in a cinerarium, it becomes a spirit worker. Hold [action:permanent:Reload][action:local:Reload] to choose a decor mode, then [action:local:Secondary] puts it on a shelf: in the middle of the block or with the back of the head against the wall.",,"Überreste, die man beim Durchsuchen der roten Leiche eines Opfers manchmal findet. Etwas vom Willen des Toten haftet noch daran. In ein Cinerarium gelegt, wird daraus ein Geisterarbeiter. Halte [action:permanent:Reload][action:local:Reload] für einen Deko-Modus, dann stellt [action:local:Secondary] ihn ab: mitten im Block oder mit dem Hinterkopf an der Wand.","Restos que a veces aparecen al registrar el cadáver rojo de una víctima. Aún conservan algo de la voluntad del muerto. Colocado en un cinerario, se convierte en un espíritu trabajador. Mantén [action:permanent:Reload][action:local:Reload] para elegir un modo decorativo; luego [action:local:Secondary] lo coloca: en el centro del bloque o con la nuca contra la pared.","Restes que l'on trouve parfois en fouillant le cadavre rouge d'une victime. Il y subsiste un peu de la volonté du mort. Placé dans un cinéraire, il devient un esprit travailleur. Maintiens [action:permanent:Reload][action:local:Reload] pour choisir un mode décor, puis [action:local:Secondary] le pose : au centre du bloc ou l'arrière du crâne contre le mur.","Resti che a volte si trovano perquisendo il cadavere rosso di una vittima. Vi resta ancora qualcosa della volontà del morto. Posto in un cinerario, diventa uno spirito lavoratore. Tieni premuto [action:permanent:Reload][action:local:Reload] per scegliere una modalità decorativa, poi [action:local:Secondary] lo posa: al centro del blocco o con la nuca contro il muro.",生贄の赤い死体を漁ると、まれに見つかる遺骸。死者の意志がまだ宿っている。納骨壺に納めると、働く霊になる。[action:permanent:Reload][action:local:Reload]を長押しで飾り方を選び、[action:local:Secondary]で置く:ブロックの中央か、後頭部を壁に付けて。,제물의 붉은 시체를 뒤지면 가끔 발견되는 유해. 죽은 자의 의지가 아직 남아 있다. 유골함에 넣으면 일하는 영혼이 된다. [action:permanent:Reload][action:local:Reload]을 길게 눌러 장식 방식을 고른 뒤 [action:local:Secondary]로 놓습니다: 블록 가운데 또는 뒤통수를 벽에 붙여서.,"Szczątki, które czasem znajduje się, przeszukując czerwone ciało ofiary. Wciąż tkwi w nich coś z woli zmarłego. Umieszczona w cinerarium staje się duchem-robotnikiem. Przytrzymaj [action:permanent:Reload][action:local:Reload], by wybrać tryb dekoracji, a [action:local:Secondary] ją postawi: na środku bloku albo potylicą przy ścianie.","Restos que às vezes aparecem ao revistar o cadáver vermelho de uma vítima. Ainda guardam algo da vontade do morto. Colocado num cinerário, torna-se um espírito trabalhador. Segure [action:permanent:Reload][action:local:Reload] para escolher um modo decorativo; depois [action:local:Secondary] o coloca: no centro do bloco ou com a nuca na parede.","Останки, которые изредка находятся при обыске красного трупа жертвы. В них ещё держится что-то от воли умершего. Положенный в цинерарий, череп становится духом-работником. Удерживайте [action:permanent:Reload][action:local:Reload], чтобы выбрать вид декора, и [action:local:Secondary] поставит череп: по центру блока или затылком к стене.","Bir kurbanın kırmızı cesedi aranırken bazen bulunan kalıntılar. Ölünün iradesinden bir şeyler hâlâ üzerinde. Bir küllüğe konduğunda çalışan bir ruha dönüşür. Dekor modunu seçmek için [action:permanent:Reload][action:local:Reload] tuşunu basılı tut, ardından [action:local:Secondary] onu koyar: bloğun ortasına ya da ensesi duvara dayalı.",搜刮祭品的红色尸体时偶尔能找到的遗骸。死者的意志仍残留其上。放入骨灰瓮后,会化为劳作的灵魂。按住[action:permanent:Reload][action:local:Reload]选择摆放方式,[action:local:Secondary]即可放下:放在方块中央或后脑抵墙。,搜刮祭品的紅色屍體時偶爾能找到的遺骸。死者的意志仍殘留其上。放入骨灰甕後,會化為勞作的靈魂。按住[action:permanent:Reload][action:local:Reload]選擇擺放方式,[action:local:Secondary]即可放下:放在方塊中央或後腦抵牆。 resourceNecroBlackRoseDesc,items,Item,,,,A black flower grown from a blood seed. It smells of iron and damp earth. Grind four of them in a mortar for a jar of black rose juice.,,"Eine schwarze Blüte, aus einem Blutsamen gewachsen. Sie riecht nach Eisen und feuchter Erde. Vier davon im Mörser ergeben ein Glas Schwarzrosensaft.",Una flor negra nacida de una semilla de sangre. Huele a hierro y a tierra húmeda. Cuatro machacadas en un mortero dan un frasco de jugo de rosa negra.,Une fleur noire née d'une graine de sang. Elle sent le fer et la terre humide. Quatre broyées au mortier donnent un bocal de jus de rose noire.,Un fiore nero cresciuto da un seme di sangue. Odora di ferro e di terra umida. Quattro pestate nel mortaio danno un barattolo di succo di rosa nera.,血の種から育った黒い花。鉄と湿った土の匂いがする。乳鉢で4本すり潰すと黒バラの汁が1瓶できる。,피의 씨앗에서 자란 검은 꽃. 쇠와 축축한 흙 냄새가 난다. 절구에 네 송이를 빻으면 검은 장미 즙 한 병이 된다.,Czarny kwiat wyrosły z krwawego nasiona. Pachnie żelazem i wilgotną ziemią. Cztery utarte w moździerzu dają słoik soku z czarnej róży.,Uma flor negra nascida de uma semente de sangue. Cheira a ferro e terra úmida. Quatro moídas no almofariz rendem um pote de suco de rosa negra.,"Чёрный цветок, выросший из кровавого семени. Пахнет железом и сырой землёй. Четыре цветка, растёртые в ступке, дают банку сока чёрной розы.",Kan tohumundan büyümüş kara bir çiçek. Demir ve nemli toprak kokar. Havanda ezilen dört tanesi bir kavanoz kara gül özü verir.,从血之种子中长出的黑花。散发着铁锈与湿土的气味。在研钵中捣碎四朵可得一罐黑玫瑰汁。,從血之種子中長出的黑花。散發著鐵鏽與濕土的氣味。在研缽中搗碎四朵可得一罐黑玫瑰汁。 necroMortar,blocks,Block,,,,Mortar and Pestle,,Mörser und Stößel,Mortero y maja,Mortier et pilon,Mortaio e pestello,乳鉢と乳棒,절구와 공이,Moździerz z tłuczkiem,Pilão e almofariz,Ступка с пестиком,Havan ve Tokmak,研钵与研杵,研缽與研杵 necroMortarDesc,blocks,Block,,,,A stone mortar for grinding black roses into juice. Place it and open it like any workbench.,,"Ein steinerner Mörser, um schwarze Rosen zu Saft zu zerstoßen. Aufstellen und wie eine Werkbank öffnen.",Un mortero de piedra para machacar rosas negras hasta sacarles el jugo. Colócalo y ábrelo como cualquier banco de trabajo.,Un mortier de pierre pour broyer les roses noires en jus. Posez-le et ouvrez-le comme un établi.,Un mortaio di pietra per pestare le rose nere fino a ricavarne il succo. Posizionalo e aprilo come un banco da lavoro.,黒いバラをすり潰して汁にするための石の乳鉢。設置して作業台のように開く。,검은 장미를 빻아 즙을 내는 돌절구. 설치한 뒤 작업대처럼 연다.,Kamienny moździerz do ucierania czarnych róż na sok. Postaw go i otwórz jak warsztat.,Um almofariz de pedra para moer rosas negras até virar suco. Coloque-o e abra-o como uma bancada.,"Каменная ступка, чтобы растирать чёрные розы в сок. Поставь и открой, как верстак.",Kara gülleri ezip özüne dönüştürmek için taş bir havan. Yerleştir ve bir tezgah gibi aç.,用来把黑玫瑰捣成汁的石研钵。放置后像工作台一样打开。,用來把黑玫瑰搗成汁的石研缽。放置後像工作台一樣打開。 @@ -441,3 +441,5 @@ necroSkullDecor,blocks,Block,,,,Skull (decor),,Schädel (Deko),Cráneo (decoraci necroSkullDecorCenter,blocks,Block,,,,Skull: in the middle,,Schädel: in der Mitte,Cráneo: en el centro,Crâne : au centre,Teschio: al centro,頭蓋骨:中央,두개골: 가운데,Czaszka: na środku,Crânio: no centro,Череп: по центру,Kafatası: ortada,头骨:居中,頭骨:置中 necroSkullDecorBack,blocks,Block,,,,Skull: against the wall,,Schädel: an der Wand,Cráneo: contra la pared,Crâne : contre le mur,Teschio: contro il muro,頭蓋骨:壁際,두개골: 벽에 붙여,Czaszka: przy ścianie,Crânio: encostado na parede,Череп: у стены,Kafatası: duvara dayalı,头骨:靠墙,頭骨:靠牆 necroSkullDecorDesc,blocks,Block,,,,A skull to put on a shelf or a table. Hold [action:permanent:Reload][action:local:Reload] to choose: in the middle of the block or with the back of the head against the wall. Craft it back into a skull at any time.,,Ein Schädel für Regal oder Tisch. Halte [action:permanent:Reload][action:local:Reload] zum Wählen: mitten im Block oder mit dem Hinterkopf an der Wand. Jederzeit wieder zum Schädel herstellbar.,Un cráneo para un estante o una mesa. Mantén [action:permanent:Reload][action:local:Reload] para elegir: en el centro del bloque o con la nuca contra la pared. Se puede volver a fabricar como cráneo en cualquier momento.,Un crâne à poser sur une étagère ou une table. Maintiens [action:permanent:Reload][action:local:Reload] pour choisir : au centre du bloc ou l'arrière du crâne contre le mur. Se refabrique en crâne à tout moment.,Un teschio da mettere su uno scaffale o un tavolo. Tieni premuto [action:permanent:Reload][action:local:Reload] per scegliere: al centro del blocco o con la nuca contro il muro. Si può ritrasformare in teschio in qualsiasi momento.,棚や机に置く頭蓋骨。[action:permanent:Reload][action:local:Reload]を長押しで選択:ブロックの中央か、後頭部を壁に付けるか。いつでも頭蓋骨に作り直せます。,선반이나 탁자에 올려두는 두개골. [action:permanent:Reload][action:local:Reload]을 길게 눌러 선택: 블록 가운데 또는 뒤통수를 벽에 붙여서. 언제든 다시 두개골로 제작할 수 있습니다.,"Czaszka na półkę lub stół. Przytrzymaj [action:permanent:Reload][action:local:Reload], aby wybrać: na środku bloku albo potylicą przy ścianie. W każdej chwili można ją z powrotem przerobić na czaszkę.",Um crânio para pôr numa prateleira ou mesa. Segure [action:permanent:Reload][action:local:Reload] para escolher: no centro do bloco ou com a nuca encostada na parede. Pode ser fabricado de volta em crânio a qualquer momento.,"Череп, чтобы поставить на полку или стол. Удерживайте [action:permanent:Reload][action:local:Reload], чтобы выбрать: по центру блока или затылком к стене. В любой момент можно снова скрафтить из него череп.",Rafa ya da masaya koymak için bir kafatası. Seçmek için [action:permanent:Reload][action:local:Reload]'yi basılı tut: bloğun ortasında ya da ensesi duvara dayalı. İstediğin zaman yeniden kafatasına dönüştürülebilir.,放在架子或桌上的头骨。按住[action:permanent:Reload][action:local:Reload]选择:放在方块中央或后脑抵墙。随时可以重新制作回头骨。,放在架子或桌上的頭骨。按住[action:permanent:Reload][action:local:Reload]選擇:放在方塊中央或後腦抵牆。隨時可以重新製作回頭骨。 +necroSkullModeOff,items,Item,,,,Just a skull,,Nur ein Schädel,Solo un cráneo,Simple crâne,Solo un teschio,ただの頭蓋骨,그냥 두개골,Zwykła czaszka,Só um crânio,Просто череп,Sadece kafatası,只是头骨,只是頭骨 +necroSkullDecorHint,items,Item,,,,Hold [action:permanent:Reload][action:local:Reload] to choose how to place the skull.,,"Halte [action:permanent:Reload][action:local:Reload], um zu wählen, wie der Schädel platziert wird.",Mantén [action:permanent:Reload][action:local:Reload] para elegir cómo colocar el cráneo.,Maintiens [action:permanent:Reload][action:local:Reload] pour choisir comment poser le crâne.,Tieni premuto [action:permanent:Reload][action:local:Reload] per scegliere come posare il teschio.,[action:permanent:Reload][action:local:Reload]を長押しして頭蓋骨の置き方を選ぶ。,[action:permanent:Reload][action:local:Reload]을 길게 눌러 두개골을 놓는 방식을 선택하세요.,"Przytrzymaj [action:permanent:Reload][action:local:Reload], aby wybrać, jak postawić czaszkę.",Segure [action:permanent:Reload][action:local:Reload] para escolher como colocar o crânio.,"Удерживайте [action:permanent:Reload][action:local:Reload], чтобы выбрать, как поставить череп.",Kafatasını nasıl koyacağını seçmek için [action:permanent:Reload][action:local:Reload] tuşunu basılı tut.,按住[action:permanent:Reload][action:local:Reload]选择头骨的放置方式。,按住[action:permanent:Reload][action:local:Reload]選擇頭骨的放置方式。 diff --git a/Config/blocks.xml b/Config/blocks.xml index 2af7192..05280ee 100644 --- a/Config/blocks.xml +++ b/Config/blocks.xml @@ -480,7 +480,7 @@ - + @@ -498,7 +498,10 @@ + + diff --git a/Config/items.xml b/Config/items.xml index 0812eed..1b08d4e 100644 --- a/Config/items.xml +++ b/Config/items.xml @@ -2004,6 +2004,13 @@ + + + + + + + - - - diff --git a/HarmonySrc/SkullDecorPlace.cs b/HarmonySrc/SkullDecorPlace.cs new file mode 100644 index 0000000..6a4ccaf --- /dev/null +++ b/HarmonySrc/SkullDecorPlace.cs @@ -0,0 +1,116 @@ +using GUI_2; +using HarmonyLib; +using UnityEngine; + +namespace NecromancerTome +{ + /// + /// Череп ставится декором прямо из руки (15.10.2026, указание: «Сейчас держу в руках именно череп. И он нормальный. + /// Но его нельзя поставить как декор. Может сделать возможность через R переключаться в режим декора и сразу + /// выбирать центральный или у стены?»; «А при поднятии снова делать просто черепом»). + /// Удержание R с черепом в руке - круговое меню: «Просто череп» / «Декор: по центру» / «Декор: у стены». + /// ПКМ - ставит блок выбранного вида (Action1 = PlaceAsBlock у necroSkull в items.xml); в «Просто череп» - ничего. + /// Поднятый блок (E) и разрушенный - снова череп-предмет (CanPickup param1 / drop в blocks.xml). + /// Предмет остаётся ItemClass: действие в ItemValue не пишется (ItemValue.Write: тип, износ, качество, Meta, + /// метаданные, статы, моды) - старые стаки черепа читаются как прежде. + /// R для черепа игра сама не обрабатывает (PlayerMoveController открывает меню только оружию, ближнему бою и + /// блокам) - поэтому нажатие ловится постфиксом к PlayerMoveController.Update. Выбор - cvar игрока + /// (necroSkullDecorMode, без точки - пишется в сейв). + /// + public static class SkullDecorPlace + { + public const string ModeCVar = "necroSkullDecorMode"; + public const int Off = 0, Center = 1, Back = 2; + public const string CenterBlock = "necroSkullDecorCenter"; + public const string BackBlock = "necroSkullDecorBack"; + + public static bool IsSkull(ItemClass _item) => _item != null && _item.Name == NecroSkull.ItemName; + + public static int Mode(EntityAlive _e) + { + if (_e == null) return Off; + int m = Mathf.RoundToInt(_e.GetCVar(ModeCVar)); + return m >= Off && m <= Back ? m : Off; + } + + public static void OnRadialCommand(XUiC_Radial _sender, int _commandIndex, XUiC_Radial.RadialContextAbs _context) + { + EntityPlayerLocal pl = _sender?.xui?.playerUI?.entityPlayer; + if (pl != null && _commandIndex >= Off && _commandIndex <= Back) + { + pl.SetCVar(ModeCVar, _commandIndex); + } + } + + public static void OpenMenu(PlayerMoveController _pmc, EntityPlayerLocal _pl) + { + XUiC_Radial r = _pmc.playerUI?.xui?.RadialWindow; + if (r == null) return; + int cur = Mode(_pl); + r.Open(); + r.ResetRadialEntries(); + r.CreateRadialEntry(Off, "ui_game_symbol_hand", "UIAtlas", "", Localization.Get("necroSkullModeOff"), cur == Off); + r.CreateRadialEntry(Center, "ui_game_symbol_skull", "UIAtlas", "", Localization.Get("necroSkullDecorCenter"), cur == Center); + r.CreateRadialEntry(Back, "ui_game_symbol_skull", "UIAtlas", "", Localization.Get("necroSkullDecorBack"), cur == Back); + r.SetCommonData(UIUtils.GetButtonIconForAction(_pmc.playerInput.Reload), OnRadialCommand, + new XUiC_Radial.RadialContextHoldingSlotIndex(_pl.inventory.holdingItemIdx), cur, false, + XUiC_Radial.RadialValidSameHoldingSlotIndex); + } + } + + /// R с черепом в руке - меню вида декора. + [HarmonyPatch(typeof(PlayerMoveController), nameof(PlayerMoveController.Update))] + public static class Patch_PlayerMoveController_Update_SkullDecor + { + public static void Postfix(PlayerMoveController __instance) + { + EntityPlayerLocal pl = __instance.entityPlayerLocal; + if (pl == null || pl.inventory == null || !SkullDecorPlace.IsSkull(pl.inventory.holdingItem) || pl.IsDead()) + { + return; + } + PlayerActionsLocal inp = __instance.playerInput; + if (inp == null || !(inp.Reload.WasPressed || inp.PermanentActions.Reload.WasPressed) || pl.inventory.IsHandSwitching()) + { + return; + } + if (__instance.playerUI == null || __instance.playerUI.windowManager.IsModalWindowOpen()) + { + return; + } + SkullDecorPlace.OpenMenu(__instance, pl); + } + } + + /// ПКМ с черепом: ставит выбранный вид; в «Просто череп» не ставит (и подсказывает про R). + [HarmonyPatch(typeof(ItemActionPlaceAsBlock), nameof(ItemActionPlaceAsBlock.ExecuteAction))] + public static class Patch_ItemActionPlaceAsBlock_ExecuteAction_SkullDecor + { + static float _hintAt; + + public static bool Prefix(ItemActionPlaceAsBlock __instance, ItemActionData _actionData, bool _bReleased) + { + if (!SkullDecorPlace.IsSkull(__instance.item)) + { + return true; + } + EntityAlive e = _actionData?.invData?.holdingEntity; + int mode = SkullDecorPlace.Mode(e); + if (mode == SkullDecorPlace.Off) + { + if (_bReleased && e is EntityPlayerLocal pl && Time.time - _hintAt > 2f) + { + _hintAt = Time.time; + GameManager.ShowTooltip(pl, Localization.Get("necroSkullDecorHint")); + } + return false; + } + BlockValue bv = Block.GetBlockValue(mode == SkullDecorPlace.Back ? SkullDecorPlace.BackBlock : SkullDecorPlace.CenterBlock); + if (!bv.isair) + { + __instance.blockToPlace = bv; + } + return true; + } + } +}