Fix blocked cursor for queued undeploy orders.

This commit is contained in:
Paul Chote
2019-06-20 20:19:23 +00:00
committed by reaperrr
parent 8f573568c8
commit 739f437c18
6 changed files with 55 additions and 22 deletions

View File

@@ -184,12 +184,12 @@ namespace OpenRA.Mods.Common.Traits
var location = self.World.Map.CellContaining(target.CenterPosition); var location = self.World.Map.CellContaining(target.CenterPosition);
var explored = self.Owner.Shroud.IsExplored(location); var explored = self.Owner.Shroud.IsExplored(location);
cursor = self.World.Map.Contains(location) ? cursor = self.World.Map.Contains(location) ?
(self.World.Map.GetTerrainInfo(location).CustomCursor ?? "move") : self.World.Map.GetTerrainInfo(location).CustomCursor ?? "move" : "move-blocked";
"move-blocked";
IsQueued = modifiers.HasModifier(TargetModifiers.ForceQueue); IsQueued = modifiers.HasModifier(TargetModifiers.ForceQueue);
if (!explored && !aircraft.Info.MoveIntoShroud) if (!(self.CurrentActivity is Transform || aircraft.transforms.Any(t => !t.IsTraitDisabled && !t.IsTraitPaused))
|| (!explored && !aircraft.Info.MoveIntoShroud))
cursor = "move-blocked"; cursor = "move-blocked";
return true; return true;

View File

