Remove PPos overload of FindUnitsInCircle.
This commit is contained in:
@@ -55,25 +55,20 @@ namespace OpenRA
|
|||||||
return actors.OrderBy(a => (a.CenterPosition - pos).LengthSquared).FirstOrDefault();
|
return actors.OrderBy(a => (a.CenterPosition - pos).LengthSquared).FirstOrDefault();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IEnumerable<Actor> FindUnitsInCircle(this World world, WPos a, WRange r)
|
public static IEnumerable<Actor> FindUnitsInCircle(this World world, WPos origin, WRange r)
|
||||||
{
|
|
||||||
return world.FindUnitsInCircle(PPos.FromWPos(a), r.Range * Game.CellSize / 1024);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static IEnumerable<Actor> FindUnitsInCircle(this World world, PPos a, int r)
|
|
||||||
{
|
{
|
||||||
using (new PerfSample("FindUnitsInCircle"))
|
using (new PerfSample("FindUnitsInCircle"))
|
||||||
{
|
{
|
||||||
var min = a - PVecInt.FromRadius(r);
|
// Target ranges are calculated in 2D, so ignore height differences
|
||||||
var max = a + PVecInt.FromRadius(r);
|
var vec = new WVec(r, r, WRange.Zero);
|
||||||
|
var rSq = r.Range*r.Range;
|
||||||
var actors = world.FindUnits(min, max);
|
return world.FindUnits(origin - vec, origin + vec).Where(a =>
|
||||||
|
{
|
||||||
var rect = new Rectangle(min.X, min.Y, max.X - min.X, max.Y - min.Y);
|
var pos = a.CenterPosition;
|
||||||
|
var dx = (long)(pos.X - origin.X);
|
||||||
var inBox = actors.Where(x => x.ExtendedBounds.Value.IntersectsWith(rect));
|
var dy = (long)(pos.Y - origin.Y);
|
||||||
|
return dx*dx + dy*dy <= rSq;
|
||||||
return inBox.Where(x => (x.CenterLocation - a).LengthSquared < r * r);
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -52,21 +52,13 @@ namespace OpenRA.Mods.RA.Activities
|
|||||||
int searchRadiusSquared = searchRadius * searchRadius;
|
int searchRadiusSquared = searchRadius * searchRadius;
|
||||||
|
|
||||||
// Find harvestable resources nearby:
|
// Find harvestable resources nearby:
|
||||||
|
// Avoid enemy territory:
|
||||||
|
// TODO: calculate weapons ranges of units and factor those in instead of hard-coding 8.
|
||||||
var path = self.World.WorldActor.Trait<PathFinder>().FindPath(
|
var path = self.World.WorldActor.Trait<PathFinder>().FindPath(
|
||||||
PathSearch.Search(self.World, mobileInfo, self, true)
|
PathSearch.Search(self.World, mobileInfo, self, true)
|
||||||
.WithCustomCost(loc =>
|
.WithCustomCost(loc => self.World.FindUnitsInCircle(loc.CenterPosition, WRange.FromCells(8))
|
||||||
{
|
.Where (u => !u.Destroyed && self.Owner.Stances[u.Owner] == Stance.Enemy)
|
||||||
// Avoid enemy territory:
|
.Sum(u => Math.Max(0, 64 - (loc - u.Location).LengthSquared)))
|
||||||
int safetycost = (
|
|
||||||
// TODO: calculate weapons ranges of units and factor those in instead of hard-coding 8.
|
|
||||||
from u in self.World.FindUnitsInCircle(loc.ToPPos(), Game.CellSize * 8)
|
|
||||||
where !u.Destroyed
|
|
||||||
where self.Owner.Stances[u.Owner] == Stance.Enemy
|
|
||||||
select Math.Max(0, 64 - (loc - u.Location).LengthSquared)
|
|
||||||
).Sum();
|
|
||||||
|
|
||||||
return safetycost;
|
|
||||||
})
|
|
||||||
.WithHeuristic(loc =>
|
.WithHeuristic(loc =>
|
||||||
{
|
{
|
||||||
// Avoid this cell:
|
// Avoid this cell:
|
||||||
|
|||||||
@@ -113,7 +113,8 @@ namespace OpenRA.Mods.RA.Air
|
|||||||
/* repulsion only applies when we're flying */
|
/* repulsion only applies when we're flying */
|
||||||
if (Altitude <= 0) return;
|
if (Altitude <= 0) return;
|
||||||
|
|
||||||
var otherHelis = self.World.FindUnitsInCircle(self.CenterLocation, Info.IdealSeparation)
|
var separation = new WRange(Info.IdealSeparation * 1024 / Game.CellSize);
|
||||||
|
var otherHelis = self.World.FindUnitsInCircle(self.CenterPosition, separation)
|
||||||
.Where(a => a.HasTrait<Helicopter>());
|
.Where(a => a.HasTrait<Helicopter>());
|
||||||
|
|
||||||
var f = otherHelis
|
var f = otherHelis
|
||||||
|
|||||||
@@ -105,7 +105,8 @@ namespace OpenRA.Mods.RA
|
|||||||
case DamageModel.Normal:
|
case DamageModel.Normal:
|
||||||
{
|
{
|
||||||
var maxSpread = warhead.Spread * (float)Math.Log(Math.Abs(warhead.Damage), 2);
|
var maxSpread = warhead.Spread * (float)Math.Log(Math.Abs(warhead.Damage), 2);
|
||||||
var hitActors = world.FindUnitsInCircle(args.dest, (int)maxSpread);
|
var range = new WRange((int)maxSpread * 1024 / Game.CellSize);
|
||||||
|
var hitActors = world.FindUnitsInCircle(args.dest.ToWPos(0), range);
|
||||||
|
|
||||||
foreach (var victim in hitActors)
|
foreach (var victim in hitActors)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -109,7 +109,7 @@ namespace OpenRA.Mods.RA
|
|||||||
|
|
||||||
IEnumerable<Actor> UnitsInRange()
|
IEnumerable<Actor> UnitsInRange()
|
||||||
{
|
{
|
||||||
return Self.World.FindUnitsInCircle(Self.CenterLocation, Game.CellSize * Info.Range)
|
return Self.World.FindUnitsInCircle(Self.CenterPosition, WRange.FromCells(Info.Range))
|
||||||
.Where(a => a.IsInWorld && a != Self && !a.Destroyed)
|
.Where(a => a.IsInWorld && a != Self && !a.Destroyed)
|
||||||
.Where(a => !a.Owner.NonCombatant);
|
.Where(a => !a.Owner.NonCombatant);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user