diff --git a/Content.Server/Administration/Systems/AdminVerbSystem.Antags.cs b/Content.Server/Administration/Systems/AdminVerbSystem.Antags.cs index 9a94d3ff46..c1d519168f 100644 --- a/Content.Server/Administration/Systems/AdminVerbSystem.Antags.cs +++ b/Content.Server/Administration/Systems/AdminVerbSystem.Antags.cs @@ -18,26 +18,38 @@ namespace Content.Server.Administration.Systems; public sealed partial class AdminVerbSystem { - [Dependency] private AntagSelectionSystem _antag = default!; - [Dependency] private ZombieSystem _zombie = default!; [Dependency] private ServerGameTicker _gameTicker = default!; + [Dependency] private AntagSelectionSystem _antag = default!; [Dependency] private OutfitSystem _outfit = default!; + [Dependency] private ZombieSystem _zombie = default!; - private static readonly EntProtoId DefaultTraitorRule = "Traitor"; - private static readonly EntProtoId DefaultInitialInfectedRule = "Zombie"; - private static readonly EntProtoId DefaultNukeOpRule = "LoneOpsSpawn"; - private static readonly EntProtoId DefaultRevsRule = "Revolutionary"; - private static readonly EntProtoId DefaultThiefRule = "Thief"; - private static readonly EntProtoId DefaultChangelingRule = "Changeling"; - private static readonly EntProtoId ParadoxCloneRuleId = "ParadoxCloneSpawn"; - private static readonly EntProtoId DefaultWizardRule = "Wizard"; - private static readonly EntProtoId DefaultNinjaRule = "NinjaSpawn"; + [Dependency] private EntityQuery _actorQuery; + [Dependency] private EntityQuery _humanoidQuery; + [Dependency] private EntityQuery _mindContainerQuery; + + private static readonly EntProtoId TraitorRule = "Traitor"; + private static readonly ProtoId TraitorSpec = "Traitor"; + private static readonly EntProtoId InitialInfectedRule = "Zombie"; + private static readonly ProtoId InitialInfectedSpec = "InitialInfected"; + private static readonly EntProtoId LoneOpRule = "LoneOpsSpawn"; + private static readonly ProtoId LoneOpSpec = "LoneOp"; + private static readonly EntProtoId RevsRule = "Revolutionary"; + private static readonly ProtoId RevsSpec = "HeadRev"; + private static readonly EntProtoId ThiefRule = "Thief"; + private static readonly ProtoId ThiefSpec = "Thief"; + private static readonly EntProtoId ChangelingRule = "Changeling"; + private static readonly ProtoId ChangelingSpec = "Changeling"; + private static readonly EntProtoId ParadoxCloneRule = "ParadoxCloneSpawn"; + private static readonly EntProtoId WizardRule = "Wizard"; + private static readonly ProtoId WizardSpec = "Wizard"; + private static readonly EntProtoId NinjaRule = "NinjaSpawn"; + private static readonly ProtoId NinjaSpec = "SpaceNinja"; private static readonly ProtoId PirateGearId = "PirateGear"; // All antag verbs have names so invokeverb works. private void AddAntagVerbs(GetVerbsEvent args) { - if (!TryComp(args.User, out var actor)) + if (!_actorQuery.TryComp(args.User, out var actor)) return; var player = actor.PlayerSession; @@ -45,7 +57,7 @@ public sealed partial class AdminVerbSystem if (!_adminManager.HasAdminFlag(player, AdminFlags.Fun)) return; - if (!HasComp(args.Target) || !TryComp(args.Target, out var targetActor)) + if (!_mindContainerQuery.HasComp(args.Target) || !_actorQuery.TryComp(args.Target, out var targetActor)) return; var targetPlayer = targetActor.PlayerSession; @@ -58,7 +70,7 @@ public sealed partial class AdminVerbSystem Icon = new SpriteSpecifier.Rsi(new ResPath("/Textures/Interface/Misc/job_icons.rsi"), "Syndicate"), Act = () => { - _antag.ForceMakeAntag(targetPlayer, DefaultTraitorRule); + _antag.ForceMakeAntag(targetPlayer, TraitorRule, TraitorSpec); }, Impact = LogImpact.High, Message = string.Join(": ", traitorName, Loc.GetString("admin-verb-make-traitor")), @@ -73,7 +85,7 @@ public sealed partial class AdminVerbSystem Icon = new SpriteSpecifier.Rsi(new("/Textures/Interface/Misc/job_icons.rsi"), "InitialInfected"), Act = () => { - _antag.ForceMakeAntag(targetPlayer, DefaultInitialInfectedRule); + _antag.ForceMakeAntag(targetPlayer, InitialInfectedRule, InitialInfectedSpec); }, Impact = LogImpact.High, Message = string.Join(": ", initialInfectedName, Loc.GetString("admin-verb-make-initial-infected")), @@ -103,7 +115,7 @@ public sealed partial class AdminVerbSystem Icon = new SpriteSpecifier.Rsi(new("/Textures/Clothing/Head/Hardsuits/syndicate.rsi"), "icon"), Act = () => { - _antag.ForceMakeAntag(targetPlayer, DefaultNukeOpRule); + _antag.ForceMakeAntag(targetPlayer, LoneOpRule, LoneOpSpec); }, Impact = LogImpact.High, Message = string.Join(": ", nukeOpName, Loc.GetString("admin-verb-make-nuclear-operative")), @@ -134,7 +146,7 @@ public sealed partial class AdminVerbSystem Icon = new SpriteSpecifier.Rsi(new("/Textures/Interface/Misc/job_icons.rsi"), "HeadRevolutionary"), Act = () => { - _antag.ForceMakeAntag(targetPlayer, DefaultRevsRule); + _antag.ForceMakeAntag(targetPlayer, RevsRule, RevsSpec); }, Impact = LogImpact.High, Message = string.Join(": ", headRevName, Loc.GetString("admin-verb-make-head-rev")), @@ -149,7 +161,7 @@ public sealed partial class AdminVerbSystem Icon = new SpriteSpecifier.Rsi(new ResPath("/Textures/Clothing/Hands/Gloves/Color/black.rsi"), "icon"), Act = () => { - _antag.ForceMakeAntag(targetPlayer, DefaultThiefRule); + _antag.ForceMakeAntag(targetPlayer, ThiefRule, ThiefSpec); }, Impact = LogImpact.High, Message = string.Join(": ", thiefName, Loc.GetString("admin-verb-make-thief")), @@ -164,34 +176,40 @@ public sealed partial class AdminVerbSystem Icon = new SpriteSpecifier.Rsi(new ResPath("/Textures/Objects/Weapons/Melee/armblade.rsi"), "icon"), Act = () => { - _antag.ForceMakeAntag(targetPlayer, DefaultChangelingRule); + _antag.ForceMakeAntag(targetPlayer, ChangelingRule, ChangelingSpec); }, Impact = LogImpact.High, Message = string.Join(": ", changelingName, Loc.GetString("admin-verb-make-changeling")), }; args.Verbs.Add(changeling); - var paradoxCloneName = Loc.GetString("admin-verb-text-make-paradox-clone"); - Verb paradox = new() + // only humanoids can be cloned + if (_humanoidQuery.HasComp(args.Target)) { - Text = paradoxCloneName, - Category = VerbCategory.Antag, - Icon = new SpriteSpecifier.Rsi(new("/Textures/Interface/Misc/job_icons.rsi"), "ParadoxClone"), - Act = () => + var paradoxCloneName = Loc.GetString("admin-verb-text-make-paradox-clone"); + Verb paradox = new() { - if (_gameTicker.AddGameRule(ParadoxCloneRuleId) is not { } ruleEnt) - return; + Text = paradoxCloneName, + Category = VerbCategory.Antag, + Icon = new SpriteSpecifier.Rsi(new("/Textures/Interface/Misc/job_icons.rsi"), "ParadoxClone"), + Act = () => + { + if (_gameTicker.AddGameRule(ParadoxCloneRule) is not { } ruleEnt) + return; - if (!TryComp(ruleEnt, out var paradoxCloneRuleComp)) - return; + if (!TryComp(ruleEnt, out var paradoxCloneRuleComp)) + return; - paradoxCloneRuleComp.OriginalBody = args.Target; // override the target player + paradoxCloneRuleComp.OriginalBody = args.Target; // override the target player - _gameTicker.StartGameRule(ruleEnt.AsNullable()); - }, - Impact = LogImpact.High, - Message = string.Join(": ", paradoxCloneName, Loc.GetString("admin-verb-make-paradox-clone")), - }; + _gameTicker.StartGameRule(ruleEnt.AsNullable()); + }, + Impact = LogImpact.High, + Message = string.Join(": ", paradoxCloneName, Loc.GetString("admin-verb-make-paradox-clone")), + }; + + args.Verbs.Add(paradox); + } var wizardName = Loc.GetString("admin-verb-text-make-wizard"); Verb wizard = new() @@ -202,7 +220,7 @@ public sealed partial class AdminVerbSystem Act = () => { // Wizard has no rule components as of writing, but I gotta put something here to satisfy the machine so just make it wizard mind rule :) - _antag.ForceMakeAntag(targetPlayer, DefaultWizardRule); + _antag.ForceMakeAntag(targetPlayer, WizardRule, WizardSpec); }, Impact = LogImpact.High, Message = string.Join(": ", wizardName, Loc.GetString("admin-verb-make-wizard")), @@ -217,14 +235,11 @@ public sealed partial class AdminVerbSystem Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Weapons/Melee/energykatana.rsi"), "icon"), Act = () => { - _antag.ForceMakeAntag(targetPlayer, DefaultNinjaRule); + _antag.ForceMakeAntag(targetPlayer, NinjaRule, NinjaSpec); }, Impact = LogImpact.High, Message = string.Join(": ", ninjaName, Loc.GetString("admin-verb-make-space-ninja")), }; args.Verbs.Add(ninja); - - if (HasComp(args.Target)) // only humanoids can be cloned - args.Verbs.Add(paradox); } }