34 lines
1.0 KiB
C#
34 lines
1.0 KiB
C#
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<InputStateComponent>(context.Owner);
|
|
var weapon = context.World.GetComponent<WeaponComponent>(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);
|
|
}
|
|
}
|
|
} |