Fix desync issues

This commit is contained in:
Scott_NZ
2012-08-22 17:20:01 +12:00
committed by Chris Forbes
parent 70a5333b40
commit 4b36a9bf7f

View File

@@ -64,7 +64,8 @@ namespace OpenRA.Mods.RA.Missions
Actor sovietBarracks; Actor sovietBarracks;
Actor sovietWarFactory; Actor sovietWarFactory;
CountdownTimerWidget reinforcementsTimer; CountdownTimer reinforcementsTimer;
CountdownTimerWidget reinforcementsTimerWidget;
const string InfantryQueueName = "Infantry"; const string InfantryQueueName = "Infantry";
const string VehicleQueueName = "Vehicle"; const string VehicleQueueName = "Vehicle";
@@ -106,7 +107,7 @@ namespace OpenRA.Mods.RA.Missions
allies1.WinState = allies2.WinState = WinState.Lost; allies1.WinState = allies2.WinState = WinState.Lost;
if (reinforcementsTimer != null) if (reinforcementsTimer != null)
{ {
reinforcementsTimer.Visible = false; reinforcementsTimerWidget.Visible = false;
} }
foreach (var actor in world.Actors.Where(a => a.IsInWorld && (a.Owner == allies1 || a.Owner == allies2) && !a.IsDead())) foreach (var actor in world.Actors.Where(a => a.IsInWorld && (a.Owner == allies1 || a.Owner == allies2) && !a.IsDead()))
{ {
@@ -125,7 +126,7 @@ namespace OpenRA.Mods.RA.Missions
allies1.WinState = allies2.WinState = WinState.Won; allies1.WinState = allies2.WinState = WinState.Won;
if (reinforcementsTimer != null) if (reinforcementsTimer != null)
{ {
reinforcementsTimer.Visible = false; reinforcementsTimerWidget.Visible = false;
} }
Game.AddChatLine(Color.Blue, "Mission accomplished", text); Game.AddChatLine(Color.Blue, "Mission accomplished", text);
Sound.Play("misnwon1.aud"); Sound.Play("misnwon1.aud");
@@ -150,6 +151,7 @@ namespace OpenRA.Mods.RA.Missions
InitializeSovietFactories(); InitializeSovietFactories();
StartReinforcementsTimer(); StartReinforcementsTimer();
} }
reinforcementsTimer.Tick();
if (world.FrameNumber == ParatroopersTicks) if (world.FrameNumber == ParatroopersTicks)
{ {
ParadropSovietUnits(); ParadropSovietUnits();
@@ -220,6 +222,10 @@ namespace OpenRA.Mods.RA.Missions
void BuildSovietUnits() void BuildSovietUnits()
{ {
if (!Game.IsHost)
{
return;
}
var powerManager = soviets.PlayerActor.Trait<PowerManager>(); var powerManager = soviets.PlayerActor.Trait<PowerManager>();
if (powerManager.ExcessPower < 0) if (powerManager.ExcessPower < 0)
{ {
@@ -294,8 +300,9 @@ namespace OpenRA.Mods.RA.Missions
void StartReinforcementsTimer() void StartReinforcementsTimer()
{ {
Sound.Play("timergo1.aud"); Sound.Play("timergo1.aud");
reinforcementsTimer = new CountdownTimerWidget("Reinforcements arrive in", ReinforcementsTicks, ReinforcementsTimerExpired, new float2(128, 96)); reinforcementsTimer = new CountdownTimer(ReinforcementsTicks, ReinforcementsTimerExpired);
Ui.Root.AddChild(reinforcementsTimer); reinforcementsTimerWidget = new CountdownTimerWidget(reinforcementsTimer, "Reinforcements arrive in", new float2(128, 96));
Ui.Root.AddChild(reinforcementsTimerWidget);
} }
void ParadropSovietUnits() void ParadropSovietUnits()
@@ -333,9 +340,9 @@ namespace OpenRA.Mods.RA.Missions
apc.QueueActivity(new UnloadCargo(true)); apc.QueueActivity(new UnloadCargo(true));
} }
void ReinforcementsTimerExpired(CountdownTimerWidget timer) void ReinforcementsTimerExpired(CountdownTimer countdownTimer)
{ {
timer.Visible = false; reinforcementsTimerWidget.Visible = false;
SendReinforcements(); SendReinforcements();
} }
@@ -453,18 +460,25 @@ namespace OpenRA.Mods.RA.Missions
} }
} }
public class CountdownTimerWidget : Widget public class CountdownTimer
{ {
public string Header { get; set; }
public int TicksLeft { get; set; } public int TicksLeft { get; set; }
public float2 Position { get; set; }
public CountdownTimerWidget(string header, int ticksLeft, Action<CountdownTimerWidget> onExpired, float2 position) public Action<CountdownTimer> OnExpired { get; set; }
public Action<CountdownTimer> OnOneMinuteRemaining { get; set; }
public Action<CountdownTimer> OnTwoMinutesRemaining { get; set; }
public Action<CountdownTimer> OnThreeMinutesRemaining { get; set; }
public Action<CountdownTimer> OnFourMinutesRemaining { get; set; }
public Action<CountdownTimer> OnFiveMinutesRemaining { get; set; }
public Action<CountdownTimer> OnTenMinutesRemaining { get; set; }
public Action<CountdownTimer> OnTwentyMinutesRemaining { get; set; }
public Action<CountdownTimer> OnThirtyMinutesRemaining { get; set; }
public Action<CountdownTimer> OnFortyMinutesRemaining { get; set; }
public CountdownTimer(int ticksLeft, Action<CountdownTimer> onExpired)
{ {
Header = header;
TicksLeft = ticksLeft; TicksLeft = ticksLeft;
OnExpired = onExpired; OnExpired = onExpired;
Position = position;
OnOneMinuteRemaining = t => Sound.Play("1minr.aud"); OnOneMinuteRemaining = t => Sound.Play("1minr.aud");
OnTwoMinutesRemaining = t => Sound.Play("2minr.aud"); OnTwoMinutesRemaining = t => Sound.Play("2minr.aud");
OnThreeMinutesRemaining = t => Sound.Play("3minr.aud"); OnThreeMinutesRemaining = t => Sound.Play("3minr.aud");
@@ -476,23 +490,8 @@ namespace OpenRA.Mods.RA.Missions
OnFortyMinutesRemaining = t => Sound.Play("40minr.aud"); OnFortyMinutesRemaining = t => Sound.Play("40minr.aud");
} }
public Action<CountdownTimerWidget> OnExpired { get; set; } public void Tick()
public Action<CountdownTimerWidget> OnOneMinuteRemaining { get; set; }
public Action<CountdownTimerWidget> OnTwoMinutesRemaining { get; set; }
public Action<CountdownTimerWidget> OnThreeMinutesRemaining { get; set; }
public Action<CountdownTimerWidget> OnFourMinutesRemaining { get; set; }
public Action<CountdownTimerWidget> OnFiveMinutesRemaining { get; set; }
public Action<CountdownTimerWidget> OnTenMinutesRemaining { get; set; }
public Action<CountdownTimerWidget> OnTwentyMinutesRemaining { get; set; }
public Action<CountdownTimerWidget> OnThirtyMinutesRemaining { get; set; }
public Action<CountdownTimerWidget> OnFortyMinutesRemaining { get; set; }
public override void Tick()
{ {
if (!IsVisible())
{
return;
}
if (TicksLeft > 0) if (TicksLeft > 0)
{ {
TicksLeft--; TicksLeft--;
@@ -511,6 +510,20 @@ namespace OpenRA.Mods.RA.Missions
} }
} }
} }
}
public class CountdownTimerWidget : Widget
{
public CountdownTimer CountdownTimer { get; set; }
public string Header { get; set; }
public float2 Position { get; set; }
public CountdownTimerWidget(CountdownTimer countdownTimer, string header, float2 position)
{
CountdownTimer = countdownTimer;
Header = header;
Position = position;
}
public override void Draw() public override void Draw()
{ {
@@ -519,8 +532,8 @@ namespace OpenRA.Mods.RA.Missions
return; return;
} }
var font = Game.Renderer.Fonts["Bold"]; var font = Game.Renderer.Fonts["Bold"];
var text = "{0}: {1}".F(Header, WidgetUtils.FormatTime(TicksLeft)); var text = "{0}: {1}".F(Header, WidgetUtils.FormatTime(CountdownTimer.TicksLeft));
font.DrawTextWithContrast(text, Position, TicksLeft == 0 && Game.LocalTick % 60 >= 30 ? Color.Red : Color.White, Color.Black, 1); font.DrawTextWithContrast(text, Position, CountdownTimer.TicksLeft == 0 && Game.LocalTick % 60 >= 30 ? Color.Red : Color.White, Color.Black, 1);
} }
} }
} }