]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Content arch (#20107)
authormetalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
Thu, 23 Nov 2023 03:34:37 +0000 (14:34 +1100)
committerGitHub <noreply@github.com>
Thu, 23 Nov 2023 03:34:37 +0000 (14:34 +1100)
Co-authored-by: DrSmugleaf <drsmugleaf@gmail.com>
33 files changed:
Content.Client/Weather/WeatherOverlay.cs [new file with mode: 0644]
Content.IntegrationTests/Tests/Interaction/InteractionTest.Helpers.cs
Content.IntegrationTests/Tests/PrototypeSaveTest.cs
Content.Server/Administration/Commands/ControlMob.cs
Content.Server/Administration/Commands/OwoifyCommand.cs
Content.Server/Administration/Commands/SetMindCommand.cs
Content.Server/Administration/Commands/SetOutfitCommand.cs
Content.Server/Administration/Systems/AdminVerbSystem.cs
Content.Server/Administration/UI/SetOutfitEui.cs
Content.Server/Humanoid/Systems/RandomHumanoidSystem.cs
Content.Server/Jobs/AddComponentSpecial.cs
Content.Server/NPC/Commands/AddNPCCommand.cs
Content.Server/Sandbox/Commands/ColorNetworkCommand.cs
Content.Server/Traitor/Uplink/Commands/AddUplinkCommand.cs
Content.Server/Verbs/Commands/InvokeVerbCommand.cs
Content.Server/Verbs/Commands/ListVerbsCommand.cs
Content.Server/Xenoarchaeology/Equipment/Systems/ArtifactAnalyzerSystem.cs
Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.Nodes.cs
Content.Shared/Anomaly/SharedAnomalySystem.cs
Content.Shared/Blocking/BlockingSystem.User.cs
Content.Shared/Chasm/ChasmSystem.cs
Content.Shared/Climbing/Systems/ClimbSystem.cs
Content.Shared/Containers/ItemSlot/ItemSlotsSystem.cs
Content.Shared/Cuffs/SharedCuffableSystem.cs
Content.Shared/Inventory/InventorySystem.Equip.cs
Content.Shared/Lock/LockSystem.cs
Content.Shared/Mech/Equipment/Systems/MechSoundboardSystem.cs
Content.Shared/RCD/Systems/RCDSystem.cs
Content.Shared/Radio/EntitySystems/EncryptionKeySystem.cs
Content.Shared/Storage/EntitySystems/SharedEntityStorageSystem.cs
Content.Shared/Stunnable/SharedStunSystem.cs
Content.Shared/Weapons/Ranged/Systems/RechargeBasicEntityAmmoSystem.cs
SpaceStation14.sln

diff --git a/Content.Client/Weather/WeatherOverlay.cs b/Content.Client/Weather/WeatherOverlay.cs
new file mode 100644 (file)
index 0000000..12af31b
--- /dev/null
@@ -0,0 +1,218 @@
+using System.Linq;
+using System.Numerics;
+using Content.Client.Parallax;
+using Content.Shared.Weather;
+using Robust.Client.GameObjects;
+using Robust.Client.Graphics;
+using Robust.Client.ResourceManagement;
+using Robust.Client.Utility;
+using Robust.Shared.Enums;
+using Robust.Shared.Graphics.RSI;
+using Robust.Shared.Map;
+using Robust.Shared.Map.Components;
+using Robust.Shared.Physics.Components;
+using Robust.Shared.Prototypes;
+using Robust.Shared.Timing;
+using Robust.Shared.Utility;
+
+namespace Content.Client.Weather;
+
+public sealed class WeatherOverlay : Overlay
+{
+    [Dependency] private readonly IClyde _clyde = default!;
+    [Dependency] private readonly IEntityManager _entManager = default!;
+    [Dependency] private readonly IGameTiming _timing = default!;
+    [Dependency] private readonly IMapManager _mapManager = default!;
+    [Dependency] private readonly IPrototypeManager _protoManager = default!;
+    [Dependency] private readonly IResourceCache _cache = default!;
+    private readonly SharedTransformSystem _transform;
+    private readonly SpriteSystem _sprite;
+    private readonly WeatherSystem _weather;
+
+    public override OverlaySpace Space => OverlaySpace.WorldSpaceBelowFOV;
+
+    private IRenderTexture? _blep;
+
+    public WeatherOverlay(SharedTransformSystem transform, SpriteSystem sprite, WeatherSystem weather)
+    {
+        ZIndex = ParallaxSystem.ParallaxZIndex + 1;
+        _transform = transform;
+        _weather = weather;
+        _sprite = sprite;
+        IoCManager.InjectDependencies(this);
+    }
+
+    protected override bool BeforeDraw(in OverlayDrawArgs args)
+    {
+        if (args.MapId == MapId.Nullspace)
+            return false;
+
+        if (!_entManager.TryGetComponent<WeatherComponent>(_mapManager.GetMapEntityId(args.MapId), out var weather) ||
+            weather.Weather.Count == 0)
+        {
+            return false;
+        }
+
+        return base.BeforeDraw(in args);
+    }
+
+    protected override void Draw(in OverlayDrawArgs args)
+    {
+        var mapUid = _mapManager.GetMapEntityId(args.MapId);
+
+        if (!_entManager.TryGetComponent<WeatherComponent>(mapUid, out var comp))
+        {
+            return;
+        }
+
+        foreach (var (proto, weather) in comp.Weather)
+        {
+            if (!_protoManager.TryIndex<WeatherPrototype>(proto, out var weatherProto))
+                continue;
+
+            var alpha = _weather.GetPercent(weather, mapUid);
+            DrawWorld(args, weatherProto, alpha);
+        }
+    }
+
+    private void DrawWorld(in OverlayDrawArgs args, WeatherPrototype weatherProto, float alpha)
+    {
+        var worldHandle = args.WorldHandle;
+        var mapId = args.MapId;
+        var worldAABB = args.WorldAABB;
+        var worldBounds = args.WorldBounds;
+        var invMatrix = args.Viewport.GetWorldToLocalMatrix();
+        var position = args.Viewport.Eye?.Position.Position ?? Vector2.Zero;
+
+        if (_blep?.Texture.Size != args.Viewport.Size)
+        {
+            _blep?.Dispose();
+            _blep = _clyde.CreateRenderTarget(args.Viewport.Size, new RenderTargetFormatParameters(RenderTargetColorFormat.Rgba8Srgb), name: "weather-stencil");
+        }
+
+        // Cut out the irrelevant bits via stencil
+        // This is why we don't just use parallax; we might want specific tiles to get drawn over
+        // particularly for planet maps or stations.
+        worldHandle.RenderInRenderTarget(_blep, () =>
+        {
+            var bodyQuery = _entManager.GetEntityQuery<PhysicsComponent>();
+            var xformQuery = _entManager.GetEntityQuery<TransformComponent>();
+            var weatherIgnoreQuery = _entManager.GetEntityQuery<IgnoreWeatherComponent>();
+
+            // idk if this is safe to cache in a field and clear sloth help
+            var grids = new List<Entity<MapGridComponent>>();
+            _mapManager.FindGridsIntersecting(mapId, worldAABB, ref grids);
+
+            foreach (var grid in grids)
+            {
+                var matrix = _transform.GetWorldMatrix(grid, xformQuery);
+                Matrix3.Multiply(in matrix, in invMatrix, out var matty);
+                worldHandle.SetTransform(matty);
+
+                foreach (var tile in grid.Comp.GetTilesIntersecting(worldAABB))
+                {
+                    // Ignored tiles for stencil
+                    if (_weather.CanWeatherAffect(grid, tile, weatherIgnoreQuery, bodyQuery))
+                    {
+                        continue;
+                    }
+
+                    var gridTile = new Box2(tile.GridIndices * grid.Comp.TileSize,
+                        (tile.GridIndices + Vector2i.One) * grid.Comp.TileSize);
+
+                    worldHandle.DrawRect(gridTile, Color.White);
+                }
+            }
+
+        }, Color.Transparent);
+
+        worldHandle.SetTransform(Matrix3.Identity);
+        worldHandle.UseShader(_protoManager.Index<ShaderPrototype>("StencilMask").Instance());
+        worldHandle.DrawTextureRect(_blep.Texture, worldBounds);
+        Texture? sprite = null;
+        var curTime = _timing.RealTime;
+
+        switch (weatherProto.Sprite)
+        {
+            case SpriteSpecifier.Rsi rsi:
+                var rsiActual = _cache.GetResource<RSIResource>(rsi.RsiPath).RSI;
+                rsiActual.TryGetState(rsi.RsiState, out var state);
+                var frames = state!.GetFrames(RsiDirection.South);
+                var delays = state.GetDelays();
+                var totalDelay = delays.Sum();
+                var time = curTime.TotalSeconds % totalDelay;
+                var delaySum = 0f;
+
+                for (var i = 0; i < delays.Length; i++)
+                {
+                    var delay = delays[i];
+                    delaySum += delay;
+
+                    if (time > delaySum)
+                        continue;
+
+                    sprite = frames[i];
+                    break;
+                }
+
+                sprite ??= _sprite.Frame0(weatherProto.Sprite);
+                break;
+            case SpriteSpecifier.Texture texture:
+                sprite = texture.GetTexture(_cache);
+                break;
+            default:
+                throw new NotImplementedException();
+        }
+
+        // Draw the rain
+        worldHandle.UseShader(_protoManager.Index<ShaderPrototype>("StencilDraw").Instance());
+
+        // TODO: This is very similar to parallax but we need stencil support but we can probably combine these somehow
+        // and not make it spaghetti, while getting the advantages of not-duped code?
+
+
+        // Okay I have spent like 5 hours on this at this point and afaict you have one of the following comprises:
+        // - No scrolling so the weather is always centered on the player
+        // - Crappy looking rotation but strafing looks okay and scrolls
+        // - Crappy looking strafing but rotation looks okay.
+        // - No rotation
+        // - Storing state across frames to do scrolling and just having it always do topdown.
+
+        // I have chosen no rotation.
+
+        const float scale = 1f;
+        const float slowness = 0f;
+        var scrolling = Vector2.Zero;
+
+        // Size of the texture in world units.
+        var size = (sprite.Size / (float) EyeManager.PixelsPerMeter) * scale;
+        var scrolled = scrolling * (float) curTime.TotalSeconds;
+
+        // Origin - start with the parallax shift itself.
+        var originBL = position * slowness + scrolled;
+
+        // Centre the image.
+        originBL -= size / 2;
+
+        // Remove offset so we can floor.
+        var flooredBL = args.WorldAABB.BottomLeft - originBL;
+
+        // Floor to background size.
+        flooredBL = (flooredBL / size).Floored() * size;
+
+        // Re-offset.
+        flooredBL += originBL;
+
+        for (var x = flooredBL.X; x < args.WorldAABB.Right; x += size.X)
+        {
+            for (var y = flooredBL.Y; y < args.WorldAABB.Top; y += size.Y)
+            {
+                var box = Box2.FromDimensions(new Vector2(x, y), size);
+                worldHandle.DrawTextureRect(sprite, box, (weatherProto.Color ?? Color.White).WithAlpha(alpha));
+            }
+        }
+
+        worldHandle.SetTransform(Matrix3.Identity);
+        worldHandle.UseShader(null);
+    }
+}
index 25171e1ea2ed19f05a0029689570c5ab10d6a493..5afa0872975933c31ffa6f71267f6f9cdda83c85 100644 (file)
@@ -500,7 +500,7 @@ public abstract partial class InteractionTest
     /// <summary>
     /// Assert whether or not the target has the given component.
     /// </summary>
-    protected void AssertComp<T>(bool hasComp = true, NetEntity? target = null)
+    protected void AssertComp<T>(bool hasComp = true, NetEntity? target = null) where T : IComponent
     {
         target ??= Target;
         if (target == null)
index 6096c497efac1eb604400cf5e8a6fc373e35c23a..207f35189f82eada2dc20d939e66026fa378fd79 100644 (file)
@@ -162,7 +162,7 @@ public sealed class PrototypeSaveTest
                     }
 
                     // An entity may also remove components on init -> check no components are missing.
-                    foreach (var (compType, comp) in prototype.Components)
+                    foreach (var compType in prototype.Components.Keys)
                     {
                         Assert.That(compNames, Does.Contain(compType), $"Prototype {prototype.ID} removes component {compType} on spawn.");
                     }
@@ -208,7 +208,7 @@ public sealed class PrototypeSaveTest
                 Assert.Fail($"Uninitialized entities should not be saving entity Uids. Component: {WritingComponent}. Prototype: {Prototype.ID}");
             }
 
