mirror of
https://git.code.sf.net/p/quake/game-source
synced 2024-11-10 06:31:52 +00:00
399 lines
9.4 KiB
C++
399 lines
9.4 KiB
C++
#include "common.qh"
|
|
#include "effect.qh"
|
|
|
|
#include "misc.qh"
|
|
|
|
#include "mdl.qh"
|
|
#include "mdl_player.qh"
|
|
|
|
// running
|
|
$frame axrun1 axrun2 axrun3 axrun4 axrun5 axrun6
|
|
|
|
$frame rockrun1 rockrun2 rockrun3 rockrun4 rockrun5 rockrun6
|
|
|
|
|
|
// standing
|
|
$frame stand1 stand2 stand3 stand4 stand5
|
|
|
|
$frame axstnd1 axstnd2 axstnd3 axstnd4 axstnd5 axstnd6
|
|
$frame axstnd7 axstnd8 axstnd9 axstnd10 axstnd11 axstnd12
|
|
|
|
|
|
// pain
|
|
$frame axpain1 axpain2 axpain3 axpain4 axpain5 axpain6
|
|
|
|
$frame pain1 pain2 pain3 pain4 pain5 pain6
|
|
|
|
|
|
// death
|
|
$frame axdeth1 axdeth2 axdeth3 axdeth4 axdeth5 axdeth6
|
|
$frame axdeth7 axdeth8 axdeth9
|
|
|
|
$frame deatha1 deatha2 deatha3 deatha4 deatha5 deatha6 deatha7 deatha8
|
|
$frame deatha9 deatha10 deatha11
|
|
|
|
$frame deathb1 deathb2 deathb3 deathb4 deathb5 deathb6 deathb7 deathb8
|
|
$frame deathb9
|
|
|
|
$frame deathc1 deathc2 deathc3 deathc4 deathc5 deathc6 deathc7 deathc8
|
|
$frame deathc9 deathc10 deathc11 deathc12 deathc13 deathc14 deathc15
|
|
|
|
$frame deathd1 deathd2 deathd3 deathd4 deathd5 deathd6 deathd7
|
|
$frame deathd8 deathd9
|
|
|
|
$frame deathe1 deathe2 deathe3 deathe4 deathe5 deathe6 deathe7
|
|
$frame deathe8 deathe9
|
|
|
|
|
|
// attacks
|
|
$frame nailatt1 nailatt2
|
|
|
|
$frame light1 light2
|
|
|
|
$frame rockatt1 rockatt2 rockatt3 rockatt4 rockatt5 rockatt6
|
|
|
|
$frame shotatt1 shotatt2 shotatt3 shotatt4 shotatt5 shotatt6
|
|
|
|
$frame axatt1 axatt2 axatt3 axatt4 axatt5 axatt6
|
|
|
|
$frame axattb1 axattb2 axattb3 axattb4 axattb5 axattb6
|
|
|
|
$frame axattc1 axattc2 axattc3 axattc4 axattc5 axattc6
|
|
|
|
$frame axattd1 axattd2 axattd3 axattd4 axattd5 axattd6
|
|
|
|
void() _mdl_player_axe_walk = {
|
|
self.frame++;
|
|
if (self.frame < $axrun1 || self.frame > $axrun6)
|
|
self.frame = $axrun1;
|
|
};
|
|
|
|
void() _mdl_player_gun_walk = {
|
|
self.frame++;
|
|
if (self.frame < $rockrun1 || self.frame > $rockrun6)
|
|
self.frame = $rockrun1;
|
|
};
|
|
|
|
void() _mdl_player_axe_idle = {
|
|
self.frame++;
|
|
if (self.frame < $axstnd1 || self.frame > $axstnd12)
|
|
self.frame = $axstnd1;
|
|
};
|
|
|
|
void() _mdl_player_gun_idle = {
|
|
self.frame++;
|
|
if (self.frame < $stand1 || self.frame > $stand5)
|
|
self.frame = $stand1;
|
|
};
|
|
|
|
void() mdl_player_idle =
|
|
{
|
|
self.mdl_think = mdl_player_idle;
|
|
|
|
if ((self.flags & FL_ONGROUND) && (self.velocity_x || self.velocity_y)) {
|
|
if ((self.mdl_mod&MDL_MOD_WEP_MASK) == MDL_MOD_WEP_AXE)
|
|
_mdl_player_axe_walk();
|
|
else _mdl_player_gun_walk();
|
|
} else {
|
|
if ((self.mdl_mod&MDL_MOD_WEP_MASK) == MDL_MOD_WEP_AXE)
|
|
_mdl_player_axe_idle();
|
|
else _mdl_player_gun_idle();
|
|
}
|
|
|
|
self.mdl_thought = TRUE;
|
|
};
|
|
|
|
void() _mdl_player_axe_pain = {
|
|
self.frame++;
|
|
if (self.frame < $axpain1 || self.frame > $axpain6)
|
|
mdl_player_idle();
|
|
};
|
|
|
|
void() _mdl_player_gun_pain = {
|
|
self.frame++;
|
|
if (self.frame < $pain1 || self.frame > $pain6)
|
|
mdl_player_idle();
|
|
};
|
|
|
|
void(float d) mdl_player_pain = {
|
|
local vector impact_dir;
|
|
|
|
if (time < self.mdl_var)
|
|
return;
|
|
self.mdl_var = time + 0.2;
|
|
|
|
impact_dir = '0 0 0' - self.dmg_inflictor.velocity;
|
|
impact_dir = normalize(impact_dir);
|
|
effect_blood(self.origin, impact_dir, d);
|
|
|
|
if (self.mdl_think != mdl_player_idle)
|
|
return;
|
|
|
|
if ((self.mdl_mod&MDL_MOD_WEP_MASK) == MDL_MOD_WEP_AXE) {
|
|
self.frame = $axpain1;
|
|
self.mdl_think = _mdl_player_axe_pain;
|
|
} else {
|
|
self.frame = $pain1;
|
|
self.mdl_think = _mdl_player_gun_pain;
|
|
}
|
|
|
|
self.mdl_thought = TRUE;
|
|
};
|
|
|
|
void() _mdl_player_death = {
|
|
self.frame++;
|
|
if (self.frame >= self.count) {
|
|
self.mdl_think = NOTHING_function;
|
|
return;
|
|
}
|
|
};
|
|
|
|
void(float type) mdl_player_die = {
|
|
self.angles_x = 0;
|
|
self.angles_z = 0;
|
|
|
|
self.avelocity_x = 0;
|
|
self.avelocity_z = 0;
|
|
|
|
if ((self.mdl_mod&MDL_MOD_WEP_MASK) == MDL_MOD_WEP_AXE) {
|
|
self.frame = $axdeth1; self.count = $axdeth9;
|
|
setsize(self, VEC_HULL_MIN, '16 16 0');
|
|
} else {
|
|
if (type == 0) {
|
|
self.frame = $deatha1; self.count = $deatha11;
|
|
setsize(self, VEC_HULL_MIN, '16 16 -12');
|
|
} else if (type == 1) {
|
|
self.frame = $deathb1; self.count = $deathb9;
|
|
setsize(self, VEC_HULL_MIN, '16 16 0');
|
|
} else if (type == 2) {
|
|
self.frame = $deathc1; self.count = $deathc15;
|
|
setsize(self, VEC_HULL_MIN, '16 16 -12');
|
|
} else if (type == 3) {
|
|
self.frame = $deathd1; self.count = $deathd9;
|
|
setsize(self, VEC_HULL_MIN, '16 16 -12');
|
|
} else {
|
|
self.frame = $deathe1; self.count = $deathe9;
|
|
setsize(self, VEC_HULL_MIN, '16 16 18');
|
|
}
|
|
}
|
|
|
|
self.mdl_think = _mdl_player_death;
|
|
self.mdl_thought = TRUE;
|
|
};
|
|
|
|
/* Rocket, grenade launcher, etc */
|
|
void() _mdl_player_fire = {
|
|
self.frame++;
|
|
if (self.frame < $rockatt1 || self.frame > $rockatt6)
|
|
mdl_player_idle();
|
|
};
|
|
|
|
void() mdl_player_fire = {
|
|
self.frame = $rockatt1;
|
|
self.mdl_think = _mdl_player_fire;
|
|
effect_muzzleflash();
|
|
self.mdl_thought = TRUE;
|
|
};
|
|
|
|
/* shotgun, super shotgun. */
|
|
void() _mdl_player_fire_shotgun = {
|
|
self.frame++;
|
|
if (self.frame < $shotatt1 || self.frame > $shotatt6)
|
|
mdl_player_idle();
|
|
};
|
|
|
|
void() mdl_player_fire_shotgun = {
|
|
self.frame = $shotatt1;
|
|
self.mdl_think = _mdl_player_fire_shotgun;
|
|
effect_muzzleflash();
|
|
self.mdl_thought = TRUE;
|
|
};
|
|
|
|
/* lightning gun */
|
|
void() _mdl_player_fire_lightning = {
|
|
self.frame++;
|
|
if (self.frame < $light1 || self.frame > $light2)
|
|
self.frame = $light1;
|
|
effect_muzzleflash();
|
|
};
|
|
|
|
void() mdl_player_fire_lightning = {
|
|
self.frame = $light1;
|
|
self.mdl_think = _mdl_player_fire_lightning;
|
|
effect_muzzleflash();
|
|
self.mdl_thought = TRUE;
|
|
};
|
|
|
|
/* nailgun, super nailgun */
|
|
void() _mdl_player_fire_nail = {
|
|
self.frame++;
|
|
if (self.frame < $nailatt1 || self.frame > $nailatt2)
|
|
self.frame = $nailatt1;
|
|
};
|
|
|
|
void() mdl_player_fire_nail = {
|
|
self.frame = $nailatt2;
|
|
self.mdl_think = _mdl_player_fire_nail;
|
|
self.mdl_think();
|
|
effect_muzzleflash();
|
|
self.mdl_thought = TRUE;
|
|
};
|
|
|
|
/* Axe */
|
|
void() _mdl_player_fire_axe_a = {
|
|
self.frame++;
|
|
if (self.frame < $axatt1 || self.frame > $axatt4)
|
|
mdl_player_idle();
|
|
};
|
|
|
|
void() _mdl_player_fire_axe_b = {
|
|
self.frame++;
|
|
if (self.frame < $axattb1 || self.frame > $axattb4)
|
|
mdl_player_idle();
|
|
};
|
|
|
|
void() _mdl_player_fire_axe_c = {
|
|
self.frame++;
|
|
if (self.frame < $axattc1 || self.frame > $axattc4)
|
|
mdl_player_idle();
|
|
};
|
|
|
|
void() _mdl_player_fire_axe_d = {
|
|
self.frame++;
|
|
if (self.frame < $axattd1 || self.frame > $axattd4)
|
|
mdl_player_idle();
|
|
};
|
|
|
|
void() mdl_player_fire_axe = {
|
|
local float r;
|
|
|
|
r = random();
|
|
if (r < 0.25) {
|
|
self.frame = $axatt1;
|
|
self.mdl_think = _mdl_player_fire_axe_a;
|
|
} else if (r < 0.5) {
|
|
self.frame = $axattb1;
|
|
self.mdl_think = _mdl_player_fire_axe_b;
|
|
} else if (r < 0.75) {
|
|
self.frame = $axattc1;
|
|
self.mdl_think = _mdl_player_fire_axe_c;
|
|
} else {
|
|
self.frame = $axattd1;
|
|
self.mdl_think = _mdl_player_fire_axe_d;
|
|
}
|
|
|
|
self.mdl_think();
|
|
self.mdl_thought = 1;
|
|
};
|
|
|
|
/* :) */
|
|
void() mdl_player_gib = {
|
|
local entity gib;
|
|
local float r, gibs, velmag;
|
|
local vector vel, giborg;
|
|
|
|
velmag = vlen(self.velocity);
|
|
if (velmag == 0)
|
|
vel = '0 0 1';
|
|
else vel = self.velocity * (1/velmag);
|
|
if (velmag < 200) velmag = 200;
|
|
if (vel == '0 0 0')
|
|
vel = '0 0 1';
|
|
|
|
self.mass /= 6;
|
|
|
|
gibs = 5 + crandom()*1;
|
|
giborg = center(self);
|
|
while (gibs-- > 0) {
|
|
gib = spawn("PLAYER_GIB");
|
|
|
|
gib.solid = SOLID_NOT;
|
|
gib.movetype = MOVETYPE_BOUNCE;
|
|
|
|
gib.mass = self.mass;
|
|
|
|
gib.avelocity_x = crandom()*300;
|
|
gib.avelocity_y = crandom()*300;
|
|
gib.avelocity_z = crandom()*300;
|
|
|
|
gib.velocity_x = vel_x + crandom()*0.2;
|
|
gib.velocity_y = vel_y + crandom()*0.2;
|
|
gib.velocity_z = vel_z + crandom()*0.2;
|
|
gib.velocity = normalize(gib.velocity) * velmag;
|
|
|
|
r = random()*3;
|
|
if (r < 1) gib.model = "progs/gib1.mdl";
|
|
else if (r < 2) gib.model = "progs/gib2.mdl";
|
|
else gib.model = "progs/gib3.mdl";
|
|
|
|
setsize(gib, '0 0 0', '0 0 0');
|
|
setmodel(gib, gib.model);
|
|
setorigin(gib, giborg);
|
|
|
|
gib.think = SUB_remove;
|
|
gib.nextthink = time + 5 + random()*10;
|
|
}
|
|
|
|
self.avelocity = '0 0 0';
|
|
self.angles_x = random()*360;
|
|
self.angles_y = random()*360;
|
|
self.angles_z = random()*360;
|
|
|
|
self.velocity_x = vel_x + crandom()*0.1;
|
|
self.velocity_y = vel_y + crandom()*0.1;
|
|
self.velocity_z = vel_z + crandom()*0.1;
|
|
self.velocity = normalize(self.velocity) * velmag;
|
|
|
|
setsize(self, '0 0 0', '0 0 0');
|
|
setmodel(self, "progs/h_player.mdl");
|
|
setorigin(self, self.origin + self.view_ofs);
|
|
self.view_ofs = '0 0 0';
|
|
|
|
self.mdl_think = NOTHING_function;
|
|
self.mdl_func = mdl_func_void;
|
|
};
|
|
|
|
void() mdl_player_init = {
|
|
precache_model("progs/player.mdl");
|
|
precache_model("progs/h_player.mdl");
|
|
|
|
precache_model("progs/gib1.mdl");
|
|
precache_model("progs/gib2.mdl");
|
|
precache_model("progs/gib3.mdl");
|
|
};
|
|
|
|
void(float func, float extra) mdl_func_player = {
|
|
if (func == MDL_FUNC_IDLE) mdl_player_idle();
|
|
else if (func == MDL_FUNC_JUMP) { extra = 0; }
|
|
else if (func == MDL_FUNC_PAIN) mdl_player_pain(extra);
|
|
else if (func == MDL_FUNC_FIRE) {
|
|
local float wmod;
|
|
|
|
wmod = self.mdl_mod & MDL_MOD_WEP_MASK;
|
|
|
|
if (wmod == MDL_MOD_WEP_AXE) mdl_player_fire_axe();
|
|
else if (wmod == MDL_MOD_WEP_SHOTGUN) mdl_player_fire_shotgun();
|
|
else if (wmod == MDL_MOD_WEP_SUPER_SHOTGUN) mdl_player_fire_shotgun();
|
|
else if (wmod == MDL_MOD_WEP_NAILGUN) mdl_player_fire_nail();
|
|
else if (wmod == MDL_MOD_WEP_SUPER_NAILGUN) mdl_player_fire_nail();
|
|
else if (wmod == MDL_MOD_WEP_GRENADE_LAUNCHER) mdl_player_fire();
|
|
else if (wmod == MDL_MOD_WEP_ROCKET_LAUNCHER) mdl_player_fire();
|
|
else if (wmod == MDL_MOD_WEP_LIGHTNING_GUN) mdl_player_fire_lightning();
|
|
else mdl_player_fire();
|
|
}
|
|
else if (func == MDL_FUNC_DIE) mdl_player_die(extra);
|
|
else if (func == MDL_FUNC_GIB) mdl_player_gib();
|
|
else mdl_player_idle();
|
|
};
|
|
|
|
void() mdl_setup_player = {
|
|
self.model = "progs/player.mdl";
|
|
setmodel(self, self.model);
|
|
setsize(self, VEC_HULL_MIN, VEC_HULL_MAX);
|
|
|
|
self.view_ofs = '0 0 22';
|
|
|
|
self.mdl_func = mdl_func_player;
|
|
self.mdl_func(MDL_FUNC_IDLE, 0);
|
|
self.mdl_var = 0;
|
|
};
|