Add GPSDot for RA structures. Fixes #3631.
This commit is contained in:
@@ -84,6 +84,8 @@ namespace OpenRA.Traits
|
|||||||
}
|
}
|
||||||
return Renderables;
|
return Renderables;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool HasRenderables { get { return Renderables != null; } }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class FrozenActorLayer : IRender, ITick, ISync
|
public class FrozenActorLayer : IRender, ITick, ISync
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using OpenRA.Effects;
|
using OpenRA.Effects;
|
||||||
|
using OpenRA.FileFormats;
|
||||||
using OpenRA.Graphics;
|
using OpenRA.Graphics;
|
||||||
using OpenRA.Traits;
|
using OpenRA.Traits;
|
||||||
|
|
||||||
@@ -32,9 +33,12 @@ namespace OpenRA.Mods.RA.Effects
|
|||||||
GpsDotInfo info;
|
GpsDotInfo info;
|
||||||
Animation anim;
|
Animation anim;
|
||||||
|
|
||||||
GpsWatcher watcher;
|
Lazy<HiddenUnderFog> huf;
|
||||||
HiddenUnderFog huf;
|
Lazy<FrozenUnderFog> fuf;
|
||||||
Spy spy;
|
Lazy<Spy> spy;
|
||||||
|
Cache<Player, GpsWatcher> watcher;
|
||||||
|
Cache<Player, FrozenActorLayer> frozen;
|
||||||
|
|
||||||
bool show = false;
|
bool show = false;
|
||||||
|
|
||||||
public GpsDot(Actor self, GpsDotInfo info)
|
public GpsDot(Actor self, GpsDotInfo info)
|
||||||
@@ -45,36 +49,45 @@ namespace OpenRA.Mods.RA.Effects
|
|||||||
anim.PlayRepeating(info.String);
|
anim.PlayRepeating(info.String);
|
||||||
|
|
||||||
self.World.AddFrameEndTask(w => w.Add(this));
|
self.World.AddFrameEndTask(w => w.Add(this));
|
||||||
|
|
||||||
|
huf = Lazy.New(() => self.TraitOrDefault<HiddenUnderFog>());
|
||||||
|
fuf = Lazy.New(() => self.TraitOrDefault<FrozenUnderFog>());
|
||||||
|
spy = Lazy.New(() => self.TraitOrDefault<Spy>());
|
||||||
|
watcher = new Cache<Player, GpsWatcher>(p => p.PlayerActor.Trait<GpsWatcher>());
|
||||||
|
frozen = new Cache<Player, FrozenActorLayer>(p => p.PlayerActor.Trait<FrozenActorLayer>());
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ShouldShowIndicator()
|
||||||
|
{
|
||||||
|
// Can be granted at runtime via a crate, so can't cache
|
||||||
|
var cloak = self.TraitOrDefault<Cloak>();
|
||||||
|
if (cloak != null && cloak.Cloaked)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (spy.Value != null && spy.Value.Disguised)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (huf.Value != null && !huf.Value.IsVisible(self, self.World.RenderPlayer))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (fuf.Value == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
var f = frozen[self.World.RenderPlayer].FromID(self.ActorID);
|
||||||
|
return f.Visible && !f.HasRenderables;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool firstTick = true;
|
|
||||||
public void Tick(World world)
|
public void Tick(World world)
|
||||||
{
|
{
|
||||||
if (self.Destroyed)
|
if (self.Destroyed)
|
||||||
world.AddFrameEndTask(w => w.Remove(this));
|
world.AddFrameEndTask(w => w.Remove(this));
|
||||||
|
|
||||||
if (!self.IsInWorld || self.Destroyed)
|
show = false;
|
||||||
|
if (!self.IsInWorld || self.Destroyed || self.World.RenderPlayer == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Can be granted at runtime via a crate, so can't cache
|
var gps = watcher[self.World.RenderPlayer];
|
||||||
var cloak = self.TraitOrDefault<Cloak>();
|
show = (gps.Granted || gps.GrantedAllies) && ShouldShowIndicator();
|
||||||
|
|
||||||
if (firstTick)
|
|
||||||
{
|
|
||||||
huf = self.TraitOrDefault<HiddenUnderFog>();
|
|
||||||
spy = self.TraitOrDefault<Spy>();
|
|
||||||
firstTick = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Can change with the Shroud selector for observers so don't cache.
|
|
||||||
if (self.World.RenderPlayer != null)
|
|
||||||
watcher = self.World.RenderPlayer.PlayerActor.Trait<GpsWatcher>();
|
|
||||||
|
|
||||||
var hasGps = (watcher != null && (watcher.Granted || watcher.GrantedAllies));
|
|
||||||
var hasDot = (huf != null && !huf.IsVisible(self, self.World.RenderPlayer));
|
|
||||||
var dotHidden = (cloak != null && cloak.Cloaked) || (spy != null && spy.Disguised);
|
|
||||||
|
|
||||||
show = hasGps && hasDot && !dotHidden;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<IRenderable> Render(WorldRenderer wr)
|
public IEnumerable<IRenderable> Render(WorldRenderer wr)
|
||||||
@@ -82,7 +95,7 @@ namespace OpenRA.Mods.RA.Effects
|
|||||||
if (!show || self.Destroyed)
|
if (!show || self.Destroyed)
|
||||||
return SpriteRenderable.None;
|
return SpriteRenderable.None;
|
||||||
|
|
||||||
var palette = wr.Palette(info.IndicatorPalettePrefix+self.Owner.InternalName);
|
var palette = wr.Palette(info.IndicatorPalettePrefix + self.Owner.InternalName);
|
||||||
return anim.Render(self.CenterPosition, palette);
|
return anim.Render(self.CenterPosition, palette);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
@@ -237,6 +237,8 @@
|
|||||||
Range: 3
|
Range: 3
|
||||||
BodyOrientation:
|
BodyOrientation:
|
||||||
FrozenUnderFog:
|
FrozenUnderFog:
|
||||||
|
GpsDot:
|
||||||
|
String:Structure
|
||||||
|
|
||||||
^Wall:
|
^Wall:
|
||||||
AppearsOnRadar:
|
AppearsOnRadar:
|
||||||
@@ -292,6 +294,7 @@
|
|||||||
-CapturableBar:
|
-CapturableBar:
|
||||||
FrozenUnderFog:
|
FrozenUnderFog:
|
||||||
StartsRevealed: true
|
StartsRevealed: true
|
||||||
|
-GpsDot:
|
||||||
|
|
||||||
^AmmoBox:
|
^AmmoBox:
|
||||||
Inherits: ^TechBuilding
|
Inherits: ^TechBuilding
|
||||||
|
|||||||
@@ -394,3 +394,5 @@ gpsdot:
|
|||||||
Start: 4
|
Start: 4
|
||||||
Harvester:
|
Harvester:
|
||||||
Start: 5
|
Start: 5
|
||||||
|
Structure:
|
||||||
|
Start: 6
|
||||||
|
|||||||
Reference in New Issue
Block a user