Руки одержимого включаются (префаб выключен); на верху лестницы - подъём и шаг через край

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
AlexCube
2026-10-13 15:55:19 +03:00
co-authored by Claude Opus 5.5
parent 8459ea7ed4
commit ace286893f
2 changed files with 22 additions and 2 deletions
+2
View File
@@ -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;
+20 -2
View File
@@ -187,6 +187,9 @@ namespace NecromancerTome
/// Patch_EntityAlive_MoveEntityHeaded_Possession: признак _climb у игры вверх не поднимает (поднимает её навигатор).</summary>
public static int Ladder;
public const float LadderSpeed = 0.1f; // за тик (20 в секунду) - 2 м/с
/// <summary>Сколько после последней ступени ещё помогать перешагнуть через край (Ladder 2).</summary>
public const float LadderTopTime = 0.6f;
static float _ladderTop;
/// <summary>Сколько чанков держать вокруг тела, пока игрок в зомби (указание 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;
}