Fix OnObjective(Completed|Failed) not being called for secondary objectives

This commit is contained in:
Oliver Brakmann
2014-08-23 12:45:30 +02:00
parent 56466e312f
commit 1e7f04105d

View File

@@ -79,8 +79,8 @@ namespace OpenRA.Mods.RA
objectives.Insert(newID, new MissionObjective(type, description)); objectives.Insert(newID, new MissionObjective(type, description));
ObjectiveAdded(player); ObjectiveAdded(player);
foreach (var imo in player.PlayerActor.TraitsImplementing<INotifyObjectivesUpdated>()) foreach (var inou in player.PlayerActor.TraitsImplementing<INotifyObjectivesUpdated>())
imo.OnObjectiveAdded(player, newID); inou.OnObjectiveAdded(player, newID);
return newID; return newID;
} }
@@ -90,22 +90,23 @@ namespace OpenRA.Mods.RA
if (objectiveID >= objectives.Count || objectives[objectiveID].State == ObjectiveState.Completed) if (objectiveID >= objectives.Count || objectives[objectiveID].State == ObjectiveState.Completed)
return; return;
var inous = player.PlayerActor.TraitsImplementing<INotifyObjectivesUpdated>();
objectives[objectiveID].State = ObjectiveState.Completed; objectives[objectiveID].State = ObjectiveState.Completed;
foreach (var inou in inous)
inou.OnObjectiveCompleted(player, objectiveID);
if (objectives[objectiveID].Type == ObjectiveType.Primary) if (objectives[objectiveID].Type == ObjectiveType.Primary)
{ {
var playerWon = objectives.Where(o => o.Type == ObjectiveType.Primary).All(o => o.State == ObjectiveState.Completed); var playerWon = objectives.Where(o => o.Type == ObjectiveType.Primary).All(o => o.State == ObjectiveState.Completed);
foreach (var imo in player.PlayerActor.TraitsImplementing<INotifyObjectivesUpdated>())
{
imo.OnObjectiveCompleted(player, objectiveID);
if (playerWon)
imo.OnPlayerWon(player);
}
if (playerWon) if (playerWon)
{
foreach (var inou in inous)
inou.OnPlayerWon(player);
CheckIfGameIsOver(player); CheckIfGameIsOver(player);
}
} }
} }
@@ -114,22 +115,23 @@ namespace OpenRA.Mods.RA
if (objectiveID >= objectives.Count || objectives[objectiveID].State == ObjectiveState.Failed) if (objectiveID >= objectives.Count || objectives[objectiveID].State == ObjectiveState.Failed)
return; return;
var inous = player.PlayerActor.TraitsImplementing<INotifyObjectivesUpdated>();
objectives[objectiveID].State = ObjectiveState.Failed; objectives[objectiveID].State = ObjectiveState.Failed;
foreach (var inou in inous)
inou.OnObjectiveFailed(player, objectiveID);
if (objectives[objectiveID].Type == ObjectiveType.Primary) if (objectives[objectiveID].Type == ObjectiveType.Primary)
{ {
var playerLost = objectives.Where(o => o.Type == ObjectiveType.Primary).Any(o => o.State == ObjectiveState.Failed); var playerLost = objectives.Where(o => o.Type == ObjectiveType.Primary).Any(o => o.State == ObjectiveState.Failed);
foreach (var imo in player.PlayerActor.TraitsImplementing<INotifyObjectivesUpdated>())
{
imo.OnObjectiveFailed(player, objectiveID);
if (playerLost)
imo.OnPlayerLost(player);
}
if (playerLost) if (playerLost)
{
foreach (var inou in inous)
inou.OnPlayerLost(player);
CheckIfGameIsOver(player); CheckIfGameIsOver(player);
}
} }
} }
@@ -139,14 +141,12 @@ namespace OpenRA.Mods.RA
var gameOver = players.All(p => p.WinState != WinState.Undefined); var gameOver = players.All(p => p.WinState != WinState.Undefined);
if (gameOver) if (gameOver)
{
Game.RunAfterDelay(info.GameOverDelay, () => Game.RunAfterDelay(info.GameOverDelay, () =>
{ {
player.World.EndGame(); player.World.EndGame();
player.World.SetPauseState(true); player.World.SetPauseState(true);
player.World.PauseStateLocked = true; player.World.PauseStateLocked = true;
}); });
}
} }
public void OnPlayerWon(Player player) public void OnPlayerWon(Player player)