Bug Fixes

This commit is contained in:
2026-07-03 17:44:41 +03:00
parent 3d423974eb
commit 26b896c39d
8 changed files with 2006 additions and 119 deletions
@@ -20,6 +20,12 @@ public class PlayerHealth : NetworkBehaviour
private bool isServer;
// Короткое окно после респавна, когда вход в яму не засчитывается — страховка на случай,
// если серверная позиция коллайдера не успела выйти из ямы (сетевая задержка).
[SerializeField] private float pitImmunityDuration = 1f;
private float pitImmuneUntil;
public bool IsPitImmune => Time.time < pitImmuneUntil;
public void Init(bool _isServer)
{
isServer = _isServer;
@@ -76,6 +82,7 @@ public class PlayerHealth : NetworkBehaviour
GetComponent<PlayerShield>()?.SetShieldState(false);
isDead.Value = false;
currentHealth.Value = maxHealth;
pitImmuneUntil = Time.time + pitImmunityDuration;
RespawnClientRpc(_spawnPosition);
}
@@ -97,15 +104,18 @@ public class PlayerHealth : NetworkBehaviour
{
SetPhysicsAndVisualsActive(true);
// Позицию задаёт только владелец — он авторитет над NetworkTransform (Owner authority)
// Позицию задаёт ТОЛЬКО владелец — он авторитет над NetworkTransform (Owner authority).
// На сервере/не-владельце трогать transform бессмысленно: NetworkTransform всё равно
// перезапишет его синхронизацией от владельца. Серверную позицию догонит RoundManager
// через WaitForPlayersAtSpawn перед стартом записи (иначе запись стартует в яме).
if (!IsOwner) return;
TeleportOwner(_spawnPosition);
Teleport(_spawnPosition);
}
// Телепорт без интерполяции. CharacterController кэширует свою позицию,
// поэтому его надо выключить на время установки трансформа.
private void TeleportOwner(Vector3 _spawnPosition)
private void Teleport(Vector3 _spawnPosition)
{
CharacterController _controller = GetComponent<CharacterController>();
if (_controller != null) _controller.enabled = false;