From b4bb214f79b20f5e6cb88658778df961a4607bf8 Mon Sep 17 00:00:00 2001
From: Allanis <allanis@saracraft.net>
Date: Fri, 14 Mar 2014 23:59:14 +0000
Subject: [PATCH] [Add] Mission cargo should get jettisoned off the ship once
 you die and explode into oblivion.

---
 dat/missions/cargo.lua | 16 ++++++++++++----
 src/misn_lua.c         | 32 +++++++++++++++++++++++++++++++-
 src/mission.c          |  2 +-
 src/pilot.c            |  7 ++++++-
 src/pilot.h            |  2 +-
 5 files changed, 51 insertions(+), 8 deletions(-)

diff --git a/dat/missions/cargo.lua b/dat/missions/cargo.lua
index 798511f..e342ce6 100644
--- a/dat/missions/cargo.lua
+++ b/dat/missions/cargo.lua
@@ -186,11 +186,19 @@ end
 -- Time hook.
 function timeup()
   if time.get() > misn_time then
-    player.msg(msg_msg[4])
-    misn.finish(false)
-  end
-  misn.setDesc(string.format( misn_desc[11], planet:name(), system:name(),
+    misn.timerStart("failed", 2000)
+  else
+    misn.setDesc(string.format( misn_desc[11], planet:name(), system:name(),
       carg_mass, carg_type,
       time.str(misn_time), time.str(misn_time-time.get())))
+  end
+end
+
+function failed()
+  player.msg(msg_msg[4])
+  if misn_type ~= "People" then
+    player.jetCargo(carg_id)
+  end
+  misn.finish(false)
 end
 
diff --git a/src/misn_lua.c b/src/misn_lua.c
index b54180e..07259ff 100644
--- a/src/misn_lua.c
+++ b/src/misn_lua.c
@@ -110,6 +110,7 @@ static int player_shipname(lua_State* L);
 static int player_freeSpace(lua_State* L);
 static int player_addCargo(lua_State* L);
 static int player_rmCargo(lua_State* L);
+static int player_jetCargo(lua_State* L);
 static int player_pay(lua_State* L);
 static int player_msg(lua_State* L);
 static int player_modFaction(lua_State* L);
@@ -124,6 +125,7 @@ static const luaL_reg player_methods[] = {
   { "freeCargo",      player_freeSpace      },
   { "addCargo",       player_addCargo       },
   { "rmCargo",        player_rmCargo        },
+  { "jetCargo",       player_jetCargo       },
   { "pay",            player_pay            },
   { "msg",            player_msg            },
   { "modFaction",     player_modFaction     },
@@ -751,7 +753,35 @@ static int player_rmCargo(lua_State* L) {
   else LLUA_INVALID_PARAMETER();
 
   /* First try to remove the cargo from player. */
-  if(pilot_rmMissionCargo(player, id) != 0) {
+  if(pilot_rmMissionCargo(player, id, 0) != 0) {
+    lua_pushboolean(L, 0);
+    return 1;
+  }
+
+  /* Now unlink the mission cargo if it was successful. */
+  ret = mission_unlinkCargo(cur_mission, id);
+
+  lua_pushboolean(L, !ret);
+  return 1;
+}
+
+/**
+ * @brief jetCargo(number cargoid)
+ *
+ * Jettison the mission cargo.
+ *    @param cargoid ID of the cargo to jettison.
+ */
+static int player_jetCargo(lua_State* L) {
+  int ret;
+  unsigned int id;
+
+  LLUA_MIN_ARGS(1);
+
+  if(lua_isnumber(L, 1)) id = (unsigned int)lua_tonumber(L, 1);
+  else LLUA_INVALID_PARAMETER();
+
+  /* First try to remove the cargo from player. */
+  if(pilot_rmMissionCargo(player, id, 0) != 0) {
     lua_pushboolean(L, 0);
     return 1;
   }
diff --git a/src/mission.c b/src/mission.c
index 431d784..de8dd83 100644
--- a/src/mission.c
+++ b/src/mission.c
@@ -393,7 +393,7 @@ void mission_cleanup(Mission* misn) {
   if(misn->cargo != NULL) {
     for(i = 0; i < misn->ncargo; i++) { /* Must unlink all the cargo. */
       if(player != NULL) /* Only remove if player exists. */
-        pilot_rmMissionCargo(player, misn->cargo[i]);
+        pilot_rmMissionCargo(player, misn->cargo[i], 0);
       mission_unlinkCargo(misn, misn->cargo[i]);
     }
     free(misn->cargo);
diff --git a/src/pilot.c b/src/pilot.c
index 1a0c348..9142011 100644
--- a/src/pilot.c
+++ b/src/pilot.c
@@ -1243,9 +1243,10 @@ unsigned int pilot_addMissionCargo(Pilot* pilot, Commodity* cargo, int quantity)
  * @brief Remove special mission cargo based on id.
  *    @param pilot Pilot to remove cargo from.
  *    @param cargo_id ID of the cargo to remove.
+ *    @param jettison Should we jettison the cargo?
  *    @return 0 on success (cargo removed).
  */
-int pilot_rmMissionCargo(Pilot* pilot, unsigned int cargo_id) {
+int pilot_rmMissionCargo(Pilot* pilot, unsigned int cargo_id, int jettison) {
   int i;
 
   /* Check if pilot has it. */
@@ -1256,6 +1257,10 @@ int pilot_rmMissionCargo(Pilot* pilot, unsigned int cargo_id) {
   if(i >= pilot->ncommodities)
     return 1; /* Pilot doesn't have it. */
 
+  if(jettison)
+    commodity_Jettison(pilot->id, pilot->commodities[i].commodity,
+        pilot->commodities[i].quantity);
+
   /* Remove cargo. */
   pilot->cargo_free += pilot->commodities[i].quantity;
   pilot->solid->mass -= pilot->commodities[i].quantity;
diff --git a/src/pilot.h b/src/pilot.h
index cd5ec99..e259947 100644
--- a/src/pilot.h
+++ b/src/pilot.h
@@ -263,7 +263,7 @@ int pilot_rmCargo(Pilot* pilot, Commodity* cargo, int quantity);
 int pilot_moveCargo(Pilot* dest, Pilot* src);
 /* Mission cargo - Not to be confused with normal cargo. */
 unsigned int pilot_addMissionCargo(Pilot* pilot, Commodity* cargo, int quantity);
-int pilot_rmMissionCargo(Pilot* pilot, unsigned int cargo_id);
+int pilot_rmMissionCargo(Pilot* pilot, unsigned int cargo_id, int jettison);
 
 
 /* Creation. */