Made Turreted PausableConditional

This commit is contained in:
TheChosenEvilOne
2018-11-09 19:27:40 +02:00
committed by reaperrr
parent 1af9efe246
commit e01953afa3

View File

@@ -17,7 +17,7 @@ using OpenRA.Traits;
namespace OpenRA.Mods.Common.Traits namespace OpenRA.Mods.Common.Traits
{ {
public class TurretedInfo : ITraitInfo, UsesInit<TurretFacingInit>, Requires<BodyOrientationInfo>, IActorPreviewInitInfo public class TurretedInfo : PausableConditionalTraitInfo, UsesInit<TurretFacingInit>, Requires<BodyOrientationInfo>, IActorPreviewInitInfo
{ {
public readonly string Turret = "primary"; public readonly string Turret = "primary";
[Desc("Speed at which the turret turns.")] [Desc("Speed at which the turret turns.")]
@@ -41,12 +41,11 @@ namespace OpenRA.Mods.Common.Traits
yield return new TurretFacingInit(PreviewFacing); yield return new TurretFacingInit(PreviewFacing);
} }
public virtual object Create(ActorInitializer init) { return new Turreted(init, this); } public override object Create(ActorInitializer init) { return new Turreted(init, this); }
} }
public class Turreted : ITick, ISync, INotifyCreated, IDeathActorInitModifier, IActorPreviewInitModifier public class Turreted : PausableConditionalTrait<TurretedInfo>, ITick, IDeathActorInitModifier, IActorPreviewInitModifier
{ {
public readonly TurretedInfo Info;
AttackTurreted attack; AttackTurreted attack;
IFacing facing; IFacing facing;
BodyOrientation body; BodyOrientation body;
@@ -97,13 +96,14 @@ namespace OpenRA.Mods.Common.Traits
} }
public Turreted(ActorInitializer init, TurretedInfo info) public Turreted(ActorInitializer init, TurretedInfo info)
: base(info)
{ {
Info = info;
TurretFacing = TurretFacingFromInit(init, Info.InitialFacing, Info.Turret)(); TurretFacing = TurretFacingFromInit(init, Info.InitialFacing, Info.Turret)();
} }
void INotifyCreated.Created(Actor self) protected override void Created(Actor self)
{ {
base.Created(self);
attack = self.TraitsImplementing<AttackTurreted>().SingleOrDefault(at => ((AttackTurretedInfo)at.Info).Turrets.Contains(Info.Turret)); attack = self.TraitsImplementing<AttackTurreted>().SingleOrDefault(at => ((AttackTurretedInfo)at.Info).Turrets.Contains(Info.Turret));
facing = self.TraitOrDefault<IFacing>(); facing = self.TraitOrDefault<IFacing>();
body = self.Trait<BodyOrientation>(); body = self.Trait<BodyOrientation>();
@@ -116,6 +116,9 @@ namespace OpenRA.Mods.Common.Traits
protected virtual void Tick(Actor self) protected virtual void Tick(Actor self)
{ {
if (IsTraitDisabled)
return;
// NOTE: FaceTarget is called in AttackTurreted.CanAttack if the turret has a target. // NOTE: FaceTarget is called in AttackTurreted.CanAttack if the turret has a target.
if (attack != null) if (attack != null)
{ {
@@ -145,7 +148,7 @@ namespace OpenRA.Mods.Common.Traits
public bool FaceTarget(Actor self, Target target) public bool FaceTarget(Actor self, Target target)
{ {
if (attack == null || attack.IsTraitDisabled || attack.IsTraitPaused) if (IsTraitDisabled || IsTraitPaused || attack == null || attack.IsTraitDisabled || attack.IsTraitPaused)
return false; return false;
var pos = self.CenterPosition; var pos = self.CenterPosition;
@@ -158,6 +161,9 @@ namespace OpenRA.Mods.Common.Traits
public void StopAiming(Actor self) public void StopAiming(Actor self)
{ {
if (IsTraitDisabled)
return;
if (attack != null && attack.IsAiming) if (attack != null && attack.IsAiming)
attack.OnStopOrder(self); attack.OnStopOrder(self);
} }
@@ -223,6 +229,18 @@ namespace OpenRA.Mods.Common.Traits
var facingOffset = TurretFacing - bodyFacing(); var facingOffset = TurretFacing - bodyFacing();
facings.Value(self.World).Add(Name, () => bodyFacing() + facingOffset); facings.Value(self.World).Add(Name, () => bodyFacing() + facingOffset);
} }
protected override void TraitDisabled(Actor self)
{
if (attack != null && attack.IsAiming)
attack.OnStopOrder(self);
}
protected override void TraitResumed(Actor self)
{
if (attack != null)
FaceTarget(self, attack.Target);
}
} }
public class TurretFacingInit : IActorInit<int> public class TurretFacingInit : IActorInit<int>