diff --git a/Content.Client/Players/PlayTimeTracking/JobRequirementsManager.cs b/Content.Client/Players/PlayTimeTracking/JobRequirementsManager.cs index 953e7cb10a..2170ee377e 100644 --- a/Content.Client/Players/PlayTimeTracking/JobRequirementsManager.cs +++ b/Content.Client/Players/PlayTimeTracking/JobRequirementsManager.cs @@ -24,6 +24,7 @@ public sealed class JobRequirementsManager : ISharedPlaytimeManager [Dependency] private readonly IEntityManager _entManager = default!; [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly IPrototypeManager _prototypes = default!; + [Dependency] private readonly IClientAdminManager _adminManager = default!; private readonly Dictionary _roles = new(); private readonly List _roleBans = new(); @@ -114,8 +115,12 @@ public sealed class JobRequirementsManager : ISharedPlaytimeManager return true; var reasons = new List(); + var isAdmin = _adminManager.IsAdmin(true); // WD foreach (var requirement in requirements) { + if (requirement.IgnoreIfAdmin && isAdmin) // WD + continue; + if (requirement.Check(_entManager, _prototypes, profile, _roles, out var jobReason)) continue; diff --git a/Content.Server/Changeling/ChangelingSystem.Abilities.cs b/Content.Server/Changeling/ChangelingSystem.Abilities.cs index ea95e97736..81a65012d1 100644 --- a/Content.Server/Changeling/ChangelingSystem.Abilities.cs +++ b/Content.Server/Changeling/ChangelingSystem.Abilities.cs @@ -24,6 +24,7 @@ using Content.Server.Popups; using Content.Server.Store.Components; using Content.Server.Temperature.Components; using Content.Server.Temperature.Systems; +using Content.Shared._White.Item.PseudoItem; using Content.Shared._White.Overlays; using Content.Shared.Actions; using Content.Shared.Borer; @@ -1011,7 +1012,7 @@ public sealed partial class ChangelingSystem if (!TryComp(polymorphEntity.Value, out FelinidComponent? felinid)) return polymorphEntity; - + _action.SetCharges(felinid.HairballAction, 0); _action.SetEnabled(felinid.HairballAction, false); @@ -1020,6 +1021,9 @@ public sealed partial class ChangelingSystem private void BeforeTransform(EntityUid target) { + if (TryComp(target, out PseudoItemComponent? pseudoItem) && pseudoItem.Active) + _transform.AttachToGridOrMap(target); + if (TryComp(target, out BorerHostComponent? host) && host.BorerContainer.Count > 0) _borer.GetOut(host.BorerContainer.ContainedEntities[0]); diff --git a/Content.Server/Players/PlayTimeTracking/PlayTimeTrackingSystem.cs b/Content.Server/Players/PlayTimeTracking/PlayTimeTrackingSystem.cs index d4e19c6545..8b64996b63 100644 --- a/Content.Server/Players/PlayTimeTracking/PlayTimeTrackingSystem.cs +++ b/Content.Server/Players/PlayTimeTracking/PlayTimeTrackingSystem.cs @@ -164,16 +164,8 @@ public sealed class PlayTimeTrackingSystem : EntitySystem _tracking.QueueSendTimers(ev.PlayerSession); } - private bool IsBypassingChecks(ICommonSession player) - { - return _adminManager.IsAdmin(player, true); - } - public bool IsAllowed(ICommonSession player, string role) { - if (IsBypassingChecks(player)) - return true; - if (!_prototypes.TryIndex(role, out var job) || !_cfg.GetCVar(CCVars.GameRoleTimers)) return true; @@ -184,16 +176,15 @@ public sealed class PlayTimeTrackingSystem : EntitySystem playTimes = new Dictionary(); } - return JobRequirements.TryRequirementsMet(job, playTimes, out _, EntityManager, _prototypes, (HumanoidCharacterProfile?) _preferencesManager.GetPreferences(player.UserId).SelectedCharacter); + var isAdmin = _adminManager.IsAdmin(player, true); // WD + + return JobRequirements.TryRequirementsMet(job, playTimes, out _, EntityManager, _prototypes, (HumanoidCharacterProfile?) _preferencesManager.GetPreferences(player.UserId).SelectedCharacter, isAdmin); // WD EDIT } public HashSet GetDisallowedJobs(ICommonSession player) { var roles = new HashSet(); - if (IsBypassingChecks(player)) - return roles; - if (!_cfg.GetCVar(CCVars.GameRoleTimers)) return roles; @@ -203,9 +194,11 @@ public sealed class PlayTimeTrackingSystem : EntitySystem playTimes = new Dictionary(); } + var isAdmin = _adminManager.IsAdmin(player, true); // WD + foreach (var job in _prototypes.EnumeratePrototypes()) { - if (JobRequirements.TryRequirementsMet(job, playTimes, out _, EntityManager, _prototypes, (HumanoidCharacterProfile?) _preferencesManager.GetPreferences(player.UserId).SelectedCharacter)) + if (JobRequirements.TryRequirementsMet(job, playTimes, out _, EntityManager, _prototypes, (HumanoidCharacterProfile?) _preferencesManager.GetPreferences(player.UserId).SelectedCharacter, isAdmin)) // WD EDIT roles.Add(job.ID); } @@ -219,9 +212,6 @@ public sealed class PlayTimeTrackingSystem : EntitySystem var player = _playerManager.GetSessionById(userId); - if (IsBypassingChecks(player)) - return; - if (!_tracking.TryGetTrackerTimes(player, out var playTimes)) { // Sorry mate but your playtimes haven't loaded. @@ -229,10 +219,12 @@ public sealed class PlayTimeTrackingSystem : EntitySystem playTimes ??= new Dictionary(); } + var isAdmin = _adminManager.IsAdmin(player, true); // WD + for (var i = 0; i < jobs.Count; i++) { if (_prototypes.TryIndex(jobs[i], out var job) - && JobRequirements.TryRequirementsMet(job, playTimes, out _, EntityManager, _prototypes, (HumanoidCharacterProfile?) _preferencesManager.GetPreferences(userId).SelectedCharacter)) + && JobRequirements.TryRequirementsMet(job, playTimes, out _, EntityManager, _prototypes, (HumanoidCharacterProfile?) _preferencesManager.GetPreferences(userId).SelectedCharacter, isAdmin)) // WD EDIT { continue; } diff --git a/Content.Shared/Roles/JobRequirement/DepartmentTimeRequirement.cs b/Content.Shared/Roles/JobRequirement/DepartmentTimeRequirement.cs index 56b7d8ba81..2962e752fd 100644 --- a/Content.Shared/Roles/JobRequirement/DepartmentTimeRequirement.cs +++ b/Content.Shared/Roles/JobRequirement/DepartmentTimeRequirement.cs @@ -11,6 +11,8 @@ namespace Content.Shared.Roles; [Serializable, NetSerializable] public sealed partial class DepartmentTimeRequirement : JobRequirement { + public override bool IgnoreIfAdmin => true; // WD + /// /// Which department needs the required amount of time. /// diff --git a/Content.Shared/Roles/JobRequirement/OverallPlaytimeRequirement.cs b/Content.Shared/Roles/JobRequirement/OverallPlaytimeRequirement.cs index acbb8f2b4d..4d495511b0 100644 --- a/Content.Shared/Roles/JobRequirement/OverallPlaytimeRequirement.cs +++ b/Content.Shared/Roles/JobRequirement/OverallPlaytimeRequirement.cs @@ -12,6 +12,8 @@ namespace Content.Shared.Roles; [Serializable, NetSerializable] public sealed partial class OverallPlaytimeRequirement : JobRequirement { + public override bool IgnoreIfAdmin => true; // WD + /// [DataField(required: true)] public TimeSpan Time; diff --git a/Content.Shared/Roles/JobRequirement/RoleTimeRequirement.cs b/Content.Shared/Roles/JobRequirement/RoleTimeRequirement.cs index 658db95ab5..22559ff2f9 100644 --- a/Content.Shared/Roles/JobRequirement/RoleTimeRequirement.cs +++ b/Content.Shared/Roles/JobRequirement/RoleTimeRequirement.cs @@ -13,6 +13,8 @@ namespace Content.Shared.Roles; [Serializable, NetSerializable] public sealed partial class RoleTimeRequirement : JobRequirement { + public override bool IgnoreIfAdmin => true; // WD + /// /// What particular role they need the time requirement with. /// diff --git a/Content.Shared/Roles/JobRequirements.cs b/Content.Shared/Roles/JobRequirements.cs index 17f5f7bd6a..6b7933b383 100644 --- a/Content.Shared/Roles/JobRequirements.cs +++ b/Content.Shared/Roles/JobRequirements.cs @@ -14,7 +14,8 @@ public static class JobRequirements [NotNullWhen(false)] out FormattedMessage? reason, IEntityManager entManager, IPrototypeManager protoManager, - HumanoidCharacterProfile? profile) + HumanoidCharacterProfile? profile, + bool isAdmin) { var sys = entManager.System(); var requirements = sys.GetJobRequirement(job); @@ -24,6 +25,9 @@ public static class JobRequirements foreach (var requirement in requirements) { + if (isAdmin && requirement.IgnoreIfAdmin) + continue; + if (!requirement.Check(entManager, protoManager, profile, playTimes, out reason)) return false; } @@ -42,6 +46,8 @@ public abstract partial class JobRequirement [DataField] public bool Inverted; + public virtual bool IgnoreIfAdmin => false; // WD + public abstract bool Check( IEntityManager entManager, IPrototypeManager protoManager,