using Fusion; using UnityEngine; namespace Projectiles { /// /// Base class for all hitscan projectile types. /// public abstract class HitscanProjectile : ProjectileBase, IBufferView { // 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) { } } }