From 99c2f183ad7df8679ee599f457c23894c3166912 Mon Sep 17 00:00:00 2001 From: AlexCube Date: Thu, 15 Oct 2026 15:37:39 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A7=D0=B5=D1=80=D0=B5=D0=BF:=20=D1=82=D1=80?= =?UTF-8?q?=D0=B8=20=D1=80=D0=B5=D0=B6=D0=B8=D0=BC=D0=B0=20=D0=BA=D0=B0?= =?UTF-8?q?=D0=BA=20=D1=83=20=D0=BC=D0=B5=D0=B1=D0=B5=D0=BB=D0=B8=20-=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B5=D0=B4=D0=BC=D0=B5=D1=82=20/=20=D0=B4=D0=B5?= =?UTF-8?q?=D0=BA=D0=BE=D1=80=20=D0=BF=D0=BE=20=D1=86=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=D1=80=D1=83=20/=20=D0=B4=D0=B5=D0=BA=D0=BE=D1=80=20=D1=83=20?= =?UTF-8?q?=D1=81=D1=82=D0=B5=D0=BD=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit R с черепом-предметом - меню; выбор декора превращает стопку в ячейке в блок (превью, повороты блока). С декором в руке R - обычное меню блока плюс «Просто череп» и второй вид. Действие PlaceAsBlock у предмета убрано (ПКМ из предмета больше не ставит). Стопка блоков 50, как у черепа. Описания черепа и декора (13 языков) - под новую схему. Co-Authored-By: Claude Opus 5.5 --- Config/Localization.csv | 5 +- Config/blocks.xml | 7 +- Config/items.xml | 7 -- Config/recipes.xml | 2 +- HarmonySrc/SkullDecorPlace.cs | 119 ++++++++++++++++++---------------- 5 files changed, 71 insertions(+), 69 deletions(-) diff --git a/Config/Localization.csv b/Config/Localization.csv index 5af4c4e..b541b51 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. 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]即可放下:放在方塊中央或後腦抵牆。 +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 turn it into decor: in the middle of the block or with the back of the head against the wall. Picked up again, it is just a skull.",,"Ü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], um ihn zur Deko zu machen: mitten im Block oder mit dem Hinterkopf an der Wand. Wieder aufgehoben ist er nur ein Schädel.","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 convertirlo en decoración: en el centro del bloque o con la nuca contra la pared. Al recogerlo vuelve a ser un cráneo.","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 en faire un décor : au centre du bloc ou l'arrière du crâne contre le mur. Ramassé, il redevient un simple crâne.","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 trasformarlo in decorazione: al centro del blocco o con la nuca contro il muro. Raccolto, torna un semplice teschio.",生贄の赤い死体を漁ると、まれに見つかる遺骸。死者の意志がまだ宿っている。納骨壺に納めると、働く霊になる。[action:permanent:Reload][action:local:Reload]を長押しで飾りにできる:ブロックの中央か、後頭部を壁に付けて。拾い直せば、ただの頭蓋骨に戻る。,제물의 붉은 시체를 뒤지면 가끔 발견되는 유해. 죽은 자의 의지가 아직 남아 있다. 유골함에 넣으면 일하는 영혼이 된다. [action:permanent:Reload][action:local:Reload]을 길게 눌러 장식으로 바꿀 수 있습니다: 블록 가운데 또는 뒤통수를 벽에 붙여서. 다시 주우면 그냥 두개골입니다.,"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 zrobić z niej dekorację: na środku bloku albo potylicą przy ścianie. Podniesiona znów jest zwykłą czaszką.","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 transformá-lo em decoração: no centro do bloco ou com a nuca na parede. Ao ser recolhido, volta a ser só um crânio.","Останки, которые изредка находятся при обыске красного трупа жертвы. В них ещё держится что-то от воли умершего. Положенный в цинерарий, череп становится духом-работником. Удерживайте [action:permanent:Reload][action:local:Reload], чтобы сделать из него декор: по центру блока или затылком к стене. Поднятый снова станет просто черепом.",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. Dekora dönüştürmek için [action:permanent:Reload][action:local:Reload] tuşunu basılı tut: bloğun ortasında ya da ensesi duvara dayalı. Yerden alınınca yine sadece kafatasıdır.,搜刮祭品的红色尸体时偶尔能找到的遗骸。死者的意志仍残留其上。放入骨灰瓮后,会化为劳作的灵魂。按住[action:permanent:Reload][action:local:Reload]可将其变为装饰:放在方块中央或后脑抵墙。捡起后又是普通头骨。,搜刮祭品的紅色屍體時偶爾能找到的遺骸。死者的意志仍殘留其上。放入骨灰甕後,會化為勞作的靈魂。按住[action:permanent:Reload][action:local:Reload]可將其變為裝飾:放在方塊中央或後腦抵牆。撿起後又是普通頭骨。 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ç.,用来把黑玫瑰捣成汁的石研钵。放置后像工作台一样打开。,用來把黑玫瑰搗成汁的石研缽。放置後像工作台一樣打開。 @@ -440,6 +440,5 @@ resourceNecroBlackRoseJuiceDesc,items,Item,,,,"A jar of ink-black juice pressed necroSkullDecor,blocks,Block,,,,Skull (decor),,Schädel (Deko),Cráneo (decoración),Crâne (décor),Teschio (decorazione),頭蓋骨(装飾),두개골 (장식),Czaszka (dekoracja),Crânio (decoração),Череп (декор),Kafatası (dekor),头骨(装饰),頭骨(裝飾) 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]選擇:放在方塊中央或後腦抵牆。隨時可以重新製作回頭骨。 +necroSkullDecorDesc,blocks,Block,,,,"A skull ready to be placed as decor. Hold [action:permanent:Reload][action:local:Reload] for block rotation, the other look, or to turn it back into a skull. Picked up, it is a skull again.",,"Ein Schädel, bereit zum Platzieren als Deko. Halte [action:permanent:Reload][action:local:Reload] für Blockdrehung, die andere Ansicht oder um ihn wieder zum Schädel zu machen. Aufgehoben ist er wieder ein Schädel.","Un cráneo listo para colocarse como decoración. Mantén [action:permanent:Reload][action:local:Reload] para girar el bloque, cambiar de aspecto o volver a convertirlo en cráneo. Al recogerlo vuelve a ser un cráneo.","Un crâne prêt à être posé en décor. Maintiens [action:permanent:Reload][action:local:Reload] pour la rotation du bloc, l'autre aspect ou pour le redevenir crâne. Ramassé, il redevient un crâne.","Un teschio pronto da posare come decorazione. Tieni premuto [action:permanent:Reload][action:local:Reload] per ruotare il blocco, cambiare aspetto o tornare teschio. Raccolto, torna un teschio.",飾りとして置ける頭蓋骨。[action:permanent:Reload][action:local:Reload]を長押しでブロックの回転、もう一方の置き方、頭蓋骨に戻す。拾えば頭蓋骨に戻る。,"장식으로 놓을 수 있는 두개골. [action:permanent:Reload][action:local:Reload]을 길게 눌러 블록 회전, 다른 모양, 또는 다시 두개골로. 주우면 다시 두개골입니다.","Czaszka gotowa do postawienia jako dekoracja. Przytrzymaj [action:permanent:Reload][action:local:Reload]: obrót bloku, drugi wygląd albo powrót do czaszki. Podniesiona znów jest czaszką.","Um crânio pronto para ser colocado como decoração. Segure [action:permanent:Reload][action:local:Reload] para girar o bloco, trocar de aparência ou voltar a ser crânio. Recolhido, volta a ser crânio.","Череп, готовый встать декором. Удерживайте [action:permanent:Reload][action:local:Reload]: поворот блока, второй вид или обратно в череп. Поднятый снова станет черепом.","Dekor olarak konmaya hazır bir kafatası. [action:permanent:Reload][action:local:Reload] tuşunu basılı tut: blok döndürme, diğer görünüm ya da yeniden kafatası. Yerden alınınca yine kafatasıdır.",可作为装饰放置的头骨。按住[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 05280ee..93fbc3a 100644 --- a/Config/blocks.xml +++ b/Config/blocks.xml @@ -466,7 +466,9 @@ necroSkullDecorCenter - череп лежит на дне клетки по центру; necroSkullDecorBack - на дне, затылком в заднюю грань (сторона стены, Place как у плакатов). Модели - бандл necroskull (Unity NecroSkullDecorSetup.cs, тот же меш, что у предмета). Из черепа и обратно - - рецептами (recipes.xml); снятый блок возвращает помощника, разрушенный - череп-предмет (редкий, 2%). --> + рецептами (recipes.xml); снятый блок возвращает помощника, разрушенный - череп-предмет (редкий, 2%). + 15.10, вторая версия: декор получается из черепа в руке - R, «Череп: по центру» / «у стены» превращает стопку + в блок (превью, повороты блока); обратно - R, «Просто череп» (SkullDecorPlace.cs). Поднятый - снова череп. --> @@ -487,6 +489,7 @@ + @@ -498,7 +501,7 @@ - diff --git a/Config/items.xml b/Config/items.xml index 1b08d4e..0812eed 100644 --- a/Config/items.xml +++ b/Config/items.xml @@ -2004,13 +2004,6 @@ - - - - - - + diff --git a/HarmonySrc/SkullDecorPlace.cs b/HarmonySrc/SkullDecorPlace.cs index 6a4ccaf..bdcaf78 100644 --- a/HarmonySrc/SkullDecorPlace.cs +++ b/HarmonySrc/SkullDecorPlace.cs @@ -5,60 +5,77 @@ 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, без точки - пишется в сейв). + /// Череп - предмет или декор (15.10.2026, вторая версия). Указание после теста: «Посмотри как ставится мебель. Например, + /// горшки с цветами... Три режима. Предмет, и два декора. Если выбран декор, хват меняется на тот который при установке + /// строительных блоков или мебели, и я начинаю видеть типа превью того как блок будет стоять»; поворот - как у блоков. + /// Череп-предмет в руке, удержание R - меню: «Просто череп» / «Череп: по центру» / «Череп: у стены». Выбор декора + /// превращает всю стопку в ячейке пояса в блок этого вида: в руке настоящий блок - превью, повороты блока. + /// Блок-декор в руке, R - обычное меню блока (короткое нажатие - поворот), к нему добавлены «Просто череп» (стопка + /// обратно в черепа) и второй вид декора. + /// Поднятый (E) и разрушенный декор - снова череп-предмет (blocks.xml: CanPickup param1 / drop). + /// Предмет necroSkull не меняется (ItemClass, без действий) - сейвы с черепом целы; блоки-декор - отдельные блоки. + /// R для предмета игра не обрабатывает (PlayerMoveController открывает меню только оружию, ближнему бою и блокам) - + /// нажатие ловится постфиксом к PlayerMoveController.Update. /// public static class SkullDecorPlace { - public const string ModeCVar = "necroSkullDecorMode"; - public const int Off = 0, Center = 1, Back = 2; + public const int ItemIdx = 0, CenterIdx = 1, BackIdx = 2; + /// Номера наших пунктов в меню блока - вне занятых игрой (-2..10). + public const int BlockMenuItem = 40, BlockMenuCenter = 41, BlockMenuBack = 42; public const string CenterBlock = "necroSkullDecorCenter"; public const string BackBlock = "necroSkullDecorBack"; public static bool IsSkull(ItemClass _item) => _item != null && _item.Name == NecroSkull.ItemName; + public static bool IsDecor(ItemClass _item) => _item != null && (_item.Name == CenterBlock || _item.Name == BackBlock); - public static int Mode(EntityAlive _e) + /// Стопка в руке превращается в _name (тот же счёт). + public static void Convert(EntityPlayerLocal _pl, string _name) { - if (_e == null) return Off; - int m = Mathf.RoundToInt(_e.GetCVar(ModeCVar)); - return m >= Off && m <= Back ? m : Off; + if (_pl?.inventory == null) return; + ItemStack cur = _pl.inventory.holdingItemStack; + if (cur == null || cur.IsEmpty() || !(IsSkull(cur.itemValue.ItemClass) || IsDecor(cur.itemValue.ItemClass))) return; + if (cur.itemValue.ItemClass.Name == _name) return; + ItemValue iv = ItemClass.GetItem(_name); + if (iv == null || iv.IsEmpty()) return; + _pl.inventory.SetItem(_pl.inventory.holdingItemIdx, new ItemStack(iv, cur.count)); } - public static void OnRadialCommand(XUiC_Radial _sender, int _commandIndex, XUiC_Radial.RadialContextAbs _context) + public static void OnItemMenu(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); - } + if (_commandIndex == CenterIdx) Convert(pl, CenterBlock); + else if (_commandIndex == BackIdx) Convert(pl, BackBlock); } - public static void OpenMenu(PlayerMoveController _pmc, EntityPlayerLocal _pl) + public static void OpenItemMenu(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, + r.CreateRadialEntry(ItemIdx, "necroSkull", "ItemIconAtlas", "", Localization.Get("necroSkullModeOff"), true); + r.CreateRadialEntry(CenterIdx, "ui_game_symbol_skull", "UIAtlas", "", Localization.Get("necroSkullDecorCenter")); + r.CreateRadialEntry(BackIdx, "ui_game_symbol_skull", "UIAtlas", "", Localization.Get("necroSkullDecorBack")); + r.SetCommonData(UIUtils.GetButtonIconForAction(_pmc.playerInput.Reload), OnItemMenu, + new XUiC_Radial.RadialContextHoldingSlotIndex(_pl.inventory.holdingItemIdx), ItemIdx, false, XUiC_Radial.RadialValidSameHoldingSlotIndex); } + + /// Меню блока с декором в руке: наши пункты - сами, остальное - игре. + public static void OnBlockMenu(XUiC_Radial _sender, int _commandIndex, XUiC_Radial.RadialContextAbs _context) + { + EntityPlayerLocal pl = _sender?.xui?.playerUI?.entityPlayer; + switch (_commandIndex) + { + case BlockMenuItem: Convert(pl, NecroSkull.ItemName); return; + case BlockMenuCenter: Convert(pl, CenterBlock); return; + case BlockMenuBack: Convert(pl, BackBlock); return; + } + _sender.handleBlockShapeCommand(_sender, _commandIndex, _context); + } } - /// R с черепом в руке - меню вида декора. + /// R с черепом-предметом в руке - меню «предмет / два декора». [HarmonyPatch(typeof(PlayerMoveController), nameof(PlayerMoveController.Update))] public static class Patch_PlayerMoveController_Update_SkullDecor { @@ -78,39 +95,29 @@ namespace NecromancerTome { return; } - SkullDecorPlace.OpenMenu(__instance, pl); + SkullDecorPlace.OpenItemMenu(__instance, pl); } } - /// ПКМ с черепом: ставит выбранный вид; в «Просто череп» не ставит (и подсказывает про R). - [HarmonyPatch(typeof(ItemActionPlaceAsBlock), nameof(ItemActionPlaceAsBlock.ExecuteAction))] - public static class Patch_ItemActionPlaceAsBlock_ExecuteAction_SkullDecor + /// Меню блока с черепом-декором в руке: к пунктам игры - «Просто череп» и второй вид. + [HarmonyPatch(typeof(XUiC_Radial), nameof(XUiC_Radial.SetupBlockShapeData))] + public static class Patch_XUiC_Radial_SetupBlockShapeData_SkullDecor { - static float _hintAt; - - public static bool Prefix(ItemActionPlaceAsBlock __instance, ItemActionData _actionData, bool _bReleased) + public static void Postfix(XUiC_Radial __instance) { - if (!SkullDecorPlace.IsSkull(__instance.item)) + EntityPlayerLocal pl = __instance.xui?.playerUI?.entityPlayer; + ItemClass held = pl?.inventory?.holdingItem; + if (!SkullDecorPlace.IsDecor(held)) { - return true; + return; } - 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; + __instance.CreateRadialEntry(SkullDecorPlace.BlockMenuItem, "necroSkull", "ItemIconAtlas", "", Localization.Get("necroSkullModeOff")); + if (held.Name == SkullDecorPlace.CenterBlock) + __instance.CreateRadialEntry(SkullDecorPlace.BlockMenuBack, "ui_game_symbol_skull", "UIAtlas", "", Localization.Get("necroSkullDecorBack")); + else + __instance.CreateRadialEntry(SkullDecorPlace.BlockMenuCenter, "ui_game_symbol_skull", "UIAtlas", "", Localization.Get("necroSkullDecorCenter")); + __instance.SetCommonData(UIUtils.GetButtonIconForAction(__instance.xui.playerUI.playerInput.Activate), SkullDecorPlace.OnBlockMenu, + new XUiC_Radial.RadialContextHoldingSlotIndex(pl.inventory.holdingItemIdx), -1, true, XUiC_Radial.RadialValidSameHoldingSlotIndex); } } }