You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

65 lines
1.4 KiB
C#

using Fusion;
using UnityEngine;
namespace Projectiles
{
/// <summary>
/// Base class for all hitscan projectile types.
/// </summary>
public abstract class HitscanProjectile : ProjectileBase, IBufferView<HitscanData>
{
// PUBLIC MEMBERS
public bool IsFinished { get; protected set; }
// PRIVATE MEMBERS
[SerializeField]
private float _damage = 10f;
[SerializeField]
private EHitType _hitType = EHitType.Projectile;
[SerializeField]
private LayerMask _hitMask;
[SerializeField]
protected float _maxDistance = 200f;
// PUBLIC METHODS
public virtual HitscanData GetFireData(Vector3 firePosition, Vector3 fireDirection)
{
var data = new HitscanData()
{
FirePosition = firePosition,
FireDirection = fireDirection,
};
if (ProjectileUtility.ProjectileCast(Context.Runner, Context.Owner, firePosition, fireDirection, _maxDistance, _hitMask, out LagCompensatedHit hit) == true)
{
HitUtility.ProcessHit(Context.Owner, data.FireDirection, hit, _damage, _hitType);
data.ImpactPosition = hit.Point;
data.ImpactNormal = (hit.Normal - fireDirection) * 0.5f;
SpawnImpact(hit.Point, data.ImpactNormal);
}
return data;
}
public virtual void Activate(ref HitscanData data)
{
IsFinished = false;
}
public virtual void Deactivate()
{
}
// IBufferView INTERFACE
public virtual void Render(ref HitscanData data, ref HitscanData fromData, float alpha)
{
}
}
}