Make EngineerRepairable conditional.
This commit is contained in:
committed by
atlimit8
parent
9e534f3804
commit
101843fbb7
@@ -21,6 +21,7 @@ namespace OpenRA.Mods.Common.Activities
|
|||||||
|
|
||||||
Actor enterActor;
|
Actor enterActor;
|
||||||
IHealth enterHealth;
|
IHealth enterHealth;
|
||||||
|
EngineerRepairable enterEngineerRepariable;
|
||||||
|
|
||||||
public RepairBuilding(Actor self, Target target, EngineerRepairInfo info)
|
public RepairBuilding(Actor self, Target target, EngineerRepairInfo info)
|
||||||
: base(self, target, Color.Yellow)
|
: base(self, target, Color.Yellow)
|
||||||
@@ -32,11 +33,12 @@ namespace OpenRA.Mods.Common.Activities
|
|||||||
{
|
{
|
||||||
enterActor = targetActor;
|
enterActor = targetActor;
|
||||||
enterHealth = targetActor.TraitOrDefault<IHealth>();
|
enterHealth = targetActor.TraitOrDefault<IHealth>();
|
||||||
|
enterEngineerRepariable = targetActor.TraitOrDefault<EngineerRepairable>();
|
||||||
|
|
||||||
// Make sure we can still repair the target before entering
|
// Make sure we can still repair the target before entering
|
||||||
// (but not before, because this may stop the actor in the middle of nowhere)
|
// (but not before, because this may stop the actor in the middle of nowhere)
|
||||||
var stance = self.Owner.Stances[enterActor.Owner];
|
var stance = self.Owner.Stances[enterActor.Owner];
|
||||||
if (enterHealth == null || enterHealth.DamageState == DamageState.Undamaged || !info.ValidStances.HasStance(stance))
|
if (enterHealth == null || enterHealth.DamageState == DamageState.Undamaged || enterEngineerRepariable == null || enterEngineerRepariable.IsTraitDisabled || !info.ValidStances.HasStance(stance))
|
||||||
{
|
{
|
||||||
Cancel(self, true);
|
Cancel(self, true);
|
||||||
return false;
|
return false;
|
||||||
@@ -52,6 +54,9 @@ namespace OpenRA.Mods.Common.Activities
|
|||||||
if (targetActor != enterActor)
|
if (targetActor != enterActor)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (enterEngineerRepariable.IsTraitDisabled)
|
||||||
|
return;
|
||||||
|
|
||||||
if (enterHealth.DamageState == DamageState.Undamaged)
|
if (enterHealth.DamageState == DamageState.Undamaged)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|||||||
@@ -108,11 +108,11 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
var engineerRepairable = target.Info.TraitInfoOrDefault<EngineerRepairableInfo>();
|
var engineerRepairable = target.TraitOrDefault<EngineerRepairable>();
|
||||||
if (engineerRepairable == null)
|
if (engineerRepairable == null || engineerRepairable.IsTraitDisabled)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!engineerRepairable.Types.IsEmpty && !engineerRepairable.Types.Overlaps(info.Types))
|
if (!engineerRepairable.Info.Types.IsEmpty && !engineerRepairable.Info.Types.Overlaps(info.Types))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!info.ValidStances.HasStance(self.Owner.Stances[target.Owner]))
|
if (!info.ValidStances.HasStance(self.Owner.Stances[target.Owner]))
|
||||||
@@ -126,6 +126,10 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
|
|
||||||
public override bool CanTargetFrozenActor(Actor self, FrozenActor target, TargetModifiers modifiers, ref string cursor)
|
public override bool CanTargetFrozenActor(Actor self, FrozenActor target, TargetModifiers modifiers, ref string cursor)
|
||||||
{
|
{
|
||||||
|
// TODO: FrozenActors don't yet have a way of caching conditions, so we can't filter disabled traits
|
||||||
|
// This therefore assumes that all EngineerRepairable traits are enabled, which is probably wrong.
|
||||||
|
// Actors with FrozenUnderFog should therefore not disable the EngineerRepairable trait if
|
||||||
|
// ValidStances includes Enemy actors.
|
||||||
var engineerRepairable = target.Info.TraitInfoOrDefault<EngineerRepairableInfo>();
|
var engineerRepairable = target.Info.TraitInfoOrDefault<EngineerRepairableInfo>();
|
||||||
if (engineerRepairable == null)
|
if (engineerRepairable == null)
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -17,11 +17,17 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
public class EngineerRepairType { }
|
public class EngineerRepairType { }
|
||||||
|
|
||||||
[Desc("Eligible for instant repair.")]
|
[Desc("Eligible for instant repair.")]
|
||||||
class EngineerRepairableInfo : TraitInfo<EngineerRepairable>
|
class EngineerRepairableInfo : ConditionalTraitInfo
|
||||||
{
|
{
|
||||||
[Desc("Actors with these Types under EngineerRepair trait can repair me.")]
|
[Desc("Actors with these Types under EngineerRepair trait can repair me.")]
|
||||||
public readonly BitSet<EngineerRepairType> Types = default(BitSet<EngineerRepairType>);
|
public readonly BitSet<EngineerRepairType> Types = default(BitSet<EngineerRepairType>);
|
||||||
|
|
||||||
|
public override object Create(ActorInitializer init) { return new EngineerRepairable(init, this); }
|
||||||
}
|
}
|
||||||
|
|
||||||
class EngineerRepairable { }
|
class EngineerRepairable : ConditionalTrait<EngineerRepairableInfo>
|
||||||
|
{
|
||||||
|
public EngineerRepairable(ActorInitializer init, EngineerRepairableInfo info)
|
||||||
|
: base(info) { }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user