using Content.Server.Administration.UI;
+using Content.Server.Clothing.Systems;
using Content.Server.EUI;
-using Content.Server.Hands.Systems;
-using Content.Server.Preferences.Managers;
-using Content.Shared.Access.Components;
using Content.Shared.Administration;
-using Content.Shared.Clothing;
-using Content.Shared.Hands.Components;
-using Content.Shared.Humanoid;
using Content.Shared.Inventory;
-using Content.Shared.PDA;
-using Content.Shared.Preferences;
-using Content.Shared.Preferences.Loadouts;
-using Content.Shared.Roles;
-using Content.Shared.Station;
using Robust.Shared.Console;
-using Robust.Shared.Player;
-using Robust.Shared.Prototypes;
namespace Content.Server.Administration.Commands
{
[AdminCommand(AdminFlags.Admin)]
- public sealed class SetOutfitCommand : IConsoleCommand
+ public sealed class SetOutfitCommand : LocalizedEntityCommands
{
- [Dependency] private readonly IEntityManager _entities = default!;
+ [Dependency] private readonly EuiManager _euiManager = default!;
+ [Dependency] private readonly OutfitSystem _outfitSystem = default!;
- public string Command => "setoutfit";
+ public override string Command => "setoutfit";
+ public override string Description => Loc.GetString("cmd-setoutfit-desc", ("requiredComponent", nameof(InventoryComponent)));
- public string Description => Loc.GetString("set-outfit-command-description", ("requiredComponent", nameof(InventoryComponent)));
-
- public string Help => Loc.GetString("set-outfit-command-help-text", ("command", Command));
-
- public void Execute(IConsoleShell shell, string argStr, string[] args)
+ public override void Execute(IConsoleShell shell, string argStr, string[] args)
{
if (args.Length < 1)
{
var nent = new NetEntity(entInt);
- if (!_entities.TryGetEntity(nent, out var target))
+ if (!EntityManager.TryGetEntity(nent, out var target))
{
shell.WriteLine(Loc.GetString("shell-invalid-entity-id"));
return;
}
- if (!_entities.HasComponent<InventoryComponent>(target))
+ if (!EntityManager.HasComponent<InventoryComponent>(target))
{
shell.WriteLine(Loc.GetString("shell-target-entity-does-not-have-message", ("missing", "inventory")));
return;
{
if (shell.Player is not { } player)
{
- shell.WriteError(Loc.GetString("set-outfit-command-is-not-player-error"));
+ shell.WriteError(Loc.GetString("cmd-setoutfit-is-not-player-error"));
return;
}
- var eui = IoCManager.Resolve<EuiManager>();
var ui = new SetOutfitEui(nent);
- eui.OpenEui(ui, player);
+ _euiManager.OpenEui(ui, player);
return;
}
- if (!SetOutfit(target.Value, args[1], _entities))
- shell.WriteLine(Loc.GetString("set-outfit-command-invalid-outfit-id-error"));
- }
-
- public static bool SetOutfit(EntityUid target, string gear, IEntityManager entityManager, Action<EntityUid, EntityUid>? onEquipped = null)
- {
- if (!entityManager.TryGetComponent(target, out InventoryComponent? inventoryComponent))
- return false;
-
- var prototypeManager = IoCManager.Resolve<IPrototypeManager>();
- if (!prototypeManager.TryIndex<StartingGearPrototype>(gear, out var startingGear))
- return false;
-
- HumanoidCharacterProfile? profile = null;
- ICommonSession? session = null;
- // Check if we are setting the outfit of a player to respect the preferences
- if (entityManager.TryGetComponent(target, out ActorComponent? actorComponent))
- {
- session = actorComponent.PlayerSession;
- var userId = actorComponent.PlayerSession.UserId;
- var preferencesManager = IoCManager.Resolve<IServerPreferencesManager>();
- var prefs = preferencesManager.GetPreferences(userId);
- profile = prefs.SelectedCharacter as HumanoidCharacterProfile;
- }
-
- var invSystem = entityManager.System<InventorySystem>();
- if (invSystem.TryGetSlots(target, out var slots))
- {
- foreach (var slot in slots)
- {
- invSystem.TryUnequip(target, slot.Name, true, true, false, inventoryComponent);
- var gearStr = ((IEquipmentLoadout) startingGear).GetGear(slot.Name);
- if (gearStr == string.Empty)
- {
- continue;
- }
-
- var equipmentEntity = entityManager.SpawnEntity(gearStr, entityManager.GetComponent<TransformComponent>(target).Coordinates);
- if (slot.Name == "id" &&
- entityManager.TryGetComponent(equipmentEntity, out PdaComponent? pdaComponent) &&
- entityManager.TryGetComponent<IdCardComponent>(pdaComponent.ContainedId, out var id))
- {
- id.FullName = entityManager.GetComponent<MetaDataComponent>(target).EntityName;
- }
-
- invSystem.TryEquip(target, equipmentEntity, slot.Name, silent: true, force: true, inventory: inventoryComponent);
-
- onEquipped?.Invoke(target, equipmentEntity);
- }
- }
-
- if (entityManager.TryGetComponent(target, out HandsComponent? handsComponent))
- {
- var handsSystem = entityManager.System<HandsSystem>();
- var coords = entityManager.GetComponent<TransformComponent>(target).Coordinates;
- foreach (var prototype in startingGear.Inhand)
- {
- var inhandEntity = entityManager.SpawnEntity(prototype, coords);
- handsSystem.TryPickup(target, inhandEntity, checkActionBlocker: false, handsComp: handsComponent);
- }
- }
-
- // See if this starting gear is associated with a job
- var jobs = prototypeManager.EnumeratePrototypes<JobPrototype>();
- foreach (var job in jobs)
- {
- if (job.StartingGear != gear)
- continue;
-
- var jobProtoId = LoadoutSystem.GetJobPrototype(job.ID);
- if (!prototypeManager.TryIndex<RoleLoadoutPrototype>(jobProtoId, out var jobProto))
- break;
-
- // Don't require a player, so this works on Urists
- profile ??= entityManager.TryGetComponent<HumanoidAppearanceComponent>(target, out var comp)
- ? HumanoidCharacterProfile.DefaultWithSpecies(comp.Species)
- : new HumanoidCharacterProfile();
- // Try to get the user's existing loadout for the role
- profile.Loadouts.TryGetValue(jobProtoId, out var roleLoadout);
-
- if (roleLoadout == null)
- {
- // If they don't have a loadout for the role, make a default one
- roleLoadout = new RoleLoadout(jobProtoId);
- roleLoadout.SetDefault(profile, session, prototypeManager);
- }
-
- // Equip the target with the job loadout
- var stationSpawning = entityManager.System<SharedStationSpawningSystem>();
- stationSpawning.EquipRoleLoadout(target, roleLoadout, jobProto);
- }
-
- return true;
+ if (!_outfitSystem.SetOutfit(target.Value, args[1]))
+ shell.WriteLine(Loc.GetString("cmd-setoutfit-invalid-outfit-id-error"));
}
}
}
-using Content.Server.Administration.Commands;
using Content.Server.Antag;
using Content.Server.GameTicking;
using Content.Server.GameTicking.Rules.Components;
using Content.Server.Zombies;
using Content.Shared.Administration;
+using Content.Server.Clothing.Systems;
using Content.Shared.Database;
using Content.Shared.Humanoid;
using Content.Shared.Mind.Components;
[Dependency] private readonly AntagSelectionSystem _antag = default!;
[Dependency] private readonly ZombieSystem _zombie = default!;
[Dependency] private readonly GameTicker _gameTicker = default!;
+ [Dependency] private readonly OutfitSystem _outfit = default!;
[ValidatePrototypeId<EntityPrototype>]
private const string DefaultTraitorRule = "Traitor";
Act = () =>
{
// pirates just get an outfit because they don't really have logic associated with them
- SetOutfitCommand.SetOutfit(args.Target, PirateGearId, EntityManager);
+ _outfit.SetOutfit(args.Target, PirateGearId);
},
Impact = LogImpact.High,
Message = string.Join(": ", pirateName, Loc.GetString("admin-verb-make-pirate")),
using System.Threading;
-using Content.Server.Administration.Commands;
using Content.Server.Administration.Components;
using Content.Server.Atmos.Components;
using Content.Server.Atmos.EntitySystems;
using Content.Server.Body.Components;
using Content.Server.Body.Systems;
+using Content.Server.Clothing.Systems;
using Content.Server.Electrocution;
using Content.Server.Explosion.EntitySystems;
using Content.Server.GhostKick;
using Content.Shared.Tabletop.Components;
using Content.Shared.Tools.Systems;
using Content.Shared.Verbs;
-using Robust.Shared.Map;
using Robust.Shared.Map.Components;
using Robust.Shared.Physics;
using Robust.Shared.Physics.Components;
[Dependency] private readonly SharedTransformSystem _transformSystem = default!;
[Dependency] private readonly SuperBonkSystem _superBonkSystem = default!;
[Dependency] private readonly SlipperySystem _slipperySystem = default!;
+ [Dependency] private readonly OutfitSystem _outfitSystem = default!;
// All smite verbs have names so invokeverb works.
private void AddSmiteVerbs(GetVerbsEvent<Verb> args)
Icon = new SpriteSpecifier.Rsi(new ("/Textures/Clothing/Uniforms/Jumpskirt/janimaid.rsi"), "icon"),
Act = () =>
{
- SetOutfitCommand.SetOutfit(args.Target, "JanitorMaidGear", EntityManager, (_, clothing) =>
+ _outfitSystem.SetOutfit(args.Target, "JanitorMaidGear", (_, clothing) =>
{
if (HasComp<ClothingComponent>(clothing))
EnsureComp<UnremoveableComponent>(clothing);
--- /dev/null
+using Content.Server.Hands.Systems;
+using Content.Server.Preferences.Managers;
+using Content.Shared.Access.Components;
+using Content.Shared.Clothing;
+using Content.Shared.Hands.Components;
+using Content.Shared.Humanoid;
+using Content.Shared.Inventory;
+using Content.Shared.PDA;
+using Content.Shared.Preferences;
+using Content.Shared.Preferences.Loadouts;
+using Content.Shared.Roles;
+using Content.Shared.Station;
+using Robust.Shared.Player;
+using Robust.Shared.Prototypes;
+
+namespace Content.Server.Clothing.Systems;
+
+public sealed class OutfitSystem : EntitySystem
+{
+ [Dependency] private readonly IServerPreferencesManager _preferenceManager = default!;
+ [Dependency] private readonly IPrototypeManager _prototypeManager = default!;
+ [Dependency] private readonly HandsSystem _handSystem = default!;
+ [Dependency] private readonly InventorySystem _invSystem = default!;
+ [Dependency] private readonly SharedStationSpawningSystem _spawningSystem = default!;
+
+ public bool SetOutfit(EntityUid target, string gear, Action<EntityUid, EntityUid>? onEquipped = null)
+ {
+ if (!EntityManager.TryGetComponent(target, out InventoryComponent? inventoryComponent))
+ return false;
+
+ if (!_prototypeManager.TryIndex<StartingGearPrototype>(gear, out var startingGear))
+ return false;
+
+ HumanoidCharacterProfile? profile = null;
+ ICommonSession? session = null;
+ // Check if we are setting the outfit of a player to respect the preferences
+ if (EntityManager.TryGetComponent(target, out ActorComponent? actorComponent))
+ {
+ session = actorComponent.PlayerSession;
+ var userId = actorComponent.PlayerSession.UserId;
+ var prefs = _preferenceManager.GetPreferences(userId);
+ profile = prefs.SelectedCharacter as HumanoidCharacterProfile;
+ }
+
+ if (_invSystem.TryGetSlots(target, out var slots))
+ {
+ foreach (var slot in slots)
+ {
+ _invSystem.TryUnequip(target, slot.Name, true, true, false, inventoryComponent);
+ var gearStr = ((IEquipmentLoadout) startingGear).GetGear(slot.Name);
+ if (gearStr == string.Empty)
+ continue;
+
+ var equipmentEntity = EntityManager.SpawnEntity(gearStr, EntityManager.GetComponent<TransformComponent>(target).Coordinates);
+ if (slot.Name == "id" &&
+ EntityManager.TryGetComponent(equipmentEntity, out PdaComponent? pdaComponent) &&
+ EntityManager.TryGetComponent<IdCardComponent>(pdaComponent.ContainedId, out var id))
+ {
+ id.FullName = EntityManager.GetComponent<MetaDataComponent>(target).EntityName;
+ }
+
+ _invSystem.TryEquip(target, equipmentEntity, slot.Name, silent: true, force: true, inventory: inventoryComponent);
+
+ onEquipped?.Invoke(target, equipmentEntity);
+ }
+ }
+
+ if (EntityManager.TryGetComponent(target, out HandsComponent? handsComponent))
+ {
+ var coords = EntityManager.GetComponent<TransformComponent>(target).Coordinates;
+ foreach (var prototype in startingGear.Inhand)
+ {
+ var inhandEntity = EntityManager.SpawnEntity(prototype, coords);
+ _handSystem.TryPickup(target, inhandEntity, checkActionBlocker: false, handsComp: handsComponent);
+ }
+ }
+
+ // See if this starting gear is associated with a job
+ var jobs = _prototypeManager.EnumeratePrototypes<JobPrototype>();
+ foreach (var job in jobs)
+ {
+ if (job.StartingGear != gear)
+ continue;
+
+ var jobProtoId = LoadoutSystem.GetJobPrototype(job.ID);
+ if (!_prototypeManager.TryIndex<RoleLoadoutPrototype>(jobProtoId, out var jobProto))
+ break;
+
+ // Don't require a player, so this works on Urists
+ profile ??= EntityManager.TryGetComponent<HumanoidAppearanceComponent>(target, out var comp)
+ ? HumanoidCharacterProfile.DefaultWithSpecies(comp.Species)
+ : new HumanoidCharacterProfile();
+ // Try to get the user's existing loadout for the role
+ profile.Loadouts.TryGetValue(jobProtoId, out var roleLoadout);
+
+ if (roleLoadout == null)
+ {
+ // If they don't have a loadout for the role, make a default one
+ roleLoadout = new RoleLoadout(jobProtoId);
+ roleLoadout.SetDefault(profile, session, _prototypeManager);
+ }
+
+ // Equip the target with the job loadout
+ _spawningSystem.EquipRoleLoadout(target, roleLoadout, jobProto);
+ }
+
+ return true;
+ }
+}
-using Content.Server.Administration.Commands;
using Content.Server.Popups;
using Content.Shared.Popups;
using Content.Shared.Mobs;
using Content.Server.Chat;
using Content.Server.Chat.Systems;
+using Content.Server.Clothing.Systems;
using Content.Shared.Chat.Prototypes;
using Robust.Shared.Random;
using Content.Shared.Stunnable;
using Content.Server.Emoting.Systems;
using Content.Server.Speech.EntitySystems;
using Content.Shared.Cluwne;
-using Content.Shared.Interaction.Components;
using Robust.Shared.Audio.Systems;
using Content.Shared.NameModifier.EntitySystems;
using Content.Shared.Clumsy;
[Dependency] private readonly ChatSystem _chat = default!;
[Dependency] private readonly AutoEmoteSystem _autoEmote = default!;
[Dependency] private readonly NameModifierSystem _nameMod = default!;
+ [Dependency] private readonly OutfitSystem _outfitSystem = default!;
public override void Initialize()
{
_nameMod.RefreshNameModifiers(uid);
- SetOutfitCommand.SetOutfit(uid, "CluwneGear", EntityManager);
+ _outfitSystem.SetOutfit(uid, "CluwneGear");
}
/// <summary>
using System.Linq;
-using Content.Server.Administration.Commands;
+using Content.Server.Clothing.Systems;
using Content.Server.GameTicking.Rules.Components;
using Content.Server.KillTracking;
using Content.Server.Mind;
{
[Dependency] private readonly IPlayerManager _player = default!;
[Dependency] private readonly MindSystem _mind = default!;
+ [Dependency] private readonly OutfitSystem _outfitSystem = default!;
[Dependency] private readonly PointSystem _point = default!;
[Dependency] private readonly RespawnRuleSystem _respawn = default!;
[Dependency] private readonly RoundEndSystem _roundEnd = default!;
var mob = mobMaybe!.Value;
_mind.TransferTo(newMind, mob);
- SetOutfitCommand.SetOutfit(mob, dm.Gear, EntityManager);
+ _outfitSystem.SetOutfit(mob, dm.Gear);
EnsureComp<KillTrackerComponent>(mob);
_respawn.AddToTracker(ev.Player.UserId, (uid, tracker));
-set-outfit-command-description = Sets the outfit of the specified entity. The entity must have {INDEFINITE($requiredComponent)} {$requiredComponent}
-set-outfit-command-help-text = Usage: {$command} <entityUid> | {$command} <entityUid> <outfitId>
-set-outfit-command-is-not-player-error = This command requires both arguments to work from the server console.
-set-outfit-command-invalid-outfit-id-error = Invalid outfit id
+cmd-setoutfit-desc = Sets the outfit of the specified entity. The entity must have {INDEFINITE($requiredComponent)} {$requiredComponent}
+cmd-setoutfit-help = Usage: setoutfit <entityUid> | setoutfit <entityUid> <outfitId>
+cmd-setoutfit-is-not-player-error = This command requires both arguments to work from the server console.
+cmd-setoutfit-invalid-outfit-id-error = Invalid outfit id.