]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Fix Set Outfit command/verb (#29672)
authorTayrtahn <tayrtahn@gmail.com>
Thu, 19 Sep 2024 08:02:37 +0000 (04:02 -0400)
committerGitHub <noreply@github.com>
Thu, 19 Sep 2024 08:02:37 +0000 (18:02 +1000)
* Filter Set Outfit menu to exclude loadout sets

* Apply loadouts to job outfits

* Use appropriate species for Urists

* squishy

---------

Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com>
Content.Client/Administration/UI/SetOutfit/SetOutfitMenu.xaml.cs
Content.Server/Administration/Commands/SetOutfitCommand.cs

index 7cb32b43df59f3e5fb274473cddabe6a5cb5101a..615f1434df229d470c222e74346f153dada5be85 100644 (file)
@@ -1,14 +1,13 @@
+using System.Linq;
 using System.Numerics;
 using Content.Client.UserInterface.Controls;
+using Content.Shared.Preferences.Loadouts;
 using Content.Shared.Roles;
 using Robust.Client.AutoGenerated;
 using Robust.Client.Console;
 using Robust.Client.UserInterface.Controls;
 using Robust.Client.UserInterface.CustomControls;
 using Robust.Client.UserInterface.XAML;
-using Robust.Shared.GameObjects;
-using Robust.Shared.IoC;
-using Robust.Shared.Localization;
 using Robust.Shared.Prototypes;
 
 namespace Content.Client.Administration.UI.SetOutfit
@@ -65,9 +64,18 @@ namespace Content.Client.Administration.UI.SetOutfit
             PopulateByFilter(SearchBar.Text);
         }
 
+        private IEnumerable<StartingGearPrototype> GetPrototypes()
+        {
+            // Filter out any StartingGearPrototypes that belong to loadouts
+            var loadouts = _prototypeManager.EnumeratePrototypes<LoadoutPrototype>();
+            var loadoutGears = loadouts.Select(l => l.StartingGear);
+            return _prototypeManager.EnumeratePrototypes<StartingGearPrototype>()
+                .Where(p => !loadoutGears.Contains(p.ID));
+        }
+
         private void PopulateList()
         {
-            foreach (var gear in _prototypeManager.EnumeratePrototypes<StartingGearPrototype>())
+            foreach (var gear in GetPrototypes())
             {
                 OutfitList.Add(GetItem(gear, OutfitList));
             }
@@ -76,7 +84,7 @@ namespace Content.Client.Administration.UI.SetOutfit
         private void PopulateByFilter(string filter)
         {
             OutfitList.Clear();
-            foreach (var gear in _prototypeManager.EnumeratePrototypes<StartingGearPrototype>())
+            foreach (var gear in GetPrototypes())
             {
                 if (!string.IsNullOrEmpty(filter) &&
                     gear.ID.ToLowerInvariant().Contains(filter.Trim().ToLowerInvariant()))
index ff4d34705a6c0819c053044c8228059aa5096a7a..9240e7b91b666f7cfb31d8733fb6a14815577391 100644 (file)
@@ -4,11 +4,15 @@ 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;
@@ -82,9 +86,11 @@ namespace Content.Server.Administration.Commands
                 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);
@@ -128,6 +134,36 @@ namespace Content.Server.Administration.Commands
                 }
             }
 
+            // 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;
         }
     }