Content arch (#20107)

Co-authored-by: DrSmugleaf <drsmugleaf@gmail.com>
This commit is contained in:
metalgearsloth
2023-11-23 14:34:37 +11:00
committed by GitHub
parent 7d2e8c7087
commit 93bd9972f1
33 changed files with 331 additions and 109 deletions

View File

@@ -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);
}
}

View File

@@ -500,7 +500,7 @@ public abstract partial class InteractionTest
/// <summary> /// <summary>
/// Assert whether or not the target has the given component. /// Assert whether or not the target has the given component.
/// </summary> /// </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; target ??= Target;
if (target == null) if (target == null)

View File

@@ -162,7 +162,7 @@ public sealed class PrototypeSaveTest
} }
// An entity may also remove components on init -> check no components are missing. // 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."); 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}"); 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, EntityUid ITypeReader<EntityUid, ValueDataNode>.Read(ISerializationManager serializationManager,
@@ -217,7 +217,7 @@ public sealed class PrototypeSaveTest
SerializationHookContext hookCtx, SerializationHookContext hookCtx,
ISerializationContext? context, ISerializationManager.InstantiationDelegate<EntityUid>? instanceProvider) ISerializationContext? context, ISerializationManager.InstantiationDelegate<EntityUid>? instanceProvider)
{ {
return EntityUid.Parse(node.Value); return EntityUid.Parse(node.Value, "0");
} }
} }
} }

View File

@@ -33,15 +33,15 @@ namespace Content.Server.Administration.Commands
return; 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")); shell.WriteLine(Loc.GetString("shell-invalid-entity-id"));
return; return;
} }
_entities.System<MindSystem>().ControlMob(player.UserId, target); _entities.System<MindSystem>().ControlMob(player.UserId, target.Value);
} }
} }
} }

View File

@@ -8,6 +8,8 @@ namespace Content.Server.Administration.Commands;
[AdminCommand(AdminFlags.Fun)] [AdminCommand(AdminFlags.Fun)]
public sealed class OwoifyCommand : IConsoleCommand public sealed class OwoifyCommand : IConsoleCommand
{ {
[Dependency] private readonly IEntityManager _entManager = default!;
public string Command => "owoify"; 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."; 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; return;
} }
var entityManager = IoCManager.Resolve<IEntityManager>();
if (!int.TryParse(args[0], out var targetId)) if (!int.TryParse(args[0], out var targetId))
{ {
shell.WriteLine(Loc.GetString("shell-argument-must-be-number")); shell.WriteLine(Loc.GetString("shell-argument-must-be-number"));
return; return;
} }
var eUid = new EntityUid(targetId); var nent = new NetEntity(targetId);
var meta = entityManager.GetComponent<MetaDataComponent>(eUid); if (!_entManager.TryGetEntity(nent, out var eUid))
{
return;
}
var owoSys = entityManager.System<OwOAccentSystem>(); var meta = _entManager.GetComponent<MetaDataComponent>(eUid.Value);
var metaDataSys = entityManager.System<MetaDataSystem>();
metaDataSys.SetEntityName(eUid, owoSys.Accentuate(meta.EntityName), meta); var owoSys = _entManager.System<OwOAccentSystem>();
metaDataSys.SetEntityDescription(eUid, owoSys.Accentuate(meta.EntityDescription), meta); var metaDataSys = _entManager.System<MetaDataSystem>();
metaDataSys.SetEntityName(eUid.Value, owoSys.Accentuate(meta.EntityName), meta);
metaDataSys.SetEntityDescription(eUid.Value, owoSys.Accentuate(meta.EntityDescription), meta);
} }
} }

View File

