kingpin-sdk/gamesrc/P_HUD.C
2000-03-27 00:00:00 +00:00

1925 lines
49 KiB
C

#include "g_local.h"
#define ENABLE_INDEX_NAMES 1
/*
======================================================================
INTERMISSION
======================================================================
*/
void MoveClientToIntermission (edict_t *ent)
{
if (deathmatch->value || coop->value)
ent->client->showscores = true;
VectorCopy (level.intermission_origin, ent->s.origin);
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[2] = level.intermission_origin[2]*8;
VectorCopy (level.intermission_angle, ent->client->ps.viewangles);
ent->client->ps.pmove.pm_type = PM_FREEZE;
ent->client->ps.gunindex = 0;
ent->client->ps.blend[3] = 0;
ent->client->ps.rdflags &= ~RDF_UNDERWATER;
// clean up powerup info
ent->client->quad_framenum = 0;
ent->client->invincible_framenum = 0;
ent->client->breather_framenum = 0;
ent->client->enviro_framenum = 0;
ent->client->grenade_blew_up = false;
ent->client->grenade_time = 0;
// RAFAEL
ent->client->quadfire_framenum = 0;
// RAFAEL
ent->client->trap_blew_up = false;
ent->client->trap_time = 0;
ent->viewheight = 0;
ent->s.modelindex = 0;
// ent->s.modelindex2 = 0;
// ent->s.modelindex3 = 0;
ent->s.effects = 0;
ent->s.sound = 0;
ent->solid = SOLID_NOT;
// add the layout
if (deathmatch->value || coop->value)
{
DeathmatchScoreboardMessage (ent, NULL);
gi.unicast (ent, true);
}
}
void BeginIntermission (edict_t *targ)
{
int i, n;
edict_t *ent, *client;
if (level.intermissiontime)
return; // already activated
game.autosaved = false;
// respawn any dead clients
for (i=0 ; i<maxclients->value ; i++)
{
client = g_edicts + 1 + i;
if (!client->inuse)
continue;
if (client->health <= 0)
respawn(client);
}
level.intermissiontime = level.time;
level.changemap = targ->map;
if (strstr(level.changemap, "*"))
{
//if (coop->value)
{
for (i=0 ; i<maxclients->value ; i++)
{
client = g_edicts + 1 + i;
if (!client->inuse)
continue;
// strip players of all keys between units
for (n = 0; n < MAX_ITEMS; n++)
{
if (itemlist[n].flags & IT_FLASHLIGHT)
continue;
if (itemlist[n].flags & IT_KEY)
client->client->pers.inventory[n] = 0;
}
client->episode_flags = client->client->pers.episode_flags = 0;
client->client->pers.friends = 0;
level.helpchange = 0;
}
}
// Dan: this should eliminate the need to press a key to exit the end of episode
if (!deathmatch->value)
{
level.exitintermission = 1; // go immediately to the next level
return;
}
}
else
{
if (!deathmatch->value)
{
level.exitintermission = 1; // go immediately to the next level
return;
}
}
level.exitintermission = 0;
// find an intermission spot
ent = G_Find (NULL, FOFS(classname), "info_player_intermission");
if (!ent)
{ // the map creator forgot to put in an intermission point...
ent = G_Find (NULL, FOFS(classname), "info_player_start");
if (!ent)
ent = G_Find (NULL, FOFS(classname), "info_player_deathmatch");
}
else
{ // chose one of four spots
i = rand() & 3;
while (i--)
{
ent = G_Find (ent, FOFS(classname), "info_player_intermission");
if (!ent) // wrap around the list
ent = G_Find (ent, FOFS(classname), "info_player_intermission");
}
}
VectorCopy (ent->s.origin, level.intermission_origin);
VectorCopy (ent->s.angles, level.intermission_angle);
// move all clients to the intermission point
for (i=0 ; i<maxclients->value ; i++)
{
client = g_edicts + 1 + i;
if (!client->inuse)
continue;
MoveClientToIntermission (client);
}
}
/*
==================
GrabDaLootScoreboardMessage
==================
*/
void GrabDaLootScoreboardMessage (edict_t *ent, edict_t *killer)
{
char entry[1024];
char string[1400];
int stringlength;
int i, j, k;
int sorted[MAX_CLIENTS];
int sortedscores[MAX_CLIENTS];
int score, total, real_total;
// int picnum;
int x, y;
gclient_t *cl;
edict_t *cl_ent;
char *tag;
int team;
char *header = "NAME ping hits depst";// score";
char nfill[64];
int yofs=0;
int teamcount[3];
char *selectheader[] =
{
"You are a spectator!",
"Press the corresponding number to join a team.",
"Valid teams are:",
NULL
};
// "%12s - 1 (%i players)"\n%12s - 2\n\n--------------------------------------------------------\n", team_names[1], team_names[2]
x = (-1*strlen(header) - 2) * 10; // 10 pixels per char
string[0] = 0;
stringlength = 0;
if (ent->client->chase_target && ent->client->chase_target->client)
{
ent->client->update_chase = false;
Com_sprintf(entry, sizeof(entry), "xm -80 yb -68 dmstr 773 \"Chasing %s\" xm -230 yb -40 dmstr 552 \".. use [ and ] to cycle, ACTIVATE to disable ..\" ",
ent->client->chase_target->client->pers.netname);
j = strlen(entry);
strcpy (string + stringlength, entry);
stringlength += j;
}
if (!ent->client->showscores)
goto skipscores;
if (!ent->client->pers.team)
{
// count players per team
memset( teamcount, 0, sizeof(int) * 3 );
for (team=1; team<=2; team++)
{
for (i=0 ; i<game.maxclients ; i++)
{
cl_ent = g_edicts + 1 + i;
if (!cl_ent->inuse)
continue;
if (game.clients[i].pers.team != team)
continue;
teamcount[team]++;
}
}
// print the team selection header
for (i=0; selectheader[i]; i++)
{
Com_sprintf (entry, sizeof(entry),
"xm %i yv %i dmstr 999 \"%s\" ",
-5*strlen(selectheader[i]), yofs + (int)(-60.0+-3.5*14), selectheader[i] );
j = strlen(entry);
strcpy (string + stringlength, entry);
stringlength += j;
yofs += 30;
}
// show team counts
for (team=1; team<=2; team++)
{
strcpy( nfill, team_names[team] );
if (strlen(nfill) > 14)
nfill[14] = '\0';
if (strlen(team_names[team]) < 14)
{
for (k=0; k<14-strlen(team_names[team]); k++)
strcat( nfill, " " );
}
Com_sprintf (entry, sizeof(entry),
"xm %i yv %i dmstr 999 \"%i - %s (%i plyrs)\" ",
-15*10, yofs + (int)(-60.0+-3.5*14), team, nfill, teamcount[team] );
j = strlen(entry);
strcpy (string + stringlength, entry);
stringlength += j;
yofs += 20;
}
yofs += 15;
if (!ent->client->chase_target)
{
char *chasecammsg = "[hit ACTIVATE to chase]";
// Chase Cam message
Com_sprintf (entry, sizeof(entry),
"xm %i yb -50 dmstr 773 \"%s\" ",
-5*strlen(chasecammsg), chasecammsg );
j = strlen(entry);
strcpy (string + stringlength, entry);
stringlength += j;
}
}
for (team=1; team<=2; team++)
{
// Team header
Com_sprintf (entry, sizeof(entry),
"xm %i yv %i tscore %i xm %i dmstr 677 \"%s\" teampic %i ",
x+14*10, yofs + (int)(-60.0+-3.5*14), team, x, team_names[team], team );
j = strlen(entry);
strcpy (string + stringlength, entry);
stringlength += j;
// sort the clients by score
total = 0;
for (i=0 ; i<game.maxclients ; i++)
{
cl_ent = g_edicts + 1 + i;
if (!cl_ent->inuse)
continue;
if (game.clients[i].pers.team != team)
continue;
// Tweaked to produce
// score = (int)(1.0*game.clients[i].resp.score + (0.3*game.clients[i].resp.deposited));
score = game.clients[i].resp.deposited + game.clients[i].resp.score; // so it works in games without cash
for (j=0 ; j<total ; j++)
{
if (score > sortedscores[j])
break;
}
for (k=total ; k>j ; k--)
{
sorted[k] = sorted[k-1];
sortedscores[k] = sortedscores[k-1];
}
sorted[j] = i;
sortedscores[j] = score;
total++;
}
real_total = total;
// header
//#if ENABLE_INDEX_NAMES
if (ent->client->pers.version >= 114)
{
// add the clients in sorted order
if (ent->client->pers.team)
{
if (total > 10)
total = 10;
}
else // don't show as much, less space remaining
{
if (total > 7)
total = 7;
}
}
//#else
else
{
if (ent->client->pers.team)
{
if (total > 5)
total = 5;
}
else // don't show as much, less space remaining
{
if (total > 3)
total = 3;
}
}
//#endif
Com_sprintf (entry, sizeof(entry),
"yv %i dmstr 663 \"%s\" ",
yofs + (int)(-60.0+-1.5*14), header );
j = strlen(entry);
strcpy (string + stringlength, entry);
stringlength += j;
for (i=0 ; i<total ; i++)
{
cl = &game.clients[sorted[i]];
cl_ent = g_edicts + 1 + sorted[i];
// picnum = gi.imageindex ("i_fixme");
y = 32 + 32 * i;
if (i < 2)
y -= 16;
if (cl_ent == ent)
tag = "990";
else if (cl_ent == killer)
tag = "960";
else
tag = "999"; // fullbright
//#if ENABLE_INDEX_NAMES
if (ent->client->pers.version >= 114)
{
Com_sprintf (entry, sizeof(entry),
"yv %i ds %s %i %i %i %i ",// %5i\" ", // ~28 chars
yofs + -60+i*16, tag, sorted[i]/*nfill*/, cl->ping, cl->resp.score, cl->resp.deposited/*, sortedscores[i]*/ );
}
//#else
else
{
strcpy( nfill, cl->pers.netname );
if (strlen(nfill) > 12)
nfill[12] = '\0';
if (strlen(cl->pers.netname) < 12)
{
for (k=0; k<12-strlen(cl->pers.netname); k++)
strcat( nfill, " " );
}
Com_sprintf (entry, sizeof(entry),
"yv %i dmstr %s \"%s %4i %4i %5i \" ",// %5i\" ", // 48 chars
yofs + -60+i*16, tag, nfill, cl->ping, cl->resp.score, cl->resp.deposited/*, sortedscores[i]*/ );
}
//#endif
j = strlen(entry);
if (stringlength + j > 1024)
break;
strcpy (string + stringlength, entry);
stringlength += j;
}
if (real_total > total)
{ // show the nuber of undisplayed players
Com_sprintf (entry, sizeof(entry),
"yv %i dmstr 777 \"(%i players)\" ",
yofs + -60+i*16 + 6, real_total );
j = strlen(entry);
if (stringlength + j > 1024)
break;
strcpy (string + stringlength, entry);
stringlength += j;
}
x = -8;
}
skipscores:
// TODO: add the spectators at the bottom
gi.WriteByte (svc_layout);
gi.WriteString (string);
}
/*
==================
DeathmatchScoreboardMessage
==================
*/
void DeathmatchScoreboardMessage (edict_t *ent, edict_t *killer)
{
char entry[1024];
char string[1400];
int stringlength;
int i, j, k;
int sorted[MAX_CLIENTS];
int sortedscores[MAX_CLIENTS];
int score, total, realtotal;
// int picnum;
int /*x,*/ y;
gclient_t *cl;
edict_t *cl_ent;
char *tag;
// Teamplay, divert if teamplay enabled
if (teamplay->value)
{
// switch (teamplay_mode)
{
// case TM_CASHMATCH:
// case TM_GRABDALOOT:
GrabDaLootScoreboardMessage (ent, ent->enemy);
return;
}
}
// sort the clients by score
total = 0;
for (i=0 ; i<game.maxclients ; i++)
{
cl_ent = g_edicts + 1 + i;
if (!cl_ent->inuse)
continue;
score = game.clients[i].resp.score;
if (dm_realmode->value && !teamplay->value)
score -= game.clients[i].resp.deposited;
for (j=0 ; j<total ; j++)
{
if (score > sortedscores[j])
break;
}
for (k=total ; k>j ; k--)
{
sorted[k] = sorted[k-1];
sortedscores[k] = sortedscores[k-1];
}
sorted[j] = i;
sortedscores[j] = score;
total++;
}
// print level name and exit rules
string[0] = 0;
stringlength = strlen(string);
realtotal = total;
//#if ENABLE_INDEX_NAMES && false
// add the clients in sorted order
if (ent->client->pers.version >= 114)
{
if (total > 14)
total = 14;
}
//#else
else
{
if (total > 7)
total = 7;
}
//#endif
// Send the current leader
if (total > 0)
{
Com_sprintf (entry, sizeof(entry),
"leader %i ",
sorted[0] );
j = strlen(entry);
strcpy (string + stringlength, entry);
stringlength += j;
}
// header
//#if ENABLE_INDEX_NAMES && false
if (ent->client->pers.version >= 114)
{
if (dm_realmode->value && !teamplay->value)
{ // show deaths
Com_sprintf (entry, sizeof(entry),
"xr %i yv %i dmstr 442 \"NAME ping hits score\" ",
-36*10 - 10, -60+-2*14 );
}
else // normal
{
Com_sprintf (entry, sizeof(entry),
"xr %i yv %i dmstr 442 \"NAME ping time hits\" ",
-36*10 - 10, -60+-2*14 );
}
}
//#else
else
{
if (dm_realmode->value && !teamplay->value)
{ // show deaths
Com_sprintf (entry, sizeof(entry),
"xr %i yv %i dmstr 442 \" NAME ping hits score\" ",
-36*10 - 10, -60+-2*14 );
}
else // normal
{
Com_sprintf (entry, sizeof(entry),
"xr %i yv %i dmstr 442 \" NAME ping time hits\" ",
-36*10 - 10, -60+-2*14 );
}
}
//#endif
j = strlen(entry);
strcpy (string + stringlength, entry);
stringlength += j;
for (i=0 ; i<total ; i++)
{
cl = &game.clients[sorted[i]];
cl_ent = g_edicts + 1 + sorted[i];
// picnum = gi.imageindex ("i_fixme");
y = 32 + 32 * i;
if (i < 2)
y -= 16;
if (cl_ent == ent)
tag = "990";
else if (cl_ent == killer)
tag = "960";
else
tag = "999"; // fullbright
//#if ENABLE_INDEX_NAMES && false
if (ent->client->pers.version >= 114)
{
if (dm_realmode->value && !teamplay->value)
{ // show deaths
Com_sprintf (entry, sizeof(entry),
"yv %i ds %s %i %i %i %i ",
-60+i*16, tag, sorted[i]/*cl->pers.netname*/, cl->ping, cl->resp.score, sortedscores[i] );
}
else
{
Com_sprintf (entry, sizeof(entry),
"yv %i ds %s %i %i %i %i ",
-60+i*16, tag, sorted[i]/*cl->pers.netname*/, cl->ping, (level.framenum - cl->resp.enterframe)/600, cl->resp.score );
}
}
//#else
else
{
if (dm_realmode->value && !teamplay->value)
{ // show deaths
Com_sprintf (entry, sizeof(entry),
"yv %i dmstr %s \"%16s %4i %3i %4i\" ",
-60+i*16, tag, cl->pers.netname, cl->ping, cl->resp.score, sortedscores[i] );
}
else
{
Com_sprintf (entry, sizeof(entry),
"yv %i dmstr %s \"%16s %4i %3i %4i\" ",
-60+i*16, tag, cl->pers.netname, cl->ping, (level.framenum - cl->resp.enterframe)/600, cl->resp.score );
}
}
//#endif
j = strlen(entry);
if (stringlength + j > 1024)
break;
strcpy (string + stringlength, entry);
stringlength += j;
}
if ((stringlength + 30 < 1024) && realtotal > total)
{
Com_sprintf (entry, sizeof(entry),
"yv %i dmstr 999 \" ( %i total players )\" ",
-60+total*16, realtotal );
j = strlen(entry);
if (stringlength + j < 1024)
{
strcpy (string + stringlength, entry);
stringlength += j;
}
}
gi.WriteByte (svc_layout);
gi.WriteString (string);
}
/*
==================
DeathmatchScoreboard
Draw instead of help message.
Note that it isn't that hard to overflow the 1400 byte message limit!
==================
*/
void DeathmatchScoreboard (edict_t *ent)
{
DeathmatchScoreboardMessage (ent, ent->enemy);
gi.unicast (ent, false);//true);
}
/*
==================
Cmd_Score_f
Display the scoreboard
==================
*/
void Cmd_Score_f (edict_t *ent)
{
ent->client->showinventory = false;
ent->client->showhelp = false;
if (!deathmatch->value && !coop->value)
return;
if (ent->client->showscores)
{
ent->client->showscores = false;
if (!ent->client->chase_target)
return;
}
else
{
ent->client->showscores = true;
}
DeathmatchScoreboard (ent);
}
/*
==================
HelpComputer
Draw help computer.
==================
*/
void HelpComputer (edict_t *ent, int page)
{
char string[1024];
/*char *sk;
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),
"xv 33 yv 7 picnote " // background
"xv 202 yv 12 string2 \"%s\" " // skill
"xv 0 yv 24 cstring2 \"%s\" " // level name
"xv 0 yv 54 cstring2 \"%s\" " // help 1
"xv 0 yv 110 cstring2 \"%s\" " // help 2
"xv 50 yv 164 string2 \" kills goals secrets\" "
"xv 50 yv 172 string2 \"%3i/%3i %i/%i %i/%i\" ",
sk,
level.level_name,
game.helpmessage1,
game.helpmessage2,
level.killed_monsters, level.total_monsters,
level.found_goals, level.total_goals,
level.found_secrets, level.total_secrets);*/
EP_PlayerLog (ent, page);
level.helpchange = 0;
Com_sprintf (string, sizeof(string),
"picnote \"%s\" "
" \"%s\" ",
game.helpmessage1,
game.helpmessage2);
// Com_sprintf (string, sizeof(string),
// "xv 32 yv 8 string2 \"Help screen not yet implemented\" " );
gi.WriteByte (svc_layout);
gi.WriteString (string);
gi.unicast (ent, true);
}
#if 0
/*
==================
HelpComputer
Draw help computer.
==================
*/
void HelpComputer (edict_t *ent)
{
char string[1024];
char *sk;
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),
"xv 32 yv 8 picn help " // background
"xv 202 yv 12 string2 \"%s\" " // skill
"xv 0 yv 24 cstring2 \"%s\" " // level name
"xv 0 yv 54 cstring2 \"%s\" " // help 1
"xv 0 yv 110 cstring2 \"%s\" " // help 2
"xv 50 yv 164 string2 \" kills goals secrets\" "
"xv 50 yv 172 string2 \"%3i/%3i %i/%i %i/%i\" ",
sk,
level.level_name,
game.helpmessage1,
game.helpmessage2,
level.killed_monsters, level.total_monsters,
level.found_goals, level.total_goals,
level.found_secrets, level.total_secrets);
*/
Com_sprintf (string, sizeof(string),
"xv 32 yv 8 string2 \"Help screen not yet implemented\" " );
gi.WriteByte (svc_layout);
gi.WriteString (string);
gi.unicast (ent, true);
}
#endif
/*
==================
Cmd_Help_f
Display the current help message
==================
*/
void Cmd_Help_f (edict_t *ent, int page)
{
// this is for backwards compatability
if (deathmatch->value)
{
Cmd_Score_f (ent);
return;
}
ent->client->showinventory = false;
ent->client->showscores = false;
if (ent->client->showhelp && (ent->client->pers.game_helpchanged == game.helpchanged) && !(page))
{
ent->client->showhelp = false;
return;
}
ent->client->showhelp = true;
ent->client->pers.helpchanged = 0;
HelpComputer (ent, page);
}
//=======================================================================
/*
===============
G_SetStats
===============
*/
void G_SetStats (edict_t *ent)
{
gitem_t *item;
int index, cells;
int power_armor_type;
// if chasecam, show stats of player we are following
if (ent->client->chase_target && ent->client->chase_target->client)
{
memcpy( ent->client->ps.stats, ent->client->chase_target->client->ps.stats, sizeof( ent->client->ps.stats ) );
ent->client->ps.stats[STAT_LAYOUTS] = true;
// make sure they don't gain world ranking stats
ent->client->ps.stats[STAT_FRAGS] = 0;
ent->client->ps.stats[STAT_DEPOSITED] = 0;
return;
}
//
// health
//
// JOSEPH 23-MAR-99
//ent->client->ps.stats[STAT_HEALTH_ICON] = level.pic_health;
{
int index1, index2, index3;
item = FindItem ("Cash");
index1 = ITEM_INDEX (item);
item = FindItem ("Large Cash Bag");
index2 = ITEM_INDEX (item);
item = FindItem ("Small Cash Bag");
index3 = ITEM_INDEX (item);
if (!((ent->client->ps.stats[STAT_PICKUP_STRING] == CS_ITEMS+index1) ||
(ent->client->ps.stats[STAT_PICKUP_STRING] == CS_ITEMS+index2) ||
(ent->client->ps.stats[STAT_PICKUP_STRING] == CS_ITEMS+index3)))
ent->client->ps.stats[STAT_CASH_PICKUP] = 0;
// JOSEPH 1-APR-99-B
item = FindItem ("Helmet Armor");
ent->client->ps.stats[STAT_ARMOR1] = ent->client->pers.inventory[ITEM_INDEX(item)];
item = FindItem ("Jacket Armor");
ent->client->ps.stats[STAT_ARMOR2] = ent->client->pers.inventory[ITEM_INDEX(item)];
item = FindItem ("Legs Armor");
ent->client->ps.stats[STAT_ARMOR3] = ent->client->pers.inventory[ITEM_INDEX(item)];
item = FindItem ("Helmet Armor Heavy");
if (ent->client->pers.inventory[ITEM_INDEX(item)])
ent->client->ps.stats[STAT_ARMOR1] = ent->client->pers.inventory[ITEM_INDEX(item)] + 1024;
item = FindItem ("Jacket Armor heavy");
if (ent->client->pers.inventory[ITEM_INDEX(item)])
ent->client->ps.stats[STAT_ARMOR2] = ent->client->pers.inventory[ITEM_INDEX(item)] + 1024;
item = FindItem ("Legs Armor Heavy");
if (ent->client->pers.inventory[ITEM_INDEX(item)])
ent->client->ps.stats[STAT_ARMOR3] = ent->client->pers.inventory[ITEM_INDEX(item)] + 1024;
// END JOSEPH
}
// END JOSEPH
ent->client->ps.stats[STAT_HEALTH] = ent->health;
//
// ammo
//
// JOSEPH 28-APR-99
if (!level.bar_lvl)
{
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] = 0;
}
else
{
item = &itemlist[ent->client->ammo_index];
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];
}
// RAFAEL 01-11-99
// JOSEPH 9-MAR-99
if (ent->client->ammo_index)
{
item = &itemlist[ent->client->ammo_index];
}
else
{
item = NULL;
}
if ((item) && (item->pickup_name) && (/*(!strcmp(item->pickup_name, "Rockets")) ||*/ ((!strcmp(item->pickup_name, "Gas")))))
{
ent->client->ps.stats[STAT_CLIP] = -1;
}
else
{
// ent->client->ps.stats[STAT_CLIP_ICON] = gi.imageindex (clipname);
ent->client->ps.stats[STAT_CLIP] = ent->client->pers.weapon_clip[ent->client->clip_index];
}
}
else
{
ent->client->ps.stats[STAT_AMMO_ICON] = 0;
ent->client->ps.stats[STAT_AMMO] = 0;
ent->client->ps.stats[STAT_CLIP] = -1;
}
// END JOSEPH
//
// money
//
// Ridah, 26-may-99, show frag count
if (deathmatch->value && !teamplay->value)
ent->client->ps.stats[STAT_CASH] = ent->client->resp.score;
else // show cash
ent->client->ps.stats[STAT_CASH] = ent->client->pers.currentcash;
if (level.pawn_time)
ent->client->ps.stats[STAT_FORCE_HUD] = 1;
else
ent->client->ps.stats[STAT_FORCE_HUD] = 0;
// END JOSEPH
// JOSEPH 4-MAR-99
if ((level.cut_scene_time) || (level.fadeendtime > level.time))
ent->client->ps.stats[STAT_HIDE_HUD] = 1;
else
ent->client->ps.stats[STAT_HIDE_HUD] = 0;
// END JOSEPH
if ((level.cut_scene_time || level.cut_scene_end_count) && level.cut_scene_camera_switch)
ent->client->ps.stats[STAT_SWITCH_CAMERA] = 1;
else
ent->client->ps.stats[STAT_SWITCH_CAMERA] = 0;
// END JOSEPH
// JOSEPH 2-FEB-99
if (level.time > ent->client->hud_enemy_talk_time)
{
ent->client->ps.stats[STAT_HUD_ENEMY_TALK] = 0;
}
else if ((ent->client->hud_enemy_talk_time - level.time) > 1.0)
{
ent->client->ps.stats[STAT_HUD_ENEMY_TALK_TIME] = 255;
}
else
{
ent->client->ps.stats[STAT_HUD_ENEMY_TALK_TIME] =
(short)((255.0/1.0)*(ent->client->hud_enemy_talk_time - level.time));
if (ent->client->ps.stats[STAT_HUD_ENEMY_TALK_TIME] < 0)
ent->client->ps.stats[STAT_HUD_ENEMY_TALK_TIME] = 0;
}
if (level.time > ent->client->hud_self_talk_time)
{
ent->client->ps.stats[STAT_HUD_SELF_TALK] = 0;
}
else if ((ent->client->hud_self_talk_time - level.time) > 1.0)
{
ent->client->ps.stats[STAT_HUD_SELF_TALK_TIME] = 255;
}
else
{
ent->client->ps.stats[STAT_HUD_SELF_TALK_TIME] =
(short)((255.0/1.0)*(ent->client->hud_self_talk_time - level.time));
if (ent->client->ps.stats[STAT_HUD_SELF_TALK_TIME] < 0)
ent->client->ps.stats[STAT_HUD_SELF_TALK_TIME] = 0;
}
// END JOSEPH
// JOSEPH 16-FEB-99
{
cast_memory_t *mem;
int firsthire = 0;
int i;
edict_t *theent;
ent->client->ps.stats[STAT_HUD_HIRE1] = 0;
ent->client->ps.stats[STAT_HUD_HIRE2] = 0;
theent = &g_edicts[0];
for (i=0 ; i<globals.num_edicts ; i++, theent++)
{
if (!theent->inuse)
continue;
if ((theent->leader) && (theent->leader == ent))
{
mem = level.global_cast_memory[theent->character_index][ent->character_index];
if (!mem)
continue;
if (mem->flags & MEMORY_HIRED)
{
if (!firsthire)
{
if (theent->health > 0)
{
// JOSEPH 28-APR-99
ent->client->ps.stats[STAT_HUD_HIRE1] = (int)((100.0/(float)theent->max_health)*((float)theent->health));
// END JOSEPH
if ((theent->enemy) && (theent->enemy->health > 0))
{
ent->client->ps.stats[STAT_HUD_HIRE1_CMD] = 3;
}
else if (theent->cast_info.aiflags & AI_MOVEOUT || theent->cast_info.aiflags & AI_DOKEY)
{
ent->client->ps.stats[STAT_HUD_HIRE1_CMD] = 1;
}
else if (theent->cast_info.aiflags & AI_HOLD_POSITION)
{
ent->client->ps.stats[STAT_HUD_HIRE1_CMD] = 2;
}
else
{
ent->client->ps.stats[STAT_HUD_HIRE1_CMD] = 0;
}
firsthire = 1;
}
}
else
{
if (theent->health > 0)
{
// JOSEPH 28-APR-99
ent->client->ps.stats[STAT_HUD_HIRE2] = (int)((100.0/(float)theent->max_health)*((float)theent->health));
// END JOSEPH
if ((theent->enemy) && (theent->enemy->health > 0))
{
ent->client->ps.stats[STAT_HUD_HIRE1_CMD] = 3;
}
else if (theent->cast_info.aiflags & AI_MOVEOUT || theent->cast_info.aiflags & AI_DOKEY)
{
ent->client->ps.stats[STAT_HUD_HIRE2_CMD] = 1;
}
else if (theent->cast_info.aiflags & AI_HOLD_POSITION)
{
ent->client->ps.stats[STAT_HUD_HIRE2_CMD] = 2;
}
else
{
ent->client->ps.stats[STAT_HUD_HIRE2_CMD] = 0;
}
}
break;
}
}
}
}
}
// END JOSEPH
// JOSEPH 4-FEB-99-C
ent->client->ps.stats[STAT_HUD_INV] = 0;
if (ent->client->pers.inventory[ITEM_INDEX(FindItem ("Battery"))])
ent->client->ps.stats[STAT_HUD_INV] |= 1;
if (ent->client->pers.inventory[ITEM_INDEX(FindItem ("Coil"))])
ent->client->ps.stats[STAT_HUD_INV] |= 2;
// JOSEPH 17-MAR-99
if (ent->client->pers.inventory[ITEM_INDEX(FindItem ("Watch"))])
ent->client->ps.stats[STAT_HUD_INV] |= 4;
// END JOSEPH
if (ent->client->pers.inventory[ITEM_INDEX(FindItem ("Safe docs"))])
ent->client->ps.stats[STAT_HUD_INV] |= 8;
if (ent->client->pers.inventory[ITEM_INDEX(FindItem ("Fuse"))])
ent->client->ps.stats[STAT_HUD_INV] |= 16;
if (ent->client->pers.inventory[ITEM_INDEX(FindItem ("Valve"))])
ent->client->ps.stats[STAT_HUD_INV] |= 32;
// END JOSEPH
// JOSEPH 10-JUN-99
if (ent->client->pers.inventory[ITEM_INDEX(FindItem ("Lizzy Head"))])
ent->client->ps.stats[STAT_HUD_INV] |= 64;
if (ent->client->pers.inventory[ITEM_INDEX(FindItem ("Whiskey"))])
ent->client->ps.stats[STAT_HUD_INV] |= 128;
if (ent->client->pers.inventory[ITEM_INDEX(FindItem ("Oil Can"))])
ent->client->ps.stats[STAT_HUD_INV] |= 256;
if (ent->client->pers.inventory[ITEM_INDEX(FindItem ("Ticket"))])
ent->client->ps.stats[STAT_HUD_INV] |= 512;
// END JOSEPH
//
// armor
//
power_armor_type = PowerArmorType (ent);
if (power_armor_type)
{
cells = ent->client->pers.inventory[ITEM_INDEX(FindItem ("Gas"))];
if (cells == 0)
{ // ran out of cells for power armor
ent->flags &= ~FL_POWER_ARMOR;
gi.sound(ent, CHAN_ITEM, gi.soundindex("misc/power2.wav"), 1, ATTN_NORM, 0);
power_armor_type = 0;;
}
}
index = ArmorIndex (ent);
// JOSEPH 1-APR-99
/*if (power_armor_type && (!index || (level.framenum & 8) ) )
{ // 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] = cells;
}
else if (index)
{
item = GetItemByIndex (index);
ent->client->ps.stats[STAT_ARMOR_ICON] = gi.imageindex (item->icon);
ent->client->ps.stats[STAT_ARMOR] = ent->client->pers.inventory[index];
}
else
{
// ent->client->ps.stats[STAT_ARMOR_ICON] = 0;
ent->client->ps.stats[STAT_ARMOR] = 0;
}*/
// END JOSEPH
//
// pickup message
//
// JOSEPH 25-JAN-99
if (level.time > ent->client->pickup_msg_time)
{
ent->client->ps.stats[STAT_PICKUP_ICON] = 0;
ent->client->ps.stats[STAT_PICKUP_STRING] = 0;
ent->client->ps.stats[STAT_PICKUP_COUNT] = 0;
}
else if ((ent->client->pickup_msg_time - level.time) > 1.5)
{
ent->client->ps.stats[STAT_PICKUP_COUNT] = 255;
}
else
{
ent->client->ps.stats[STAT_PICKUP_COUNT] =
(short)((255.0/1.5)*(ent->client->pickup_msg_time - level.time));
if (ent->client->ps.stats[STAT_PICKUP_COUNT] < 0)
ent->client->ps.stats[STAT_PICKUP_COUNT] = 0;
}
// END JOSEPH
//
// timers
//
// JOSEPH 12-MAY-99-B
/*
if (ent->client->quad_framenum > level.framenum)
{
ent->client->ps.stats[STAT_TIMER_ICON] = gi.imageindex ("p_quad");
ent->client->ps.stats[STAT_TIMER] = (ent->client->quad_framenum - level.framenum)/10;
}
// RAFAEL
else if (ent->client->quadfire_framenum > level.framenum)
{
// note to self
// need to change imageindex
ent->client->ps.stats[STAT_TIMER_ICON] = gi.imageindex ("p_quadfire");
ent->client->ps.stats[STAT_TIMER] = (ent->client->quadfire_framenum - level.framenum)/10;
}
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] = (ent->client->invincible_framenum - level.framenum)/10;
}
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] = (ent->client->enviro_framenum - level.framenum)/10;
}
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] = (ent->client->breather_framenum - level.framenum)/10;
}
else
{
ent->client->ps.stats[STAT_TIMER_ICON] = 0;
ent->client->ps.stats[STAT_TIMER] = 0;
}
*/
// END JOSEPH
//
// selected item
//
// JOSEPH 1-APR-99
/*if (ent->client->pers.selected_item == -1)
ent->client->ps.stats[STAT_SELECTED_ICON] = 0;
else
ent->client->ps.stats[STAT_SELECTED_ICON] = gi.imageindex (itemlist[ent->client->pers.selected_item].icon);
*/
// END JOSEPH
ent->client->ps.stats[STAT_SELECTED_ITEM] = ent->client->pers.selected_item;
//
// layouts
//
ent->client->ps.stats[STAT_LAYOUTS] = 0;
if (deathmatch->value)
{
if (ent->client->pers.health <= 0 || level.intermissiontime
|| ent->client->showscores)
ent->client->ps.stats[STAT_LAYOUTS] |= 1;
if (ent->client->showinventory && ent->client->pers.health > 0)
ent->client->ps.stats[STAT_LAYOUTS] |= 2;
}
else
{
if (ent->client->showscores || ent->client->showhelp)
ent->client->ps.stats[STAT_LAYOUTS] |= 1;
if (ent->client->showinventory && ent->client->pers.health > 0)
ent->client->ps.stats[STAT_LAYOUTS] |= 2;
}
//
// frags
//
ent->client->ps.stats[STAT_FRAGS] = ent->client->resp.score;
ent->client->ps.stats[STAT_DEPOSITED] = ent->client->resp.deposited;
//
// help icon / current weapon if not shown
//
if (ent->client->resp.helpchanged && (level.framenum&8) )
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)
ent->client->ps.stats[STAT_HELPICON] = gi.imageindex (ent->client->pers.weapon->icon);
else
ent->client->ps.stats[STAT_HELPICON] = 0;
// JOSEPH 14-JUN-99
ent->client->ps.stats[STAT_HELPICON] = level.helpchange;
// END JOSEPH
// Teamplay
if (deathmatch->value && teamplay->value)
{
int i;
// show team scores
for (i=0; i<2; i++)
{
ent->client->ps.stats[STAT_TEAM1_SCORE + i] = team_cash[1+i]; // set score
ent->client->ps.stats[STAT_TEAM1_FLASH + i] = 0; // set normal
if (last_safe_withdrawal[i+1] > last_safe_deposit[i+1])
{
if (last_safe_withdrawal[i+1] > (level.time - 3.0))
ent->client->ps.stats[STAT_TEAM1_FLASH + i] = 2; // flash red
}
else
{
if (last_safe_deposit[i+1] > (level.time - 3.0))
ent->client->ps.stats[STAT_TEAM1_FLASH + i] = 1; // flash green
}
}
// show bagged cash
ent->client->ps.stats[STAT_BAGCASH] = ent->client->pers.bagcash;
}
}
// JOSEPH 16-DEC-98
// RAFAEL
/*void BeginCutScene (edict_t *ent)
{
edict_t *player;
player = g_edicts + 1;
level.cut_scene_time = level.time + 0.1;
VectorCopy (ent->s.angles, level.cut_scene_angle);
VectorCopy (ent->s.origin, level.cut_scene_origin);
VectorCopy (player->s.origin, level.player_oldpos);
VectorCopy (player->s.angles, level.player_oldang);
MoveClientToCutScene (player);
}*/
void FollowEnt (edict_t *ent)
{
/*if (ent->target2_ent)
{
vec3_t forward, right, up, forward2, right2, up2, avect, avect2;
AngleVectors (ent->s.origin, forward, right, up);
AngleVectors (ent->target2_ent->s.origin, forward2, right2, up2);
avect[0] = ((forward[0] + right[0] + up[0]))/3;
avect[1] = ((forward[1] + right[1] + up[1]))/3;
avect[2] = ((forward[2] + right[2] + up[2]))/3;
avect2[0] = ((forward2[0] + right2[0] + up2[0]))/3;
avect2[1] = ((forward2[1] + right2[1] + up2[1]))/3;
avect2[2] = ((forward2[2] + right2[2] + up2[2]))/3;
VectorSubtract(avect, avect2, avect);
VectorNormalize(avect);
vectoangles(avect, ent->s.angles);
}*/
if (ent->target2_ent)
{
// vec3_t forward, forward2;
vec3_t avect;
// Ridah, not sure how this is supposed to work, doesn't make sense to do an AngleVectors() call on an origin
// AngleVectors (ent->s.origin, forward, NULL, NULL);
// AngleVectors (ent->target2_ent->s.origin, forward2, NULL, NULL);
// VectorSubtract(forward, forward2, avect);
VectorSubtract(ent->target2_ent->s.origin, ent->s.origin, avect);
VectorNormalize(avect);
vectoangles(avect, ent->s.angles);
}
}
// JOSEPH 23-FEB-99
void BeginCutScene (edict_t *ent)
{
edict_t *player;
player = g_edicts + 1;
level.cut_scene_camera_switch = 1;
level.cut_scene_time = level.time + 0.1;
VectorCopy(ent->s.angles, ent->save_avel);
VectorCopy(ent->s.origin, ent->savecameraorigin);
if (ent->cameraangle[0])
{
ent->s.angles[0] += ent->cameraangle[0];
}
if (ent->cameraangle[1])
{
ent->s.angles[1] += ent->cameraangle[1];
}
if (ent->cameraangle[2])
{
ent->s.angles[2] += ent->cameraangle[2];
}
FollowEnt (ent);
VectorCopy (ent->s.angles, level.cut_scene_angle);
VectorCopy (ent->s.origin, level.cut_scene_origin);
VectorCopy (player->s.origin, level.player_oldpos);
VectorCopy (player->s.angles, level.player_oldang);
MoveClientToCutSceneCamera (player, ent->deadticks);
}
void NewCutSceneCamera (edict_t *ent)
{
edict_t *player;
player = g_edicts + 1;
level.cut_scene_camera_switch = 1;
VectorCopy(ent->s.angles, ent->save_avel);
VectorCopy(ent->s.origin, ent->savecameraorigin);
level.cut_scene_time = level.time + 0.1;
// JOSEPH 19-MAR-99-B
ent->alphalevel = level.time + ent->reactdelay;
// END JOSEPH
if (ent->cameraangle[0])
{
ent->s.angles[0] += ent->cameraangle[0];
}
if (ent->cameraangle[1])
{
ent->s.angles[1] += ent->cameraangle[1];
}
if (ent->cameraangle[2])
{
ent->s.angles[2] += ent->cameraangle[2];
}
FollowEnt (ent);
VectorCopy (ent->s.angles, level.cut_scene_angle);
VectorCopy (ent->s.origin, level.cut_scene_origin);
MoveClientToCutSceneCamera (player, ent->deadticks);
}
void AdjustCutSceneCamera(edict_t *ent)
{
edict_t *player;
player = g_edicts + 1;
if (ent->accel)
{
if (ent->delay < (level.time - ent->timestamp))
{
if ((ent->delay + ent->reactdelay) < (level.time - ent->timestamp))
{
if (ent->speed > 0)
{
ent->speed -= ent->decel * FRAMETIME;
if (ent->speed < 0)
ent->speed = 0;
}
}
else if (ent->speed < 1)
{
ent->speed += ent->accel * FRAMETIME;
if (ent->speed > 1)
ent->speed = 1;
}
}
}
level.cut_scene_camera_switch = 0;
level.cut_scene_time = level.time + 0.1;
if (ent->rotate[0])
{
ent->s.angles[0] += ent->rotate[0]*FRAMETIME*ent->speed;
}
if (ent->rotate[1])
{
ent->s.angles[1] += ent->rotate[1]*FRAMETIME*ent->speed;
}
if (ent->rotate[2])
{
ent->s.angles[2] += ent->rotate[2]*FRAMETIME*ent->speed;
}
// Ridah, not sure what ->save_avel is, but we need a way of setting an absolute velocity
VectorMA(ent->s.origin, FRAMETIME*ent->speed, ent->cameravel, ent->s.origin);
/*
if (ent->cameravel[0])
{
vec3_t forward;
AngleVectors (ent->save_avel, forward, NULL, NULL);
VectorMA(ent->s.origin, ent->cameravel[0]*FRAMETIME, forward, ent->s.origin);
}
if (ent->cameravel[1])
{
vec3_t right;
AngleVectors (ent->save_avel, NULL, right, NULL);
VectorMA(ent->s.origin, ent->cameravel[1]*FRAMETIME, right, ent->s.origin);
}
if (ent->cameravel[2])
{
vec3_t up;
AngleVectors (ent->save_avel, NULL, NULL, up);
VectorMA(ent->s.origin, ent->cameravel[2]*FRAMETIME, up, ent->s.origin);
}
*/
if (ent->cameravelrel[0])
{
vec3_t forward;
AngleVectors (ent->s.angles, forward, NULL, NULL);
VectorMA(ent->s.origin, ent->cameravelrel[0]*FRAMETIME*ent->speed, forward, ent->s.origin);
}
if (ent->cameravelrel[1])
{
vec3_t right;
AngleVectors (ent->s.angles, NULL, right, NULL);
VectorMA(ent->s.origin, ent->cameravelrel[1]*FRAMETIME*ent->speed, right, ent->s.origin);
}
if (ent->cameravelrel[2])
{
vec3_t up;
AngleVectors (ent->s.angles, NULL, NULL, up);
VectorMA(ent->s.origin, ent->cameravelrel[2]*FRAMETIME*ent->speed, up, ent->s.origin);
}
FollowEnt (ent);
VectorCopy (ent->s.angles, level.cut_scene_angle);
VectorCopy (ent->s.origin, level.cut_scene_origin);
//VectorCopy (ent->s.origin, ent->origin);
//VectorCopy (ent->s.origin, ent->oldorigin);
//VectorCopy (player->s.origin, level.player_oldpos);
//VectorCopy (player->s.angles, level.player_oldang);
// JOSEPH 19-MAR-99-B
// Fade out
if (ent->duration)
{
if ((level.time + ent->duration) > ent->alphalevel)
{
level.totalfade = ent->duration;
level.fadeendtime = level.time + level.totalfade;
level.inversefade = 1;
ent->duration = 0;
}
}
// END JOSEPH
MoveClientToCutSceneCamera (player, ent->deadticks);
}
void EndCutScene (edict_t *ent)
{
edict_t *player;
player = g_edicts + 1;
level.cut_scene_camera_switch = 0;
player->client->ps.fov = 90;
VectorCopy (level.player_oldpos, player->s.origin);
VectorCopy (level.player_oldang, player->s.angles);
// JOSEPH 24-FEB-99
level.cut_scene_camera_switch = 1;
level.cut_scene_end_count = 5;
// END JOSEPH
level.cut_scene_time = 0;
player->client->ps.pmove.origin[0] = player->s.origin[0]*8;
player->client->ps.pmove.origin[1] = player->s.origin[1]*8;
player->client->ps.pmove.origin[2] = player->s.origin[2]*8;
VectorCopy (level.player_oldang, player->client->ps.viewangles);
if (!player->client->pers.weapon)
return;
{
int i;
if (!strcmp (player->client->pers.weapon->pickup_name , "SPistol"))
{
if ((player->client->pers.pistol_mods) && (player->client->pers.pistol_mods & WEAPON_MOD_DAMAGE))
player->client->ps.gunindex = gi.modelindex("models/weapons/silencer_mdx/magnum.mdx");
else
player->client->ps.gunindex = gi.modelindex(player->client->pers.weapon->view_model);
}
else if (!strcmp (player->client->pers.weapon->pickup_name , "Pistol"))
{
if ((player->client->pers.pistol_mods) && (player->client->pers.pistol_mods & WEAPON_MOD_DAMAGE))
player->client->ps.gunindex = gi.modelindex("models/weapons/v_colt/magnum.mdx");
else
player->client->ps.gunindex = gi.modelindex(player->client->pers.weapon->view_model);
}
else if (!strcmp (player->client->pers.weapon->pickup_name, "Heavy machinegun"))
{
if (player->client->pers.pistol_mods & WEAPON_MOD_COOLING_JACKET)
player->client->ps.gunindex = gi.modelindex("models/weapons/v_hmgcool/hmgcool.mdx");
else
player->client->ps.gunindex = gi.modelindex(player->client->pers.weapon->view_model);
}
else
player->client->ps.gunindex = gi.modelindex(player->client->pers.weapon->view_model);
memset(&(player->client->ps.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS);
player->client->ps.num_parts++;
// player->client->ps.model_parts[PART_HEAD].modelindex = gi.modelindex(player->client->pers.weapon->view_model);
player->client->ps.model_parts[PART_HEAD].modelindex = player->client->ps.gunindex;
for (i=0; i<MAX_MODELPART_OBJECTS; i++)
player->client->ps.model_parts[PART_HEAD].skinnum[i] = 0; // will we have more than one skin???
// HACK, set arm model
if (!strcmp(player->client->pers.weapon->pickup_name, "Shotgun"))
{
player->client->ps.num_parts++;
player->client->ps.model_parts[PART_BODY].modelindex = gi.modelindex("models/weapons/shotgun/hand.mdx");
for (i=0; i<MAX_MODELPART_OBJECTS; i++)
player->client->ps.model_parts[PART_BODY].skinnum[i] = 0; // will we have more than one skin???
player->client->ps.num_parts++;
player->client->ps.model_parts[PART_LEGS].modelindex = gi.modelindex("models/weapons/shotgun/shell.mdx");
for (i=0; i<MAX_MODELPART_OBJECTS; i++)
player->client->ps.model_parts[PART_LEGS].skinnum[i] = 0; // will we have more than one skin???
}
else if (!strcmp(player->client->pers.weapon->pickup_name, "Pipe"))
{
player->client->ps.num_parts++;
player->client->ps.model_parts[PART_BODY].modelindex = gi.modelindex("models/weapons/blakjak/hand.mdx");
for (i=0; i<MAX_MODELPART_OBJECTS; i++)
player->client->ps.model_parts[PART_BODY].skinnum[i] = 0; // will we have more than one skin???
}
else if (!strcmp(player->client->pers.weapon->pickup_name, "Crowbar"))
{
player->client->ps.num_parts++;
player->client->ps.model_parts[PART_BODY].modelindex = gi.modelindex("models/weapons/crowbar/hand.mdx");
for (i=0; i<MAX_MODELPART_OBJECTS; i++)
player->client->ps.model_parts[PART_BODY].skinnum[i] = 0; // will we have more than one skin???
}
else if (!strcmp(player->client->pers.weapon->pickup_name, "FlameThrower"))
{
player->client->ps.num_parts++;
player->client->ps.model_parts[PART_BODY].modelindex = gi.modelindex("models/weapons/v_flamegun/hand.mdx");
for (i=0; i<MAX_MODELPART_OBJECTS; i++)
player->client->ps.model_parts[PART_BODY].skinnum[i] = 0; // will we have more than one skin???
}
// JOSEPH 4-MAR-99
else if (!strcmp(player->client->pers.weapon->pickup_name, "Bazooka"))
{
player->client->ps.num_parts++;
player->client->ps.model_parts[PART_BODY].modelindex = gi.modelindex("models/weapons/v_rocket_launcher/hand.mdx");
for (i=0; i<MAX_MODELPART_OBJECTS; i++)
player->client->ps.model_parts[PART_BODY].skinnum[i] = 0; // will we have more than one skin???
player->client->ps.num_parts++;
player->client->ps.model_parts[PART_LEGS].modelindex = gi.modelindex("models/weapons/v_rocket_launcher/shell_a.mdx");
for (i=0; i<MAX_MODELPART_OBJECTS; i++)
player->client->ps.model_parts[PART_LEGS].skinnum[i] = 0; // will we have more than one skin???
/*
// note to self: not using this anymore
player->client->ps.num_parts++;
player->client->ps.model_parts[PART_GUN].modelindex = gi.modelindex("models/weapons/v_rocket_launcher/shell_b.mdx");
for (i=0; i<MAX_MODELPART_OBJECTS; i++)
player->client->ps.model_parts[PART_GUN].skinnum[i] = 0; // will we have more than one skin???
*/
player->client->ps.num_parts++;
player->client->ps.model_parts[PART_GUN2].modelindex = gi.modelindex("models/weapons/v_rocket_launcher/clip.mdx");
for (i=0; i<MAX_MODELPART_OBJECTS; i++)
player->client->ps.model_parts[PART_GUN2].skinnum[i] = 0; // will we have more than one skin???
}
// END JOSEPH
else if (!strcmp (player->client->pers.weapon->pickup_name , "SPistol"))
{
player->client->ps.num_parts++;
player->client->ps.model_parts[PART_BODY].modelindex = gi.modelindex("models/weapons/silencer_mdx/handl.mdx");
for (i=0; i<MAX_MODELPART_OBJECTS; i++)
player->client->ps.model_parts[PART_BODY].skinnum[i] = 0; // will we have more than one skin???
player->client->ps.num_parts++;
player->client->ps.model_parts[PART_LEGS].modelindex = gi.modelindex("models/weapons/silencer_mdx/handr.mdx");
for (i=0; i<MAX_MODELPART_OBJECTS; i++)
player->client->ps.model_parts[PART_LEGS].skinnum[i] = 0; // will we have more than one skin???
player->client->ps.num_parts++;
player->client->ps.model_parts[PART_GUN].modelindex = gi.modelindex("models/weapons/silencer_mdx/clip.mdx");
for (i=0; i<MAX_MODELPART_OBJECTS; i++)
player->client->ps.model_parts[PART_GUN].skinnum[i] = 0;
}
else if (!strcmp (player->client->pers.weapon->pickup_name , "Pistol"))
{
player->client->ps.num_parts++;
player->client->ps.model_parts[PART_BODY].modelindex = gi.modelindex("models/weapons/v_colt/handl.mdx");
for (i=0; i<MAX_MODELPART_OBJECTS; i++)
player->client->ps.model_parts[PART_BODY].skinnum[i] = 0; // will we have more than one skin???
player->client->ps.num_parts++;
player->client->ps.model_parts[PART_LEGS].modelindex = gi.modelindex("models/weapons/v_colt/handr.mdx");
for (i=0; i<MAX_MODELPART_OBJECTS; i++)
player->client->ps.model_parts[PART_LEGS].skinnum[i] = 0; // will we have more than one skin???
player->client->ps.num_parts++;
player->client->ps.model_parts[PART_GUN].modelindex = gi.modelindex("models/weapons/v_colt/clip.mdx");
for (i=0; i<MAX_MODELPART_OBJECTS; i++)
player->client->ps.model_parts[PART_GUN].skinnum[i] = 0;
}
// JOSEPH 16-APR-99
else if (!strcmp (player->client->pers.weapon->pickup_name , "Heavy machinegun"))
{
player->client->ps.num_parts++;
player->client->ps.model_parts[PART_LEGS].modelindex = gi.modelindex("models/weapons/v_hmg/lhand.mdx");
for (i=0; i<MAX_MODELPART_OBJECTS; i++)
player->client->ps.model_parts[PART_LEGS].skinnum[i] = 0; // will we have more than one skin???
player->client->ps.num_parts++;
player->client->ps.model_parts[PART_BODY].modelindex = gi.modelindex("models/weapons/v_hmg/clip.mdx");
for (i=0; i<MAX_MODELPART_OBJECTS; i++)
player->client->ps.model_parts[PART_BODY].skinnum[i] = 0; // will we have more than one skin???
}
// END JOSEPH
else if (!strcmp (player->client->pers.weapon->pickup_name , "Grenade Launcher"))
{
player->client->ps.num_parts++;
player->client->ps.model_parts[PART_LEGS].modelindex = gi.modelindex("models/weapons/v_grenade_launcher/lhand.mdx");
for (i=0; i<MAX_MODELPART_OBJECTS; i++)
player->client->ps.model_parts[PART_LEGS].skinnum[i] = 0; // will we have more than one skin???
player->client->ps.num_parts++;
player->client->ps.model_parts[PART_BODY].modelindex = gi.modelindex("models/weapons/v_grenade_launcher/clip.mdx");
for (i=0; i<MAX_MODELPART_OBJECTS; i++)
player->client->ps.model_parts[PART_BODY].skinnum[i] = 0; // will we have more than one skin???
}
}
// player->client->ps.gunindex = gi.modelindex(player->client->pers.weapon->view_model);
}
// END JOSEPH
void MoveClientToCutScene (edict_t *ent)
{
VectorCopy (level.cut_scene_origin, ent->s.origin);
ent->client->ps.pmove.origin[0] = level.cut_scene_origin[0]*8;
ent->client->ps.pmove.origin[1] = level.cut_scene_origin[1]*8;
ent->client->ps.pmove.origin[2] = level.cut_scene_origin[2]*8;
VectorCopy (level.cut_scene_angle, ent->client->ps.viewangles);
ent->client->ps.pmove.pm_type = PM_FREEZE;
// note to self
// this may cause a problem
ent->client->ps.gunindex = 0;
ent->client->ps.blend[3] = 0;
ent->client->ps.rdflags &= ~RDF_UNDERWATER;
// clean up powerup info
ent->client->quad_framenum = 0;
ent->client->invincible_framenum = 0;
ent->client->breather_framenum = 0;
ent->client->enviro_framenum = 0;
ent->client->grenade_blew_up = false;
ent->client->grenade_time = 0;
// RAFAEL
ent->client->quadfire_framenum = 0;
// RAFAEL
ent->client->trap_blew_up = false;
ent->client->trap_time = 0;
/*
ent->viewheight = 0;
ent->s.modelindex = 0;
ent->s.modelindex2 = 0;
ent->s.modelindex3 = 0;
ent->s.modelindex = 0;
ent->s.effects = 0;
ent->s.sound = 0;
ent->solid = SOLID_NOT;
*/
}
void MoveClientToCutSceneCamera (edict_t *ent, int fov)
{
ent->client->ps.fov = fov;
VectorCopy (level.cut_scene_origin, ent->s.origin);
ent->client->ps.pmove.origin[0] = level.cut_scene_origin[0]*8;
ent->client->ps.pmove.origin[1] = level.cut_scene_origin[1]*8;
ent->client->ps.pmove.origin[2] = level.cut_scene_origin[2]*8;
VectorCopy (level.cut_scene_angle, ent->client->ps.viewangles);
ent->client->ps.pmove.pm_type = PM_FREEZE;
// note to self
// this may cause a problem
ent->client->ps.gunindex = 0;
ent->client->ps.blend[3] = 0;
ent->client->ps.rdflags &= ~RDF_UNDERWATER;
// clean up powerup info
ent->client->quad_framenum = 0;
ent->client->invincible_framenum = 0;
ent->client->breather_framenum = 0;
ent->client->enviro_framenum = 0;
ent->client->grenade_blew_up = false;
ent->client->grenade_time = 0;
// RAFAEL
ent->client->quadfire_framenum = 0;
// RAFAEL
ent->client->trap_blew_up = false;
ent->client->trap_time = 0;
/*
ent->viewheight = 0;
ent->s.modelindex = 0;
ent->s.modelindex2 = 0;
ent->s.modelindex3 = 0;
ent->s.modelindex = 0;
ent->s.effects = 0;
ent->s.sound = 0;
ent->solid = SOLID_NOT;
*/
}
// END JOSEPH
void MoveClientToPawnoMatic (edict_t *ent)
{
// RAFAEL 03-14-99
// Drew will compensate by moveing the start pos
// ent->client->ps.fov = 96;
// ent->s.origin[2] = level.pawn_origin[2];
ent->client->ps.pmove.origin[0] = level.cut_scene_origin[0]*8;
ent->client->ps.pmove.origin[1] = level.cut_scene_origin[1]*8;
ent->client->ps.pmove.origin[2] = level.cut_scene_origin[2]*8;
ent->client->ps.pmove.pm_type = PM_FREEZE;
ent->client->ps.gunindex = 0;
ent->client->ps.blend[3] = 0;
ent->client->ps.rdflags &= ~RDF_UNDERWATER;
// clean up powerup info
ent->client->quad_framenum = 0;
ent->client->invincible_framenum = 0;
ent->client->breather_framenum = 0;
ent->client->enviro_framenum = 0;
ent->client->grenade_blew_up = false;
ent->client->grenade_time = 0;
// RAFAEL
ent->client->quadfire_framenum = 0;
// RAFAEL
ent->client->trap_blew_up = false;
ent->client->trap_time = 0;
}