Migrate frozen actors from ExtraData to Target.
This commit is contained in:
@@ -74,9 +74,7 @@ namespace OpenRA
|
|||||||
TargetString = targetString;
|
TargetString = targetString;
|
||||||
Queued = queued;
|
Queued = queued;
|
||||||
ExtraLocation = extraLocation;
|
ExtraLocation = extraLocation;
|
||||||
|
ExtraData = extraData;
|
||||||
// TODO: remove FrozenActor ID after the various ResolveOrders that rely on it are updated
|
|
||||||
ExtraData = target.Type == TargetType.FrozenActor ? target.FrozenActor.ID : extraData;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Order Deserialize(World world, BinaryReader r)
|
public static Order Deserialize(World world, BinaryReader r)
|
||||||
|
|||||||
@@ -72,29 +72,14 @@ namespace OpenRA.Mods.Cnc.Traits
|
|||||||
if (IsTraitDisabled)
|
if (IsTraitDisabled)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Not targeting an actor
|
IEnumerable<string> targetTypes = null;
|
||||||
if (order.ExtraData == 0 && order.TargetActor == null)
|
if (order.Target.Type == TargetType.FrozenActor)
|
||||||
return false;
|
targetTypes = order.Target.FrozenActor.TargetTypes;
|
||||||
|
|
||||||
IEnumerable<string> targetTypes;
|
if (order.Target.Type == TargetType.Actor)
|
||||||
|
|
||||||
if (order.ExtraData != 0)
|
|
||||||
{
|
|
||||||
// Targeted an actor under the fog
|
|
||||||
var frozenLayer = self.Owner.PlayerActor.TraitOrDefault<FrozenActorLayer>();
|
|
||||||
if (frozenLayer == null)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
var frozen = frozenLayer.FromID(order.ExtraData);
|
|
||||||
if (frozen == null)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
targetTypes = frozen.TargetTypes;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
targetTypes = order.TargetActor.GetEnabledTargetTypes();
|
targetTypes = order.TargetActor.GetEnabledTargetTypes();
|
||||||
|
|
||||||
return Info.Types.Overlaps(targetTypes);
|
return targetTypes != null && Info.Types.Overlaps(targetTypes);
|
||||||
}
|
}
|
||||||
|
|
||||||
public string VoicePhraseForOrder(Actor self, Order order)
|
public string VoicePhraseForOrder(Actor self, Order order)
|
||||||
|
|||||||
@@ -59,20 +59,16 @@ namespace OpenRA.Mods.Common
|
|||||||
return stance == Stance.Enemy;
|
return stance == Stance.Enemy;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// DEPRECATED: Write code that can handle FrozenActors correctly instead.
|
||||||
|
/// </summary>
|
||||||
public static Target ResolveFrozenActorOrder(this Actor self, Order order, Color targetLine)
|
public static Target ResolveFrozenActorOrder(this Actor self, Order order, Color targetLine)
|
||||||
{
|
{
|
||||||
// Not targeting a frozen actor
|
// Not targeting a frozen actor
|
||||||
if (order.ExtraData == 0)
|
if (order.Target.Type != TargetType.FrozenActor)
|
||||||
return Target.FromOrder(self.World, order);
|
return order.Target;
|
||||||
|
|
||||||
// Targeted an actor under the fog
|
var frozen = order.Target.FrozenActor;
|
||||||
var frozenLayer = self.Owner.PlayerActor.TraitOrDefault<FrozenActorLayer>();
|
|
||||||
if (frozenLayer == null)
|
|
||||||
return Target.Invalid;
|
|
||||||
|
|
||||||
var frozen = frozenLayer.FromID(order.ExtraData);
|
|
||||||
if (frozen == null)
|
|
||||||
return Target.Invalid;
|
|
||||||
|
|
||||||
// Flashes the frozen proxy
|
// Flashes the frozen proxy
|
||||||
self.SetTargetLine(frozen, targetLine, true);
|
self.SetTargetLine(frozen, targetLine, true);
|
||||||
|
|||||||
@@ -159,28 +159,6 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
self.CancelActivity();
|
self.CancelActivity();
|
||||||
}
|
}
|
||||||
|
|
||||||
static Target TargetFromOrder(Actor self, Order order)
|
|
||||||
{
|
|
||||||
// Not targeting a frozen actor
|
|
||||||
if (order.ExtraData == 0)
|
|
||||||
return Target.FromOrder(self.World, order);
|
|
||||||
|
|
||||||
// Targeted an actor under the fog
|
|
||||||
var frozenLayer = self.Owner.PlayerActor.TraitOrDefault<FrozenActorLayer>();
|
|
||||||
if (frozenLayer == null)
|
|
||||||
return Target.Invalid;
|
|
||||||
|
|
||||||
var frozen = frozenLayer.FromID(order.ExtraData);
|
|
||||||
if (frozen == null)
|
|
||||||
return Target.Invalid;
|
|
||||||
|
|
||||||
// Target is still alive - resolve the real order
|
|
||||||
if (frozen.Actor != null && frozen.Actor.IsInWorld)
|
|
||||||
return Target.FromActor(frozen.Actor);
|
|
||||||
|
|
||||||
return Target.Invalid;
|
|
||||||
}
|
|
||||||
|
|
||||||
string IOrderVoice.VoicePhraseForOrder(Actor self, Order order)
|
string IOrderVoice.VoicePhraseForOrder(Actor self, Order order)
|
||||||
{
|
{
|
||||||
return order.OrderString == attackOrderName || order.OrderString == forceAttackOrderName ? Info.Voice : null;
|
return order.OrderString == attackOrderName || order.OrderString == forceAttackOrderName ? Info.Voice : null;
|
||||||
|
|||||||
@@ -56,25 +56,13 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
|
|
||||||
static bool IsValidOrder(Actor self, Order order)
|
static bool IsValidOrder(Actor self, Order order)
|
||||||
{
|
{
|
||||||
// Not targeting a frozen actor
|
if (order.Target.Type == TargetType.FrozenActor)
|
||||||
if (order.ExtraData == 0 && order.TargetActor == null)
|
return order.Target.FrozenActor.DamageState > DamageState.Undamaged;
|
||||||
return false;
|
|
||||||
|
|
||||||
if (order.ExtraData != 0)
|
if (order.Target.Type == TargetType.Actor)
|
||||||
{
|
return order.TargetActor.GetDamageState() > DamageState.Undamaged;
|
||||||
// Targeted an actor under the fog
|
|
||||||
var frozenLayer = self.Owner.PlayerActor.TraitOrDefault<FrozenActorLayer>();
|
|
||||||
if (frozenLayer == null)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
var frozen = frozenLayer.FromID(order.ExtraData);
|
return false;
|
||||||
if (frozen == null)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return frozen.DamageState > DamageState.Undamaged;
|
|
||||||
}
|
|
||||||
|
|
||||||
return order.TargetActor.GetDamageState() > DamageState.Undamaged;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public string VoicePhraseForOrder(Actor self, Order order)
|
public string VoicePhraseForOrder(Actor self, Order order)
|
||||||
|
|||||||
@@ -71,27 +71,20 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
|
|
||||||
static bool IsValidOrder(Actor self, Order order)
|
static bool IsValidOrder(Actor self, Order order)
|
||||||
{
|
{
|
||||||
// Not targeting an actor
|
if (order.Target.Type == TargetType.FrozenActor)
|
||||||
if (order.ExtraData == 0 && order.TargetActor == null)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (order.ExtraData != 0)
|
|
||||||
{
|
{
|
||||||
// Targeted an actor under the fog
|
var frozen = order.Target.FrozenActor;
|
||||||
var frozenLayer = self.Owner.PlayerActor.TraitOrDefault<FrozenActorLayer>();
|
|
||||||
if (frozenLayer == null)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
var frozen = frozenLayer.FromID(order.ExtraData);
|
|
||||||
if (frozen == null)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
var ci = frozen.Info.TraitInfoOrDefault<ExternalCapturableInfo>();
|
var ci = frozen.Info.TraitInfoOrDefault<ExternalCapturableInfo>();
|
||||||
return ci != null && ci.CanBeTargetedBy(self, frozen.Owner);
|
return ci != null && ci.CanBeTargetedBy(self, frozen.Owner);
|
||||||
}
|
}
|
||||||
|
|
||||||
var c = order.TargetActor.TraitOrDefault<ExternalCapturable>();
|
if (order.Target.Type == TargetType.Actor)
|
||||||
return c != null && !c.CaptureInProgress && c.Info.CanBeTargetedBy(self, order.TargetActor.Owner);
|
{
|
||||||
|
var c = order.TargetActor.TraitOrDefault<ExternalCapturable>();
|
||||||
|
return c != null && !c.CaptureInProgress && c.Info.CanBeTargetedBy(self, order.TargetActor.Owner);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public string VoicePhraseForOrder(Actor self, Order order)
|
public string VoicePhraseForOrder(Actor self, Order order)
|
||||||
|
|||||||
Reference in New Issue
Block a user