Content arch (#20107)
Co-authored-by: DrSmugleaf <drsmugleaf@gmail.com>
This commit is contained in:
218
Content.Client/Weather/WeatherOverlay.cs
Normal file
218
Content.Client/Weather/WeatherOverlay.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
var meta = entityManager.GetComponent<MetaDataComponent>(eUid);
|
||||
if (!_entManager.TryGetEntity(nent, out var eUid))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var owoSys = entityManager.System<OwOAccentSystem>();
|
||||
var metaDataSys = entityManager.System<MetaDataSystem>();
|
||||
var meta = _entManager.GetComponent<MetaDataComponent>(eUid.Value);
|
||||
|
||||
metaDataSys.SetEntityName(eUid, owoSys.Accentuate(meta.EntityName), meta);
|
||||
metaDataSys.SetEntityDescription(eUid, owoSys.Accentuate(meta.EntityDescription), meta);
|
||||
var owoSys = _entManager.System<OwOAccentSystem>();
|
||||
var metaDataSys = _entManager.System<MetaDataSystem>();
|
||||
|
||||
metaDataSys.SetEntityName(eUid.Value, owoSys.Accentuate(meta.EntityName), meta);
|
||||
metaDataSys.SetEntityDescription(eUid.Value, owoSys.Accentuate(meta.EntityDescription), meta);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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"));
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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!);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"));
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using Content.Shared.Damage;
|
||||
using Content.Shared.Damage.Prototypes;
|
||||
using Robust.Shared.Audio;
|
||||
using Robust.Shared.Containers;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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!;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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}
|
||||
|
||||
Reference in New Issue
Block a user