Remove duplication between CreatesShroud and RevealsShroud.
This commit is contained in:
@@ -10,66 +10,19 @@
|
|||||||
|
|
||||||
namespace OpenRA.Mods.Common.Traits
|
namespace OpenRA.Mods.Common.Traits
|
||||||
{
|
{
|
||||||
public class CreatesShroudInfo : ITraitInfo
|
public class CreatesShroudInfo : RevealsShroudInfo
|
||||||
{
|
{
|
||||||
public readonly WRange Range = WRange.Zero;
|
public override object Create(ActorInitializer init) { return new CreatesShroud(init.Self, this); }
|
||||||
|
|
||||||
public object Create(ActorInitializer init) { return new CreatesShroud(init.Self, this); }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class CreatesShroud : ITick, ISync, INotifyAddedToWorld, INotifyRemovedFromWorld
|
public class CreatesShroud : RevealsShroud
|
||||||
{
|
{
|
||||||
readonly CreatesShroudInfo info;
|
|
||||||
readonly bool lobbyShroudFogDisabled;
|
|
||||||
[Sync] CPos cachedLocation;
|
|
||||||
[Sync] bool cachedDisabled;
|
|
||||||
|
|
||||||
public CreatesShroud(Actor self, CreatesShroudInfo info)
|
public CreatesShroud(Actor self, CreatesShroudInfo info)
|
||||||
|
: base(self, info)
|
||||||
{
|
{
|
||||||
this.info = info;
|
addCellsToPlayerShroud = (p, c) => p.Shroud.AddShroudGeneration(self, c);
|
||||||
lobbyShroudFogDisabled = !self.World.LobbyInfo.GlobalSettings.Shroud && !self.World.LobbyInfo.GlobalSettings.Fog;
|
removeCellsFromPlayerShroud = p => p.Shroud.RemoveShroudGeneration(self);
|
||||||
|
isDisabled = () => self.IsDisabled();
|
||||||
}
|
}
|
||||||
|
|
||||||
CPos[] ShroudedTiles(Actor self)
|
|
||||||
{
|
|
||||||
return Shroud.GetVisOrigins(self)
|
|
||||||
.SelectMany(o => Shroud.FindVisibleTiles(self.World, o, Range))
|
|
||||||
.Distinct().ToArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Tick(Actor self)
|
|
||||||
{
|
|
||||||
if (lobbyShroudFogDisabled)
|
|
||||||
return;
|
|
||||||
|
|
||||||
var disabled = self.IsDisabled();
|
|
||||||
if (cachedLocation != self.Location || cachedDisabled != disabled)
|
|
||||||
{
|
|
||||||
cachedLocation = self.Location;
|
|
||||||
cachedDisabled = disabled;
|
|
||||||
|
|
||||||
var shrouded = ShroudedTiles(self);
|
|
||||||
foreach (var p in self.World.Players)
|
|
||||||
{
|
|
||||||
p.Shroud.RemoveShroudGeneration(self);
|
|
||||||
p.Shroud.AddShroudGeneration(self, shrouded);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void AddedToWorld(Actor self)
|
|
||||||
{
|
|
||||||
var shrouded = ShroudedTiles(self);
|
|
||||||
foreach (var p in self.World.Players)
|
|
||||||
p.Shroud.AddShroudGeneration(self, shrouded);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void RemovedFromWorld(Actor self)
|
|
||||||
{
|
|
||||||
foreach (var p in self.World.Players)
|
|
||||||
p.Shroud.RemoveShroudGeneration(self);
|
|
||||||
}
|
|
||||||
|
|
||||||
public WRange Range { get { return cachedDisabled ? WRange.Zero : info.Range; } }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -8,6 +8,7 @@
|
|||||||
*/
|
*/
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
using System;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using OpenRA.Traits;
|
using OpenRA.Traits;
|
||||||
|
|
||||||
@@ -17,59 +18,80 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
{
|
{
|
||||||
public readonly WRange Range = WRange.Zero;
|
public readonly WRange Range = WRange.Zero;
|
||||||
|
|
||||||
public object Create(ActorInitializer init) { return new RevealsShroud(init.Self, this); }
|
public virtual object Create(ActorInitializer init) { return new RevealsShroud(init.Self, this); }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class RevealsShroud : ITick, ISync, INotifyAddedToWorld, INotifyRemovedFromWorld
|
public class RevealsShroud : ITick, ISync, INotifyAddedToWorld, INotifyRemovedFromWorld
|
||||||
{
|
{
|
||||||
|
static readonly CPos[] NoCells = { };
|
||||||
|
|
||||||
readonly RevealsShroudInfo info;
|
readonly RevealsShroudInfo info;
|
||||||
readonly bool lobbyShroudFogDisabled;
|
readonly bool lobbyShroudFogDisabled;
|
||||||
[Sync] CPos cachedLocation;
|
[Sync] CPos cachedLocation;
|
||||||
|
[Sync] bool cachedDisabled;
|
||||||
|
|
||||||
|
protected Action<Player, CPos[]> addCellsToPlayerShroud;
|
||||||
|
protected Action<Player> removeCellsFromPlayerShroud;
|
||||||
|
protected Func<bool> isDisabled;
|
||||||
|
|
||||||
public RevealsShroud(Actor self, RevealsShroudInfo info)
|
public RevealsShroud(Actor self, RevealsShroudInfo info)
|
||||||
{
|
{
|
||||||
this.info = info;
|
this.info = info;
|
||||||
lobbyShroudFogDisabled = !self.World.LobbyInfo.GlobalSettings.Shroud && !self.World.LobbyInfo.GlobalSettings.Fog;
|
lobbyShroudFogDisabled = !self.World.LobbyInfo.GlobalSettings.Shroud && !self.World.LobbyInfo.GlobalSettings.Fog;
|
||||||
|
|
||||||
|
addCellsToPlayerShroud = (p, c) => p.Shroud.AddVisibility(self, c);
|
||||||
|
removeCellsFromPlayerShroud = p => p.Shroud.RemoveVisibility(self);
|
||||||
|
isDisabled = () => false;
|
||||||
}
|
}
|
||||||
|
|
||||||
CPos[] VisibleTiles(Actor self)
|
CPos[] Cells(Actor self)
|
||||||
{
|
{
|
||||||
|
var range = Range;
|
||||||
|
if (range == WRange.Zero)
|
||||||
|
return NoCells;
|
||||||
|
|
||||||
return Shroud.GetVisOrigins(self)
|
return Shroud.GetVisOrigins(self)
|
||||||
.SelectMany(o => Shroud.FindVisibleTiles(self.World, o, Range))
|
.SelectMany(o => Shroud.FindVisibleTiles(self.World, o, range))
|
||||||
.Distinct().ToArray();
|
.Distinct().ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Tick(Actor self)
|
public void Tick(Actor self)
|
||||||
{
|
{
|
||||||
if (lobbyShroudFogDisabled)
|
if (lobbyShroudFogDisabled || !self.IsInWorld)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (cachedLocation != self.Location)
|
var location = self.Location;
|
||||||
{
|
var disabled = isDisabled();
|
||||||
cachedLocation = self.Location;
|
if (cachedLocation == location && cachedDisabled == disabled)
|
||||||
|
return;
|
||||||
|
|
||||||
var visible = VisibleTiles(self);
|
cachedLocation = location;
|
||||||
foreach (var p in self.World.Players)
|
cachedDisabled = disabled;
|
||||||
{
|
|
||||||
p.Shroud.RemoveVisibility(self);
|
var cells = Cells(self);
|
||||||
p.Shroud.AddVisibility(self, visible);
|
foreach (var p in self.World.Players)
|
||||||
}
|
{
|
||||||
|
removeCellsFromPlayerShroud(p);
|
||||||
|
addCellsToPlayerShroud(p, cells);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddedToWorld(Actor self)
|
public void AddedToWorld(Actor self)
|
||||||
{
|
{
|
||||||
var visible = VisibleTiles(self);
|
cachedLocation = self.Location;
|
||||||
|
cachedDisabled = isDisabled();
|
||||||
|
|
||||||
|
var cells = Cells(self);
|
||||||
foreach (var p in self.World.Players)
|
foreach (var p in self.World.Players)
|
||||||
p.Shroud.AddVisibility(self, visible);
|
addCellsToPlayerShroud(p, cells);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RemovedFromWorld(Actor self)
|
public void RemovedFromWorld(Actor self)
|
||||||
{
|
{
|
||||||
foreach (var p in self.World.Players)
|
foreach (var p in self.World.Players)
|
||||||
p.Shroud.RemoveVisibility(self);
|
removeCellsFromPlayerShroud(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
public WRange Range { get { return info.Range; } }
|
public WRange Range { get { return cachedDisabled ? WRange.Zero : info.Range; } }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user