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;
+ }
+ }
+ }
}