using System.Numerics;
using Content.Server.Shuttles.Components;
using Content.Shared.Audio;
using Robust.Shared.Audio;
using Robust.Shared.Map;
using Robust.Shared.Physics.Dynamics;
using Robust.Shared.Physics.Events;
using Robust.Shared.Player;
namespace Content.Server.Shuttles.Systems;
public sealed partial class ShuttleSystem
{
///
/// Minimum velocity difference between 2 bodies for a shuttle "impact" to occur.
///
private const int MinimumImpactVelocity = 10;
private readonly SoundCollectionSpecifier _shuttleImpactSound = new("ShuttleImpactSound");
private void InitializeImpact()
{
SubscribeLocalEvent(OnShuttleCollide);
}
private void OnShuttleCollide(EntityUid uid, ShuttleComponent component, ref StartCollideEvent args)
{
if (!HasComp(args.OtherEntity))
return;
var ourBody = args.OurBody;
var otherBody = args.OtherBody;
// TODO: Would also be nice to have a continuous sound for scraping.
var ourXform = Transform(uid);
if (ourXform.MapUid == null)
return;
var otherXform = Transform(args.OtherEntity);
var ourPoint = Vector2.Transform(args.WorldPoint, _transform.GetInvWorldMatrix(ourXform));
var otherPoint = Vector2.Transform(args.WorldPoint, _transform.GetInvWorldMatrix(otherXform));
var ourVelocity = _physics.GetLinearVelocity(uid, ourPoint, ourBody, ourXform);
var otherVelocity = _physics.GetLinearVelocity(args.OtherEntity, otherPoint, otherBody, otherXform);
var jungleDiff = (ourVelocity - otherVelocity).Length();
if (jungleDiff < MinimumImpactVelocity)
{
return;
}
var coordinates = new EntityCoordinates(ourXform.MapUid.Value, args.WorldPoint);
var volume = MathF.Min(10f, 1f * MathF.Pow(jungleDiff, 0.5f) - 5f);
var audioParams = AudioParams.Default.WithVariation(SharedContentAudioSystem.DefaultVariation).WithVolume(volume);
_audio.PlayPvs(_shuttleImpactSound, coordinates, audioParams);
}
}