var targetCoordinates = xform.Coordinates;
var targetLocalAngle = xform.LocalRotation;
- return Interaction.InRangeUnobstructed(user, target, targetCoordinates, targetLocalAngle, range);
+ return Interaction.InRangeUnobstructed(user, target, targetCoordinates, targetLocalAngle, range, overlapCheck: false);
}
protected override void DoDamageEffect(List<EntityUid> targets, EntityUid? user, TransformComponent targetXform)
// Could also check the arc though future effort + if they're aimbotting it's not really going to make a difference.
// (This runs lagcomp internally and is what clickattacks use)
- if (!Interaction.InRangeUnobstructed(ignore, targetUid, range + 0.1f))
+ if (!Interaction.InRangeUnobstructed(ignore, targetUid, range + 0.1f, overlapCheck: false))
return false;
// TODO: Check arc though due to the aforementioned aimbot + damage split comments it's less important.
if (session is { } pSession)
{
(targetCoordinates, targetLocalAngle) = _lag.GetCoordinatesAngle(target, pSession);
- return Interaction.InRangeUnobstructed(user, target, targetCoordinates, targetLocalAngle, range);
+ return Interaction.InRangeUnobstructed(user, target, targetCoordinates, targetLocalAngle, range, overlapCheck: false);
}
return Interaction.InRangeUnobstructed(user, target, range);
float range = InteractionRange,
CollisionGroup collisionMask = InRangeUnobstructedMask,
Ignored? predicate = null,
- bool popup = false)
+ bool popup = false,
+ bool overlapCheck = true)
{
if (!Resolve(other, ref other.Comp))
return false;
range,
collisionMask,
predicate,
- popup);
+ popup,
+ overlapCheck);
}
/// <summary>
/// <returns>
/// True if the two points are within a given range without being obstructed.
/// </returns>
+ /// <param name="overlapCheck">If true, if the broadphase query returns an overlap (0f distance) this function will early out true with no raycast made.</param>
public bool InRangeUnobstructed(
Entity<TransformComponent?> origin,
Entity<TransformComponent?> other,
float range = InteractionRange,
CollisionGroup collisionMask = InRangeUnobstructedMask,
Ignored? predicate = null,
- bool popup = false)
+ bool popup = false,
+ bool overlapCheck = true)
{
Ignored combinedPredicate = e => e == origin.Owner || (predicate?.Invoke(e) ?? false);
var inRange = true;
inRange = false;
}
// Overlap, early out and no raycast.
- else if (distance.Equals(0f))
+ else if (overlapCheck && distance.Equals(0f))
{
return true;
}
if (res.Count != 0)
{
- resSet.Add(res[0].HitEntity);
+ // If there's exact distance overlap, we simply have to deal with all overlapping objects to avoid selecting randomly.
+ var resChecked = res.Where(x => x.Distance.Equals(res[0].Distance));
+ foreach (var r in resChecked)
+ {
+ if (Interaction.InRangeUnobstructed(ignore, r.HitEntity, range + 0.1f, overlapCheck: false))
+ resSet.Add(r.HitEntity);
+ }
}
}
fix1:
shape:
!type:PhysShapeAabb
- bounds: "-0.49,-0.49,0.49,-0.36"
+ bounds: "-0.5,-0.5,0.5,-0.28125"
density: 1500
mask:
- FullTileMask