@@ -11,6 +11,7 @@ namespace Content.Server.Administration.Commands
[AdminCommand(AdminFlags.Admin)] [AdminCommand(AdminFlags.Admin)]
sealed class SetMindCommand : IConsoleCommand sealed class SetMindCommand : IConsoleCommand
{ {
[Dependency] private readonly IEntityManager _entManager = default!;
public string Command => "setmind"; public string Command => "setmind";
@@ -26,7 +27,7 @@ namespace Content.Server.Administration.Commands
return; 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")); shell.WriteLine(Loc.GetString("shell-entity-uid-must-be-number"));
return; return;
@@ -38,17 +39,15 @@ namespace Content.Server.Administration.Commands
ghostOverride = bool.Parse(args[2]); ghostOverride = bool.Parse(args[2]);
} }
var entityManager = IoCManager.Resolve<IEntityManager>(); var nent = new NetEntity(entInt);
var eUid = new EntityUid(entityUid); if (!_entManager.TryGetEntity(nent, out var eUid))
if (!eUid.IsValid() || !entityManager.EntityExists(eUid))
{ {
shell.WriteLine(Loc.GetString("shell-invalid-entity-id")); shell.WriteLine(Loc.GetString("shell-invalid-entity-id"));
return; return;
} }
if (!entityManager.HasComponent<MindContainerComponent>(eUid)) if (!_entManager.HasComponent<MindContainerComponent>(eUid))
{ {
shell.WriteLine(Loc.GetString("set-mind-command-target-has-no-mind-message")); shell.WriteLine(Loc.GetString("set-mind-command-target-has-no-mind-message"));
return; return;
@@ -68,8 +67,8 @@ namespace Content.Server.Administration.Commands
return; return;
} }
var mindSystem = entityManager.System<SharedMindSystem>(); var mindSystem = _entManager.System<SharedMindSystem>();
var metadata = entityManager.GetComponent<MetaDataComponent>(eUid); var metadata = _entManager.GetComponent<MetaDataComponent>(eUid.Value);
var mind = playerCData.Mind ?? mindSystem.CreateMind(session.UserId, metadata.EntityName); var mind = playerCData.Mind ?? mindSystem.CreateMind(session.UserId, metadata.EntityName);

View File

@@ -34,21 +34,21 @@ namespace Content.Server.Administration.Commands
return; 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")); shell.WriteLine(Loc.GetString("shell-entity-uid-must-be-number"));
return; 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")); shell.WriteLine(Loc.GetString("shell-invalid-entity-id"));
return; return;
} }
if (!_entities.HasComponent<InventoryComponent?>(target)) if (!_entities.HasComponent<InventoryComponent>(target))
{ {
shell.WriteLine(Loc.GetString("shell-target-entity-does-not-have-message", ("missing", "inventory"))); shell.WriteLine(Loc.GetString("shell-target-entity-does-not-have-message", ("missing", "inventory")));
return; return;
@@ -63,12 +63,12 @@ namespace Content.Server.Administration.Commands
} }
var eui = IoCManager.Resolve<EuiManager>(); var eui = IoCManager.Resolve<EuiManager>();
var ui = new SetOutfitEui(target); var ui = new SetOutfitEui(targetNet);
eui.OpenEui(ui, player); eui.OpenEui(ui, player);
return; 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")); shell.WriteLine(Loc.GetString("set-outfit-command-invalid-outfit-id-error"));
} }

View File

@@ -332,7 +332,7 @@ namespace Content.Server.Administration.Systems
Text = Loc.GetString("set-outfit-verb-get-data-text"), Text = Loc.GetString("set-outfit-verb-get-data-text"),
Category = VerbCategory.Debug, Category = VerbCategory.Debug,
Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/VerbIcons/outfit.svg.192dpi.png")), 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 Impact = LogImpact.Medium
}; };
args.Verbs.Add(verb); args.Verbs.Add(verb);

View File

