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 } }