Fix Wanders to be usable on its own
Allows unarmed actors like civilians or harmless critters to wander around when idle. Additionally made it upgradable.
This commit is contained in:
@@ -15,7 +15,7 @@ using OpenRA.Traits;
|
||||
namespace OpenRA.Mods.Common.Traits
|
||||
{
|
||||
[Desc("Wanders around aimlessly while idle.")]
|
||||
public abstract class WandersInfo : ITraitInfo
|
||||
public class WandersInfo : UpgradableTraitInfo, Requires<IMoveInfo>
|
||||
{
|
||||
public readonly int WanderMoveRadius = 1;
|
||||
|
||||
@@ -28,13 +28,14 @@ namespace OpenRA.Mods.Common.Traits
|
||||
[Desc("Maximum amount of ticks the actor will sit idly before starting to wander.")]
|
||||
public readonly int MaxMoveDelay = 0;
|
||||
|
||||
public abstract object Create(ActorInitializer init);
|
||||
public override object Create(ActorInitializer init) { return new Wanders(init.Self, this); }
|
||||
}
|
||||
|
||||
public class Wanders : INotifyIdle, INotifyBecomingIdle
|
||||
public class Wanders : UpgradableTrait<WandersInfo>, INotifyCreated, INotifyIdle, INotifyBecomingIdle
|
||||
{
|
||||
readonly Actor self;
|
||||
readonly WandersInfo info;
|
||||
IResolveOrder move;
|
||||
|
||||
int countdown;
|
||||
int ticksIdle;
|
||||
@@ -42,12 +43,18 @@ namespace OpenRA.Mods.Common.Traits
|
||||
bool firstTick = true;
|
||||
|
||||
public Wanders(Actor self, WandersInfo info)
|
||||
: base(info)
|
||||
{
|
||||
this.self = self;
|
||||
this.info = info;
|
||||
effectiveMoveRadius = info.WanderMoveRadius;
|
||||
}
|
||||
|
||||
void INotifyCreated.Created(Actor self)
|
||||
{
|
||||
move = self.Trait<IMove>() as IResolveOrder;
|
||||
}
|
||||
|
||||
public virtual void OnBecomingIdle(Actor self)
|
||||
{
|
||||
countdown = self.World.SharedRandom.Next(info.MinMoveDelay, info.MaxMoveDelay);
|
||||
@@ -55,6 +62,9 @@ namespace OpenRA.Mods.Common.Traits
|
||||
|
||||
public virtual void TickIdle(Actor self)
|
||||
{
|
||||
if (IsTraitDisabled)
|
||||
return;
|
||||
|
||||
// OnBecomingIdle has not been called yet at this point, so set the initial countdown here
|
||||
if (firstTick)
|
||||
{
|
||||
@@ -93,7 +103,7 @@ namespace OpenRA.Mods.Common.Traits
|
||||
|
||||
public virtual void DoAction(Actor self, CPos targetCell)
|
||||
{
|
||||
throw new NotImplementedException("Base class Wanders does not implement method DoAction!");
|
||||
move.ResolveOrder(self, new Order("Move", self, false) { TargetLocation = targetCell });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user