-            return new ValueDataNode(value.ToString());
+            return new ValueDataNode(value.Id.ToString());
         }
 
         EntityUid ITypeReader<EntityUid, ValueDataNode>.Read(ISerializationManager serializationManager,
@@ -217,7 +217,7 @@ public sealed class PrototypeSaveTest
             SerializationHookContext hookCtx,
             ISerializationContext? context, ISerializationManager.InstantiationDelegate<EntityUid>? instanceProvider)
         {
-            return EntityUid.Parse(node.Value);
+            return EntityUid.Parse(node.Value, "0");
         }
     }
 }
index 317461a3736dfb2ac119471ce29f99e5e1177ab2..9d39cb9ddeb2e8f41bde9a2f761ecc1f83f92e5a 100644 (file)
@@ -33,15 +33,15 @@ namespace Content.Server.Administration.Commands
                 return;
             }
 
-            var target = new EntityUid(targetId);
+            var targetNet = new NetEntity(targetId);
 
-            if (!target.IsValid() || !_entities.EntityExists(target))
+            if (!_entities.TryGetEntity(targetNet, out var target))
             {
                 shell.WriteLine(Loc.GetString("shell-invalid-entity-id"));
                 return;
             }
 
-            _entities.System<MindSystem>().ControlMob(player.UserId, target);
+            _entities.System<MindSystem>().ControlMob(player.UserId, target.Value);
         }
     }
 }
