Одержимость: лестницы - вверх шагом вперёд, вниз приседанием
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
a27caefc34
commit
0d2ac5a48a
@@ -183,6 +183,10 @@ namespace NecromancerTome
|
|||||||
/// <summary>Куда идёт одержимый (по земле), иначе ноль - для выправления движения анимации
|
/// <summary>Куда идёт одержимый (по земле), иначе ноль - для выправления движения анимации
|
||||||
/// (Patch_EntityAlive_MoveEntityHeaded_Possession).</summary>
|
/// (Patch_EntityAlive_MoveEntityHeaded_Possession).</summary>
|
||||||
public static Vector3 MoveDir;
|
public static Vector3 MoveDir;
|
||||||
|
/// <summary>Лестница: 1 - вверх (шаг вперёд у лестницы), -1 - вниз (приседание), 0 - нет. Сам подъём - в
|
||||||
|
/// Patch_EntityAlive_MoveEntityHeaded_Possession: признак _climb у игры вверх не поднимает (поднимает её навигатор).</summary>
|
||||||
|
public static int Ladder;
|
||||||
|
public const float LadderSpeed = 0.1f; // за тик (20 в секунду) - 2 м/с
|
||||||
/// <summary>Сколько чанков держать вокруг тела, пока игрок в зомби (указание 03.10: «сильно ограничить
|
/// <summary>Сколько чанков держать вокруг тела, пока игрок в зомби (указание 03.10: «сильно ограничить
|
||||||
/// видимость у тела - ему вообще нет смысла что-либо видеть»). Тест 03.10: две полные области обзора
|
/// видимость у тела - ему вообще нет смысла что-либо видеть»). Тест 03.10: две полные области обзора
|
||||||
/// (тело + одержимый) - память росла с каждым шагом зомби, а выход давал подвисание ~50 с. Трёх чанков
|
/// (тело + одержимый) - память росла с каждым шагом зомби, а выход давал подвисание ~50 с. Трёх чанков
|
||||||
@@ -369,6 +373,7 @@ namespace NecromancerTome
|
|||||||
BodyDanger = false;
|
BodyDanger = false;
|
||||||
Crouching = false;
|
Crouching = false;
|
||||||
MoveDir = Vector3.zero;
|
MoveDir = Vector3.zero;
|
||||||
|
Ladder = 0;
|
||||||
_meleeLookUntil = 0f;
|
_meleeLookUntil = 0f;
|
||||||
_crouchToggled = false;
|
_crouchToggled = false;
|
||||||
EntityAlive z = Zombie;
|
EntityAlive z = Zombie;
|
||||||
@@ -720,12 +725,17 @@ namespace NecromancerTome
|
|||||||
z.SetRotation(new Vector3(0f, _bodyYaw, 0f));
|
z.SetRotation(new Vector3(0f, _bodyYaw, 0f));
|
||||||
z.rotation.x = -_pitch; // наклон головы - для луча удара
|
z.rotation.x = -_pitch; // наклон головы - для луча удара
|
||||||
MoveDir = moving ? Quaternion.Euler(0f, _bodyYaw, 0f) * Vector3.forward : Vector3.zero;
|
MoveDir = moving ? Quaternion.Euler(0f, _bodyYaw, 0f) * Vector3.forward : Vector3.zero;
|
||||||
|
Ladder = z.bCanClimbLadders && z.IsInElevator() && Crouching ? -1 : 0;
|
||||||
if (moving)
|
if (moving)
|
||||||
{
|
{
|
||||||
// Бег - ночная скорость ярости (moveSpeedAggroMax) в любое время: днём GetMoveSpeedAggro отдаёт
|
// Бег - ночная скорость ярости (moveSpeedAggroMax) в любое время: днём GetMoveSpeedAggro отдаёт
|
||||||
// дневную, а у многих зомби она равна шагу (13.10: «не все зомби бегают по Shift»).
|
// дневную, а у многих зомби она равна шагу (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(),
|
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
|
else
|
||||||
{
|
{
|
||||||
@@ -2517,6 +2527,10 @@ namespace NecromancerTome
|
|||||||
{
|
{
|
||||||
public static void Prefix(EntityAlive __instance)
|
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;
|
Vector3 d = Possession.MoveDir;
|
||||||
if (d == Vector3.zero || !__instance.RootMotion || !Possession.IsPossessed(__instance) || __instance.Jumping)
|
if (d == Vector3.zero || !__instance.RootMotion || !Possession.IsPossessed(__instance) || __instance.Jumping)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user