This can be used to avoid several lookups for these traits, as well as allow Actor to provide specialised methods to deal with target types efficiently. This also reduces some code duplication.
88 lines
2.4 KiB
C#
88 lines
2.4 KiB
C#
#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.Collections.Generic;
|
|
using System.Drawing;
|
|
using OpenRA.Activities;
|
|
using OpenRA.Mods.Common;
|
|
using OpenRA.Mods.Common.Activities;
|
|
using OpenRA.Mods.Common.Orders;
|
|
using OpenRA.Mods.Common.Traits;
|
|
using OpenRA.Traits;
|
|
|
|
namespace OpenRA.Mods.RA.Traits
|
|
{
|
|
class DemoTruckInfo : ITraitInfo, Requires<ExplodesInfo>
|
|
{
|
|
[VoiceReference] public readonly string Voice = "Action";
|
|
|
|
public object Create(ActorInitializer init) { return new DemoTruck(init.Self, this); }
|
|
}
|
|
|
|
class DemoTruck : IIssueOrder, IResolveOrder, IOrderVoice
|
|
{
|
|
readonly DemoTruckInfo info;
|
|
|
|
public DemoTruck(Actor self, DemoTruckInfo info)
|
|
{
|
|
this.info = info;
|
|
}
|
|
|
|
static void Explode(Actor self)
|
|
{
|
|
self.World.AddFrameEndTask(w => self.InflictDamage(self, int.MaxValue, null));
|
|
}
|
|
|
|
public IEnumerable<IOrderTargeter> Orders
|
|
{
|
|
get
|
|
{
|
|
yield return new TargetTypeOrderTargeter(new HashSet<string> { "DetonateAttack" }, "DetonateAttack", 5, "attack", true, false) { ForceAttack = false };
|
|
yield return new DeployOrderTargeter("Detonate", 5);
|
|
}
|
|
}
|
|
|
|
public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued)
|
|
{
|
|
if (order.OrderID != "DetonateAttack" && order.OrderID != "Detonate")
|
|
return null;
|
|
|
|
if (target.Type == TargetType.FrozenActor)
|
|
return new Order(order.OrderID, self, queued) { ExtraData = target.FrozenActor.ID };
|
|
|
|
return new Order(order.OrderID, self, queued) { TargetActor = target.Actor };
|
|
}
|
|
|
|
public string VoicePhraseForOrder(Actor self, Order order)
|
|
{
|
|
return info.Voice;
|
|
}
|
|
|
|
public void ResolveOrder(Actor self, Order order)
|
|
{
|
|
if (order.OrderString == "DetonateAttack")
|
|
{
|
|
var target = self.ResolveFrozenActorOrder(order, Color.Red);
|
|
if (target.Type != TargetType.Actor)
|
|
return;
|
|
|
|
if (!order.Queued)
|
|
self.CancelActivity();
|
|
|
|
self.SetTargetLine(target, Color.Red);
|
|
self.QueueActivity(new MoveAdjacentTo(self, target));
|
|
self.QueueActivity(new CallFunc(() => Explode(self)));
|
|
}
|
|
else if (order.OrderString == "Detonate")
|
|
Explode(self);
|
|
}
|
|
}
|
|
}
|