Fix viewport-px / world-px confusion in ScreenMap. Fixes #3964.
This commit is contained in:
@@ -29,7 +29,7 @@ namespace OpenRA.Orders
|
|||||||
target = Target.FromActor(underCursor);
|
target = Target.FromActor(underCursor);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var frozen = world.ScreenMap.FrozenActorsAt(world.RenderPlayer, mi.Location)
|
var frozen = world.ScreenMap.FrozenActorsAt(world.RenderPlayer, mi)
|
||||||
.Where(a => a.Info.Traits.Contains<ITargetableInfo>())
|
.Where(a => a.Info.Traits.Contains<ITargetableInfo>())
|
||||||
.OrderByDescending(a => a.Info.SelectionPriority())
|
.OrderByDescending(a => a.Info.SelectionPriority())
|
||||||
.FirstOrDefault();
|
.FirstOrDefault();
|
||||||
@@ -77,7 +77,7 @@ namespace OpenRA.Orders
|
|||||||
target = Target.FromActor(underCursor);
|
target = Target.FromActor(underCursor);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var frozen = world.ScreenMap.FrozenActorsAt(world.RenderPlayer, mi.Location)
|
var frozen = world.ScreenMap.FrozenActorsAt(world.RenderPlayer, mi)
|
||||||
.Where(a => a.Info.Traits.Contains<ITargetableInfo>())
|
.Where(a => a.Info.Traits.Contains<ITargetableInfo>())
|
||||||
.OrderByDescending(a => a.Info.SelectionPriority())
|
.OrderByDescending(a => a.Info.SelectionPriority())
|
||||||
.FirstOrDefault();
|
.FirstOrDefault();
|
||||||
|
|||||||
@@ -110,24 +110,29 @@ namespace OpenRA.Traits
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static readonly IEnumerable<FrozenActor> NoFrozenActors = new FrozenActor[0].AsEnumerable();
|
public static readonly IEnumerable<FrozenActor> NoFrozenActors = new FrozenActor[0].AsEnumerable();
|
||||||
public IEnumerable<FrozenActor> FrozenActorsAt(Player viewer, int2 pxPos)
|
public IEnumerable<FrozenActor> FrozenActorsAt(Player viewer, int2 worldPx)
|
||||||
{
|
{
|
||||||
if (viewer == null)
|
if (viewer == null)
|
||||||
return NoFrozenActors;
|
return NoFrozenActors;
|
||||||
|
|
||||||
var i = (pxPos.X / info.BinSize).Clamp(0, cols - 1);
|
var i = (worldPx.X / info.BinSize).Clamp(0, cols - 1);
|
||||||
var j = (pxPos.Y / info.BinSize).Clamp(0, rows - 1);
|
var j = (worldPx.Y / info.BinSize).Clamp(0, rows - 1);
|
||||||
return frozen[viewer][j*cols + i]
|
return frozen[viewer][j*cols + i]
|
||||||
.Where(kv => kv.Key.IsValid && kv.Value.Contains(pxPos))
|
.Where(kv => kv.Key.IsValid && kv.Value.Contains(worldPx))
|
||||||
.Select(kv => kv.Key);
|
.Select(kv => kv.Key);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<Actor> ActorsAt(int2 pxPos)
|
public IEnumerable<FrozenActor> FrozenActorsAt(Player viewer, MouseInput mi)
|
||||||
{
|
{
|
||||||
var i = (pxPos.X / info.BinSize).Clamp(0, cols - 1);
|
return FrozenActorsAt(viewer, worldRenderer.Viewport.ViewToWorldPx(mi.Location));
|
||||||
var j = (pxPos.Y / info.BinSize).Clamp(0, rows - 1);
|
}
|
||||||
|
|
||||||
|
public IEnumerable<Actor> ActorsAt(int2 worldPx)
|
||||||
|
{
|
||||||
|
var i = (worldPx.X / info.BinSize).Clamp(0, cols - 1);
|
||||||
|
var j = (worldPx.Y / info.BinSize).Clamp(0, rows - 1);
|
||||||
return actors[j * cols + i]
|
return actors[j * cols + i]
|
||||||
.Where(kv => kv.Key.IsInWorld && kv.Value.Contains(pxPos))
|
.Where(kv => kv.Key.IsInWorld && kv.Value.Contains(worldPx))
|
||||||
.Select(kv => kv.Key);
|
.Select(kv => kv.Key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -117,7 +117,7 @@ namespace OpenRA.Widgets
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var frozen = world.ScreenMap.FrozenActorsAt(world.RenderPlayer, Viewport.LastMousePos)
|
var frozen = world.ScreenMap.FrozenActorsAt(world.RenderPlayer, worldRenderer.Viewport.ViewToWorldPx(Viewport.LastMousePos))
|
||||||
.Where(a => a.TooltipName != null)
|
.Where(a => a.TooltipName != null)
|
||||||
.OrderByDescending(a => a.Info.SelectionPriority())
|
.OrderByDescending(a => a.Info.SelectionPriority())
|
||||||
.FirstOrDefault();
|
.FirstOrDefault();
|
||||||
|
|||||||
Reference in New Issue
Block a user