diff --git a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj index 99e297493d..b999883465 100644 --- a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj +++ b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj @@ -203,6 +203,7 @@ + diff --git a/OpenRA.Mods.Common/Scripting/Properties/CaptureProperties.cs b/OpenRA.Mods.Common/Scripting/Properties/CaptureProperties.cs new file mode 100644 index 0000000000..66328f0c15 --- /dev/null +++ b/OpenRA.Mods.Common/Scripting/Properties/CaptureProperties.cs @@ -0,0 +1,47 @@ +#region Copyright & License Information +/* + * Copyright 2007-2015 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. For more information, + * see COPYING. + */ +#endregion + +using System.Linq; +using Eluant; +using OpenRA.Mods.Common.Activities; +using OpenRA.Mods.Common.Traits; +using OpenRA.Scripting; +using OpenRA.Traits; + +namespace OpenRA.Mods.Common.Scripting +{ + [ScriptPropertyGroup("Ability")] + public class CaptureProperties : ScriptActorProperties + { + readonly CapturesInfo normalInfo; + readonly ExternalCapturesInfo externalInfo; + + public CaptureProperties(ScriptContext context, Actor self) + : base(context, self) + { + normalInfo = Self.Info.Traits.GetOrDefault(); + externalInfo = Self.Info.Traits.GetOrDefault(); + } + + [Desc("Captures the target actor.")] + public void Capture(Actor target) + { + var normalCapturable = target.Info.Traits.GetOrDefault(); + var externalCapturable = target.Info.Traits.GetOrDefault(); + + if (normalInfo != null && normalCapturable != null && normalInfo.CaptureTypes.Contains(normalCapturable.Type)) + Self.QueueActivity(new CaptureActor(Self, target)); + else if (externalInfo != null && externalCapturable != null && externalInfo.CaptureTypes.Contains(externalCapturable.Type)) + Self.QueueActivity(new ExternalCaptureActor(Self, Target.FromActor(target))); + else + throw new LuaException("Actor '{0}' cannot capture actor '{1}'!".F(Self, target)); + } + } +}