From 01b01aef75b953a34373f47d6fec9783b5e5533e Mon Sep 17 00:00:00 2001
From: MirceaKitsune <sonichedgehog_hyperblast00@yahoo.com>
Date: Sat, 16 Apr 2011 19:59:31 +0300
Subject: [PATCH] Fix bug with fake prey being removed from predator

---
 data/qcsrc/server/cl_client.qc |  4 ++--
 data/qcsrc/server/vore.qc      | 35 +++++++++++++++++-----------------
 2 files changed, 19 insertions(+), 20 deletions(-)

diff --git a/data/qcsrc/server/cl_client.qc b/data/qcsrc/server/cl_client.qc
index b9f654aa..8e3754b9 100644
--- a/data/qcsrc/server/cl_client.qc
+++ b/data/qcsrc/server/cl_client.qc
@@ -829,6 +829,8 @@ void PutClientInServer (void)
 
 		RemoveGrabber(self); // Wazat's Grabber
 
+		Vore_DeadPrey_Detach(self);
+
 		self.classname = "player";
 		self.wasplayer = TRUE;
 		self.iscreature = TRUE;
@@ -923,8 +925,6 @@ void PutClientInServer (void)
 
 		SetCustomizer(self, Client_customizeentityforclient, Client_uncustomizeentityforclient);
 
-		Vore_DeadPrey_Detach(self);
-
 		self.model = "";
 		FixPlayermodel();
 
diff --git a/data/qcsrc/server/vore.qc b/data/qcsrc/server/vore.qc
index 1df5d2f4..780a28c1 100644
--- a/data/qcsrc/server/vore.qc
+++ b/data/qcsrc/server/vore.qc
@@ -298,22 +298,24 @@ void Vore_DeadPrey_Detach(entity e)
 		return;
 
 	e.fakepredator = world;
+	e.fakeprey = FALSE;
 	e.aiment = world;
-
-	if(!e.deadflag)
-		e.fakeprey = FALSE;
+	e.movetype = MOVETYPE_TOSS;
 }
 
-void Vore_PreyRelease(entity e)
+void Vore_PreyRelease(entity e, float pred_disconnect)
 {
 	// if the keepdeadprey feature is on, don't spit a dead prey's carcass out
 	if(e.health <= 0 && cvar("g_vore_keepdeadprey"))
 	{
-		Vore_DeadPrey_Configure(e);
-
 		// if keepdeadprey is enabled and the predator disconnected, detach the dead prey
-		if(e.fakepredator.classname != "player")
-			Vore_DeadPrey_Detach(e);
+		if(pred_disconnect)
+		{
+			if(e.fakeprey)
+				Vore_DeadPrey_Detach(e);
+		}
+		else
+			Vore_DeadPrey_Configure(e);
 	}
 	else
 		Vore_Regurgitate(e);
@@ -325,19 +327,16 @@ void Vore_Disconnect()
 
 	// prey disconnects or goes spectating while inside someone's belly
 	if(self.predator.classname == "player")
-		Vore_PreyRelease(self);
+		Vore_PreyRelease(self, TRUE);
 
 	// pred disconnects or goes spectating with players in their belly
-	else if(self.stomach_load > 0)
+	entity head;
+	FOR_EACH_PLAYER(head)
 	{
-		entity head;
-		FOR_EACH_PLAYER(head)
-		{
-			if(head.predator == self)
-				Vore_PreyRelease(head);
-		}
-		Vore_GurgleSound(); // stop the gurgling sound
+		if(head.predator == self || head.fakepredator == self)
+			Vore_PreyRelease(head, TRUE);
 	}
+	Vore_GurgleSound(); // stop the gurgling sound
 
 	self.stomach_load = self.gravity = 0; // prevents a bug
 }
@@ -617,7 +616,7 @@ void Vore()
 
 	if(self.deadflag)
 	{
-		Vore_PreyRelease(self);
+		Vore_PreyRelease(self, FALSE);
 		return;
 	}
 
-- 
2.39.5