prevent allied units from autoattack building which is being captured. resolves #6170.

This commit is contained in:
Michael Rätzel
2015-11-11 14:32:38 +01:00
parent d33922915e
commit 51bb515a4d
4 changed files with 24 additions and 3 deletions

View File

@@ -90,6 +90,7 @@ Also thanks to:
* Matthijs Benschop (Nerdie) * Matthijs Benschop (Nerdie)
* Max621 * Max621
* Max Ugrumov (katzsmile) * Max Ugrumov (katzsmile)
* Michael Rätzel
* Michael Sztolcman (s1w_) * Michael Sztolcman (s1w_)
* Mustafa Alperen Seki (MustaphaTR) * Mustafa Alperen Seki (MustaphaTR)
* Neil Shivkar (havok13888) * Neil Shivkar (havok13888)

View File

@@ -168,7 +168,8 @@ namespace OpenRA.Mods.Common.Traits
Actor ChooseTarget(Actor self, WDist range, bool allowMove) Actor ChooseTarget(Actor self, WDist range, bool allowMove)
{ {
var inRange = self.World.FindActorsInCircle(self.CenterPosition, range) var inRange = self.World.FindActorsInCircle(self.CenterPosition, range)
.Where(a => !a.Info.HasTraitInfo<AutoTargetIgnoreInfo>()); .Where(a =>
!a.TraitsImplementing<IPreventsAutoTarget>().Any(t => t.PreventsAutoTarget(a, self)));
// Armaments are enumerated in attack.Armaments in construct order // Armaments are enumerated in attack.Armaments in construct order
// When autotargeting, first choose targets according to the used armament construct order // When autotargeting, first choose targets according to the used armament construct order
@@ -207,7 +208,13 @@ namespace OpenRA.Mods.Common.Traits
[Desc("Will not get automatically targeted by enemy (like walls)")] [Desc("Will not get automatically targeted by enemy (like walls)")]
class AutoTargetIgnoreInfo : TraitInfo<AutoTargetIgnore> { } class AutoTargetIgnoreInfo : TraitInfo<AutoTargetIgnore> { }
class AutoTargetIgnore { } class AutoTargetIgnore : IPreventsAutoTarget
{
public bool PreventsAutoTarget(Actor self, Actor attacker)
{
return true;
}
}
public class StanceInit : IActorInit<UnitStance> public class StanceInit : IActorInit<UnitStance>
{ {

View File

@@ -24,6 +24,9 @@ namespace OpenRA.Mods.Common.Traits
[Desc("Seconds it takes to change the owner.", "You might want to add a ExternalCapturableBar: trait, too.")] [Desc("Seconds it takes to change the owner.", "You might want to add a ExternalCapturableBar: trait, too.")]
public readonly int CaptureCompleteTime = 15; public readonly int CaptureCompleteTime = 15;
[Desc("Whether to prevent autotargeting this actor while it is being captured by an ally.")]
public readonly bool PreventsAutoTarget = true;
public bool CanBeTargetedBy(Actor captor, Player owner) public bool CanBeTargetedBy(Actor captor, Player owner)
{ {
var c = captor.Info.TraitInfoOrDefault<ExternalCapturesInfo>(); var c = captor.Info.TraitInfoOrDefault<ExternalCapturesInfo>();
@@ -49,7 +52,7 @@ namespace OpenRA.Mods.Common.Traits
public object Create(ActorInitializer init) { return new ExternalCapturable(init.Self, this); } public object Create(ActorInitializer init) { return new ExternalCapturable(init.Self, this); }
} }
public class ExternalCapturable : ITick, ISync public class ExternalCapturable : ITick, ISync, IPreventsAutoTarget
{ {
[Sync] public int CaptureProgressTime = 0; [Sync] public int CaptureProgressTime = 0;
[Sync] public Actor Captor; [Sync] public Actor Captor;
@@ -91,5 +94,10 @@ namespace OpenRA.Mods.Common.Traits
else else
CaptureProgressTime++; CaptureProgressTime++;
} }
public bool PreventsAutoTarget(Actor self, Actor attacker)
{
return Info.PreventsAutoTarget && Captor != null && attacker.AppearsFriendlyTo(Captor);
}
} }
} }

View File

@@ -121,4 +121,9 @@ namespace OpenRA.Mods.Common.Traits
{ {
void ModifyDeathActorInit(Actor self, TypeDictionary init); void ModifyDeathActorInit(Actor self, TypeDictionary init);
} }
public interface IPreventsAutoTarget
{
bool PreventsAutoTarget(Actor self, Actor attacker);
}
} }