using GameCore.Combat.Interfaces; using GameCore.Events; using GameCore.Input; namespace GameCore.Combat.Effects; public class HitscanEffect(float range) : IEffect { public void Execute(EffectContext context) { var input = context.World.GetComponent(context.Owner); var weapon = context.World.GetComponent(context.Owner); if (input == null || weapon == null) return; var fromPos = input.MuzzlePosition; var targetPos = fromPos + input.MuzzleDirection * range; var hit = context.World.WorldQuery.Raycast(fromPos, targetPos, context.Owner); context.World.PublishEvent(new HitscanImpactEvent(context.Owner, fromPos, targetPos, hit)); if (hit.DidHit) { var hitContext = new EffectContext { World = context.World, Owner = context.Owner, Target = hit.HitEntity }; foreach (var effect in weapon.OnHitEffects) effect.Execute(hitContext); } } }