From 906913563e9f53fc76c5a26837eb6ed8c92c097c Mon Sep 17 00:00:00 2001 From: Kevin Matuschzik <92296572+Gamer3107@users.noreply.github.com> Date: Mon, 14 Oct 2024 07:55:46 +0200 Subject: [PATCH] Fixed portal artifacts targeting the Ai (#32677) * Added checks to not target AIs and people in containers * made the change to use IsEntityInContainer. Much Better! * returned old Mindquerry and removed wrong use of admin logger * guard statment * removed unnecessery refs and fixed position swap * Minor change --------- Co-authored-by: metalgearsloth --- .../Effects/Systems/PortalArtifactSystem.cs | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/PortalArtifactSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/PortalArtifactSystem.cs index e44ee6baa1..b1a08fb505 100644 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/PortalArtifactSystem.cs +++ b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/PortalArtifactSystem.cs @@ -2,6 +2,8 @@ using Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; using Content.Server.Xenoarchaeology.XenoArtifacts.Events; using Content.Shared.Mind.Components; using Content.Shared.Teleportation.Systems; +using Robust.Shared.Collections; +using Robust.Shared.Containers; using Robust.Shared.Random; namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Systems; @@ -11,6 +13,7 @@ public sealed class PortalArtifactSystem : EntitySystem [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly LinkedEntitySystem _link = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; + [Dependency] private readonly SharedContainerSystem _container = default!; public override void Initialize() { @@ -21,21 +24,28 @@ public sealed class PortalArtifactSystem : EntitySystem private void OnActivate(Entity artifact, ref ArtifactActivatedEvent args) { var map = Transform(artifact).MapID; + var validMinds = new ValueList(); + var mindQuery = EntityQueryEnumerator(); + while (mindQuery.MoveNext(out var uid, out var mc, out var xform, out var meta)) + { + // check if the MindContainer has a Mind and if the entity is not in a container (this also auto excludes AI) and if they are on the same map + if (mc.HasMind && !_container.IsEntityOrParentInContainer(uid, meta: meta, xform: xform) && xform.MapID == map) + { + validMinds.Add(uid); + } + } + //this would only be 0 if there were a station full of AIs and no one else, in that case just stop this function + if (validMinds.Count == 0) + return; + var firstPortal = Spawn(artifact.Comp.PortalProto, _transform.GetMapCoordinates(artifact)); - var minds = new List(); - var mindQuery = EntityQueryEnumerator(); - while (mindQuery.MoveNext(out var uid, out var mc, out var xform)) - { - if (mc.HasMind && xform.MapID == map) - minds.Add(uid); - } + var target = _random.Pick(validMinds); - var target = _random.Pick(minds); var secondPortal = Spawn(artifact.Comp.PortalProto, _transform.GetMapCoordinates(target)); //Manual position swapping, because the portal that opens doesn't trigger a collision, and doesn't teleport targets the first time. - _transform.SwapPositions(target, secondPortal); + _transform.SwapPositions(target, artifact.Owner); _link.TryLink(firstPortal, secondPortal, true); }