/*
	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);
	CallExplosion(self.origin);
	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;
	rocket.classname = "rocket";
	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;
}