2025-09-24 11:24:38 +05:00

59 lines
1.2 KiB
C#

using UnityEngine;
using Fusion;
namespace TPSBR
{
public sealed class SimpleDamageArea : NetworkBehaviour
{
// PRIVATE MEMBERS
[SerializeField]
private float _radius = 1f;
[SerializeField]
private float _damagePerSecond = 20f;
[SerializeField]
private int _hitsPerSecond = 4;
[SerializeField]
private LayerMask _hitMask;
[Networked]
private TickTimer _cooldown { get; set; }
private Collider[] _hitColliders = new Collider[6];
// NetworkBehaviour INTERFACE
public override void FixedUpdateNetwork()
{
if (HasStateAuthority == false)
return;
if (_damagePerSecond <= 0f)
return;
if (_cooldown.ExpiredOrNotRunning(Runner) == true)
{
Fire();
}
}
// PRIVATE METHODS
private void Fire()
{
int hits = Runner.SimulationUnityScene.GetPhysicsScene().OverlapSphere(transform.position, _radius, _hitColliders, _hitMask, QueryTriggerInteraction.UseGlobal);
_cooldown = TickTimer.CreateFromSeconds(Runner, 1f / _hitsPerSecond);
if (hits == 0)
return;
float damage = _damagePerSecond / _hitsPerSecond;
for (int i = 0; i < hits; i++)
{
HitUtility.ProcessHit(this, _hitColliders[i], damage, EHitType.Suicide, out HitData hit);
}
}
}
}