#ifdef REGISTER_WEAPON REGISTER_WEAPON(GRABBER, w_grabber, IT_FUEL, 0, WEP_FLAG_CANCLIMB | WEP_TYPE_SPLASH, 0, "grabber", "grabber", "Grabber"); #else .float dmg; .float dmg_edge; .float dmg_radius; .float dmg_force; .float grabber_refire; .float grabber_time_grabbered; .float grabber_time_fueldecrease; void W_Grabber_Touch2 (void) { PROJECTILE_TOUCH; self.use(); } void W_Grabber_Attack2() { W_SetupShot (self, TRUE, 0, "weapons/grabber_altfire.wav", cvar("g_balance_grabber_secondary_damage")); WarpZone_traceline_antilag(self, w_shotorg, w_shotorg + w_shotdir * cvar("g_balance_grabber_secondary_radius"), FALSE, self, ANTILAG_LATENCY(self)); pointparticles(particleeffectnum("grabber_melee"), w_shotorg + w_shotdir * cvar("g_balance_grabber_secondary_radius"), '0 0 0', 1); if (trace_fraction < 1) Damage(trace_ent, self, self, cvar("g_balance_grabber_secondary_damage"), WEP_GRABBER | HITTYPE_SECONDARY, trace_endpos, cvar("g_balance_grabber_secondary_force") * w_shotdir); if not(self.items & IT_UNLIMITED_WEAPON_AMMO) self.ammo_fuel = self.ammo_fuel - cvar("g_balance_grabber_secondary_ammo"); } void spawnfunc_weapon_grabber (void) { weapon_defaultspawnfunc(WEP_GRABBER); } float w_grabber(float req) { if(self.eater.classname == "player") // we can't use weapons while in the stomach { self.grabber_state |= GRABBER_REMOVING; return FALSE; } float grabbered_time_max, grabbered_fuel; if (req == WR_AIM) { // ... sorry ... } else if (req == WR_THINK) { if (self.BUTTON_ATCK || (!(self.items & IT_JETPACK) && self.BUTTON_GRABBER)) { if(time < self.weapon_delay) return FALSE; if(!self.grabber) if not(self.grabber_state & GRABBER_WAITING_FOR_RELEASE) if not(self.grabber_state & GRABBER_FIRING) if (time > self.grabber_refire) if (weapon_prepareattack(0, -1)) { if not(self.items & IT_UNLIMITED_WEAPON_AMMO) self.ammo_fuel = self.ammo_fuel - cvar("g_balance_grabber_primary_ammo"); self.grabber_state |= GRABBER_FIRING; weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_grabber_primary_animtime"), w_ready); } } if (self.BUTTON_ATCK2) { if (weapon_prepareattack(1, cvar("g_balance_grabber_secondary_refire"))) { W_Grabber_Attack2(); weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_grabber_secondary_animtime"), w_ready); } } if(self.grabber) { // if grabbered, no melee attacks, and increase the timer self.grabber_refire = max(self.grabber_refire, time + cvar("g_balance_grabber_primary_refire")); // grabber also inhibits health regeneration, but only for 1 second if not(self.items & IT_UNLIMITED_WEAPON_AMMO) self.pauseregen_finished = max(self.pauseregen_finished, time + cvar("g_balance_pause_fuel_regen")); } if(self.grabber && self.grabber.state == 1) { grabbered_time_max = cvar("g_balance_grabber_primary_grabbered_time_max"); if (grabbered_time_max > 0) { if ( time > self.grabber_time_grabbered + grabbered_time_max ) self.grabber_state |= GRABBER_REMOVING; } grabbered_fuel = cvar("g_balance_grabber_primary_grabbered_fuel"); if (grabbered_fuel > 0) { if ( time > self.grabber_time_fueldecrease ) { if not(self.items & IT_UNLIMITED_WEAPON_AMMO) { if ( self.ammo_fuel >= (time - self.grabber_time_fueldecrease) * grabbered_fuel ) { self.ammo_fuel -= (time - self.grabber_time_fueldecrease) * grabbered_fuel; self.grabber_time_fueldecrease = time; // decrease next frame again } else { self.ammo_fuel = 0; self.grabber_state |= GRABBER_REMOVING; W_SwitchWeapon_Force(self, w_getbestweapon(self)); } } } } } else { self.grabber_time_grabbered = time; self.grabber_time_fueldecrease = time + cvar("g_balance_grabber_primary_grabbered_time_free"); } if (self.BUTTON_CROUCH) { self.grabber_state &~= GRABBER_PULLING; if (self.BUTTON_ATCK || (!(self.items & IT_JETPACK) && self.BUTTON_GRABBER)) self.grabber_state &~= GRABBER_RELEASING; else self.grabber_state |= GRABBER_RELEASING; } else { self.grabber_state |= GRABBER_PULLING; self.grabber_state &~= GRABBER_RELEASING; if (self.BUTTON_ATCK || (!(self.items & IT_JETPACK) && self.BUTTON_GRABBER)) { // already fired if(self.grabber) self.grabber_state |= GRABBER_WAITING_FOR_RELEASE; } else { self.grabber_state |= GRABBER_REMOVING; self.grabber_state &~= GRABBER_WAITING_FOR_RELEASE; } } } else if (req == WR_PRECACHE) { precache_model ("models/weapons/g_grabber.md3"); precache_model ("models/weapons/v_grabber.md3"); precache_model ("models/weapons/h_grabber.dpm"); precache_sound ("weapons/grabber_impact.wav"); // done by g_grabber.qc precache_sound ("weapons/grabber_fire.wav"); precache_sound ("weapons/grabber_altfire.wav"); } else if (req == WR_SETUP) { weapon_setup(WEP_GRABBER); self.grabber_state &~= GRABBER_WAITING_FOR_RELEASE; } else if (req == WR_CHECKAMMO1) { if(self.grabber) return self.ammo_fuel > 0; else return self.ammo_fuel >= cvar("g_balance_grabber_primary_ammo"); } else if (req == WR_CHECKAMMO2) { return self.ammo_fuel >= cvar("g_balance_grabber_secondary_ammo"); } else if (req == WR_SUICIDEMESSAGE) w_deathtypestring = "did the impossible"; else if (req == WR_KILLMESSAGE) w_deathtypestring = "has run into #'s paws"; else if (req == WR_RESETPLAYER) { self.grabber_refire = time; } return TRUE; }; #endif