index 73a1236d1947fb1883e167259a29def67bafd1ce..8ca35b1b42fa1fb916f50648700520d4b0d081c7 100644 (file)
@@ -8,6 +8,8 @@ namespace Content.Server.Administration.Commands;
 [AdminCommand(AdminFlags.Fun)]
 public sealed class OwoifyCommand : IConsoleCommand
 {
+    [Dependency] private readonly IEntityManager _entManager = default!;
+
     public string Command => "owoify";
 
     public string Description => "For when you need everything to be cat. Uses OwOAccent's formatting on the name and description of an entity.";
@@ -22,22 +24,25 @@ public sealed class OwoifyCommand : IConsoleCommand
             return;
         }
 
-        var entityManager = IoCManager.Resolve<IEntityManager>();
-
         if (!int.TryParse(args[0], out var targetId))
         {
             shell.WriteLine(Loc.GetString("shell-argument-must-be-number"));
             return;
         }
 
-        var eUid = new EntityUid(targetId);
+        var nent = new NetEntity(targetId);
+
+        if (!_entManager.TryGetEntity(nent, out var eUid))
+        {
+            return;
+        }
 
-        var meta = entityManager.GetComponent<MetaDataComponent>(eUid);
+        var meta = _entManager.GetComponent<MetaDataComponent>(eUid.Value);
 
-        var owoSys = entityManager.System<OwOAccentSystem>();
-        var metaDataSys = entityManager.System<MetaDataSystem>();
+        var owoSys = _entManager.System<OwOAccentSystem>();
+        var metaDataSys = _entManager.System<MetaDataSystem>();
 
-        metaDataSys.SetEntityName(eUid, owoSys.Accentuate(meta.EntityName), meta);
-        metaDataSys.SetEntityDescription(eUid, owoSys.Accentuate(meta.EntityDescription), meta);
+        metaDataSys.SetEntityName(eUid.Value, owoSys.Accentuate(meta.EntityName), meta);
+        metaDataSys.SetEntityDescription(eUid.Value, owoSys.Accentuate(meta.EntityDescription), meta);
     }
 }
index 5310c2dd7f5c73df0f3942ce38ec390ca91e93cc..a7b6849423e01b512d85ed5022bfcd0536562050 100644 (file)
@@ -11,6 +11,7 @@ namespace Content.Server.Administration.Commands
     [AdminCommand(AdminFlags.Admin)]
     sealed class SetMindCommand : IConsoleCommand
     {
+        [Dependency] private readonly IEntityManager _entManager = default!;
 
         public string Command => "setmind";
 
@@ -26,7 +27,7 @@ namespace Content.Server.Administration.Commands
                 return;
             }
 
-            if (!int.TryParse(args[0], out var entityUid))
+            if (!int.TryParse(args[0], out var entInt))
             {
                 shell.WriteLine(Loc.GetString("shell-entity-uid-must-be-number"));
                 return;
@@ -38,17 +39,15 @@ namespace Content.Server.Administration.Commands
                 ghostOverride = bool.Parse(args[2]);
             }
 
-            var entityManager = IoCManager.Resolve<IEntityManager>();
+            var nent = new NetEntity(entInt);
 
-            var eUid = new EntityUid(entityUid);
-
-            if (!eUid.IsValid() || !entityManager.EntityExists(eUid))
+            if (!_entManager.TryGetEntity(nent, out var eUid))
             {
                 shell.WriteLine(Loc.GetString("shell-invalid-entity-id"));
                 return;
             }
 
-            if (!entityManager.HasComponent<MindContainerComponent>(eUid))
+            if (!_entManager.HasComponent<MindContainerComponent>(eUid))
             {
                 shell.WriteLine(Loc.GetString("set-mind-command-target-has-no-mind-message"));
                 return;
@@ -68,8 +67,8 @@ namespace Content.Server.Administration.Commands
                 return;
             }
 
-            var mindSystem = entityManager.System<SharedMindSystem>();
-            var metadata = entityManager.GetComponent<MetaDataComponent>(eUid);
+            var mindSystem = _entManager.System<SharedMindSystem>();
+            var metadata = _entManager.GetComponent<MetaDataComponent>(eUid.Value);
 
             var mind = playerCData.Mind ?? mindSystem.CreateMind(session.UserId, metadata.EntityName);
 
index 97c1fa0656c63a37d48620ab361d49fda0a42718..4c66a09918493fee593745d9b7ca915205945005 100644 (file)
@@ -34,21 +34,21 @@ namespace Content.Server.Administration.Commands
                 return;
             }
 
-            if (!int.TryParse(args[0], out var entityUid))
+            if (!int.TryParse(args[0], out var entInt))
             {
                 shell.WriteLine(Loc.GetString("shell-entity-uid-must-be-number"));
                 return;
             }
 
-            var target = new EntityUid(entityUid);
+            var targetNet = new NetEntity(entInt);
 
