Rework p_hud.c

This commit is contained in:
Yamagi Burmeister 2011-10-03 08:35:27 +00:00
parent 0f1de339c2
commit 8c084636f8

View file

@ -1,38 +1,44 @@
/* /*
Copyright (C) 1997-2001 Id Software, Inc. * Copyright (C) 1997-2001 Id Software, Inc.
*
This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or modify
modify it under the terms of the GNU General Public License * it under the terms of the GNU General Public License as published by
as published by the Free Software Foundation; either version 2 * the Free Software Foundation; either version 2 of the License, or (at
of the License, or (at your option) any later version. * your option) any later version.
*
This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful, but
but WITHOUT ANY WARRANTY; without even the implied warranty of * WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
See the GNU General Public License for more details. * See the GNU General Public License for more details.
*
You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*
* =======================================================================
*
* HUD, deathmatch scoreboard, help computer and intermission stuff.
*
* =======================================================================
*/ */
#include "g_local.h" #include "g_local.h"
void
MoveClientToIntermission(edict_t *ent)
/*
======================================================================
INTERMISSION
======================================================================
*/
void MoveClientToIntermission (edict_t *ent)
{ {
if (!ent)
{
return;
}
if (deathmatch->value || coop->value) if (deathmatch->value || coop->value)
{
ent->client->showscores = true; ent->client->showscores = true;
}
VectorCopy(level.intermission_origin, ent->s.origin); VectorCopy(level.intermission_origin, ent->s.origin);
ent->client->ps.pmove.origin[0] = level.intermission_origin[0] * 8; ent->client->ps.pmove.origin[0] = level.intermission_origin[0] * 8;
ent->client->ps.pmove.origin[1] = level.intermission_origin[1] * 8; ent->client->ps.pmove.origin[1] = level.intermission_origin[1] * 8;
@ -43,7 +49,7 @@ void MoveClientToIntermission (edict_t *ent)
ent->client->ps.blend[3] = 0; ent->client->ps.blend[3] = 0;
ent->client->ps.rdflags &= ~RDF_UNDERWATER; ent->client->ps.rdflags &= ~RDF_UNDERWATER;
// clean up powerup info /* clean up powerup info */
ent->client->quad_framenum = 0; ent->client->quad_framenum = 0;
ent->client->invincible_framenum = 0; ent->client->invincible_framenum = 0;
ent->client->breather_framenum = 0; ent->client->breather_framenum = 0;
@ -60,35 +66,47 @@ void MoveClientToIntermission (edict_t *ent)
ent->s.sound = 0; ent->s.sound = 0;
ent->solid = SOLID_NOT; ent->solid = SOLID_NOT;
// add the layout /* add the layout */
if (deathmatch->value || coop->value) if (deathmatch->value || coop->value)
{ {
DeathmatchScoreboardMessage(ent, NULL); DeathmatchScoreboardMessage(ent, NULL);
gi.unicast(ent, true); gi.unicast(ent, true);
} }
} }
void BeginIntermission (edict_t *targ) void
BeginIntermission(edict_t *targ)
{ {
int i, n; int i, n;
edict_t *ent, *client; edict_t *ent, *client;
if (!targ)
{
return;
}
if (level.intermissiontime) if (level.intermissiontime)
return; // already activated {
return; /* already activated */
}
game.autosaved = false; game.autosaved = false;
// respawn any dead clients /* respawn any dead clients */
for (i = 0; i < maxclients->value; i++) for (i = 0; i < maxclients->value; i++)
{ {
client = g_edicts + 1 + i; client = g_edicts + 1 + i;
if (!client->inuse) if (!client->inuse)
{
continue; continue;
}
if (client->health <= 0) if (client->health <= 0)
{
respawn(client); respawn(client);
} }
}
level.intermissiontime = level.time; level.intermissiontime = level.time;
level.changemap = targ->map; level.changemap = targ->map;
@ -100,68 +118,82 @@ void BeginIntermission (edict_t *targ)
for (i = 0; i < maxclients->value; i++) for (i = 0; i < maxclients->value; i++)
{ {
client = g_edicts + 1 + i; client = g_edicts + 1 + i;
if (!client->inuse) if (!client->inuse)
{
continue; continue;
// strip players of all keys between units }
/* strip players of all keys between units */
for (n = 0; n < MAX_ITEMS; n++) for (n = 0; n < MAX_ITEMS; n++)
{ {
if (itemlist[n].flags & IT_KEY) if (itemlist[n].flags & IT_KEY)
{
client->client->pers.inventory[n] = 0; client->client->pers.inventory[n] = 0;
} }
} }
} }
} }
}
else else
{ {
if (!deathmatch->value) if (!deathmatch->value)
{ {
level.exitintermission = 1; // go immediately to the next level level.exitintermission = 1; /* go immediately to the next level */
return; return;
} }
} }
level.exitintermission = 0; level.exitintermission = 0;
// find an intermission spot /* find an intermission spot */
ent = G_Find(NULL, FOFS(classname), "info_player_intermission"); ent = G_Find(NULL, FOFS(classname), "info_player_intermission");
if (!ent) if (!ent)
{ // the map creator forgot to put in an intermission point... {
/* the map creator forgot to put in an intermission point... */
ent = G_Find(NULL, FOFS(classname), "info_player_start"); ent = G_Find(NULL, FOFS(classname), "info_player_start");
if (!ent) if (!ent)
{
ent = G_Find(NULL, FOFS(classname), "info_player_deathmatch"); ent = G_Find(NULL, FOFS(classname), "info_player_deathmatch");
} }
}
else else
{ // chose one of four spots {
/* chose one of four spots */
i = rand() & 3; i = rand() & 3;
while (i--) while (i--)
{ {
ent = G_Find(ent, FOFS(classname), "info_player_intermission"); ent = G_Find(ent, FOFS(classname), "info_player_intermission");
if (!ent) // wrap around the list
if (!ent) /* wrap around the list */
{
ent = G_Find(ent, FOFS(classname), "info_player_intermission"); ent = G_Find(ent, FOFS(classname), "info_player_intermission");
} }
} }
}
VectorCopy(ent->s.origin, level.intermission_origin); VectorCopy(ent->s.origin, level.intermission_origin);
VectorCopy(ent->s.angles, level.intermission_angle); VectorCopy(ent->s.angles, level.intermission_angle);
// move all clients to the intermission point /* move all clients to the intermission point */
for (i = 0; i < maxclients->value; i++) for (i = 0; i < maxclients->value; i++)
{ {
client = g_edicts + 1 + i; client = g_edicts + 1 + i;
if (!client->inuse) if (!client->inuse)
{
continue; continue;
}
MoveClientToIntermission(client); MoveClientToIntermission(client);
} }
} }
void
/* DeathmatchScoreboardMessage(edict_t *ent, edict_t *killer)
==================
DeathmatchScoreboardMessage
==================
*/
void DeathmatchScoreboardMessage (edict_t *ent, edict_t *killer)
{ {
char entry[1024]; char entry[1024];
char string[1400]; char string[1400];
@ -176,37 +208,54 @@ void DeathmatchScoreboardMessage (edict_t *ent, edict_t *killer)
edict_t *cl_ent; edict_t *cl_ent;
char *tag; char *tag;
// sort the clients by score if (!ent || !killer)
{
return;
}
/* sort the clients by score */
total = 0; total = 0;
for (i = 0; i < game.maxclients; i++) for (i = 0; i < game.maxclients; i++)
{ {
cl_ent = g_edicts + 1 + i; cl_ent = g_edicts + 1 + i;
if (!cl_ent->inuse || game.clients[i].resp.spectator) if (!cl_ent->inuse || game.clients[i].resp.spectator)
{
continue; continue;
}
score = game.clients[i].resp.score; score = game.clients[i].resp.score;
for (j = 0; j < total; j++) for (j = 0; j < total; j++)
{ {
if (score > sortedscores[j]) if (score > sortedscores[j])
{
break; break;
} }
}
for (k = total; k > j; k--) for (k = total; k > j; k--)
{ {
sorted[k] = sorted[k - 1]; sorted[k] = sorted[k - 1];
sortedscores[k] = sortedscores[k - 1]; sortedscores[k] = sortedscores[k - 1];
} }
sorted[j] = i; sorted[j] = i;
sortedscores[j] = score; sortedscores[j] = score;
total++; total++;
} }
// print level name and exit rules /* print level name and exit rules */
string[0] = 0; string[0] = 0;
stringlength = strlen(string); stringlength = strlen(string);
// add the clients in sorted order /* add the clients in sorted order */
if (total > 12) if (total > 12)
{
total = 12; total = 12;
}
for (i = 0; i < total; i++) for (i = 0; i < total; i++)
{ {
@ -217,31 +266,47 @@ void DeathmatchScoreboardMessage (edict_t *ent, edict_t *killer)
x = (i >= 6) ? 160 : 0; x = (i >= 6) ? 160 : 0;
y = 32 + 32 * (i % 6); y = 32 + 32 * (i % 6);
// add a dogtag /* add a dogtag */
if (cl_ent == ent) if (cl_ent == ent)
{
tag = "tag1"; tag = "tag1";
}
else if (cl_ent == killer) else if (cl_ent == killer)
{
tag = "tag2"; tag = "tag2";
}
else else
{
tag = NULL; tag = NULL;
}
if (tag) if (tag)
{ {
Com_sprintf(entry, sizeof(entry), Com_sprintf(entry, sizeof(entry),
"xv %i yv %i picn %s ", x + 32, y, tag); "xv %i yv %i picn %s ", x + 32, y, tag);
j = strlen(entry); j = strlen(entry);
if (stringlength + j > 1024) if (stringlength + j > 1024)
{
break; break;
}
strcpy(string + stringlength, entry); strcpy(string + stringlength, entry);
stringlength += j; stringlength += j;
} }
// send the layout /* send the layout */
Com_sprintf(entry, sizeof(entry), Com_sprintf(entry, sizeof(entry),
"client %i %i %i %i %i %i ", "client %i %i %i %i %i %i ",
x, y, sorted[i], cl->resp.score, cl->ping, (level.framenum - cl->resp.enterframe)/600); x, y, sorted[i], cl->resp.score, cl->ping,
(level.framenum - cl->resp.enterframe) / 600);
j = strlen(entry); j = strlen(entry);
if (stringlength + j > 1024) if (stringlength + j > 1024)
{
break; break;
}
strcpy(string + stringlength, entry); strcpy(string + stringlength, entry);
stringlength += j; stringlength += j;
} }
@ -250,36 +315,41 @@ void DeathmatchScoreboardMessage (edict_t *ent, edict_t *killer)
gi.WriteString(string); gi.WriteString(string);
} }
/* /*
================== * Draw instead of help message.
DeathmatchScoreboard * Note that it isn't that hard to
* overflow the 1400 byte message limit!
Draw instead of help message.
Note that it isn't that hard to overflow the 1400 byte message limit!
==================
*/ */
void DeathmatchScoreboard (edict_t *ent) void
DeathmatchScoreboard(edict_t *ent)
{ {
if (!ent)
{
return;
}
DeathmatchScoreboardMessage(ent, ent->enemy); DeathmatchScoreboardMessage(ent, ent->enemy);
gi.unicast(ent, true); gi.unicast(ent, true);
} }
/* /*
================== * Display the scoreboard
Cmd_Score_f
Display the scoreboard
==================
*/ */
void Cmd_Score_f (edict_t *ent) void
Cmd_Score_f(edict_t *ent)
{ {
if (!ent)
{
return;
}
ent->client->showinventory = false; ent->client->showinventory = false;
ent->client->showhelp = false; ent->client->showhelp = false;
if (!deathmatch->value && !coop->value) if (!deathmatch->value && !coop->value)
{
return; return;
}
if (ent->client->showscores) if (ent->client->showscores)
{ {
@ -291,35 +361,44 @@ void Cmd_Score_f (edict_t *ent)
DeathmatchScoreboard(ent); DeathmatchScoreboard(ent);
} }
/* /*
================== * Draw help computer.
HelpComputer
Draw help computer.
==================
*/ */
void HelpComputer (edict_t *ent) void
HelpComputer(edict_t *ent)
{ {
char string[1024]; char string[1024];
char *sk; char *sk;
if (skill->value == 0) if (!ent)
sk = "easy"; {
else if (skill->value == 1) return;
sk = "medium"; }
else if (skill->value == 2)
sk = "hard";
else
sk = "hard+";
// send the layout if (skill->value == 0)
{
sk = "easy";
}
else if (skill->value == 1)
{
sk = "medium";
}
else if (skill->value == 2)
{
sk = "hard";
}
else
{
sk = "hard+";
}
/* send the layout */
Com_sprintf(string, sizeof(string), Com_sprintf(string, sizeof(string),
"xv 32 yv 8 picn help " // background "xv 32 yv 8 picn help " /* background */
"xv 202 yv 12 string2 \"%s\" " // skill "xv 202 yv 12 string2 \"%s\" " /* skill */
"xv 0 yv 24 cstring2 \"%s\" " // level name "xv 0 yv 24 cstring2 \"%s\" " /* level name */
"xv 0 yv 54 cstring2 \"%s\" " // help 1 "xv 0 yv 54 cstring2 \"%s\" " /* help 1 */
"xv 0 yv 110 cstring2 \"%s\" " // help 2 "xv 0 yv 110 cstring2 \"%s\" " /* help 2 */
"xv 50 yv 164 string2 \" kills goals secrets\" " "xv 50 yv 164 string2 \" kills goals secrets\" "
"xv 50 yv 172 string2 \"%3i/%3i %i/%i %i/%i\" ", "xv 50 yv 172 string2 \"%3i/%3i %i/%i %i/%i\" ",
sk, sk,
@ -335,17 +414,18 @@ void HelpComputer (edict_t *ent)
gi.unicast(ent, true); gi.unicast(ent, true);
} }
/* /*
================== * Display the current help message
Cmd_Help_f
Display the current help message
==================
*/ */
void Cmd_Help_f (edict_t *ent) void
Cmd_Help_f(edict_t *ent)
{ {
// this is for backwards compatability if (!ent)
{
return;
}
/* this is for backwards compatability */
if (deathmatch->value) if (deathmatch->value)
{ {
Cmd_Score_f(ent); Cmd_Score_f(ent);
@ -355,7 +435,8 @@ void Cmd_Help_f (edict_t *ent)
ent->client->showinventory = false; ent->client->showinventory = false;
ent->client->showscores = false; ent->client->showscores = false;
if (ent->client->showhelp && (ent->client->pers.game_helpchanged == game.helpchanged)) if (ent->client->showhelp &&
(ent->client->pers.game_helpchanged == game.helpchanged))
{ {
ent->client->showhelp = false; ent->client->showhelp = false;
return; return;
@ -366,32 +447,28 @@ void Cmd_Help_f (edict_t *ent)
HelpComputer(ent); HelpComputer(ent);
} }
/* ======================================================================= */
//======================================================================= void
G_SetStats(edict_t *ent)
/*
===============
G_SetStats
===============
*/
void G_SetStats (edict_t *ent)
{ {
gitem_t *item; gitem_t *item;
int index, cells; int index, cells;
int power_armor_type; int power_armor_type;
if (!ent)
{
return;
}
cells = 0; cells = 0;
// /* health */
// health
//
ent->client->ps.stats[STAT_HEALTH_ICON] = level.pic_health; ent->client->ps.stats[STAT_HEALTH_ICON] = level.pic_health;
ent->client->ps.stats[STAT_HEALTH] = ent->health; ent->client->ps.stats[STAT_HEALTH] = ent->health;
// /* ammo */
// ammo if (!ent->client->ammo_index)
//
if (!ent->client->ammo_index /* || !ent->client->pers.inventory[ent->client->ammo_index] */)
{ {
ent->client->ps.stats[STAT_AMMO_ICON] = 0; ent->client->ps.stats[STAT_AMMO_ICON] = 0;
ent->client->ps.stats[STAT_AMMO] = 0; ent->client->ps.stats[STAT_AMMO] = 0;
@ -400,29 +477,34 @@ void G_SetStats (edict_t *ent)
{ {
item = &itemlist[ent->client->ammo_index]; item = &itemlist[ent->client->ammo_index];
ent->client->ps.stats[STAT_AMMO_ICON] = gi.imageindex(item->icon); ent->client->ps.stats[STAT_AMMO_ICON] = gi.imageindex(item->icon);
ent->client->ps.stats[STAT_AMMO] = ent->client->pers.inventory[ent->client->ammo_index]; ent->client->ps.stats[STAT_AMMO] =
ent->client->pers.inventory[ent->client->ammo_index];
} }
cells = 0; cells = 0;
// /* armor */
// armor
//
power_armor_type = PowerArmorType(ent); power_armor_type = PowerArmorType(ent);
if (power_armor_type) if (power_armor_type)
{ {
cells = ent->client->pers.inventory[ITEM_INDEX(FindItem("cells"))]; cells = ent->client->pers.inventory[ITEM_INDEX(FindItem("cells"))];
if (cells == 0) if (cells == 0)
{ // ran out of cells for power armor {
/* ran out of cells for power armor */
ent->flags &= ~FL_POWER_ARMOR; ent->flags &= ~FL_POWER_ARMOR;
gi.sound(ent, CHAN_ITEM, gi.soundindex("misc/power2.wav"), 1, ATTN_NORM, 0); gi.sound(ent, CHAN_ITEM, gi.soundindex(
power_armor_type = 0;; "misc/power2.wav"), 1, ATTN_NORM, 0);
power_armor_type = 0;
} }
} }
index = ArmorIndex(ent); index = ArmorIndex(ent);
if (power_armor_type && (!index || (level.framenum & 8))) if (power_armor_type && (!index || (level.framenum & 8)))
{ // flash between power armor and other armor icon {
/* flash between power armor and other armor icon */
ent->client->ps.stats[STAT_ARMOR_ICON] = gi.imageindex("i_powershield"); ent->client->ps.stats[STAT_ARMOR_ICON] = gi.imageindex("i_powershield");
ent->client->ps.stats[STAT_ARMOR] = cells; ent->client->ps.stats[STAT_ARMOR] = cells;
} }
@ -438,37 +520,38 @@ void G_SetStats (edict_t *ent)
ent->client->ps.stats[STAT_ARMOR] = 0; ent->client->ps.stats[STAT_ARMOR] = 0;
} }
// /* pickup message */
// pickup message
//
if (level.time > ent->client->pickup_msg_time) if (level.time > ent->client->pickup_msg_time)
{ {
ent->client->ps.stats[STAT_PICKUP_ICON] = 0; ent->client->ps.stats[STAT_PICKUP_ICON] = 0;
ent->client->ps.stats[STAT_PICKUP_STRING] = 0; ent->client->ps.stats[STAT_PICKUP_STRING] = 0;
} }
// /* timers */
// timers
//
if (ent->client->quad_framenum > level.framenum) if (ent->client->quad_framenum > level.framenum)
{ {
ent->client->ps.stats[STAT_TIMER_ICON] = gi.imageindex("p_quad"); ent->client->ps.stats[STAT_TIMER_ICON] = gi.imageindex("p_quad");
ent->client->ps.stats[STAT_TIMER] = (ent->client->quad_framenum - level.framenum)/10; ent->client->ps.stats[STAT_TIMER] =
(ent->client->quad_framenum - level.framenum) / 10;
} }
else if (ent->client->invincible_framenum > level.framenum) else if (ent->client->invincible_framenum > level.framenum)
{ {
ent->client->ps.stats[STAT_TIMER_ICON] = gi.imageindex ("p_invulnerability"); ent->client->ps.stats[STAT_TIMER_ICON] = gi.imageindex(
ent->client->ps.stats[STAT_TIMER] = (ent->client->invincible_framenum - level.framenum)/10; "p_invulnerability");
ent->client->ps.stats[STAT_TIMER] =
(ent->client->invincible_framenum - level.framenum) / 10;
} }
else if (ent->client->enviro_framenum > level.framenum) else if (ent->client->enviro_framenum > level.framenum)
{ {
ent->client->ps.stats[STAT_TIMER_ICON] = gi.imageindex("p_envirosuit"); ent->client->ps.stats[STAT_TIMER_ICON] = gi.imageindex("p_envirosuit");
ent->client->ps.stats[STAT_TIMER] = (ent->client->enviro_framenum - level.framenum)/10; ent->client->ps.stats[STAT_TIMER] =
(ent->client->enviro_framenum - level.framenum) / 10;
} }
else if (ent->client->breather_framenum > level.framenum) else if (ent->client->breather_framenum > level.framenum)
{ {
ent->client->ps.stats[STAT_TIMER_ICON] = gi.imageindex("p_rebreather"); ent->client->ps.stats[STAT_TIMER_ICON] = gi.imageindex("p_rebreather");
ent->client->ps.stats[STAT_TIMER] = (ent->client->breather_framenum - level.framenum)/10; ent->client->ps.stats[STAT_TIMER] =
(ent->client->breather_framenum - level.framenum) / 10;
} }
else else
{ {
@ -476,108 +559,144 @@ void G_SetStats (edict_t *ent)
ent->client->ps.stats[STAT_TIMER] = 0; ent->client->ps.stats[STAT_TIMER] = 0;
} }
// /* selected item */
// selected item
//
if (ent->client->pers.selected_item == -1) if (ent->client->pers.selected_item == -1)
{
ent->client->ps.stats[STAT_SELECTED_ICON] = 0; ent->client->ps.stats[STAT_SELECTED_ICON] = 0;
}
else else
ent->client->ps.stats[STAT_SELECTED_ICON] = gi.imageindex (itemlist[ent->client->pers.selected_item].icon); {
ent->client->ps.stats[STAT_SELECTED_ICON] =
gi.imageindex(itemlist[ent->client->pers.selected_item].icon);
}
ent->client->ps.stats[STAT_SELECTED_ITEM] = ent->client->pers.selected_item; ent->client->ps.stats[STAT_SELECTED_ITEM] = ent->client->pers.selected_item;
// /* layouts */
// layouts
//
ent->client->ps.stats[STAT_LAYOUTS] = 0; ent->client->ps.stats[STAT_LAYOUTS] = 0;
if (deathmatch->value) if (deathmatch->value)
{ {
if (ent->client->pers.health <= 0 || level.intermissiontime if ((ent->client->pers.health <= 0) || level.intermissiontime ||
|| ent->client->showscores) ent->client->showscores)
{
ent->client->ps.stats[STAT_LAYOUTS] |= 1; ent->client->ps.stats[STAT_LAYOUTS] |= 1;
if (ent->client->showinventory && ent->client->pers.health > 0) }
if (ent->client->showinventory && (ent->client->pers.health > 0))
{
ent->client->ps.stats[STAT_LAYOUTS] |= 2; ent->client->ps.stats[STAT_LAYOUTS] |= 2;
} }
}
else else
{ {
if (ent->client->showscores || ent->client->showhelp) if (ent->client->showscores || ent->client->showhelp)
{
ent->client->ps.stats[STAT_LAYOUTS] |= 1; ent->client->ps.stats[STAT_LAYOUTS] |= 1;
if (ent->client->showinventory && ent->client->pers.health > 0)
ent->client->ps.stats[STAT_LAYOUTS] |= 2;
} }
// if (ent->client->showinventory && (ent->client->pers.health > 0))
// frags {
// ent->client->ps.stats[STAT_LAYOUTS] |= 2;
}
}
/* frags */
ent->client->ps.stats[STAT_FRAGS] = ent->client->resp.score; ent->client->ps.stats[STAT_FRAGS] = ent->client->resp.score;
// /* help icon / current weapon if not shown */
// help icon / current weapon if not shown
//
if (ent->client->pers.helpchanged && (level.framenum & 8)) if (ent->client->pers.helpchanged && (level.framenum & 8))
{
ent->client->ps.stats[STAT_HELPICON] = gi.imageindex("i_help"); ent->client->ps.stats[STAT_HELPICON] = gi.imageindex("i_help");
else if ( (ent->client->pers.hand == CENTER_HANDED || ent->client->ps.fov > 91) }
&& ent->client->pers.weapon) else if (((ent->client->pers.hand == CENTER_HANDED) ||
(ent->client->ps.fov > 91)) &&
ent->client->pers.weapon)
{ {
cvar_t *gun; cvar_t *gun;
gun = gi.cvar("cl_gun", "2", 0); gun = gi.cvar("cl_gun", "2", 0);
if (gun->value != 2) if (gun->value != 2)
ent->client->ps.stats[STAT_HELPICON] = gi.imageindex (ent->client->pers.weapon->icon); {
else ent->client->ps.stats[STAT_HELPICON] = gi.imageindex(
ent->client->ps.stats[STAT_HELPICON] = 0; ent->client->pers.weapon->icon);
} }
else else
{
ent->client->ps.stats[STAT_HELPICON] = 0; ent->client->ps.stats[STAT_HELPICON] = 0;
}
}
else
{
ent->client->ps.stats[STAT_HELPICON] = 0;
}
ent->client->ps.stats[STAT_SPECTATOR] = 0; ent->client->ps.stats[STAT_SPECTATOR] = 0;
} }
/* void
=============== G_CheckChaseStats(edict_t *ent)
G_CheckChaseStats
===============
*/
void G_CheckChaseStats (edict_t *ent)
{ {
int i; int i;
gclient_t *cl; gclient_t *cl;
for (i = 1; i <= maxclients->value; i++) { if (!ent)
{
return;
}
for (i = 1; i <= maxclients->value; i++)
{
cl = g_edicts[i].client; cl = g_edicts[i].client;
if (!g_edicts[i].inuse || cl->chase_target != ent)
if (!g_edicts[i].inuse || (cl->chase_target != ent))
{
continue; continue;
}
memcpy(cl->ps.stats, ent->client->ps.stats, sizeof(cl->ps.stats)); memcpy(cl->ps.stats, ent->client->ps.stats, sizeof(cl->ps.stats));
G_SetSpectatorStats(g_edicts + i); G_SetSpectatorStats(g_edicts + i);
} }
} }
/* void
=============== G_SetSpectatorStats(edict_t *ent)
G_SetSpectatorStats
===============
*/
void G_SetSpectatorStats (edict_t *ent)
{ {
if (!ent)
{
return;
}
gclient_t *cl = ent->client; gclient_t *cl = ent->client;
if (!cl->chase_target) if (!cl->chase_target)
{
G_SetStats(ent); G_SetStats(ent);
}
cl->ps.stats[STAT_SPECTATOR] = 1; cl->ps.stats[STAT_SPECTATOR] = 1;
// layouts are independant in spectator /* layouts are independant in spectator */
cl->ps.stats[STAT_LAYOUTS] = 0; cl->ps.stats[STAT_LAYOUTS] = 0;
if (cl->pers.health <= 0 || level.intermissiontime || cl->showscores)
cl->ps.stats[STAT_LAYOUTS] |= 1;
if (cl->showinventory && cl->pers.health > 0)
cl->ps.stats[STAT_LAYOUTS] |= 2;
if (cl->chase_target && cl->chase_target->inuse) if ((cl->pers.health <= 0) || level.intermissiontime || cl->showscores)
cl->ps.stats[STAT_CHASE] = CS_PLAYERSKINS + {
(cl->chase_target - g_edicts) - 1; cl->ps.stats[STAT_LAYOUTS] |= 1;
else }
cl->ps.stats[STAT_CHASE] = 0;
if (cl->showinventory && (cl->pers.health > 0))
{
cl->ps.stats[STAT_LAYOUTS] |= 2;
}
if (cl->chase_target && cl->chase_target->inuse)
{
cl->ps.stats[STAT_CHASE] = CS_PLAYERSKINS +
(cl->chase_target - g_edicts) - 1;
}
else
{
cl->ps.stats[STAT_CHASE] = 0;
}
} }