@@ -10,10 +10,9 @@ namespace Content.Server.Administration.UI
public sealed class SetOutfitEui : BaseEui public sealed class SetOutfitEui : BaseEui
{ {
[Dependency] private readonly IAdminManager _adminManager = default!; [Dependency] private readonly IAdminManager _adminManager = default!;
[Dependency] private readonly IEntityManager _entManager = default!; private readonly NetEntity _target;
private readonly EntityUid _target;
public SetOutfitEui(EntityUid entity) public SetOutfitEui(NetEntity entity)
{ {
_target = entity; _target = entity;
IoCManager.InjectDependencies(this); IoCManager.InjectDependencies(this);
@@ -31,7 +30,7 @@ namespace Content.Server.Administration.UI
{ {
return new SetOutfitEuiState return new SetOutfitEuiState
{ {
TargetNetEntity = _entManager.GetNetEntity(_target) TargetNetEntity = _target,
}; };
} }

View File

@@ -52,7 +52,7 @@ public sealed class RandomHumanoidSystem : EntitySystem
{ {
var comp = (Component) _serialization.CreateCopy(entry.Component, notNullableOverride: true); var comp = (Component) _serialization.CreateCopy(entry.Component, notNullableOverride: true);
comp.Owner = humanoid; // This .owner must survive for now. comp.Owner = humanoid; // This .owner must survive for now.
EntityManager.AddComponent(humanoid, comp, true); EntityManager.AddComponent(humanoid, comp);
} }
} }

View File

@@ -27,7 +27,7 @@ namespace Content.Server.Jobs
var temp = (object) component; var temp = (object) component;
serializationManager.CopyTo(data.Component, ref temp); serializationManager.CopyTo(data.Component, ref temp);
entityManager.AddComponent(mob, (Component) temp!, true); entityManager.AddComponent(mob, (Component) temp!);
} }
} }
} }

View File

@@ -24,11 +24,11 @@ namespace Content.Server.NPC.Commands
return; 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; return;
} }
@@ -38,7 +38,7 @@ namespace Content.Server.NPC.Commands
return; return;
} }
var comp = _entities.AddComponent<HTNComponent>(entId); var comp = _entities.AddComponent<HTNComponent>(entId.Value);
comp.RootTask = new HTNCompoundTask() comp.RootTask = new HTNCompoundTask()
{ {
Task = args[1] Task = args[1]

View File

@@ -11,6 +11,9 @@ namespace Content.Server.Sandbox.Commands
[AnyCommand] [AnyCommand]
public sealed class ColorNetworkCommand : IConsoleCommand public sealed class ColorNetworkCommand : IConsoleCommand
{ {
[Dependency] private readonly IAdminManager _adminManager = default!;
[Dependency] private readonly IEntityManager _entManager = default!;
public string Command => "colornetwork"; public string Command => "colornetwork";
public string Description => Loc.GetString("color-network-command-description"); public string Description => Loc.GetString("color-network-command-description");
public string Help => Loc.GetString("color-network-command-help-text", ("command",Command)); public string Help => Loc.GetString("color-network-command-help-text", ("command",Command));
@@ -30,25 +33,21 @@ namespace Content.Server.Sandbox.Commands
return; return;
} }
var entityManager = IoCManager.Resolve<IEntityManager>();
if (!int.TryParse(args[0], out var targetId)) if (!int.TryParse(args[0], out var targetId))
{ {
shell.WriteLine(Loc.GetString("shell-argument-must-be-number")); shell.WriteLine(Loc.GetString("shell-argument-must-be-number"));
return; 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")); shell.WriteLine(Loc.GetString("shell-invalid-entity-id"));
return; 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")); shell.WriteLine(Loc.GetString("shell-entity-is-not-node-container"));
return; return;
@@ -74,13 +73,15 @@ namespace Content.Server.Sandbox.Commands
{ {
var group = nodeContainerComponent.Nodes[nodeGroupId.ToString().ToLower()].NodeGroup; var group = nodeContainerComponent.Nodes[nodeGroupId.ToString().ToLower()].NodeGroup;
if (group == null) return; if (group == null)
return;
foreach (var x in group.Nodes) 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);
} }
} }
} }

View File

