game-source/klik/weapons/w_rocket_launcher.qc
Bill Currie 88c055ea3c <zinx> taniwha: FWIW, the code is officially donated to quakeforge :)
<taniwha> zinx: thanks :)

zinx' klik mod :)
2003-10-24 21:43:32 +00:00

125 lines
2.9 KiB
C++

#include "common.qh"
#include "weapon.qh"
#include "equip.qh"
#include "damage.qh"
#include "misc.qh"
#include "effect.qh"
#define STR_EQUIPID_ROCKET_LAUNCHER "Rocket Launcher"
void() _deathmsg_rocket_launcher = {
local string def_nname, att_nname;
local float r;
def_nname = name(self);
att_nname = name(self.dmg_attacker);
if (self == self.dmg_attacker) {
r = random()*2;
if (r < 1) bprint(PRINT_DEATH, def_nname, " uses his melee rocket launcher.\n");
else bprint(PRINT_DEATH, def_nname, " doesn't know how to use a rocket launcher.\n");
} else {
r = random()*2;
if (r < 1) bprint(PRINT_DEATH, def_nname, " rides ", att_nname, "'s rocket.\n");
else bprint(PRINT_DEATH, att_nname, "'s rocket got friendly with ", def_nname, ".\n");
}
};
void() _rocket_touch =
{
local float damg, contents;
contents = pointcontents(self.origin);
if (contents == CONTENT_SKY) {
remove(self);
return;
}
if (contents >= CONTENT_LAVA && contents <= CONTENT_WATER) {
self.dmg *= 0.9;
self.lip *= 0.8;
self.mass *= 1.5;
self.speed *= 0.8;
}
damg = self.dmg - 0.2*random()*self.dmg;
damage(other, self.goalentity, self, damg, _deathmsg_rocket_launcher);
self.velocity = '0 0 0';
damage_radius(other, self.goalentity, self, _deathmsg_rocket_launcher);
effect_explosion(self.origin);
safe_remove(self);
};
void() _w_rocket_launcher_think = {
self.weaponframe++;
if (self.weaponframe < 1 || self.weaponframe > 6) {
self.w_think = NOTHING_function;
self.weaponframe = 0;
}
};
void() _w_rocket_launcher_fire = {
local vector dir;
local entity missile;
if (!util_weapon_use_ammo(ammo_rockets, 1))
return;
sound(self, CHAN_WEAPON, "weapons/sgun1.wav", 1, ATTN_NORM);
makevectors(self.v_angle);
dir = aim(self, 1000);
missile = spawn_missile("ROCKET", "progs/missile.mdl", shootorigin(self), dir, 1000);
missile.dmg = 120;
missile.mass = missile.dmg * 8;
missile.lip = missile.dmg;
missile.touch = _rocket_touch;
damage_attack(missile);
self.weaponframe = 1;
self.w_think = _w_rocket_launcher_think;
self.mdl_func(MDL_FUNC_FIRE, 0);
effect_smallkick(self);
self.attack_finished = time + 0.8;
};
/* WEAPON 7 rocket_launcher */
float(float action)
w_rocket_launcher = {
if (action == WEAPON_AMMO) {
self.items |= IT_ROCKETS;
return self.ammo_rockets;
} else if (action == WEAPON_WEIGHT) {
return 55;
} else if (action == WEAPON_SELECTABLE) {
if (!equip_query(self, EQUIPID_ROCKET_LAUNCHER))
return 0;
if (self.ammo_rockets >= 1)
return 1;
return -1;
} else if (action == WEAPON_SELECT) {
self.weaponmodel = "progs/v_rock2.mdl";
self.weaponframe = 0;
self.mdl_mod = (self.mdl_mod & ~MDL_MOD_WEP_MASK) | MDL_MOD_WEP_ROCKET_LAUNCHER;
weaponprint(STR_EQUIPID_ROCKET_LAUNCHER);
} else if (action == WEAPON_FIRE) {
_w_rocket_launcher_fire();
} else if (action == WEAPON_INIT) {
precache_model("progs/v_rock2.mdl");
precache_model("progs/missile.mdl");
precache_sound("weapons/sgun1.wav");
}
return 0;
};