From ace286893f61d63885eedcab11ad039521c64d44 Mon Sep 17 00:00:00 2001 From: AlexCube Date: Tue, 13 Oct 2026 15:55:19 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D1=83=D0=BA=D0=B8=20=D0=BE=D0=B4=D0=B5?= =?UTF-8?q?=D1=80=D0=B6=D0=B8=D0=BC=D0=BE=D0=B3=D0=BE=20=D0=B2=D0=BA=D0=BB?= =?UTF-8?q?=D1=8E=D1=87=D0=B0=D1=8E=D1=82=D1=81=D1=8F=20(=D0=BF=D1=80?= =?UTF-8?q?=D0=B5=D1=84=D0=B0=D0=B1=20=D0=B2=D1=8B=D0=BA=D0=BB=D1=8E=D1=87?= =?UTF-8?q?=D0=B5=D0=BD);=20=D0=BD=D0=B0=20=D0=B2=D0=B5=D1=80=D1=85=D1=83?= =?UTF-8?q?=20=D0=BB=D0=B5=D1=81=D1=82=D0=BD=D0=B8=D1=86=D1=8B=20-=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=B4=D1=8A=D1=91=D0=BC=20=D0=B8=20=D1=88=D0=B0?= =?UTF-8?q?=D0=B3=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20=D0=BA=D1=80=D0=B0?= =?UTF-8?q?=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- HarmonySrc/FpArms.cs | 2 ++ HarmonySrc/Possession.cs | 22 ++++++++++++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/HarmonySrc/FpArms.cs b/HarmonySrc/FpArms.cs index a846500..704a06b 100644 --- a/HarmonySrc/FpArms.cs +++ b/HarmonySrc/FpArms.cs @@ -108,6 +108,8 @@ namespace NecromancerTome SDCSUtils.tmpAssetsOwner = wasOwner; } _rig.transform.SetLocalPositionAndRotation(Offset, Quaternion.identity); + // Префаб рук выключен: у персонажа его включает BodyAnimator (State = Visible) - тест 13.10: «активны False». + _rig.SetActive(true); _rig.name = "necroZombieArmsFP"; int layer = LayerMask.NameToLayer("HoldingItem"); int tinted = 0; diff --git a/HarmonySrc/Possession.cs b/HarmonySrc/Possession.cs index 2864d80..fa9a598 100644 --- a/HarmonySrc/Possession.cs +++ b/HarmonySrc/Possession.cs @@ -187,6 +187,9 @@ namespace NecromancerTome /// Patch_EntityAlive_MoveEntityHeaded_Possession: признак _climb у игры вверх не поднимает (поднимает её навигатор). public static int Ladder; public const float LadderSpeed = 0.1f; // за тик (20 в секунду) - 2 м/с + /// Сколько после последней ступени ещё помогать перешагнуть через край (Ladder 2). + public const float LadderTopTime = 0.6f; + static float _ladderTop; /// Сколько чанков держать вокруг тела, пока игрок в зомби (указание 03.10: «сильно ограничить /// видимость у тела - ему вообще нет смысла что-либо видеть»). Тест 03.10: две полные области обзора /// (тело + одержимый) - память росла с каждым шагом зомби, а выход давал подвисание ~50 с. Трёх чанков @@ -733,7 +736,17 @@ namespace NecromancerTome // Лестница (тест 13.10: «одержимые не могут лазить по лестнице»): у игры лезет навигатор - в клетке с // лестницей (IsInElevator) и цель выше - _climb; у нас - у лестницы и шаг вперёд. bool climb = z.bCanClimbLadders && z.IsInElevator() && move.y > 0.1f; - Ladder = climb && !Crouching ? 1 : Ladder; + if (climb && !Crouching) + { + Ladder = 1; + _ladderTop = Time.time + LadderTopTime; + } + else if (Ladder == 0 && move.y > 0.1f && !z.IsInElevator() && Time.time < _ladderTop) + { + // Верх лестницы (тест 13.10: «лезет, но не может с неё сойти»): ступени под ногами кончились, а до + // пола ещё не хватает - ещё немного вверх и вперёд, как перешагнуть через край. + Ladder = 2; + } z.SetMoveForwardWithModifiers(run ? Mathf.Max(z.GetMoveSpeedAggro(), EffectManager.GetValue(PassiveEffects.RunSpeed, null, z.moveSpeedAggroMax, z)) : z.GetMoveSpeed(), 1f, 0f, climb); } @@ -2537,7 +2550,12 @@ namespace NecromancerTome { public static void Prefix(EntityAlive __instance) { - if (Possession.Ladder != 0 && Possession.IsPossessed(__instance) && __instance.IsInElevator()) + if (Possession.Ladder == 2 && Possession.IsPossessed(__instance)) + { + __instance.motion.y = Mathf.Max(__instance.motion.y, Possession.LadderSpeed); + __instance.motion += Possession.MoveDir * 0.05f; + } + else if (Possession.Ladder != 0 && Possession.IsPossessed(__instance) && __instance.IsInElevator()) { __instance.motion.y = Possession.Ladder * Possession.LadderSpeed; }