|
|
|
|
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)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|