mirror of
https://github.com/ReactionQuake3/reaction.git
synced 2024-11-29 07:22:47 +00:00
1451 lines
47 KiB
C
1451 lines
47 KiB
C
//-----------------------------------------------------------------------------
|
|
//
|
|
// $Id$
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
// $Log$
|
|
// Revision 1.51 2003/03/29 18:53:41 jbravo
|
|
// Fixed ammo bug when dropping bandolier. Added color to more errormessages
|
|
//
|
|
// Revision 1.50 2002/10/21 21:17:16 niceass
|
|
// bleh
|
|
//
|
|
// Revision 1.49 2002/10/21 21:04:33 niceass
|
|
// ref fix
|
|
//
|
|
// Revision 1.48 2002/10/21 21:01:49 niceass
|
|
// ref ready code
|
|
//
|
|
// Revision 1.47 2002/08/29 04:45:25 niceass
|
|
// color changes for new outlined font
|
|
//
|
|
// Revision 1.46 2002/08/27 05:08:22 niceass
|
|
// fix for ref
|
|
//
|
|
// Revision 1.45 2002/08/24 07:59:48 niceass
|
|
// new ref system
|
|
//
|
|
// Revision 1.44 2002/08/07 04:44:23 niceass
|
|
// ctb changes
|
|
//
|
|
// Revision 1.43 2002/07/22 01:27:38 niceass
|
|
// spectator coloring fix
|
|
//
|
|
// Revision 1.42 2002/07/19 04:40:56 jbravo
|
|
// Added 2 new radio sets and ctb radio sound support
|
|
//
|
|
// Revision 1.41 2002/07/09 05:42:51 niceass
|
|
// flag scoreboard changes
|
|
//
|
|
// Revision 1.40 2002/07/08 04:27:32 niceass
|
|
// moved some code to game. Changed from head models to icons
|
|
//
|
|
// Revision 1.39 2002/07/02 07:38:55 niceass
|
|
// Added total players/subs & fixed ping bug
|
|
//
|
|
// Revision 1.38 2002/07/02 07:21:41 niceass
|
|
// untested matchmode ping determination
|
|
//
|
|
// Revision 1.37 2002/06/21 21:05:00 niceass
|
|
// tinkering
|
|
//
|
|
// Revision 1.36 2002/06/20 02:27:30 jbravo
|
|
// Now the scoreboard doesnt show whos alive and whos not when you are alive
|
|
//
|
|
// Revision 1.35 2002/06/19 05:21:20 niceass
|
|
// scoreboard stuff
|
|
//
|
|
// Revision 1.34 2002/06/16 20:06:13 jbravo
|
|
// Reindented all the source files with "indent -kr -ut -i8 -l120 -lc120 -sob -bad -bap"
|
|
//
|
|
// Revision 1.33 2002/06/10 13:20:03 slicer
|
|
// RefID is now passed trought scoreboard, no more lca cvar, only cg.lca
|
|
//
|
|
// Revision 1.32 2002/06/05 23:39:23 niceass
|
|
// small change in wording
|
|
//
|
|
// Revision 1.31 2002/06/05 04:58:43 niceass
|
|
// Scoreboard changes
|
|
//
|
|
// Revision 1.30 2002/06/03 19:20:18 niceass
|
|
// referee change
|
|
//
|
|
// Revision 1.29 2002/06/03 00:47:18 niceass
|
|
// match scoreboard changes
|
|
//
|
|
// Revision 1.28 2002/05/27 17:47:19 jbravo
|
|
// Fixes and cleanups
|
|
//
|
|
// Revision 1.27 2002/05/27 07:00:09 niceass
|
|
// misc changes
|
|
//
|
|
// Revision 1.26 2002/05/12 02:21:06 niceass
|
|
// Matchmode scoreboard features
|
|
//
|
|
// Revision 1.25 2002/05/07 13:35:45 jbravo
|
|
// Fixed the double lights for spectators and made the use cmd use rq3_cmd
|
|
// and made scoreboard not revieal whos alive or dead to live players.
|
|
//
|
|
// Revision 1.24 2002/04/29 06:15:30 niceass
|
|
// ref shown as green. more mm stuff soon to come
|
|
//
|
|
// Revision 1.23 2002/04/23 06:05:52 niceass
|
|
// scoreboard stuff (btw, green is ugly)
|
|
//
|
|
// Revision 1.22 2002/04/18 16:13:23 jbravo
|
|
// Scoreboard now shows green for live players and white for dead.
|
|
// Time should not get reset on deaths any more.
|
|
//
|
|
// Revision 1.21 2002/03/31 03:31:24 jbravo
|
|
// Compiler warning cleanups
|
|
//
|
|
// Revision 1.20 2002/03/31 02:01:32 niceass
|
|
// fixes and changes
|
|
//
|
|
// Revision 1.19 2002/03/30 23:20:10 jbravo
|
|
// Added damage in scoreboard.
|
|
//
|
|
// Revision 1.18 2002/03/30 02:54:24 jbravo
|
|
// MOre spec tweaks and a scoreboard fix
|
|
//
|
|
// Revision 1.17 2002/03/24 22:57:27 niceass
|
|
// VERY big scoreboard changes
|
|
//
|
|
// Revision 1.14 2002/03/17 21:32:23 jbravo
|
|
// Fixed the dynamic teamnames system up a bit to reduce traffic
|
|
//
|
|
// Revision 1.13 2002/03/17 00:40:23 jbravo
|
|
// Adding variable team names. g_RQ3_team1name and g_RQ3_team2name. Fixed
|
|
// Slicers fraglimit check.
|
|
//
|
|
// Revision 1.12 2002/03/10 23:27:26 blaze
|
|
// fixed net for the wstats
|
|
//
|
|
// Revision 1.11 2002/03/03 23:12:18 blaze
|
|
// weapon stats - fixed a formating bug.
|
|
//
|
|
// Revision 1.10 2002/03/03 21:44:01 blaze
|
|
// weapon stats, done, beta test for bugs
|
|
//
|
|
// Revision 1.9 2002/03/02 01:16:30 blaze
|
|
// weapons stats- reordered where the mp5 was to make it more consistant with the weapon selection page
|
|
//
|
|
// Revision 1.8 2002/02/28 06:09:23 blaze
|
|
// weapons stats on server side - spelling fixed, and forgot ssg3000 and kicks
|
|
//
|
|
// Revision 1.7 2002/02/28 05:41:54 blaze
|
|
// weapons stats on client side
|
|
//
|
|
// Revision 1.6 2002/02/10 08:17:08 niceass
|
|
// many changes to scoreboard (deaths/second mode)
|
|
//
|
|
// Revision 1.5 2002/02/04 00:23:05 niceass
|
|
// New TP scoreboard
|
|
//
|
|
// Revision 1.4 2002/01/11 19:48:29 jbravo
|
|
// Formatted the source in non DOS format.
|
|
//
|
|
// Revision 1.3 2001/12/31 16:28:41 jbravo
|
|
// I made a Booboo with the Log tag.
|
|
//
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
// Copyright (C) 1999-2000 Id Software, Inc.
|
|
//
|
|
// cg_scoreboard -- draw the scoreboard on top of the game screen
|
|
#include "cg_local.h"
|
|
|
|
//static qboolean localClient; // true if local client has been displayed
|
|
|
|
void CG_DrawScoreBoardHead(float x, float y, float w, float h,
|
|
qhandle_t headModel, qhandle_t headSkin, vec3_t headAngles);
|
|
void CG_ScoreBoardHead(team_t team, float x, float y, float w, float h);
|
|
|
|
|
|
|
|
#define SB_WIDTH 330
|
|
#define SB_FONTSIZEW 7
|
|
#define SB_FONTSIZEH (SB_FONTSIZEW * 2)
|
|
#define SB_PADDING 1
|
|
|
|
int TeamAveragePing(team_t team)
|
|
{
|
|
int i;
|
|
int Players = 0, AvgPing = 0;
|
|
int MaxPing1 = -1; // Ping value
|
|
int MaxPing1I = -1, MaxPing2I = -1; // Index value
|
|
|
|
score_t *Score;
|
|
clientInfo_t *ci;
|
|
|
|
// Find out how many are on the team
|
|
// and the two highest pingers
|
|
for (i = 0; i < cg.numScores; i++) {
|
|
Score = &cg.scores[i];
|
|
ci = &cgs.clientinfo[Score->client];
|
|
|
|
if (Score->sub == TEAM_RED || Score->sub == TEAM_BLUE)
|
|
continue;
|
|
|
|
if (ci->team != team)
|
|
continue;
|
|
|
|
Players++;
|
|
|
|
if (Score->ping >= MaxPing1) {
|
|
MaxPing2I = MaxPing1I;
|
|
MaxPing1 = Score->ping;
|
|
MaxPing1I = i;
|
|
}
|
|
}
|
|
|
|
if (!Players)
|
|
return 0;
|
|
|
|
for (i = 0; i < cg.numScores; i++) {
|
|
Score = &cg.scores[i];
|
|
ci = &cgs.clientinfo[Score->client];
|
|
|
|
if (Score->sub == TEAM_RED || Score->sub == TEAM_BLUE)
|
|
continue;
|
|
|
|
if (ci->team != team)
|
|
continue;
|
|
|
|
// 4+ players, ignore highest pinger on team
|
|
if (Players > 3 && i == MaxPing1I)
|
|
continue;
|
|
|
|
// 7+ players, ignore second highest pinger on team also
|
|
if (Players > 6 && i == MaxPing2I)
|
|
continue;
|
|
|
|
AvgPing += Score->ping;
|
|
}
|
|
|
|
|
|
// One player ignored
|
|
if (Players > 3)
|
|
Players--;
|
|
|
|
// A Second player ignored
|
|
if (Players > 6)
|
|
Players--;
|
|
|
|
return AvgPing / Players;
|
|
}
|
|
|
|
void DrawStrip(int y, int Height, qboolean Fill, qboolean Top, qboolean Bottom, float *FillC, float *BoarderC)
|
|
{
|
|
|
|
if (Fill) {
|
|
CG_FillRect((SCREEN_WIDTH - SB_WIDTH) / 2, y, SB_WIDTH, Height + SB_PADDING * 2, FillC);
|
|
}
|
|
|
|
if (Top)
|
|
CG_DrawCleanLine((SCREEN_WIDTH - SB_WIDTH) / 2, y, SB_WIDTH, 1, BoarderC);
|
|
|
|
if (Bottom)
|
|
CG_DrawCleanLine((SCREEN_WIDTH - SB_WIDTH) / 2, y + Height + SB_PADDING * 2, SB_WIDTH, 1, BoarderC);
|
|
|
|
CG_DrawCleanSides((SCREEN_WIDTH - SB_WIDTH) / 2, y, SB_WIDTH, Height + SB_PADDING * 2, 1, BoarderC);
|
|
|
|
}
|
|
|
|
void DrawLeftStripText(int y, int Height, char *Text, int maxChars, float *Color)
|
|
{
|
|
CG_DrawStringExt((SCREEN_WIDTH - SB_WIDTH) / 2 + 2, y + (Height + SB_PADDING * 2 - SB_FONTSIZEH) / 2, Text, Color, qtrue,
|
|
qfalse, // Shadow?
|
|
SB_FONTSIZEW, // charWidth
|
|
SB_FONTSIZEH, // charHeight
|
|
maxChars); // MaxChars
|
|
}
|
|
|
|
void DrawStripText(int y, int x, int Height, char *Text, int maxChars, float *Color)
|
|
{
|
|
CG_DrawStringExt((SCREEN_WIDTH - SB_WIDTH) / 2 + x, y + (Height + SB_PADDING * 2 - SB_FONTSIZEH) / 2, Text, Color, qfalse,
|
|
qfalse, // Shadow?
|
|
SB_FONTSIZEW, // charWidth
|
|
SB_FONTSIZEH, // charHeight
|
|
maxChars); // MaxChars
|
|
}
|
|
|
|
void DrawRightStripText(int y, int Height, char *Text, int maxChars, float *Color)
|
|
{
|
|
int Len;
|
|
|
|
Len = CG_DrawStrlen(Text);
|
|
CG_DrawStringExt(((SCREEN_WIDTH + SB_WIDTH) / 2) - (Len * SB_FONTSIZEW) - 2, y + (Height + SB_PADDING * 2 - SB_FONTSIZEH) / 2, Text, Color, qtrue,
|
|
qfalse, // Shadow?
|
|
SB_FONTSIZEW, // charWidth
|
|
SB_FONTSIZEH, // charHeight
|
|
maxChars); // MaxChars
|
|
}
|
|
|
|
void DrawCenterStripText(int y, int Height, char *Text, int maxChars, float *Color)
|
|
{
|
|
int Len;
|
|
|
|
Len = CG_DrawStrlen(Text);
|
|
CG_DrawStringExt((SCREEN_WIDTH - Len * SB_FONTSIZEW) / 2, y + (Height + SB_PADDING * 2 - SB_FONTSIZEH) / 2, Text, Color, qtrue, // Force color?
|
|
qfalse, // Shadow?
|
|
SB_FONTSIZEW, // charWidth
|
|
SB_FONTSIZEH, // charHeight
|
|
maxChars); // MaxChars
|
|
}
|
|
|
|
static void CG_DrawTeamplayClientScore(int y, score_t * score, float *Fill, float *Boarder, float *Color)
|
|
{
|
|
char Tmp[128], MMstr[128];
|
|
clientInfo_t *ci;
|
|
float FillColor[4], TextColor[4];
|
|
int l;
|
|
|
|
if (score->client < 0 || score->client >= cgs.maxclients) {
|
|
Com_Printf("^1Bad score->client: %i\n", score->client);
|
|
return;
|
|
}
|
|
|
|
ci = &cgs.clientinfo[score->client];
|
|
|
|
for (l = 0; l < 4; l++) {
|
|
FillColor[l] = Fill[l];
|
|
TextColor[l] = Color[l];
|
|
}
|
|
|
|
if (score->client == cg.clientNum)
|
|
FillColor[3] += 0.2f;
|
|
|
|
if (FillColor[3] > 1)
|
|
FillColor[3] = 1;
|
|
|
|
// Dead?
|
|
if (!score->alive) {
|
|
TextColor[0] *= 0.5f;
|
|
TextColor[1] *= 0.5f;
|
|
TextColor[2] *= 0.5f;
|
|
}
|
|
|
|
DrawStrip(y, SB_FONTSIZEH, qtrue, qfalse, qfalse, FillColor, Boarder);
|
|
|
|
Com_sprintf(Tmp, 128, "%5i %s", score->score, ci->name);
|
|
DrawLeftStripText(y, SB_FONTSIZEH, Tmp, 27, TextColor);
|
|
if (score->ping != -1) {
|
|
Com_sprintf(Tmp, 128, "%4i %4i %6i", score->time, score->ping, score->damage);
|
|
DrawRightStripText(y, SB_FONTSIZEH, Tmp, 100, TextColor);
|
|
} else {
|
|
DrawRightStripText(y, SB_FONTSIZEH, "CONNECTING ", 100, TextColor);
|
|
}
|
|
|
|
|
|
memset(MMstr, 0, sizeof(MMstr));
|
|
|
|
if (score->referee)
|
|
strcat(MMstr, "^3[REF]^7");
|
|
if (score->captain)
|
|
strcat(MMstr, "[CAPTAIN]");
|
|
if (score->sub)
|
|
strcat(MMstr, "[SUB]");
|
|
|
|
if ( CG_DrawStrlen(MMstr) )
|
|
DrawStripText(y, -(SB_FONTSIZEW * ((signed)CG_DrawStrlen(MMstr) + 1)), SB_FONTSIZEH, MMstr, 100, colorWhite);
|
|
|
|
if (ci->powerups & ( 1 << PW_REDFLAG ) )
|
|
CG_DrawFlagModel( (SCREEN_WIDTH + SB_WIDTH) / 2 + 2, y, SB_FONTSIZEH + SB_PADDING * 2,
|
|
SB_FONTSIZEH + SB_PADDING * 2, TEAM_RED, qfalse );
|
|
else if (ci->powerups & ( 1 << PW_BLUEFLAG ) )
|
|
CG_DrawFlagModel( (SCREEN_WIDTH + SB_WIDTH) / 2 + 2, y, SB_FONTSIZEH + SB_PADDING * 2,
|
|
SB_FONTSIZEH + SB_PADDING * 2, TEAM_BLUE, qfalse );
|
|
}
|
|
|
|
/*
|
|
=================
|
|
CG_TeamScoreboard
|
|
- By NiceAss
|
|
=================
|
|
*/
|
|
static int CG_TeamplayScoreboard(void)
|
|
{
|
|
clientInfo_t *ci;
|
|
int i;
|
|
|
|
int Reds, Blues, Spectators;
|
|
int RedSubs, BlueSubs;
|
|
|
|
float Alpha;
|
|
score_t *Score;
|
|
int y;
|
|
int Alternate, First;
|
|
int Ping, Frags, Damage; // Averages and totals
|
|
char Tmp[128];
|
|
|
|
// Colors
|
|
vec4_t RedL, BlueL, GreyL, BlackL;
|
|
vec4_t RedD, BlueD, GreyD;
|
|
|
|
// Sine wave fading
|
|
if (cg.time > cg.scoreStartTime + 300) {
|
|
Alpha = cos((cg.time - cg.scoreStartTime) / 400.0f) * 0.15f + 0.85f;
|
|
} else {
|
|
// Fade in
|
|
Alpha = (float) (cg.time - cg.scoreStartTime) / (float) 300;
|
|
if (Alpha > 1.0f)
|
|
Alpha = 1.0f;
|
|
}
|
|
|
|
// NiceAss: Update scoreboard while open every 2 seconds
|
|
if (cg.scoresRequestTime + 2000 < cg.time) {
|
|
cg.scoresRequestTime = cg.time;
|
|
trap_SendClientCommand("score");
|
|
}
|
|
|
|
MAKERGBA(BlackL, 0.0f, 0.0f, 0.0f, 0.8f * Alpha);
|
|
|
|
CG_TeamColor(TEAM_RED, RedD);
|
|
RedD[0] *= 0.8f;
|
|
RedD[1] *= 0.8f;
|
|
RedD[2] *= 0.8f;
|
|
RedD[3] *= (0.8f * Alpha);
|
|
CG_TeamColor(TEAM_BLUE, BlueD);
|
|
BlueD[0] *= 0.8f;
|
|
BlueD[1] *= 0.8f;
|
|
BlueD[2] *= 0.8f;
|
|
BlueD[3] *= (0.8f * Alpha);
|
|
MAKERGBA(GreyD, 0.3f, 0.3f, 0.3f, 0.84f * Alpha);
|
|
CG_TeamColor(TEAM_RED, RedL);
|
|
RedL[0] *= 0.8f;
|
|
RedL[1] *= 0.8f;
|
|
RedL[2] *= 0.8f;
|
|
RedL[3] *= (0.8f * Alpha);
|
|
CG_TeamColor(TEAM_BLUE, BlueL);
|
|
BlueL[0] *= 0.8f;
|
|
BlueL[1] *= 0.8f;
|
|
BlueL[2] *= 0.8f;
|
|
BlueL[3] *= (0.8f * Alpha);
|
|
MAKERGBA(GreyL, 0.3f, 0.3f, 0.3f, 0.4f * Alpha);
|
|
|
|
Reds = Blues = Spectators = RedSubs = BlueSubs = 0;
|
|
|
|
// Get totals for red/blue/spectators and subs
|
|
for (i = 0; i < cg.numScores; i++) {
|
|
Score = &cg.scores[i];
|
|
ci = &cgs.clientinfo[Score->client];
|
|
|
|
if (Score->sub == TEAM_RED)
|
|
RedSubs++;
|
|
else if (Score->sub == TEAM_BLUE)
|
|
BlueSubs++;
|
|
else if (ci->team == TEAM_RED)
|
|
Reds++;
|
|
else if (ci->team == TEAM_BLUE)
|
|
Blues++;
|
|
else if (ci->team == TEAM_SPECTATOR)
|
|
Spectators++;
|
|
}
|
|
|
|
y = 20; // Starting height.
|
|
|
|
// NiceAss: The matchmode match time
|
|
if (cg_RQ3_matchmode.integer) {
|
|
int mins, secs;
|
|
char Time[16];
|
|
char *pingFair;
|
|
|
|
mins = (int) floor(cg.matchTime / 60.0f);
|
|
secs = cg.matchTime - (mins * 60);
|
|
Com_sprintf(Time, 16, "%d:%02d", mins, secs);
|
|
|
|
if (abs(TeamAveragePing(TEAM_RED) - TeamAveragePing(TEAM_BLUE)) <= 40)
|
|
pingFair = "PINGS FAIR";
|
|
else
|
|
pingFair = "PINGS UNFAIR";
|
|
|
|
DrawRightStripText(y, SB_FONTSIZEH, va("%s - Matchtime: %s", pingFair, Time), 100, colorWhite);
|
|
y += SB_FONTSIZEH + SB_PADDING * 2 + 2;
|
|
}
|
|
|
|
// NiceAss: Deathmatch scoreboard:
|
|
if (cg.scoreTPMode == 1 || cgs.gametype < GT_TEAM) {
|
|
// vec3_t headAngles;
|
|
DrawStrip(y, SB_FONTSIZEH, qtrue, qtrue, qtrue, BlackL, colorWhite);
|
|
DrawLeftStripText(y, SB_FONTSIZEH, "Frags Name", 100, colorWhite);
|
|
DrawRightStripText(y, SB_FONTSIZEH, "Time Ping Damage", 100, colorWhite);
|
|
y += SB_FONTSIZEH + SB_PADDING * 2 + 2;
|
|
|
|
// VectorSet(headAngles, 0, sin(cg.time * 0.002f) * 20.0f + 180.0f, 0);
|
|
|
|
First = 0;
|
|
for (i = 0; i < cg.numScores; i++) {
|
|
Score = &cg.scores[i];
|
|
ci = &cgs.clientinfo[Score->client];
|
|
CG_DrawTeamplayClientScore(y, Score, GreyL, colorWhite, colorWhite);
|
|
|
|
if (First == 0)
|
|
DrawStrip(y, SB_FONTSIZEH, qfalse, qtrue, qfalse, GreyL, colorWhite);
|
|
|
|
y += SB_FONTSIZEH + SB_PADDING * 2;
|
|
First = 1;
|
|
}
|
|
DrawStrip(y - (SB_FONTSIZEH + SB_PADDING * 2), SB_FONTSIZEH, qfalse, qfalse, qtrue, GreyL, colorWhite);
|
|
|
|
return Reds + Blues + ceil(Spectators / 2);
|
|
}
|
|
|
|
// *************** RED TEAM ***************
|
|
DrawStrip(y, SB_FONTSIZEH, qtrue, qtrue, qtrue, RedD, colorBlack);
|
|
DrawLeftStripText(y, SB_FONTSIZEH, cg_RQ3_team1name.string, 100, colorWhite);
|
|
|
|
if (cg_RQ3_matchmode.integer)
|
|
DrawRightStripText(y, SB_FONTSIZEH, va("%d/%d - %s - Wins: %d", Reds, RedSubs,
|
|
cg.team1ready ? "Ready" : "Not Ready", cg.teamScores[0]),
|
|
100, colorWhite);
|
|
else
|
|
DrawRightStripText(y, SB_FONTSIZEH, va("%d/%d - Wins: %d", Reds, RedSubs, cg.teamScores[0]), 100, colorWhite);
|
|
|
|
|
|
CG_ScoreBoardHead (TEAM_RED, (SCREEN_WIDTH - SB_WIDTH) / 2 - 36, y, 34, 34);
|
|
|
|
|
|
y += SB_FONTSIZEH + SB_PADDING * 2 + 2;
|
|
|
|
DrawStrip(y, SB_FONTSIZEH, qtrue, qtrue, qtrue, GreyL, colorBlack);
|
|
DrawLeftStripText(y, SB_FONTSIZEH, "Frags Name", 100, colorWhite);
|
|
DrawRightStripText(y, SB_FONTSIZEH, "Time Ping Damage", 100, colorWhite);
|
|
y += SB_FONTSIZEH + SB_PADDING * 2;
|
|
|
|
Ping = Frags = Damage = 0;
|
|
if (Reds || RedSubs) {
|
|
if (Reds) {
|
|
y += 2;
|
|
First = 0;
|
|
for (i = 0; i < cg.numScores; i++) {
|
|
Score = &cg.scores[i];
|
|
ci = &cgs.clientinfo[Score->client];
|
|
|
|
if (ci->team == TEAM_RED && Score->sub == 0) {
|
|
CG_DrawTeamplayClientScore(y, Score, RedL, colorBlack, colorWhite);
|
|
if (First == 0)
|
|
DrawStrip(y, SB_FONTSIZEH, qfalse, qtrue, qfalse, RedL, colorBlack);
|
|
y += SB_FONTSIZEH + SB_PADDING * 2;
|
|
Ping += Score->ping;
|
|
Frags += Score->score;
|
|
Damage += Score->damage;
|
|
First = 1;
|
|
|
|
}
|
|
}
|
|
Ping /= Reds;
|
|
DrawStrip(y - (SB_FONTSIZEH + SB_PADDING * 2), SB_FONTSIZEH, qfalse, qfalse, qtrue, RedL,
|
|
colorBlack);
|
|
}
|
|
// SUBS
|
|
if (RedSubs) {
|
|
y += 2;
|
|
First = 0;
|
|
for (i = 0; i < cg.numScores; i++) {
|
|
Score = &cg.scores[i];
|
|
ci = &cgs.clientinfo[Score->client];
|
|
|
|
if (ci->team == TEAM_RED && Score->sub) {
|
|
CG_DrawTeamplayClientScore(y, Score, RedL, colorBlack, colorWhite);
|
|
if (First == 0)
|
|
DrawStrip(y, SB_FONTSIZEH, qfalse, qtrue, qfalse, RedL, colorBlack);
|
|
y += SB_FONTSIZEH + SB_PADDING * 2;
|
|
Ping += Score->ping;
|
|
Frags += Score->score;
|
|
Damage += Score->damage;
|
|
First = 1;
|
|
|
|
}
|
|
}
|
|
DrawStrip(y - (SB_FONTSIZEH + SB_PADDING * 2), SB_FONTSIZEH, qfalse, qfalse, qtrue, RedL,
|
|
colorBlack);
|
|
}
|
|
|
|
y += 2;
|
|
|
|
if (cg_RQ3_matchmode.integer)
|
|
Ping = TeamAveragePing(TEAM_RED);
|
|
|
|
Com_sprintf(Tmp, 128, "%5d", Frags);
|
|
DrawStrip(y, SB_FONTSIZEH, qtrue, qtrue, qtrue, GreyL, colorBlack);
|
|
DrawLeftStripText(y, SB_FONTSIZEH, Tmp, 100, colorWhite);
|
|
Com_sprintf(Tmp, 128, "%4d %6d", Ping, Damage);
|
|
DrawRightStripText(y, SB_FONTSIZEH, Tmp, 100, colorWhite);
|
|
DrawCenterStripText(y, SB_FONTSIZEH, "Totals", 20, colorWhite);
|
|
} else {
|
|
y += 2;
|
|
DrawStrip(y, SB_FONTSIZEH, qtrue, qtrue, qtrue, RedL, colorBlack);
|
|
DrawCenterStripText(y, SB_FONTSIZEH, "No team members", 100, colorWhite);
|
|
}
|
|
|
|
// *************** BLUE TEAM ************
|
|
y += SB_FONTSIZEH * 2;
|
|
DrawStrip(y, SB_FONTSIZEH, qtrue, qtrue, qtrue, BlueD, colorBlack);
|
|
DrawLeftStripText(y, SB_FONTSIZEH, cg_RQ3_team2name.string, 100, colorWhite);
|
|
|
|
if (cg_RQ3_matchmode.integer)
|
|
DrawRightStripText(y, SB_FONTSIZEH, va("%d/%d - %s - Wins: %d", Blues, BlueSubs,
|
|
cg.team2ready ? "Ready" : "Not Ready", cg.teamScores[1]),
|
|
100, colorWhite);
|
|
else
|
|
DrawRightStripText(y, SB_FONTSIZEH, va("%d/%d - Wins: %d", Blues, BlueSubs, cg.teamScores[1]), 100, colorWhite);
|
|
|
|
CG_ScoreBoardHead (TEAM_BLUE, (SCREEN_WIDTH - SB_WIDTH) / 2 - 36, y, 34, 34);
|
|
|
|
y += SB_FONTSIZEH + SB_PADDING * 2 + 2;
|
|
|
|
DrawStrip(y, SB_FONTSIZEH, qtrue, qtrue, qtrue, GreyL, colorBlack);
|
|
DrawLeftStripText(y, SB_FONTSIZEH, "Frags Name", 100, colorWhite);
|
|
DrawRightStripText(y, SB_FONTSIZEH, "Time Ping Damage", 100, colorWhite);
|
|
y += SB_FONTSIZEH + SB_PADDING * 2;
|
|
|
|
Ping = Frags = Damage = 0;
|
|
if (Blues || BlueSubs) {
|
|
if (Blues) {
|
|
y += 2;
|
|
First = 0;
|
|
for (i = 0; i < cg.numScores; i++) {
|
|
Score = &cg.scores[i];
|
|
ci = &cgs.clientinfo[Score->client];
|
|
|
|
if (ci->team == TEAM_BLUE && Score->sub == 0) {
|
|
CG_DrawTeamplayClientScore(y, Score, BlueL, colorBlack, colorWhite);
|
|
if (First == 0)
|
|
DrawStrip(y, SB_FONTSIZEH, qfalse, qtrue, qfalse, BlueL, colorBlack);
|
|
y += SB_FONTSIZEH + SB_PADDING * 2;
|
|
Ping += Score->ping;
|
|
Frags += Score->score;
|
|
Damage += Score->damage;
|
|
First = 1;
|
|
}
|
|
}
|
|
Ping /= Blues;
|
|
DrawStrip(y - (SB_FONTSIZEH + SB_PADDING * 2), SB_FONTSIZEH, qfalse, qfalse, qtrue, BlueL,
|
|
colorBlack);
|
|
}
|
|
// SUBS:
|
|
if (BlueSubs) {
|
|
y += 2;
|
|
First = 0;
|
|
for (i = 0; i < cg.numScores; i++) {
|
|
Score = &cg.scores[i];
|
|
ci = &cgs.clientinfo[Score->client];
|
|
|
|
if (ci->team == TEAM_BLUE && Score->sub) {
|
|
CG_DrawTeamplayClientScore(y, Score, BlueL, colorBlack, colorWhite);
|
|
if (First == 0)
|
|
DrawStrip(y, SB_FONTSIZEH, qfalse, qtrue, qfalse, BlueL, colorBlack);
|
|
y += SB_FONTSIZEH + SB_PADDING * 2;
|
|
Ping += Score->ping;
|
|
Frags += Score->score;
|
|
Damage += Score->damage;
|
|
First = 1;
|
|
}
|
|
}
|
|
DrawStrip(y - (SB_FONTSIZEH + SB_PADDING * 2), SB_FONTSIZEH, qfalse, qfalse, qtrue, BlueL,
|
|
colorBlack);
|
|
}
|
|
y += 2;
|
|
|
|
if (cg_RQ3_matchmode.integer)
|
|
Ping = TeamAveragePing(TEAM_BLUE);
|
|
|
|
Com_sprintf(Tmp, 128, "%5d", Frags);
|
|
DrawStrip(y, SB_FONTSIZEH, qtrue, qtrue, qtrue, GreyL, colorBlack);
|
|
DrawLeftStripText(y, SB_FONTSIZEH, Tmp, 100, colorWhite);
|
|
Com_sprintf(Tmp, 128, "%4d %6d", Ping, Damage);
|
|
DrawRightStripText(y, SB_FONTSIZEH, Tmp, 100, colorWhite);
|
|
DrawCenterStripText(y, SB_FONTSIZEH, "Totals", 20, colorWhite);
|
|
} else {
|
|
y += 2;
|
|
DrawStrip(y, SB_FONTSIZEH, qtrue, qtrue, qtrue, BlueL, colorBlack);
|
|
DrawCenterStripText(y, SB_FONTSIZEH, "No team members", 100, colorWhite);
|
|
}
|
|
|
|
if ( cg_RQ3_matchmode.integer && cg.refready != -1 ) {
|
|
y += SB_FONTSIZEH * 2;
|
|
DrawStrip(y, SB_FONTSIZEH, qtrue, qtrue, qtrue, BlackL, colorWhite);
|
|
DrawRightStripText(y, SB_FONTSIZEH,
|
|
cg.refready ? "Referee Ready" : "Referee Not Ready", 100, colorWhite);
|
|
}
|
|
|
|
// *************** SPECTATORS ************
|
|
if (Spectators) {
|
|
Alternate = 1;
|
|
First = 0;
|
|
|
|
y += SB_FONTSIZEH * 2;
|
|
DrawStrip(y, SB_FONTSIZEH, qtrue, qtrue, qtrue, GreyD, colorBlack);
|
|
DrawLeftStripText(y, SB_FONTSIZEH, "Spectators", 100, colorWhite);
|
|
y += SB_FONTSIZEH + SB_PADDING * 2 + 2;
|
|
|
|
for (i = 0; i < cg.numScores; i++) {
|
|
Score = &cg.scores[i];
|
|
ci = &cgs.clientinfo[Score->client];
|
|
|
|
if (ci->team != TEAM_SPECTATOR)
|
|
continue;
|
|
|
|
if (First == 0)
|
|
DrawStrip(y, SB_FONTSIZEH, qfalse, qtrue, qfalse, GreyL, colorBlack);
|
|
else
|
|
DrawStrip(y, SB_FONTSIZEH, qtrue, qfalse, qfalse, GreyL, colorBlack);
|
|
|
|
if (Score->referee) {
|
|
if (Alternate == 1)
|
|
DrawStripText(y, -(SB_FONTSIZEW * 6), SB_FONTSIZEH, "^3[REF]^7", 100, colorWhite);
|
|
else
|
|
DrawStripText(y, SB_WIDTH + SB_FONTSIZEW, SB_FONTSIZEH, "^3[REF]^7", 100, colorWhite);
|
|
}
|
|
|
|
|
|
if (Alternate == 1) {
|
|
DrawLeftStripText(y, SB_FONTSIZEH, ci->name, 20, colorWhite);
|
|
} else {
|
|
DrawRightStripText(y, SB_FONTSIZEH, ci->name, 20, colorWhite);
|
|
y += SB_FONTSIZEH + SB_PADDING * 2;
|
|
}
|
|
Alternate = -Alternate;
|
|
First = 1;
|
|
}
|
|
|
|
if (Alternate == 1)
|
|
DrawStrip(y - (SB_FONTSIZEH + SB_PADDING * 2), SB_FONTSIZEH, qfalse, qfalse, qtrue, GreyL,
|
|
colorBlack);
|
|
else
|
|
DrawStrip(y, SB_FONTSIZEH, qfalse, qfalse, qtrue, GreyL, colorBlack);
|
|
}
|
|
|
|
return Reds + Blues + ceil(Spectators / 2);
|
|
}
|
|
|
|
/*
|
|
=================
|
|
CG_DrawScoreboard
|
|
|
|
Draw the normal in-game scoreboard
|
|
=================
|
|
*/
|
|
qboolean CG_DrawOldScoreboard(void)
|
|
{
|
|
|
|
// don't draw amuthing if the menu or console is up
|
|
if (cg_paused.integer) {
|
|
cg.deferredPlayerLoading = 0;
|
|
return qfalse;
|
|
}
|
|
|
|
if (cgs.gametype == GT_SINGLE_PLAYER && cg.predictedPlayerState.pm_type == PM_INTERMISSION) {
|
|
cg.deferredPlayerLoading = 0;
|
|
return qfalse;
|
|
}
|
|
|
|
if (!cg.showScores)
|
|
return qfalse;
|
|
|
|
// don't draw scoreboard during death while warmup up
|
|
if (cg.warmup) {
|
|
return qfalse;
|
|
}
|
|
|
|
CG_TeamplayScoreboard();
|
|
|
|
// load any models that have been deferred
|
|
if (++cg.deferredPlayerLoading > 10) {
|
|
CG_LoadDeferredPlayers();
|
|
}
|
|
|
|
return qtrue;
|
|
}
|
|
|
|
//================================================================================
|
|
|
|
/*
|
|
================
|
|
CG_CenterGiantLine
|
|
================
|
|
*/
|
|
|
|
static void CG_CenterGiantLine(float y, const char *string)
|
|
{
|
|
float x;
|
|
vec4_t color;
|
|
|
|
color[0] = 1;
|
|
color[1] = 1;
|
|
color[2] = 1;
|
|
color[3] = 1;
|
|
|
|
x = 0.5 * (640 - GIANT_WIDTH * CG_DrawStrlen(string));
|
|
|
|
CG_DrawStringExt(x, y, string, color, qtrue, qtrue, GIANT_WIDTH, GIANT_HEIGHT, 0);
|
|
}
|
|
|
|
/*
|
|
=================
|
|
CG_DrawTourneyScoreboard
|
|
|
|
Draw the oversize scoreboard for tournements
|
|
=================
|
|
*/
|
|
|
|
void CG_DrawOldTourneyScoreboard(void)
|
|
{
|
|
const char *s;
|
|
vec4_t color;
|
|
int min, tens, ones;
|
|
clientInfo_t *ci;
|
|
int y;
|
|
int i;
|
|
|
|
// request more scores regularly
|
|
if (cg.scoresRequestTime + 2000 < cg.time) {
|
|
cg.scoresRequestTime = cg.time;
|
|
trap_SendClientCommand("score");
|
|
}
|
|
|
|
// draw the dialog background
|
|
color[0] = color[1] = color[2] = 0;
|
|
color[3] = 1;
|
|
CG_FillRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, color);
|
|
|
|
color[0] = 1;
|
|
color[1] = 1;
|
|
color[2] = 1;
|
|
color[3] = 1;
|
|
|
|
// print the mesage of the day
|
|
s = CG_ConfigString(CS_MOTD);
|
|
if (!s[0]) {
|
|
s = "Scoreboard";
|
|
}
|
|
// print optional title
|
|
CG_CenterGiantLine(8, s);
|
|
|
|
// print server time
|
|
ones = cg.time / 1000;
|
|
min = ones / 60;
|
|
ones %= 60;
|
|
tens = ones / 10;
|
|
ones %= 10;
|
|
s = va("%i:%i%i", min, tens, ones);
|
|
|
|
CG_CenterGiantLine(64, s);
|
|
|
|
// print the two scores
|
|
|
|
y = 160;
|
|
if (cgs.gametype >= GT_TEAM) {
|
|
//
|
|
// teamplay scoreboard
|
|
//
|
|
CG_DrawStringExt(8, y, "Red Team", color, qtrue, qtrue, GIANT_WIDTH, GIANT_HEIGHT, 0);
|
|
s = va("%i", cg.teamScores[0]);
|
|
CG_DrawStringExt(632 - GIANT_WIDTH * strlen(s), y, s, color, qtrue, qtrue, GIANT_WIDTH, GIANT_HEIGHT,
|
|
0);
|
|
|
|
y += 64;
|
|
|
|
CG_DrawStringExt(8, y, "Blue Team", color, qtrue, qtrue, GIANT_WIDTH, GIANT_HEIGHT, 0);
|
|
s = va("%i", cg.teamScores[1]);
|
|
CG_DrawStringExt(632 - GIANT_WIDTH * strlen(s), y, s, color, qtrue, qtrue, GIANT_WIDTH, GIANT_HEIGHT,
|
|
0);
|
|
} else {
|
|
//
|
|
// free for all scoreboard
|
|
//
|
|
for (i = 0; i < MAX_CLIENTS; i++) {
|
|
ci = &cgs.clientinfo[i];
|
|
if (!ci->infoValid) {
|
|
continue;
|
|
}
|
|
if (ci->team != TEAM_FREE) {
|
|
continue;
|
|
}
|
|
|
|
CG_DrawStringExt(8, y, ci->name, color, qtrue, qtrue, GIANT_WIDTH, GIANT_HEIGHT, 0);
|
|
s = va("%i", ci->score);
|
|
CG_DrawStringExt(632 - GIANT_WIDTH * strlen(s), y, s, color, qtrue, qtrue, GIANT_WIDTH,
|
|
GIANT_HEIGHT, 0);
|
|
y += 64;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
//Blaze: Added the weapons stats "scoreboard" to this file because it's a scoreboard in a way.
|
|
/*
|
|
==============================
|
|
CG_DrawWeaponStats
|
|
|
|
Draws the stats of the player
|
|
==============================
|
|
*/
|
|
#define WS_LEFTSIDE 20
|
|
#define WS_TOP 200
|
|
#define WS_WIDTH 640 - WS_LEFTSIDE * 10
|
|
#define WS_LINE_WIDTH 1
|
|
#define WS_PADDING (WS_LINE_WIDTH+2)
|
|
|
|
void CG_DrawWeaponStats(void)
|
|
{
|
|
int i, offset;
|
|
float color[4], Alpha; // Alpha2;
|
|
int size;
|
|
char String[80];
|
|
|
|
if (cg.time > cg.wstatsStartTime + 300) {
|
|
Alpha = (cos((cg.time - cg.wstatsStartTime) / 400.0f) + 1.0f) * 0.25f + 0.5f;
|
|
// Alpha2 = (cos((cg.time - cg.wstatsStartTime) / 400.0f) + 1.0f) * 0.5f;
|
|
} else {
|
|
Alpha = (float) (cg.time - cg.wstatsStartTime) / (float) 300;
|
|
if (Alpha > 1.0f)
|
|
Alpha = 1.0f;
|
|
}
|
|
//make room for 8 weapon stats
|
|
size = (10 * 20) + WS_PADDING;
|
|
|
|
// Score bar - Red:
|
|
MAKERGBA(color, 1.0f, 0.5f, 0.5f, 0.7f * Alpha);
|
|
CG_FillRect(WS_LEFTSIDE, WS_TOP, WS_WIDTH, SMALLCHAR_HEIGHT + (WS_PADDING * 2), color);
|
|
|
|
//Box for scores, etc
|
|
MAKERGBA(color, 0.55f, 0.55f, 0.55f, 0.7f * Alpha);
|
|
CG_FillRect(WS_LEFTSIDE, WS_TOP + SMALLCHAR_HEIGHT + (WS_PADDING * 2),
|
|
WS_WIDTH, SMALLCHAR_HEIGHT + (WS_PADDING * 2), color);
|
|
|
|
//Box for weapon stuff
|
|
MAKERGBA(color, 0.6f, 0.5f, 0.5f, 0.5f * Alpha);
|
|
CG_FillRect(WS_LEFTSIDE, WS_TOP + (SMALLCHAR_HEIGHT + (WS_PADDING * 2)) * 2, WS_WIDTH, size, color);
|
|
//box for weapon stuff
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 0.8f);
|
|
CG_DrawCleanRect(WS_LEFTSIDE, WS_TOP,
|
|
WS_WIDTH, (SMALLCHAR_HEIGHT + WS_PADDING * 2) * 2 + size, WS_LINE_WIDTH, color);
|
|
|
|
//box for score stuff
|
|
CG_DrawCleanRect(WS_LEFTSIDE, WS_TOP + SMALLCHAR_HEIGHT + (WS_PADDING * 2),
|
|
WS_WIDTH, (SMALLCHAR_HEIGHT + WS_PADDING * 2), WS_LINE_WIDTH, color);
|
|
|
|
//Red box for Weapon stats
|
|
MAKERGBA(color, 1.0f, 0.5f, 0.5f, 0.7f * Alpha);
|
|
CG_FillRect(WS_LEFTSIDE, WS_TOP + (SMALLCHAR_HEIGHT + (WS_PADDING * 2)) * 2, WS_WIDTH, SMALLCHAR_HEIGHT, color);
|
|
//White box for the weapon names, etc
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 0.8f);
|
|
CG_DrawCleanRect(WS_LEFTSIDE, WS_TOP - 1 + (SMALLCHAR_HEIGHT + (WS_PADDING * 2)) * 2,
|
|
WS_WIDTH, SMALLCHAR_HEIGHT + 1, WS_LINE_WIDTH, color);
|
|
|
|
//Fill in the top bar
|
|
offset = 7;
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6, WS_TOP + WS_PADDING, "Score", color);
|
|
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * 7, WS_TOP + WS_PADDING, "Net", color);
|
|
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * 7 * 2, WS_TOP + WS_PADDING, "K/D/S", color);
|
|
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * 7 * 3, WS_TOP + WS_PADDING, "TK's", color);
|
|
|
|
// MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
// CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * 7 * 4, WS_TOP + WS_PADDING,
|
|
// "Efficiency", color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4i", cg.snap->ps.persistant[PERS_SCORE]);
|
|
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH, WS_TOP + WS_PADDING * 3 + SMALLCHAR_HEIGHT,
|
|
String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%3i",
|
|
cg.snap->ps.persistant[PERS_SCORE] - cg.snap->ps.persistant[PERS_KILLED]);
|
|
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * 7 - 1, WS_TOP + WS_PADDING * 3 + SMALLCHAR_HEIGHT,
|
|
String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%i/%i/%i", cg.records[REC_KILLS], cg.snap->ps.persistant[PERS_KILLED],
|
|
cg.records[REC_SUICIDES]);
|
|
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * 7 * 2, WS_TOP + WS_PADDING * 3 + SMALLCHAR_HEIGHT,
|
|
String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4i", cg.records[REC_TEAMKILLS]);
|
|
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * 7 * 3, WS_TOP + WS_PADDING * 3 + SMALLCHAR_HEIGHT,
|
|
String, color);
|
|
|
|
i = 2;
|
|
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH, WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++,
|
|
"Weapon Stats", color);
|
|
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH, WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++,
|
|
"Knife(slash)", color);
|
|
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH, WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++,
|
|
"Knife(throw)", color);
|
|
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH, WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++,
|
|
"MK23", color);
|
|
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH, WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++,
|
|
"MP5", color);
|
|
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH, WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++,
|
|
"M3", color);
|
|
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH, WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++,
|
|
"M4", color);
|
|
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH, WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++,
|
|
"HC", color);
|
|
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH, WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++,
|
|
"SSG3000", color);
|
|
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH, WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++,
|
|
"Akimbo", color);
|
|
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH, WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++,
|
|
"Grenade", color);
|
|
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH, WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++,
|
|
"Kicks", color);
|
|
|
|
//Accuracy
|
|
|
|
i = 2;
|
|
offset = 15;
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, "Accuracy", color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%.1f%%",
|
|
100 * (float) cg.records[REC_KNIFESLASHHITS] /
|
|
(cg.records[REC_KNIFESLASHSHOTS] ? cg.records[REC_KNIFESLASHSHOTS] : 1));
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%.1f%%",
|
|
100 * (float) cg.records[REC_KNIFETHROWHITS] /
|
|
(cg.records[REC_KNIFETHROWSHOTS] ? cg.records[REC_KNIFETHROWSHOTS] : 1));
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%.1f%%",
|
|
100 * (float) cg.records[REC_MK23HITS] /
|
|
(cg.records[REC_MK23SHOTS] ? cg.records[REC_MK23SHOTS] : 1));
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%.1f%%",
|
|
100 * (float) cg.records[REC_MP5HITS] / (cg.records[REC_MP5SHOTS] ? cg.records[REC_MP5SHOTS] : 1));
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%.1f%%",
|
|
100 * (float) cg.records[REC_M3HITS] / (cg.records[REC_M3SHOTS] ? cg.records[REC_M3SHOTS] : 1));
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%.1f%%",
|
|
100 * (float) cg.records[REC_M4HITS] / (cg.records[REC_M4SHOTS] ? cg.records[REC_M4SHOTS] : 1));
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%.1f%%",
|
|
100 * (float) cg.records[REC_HANDCANNONHITS] /
|
|
(cg.records[REC_HANDCANNONSHOTS] ? cg.records[REC_HANDCANNONSHOTS] : 1));
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%.1f%%",
|
|
100 * (float) cg.records[REC_SSG3000HITS] /
|
|
(cg.records[REC_SSG3000SHOTS] ? cg.records[REC_SSG3000SHOTS] : 1));
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%.1f%%",
|
|
100 * (float) cg.records[REC_AKIMBOHITS] /
|
|
(cg.records[REC_AKIMBOSHOTS] ? cg.records[REC_AKIMBOSHOTS] : 1));
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%.1f%%",
|
|
100 * (float) cg.records[REC_GRENADEHITS] /
|
|
(cg.records[REC_GRENADESHOTS] ? cg.records[REC_GRENADESHOTS] : 1));
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
//Hits
|
|
i = 2;
|
|
offset = 25;
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, "Hits", color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_KNIFESLASHHITS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_KNIFETHROWHITS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_MK23HITS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_MP5HITS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_M3HITS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_M4HITS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_HANDCANNONHITS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_SSG3000HITS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_AKIMBOHITS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_GRENADEHITS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_KICKHITS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
//Shots
|
|
i = 2;
|
|
offset = 32;
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * (offset - 1),
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, "Shots", color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_KNIFESLASHSHOTS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_KNIFETHROWSHOTS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_MK23SHOTS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_MP5SHOTS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_M3SHOTS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_M4SHOTS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_HANDCANNONSHOTS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_SSG3000SHOTS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_AKIMBOSHOTS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_GRENADESHOTS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
//Kills
|
|
i = 2;
|
|
offset = 39;
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * (offset - 1),
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, "Kills", color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_KNIFESLASHKILLS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_KNIFETHROWKILLS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_MK23KILLS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_MP5KILLS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_M3KILLS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_M4KILLS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_HANDCANNONKILLS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_SSG3000KILLS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_AKIMBOKILLS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_GRENADEKILLS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_KICKKILLS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
//Deaths
|
|
i = 2;
|
|
offset = 47;
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * (offset - 2),
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, "Deaths", color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_KNIFESLASHDEATHS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_KNIFETHROWDEATHS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_MK23DEATHS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_MP5DEATHS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_M3DEATHS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_M4DEATHS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_HANDCANNONDEATHS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_SSG3000DEATHS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_AKIMBODEATHS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_GRENADEDEATHS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
Com_sprintf(String, sizeof(String), "%4d", cg.records[REC_KICKDEATHS]);
|
|
MAKERGBA(color, 1.0f, 1.0f, 1.0f, 1.0f);
|
|
CG_DrawSmallStringColor(WS_LEFTSIDE + 6 + SMALLCHAR_WIDTH * offset,
|
|
WS_TOP + WS_PADDING * 4 + SMALLCHAR_HEIGHT * i++, String, color);
|
|
|
|
if (cg.wstatsRequestTime + 3000 < cg.time) {
|
|
// the scores are more than two seconds out of data,
|
|
// so request new ones
|
|
cg.wstatsRequestTime = cg.time;
|
|
trap_SendClientCommand("wstats");
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
/*
|
|
CG_FindHead By NiceAss
|
|
|
|
Used to parse the model cvars and register the model and skin. It
|
|
then displays it.
|
|
*/
|
|
|
|
void CG_ScoreBoardHead(team_t team, float x, float y, float w, float h) {
|
|
char modelskin[128], filename[128];
|
|
char *model = NULL, *skin = NULL;
|
|
qhandle_t headIcon; //headModel, headSkin;
|
|
|
|
//vec3_t Angles;
|
|
|
|
if (team == TEAM_RED)
|
|
strcpy(modelskin, cg_RQ3_team1model.string);
|
|
else
|
|
strcpy(modelskin, cg_RQ3_team2model.string);
|
|
|
|
skin = strchr(modelskin, '/');
|
|
|
|
if (!skin)
|
|
return;
|
|
|
|
*skin = '\0';
|
|
skin++;
|
|
model = modelskin;
|
|
|
|
//********************** LOAD HEAD ***************************
|
|
/*
|
|
Com_sprintf(filename, 128, "models/players/%s/head.md3", model);
|
|
headModel = trap_R_RegisterModel( filename );
|
|
|
|
if (!headModel)
|
|
return;
|
|
|
|
Com_sprintf(filename, 128, "models/players/%s/head_%s.skin", model, skin);
|
|
headSkin = trap_R_RegisterSkin( filename );
|
|
|
|
if (!headSkin)
|
|
return;
|
|
|
|
VectorClear( Angles );
|
|
Angles[1] = sin(cg.time * 0.0025f) * 20.0f + 180.0f;
|
|
Angles[0] = cos(cg.time * 0.002f) * 8.0f;
|
|
|
|
CG_DrawScoreBoardHead(x, y, w, h, headModel, headSkin, Angles);
|
|
*/
|
|
Com_sprintf(filename, 128, "models/players/%s/icon_%s.md3", model, skin);
|
|
headIcon = trap_R_RegisterShaderNoMip( filename );
|
|
|
|
if (!headIcon)
|
|
return;
|
|
|
|
CG_DrawPic(x, y, w, h, headIcon);
|
|
}
|
|
|
|
|
|
/*
|
|
CG_DrawScoreBoardHead By NiceAss
|
|
|
|
Displays the player model. This is just an altered CG_DrawHead.
|
|
*/
|
|
/*
|
|
void CG_DrawScoreBoardHead(float x, float y, float w, float h,
|
|
qhandle_t headModel, qhandle_t headSkin,
|
|
vec3_t headAngles)
|
|
{
|
|
float len;
|
|
vec3_t origin;
|
|
vec3_t mins, maxs;
|
|
|
|
if (!headModel)
|
|
return;
|
|
|
|
// offset the origin y and z to center the head
|
|
trap_R_ModelBounds(headModel, mins, maxs);
|
|
|
|
origin[2] = -0.5 * (mins[2] + maxs[2]);
|
|
origin[1] = 0.5 * (mins[1] + maxs[1]);
|
|
|
|
// calculate distance so the head nearly fills the box
|
|
// assume heads are taller than wide
|
|
len = 0.7 * (maxs[2] - mins[2]);
|
|
origin[0] = len / 0.268; // len / tan( fov/2 )
|
|
|
|
CG_Draw3DModel(x, y, w, h, headModel, headSkin, origin, headAngles);
|
|
|
|
|
|
}
|
|
*/
|