diff --git a/Content.Server/Pinpointer/ServerPinpointerSystem.cs b/Content.Server/Pinpointer/ServerPinpointerSystem.cs index 5cf4e267c5..21f4405059 100644 --- a/Content.Server/Pinpointer/ServerPinpointerSystem.cs +++ b/Content.Server/Pinpointer/ServerPinpointerSystem.cs @@ -1,17 +1,13 @@ using Content.Shared.Interaction; using Content.Shared.Pinpointer; -using Content.Shared.Whitelist; -using Robust.Shared.GameObjects; -using Robust.Shared.IoC; -using Robust.Shared.Maths; -using System.Collections.Generic; using System.Linq; +using Robust.Shared.Utility; namespace Content.Server.Pinpointer { public sealed class ServerPinpointerSystem : SharedPinpointerSystem { - [Dependency] private readonly EntityLookupSystem _entityLookup = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; public override void Initialize() { @@ -24,9 +20,16 @@ namespace Content.Server.Pinpointer TogglePinpointer(uid, component); // try to find target from whitelist - if (component.IsActive && component.Whitelist != null) + if (component.IsActive && component.Component != null) { - var target = FindTargetFromWhitelist(uid, component.Whitelist); + if (!EntityManager.ComponentFactory.TryGetRegistration(component.Component, out var reg)) + { + Logger.Error($"Unable to find component registration for {component.Component} for pinpointer!"); + DebugTools.Assert(false); + return; + } + + var target = FindTargetFromComponent(uid, reg.Type); SetTarget(uid, target, component); } } @@ -47,24 +50,28 @@ namespace Content.Server.Pinpointer /// Try to find the closest entity from whitelist on a current map /// Will return null if can't find anything /// - private EntityUid? FindTargetFromWhitelist(EntityUid uid, EntityWhitelist whitelist, - TransformComponent? transform = null) + private EntityUid? FindTargetFromComponent(EntityUid uid, Type whitelist, TransformComponent? transform = null) { - if (!Resolve(uid, ref transform)) + var xformQuery = GetEntityQuery(); + + if (transform == null) + xformQuery.TryGetComponent(uid, out transform); + + if (transform == null) return null; - var mapId = transform.MapID; - var ents = _entityLookup.GetEntitiesInMap(mapId); - // sort all entities in distance increasing order + var mapId = transform.MapID; var l = new SortedList(); - foreach (var e in ents) + var worldPos = _transform.GetWorldPosition(transform, xformQuery); + + foreach (var comp in EntityManager.GetAllComponents(whitelist)) { - if (whitelist.IsValid(e)) - { - var dist = (EntityManager.GetComponent(e).WorldPosition - transform.WorldPosition).LengthSquared; - l.TryAdd(dist, e); - } + if (!xformQuery.TryGetComponent(comp.Owner, out var compXform) || + compXform.MapID != mapId) continue; + + var dist = (_transform.GetWorldPosition(compXform, xformQuery) - worldPos).LengthSquared; + l.TryAdd(dist, comp.Owner); } // return uid with a smallest distacne @@ -124,10 +131,12 @@ namespace Content.Server.Pinpointer /// Null if failed to caluclate distance between two entities private Vector2? CalculateDirection(EntityUid pinUid, EntityUid trgUid) { + var xformQuery = GetEntityQuery(); + // check if entities have transform component - if (!EntityManager.TryGetComponent(pinUid, out TransformComponent? pin)) + if (!xformQuery.TryGetComponent(pinUid, out var pin)) return null; - if (!EntityManager.TryGetComponent(trgUid, out TransformComponent? trg)) + if (!xformQuery.TryGetComponent(trgUid, out var trg)) return null; // check if they are on same map @@ -135,7 +144,7 @@ namespace Content.Server.Pinpointer return null; // get world direction vector - var dir = (trg.WorldPosition - pin.WorldPosition); + var dir = (_transform.GetWorldPosition(trg, xformQuery) - _transform.GetWorldPosition(pin, xformQuery)); return dir; } diff --git a/Content.Shared/Nuke/NukeDiskComponent.cs b/Content.Shared/Nuke/NukeDiskComponent.cs new file mode 100644 index 0000000000..3f75aeddaf --- /dev/null +++ b/Content.Shared/Nuke/NukeDiskComponent.cs @@ -0,0 +1,9 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Nuke; + +/// +/// Used for tracking the nuke disk - isn't a tag for pinpointer purposes. +/// +[RegisterComponent, NetworkedComponent] +public sealed class NukeDiskComponent : Component {} diff --git a/Content.Shared/Pinpointer/PinpointerComponent.cs b/Content.Shared/Pinpointer/PinpointerComponent.cs index 5250943bc6..01778fb8aa 100644 --- a/Content.Shared/Pinpointer/PinpointerComponent.cs +++ b/Content.Shared/Pinpointer/PinpointerComponent.cs @@ -1,21 +1,19 @@ -using System; -using Content.Shared.Whitelist; -using Robust.Shared.Analyzers; -using Robust.Shared.GameObjects; using Robust.Shared.GameStates; -using Robust.Shared.Maths; using Robust.Shared.Serialization; -using Robust.Shared.Serialization.Manager.Attributes; namespace Content.Shared.Pinpointer { + /// + /// Displays a sprite on the item that points towards the target component. + /// [RegisterComponent] [NetworkedComponent] [Friend(typeof(SharedPinpointerSystem))] public sealed class PinpointerComponent : Component { - [DataField("whitelist")] - public EntityWhitelist? Whitelist; + // TODO: Type serializer oh god + [DataField("component")] + public string? Component; [DataField("mediumDistance")] public float MediumDistance = 16f; diff --git a/Content.Shared/Pinpointer/SharedPinpointerSystem.cs b/Content.Shared/Pinpointer/SharedPinpointerSystem.cs index b144b738ad..775f001019 100644 --- a/Content.Shared/Pinpointer/SharedPinpointerSystem.cs +++ b/Content.Shared/Pinpointer/SharedPinpointerSystem.cs @@ -1,7 +1,4 @@ -using System.Collections.Generic; -using Robust.Shared.GameObjects; using Robust.Shared.GameStates; -using Robust.Shared.Maths; namespace Content.Shared.Pinpointer { @@ -44,7 +41,7 @@ namespace Content.Shared.Pinpointer return; pinpointer.DistanceToTarget = distance; - pinpointer.Dirty(); + Dirty(pinpointer); } /// @@ -59,7 +56,7 @@ namespace Content.Shared.Pinpointer return; pinpointer.DirectionToTarget = directionToTarget; - pinpointer.Dirty(); + Dirty(pinpointer); } /// @@ -79,7 +76,7 @@ namespace Content.Shared.Pinpointer ActivePinpointers.Remove(uid); pinpointer.IsActive = isActive; - pinpointer.Dirty(); + Dirty(pinpointer); } diff --git a/Resources/Prototypes/Entities/Objects/Devices/nuke.yml b/Resources/Prototypes/Entities/Objects/Devices/nuke.yml index c8d9e04311..4a18149d5c 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/nuke.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/nuke.yml @@ -28,7 +28,7 @@ ejectSound: path: /Audio/Machines/terminal_insert_disc.ogg whitelist: - tags: + components: - NukeDisk - type: InteractionOutline - type: ActivatableUI diff --git a/Resources/Prototypes/Entities/Objects/Devices/pinpointer.yml b/Resources/Prototypes/Entities/Objects/Devices/pinpointer.yml index cf2317ca04..905dbe9d9e 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/pinpointer.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/pinpointer.yml @@ -28,6 +28,4 @@ parent: PinpointerBase components: - type: Pinpointer - whitelist: - tags: - - NukeDisk + component: NukeDisk diff --git a/Resources/Prototypes/Entities/Objects/Misc/dat_fukken_disk.yml b/Resources/Prototypes/Entities/Objects/Misc/dat_fukken_disk.yml index 092c12ce9d..5fea5ad954 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/dat_fukken_disk.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/dat_fukken_disk.yml @@ -4,9 +4,7 @@ id: NukeDisk description: A nuclear auth disk, capable of arming a nuke if used along with a code. Note from nanotrasen reads "THIS IS YOUR MOST IMPORTANT POSESSION, SECURE DAT FUKKEN DISK!" components: - - type: Tag - tags: - - NukeDisk + - type: NukeDisk - type: Sprite netsync: false sprite: Objects/Misc/nukedisk.rsi diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index c330825096..e38ea86249 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -167,7 +167,7 @@ - type: Tag id: HidesHair # for headwear. - + - type: Tag id: Hoe @@ -210,9 +210,6 @@ - type: Tag id: NoSpinOnThrow -- type: Tag - id: NukeDisk - - type: Tag id: Ointment