From 65f750b860e32f02cdc60a12e6d90d8782ba2bc9 Mon Sep 17 00:00:00 2001
From: TimePath <andrew.hardaker1995@gmail.com>
Date: Tue, 6 Oct 2015 12:28:32 +1100
Subject: [PATCH] Hook: infinite ammo in mutator

---
 qcsrc/common/weapons/weapon/hook.qc   | 10 ++++++----
 qcsrc/server/mutators/mutator_hook.qc |  8 ++------
 2 files changed, 8 insertions(+), 10 deletions(-)

diff --git a/qcsrc/common/weapons/weapon/hook.qc b/qcsrc/common/weapons/weapon/hook.qc
index e279b798a9..bc79a88a31 100644
--- a/qcsrc/common/weapons/weapon/hook.qc
+++ b/qcsrc/common/weapons/weapon/hook.qc
@@ -14,6 +14,7 @@ CLASS(Hook, Weapon)
 /* wepimg    */ ATTRIB(Hook, model2, string, "weaponhook");
 /* refname   */ ATTRIB(Hook, netname, string, "hook");
 /* wepname   */ ATTRIB(Hook, message, string, _("Grappling Hook"));
+	ATTRIB(Hook, ammo_factor, float, 1)
 ENDCLASS(Hook)
 REGISTER_WEAPON(HOOK, NEW(Hook));
 
@@ -181,7 +182,7 @@ void W_Hook_Attack2(Weapon thiswep, entity actor)
 				if(time > actor.hook_refire)
 				if(weapon_prepareattack(thiswep, actor, false, -1))
 				{
-					W_DecreaseAmmo(thiswep, actor, WEP_CVAR_PRI(hook, ammo));
+					W_DecreaseAmmo(thiswep, actor, thiswep.ammo_factor * WEP_CVAR_PRI(hook, ammo));
 					actor.hook_state |= HOOK_FIRING;
 					actor.hook_state |= HOOK_WAITING_FOR_RELEASE;
 					weapon_thinkf(actor, WFRAME_FIRE1, WEP_CVAR_PRI(hook, animtime), w_ready);
@@ -219,7 +220,7 @@ void W_Hook_Attack2(Weapon thiswep, entity actor)
 						actor.hook_state |= HOOK_REMOVING;
 				}
 
-				float hooked_fuel = WEP_CVAR_PRI(hook, hooked_ammo);
+				float hooked_fuel = thiswep.ammo_factor * WEP_CVAR_PRI(hook, hooked_ammo);
 				if(hooked_fuel > 0)
 				{
 					if( time > actor.hook_time_fueldecrease )
@@ -273,14 +274,15 @@ void W_Hook_Attack2(Weapon thiswep, entity actor)
 		{
 			self.hook_state &= ~HOOK_WAITING_FOR_RELEASE;
 		}
-		METHOD(Hook, wr_checkammo1, bool(entity thiswep))
+		METHOD(Hook, wr_checkammo1, bool(Hook thiswep))
 		{
+			if (!thiswep.ammo_factor) return true;
 			if(self.hook)
 				return self.ammo_fuel > 0;
 			else
 				return self.ammo_fuel >= WEP_CVAR_PRI(hook, ammo);
 		}
-		METHOD(Hook, wr_checkammo2, bool(entity thiswep))
+		METHOD(Hook, wr_checkammo2, bool(Hook thiswep))
 		{
 			// infinite ammo for now
 			return true; // self.ammo_cells >= WEP_CVAR_SEC(hook, ammo); // WEAPONTODO: see above
diff --git a/qcsrc/server/mutators/mutator_hook.qc b/qcsrc/server/mutators/mutator_hook.qc
index bfbe02ea69..e43848b308 100644
--- a/qcsrc/server/mutators/mutator_hook.qc
+++ b/qcsrc/server/mutators/mutator_hook.qc
@@ -3,9 +3,11 @@ AUTOCVAR(g_grappling_hook, bool, false, _("let players spawn with the grappling
 REGISTER_MUTATOR(hook, autocvar_g_grappling_hook) {
     MUTATOR_ONADD {
         g_grappling_hook = true;
+        WEP_HOOK.ammo_factor = 0;
     }
     MUTATOR_ONROLLBACK_OR_REMOVE {
         g_grappling_hook = false;
+        WEP_HOOK.ammo_factor = 1;
     }
 }
 
@@ -35,10 +37,4 @@ MUTATOR_HOOKFUNCTION(hook, FilterItem)
     return self.weapon == WEP_HOOK.m_id;
 }
 
-MUTATOR_HOOKFUNCTION(hook, SetStartItems)
-{
-    start_items |= ITEM_JetpackRegen.m_itemid;
-    start_ammo_fuel = max(start_ammo_fuel, cvar("g_balance_fuel_rotstable"));
-    warmup_start_ammo_fuel = max(warmup_start_ammo_fuel, cvar("g_balance_fuel_rotstable"));
-}
 #endif
-- 
2.39.5