Merge pull request #11177 from abcdefg30/powerBar

Make SupportPowerChargeBar and the SupportPowerTimer customizable with stances
This commit is contained in:
reaperrr
2016-08-21 01:32:46 +02:00
committed by GitHub
6 changed files with 46 additions and 13 deletions

View File

@@ -15,38 +15,48 @@ using OpenRA.Traits;
namespace OpenRA.Mods.Common.Traits.Render
{
[Desc("Display the time remaining until the super weapon attached to the actor is ready to the player and his allies.")]
[Desc("Display the time remaining until the super weapon attached to the actor is ready.")]
class SupportPowerChargeBarInfo : ITraitInfo
{
[Desc("Defines to which players the bar is to be shown.")]
public readonly Stance DisplayStances = Stance.Ally;
public readonly Color Color = Color.Magenta;
public object Create(ActorInitializer init) { return new SupportPowerChargeBar(init.Self, this); }
}
class SupportPowerChargeBar : ISelectionBar
class SupportPowerChargeBar : ISelectionBar, INotifyOwnerChanged
{
readonly Actor self;
readonly SupportPowerChargeBarInfo info;
SupportPowerManager spm;
public SupportPowerChargeBar(Actor self, SupportPowerChargeBarInfo info)
{
this.self = self;
this.info = info;
spm = self.Owner.PlayerActor.Trait<SupportPowerManager>();
}
float ISelectionBar.GetValue()
{
if (!self.Owner.IsAlliedWith(self.World.RenderPlayer))
var power = spm.GetPowersForActor(self).FirstOrDefault(sp => !sp.Disabled);
if (power == null)
return 0;
var spm = self.Owner.PlayerActor.Trait<SupportPowerManager>();
var power = spm.GetPowersForActor(self).FirstOrDefault(sp => !sp.Disabled);
if (power == null) return 0;
var viewer = self.World.RenderPlayer ?? self.World.LocalPlayer;
if (viewer != null && info.DisplayStances.HasStance(self.Owner.Stances[viewer]))
return 0;
return 1 - (float)power.RemainingTime / power.TotalTime;
}
Color ISelectionBar.GetColor() { return info.Color; }
void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner)
{
spm = newOwner.PlayerActor.Trait<SupportPowerManager>();
}
}
}

View File

@@ -44,7 +44,8 @@ namespace OpenRA.Mods.Common.Traits
public readonly string IncomingSound = null;
public readonly string IncomingSpeechNotification = null;
public readonly bool DisplayTimer = false;
[Desc("Defines to which players the timer is shown.")]
public readonly Stance DisplayTimerStances = Stance.None;
[Desc("Palette used for the icon.")]
[PaletteReference] public readonly string IconPalette = "chrome";

View File

@@ -291,6 +291,20 @@ namespace OpenRA.Mods.Common.UtilityCommands
}
}
// DisplayTimer was replaced by DisplayTimerStances
if (engineVersion < 20160710)
{
if (node.Key == "DisplayTimer")
{
node.Key = "DisplayTimerStances";
if (node.Value.Value.ToLower() == "false")
node.Value.Value = "None";
else
node.Value.Value = "Ally, Neutral, Enemy";
}
}
UpgradeActorRules(modData, engineVersion, ref node.Value.Nodes, node, depth + 1);
}

View File

@@ -16,6 +16,7 @@ using System.Linq;
using OpenRA.Graphics;
using OpenRA.Mods.Common.Traits;
using OpenRA.Primitives;
using OpenRA.Traits;
using OpenRA.Widgets;
namespace OpenRA.Mods.Common.Widgets
@@ -36,7 +37,7 @@ namespace OpenRA.Mods.Common.Widgets
powers = world.ActorsWithTrait<SupportPowerManager>()
.Where(p => !p.Actor.IsDead && !p.Actor.Owner.NonCombatant)
.SelectMany(s => s.Trait.Powers.Values)
.Where(p => p.Instances.Any() && p.Info.DisplayTimer && !p.Disabled);
.Where(p => p.Instances.Any() && p.Info.DisplayTimerStances != Stance.None && !p.Disabled);
// Timers in replays should be synced to the effective game time, not the playback time.
timestep = world.Timestep;
@@ -46,7 +47,14 @@ namespace OpenRA.Mods.Common.Widgets
public override void Tick()
{
texts = powers.Select(p =>
var displayedPowers = powers.Where(p =>
{
var owner = p.Instances[0].Self.Owner;
var viewer = owner.World.RenderPlayer ?? owner.World.LocalPlayer;
return viewer == null || p.Info.DisplayTimerStances.HasStance(owner.Stances[viewer]);
});
texts = displayedPowers.Select(p =>
{
var time = WidgetUtils.FormatTime(p.RemainingTime, false, timestep);
var text = Format.F(p.Info.Description, time);

View File

@@ -32,7 +32,7 @@ MSLO:
IncomingSpeechNotification: AbombLaunchDetected
MissileWeapon: atomic
SpawnOffset: 0,427,0
DisplayTimer: True
DisplayTimerStances: Ally, Neutral, Enemy
DisplayBeacon: True
DisplayRadarPing: True
BeaconPoster: atomicon
@@ -771,7 +771,7 @@ ATEK:
LongDesc: Reveals map terrain and provides tactical\ninformation. Requires power and active radar.
RevealDelay: 15
LaunchSpeechNotification: SatelliteLaunched
DisplayTimer: True
DisplayTimerStances: Ally, Neutral, Enemy
SupportPowerChargeBar:
RequiresPower:
DisabledOverlay:

View File

@@ -243,7 +243,7 @@ NAMISL:
LaunchSound: icbm1.aud
MissileWeapon: ClusterMissile
SpawnOffset: 0,427,0
DisplayTimer: False
DisplayTimerStances: None
DisplayBeacon: False
DisplayRadarPing: True
BeaconPoster: