Merge pull request #8797 from abcdefg30/gpsvanish
Add a GpsRemoveFrozenActor trait
This commit is contained in:
@@ -27,6 +27,7 @@ namespace OpenRA.Traits
|
||||
public readonly PPos[] Footprint;
|
||||
public readonly WPos CenterPosition;
|
||||
public readonly Rectangle Bounds;
|
||||
readonly IRemoveFrozenActor[] removeFrozenActors;
|
||||
readonly Actor actor;
|
||||
readonly Shroud shroud;
|
||||
|
||||
@@ -46,6 +47,7 @@ namespace OpenRA.Traits
|
||||
{
|
||||
actor = self;
|
||||
this.shroud = shroud;
|
||||
removeFrozenActors = self.TraitsImplementing<IRemoveFrozenActor>().ToArray();
|
||||
|
||||
// Consider all cells inside the map area (ignoring the current map bounds)
|
||||
Footprint = footprint
|
||||
@@ -127,6 +129,16 @@ namespace OpenRA.Traits
|
||||
|
||||
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()
|
||||
{
|
||||
return "{0} {1}{2}".F(Info.Name, ID, IsValid ? "" : " (invalid)");
|
||||
@@ -140,7 +152,7 @@ namespace OpenRA.Traits
|
||||
|
||||
readonly World world;
|
||||
readonly Player owner;
|
||||
Dictionary<uint, FrozenActor> frozen;
|
||||
readonly Dictionary<uint, FrozenActor> frozen;
|
||||
|
||||
public FrozenActorLayer(Actor self)
|
||||
{
|
||||
@@ -169,7 +181,9 @@ namespace OpenRA.Traits
|
||||
var frozenActor = kvp.Value;
|
||||
frozenActor.Tick();
|
||||
|
||||
if (frozenActor.Visible)
|
||||
if (frozenActor.ShouldBeRemoved(owner))
|
||||
remove.Add(kvp.Key);
|
||||
else if (frozenActor.Visible)
|
||||
VisibilityHash += hash;
|
||||
else if (frozenActor.Actor == null)
|
||||
remove.Add(kvp.Key);
|
||||
|
||||
@@ -369,4 +369,9 @@ namespace OpenRA.Traits
|
||||
bool IsValidAgainst(FrozenActor victim, Actor firedBy);
|
||||
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\DemoTruck.cs" />
|
||||
<Compile Include="Traits\Disguise.cs" />
|
||||
<Compile Include="Traits\GpsRemoveFrozenActor.cs" />
|
||||
<Compile Include="Traits\HarvesterHuskModifier.cs" />
|
||||
<Compile Include="Traits\Infiltration\InfiltrateForCash.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
|
||||
{
|
||||
[Sync] bool launched = false;
|
||||
[Sync] public bool Launched = false;
|
||||
[Sync] public bool GrantedAllies = false;
|
||||
[Sync] public bool Granted = false;
|
||||
Player owner;
|
||||
public Player Owner;
|
||||
|
||||
List<Actor> actors = new List<Actor> { };
|
||||
|
||||
public GpsWatcher(Player owner) { this.owner = owner; }
|
||||
public GpsWatcher(Player owner) { Owner = owner; }
|
||||
|
||||
public void GpsRem(Actor atek)
|
||||
{
|
||||
@@ -51,7 +51,7 @@ namespace OpenRA.Mods.RA.Traits
|
||||
atek.World.Add(new DelayedAction(((GpsPowerInfo)info).RevealDelay * 25,
|
||||
() =>
|
||||
{
|
||||
launched = true;
|
||||
Launched = true;
|
||||
RefreshGps(atek);
|
||||
}));
|
||||
}
|
||||
@@ -69,11 +69,11 @@ namespace OpenRA.Mods.RA.Traits
|
||||
|
||||
void RefreshGranted()
|
||||
{
|
||||
Granted = actors.Count > 0 && launched;
|
||||
GrantedAllies = owner.World.ActorsWithTrait<GpsWatcher>().Any(p => p.Actor.Owner.IsAlliedWith(owner) && p.Trait.Granted);
|
||||
Granted = actors.Count > 0 && Launched;
|
||||
GrantedAllies = Owner.World.ActorsWithTrait<GpsWatcher>().Any(p => p.Actor.Owner.IsAlliedWith(Owner) && p.Trait.Granted);
|
||||
|
||||
if (Granted || GrantedAllies)
|
||||
owner.Shroud.ExploreAll(owner.World);
|
||||
Owner.Shroud.ExploreAll(Owner.World);
|
||||
}
|
||||
|
||||
public bool HasFogVisibility(Player byPlayer)
|
||||
|
||||
@@ -400,6 +400,7 @@
|
||||
Guardable:
|
||||
Range: 3
|
||||
FrozenUnderFog:
|
||||
GpsRemoveFrozenActor:
|
||||
Tooltip:
|
||||
GenericName: Structure
|
||||
Demolishable:
|
||||
@@ -461,6 +462,7 @@
|
||||
Guardable:
|
||||
BodyOrientation:
|
||||
FrozenUnderFog:
|
||||
GpsRemoveFrozenActor:
|
||||
ScriptTriggers:
|
||||
|
||||
^TechBuilding:
|
||||
|
||||
Reference in New Issue
Block a user