1181 lines
34 KiB
C
1181 lines
34 KiB
C
|
|
void() bubble_bob;
|
|
|
|
/*
|
|
==============================================================================
|
|
|
|
PLAYER
|
|
|
|
==============================================================================
|
|
*/
|
|
|
|
$frame stand1 stand2 stand3 stand4 stand5 stand6 stand7 stand8 stand9
|
|
$frame stand10 stand11 stand12 stand13
|
|
|
|
$frame stgun1 stgun2 stgun3 stgun4 stgun5 stgun6 stgun7 stgun8 stgun9
|
|
$frame stgun10 stgun11 stgun12 stgun13
|
|
|
|
$frame run1 run2 run3 run4 run5 run6
|
|
|
|
$frame rungun1 rungun2 rungun3 rungun4 rungun5 rungun6
|
|
|
|
$frame pain1 pain2 pain3 pain4 pain5 pain6
|
|
|
|
$frame pgun1 pgun2 pgun3 pgun4 pgun5 pgun6
|
|
|
|
$frame deatha1 deatha2 deatha3 deatha4 deatha5 deatha6 deatha7 deatha8 deatha9
|
|
$frame deatha10 deatha11 deatha12
|
|
|
|
$frame dguna1 dguna2 dguna3 dguna4 dguna5 dguna6 dguna7 dguna8 dguna9
|
|
$frame dguna10 dguna11 dguna12
|
|
|
|
$frame deathb1 deathb2 deathb3 deathb4 deathb5 deathb6 deathb7 deathb8 deathb9
|
|
$frame deathb10 deathb11 deathb12
|
|
|
|
$frame dgunb1 dgunb2 dgunb3 dgunb4 dgunb5 dgunb6 dgunb7 dgunb8 dgunb9
|
|
$frame dgunb10 dgunb11 dgunb12
|
|
|
|
$frame shot1 shot2 shot3 shot4 shot5 shot6 shot7 shot8 shot9
|
|
$frame shot10 shot11 shot12 shot13 shot14 shot15 shot16 shot17 shot18
|
|
|
|
$frame rock1 rock2 rock3 rock4 rock5 rock6 rock7 rock8 rock9
|
|
$frame rock10 rock11 rock12 rock13 rock14 rock15 rock16 rock17 rock18
|
|
|
|
$frame chain1 chain2 chain3 chain4 chain5 chain6
|
|
|
|
$frame bolt1 bolt2 bolt3 bolt4 bolt5 bolt6
|
|
|
|
$frame xatta1 xatta2 xatta3 xatta4 xatta5 xatta6 xatta7 xatta8 xatta9 xatta10
|
|
$frame xatta11 xatta12
|
|
|
|
$frame xattb1 xattb2 xattb3 xattb4 xattb5 xattb6 xattb7 xattb8
|
|
$frame xattb9 xattb10 xattb11 xattb12
|
|
|
|
$frame swim1 swim2 swim3 swim4 swim5 swim6
|
|
|
|
$frame jump1 jump2 jump3 jump4 jump5 jump6
|
|
|
|
/*
|
|
==============================================================================
|
|
PLAYER
|
|
==============================================================================
|
|
*/
|
|
|
|
void() player_run;
|
|
|
|
void() player_stand1 =[ $stand1, player_stand1 ]
|
|
{
|
|
local float oldframe;
|
|
|
|
if (self.velocity_x || self.velocity_y || self.velocity_z)
|
|
{
|
|
self.walkframe=0;
|
|
player_run();
|
|
return;
|
|
}
|
|
|
|
if ((self.weapon == IT_AXE) || ((self.modelindex == index_skeleton) && (self.x_flags & X_STGUN)))
|
|
{
|
|
if (self.walkframe >= 13)
|
|
self.walkframe = 0;
|
|
|
|
if ((self.waterlevel >= 2) && !deathmatch && !coop)
|
|
self.frame = $swim1 + self.walkframe;
|
|
else
|
|
self.frame = $stand1 + self.walkframe;
|
|
}
|
|
else
|
|
{
|
|
if (self.walkframe >= 13)
|
|
self.walkframe = 0;
|
|
|
|
if ((self.waterlevel >= 2) && !deathmatch && !coop)
|
|
self.frame = $swim1 + self.walkframe;
|
|
else
|
|
self.frame = $stgun1 + self.walkframe;
|
|
}
|
|
self.walkframe = self.walkframe + 1;
|
|
|
|
self.weapon_flags = self.weapon_flags - (self.weapon_flags & W_RELOADING);
|
|
|
|
if (self.change_weapon_status == CW_DONE) {
|
|
if (self.weapon == IT_SUPER_NAILGUN) {
|
|
if ((!self.change_weapon_status) && (self.weaponframe < 16))
|
|
self.weaponframe = 18;
|
|
|
|
if ((self.weaponframe >= 16) && (self.weaponframe <= 18)) {
|
|
self.weaponframe = self.weaponframe + 1;
|
|
if (self.weaponframe > 18)
|
|
self.weaponframe = 16;
|
|
}
|
|
}
|
|
else if (!deathmatch && !coop && (self.weapon == IT_AXE)) {
|
|
// if ((!self.change_weapon_status) && (self.weaponframe < 23)) {
|
|
// self.weaponframe = 23;
|
|
// }
|
|
|
|
oldframe = self.weaponframe;
|
|
while (self.weaponframe == oldframe)
|
|
self.weaponframe = 23 + rint(random() * 6); //self.weaponframe + 1;
|
|
// if (self.weaponframe > 29)
|
|
// self.weaponframe = 23;
|
|
}
|
|
else {
|
|
self.weaponframe=self.weapon_idleframe;
|
|
}
|
|
}
|
|
};
|
|
|
|
void() player_run =[ $run1, player_run ]
|
|
{
|
|
local float oldframe;
|
|
|
|
if (!self.velocity_x && !self.velocity_y && !self.velocity_z)
|
|
{
|
|
if (self.modelindex == index_skeleton) {
|
|
// use stgun or stand frames?
|
|
if (random() < 0.5)
|
|
self.x_flags = self.x_flags | X_STGUN;
|
|
else
|
|
self.x_flags = self.x_flags - (self.x_flags & X_STGUN);
|
|
}
|
|
|
|
self.walkframe=0;
|
|
player_stand1();
|
|
return;
|
|
}
|
|
|
|
if (self.x_flags & X_JUMP_PRESSED) {
|
|
if ((self.last_jump > (time - 0.2)) && (self.waterlevel < 2)) {
|
|
self.frame = $jump1;
|
|
self.walkframe = self.frame - 1;
|
|
}
|
|
|
|
self.x_flags = self.x_flags - X_JUMP_PRESSED;
|
|
}
|
|
else {
|
|
if (self.walkframe >= $jump1 ) {
|
|
if (!(self.flags & FL_ONGROUND)) { // still in the air
|
|
self.frame = self.walkframe + 1;
|
|
|
|
if (self.walkframe >= $jump5 )
|
|
self.walkframe = $jump4;
|
|
}
|
|
else { // landed
|
|
self.frame = self.walkframe;
|
|
if (self.walkframe >= $jump6 )
|
|
self.walkframe = 0;
|
|
}
|
|
}
|
|
else if (self.weapon == IT_AXE)
|
|
{
|
|
if (self.walkframe >= 6)
|
|
self.walkframe = 0;
|
|
|
|
if ((self.waterlevel >= 2) && !deathmatch && !coop)
|
|
self.frame = $swim1 + self.walkframe;
|
|
else
|
|
self.frame = $run1 + self.walkframe;
|
|
}
|
|
else
|
|
{
|
|
if (self.walkframe >= 6)
|
|
self.walkframe = 0;
|
|
|
|
if ((self.waterlevel >= 2) && !deathmatch && !coop)
|
|
self.frame = $swim1 + self.walkframe;
|
|
else
|
|
self.frame = $rungun1 + self.walkframe;
|
|
}
|
|
}
|
|
self.walkframe = self.walkframe + 1;
|
|
|
|
self.weapon_flags = self.weapon_flags - (self.weapon_flags & W_RELOADING);
|
|
|
|
if (self.change_weapon_status == CW_DONE) {
|
|
if (self.weapon == IT_SUPER_NAILGUN) {
|
|
if ((!self.change_weapon_status) && (self.weaponframe < 16)) {
|
|
self.weaponframe = 18;
|
|
}
|
|
|
|
if ((self.weaponframe >= 16) && (self.weaponframe <= 18)) {
|
|
self.weaponframe = self.weaponframe + 1;
|
|
if (self.weaponframe > 18)
|
|
self.weaponframe = 16;
|
|
}
|
|
}
|
|
else if (!deathmatch && !coop && (self.weapon == IT_AXE)) {
|
|
// if ((!self.change_weapon_status) && (self.weaponframe < 23)) {
|
|
// self.weaponframe = 23;
|
|
// }
|
|
|
|
oldframe = self.weaponframe;
|
|
while (self.weaponframe == oldframe)
|
|
self.weaponframe = 23 + rint(random() * 6); //self.weaponframe + 1;
|
|
// if (self.weaponframe > 29)
|
|
// self.weaponframe = 23;
|
|
}
|
|
else {
|
|
self.weaponframe=self.weapon_idleframe;
|
|
}
|
|
}
|
|
|
|
};
|
|
|
|
//============================================================================
|
|
|
|
void() PlayerPunch =
|
|
{
|
|
local vector delta;
|
|
local float ldmg;
|
|
local entity plyr;
|
|
|
|
makevectors(self.v_angle);
|
|
if ((plyr = FindSightEnemy(self.origin, v_forward, 60, 40, "all", self)) == world) {
|
|
traceline(self.origin + '0 0 16', self.origin + '0 0 16' + v_forward * 48, TRUE, self);
|
|
|
|
if (trace_fraction < 1) {
|
|
sound(self, CHAN_WEAPON, "generic/punch1.wav", 1, ATTN_NORM);
|
|
|
|
WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
|
|
WriteByte (MSG_BROADCAST, TE_GUNSHOT);
|
|
WriteCoord (MSG_BROADCAST, trace_endpos_x);
|
|
WriteCoord (MSG_BROADCAST, trace_endpos_y);
|
|
WriteCoord (MSG_BROADCAST, trace_endpos_z);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
delta = plyr.origin - self.origin;
|
|
|
|
if (vlen(delta) > 60)
|
|
return;
|
|
|
|
if (plyr.classname == "xmen_iceman")
|
|
IcemanShardGib(plyr, 3);
|
|
else if ((plyr.classname != "xmen_sinister") || (plyr.x_flags & X_MEGA_HIT))
|
|
SpawnBlood(self.origin + v_forward * 16 + '0 0 16', '0 0 0', 9);
|
|
|
|
ldmg = 9 + random() * 3;
|
|
T_Damage (plyr, self, self, ldmg);
|
|
|
|
if ((plyr.flags & FL_MONSTER) &&
|
|
(plyr.classname != "xmen_sinister") &&
|
|
(plyr.classname != "apocalypse_small")) {
|
|
plyr.velocity = normalize(plyr.origin - self.origin) * 150 + '0 0 100';
|
|
plyr.flags = plyr.flags - (plyr.flags & FL_ONGROUND);
|
|
setorigin(plyr, plyr.origin + '0 0 1');
|
|
}
|
|
|
|
if (random() < 0.5)
|
|
sound(self, CHAN_WEAPON, "generic/punch2.wav", 1, ATTN_NORM);
|
|
else
|
|
sound(self, CHAN_WEAPON, "generic/punch3.wav", 1, ATTN_NORM);
|
|
};
|
|
|
|
void() player_fist =
|
|
{
|
|
self.weapon_flags = self.weapon_flags | W_RELOADING;
|
|
|
|
if (self.weaponframe >= 15) {
|
|
self.weaponframe = self.weapon_idleframe;
|
|
}
|
|
|
|
self.weaponframe = self.weaponframe + 1;
|
|
|
|
self.frame = $xatta1 + (self.weaponframe - 5);
|
|
|
|
self.think = player_fist;
|
|
|
|
if (self.weaponframe == 8) {
|
|
SuperDamageSound();
|
|
PlayerPunch();
|
|
}
|
|
|
|
if ((self.weaponframe >= 14) && ((!self.button0) || (self.remember_impulse))) {
|
|
self.weapon_flags = self.weapon_flags - (self.weapon_flags & W_RELOADING);
|
|
self.think = player_run;
|
|
self.weaponframe = self.weapon_idleframe;
|
|
}
|
|
|
|
self.nextthink = time + 0.05;
|
|
};
|
|
|
|
//============================================================================
|
|
|
|
void() DoSpecialWeaponStuff;
|
|
void() player_att1 =
|
|
{
|
|
self.weapon_flags = self.weapon_flags | W_RELOADING;
|
|
|
|
if (self.weaponframe > 18)
|
|
self.weaponframe = self.weaponframe - 12;
|
|
|
|
if (self.weaponframe >= 18) { // still holding down fire
|
|
if (!((self.character == CHAR_CANNONBALL) && (self.special_weapon) && (self.last_special2 > (time - 2)) ))
|
|
self.weaponframe = 6;
|
|
}
|
|
|
|
self.weaponframe = self.weaponframe + 1;
|
|
|
|
self.think = player_att1;
|
|
|
|
DoSpecialWeaponStuff();
|
|
|
|
if ((self.weaponframe >= 18) && ((!self.button0) || (self.remember_impulse))) {
|
|
self.weapon_flags = self.weapon_flags - (self.weapon_flags & W_RELOADING);
|
|
self.think = player_run;
|
|
self.weaponframe = 6;
|
|
}
|
|
|
|
if ((!self.special_weapon && self.character != CHAR_WOLVERINE) ||
|
|
(self.special_weapon && self.character == CHAR_WOLVERINE))
|
|
self.frame = $xatta1 + (self.weaponframe - 7);
|
|
else {
|
|
self.frame = $xattb1 + (self.weaponframe - 7);
|
|
self.weaponframe = self.weaponframe + 12;
|
|
}
|
|
|
|
if (self.x_flags & X_RAPID_FIRE) {
|
|
if ((self.character == CHAR_BISHOP) && (!self.special_weapon)) {
|
|
// skip frames to go faster
|
|
|
|
if ((self.weaponframe == 11) ||
|
|
(self.weaponframe == 16)) {
|
|
self.weaponframe = self.weaponframe + 1;
|
|
}
|
|
}
|
|
|
|
self.nextthink = time + 0.05;
|
|
}
|
|
else if ((self.character == CHAR_BISHOP) && (!self.special_weapon)) {
|
|
self.nextthink = time + 0.05;
|
|
}
|
|
else {
|
|
self.nextthink = time + 0.1;
|
|
}
|
|
|
|
};
|
|
|
|
//============================================================================
|
|
|
|
void() player_laser1 =[$bolt1, player_laser1 ]
|
|
{
|
|
self.effects = self.effects | EF_MUZZLEFLASH;
|
|
|
|
if ((!self.button0) || (!W_CheckNoAmmo ()) || (self.change_weapon_status))
|
|
{
|
|
self.weaponframe = 5;
|
|
player_run ();
|
|
return;
|
|
}
|
|
|
|
if ((self.w_pausetime < time) || (self.x_flags & X_RAPID_FIRE)) {
|
|
|
|
self.weaponframe = self.weaponframe + 1;
|
|
if (self.weaponframe > 14)
|
|
self.weaponframe = 6;
|
|
|
|
self.walkframe = self.walkframe + 1;
|
|
if (self.walkframe > 5)
|
|
self.walkframe = 0;
|
|
|
|
self.fire_reload_frames = self.fire_reload_frames - 1;
|
|
|
|
if ((self.last_fire_laser > (time - 0.4)) && (self.weaponframe == 6) && !(self.x_flags & X_RAPID_FIRE)) {
|
|
self.w_pausetime = time + 0.5;
|
|
self.consecutive_count = 0;
|
|
self.weaponframe = 5;
|
|
|
|
self.walkframe = 1;
|
|
}
|
|
else {
|
|
|
|
if (self.fire_reload_frames <= 0) {
|
|
if (self.waterlevel < 3) { // can't fire while underwater
|
|
SuperDamageSound();
|
|
W_FireFlameball (8);
|
|
}
|
|
|
|
self.last_fire_laser = time;
|
|
self.attack_finished = time + 0.2;
|
|
|
|
self.fire_reload_frames = 3;
|
|
}
|
|
else {
|
|
self.nextthink = time + 0.05;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
self.frame = self.frame + self.walkframe;
|
|
|
|
};
|
|
|
|
void() player_shotgun1 = [$shot1, player_shotgun1 ]
|
|
{
|
|
if (self.weaponframe == 5) {
|
|
|
|
if ((!(self.weapon_flags & W_RELOADING)) &&
|
|
((self.change_weapon_status) ||
|
|
(!self.button0) ||
|
|
(!W_CheckNoAmmo()))) {
|
|
|
|
player_run ();
|
|
return;
|
|
}
|
|
|
|
self.effects = self.effects | EF_MUZZLEFLASH;
|
|
self.walkframe = -1;
|
|
W_FireSuperShotgun();
|
|
|
|
self.weapon_flags = self.weapon_flags | W_RELOADING;
|
|
}
|
|
|
|
if (self.change_weapon_status)
|
|
return;
|
|
|
|
self.walkframe = self.walkframe + 1;
|
|
if (self.walkframe > 17)
|
|
self.walkframe = 17;
|
|
self.frame = self.frame + self.walkframe;
|
|
|
|
self.weaponframe = self.weaponframe + 1;
|
|
|
|
if ((self.weaponframe > 22) || ((self.weaponframe > 8) && !(self.weapon_flags & W_SHOTRELOAD))) {
|
|
self.weaponframe = 5;
|
|
|
|
if (!(self.weapon_flags & W_SHOTRELOAD) && !(self.x_flags & X_RAPID_FIRE))
|
|
self.weapon_flags = self.weapon_flags | W_SHOTRELOAD;
|
|
else
|
|
self.weapon_flags = self.weapon_flags - (self.weapon_flags & W_SHOTRELOAD);
|
|
|
|
self.weapon_flags = self.weapon_flags - (self.weapon_flags & W_RELOADING);
|
|
}
|
|
else if (self.weaponframe == 10) {
|
|
sound (self ,CHAN_ITEM, "weapons/reload.wav", 1, ATTN_NORM);
|
|
}
|
|
else if (self.weaponframe > 8)
|
|
self.nextthink = time + 0.05;
|
|
|
|
};
|
|
|
|
void(float ox) W_FireSuperSpikes;
|
|
|
|
void() player_chain1 = [$chain1, player_chain1 ]
|
|
{
|
|
if (self.change_weapon_status) {
|
|
self.weaponframe = 5;
|
|
player_run ();
|
|
return;
|
|
}
|
|
|
|
// self.nextthink = time + 0.05;
|
|
|
|
if ((!self.button0) || (!W_CheckNoAmmo ())) {
|
|
self.weaponframe = 5;
|
|
player_run ();
|
|
return;
|
|
}
|
|
|
|
self.walkframe = self.walkframe + 1;
|
|
if (self.walkframe > 5)
|
|
self.walkframe = 0;
|
|
self.frame = self.frame + self.walkframe;
|
|
|
|
if ((self.w_pausetime < time) || (self.x_flags & X_RAPID_FIRE)) {
|
|
|
|
self.weaponframe = self.weaponframe + 1;
|
|
if (self.weaponframe > 11)
|
|
self.weaponframe = 6;
|
|
|
|
self.effects = self.effects | EF_MUZZLEFLASH;
|
|
|
|
SuperDamageSound();
|
|
W_FireSuperSpikes (-8);
|
|
|
|
self.consecutive_count = self.consecutive_count + 1;
|
|
|
|
if (self.consecutive_count >= 15) { // let gun cool down
|
|
self.w_pausetime = time + 0.5;
|
|
/*
|
|
self.w_pausetime = time + self.last_pausetime + 0.5;
|
|
self.last_pausetime = self.last_pausetime + 0.2;
|
|
if (self.last_pausetime > 1.5)
|
|
self.last_pausetime = 1.5;
|
|
*/
|
|
|
|
self.consecutive_count = 0;
|
|
self.weaponframe = 5;
|
|
}
|
|
|
|
}
|
|
|
|
self.attack_finished = time + 0.2;
|
|
};
|
|
|
|
/**************** NOT USED ****************************
|
|
void() player_nail1 =[$nailatt1, player_nail2 ]
|
|
{
|
|
self.effects = self.effects | EF_MUZZLEFLASH;
|
|
|
|
if (!self.button0)
|
|
{player_run ();return;}
|
|
self.weaponframe = self.weaponframe + 1;
|
|
if (self.weaponframe == 9)
|
|
self.weaponframe = 1;
|
|
SuperDamageSound();
|
|
W_FireSpikes (4);
|
|
self.attack_finished = time + 0.2;
|
|
};
|
|
void() player_nail2 =[$nailatt2, player_nail1 ]
|
|
{
|
|
self.effects = self.effects | EF_MUZZLEFLASH;
|
|
|
|
if (!self.button0)
|
|
{player_run ();return;}
|
|
self.weaponframe = self.weaponframe + 1;
|
|
if (self.weaponframe == 9)
|
|
self.weaponframe = 1;
|
|
SuperDamageSound();
|
|
W_FireSpikes (-4);
|
|
self.attack_finished = time + 0.2;
|
|
};
|
|
********************************************************/
|
|
|
|
//============================================================================
|
|
|
|
void() player_mega =[$chain1, player_mega ]
|
|
{
|
|
// self.effects = self.effects | EF_MUZZLEFLASH;
|
|
|
|
if ((!self.button0) || (!W_CheckNoAmmo ()) || (self.change_weapon_status)) {
|
|
player_run ();
|
|
return;
|
|
}
|
|
|
|
self.walkframe = self.walkframe + 1;
|
|
if (self.walkframe > 5)
|
|
self.walkframe = 0;
|
|
self.frame = self.frame + self.walkframe;
|
|
|
|
self.weaponframe = self.weaponframe + 1;
|
|
if (self.weaponframe > 17)
|
|
self.weaponframe = 12;
|
|
|
|
if ((self.weaponframe == 12) && (random() < 0.4))
|
|
sound (self, CHAN_AUTO, "weapons/mega.wav", 1, ATTN_NONE);
|
|
|
|
W_FireLightning();
|
|
self.attack_finished = time + 0.2;
|
|
};
|
|
|
|
void() player_prox1 =[$chain1, player_prox1 ]
|
|
{
|
|
// self.effects = self.effects | EF_MUZZLEFLASH;
|
|
//bprint("player_prox\n");
|
|
|
|
if (((!self.button0) || (self.change_weapon_status)) && (self.weaponframe < 11) && (self.weaponframe > 5)) {
|
|
SuperDamageSound();
|
|
W_FireProximity();
|
|
|
|
self.weaponframe = 11;
|
|
|
|
self.think = player_run;
|
|
W_CheckNoAmmo();
|
|
|
|
return;
|
|
}
|
|
|
|
if (self.weaponframe == 5) {
|
|
// if (self.prox_ent == world) {
|
|
self.prox_power = 0;
|
|
StartProximity();
|
|
// }
|
|
}
|
|
|
|
if (self.weaponframe < 10) {
|
|
self.weaponframe = self.weaponframe + 1;
|
|
}
|
|
else if (self.weaponframe >= 11) {
|
|
self.weaponframe = self.weaponframe + 1;
|
|
|
|
if (self.weaponframe > 15) {
|
|
player_run();
|
|
return;
|
|
}
|
|
}
|
|
|
|
self.walkframe = self.walkframe + 1;
|
|
if (self.walkframe > 5)
|
|
self.walkframe = 0;
|
|
self.frame = self.frame + self.walkframe;
|
|
|
|
self.attack_finished = time + 0.2;
|
|
self.last_prox_think = time;
|
|
};
|
|
|
|
void() player_flame1 =[$bolt1, player_flame1 ]
|
|
{
|
|
// self.effects = self.effects | EF_MUZZLEFLASH;
|
|
|
|
if ((!self.button0) || (!W_CheckNoAmmo ()) || (self.change_weapon_status)) {
|
|
player_run ();
|
|
self.flags = self.flags - (self.flags & FL_FLAMEON);
|
|
return;
|
|
}
|
|
|
|
self.walkframe = self.walkframe + 1;
|
|
if (self.walkframe > 5)
|
|
self.walkframe = 0;
|
|
self.frame = self.frame + self.walkframe;
|
|
|
|
self.weaponframe = self.weaponframe + 1;
|
|
if (self.weaponframe > 8)
|
|
self.weaponframe = 6;
|
|
|
|
SuperDamageSound();
|
|
// W_FireLightning();
|
|
W_FireFlameThrower();
|
|
self.attack_finished = time + 0.2;
|
|
};
|
|
|
|
void() player_orb =[$rock1, player_orb ]
|
|
{
|
|
// self.effects = self.effects | EF_MUZZLEFLASH;
|
|
if ((((self.weaponframe == 5) || (self.weaponframe == 11)) && (!self.button0)) ||
|
|
(!W_CheckNoAmmo ()) || (self.change_weapon_status)) {
|
|
self.weaponframe = 5;
|
|
player_run ();
|
|
return;
|
|
}
|
|
|
|
self.walkframe = self.walkframe + 1;
|
|
if (self.walkframe > 12)
|
|
self.walkframe = 0;
|
|
self.frame = self.frame + self.walkframe;
|
|
|
|
self.weaponframe = self.weaponframe + 1;
|
|
if (self.weaponframe > 17) {
|
|
self.weaponframe = 5;
|
|
}
|
|
|
|
if ((self.weaponframe == 6) || (self.weaponframe == 12)) {
|
|
SuperDamageSound();
|
|
W_FireGrenade();
|
|
self.attack_finished = time + 0.7;
|
|
}
|
|
else if ((self.weaponframe > 12) && (!(self.x_flags & X_RAPID_FIRE))) {
|
|
self.nextthink = time + 0.15;
|
|
}
|
|
else
|
|
self.nextthink = time + 0.05;
|
|
|
|
};
|
|
|
|
//============================================================================
|
|
|
|
void() player_rocket16;
|
|
|
|
void() player_rocket1 =[$rock1, player_rocket2 ] {self.weaponframe=6;
|
|
self.effects = self.effects | EF_MUZZLEFLASH;
|
|
self.weapon_flags = self.weapon_flags | W_RELOADING;};
|
|
void() player_rocket2 =[$rock2, player_rocket3 ] {self.weaponframe=7;};
|
|
void() player_rocket3 =[$rock3, player_rocket4 ] {self.weaponframe=8;};
|
|
void() player_rocket4 =[$rock4, player_rocket5 ] {self.weaponframe=9;};
|
|
void() player_rocket5 =[$rock5, player_rocket6 ] {self.weaponframe=10;};
|
|
void() player_rocket6 =[$rock6, player_rocket7 ]
|
|
{
|
|
self.weaponframe=11;
|
|
|
|
if (self.x_flags & X_RAPID_FIRE)
|
|
self.think = player_rocket16;
|
|
};
|
|
void() player_rocket7 =[$rock7, player_rocket8 ] {self.weaponframe=12; self.nextthink = time + 0.05;};
|
|
void() player_rocket8 =[$rock8, player_rocket9 ] {self.weaponframe=13; self.nextthink = time + 0.05;};
|
|
void() player_rocket9 =[$rock9, player_rocket10 ] {self.weaponframe=14; self.nextthink = time + 0.05;};
|
|
void() player_rocket10 =[$rock10, player_rocket11 ] {self.weaponframe=15; self.nextthink = time + 0.05;};
|
|
void() player_rocket11 =[$rock11, player_rocket12 ] {self.weaponframe=16; self.nextthink = time + 0.05;};
|
|
void() player_rocket12 =[$rock12, player_rocket13 ] {self.weaponframe=1; self.nextthink = time + 0.05;};
|
|
void() player_rocket13 =[$rock13, player_rocket14 ] {self.weaponframe=2; self.nextthink = time + 0.05;};
|
|
void() player_rocket14 =[$rock14, player_rocket15 ] {self.weaponframe=3; self.nextthink = time + 0.05;};
|
|
void() player_rocket15 =[$rock15, player_rocket16 ] {self.weaponframe=4; self.nextthink = time + 0.05;};
|
|
void() player_rocket16 =[$rock16, player_run ] {self.weaponframe=5;
|
|
self.weapon_flags = self.weapon_flags - (self.weapon_flags & W_RELOADING);
|
|
self.attack_finished = time;
|
|
};
|
|
void(float num_bubbles) DeathBubbles;
|
|
|
|
void() PainSound =
|
|
{
|
|
local float rs;
|
|
|
|
if (self.health < 0)
|
|
return;
|
|
|
|
if (damage_attacker.classname == "teledeath")
|
|
{
|
|
sound (self, CHAN_VOICE, "player/teledth1.wav", 1, ATTN_NONE);
|
|
return;
|
|
}
|
|
|
|
if (!deathmatch && !coop) {
|
|
// water pain sounds
|
|
if (self.watertype == CONTENT_WATER && self.waterlevel == 3)
|
|
{
|
|
DeathBubbles(1);
|
|
if (random() > 0.5)
|
|
sound (self, CHAN_VOICE, "player/drown1.wav", 1, ATTN_NORM);
|
|
else
|
|
sound (self, CHAN_VOICE, "player/drown2.wav", 1, ATTN_NORM);
|
|
return;
|
|
}
|
|
|
|
if (self.watertype == CONTENT_LAVA)
|
|
{
|
|
if (random() > 0.5)
|
|
sound (self, CHAN_VOICE, "player/lburn1.wav", 1, ATTN_NORM);
|
|
else
|
|
sound (self, CHAN_VOICE, "player/lburn2.wav", 1, ATTN_NORM);
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (self.pain_finished > time)
|
|
{
|
|
self.axhitme = 0;
|
|
return;
|
|
}
|
|
self.pain_finished = time + 0.5;
|
|
|
|
// don't make multiple pain sounds right after each other
|
|
|
|
if (deathmatch || coop) {
|
|
if (self.char_type == CT_FEMALE)
|
|
FemalePainSound();
|
|
else
|
|
MalePainSound(self.char_type);
|
|
}
|
|
else {
|
|
rs = random() * 4;
|
|
|
|
if (rs < 1)
|
|
sound(self, CHAN_VOICE, "player/pain1.wav", 1, ATTN_NORM);
|
|
else if (rs < 2)
|
|
sound(self, CHAN_VOICE, "player/pain2.wav", 1, ATTN_NORM);
|
|
else if (rs < 3)
|
|
sound(self, CHAN_VOICE, "player/pain3.wav", 1, ATTN_NORM);
|
|
else
|
|
sound(self, CHAN_VOICE, "player/pain4.wav", 1, ATTN_NORM);
|
|
}
|
|
|
|
};
|
|
|
|
void() player_pain1 = [ $pgun1, player_pain2 ] {};
|
|
void() player_pain2 = [ $pgun2, player_pain3 ] {};
|
|
void() player_pain3 = [ $pgun3, player_pain4 ] {};
|
|
void() player_pain4 = [ $pgun4, player_pain5 ] {};
|
|
void() player_pain5 = [ $pgun5, player_pain6 ] {};
|
|
void() player_pain6 = [ $pgun6, player_run ] {};
|
|
|
|
void() player_painaxe1 = [ $pain1, player_painaxe2 ] {};
|
|
void() player_painaxe2 = [ $pain2, player_painaxe3 ] {};
|
|
void() player_painaxe3 = [ $pain3, player_painaxe4 ] {};
|
|
void() player_painaxe4 = [ $pain4, player_painaxe5 ] {};
|
|
void() player_painaxe5 = [ $pain5, player_painaxe6 ] {};
|
|
void() player_painaxe6 = [ $pain6, player_run ] {};
|
|
|
|
void() player_pain =
|
|
{
|
|
if (self.invisible_finished > time)
|
|
return; // eyes don't have pain frames
|
|
|
|
PainSound();
|
|
|
|
if (self.weaponframe != self.weapon_idleframe)
|
|
return;
|
|
|
|
if (self.prox_ent != world)
|
|
return;
|
|
|
|
if (self.weapon == IT_AXE)
|
|
player_painaxe1 ();
|
|
else
|
|
player_pain1 ();
|
|
};
|
|
|
|
void() player_diea1;
|
|
void() player_dieb1;
|
|
void() player_dguna1;
|
|
void() player_dgunb1;
|
|
|
|
void() DeathBubblesSpawn =
|
|
{
|
|
local entity bubble;
|
|
if (self.owner.waterlevel != 3)
|
|
return;
|
|
bubble = spawn();
|
|
setmodel (bubble, "progs/s_bubble.spr");
|
|
setorigin (bubble, self.owner.origin + '0 0 24');
|
|
bubble.movetype = MOVETYPE_NOCLIP;
|
|
bubble.solid = SOLID_NOT;
|
|
bubble.velocity = '0 0 15';
|
|
bubble.nextthink = time + 0.5;
|
|
bubble.think = bubble_bob;
|
|
bubble.classname = "bubble";
|
|
bubble.frame = 0;
|
|
bubble.cnt = 0;
|
|
setsize (bubble, '-8 -8 -8', '8 8 8');
|
|
self.nextthink = time + 0.1;
|
|
self.think = DeathBubblesSpawn;
|
|
self.air_finished = self.air_finished + 1;
|
|
if (self.air_finished >= self.bubble_count)
|
|
remove(self);
|
|
};
|
|
|
|
void(float num_bubbles) DeathBubbles =
|
|
{
|
|
local entity bubble_spawner;
|
|
|
|
bubble_spawner = spawn();
|
|
setorigin (bubble_spawner, self.origin);
|
|
bubble_spawner.movetype = MOVETYPE_NONE;
|
|
bubble_spawner.solid = SOLID_NOT;
|
|
bubble_spawner.nextthink = time + 0.1;
|
|
bubble_spawner.think = DeathBubblesSpawn;
|
|
bubble_spawner.air_finished = 0;
|
|
bubble_spawner.owner = self;
|
|
bubble_spawner.bubble_count = num_bubbles;
|
|
return;
|
|
};
|
|
|
|
|
|
void() DeathSound =
|
|
{
|
|
local float rs;
|
|
|
|
// water death sounds
|
|
if (self.waterlevel == 3)
|
|
{
|
|
DeathBubbles(20);
|
|
sound (self, CHAN_VOICE, "player/h2odeath.wav", 1, ATTN_NONE);
|
|
return;
|
|
}
|
|
|
|
if (deathmatch || coop) {
|
|
if (self.char_type == CT_FEMALE)
|
|
FemaleDeathSound();
|
|
else
|
|
MaleDeathSound(self.char_type);
|
|
}
|
|
// else
|
|
// MaleDeathSound(1);
|
|
|
|
return;
|
|
};
|
|
|
|
|
|
void() PlayerDead =
|
|
{
|
|
self.nextthink = -1;
|
|
// allow respawn after a certain time
|
|
self.deadflag = DEAD_DEAD;
|
|
};
|
|
|
|
vector(float dm) VelocityForDamage =
|
|
{
|
|
local vector v;
|
|
|
|
if (damage_attacker.classname == "player")
|
|
{
|
|
if (vlen(damage_inflictor.velocity) > 0)
|
|
v = 0.5 * damage_inflictor.velocity;
|
|
v = v + (400 * normalize(self.origin-damage_attacker.origin));
|
|
v = v * random();
|
|
v_z = 100 + 240 * random();
|
|
v_x = v_x + (100 * crandom());
|
|
v_y = v_y + (100 * crandom());
|
|
//bprint ("Velocity gib\n");
|
|
}
|
|
else
|
|
{
|
|
v_x = 100 * crandom();
|
|
v_y = 100 * crandom();
|
|
v_z = 200 + 100 * random();
|
|
}
|
|
|
|
// v_x = 200 * crandom();
|
|
// v_y = 200 * crandom();
|
|
// v_z = 400 + 100 * random();
|
|
|
|
if (dm > -30)
|
|
{
|
|
// dprint ("level 1\n");
|
|
v = v * 1;
|
|
}
|
|
else if (dm > -80)
|
|
{
|
|
// dprint ("level 3\n");
|
|
v = v * 1.5;
|
|
}
|
|
else
|
|
v = v * 3;
|
|
|
|
return v;
|
|
};
|
|
|
|
void() GibThink =
|
|
{
|
|
if ((self.angles_x != 0) && (self.velocity == '0 0 0')) {
|
|
self.angles_x = 0;
|
|
self.angles_z = 0;
|
|
self.avelocity = '0 0 0';
|
|
self.movetype = MOVETYPE_NONE;
|
|
|
|
if (self.model == "progs/gib01.mdl")
|
|
setorigin(self, self.origin + '0 0 4');
|
|
|
|
self.think = SUB_Remove;
|
|
self.nextthink = time + 5 + random()*5;
|
|
|
|
return;
|
|
}
|
|
|
|
self.nextthink = time + 0.1;
|
|
|
|
if (self.ltime < time)
|
|
remove(self);
|
|
|
|
};
|
|
|
|
void(string gibname, float dm) ThrowGib =
|
|
{
|
|
local entity new;
|
|
|
|
new = spawn();
|
|
new.origin = self.origin;
|
|
setmodel (new, gibname);
|
|
setsize (new, '0 0 0', '0 0 0');
|
|
new.velocity = VelocityForDamage (dm);
|
|
new.movetype = MOVETYPE_BOUNCE;
|
|
new.solid = SOLID_TRIGGER;
|
|
new.avelocity_x = random()*600;
|
|
new.avelocity_y = random()*600;
|
|
new.avelocity_z = random()*600;
|
|
new.think = GibThink;
|
|
new.ltime = time + 10 + random() * 5;
|
|
new.nextthink = time + 0.1;
|
|
new.frame = 0;
|
|
new.flags = 0;
|
|
|
|
if (self.classname == "func_explode")
|
|
new.skin = self.speed;
|
|
};
|
|
|
|
void(string gibname, float dm) ThrowBodyPart =
|
|
{
|
|
local entity new;
|
|
|
|
new = spawn();
|
|
new.origin = self.origin;
|
|
setmodel (new, gibname);
|
|
setsize (new, '-4 -4 -4', '4 4 4');
|
|
new.velocity = VelocityForDamage (dm);
|
|
new.movetype = MOVETYPE_BOUNCE;
|
|
self.solid = SOLID_NOT;
|
|
new.avelocity_x = random()*600;
|
|
new.avelocity_y = random()*600;
|
|
new.avelocity_z = random()*600;
|
|
new.think = SUB_Remove;
|
|
new.ltime = time + 5 + random() * 5;
|
|
new.nextthink = time + 10 + random()*10;
|
|
new.frame = 0;
|
|
new.flags = 0;
|
|
|
|
new.think = GibThink;
|
|
new.nextthink = time + 0.2;
|
|
};
|
|
|
|
void(string gibname, float dm) ThrowHead =
|
|
{
|
|
setmodel (self, gibname);
|
|
self.frame = 0;
|
|
self.nextthink = -1;
|
|
self.movetype = MOVETYPE_BOUNCE;
|
|
self.takedamage = DAMAGE_NO;
|
|
self.solid = SOLID_TRIGGER;
|
|
self.view_ofs = '0 0 8';
|
|
setsize (self, '-16 -16 -8', VEC_HULL_MAX);
|
|
self.velocity = VelocityForDamage (dm * 2);
|
|
// self.origin_z = self.origin_z + ;
|
|
self.flags = self.flags - (self.flags & FL_ONGROUND);
|
|
self.avelocity = crandom() * '200 600 200';
|
|
|
|
// self.think = GibThink;
|
|
// self.nextthink = time + 0.2;
|
|
};
|
|
|
|
|
|
void() GibPlayer =
|
|
{
|
|
ThrowHead ("progs/gib01.mdl", self.health);
|
|
ThrowGib ("progs/gib02.mdl", self.health);
|
|
ThrowGib ("progs/gib02.mdl", self.health);
|
|
ThrowGib ("progs/gib02.mdl", self.health);
|
|
ThrowGib ("progs/gib03.mdl", self.health);
|
|
ThrowGib ("progs/gib03.mdl", self.health);
|
|
ThrowGib ("progs/gib03.mdl", self.health);
|
|
|
|
self.deadflag = DEAD_DEAD;
|
|
|
|
if (damage_attacker.classname == "teledeath")
|
|
{
|
|
sound (self, CHAN_VOICE, "player/teledth1.wav", 1, ATTN_NONE);
|
|
return;
|
|
}
|
|
|
|
if (damage_attacker.classname == "teledeath2")
|
|
{
|
|
sound (self, CHAN_VOICE, "player/teledth1.wav", 1, ATTN_NONE);
|
|
return;
|
|
}
|
|
|
|
sound(self, CHAN_BODY, "skeleton/crunch.wav", 1, ATTN_NORM);
|
|
};
|
|
|
|
void() PlayerDie =
|
|
{
|
|
local float i;
|
|
local string str;
|
|
|
|
self.items = self.items - (self.items & IT_INVISIBILITY);
|
|
self.invisible_finished = 0; // don't die as eyes
|
|
self.invincible_finished = 0;
|
|
self.super_damage_finished = 0;
|
|
self.radsuit_finished = 0;
|
|
|
|
if (self.modelindex != index_skeleton)
|
|
self.modelindex = self.modelindex_player; // don't use eyes
|
|
|
|
if (deathmatch && (deathmatch != DM_SPECIAL_POWERS) && (self.modelindex != index_skeleton))
|
|
DropBackpack();
|
|
|
|
self.weaponmodel="";
|
|
self.view_ofs = '0 0 -8';
|
|
self.deadflag = DEAD_DYING;
|
|
self.solid = SOLID_NOT;
|
|
self.flags = self.flags - (self.flags & FL_ONGROUND);
|
|
self.flags = self.flags - (self.flags & FL_FLAMEON);
|
|
|
|
self.x_flags = self.x_flags - (self.x_flags & X_FLYING);
|
|
self.x_flags = self.x_flags - (self.x_flags & X_RAPID_FIRE);
|
|
self.x_flags = self.x_flags - (self.x_flags & X_PARALLIZED);
|
|
|
|
self.effects = self.effects - (self.effects & EF_DIMLIGHT);
|
|
self.movetype = MOVETYPE_TOSS;
|
|
if (self.velocity_z < 10)
|
|
self.velocity_z = self.velocity_z + random()*300;
|
|
|
|
if (self.modelindex == index_skeleton)
|
|
{
|
|
GibPlayer ();
|
|
return;
|
|
}
|
|
|
|
DeathSound();
|
|
|
|
self.angles_x = 0;
|
|
self.angles_z = 0;
|
|
|
|
i = 1 + floor(random()*2);
|
|
|
|
if (self.weapon == IT_AXE)
|
|
{
|
|
if (i == 1)
|
|
player_diea1();
|
|
else if (i == 2)
|
|
player_dieb1();
|
|
|
|
return;
|
|
}
|
|
|
|
if (i == 1)
|
|
player_dguna1();
|
|
else if (i == 2)
|
|
player_dgunb1();
|
|
|
|
};
|
|
|
|
void() set_suicide_frame =
|
|
{ // used by klill command and diconnect command
|
|
if (self.deadflag == DEAD_DEAD)
|
|
return; // allready gibbed
|
|
|
|
self.flags = self.flags - (self.flags & FL_FLAMEON);
|
|
|
|
self.x_flags = self.x_flags - (self.x_flags & X_FLYING);
|
|
self.x_flags = self.x_flags - (self.x_flags & X_RAPID_FIRE);
|
|
self.x_flags = self.x_flags - (self.x_flags & X_PARALLIZED);
|
|
|
|
self.frame = $deatha11;
|
|
self.solid = SOLID_NOT;
|
|
self.movetype = MOVETYPE_TOSS;
|
|
self.deadflag = DEAD_DEAD;
|
|
self.nextthink = -1;
|
|
};
|
|
|
|
|
|
void() player_diea1 = [ $deatha1, player_diea2 ] {};
|
|
void() player_diea2 = [ $deatha2, player_diea3 ] {};
|
|
void() player_diea3 = [ $deatha3, player_diea4 ] {};
|
|
void() player_diea4 = [ $deatha4, player_diea5 ] {};
|
|
void() player_diea5 = [ $deatha5, player_diea6 ] {};
|
|
void() player_diea6 = [ $deatha6, player_diea7 ] {};
|
|
void() player_diea7 = [ $deatha7, player_diea8 ] {};
|
|
void() player_diea8 = [ $deatha8, player_diea9 ] {};
|
|
void() player_diea9 = [ $deatha9, player_diea10 ] {};
|
|
void() player_diea10 = [ $deatha10, player_diea11 ] {};
|
|
void() player_diea11 = [ $deatha11, player_diea12 ] {};
|
|
void() player_diea12 = [ $deatha12, player_diea12 ] {PlayerDead();};
|
|
|
|
void() player_dieb1 = [ $deathb1, player_dieb2 ] {};
|
|
void() player_dieb2 = [ $deathb2, player_dieb3 ] {};
|
|
void() player_dieb3 = [ $deathb3, player_dieb4 ] {};
|
|
void() player_dieb4 = [ $deathb4, player_dieb5 ] {};
|
|
void() player_dieb5 = [ $deathb5, player_dieb6 ] {};
|
|
void() player_dieb6 = [ $deathb6, player_dieb7 ] {};
|
|
void() player_dieb7 = [ $deathb7, player_dieb8 ] {};
|
|
void() player_dieb8 = [ $deathb8, player_dieb9 ] {};
|
|
void() player_dieb9 = [ $deathb9, player_dieb10 ] {};
|
|
void() player_dieb10 = [ $deathb10, player_dieb11 ] {};
|
|
void() player_dieb11 = [ $deathb11, player_dieb12 ] {};
|
|
void() player_dieb12 = [ $deathb12, player_dieb12 ] {PlayerDead();};
|
|
|
|
void() player_dguna1 = [ $dguna1, player_dguna2 ] {};
|
|
void() player_dguna2 = [ $dguna2, player_dguna3 ] {};
|
|
void() player_dguna3 = [ $dguna3, player_dguna4 ] {};
|
|
void() player_dguna4 = [ $dguna4, player_dguna5 ] {};
|
|
void() player_dguna5 = [ $dguna5, player_dguna6 ] {};
|
|
void() player_dguna6 = [ $dguna6, player_dguna7 ] {};
|
|
void() player_dguna7 = [ $dguna7, player_dguna8 ] {};
|
|
void() player_dguna8 = [ $dguna8, player_dguna9 ] {};
|
|
void() player_dguna9 = [ $dguna9, player_dguna10 ] {};
|
|
void() player_dguna10 = [ $dguna10, player_dguna11 ] {};
|
|
void() player_dguna11 = [ $dguna11, player_dguna12 ] {};
|
|
void() player_dguna12 = [ $dguna12, player_dguna12 ] {PlayerDead();};
|
|
|
|
void() player_dgunb1 = [ $dgunb1, player_dgunb2 ] {};
|
|
void() player_dgunb2 = [ $dgunb2, player_dgunb3 ] {};
|
|
void() player_dgunb3 = [ $dgunb3, player_dgunb4 ] {};
|
|
void() player_dgunb4 = [ $dgunb4, player_dgunb5 ] {};
|
|
void() player_dgunb5 = [ $dgunb5, player_dgunb6 ] {};
|
|
void() player_dgunb6 = [ $dgunb6, player_dgunb7 ] {};
|
|
void() player_dgunb7 = [ $dgunb7, player_dgunb8 ] {};
|
|
void() player_dgunb8 = [ $dgunb8, player_dgunb9 ] {};
|
|
void() player_dgunb9 = [ $dgunb9, player_dgunb10 ] {};
|
|
void() player_dgunb10 = [ $dgunb10, player_dgunb11 ] {};
|
|
void() player_dgunb11 = [ $dgunb11, player_dgunb12 ] {};
|
|
void() player_dgunb12 = [ $dgunb12, player_dgunb12 ] {PlayerDead();};
|
|
|