-            if (!target.IsValid() || !_entities.EntityExists(target))
+            if (!_entities.TryGetEntity(targetNet, out var target))
             {
                 shell.WriteLine(Loc.GetString("shell-invalid-entity-id"));
                 return;
             }
 
-            if (!_entities.HasComponent<InventoryComponent?>(target))
+            if (!_entities.HasComponent<InventoryComponent>(target))
             {
                 shell.WriteLine(Loc.GetString("shell-target-entity-does-not-have-message", ("missing", "inventory")));
                 return;
@@ -63,12 +63,12 @@ namespace Content.Server.Administration.Commands
                 }
 
                 var eui = IoCManager.Resolve<EuiManager>();
-                var ui = new SetOutfitEui(target);
+                var ui = new SetOutfitEui(targetNet);
                 eui.OpenEui(ui, player);
                 return;
             }
 
-            if (!SetOutfit(target, args[1], _entities))
+            if (!SetOutfit(target.Value, args[1], _entities))
                 shell.WriteLine(Loc.GetString("set-outfit-command-invalid-outfit-id-error"));
         }
 
index bc065745f5ea0a594558ca62422efab4d1f660a6..af27db29ffd9651ff119914490fdb65fb7e75a15 100644 (file)
@@ -332,7 +332,7 @@ namespace Content.Server.Administration.Systems
                     Text = Loc.GetString("set-outfit-verb-get-data-text"),
                     Category = VerbCategory.Debug,
                     Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/VerbIcons/outfit.svg.192dpi.png")),
-                    Act = () => _euiManager.OpenEui(new SetOutfitEui(args.Target), player),
+                    Act = () => _euiManager.OpenEui(new SetOutfitEui(GetNetEntity(args.Target)), player),
                     Impact = LogImpact.Medium
                 };
                 args.Verbs.Add(verb);
index 6243657c3253143814d3c305259797629ef071b0..2812975f4d7b2caca69f8c218c88f9fe310198a2 100644 (file)
@@ -10,10 +10,9 @@ namespace Content.Server.Administration.UI
     public sealed class SetOutfitEui : BaseEui
     {
         [Dependency] private readonly IAdminManager _adminManager = default!;
-        [Dependency] private readonly IEntityManager _entManager = default!;
-        private readonly EntityUid _target;
+        private readonly NetEntity _target;
 
-        public SetOutfitEui(EntityUid entity)
+        public SetOutfitEui(NetEntity entity)
         {
             _target = entity;
             IoCManager.InjectDependencies(this);
@@ -31,7 +30,7 @@ namespace Content.Server.Administration.UI
         {
             return new SetOutfitEuiState
             {
-                TargetNetEntity = _entManager.GetNetEntity(_target)
+                TargetNetEntity = _target,
             };
         }
 
index 6a17a52c3dc54bd45562f0f76e629de224dbb981..f3607f74dc1af90e4f5d5879b8f786f7f172344d 100644 (file)
@@ -52,7 +52,7 @@ public sealed class RandomHumanoidSystem : EntitySystem
             {
                 var comp = (Component) _serialization.CreateCopy(entry.Component, notNullableOverride: true);
                 comp.Owner = humanoid; // This .owner must survive for now.
-                EntityManager.AddComponent(humanoid, comp, true);
+                EntityManager.AddComponent(humanoid, comp);
             }
         }
 
index 1b183c5c3f8ff7b97fdb9565636808a81c6e9a24..62443a1c4e0219b42fd24c97a494cfb61f5b846b 100644 (file)
@@ -27,7 +27,7 @@ namespace Content.Server.Jobs
 
                 var temp = (object) component;
                 serializationManager.CopyTo(data.Component, ref temp);
-                entityManager.AddComponent(mob, (Component) temp!, true);
+                entityManager.AddComponent(mob, (Component) temp!);
             }
         }
     }
index 070b9f35d3260ba360fa1c21c2a782f447e84c8c..c5582b7b4c3b8aaa12451abdf0732e290a0def10 100644 (file)
@@ -24,11 +24,11 @@ namespace Content.Server.NPC.Commands
                 return;
             }
 
-            var entId = new EntityUid(int.Parse(args[0]));
+            var nent = new NetEntity(int.Parse(args[0]));
 
-            if (!_entities.EntityExists(entId))
+            if (!_entities.TryGetEntity(nent, out var entId))
             {
-                shell.WriteError($"Unable to find entity with uid {entId}");
+                shell.WriteError($"Unable to find entity {nent}");
                 return;
             }
 
@@ -38,7 +38,7 @@ namespace Content.Server.NPC.Commands
                 return;
             }
 
