using Fusion;
using UnityEngine;
namespace Projectiles
{
///
/// Main script controlling dummy targets that can be played in the scene.
/// Dummy target can be stationary or moving (when SimpleMove component is added).
///
[RequireComponent(typeof(Health), typeof(HitboxRoot))]
public class DummyTarget : NetworkBehaviour
{
// PRIVATE MEMBERS
[SerializeField]
private float _reviveTime = 3f;
[SerializeField]
private Animation _animation;
[SerializeField]
private AnimationClip _reviveClip;
[SerializeField]
private bool _useLagCompensation;
[Networked]
private TickTimer _reviveCooldown { get; set; }
private Health _health;
private HitboxRoot _hitboxRoot;
private Collider _collider;
private bool _isAlive;
// MONOBEHAVIOUR
protected void Awake()
{
_health = GetComponent();
_hitboxRoot = GetComponent();
_collider = GetComponentInChildren();
}
protected void OnEnable()
{
_isAlive = false;
}
// NetworkBehaviour INTERFACE
public override void Spawned()
{
_collider.enabled = _useLagCompensation == false;
_hitboxRoot.HitboxRootActive = _useLagCompensation;
}
public override void FixedUpdateNetwork()
{
if (_useLagCompensation == true)
{
_hitboxRoot.HitboxRootActive = _health.IsAlive;
}
else
{
_collider.enabled = _health.IsAlive;
}
if (_health.IsAlive == false)
{
if (_reviveCooldown.Expired(Runner) == true)
{
_health.ResetHealth();
_reviveCooldown = default;
}
else if (_reviveCooldown.IsRunning == false)
{
_reviveCooldown = TickTimer.CreateFromSeconds(Runner, _reviveTime);
}
}
}
public override void Render()
{
SetIsAlive(_health.IsAlive);
}
// PRIVATE MEMBERS
private void SetIsAlive(bool value, bool force = false)
{
if (value == _isAlive && force == false)
return;
_isAlive = value;
if (value == true)
{
_animation.Play(_reviveClip.name);
}
}
}
}