diff --git a/Config/Localization.csv b/Config/Localization.csv index 57d6823..fa63b3f 100644 --- a/Config/Localization.csv +++ b/Config/Localization.csv @@ -550,5 +550,31 @@ necroSkullDecorBack,blocks,Block,,,,Skull: against the wall,,Schädel: an der Wa 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. A skull on display also relays a cinerarium's ghostly thread: pass a thread through it to reach farther.",,"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. Ein ausgestellter Schädel leitet auch den Geisterfaden eines Cinerariums weiter: Führe einen Faden hindurch, um weiter zu reichen.","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áneo expuesto también transmite el hilo fantasmal de un cinerario: pasa un hilo por él para llegar más lejos.","Un crâne prêt à être posé en décor. Maintiens [action:permanent:Reload][action:local:Reload] pour pivoter le bloc, changer d'aspect ou le reconvertir en crâne. Ramassé, il redevient un crâne. Un crâne exposé relaie aussi le fil fantomatique d'un cinéraire : fais-y passer un fil pour aller plus loin.","Un teschio pronto da posizionare come decorazione. Tieni premuto [action:permanent:Reload][action:local:Reload] per ruotare il blocco, cambiare aspetto o farlo tornare un teschio. Raccolto, torna un teschio. Un teschio esposto trasmette anche il filo spettrale di un cinerario: fai passare un filo attraverso di esso per arrivare più lontano.",飾りとして置ける頭蓋骨。[action:permanent:Reload][action:local:Reload]長押しでブロックの回転、もう一つの見た目、頭蓋骨への戻しを選ぶ。拾うと頭蓋骨に戻る。飾った頭蓋骨は骨壺の霊の糸を中継する――糸を通せばさらに遠くまで届く。,"장식으로 놓을 수 있는 두개골. [action:permanent:Reload][action:local:Reload]을 길게 눌러 블록 회전, 다른 모양, 두개골로 되돌리기를 고른다. 주우면 다시 두개골이 된다. 장식한 두개골은 유골함의 유령 실을 이어 준다 - 실을 통과시켜 더 멀리 닿게 하라.","Czaszka gotowa do postawienia jako ozdoba. Przytrzymaj [action:permanent:Reload][action:local:Reload], by obrócić blok, zmienić wygląd albo z powrotem zrobić z niej czaszkę. Podniesiona znów jest czaszką. Wystawiona czaszka przekazuje też widmową nić cinerarium: przeprowadź przez nią nić, by sięgnąć dalej.","Um crânio pronto para ser colocado como decoração. Segure [action:permanent:Reload][action:local:Reload] para girar o bloco, mudar o visual ou voltar a ser crânio. Recolhido, vira crânio de novo. Um crânio exposto também retransmite o fio fantasmagórico de um cinerário: passe um fio por ele para ir mais longe.","Череп, готовый стать декором. Удерживай [action:permanent:Reload][action:local:Reload]: поворот блока, другой вид или обратно в череп. Поднятый - снова череп. Выставленный череп ещё и передаёт призрачную нить цинерария: проведи нить через него, чтобы дотянуться дальше.","Süs olarak konmaya hazır bir kafatası. Blok döndürme, diğer görünüm ya da tekrar kafatasına çevirmek için [action:permanent:Reload][action:local:Reload] basılı tut. Toplanınca yine kafatası olur. Sergilenen kafatası bir küllüğün hayalet ipliğini de aktarır: daha uzağa ulaşmak için ipliği içinden geçir.",可作为装饰摆放的头骨。长按[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ı,只是头骨,只是頭骨 necroRabbitSack,items,Item,,,,Live Rabbit in a Sack,,Lebender Hase im Sack,Conejo vivo en un saco,Lapin vivant dans un sac,Coniglio vivo nel sacco,袋の中の生きたウサギ,자루 속 살아있는 토끼,Żywy królik w worku,Coelho vivo no saco,Живой кролик в мешке,Çuvalda canlı tavşan,袋中的活兔子,袋中的活兔子 -necroRabbitSackDesc,items,Item,,,,"A rabbit you caught with your bare hands. It kicks inside the sack.\n\nLeft click - let it go. Right click - butcher it for meat, leather and bones.",,"Ein Hase, mit bloßen Händen gefangen. Er strampelt im Sack.\n\nLinksklick - freilassen. Rechtsklick - zerlegen: Fleisch, Leder und Knochen.","Un conejo atrapado con las manos desnudas. Patalea dentro del saco.\n\nClic izquierdo: soltarlo. Clic derecho: despiezarlo en carne, cuero y huesos.","Un lapin attrapé à mains nues. Il se débat dans le sac.\n\nClic gauche : le relâcher. Clic droit : le dépecer pour la viande, le cuir et les os.","Un coniglio preso a mani nude. Scalcia nel sacco.\n\nClic sinistro: liberarlo. Clic destro: macellarlo per carne, cuoio e ossa.","素手で捕まえたウサギ。袋の中で暴れている。\n\n左クリック - 放す。右クリック - 解体して肉、革、骨を得る。","맨손으로 잡은 토끼. 자루 안에서 발버둥친다.\n\n좌클릭 - 풀어준다. 우클릭 - 도축해 고기, 가죽, 뼈를 얻는다.","Królik złapany gołymi rękami. Wierzga w worku.\n\nLewy przycisk - wypuść. Prawy przycisk - oprawić na mięso, skórę i kości.","Um coelho pego com as próprias mãos. Ele esperneia no saco.\n\nClique esquerdo - soltar. Clique direito - abater para carne, couro e ossos.","Кролик, пойманный голыми руками. Брыкается в мешке.\n\nЛКМ - выпустить. ПКМ - разделать на мясо, кожу и кости.","Çıplak elle yakalanmış bir tavşan. Çuvalın içinde tepiniyor.\n\nSol tık - serbest bırak. Sağ tık - et, deri ve kemik için kes.","徒手抓到的兔子,在袋子里乱蹬。\n\n左键 - 放走。右键 - 宰杀,得到肉、皮革和骨头。","徒手抓到的兔子,在袋子裡亂蹬。\n\n左鍵 - 放走。右鍵 - 宰殺,得到肉、皮革和骨頭。" -necroRabbitGrab,PlayerMoveController.cs,Label,,,,Press [action:local:Activate][action:permanent:Activate] to Grab the Rabbit,,[action:local:Activate][action:permanent:Activate] drücken, um den Hasen zu packen,Pulsa [action:local:Activate][action:permanent:Activate] para atrapar el conejo,Appuyez sur [action:local:Activate][action:permanent:Activate] pour attraper le lapin,Premi [action:local:Activate][action:permanent:Activate] per afferrare il coniglio,[action:local:Activate][action:permanent:Activate]でウサギを捕まえる,[action:local:Activate][action:permanent:Activate]을(를) 눌러 토끼 잡기,"Naciśnij [action:local:Activate][action:permanent:Activate], aby złapać królika",Pressione [action:local:Activate][action:permanent:Activate] para pegar o coelho,"Нажмите [action:local:Activate][action:permanent:Activate], чтобы схватить кролика",Tavşanı yakalamak için [action:local:Activate][action:permanent:Activate] tuşuna bas,按[action:local:Activate][action:permanent:Activate]抓住兔子,按[action:local:Activate][action:permanent:Activate]抓住兔子 +necroRabbitSackDesc,items,Item,,,,"A rabbit you caught with your bare hands. It kicks inside the sack. + +Left click - let it go. Scrap it in the backpack for meat, leather and bones.",,"Ein Hase, mit bloßen Händen gefangen. Er strampelt im Sack. + +Linksklick - freilassen. Im Rucksack zerlegen: Fleisch, Leder und Knochen.","Un conejo atrapado con las manos desnudas. Patalea dentro del saco. + +Clic izquierdo: soltarlo. Despiézalo en la mochila: carne, cuero y huesos.","Un lapin attrapé à mains nues. Il se débat dans le sac. + +Clic gauche : le relâcher. Démontez-le dans le sac à dos : viande, cuir et os.","Un coniglio preso a mani nude. Scalcia nel sacco. + +Clic sinistro: liberarlo. Smontalo nello zaino: carne, cuoio e ossa.","素手で捕まえたウサギ。袋の中で暴れている。 + +左クリック - 放す。バックパックで分解すると肉、革、骨になる。","맨손으로 잡은 토끼. 자루 안에서 발버둥친다. + +좌클릭 - 풀어준다. 배낭에서 분해하면 고기, 가죽, 뼈가 나온다.","Królik złapany gołymi rękami. Wierzga w worku. + +Lewy przycisk - wypuść. Rozbierz w plecaku na mięso, skórę i kości.","Um coelho pego com as próprias mãos. Ele esperneia no saco. + +Clique esquerdo - soltar. Desmonte na mochila: carne, couro e ossos.","Кролик, пойманный голыми руками. Брыкается в мешке. + +ЛКМ - выпустить. Разберите в рюкзаке на мясо, кожу и кости.","Çıplak elle yakalanmış bir tavşan. Çuvalın içinde tepiniyor. + +Sol tık - serbest bırak. Sırt çantasında parçala: et, deri ve kemik.","徒手抓到的兔子,在袋子里乱蹬。 + +左键 - 放走。在背包里拆解可得肉、皮革和骨头。","徒手抓到的兔子,在袋子裡亂蹬。 + +左鍵 - 放走。在背包裡拆解可得肉、皮革和骨頭。" +necroRabbitGrab,PlayerMoveController.cs,Label,,,,Press [action:local:Activate][action:permanent:Activate] to Grab the Rabbit,,"[action:local:Activate][action:permanent:Activate] drücken, um den Hasen zu packen",Pulsa [action:local:Activate][action:permanent:Activate] para atrapar el conejo,Appuyez sur [action:local:Activate][action:permanent:Activate] pour attraper le lapin,Premi [action:local:Activate][action:permanent:Activate] per afferrare il coniglio,[action:local:Activate][action:permanent:Activate]でウサギを捕まえる,[action:local:Activate][action:permanent:Activate]을(를) 눌러 토끼 잡기,"Naciśnij [action:local:Activate][action:permanent:Activate], aby złapać królika",Pressione [action:local:Activate][action:permanent:Activate] para pegar o coelho,"Нажмите [action:local:Activate][action:permanent:Activate], чтобы схватить кролика",Tavşanı yakalamak için [action:local:Activate][action:permanent:Activate] tuşuna bas,按[action:local:Activate][action:permanent:Activate]抓住兔子,按[action:local:Activate][action:permanent:Activate]抓住兔子 diff --git a/Config/items.xml b/Config/items.xml index 052b64d..dfd7a69 100644 --- a/Config/items.xml +++ b/Config/items.xml @@ -2072,8 +2072,9 @@ @@ -2086,7 +2087,7 @@ - + @@ -2099,10 +2100,6 @@ - - - - diff --git a/HarmonySrc/RabbitGrab.cs b/HarmonySrc/RabbitGrab.cs index afeafda..9fdedaa 100644 --- a/HarmonySrc/RabbitGrab.cs +++ b/HarmonySrc/RabbitGrab.cs @@ -12,7 +12,7 @@ namespace NecromancerTome /// мешок кладётся сразу в рюкзак (нет места - на пояс, иначе под ноги). /// /// Выпустить - ЛКМ с мешком в руке (ItemActionSpawnEntity, Entity=animalRabbit): ваниль предмет не тратит, тратим - /// здесь. Стервятник кролика по-прежнему несёт под лапами (Possession.Carryable). Выключатель - necrorabbit off: + /// здесь. Разделать - «Разобрать» в рюкзаке. Стервятник кролика по-прежнему несёт под лапами (Possession.Carryable). Выключатель - necrorabbit off: /// тогда захват идёт ванильно, мешок - в руку, как курица. /// public static class RabbitGrab @@ -100,34 +100,31 @@ namespace NecromancerTome } } - /// Разделать кролика из мешка - ПКМ с мешком в руке (указание 22.10: «Кролика можно будет разобрать на кожу, - /// кости и мясо»). Action1 мешка - ванильный Eat, но его ExecuteAction целиком наш: мешок -1, в рюкзак - добыча - /// разделки ножом (entityclasses.xml animalRabbit, butcherHarvest). - [HarmonyPatch(typeof(ItemActionEat), "ExecuteAction")] - public static class Patch_ItemActionEat_ExecuteAction_RabbitSack + /// Разделать кролика - «Разобрать» в рюкзаке (указание 22.10: «Кролика можно будет разобрать на кожу, кости и + /// мясо»; «Разделывать будем по команде сломать»). Пункт ваниль показывает сама: мешок из кожи (Mleather, forge_category + /// leather), вес не меньше кожи. Но ванильная разборка даёт один материал через очередь крафта - у мешка она наша: + /// вся стопка сразу, на каждого кролика добыча разделки ножом (entityclasses.xml animalRabbit, butcherHarvest). + [HarmonyPatch(typeof(ItemActionEntryScrap), nameof(ItemActionEntryScrap.OnActivated))] + public static class Patch_ItemActionEntryScrap_OnActivated_RabbitSack { static readonly string[] Yield = { "foodRawMeat", "resourceLeather", "resourceBone" }; static readonly int[] YieldCount = { 10, 2, 5 }; - public static bool Prefix(ItemActionData _actionData, bool _bReleased) + public static bool Prefix(ItemActionEntryScrap __instance) { - ItemInventoryData inv = _actionData?.invData; - if (inv == null || !RabbitGrab.IsSack(inv.itemValue)) + if (!(__instance.ItemController is IItemStackController isc)) { return true; } - if (!_bReleased || !(inv.holdingEntity is EntityPlayerLocal player)) + ItemStack st = isc.ItemStack; + if (st == null || st.IsEmpty() || !RabbitGrab.IsSack(st.itemValue)) { - return false; + return true; } - ItemStack held = player.inventory.GetItem(inv.slotIdx); - if (held == null || held.IsEmpty() || !RabbitGrab.IsSack(held.itemValue)) - { - return false; - } - held = held.Clone(); - held.count--; - player.inventory.SetItem(inv.slotIdx, held.count > 0 ? held : ItemStack.Empty.Clone()); + EntityPlayerLocal player = __instance.ItemController.xui.playerUI.entityPlayer; + XUiM_PlayerInventory pack = __instance.ItemController.xui.PlayerInventory; + int n = st.count; + isc.ItemStack = ItemStack.Empty.Clone(); for (int i = 0; i < Yield.Length; i++) { ItemClass ic = ItemClass.GetItemClass(Yield[i]); @@ -135,14 +132,15 @@ namespace NecromancerTome { continue; } - ItemStack s = new ItemStack(new ItemValue(ic.Id), YieldCount[i]); - if (!player.bag.AddItem(s) && !player.inventory.AddItem(s)) + ItemStack s = new ItemStack(new ItemValue(ic.Id), YieldCount[i] * n); + if (!pack.AddItem(s)) { - player.world.gameManager.ItemDropServer(s, player.GetPosition() + Vector3.up * 0.5f, Vector3.zero); + GameManager.Instance.ItemDropServer(s, player.GetPosition(), new Vector3(0.5f, 0f, 0.5f)); } } - player.PlayOneShot("rabbitdeath"); - Debug.Log("[NecromancerTome] RabbitGrab: кролик разделан, мешков осталось " + Mathf.Max(0, held.count)); + isc.WindowGroup?.Controller?.SetAllChildrenDirty(); + Audio.Manager.PlayInsidePlayerHead("rabbitdeath"); + Debug.Log("[NecromancerTome] RabbitGrab: разобрано мешков с кроликами - " + n); return false; } } diff --git a/NecromancerHarmony.dll b/NecromancerHarmony.dll index d52b5b5..851d7fc 100644 Binary files a/NecromancerHarmony.dll and b/NecromancerHarmony.dll differ diff --git a/NecromancerHarmony.pdb b/NecromancerHarmony.pdb index ab4bd17..1aa9ecc 100644 Binary files a/NecromancerHarmony.pdb and b/NecromancerHarmony.pdb differ