From 54a6c3c07f655e8891e10a656c75bef93d6c8f69 Mon Sep 17 00:00:00 2001
From: Allanis <allanis.saracraft.studios@gmail.com>
Date: Sun, 19 Nov 2017 15:01:32 +0000
Subject: [PATCH] [Add] Use new body death code with pre-hyperspace clearout.

---
 src/space.cpp             | 27 +++++++++++++--------------
 src/space.h               |  3 +--
 src/static_rigid_body.cpp |  2 +-
 3 files changed, 15 insertions(+), 17 deletions(-)

diff --git a/src/space.cpp b/src/space.cpp
index 72a0ffe..44c1720 100644
--- a/src/space.cpp
+++ b/src/space.cpp
@@ -28,16 +28,17 @@ void Space::Init(void) {
 void Space::Clear(void) {
   for(std::list<Body*>::iterator i = bodies.begin(); i != bodies.end(); ++i) {
     (*i)->SetFrame(NULL);
-    if((*i) != (Body*)L3D::player) delete *i;
+    if((*i) != (Body*)L3D::player) {
+      KillBody(*i);
+    }
   }
-  bodies.clear();
-  /* Player now removed also, but not freed. */
+  PruneCorpses();
+
   for(std::list<Frame*>::iterator i = rootFrame->m_children.begin();
       i != rootFrame->m_children.end(); ++i) delete *i;
   rootFrame->m_children.clear();
 
   L3D::player->SetFrame(rootFrame);
-  bodies.push_back(L3D::player);
 }
 
 void Space::GenBody(StarSystem* system, StarSystem::SBody* sbody, Frame* f) {
@@ -218,19 +219,17 @@ void Space::TimeStep(float step) {
   for(bodiesIter_t i = bodies.begin(); i != bodies.end(); ++i) {
     (*i)->TimeStepUpdate(step);
   }
-  /* Prune dead bodies. */
-  for(bodiesIter_t i = corpses.begin(); i != corpses.end(); i++) {
-    ProcessCorpse(*i);
-  }
-  corpses.clear();
+  PruneCorpses();
 }
 
-void Space::ProcessCorpse(Body* const b) {
-  for(bodiesIter_t i = bodies.begin(); i != bodies.end(); ++i) {
-    (*i)->NotifyDeath(b);
+void Space::PruneCorpses(void) {
+  for(bodiesIter_t corpse = corpses.begin(); corpse != corpses.end(); ++corpse) {
+    for(bodiesIter_t i = bodies.begin(); i != bodies.end(); i++)
+      (*i)->NotifyDeath(*corpse);
+    bodies.remove(*corpse);
+    delete *corpse;
   }
-  bodies.remove(b);
-  delete b;
+  corpses.clear();
 }
 
 struct body_zsort_t {
diff --git a/src/space.h b/src/space.h
index 7de8dde..ebf33f3 100644
--- a/src/space.h
+++ b/src/space.h
@@ -25,8 +25,7 @@ public:
 private:
   static void UpdateFramesOfReference(void);
   static void CollideFrame(Frame* f);
-  static void ProcessCorpse(Body* const b);
-
+  static void PruneCorpses(void);
   static Frame* rootFrame;
   //static std::list<Frame*> rootFrames;
   static std::list<Body*> corpses;
diff --git a/src/static_rigid_body.cpp b/src/static_rigid_body.cpp
index d15010e..0992506 100644
--- a/src/static_rigid_body.cpp
+++ b/src/static_rigid_body.cpp
@@ -19,7 +19,7 @@ StaticRigidBody::~StaticRigidBody(void) {
     free(sbreCollMesh->pFlag);
     free(sbreCollMesh);
   }
-  GetFrame()->RemoveGeom(m_geom);
+  SetFrame(0); /* Will remove geom from frame if necessary. */
   dGeomDestroy(m_geom);
 }