using Content.Shared.CCVar;
using Robust.Shared.Configuration;
using Robust.Shared.Physics.Components;
namespace Content.Shared.Contests
{
public sealed partial class ContestsSystem : EntitySystem
{
[Dependency] private readonly IConfigurationManager _cfg = default!;
///
/// The presumed average mass of a player entity
/// Defaulted to the average mass of an adult human
///
private const float AverageMass = 71f;
#region Mass Contests
///
/// Outputs the ratio of mass between a performer and the average human mass
///
/// Uid of Performer
public float MassContest(EntityUid performerUid, float otherMass = AverageMass)
{
if (_cfg.GetCVar(CCVars.DoMassContests)
&& TryComp(performerUid, out var performerPhysics)
&& performerPhysics.Mass != 0)
return Math.Clamp(performerPhysics.Mass / otherMass, 1 - _cfg.GetCVar(CCVars.MassContestsMaxPercentage), 1 + _cfg.GetCVar(CCVars.MassContestsMaxPercentage));
return 1f;
}
///
///
/// MaybeMassContest, in case your entity doesn't exist
///
public float MassContest(EntityUid? performerUid, float otherMass = AverageMass)
{
if (_cfg.GetCVar(CCVars.DoMassContests))
{
var ratio = performerUid is { } uid ? MassContest(uid, otherMass) : 1f;
return ratio;
}
return 1f;
}
///
/// Outputs the ratio of mass between a performer and the average human mass
/// If a function already has the performer's physics component, this is faster
///
///
public float MassContest(PhysicsComponent performerPhysics, float otherMass = AverageMass)
{
if (_cfg.GetCVar(CCVars.DoMassContests)
&& performerPhysics.Mass != 0)
return Math.Clamp(performerPhysics.Mass / otherMass, 1 - _cfg.GetCVar(CCVars.MassContestsMaxPercentage), 1 + _cfg.GetCVar(CCVars.MassContestsMaxPercentage));
return 1f;
}
///
/// Outputs the ratio of mass between a performer and a target, accepts either EntityUids or PhysicsComponents in any combination
/// If you have physics components already in your function, use instead
///
///
///
public float MassContest(EntityUid performerUid, EntityUid targetUid)
{
if (_cfg.GetCVar(CCVars.DoMassContests)
&& TryComp(performerUid, out var performerPhysics)
&& TryComp(targetUid, out var targetPhysics)
&& performerPhysics.Mass != 0
&& targetPhysics.InvMass != 0)
return Math.Clamp(performerPhysics.Mass * targetPhysics.InvMass, 1 - _cfg.GetCVar(CCVars.MassContestsMaxPercentage), 1 + _cfg.GetCVar(CCVars.MassContestsMaxPercentage));
return 1f;
}
///
public float MassContest(EntityUid performerUid, PhysicsComponent targetPhysics)
{
if (_cfg.GetCVar(CCVars.DoMassContests)
&& TryComp(performerUid, out var performerPhysics)
&& performerPhysics.Mass != 0
&& targetPhysics.InvMass != 0)
return Math.Clamp(performerPhysics.Mass * targetPhysics.InvMass, 1 - _cfg.GetCVar(CCVars.MassContestsMaxPercentage), 1 + _cfg.GetCVar(CCVars.MassContestsMaxPercentage));
return 1f;
}
///
public float MassContest(PhysicsComponent performerPhysics, EntityUid targetUid)
{
if (_cfg.GetCVar(CCVars.DoMassContests)
&& TryComp(targetUid, out var targetPhysics)
&& performerPhysics.Mass != 0
&& targetPhysics.InvMass != 0)
return Math.Clamp(performerPhysics.Mass * targetPhysics.InvMass, 1 - _cfg.GetCVar(CCVars.MassContestsMaxPercentage), 1 + _cfg.GetCVar(CCVars.MassContestsMaxPercentage));
return 1f;
}
///
public float MassContest(PhysicsComponent performerPhysics, PhysicsComponent targetPhysics)
{
if (_cfg.GetCVar(CCVars.DoMassContests)
&& performerPhysics.Mass != 0
&& targetPhysics.InvMass != 0)
return Math.Clamp(performerPhysics.Mass * targetPhysics.InvMass, 1 - _cfg.GetCVar(CCVars.MassContestsMaxPercentage), 1 + _cfg.GetCVar(CCVars.MassContestsMaxPercentage));
return 1f;
}
#endregion
}
}