diff --git a/Content.Client/Weather/WeatherOverlay.cs b/Content.Client/Weather/WeatherOverlay.cs new file mode 100644 index 0000000000..12af31b863 --- /dev/null +++ b/Content.Client/Weather/WeatherOverlay.cs @@ -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(_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(mapUid, out var comp)) + { + return; + } + + foreach (var (proto, weather) in comp.Weather) + { + if (!_protoManager.TryIndex(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(); + var xformQuery = _entManager.GetEntityQuery(); + var weatherIgnoreQuery = _entManager.GetEntityQuery(); + + // idk if this is safe to cache in a field and clear sloth help + var grids = new List>(); + _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("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(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("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); + } +} diff --git a/Content.IntegrationTests/Tests/Interaction/InteractionTest.Helpers.cs b/Content.IntegrationTests/Tests/Interaction/InteractionTest.Helpers.cs index 25171e1ea2..5afa087297 100644 --- a/Content.IntegrationTests/Tests/Interaction/InteractionTest.Helpers.cs +++ b/Content.IntegrationTests/Tests/Interaction/InteractionTest.Helpers.cs @@ -500,7 +500,7 @@ public abstract partial class InteractionTest /// /// Assert whether or not the target has the given component. /// - protected void AssertComp(bool hasComp = true, NetEntity? target = null) + protected void AssertComp(bool hasComp = true, NetEntity? target = null) where T : IComponent { target ??= Target; if (target == null) diff --git a/Content.IntegrationTests/Tests/PrototypeSaveTest.cs b/Content.IntegrationTests/Tests/PrototypeSaveTest.cs index 6096c497ef..207f35189f 100644 --- a/Content.IntegrationTests/Tests/PrototypeSaveTest.cs +++ b/Content.IntegrationTests/Tests/PrototypeSaveTest.cs @@ -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.Read(ISerializationManager serializationManager, @@ -217,7 +217,7 @@ public sealed class PrototypeSaveTest SerializationHookContext hookCtx, ISerializationContext? context, ISerializationManager.InstantiationDelegate? instanceProvider) { - return EntityUid.Parse(node.Value); + return EntityUid.Parse(node.Value, "0"); } } } diff --git a/Content.Server/Administration/Commands/ControlMob.cs b/Content.Server/Administration/Commands/ControlMob.cs index 317461a373..9d39cb9dde 100644 --- a/Content.Server/Administration/Commands/ControlMob.cs +++ b/Content.Server/Administration/Commands/ControlMob.cs @@ -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().ControlMob(player.UserId, target); + _entities.System().ControlMob(player.UserId, target.Value); } } } diff --git a/Content.Server/Administration/Commands/OwoifyCommand.cs b/Content.Server/Administration/Commands/OwoifyCommand.cs index 73a1236d19..8ca35b1b42 100644 --- a/Content.Server/Administration/Commands/OwoifyCommand.cs +++ b/Content.Server/Administration/Commands/OwoifyCommand.cs @@ -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(); - 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(eUid); + if (!_entManager.TryGetEntity(nent, out var eUid)) + { + return; + } - var owoSys = entityManager.System(); - var metaDataSys = entityManager.System(); + var meta = _entManager.GetComponent(eUid.Value); - metaDataSys.SetEntityName(eUid, owoSys.Accentuate(meta.EntityName), meta); - metaDataSys.SetEntityDescription(eUid, owoSys.Accentuate(meta.EntityDescription), meta); + var owoSys = _entManager.System(); + var metaDataSys = _entManager.System(); + + metaDataSys.SetEntityName(eUid.Value, owoSys.Accentuate(meta.EntityName), meta); + metaDataSys.SetEntityDescription(eUid.Value, owoSys.Accentuate(meta.EntityDescription), meta); } } diff --git a/Content.Server/Administration/Commands/SetMindCommand.cs b/Content.Server/Administration/Commands/SetMindCommand.cs index 5310c2dd7f..a7b6849423 100644 --- a/Content.Server/Administration/Commands/SetMindCommand.cs +++ b/Content.Server/Administration/Commands/SetMindCommand.cs @@ -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(); + 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(eUid)) + if (!_entManager.HasComponent(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(); - var metadata = entityManager.GetComponent(eUid); + var mindSystem = _entManager.System(); + var metadata = _entManager.GetComponent(eUid.Value); var mind = playerCData.Mind ?? mindSystem.CreateMind(session.UserId, metadata.EntityName); diff --git a/Content.Server/Administration/Commands/SetOutfitCommand.cs b/Content.Server/Administration/Commands/SetOutfitCommand.cs index 97c1fa0656..4c66a09918 100644 --- a/Content.Server/Administration/Commands/SetOutfitCommand.cs +++ b/Content.Server/Administration/Commands/SetOutfitCommand.cs @@ -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(target)) + if (!_entities.HasComponent(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(); - 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")); } diff --git a/Content.Server/Administration/Systems/AdminVerbSystem.cs b/Content.Server/Administration/Systems/AdminVerbSystem.cs index bc065745f5..af27db29ff 100644 --- a/Content.Server/Administration/Systems/AdminVerbSystem.cs +++ b/Content.Server/Administration/Systems/AdminVerbSystem.cs @@ -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); diff --git a/Content.Server/Administration/UI/SetOutfitEui.cs b/Content.Server/Administration/UI/SetOutfitEui.cs index 6243657c32..2812975f4d 100644 --- a/Content.Server/Administration/UI/SetOutfitEui.cs +++ b/Content.Server/Administration/UI/SetOutfitEui.cs @@ -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, }; } diff --git a/Content.Server/Humanoid/Systems/RandomHumanoidSystem.cs b/Content.Server/Humanoid/Systems/RandomHumanoidSystem.cs index 6a17a52c3d..f3607f74dc 100644 --- a/Content.Server/Humanoid/Systems/RandomHumanoidSystem.cs +++ b/Content.Server/Humanoid/Systems/RandomHumanoidSystem.cs @@ -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); } } diff --git a/Content.Server/Jobs/AddComponentSpecial.cs b/Content.Server/Jobs/AddComponentSpecial.cs index 1b183c5c3f..62443a1c4e 100644 --- a/Content.Server/Jobs/AddComponentSpecial.cs +++ b/Content.Server/Jobs/AddComponentSpecial.cs @@ -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!); } } } diff --git a/Content.Server/NPC/Commands/AddNPCCommand.cs b/Content.Server/NPC/Commands/AddNPCCommand.cs index 070b9f35d3..c5582b7b4c 100644 --- a/Content.Server/NPC/Commands/AddNPCCommand.cs +++ b/Content.Server/NPC/Commands/AddNPCCommand.cs @@ -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(entId); + var comp = _entities.AddComponent(entId.Value); comp.RootTask = new HTNCompoundTask() { Task = args[1] diff --git a/Content.Server/Sandbox/Commands/ColorNetworkCommand.cs b/Content.Server/Sandbox/Commands/ColorNetworkCommand.cs index cc20b71946..2ab29d1b2f 100644 --- a/Content.Server/Sandbox/Commands/ColorNetworkCommand.cs +++ b/Content.Server/Sandbox/Commands/ColorNetworkCommand.cs @@ -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(); - 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().TryGetComponent(x.Owner, out AtmosPipeColorComponent? atmosPipeColorComponent)) continue; + if (!_entManager.TryGetComponent(x.Owner, out AtmosPipeColorComponent? atmosPipeColorComponent)) + continue; - EntitySystem.Get().SetColor(x.Owner, atmosPipeColorComponent, color); + _entManager.System().SetColor(x.Owner, atmosPipeColorComponent, color); } } } diff --git a/Content.Server/Traitor/Uplink/Commands/AddUplinkCommand.cs b/Content.Server/Traitor/Uplink/Commands/AddUplinkCommand.cs index fd656a9f71..cdaed3f928 100644 --- a/Content.Server/Traitor/Uplink/Commands/AddUplinkCommand.cs +++ b/Content.Server/Traitor/Uplink/Commands/AddUplinkCommand.cs @@ -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().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(); 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(); - 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(); + var uplinkSys = _entManager.System(); if (!uplinkSys.AddUplink(user, FixedPoint2.New(tcCount), uplinkEntity: uplinkEntity)) { shell.WriteLine(Loc.GetString("add-uplink-command-error-2")); diff --git a/Content.Server/Verbs/Commands/InvokeVerbCommand.cs b/Content.Server/Verbs/Commands/InvokeVerbCommand.cs index af2131fb55..3309ef8153 100644 --- a/Content.Server/Verbs/Commands/InvokeVerbCommand.cs +++ b/Content.Server/Verbs/Commands/InvokeVerbCommand.cs @@ -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(); - var verbSystem = entityManager.System(); + var verbSystem = _entManager.System(); // 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; } diff --git a/Content.Server/Verbs/Commands/ListVerbsCommand.cs b/Content.Server/Verbs/Commands/ListVerbsCommand.cs index dc56cffb44..fd159e37bb 100644 --- a/Content.Server/Verbs/Commands/ListVerbsCommand.cs +++ b/Content.Server/Verbs/Commands/ListVerbsCommand.cs @@ -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(); - var verbSystem = EntitySystem.Get(); + var verbSystem = _entManager.System(); // 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) { diff --git a/Content.Server/Xenoarchaeology/Equipment/Systems/ArtifactAnalyzerSystem.cs b/Content.Server/Xenoarchaeology/Equipment/Systems/ArtifactAnalyzerSystem.cs index 9200928d66..343826c7ae 100644 --- a/Content.Server/Xenoarchaeology/Equipment/Systems/ArtifactAnalyzerSystem.cs +++ b/Content.Server/Xenoarchaeology/Equipment/Systems/ArtifactAnalyzerSystem.cs @@ -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) diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.Nodes.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.Nodes.cs index e6f937236d..ab4670b905 100644 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.Nodes.cs +++ b/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.Nodes.cs @@ -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; } diff --git a/Content.Shared/Anomaly/SharedAnomalySystem.cs b/Content.Shared/Anomaly/SharedAnomalySystem.cs index 48413ac001..e3678d1459 100644 --- a/Content.Shared/Anomaly/SharedAnomalySystem.cs +++ b/Content.Shared/Anomaly/SharedAnomalySystem.cs @@ -109,7 +109,7 @@ public abstract class SharedAnomalySystem : EntitySystem var pulse = EnsureComp(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); } diff --git a/Content.Shared/Blocking/BlockingSystem.User.cs b/Content.Shared/Blocking/BlockingSystem.User.cs index bfefaf2b92..237cdfa488 100644 --- a/Content.Shared/Blocking/BlockingSystem.User.cs +++ b/Content.Shared/Blocking/BlockingSystem.User.cs @@ -1,5 +1,4 @@ using Content.Shared.Damage; -using Content.Shared.Damage.Prototypes; using Robust.Shared.Audio; using Robust.Shared.Containers; diff --git a/Content.Shared/Chasm/ChasmSystem.cs b/Content.Shared/Chasm/ChasmSystem.cs index 7353bd0e9c..c63691c3f9 100644 --- a/Content.Shared/Chasm/ChasmSystem.cs +++ b/Content.Shared/Chasm/ChasmSystem.cs @@ -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; diff --git a/Content.Shared/Climbing/Systems/ClimbSystem.cs b/Content.Shared/Climbing/Systems/ClimbSystem.cs index f065d19dd3..50ae6fb56c 100644 --- a/Content.Shared/Climbing/Systems/ClimbSystem.cs +++ b/Content.Shared/Climbing/Systems/ClimbSystem.cs @@ -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; diff --git a/Content.Shared/Containers/ItemSlot/ItemSlotsSystem.cs b/Content.Shared/Containers/ItemSlot/ItemSlotsSystem.cs index 9194a8208e..789ff37dcf 100644 --- a/Content.Shared/Containers/ItemSlot/ItemSlotsSystem.cs +++ b/Content.Shared/Containers/ItemSlot/ItemSlotsSystem.cs @@ -110,7 +110,7 @@ namespace Content.Shared.Containers.ItemSlots /// 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(); diff --git a/Content.Shared/Cuffs/SharedCuffableSystem.cs b/Content.Shared/Cuffs/SharedCuffableSystem.cs index 5dbe62aa6a..f47daf5ee2 100644 --- a/Content.Shared/Cuffs/SharedCuffableSystem.cs +++ b/Content.Shared/Cuffs/SharedCuffableSystem.cs @@ -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; diff --git a/Content.Shared/Inventory/InventorySystem.Equip.cs b/Content.Shared/Inventory/InventorySystem.Equip.cs index 7b6ccaf0d4..6f373db115 100644 --- a/Content.Shared/Inventory/InventorySystem.Equip.cs +++ b/Content.Shared/Inventory/InventorySystem.Equip.cs @@ -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!; diff --git a/Content.Shared/Lock/LockSystem.cs b/Content.Shared/Lock/LockSystem.cs index 97baa28bf9..71a9f7d1c8 100644 --- a/Content.Shared/Lock/LockSystem.cs +++ b/Content.Shared/Lock/LockSystem.cs @@ -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); diff --git a/Content.Shared/Mech/Equipment/Systems/MechSoundboardSystem.cs b/Content.Shared/Mech/Equipment/Systems/MechSoundboardSystem.cs index b4254fe079..c58a09a4f4 100644 --- a/Content.Shared/Mech/Equipment/Systems/MechSoundboardSystem.cs +++ b/Content.Shared/Mech/Equipment/Systems/MechSoundboardSystem.cs @@ -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; diff --git a/Content.Shared/RCD/Systems/RCDSystem.cs b/Content.Shared/RCD/Systems/RCDSystem.cs index ccc47a2fde..cfdab20fb8 100644 --- a/Content.Shared/RCD/Systems/RCDSystem.cs +++ b/Content.Shared/RCD/Systems/RCDSystem.cs @@ -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; diff --git a/Content.Shared/Radio/EntitySystems/EncryptionKeySystem.cs b/Content.Shared/Radio/EntitySystems/EncryptionKeySystem.cs index eb97fe4113..2f1b3ac461 100644 --- a/Content.Shared/Radio/EntitySystems/EncryptionKeySystem.cs +++ b/Content.Shared/Radio/EntitySystems/EncryptionKeySystem.cs @@ -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; diff --git a/Content.Shared/Storage/EntitySystems/SharedEntityStorageSystem.cs b/Content.Shared/Storage/EntitySystems/SharedEntityStorageSystem.cs index f84a65398d..bbf4b42da4 100644 --- a/Content.Shared/Storage/EntitySystems/SharedEntityStorageSystem.cs +++ b/Content.Shared/Storage/EntitySystems/SharedEntityStorageSystem.cs @@ -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; diff --git a/Content.Shared/Stunnable/SharedStunSystem.cs b/Content.Shared/Stunnable/SharedStunSystem.cs index 4875f2f68f..289dcabd1d 100644 --- a/Content.Shared/Stunnable/SharedStunSystem.cs +++ b/Content.Shared/Stunnable/SharedStunSystem.cs @@ -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; diff --git a/Content.Shared/Weapons/Ranged/Systems/RechargeBasicEntityAmmoSystem.cs b/Content.Shared/Weapons/Ranged/Systems/RechargeBasicEntityAmmoSystem.cs index ded4ce34a2..13e07b922f 100644 --- a/Content.Shared/Weapons/Ranged/Systems/RechargeBasicEntityAmmoSystem.cs +++ b/Content.Shared/Weapons/Ranged/Systems/RechargeBasicEntityAmmoSystem.cs @@ -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; diff --git a/SpaceStation14.sln b/SpaceStation14.sln index 10c4ea1c2c..7c8c703fe3 100644 --- a/SpaceStation14.sln +++ b/SpaceStation14.sln @@ -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}