diff --git a/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj b/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj index 965934b04e..42bd3eb6d1 100644 --- a/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj +++ b/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj @@ -65,6 +65,7 @@ + diff --git a/OpenRA.Mods.Cnc/Traits/Infiltration/InfiltrateForTransform.cs b/OpenRA.Mods.Cnc/Traits/Infiltration/InfiltrateForTransform.cs new file mode 100644 index 0000000000..bf26d20278 --- /dev/null +++ b/OpenRA.Mods.Cnc/Traits/Infiltration/InfiltrateForTransform.cs @@ -0,0 +1,57 @@ +#region Copyright & License Information +/* + * Copyright 2007-2018 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using System; +using OpenRA.Mods.Common; +using OpenRA.Mods.Common.Activities; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.Cnc.Traits +{ + [Desc("This structure can be infiltrated causing funds to be stolen.")] + class InfiltrateForTransformInfo : ITraitInfo + { + [ActorReference, FieldLoader.Require] public readonly string IntoActor = null; + public readonly int ForceHealthPercentage = 0; + public readonly bool SkipMakeAnims = true; + + public readonly BitSet Types = default(BitSet); + + public object Create(ActorInitializer init) { return new InfiltrateForTransform(init, this); } + } + + class InfiltrateForTransform : INotifyInfiltrated + { + readonly InfiltrateForTransformInfo info; + readonly string faction; + + public InfiltrateForTransform(ActorInitializer init, InfiltrateForTransformInfo info) + { + this.info = info; + faction = init.Contains() ? init.Get() : init.Self.Owner.Faction.InternalName; + } + + void INotifyInfiltrated.Infiltrated(Actor self, Actor infiltrator, BitSet types) + { + if (!info.Types.Overlaps(types)) + return; + + var facing = self.TraitOrDefault(); + var transform = new Transform(self, info.IntoActor) { ForceHealthPercentage = info.ForceHealthPercentage, Faction = faction }; + if (facing != null) transform.Facing = facing.Facing; + transform.SkipMakeAnims = info.SkipMakeAnims; + self.CancelActivity(); + self.QueueActivity(transform); + } + } +}