FreeActor now supports to be triggered by condition.

This commit is contained in:
Andre Mohren
2018-06-15 11:00:49 +02:00
committed by abcdefg30
parent 3a60dcd4a1
commit fc82c24e1f

View File

@@ -16,7 +16,7 @@ namespace OpenRA.Mods.Common.Traits
{ {
[Desc("Player receives a unit for free once the building is placed. This also works for structures.", [Desc("Player receives a unit for free once the building is placed. This also works for structures.",
"If you want more than one unit to appear copy this section and assign IDs like FreeActor@2, ...")] "If you want more than one unit to appear copy this section and assign IDs like FreeActor@2, ...")]
public class FreeActorInfo : ITraitInfo public class FreeActorInfo : ConditionalTraitInfo
{ {
[ActorReference, FieldLoader.Require] [ActorReference, FieldLoader.Require]
[Desc("Name of the actor.")] [Desc("Name of the actor.")]
@@ -28,24 +28,36 @@ namespace OpenRA.Mods.Common.Traits
[Desc("Which direction the unit should face.")] [Desc("Which direction the unit should face.")]
public readonly int Facing = 0; public readonly int Facing = 0;
public virtual object Create(ActorInitializer init) { return new FreeActor(init, this); } [Desc("Whether another actor should spawn upon re-enabling the trait.")]
public readonly bool AllowRespawn = false;
public override object Create(ActorInitializer init) { return new FreeActor(init, this); }
} }
public class FreeActor public class FreeActor : ConditionalTrait<FreeActorInfo>
{ {
public FreeActor(ActorInitializer init, FreeActorInfo info) bool allowSpawn;
public FreeActor(ActorInitializer init, FreeActorInfo info) : base(info)
{ {
if (init.Contains<FreeActorInit>() && !init.Get<FreeActorInit>().ActorValue) allowSpawn = !init.Contains<FreeActorInit>() || init.Get<FreeActorInit>().ActorValue;
}
protected override void TraitEnabled(Actor self)
{
if (!allowSpawn)
return; return;
init.Self.World.AddFrameEndTask(w => allowSpawn = Info.AllowRespawn;
self.World.AddFrameEndTask(w =>
{ {
w.CreateActor(info.Actor, new TypeDictionary w.CreateActor(Info.Actor, new TypeDictionary
{ {
new ParentActorInit(init.Self), new ParentActorInit(self),
new LocationInit(init.Self.Location + info.SpawnOffset), new LocationInit(self.Location + Info.SpawnOffset),
new OwnerInit(init.Self.Owner), new OwnerInit(self.Owner),
new FacingInit(info.Facing), new FacingInit(Info.Facing),
}); });
}); });
} }