Руки одержимого: урон по анимации удара рук, как у персонажа; в покое руки выше, на удар - ниже

- ЛКМ от первого лица - удар рук; через RaycastTime их состояния удара (как impactStart у персонажа) зомби бьёт сразу (ForceImpact в IsAttackImpact, задержка луча снята). Замер задержки урона убран.
- Положение: в покое 0,-1.55,0.05 без сжатия; на удар - плавно к -1.7 со сжатием под FOV 45.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
AlexCube
2026-10-13 16:41:57 +03:00
co-authored by Claude Opus 5.5
parent 885c344b3c
commit 2cae2377e2
2 changed files with 97 additions and 40 deletions
+38 -2
View File
@@ -365,6 +365,7 @@ namespace NecromancerTome
return;
}
Active = false;
ForceImpact = false;
FirstPerson = false;
HideBody(null);
FpArms.Hide(_player);
@@ -838,14 +839,21 @@ namespace NecromancerTome
// Нюх (указание 09.10): все существа рядом с собакой - на компасе и карте.
DogSense.Tick(world, z, Time.deltaTime);
}
if (attack && Time.time >= _nextAttack)
if (attack && Time.time >= _nextAttack && FpArms.Active)
{
// От первого лица - как у персонажа (указание 13.10): ЛКМ - удар рук, урон зомби - когда их анимация дошла
// до точки удара (FpArms -> FpImpact), а не по его собственному замаху.
PossessionPowers.BreakInvis(z, "удар");
FpArms.Punch();
_nextAttack = Time.time + Mathf.Max(FpArms.SwingTime, z.GetAttackTimeoutTicks() / 20f);
}
else if (attack && Time.time >= _nextAttack)
{
PossessionPowers.BreakInvis(z, "удар");
z.SetLookPosition(MeleeAim(world, z));
if (z.Attack(false))
{
z.Attack(true);
FpArms.QueuePunch(); // руки от первого лица бьют вместе с зомби (13.10), кулак - в момент урона
if (IsPet && BearControl.Is(z))
{
BearControl.Smash(world, _player, z); // удар лапой и по блоку (решено 09.10)
@@ -2110,6 +2118,34 @@ namespace NecromancerTome
_flyZoomHeld = false;
}
/// <summary>Миг удара рук от первого лица (FpArms): зомби бьёт сразу - его удар начат и сразу «дошёл до точки
/// удара» (ForceImpact в EntityAlive.IsAttackImpact, задержка луча ItemActionMelee снята). Урон, дальность,
/// цель - его, взгляд - на прицел (MeleeAim).</summary>
public static bool ForceImpact;
public static void FpImpact()
{
EntityAlive z = Zombie;
if (!Active || z == null || z.IsDead())
{
return;
}
z.SetLookPosition(MeleeAim(z.world, z));
_meleeLookUntil = Time.time + 0.6f;
if (!z.Attack(false))
{
Debug.Log("[NecromancerTome] Possession: удар рук - зомби не может бить сейчас");
return;
}
z.Attack(true);
ForceImpact = true;
if (z.inventory?.holdingItemData?.actionData != null && z.inventory.holdingItemData.actionData.Count > 0 &&
z.inventory.holdingItemData.actionData[0] is ItemActionMelee.InventoryDataMelee d)
{
d.lastUseTime -= 10f;
}
}
/// <summary>Ячейки пояса персонажа (окно windowToolbelt) - скрыты в виде от первого лица (указание 13.10: «пояс игрока
/// нужно прятать», у зомби свой пояс). Только это окно: группа toolbelt держит и полоски здоровья и сытости персонажа
/// (тест 13.10 - пропали вместе с поясом). Ставится каждый кадр - игра может показать окно снова.</summary>