From 1fc44c8dd3145e1a1caead9bab000dbbaea3cdbe Mon Sep 17 00:00:00 2001
From: Mario <mario.mario@y7mail.com>
Date: Thu, 20 Mar 2014 12:25:17 +1100
Subject: [PATCH] Clean up monster mutator hooks

---
 qcsrc/server/mutators/mutator_overkill.qc | 72 ++++++++++++++---------
 1 file changed, 45 insertions(+), 27 deletions(-)

diff --git a/qcsrc/server/mutators/mutator_overkill.qc b/qcsrc/server/mutators/mutator_overkill.qc
index 89888317b3..3c8154b115 100644
--- a/qcsrc/server/mutators/mutator_overkill.qc
+++ b/qcsrc/server/mutators/mutator_overkill.qc
@@ -7,7 +7,7 @@ void ok_DecreaseCharge(entity ent, float wep)
 	if(wepent.weapon == 0)
 		return; // dummy
 
-	ent.ammo_charge[wep] -= cvar(sprintf("g_overkill_ammo_decharge_%s", wepent.netname));
+	ent.ammo_charge[wep] -= max(0, cvar(sprintf("g_overkill_ammo_decharge_%s", wepent.netname)));
 }
 
 void ok_IncreaseCharge(entity ent, float wep)
@@ -62,9 +62,11 @@ MUTATOR_HOOKFUNCTION(ok_PlayerDamage_Calculate)
 		frag_damage = 0;
 
 		if(frag_attacker != frag_target)
+		if(frag_target.health > 0)
+		if(frag_target.freezetag_frozen == 0)
+		if(frag_target.deadflag == DEAD_NO)
 		{
-			if(frag_target.health >= 1 && !frag_target.freezetag_frozen && frag_target.deadflag == DEAD_NO)
-				Send_Notification(NOTIF_ONE, frag_attacker, MSG_CENTER, CENTER_SECONDARY_NODAMAGE);
+			Send_Notification(NOTIF_ONE, frag_attacker, MSG_CENTER, CENTER_SECONDARY_NODAMAGE);
 			frag_force = '0 0 0';
 		}
 	}
@@ -76,9 +78,6 @@ MUTATOR_HOOKFUNCTION(ok_PlayerDies)
 {
 	entity oldself = self;
 
-	if(other.flags & FL_MONSTER)
-		other.monster_loot = func_null; // this hook is shared with monsters
-
 	self.ok_lastwep = self.weapon;
 	self.ok_deathloc = self.origin;
 	self = spawn();
@@ -98,6 +97,12 @@ MUTATOR_HOOKFUNCTION(ok_PlayerDies)
 	return FALSE;
 }
 
+MUTATOR_HOOKFUNCTION(ok_MonsterSpawn)
+{
+	self.candrop = FALSE; // no default item drops
+	return FALSE;
+}
+
 MUTATOR_HOOKFUNCTION(ok_ForbidThrowCurrentWeapon)
 {
 	return TRUE;
@@ -171,28 +176,40 @@ MUTATOR_HOOKFUNCTION(ok_OnEntityPreSpawn)
 {
 	if(autocvar_g_powerups)
 	if(autocvar_g_overkill_powerups_replace)
-	if(self.classname == "item_strength")
 	{
-		entity wep = spawn();
-		setorigin(wep, self.origin);
-		wep.ok_item = TRUE;
-		wep.think = start_hmg;
-		wep.nextthink = time + 0.1;
-		wep.noalign = self.noalign;
-		return TRUE;
-	}
+		if(self.classname == "item_strength")
+		{
+			entity wep = spawn();
+			setorigin(wep, self.origin);
+			setmodel(wep, "models/weapons/g_ok_hmg.md3");
+			wep.classname = "weapon_hmg";
+			wep.ok_item = TRUE;
+			wep.noalign = self.noalign;
+			wep.cnt = self.cnt;
+			wep.team = self.team;
+			wep.respawntime = autocvar_g_overkill_superguns_respawn_time;
+			wep.pickup_anyway = TRUE;
+			wep.think = spawnfunc_weapon_hmg;
+			wep.nextthink = time + 0.1;
+			return TRUE;
+		}
 
-	if(autocvar_g_powerups)
-	if(autocvar_g_overkill_powerups_replace)
-	if(self.classname == "item_invincible")
-	{
-		entity wep = spawn();
-		setorigin(wep, self.origin);
-		wep.ok_item = TRUE;
-		wep.think = start_rpc;
-		wep.nextthink = time + 0.1;
-		wep.noalign = self.noalign;
-		return TRUE;
+		if(self.classname == "item_invincible")
+		{
+			entity wep = spawn();
+			setorigin(wep, self.origin);
+			setmodel(wep, "models/weapons/g_ok_rl.md3");
+			wep.classname = "weapon_rpc";
+			wep.ok_item = TRUE;
+			wep.noalign = self.noalign;
+			wep.cnt = self.cnt;
+			wep.team = self.team;
+			wep.respawntime = autocvar_g_overkill_superguns_respawn_time;
+			wep.pickup_anyway = TRUE;
+			wep.think = spawnfunc_weapon_rpc;
+			wep.nextthink = time + 0.1;
+			return TRUE;
+		}
 	}
 
 	return FALSE;
@@ -314,9 +331,10 @@ MUTATOR_DEFINITION(mutator_overkill)
 	MUTATOR_HOOK(PlayerSpawn, ok_PlayerSpawn, CBC_ORDER_ANY);
 	MUTATOR_HOOK(PlayerDamage_Calculate, ok_PlayerDamage_Calculate, CBC_ORDER_LAST);
 	MUTATOR_HOOK(PlayerDies, ok_PlayerDies, CBC_ORDER_ANY);
+	MUTATOR_HOOK(MonsterDies, ok_PlayerDies, CBC_ORDER_ANY);
+	MUTATOR_HOOK(MonsterSpawn, ok_MonsterSpawn, CBC_ORDER_ANY);
 	MUTATOR_HOOK(OnEntityPreSpawn, ok_OnEntityPreSpawn, CBC_ORDER_ANY);
 	MUTATOR_HOOK(FilterItem, ok_ItemRemove, CBC_ORDER_ANY);
-	MUTATOR_HOOK(MonsterDropItem, ok_PlayerDies, CBC_ORDER_ANY);
 	MUTATOR_HOOK(SpectateCopy, ok_SpectateCopy, CBC_ORDER_ANY);
 	MUTATOR_HOOK(SetStartItems, ok_StartItems, CBC_ORDER_ANY);
 	MUTATOR_HOOK(BuildMutatorsString, ok_BuildMutatorsString, CBC_ORDER_ANY);
-- 
2.39.5