From 4e885bf624c2348cb77e8a057a866ea88a59bf13 Mon Sep 17 00:00:00 2001 From: AlexCube Date: Tue, 13 Oct 2026 18:38:05 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A2=D0=B5=D1=80=D1=80=D0=B8=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D1=8F=20=D1=82=D0=BE=D1=80=D0=B3=D0=BE=D0=B2=D1=86?= =?UTF-8?q?=D0=B0=20=D1=83=D0=B1=D0=B8=D0=B2=D0=B0=D0=B5=D1=82=20=D0=BE?= =?UTF-8?q?=D0=B4=D0=B5=D1=80=D0=B6=D0=B8=D0=BC=D0=BE=D0=B3=D0=BE=20=D0=B7?= =?UTF-8?q?=D0=BE=D0=BC=D0=B1=D0=B8=20(=D0=BD=D0=B5=20=D0=BF=D0=B8=D1=82?= =?UTF-8?q?=D0=BE=D0=BC=D1=86=D0=B0):=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D0=BA=D0=B0=20=D1=80=D0=B0=D0=B7=20=D0=B2=202=20=D1=81,?= =?UTF-8?q?=20=D0=BF=D0=BE=D0=B4=D1=81=D0=BA=D0=B0=D0=B7=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BD=D0=B0=2013=20=D1=8F=D0=B7=D1=8B=D0=BA=D0=B0=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- Config/Localization.csv | 1 + HarmonySrc/Possession.cs | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/Config/Localization.csv b/Config/Localization.csv index 63478d3..295f8ce 100644 --- a/Config/Localization.csv +++ b/Config/Localization.csv @@ -262,6 +262,7 @@ necroZombieBagWindowTitle,items,Item,,,,Zombie bag,,Zombietasche,Bolsa del zombi necroZombieBagWaypoint,items,Item,,,,Zombie bag,,Zombietasche,Bolsa del zombi,Sac du zombie,Borsa dello zombi,ゾンビの袋,좀비 가방,Torba zombie,Bolsa do zumbi,Сумка зомби,Zombi çantası,僵尸的包,殭屍的包 necroPossessHintZombieBag,items,Item,,,,"Tab - bag, E at a container, loot bag or item - into the bag",,"Tab - Tasche, E an Behälter, Beutel oder Gegenstand - in die Tasche","Tab: bolsa, E en un contenedor, saco o objeto: a la bolsa","Tab : sac, E sur un conteneur, un sac ou un objet : dans le sac","Tab - borsa, E su contenitore, sacca o oggetto - nella borsa","Tab: 袋、コンテナ・袋・アイテムにE: 袋へ","Tab - 가방, 상자·자루·물건에 E - 가방으로","Tab - torba, E na pojemniku, worku lub przedmiocie - do torby","Tab - bolsa, E em contêiner, saco ou item - para a bolsa","Tab - сумка, E на ящик, мешок или предмет - в сумку","Tab - çanta, kaba, torbaya veya eşyaya E - çantaya","Tab - 包,对容器、袋子或物品按E - 放入包","Tab - 包,對容器、袋子或物品按E - 放入包" necroPossessHintDoor,items,Item,,,,"E at a door or switch - use it",,"E an Tür oder Schalter - benutzen","E en una puerta o interruptor: usar","E sur une porte ou un interrupteur : utiliser","E su porta o interruttore - usare","ドアやスイッチにE: 使う","문이나 스위치에 E - 사용","E na drzwiach lub przełączniku - użyj","E em porta ou interruptor - usar","E на дверь или выключатель - открыть, включить","Kapıya veya şaltere E - kullan","对门或开关按E - 使用","對門或開關按E - 使用" +necroPossessTraderArea,items,Item,,,,"The trader's land does not accept the dead",,"Das Land des Händlers duldet keine Toten","La tierra del comerciante no acepta a los muertos","La terre du marchand ne tolère pas les morts","La terra del mercante non accoglie i morti","商人の土地は死者を受け入れない","상인의 땅은 죽은 자를 받아들이지 않는다","Ziemia handlarza nie przyjmuje martwych","A terra do comerciante não aceita os mortos","Земля торговца не принимает мёртвых","Tüccarın toprağı ölüleri kabul etmez","商人的土地不容死者","商人的土地不容死者" necroZombieBagTook,items,Item,,,,"Zombie bag ({1}/{2}): {0}",,"Zombietasche ({1}/{2}): {0}","Bolsa del zombi ({1}/{2}): {0}","Sac du zombie ({1}/{2}) : {0}","Borsa dello zombi ({1}/{2}): {0}","ゾンビの袋({1}/{2}):{0}","좀비 가방 ({1}/{2}): {0}","Torba zombie ({1}/{2}): {0}","Bolsa do zumbi ({1}/{2}): {0}","Сумка зомби ({1}/{2}): {0}","Zombi çantası ({1}/{2}): {0}","僵尸的背包({1}/{2}):{0}","殭屍的背包({1}/{2}):{0}" necroZombieBagFull,items,Item,,,,"The zombie bag is full ({1}/{2}): {0}",,"Die Zombietasche ist voll ({1}/{2}): {0}","La bolsa del zombi está llena ({1}/{2}): {0}","Le sac du zombie est plein ({1}/{2}) : {0}","La borsa dello zombi è piena ({1}/{2}): {0}","ゾンビの袋がいっぱい({1}/{2}):{0}","좀비 가방이 가득 찼습니다 ({1}/{2}): {0}","Torba zombie jest pełna ({1}/{2}): {0}","A bolsa do zumbi está cheia ({1}/{2}): {0}","Сумка зомби полна ({1}/{2}): {0}","Zombi çantası dolu ({1}/{2}): {0}","僵尸的背包已满({1}/{2}):{0}","殭屍的背包已滿({1}/{2}):{0}" necroZombieBagShow,items,Item,,,,"Zombie bag ({1}/{2}): {0}",,"Zombietasche ({1}/{2}): {0}","Bolsa del zombi ({1}/{2}): {0}","Sac du zombie ({1}/{2}) : {0}","Borsa dello zombi ({1}/{2}): {0}","ゾンビの袋({1}/{2}):{0}","좀비 가방 ({1}/{2}): {0}","Torba zombie ({1}/{2}): {0}","Bolsa do zumbi ({1}/{2}): {0}","Сумка зомби ({1}/{2}): {0}","Zombi çantası ({1}/{2}): {0}","僵尸的背包({1}/{2}):{0}","殭屍的背包({1}/{2}):{0}" diff --git a/HarmonySrc/Possession.cs b/HarmonySrc/Possession.cs index e97a74d..b58ab52 100644 --- a/HarmonySrc/Possession.cs +++ b/HarmonySrc/Possession.cs @@ -1559,6 +1559,27 @@ namespace NecromancerTome } _bodyCheck = 0.5f; DropAllyTargets(_world, _z); + // Территория торговца убивает одержимого зомби (указание 13.10: «пусть убивает одержимых, даже не сам, а + // территория, на которой он находится»; питомцев не касается). GetTraderAreaAt - настоящая территория, не + // IsWithinTraderArea (её мод подменяет внутри чертогов). Гибель - обычная: дух в тело, сумка мешком. + // Раз в TraderCheckTime (указание 13.10: «проверяй реже»), только готовая территория (IsInitialized, как у игры). + _traderCheck -= 0.5f; + if (!IsPet && _traderCheck <= 0f) + { + _traderCheck = TraderCheckTime; + TraderArea ta = _world.GetTraderAreaAt(World.worldToBlockPos(_z.position + Vector3.up * 0.5f)); + if (ta != null && ta.IsInitialized) + { + GameManager.ShowTooltip(_player, Localization.Get("necroPossessTraderArea")); + Debug.Log("[NecromancerTome] Possession: " + _z.EntityName + " на территории торговца - гибнет"); + _z.DamageEntity(new DamageSource(EnumDamageSource.Internal, EnumDamageTypes.Suicide), 99999, false, 1f); + if (!_z.IsDead()) + { + _z.Kill(DamageResponse.New(true)); + } + return; + } + } bool danger = false; Vector3 body = _player.position; float r2 = SnakeControl.BodyDangerRange * SnakeControl.BodyDangerRange; @@ -2183,6 +2204,8 @@ namespace NecromancerTome public const float UseReach = 6f; /// Ближе стольких метров зверь чует одержимого и не видя (Patch_EAIRunawayFromEntity_FindEnemy_Possession). public const float AnimalFearNear = 8f; + public const float TraderCheckTime = 2f; + static float _traderCheck; static float _promptNext; static string _prompt; // дальше луч не ищет; сама дальность - у блока (GetActivationDistanceSq)