using GameCore.Combat.Effects; using GameCore.ECS; using GameCore.ECS.Interfaces; using GameCore.Physics; namespace GameCore.Combat; public class ProjectileSystem : ISystem { public void Update(World world, float deltaTime) { var projectiles = world.GetEntitiesWith(); foreach (var projectile in projectiles) { var velocity = world.GetComponent(projectile); var position = world.GetComponent(projectile); var projectileData = world.GetComponent(projectile); if (velocity == null || position == null || projectileData == null) continue; var newPosition = position.Position + velocity.DesiredVelocity * deltaTime; var hit = world.WorldQuery.Raycast(position.Position, newPosition, projectileData.Owner); if (hit.DidHit) { var hitContext = new EffectContext { World = world, Owner = projectileData.Owner, Target = hit.HitEntity }; foreach (var effect in projectileData.OnHitEffects) effect.Execute(hitContext); world.AddComponent(projectile, new DeathComponent()); continue; } position.Position = newPosition; } } }