Better pinpointer accuracy + small cleanup (#12378)

This commit is contained in:
Alex Evgrashin
2022-11-04 05:15:23 +01:00
committed by GitHub
parent 2a2be3d619
commit 2ad9a5dfac
9 changed files with 122 additions and 139 deletions

View File

@@ -26,12 +26,12 @@ namespace Content.Server.Pinpointer
private void OnLocateTarget(HyperspaceJumpCompletedEvent ev)
{
// This feels kind of expensive, but it only happens once per hyperspace jump
foreach (var uid in ActivePinpointers)
// todo: ideally, you would need to raise this event only on jumped entities
// this code update ALL pinpointers in game
foreach (var pinpointer in EntityQuery<PinpointerComponent>())
{
if (TryComp<PinpointerComponent>(uid, out var component))
{
LocateTarget(uid, component);
}
LocateTarget(pinpointer.Owner, pinpointer);
}
}
@@ -58,9 +58,9 @@ namespace Content.Server.Pinpointer
// because target or pinpointer can move
// we need to update pinpointers arrow each frame
foreach (var uid in ActivePinpointers)
foreach (var pinpointer in EntityQuery<PinpointerComponent>())
{
UpdateDirectionToTarget(uid);
UpdateDirectionToTarget(pinpointer.Owner, pinpointer);
}
}
@@ -85,14 +85,14 @@ namespace Content.Server.Pinpointer
foreach (var comp in EntityManager.GetAllComponents(whitelist))
{
if (!xformQuery.TryGetComponent(comp.Owner, out var compXform) ||
compXform.MapID != mapId) continue;
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
// return uid with a smallest distance
return l.Count > 0 ? l.First().Value : null;
}
@@ -120,33 +120,34 @@ namespace Content.Server.Pinpointer
if (!Resolve(uid, ref pinpointer))
return;
if (!pinpointer.IsActive)
return;
var target = pinpointer.Target;
if (target == null || !EntityManager.EntityExists(target.Value))
{
SetDirection(uid, Direction.Invalid, pinpointer);
SetDistance(uid, Distance.UNKNOWN, pinpointer);
SetDistance(uid, Distance.Unknown, pinpointer);
return;
}
var dirVec = CalculateDirection(uid, target.Value);
if (dirVec != null)
{
var dir = dirVec.Value.GetDir();
SetDirection(uid, dir, pinpointer);
var angle = dirVec.Value.ToWorldAngle();
TrySetArrowAngle(uid, angle, pinpointer);
var dist = CalculateDistance(uid, dirVec.Value, pinpointer);
SetDistance(uid, dist, pinpointer);
}
else
{
SetDirection(uid, Direction.Invalid, pinpointer);
SetDistance(uid, Distance.UNKNOWN, pinpointer);
SetDistance(uid, Distance.Unknown, pinpointer);
}
}
/// <summary>
/// Calculate direction from pinUid to trgUid
/// </summary>
/// <returns>Null if failed to caluclate distance between two entities</returns>
/// <returns>Null if failed to calculate distance between two entities</returns>
private Vector2? CalculateDirection(EntityUid pinUid, EntityUid trgUid)
{
var xformQuery = GetEntityQuery<TransformComponent>();
@@ -169,17 +170,17 @@ namespace Content.Server.Pinpointer
private Distance CalculateDistance(EntityUid uid, Vector2 vec, PinpointerComponent? pinpointer = null)
{
if (!Resolve(uid, ref pinpointer))
return Distance.UNKNOWN;
return Distance.Unknown;
var dist = vec.Length;
if (dist <= pinpointer.ReachedDistance)
return Distance.REACHED;
return Distance.Reached;
else if (dist <= pinpointer.CloseDistance)
return Distance.CLOSE;
return Distance.Close;
else if (dist <= pinpointer.MediumDistance)
return Distance.MEDIUM;
return Distance.Medium;
else
return Distance.FAR;
return Distance.Far;
}
}
}