@@ -12,6 +12,10 @@ namespace Content.Server.Traitor.Uplink.Commands
[AdminCommand(AdminFlags.Admin)] [AdminCommand(AdminFlags.Admin)]
public sealed class AddUplinkCommand : IConsoleCommand 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 Command => "adduplink";
public string Description => Loc.GetString("add-uplink-command-description"); public string Description => Loc.GetString("add-uplink-command-description");
@@ -41,7 +45,7 @@ namespace Content.Server.Traitor.Uplink.Commands
if (args.Length > 0) if (args.Length > 0)
{ {
// Get player entity // 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")); shell.WriteLine(Loc.GetString("shell-target-player-does-not-exist"));
return; return;
@@ -60,7 +64,6 @@ namespace Content.Server.Traitor.Uplink.Commands
// Get target item // Get target item
EntityUid? uplinkEntity = null; EntityUid? uplinkEntity = null;
var entityManager = IoCManager.Resolve<IEntityManager>();
if (args.Length >= 2) if (args.Length >= 2)
{ {
if (!int.TryParse(args[1], out var itemID)) if (!int.TryParse(args[1], out var itemID))
@@ -69,8 +72,9 @@ namespace Content.Server.Traitor.Uplink.Commands
return; return;
} }
var eUid = new EntityUid(itemID); var eNet = new NetEntity(itemID);
if (!eUid.IsValid() || !entityManager.EntityExists(eUid))
if (!_entManager.TryGetEntity(eNet, out var eUid))
{ {
shell.WriteLine(Loc.GetString("shell-invalid-entity-id")); shell.WriteLine(Loc.GetString("shell-invalid-entity-id"));
return; return;
@@ -80,11 +84,10 @@ namespace Content.Server.Traitor.Uplink.Commands
} }
// Get TC count // Get TC count
var configManager = IoCManager.Resolve<IConfigurationManager>(); var tcCount = _cfgManager.GetCVar(CCVars.TraitorStartingBalance);
var tcCount = configManager.GetCVar(CCVars.TraitorStartingBalance); Logger.Debug(_entManager.ToPrettyString(user));
Logger.Debug(entityManager.ToPrettyString(user));
// Finally add uplink // Finally add uplink
var uplinkSys = entityManager.EntitySysManager.GetEntitySystem<UplinkSystem>(); var uplinkSys = _entManager.System<UplinkSystem>();
if (!uplinkSys.AddUplink(user, FixedPoint2.New(tcCount), uplinkEntity: uplinkEntity)) if (!uplinkSys.AddUplink(user, FixedPoint2.New(tcCount), uplinkEntity: uplinkEntity))
{ {
shell.WriteLine(Loc.GetString("add-uplink-command-error-2")); shell.WriteLine(Loc.GetString("add-uplink-command-error-2"));

View File

@@ -9,6 +9,8 @@ namespace Content.Server.Verbs.Commands
[AdminCommand(AdminFlags.Admin)] [AdminCommand(AdminFlags.Admin)]
public sealed class InvokeVerbCommand : IConsoleCommand public sealed class InvokeVerbCommand : IConsoleCommand
{ {
[Dependency] private readonly IEntityManager _entManager = default!;
public string Command => "invokeverb"; public string Command => "invokeverb";
public string Description => Loc.GetString("invoke-verb-command-description"); public string Description => Loc.GetString("invoke-verb-command-description");
public string Help => Loc.GetString("invoke-verb-command-help"); public string Help => Loc.GetString("invoke-verb-command-help");
@@ -21,8 +23,7 @@ namespace Content.Server.Verbs.Commands
return; return;
} }
var entityManager = IoCManager.Resolve<IEntityManager>(); var verbSystem = _entManager.System<SharedVerbSystem>();
var verbSystem = entityManager.System<SharedVerbSystem>();
// get the 'player' entity (defaulting to command user, otherwise uses a uid) // get the 'player' entity (defaulting to command user, otherwise uses a uid)
EntityUid? playerEntity = null; EntityUid? playerEntity = null;
@@ -38,10 +39,6 @@ namespace Content.Server.Verbs.Commands
return; return;
} }
} }
else
{
entityManager.EntityExists(new EntityUid(intPlayerUid));
}
// gets the target entity // gets the target entity
if (!int.TryParse(args[1], out var intUid)) if (!int.TryParse(args[1], out var intUid))
@@ -56,16 +53,16 @@ namespace Content.Server.Verbs.Commands
return; return;
} }
var target = new EntityUid(intUid); var targetNet = new NetEntity(intUid);
if (!entityManager.EntityExists(target))
if (!_entManager.TryGetEntity(targetNet, out var target))
{ {
shell.WriteError(Loc.GetString("invoke-verb-command-invalid-target-entity")); shell.WriteError(Loc.GetString("invoke-verb-command-invalid-target-entity"));
return; return;
} }
var verbName = args[2].ToLowerInvariant(); 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. // 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); 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); var verb = verbs.FirstOrDefault(v => v.GetType() == verbType);
if (verb != null) 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))); shell.WriteLine(Loc.GetString("invoke-verb-command-success", ("verb", verbName), ("target", target), ("player", playerEntity)));
return; return;
} }
@@ -84,7 +81,7 @@ namespace Content.Server.Verbs.Commands
{ {
if (verb.Text.ToLowerInvariant() == verbName) 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))); shell.WriteLine(Loc.GetString("invoke-verb-command-success", ("verb", verb.Text), ("target", target), ("player", playerEntity)));
return; return;
} }

