using System.Numerics;
using Content.Server.Physics.Components;
using Content.Shared.EntityEffects;
using Content.Shared.EntityEffects.Effects.Smite;
using Content.Shared.Movement.Components;
using Robust.Shared.Random;
using Robust.Shared.Spawners;
namespace Content.Server.EntityEffects.Effects.Smite;
///
/// Spawns a rod at a distance and makes it chase this entity.
///
///
public sealed partial class HomingRodEntityEffectSystem : EntityEffectSystem
{
[Dependency] private IRobustRandom _random = default!;
[Dependency] private SharedTransformSystem _transform = default!;
protected override void Effect(Entity entity, ref EntityEffectEvent args)
{
var speed = args.Effect.Speed;
if (args.Effect.MatchTargetSprintSpeed &&
TryComp(entity, out var movement))
speed = movement.CurrentSprintSpeed + 0.001f;
if (speed <= 0)
return;
var offset = _random.NextAngle().RotateVec(new Vector2(args.Effect.Distance, 0));
var spawnCoords = _transform.GetMapCoordinates(entity).Offset(offset);
var rod = Spawn(args.Effect.Prototype, spawnCoords);
EnsureComp(rod, out var chasing);
chasing.NextChangeVectorTime = TimeSpan.MaxValue;
chasing.ChasingEntity = entity.Owner;
chasing.ImpulseInterval = 0.1f;
chasing.RotateWithImpulse = true;
chasing.MaxSpeed = speed;
chasing.Speed = speed;
if (TryComp(rod, out var despawn))
despawn.Lifetime = offset.Length() / speed * 3;
}
}