Made PowerManager optional for traits who do not require it.
This commit is contained in:
@@ -199,7 +199,7 @@ namespace OpenRA.Mods.Common.AI
|
|||||||
|
|
||||||
bool HasSufficientPowerForActor(ActorInfo actorInfo)
|
bool HasSufficientPowerForActor(ActorInfo actorInfo)
|
||||||
{
|
{
|
||||||
return (actorInfo.TraitInfos<PowerInfo>().Where(i => i.EnabledByDefault)
|
return playerPower == null || (actorInfo.TraitInfos<PowerInfo>().Where(i => i.EnabledByDefault)
|
||||||
.Sum(p => p.Amount) + playerPower.ExcessPower) >= minimumExcessPower;
|
.Sum(p => p.Amount) + playerPower.ExcessPower) >= minimumExcessPower;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -212,7 +212,7 @@ namespace OpenRA.Mods.Common.AI
|
|||||||
a => a.TraitInfos<PowerInfo>().Where(i => i.EnabledByDefault).Sum(p => p.Amount));
|
a => a.TraitInfos<PowerInfo>().Where(i => i.EnabledByDefault).Sum(p => p.Amount));
|
||||||
|
|
||||||
// First priority is to get out of a low power situation
|
// First priority is to get out of a low power situation
|
||||||
if (playerPower.ExcessPower < minimumExcessPower)
|
if (playerPower != null && playerPower.ExcessPower < minimumExcessPower)
|
||||||
{
|
{
|
||||||
if (power != null && power.TraitInfos<PowerInfo>().Where(i => i.EnabledByDefault).Sum(p => p.Amount) > 0)
|
if (power != null && power.TraitInfos<PowerInfo>().Where(i => i.EnabledByDefault).Sum(p => p.Amount) > 0)
|
||||||
{
|
{
|
||||||
@@ -318,7 +318,7 @@ namespace OpenRA.Mods.Common.AI
|
|||||||
|
|
||||||
// Will this put us into low power?
|
// Will this put us into low power?
|
||||||
var actor = world.Map.Rules.Actors[name];
|
var actor = world.Map.Rules.Actors[name];
|
||||||
if (playerPower.ExcessPower < minimumExcessPower || !HasSufficientPowerForActor(actor))
|
if (playerPower != null && (playerPower.ExcessPower < minimumExcessPower || !HasSufficientPowerForActor(actor)))
|
||||||
{
|
{
|
||||||
// Try building a power plant instead
|
// Try building a power plant instead
|
||||||
if (power != null && power.TraitInfos<PowerInfo>().Where(i => i.EnabledByDefault).Sum(pi => pi.Amount) > 0)
|
if (power != null && power.TraitInfos<PowerInfo>().Where(i => i.EnabledByDefault).Sum(pi => pi.Amount) > 0)
|
||||||
|
|||||||
@@ -330,7 +330,7 @@ namespace OpenRA.Mods.Common.AI
|
|||||||
{
|
{
|
||||||
Player = p;
|
Player = p;
|
||||||
IsEnabled = true;
|
IsEnabled = true;
|
||||||
playerPower = p.PlayerActor.Trait<PowerManager>();
|
playerPower = p.PlayerActor.TraitOrDefault<PowerManager>();
|
||||||
playerResource = p.PlayerActor.Trait<PlayerResources>();
|
playerResource = p.PlayerActor.Trait<PlayerResources>();
|
||||||
|
|
||||||
harvManager = new AIHarvesterManager(this, p);
|
harvManager = new AIHarvesterManager(this, p);
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
[Desc("Attach this to the player actor (not a building!) to define a new shared build queue.",
|
[Desc("Attach this to the player actor (not a building!) to define a new shared build queue.",
|
||||||
"Will only work together with the Production: trait on the actor that actually does the production.",
|
"Will only work together with the Production: trait on the actor that actually does the production.",
|
||||||
"You will also want to add PrimaryBuildings: to let the user choose where new units should exit.")]
|
"You will also want to add PrimaryBuildings: to let the user choose where new units should exit.")]
|
||||||
public class ClassicProductionQueueInfo : ProductionQueueInfo, Requires<TechTreeInfo>, Requires<PowerManagerInfo>, Requires<PlayerResourcesInfo>
|
public class ClassicProductionQueueInfo : ProductionQueueInfo, Requires<TechTreeInfo>, Requires<PlayerResourcesInfo>
|
||||||
{
|
{
|
||||||
[Desc("If you build more actors of the same type,", "the same queue will get its build time lowered for every actor produced there.")]
|
[Desc("If you build more actors of the same type,", "the same queue will get its build time lowered for every actor produced there.")]
|
||||||
public readonly bool SpeedUp = false;
|
public readonly bool SpeedUp = false;
|
||||||
|
|||||||
@@ -121,7 +121,6 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
self = init.Self;
|
self = init.Self;
|
||||||
Info = info;
|
Info = info;
|
||||||
playerResources = playerActor.Trait<PlayerResources>();
|
playerResources = playerActor.Trait<PlayerResources>();
|
||||||
playerPower = playerActor.Trait<PowerManager>();
|
|
||||||
developerMode = playerActor.Trait<DeveloperMode>();
|
developerMode = playerActor.Trait<DeveloperMode>();
|
||||||
|
|
||||||
Faction = init.Contains<FactionInit>() ? init.Get<FactionInit, string>() : self.Owner.Faction.InternalName;
|
Faction = init.Contains<FactionInit>() ? init.Get<FactionInit, string>() : self.Owner.Faction.InternalName;
|
||||||
@@ -135,6 +134,11 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
|
|
||||||
void INotifyCreated.Created(Actor self)
|
void INotifyCreated.Created(Actor self)
|
||||||
{
|
{
|
||||||
|
// Special case handling is required for the Player actor.
|
||||||
|
// Created is called before Player.PlayerActor is assigned,
|
||||||
|
// so we must query other player traits from self, knowing that
|
||||||
|
// it refers to the same actor as self.Owner.PlayerActor
|
||||||
|
playerPower = (self.Info.Name == "player" ? self : self.Owner.PlayerActor).TraitOrDefault<PowerManager>();
|
||||||
productionTraits = self.TraitsImplementing<Production>().ToArray();
|
productionTraits = self.TraitsImplementing<Production>().ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -152,7 +156,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
{
|
{
|
||||||
ClearQueue();
|
ClearQueue();
|
||||||
|
|
||||||
playerPower = newOwner.PlayerActor.Trait<PowerManager>();
|
playerPower = newOwner.PlayerActor.TraitOrDefault<PowerManager>();
|
||||||
playerResources = newOwner.PlayerActor.Trait<PlayerResources>();
|
playerResources = newOwner.PlayerActor.Trait<PlayerResources>();
|
||||||
developerMode = newOwner.PlayerActor.Trait<DeveloperMode>();
|
developerMode = newOwner.PlayerActor.Trait<DeveloperMode>();
|
||||||
|
|
||||||
@@ -522,7 +526,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return (pm.PowerState == PowerState.Normal) ? RemainingTime :
|
return (pm == null || pm.PowerState == PowerState.Normal) ? RemainingTime :
|
||||||
RemainingTime * Queue.Info.LowPowerSlowdown;
|
RemainingTime * Queue.Info.LowPowerSlowdown;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -570,7 +574,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
if (Paused)
|
if (Paused)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (pm.PowerState != PowerState.Normal)
|
if (pm != null && pm.PowerState != PowerState.Normal)
|
||||||
{
|
{
|
||||||
if (--Slowdown <= 0)
|
if (--Slowdown <= 0)
|
||||||
Slowdown = Queue.Info.LowPowerSlowdown;
|
Slowdown = Queue.Info.LowPowerSlowdown;
|
||||||
|
|||||||
@@ -255,10 +255,13 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
|||||||
template.Get<LabelWidget>("CASH").GetText = () => "$" + (res.Cash + res.Resources);
|
template.Get<LabelWidget>("CASH").GetText = () => "$" + (res.Cash + res.Resources);
|
||||||
template.Get<LabelWidget>("EARNED_MIN").GetText = () => AverageEarnedPerMinute(res.Earned);
|
template.Get<LabelWidget>("EARNED_MIN").GetText = () => AverageEarnedPerMinute(res.Earned);
|
||||||
|
|
||||||
var powerRes = player.PlayerActor.Trait<PowerManager>();
|
var powerRes = player.PlayerActor.TraitOrDefault<PowerManager>();
|
||||||
var power = template.Get<LabelWidget>("POWER");
|
if (powerRes != null)
|
||||||
power.GetText = () => powerRes.PowerDrained + "/" + powerRes.PowerProvided;
|
{
|
||||||
power.GetColor = () => GetPowerColor(powerRes.PowerState);
|
var power = template.Get<LabelWidget>("POWER");
|
||||||
|
power.GetText = () => powerRes.PowerDrained + "/" + powerRes.PowerProvided;
|
||||||
|
power.GetColor = () => GetPowerColor(powerRes.PowerState);
|
||||||
|
}
|
||||||
|
|
||||||
var stats = player.PlayerActor.TraitOrDefault<PlayerStatistics>();
|
var stats = player.PlayerActor.TraitOrDefault<PlayerStatistics>();
|
||||||
if (stats == null) return template;
|
if (stats == null) return template;
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
|||||||
{
|
{
|
||||||
var world = player.World;
|
var world = player.World;
|
||||||
var mapRules = world.Map.Rules;
|
var mapRules = world.Map.Rules;
|
||||||
var pm = player.PlayerActor.Trait<PowerManager>();
|
var pm = player.PlayerActor.TraitOrDefault<PowerManager>();
|
||||||
var pr = player.PlayerActor.Trait<PlayerResources>();
|
var pr = player.PlayerActor.Trait<PlayerResources>();
|
||||||
|
|
||||||
widget.IsVisible = () => getTooltipIcon() != null && getTooltipIcon().Actor != null;
|
widget.IsVisible = () => getTooltipIcon() != null && getTooltipIcon().Actor != null;
|
||||||
@@ -51,7 +51,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
|||||||
|
|
||||||
ActorInfo lastActor = null;
|
ActorInfo lastActor = null;
|
||||||
Hotkey lastHotkey = Hotkey.Invalid;
|
Hotkey lastHotkey = Hotkey.Invalid;
|
||||||
var lastPowerState = pm.PowerState;
|
var lastPowerState = pm == null ? PowerState.Normal : pm.PowerState;
|
||||||
|
|
||||||
tooltipContainer.BeforeRender = () =>
|
tooltipContainer.BeforeRender = () =>
|
||||||
{
|
{
|
||||||
@@ -64,7 +64,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
var hotkey = tooltipIcon.Hotkey != null ? tooltipIcon.Hotkey.GetValue() : Hotkey.Invalid;
|
var hotkey = tooltipIcon.Hotkey != null ? tooltipIcon.Hotkey.GetValue() : Hotkey.Invalid;
|
||||||
if (actor == lastActor && hotkey == lastHotkey && pm.PowerState == lastPowerState)
|
if (actor == lastActor && hotkey == lastHotkey && (pm == null || pm.PowerState == lastPowerState))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var tooltip = actor.TraitInfos<TooltipInfo>().FirstOrDefault(info => info.EnabledByDefault);
|
var tooltip = actor.TraitInfos<TooltipInfo>().FirstOrDefault(info => info.EnabledByDefault);
|
||||||
@@ -92,19 +92,23 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
|||||||
requiresLabel.Text = prereqs.Any() ? requiresFormat.F(prereqs.JoinWith(", ")) : "";
|
requiresLabel.Text = prereqs.Any() ? requiresFormat.F(prereqs.JoinWith(", ")) : "";
|
||||||
var requiresSize = requiresFont.Measure(requiresLabel.Text);
|
var requiresSize = requiresFont.Measure(requiresLabel.Text);
|
||||||
|
|
||||||
var power = actor.TraitInfos<PowerInfo>().Where(i => i.EnabledByDefault).Sum(i => i.Amount);
|
var powerSize = new int2(0, 0);
|
||||||
powerLabel.Text = power.ToString();
|
if (pm != null)
|
||||||
powerLabel.GetColor = () => ((pm.PowerProvided - pm.PowerDrained) >= -power || power > 0)
|
{
|
||||||
? Color.White : Color.Red;
|
var power = actor.TraitInfos<PowerInfo>().Where(i => i.EnabledByDefault).Sum(i => i.Amount);
|
||||||
powerLabel.Visible = power != 0;
|
powerLabel.Text = power.ToString();
|
||||||
powerIcon.Visible = power != 0;
|
powerLabel.GetColor = () => ((pm.PowerProvided - pm.PowerDrained) >= -power || power > 0)
|
||||||
var powerSize = font.Measure(powerLabel.Text);
|
? Color.White : Color.Red;
|
||||||
|
powerLabel.Visible = power != 0;
|
||||||
|
powerIcon.Visible = power != 0;
|
||||||
|
powerSize = font.Measure(powerLabel.Text);
|
||||||
|
}
|
||||||
|
|
||||||
var buildTime = tooltipIcon.ProductionQueue == null ? 0 : tooltipIcon.ProductionQueue.GetBuildTime(actor, buildable);
|
var buildTime = tooltipIcon.ProductionQueue == null ? 0 : tooltipIcon.ProductionQueue.GetBuildTime(actor, buildable);
|
||||||
var timeMultiplier = pm.PowerState != PowerState.Normal ? tooltipIcon.ProductionQueue.Info.LowPowerSlowdown : 1;
|
var timeMultiplier = pm != null && pm.PowerState != PowerState.Normal ? tooltipIcon.ProductionQueue.Info.LowPowerSlowdown : 1;
|
||||||
|
|
||||||
timeLabel.Text = formatBuildTime.Update(buildTime * timeMultiplier);
|
timeLabel.Text = formatBuildTime.Update(buildTime * timeMultiplier);
|
||||||
timeLabel.TextColor = (pm.PowerState != PowerState.Normal && tooltipIcon.ProductionQueue.Info.LowPowerSlowdown > 1) ? Color.Red : Color.White;
|
timeLabel.TextColor = (pm != null && pm.PowerState != PowerState.Normal && tooltipIcon.ProductionQueue.Info.LowPowerSlowdown > 1) ? Color.Red : Color.White;
|
||||||
var timeSize = font.Measure(timeLabel.Text);
|
var timeSize = font.Measure(timeLabel.Text);
|
||||||
|
|
||||||
costLabel.Text = cost.ToString();
|
costLabel.Text = cost.ToString();
|
||||||
@@ -127,7 +131,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
|||||||
|
|
||||||
lastActor = actor;
|
lastActor = actor;
|
||||||
lastHotkey = hotkey;
|
lastHotkey = hotkey;
|
||||||
lastPowerState = pm.PowerState;
|
if (pm != null)
|
||||||
|
lastPowerState = pm.PowerState;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user