Let order generators account for selection changes
This commit is contained in:
@@ -25,7 +25,6 @@ namespace OpenRA.Mods.Common.Orders
|
||||
yield return new Order("PlaceBeacon", world.LocalPlayer.PlayerActor, Target.FromCell(world, cell), false) { SuppressVisualFeedback = true };
|
||||
}
|
||||
|
||||
protected override void Tick(World world) { }
|
||||
protected override IEnumerable<IRenderable> Render(WorldRenderer wr, World world) { yield break; }
|
||||
protected override IEnumerable<IRenderable> RenderAboveShroud(WorldRenderer wr, World world) { yield break; }
|
||||
protected override IEnumerable<IRenderable> RenderAnnotations(WorldRenderer wr, World world) { yield break; }
|
||||
|
||||
@@ -28,29 +28,31 @@ namespace OpenRA.Mods.Common.Orders
|
||||
yield break;
|
||||
|
||||
var target = FriendlyGuardableUnits(world, mi).FirstOrDefault();
|
||||
if (target == null || Subjects.All(s => s.IsDead))
|
||||
if (target == null)
|
||||
yield break;
|
||||
|
||||
world.CancelInputMode();
|
||||
|
||||
var queued = mi.Modifiers.HasModifier(Modifiers.Shift);
|
||||
yield return new Order(OrderName, null, Target.FromActor(target), queued, null, Subjects.Where(s => s != target).ToArray());
|
||||
yield return new Order(OrderName, null, Target.FromActor(target), queued, null, subjects.Where(s => s != target).ToArray());
|
||||
}
|
||||
|
||||
public override void Tick(World world)
|
||||
public override void SelectionChanged(World world, IEnumerable<Actor> selected)
|
||||
{
|
||||
if (Subjects.All(s => s.IsDead || !s.Info.HasTraitInfo<GuardInfo>()))
|
||||
// Guarding doesn't work without AutoTarget, so require at least one unit in the selection to have it
|
||||
subjects = selected.Where(s => s.Info.HasTraitInfo<GuardInfo>());
|
||||
if (!subjects.Any(s => s.Info.HasTraitInfo<AutoTargetInfo>()))
|
||||
world.CancelInputMode();
|
||||
}
|
||||
|
||||
public override string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi)
|
||||
{
|
||||
if (!Subjects.Any())
|
||||
if (!subjects.Any())
|
||||
return null;
|
||||
|
||||
var multiple = Subjects.Count() > 1;
|
||||
var multiple = subjects.Count() > 1;
|
||||
var canGuard = FriendlyGuardableUnits(world, mi)
|
||||
.Any(a => multiple || a != Subjects.First());
|
||||
.Any(a => multiple || a != subjects.First());
|
||||
|
||||
return canGuard ? Cursor : "move-blocked";
|
||||
}
|
||||
|
||||
@@ -32,12 +32,14 @@ namespace OpenRA.Mods.Common.Orders
|
||||
string IOrderGenerator.GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi) { return GetCursor(world, cell, worldPixel, mi); }
|
||||
void IOrderGenerator.Deactivate() { }
|
||||
bool IOrderGenerator.HandleKeyPress(KeyInput e) { return false; }
|
||||
void IOrderGenerator.SelectionChanged(World world, IEnumerable<Actor> selected) { SelectionChanged(world, selected); }
|
||||
|
||||
protected abstract void Tick(World world);
|
||||
protected virtual void Tick(World world) { }
|
||||
protected abstract IEnumerable<IRenderable> Render(WorldRenderer wr, World world);
|
||||
protected abstract IEnumerable<IRenderable> RenderAboveShroud(WorldRenderer wr, World world);
|
||||
protected abstract IEnumerable<IRenderable> RenderAnnotations(WorldRenderer wr, World world);
|
||||
protected abstract string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi);
|
||||
protected abstract IEnumerable<Order> OrderInner(World world, CPos cell, int2 worldPixel, MouseInput mi);
|
||||
protected virtual void SelectionChanged(World world, IEnumerable<Actor> selected) { }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -222,6 +222,8 @@ namespace OpenRA.Mods.Common.Orders
|
||||
v.Preview.Tick();
|
||||
}
|
||||
|
||||
void IOrderGenerator.SelectionChanged(World world, IEnumerable<Actor> selected) { }
|
||||
|
||||
bool AcceptsPlug(CPos cell, PlugInfo plug)
|
||||
{
|
||||
var host = buildingInfluence.GetBuildingAt(cell);
|
||||
|
||||
Reference in New Issue
Block a user