using Content.Server.Administration.Logs; using Content.Server.Mind; using Content.Server.Popups; using Content.Server.Roles; using Content.Shared.Database; using Content.Shared.Implants; using Content.Shared.Implants.Components; using Content.Shared.Mindshield.Components; using Content.Shared.Revolutionary.Components; using Content.Shared.Tag; namespace Content.Server.Mindshield; /// /// System used for checking if the implanted is a Rev or Head Rev. /// public sealed class MindShieldSystem : EntitySystem { [Dependency] private readonly IAdminLogManager _adminLogManager = default!; [Dependency] private readonly RoleSystem _roleSystem = default!; [Dependency] private readonly MindSystem _mindSystem = default!; [Dependency] private readonly TagSystem _tag = default!; [Dependency] private readonly PopupSystem _popupSystem = default!; [ValidatePrototypeId] public const string MindShieldTag = "MindShield"; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(ImplantCheck); } /// /// Checks if the implant was a mindshield or not /// public void ImplantCheck(EntityUid uid, SubdermalImplantComponent comp, ref ImplantImplantedEvent ev) { if (_tag.HasTag(ev.Implant, MindShieldTag) && ev.Implanted != null) { EnsureComp(ev.Implanted.Value); MindShieldRemovalCheck(ev.Implanted.Value, ev.Implant); } } /// /// Checks if the implanted person was a Rev or Head Rev and remove role or destroy mindshield respectively. /// public void MindShieldRemovalCheck(EntityUid implanted, EntityUid implant) { if (HasComp(implanted)) { _popupSystem.PopupEntity(Loc.GetString("head-rev-break-mindshield"), implanted); QueueDel(implant); return; } if (_mindSystem.TryGetMind(implanted, out var mindId, out _) && _roleSystem.MindTryRemoveRole(mindId)) { _adminLogManager.Add(LogType.Mind, LogImpact.Medium, $"{ToPrettyString(implanted)} was deconverted due to being implanted with a Mindshield."); } } }