-            var comp = _entities.AddComponent<HTNComponent>(entId);
+            var comp = _entities.AddComponent<HTNComponent>(entId.Value);
             comp.RootTask = new HTNCompoundTask()
             {
                 Task = args[1]
index cc20b7194691ca24cb5632bf1ab41ef6c3793f60..2ab29d1b2f01533ec430dfc74bd30b034de5732c 100644 (file)
@@ -11,6 +11,9 @@ namespace Content.Server.Sandbox.Commands
     [AnyCommand]
     public sealed class ColorNetworkCommand : IConsoleCommand
     {
+        [Dependency] private readonly IAdminManager _adminManager = default!;
+        [Dependency] private readonly IEntityManager _entManager = default!;
+
         public string Command => "colornetwork";
         public string Description => Loc.GetString("color-network-command-description");
         public string Help => Loc.GetString("color-network-command-help-text", ("command",Command));
@@ -30,25 +33,21 @@ namespace Content.Server.Sandbox.Commands
                 return;
             }
 
-
-
-            var entityManager = IoCManager.Resolve<IEntityManager>();
-
             if (!int.TryParse(args[0], out var targetId))
             {
                 shell.WriteLine(Loc.GetString("shell-argument-must-be-number"));
                 return;
             }
 
-            var eUid = new EntityUid(targetId);
+            var nent = new NetEntity(targetId);
 
-            if (!eUid.IsValid() || !entityManager.EntityExists(eUid))
+            if (!_entManager.TryGetEntity(nent, out var eUid))
             {
                 shell.WriteLine(Loc.GetString("shell-invalid-entity-id"));
                 return;
             }
 
-            if (!entityManager.TryGetComponent(eUid, out NodeContainerComponent? nodeContainerComponent))
+            if (!_entManager.TryGetComponent(eUid, out NodeContainerComponent? nodeContainerComponent))
             {
                 shell.WriteLine(Loc.GetString("shell-entity-is-not-node-container"));
                 return;
@@ -74,13 +73,15 @@ namespace Content.Server.Sandbox.Commands
         {
             var group = nodeContainerComponent.Nodes[nodeGroupId.ToString().ToLower()].NodeGroup;
 
-            if (group == null) return;
+            if (group == null)
+                return;
 
             foreach (var x in group.Nodes)
             {
-                if (!IoCManager.Resolve<IEntityManager>().TryGetComponent(x.Owner, out AtmosPipeColorComponent? atmosPipeColorComponent)) continue;
+                if (!_entManager.TryGetComponent(x.Owner, out AtmosPipeColorComponent? atmosPipeColorComponent))
+                    continue;
 
-                EntitySystem.Get<AtmosPipeColorSystem>().SetColor(x.Owner, atmosPipeColorComponent, color);
+                _entManager.System<AtmosPipeColorSystem>().SetColor(x.Owner, atmosPipeColorComponent, color);
             }
         }
     }
index fd656a9f7174173d1878fde789d37d2f2cc47cc8..cdaed3f928e9044f464cfd9bd5472b6bd0f2ceb6 100644 (file)
@@ -12,6 +12,10 @@ namespace Content.Server.Traitor.Uplink.Commands
     [AdminCommand(AdminFlags.Admin)]
     public sealed class AddUplinkCommand : IConsoleCommand
     {
+        [Dependency] private readonly IConfigurationManager _cfgManager = default!;
+        [Dependency] private readonly IEntityManager _entManager = default!;
+        [Dependency] private readonly IPlayerManager _playerManager = default!;
+
         public string Command => "adduplink";
 
         public string Description => Loc.GetString("add-uplink-command-description");
@@ -41,7 +45,7 @@ namespace Content.Server.Traitor.Uplink.Commands
             if (args.Length > 0)
             {
                 // Get player entity
-                if (!IoCManager.Resolve<IPlayerManager>().TryGetSessionByUsername(args[0], out session))
+                if (!_playerManager.TryGetSessionByUsername(args[0], out session))
                 {
                     shell.WriteLine(Loc.GetString("shell-target-player-does-not-exist"));
                     return;
@@ -60,7 +64,6 @@ namespace Content.Server.Traitor.Uplink.Commands
 
             // Get target item
             EntityUid? uplinkEntity = null;
-            var entityManager = IoCManager.Resolve<IEntityManager>();
             if (args.Length >= 2)
             {
                 if (!int.TryParse(args[1], out var itemID))
@@ -69,8 +72,9 @@ namespace Content.Server.Traitor.Uplink.Commands
                     return;
                 }
 
-                var eUid = new EntityUid(itemID);
-                if (!eUid.IsValid() || !entityManager.EntityExists(eUid))
+                var eNet = new NetEntity(itemID);
+
+                if (!_entManager.TryGetEntity(eNet, out var eUid))
                 {
                     shell.WriteLine(Loc.GetString("shell-invalid-entity-id"));
                     return;
@@ -80,11 +84,10 @@ namespace Content.Server.Traitor.Uplink.Commands
             }
 
             // Get TC count
-            var configManager = IoCManager.Resolve<IConfigurationManager>();
-            var tcCount = configManager.GetCVar(CCVars.TraitorStartingBalance);
-            Logger.Debug(entityManager.ToPrettyString(user));
+            var tcCount = _cfgManager.GetCVar(CCVars.TraitorStartingBalance);
+            Logger.Debug(_entManager.ToPrettyString(user));
             // Finally add uplink
-            var uplinkSys = entityManager.EntitySysManager.GetEntitySystem<UplinkSystem>();
+            var uplinkSys = _entManager.System<UplinkSystem>();
             if (!uplinkSys.AddUplink(user, FixedPoint2.New(tcCount), uplinkEntity: uplinkEntity))
             {
                 shell.WriteLine(Loc.GetString("add-uplink-command-error-2"));
index af2131fb55129dac4e120abb626c95fb845167c3..3309ef81530985af5c2eb84e9ed1b07ba2a35cda 100644 (file)
@@ -9,6 +9,8 @@ namespace Content.Server.Verbs.Commands
     [AdminCommand(AdminFlags.Admin)]
     public sealed class InvokeVerbCommand : IConsoleCommand
     {
+        [Dependency] private readonly IEntityManager _entManager = default!;
+
         public string Command => "invokeverb";
         public string Description => Loc.GetString("invoke-verb-command-description");
         public string Help => Loc.GetString("invoke-verb-command-help");
@@ -21,8 +23,7 @@ namespace Content.Server.Verbs.Commands
                 return;
             }
 
-            var entityManager = IoCManager.Resolve<IEntityManager>();
-            var verbSystem = entityManager.System<SharedVerbSystem>();
+            var verbSystem = _entManager.System<SharedVerbSystem>();
 
             // get the 'player' entity (defaulting to command user, otherwise uses a uid)
             EntityUid? playerEntity = null;
@@ -38,10 +39,6 @@ namespace Content.Server.Verbs.Commands
                     return;
                 }
             }
-            else
-            {
-                entityManager.EntityExists(new EntityUid(intPlayerUid));
-            }
 
             // gets the target entity
             if (!int.TryParse(args[1], out var intUid))
@@ -56,16 +53,16 @@ namespace Content.Server.Verbs.Commands
                 return;
             }
 
-            var target = new EntityUid(intUid);
-            if (!entityManager.EntityExists(target))
+            var targetNet = new NetEntity(intUid);
+
+            if (!_entManager.TryGetEntity(targetNet, out var target))
             {
                 shell.WriteError(Loc.GetString("invoke-verb-command-invalid-target-entity"));
                 return;
             }
 
             var verbName = args[2].ToLowerInvariant();
-            var verbs = verbSystem.GetLocalVerbs(target, playerEntity.Value, Verb.VerbTypes, true);
-
+            var verbs = verbSystem.GetLocalVerbs(target.Value, playerEntity.Value, Verb.VerbTypes, true);
 
             // if the "verb name" is actually a verb-type, try run any verb of that type.
             var verbType = Verb.VerbTypes.FirstOrDefault(x => x.Name == verbName);
@@ -74,7 +71,7 @@ namespace Content.Server.Verbs.Commands
                 var verb = verbs.FirstOrDefault(v => v.GetType() == verbType);
                 if (verb != null)
                 {
-                    verbSystem.ExecuteVerb(verb, playerEntity.Value, target, forced: true);
+                    verbSystem.ExecuteVerb(verb, playerEntity.Value, target.Value, forced: true);
                     shell.WriteLine(Loc.GetString("invoke-verb-command-success", ("verb", verbName), ("target", target), ("player", playerEntity)));
                     return;
                 }
@@ -84,7 +81,7 @@ namespace Content.Server.Verbs.Commands
             {
                 if (verb.Text.ToLowerInvariant() == verbName)
                 {
-                    verbSystem.ExecuteVerb(verb, playerEntity.Value, target, forced: true);
+                    verbSystem.ExecuteVerb(verb, playerEntity.Value, target.Value, forced: true);
                     shell.WriteLine(Loc.GetString("invoke-verb-command-success", ("verb", verb.Text), ("target", target), ("player", playerEntity)));
                     return;
                 }
index dc56cffb444b3a8b61ebd584872cf957584d3fe2..fd159e37bbc8ce3521628a96eabe72eb9aab7a05 100644 (file)
@@ -8,6 +8,8 @@ namespace Content.Server.Verbs.Commands
     [AdminCommand(AdminFlags.Admin)]
     public sealed class ListVerbsCommand : IConsoleCommand
     {
+        [Dependency] private readonly IEntityManager _entManager = default!;
+
         public string Command => "listverbs";
         public string Description => Loc.GetString("list-verbs-command-description");
         public string Help => Loc.GetString("list-verbs-command-help");
@@ -20,11 +22,11 @@ namespace Content.Server.Verbs.Commands
                 return;
             }
 
-            var entityManager = IoCManager.Resolve<IEntityManager>();
-            var verbSystem = EntitySystem.Get<SharedVerbSystem>();
+            var verbSystem = _entManager.System<SharedVerbSystem>();
 
             // get the 'player' entity (defaulting to command user, otherwise uses a uid)
             EntityUid? playerEntity = null;
+
             if (!int.TryParse(args[0], out var intPlayerUid))
             {
                 if (args[0] == "self" && shell.Player?.AttachedEntity != null)
@@ -37,10 +39,6 @@ namespace Content.Server.Verbs.Commands
                     return;
                 }
             }
-            else
-            {
-                entityManager.EntityExists(new EntityUid(intPlayerUid));
-            }
 
             // gets the target entity
             if (!int.TryParse(args[1], out var intUid))
@@ -55,14 +53,15 @@ namespace Content.Server.Verbs.Commands
                 return;
             }
 
-            var target = new EntityUid(intUid);
-            if (!entityManager.EntityExists(target))
+            var targetNet = new NetEntity(intUid);
+
+            if (!_entManager.TryGetEntity(targetNet, out var target))
             {
                 shell.WriteError(Loc.GetString("list-verbs-command-invalid-target-entity"));
                 return;
             }
 
-            var verbs = verbSystem.GetLocalVerbs(target, playerEntity.Value, Verb.VerbTypes);
+            var verbs = verbSystem.GetLocalVerbs(target.Value, playerEntity.Value, Verb.VerbTypes);
 
             foreach (var verb in verbs)
             {
index 9200928d662459b66e09483b73c01cde93ca1564..343826c7aecc3c0c581545ac051242f99a5196a3 100644 (file)
@@ -180,7 +180,9 @@ public sealed class ArtifactAnalyzerSystem : EntitySystem
             component.AnalyzerEntity = null;
         }
 
-        UpdateUserInterface(uid, component);
+        // TODO: Yeah this comp relies upon event ordering so we get this for now.
+        if (!TerminatingOrDeleted(uid))
+            UpdateUserInterface(uid, component);
     }
 
     private void UpdateUserInterface(EntityUid uid, AnalysisConsoleComponent? component = null)
