diff --git a/Config/Localization.csv b/Config/Localization.csv
index 6096762..bf13695 100644
--- a/Config/Localization.csv
+++ b/Config/Localization.csv
@@ -37,7 +37,7 @@ resourceVictimSkinDesc,items,Item,,,,Skin taken from a zombie marked as a Victim
resourceZombieAsh,items,Item,,,,Zombie Ash,,Zombieasche,Ceniza de zombi,Cendre de zombie,Cenere di zombie,ゾンビの灰,좀비의 재,Popiół zombie,Cinza de zumbi,Прах зомби,Zombi Külü,僵尸灰烬,殭屍灰燼
resourceZombieAshDesc,items,Item,,,,Ash left over from a zombie marked as a Victim by the Necromancer's Knife. An ingredient in most necromantic recipes.,,"Asche, die von einem Zombie übrig blieb, den das Messer des Nekromanten als Opfer markiert hat. Zutat der meisten nekromantischen Rezepte.",Ceniza que queda de un zombi marcado como Víctima por el Cuchillo del nigromante. Ingrediente de la mayoría de las recetas nigrománticas.,Cendre laissée par un zombie marqué comme Victime par le Couteau du nécromancien. Ingrédient de la plupart des recettes nécromantiques.,Cenere rimasta da uno zombie marchiato come Vittima dal Coltello del negromante. Ingrediente della maggior parte delle ricette negromantiche.,ネクロマンサーのナイフに「犠牲者」として刻まれたゾンビの残した灰。ほとんどの降霊術レシピの材料。,강령술사의 단검이 '희생자'로 표시한 좀비가 남긴 재. 대부분의 강령술 제작법에 들어가는 재료입니다.,Popiół pozostały po zombie oznaczonym jako Ofiara przez Nóż nekromanty. Składnik większości nekromanckich receptur.,Cinza deixada por um zumbi marcado como Vítima pela Faca do necromante. Ingrediente da maioria das receitas necromânticas.,"Прах, оставшийся от зомби, помеченного Ножом некроманта как Жертва. Ингредиент большинства некромантских рецептов.",Nekromantın Bıçağı tarafından Kurban olarak işaretlenmiş bir zombiden geriye kalan kül. Nekromansi tariflerinin çoğunda kullanılır.,被亡灵法师之刃标记为「祭品」的僵尸所留下的灰烬。多数亡灵配方的材料。,被亡靈法師之刃標記為「祭品」的殭屍所留下的灰燼。多數亡靈配方的材料。
resourceNecromancerBlood,items,Item,,,,Necromancer's Blood,,Blut des Nekromanten,Sangre del nigromante,Sang du nécromancien,Sangue del negromante,ネクロマンサーの血,강령술사의 피,Krew nekromanty,Sangue do necromante,Кровь некроманта,Nekromantın Kanı,亡灵法师之血,亡靈法師之血
-resourceNecromancerBloodDesc,items,Item,,,,"A jar filled with the necromancer's own blood, drawn during a ritual requiring a knife. An ingredient for the darkest necromantic rites.",,"Ein Glas, gefüllt mit dem eigenen Blut des Nekromanten, in einem Ritual abgezapft, für das ein Messer nötig ist. Zutat für die finstersten nekromantischen Riten.","Un tarro lleno de la propia sangre del nigromante, extraída en un ritual que requiere un cuchillo. Ingrediente para los ritos nigrománticos más oscuros.","Un bocal rempli du sang même du nécromancien, tiré lors d'un rituel qui exige un couteau. Ingrédient des rites nécromantiques les plus sombres.","Un barattolo pieno del sangue stesso del negromante, prelevato in un rituale che richiede un coltello. Ingrediente dei riti negromantici più oscuri.",儀式によって抜かれた、ネクロマンサー自身の血で満たされた瓶。儀式にはナイフが要る。最も暗い降霊術の儀式の材料。,"칼이 필요한 의식으로 뽑아낸, 강령술사 자신의 피가 담긴 병. 가장 어두운 강령술 의식의 재료입니다.","Słoik wypełniony własną krwią nekromanty, utoczoną w rytuale wymagającym noża. Składnik najmroczniejszych nekromanckich obrzędów.","Um pote cheio do próprio sangue do necromante, extraído num ritual que exige uma faca. Ingrediente dos ritos necromânticos mais sombrios.","Банка, наполненная кровью самого некроманта, взятой во время ритуала, для которого нужен нож. Ингредиент для самых тёмных некромантских ритуалов.","Bir bıçak gerektiren bir ritüelde alınmış, nekromantın kendi kanıyla dolu bir kavanoz. En karanlık nekromansi ayinlerinin malzemesi.",一罐盛满亡灵法师自身鲜血的容器,取自一场需要刀刃的仪式。最黑暗的亡灵仪式所用的材料。,一罐盛滿亡靈法師自身鮮血的容器,取自一場需要刀刃的儀式。最黑暗的亡靈儀式所用的材料。
+resourceNecromancerBloodDesc,items,Item,,,,"A jar filled with the necromancer's own blood, drawn during a ritual requiring a knife. An ingredient for the darkest necromantic rites. Fits into the Spatial Bracelet.",,"Ein Glas, gefüllt mit dem eigenen Blut des Nekromanten, in einem Ritual abgezapft, für das ein Messer nötig ist. Zutat für die finstersten nekromantischen Riten. Passt in das Raumarmband.","Un tarro lleno de la propia sangre del nigromante, extraída en un ritual que requiere un cuchillo. Ingrediente para los ritos nigrománticos más oscuros. Encaja en el Brazalete espacial.","Un bocal rempli du sang même du nécromancien, tiré lors d'un rituel qui exige un couteau. Ingrédient des rites nécromantiques les plus sombres. S'insère dans le Bracelet spatial.","Un barattolo pieno del sangue stesso del negromante, prelevato in un rituale che richiede un coltello. Ingrediente dei riti negromantici più oscuri. Si inserisce nel Bracciale spaziale.",儀式によって抜かれた、ネクロマンサー自身の血で満たされた瓶。儀式にはナイフが要る。最も暗い降霊術の儀式の材料。「空間の腕輪」に取り付けられる。,"칼이 필요한 의식으로 뽑아낸, 강령술사 자신의 피가 담긴 병. 가장 어두운 강령술 의식의 재료입니다. '공간의 팔찌'에 장착할 수 있습니다.","Słoik wypełniony własną krwią nekromanty, utoczoną w rytuale wymagającym noża. Składnik najmroczniejszych nekromanckich obrzędów. Pasuje do Bransolety przestrzennej.","Um pote cheio do próprio sangue do necromante, extraído num ritual que exige uma faca. Ingrediente dos ritos necromânticos mais sombrios. Encaixa no Bracelete espacial.","Банка, наполненная кровью самого некроманта, взятой во время ритуала, для которого нужен нож. Ингредиент для самых тёмных некромантских ритуалов. Помещается в Пространственный браслет.","Bir bıçak gerektiren bir ritüelde alınmış, nekromantın kendi kanıyla dolu bir kavanoz. En karanlık nekromansi ayinlerinin malzemesi. Uzam Bileziği'ne takılabilir.",一罐盛满亡灵法师自身鲜血的容器,取自一场需要刀刃的仪式。最黑暗的亡灵仪式所用的材料。可装入空间手环。,一罐盛滿亡靈法師自身鮮血的容器,取自一場需要刀刃的儀式。最黑暗的亡靈儀式所用的材料。可裝入空間手環。
resourceNecromancerBloodNeedsKnife,items,Item,,,,You need a knife to perform this ritual,,Für dieses Ritual brauchst du ein Messer,Necesitas un cuchillo para realizar este ritual,Il te faut un couteau pour accomplir ce rituel,Ti serve un coltello per compiere questo rituale,この儀式にはナイフが必要です,이 의식을 치르려면 칼이 필요합니다,Do tego rytuału potrzebujesz noża,Você precisa de uma faca para realizar este ritual,Для этого ритуала нужен нож,Bu ritüeli gerçekleştirmek için bir bıçağa ihtiyacın var,进行此仪式需要一把刀,進行此儀式需要一把刀
bookSummonZombieGriffin,items,Item,,,,Summon Zombie Griffin,,Zombiegreif beschwören,Invocar Grifo Zombi,Invoquer un Griffon Zombie,Evoca Grifone Zombie,ゾンビグリフォン召喚,좀비 그리핀 소환,Przyzwanie: Gryf Zombie,Invocar Grifo Zumbi,Призыв зомбогрифа,Zombi Grifin Çağırma,召唤僵尸狮鹫,召喚殭屍獅鷲
bookSummonZombieGriffinDesc,items,Item,,,,A necromantic tome that raises a zombie griffin bound to your will. It fights alongside you against other zombies until it dies. You can only have one bound at a time. Power attack to recall it back into the book.,,"Ein nekromantisches Buch, das einen Zombiegreifen erweckt, der deinem Willen unterworfen ist. Er kämpft an deiner Seite gegen andere Zombies, bis er stirbt. Du kannst immer nur einen gebunden haben. Mit dem Powerangriff rufst du ihn ins Buch zurück.",Un tomo nigromántico que alza un Grifo Zombi sometido a tu voluntad. Lucha a tu lado contra otros zombis hasta morir. Solo puedes tener uno vinculado a la vez. Usa el ataque potente para devolverlo al libro.,Un ouvrage nécromantique qui relève un Griffon Zombie soumis à ta volonté. Il combat à tes côtés contre les autres zombies jusqu'à sa mort. Tu ne peux en lier qu'un seul à la fois. L'attaque puissante le rappelle dans le livre.,Un tomo negromantico che rialza un Grifone Zombie soggetto alla tua volontà. Combatte al tuo fianco contro gli altri zombie finché non muore. Puoi averne vincolato solo uno alla volta. L'attacco potente lo richiama nel libro.,あなたの意志に縛られたゾンビグリフォンを起こす降霊術の書。死ぬまで、あなたの側で他のゾンビと戦う。同時に縛っておけるのは一体だけ。強攻撃で書物へ呼び戻せる。,당신의 의지에 묶인 좀비 그리핀을(를) 일으키는 강령술 서적. 죽을 때까지 당신 곁에서 다른 좀비와 싸운다. 한 번에 하나만 묶어 둘 수 있다. 강공격으로 책 속에 불러들인다.,"Nekromancki tom, który wskrzesza Gryfa Zombie związanego twoją wolą. Walczy u twojego boku z innymi zombie, aż zginie. Naraz możesz mieć związanego tylko jednego. Atak specjalny odwołuje go z powrotem do księgi.",Um tomo necromântico que ergue um Grifo Zumbi preso à sua vontade. Luta ao seu lado contra outros zumbis até morrer. Você só pode ter um vinculado por vez. O ataque forte o chama de volta para o livro.,"Некромантский фолиант, поднимающий зомбогрифа, подчинённого вашей воле. Он сражается на вашей стороне против других зомби, пока не погибнет. Одновременно можно держать только одного. Силовая атака отзывает его обратно в книгу.",İradene bağlı bir Zombi Grifin dirilten bir nekromansi kitabı. Ölene kadar yanında diğer zombilere karşı savaşır. Aynı anda yalnızca bir tanesini bağlı tutabilirsin. Güçlü saldırı onu kitaba geri çağırır.,一本亡灵法术典籍,唤起一只受你意志束缚的僵尸狮鹫。它会在你身边与其他僵尸战斗,直到死亡。同时只能束缚一只。使用强力攻击可将其召回书中。,一本亡靈法術典籍,喚起一隻受你意志束縛的殭屍獅鷲。牠會在你身邊與其他殭屍戰鬥,直到死亡。同時只能束縛一隻。使用強力攻擊可將其召回書中。
@@ -73,7 +73,7 @@ EntityLootContainerVictim,entityclasses,Entity Info,,,,Victim's Bag,,Beutel des
noteDuke01,items,Quest - Note,,,,Note,,Notiz,Nota,Mot,Biglietto,書き置き,쪽지,List,Bilhete,Записка,Not,纸条,紙條
noteDuke01Desc,items,Quest - Note,,,,"You don't deserve death by my hand. You deserve death by a thousand hands. Every seven days, this world will tear you apart - and every time, it will hurt more, terrify more. You will build, only to lose it all. You will hope, only to despair. And when you tire, when you finally break, you will simply cease to be. You will become one of them. And even then, I won't remember your name. Let the dead make you dead. Let death bring you no peace. Let the living forget you forever. Goodbye, mistake.",,"Du verdienst keinen Tod durch meine Hand. Du verdienst den Tod durch tausend Hände. Alle sieben Tage wird diese Welt dich zerreißen – und jedes Mal wird es mehr wehtun, mehr Angst machen. Du wirst bauen, nur um alles zu verlieren. Du wirst hoffen, nur um zu verzweifeln. Und wenn du müde wirst, wenn du endlich zerbrichst, wirst du einfach aufhören zu sein. Du wirst einer von ihnen. Und selbst dann werde ich mich nicht an deinen Namen erinnern. Sollen die Toten dich tot machen. Soll der Tod dir keinen Frieden bringen. Sollen die Lebenden dich für immer vergessen. Leb wohl, Fehler.","No mereces morir a mi mano. Mereces morir a manos de mil. Cada siete días, este mundo te hará pedazos, y cada vez dolerá más y aterrará más. Construirás solo para perderlo todo. Tendrás esperanza solo para desesperar. Y cuando te canses, cuando por fin te quiebres, sencillamente dejarás de existir. Te convertirás en uno de ellos. Y ni siquiera entonces recordaré tu nombre. Que los muertos te hagan morir. Que la muerte no te traiga paz. Que los vivos te olviden para siempre. Adiós, error.","Tu ne mérites pas de mourir de ma main. Tu mérites de mourir de mille mains. Tous les sept jours, ce monde te mettra en pièces – et chaque fois, la douleur sera plus vive, la terreur plus grande. Tu bâtiras pour tout perdre. Tu espéreras pour désespérer. Et quand tu seras las, quand tu finiras par te briser, tu cesseras simplement d'être. Tu deviendras l'un d'eux. Et même alors, je ne me souviendrai pas de ton nom. Que les morts te rendent mort. Que la mort ne t'apporte aucune paix. Que les vivants t'oublient à jamais. Adieu, erreur.","Non meriti di morire per mano mia. Meriti di morire per mille mani. Ogni sette giorni questo mondo ti farà a pezzi, e ogni volta farà più male, spaventerà di più. Costruirai solo per perdere tutto. Spererai solo per disperare. E quando sarai stanco, quando alla fine ti spezzerai, semplicemente cesserai di essere. Diventerai uno di loro. E nemmeno allora ricorderò il tuo nome. Che i morti ti rendano morto. Che la morte non ti porti pace. Che i vivi ti dimentichino per sempre. Addio, errore.",お前は私の手にかかって死ぬに値しない。千の手にかかって死ぬに値する。七日ごとに、この世界はお前を引き裂く。そのたびに痛みは増し、恐怖は深まる。築いては、すべて失う。望んでは、絶望する。そして疲れ果て、ついに折れたとき、お前はただ在ることをやめる。お前は奴らの一人になる。そのときでさえ、私はお前の名を覚えていない。死者にお前を死者たらしめよ。死がお前に安らぎを与えぬように。生者が永久にお前を忘れるように。さらばだ、過ち。,"너는 내 손에 죽을 자격이 없다. 너는 천 개의 손에 죽을 자격이 있다. 이레마다 이 세계가 너를 찢어놓을 것이다. 그리고 그때마다 더 아프고, 더 두려울 것이다. 너는 세울 것이고, 모두 잃을 것이다. 너는 바랄 것이고, 절망할 것이다. 그러다 지치고, 마침내 부러지면, 너는 그저 존재하기를 그친다. 너는 그들 중 하나가 된다. 그때조차 나는 네 이름을 기억하지 못할 것이다. 죽은 자들이 너를 죽게 하리라. 죽음이 네게 안식을 주지 않기를. 산 자들이 너를 영원히 잊기를. 잘 가라, 실수여.","Nie zasługujesz na śmierć z mojej ręki. Zasługujesz na śmierć z tysiąca rąk. Co siedem dni ten świat będzie cię rozdzierał – i za każdym razem będzie bolało bardziej, przerażało bardziej. Będziesz budował, by wszystko stracić. Będziesz miał nadzieję, by rozpaczać. A gdy się zmęczysz, gdy w końcu pękniesz, po prostu przestaniesz być. Staniesz się jednym z nich. I nawet wtedy nie przypomnę sobie twojego imienia. Niech umarli uczynią cię umarłym. Niech śmierć nie przyniesie ci spokoju. Niech żywi zapomną o tobie na zawsze. Żegnaj, pomyłko.","Você não merece morrer pela minha mão. Merece morrer por mil mãos. A cada sete dias, este mundo vai te despedaçar - e a cada vez doerá mais, apavorará mais. Você vai construir, só para perder tudo. Vai esperar, só para se desesperar. E quando se cansar, quando finalmente se quebrar, simplesmente deixará de existir. Você se tornará um deles. E nem mesmo então eu lembrarei o seu nome. Que os mortos te façam morto. Que a morte não te traga paz. Que os vivos te esqueçam para sempre. Adeus, erro.","Ты не заслуживаешь смерти от моей руки. Ты заслуживаешь смерти от тысяч рук. Каждые семь дней этот мир будет рвать тебя на части, и каждый раз — всё больнее, всё страшнее. Ты будешь строить, чтобы терять. Ты будешь надеяться, чтобы отчаиваться. И когда ты устанешь, когда сломаешься — ты просто перестанешь быть. Ты превратишься в одного из них. И даже тогда — я не запомню твоё имя. Пусть мёртвые сделают тебя мёртвым. Пусть смерть не принесёт тебе покоя. Пусть живые навсегда забудут тебя. Прощай, ошибка.","Benim elimden ölmeyi hak etmiyorsun. Bin elin altında ölmeyi hak ediyorsun. Her yedi günde bir bu dünya seni paramparça edecek - ve her seferinde daha çok acıtacak, daha çok korkutacak. İnşa edeceksin, sonra hepsini kaybedeceksin. Umut edeceksin, sonra umutsuzluğa düşeceksin. Yorulduğunda, sonunda kırıldığında ise yalnızca var olmaktan çıkacaksın. Onlardan biri olacaksın. O zaman bile adını hatırlamayacağım. Bırak ölüler seni öldürsün. Bırak ölüm sana huzur getirmesin. Bırak yaşayanlar seni sonsuza dek unutsun. Elveda, hata.",你不配死在我手上。你配死在一千双手下。每隔七天,这个世界都会把你撕碎——而且一次比一次更痛,一次比一次更恐怖。你会建起一切,只为失去一切。你会心存希望,只为坠入绝望。等你倦了,等你终于崩溃,你便会干脆不再存在。你会成为它们中的一员。即便到那时,我也不会记得你的名字。让死者置你于死地。愿死亡不予你安宁。愿生者永远将你遗忘。永别了,错误。,你不配死在我手上。你配死在一千雙手下。每隔七天,這個世界都會把你撕碎——而且一次比一次更痛,一次比一次更恐怖。你會建起一切,只為失去一切。你會心存希望,只為墜入絕望。等你倦了,等你終於崩潰,你便會乾脆不再存在。你會成為牠們中的一員。即便到那時,我也不會記得你的名字。讓死者置你於死地。願死亡不予你安寧。願生者永遠將你遺忘。永別了,錯誤。
braceletSpatialVault,items,Item,,,,Spatial Bracelet,,Raumarmband,Brazalete espacial,Bracelet spatial,Bracciale spaziale,空間の腕輪,공간의 팔찌,Bransoleta przestrzenna,Bracelete espacial,Пространственный браслет,Uzam Bileziği,空间手环,空間手環
-braceletSpatialVaultDesc,items,Item,,,,"A necromantic bracelet. Power attack to tear open a personal storage rift - its size grows with your Necromancy skill. Hold the regular attack on a block and it is pulled into the rift: ten seconds up close, one more for every block of distance. The power attack interrupts that and opens the rift instead.",,Ein nekromantisches Armband. Ein Machtangriff reißt einen persönlichen Lagerriss auf - seine Größe wächst mit deiner Nekromantie-Fertigkeit. Halte den normalen Angriff auf einem Block und er wird in den Riss gezogen: zehn Sekunden aus der Nähe und eine weitere pro Block Entfernung. Der Machtangriff bricht das ab und öffnet stattdessen den Riss.,Un brazalete nigromántico. El ataque potente abre una grieta de almacenamiento personal; su tamaño crece con tu habilidad de Nigromancia. Mantén el ataque normal sobre un bloque y este será atraído a la grieta: diez segundos de cerca y uno más por cada bloque de distancia. El ataque potente lo interrumpe y abre la grieta.,Un bracelet nécromantique. L'attaque puissante ouvre une faille de stockage personnelle - sa taille augmente avec votre compétence de Nécromancie. Maintenez l'attaque normale sur un bloc et il est aspiré dans la faille : dix secondes de près et une de plus par bloc de distance. L'attaque puissante interrompt cela et ouvre la faille.,Un bracciale negromantico. L'attacco potente apre una faglia di stoccaggio personale - la sua dimensione cresce con l'abilità Negromanzia. Tieni premuto l'attacco normale su un blocco e verrà attirato nella faglia: dieci secondi da vicino e uno in più per ogni blocco di distanza. L'attacco potente lo interrompe e apre la faglia.,ネクロマンサーの腕輪。パワーアタックで個人用の収納亀裂を開きます。容量はネクロマンシーのスキルと共に増えます。ブロックに照準して通常攻撃を押し続けると亀裂に引き込まれます。密着で十秒、距離が1ブロック増えるごとに1秒追加されます。パワーアタックで中断し、亀裂を開きます。,강령술사의 팔지. 강타로 개인 보관 균열을 열며 크기는 강령술 스킬에 따라 커집니다. 블록을 조준한 채 일반 공격을 누르고 있으면 그 블록이 균열로 빨려들어갑니다. 밀착 시 10초이며 거리 1블록마다 1초씩 늘어납니다. 강타는 이를 중단하고 균열을 엽니다.,Nekromancka bransoleta. Silny atak rozrywa osobistą szczelinę magazynową - jej rozmiar rośnie wraz z umiejętnością Nekromancji. Przytrzymaj zwykły atak na bloku a zostanie on wciągnięty do szczeliny: dziesięć sekund z bliska i jedna więcej za każdy blok odległości. Silny atak przerywa to i otwiera szczelinę.,Uma bracelete necromântica. O ataque forte abre uma fenda de armazenamento pessoal - seu tamanho cresce com a sua habilidade de Necromancia. Segure o ataque normal sobre um bloco e ele será puxado para a fenda: dez segundos de perto e mais um por bloco de distância. O ataque forte interrompe isso e abre a fenda.,Некромантский браслет. Силовая атака вскрывает личный разлом-хранилище - его размер растёт вместе с навыком Некромантии. Зажмите обычную атаку на блоке - и он втянется в разлом: десять секунд вплотную и ещё по секунде за каждый блок расстояния. Силовая атака прерывает это и открывает хранилище.,Nekromantik bir bileklik. Güçlü saldırı kişisel bir depo yarığı açar; boyutu Nekromantik becerinle birlikte büyür. Normal saldırıyı bir bloka basılı tut ve blok yarığa çekilsin: yakından on saniye ve her blokluk mesafe için bir saniye daha. Güçlü saldırı bunu keser ve yarığı açar.,亡灵法师的手镯。重击可撕开个人储物裂隙,其容量随亡灵法术技能增长。对准方块按住普通攻击,方块便会被拉入裂隙:贴近时为十秒,每远一格再加一秒。重击可中断并打开裂隙。,亡靈法師的手鐠。重擊可撕開個人儲物裂隙,其容量隨亡靈法術技能增長。對準方塊按住普通攻擊,方塊便會被拉入裂隙:貼近時為十秒,每遠一格再加一秒。重擊可中斷並打開裂隙。
+braceletSpatialVaultDesc,items,Item,,,,"A necromantic bracelet. Power attack to tear open a personal storage rift - its size grows with your Necromancy skill. Hold the regular attack on a block and it is pulled into the rift: ten seconds up close, one more for every block of distance. The power attack interrupts that and opens the rift instead. Pulling blocks needs Necromancer's Blood or a Blood Stone in the bracelet's mod slot. Every second of the pull costs the blood one point of durability. When the blood runs out the empty jar shatters.",,"Ein nekromantisches Armband. Ein Machtangriff reißt einen persönlichen Lagerriss auf - seine Größe wächst mit deiner Nekromantie-Fertigkeit. Halte den normalen Angriff auf einem Block und er wird in den Riss gezogen: zehn Sekunden aus der Nähe und eine weitere pro Block Entfernung. Der Machtangriff bricht das ab und öffnet stattdessen den Riss. Zum Einziehen von Blöcken muss Blut des Nekromanten oder ein Blutstein im Modslot des Armbands stecken. Jede Sekunde des Einziehens kostet das Blut einen Haltbarkeitspunkt. Ist das Blut aufgebraucht, zerspringt das leere Glas.","Un brazalete nigromántico. El ataque potente abre una grieta de almacenamiento personal; su tamaño crece con tu habilidad de Nigromancia. Mantén el ataque normal sobre un bloque y este será atraído a la grieta: diez segundos de cerca y uno más por cada bloque de distancia. El ataque potente lo interrumpe y abre la grieta. Para absorber bloques hace falta sangre del nigromante o una piedra de sangre en la ranura de modificación del brazalete. Cada segundo de absorción cuesta un punto de durabilidad de la sangre. Cuando la sangre se agota, el tarro vacío se hace añicos.","Un bracelet nécromantique. L'attaque puissante ouvre une faille de stockage personnelle - sa taille augmente avec votre compétence de Nécromancie. Maintenez l'attaque normale sur un bloc et il est aspiré dans la faille : dix secondes de près et une de plus par bloc de distance. L'attaque puissante interrompt cela et ouvre la faille. Pour aspirer des blocs, il faut du sang de nécromancien ou une pierre de sang dans l'emplacement de mod du bracelet. Chaque seconde d'aspiration coûte un point de durabilité au sang. Quand le sang est épuisé, le bocal vide se brise.","Un bracciale negromantico. L'attacco potente apre una faglia di stoccaggio personale - la sua dimensione cresce con l'abilità Negromanzia. Tieni premuto l'attacco normale su un blocco e verrà attirato nella faglia: dieci secondi da vicino e uno in più per ogni blocco di distanza. L'attacco potente lo interrompe e apre la faglia. Per assorbire blocchi serve sangue del negromante o una pietra di sangue nello slot mod del bracciale. Ogni secondo di assorbimento costa al sangue un punto di durabilità. Quando il sangue finisce, il barattolo vuoto va in frantumi.",ネクロマンサーの腕輪。パワーアタックで個人用の収納亀裂を開きます。容量はネクロマンシーのスキルと共に増えます。ブロックに照準して通常攻撃を押し続けると亀裂に引き込まれます。密着で十秒、距離が1ブロック増えるごとに1秒追加されます。パワーアタックで中断し、亀裂を開きます。ブロックの吸収には、腕輪の改造スロットにネクロマンサーの血か血の石が必要。吸収の1秒ごとに、血の耐久値を1消費する。血を使い切ると、空の瓶は砕け散る。,강령술사의 팔지. 강타로 개인 보관 균열을 열며 크기는 강령술 스킬에 따라 커집니다. 블록을 조준한 채 일반 공격을 누르고 있으면 그 블록이 균열로 빨려들어갑니다. 밀착 시 10초이며 거리 1블록마다 1초씩 늘어납니다. 강타는 이를 중단하고 균열을 엽니다. 블록을 흡수하려면 팔찌의 개조 슬롯에 강령술사의 피나 피의 돌이 있어야 합니다. 흡수 1초마다 피의 내구도가 1씩 소모됩니다. 피가 다하면 빈 병은 산산이 부서집니다.,"Nekromancka bransoleta. Silny atak rozrywa osobistą szczelinę magazynową - jej rozmiar rośnie wraz z umiejętnością Nekromancji. Przytrzymaj zwykły atak na bloku a zostanie on wciągnięty do szczeliny: dziesięć sekund z bliska i jedna więcej za każdy blok odległości. Silny atak przerywa to i otwiera szczelinę. Wciąganie bloków wymaga krwi nekromanty albo krwawego kamienia w gnieździe modyfikacji bransolety. Każda sekunda wciągania kosztuje krew jeden punkt wytrzymałości. Gdy krew się skończy, pusty słoik pęka.","Uma bracelete necromântica. O ataque forte abre uma fenda de armazenamento pessoal - seu tamanho cresce com a sua habilidade de Necromancia. Segure o ataque normal sobre um bloco e ele será puxado para a fenda: dez segundos de perto e mais um por bloco de distância. O ataque forte interrompe isso e abre a fenda. Para absorver blocos é preciso sangue do necromante ou uma pedra de sangue no encaixe de modificação do bracelete. Cada segundo de absorção custa um ponto de durabilidade do sangue. Quando o sangue acaba, o pote vazio se estilhaça.","Некромантский браслет. Силовая атака вскрывает личный разлом-хранилище - его размер растёт вместе с навыком Некромантии. Зажмите обычную атаку на блоке - и он втянется в разлом: десять секунд вплотную и ещё по секунде за каждый блок расстояния. Силовая атака прерывает это и открывает хранилище. Чтобы поглощать блоки, в слоте модификаций браслета должна быть кровь некроманта или кровавый камень. Каждая секунда поглощения тратит единицу прочности крови. Когда кровь кончается, пустая банка разбивается.",Nekromantik bir bileklik. Güçlü saldırı kişisel bir depo yarığı açar; boyutu Nekromantik becerinle birlikte büyür. Normal saldırıyı bir bloka basılı tut ve blok yarığa çekilsin: yakından on saniye ve her blokluk mesafe için bir saniye daha. Güçlü saldırı bunu keser ve yarığı açar. Blok çekmek için bileziğin mod yuvasında nekromantın kanı ya da bir kan taşı bulunmalı. Çekmenin her saniyesi kanın dayanıklılığından bir puan götürür. Kan tükendiğinde boş kavanoz paramparça olur.,亡灵法师的手镯。重击可撕开个人储物裂隙,其容量随亡灵法术技能增长。对准方块按住普通攻击,方块便会被拉入裂隙:贴近时为十秒,每远一格再加一秒。重击可中断并打开裂隙。吸收方块需要在手环的改造槽中装有亡灵法师之血或血石。吸收每持续一秒,血的耐久度便消耗一点。血用尽时,空罐随之碎裂。,亡靈法師的手鐠。重擊可撕開個人儲物裂隙,其容量隨亡靈法術技能增長。對準方塊按住普通攻擊,方塊便會被拉入裂隙:貼近時為十秒,每遠一格再加一秒。重擊可中斷並打開裂隙。吸收方塊需要在手環的改造槽中裝有亡靈法師之血或血石。吸收每持續一秒,血的耐久度便消耗一點。血用盡時,空罐隨之碎裂。
braceletSpatialVaultWindowTitle,items,Item,,,,Spatial Storage,,Raumlager,Almacén espacial,Stockage spatial,Deposito spaziale,空間収納,공간 보관함,Schowek przestrzenny,Armazenamento espacial,Пространственное хранилище,Uzam Deposu,空间储物,空間儲物
braceletSpatialVaultTooWeak,items,Item,,,,Your Necromancy skill isn't strong enough yet to open a storage rift,,"Deine Nekromantie-Fertigkeit reicht noch nicht, um einen Lagerriss zu öffnen",Tu habilidad de Nigromancia aún no es lo bastante fuerte para abrir una grieta de almacenamiento,Ta compétence de Nécromancie n'est pas encore assez forte pour ouvrir une faille de stockage,La tua abilità di Negromanzia non è ancora abbastanza forte per aprire una fessura di stoccaggio,降霊術スキルがまだ足りず、収納の裂け目を開けません,강령술 기술이 아직 부족해 보관 균열을 열 수 없습니다,"Twoja Nekromancja jest jeszcze za słaba, by otworzyć szczelinę na zapasy",Sua habilidade de Necromancia ainda não é forte o bastante para abrir uma fenda de armazenamento,"Ваш навык Некромантии пока недостаточен, чтобы открыть разлом-хранилище",Nekromansi yeteneğin bir depo yarığı açacak kadar güçlü değil,你的亡灵法术技能尚不足以开启储物裂隙,你的亡靈法術技能尚不足以開啟儲物裂隙
braceletSpatialVaultNoTarget,items,Item,,,,There's no zombie in your sight,,Kein Zombie in Sicht,No hay ningún zombi a la vista,Aucun zombie en vue,Non c'è nessuno zombie nel mirino,視界にゾンビがいません,시야에 좀비가 없습니다,W polu widzenia nie ma zombie,Não há nenhum zumbi à vista,В поле зрения нет зомби,Görüş alanında zombi yok,视野中没有僵尸,視野中沒有殭屍
@@ -83,6 +83,7 @@ braceletSpatialVaultFull,items,Item,,,,The storage rift is full,,Der Lagerriss i
braceletSpatialVaultPickupChanneling,items,Item,,,,Pulling the block into the rift,,Block wird in den Riss gezogen,Atrayendo el bloque a la grieta,Attraction du bloc dans la faille,Il blocco viene attirato nella faglia,ブロックを亀裂に引き込んでいます,블록을 균열로 끌어들이는 중,Wciąganie bloku do szczeliny,Puxando o bloco para a fenda,Блок втягивается в разлом,Blok yarığa çekiliyor,正在将方块拉入裂隙,正在將方塊拉入裂隙
braceletSpatialVaultTraderArea,items,Item,,,,You can't take blocks on a trader's ground,,Auf dem Gelände eines Händlers kannst du keine Blöcke aufnehmen,No puedes llevarte bloques en el recinto de un comerciante,Impossible de prendre des blocs sur le terrain d'un marchand,Non puoi prendere blocchi nel recinto di un mercante,商人の敷地内ではブロックを回収できません,상인의 부지에서는 블록을 가져갈 수 없습니다,Na terenie handlarza nie możesz zabierać bloków,Você não pode levar blocos no terreno de um comerciante,На территории торговца блоки забирать нельзя,Tüccarın arazisinde blok alamazsın,无法在商人的地盘上收取方块,無法在商人的地盤上收取方塊
braceletSpatialVaultIndestructible,items,Item,,,,This block can't be destroyed or taken,,Dieser Block kann weder zerstört noch aufgenommen werden,Este bloque no puede destruirse ni llevarse,Ce bloc ne peut être ni détruit ni emporté,Questo blocco non può essere distrutto né preso,このブロックは破壊も回収もできません,이 블록은 파괴하거나 가져갈 수 없습니다,Tego bloku nie można zniszczyć ani zabrać,Este bloco não pode ser destruído nem levado,Этот блок нельзя разрушить или забрать,Bu blok ne yıkılabilir ne de alınabilir,该方块无法被破坏或收取,該方塊無法被破壞或收取
+braceletSpatialVaultNoMod,items,Item,,,,You need Necromancer's Blood or a Blood Stone,,Du brauchst Blut des Nekromanten oder einen Blutstein,Necesitas sangre del nigromante o una piedra de sangre,Il te faut du sang de nécromancien ou une pierre de sang,Ti serve sangue del negromante o una pietra di sangue,ネクロマンサーの血か血の石が必要です,강령술사의 피나 피의 돌이 필요합니다,Potrzebujesz krwi nekromanty albo krwawego kamienia,Você precisa de sangue do necromante ou de uma pedra de sangue,Нужна кровь некроманта или кровавый камень,Nekromantın kanına ya da bir kan taşına ihtiyacın var,需要亡灵法师之血或血石,需要亡靈法師之血或血石
necroHeresyPyramid,blocks,Block,,,,Pyramid of Spirits,,Pyramide der Geister,Pirámide de los espíritus,Pyramide des esprits,Piramide degli spiriti,精霊のピラミッド,영혼의 피라미드,Piramida duchów,Pirâmide dos espíritos,Пирамида духов,Ruhlar Piramidi,灵魂金字塔,靈魂金字塔
necroHeresyPyramidDesc,blocks,Block,,,,"A necromantic ward shaped like a pyramid, wreathed in cold purple flame. While you stand within its radius, it charms any un-deviated zombie nearby (see the Deviator) and sets it alight, turning it against other zombies instead of you or your base. Its menu lets you toggle the effect and show or hide the boundary of its radius.",,"Ein nekromantischer Bannstein in Pyramidenform, umkränzt von kaltem violettem Feuer. Solange du in seinem Radius stehst, bezaubert er jeden nicht abgewichenen Zombie in der Nähe (siehe Abweichung) und setzt ihn in Brand, sodass er sich gegen andere Zombies wendet statt gegen dich oder deine Basis. Über sein Menü lässt sich der Effekt umschalten und die Grenze des Radius ein- oder ausblenden.","Un guardián nigromántico con forma de pirámide, envuelto en llamas moradas y frías. Mientras te encuentres dentro de su radio, hechiza a todo zombi cercano que no haya sido desviado (véase la desviación) y lo prende fuego, volviéndolo contra otros zombis en vez de contra ti o tu base. Su menú permite activar o desactivar el efecto y mostrar u ocultar el límite del radio.","Une protection nécromantique en forme de pyramide, ceinte de flammes violettes et froides. Tant que tu te tiens dans son rayon, elle charme tout zombie proche non dévié (voir la déviation) et l'embrase, le retournant contre les autres zombies plutôt que contre toi ou ta base. Son menu permet d'activer ou de couper l'effet et d'afficher ou masquer la limite du rayon.","Una protezione negromantica a forma di piramide, avvolta da una fredda fiamma viola. Finché resti nel suo raggio, incanta ogni zombie vicino non deviato (vedi la deviazione) e lo incendia, rivoltandolo contro gli altri zombie invece che contro te o la tua base. Dal suo menu si può accendere o spegnere l'effetto e mostrare o nascondere il confine del raggio.",冷たい紫の炎をまとった、ピラミッド型の降霊術の守り。あなたがその半径内に立っているあいだ、近くの未逸脱のゾンビを魅了し(逸脱を参照)、燃え上がらせて、あなたや拠点ではなく他のゾンビへ差し向ける。メニューから効果の入切と、半径の境界の表示・非表示を切り替えられる。,"차가운 보랏빛 불꽃에 휩싸인 피라미드 형태의 강령술 수호물. 당신이 그 반경 안에 있는 동안, 근처의 아직 일탈하지 않은 좀비를 매혹하고(일탈 참조) 불붙여, 당신이나 당신의 거점 대신 다른 좀비를 공격하게 만듭니다. 메뉴에서 효과를 켜고 끄거나 반경 경계를 표시/숨길 수 있습니다.","Nekromancki strażnik w kształcie piramidy, spowity zimnym fioletowym płomieniem. Dopóki stoisz w jego promieniu, oczarowuje każde pobliskie zombie, które nie uległo dewiacji (patrz: dewiacja), i podpala je, obracając przeciwko innym zombie zamiast przeciw tobie czy twojej bazie. Jego menu pozwala włączyć lub wyłączyć efekt oraz pokazać lub ukryć granicę promienia.","Uma proteção necromântica em forma de pirâmide, envolta em chamas roxas e frias. Enquanto você estiver dentro do seu raio, ela encanta qualquer zumbi próximo que ainda não tenha sido desviado (veja o desvio) e o incendeia, voltando-o contra outros zumbis em vez de contra você ou sua base. O menu permite ligar ou desligar o efeito e mostrar ou ocultar o limite do raio.","Некромантический оберег в форме пирамиды, окутанный холодным фиолетовым пламенем. Пока вы находитесь в радиусе его действия, он накладывает девиацию на не заряженных зомби поблизости (см. Девиатор) и поджигает их, обращая против других зомби, а не против вас или вашей базы. Меню блока позволяет включать эффект и показывать границу радиуса действия.","Soğuk mor alevlerle çevrili, piramit biçiminde bir nekromansi koruması. Yarıçapı içinde durduğun sürece, yakındaki henüz sapmamış her zombiyi büyüler (bkz. sapma) ve tutuşturur; böylece zombi sana ya da üssüne değil, diğer zombilere saldırır. Menüsünden etkiyi açıp kapatabilir, yarıçapın sınırını gösterip gizleyebilirsin.",一座亡灵法术守护物,形如金字塔,缭绕着冰冷的紫焰。只要你站在其半径之内,它便会魅惑附近尚未悖逆的僵尸(参见悖逆),并将其点燃,使其转而攻击其他僵尸,而非你或你的基地。其菜单可开关此效果,并显示或隐藏半径边界。,一座亡靈法術守護物,形如金字塔,繚繞著冰冷的紫焰。只要你站在其半徑之內,牠便會魅惑附近尚未悖逆的殭屍(參見悖逆),並將其點燃,使其轉而攻擊其他殭屍,而非你或你的基地。其選單可開關此效果,並顯示或隱藏半徑邊界。
blockcommand_TEFeaturePyramidWard:effect_on,blocks,Block,,,,Enable Effect,,Effekt aktivieren,Activar efecto,Activer l'effet,Attiva effetto,効果をオン,효과 켜기,Włącz efekt,Ativar efeito,Включить эффект,Etkiyi Aç,启用效果,啟用效果
diff --git a/Config/item_modifiers.xml b/Config/item_modifiers.xml
index b27642b..8b62340 100644
--- a/Config/item_modifiers.xml
+++ b/Config/item_modifiers.xml
@@ -324,4 +324,122 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Config/items.xml b/Config/items.xml
index ef1540b..ae55e63 100644
--- a/Config/items.xml
+++ b/Config/items.xml
@@ -1284,70 +1284,23 @@
-
-
- -
-
-
-
-
+ Причина - указание «пусть флакон крови можно будет вставлять как модификацию для
+ пространственного хранилища», и это оказалось не настройкой, а сменой класса предмета.
+ XUiC_ItemPartStack.CanSwap открывается строкой
-
-
-
-
-
-
-
-
+ if (!(stack.itemValue.ItemClass is ItemClassModifier itemClassModifier)) return false;
+
+ - слот модификации не смотрит ни на теги, ни на свойства, пока предмет не ItemClassModifier,
+ а этот класс создаётся ТОЛЬКО из в item_modifiers.xml. Никакого свойства
+ вида "CanBeInstalled" не существует; остаться в items.xml и стать модификацией нельзя.
+
+ Предмет при этом остался обычным во всём остальном: ItemClassModifier наследует ItemClass и
+ регистрируется в том же ItemClass.nameToItem, поэтому рецепты, крафт и Harmony-патч
+ (NecromancerBloodPatch.cs) находят его по имени как раньше. Разбор - в BACKLOG.md.
+
+ Само определение, со всеми старыми комментариями про банку, текстуры и прочность - там. -->
+ FOR THE MODS THEMSELVES: give each one its OWN modifier_tags.
+ XUiC_ItemPartStack.CanSwap counts already-installed mods whose modifier_tags
+ intersect the one being installed and refuses at num >= ItemClass.MaxModsAllowed,
+ which defaults to 1. With a single slot this no longer costs slots - but it still
+ matters, because a shared tag would ALSO make two different bracelet mods mutually
+ exclusive in ways nothing in the UI explains. Keep them distinct.
+
+ ОДИН СЛОТ, указание 2026-09-15 («убавь у пространственного браслета количество
+ слотов под модификации до одного»). Было 4, поставленные 2026-08-30 по прежнему
+ выбору пользователя («4 фиксированно»).
+
+ Что это меняет по сути: слот из «набора улучшений» превратился в ВЫБОР. Сейчас
+ единственный кандидат - флакон Крови некроманта (item_modifiers.xml, переехал туда
+ 2026-09-15), так что выбирать пока не из чего; но каждая следующая модификация
+ браслета теперь конкурирует за один слот, а не добавляется к остальным. Это стоит
+ держать в голове при их придумывании - иначе получится набор, из которого всегда
+ берут одну и ту же.
+
+ Число только здесь. ModSlots - пассивка, а не свойство, и никакой другой файл на
+ него не смотрит; менять обратно - эта же строка. У Ножа некроманта свои 4 слота
+ (выше в этом файле, ~строка 1056) - их указание НЕ трогало. -->
-
+
diff --git a/HarmonySrc/NecromancerBloodPatch.cs b/HarmonySrc/NecromancerBloodPatch.cs
index 6c3c415..b9eb006 100644
--- a/HarmonySrc/NecromancerBloodPatch.cs
+++ b/HarmonySrc/NecromancerBloodPatch.cs
@@ -4,8 +4,12 @@ using UnityEngine;
namespace NecromancerTome
{
///
- /// "Кровь некроманта" (Necromancer's Blood) - dictated 2026-08-30. See items.xml
- /// (resourceNecromancerBlood) for the item, recipes.xml for the base recipe (an empty jar,
+ /// "Кровь некроманта" (Necromancer's Blood) - dictated 2026-08-30. See item_modifiers.xml
+ /// (resourceNecromancerBlood - it lives THERE, not in items.xml, since 2026-09-15: it had to
+ /// become an ItemClassModifier to be installable in the Spatial Bracelet, and that class is
+ /// only created from . Nothing here changed - the lookup is by name, and both
+ /// files register into the same ItemClass.nameToItem) for the item, recipes.xml for the base
+ /// recipe (an empty jar,
/// like any other resource conversion). Two rules the user asked for have NO vanilla XML
/// equivalent at all, so both are enforced here instead:
/// 1. "нужна... наличие любого ножа" - a knife must be present (in the toolbelt or
diff --git a/HarmonySrc/SpatialVaultPatch.cs b/HarmonySrc/SpatialVaultPatch.cs
index 4d1d166..db1e9e1 100644
--- a/HarmonySrc/SpatialVaultPatch.cs
+++ b/HarmonySrc/SpatialVaultPatch.cs
@@ -105,7 +105,9 @@ namespace NecromancerTome
// пространственного браслета не делает ничего"), after the knockback+slow version did not
// visibly do anything in testing. ShoveZombieAtCrosshair is kept below, unused,
// because that abandoned version was never shown to be WRONG - only invisible.
- SpatialVaultPickup.Begin(player);
+ // The ItemValue goes with it: the pickup refuses outright when this particular
+ // bracelet has nothing in its mod slot, and mods live on the instance.
+ SpatialVaultPickup.Begin(player, _actionData.invData.itemValue);
}
// Skip ItemActionEat's own logic entirely - the click has been fully handled here.
diff --git a/HarmonySrc/SpatialVaultPickupPatch.cs b/HarmonySrc/SpatialVaultPickupPatch.cs
index 0c7e25b..76a9ed7 100644
--- a/HarmonySrc/SpatialVaultPickupPatch.cs
+++ b/HarmonySrc/SpatialVaultPickupPatch.cs
@@ -130,6 +130,7 @@ namespace NecromancerTome
public const string MsgChanneling = "braceletSpatialVaultPickupChanneling";
public const string MsgTraderArea = "braceletSpatialVaultTraderArea";
public const string MsgIndestructible = "braceletSpatialVaultIndestructible";
+ public const string MsgNoMod = "braceletSpatialVaultNoMod";
/// The denial sound vanilla plays with these tooltips.
public const string DeniedSound = "ui_denied";
@@ -169,12 +170,52 @@ namespace NecromancerTome
public EntityPlayerLocal Player;
public Vector3i Position;
public BlockValue Expected;
+
+ /// The bracelet this pull was started with, so the blood that pays for it is
+ /// taken from the flask in THAT bracelet. Kept as the live ItemValue rather than
+ /// looked up again at the end: mods live on the instance, and ten seconds is long
+ /// enough for the player to have scrolled to another slot.
+ public ItemValue Bracelet;
+
+ /// What this particular pull costs, in seconds - computed once when the
+ /// channel starts (user request 2026-09-15: "пусть количество секунд требуемое для
+ /// поглощения блока записывается в отдельную переменную"). It is the same number the
+ /// timer counts down and the same number the flask pays, and that is the point of
+ /// storing it instead of recomputing: by the time the channel ends the player may
+ /// have turned away, the ray is gone, and a second call to ChannelSecondsFor would
+ /// quietly charge for a different block than the one that was taken.
+ public float ChannelSeconds;
}
/// Regular attack on the bracelet. Every refusal happens here, before the player
/// is asked to stand still for ten seconds.
- public static void Begin(EntityPlayerLocal _player)
+ public static void Begin(EntityPlayerLocal _player, ItemValue _bracelet)
{
+ // AN EMPTY MOD SLOT REFUSES THE WHOLE ACTION (user request 2026-09-15: "пусть обычная
+ // атака (поглощение блока) у пространственного хранилища не работает, если у хранилища
+ // в слоте модификаций пусто"). FIRST, deliberately, ahead of every other check in this
+ // method: the others are about the TARGET (no block, wrong kind of block, vault full),
+ // and telling the player "no block there" when the real problem is his empty bracelet
+ // would send him looking in the wrong place. This one is about the tool, so it is
+ // answered before the tool is even pointed at anything.
+ //
+ // ItemValue.HasMods() is the game's own test and the right one: it walks Modifications
+ // only, skipping both nulls and IsEmpty() slots, and does NOT count CosmeticMods - a
+ // dye would otherwise have read as "the bracelet is loaded". The bracelet has no
+ // cosmetic slot anyway (canHaveCosmetic is deliberately absent from its Tags, see
+ // items.xml), so this is belt and braces rather than a live case - but the next item
+ // that reuses this pattern may well have one.
+ //
+ // The ItemValue is handed in rather than read from the player, because the caller
+ // already holds the exact instance the click came from (_actionData.invData.itemValue)
+ // and mods live on the INSTANCE, not on the ItemClass. Two bracelets in the same
+ // inventory can legitimately disagree about whether they are loaded.
+ if (_bracelet == null || !_bracelet.HasMods())
+ {
+ Deny(_player, MsgNoMod);
+ return;
+ }
+
World world = GameManager.Instance != null ? GameManager.Instance.World : null;
if (world == null)
{
@@ -249,9 +290,20 @@ namespace NecromancerTome
return;
}
+ // Computed HERE, while the ray still exists, and carried in the job from this point
+ // on - see PickupJob.ChannelSeconds.
+ float channelSeconds = ChannelSecondsFor(hitInfo);
+
TimerEventData timerData = new TimerEventData
{
- Data = new PickupJob { Player = _player, Position = position, Expected = blockValue },
+ Data = new PickupJob
+ {
+ Player = _player,
+ Position = position,
+ Expected = blockValue,
+ Bracelet = _bracelet,
+ ChannelSeconds = channelSeconds
+ },
// Vanilla's own two escapes: taking a hit stops the channel, and so does the
// activate key. Neither is built here - both are fields XUiC_Timer.Update reads.
CloseOnHit = true,
@@ -267,7 +319,6 @@ namespace NecromancerTome
ChannelVision.End(_player);
};
- float channelSeconds = ChannelSecondsFor(hitInfo);
LocalPlayerUI playerUI = LocalPlayerUI.GetUIForPlayer(_player);
XUiC_Timer.OpenTimer(playerUI.xui, channelSeconds, timerData, -1f, Localization.Get(MsgChanneling));
// After the window is up, so a channel that somehow fails to open never leaves the
@@ -344,13 +395,124 @@ namespace NecromancerTome
}
world.SetBlockRPC(job.Position, BlockValue.Air);
+
+ // AFTER the block is gone and the item is in the vault, never before: every refusal
+ // above returns early, and blood paid for a pull that was then refused would be blood
+ // charged for nothing. This is the only place the flask is spent.
+ float spent = SpendBlood(job);
+
// The vault lives in memory and is written out with the player's own save data; this
// is the same commit point closing the vault window uses, so a block taken and then
- // left alone is not waiting on the next autosave to become real.
+ // left alone is not waiting on the next autosave to become real. The flask's UseTimes
+ // rides along in the same save - it lives on the bracelet in the player's inventory.
GameManager.Instance.SaveLocalPlayerData();
Debug.Log("[NecromancerTome] SpatialVaultPickup: owner=" + job.Player.entityId + " took " +
- blockValue.Block.GetBlockName() + " at " + job.Position + " into the vault");
+ blockValue.Block.GetBlockName() + " at " + job.Position + " into the vault for " +
+ spent.ToString("0.#") + " of blood");
+ }
+
+ /// Charges this pull to the Necromancer's Blood in the bracelet's mod slot, one
+ /// point of durability per second of channel (user request 2026-09-15). Returns what was
+ /// actually taken, which is not always what was asked for - see the clamp.
+ ///
+ /// WHY THE NAME CHECK AND NOT "whatever is in the slot". The instruction is explicit -
+ /// "если эта модификация кровь некроманта" - and it has to stay that way: the slot is
+ /// meant to take other things later (the message the empty slot prints already promises a
+ /// Blood Stone), and those will have their own price, or none. A mod that is not blood
+ /// pays nothing here and the pull still happens - deliberately, because refusing it would
+ /// be a second rule nobody asked for.
+ ///
+ /// The name comes from NecromancerBloodPatch rather than a second literal in this file,
+ /// so the two cannot drift apart if the item is ever renamed.
+ ///
+ /// NOT ENOUGH BLOOD IS NOT A REFUSAL (user request 2026-09-15: "пусть поглощение всё-равно
+ /// сработает, но флакон крови некроманта после этого пусть исчезнет из слота", clarified to
+ /// "если прочность 0 или меньше, пусть флакон исчезнет из слота"). So the last pull is
+ /// always free of charge in the sense that matters - it completes - and the flask simply
+ /// does not survive it. The charge is therefore NOT clamped: UseTimes is allowed to go past
+ /// MaxUseTimes, because the only thing that then reads it is the emptiness test right
+ /// below, and a clamp would have made "spent exactly to zero" and "overdrawn" look the
+ /// same at the moment the difference stopped mattering anyway.
+ ///
+ /// The test is "durability 0 or less", not "could not cover the cost", and those are not
+ /// the same rule: a flask with exactly enough left is also gone afterwards. That is the
+ /// user's own correction and it closes the hole the first version would have left - a
+ /// flask sitting at 0/1000 in the slot, counting as "something is installed" for the empty-
+ /// slot gate in Begin, and pulling blocks for free forever.
+ ///
+ /// WHY THE NAME CHECK AND NOT "whatever is in the slot" - see above; a mod that is not
+ /// blood pays nothing, is not emptied, and the pull still happens.
+ public static float SpendBlood(PickupJob _job)
+ {
+ ItemValue bracelet = _job.Bracelet;
+ if (bracelet == null || bracelet.Modifications == null || _job.ChannelSeconds <= 0f)
+ {
+ return 0f;
+ }
+
+ float spent = 0f;
+ bool emptied = false;
+ for (int i = 0; i < bracelet.Modifications.Length; i++)
+ {
+ ItemValue mod = bracelet.Modifications[i];
+ if (mod == null || mod.IsEmpty())
+ {
+ continue;
+ }
+ if (mod.ItemClass == null || mod.ItemClass.Name != NecromancerBloodPatch.BloodItemName)
+ {
+ continue;
+ }
+
+ int max = mod.MaxUseTimes;
+ mod.UseTimes += _job.ChannelSeconds;
+ spent += _job.ChannelSeconds;
+
+ // max <= 0 means this flask has no durability at all - a DegradationMax that did
+ // not resolve. Draining something with no capacity would delete it on the first
+ // pull, which is a config bug eating the player's item, so it is left alone and
+ // said out loud instead.
+ if (max <= 0)
+ {
+ Debug.LogWarning("[NecromancerTome] SpatialVaultPickup: blood in slot " + i +
+ " has MaxUseTimes 0 - nothing to spend, flask kept. Check the " +
+ "DegradationMax passive_effect in Config/item_modifiers.xml");
+ continue;
+ }
+
+ if (mod.UseTimes >= max)
+ {
+ // ItemValue.None is what an empty mod slot holds - type 0, which is exactly
+ // what IsEmpty() tests for, so the slot reads as free to every other piece of
+ // code including the gate in Begin.
+ bracelet.Modifications[i] = ItemValue.None;
+ emptied = true;
+ Debug.Log("[NecromancerTome] SpatialVaultPickup: blood in slot " + i +
+ " ran out (" + mod.UseTimes.ToString("0.#") + "/" + max +
+ ") - flask removed from the bracelet");
+ }
+ else
+ {
+ Debug.Log("[NecromancerTome] SpatialVaultPickup: blood in slot " + i + " now " +
+ mod.UseTimes.ToString("0.#") + "/" + max + " used");
+ }
+ }
+
+ if (emptied)
+ {
+ // Vanilla's own answer to "the thing you were using is gone" - the same cue
+ // ItemAction.HandleItemBreak plays. An item vanishing out of a slot in silence is
+ // the one outcome here the player could miss entirely.
+ _job.Player.PlayOneShot("itembreak");
+ }
+ if (spent > 0f && _job.Player.inventory != null)
+ {
+ // Without this the number is right and the bar on the toolbelt icon is stale
+ // until something else happens to redraw it.
+ _job.Player.inventory.CallOnToolbeltChangedInternal();
+ }
+ return spent;
}
/// How long this particular pull takes. See the class comment for why the ray's
diff --git a/NecromancerHarmony.dll b/NecromancerHarmony.dll
index 1b08c8c..3729244 100644
Binary files a/NecromancerHarmony.dll and b/NecromancerHarmony.dll differ
diff --git a/NecromancerHarmony.pdb b/NecromancerHarmony.pdb
index 7f437d5..da55c42 100644
Binary files a/NecromancerHarmony.pdb and b/NecromancerHarmony.pdb differ