@@ -32,15 +32,19 @@ namespace OpenRA.Mods.Common.Traits
[Desc("Require the force-move modifier to display the enter cursor.")] [Desc("Require the force-move modifier to display the enter cursor.")]
public readonly bool RequiresForceMove = false; public readonly bool RequiresForceMove = false;
public override object Create(ActorInitializer init) { return new TransformsIntoEntersTunnels(this); } public override object Create(ActorInitializer init) { return new TransformsIntoEntersTunnels(init.Self, this); }
} }
public class TransformsIntoEntersTunnels : ConditionalTrait<TransformsIntoEntersTunnelsInfo>, IIssueOrder, IResolveOrder, IOrderVoice public class TransformsIntoEntersTunnels : ConditionalTrait<TransformsIntoEntersTunnelsInfo>, IIssueOrder, IResolveOrder, IOrderVoice
{ {
readonly Actor self;
Transforms[] transforms; Transforms[] transforms;
public TransformsIntoEntersTunnels(TransformsIntoEntersTunnelsInfo info) public TransformsIntoEntersTunnels(Actor self, TransformsIntoEntersTunnelsInfo info)
: base(info) { } : base(info)
{
this.self = self;
}
protected override void Created(Actor self) protected override void Created(Actor self)
{ {
@@ -53,10 +57,20 @@ namespace OpenRA.Mods.Common.Traits
get get
{ {
if (!IsTraitDisabled) if (!IsTraitDisabled)
yield return new EntersTunnels.EnterTunnelOrderTargeter(Info.EnterCursor, Info.EnterBlockedCursor, () => Info.RequiresForceMove); yield return new EntersTunnels.EnterTunnelOrderTargeter(Info.EnterCursor, Info.EnterBlockedCursor, CanEnterTunnel, UseEnterCursor);
} }
} }
bool CanEnterTunnel(Actor target, TargetModifiers modifiers)
{
return !Info.RequiresForceMove || modifiers.HasModifier(TargetModifiers.ForceMove);
}
bool UseEnterCursor(Actor target)
{
return self.CurrentActivity is Transform || transforms.Any(t => !t.IsTraitDisabled && !t.IsTraitPaused);
}
Order IIssueOrder.IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued) Order IIssueOrder.IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued)
{ {
if (order.OrderID == "EnterTunnel") if (order.OrderID == "EnterTunnel")

View File

@@ -176,7 +176,7 @@ namespace OpenRA.Mods.Common.Traits
(self.World.Map.GetTerrainInfo(location).CustomCursor ?? mobile.Info.Cursor) : mobile.Info.BlockedCursor; (self.World.Map.GetTerrainInfo(location).CustomCursor ?? mobile.Info.Cursor) : mobile.Info.BlockedCursor;
var locomotor = mobile.Info.LocomotorInfo; var locomotor = mobile.Info.LocomotorInfo;
if (!mobile.transforms.Any(t => !t.IsTraitDisabled && !t.IsTraitPaused) if (!(self.CurrentActivity is Transform || mobile.transforms.Any(t => !t.IsTraitDisabled && !t.IsTraitPaused))
|| (!explored && !locomotor.MoveIntoShroud) || (!explored && !locomotor.MoveIntoShroud)
|| (explored && !CanEnterCell(self.World, self, location))) || (explored && !CanEnterCell(self.World, self, location)))
cursor = mobile.Info.BlockedCursor; cursor = mobile.Info.BlockedCursor;

View File

@@ -32,15 +32,19 @@ namespace OpenRA.Mods.Common.Traits
[Desc("Require the force-move modifier to display the enter cursor.")] [Desc("Require the force-move modifier to display the enter cursor.")]
public readonly bool RequiresForceMove = false; public readonly bool RequiresForceMove = false;
public override object Create(ActorInitializer init) { return new TransformsIntoPassenger(this); } public override object Create(ActorInitializer init) { return new TransformsIntoPassenger(init.Self, this); }
} }
public class TransformsIntoPassenger : ConditionalTrait<TransformsIntoPassengerInfo>, IIssueOrder, IResolveOrder, IOrderVoice public class TransformsIntoPassenger : ConditionalTrait<TransformsIntoPassengerInfo>, IIssueOrder, IResolveOrder, IOrderVoice
{ {
readonly Actor self;
Transforms[] transforms; Transforms[] transforms;
public TransformsIntoPassenger(TransformsIntoPassengerInfo info) public TransformsIntoPassenger(Actor self, TransformsIntoPassengerInfo info)
: base(info) { } : base(info)
{
this.self = self;
}
protected override void Created(Actor self) protected override void Created(Actor self)
{ {
@@ -81,7 +85,7 @@ namespace OpenRA.Mods.Common.Traits
bool CanEnter(Actor target) bool CanEnter(Actor target)
{ {
if (!transforms.Any(t => !t.IsTraitDisabled && !t.IsTraitPaused)) if (!(self.CurrentActivity is Transform || transforms.Any(t => !t.IsTraitDisabled && !t.IsTraitPaused)))
return false; return false;
var cargo = target.TraitOrDefault<Cargo>(); var cargo = target.TraitOrDefault<Cargo>();

View File

@@ -33,16 +33,20 @@ namespace OpenRA.Mods.Common.Traits
[Desc("Require the force-move modifier to display the enter cursor.")] [Desc("Require the force-move modifier to display the enter cursor.")]
public readonly bool RequiresForceMove = false; public readonly bool RequiresForceMove = false;
public override object Create(ActorInitializer init) { return new TransformsIntoRepairable(this); } public override object Create(ActorInitializer init) { return new TransformsIntoRepairable(init.Self, this); }
} }
public class TransformsIntoRepairable : ConditionalTrait<TransformsIntoRepairableInfo>, IIssueOrder, IResolveOrder, IOrderVoice public class TransformsIntoRepairable : ConditionalTrait<TransformsIntoRepairableInfo>, IIssueOrder, IResolveOrder, IOrderVoice
{ {
readonly Actor self;
Transforms[] transforms; Transforms[] transforms;
IHealth health; IHealth health;
public TransformsIntoRepairable(TransformsIntoRepairableInfo info) public TransformsIntoRepairable(Actor self, TransformsIntoRepairableInfo info)
: base(info) { } : base(info)
{
this.self = self;
}
protected override void Created(Actor self) protected override void Created(Actor self)
{ {
@@ -62,7 +66,10 @@ namespace OpenRA.Mods.Common.Traits
bool CanRepair() bool CanRepair()
{ {
return health.DamageState > DamageState.Undamaged && transforms.Any(t => !t.IsTraitDisabled && !t.IsTraitPaused); if (!(self.CurrentActivity is Transform || transforms.Any(t => !t.IsTraitDisabled && !t.IsTraitPaused)))
return false;
return health.DamageState > DamageState.Undamaged;
} }
bool CanRepairAt(Actor target, TargetModifiers modifiers) bool CanRepairAt(Actor target, TargetModifiers modifiers)

View File

@@ -51,10 +51,15 @@ namespace OpenRA.Mods.Common.Traits
{ {
get get
{ {
yield return new EnterTunnelOrderTargeter(info.EnterCursor, info.EnterBlockedCursor, () => requireForceMove); yield return new EnterTunnelOrderTargeter(info.EnterCursor, info.EnterBlockedCursor, CanEnterTunnel, _ => true);
} }
} }
bool CanEnterTunnel(Actor target, TargetModifiers modifiers)
{
return !requireForceMove || modifiers.HasModifier(TargetModifiers.ForceMove);
}
public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued) public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued)
{ {
if (order.OrderID != "EnterTunnel") if (order.OrderID != "EnterTunnel")
@@ -100,19 +105,22 @@ namespace OpenRA.Mods.Common.Traits
{ {
readonly string enterCursor; readonly string enterCursor;
readonly string enterBlockedCursor; readonly string enterBlockedCursor;
readonly Func<bool> requireForceMove; readonly Func<Actor, TargetModifiers, bool> canTarget;
readonly Func<Actor, bool> useEnterCursor;
public EnterTunnelOrderTargeter(string enterCursor, string enterBlockedCursor, Func<bool> requireForceMove) public EnterTunnelOrderTargeter(string enterCursor, string enterBlockedCursor,
Func<Actor, TargetModifiers, bool> canTarget, Func<Actor, bool> useEnterCursor)
: base("EnterTunnel", 6, enterCursor, true, true) : base("EnterTunnel", 6, enterCursor, true, true)
{ {
this.enterCursor = enterCursor; this.enterCursor = enterCursor;
this.enterBlockedCursor = enterBlockedCursor; this.enterBlockedCursor = enterBlockedCursor;
this.requireForceMove = requireForceMove; this.canTarget = canTarget;
this.useEnterCursor = useEnterCursor;
} }
public override bool CanTargetActor(Actor self, Actor target, TargetModifiers modifiers, ref string cursor) public override bool CanTargetActor(Actor self, Actor target, TargetModifiers modifiers, ref string cursor)
{ {
if (target == null || target.IsDead || (requireForceMove() && !modifiers.HasModifier(TargetModifiers.ForceMove))) if (target == null || target.IsDead || !canTarget(target, modifiers))
return false; return false;
var tunnel = target.TraitOrDefault<TunnelEntrance>(); var tunnel = target.TraitOrDefault<TunnelEntrance>();
@@ -135,7 +143,7 @@ namespace OpenRA.Mods.Common.Traits
return false; return false;
} }
cursor = enterCursor; cursor = useEnterCursor(target) ? enterCursor : enterBlockedCursor;
return true; return true;
} }