index e6f937236df0a66f83e287af9deaf9abc26fe011..ab4670b90568c04f75913de66849a99de2afa6d9 100644 (file)
@@ -204,7 +204,7 @@ public sealed partial class ArtifactSystem
             var temp = (object) comp;
             _serialization.CopyTo(entry.Component, ref temp);
 
-            EntityManager.AddComponent(uid, (Component) temp!, true);
+            EntityManager.AddComponent(uid, (Component) temp!);
         }
 
         node.Discovered = true;
@@ -238,7 +238,7 @@ public sealed partial class ArtifactSystem
                 comp.Owner = uid;
                 var temp = (object) comp;
                 _serialization.CopyTo(entry, ref temp);
-                EntityManager.AddComponent(uid, (Component) temp!, true);
+                EntityManager.AddComponent(uid, (Component) temp!);
                 continue;
             }
 
index 48413ac0018931693ae7fe69142aca4636b4959e..e3678d1459f77c3a49009bec494a789e89cf057e 100644 (file)
@@ -109,7 +109,7 @@ public abstract class SharedAnomalySystem : EntitySystem
         var pulse = EnsureComp<AnomalyPulsingComponent>(uid);
         pulse.EndTime  = Timing.CurTime + pulse.PulseDuration;
         Appearance.SetData(uid, AnomalyVisuals.IsPulsing, true);
-        
+
         var ev = new AnomalyPulseEvent(uid, component.Stability, component.Severity);
         RaiseLocalEvent(uid, ref ev, true);
     }
index bfefaf2b92d6f6124f6c4d7ee1b06e48a34cec66..237cdfa488d95b2245cbbb289442e34a0f6e2305 100644 (file)
@@ -1,5 +1,4 @@
 using Content.Shared.Damage;
-using Content.Shared.Damage.Prototypes;
 using Robust.Shared.Audio;
 using Robust.Shared.Containers;
 
index 7353bd0e9c74c6a6aa36ef9f53dcd4339f349759..c63691c3f9d09e3a55b521927c0658a3ac5762d8 100644 (file)
@@ -1,9 +1,7 @@
 using Content.Shared.ActionBlocker;
-using Content.Shared.Buckle.Components;
 using Content.Shared.Movement.Events;
 using Content.Shared.StepTrigger.Systems;
 using Robust.Shared.Network;