View File

@@ -8,6 +8,8 @@ namespace Content.Server.Verbs.Commands
[AdminCommand(AdminFlags.Admin)] [AdminCommand(AdminFlags.Admin)]
public sealed class ListVerbsCommand : IConsoleCommand public sealed class ListVerbsCommand : IConsoleCommand
{ {
[Dependency] private readonly IEntityManager _entManager = default!;
public string Command => "listverbs"; public string Command => "listverbs";
public string Description => Loc.GetString("list-verbs-command-description"); public string Description => Loc.GetString("list-verbs-command-description");
public string Help => Loc.GetString("list-verbs-command-help"); public string Help => Loc.GetString("list-verbs-command-help");
@@ -20,11 +22,11 @@ namespace Content.Server.Verbs.Commands
return; return;
} }
var entityManager = IoCManager.Resolve<IEntityManager>(); var verbSystem = _entManager.System<SharedVerbSystem>();
var verbSystem = EntitySystem.Get<SharedVerbSystem>();
// get the 'player' entity (defaulting to command user, otherwise uses a uid) // get the 'player' entity (defaulting to command user, otherwise uses a uid)
EntityUid? playerEntity = null; EntityUid? playerEntity = null;
if (!int.TryParse(args[0], out var intPlayerUid)) if (!int.TryParse(args[0], out var intPlayerUid))
{ {
if (args[0] == "self" && shell.Player?.AttachedEntity != null) if (args[0] == "self" && shell.Player?.AttachedEntity != null)
@@ -37,10 +39,6 @@ namespace Content.Server.Verbs.Commands
return; return;
} }
} }
else
{
entityManager.EntityExists(new EntityUid(intPlayerUid));
}
// gets the target entity // gets the target entity
if (!int.TryParse(args[1], out var intUid)) if (!int.TryParse(args[1], out var intUid))
@@ -55,14 +53,15 @@ namespace Content.Server.Verbs.Commands
return; return;
} }
var target = new EntityUid(intUid); var targetNet = new NetEntity(intUid);
if (!entityManager.EntityExists(target))
if (!_entManager.TryGetEntity(targetNet, out var target))
{ {
shell.WriteError(Loc.GetString("list-verbs-command-invalid-target-entity")); shell.WriteError(Loc.GetString("list-verbs-command-invalid-target-entity"));
return; 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) foreach (var verb in verbs)
{ {

View File

@@ -180,6 +180,8 @@ public sealed class ArtifactAnalyzerSystem : EntitySystem
component.AnalyzerEntity = null; component.AnalyzerEntity = null;
} }
// TODO: Yeah this comp relies upon event ordering so we get this for now.
if (!TerminatingOrDeleted(uid))
UpdateUserInterface(uid, component); UpdateUserInterface(uid, component);
} }

