diff --git a/HarmonySrc/Possession.cs b/HarmonySrc/Possession.cs index c63d35e..7002fda 100644 --- a/HarmonySrc/Possession.cs +++ b/HarmonySrc/Possession.cs @@ -183,6 +183,10 @@ namespace NecromancerTome /// Куда идёт одержимый (по земле), иначе ноль - для выправления движения анимации /// (Patch_EntityAlive_MoveEntityHeaded_Possession). public static Vector3 MoveDir; + /// Лестница: 1 - вверх (шаг вперёд у лестницы), -1 - вниз (приседание), 0 - нет. Сам подъём - в + /// Patch_EntityAlive_MoveEntityHeaded_Possession: признак _climb у игры вверх не поднимает (поднимает её навигатор). + public static int Ladder; + public const float LadderSpeed = 0.1f; // за тик (20 в секунду) - 2 м/с /// Сколько чанков держать вокруг тела, пока игрок в зомби (указание 03.10: «сильно ограничить /// видимость у тела - ему вообще нет смысла что-либо видеть»). Тест 03.10: две полные области обзора /// (тело + одержимый) - память росла с каждым шагом зомби, а выход давал подвисание ~50 с. Трёх чанков @@ -369,6 +373,7 @@ namespace NecromancerTome BodyDanger = false; Crouching = false; MoveDir = Vector3.zero; + Ladder = 0; _meleeLookUntil = 0f; _crouchToggled = false; EntityAlive z = Zombie; @@ -720,12 +725,17 @@ namespace NecromancerTome z.SetRotation(new Vector3(0f, _bodyYaw, 0f)); z.rotation.x = -_pitch; // наклон головы - для луча удара MoveDir = moving ? Quaternion.Euler(0f, _bodyYaw, 0f) * Vector3.forward : Vector3.zero; + Ladder = z.bCanClimbLadders && z.IsInElevator() && Crouching ? -1 : 0; if (moving) { // Бег - ночная скорость ярости (moveSpeedAggroMax) в любое время: днём GetMoveSpeedAggro отдаёт // дневную, а у многих зомби она равна шагу (13.10: «не все зомби бегают по Shift»). + // Лестница (тест 13.10: «одержимые не могут лазить по лестнице»): у игры лезет навигатор - в клетке с + // лестницей (IsInElevator) и цель выше - _climb; у нас - у лестницы и шаг вперёд. + bool climb = z.bCanClimbLadders && z.IsInElevator() && move.y > 0.1f; + Ladder = climb && !Crouching ? 1 : Ladder; z.SetMoveForwardWithModifiers(run ? Mathf.Max(z.GetMoveSpeedAggro(), - EffectManager.GetValue(PassiveEffects.RunSpeed, null, z.moveSpeedAggroMax, z)) : z.GetMoveSpeed(), 1f, 0f, false); + EffectManager.GetValue(PassiveEffects.RunSpeed, null, z.moveSpeedAggroMax, z)) : z.GetMoveSpeed(), 1f, 0f, climb); } else { @@ -2517,6 +2527,10 @@ namespace NecromancerTome { public static void Prefix(EntityAlive __instance) { + if (Possession.Ladder != 0 && Possession.IsPossessed(__instance) && __instance.IsInElevator()) + { + __instance.motion.y = Possession.Ladder * Possession.LadderSpeed; + } Vector3 d = Possession.MoveDir; if (d == Vector3.zero || !__instance.RootMotion || !Possession.IsPossessed(__instance) || __instance.Jumping) {