From 0fbd239680762bef6d72c08e90e728e1165c7e32 Mon Sep 17 00:00:00 2001
From: Allanis <allanis@saracraft.net>
Date: Tue, 9 Apr 2013 01:20:22 +0100
Subject: [PATCH] [Fix] Can't grab a unique mission if it is already running.

---
 src/mission.c | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/src/mission.c b/src/mission.c
index 19b7623..45c15df 100644
--- a/src/mission.c
+++ b/src/mission.c
@@ -39,6 +39,7 @@ extern int misn_run(Mission* misn, char* func);
 // Static.
 static int  mission_init(Mission* mission, MissionData* misn);
 static void mission_freeData(MissionData* mission);
+static int mission_alreadyRunning(MissionData* misn);
 static int  mission_matchFaction(MissionData* misn, int faction);
 static int mission_location(char* loc);
 static MissionData* mission_parse(const xmlNodePtr parent);
@@ -101,6 +102,16 @@ void mission_accept(Mission* mission) {
   misn_run(mission, "accept");
 }
 
+// Check to see if mission is already running.
+static int mission_alreadyRunning(MissionData* misn) {
+  int i;
+  for (i = 0; i < MISSION_MAX; i++)
+    if(player_missions[i].data == misn)
+      return 1;
+
+  return 0;
+}
+
 // Runs bar missions, all lua side and one-shot.
 void missions_bar(int faction, char* planet, char* system) {
   MissionData* misn;
@@ -115,8 +126,10 @@ void missions_bar(int faction, char* planet, char* system) {
          (misn->avail.system && (strcmp(misn->avail.system, system)==0)) ||
          mission_matchFaction(misn, faction))) {
 
-      if(player_missionAlreadyDone(i)) continue; // Already done the mission.
-      
+      if(mis_isFlag(misn, MISSION_UNIQUE) && // Mission done or running.
+          (player_missionAlreadyDone(i) ||
+           mission_alreadyRunning(misn))) continue;
+
       chance = (double)(misn->avail.chance % 100)/100.;
 
       if(RNGF() < chance) {