View File

@@ -204,7 +204,7 @@ public sealed partial class ArtifactSystem
var temp = (object) comp; var temp = (object) comp;
_serialization.CopyTo(entry.Component, ref temp); _serialization.CopyTo(entry.Component, ref temp);
EntityManager.AddComponent(uid, (Component) temp!, true); EntityManager.AddComponent(uid, (Component) temp!);
} }
node.Discovered = true; node.Discovered = true;
@@ -238,7 +238,7 @@ public sealed partial class ArtifactSystem
comp.Owner = uid; comp.Owner = uid;
var temp = (object) comp; var temp = (object) comp;
_serialization.CopyTo(entry, ref temp); _serialization.CopyTo(entry, ref temp);
EntityManager.AddComponent(uid, (Component) temp!, true); EntityManager.AddComponent(uid, (Component) temp!);
continue; continue;
} }

View File

@@ -1,5 +1,4 @@
using Content.Shared.Damage; using Content.Shared.Damage;
using Content.Shared.Damage.Prototypes;
using Robust.Shared.Audio; using Robust.Shared.Audio;
using Robust.Shared.Containers; using Robust.Shared.Containers;

View File

@@ -1,9 +1,7 @@
using Content.Shared.ActionBlocker; using Content.Shared.ActionBlocker;
using Content.Shared.Buckle.Components;
using Content.Shared.Movement.Events; using Content.Shared.Movement.Events;
using Content.Shared.StepTrigger.Systems; using Content.Shared.StepTrigger.Systems;
using Robust.Shared.Network; using Robust.Shared.Network;
using Robust.Shared.Physics.Components;
using Robust.Shared.Timing; using Robust.Shared.Timing;
namespace Content.Shared.Chasm; namespace Content.Shared.Chasm;

View File

@@ -1,4 +1,3 @@
using System.Numerics;
using Content.Shared.ActionBlocker; using Content.Shared.ActionBlocker;
using Content.Shared.Body.Components; using Content.Shared.Body.Components;
using Content.Shared.Body.Part; using Content.Shared.Body.Part;
@@ -13,7 +12,6 @@ using Content.Shared.Hands.Components;
using Content.Shared.IdentityManagement; using Content.Shared.IdentityManagement;
using Content.Shared.Interaction; using Content.Shared.Interaction;
using Content.Shared.Movement.Events; using Content.Shared.Movement.Events;
using Content.Shared.Movement.Systems;
using Content.Shared.Physics; using Content.Shared.Physics;
using Content.Shared.Popups; using Content.Shared.Popups;
using Content.Shared.Stunnable; using Content.Shared.Stunnable;

View File