-using Robust.Shared.Physics.Components;
 using Robust.Shared.Timing;
 
 namespace Content.Shared.Chasm;
index f065d19dd30df4db26bad61452eda27d14366006..50ae6fb56c8bd7f60e4fb45e6984a87e9e16b269 100644 (file)
@@ -1,4 +1,3 @@
-using System.Numerics;
 using Content.Shared.ActionBlocker;
 using Content.Shared.Body.Components;
 using Content.Shared.Body.Part;
@@ -13,7 +12,6 @@ using Content.Shared.Hands.Components;
 using Content.Shared.IdentityManagement;
 using Content.Shared.Interaction;
 using Content.Shared.Movement.Events;
-using Content.Shared.Movement.Systems;
 using Content.Shared.Physics;
 using Content.Shared.Popups;
 using Content.Shared.Stunnable;
index 9194a8208e315d3dd94527214636905bef3a6616..789ff37dcf6d6dde56c7e2ea6bc60d70d4b0daf6 100644 (file)
@@ -110,7 +110,7 @@ namespace Content.Shared.Containers.ItemSlots
         /// </summary>
         public void RemoveItemSlot(EntityUid uid, ItemSlot slot, ItemSlotsComponent? itemSlots = null)
         {
-            if (Terminating(uid) || slot.ContainerSlot == null)
+            if (TerminatingOrDeleted(uid) || slot.ContainerSlot == null)
                 return;
 
             slot.ContainerSlot.Shutdown();
index 5dbe62aa6ae92357bf853a275b76d9f21e0984c0..f47daf5ee2afac07ae36c596a1a798d81a671171 100644 (file)
@@ -3,7 +3,6 @@ using Content.Shared.ActionBlocker;
 using Content.Shared.Administration.Components;
 using Content.Shared.Administration.Logs;
 using Content.Shared.Alert;
-using Content.Shared.Atmos.Piping.Unary.Components;
 using Content.Shared.Buckle.Components;
 using Content.Shared.Cuffs.Components;
 using Content.Shared.Damage;
index 7b6ccaf0d485deed6f1f3bb1096fa428bf907205..6f373db115f8b431ce47dd5792b239f3bd9047d7 100644 (file)
@@ -14,7 +14,6 @@ using Robust.Shared.Audio;
 using Robust.Shared.Containers;
 using Robust.Shared.Network;
 using Robust.Shared.Player;
-using Robust.Shared.Prototypes;
 using Robust.Shared.Timing;
 
 namespace Content.Shared.Inventory;
@@ -24,9 +23,9 @@ public abstract partial class InventorySystem
     [Dependency] private readonly SharedPopupSystem _popup = default!;
     [Dependency] private readonly MovementSpeedModifierSystem _movementSpeed = default!;
     [Dependency] private readonly SharedInteractionSystem _interactionSystem = default!;
-    [Dependency] private readonly SharedItemSystem _item = default!;
     [Dependency] private readonly SharedContainerSystem _containerSystem = default!;
     [Dependency] private readonly SharedHandsSystem _handsSystem = default!;
+    [Dependency] private readonly SharedItemSystem _item = default!;
     [Dependency] private readonly IGameTiming _gameTiming = default!;
     [Dependency] private readonly INetManager _netMan = default!;
     [Dependency] private readonly SharedTransformSystem _transform = default!;
index 97baa28bf90d7c8c755f8255d60da425fb48c105..71a9f7d1c8452a2e84561afc5c0c897f88f52f49 100644 (file)
@@ -106,7 +106,7 @@ public sealed class LockSystem : EntitySystem
 
         lockComp.Locked = true;
         _appearanceSystem.SetData(uid, StorageVisuals.Locked, true);
-        Dirty(lockComp);
+        Dirty(uid, lockComp);
 
         var ev = new LockToggledEvent(true);
         RaiseLocalEvent(uid, ref ev, true);
@@ -134,7 +134,7 @@ public sealed class LockSystem : EntitySystem
 
         lockComp.Locked = false;
         _appearanceSystem.SetData(uid, StorageVisuals.Locked, false);
-        Dirty(lockComp);
+        Dirty(uid, lockComp);
 
         var ev = new LockToggledEvent(false);
         RaiseLocalEvent(uid, ref ev, true);
index b4254fe0798d2c1b6dc56b1358cc229df790d860..c58a09a4f40e94aa7dc520134def215b0cbb5e6c 100644 (file)
@@ -1,8 +1,5 @@
-using Content.Shared.Mech;
 using Content.Shared.Mech.Equipment.Components;
-using Content.Shared.Mech.Equipment.Systems;
 using Content.Shared.Timing;
-using Robust.Shared.Audio;
 using System.Linq;
 
 namespace Content.Shared.Mech.Equipment.Systems;
index ccc47a2fdeb8905f66913191b3efec836c0989e0..cfdab20fb84aa791f9e6e214e2d2e5b36ee7501e 100644 (file)
@@ -12,7 +12,6 @@ using Content.Shared.Popups;
 using Content.Shared.RCD.Components;
 using Content.Shared.Tag;
 using Content.Shared.Tiles;
-using Robust.Shared.Audio;
 using Robust.Shared.Map;
 using Robust.Shared.Map.Components;
 using Robust.Shared.Network;
index eb97fe41133b5bb3bbd3e2e8c7b348b73efd8652..2f1b3ac46133774d82bc845c3b9efb1c7cc13367 100644 (file)
@@ -6,7 +6,6 @@ using Content.Shared.Hands.EntitySystems;
 using Content.Shared.Interaction;
 using Content.Shared.Popups;
 using Content.Shared.Radio.Components;
-using Content.Shared.Tools;
 using Content.Shared.Tools.Components;
 using Content.Shared.Wires;
 using Robust.Shared.Containers;
index f84a65398dca36210ce158c5700086c6b8b6daea..bbf4b42da43aa2a7d9414416317a85bbb040e77e 100644 (file)
@@ -20,9 +20,7 @@ using Robust.Shared.GameStates;
 using Robust.Shared.Map;
 using Robust.Shared.Network;
 using Robust.Shared.Physics;
-using Robust.Shared.Physics.Components;
 using Robust.Shared.Physics.Systems;
-using Robust.Shared.Prototypes;
 using Robust.Shared.Timing;
 using Robust.Shared.Utility;
 
index 4875f2f68f8d9a04b578437ac1ed529a81513b85..289dcabd1d7245f9e3a25fda44cf00f80ff2fcbd 100644 (file)
@@ -1,7 +1,5 @@
 using Content.Shared.ActionBlocker;
 using Content.Shared.Administration.Logs;
-using Content.Shared.Audio;
-using Content.Shared.DragDrop;
 using Content.Shared.Interaction;
 using Content.Shared.Interaction.Events;
 using Content.Shared.Inventory.Events;
@@ -11,15 +9,11 @@ using Content.Shared.Database;
 using Content.Shared.Hands;
 using Content.Shared.Mobs;
 using Content.Shared.Mobs.Components;
-using Content.Shared.Mobs.Systems;
 using Content.Shared.Movement.Events;
 using Content.Shared.Movement.Systems;
 using Content.Shared.Standing;
 using Content.Shared.StatusEffect;
 using Content.Shared.Throwing;
-using Robust.Shared.Audio;
-using Robust.Shared.GameStates;
-using Robust.Shared.Player;
 
 namespace Content.Shared.Stunnable;
 
index ded4ce34a231ab681bc86d087ae0dedb5dbf93f6..13e07b922fa9a708f47ce283f42a8490e03e92f4 100644 (file)
@@ -1,9 +1,7 @@
 using Content.Shared.Examine;
 using Content.Shared.Weapons.Ranged.Components;
 using Robust.Shared.Network;
-using Robust.Shared.Player;
 using Robust.Shared.Timing;
-using Robust.Shared.Utility;
 
 namespace Content.Shared.Weapons.Ranged.Systems;
 
index 10c4ea1c2c42190a423129b7948df91ca6f584e0..7c8c703fe3f74ccc2c7b6f626e11b66470de0298 100644 (file)
@@ -126,6 +126,9 @@ EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Robust.Serialization.Generator", "RobustToolbox\Robust.Serialization.Generator\Robust.Serialization.Generator.csproj", "{6FBF108E-5CB5-47DE-8D7E-B496ABA9E3E2}"
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Content.PatreonParser", "Content.PatreonParser\Content.PatreonParser.csproj", "{D97D8258-D915-4D1D-B1E3-1A8D00CF9EB5}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Arch", "RobustToolbox\Arch\Arch.csproj", "{FCF7C99C-EC56-4DF4-A101-8C42E8EDB6EE}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Arch.SourceGen", "RobustToolbox\Arch\Arch\src\Arch.SourceGen\Arch.SourceGen.csproj", "{6EA70D29-EE1B-431B-A396-294CBD52D2D4}"
 EndProject
 Global
        GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -438,6 +441,22 @@ Global
                {D97D8258-D915-4D1D-B1E3-1A8D00CF9EB5}.DebugOpt|Any CPU.Build.0 = Debug|Any CPU
                {D97D8258-D915-4D1D-B1E3-1A8D00CF9EB5}.Tools|Any CPU.ActiveCfg = Debug|Any CPU
                {D97D8258-D915-4D1D-B1E3-1A8D00CF9EB5}.Tools|Any CPU.Build.0 = Debug|Any CPU
+               {FCF7C99C-EC56-4DF4-A101-8C42E8EDB6EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+               {FCF7C99C-EC56-4DF4-A101-8C42E8EDB6EE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+               {FCF7C99C-EC56-4DF4-A101-8C42E8EDB6EE}.Release|Any CPU.ActiveCfg = Release|Any CPU
+               {FCF7C99C-EC56-4DF4-A101-8C42E8EDB6EE}.Release|Any CPU.Build.0 = Release|Any CPU
+               {FCF7C99C-EC56-4DF4-A101-8C42E8EDB6EE}.DebugOpt|Any CPU.ActiveCfg = Debug|Any CPU
+               {FCF7C99C-EC56-4DF4-A101-8C42E8EDB6EE}.DebugOpt|Any CPU.Build.0 = Debug|Any CPU
+               {FCF7C99C-EC56-4DF4-A101-8C42E8EDB6EE}.Tools|Any CPU.ActiveCfg = Debug|Any CPU
+               {FCF7C99C-EC56-4DF4-A101-8C42E8EDB6EE}.Tools|Any CPU.Build.0 = Debug|Any CPU
+               {6EA70D29-EE1B-431B-A396-294CBD52D2D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+               {6EA70D29-EE1B-431B-A396-294CBD52D2D4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+               {6EA70D29-EE1B-431B-A396-294CBD52D2D4}.Release|Any CPU.ActiveCfg = Release|Any CPU
+               {6EA70D29-EE1B-431B-A396-294CBD52D2D4}.Release|Any CPU.Build.0 = Release|Any CPU
+               {6EA70D29-EE1B-431B-A396-294CBD52D2D4}.DebugOpt|Any CPU.ActiveCfg = Debug|Any CPU
+               {6EA70D29-EE1B-431B-A396-294CBD52D2D4}.DebugOpt|Any CPU.Build.0 = Debug|Any CPU
+               {6EA70D29-EE1B-431B-A396-294CBD52D2D4}.Tools|Any CPU.ActiveCfg = Debug|Any CPU
+               {6EA70D29-EE1B-431B-A396-294CBD52D2D4}.Tools|Any CPU.Build.0 = Debug|Any CPU
        EndGlobalSection
        GlobalSection(SolutionProperties) = preSolution
                HideSolutionNode = FALSE
@@ -469,6 +488,8 @@ Global
                {A965CB3B-FD31-44AF-8872-85ABA436098D} = {83B4CBBA-547A-42F0-A7CD-8A67D93196CE}
                {07CA34A1-1D37-4771-A2E3-495A1044AE0B} = {83B4CBBA-547A-42F0-A7CD-8A67D93196CE}
                {6FBF108E-5CB5-47DE-8D7E-B496ABA9E3E2} = {83B4CBBA-547A-42F0-A7CD-8A67D93196CE}
+               {FCF7C99C-EC56-4DF4-A101-8C42E8EDB6EE} = {83B4CBBA-547A-42F0-A7CD-8A67D93196CE}
+               {6EA70D29-EE1B-431B-A396-294CBD52D2D4} = {83B4CBBA-547A-42F0-A7CD-8A67D93196CE}
        EndGlobalSection
        GlobalSection(ExtensibilityGlobals) = postSolution
                SolutionGuid = {AA37ED9F-F8D6-468E-A101-658AD605B09A}