From 3da4435bca278d3069f9e0c608b7fca2537622e5 Mon Sep 17 00:00:00 2001 From: AlexCube Date: Tue, 13 Oct 2026 18:32:15 +0300 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B2=D0=B5=D1=80=D0=B8=20=D0=B1=D0=BE?= =?UTF-8?q?=D1=8F=D1=82=D1=81=D1=8F=20=D0=BE=D0=B4=D0=B5=D1=80=D0=B6=D0=B8?= =?UTF-8?q?=D0=BC=D0=BE=D0=B3=D0=BE:=20=D0=B5=D1=81=D0=BB=D0=B8=20=D0=B7?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D1=8C=20=D0=BD=D0=B8=20=D0=BE=D1=82=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE=20=D0=BD=D0=B5=20=D0=B1=D0=B5=D0=B6=D0=B8?= =?UTF-8?q?=D1=82,=20=D0=BE=D0=B4=D0=B5=D1=80=D0=B6=D0=B8=D0=BC=D1=8B?= =?UTF-8?q?=D0=B9=20=D0=B2=20=D0=B5=D0=B3=D0=BE=20=D1=80=D0=B0=D0=B4=D0=B8?= =?UTF-8?q?=D1=83=D1=81=D0=B5=20=D0=B8=20=D0=B2=D0=B8=D0=B4=D0=B5=D0=BD=20?= =?UTF-8?q?(=D0=B8=D0=BB=D0=B8=20=D0=B1=D0=BB=D0=B8=D0=B6=D0=B5=208=20?= =?UTF-8?q?=D0=BC)=20-=20=D0=B1=D0=B5=D0=B6=D0=B8=D1=82=20=D0=BE=D1=82=20?= =?UTF-8?q?=D0=BD=D0=B5=D0=B3=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- HarmonySrc/Possession.cs | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/HarmonySrc/Possession.cs b/HarmonySrc/Possession.cs index 7b4442a..e97a74d 100644 --- a/HarmonySrc/Possession.cs +++ b/HarmonySrc/Possession.cs @@ -2181,6 +2181,8 @@ namespace NecromancerTome /// trigger. Запертую чужую дверь не откроет - замок проверяет сама дверь. static readonly string[] UseCommands = { "open", "close", "light", "activate" }; public const float UseReach = 6f; + /// Ближе стольких метров зверь чует одержимого и не видя (Patch_EAIRunawayFromEntity_FindEnemy_Possession). + public const float AnimalFearNear = 8f; static float _promptNext; static string _prompt; // дальше луч не ищет; сама дальность - у блока (GetActivationDistanceSq) @@ -2876,4 +2878,33 @@ namespace NecromancerTome return false; } } + + /// Звери боятся одержимого (тест 13.10: «куры и кролики не пугаются одержимого зомби»). Их EAIRunawayFromEntity + /// бежит от зомби, только если тот ближе dangerDistance или виден, а от игрока - ещё и по шуму; одержимым правит + /// игрок-охотник, поэтому, если зверь ни от кого не бежит, одержимый в его радиусе (как у игры: min(зрение, + /// safeDistance) * 0.8) и виден - или ближе Possession.AnimalFearNear - зверь бежит от него. Питомцев мода не касается. + [HarmonyPatch(typeof(EAIRunawayFromEntity), nameof(EAIRunawayFromEntity.FindEnemy))] + public static class Patch_EAIRunawayFromEntity_FindEnemy_Possession + { + public static void Postfix(EAIRunawayFromEntity __instance) + { + EntityAlive z = Possession.Zombie; + EntityAlive self = __instance.theEntity; + if (__instance.enemy != null || !Possession.Active || z == null || z.IsDead() || self == null || self == z || + SnakeControl.IsNecroEntity(self)) + { + return; + } + float radius = Utils.FastMin(self.GetSeeDistance(), __instance.safeDistance) * 0.8f; + float d2 = self.GetDistanceSq(z); + if (d2 > radius * radius) + { + return; + } + if (d2 <= Possession.AnimalFearNear * Possession.AnimalFearNear || self.CanSee(z)) + { + __instance.enemy = z; + } + } + } }