@@ -110,7 +110,7 @@ namespace Content.Shared.Containers.ItemSlots
/// </summary> /// </summary>
public void RemoveItemSlot(EntityUid uid, ItemSlot slot, ItemSlotsComponent? itemSlots = null) public void RemoveItemSlot(EntityUid uid, ItemSlot slot, ItemSlotsComponent? itemSlots = null)
{ {
if (Terminating(uid) || slot.ContainerSlot == null) if (TerminatingOrDeleted(uid) || slot.ContainerSlot == null)
return; return;
slot.ContainerSlot.Shutdown(); slot.ContainerSlot.Shutdown();

View File

@@ -3,7 +3,6 @@ using Content.Shared.ActionBlocker;
using Content.Shared.Administration.Components; using Content.Shared.Administration.Components;
using Content.Shared.Administration.Logs; using Content.Shared.Administration.Logs;
using Content.Shared.Alert; using Content.Shared.Alert;
using Content.Shared.Atmos.Piping.Unary.Components;
using Content.Shared.Buckle.Components; using Content.Shared.Buckle.Components;
using Content.Shared.Cuffs.Components; using Content.Shared.Cuffs.Components;
using Content.Shared.Damage; using Content.Shared.Damage;

View File

@@ -14,7 +14,6 @@ using Robust.Shared.Audio;
using Robust.Shared.Containers; using Robust.Shared.Containers;
using Robust.Shared.Network; using Robust.Shared.Network;
using Robust.Shared.Player; using Robust.Shared.Player;
using Robust.Shared.Prototypes;
using Robust.Shared.Timing; using Robust.Shared.Timing;
namespace Content.Shared.Inventory; namespace Content.Shared.Inventory;
@@ -24,9 +23,9 @@ public abstract partial class InventorySystem
[Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly SharedPopupSystem _popup = default!;
[Dependency] private readonly MovementSpeedModifierSystem _movementSpeed = default!; [Dependency] private readonly MovementSpeedModifierSystem _movementSpeed = default!;
[Dependency] private readonly SharedInteractionSystem _interactionSystem = default!; [Dependency] private readonly SharedInteractionSystem _interactionSystem = default!;
[Dependency] private readonly SharedItemSystem _item = default!;
[Dependency] private readonly SharedContainerSystem _containerSystem = default!; [Dependency] private readonly SharedContainerSystem _containerSystem = default!;
[Dependency] private readonly SharedHandsSystem _handsSystem = default!; [Dependency] private readonly SharedHandsSystem _handsSystem = default!;
[Dependency] private readonly SharedItemSystem _item = default!;
[Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly IGameTiming _gameTiming = default!;
[Dependency] private readonly INetManager _netMan = default!; [Dependency] private readonly INetManager _netMan = default!;
[Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly SharedTransformSystem _transform = default!;

View File

@@ -106,7 +106,7 @@ public sealed class LockSystem : EntitySystem
lockComp.Locked = true; lockComp.Locked = true;
_appearanceSystem.SetData(uid, StorageVisuals.Locked, true); _appearanceSystem.SetData(uid, StorageVisuals.Locked, true);
Dirty(lockComp); Dirty(uid, lockComp);
var ev = new LockToggledEvent(true); var ev = new LockToggledEvent(true);
RaiseLocalEvent(uid, ref ev, true); RaiseLocalEvent(uid, ref ev, true);
@@ -134,7 +134,7 @@ public sealed class LockSystem : EntitySystem
lockComp.Locked = false; lockComp.Locked = false;
_appearanceSystem.SetData(uid, StorageVisuals.Locked, false); _appearanceSystem.SetData(uid, StorageVisuals.Locked, false);
Dirty(lockComp); Dirty(uid, lockComp);
var ev = new LockToggledEvent(false); var ev = new LockToggledEvent(false);
RaiseLocalEvent(uid, ref ev, true); RaiseLocalEvent(uid, ref ev, true);

View File

@@ -1,8 +1,5 @@
using Content.Shared.Mech;
using Content.Shared.Mech.Equipment.Components; using Content.Shared.Mech.Equipment.Components;
using Content.Shared.Mech.Equipment.Systems;
using Content.Shared.Timing; using Content.Shared.Timing;
using Robust.Shared.Audio;
using System.Linq; using System.Linq;
namespace Content.Shared.Mech.Equipment.Systems; namespace Content.Shared.Mech.Equipment.Systems;

View File

@@ -12,7 +12,6 @@ using Content.Shared.Popups;
using Content.Shared.RCD.Components; using Content.Shared.RCD.Components;
using Content.Shared.Tag; using Content.Shared.Tag;
using Content.Shared.Tiles; using Content.Shared.Tiles;
using Robust.Shared.Audio;
using Robust.Shared.Map; using Robust.Shared.Map;
using Robust.Shared.Map.Components; using Robust.Shared.Map.Components;
using Robust.Shared.Network; using Robust.Shared.Network;

View File

@@ -6,7 +6,6 @@ using Content.Shared.Hands.EntitySystems;
using Content.Shared.Interaction; using Content.Shared.Interaction;
using Content.Shared.Popups; using Content.Shared.Popups;
using Content.Shared.Radio.Components; using Content.Shared.Radio.Components;
using Content.Shared.Tools;
using Content.Shared.Tools.Components; using Content.Shared.Tools.Components;
using Content.Shared.Wires; using Content.Shared.Wires;
using Robust.Shared.Containers; using Robust.Shared.Containers;

View File

@@ -20,9 +20,7 @@ using Robust.Shared.GameStates;
using Robust.Shared.Map; using Robust.Shared.Map;
using Robust.Shared.Network; using Robust.Shared.Network;
using Robust.Shared.Physics; using Robust.Shared.Physics;
using Robust.Shared.Physics.Components;
using Robust.Shared.Physics.Systems; using Robust.Shared.Physics.Systems;
using Robust.Shared.Prototypes;
using Robust.Shared.Timing; using Robust.Shared.Timing;
using Robust.Shared.Utility; using Robust.Shared.Utility;

View File

@@ -1,7 +1,5 @@
using Content.Shared.ActionBlocker; using Content.Shared.ActionBlocker;
using Content.Shared.Administration.Logs; using Content.Shared.Administration.Logs;
using Content.Shared.Audio;
using Content.Shared.DragDrop;
using Content.Shared.Interaction; using Content.Shared.Interaction;
using Content.Shared.Interaction.Events; using Content.Shared.Interaction.Events;
using Content.Shared.Inventory.Events; using Content.Shared.Inventory.Events;
@@ -11,15 +9,11 @@ using Content.Shared.Database;
using Content.Shared.Hands; using Content.Shared.Hands;
using Content.Shared.Mobs; using Content.Shared.Mobs;
using Content.Shared.Mobs.Components; using Content.Shared.Mobs.Components;
using Content.Shared.Mobs.Systems;
using Content.Shared.Movement.Events; using Content.Shared.Movement.Events;
using Content.Shared.Movement.Systems; using Content.Shared.Movement.Systems;
using Content.Shared.Standing; using Content.Shared.Standing;
using Content.Shared.StatusEffect; using Content.Shared.StatusEffect;
using Content.Shared.Throwing; using Content.Shared.Throwing;
using Robust.Shared.Audio;
using Robust.Shared.GameStates;
using Robust.Shared.Player;
namespace Content.Shared.Stunnable; namespace Content.Shared.Stunnable;

View File

@@ -1,9 +1,7 @@
using Content.Shared.Examine; using Content.Shared.Examine;
using Content.Shared.Weapons.Ranged.Components; using Content.Shared.Weapons.Ranged.Components;
using Robust.Shared.Network; using Robust.Shared.Network;
using Robust.Shared.Player;
using Robust.Shared.Timing; using Robust.Shared.Timing;
using Robust.Shared.Utility;
namespace Content.Shared.Weapons.Ranged.Systems; namespace Content.Shared.Weapons.Ranged.Systems;

View 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}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Robust.Serialization.Generator", "RobustToolbox\Robust.Serialization.Generator\Robust.Serialization.Generator.csproj", "{6FBF108E-5CB5-47DE-8D7E-B496ABA9E3E2}"
EndProject 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}") = "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 EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution 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}.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.ActiveCfg = Debug|Any CPU
{D97D8258-D915-4D1D-B1E3-1A8D00CF9EB5}.Tools|Any CPU.Build.0 = 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 EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
@@ -469,6 +488,8 @@ Global
{A965CB3B-FD31-44AF-8872-85ABA436098D} = {83B4CBBA-547A-42F0-A7CD-8A67D93196CE} {A965CB3B-FD31-44AF-8872-85ABA436098D} = {83B4CBBA-547A-42F0-A7CD-8A67D93196CE}
{07CA34A1-1D37-4771-A2E3-495A1044AE0B} = {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} {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 EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {AA37ED9F-F8D6-468E-A101-658AD605B09A} SolutionGuid = {AA37ED9F-F8D6-468E-A101-658AD605B09A}