fix spectating edge cases
This commit is contained in:
parent
6933e8bf68
commit
d3372f846a
|
@ -22,23 +22,16 @@ void() SetChangeParms = {
|
||||||
}
|
}
|
||||||
|
|
||||||
// remove items
|
// remove items
|
||||||
self.items &= ~(IT_KEY1 | IT_KEY2 | IT_INVISIBILITY | IT_INVULNERABILITY | IT_SUIT | IT_QUAD);
|
self.items &= ~(IT_KEY1 | IT_KEY2 | IT_INVISIBILITY | IT_INVULNERABILITY |
|
||||||
|
IT_SUIT | IT_QUAD);
|
||||||
|
|
||||||
// cap super health
|
// cap super health
|
||||||
if(self.health > 100) {
|
self.health = minmax(self.health, 50, 100);
|
||||||
self.health = 100;
|
|
||||||
}
|
|
||||||
if(self.health < 50) {
|
|
||||||
self.health = 50;
|
|
||||||
}
|
|
||||||
parm1 = self.items;
|
parm1 = self.items;
|
||||||
parm2 = self.health;
|
parm2 = self.health;
|
||||||
parm3 = self.armorvalue;
|
parm3 = self.armorvalue;
|
||||||
if(self.ammo_shells < 25) {
|
parm4 = (self.ammo_shells < 25 ? 25 : self.ammo_shells);
|
||||||
parm4 = 25;
|
|
||||||
} else {
|
|
||||||
parm4 = self.ammo_shells;
|
|
||||||
}
|
|
||||||
parm5 = self.ammo_nails;
|
parm5 = self.ammo_nails;
|
||||||
parm6 = self.ammo_rockets;
|
parm6 = self.ammo_rockets;
|
||||||
parm7 = self.ammo_cells;
|
parm7 = self.ammo_cells;
|
||||||
|
@ -239,6 +232,7 @@ void() execute_changelevel = {
|
||||||
other.solid = SOLID_NOT;
|
other.solid = SOLID_NOT;
|
||||||
other.movetype = MOVETYPE_NONE;
|
other.movetype = MOVETYPE_NONE;
|
||||||
other.modelindex = 0;
|
other.modelindex = 0;
|
||||||
|
other.spectating = SPECTATING_INTERMISSION;
|
||||||
setorigin(other, pos.origin);
|
setorigin(other, pos.origin);
|
||||||
other = find(other, classname, "player");
|
other = find(other, classname, "player");
|
||||||
}
|
}
|
||||||
|
@ -295,7 +289,7 @@ void() trigger_changelevel = {
|
||||||
/*
|
/*
|
||||||
=============================================================================
|
=============================================================================
|
||||||
|
|
||||||
PLAYER GAME EDGE FUNCTIONS
|
PLAYER GAME EDGE FUNCTIONS
|
||||||
|
|
||||||
=============================================================================
|
=============================================================================
|
||||||
*/
|
*/
|
||||||
|
@ -304,6 +298,7 @@ void() become_spectator = {
|
||||||
float not_dead;
|
float not_dead;
|
||||||
entity pl;
|
entity pl;
|
||||||
|
|
||||||
|
self.spectating = (self.lives ? SPECTATING_SPECTATING : SPECTATING_DEAD);
|
||||||
self.health = self.max_health;
|
self.health = self.max_health;
|
||||||
self.armortype = 0;
|
self.armortype = 0;
|
||||||
self.armorvalue = 0;
|
self.armorvalue = 0;
|
||||||
|
@ -455,7 +450,7 @@ void() PutClientInServer = {
|
||||||
} else {
|
} else {
|
||||||
bprint(ftos(self.lives), " lives left\n");
|
bprint(ftos(self.lives), " lives left\n");
|
||||||
}
|
}
|
||||||
} else {
|
} else if(self.lives == 0) {
|
||||||
self.lives = sf_lives;
|
self.lives = sf_lives;
|
||||||
dprint("lives reset to ", ftos(sf_lives), "\n");
|
dprint("lives reset to ", ftos(sf_lives), "\n");
|
||||||
}
|
}
|
||||||
|
@ -481,6 +476,7 @@ void() PutClientInServer = {
|
||||||
self.invincible_finished = 0;
|
self.invincible_finished = 0;
|
||||||
self.effects = 0;
|
self.effects = 0;
|
||||||
self.invincible_time = 0;
|
self.invincible_time = 0;
|
||||||
|
self.spectating = SPECTATING_NOT;
|
||||||
|
|
||||||
DecodeLevelParms();
|
DecodeLevelParms();
|
||||||
|
|
||||||
|
@ -524,7 +520,7 @@ void() PutClientInServer = {
|
||||||
/*
|
/*
|
||||||
=============================================================================
|
=============================================================================
|
||||||
|
|
||||||
QUAKED FUNCTIONS
|
QUAKED FUNCTIONS
|
||||||
|
|
||||||
=============================================================================
|
=============================================================================
|
||||||
*/
|
*/
|
||||||
|
@ -620,8 +616,7 @@ Exit deathmatch games upon conditions
|
||||||
============
|
============
|
||||||
*/
|
*/
|
||||||
void() CheckRules = {
|
void() CheckRules = {
|
||||||
float timelimit;
|
float timelimit, fraglimit;
|
||||||
float fraglimit;
|
|
||||||
|
|
||||||
if(gameover) { // someone else quit the game already
|
if(gameover) { // someone else quit the game already
|
||||||
return;
|
return;
|
||||||
|
@ -630,12 +625,8 @@ void() CheckRules = {
|
||||||
timelimit = cvar("timelimit") * 60;
|
timelimit = cvar("timelimit") * 60;
|
||||||
fraglimit = cvar("fraglimit");
|
fraglimit = cvar("fraglimit");
|
||||||
|
|
||||||
if(timelimit && time >= timelimit) {
|
if((timelimit && time >= timelimit) ||
|
||||||
NextLevel();
|
(fraglimit && self.frags >= fraglimit)) {
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(fraglimit && self.frags >= fraglimit) {
|
|
||||||
NextLevel();
|
NextLevel();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -707,17 +698,12 @@ void() PlayerJump = {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!(self.flags & FL_ONGROUND)) {
|
if(!(self.flags & FL_ONGROUND) || !(self.flags & FL_JUMPRELEASED)) {
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!(self.flags & FL_JUMPRELEASED)) {
|
|
||||||
return; // don't pogo stick
|
return; // don't pogo stick
|
||||||
}
|
}
|
||||||
|
|
||||||
self.flags = self.flags - (self.flags & FL_JUMPRELEASED);
|
self.flags -= (self.flags & FL_JUMPRELEASED);
|
||||||
|
self.flags -= FL_ONGROUND; // don't stairwalk
|
||||||
self.flags = self.flags - FL_ONGROUND; // don't stairwalk
|
|
||||||
|
|
||||||
self.button2 = 0;
|
self.button2 = 0;
|
||||||
// player jumping sound
|
// player jumping sound
|
||||||
|
@ -732,11 +718,7 @@ WaterMove
|
||||||
============
|
============
|
||||||
*/
|
*/
|
||||||
void() WaterMove = {
|
void() WaterMove = {
|
||||||
//dprint(ftos(self.waterlevel));
|
if(self.movetype == MOVETYPE_NOCLIP || self.health < 0) {
|
||||||
if(self.movetype == MOVETYPE_NOCLIP) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if(self.health < 0) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -843,13 +825,12 @@ Called every frame before physics are run
|
||||||
================
|
================
|
||||||
*/
|
*/
|
||||||
void() PlayerPreThink = {
|
void() PlayerPreThink = {
|
||||||
|
// otherwise a button could be missed between the think tics
|
||||||
if(intermission_running) {
|
if(intermission_running) {
|
||||||
IntermissionThink(); // otherwise a button could be missed between
|
IntermissionThink();
|
||||||
return; // the think tics
|
return;
|
||||||
}
|
} else if(self.spectating) {
|
||||||
|
return;
|
||||||
if(self.view_ofs == VEC_ORIGIN) {
|
|
||||||
return; // intermission, finale or spectating
|
|
||||||
}
|
}
|
||||||
|
|
||||||
makevectors(self.v_angle); // is this still used
|
makevectors(self.v_angle); // is this still used
|
||||||
|
@ -895,7 +876,7 @@ Check for turning off powerups
|
||||||
================
|
================
|
||||||
*/
|
*/
|
||||||
void() CheckPowerups = {
|
void() CheckPowerups = {
|
||||||
if(self.health <= 0) {
|
if(self.health <= 0 || self.spectating) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1020,16 +1001,18 @@ Called every frame after physics are run
|
||||||
================
|
================
|
||||||
*/
|
*/
|
||||||
void() PlayerPostThink = {
|
void() PlayerPostThink = {
|
||||||
if(self.view_ofs == VEC_ORIGIN) {
|
if(time >= self.attack_finished) {
|
||||||
return; // intermission, finale or spectating
|
ImpulseCommands();
|
||||||
}
|
}
|
||||||
if(self.deadflag) {
|
|
||||||
|
if(self.spectating || self.deadflag) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// do weapon stuff
|
// do weapon stuff
|
||||||
|
if(time >= self.attack_finished) {
|
||||||
W_WeaponFrame();
|
W_WeaponFrame();
|
||||||
|
}
|
||||||
|
|
||||||
// check to see if player landed and play landing sound
|
// check to see if player landed and play landing sound
|
||||||
if(self.jump_flag < -300 && self.flags & FL_ONGROUND && self.health > 0) {
|
if(self.jump_flag < -300 && self.flags & FL_ONGROUND && self.health > 0) {
|
||||||
|
@ -1076,20 +1059,23 @@ called when a player disconnects from a server
|
||||||
============
|
============
|
||||||
*/
|
*/
|
||||||
void() ClientDisconnect = {
|
void() ClientDisconnect = {
|
||||||
|
// if the level end trigger has been activated, just return
|
||||||
|
// since they aren't *really* leaving
|
||||||
if(gameover) {
|
if(gameover) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// if the level end trigger has been activated, just return
|
|
||||||
// since they aren't *really* leaving
|
|
||||||
|
|
||||||
// let everyone else know
|
// let everyone else know
|
||||||
bprint(self.netname, " left the game with ", ftos(self.frags), " frags\n");
|
bprint(self.netname, " left the game with ", ftos(self.frags), " frags\n");
|
||||||
|
|
||||||
|
if(!self.spectating) {
|
||||||
sound(self, CHAN_BODY, "player/tornoff2.wav", 1, ATTN_NONE);
|
sound(self, CHAN_BODY, "player/tornoff2.wav", 1, ATTN_NONE);
|
||||||
set_suicide_frame();
|
set_suicide_frame();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
void() cheat = {
|
void() cheat = {
|
||||||
if((deathmatch || coop) && !sf_cheats) {
|
if(((deathmatch || coop) && !sf_cheats) || self.spectating) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1114,7 +1100,7 @@ void() cheat = {
|
||||||
};
|
};
|
||||||
|
|
||||||
void() cheat_quad = {
|
void() cheat_quad = {
|
||||||
if((deathmatch || coop) && !sf_cheats) {
|
if(((deathmatch || coop) && !sf_cheats) || self.spectating) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1545,7 +1531,7 @@ Player entered the suicide command
|
||||||
============
|
============
|
||||||
*/
|
*/
|
||||||
void() ClientKill = {
|
void() ClientKill = {
|
||||||
if(self.view_ofs != VEC_ORIGIN) {
|
if(!self.spectating) {
|
||||||
reset_death_vel();
|
reset_death_vel();
|
||||||
self.frags--; // extra penalty
|
self.frags--; // extra penalty
|
||||||
ClientObituary(self, self);
|
ClientObituary(self, self);
|
||||||
|
|
|
@ -485,22 +485,6 @@ enum {
|
||||||
WORLD_BASE,
|
WORLD_BASE,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
|
||||||
PRO_NONE,
|
|
||||||
|
|
||||||
// alphabetically sorted, based on pronoun.is and what i've seen used
|
|
||||||
PRO_FAE,
|
|
||||||
PRO_HE,
|
|
||||||
PRO_IT,
|
|
||||||
PRO_SHE,
|
|
||||||
PRO_THEY,
|
|
||||||
PRO_XEY,
|
|
||||||
PRO_ZE_H,
|
|
||||||
PRO_ZE_Z,
|
|
||||||
|
|
||||||
PRO_MAX,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
DOOR_START_OPEN = 1,
|
DOOR_START_OPEN = 1,
|
||||||
DOOR_DONT_LINK = 4,
|
DOOR_DONT_LINK = 4,
|
||||||
|
@ -574,6 +558,23 @@ enum {
|
||||||
SIGIL_4 = 8,
|
SIGIL_4 = 8,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// super co-op additions
|
||||||
|
enum {
|
||||||
|
PRO_NONE,
|
||||||
|
|
||||||
|
// alphabetically sorted, based on pronoun.is and what i've seen used
|
||||||
|
PRO_FAE,
|
||||||
|
PRO_HE,
|
||||||
|
PRO_IT,
|
||||||
|
PRO_SHE,
|
||||||
|
PRO_THEY,
|
||||||
|
PRO_XEY,
|
||||||
|
PRO_ZE_H,
|
||||||
|
PRO_ZE_Z,
|
||||||
|
|
||||||
|
PRO_MAX,
|
||||||
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
SF_CHEATS = 1,
|
SF_CHEATS = 1,
|
||||||
SF_LIVES_BEG = 1,
|
SF_LIVES_BEG = 1,
|
||||||
|
@ -581,6 +582,14 @@ enum {
|
||||||
SF_LIVES_MSK = 14,
|
SF_LIVES_MSK = 14,
|
||||||
SF_DIST_AMMO = 16,
|
SF_DIST_AMMO = 16,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
SPECTATING_NOT,
|
||||||
|
SPECTATING_DEAD,
|
||||||
|
SPECTATING_SPECTATING,
|
||||||
|
SPECTATING_INTERMISSION,
|
||||||
|
SPECTATING_FINALE,
|
||||||
|
};
|
||||||
#pragma noref 0
|
#pragma noref 0
|
||||||
|
|
||||||
// globals -------------------------------------------------------------------|
|
// globals -------------------------------------------------------------------|
|
||||||
|
@ -753,6 +762,7 @@ float ext_con_set;
|
||||||
// super co-op additions
|
// super co-op additions
|
||||||
.float pronoun;
|
.float pronoun;
|
||||||
.float lives;
|
.float lives;
|
||||||
|
.float spectating;
|
||||||
|
|
||||||
// functions -----------------------------------------------------------------|
|
// functions -----------------------------------------------------------------|
|
||||||
|
|
||||||
|
@ -921,4 +931,6 @@ void() func_train_find;
|
||||||
|
|
||||||
void(vector p) boss_missile;
|
void(vector p) boss_missile;
|
||||||
|
|
||||||
|
void() ImpulseCommands;
|
||||||
|
|
||||||
// EOF
|
// EOF
|
||||||
|
|
|
@ -125,6 +125,7 @@ void() finale_1 = {
|
||||||
pl.solid = SOLID_NOT;
|
pl.solid = SOLID_NOT;
|
||||||
pl.movetype = MOVETYPE_NONE;
|
pl.movetype = MOVETYPE_NONE;
|
||||||
pl.modelindex = 0;
|
pl.modelindex = 0;
|
||||||
|
pl.spectating = SPECTATING_FINALE;
|
||||||
setorigin(pl, pos.origin);
|
setorigin(pl, pos.origin);
|
||||||
pl = find(pl, classname, "player");
|
pl = find(pl, classname, "player");
|
||||||
}
|
}
|
||||||
|
|
|
@ -1051,12 +1051,6 @@ Called every frame so impulse events can be handled as well as possible
|
||||||
============
|
============
|
||||||
*/
|
*/
|
||||||
void() W_WeaponFrame = {
|
void() W_WeaponFrame = {
|
||||||
if(time < self.attack_finished) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ImpulseCommands();
|
|
||||||
|
|
||||||
// check for attack
|
// check for attack
|
||||||
if(self.button0) {
|
if(self.button0) {
|
||||||
SuperDamageSound();
|
SuperDamageSound();
|
||||||
|
|
Loading…
Reference in New Issue
Block a user