Added OwnerLostAction

Allows customisation of what will happen to an actor when its owner
loses.
This commit is contained in:
Mustafa Alperen Seki
2018-03-23 11:49:20 +03:00
committed by Paul Chote
parent 0d23070c8e
commit 367a7f617c
7 changed files with 106 additions and 5 deletions

View File

@@ -181,6 +181,7 @@ namespace OpenRA.Traits
public interface INotifyActorDisposing { void Disposing(Actor self); } public interface INotifyActorDisposing { void Disposing(Actor self); }
public interface INotifyOwnerChanged { void OnOwnerChanged(Actor self, Player oldOwner, Player newOwner); } public interface INotifyOwnerChanged { void OnOwnerChanged(Actor self, Player oldOwner, Player newOwner); }
public interface INotifyEffectiveOwnerChanged { void OnEffectiveOwnerChanged(Actor self, Player oldEffectiveOwner, Player newEffectiveOwner); } public interface INotifyEffectiveOwnerChanged { void OnEffectiveOwnerChanged(Actor self, Player oldEffectiveOwner, Player newEffectiveOwner); }
public interface INotifyOwnerLost { void OnOwnerLost(Actor self); }
[RequireExplicitImplementation] [RequireExplicitImplementation]
public interface IVoiced public interface IVoiced

View File

@@ -343,6 +343,7 @@
<Compile Include="Traits\Crates\RevealMapCrateAction.cs" /> <Compile Include="Traits\Crates\RevealMapCrateAction.cs" />
<Compile Include="Traits\Crates\SupportPowerCrateAction.cs" /> <Compile Include="Traits\Crates\SupportPowerCrateAction.cs" />
<Compile Include="Traits\Crushable.cs" /> <Compile Include="Traits\Crushable.cs" />
<Compile Include="Traits\OwnerLostAction.cs" />
<Compile Include="Traits\CustomSellValue.cs" /> <Compile Include="Traits\CustomSellValue.cs" />
<Compile Include="Traits\DamagedByTerrain.cs" /> <Compile Include="Traits\DamagedByTerrain.cs" />
<Compile Include="Traits\DeliversCash.cs" /> <Compile Include="Traits\DeliversCash.cs" />
@@ -879,6 +880,7 @@
<Compile Include="Traits\Player\PlayerResources.cs" /> <Compile Include="Traits\Player\PlayerResources.cs" />
<Compile Include="UtilityCommands\DumpSequenceSheetsCommand.cs" /> <Compile Include="UtilityCommands\DumpSequenceSheetsCommand.cs" />
<Compile Include="UpdateRules\Rules\DefineLocomotors.cs" /> <Compile Include="UpdateRules\Rules\DefineLocomotors.cs" />
<Compile Include="UpdateRules\Rules\DefineOwnerLostAction.cs" />
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="AfterBuild"> <Target Name="AfterBuild">

View File

@@ -0,0 +1,51 @@
#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.Linq;
using OpenRA.Traits;
namespace OpenRA.Mods.Common.Traits
{
public enum OwnerLostActionType { ChangeOwner, Dispose, Kill }
[Desc("Perform an action when the actor's owner is defeated.")]
public class OwnerLostActionInfo : ConditionalTraitInfo
{
[FieldLoader.Require]
[Desc("What does this unit do when its owner loses.",
"Allowed values are 'ChangeOwner', 'Dispose', 'Kill'")]
public readonly OwnerLostActionType Action = OwnerLostActionType.Kill;
[Desc("Map player to use when 'Action' is 'ChangeOwner'.")]
public readonly string Owner = "Neutral";
public override object Create(ActorInitializer init) { return new OwnerLostAction(init, this); }
}
public class OwnerLostAction : ConditionalTrait<OwnerLostActionInfo>, INotifyOwnerLost
{
public OwnerLostAction(ActorInitializer init, OwnerLostActionInfo info)
: base(info) { }
void INotifyOwnerLost.OnOwnerLost(Actor self)
{
if (IsTraitDisabled)
return;
if (Info.Action == OwnerLostActionType.Kill)
self.Kill(self);
else if (Info.Action == OwnerLostActionType.Dispose)
self.Dispose();
else if (Info.Action == OwnerLostActionType.ChangeOwner)
self.ChangeOwner(self.World.Players.First(p => p.InternalName == Info.Owner));
}
}
}

View File

@@ -70,8 +70,8 @@ namespace OpenRA.Mods.Common.Traits
public void OnPlayerLost(Player player) public void OnPlayerLost(Player player)
{ {
foreach (var a in player.World.Actors.Where(a => a.Owner == player)) foreach (var a in player.World.ActorsWithTrait<INotifyOwnerLost>().Where(a => a.Actor.Owner == player))
a.Kill(a); a.Trait.OnOwnerLost(a.Actor);
if (info.SuppressNotifications) if (info.SuppressNotifications)
return; return;

View File

@@ -109,8 +109,8 @@ namespace OpenRA.Mods.Common.Traits
public void OnPlayerLost(Player player) public void OnPlayerLost(Player player)
{ {
foreach (var a in player.World.Actors.Where(a => a.Owner == player)) foreach (var a in player.World.ActorsWithTrait<INotifyOwnerLost>().Where(a => a.Actor.Owner == player))
a.Kill(a); a.Trait.OnOwnerLost(a.Actor);
if (info.SuppressNotifications) if (info.SuppressNotifications)
return; return;

View File

@@ -0,0 +1,46 @@
#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.Collections.Generic;
using System.Linq;
namespace OpenRA.Mods.Common.UpdateRules.Rules
{
public class DefineOwnerLostAction : UpdateRule
{
public override string Name { get { return "Add OwnerLostAction to player-controlled actors"; } }
public override string Description
{
get
{
return "A new OwnerLostAction trait has been introduced to control what happens to a\n" +
"player's actors when they are defeated. A warning is displayed notifying that\nthis trait must be added to actors.";
}
}
bool reported;
public override IEnumerable<string> AfterUpdate(ModData modData)
{
if (!reported)
yield return "All player-controlled (or player-capturable) actors should define an OwnerLostAction trait\n" +
"specifying an action (Kill, Dispose, ChangeOwner) to apply when the actor's owner is defeated.\n" +
"You must manually define this trait on the appropriate default actor templates.\n" +
"Actors missing this trait will remain controllable by their owner after they have been defeated.";
reported = true;
}
public override IEnumerable<string> UpdateActorNode(ModData modData, MiniYamlNode actorNode)
{
yield break;
}
}
}

View File

@@ -51,7 +51,8 @@ namespace OpenRA.Mods.Common.UpdateRules
new AddShakeToBridge(), new AddShakeToBridge(),
new AddEditorPlayer(), new AddEditorPlayer(),
new RemovePaletteFromCurrentTileset(), new RemovePaletteFromCurrentTileset(),
new DefineLocomotors() new DefineLocomotors(),
new DefineOwnerLostAction()
}) })
}; };