Merge pull request #8797 from abcdefg30/gpsvanish

Add a GpsRemoveFrozenActor trait
This commit is contained in:
Pavel Penev
2015-08-22 22:47:57 +03:00
6 changed files with 86 additions and 9 deletions

View File

@@ -27,6 +27,7 @@ namespace OpenRA.Traits
public readonly PPos[] Footprint; public readonly PPos[] Footprint;
public readonly WPos CenterPosition; public readonly WPos CenterPosition;
public readonly Rectangle Bounds; public readonly Rectangle Bounds;
readonly IRemoveFrozenActor[] removeFrozenActors;
readonly Actor actor; readonly Actor actor;
readonly Shroud shroud; readonly Shroud shroud;
@@ -46,6 +47,7 @@ namespace OpenRA.Traits
{ {
actor = self; actor = self;
this.shroud = shroud; this.shroud = shroud;
removeFrozenActors = self.TraitsImplementing<IRemoveFrozenActor>().ToArray();
// Consider all cells inside the map area (ignoring the current map bounds) // Consider all cells inside the map area (ignoring the current map bounds)
Footprint = footprint Footprint = footprint
@@ -127,6 +129,16 @@ namespace OpenRA.Traits
public bool HasRenderables { get { return renderables.Any(); } } public bool HasRenderables { get { return renderables.Any(); } }
public bool ShouldBeRemoved(Player owner)
{
// We use a loop here for performance reasons
foreach (var rfa in removeFrozenActors)
if (rfa.RemoveActor(actor, owner))
return true;
return false;
}
public override string ToString() public override string ToString()
{ {
return "{0} {1}{2}".F(Info.Name, ID, IsValid ? "" : " (invalid)"); return "{0} {1}{2}".F(Info.Name, ID, IsValid ? "" : " (invalid)");
@@ -140,7 +152,7 @@ namespace OpenRA.Traits
readonly World world; readonly World world;
readonly Player owner; readonly Player owner;
Dictionary<uint, FrozenActor> frozen; readonly Dictionary<uint, FrozenActor> frozen;
public FrozenActorLayer(Actor self) public FrozenActorLayer(Actor self)
{ {
@@ -169,7 +181,9 @@ namespace OpenRA.Traits
var frozenActor = kvp.Value; var frozenActor = kvp.Value;
frozenActor.Tick(); frozenActor.Tick();
if (frozenActor.Visible) if (frozenActor.ShouldBeRemoved(owner))
remove.Add(kvp.Key);
else if (frozenActor.Visible)
VisibilityHash += hash; VisibilityHash += hash;
else if (frozenActor.Actor == null) else if (frozenActor.Actor == null)
remove.Add(kvp.Key); remove.Add(kvp.Key);

View File

@@ -369,4 +369,9 @@ namespace OpenRA.Traits
bool IsValidAgainst(FrozenActor victim, Actor firedBy); bool IsValidAgainst(FrozenActor victim, Actor firedBy);
void DoImpact(Target target, Actor firedBy, IEnumerable<int> damageModifiers); void DoImpact(Target target, Actor firedBy, IEnumerable<int> damageModifiers);
} }
public interface IRemoveFrozenActor
{
bool RemoveActor(Actor self, Player owner);
}
} }

View File

@@ -92,6 +92,7 @@
<Compile Include="Traits\Cloneable.cs" /> <Compile Include="Traits\Cloneable.cs" />
<Compile Include="Traits\DemoTruck.cs" /> <Compile Include="Traits\DemoTruck.cs" />
<Compile Include="Traits\Disguise.cs" /> <Compile Include="Traits\Disguise.cs" />
<Compile Include="Traits\GpsRemoveFrozenActor.cs" />
<Compile Include="Traits\HarvesterHuskModifier.cs" /> <Compile Include="Traits\HarvesterHuskModifier.cs" />
<Compile Include="Traits\Infiltration\InfiltrateForCash.cs" /> <Compile Include="Traits\Infiltration\InfiltrateForCash.cs" />
<Compile Include="Traits\Infiltration\InfiltrateForExploration.cs" /> <Compile Include="Traits\Infiltration\InfiltrateForExploration.cs" />

View File

@@ -0,0 +1,55 @@
#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.Linq;
using OpenRA.Traits;
namespace OpenRA.Mods.RA.Traits
{
[Desc("Removes frozen actors of actors that are dead or sold," +
" when having an active GPS power.")]
public class GpsRemoveFrozenActorInfo : ITraitInfo
{
[Desc("Should this trait also affect allied players?")]
public bool GrantAllies = true;
public object Create(ActorInitializer init) { return new GpsRemoveFrozenActor(init.Self, this); }
}
public class GpsRemoveFrozenActor : IRemoveFrozenActor
{
readonly GpsWatcher[] watchers;
readonly GpsRemoveFrozenActorInfo info;
public GpsRemoveFrozenActor(Actor self, GpsRemoveFrozenActorInfo info)
{
this.info = info;
watchers = self.World.ActorsWithTrait<GpsWatcher>().Select(w => w.Trait).ToArray();
}
public bool RemoveActor(Actor self, Player owner)
{
if (!self.IsDead)
return false;
foreach (var w in watchers)
{
if (w.Owner != owner && !(info.GrantAllies && w.Owner.IsAlliedWith(owner)))
continue;
if (w.Launched)
return true;
}
return false;
}
}
}

View File

@@ -25,14 +25,14 @@ namespace OpenRA.Mods.RA.Traits
class GpsWatcher : ISync, IFogVisibilityModifier class GpsWatcher : ISync, IFogVisibilityModifier
{ {
[Sync] bool launched = false; [Sync] public bool Launched = false;
[Sync] public bool GrantedAllies = false; [Sync] public bool GrantedAllies = false;
[Sync] public bool Granted = false; [Sync] public bool Granted = false;
Player owner; public Player Owner;
List<Actor> actors = new List<Actor> { }; List<Actor> actors = new List<Actor> { };
public GpsWatcher(Player owner) { this.owner = owner; } public GpsWatcher(Player owner) { Owner = owner; }
public void GpsRem(Actor atek) public void GpsRem(Actor atek)
{ {
@@ -51,7 +51,7 @@ namespace OpenRA.Mods.RA.Traits
atek.World.Add(new DelayedAction(((GpsPowerInfo)info).RevealDelay * 25, atek.World.Add(new DelayedAction(((GpsPowerInfo)info).RevealDelay * 25,
() => () =>
{ {
launched = true; Launched = true;
RefreshGps(atek); RefreshGps(atek);
})); }));
} }
@@ -69,11 +69,11 @@ namespace OpenRA.Mods.RA.Traits
void RefreshGranted() void RefreshGranted()
{ {
Granted = actors.Count > 0 && launched; Granted = actors.Count > 0 && Launched;
GrantedAllies = owner.World.ActorsWithTrait<GpsWatcher>().Any(p => p.Actor.Owner.IsAlliedWith(owner) && p.Trait.Granted); GrantedAllies = Owner.World.ActorsWithTrait<GpsWatcher>().Any(p => p.Actor.Owner.IsAlliedWith(Owner) && p.Trait.Granted);
if (Granted || GrantedAllies) if (Granted || GrantedAllies)
owner.Shroud.ExploreAll(owner.World); Owner.Shroud.ExploreAll(Owner.World);
} }
public bool HasFogVisibility(Player byPlayer) public bool HasFogVisibility(Player byPlayer)

View File

@@ -400,6 +400,7 @@
Guardable: Guardable:
Range: 3 Range: 3
FrozenUnderFog: FrozenUnderFog:
GpsRemoveFrozenActor:
Tooltip: Tooltip:
GenericName: Structure GenericName: Structure
Demolishable: Demolishable:
@@ -461,6 +462,7 @@
Guardable: Guardable:
BodyOrientation: BodyOrientation:
FrozenUnderFog: FrozenUnderFog:
GpsRemoveFrozenActor:
ScriptTriggers: ScriptTriggers:
^TechBuilding: ^TechBuilding: