2023-03-11 20:41:52 +00:00
|
|
|
/*
|
|
|
|
server/weapons/rocket_launcher.qc
|
|
|
|
|
|
|
|
Core logic for Rocket Launcher/Missile weapons.
|
|
|
|
|
|
|
|
Copyright (C) 2021-2023 NZ:P Team
|
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
|
|
modify it under the terms of the GNU General Public License
|
|
|
|
as published by the Free Software Foundation; either version 2
|
|
|
|
of the License, or (at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
|
|
|
|
See the GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program; if not, write to:
|
|
|
|
|
|
|
|
Free Software Foundation, Inc.
|
|
|
|
59 Temple Place - Suite 330
|
|
|
|
Boston, MA 02111-1307, USA
|
|
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
//
|
|
|
|
// Rocket_Die()
|
|
|
|
// Called to de-spawn the rocket, as it's probably
|
|
|
|
// not going to go anywhere at this point.
|
|
|
|
//
|
|
|
|
void() Rocket_Die =
|
|
|
|
{
|
|
|
|
// Cleanup
|
|
|
|
SUB_Remove ();
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// Rocket_Impact()
|
|
|
|
// When something touches the Missile, check it's validity for
|
|
|
|
// being used to set up the explosion.
|
|
|
|
//
|
|
|
|
void() Rocket_Impact =
|
|
|
|
{
|
|
|
|
if (!other.solid || other.solid == SOLID_TRIGGER)
|
|
|
|
if (other != world)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (other == self.owner)
|
|
|
|
return;
|
|
|
|
|
|
|
|
float rocket_damage_min;
|
|
|
|
float rocket_damage_max;
|
|
|
|
float rocket_damage_radius;
|
|
|
|
|
|
|
|
// Longinus is OP!!!!
|
|
|
|
if (IsPapWeapon(self.weapon)) {
|
|
|
|
rocket_damage_min = 75;
|
|
|
|
rocket_damage_max = 1200;
|
|
|
|
rocket_damage_radius = 400;
|
|
|
|
} else {
|
|
|
|
rocket_damage_min = 75;
|
|
|
|
rocket_damage_max = 600;
|
|
|
|
rocket_damage_radius = 256;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Apply the Damage.
|
|
|
|
DamgageExplode(self, self.owner, rocket_damage_max,
|
|
|
|
rocket_damage_min, rocket_damage_radius);
|
|
|
|
|
|
|
|
// Spawn Effects
|
|
|
|
|
|
|
|
#ifdef FTE
|
|
|
|
|
|
|
|
te_customflash(self.origin, rocket_damage_radius, 300, '1 1 1');
|
|
|
|
|
|
|
|
#endif // FTE
|
|
|
|
|
|
|
|
CallExplosion(self.origin);
|
|
|
|
|
|
|
|
// Clean up!
|
|
|
|
SUB_Remove ();
|
|
|
|
};
|
|
|
|
|
|
|
|
//
|
|
|
|
// W_FireRocket()
|
|
|
|
// Called by weapon_core for the Rocket firetype. Sets up the
|
|
|
|
// missile and prepares it for impact, also sets up timeout.
|
|
|
|
//
|
|
|
|
void() W_FireRocket =
|
|
|
|
{
|
|
|
|
entity rocket = spawn();
|
|
|
|
rocket.owner = self;
|
|
|
|
rocket.movetype = MOVETYPE_FLY;
|
|
|
|
|
|
|
|
rocket.weapon = self.weapon;
|
2023-09-12 03:21:46 +00:00
|
|
|
rocket.classname = "rocket";
|
2023-03-11 20:41:52 +00:00
|
|
|
rocket.solid = SOLID_BBOX;
|
|
|
|
|
|
|
|
// Start initial velocity projection.
|
|
|
|
makevectors(self.v_angle);
|
|
|
|
rocket.velocity = v_forward*2000;
|
|
|
|
rocket.avelocity = '0 0 0';
|
|
|
|
|
|
|
|
// Make sure our angle is always FORWARD
|
|
|
|
rocket.angles = vectoangles(rocket.velocity);
|
|
|
|
rocket.angles_z += (rocket.angles_z + 180 < 360)? 180 : -180;
|
|
|
|
rocket.angles = vectoangles(v_forward);
|
|
|
|
rocket.v_angle = '0 0 200';
|
|
|
|
|
|
|
|
// Prepare for Impact and initiate de-spawn timer.
|
|
|
|
rocket.touch = Rocket_Impact;
|
|
|
|
rocket.think = Rocket_Die;
|
|
|
|
rocket.nextthink = time + 8;
|
|
|
|
|
|
|
|
// Set model.
|
|
|
|
setmodel(rocket, "models/misc/shark.mdl");
|
|
|
|
setsize(rocket, '0 0 0', '0 0 0');
|
|
|
|
|
|
|
|
// final setup!
|
|
|
|
rocket.origin = self.origin + self.view_ofs;
|
|
|
|
rocket.origin += v_forward * 0;
|
|
|
|
setorigin(rocket, rocket.origin);
|
|
|
|
|
|
|
|
self.animend = ReturnWeaponModel;
|
|
|
|
self.callfuncat = 0;
|
|
|
|
}
|