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 <comedian_vs_clown@hotmail.com>
This commit is contained in:
@@ -2,6 +2,8 @@ using Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components;
|
|||||||
using Content.Server.Xenoarchaeology.XenoArtifacts.Events;
|
using Content.Server.Xenoarchaeology.XenoArtifacts.Events;
|
||||||
using Content.Shared.Mind.Components;
|
using Content.Shared.Mind.Components;
|
||||||
using Content.Shared.Teleportation.Systems;
|
using Content.Shared.Teleportation.Systems;
|
||||||
|
using Robust.Shared.Collections;
|
||||||
|
using Robust.Shared.Containers;
|
||||||
using Robust.Shared.Random;
|
using Robust.Shared.Random;
|
||||||
|
|
||||||
namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Systems;
|
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 IRobustRandom _random = default!;
|
||||||
[Dependency] private readonly LinkedEntitySystem _link = default!;
|
[Dependency] private readonly LinkedEntitySystem _link = default!;
|
||||||
[Dependency] private readonly SharedTransformSystem _transform = default!;
|
[Dependency] private readonly SharedTransformSystem _transform = default!;
|
||||||
|
[Dependency] private readonly SharedContainerSystem _container = default!;
|
||||||
|
|
||||||
public override void Initialize()
|
public override void Initialize()
|
||||||
{
|
{
|
||||||
@@ -21,21 +24,28 @@ public sealed class PortalArtifactSystem : EntitySystem
|
|||||||
private void OnActivate(Entity<PortalArtifactComponent> artifact, ref ArtifactActivatedEvent args)
|
private void OnActivate(Entity<PortalArtifactComponent> artifact, ref ArtifactActivatedEvent args)
|
||||||
{
|
{
|
||||||
var map = Transform(artifact).MapID;
|
var map = Transform(artifact).MapID;
|
||||||
|
var validMinds = new ValueList<EntityUid>();
|
||||||
|
var mindQuery = EntityQueryEnumerator<MindContainerComponent, TransformComponent, MetaDataComponent>();
|
||||||
|
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 firstPortal = Spawn(artifact.Comp.PortalProto, _transform.GetMapCoordinates(artifact));
|
||||||
|
|
||||||
var minds = new List<EntityUid>();
|
var target = _random.Pick(validMinds);
|
||||||
var mindQuery = EntityQueryEnumerator<MindContainerComponent, TransformComponent>();
|
|
||||||
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(minds);
|
|
||||||
var secondPortal = Spawn(artifact.Comp.PortalProto, _transform.GetMapCoordinates(target));
|
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.
|
//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);
|
_link.TryLink(firstPortal, secondPortal, true);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user