Fix blocked cursor for queued undeploy orders.
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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>();
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user