Merge pull request #11862 from pchote/effects-above-shroud
Draw tactical overlays (beacons, rallypoints, text overlays, order generators) above the shroud.
This commit is contained in:
@@ -19,4 +19,6 @@ namespace OpenRA.Effects
|
|||||||
void Tick(World world);
|
void Tick(World world);
|
||||||
IEnumerable<IRenderable> Render(WorldRenderer r);
|
IEnumerable<IRenderable> Render(WorldRenderer r);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public interface IEffectAboveShroud { IEnumerable<IRenderable> RenderAboveShroud(WorldRenderer wr); }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ using System;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using OpenRA.Effects;
|
||||||
using OpenRA.Traits;
|
using OpenRA.Traits;
|
||||||
|
|
||||||
namespace OpenRA.Graphics
|
namespace OpenRA.Graphics
|
||||||
@@ -110,9 +111,6 @@ namespace OpenRA.Graphics
|
|||||||
worldRenderables = worldRenderables.Concat(World.Effects.SelectMany(e => e.Render(this)));
|
worldRenderables = worldRenderables.Concat(World.Effects.SelectMany(e => e.Render(this)));
|
||||||
worldRenderables = worldRenderables.OrderBy(RenderableScreenZPositionComparisonKey);
|
worldRenderables = worldRenderables.OrderBy(RenderableScreenZPositionComparisonKey);
|
||||||
|
|
||||||
if (World.OrderGenerator != null)
|
|
||||||
worldRenderables = worldRenderables.Concat(World.OrderGenerator.RenderAfterWorld(this, World));
|
|
||||||
|
|
||||||
Game.Renderer.WorldVoxelRenderer.BeginFrame();
|
Game.Renderer.WorldVoxelRenderer.BeginFrame();
|
||||||
var renderables = worldRenderables.Select(r => r.PrepareRender(this)).ToList();
|
var renderables = worldRenderables.Select(r => r.PrepareRender(this)).ToList();
|
||||||
Game.Renderer.WorldVoxelRenderer.EndFrame();
|
Game.Renderer.WorldVoxelRenderer.EndFrame();
|
||||||
@@ -152,9 +150,9 @@ namespace OpenRA.Graphics
|
|||||||
if (enableDepthBuffer)
|
if (enableDepthBuffer)
|
||||||
Game.Renderer.ClearDepthBuffer();
|
Game.Renderer.ClearDepthBuffer();
|
||||||
|
|
||||||
foreach (var a in World.ActorsWithTrait<IPostRender>())
|
foreach (var a in World.ActorsWithTrait<IRenderAboveWorld>())
|
||||||
if (a.Actor.IsInWorld && !a.Actor.Disposed)
|
if (a.Actor.IsInWorld && !a.Actor.Disposed)
|
||||||
a.Trait.RenderAfterWorld(this, a.Actor);
|
a.Trait.RenderAboveWorld(a.Actor, this);
|
||||||
|
|
||||||
var renderShroud = World.RenderPlayer != null ? World.RenderPlayer.Shroud : null;
|
var renderShroud = World.RenderPlayer != null ? World.RenderPlayer.Shroud : null;
|
||||||
|
|
||||||
@@ -162,7 +160,7 @@ namespace OpenRA.Graphics
|
|||||||
Game.Renderer.ClearDepthBuffer();
|
Game.Renderer.ClearDepthBuffer();
|
||||||
|
|
||||||
foreach (var a in World.ActorsWithTrait<IRenderShroud>())
|
foreach (var a in World.ActorsWithTrait<IRenderShroud>())
|
||||||
a.Trait.RenderShroud(this, renderShroud);
|
a.Trait.RenderShroud(renderShroud, this);
|
||||||
|
|
||||||
if (devTrait.Value != null && devTrait.Value.ShowDebugGeometry)
|
if (devTrait.Value != null && devTrait.Value.ShowDebugGeometry)
|
||||||
for (var i = 0; i < renderables.Count; i++)
|
for (var i = 0; i < renderables.Count; i++)
|
||||||
@@ -173,12 +171,27 @@ namespace OpenRA.Graphics
|
|||||||
|
|
||||||
Game.Renderer.DisableScissor();
|
Game.Renderer.DisableScissor();
|
||||||
|
|
||||||
var overlayRenderables = World.Selection.Actors.Where(a => !a.Disposed)
|
var aboveShroud = World.ActorsWithTrait<IRenderAboveShroud>().Where(a => a.Actor.IsInWorld && !a.Actor.Disposed)
|
||||||
.SelectMany(a => a.TraitsImplementing<IPostRenderSelection>())
|
.SelectMany(a => a.Trait.RenderAboveShroud(a.Actor, this));
|
||||||
.SelectMany(t => t.RenderAfterWorld(this));
|
|
||||||
|
var aboveShroudSelected = World.Selection.Actors.Where(a => !a.Disposed)
|
||||||
|
.SelectMany(a => a.TraitsImplementing<IRenderAboveShroudWhenSelected>()
|
||||||
|
.SelectMany(t => t.RenderAboveShroud(a, this)));
|
||||||
|
|
||||||
|
var aboveShroudEffects = World.Effects.Select(e => e as IEffectAboveShroud)
|
||||||
|
.Where(e => e != null)
|
||||||
|
.SelectMany(e => e.RenderAboveShroud(this));
|
||||||
|
|
||||||
|
var aboveShroudOrderGenerator = SpriteRenderable.None;
|
||||||
|
if (World.OrderGenerator != null)
|
||||||
|
aboveShroudOrderGenerator = World.OrderGenerator.RenderAboveShroud(this, World);
|
||||||
|
|
||||||
Game.Renderer.WorldVoxelRenderer.BeginFrame();
|
Game.Renderer.WorldVoxelRenderer.BeginFrame();
|
||||||
var finalOverlayRenderables = overlayRenderables.Select(r => r.PrepareRender(this));
|
var finalOverlayRenderables = aboveShroud
|
||||||
|
.Concat(aboveShroudSelected)
|
||||||
|
.Concat(aboveShroudEffects)
|
||||||
|
.Concat(aboveShroudOrderGenerator)
|
||||||
|
.Select(r => r.PrepareRender(this));
|
||||||
Game.Renderer.WorldVoxelRenderer.EndFrame();
|
Game.Renderer.WorldVoxelRenderer.EndFrame();
|
||||||
|
|
||||||
// HACK: Keep old grouping behaviour
|
// HACK: Keep old grouping behaviour
|
||||||
@@ -191,31 +204,6 @@ namespace OpenRA.Graphics
|
|||||||
foreach (var r in g)
|
foreach (var r in g)
|
||||||
r.RenderDebugGeometry(this);
|
r.RenderDebugGeometry(this);
|
||||||
|
|
||||||
if (World.Type == WorldType.Regular)
|
|
||||||
{
|
|
||||||
foreach (var g in World.ScreenMap.ActorsInBox(Viewport.TopLeft, Viewport.BottomRight)
|
|
||||||
.Where(a =>
|
|
||||||
!a.Disposed &&
|
|
||||||
!World.Selection.Contains(a) &&
|
|
||||||
a.Info.HasTraitInfo<SelectableInfo>() &&
|
|
||||||
!World.FogObscures(a)))
|
|
||||||
{
|
|
||||||
if (Game.Settings.Game.StatusBars == StatusBarsType.Standard)
|
|
||||||
new SelectionBarsRenderable(g, false, false).Render(this);
|
|
||||||
|
|
||||||
if (Game.Settings.Game.StatusBars == StatusBarsType.AlwaysShow)
|
|
||||||
new SelectionBarsRenderable(g, true, true).Render(this);
|
|
||||||
|
|
||||||
if (Game.Settings.Game.StatusBars == StatusBarsType.DamageShow)
|
|
||||||
{
|
|
||||||
if (g.GetDamageState() != DamageState.Undamaged)
|
|
||||||
new SelectionBarsRenderable(g, true, true).Render(this);
|
|
||||||
else
|
|
||||||
new SelectionBarsRenderable(g, false, true).Render(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Game.Renderer.Flush();
|
Game.Renderer.Flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ namespace OpenRA
|
|||||||
IEnumerable<Order> Order(World world, CPos cell, int2 worldPixel, MouseInput mi);
|
IEnumerable<Order> Order(World world, CPos cell, int2 worldPixel, MouseInput mi);
|
||||||
void Tick(World world);
|
void Tick(World world);
|
||||||
IEnumerable<IRenderable> Render(WorldRenderer wr, World world);
|
IEnumerable<IRenderable> Render(WorldRenderer wr, World world);
|
||||||
IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr, World world);
|
IEnumerable<IRenderable> RenderAboveShroud(WorldRenderer wr, World world);
|
||||||
string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi);
|
string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ namespace OpenRA.Orders
|
|||||||
|
|
||||||
public virtual void Tick(World world) { }
|
public virtual void Tick(World world) { }
|
||||||
public virtual IEnumerable<IRenderable> Render(WorldRenderer wr, World world) { yield break; }
|
public virtual IEnumerable<IRenderable> Render(WorldRenderer wr, World world) { yield break; }
|
||||||
public virtual IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr, World world) { yield break; }
|
public virtual IEnumerable<IRenderable> RenderAboveShroud(WorldRenderer wr, World world) { yield break; }
|
||||||
|
|
||||||
public virtual string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi)
|
public virtual string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -374,11 +374,10 @@ namespace OpenRA.Traits
|
|||||||
string SequencePrefix { get; }
|
string SequencePrefix { get; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface IPostRender { void RenderAfterWorld(WorldRenderer wr, Actor self); }
|
public interface IRenderAboveWorld { void RenderAboveWorld(Actor self, WorldRenderer wr); }
|
||||||
|
public interface IRenderShroud { void RenderShroud(Shroud shroud, WorldRenderer wr); }
|
||||||
public interface IRenderShroud { void RenderShroud(WorldRenderer wr, Shroud shroud); }
|
public interface IRenderAboveShroud { IEnumerable<IRenderable> RenderAboveShroud(Actor self, WorldRenderer wr); }
|
||||||
|
public interface IRenderAboveShroudWhenSelected { IEnumerable<IRenderable> RenderAboveShroud(Actor self, WorldRenderer wr); }
|
||||||
public interface IPostRenderSelection { IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr); }
|
|
||||||
|
|
||||||
public interface ITargetableInfo : ITraitInfoInterface
|
public interface ITargetableInfo : ITraitInfoInterface
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ using OpenRA.Scripting;
|
|||||||
|
|
||||||
namespace OpenRA.Mods.Common.Effects
|
namespace OpenRA.Mods.Common.Effects
|
||||||
{
|
{
|
||||||
public class Beacon : IEffect, IScriptBindable
|
public class Beacon : IEffect, IScriptBindable, IEffectAboveShroud
|
||||||
{
|
{
|
||||||
static readonly int MaxArrowHeight = 512;
|
static readonly int MaxArrowHeight = 512;
|
||||||
|
|
||||||
@@ -78,7 +78,7 @@ namespace OpenRA.Mods.Common.Effects
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Tick(World world)
|
void IEffect.Tick(World world)
|
||||||
{
|
{
|
||||||
arrowHeight += arrowSpeed;
|
arrowHeight += arrowSpeed;
|
||||||
var clamped = arrowHeight.Clamp(0, MaxArrowHeight);
|
var clamped = arrowHeight.Clamp(0, MaxArrowHeight);
|
||||||
@@ -98,7 +98,9 @@ namespace OpenRA.Mods.Common.Effects
|
|||||||
clock.Tick();
|
clock.Tick();
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<IRenderable> Render(WorldRenderer r)
|
IEnumerable<IRenderable> IEffect.Render(WorldRenderer r) { return SpriteRenderable.None; }
|
||||||
|
|
||||||
|
IEnumerable<IRenderable> IEffectAboveShroud.RenderAboveShroud(WorldRenderer r)
|
||||||
{
|
{
|
||||||
if (!owner.IsAlliedWith(owner.World.RenderPlayer))
|
if (!owner.IsAlliedWith(owner.World.RenderPlayer))
|
||||||
yield break;
|
yield break;
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ using OpenRA.Mods.Common.Graphics;
|
|||||||
|
|
||||||
namespace OpenRA.Mods.Common.Effects
|
namespace OpenRA.Mods.Common.Effects
|
||||||
{
|
{
|
||||||
public class FloatingText : IEffect
|
public class FloatingText : IEffect, IEffectAboveShroud
|
||||||
{
|
{
|
||||||
static readonly WVec Velocity = new WVec(0, 0, 86);
|
static readonly WVec Velocity = new WVec(0, 0, 86);
|
||||||
|
|
||||||
@@ -45,7 +45,9 @@ namespace OpenRA.Mods.Common.Effects
|
|||||||
pos += Velocity;
|
pos += Velocity;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<IRenderable> Render(WorldRenderer wr)
|
public IEnumerable<IRenderable> Render(WorldRenderer wr) { return SpriteRenderable.None; }
|
||||||
|
|
||||||
|
public IEnumerable<IRenderable> RenderAboveShroud(WorldRenderer wr)
|
||||||
{
|
{
|
||||||
if (wr.World.FogObscures(pos))
|
if (wr.World.FogObscures(pos))
|
||||||
yield break;
|
yield break;
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ using OpenRA.Mods.Common.Traits;
|
|||||||
|
|
||||||
namespace OpenRA.Mods.Common.Effects
|
namespace OpenRA.Mods.Common.Effects
|
||||||
{
|
{
|
||||||
class PowerdownIndicator : IEffect
|
class PowerdownIndicator : IEffect, IEffectAboveShroud
|
||||||
{
|
{
|
||||||
readonly Actor a;
|
readonly Actor a;
|
||||||
readonly Animation anim;
|
readonly Animation anim;
|
||||||
@@ -31,7 +31,7 @@ namespace OpenRA.Mods.Common.Effects
|
|||||||
anim.PlayRepeating(canPowerDown.Info.IndicatorSequence);
|
anim.PlayRepeating(canPowerDown.Info.IndicatorSequence);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Tick(World world)
|
void IEffect.Tick(World world)
|
||||||
{
|
{
|
||||||
if (!a.IsInWorld || a.IsDead || !canPowerDown.Disabled)
|
if (!a.IsInWorld || a.IsDead || !canPowerDown.Disabled)
|
||||||
world.AddFrameEndTask(w => w.Remove(this));
|
world.AddFrameEndTask(w => w.Remove(this));
|
||||||
@@ -39,7 +39,9 @@ namespace OpenRA.Mods.Common.Effects
|
|||||||
anim.Tick();
|
anim.Tick();
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<IRenderable> Render(WorldRenderer wr)
|
IEnumerable<IRenderable> IEffect.Render(WorldRenderer wr) { return SpriteRenderable.None; }
|
||||||
|
|
||||||
|
IEnumerable<IRenderable> IEffectAboveShroud.RenderAboveShroud(WorldRenderer wr)
|
||||||
{
|
{
|
||||||
if (a.Disposed || wr.World.FogObscures(a))
|
if (a.Disposed || wr.World.FogObscures(a))
|
||||||
return SpriteRenderable.None;
|
return SpriteRenderable.None;
|
||||||
|
|||||||
@@ -10,14 +10,13 @@
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
|
||||||
using OpenRA.Effects;
|
using OpenRA.Effects;
|
||||||
using OpenRA.Graphics;
|
using OpenRA.Graphics;
|
||||||
using OpenRA.Mods.Common.Traits;
|
using OpenRA.Mods.Common.Traits;
|
||||||
|
|
||||||
namespace OpenRA.Mods.Common.Effects
|
namespace OpenRA.Mods.Common.Effects
|
||||||
{
|
{
|
||||||
class RallyPointIndicator : IEffect
|
class RallyPointIndicator : IEffect, IEffectAboveShroud
|
||||||
{
|
{
|
||||||
readonly Actor building;
|
readonly Actor building;
|
||||||
readonly RallyPoint rp;
|
readonly RallyPoint rp;
|
||||||
@@ -41,7 +40,7 @@ namespace OpenRA.Mods.Common.Effects
|
|||||||
circles.Play(rp.Info.CirclesSequence);
|
circles.Play(rp.Info.CirclesSequence);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Tick(World world)
|
void IEffect.Tick(World world)
|
||||||
{
|
{
|
||||||
flag.Tick();
|
flag.Tick();
|
||||||
circles.Tick();
|
circles.Tick();
|
||||||
@@ -76,7 +75,9 @@ namespace OpenRA.Mods.Common.Effects
|
|||||||
world.AddFrameEndTask(w => w.Remove(this));
|
world.AddFrameEndTask(w => w.Remove(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<IRenderable> Render(WorldRenderer wr)
|
IEnumerable<IRenderable> IEffect.Render(WorldRenderer wr) { return SpriteRenderable.None; }
|
||||||
|
|
||||||
|
IEnumerable<IRenderable> IEffectAboveShroud.RenderAboveShroud(WorldRenderer wr)
|
||||||
{
|
{
|
||||||
if (!building.IsInWorld || !building.Owner.IsAlliedWith(building.World.LocalPlayer))
|
if (!building.IsInWorld || !building.Owner.IsAlliedWith(building.World.LocalPlayer))
|
||||||
return SpriteRenderable.None;
|
return SpriteRenderable.None;
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ using OpenRA.Mods.Common.Traits;
|
|||||||
|
|
||||||
namespace OpenRA.Mods.Common.Effects
|
namespace OpenRA.Mods.Common.Effects
|
||||||
{
|
{
|
||||||
class RepairIndicator : IEffect
|
class RepairIndicator : IEffect, IEffectAboveShroud
|
||||||
{
|
{
|
||||||
readonly Actor building;
|
readonly Actor building;
|
||||||
readonly Animation anim;
|
readonly Animation anim;
|
||||||
@@ -35,7 +35,7 @@ namespace OpenRA.Mods.Common.Effects
|
|||||||
CycleRepairer();
|
CycleRepairer();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Tick(World world)
|
void IEffect.Tick(World world)
|
||||||
{
|
{
|
||||||
if (!building.IsInWorld || building.IsDead || !rb.Repairers.Any())
|
if (!building.IsInWorld || building.IsDead || !rb.Repairers.Any())
|
||||||
world.AddFrameEndTask(w => w.Remove(this));
|
world.AddFrameEndTask(w => w.Remove(this));
|
||||||
@@ -43,7 +43,9 @@ namespace OpenRA.Mods.Common.Effects
|
|||||||
anim.Tick();
|
anim.Tick();
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<IRenderable> Render(WorldRenderer wr)
|
IEnumerable<IRenderable> IEffect.Render(WorldRenderer wr) { return SpriteRenderable.None; }
|
||||||
|
|
||||||
|
IEnumerable<IRenderable> IEffectAboveShroud.RenderAboveShroud(WorldRenderer wr)
|
||||||
{
|
{
|
||||||
if (building.Disposed || rb.Repairers.Count == 0 || wr.World.FogObscures(building))
|
if (building.Disposed || rb.Repairers.Count == 0 || wr.World.FogObscures(building))
|
||||||
return SpriteRenderable.None;
|
return SpriteRenderable.None;
|
||||||
|
|||||||
@@ -18,21 +18,16 @@ namespace OpenRA.Mods.Common.Orders
|
|||||||
{
|
{
|
||||||
public IEnumerable<Order> Order(World world, CPos cell, int2 worldPixel, MouseInput mi)
|
public IEnumerable<Order> Order(World world, CPos cell, int2 worldPixel, MouseInput mi)
|
||||||
{
|
{
|
||||||
if (mi.Button != MouseButton.Left)
|
world.CancelInputMode();
|
||||||
world.CancelInputMode();
|
yield return new Order("PlaceBeacon", world.LocalPlayer.PlayerActor, false) { TargetLocation = cell, SuppressVisualFeedback = true };
|
||||||
else if (!world.ShroudObscures(cell))
|
|
||||||
{
|
|
||||||
world.CancelInputMode();
|
|
||||||
yield return new Order("PlaceBeacon", world.LocalPlayer.PlayerActor, false) { TargetLocation = cell, SuppressVisualFeedback = true };
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void Tick(World world) { }
|
public virtual void Tick(World world) { }
|
||||||
public IEnumerable<IRenderable> Render(WorldRenderer wr, World world) { yield break; }
|
public IEnumerable<IRenderable> Render(WorldRenderer wr, World world) { yield break; }
|
||||||
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr, World world) { yield break; }
|
public IEnumerable<IRenderable> RenderAboveShroud(WorldRenderer wr, World world) { yield break; }
|
||||||
public string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi)
|
public string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi)
|
||||||
{
|
{
|
||||||
return !world.ShroudObscures(cell) ? "ability" : "generic-blocked";
|
return "ability";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ namespace OpenRA.Mods.Common.Orders
|
|||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<IRenderable> Render(WorldRenderer wr, World world) { yield break; }
|
public IEnumerable<IRenderable> Render(WorldRenderer wr, World world) { yield break; }
|
||||||
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr, World world) { yield break; }
|
public IEnumerable<IRenderable> RenderAboveShroud(WorldRenderer wr, World world) { yield break; }
|
||||||
|
|
||||||
public string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi)
|
public string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -148,7 +148,7 @@ namespace OpenRA.Mods.Common.Orders
|
|||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<IRenderable> Render(WorldRenderer wr, World world) { yield break; }
|
public IEnumerable<IRenderable> Render(WorldRenderer wr, World world) { yield break; }
|
||||||
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr, World world)
|
public IEnumerable<IRenderable> RenderAboveShroud(WorldRenderer wr, World world)
|
||||||
{
|
{
|
||||||
var xy = wr.Viewport.ViewToWorld(Viewport.LastMousePos);
|
var xy = wr.Viewport.ViewToWorld(Viewport.LastMousePos);
|
||||||
var topLeft = xy - FootprintUtils.AdjustForBuildingSize(buildingInfo);
|
var topLeft = xy - FootprintUtils.AdjustForBuildingSize(buildingInfo);
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ namespace OpenRA.Mods.Common.Orders
|
|||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<IRenderable> Render(WorldRenderer wr, World world) { yield break; }
|
public IEnumerable<IRenderable> Render(WorldRenderer wr, World world) { yield break; }
|
||||||
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr, World world) { yield break; }
|
public IEnumerable<IRenderable> RenderAboveShroud(WorldRenderer wr, World world) { yield break; }
|
||||||
|
|
||||||
public string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi)
|
public string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
public object Create(ActorInitializer init) { return new BaseProvider(init.Self, this); }
|
public object Create(ActorInitializer init) { return new BaseProvider(init.Self, this); }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class BaseProvider : ITick, IPostRenderSelection, ISelectionBar
|
public class BaseProvider : ITick, IRenderAboveShroudWhenSelected, ISelectionBar
|
||||||
{
|
{
|
||||||
public readonly BaseProviderInfo Info;
|
public readonly BaseProviderInfo Info;
|
||||||
readonly DeveloperMode devMode;
|
readonly DeveloperMode devMode;
|
||||||
@@ -46,7 +46,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
allyBuildEnabled = self.World.WorldActor.Trait<MapBuildRadius>().AllyBuildRadiusEnabled;
|
allyBuildEnabled = self.World.WorldActor.Trait<MapBuildRadius>().AllyBuildRadiusEnabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Tick(Actor self)
|
void ITick.Tick(Actor self)
|
||||||
{
|
{
|
||||||
if (progress > 0)
|
if (progress > 0)
|
||||||
progress--;
|
progress--;
|
||||||
@@ -67,7 +67,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
return self.Owner == self.World.RenderPlayer || (allyBuildEnabled && self.Owner.IsAlliedWith(self.World.RenderPlayer));
|
return self.Owner == self.World.RenderPlayer || (allyBuildEnabled && self.Owner.IsAlliedWith(self.World.RenderPlayer));
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr)
|
public IEnumerable<IRenderable> RangeCircleRenderables(WorldRenderer wr)
|
||||||
{
|
{
|
||||||
// Visible to player and allies
|
// Visible to player and allies
|
||||||
if (!ValidRenderPlayer())
|
if (!ValidRenderPlayer())
|
||||||
@@ -81,6 +81,11 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
Color.FromArgb(96, Color.Black));
|
Color.FromArgb(96, Color.Black));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IEnumerable<IRenderable> IRenderAboveShroudWhenSelected.RenderAboveShroud(Actor self, WorldRenderer wr)
|
||||||
|
{
|
||||||
|
return RangeCircleRenderables(wr);
|
||||||
|
}
|
||||||
|
|
||||||
float ISelectionBar.GetValue()
|
float ISelectionBar.GetValue()
|
||||||
{
|
{
|
||||||
// Visible to player and allies
|
// Visible to player and allies
|
||||||
|
|||||||
@@ -129,11 +129,9 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
public IEnumerable<IRenderable> Render(WorldRenderer wr, World w, ActorInfo ai, WPos centerPosition)
|
public IEnumerable<IRenderable> Render(WorldRenderer wr, World w, ActorInfo ai, WPos centerPosition)
|
||||||
{
|
{
|
||||||
if (!RequiresBaseProvider)
|
if (!RequiresBaseProvider)
|
||||||
yield break;
|
return SpriteRenderable.None;
|
||||||
|
|
||||||
foreach (var a in w.ActorsWithTrait<BaseProvider>())
|
return w.ActorsWithTrait<BaseProvider>().SelectMany(a => a.Trait.RangeCircleRenderables(wr));
|
||||||
foreach (var r in a.Trait.RenderAfterWorld(wr))
|
|
||||||
yield return r;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
public object Create(ActorInitializer init) { return new CombatDebugOverlay(init.Self); }
|
public object Create(ActorInitializer init) { return new CombatDebugOverlay(init.Self); }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class CombatDebugOverlay : IPostRender, INotifyDamage, INotifyCreated
|
public class CombatDebugOverlay : IRenderAboveWorld, INotifyDamage, INotifyCreated
|
||||||
{
|
{
|
||||||
readonly DeveloperMode devMode;
|
readonly DeveloperMode devMode;
|
||||||
readonly HealthInfo healthInfo;
|
readonly HealthInfo healthInfo;
|
||||||
@@ -42,12 +42,12 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
devMode = localPlayer != null ? localPlayer.PlayerActor.Trait<DeveloperMode>() : null;
|
devMode = localPlayer != null ? localPlayer.PlayerActor.Trait<DeveloperMode>() : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Created(Actor self)
|
void INotifyCreated.Created(Actor self)
|
||||||
{
|
{
|
||||||
allBlockers = self.TraitsImplementing<IBlocksProjectiles>().ToArray();
|
allBlockers = self.TraitsImplementing<IBlocksProjectiles>().ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RenderAfterWorld(WorldRenderer wr, Actor self)
|
void IRenderAboveWorld.RenderAboveWorld(Actor self, WorldRenderer wr)
|
||||||
{
|
{
|
||||||
if (devMode == null || !devMode.ShowCombatGeometry)
|
if (devMode == null || !devMode.ShowCombatGeometry)
|
||||||
return;
|
return;
|
||||||
@@ -114,7 +114,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Damaged(Actor self, AttackInfo e)
|
void INotifyDamage.Damaged(Actor self, AttackInfo e)
|
||||||
{
|
{
|
||||||
if (devMode == null || !devMode.ShowCombatGeometry || e.Damage.Value == 0)
|
if (devMode == null || !devMode.ShowCombatGeometry || e.Damage.Value == 0)
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
object ITraitInfo.Create(ActorInitializer init) { return new ExitsDebugOverlay(init.Self, this); }
|
object ITraitInfo.Create(ActorInitializer init) { return new ExitsDebugOverlay(init.Self, this); }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ExitsDebugOverlay : IPostRender
|
public class ExitsDebugOverlay : IRenderAboveWorld
|
||||||
{
|
{
|
||||||
readonly ExitsDebugOverlayManager manager;
|
readonly ExitsDebugOverlayManager manager;
|
||||||
readonly ExitsDebugOverlayInfo info;
|
readonly ExitsDebugOverlayInfo info;
|
||||||
@@ -51,7 +51,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
exits = self.Info.TraitInfos<ExitInfo>().ToArray();
|
exits = self.Info.TraitInfos<ExitInfo>().ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
void IPostRender.RenderAfterWorld(WorldRenderer wr, Actor self)
|
void IRenderAboveWorld.RenderAboveWorld(Actor self, WorldRenderer wr)
|
||||||
{
|
{
|
||||||
if (manager == null || !manager.Enabled)
|
if (manager == null || !manager.Enabled)
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -23,15 +23,17 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
public virtual object Create(ActorInitializer init) { return new DrawLineToTarget(init.Self, this); }
|
public virtual object Create(ActorInitializer init) { return new DrawLineToTarget(init.Self, this); }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class DrawLineToTarget : IPostRenderSelection, INotifySelected, INotifyBecomingIdle
|
public class DrawLineToTarget : IRenderAboveShroudWhenSelected, INotifySelected, INotifyBecomingIdle
|
||||||
{
|
{
|
||||||
Actor self;
|
readonly DrawLineToTargetInfo info;
|
||||||
DrawLineToTargetInfo info;
|
|
||||||
List<Target> targets;
|
List<Target> targets;
|
||||||
Color c;
|
Color c;
|
||||||
int lifetime;
|
int lifetime;
|
||||||
|
|
||||||
public DrawLineToTarget(Actor self, DrawLineToTargetInfo info) { this.self = self; this.info = info; }
|
public DrawLineToTarget(Actor self, DrawLineToTargetInfo info)
|
||||||
|
{
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
|
||||||
public void SetTarget(Actor self, Target target, Color c, bool display)
|
public void SetTarget(Actor self, Target target, Color c, bool display)
|
||||||
{
|
{
|
||||||
@@ -51,7 +53,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
lifetime = info.Delay;
|
lifetime = info.Delay;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Selected(Actor a)
|
void INotifySelected.Selected(Actor a)
|
||||||
{
|
{
|
||||||
if (a.IsIdle)
|
if (a.IsIdle)
|
||||||
return;
|
return;
|
||||||
@@ -60,7 +62,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
lifetime = info.Delay;
|
lifetime = info.Delay;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr)
|
IEnumerable<IRenderable> IRenderAboveShroudWhenSelected.RenderAboveShroud(Actor self, WorldRenderer wr)
|
||||||
{
|
{
|
||||||
var force = Game.GetModifierKeys().HasModifier(Modifiers.Alt);
|
var force = Game.GetModifierKeys().HasModifier(Modifiers.Alt);
|
||||||
if ((lifetime <= 0 || --lifetime <= 0) && !force)
|
if ((lifetime <= 0 || --lifetime <= 0) && !force)
|
||||||
@@ -81,7 +83,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnBecomingIdle(Actor a)
|
void INotifyBecomingIdle.OnBecomingIdle(Actor a)
|
||||||
{
|
{
|
||||||
if (a.IsIdle)
|
if (a.IsIdle)
|
||||||
targets = null;
|
targets = null;
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ namespace OpenRA.Mods.Common.Traits.Render
|
|||||||
public object Create(ActorInitializer init) { return new RenderDebugState(init.Self, this); }
|
public object Create(ActorInitializer init) { return new RenderDebugState(init.Self, this); }
|
||||||
}
|
}
|
||||||
|
|
||||||
class RenderDebugState : INotifyAddedToWorld, INotifyOwnerChanged, IPostRenderSelection
|
class RenderDebugState : INotifyAddedToWorld, INotifyOwnerChanged, IRenderAboveShroudWhenSelected
|
||||||
{
|
{
|
||||||
readonly DeveloperMode devMode;
|
readonly DeveloperMode devMode;
|
||||||
readonly SpriteFont font;
|
readonly SpriteFont font;
|
||||||
@@ -53,12 +53,12 @@ namespace OpenRA.Mods.Common.Traits.Render
|
|||||||
ai = self.Owner.PlayerActor.TraitsImplementing<HackyAI>().FirstOrDefault(x => x.IsEnabled);
|
ai = self.Owner.PlayerActor.TraitsImplementing<HackyAI>().FirstOrDefault(x => x.IsEnabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddedToWorld(Actor self)
|
void INotifyAddedToWorld.AddedToWorld(Actor self)
|
||||||
{
|
{
|
||||||
tagString = self.ToString();
|
tagString = self.ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnOwnerChanged(Actor self, Player oldOwner, Player newOwner)
|
void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner)
|
||||||
{
|
{
|
||||||
color = GetColor();
|
color = GetColor();
|
||||||
}
|
}
|
||||||
@@ -68,7 +68,7 @@ namespace OpenRA.Mods.Common.Traits.Render
|
|||||||
return self.EffectiveOwner != null ? self.EffectiveOwner.Owner.Color.RGB : self.Owner.Color.RGB;
|
return self.EffectiveOwner != null ? self.EffectiveOwner.Owner.Color.RGB : self.Owner.Color.RGB;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr)
|
IEnumerable<IRenderable> IRenderAboveShroudWhenSelected.RenderAboveShroud(Actor self, WorldRenderer wr)
|
||||||
{
|
{
|
||||||
if (devMode == null || !devMode.ShowActorTags)
|
if (devMode == null || !devMode.ShowActorTags)
|
||||||
yield break;
|
yield break;
|
||||||
|
|||||||
@@ -35,19 +35,17 @@ namespace OpenRA.Mods.Common.Traits.Render
|
|||||||
public object Create(ActorInitializer init) { return new RenderDetectionCircle(init.Self, this); }
|
public object Create(ActorInitializer init) { return new RenderDetectionCircle(init.Self, this); }
|
||||||
}
|
}
|
||||||
|
|
||||||
class RenderDetectionCircle : ITick, IPostRenderSelection
|
class RenderDetectionCircle : ITick, IRenderAboveShroudWhenSelected
|
||||||
{
|
{
|
||||||
readonly RenderDetectionCircleInfo info;
|
readonly RenderDetectionCircleInfo info;
|
||||||
readonly Actor self;
|
|
||||||
WAngle lineAngle;
|
WAngle lineAngle;
|
||||||
|
|
||||||
public RenderDetectionCircle(Actor self, RenderDetectionCircleInfo info)
|
public RenderDetectionCircle(Actor self, RenderDetectionCircleInfo info)
|
||||||
{
|
{
|
||||||
this.info = info;
|
this.info = info;
|
||||||
this.self = self;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr)
|
IEnumerable<IRenderable> IRenderAboveShroudWhenSelected.RenderAboveShroud(Actor self, WorldRenderer wr)
|
||||||
{
|
{
|
||||||
if (!self.Owner.IsAlliedWith(self.World.RenderPlayer))
|
if (!self.Owner.IsAlliedWith(self.World.RenderPlayer))
|
||||||
yield break;
|
yield break;
|
||||||
@@ -71,7 +69,7 @@ namespace OpenRA.Mods.Common.Traits.Render
|
|||||||
info.ContrastColor);
|
info.ContrastColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Tick(Actor self)
|
void ITick.Tick(Actor self)
|
||||||
{
|
{
|
||||||
lineAngle += info.UpdateLineTick;
|
lineAngle += info.UpdateLineTick;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,23 +32,24 @@ namespace OpenRA.Mods.Common.Traits.Render
|
|||||||
public IEnumerable<IRenderable> Render(WorldRenderer wr, World w, ActorInfo ai, WPos centerPosition)
|
public IEnumerable<IRenderable> Render(WorldRenderer wr, World w, ActorInfo ai, WPos centerPosition)
|
||||||
{
|
{
|
||||||
if (range == WDist.Zero)
|
if (range == WDist.Zero)
|
||||||
yield break;
|
return SpriteRenderable.None;
|
||||||
|
|
||||||
yield return new RangeCircleRenderable(
|
var localRange = new RangeCircleRenderable(
|
||||||
centerPosition,
|
centerPosition,
|
||||||
range,
|
range,
|
||||||
0,
|
0,
|
||||||
Color.FromArgb(128, Color.Yellow),
|
Color.FromArgb(128, Color.Yellow),
|
||||||
Color.FromArgb(96, Color.Black));
|
Color.FromArgb(96, Color.Black));
|
||||||
|
|
||||||
foreach (var a in w.ActorsWithTrait<RenderRangeCircle>())
|
var otherRanges = w.ActorsWithTrait<RenderRangeCircle>()
|
||||||
if (a.Actor.Owner.IsAlliedWith(w.RenderPlayer))
|
.Where(a => a.Trait.Info.RangeCircleType == RangeCircleType)
|
||||||
if (a.Actor.Info.TraitInfo<RenderRangeCircleInfo>().RangeCircleType == RangeCircleType)
|
.SelectMany(a => a.Trait.RangeCircleRenderables(wr));
|
||||||
foreach (var r in a.Trait.RenderAfterWorld(wr))
|
|
||||||
yield return r;
|
return otherRanges.Append(localRange);
|
||||||
}
|
}
|
||||||
|
|
||||||
public object Create(ActorInitializer init) { return new RenderRangeCircle(init.Self); }
|
public object Create(ActorInitializer init) { return new RenderRangeCircle(init.Self, this); }
|
||||||
|
|
||||||
public void RulesetLoaded(Ruleset rules, ActorInfo ai)
|
public void RulesetLoaded(Ruleset rules, ActorInfo ai)
|
||||||
{
|
{
|
||||||
var armaments = ai.TraitInfos<ArmamentInfo>().Where(a => a.UpgradeMinEnabledLevel == 0);
|
var armaments = ai.TraitInfos<ArmamentInfo>().Where(a => a.UpgradeMinEnabledLevel == 0);
|
||||||
@@ -60,18 +61,21 @@ namespace OpenRA.Mods.Common.Traits.Render
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class RenderRangeCircle : IPostRenderSelection
|
class RenderRangeCircle : IRenderAboveShroudWhenSelected
|
||||||
{
|
{
|
||||||
|
public readonly RenderRangeCircleInfo Info;
|
||||||
readonly Actor self;
|
readonly Actor self;
|
||||||
readonly AttackBase attack;
|
readonly AttackBase attack;
|
||||||
|
|
||||||
public RenderRangeCircle(Actor self)
|
public RenderRangeCircle(Actor self, RenderRangeCircleInfo info)
|
||||||
{
|
{
|
||||||
|
Info = info;
|
||||||
|
|
||||||
this.self = self;
|
this.self = self;
|
||||||
attack = self.Trait<AttackBase>();
|
attack = self.Trait<AttackBase>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr)
|
public IEnumerable<IRenderable> RangeCircleRenderables(WorldRenderer wr)
|
||||||
{
|
{
|
||||||
if (!self.Owner.IsAlliedWith(self.World.RenderPlayer))
|
if (!self.Owner.IsAlliedWith(self.World.RenderPlayer))
|
||||||
yield break;
|
yield break;
|
||||||
@@ -87,5 +91,10 @@ namespace OpenRA.Mods.Common.Traits.Render
|
|||||||
Color.FromArgb(128, Color.Yellow),
|
Color.FromArgb(128, Color.Yellow),
|
||||||
Color.FromArgb(96, Color.Black));
|
Color.FromArgb(96, Color.Black));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IEnumerable<IRenderable> IRenderAboveShroudWhenSelected.RenderAboveShroud(Actor self, WorldRenderer wr)
|
||||||
|
{
|
||||||
|
return RangeCircleRenderables(wr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,25 +41,23 @@ namespace OpenRA.Mods.Common.Traits.Render
|
|||||||
public int[] SelectionBoxBounds { get { return VisualBounds; } }
|
public int[] SelectionBoxBounds { get { return VisualBounds; } }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class SelectionDecorations : IPostRenderSelection, ITick
|
public class SelectionDecorations : IRenderAboveShroud, ITick
|
||||||
{
|
{
|
||||||
// depends on the order of pips in TraitsInterfaces.cs!
|
// depends on the order of pips in TraitsInterfaces.cs!
|
||||||
static readonly string[] PipStrings = { "pip-empty", "pip-green", "pip-yellow", "pip-red", "pip-gray", "pip-blue", "pip-ammo", "pip-ammoempty" };
|
static readonly string[] PipStrings = { "pip-empty", "pip-green", "pip-yellow", "pip-red", "pip-gray", "pip-blue", "pip-ammo", "pip-ammoempty" };
|
||||||
|
|
||||||
public readonly SelectionDecorationsInfo Info;
|
public readonly SelectionDecorationsInfo Info;
|
||||||
|
|
||||||
readonly Actor self;
|
|
||||||
readonly Animation pipImages;
|
readonly Animation pipImages;
|
||||||
|
|
||||||
public SelectionDecorations(Actor self, SelectionDecorationsInfo info)
|
public SelectionDecorations(Actor self, SelectionDecorationsInfo info)
|
||||||
{
|
{
|
||||||
this.self = self;
|
|
||||||
Info = info;
|
Info = info;
|
||||||
|
|
||||||
pipImages = new Animation(self.World, Info.Image);
|
pipImages = new Animation(self.World, Info.Image);
|
||||||
}
|
}
|
||||||
|
|
||||||
IEnumerable<WPos> ActivityTargetPath()
|
IEnumerable<WPos> ActivityTargetPath(Actor self)
|
||||||
{
|
{
|
||||||
if (!self.IsInWorld || self.IsDead)
|
if (!self.IsInWorld || self.IsDead)
|
||||||
yield break;
|
yield break;
|
||||||
@@ -75,33 +73,51 @@ namespace OpenRA.Mods.Common.Traits.Render
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr)
|
IEnumerable<IRenderable> IRenderAboveShroud.RenderAboveShroud(Actor self, WorldRenderer wr)
|
||||||
{
|
{
|
||||||
if (self.World.FogObscures(self))
|
if (self.World.FogObscures(self))
|
||||||
yield break;
|
yield break;
|
||||||
|
|
||||||
if (Info.RenderSelectionBox)
|
var selected = self.World.Selection.Contains(self);
|
||||||
|
var regularWorld = self.World.Type == WorldType.Regular;
|
||||||
|
var statusBars = Game.Settings.Game.StatusBars;
|
||||||
|
|
||||||
|
// Health bars are shown when:
|
||||||
|
// * actor is selected
|
||||||
|
// * status bar preference is set to "always show"
|
||||||
|
// * status bar preference is set to "when damaged" and actor is damaged
|
||||||
|
var displayHealth = selected || (regularWorld && statusBars == StatusBarsType.AlwaysShow)
|
||||||
|
|| (regularWorld && statusBars == StatusBarsType.DamageShow && self.GetDamageState() != DamageState.Undamaged);
|
||||||
|
|
||||||
|
// Extra bars are shown when:
|
||||||
|
// * actor is selected
|
||||||
|
// * status bar preference is set to "always show"
|
||||||
|
// * status bar preference is set to "when damaged"
|
||||||
|
var displayExtra = selected || (regularWorld && statusBars != StatusBarsType.Standard);
|
||||||
|
|
||||||
|
if (Info.RenderSelectionBox && selected)
|
||||||
yield return new SelectionBoxRenderable(self, Info.SelectionBoxColor);
|
yield return new SelectionBoxRenderable(self, Info.SelectionBoxColor);
|
||||||
|
|
||||||
if (Info.RenderSelectionBars)
|
if (Info.RenderSelectionBars && (displayHealth || displayExtra))
|
||||||
yield return new SelectionBarsRenderable(self, true, true);
|
yield return new SelectionBarsRenderable(self, displayHealth, displayExtra);
|
||||||
|
|
||||||
if (!self.Owner.IsAlliedWith(wr.World.RenderPlayer))
|
// Target lines and pips are always only displayed for selected allied actors
|
||||||
|
if (!selected || !self.Owner.IsAlliedWith(wr.World.RenderPlayer))
|
||||||
yield break;
|
yield break;
|
||||||
|
|
||||||
if (self.World.LocalPlayer != null && self.World.LocalPlayer.PlayerActor.Trait<DeveloperMode>().PathDebug)
|
if (self.World.LocalPlayer != null && self.World.LocalPlayer.PlayerActor.Trait<DeveloperMode>().PathDebug)
|
||||||
yield return new TargetLineRenderable(ActivityTargetPath(), Color.Green);
|
yield return new TargetLineRenderable(ActivityTargetPath(self), Color.Green);
|
||||||
|
|
||||||
var b = self.VisualBounds;
|
var b = self.VisualBounds;
|
||||||
var pos = wr.ScreenPxPosition(self.CenterPosition);
|
var pos = wr.ScreenPxPosition(self.CenterPosition);
|
||||||
var bl = wr.Viewport.WorldToViewPx(pos + new int2(b.Left, b.Bottom));
|
var bl = wr.Viewport.WorldToViewPx(pos + new int2(b.Left, b.Bottom));
|
||||||
var pal = wr.Palette(Info.Palette);
|
var pal = wr.Palette(Info.Palette);
|
||||||
|
|
||||||
foreach (var r in DrawPips(wr, self, bl, pal))
|
foreach (var r in DrawPips(self, wr, bl, pal))
|
||||||
yield return r;
|
yield return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
IEnumerable<IRenderable> DrawPips(WorldRenderer wr, Actor self, int2 basePosition, PaletteReference palette)
|
IEnumerable<IRenderable> DrawPips(Actor self, WorldRenderer wr, int2 basePosition, PaletteReference palette)
|
||||||
{
|
{
|
||||||
var pipSources = self.TraitsImplementing<IPips>();
|
var pipSources = self.TraitsImplementing<IPips>();
|
||||||
if (!pipSources.Any())
|
if (!pipSources.Any())
|
||||||
|
|||||||
@@ -55,17 +55,15 @@ namespace OpenRA.Mods.Common.Traits.Render
|
|||||||
public override object Create(ActorInitializer init) { return new WithDecoration(init.Self, this); }
|
public override object Create(ActorInitializer init) { return new WithDecoration(init.Self, this); }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class WithDecoration : UpgradableTrait<WithDecorationInfo>, ITick, IRender, IPostRenderSelection
|
public class WithDecoration : UpgradableTrait<WithDecorationInfo>, ITick, IRender, IRenderAboveShroudWhenSelected
|
||||||
{
|
{
|
||||||
protected readonly Animation Anim;
|
protected readonly Animation Anim;
|
||||||
|
|
||||||
readonly string image;
|
readonly string image;
|
||||||
readonly Actor self;
|
|
||||||
|
|
||||||
public WithDecoration(Actor self, WithDecorationInfo info)
|
public WithDecoration(Actor self, WithDecorationInfo info)
|
||||||
: base(info)
|
: base(info)
|
||||||
{
|
{
|
||||||
this.self = self;
|
|
||||||
image = info.Image ?? self.Info.Name;
|
image = info.Image ?? self.Info.Name;
|
||||||
Anim = new Animation(self.World, image, () => self.World.Paused);
|
Anim = new Animation(self.World, image, () => self.World.Paused);
|
||||||
Anim.PlayRepeating(info.Sequence);
|
Anim.PlayRepeating(info.Sequence);
|
||||||
@@ -73,14 +71,14 @@ namespace OpenRA.Mods.Common.Traits.Render
|
|||||||
|
|
||||||
public virtual bool ShouldRender(Actor self) { return true; }
|
public virtual bool ShouldRender(Actor self) { return true; }
|
||||||
|
|
||||||
public IEnumerable<IRenderable> Render(Actor self, WorldRenderer wr)
|
IEnumerable<IRenderable> IRender.Render(Actor self, WorldRenderer wr)
|
||||||
{
|
{
|
||||||
return !Info.RequiresSelection ? RenderInner(self, wr) : Enumerable.Empty<IRenderable>();
|
return !Info.RequiresSelection ? RenderInner(self, wr) : SpriteRenderable.None;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr)
|
IEnumerable<IRenderable> IRenderAboveShroudWhenSelected.RenderAboveShroud(Actor self, WorldRenderer wr)
|
||||||
{
|
{
|
||||||
return Info.RequiresSelection ? RenderInner(self, wr) : Enumerable.Empty<IRenderable>();
|
return Info.RequiresSelection ? RenderInner(self, wr) : SpriteRenderable.None;
|
||||||
}
|
}
|
||||||
|
|
||||||
IEnumerable<IRenderable> RenderInner(Actor self, WorldRenderer wr)
|
IEnumerable<IRenderable> RenderInner(Actor self, WorldRenderer wr)
|
||||||
@@ -129,6 +127,6 @@ namespace OpenRA.Mods.Common.Traits.Render
|
|||||||
return new IRenderable[] { new UISpriteRenderable(Anim.Image, self.CenterPosition, pxPos, Info.ZOffset, wr.Palette(Info.Palette), 1f) };
|
return new IRenderable[] { new UISpriteRenderable(Anim.Image, self.CenterPosition, pxPos, Info.ZOffset, wr.Palette(Info.Palette), 1f) };
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Tick(Actor self) { Anim.Tick(); }
|
void ITick.Tick(Actor self) { Anim.Tick(); }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -52,14 +52,14 @@ namespace OpenRA.Mods.Common.Traits.Render
|
|||||||
|
|
||||||
foreach (var a in w.ActorsWithTrait<WithRangeCircle>())
|
foreach (var a in w.ActorsWithTrait<WithRangeCircle>())
|
||||||
if (a.Trait.Info.Type == Type)
|
if (a.Trait.Info.Type == Type)
|
||||||
foreach (var r in a.Trait.RenderRangeCircle(wr))
|
foreach (var r in a.Trait.RenderRangeCircle(a.Actor, wr))
|
||||||
yield return r;
|
yield return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
public object Create(ActorInitializer init) { return new WithRangeCircle(init.Self, this); }
|
public object Create(ActorInitializer init) { return new WithRangeCircle(init.Self, this); }
|
||||||
}
|
}
|
||||||
|
|
||||||
class WithRangeCircle : IPostRenderSelection, IPostRender
|
class WithRangeCircle : IRenderAboveShroudWhenSelected, IRenderAboveWorld
|
||||||
{
|
{
|
||||||
public readonly WithRangeCircleInfo Info;
|
public readonly WithRangeCircleInfo Info;
|
||||||
readonly Actor self;
|
readonly Actor self;
|
||||||
@@ -79,7 +79,7 @@ namespace OpenRA.Mods.Common.Traits.Render
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<IRenderable> RenderRangeCircle(WorldRenderer wr)
|
public IEnumerable<IRenderable> RenderRangeCircle(Actor self, WorldRenderer wr)
|
||||||
{
|
{
|
||||||
if (Info.Visible == RangeCircleVisibility.WhenSelected && Visible)
|
if (Info.Visible == RangeCircleVisibility.WhenSelected && Visible)
|
||||||
yield return new RangeCircleRenderable(
|
yield return new RangeCircleRenderable(
|
||||||
@@ -92,12 +92,12 @@ namespace OpenRA.Mods.Common.Traits.Render
|
|||||||
yield break;
|
yield break;
|
||||||
}
|
}
|
||||||
|
|
||||||
IEnumerable<IRenderable> IPostRenderSelection.RenderAfterWorld(WorldRenderer wr)
|
IEnumerable<IRenderable> IRenderAboveShroudWhenSelected.RenderAboveShroud(Actor self, WorldRenderer wr)
|
||||||
{
|
{
|
||||||
return RenderRangeCircle(wr);
|
return RenderRangeCircle(self, wr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void IPostRender.RenderAfterWorld(WorldRenderer wr, Actor self)
|
void IRenderAboveWorld.RenderAboveWorld(Actor self, WorldRenderer wr)
|
||||||
{
|
{
|
||||||
if (Info.Visible == RangeCircleVisibility.Always && Visible)
|
if (Info.Visible == RangeCircleVisibility.Always && Visible)
|
||||||
RangeCircleRenderable.DrawRangeCircle(
|
RangeCircleRenderable.DrawRangeCircle(
|
||||||
|
|||||||
@@ -35,22 +35,19 @@ namespace OpenRA.Mods.Common.Traits.Render
|
|||||||
public object Create(ActorInitializer init) { return new WithSpriteControlGroupDecoration(init.Self, this); }
|
public object Create(ActorInitializer init) { return new WithSpriteControlGroupDecoration(init.Self, this); }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class WithSpriteControlGroupDecoration : IPostRenderSelection
|
public class WithSpriteControlGroupDecoration : IRenderAboveShroudWhenSelected
|
||||||
{
|
{
|
||||||
public readonly WithSpriteControlGroupDecorationInfo Info;
|
public readonly WithSpriteControlGroupDecorationInfo Info;
|
||||||
|
|
||||||
readonly Actor self;
|
|
||||||
readonly Animation pipImages;
|
readonly Animation pipImages;
|
||||||
|
|
||||||
public WithSpriteControlGroupDecoration(Actor self, WithSpriteControlGroupDecorationInfo info)
|
public WithSpriteControlGroupDecoration(Actor self, WithSpriteControlGroupDecorationInfo info)
|
||||||
{
|
{
|
||||||
this.self = self;
|
|
||||||
Info = info;
|
Info = info;
|
||||||
|
|
||||||
pipImages = new Animation(self.World, Info.Image);
|
pipImages = new Animation(self.World, Info.Image);
|
||||||
}
|
}
|
||||||
|
|
||||||
IEnumerable<IRenderable> IPostRenderSelection.RenderAfterWorld(WorldRenderer wr)
|
IEnumerable<IRenderable> IRenderAboveShroudWhenSelected.RenderAboveShroud(Actor self, WorldRenderer wr)
|
||||||
{
|
{
|
||||||
if (self.World.FogObscures(self))
|
if (self.World.FogObscures(self))
|
||||||
yield break;
|
yield break;
|
||||||
@@ -59,11 +56,11 @@ namespace OpenRA.Mods.Common.Traits.Render
|
|||||||
yield break;
|
yield break;
|
||||||
|
|
||||||
var pal = wr.Palette(Info.Palette);
|
var pal = wr.Palette(Info.Palette);
|
||||||
foreach (var r in DrawControlGroup(wr, self, pal))
|
foreach (var r in DrawControlGroup(self, wr, pal))
|
||||||
yield return r;
|
yield return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
IEnumerable<IRenderable> DrawControlGroup(WorldRenderer wr, Actor self, PaletteReference palette)
|
IEnumerable<IRenderable> DrawControlGroup(Actor self, WorldRenderer wr, PaletteReference palette)
|
||||||
{
|
{
|
||||||
var group = self.World.Selection.GetControlGroupForActor(self);
|
var group = self.World.Selection.GetControlGroupForActor(self);
|
||||||
if (group == null)
|
if (group == null)
|
||||||
|
|||||||
@@ -47,17 +47,15 @@ namespace OpenRA.Mods.Common.Traits.Render
|
|||||||
public object Create(ActorInitializer init) { return new WithTextControlGroupDecoration(init.Self, this); }
|
public object Create(ActorInitializer init) { return new WithTextControlGroupDecoration(init.Self, this); }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class WithTextControlGroupDecoration : IPostRenderSelection, INotifyCapture
|
public class WithTextControlGroupDecoration : IRenderAboveShroudWhenSelected, INotifyCapture
|
||||||
{
|
{
|
||||||
readonly WithTextControlGroupDecorationInfo info;
|
readonly WithTextControlGroupDecorationInfo info;
|
||||||
readonly SpriteFont font;
|
readonly SpriteFont font;
|
||||||
readonly Actor self;
|
|
||||||
|
|
||||||
Color color;
|
Color color;
|
||||||
|
|
||||||
public WithTextControlGroupDecoration(Actor self, WithTextControlGroupDecorationInfo info)
|
public WithTextControlGroupDecoration(Actor self, WithTextControlGroupDecorationInfo info)
|
||||||
{
|
{
|
||||||
this.self = self;
|
|
||||||
this.info = info;
|
this.info = info;
|
||||||
|
|
||||||
if (!Game.Renderer.Fonts.TryGetValue(info.Font, out font))
|
if (!Game.Renderer.Fonts.TryGetValue(info.Font, out font))
|
||||||
@@ -66,7 +64,7 @@ namespace OpenRA.Mods.Common.Traits.Render
|
|||||||
color = info.UsePlayerColor ? self.Owner.Color.RGB : info.Color;
|
color = info.UsePlayerColor ? self.Owner.Color.RGB : info.Color;
|
||||||
}
|
}
|
||||||
|
|
||||||
IEnumerable<IRenderable> IPostRenderSelection.RenderAfterWorld(WorldRenderer wr)
|
IEnumerable<IRenderable> IRenderAboveShroudWhenSelected.RenderAboveShroud(Actor self, WorldRenderer wr)
|
||||||
{
|
{
|
||||||
if (self.World.FogObscures(self))
|
if (self.World.FogObscures(self))
|
||||||
yield break;
|
yield break;
|
||||||
@@ -74,11 +72,11 @@ namespace OpenRA.Mods.Common.Traits.Render
|
|||||||
if (self.Owner != wr.World.LocalPlayer)
|
if (self.Owner != wr.World.LocalPlayer)
|
||||||
yield break;
|
yield break;
|
||||||
|
|
||||||
foreach (var r in DrawControlGroup(wr, self))
|
foreach (var r in DrawControlGroup(self, wr))
|
||||||
yield return r;
|
yield return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
IEnumerable<IRenderable> DrawControlGroup(WorldRenderer wr, Actor self)
|
IEnumerable<IRenderable> DrawControlGroup(Actor self, WorldRenderer wr)
|
||||||
{
|
{
|
||||||
var group = self.World.Selection.GetControlGroupForActor(self);
|
var group = self.World.Selection.GetControlGroupForActor(self);
|
||||||
if (group == null)
|
if (group == null)
|
||||||
|
|||||||
@@ -54,34 +54,28 @@ namespace OpenRA.Mods.Common.Traits.Render
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class WithTextDecoration : UpgradableTrait<WithTextDecorationInfo>, IRender, IPostRenderSelection, INotifyCapture
|
public class WithTextDecoration : UpgradableTrait<WithTextDecorationInfo>, IRender, IRenderAboveShroudWhenSelected, INotifyCapture
|
||||||
{
|
{
|
||||||
readonly Actor self;
|
|
||||||
readonly SpriteFont font;
|
readonly SpriteFont font;
|
||||||
|
|
||||||
Color color;
|
Color color;
|
||||||
|
|
||||||
public WithTextDecoration(Actor self, WithTextDecorationInfo info)
|
public WithTextDecoration(Actor self, WithTextDecorationInfo info)
|
||||||
: base(info)
|
: base(info)
|
||||||
{
|
{
|
||||||
this.self = self;
|
font = Game.Renderer.Fonts[info.Font];
|
||||||
|
|
||||||
if (!Game.Renderer.Fonts.TryGetValue(info.Font, out font))
|
|
||||||
throw new YamlException("Font '{0}' is not listed in the mod.yaml's Fonts section".F(info.Font));
|
|
||||||
|
|
||||||
color = Info.UsePlayerColor ? self.Owner.Color.RGB : Info.Color;
|
color = Info.UsePlayerColor ? self.Owner.Color.RGB : Info.Color;
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual bool ShouldRender(Actor self) { return true; }
|
public virtual bool ShouldRender(Actor self) { return true; }
|
||||||
|
|
||||||
public IEnumerable<IRenderable> Render(Actor self, WorldRenderer wr)
|
IEnumerable<IRenderable> IRender.Render(Actor self, WorldRenderer wr)
|
||||||
{
|
{
|
||||||
return !Info.RequiresSelection ? RenderInner(self, wr) : Enumerable.Empty<IRenderable>();
|
return !Info.RequiresSelection ? RenderInner(self, wr) : SpriteRenderable.None;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr)
|
IEnumerable<IRenderable> IRenderAboveShroudWhenSelected.RenderAboveShroud(Actor self, WorldRenderer wr)
|
||||||
{
|
{
|
||||||
return Info.RequiresSelection ? RenderInner(self, wr) : Enumerable.Empty<IRenderable>();
|
return Info.RequiresSelection ? RenderInner(self, wr) : SpriteRenderable.None;
|
||||||
}
|
}
|
||||||
|
|
||||||
IEnumerable<IRenderable> RenderInner(Actor self, WorldRenderer wr)
|
IEnumerable<IRenderable> RenderInner(Actor self, WorldRenderer wr)
|
||||||
|
|||||||
@@ -141,7 +141,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
world.CancelInputMode();
|
world.CancelInputMode();
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr, World world)
|
public IEnumerable<IRenderable> RenderAboveShroud(WorldRenderer wr, World world)
|
||||||
{
|
{
|
||||||
var xy = wr.Viewport.ViewToWorld(Viewport.LastMousePos);
|
var xy = wr.Viewport.ViewToWorld(Viewport.LastMousePos);
|
||||||
foreach (var unit in power.UnitsInRange(xy))
|
foreach (var unit in power.UnitsInRange(xy))
|
||||||
|
|||||||
@@ -291,7 +291,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<IRenderable> Render(WorldRenderer wr, World world) { yield break; }
|
public IEnumerable<IRenderable> Render(WorldRenderer wr, World world) { yield break; }
|
||||||
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr, World world) { yield break; }
|
public IEnumerable<IRenderable> RenderAboveShroud(WorldRenderer wr, World world) { yield break; }
|
||||||
public string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi)
|
public string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi)
|
||||||
{
|
{
|
||||||
return world.Map.Contains(cell) ? cursor : "generic-blocked";
|
return world.Map.Contains(cell) ? cursor : "generic-blocked";
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
public virtual object Create(ActorInitializer init) { return new EditorSelectionLayer(init.Self, this); }
|
public virtual object Create(ActorInitializer init) { return new EditorSelectionLayer(init.Self, this); }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class EditorSelectionLayer : IWorldLoaded, IPostRender
|
public class EditorSelectionLayer : IWorldLoaded, IRenderAboveWorld
|
||||||
{
|
{
|
||||||
readonly EditorSelectionLayerInfo info;
|
readonly EditorSelectionLayerInfo info;
|
||||||
readonly Map map;
|
readonly Map map;
|
||||||
@@ -57,7 +57,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
pasteSprite = map.Rules.Sequences.GetSequence(info.Image, info.PasteSequence).GetSprite(0);
|
pasteSprite = map.Rules.Sequences.GetSequence(info.Image, info.PasteSequence).GetSprite(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void WorldLoaded(World w, WorldRenderer wr)
|
void IWorldLoaded.WorldLoaded(World w, WorldRenderer wr)
|
||||||
{
|
{
|
||||||
if (w.Type != WorldType.Editor)
|
if (w.Type != WorldType.Editor)
|
||||||
return;
|
return;
|
||||||
@@ -80,7 +80,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
CopyRegion = PasteRegion = null;
|
CopyRegion = PasteRegion = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RenderAfterWorld(WorldRenderer wr, Actor self)
|
void IRenderAboveWorld.RenderAboveWorld(Actor self, WorldRenderer wr)
|
||||||
{
|
{
|
||||||
if (wr.World.Type != WorldType.Editor)
|
if (wr.World.Type != WorldType.Editor)
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -151,7 +151,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
notVisibleEdges = info.UseExtendedIndex ? Edges.AllSides : Edges.AllCorners;
|
notVisibleEdges = info.UseExtendedIndex ? Edges.AllSides : Edges.AllCorners;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void WorldLoaded(World w, WorldRenderer wr)
|
void IWorldLoaded.WorldLoaded(World w, WorldRenderer wr)
|
||||||
{
|
{
|
||||||
// Initialize tile cache
|
// Initialize tile cache
|
||||||
// This includes the region outside the visible area to cover any sprites peeking outside the map
|
// This includes the region outside the visible area to cover any sprites peeking outside the map
|
||||||
@@ -230,7 +230,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
cellsDirty.UnionWith(cells);
|
cellsDirty.UnionWith(cells);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RenderShroud(WorldRenderer wr, Shroud shroud)
|
void IRenderShroud.RenderShroud(Shroud shroud, WorldRenderer wr)
|
||||||
{
|
{
|
||||||
if (currentShroud != shroud)
|
if (currentShroud != shroud)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -20,14 +20,14 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
[Desc("Renders a debug overlay showing the terrain cells. Attach this to the world actor.")]
|
[Desc("Renders a debug overlay showing the terrain cells. Attach this to the world actor.")]
|
||||||
public class TerrainGeometryOverlayInfo : TraitInfo<TerrainGeometryOverlay> { }
|
public class TerrainGeometryOverlayInfo : TraitInfo<TerrainGeometryOverlay> { }
|
||||||
|
|
||||||
public class TerrainGeometryOverlay : IPostRender, IWorldLoaded, IChatCommand
|
public class TerrainGeometryOverlay : IRenderAboveWorld, IWorldLoaded, IChatCommand
|
||||||
{
|
{
|
||||||
const string CommandName = "terrainoverlay";
|
const string CommandName = "terrainoverlay";
|
||||||
const string CommandDesc = "Toggles the terrain geometry overlay";
|
const string CommandDesc = "Toggles the terrain geometry overlay";
|
||||||
|
|
||||||
public bool Enabled;
|
public bool Enabled;
|
||||||
|
|
||||||
public void WorldLoaded(World w, WorldRenderer wr)
|
void IWorldLoaded.WorldLoaded(World w, WorldRenderer wr)
|
||||||
{
|
{
|
||||||
var console = w.WorldActor.TraitOrDefault<ChatCommands>();
|
var console = w.WorldActor.TraitOrDefault<ChatCommands>();
|
||||||
var help = w.WorldActor.TraitOrDefault<HelpCommand>();
|
var help = w.WorldActor.TraitOrDefault<HelpCommand>();
|
||||||
@@ -39,13 +39,13 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
help.RegisterHelp(CommandName, CommandDesc);
|
help.RegisterHelp(CommandName, CommandDesc);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void InvokeCommand(string name, string arg)
|
void IChatCommand.InvokeCommand(string name, string arg)
|
||||||
{
|
{
|
||||||
if (name == CommandName)
|
if (name == CommandName)
|
||||||
Enabled ^= true;
|
Enabled ^= true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RenderAfterWorld(WorldRenderer wr, Actor self)
|
void IRenderAboveWorld.RenderAboveWorld(Actor self, WorldRenderer wr)
|
||||||
{
|
{
|
||||||
if (!Enabled)
|
if (!Enabled)
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
public object Create(ActorInitializer init) { return new WarheadDebugOverlay(this); }
|
public object Create(ActorInitializer init) { return new WarheadDebugOverlay(this); }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class WarheadDebugOverlay : IPostRender
|
public class WarheadDebugOverlay : IRenderAboveWorld
|
||||||
{
|
{
|
||||||
class WHImpact
|
class WHImpact
|
||||||
{
|
{
|
||||||
@@ -61,7 +61,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
impacts.Add(new WHImpact(pos, range, info.DisplayDuration, color));
|
impacts.Add(new WHImpact(pos, range, info.DisplayDuration, color));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RenderAfterWorld(WorldRenderer wr, Actor self)
|
void IRenderAboveWorld.RenderAboveWorld(Actor self, WorldRenderer wr)
|
||||||
{
|
{
|
||||||
foreach (var i in impacts)
|
foreach (var i in impacts)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
public object Create(ActorInitializer init) { return new WeatherOverlay(init.World, this); }
|
public object Create(ActorInitializer init) { return new WeatherOverlay(init.World, this); }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class WeatherOverlay : ITick, IPostRender
|
public class WeatherOverlay : ITick, IRenderAboveWorld
|
||||||
{
|
{
|
||||||
readonly WeatherOverlayInfo info;
|
readonly WeatherOverlayInfo info;
|
||||||
readonly World world;
|
readonly World world;
|
||||||
@@ -201,7 +201,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
tempParticle.SwingOffset += tempParticle.SwingDirection * tempParticle.SwingSpeed;
|
tempParticle.SwingOffset += tempParticle.SwingDirection * tempParticle.SwingSpeed;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Tick(Actor self)
|
void ITick.Tick(Actor self)
|
||||||
{
|
{
|
||||||
windTickCountdown--;
|
windTickCountdown--;
|
||||||
}
|
}
|
||||||
@@ -298,7 +298,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RenderAfterWorld(WorldRenderer wr, Actor self)
|
void IRenderAboveWorld.RenderAboveWorld(Actor self, WorldRenderer wr)
|
||||||
{
|
{
|
||||||
if (!world.Paused)
|
if (!world.Paused)
|
||||||
UpdateWeatherOverlay(wr);
|
UpdateWeatherOverlay(wr);
|
||||||
|
|||||||
@@ -31,23 +31,20 @@ namespace OpenRA.Mods.RA.Traits
|
|||||||
public object Create(ActorInitializer init) { return new Minelayer(init.Self); }
|
public object Create(ActorInitializer init) { return new Minelayer(init.Self); }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class Minelayer : IIssueOrder, IResolveOrder, IPostRenderSelection, ISync
|
public class Minelayer : IIssueOrder, IResolveOrder, IRenderAboveShroudWhenSelected, ISync
|
||||||
{
|
{
|
||||||
/* TODO: [Sync] when sync can cope with arrays! */
|
/* TODO: [Sync] when sync can cope with arrays! */
|
||||||
public CPos[] Minefield = null;
|
public CPos[] Minefield = null;
|
||||||
readonly Actor self;
|
|
||||||
readonly Sprite tile;
|
readonly Sprite tile;
|
||||||
[Sync] CPos minefieldStart;
|
[Sync] CPos minefieldStart;
|
||||||
|
|
||||||
public Minelayer(Actor self)
|
public Minelayer(Actor self)
|
||||||
{
|
{
|
||||||
this.self = self;
|
|
||||||
|
|
||||||
var tileset = self.World.Map.Tileset.ToLowerInvariant();
|
var tileset = self.World.Map.Tileset.ToLowerInvariant();
|
||||||
tile = self.World.Map.Rules.Sequences.GetSequence("overlay", "build-valid-{0}".F(tileset)).GetSprite(0);
|
tile = self.World.Map.Rules.Sequences.GetSequence("overlay", "build-valid-{0}".F(tileset)).GetSprite(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<IOrderTargeter> Orders
|
IEnumerable<IOrderTargeter> IIssueOrder.Orders
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
@@ -56,7 +53,7 @@ namespace OpenRA.Mods.RA.Traits
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued)
|
Order IIssueOrder.IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued)
|
||||||
{
|
{
|
||||||
switch (order.OrderID)
|
switch (order.OrderID)
|
||||||
{
|
{
|
||||||
@@ -75,7 +72,7 @@ namespace OpenRA.Mods.RA.Traits
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ResolveOrder(Actor self, Order order)
|
void IResolveOrder.ResolveOrder(Actor self, Order order)
|
||||||
{
|
{
|
||||||
if (order.OrderString == "BeginMinefield")
|
if (order.OrderString == "BeginMinefield")
|
||||||
minefieldStart = order.TargetLocation;
|
minefieldStart = order.TargetLocation;
|
||||||
@@ -121,7 +118,7 @@ namespace OpenRA.Mods.RA.Traits
|
|||||||
yield return new CPos(i, j);
|
yield return new CPos(i, j);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr)
|
IEnumerable<IRenderable> IRenderAboveShroudWhenSelected.RenderAboveShroud(Actor self, WorldRenderer wr)
|
||||||
{
|
{
|
||||||
if (self.Owner != self.World.LocalPlayer || Minefield == null)
|
if (self.Owner != self.World.LocalPlayer || Minefield == null)
|
||||||
yield break;
|
yield break;
|
||||||
@@ -184,7 +181,7 @@ namespace OpenRA.Mods.RA.Traits
|
|||||||
|
|
||||||
CPos lastMousePos;
|
CPos lastMousePos;
|
||||||
public IEnumerable<IRenderable> Render(WorldRenderer wr, World world) { yield break; }
|
public IEnumerable<IRenderable> Render(WorldRenderer wr, World world) { yield break; }
|
||||||
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr, World world)
|
public IEnumerable<IRenderable> RenderAboveShroud(WorldRenderer wr, World world)
|
||||||
{
|
{
|
||||||
if (!minelayers.Any())
|
if (!minelayers.Any())
|
||||||
yield break;
|
yield break;
|
||||||
@@ -197,7 +194,7 @@ namespace OpenRA.Mods.RA.Traits
|
|||||||
var pal = wr.Palette(TileSet.TerrainPaletteInternalName);
|
var pal = wr.Palette(TileSet.TerrainPaletteInternalName);
|
||||||
foreach (var c in minefield)
|
foreach (var c in minefield)
|
||||||
{
|
{
|
||||||
var tile = movement.CanEnterCell(c, null, false) ? tileOk : tileBlocked;
|
var tile = movement.CanEnterCell(c, null, false) && !world.ShroudObscures(c) ? tileOk : tileBlocked;
|
||||||
yield return new SpriteRenderable(tile, world.Map.CenterOfCell(c),
|
yield return new SpriteRenderable(tile, world.Map.CenterOfCell(c),
|
||||||
WVec.Zero, -511, pal, 1f, true);
|
WVec.Zero, -511, pal, 1f, true);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -194,7 +194,7 @@ namespace OpenRA.Mods.RA.Traits
|
|||||||
yield break;
|
yield break;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr, World world)
|
public IEnumerable<IRenderable> RenderAboveShroud(WorldRenderer wr, World world)
|
||||||
{
|
{
|
||||||
if (!self.IsInWorld || self.Owner != self.World.LocalPlayer)
|
if (!self.IsInWorld || self.Owner != self.World.LocalPlayer)
|
||||||
yield break;
|
yield break;
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ using OpenRA.Traits;
|
|||||||
namespace OpenRA.Mods.RA.Traits
|
namespace OpenRA.Mods.RA.Traits
|
||||||
{
|
{
|
||||||
// TODO: remove all the Render*Circle duplication
|
// TODO: remove all the Render*Circle duplication
|
||||||
class RenderJammerCircleInfo : ITraitInfo, IPlaceBuildingDecorationInfo
|
class RenderJammerCircleInfo : TraitInfo<RenderJammerCircle>, IPlaceBuildingDecorationInfo
|
||||||
{
|
{
|
||||||
public IEnumerable<IRenderable> Render(WorldRenderer wr, World w, ActorInfo ai, WPos centerPosition)
|
public IEnumerable<IRenderable> Render(WorldRenderer wr, World w, ActorInfo ai, WPos centerPosition)
|
||||||
{
|
{
|
||||||
@@ -48,20 +48,14 @@ namespace OpenRA.Mods.RA.Traits
|
|||||||
|
|
||||||
foreach (var a in w.ActorsWithTrait<RenderJammerCircle>())
|
foreach (var a in w.ActorsWithTrait<RenderJammerCircle>())
|
||||||
if (a.Actor.Owner.IsAlliedWith(w.RenderPlayer))
|
if (a.Actor.Owner.IsAlliedWith(w.RenderPlayer))
|
||||||
foreach (var r in a.Trait.RenderAfterWorld(wr))
|
foreach (var r in a.Trait.RenderAboveShroud(a.Actor, wr))
|
||||||
yield return r;
|
yield return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
public object Create(ActorInitializer init) { return new RenderJammerCircle(init.Self); }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class RenderJammerCircle : IPostRenderSelection
|
class RenderJammerCircle : IRenderAboveShroudWhenSelected
|
||||||
{
|
{
|
||||||
Actor self;
|
public IEnumerable<IRenderable> RenderAboveShroud(Actor self, WorldRenderer wr)
|
||||||
|
|
||||||
public RenderJammerCircle(Actor self) { this.self = self; }
|
|
||||||
|
|
||||||
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr)
|
|
||||||
{
|
{
|
||||||
if (!self.Owner.IsAlliedWith(self.World.RenderPlayer))
|
if (!self.Owner.IsAlliedWith(self.World.RenderPlayer))
|
||||||
yield break;
|
yield break;
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
|
using System.Linq;
|
||||||
using OpenRA.Graphics;
|
using OpenRA.Graphics;
|
||||||
using OpenRA.Mods.Common.Graphics;
|
using OpenRA.Mods.Common.Graphics;
|
||||||
using OpenRA.Mods.Common.Traits;
|
using OpenRA.Mods.Common.Traits;
|
||||||
@@ -18,33 +19,27 @@ using OpenRA.Traits;
|
|||||||
|
|
||||||
namespace OpenRA.Mods.RA.Traits
|
namespace OpenRA.Mods.RA.Traits
|
||||||
{
|
{
|
||||||
class RenderShroudCircleInfo : ITraitInfo, IPlaceBuildingDecorationInfo
|
class RenderShroudCircleInfo : TraitInfo<RenderShroudCircle>, IPlaceBuildingDecorationInfo
|
||||||
{
|
{
|
||||||
public IEnumerable<IRenderable> Render(WorldRenderer wr, World w, ActorInfo ai, WPos centerPosition)
|
public IEnumerable<IRenderable> Render(WorldRenderer wr, World w, ActorInfo ai, WPos centerPosition)
|
||||||
{
|
{
|
||||||
yield return new RangeCircleRenderable(
|
var localRange = new RangeCircleRenderable(
|
||||||
centerPosition,
|
centerPosition,
|
||||||
ai.TraitInfo<CreatesShroudInfo>().Range,
|
ai.TraitInfo<CreatesShroudInfo>().Range,
|
||||||
0,
|
0,
|
||||||
Color.FromArgb(128, Color.Cyan),
|
Color.FromArgb(128, Color.Cyan),
|
||||||
Color.FromArgb(96, Color.Black));
|
Color.FromArgb(96, Color.Black));
|
||||||
|
|
||||||
foreach (var a in w.ActorsWithTrait<RenderShroudCircle>())
|
var otherRanges = w.ActorsWithTrait<RenderShroudCircle>()
|
||||||
if (a.Actor.Owner.IsAlliedWith(w.RenderPlayer))
|
.SelectMany(a => a.Trait.RangeCircleRenderables(a.Actor, wr));
|
||||||
foreach (var r in a.Trait.RenderAfterWorld(wr))
|
|
||||||
yield return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
public object Create(ActorInitializer init) { return new RenderShroudCircle(init.Self); }
|
return otherRanges.Append(localRange);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class RenderShroudCircle : IPostRenderSelection
|
class RenderShroudCircle : IRenderAboveShroudWhenSelected
|
||||||
{
|
{
|
||||||
Actor self;
|
public IEnumerable<IRenderable> RangeCircleRenderables(Actor self, WorldRenderer wr)
|
||||||
|
|
||||||
public RenderShroudCircle(Actor self) { this.self = self; }
|
|
||||||
|
|
||||||
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr)
|
|
||||||
{
|
{
|
||||||
if (!self.Owner.IsAlliedWith(self.World.RenderPlayer))
|
if (!self.Owner.IsAlliedWith(self.World.RenderPlayer))
|
||||||
yield break;
|
yield break;
|
||||||
@@ -56,5 +51,10 @@ namespace OpenRA.Mods.RA.Traits
|
|||||||
Color.FromArgb(128, Color.Cyan),
|
Color.FromArgb(128, Color.Cyan),
|
||||||
Color.FromArgb(96, Color.Black));
|
Color.FromArgb(96, Color.Black));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IEnumerable<IRenderable> IRenderAboveShroudWhenSelected.RenderAboveShroud(Actor self, WorldRenderer wr)
|
||||||
|
{
|
||||||
|
return RangeCircleRenderables(self, wr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -151,7 +151,7 @@ namespace OpenRA.Mods.RA.Traits
|
|||||||
world.CancelInputMode();
|
world.CancelInputMode();
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr, World world)
|
public IEnumerable<IRenderable> RenderAboveShroud(WorldRenderer wr, World world)
|
||||||
{
|
{
|
||||||
var xy = wr.Viewport.ViewToWorld(Viewport.LastMousePos);
|
var xy = wr.Viewport.ViewToWorld(Viewport.LastMousePos);
|
||||||
var targetUnits = power.UnitsInRange(xy).Where(a => !world.FogObscures(a));
|
var targetUnits = power.UnitsInRange(xy).Where(a => !world.FogObscures(a));
|
||||||
@@ -236,36 +236,19 @@ namespace OpenRA.Mods.RA.Traits
|
|||||||
world.CancelInputMode();
|
world.CancelInputMode();
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr, World world)
|
public IEnumerable<IRenderable> RenderAboveShroud(WorldRenderer wr, World world)
|
||||||
{
|
|
||||||
foreach (var unit in power.UnitsInRange(sourceLocation))
|
|
||||||
if (manager.Self.Owner.CanTargetActor(unit))
|
|
||||||
yield return new SelectionBoxRenderable(unit, Color.Red);
|
|
||||||
}
|
|
||||||
|
|
||||||
public IEnumerable<IRenderable> Render(WorldRenderer wr, World world)
|
|
||||||
{
|
{
|
||||||
var xy = wr.Viewport.ViewToWorld(Viewport.LastMousePos);
|
var xy = wr.Viewport.ViewToWorld(Viewport.LastMousePos);
|
||||||
var palette = wr.Palette(power.Info.IconPalette);
|
var palette = wr.Palette(power.Info.IconPalette);
|
||||||
|
|
||||||
// Source tiles
|
|
||||||
foreach (var t in world.Map.FindTilesInCircle(sourceLocation, range))
|
|
||||||
yield return new SpriteRenderable(sourceTile, wr.World.Map.CenterOfCell(t), WVec.Zero, -511, palette, 1f, true);
|
|
||||||
|
|
||||||
// Destination tiles
|
// Destination tiles
|
||||||
foreach (var t in world.Map.FindTilesInCircle(xy, range))
|
foreach (var t in world.Map.FindTilesInCircle(xy, range))
|
||||||
yield return new SpriteRenderable(sourceTile, wr.World.Map.CenterOfCell(t), WVec.Zero, -511, palette, 1f, true);
|
|
||||||
|
|
||||||
// Unit previews
|
|
||||||
foreach (var unit in power.UnitsInRange(sourceLocation))
|
|
||||||
{
|
{
|
||||||
var offset = world.Map.CenterOfCell(xy) - world.Map.CenterOfCell(sourceLocation);
|
var tile = manager.Self.Owner.Shroud.IsExplored(t) ? validTile : invalidTile;
|
||||||
if (manager.Self.Owner.CanTargetActor(unit))
|
yield return new SpriteRenderable(tile, wr.World.Map.CenterOfCell(t), WVec.Zero, -511, palette, 1f, true);
|
||||||
foreach (var r in unit.Render(wr))
|
|
||||||
yield return r.OffsetBy(offset);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unit tiles
|
// Unit previews
|
||||||
foreach (var unit in power.UnitsInRange(sourceLocation))
|
foreach (var unit in power.UnitsInRange(sourceLocation))
|
||||||
{
|
{
|
||||||
if (manager.Self.Owner.CanTargetActor(unit))
|
if (manager.Self.Owner.CanTargetActor(unit))
|
||||||
@@ -276,7 +259,25 @@ namespace OpenRA.Mods.RA.Traits
|
|||||||
var tile = canEnter ? validTile : invalidTile;
|
var tile = canEnter ? validTile : invalidTile;
|
||||||
yield return new SpriteRenderable(tile, wr.World.Map.CenterOfCell(targetCell), WVec.Zero, -511, palette, 1f, true);
|
yield return new SpriteRenderable(tile, wr.World.Map.CenterOfCell(targetCell), WVec.Zero, -511, palette, 1f, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var offset = world.Map.CenterOfCell(xy) - world.Map.CenterOfCell(sourceLocation);
|
||||||
|
if (manager.Self.Owner.CanTargetActor(unit))
|
||||||
|
foreach (var r in unit.Render(wr))
|
||||||
|
yield return r.OffsetBy(offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach (var unit in power.UnitsInRange(sourceLocation))
|
||||||
|
if (manager.Self.Owner.CanTargetActor(unit))
|
||||||
|
yield return new SelectionBoxRenderable(unit, Color.Red);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IEnumerable<IRenderable> Render(WorldRenderer wr, World world)
|
||||||
|
{
|
||||||
|
var palette = wr.Palette(power.Info.IconPalette);
|
||||||
|
|
||||||
|
// Source tiles
|
||||||
|
foreach (var t in world.Map.FindTilesInCircle(sourceLocation, range))
|
||||||
|
yield return new SpriteRenderable(sourceTile, wr.World.Map.CenterOfCell(t), WVec.Zero, -511, palette, 1f, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IsValidTarget(CPos xy)
|
bool IsValidTarget(CPos xy)
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ using OpenRA.Scripting;
|
|||||||
|
|
||||||
namespace OpenRA.Mods.TS.Effects
|
namespace OpenRA.Mods.TS.Effects
|
||||||
{
|
{
|
||||||
public class AnimatedBeacon : IEffect
|
public class AnimatedBeacon : IEffect, IEffectAboveShroud
|
||||||
{
|
{
|
||||||
readonly Player owner;
|
readonly Player owner;
|
||||||
readonly WPos position;
|
readonly WPos position;
|
||||||
@@ -43,19 +43,21 @@ namespace OpenRA.Mods.TS.Effects
|
|||||||
owner.World.Add(new DelayedAction(duration, () => owner.World.Remove(this)));
|
owner.World.Add(new DelayedAction(duration, () => owner.World.Remove(this)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Tick(World world)
|
void IEffect.Tick(World world)
|
||||||
{
|
{
|
||||||
if (beacon != null)
|
if (beacon != null)
|
||||||
beacon.Tick();
|
beacon.Tick();
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<IRenderable> Render(WorldRenderer r)
|
IEnumerable<IRenderable> IEffect.Render(WorldRenderer r) { return SpriteRenderable.None; }
|
||||||
|
|
||||||
|
IEnumerable<IRenderable> IEffectAboveShroud.RenderAboveShroud(WorldRenderer r)
|
||||||
{
|
{
|
||||||
if (beacon == null)
|
if (beacon == null)
|
||||||
return Enumerable.Empty<IRenderable>();
|
return SpriteRenderable.None;
|
||||||
|
|
||||||
if (!owner.IsAlliedWith(owner.World.RenderPlayer))
|
if (!owner.IsAlliedWith(owner.World.RenderPlayer))
|
||||||
return Enumerable.Empty<IRenderable>();
|
return SpriteRenderable.None;
|
||||||
|
|
||||||
var palette = r.Palette(isPlayerPalette ? beaconPalette + owner.InternalName : beaconPalette);
|
var palette = r.Palette(isPlayerPalette ? beaconPalette + owner.InternalName : beaconPalette);
|
||||||
return beacon.Render(position, palette);
|
return beacon.Render(position, palette);
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ namespace OpenRA.Mods.TS.Traits
|
|||||||
|
|
||||||
IEnumerable<IRenderable> IOrderGenerator.Render(WorldRenderer wr, World world) { yield break; }
|
IEnumerable<IRenderable> IOrderGenerator.Render(WorldRenderer wr, World world) { yield break; }
|
||||||
|
|
||||||
IEnumerable<IRenderable> IOrderGenerator.RenderAfterWorld(WorldRenderer wr, World world)
|
IEnumerable<IRenderable> IOrderGenerator.RenderAboveShroud(WorldRenderer wr, World world)
|
||||||
{
|
{
|
||||||
foreach (var a in instance.Instances.Where(i => !i.Self.IsDisabled()))
|
foreach (var a in instance.Instances.Where(i => !i.Self.IsDisabled()))
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user