Add a GpsRemoveFrozenActor trait
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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" />
|
||||||
|
|||||||
55
OpenRA.Mods.RA/Traits/GpsRemoveFrozenActor.cs
Normal file
55
OpenRA.Mods.RA/Traits/GpsRemoveFrozenActor.cs
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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)
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user