// sbar.c -- status bar code
#include "quakedef.h"
-#include "time.h"
+#include <time.h>
#include "cl_collision.h"
#include "csprogs.h"
//MED 01/04/97 added hipnotic items array
cachepic_t *hsb_items[2];
-//GAME_SOM stuff:
-cachepic_t *somsb_health;
-cachepic_t *somsb_ammo[4];
-cachepic_t *somsb_armor[3];
-
cachepic_t *zymsb_crosshair_center;
cachepic_t *zymsb_crosshair_line;
cachepic_t *zymsb_crosshair_health;
if (gamemode == GAME_DELUXEQUAKE || gamemode == GAME_BLOODOMNICIDE)
{
}
- else if (gamemode == GAME_SOM)
- {
- sb_disc = Draw_CachePic_Flags ("gfx/disc", CACHEPICFLAG_QUIET);
-
- for (i = 0;i < 10;i++)
- sb_nums[0][i] = Draw_CachePic_Flags (va(vabuf, sizeof(vabuf), "gfx/num_%i",i), CACHEPICFLAG_QUIET);
-
- somsb_health = Draw_CachePic_Flags ("gfx/hud_health", CACHEPICFLAG_QUIET);
- somsb_ammo[0] = Draw_CachePic_Flags ("gfx/sb_shells", CACHEPICFLAG_QUIET);
- somsb_ammo[1] = Draw_CachePic_Flags ("gfx/sb_nails", CACHEPICFLAG_QUIET);
- somsb_ammo[2] = Draw_CachePic_Flags ("gfx/sb_rocket", CACHEPICFLAG_QUIET);
- somsb_ammo[3] = Draw_CachePic_Flags ("gfx/sb_cells", CACHEPICFLAG_QUIET);
- somsb_armor[0] = Draw_CachePic_Flags ("gfx/sb_armor1", CACHEPICFLAG_QUIET);
- somsb_armor[1] = Draw_CachePic_Flags ("gfx/sb_armor2", CACHEPICFLAG_QUIET);
- somsb_armor[2] = Draw_CachePic_Flags ("gfx/sb_armor3", CACHEPICFLAG_QUIET);
- }
- else if (gamemode == GAME_NEXUIZ)
+ else if (IS_OLDNEXUIZ_DERIVED(gamemode))
{
for (i = 0;i < 10;i++)
sb_nums[0][i] = Draw_CachePic_Flags (va(vabuf, sizeof(vabuf), "gfx/num_%i",i), CACHEPICFLAG_QUIET);
sb_scorebar = Draw_CachePic_Flags ("gfx/scorebar", CACHEPICFLAG_QUIET);
//MED 01/04/97 added new hipnotic weapons
- if (gamemode == GAME_HIPNOTIC)
+ if (gamemode == GAME_HIPNOTIC || gamemode == GAME_QUOTH)
{
hsb_weapons[0][0] = Draw_CachePic_Flags ("gfx/inv_laser", CACHEPICFLAG_QUIET);
hsb_weapons[0][1] = Draw_CachePic_Flags ("gfx/inv_mjolnir", CACHEPICFLAG_QUIET);
static int Sbar_IsTeammatch(void)
{
// currently only nexuiz uses the team score board
- return ((gamemode == GAME_NEXUIZ)
+ return (IS_OLDNEXUIZ_DERIVED(gamemode)
&& (teamplay.integer > 0));
}
int minutes, seconds, tens, units;
int l;
- if (gamemode != GAME_NEXUIZ) {
+ if (IS_OLDNEXUIZ_DERIVED(gamemode)) {
dpsnprintf (str, sizeof(str), "Monsters:%3i /%3i", cl.stats[STAT_MONSTERS], cl.stats[STAT_TOTALMONSTERS]);
Sbar_DrawString (8, 4, str);
Sbar_DrawString (184, 4, str);
// draw level name
- if (gamemode == GAME_NEXUIZ) {
+ if (IS_OLDNEXUIZ_DERIVED(gamemode)) {
l = (int) strlen (cl.worldname);
Sbar_DrawString (232 - l*4, 12, cl.worldname);
} else {
// MED 01/04/97
// hipnotic weapons
- if (gamemode == GAME_HIPNOTIC)
+ if (gamemode == GAME_HIPNOTIC || gamemode == GAME_QUOTH)
{
int grenadeflashing=0;
for (i=0 ; i<4 ; i++)
if (cl.stats[STAT_ITEMS] & (1<<(17+i)))
{
//MED 01/04/97 changed keys
- if (gamemode != GAME_HIPNOTIC || (i>1))
+ if (!(gamemode == GAME_HIPNOTIC || gamemode == GAME_QUOTH) || (i>1))
Sbar_DrawPic (192 + i*16, -16, sb_items[i]);
}
//MED 01/04/97 added hipnotic items
// hipnotic items
- if (gamemode == GAME_HIPNOTIC)
+ if (gamemode == GAME_HIPNOTIC || gamemode == GAME_QUOTH)
{
for (i=0 ; i<2 ; i++)
if (cl.stats[STAT_ITEMS] & (1<<(24+i)))
{
default:
case 1:
- if(gamemode == GAME_NEXUIZ || gamemode == GAME_XONOTIC)
+ if(IS_NEXUIZ_DERIVED(gamemode))
*unit = "in/s";
else
*unit = "qu/s";
case 2:
*unit = "m/s";
*conversion_factor = 0.0254;
- if(gamemode != GAME_NEXUIZ && gamemode != GAME_XONOTIC) *conversion_factor *= 1.5;
+ if(!IS_NEXUIZ_DERIVED(gamemode))
+ *conversion_factor *= 1.5;
// 1qu=1.5in is for non-Nexuiz/Xonotic only - Nexuiz/Xonotic players are overly large, but 1qu=1in fixes that
break;
case 3:
*unit = "km/h";
*conversion_factor = 0.0254 * 3.6;
- if(gamemode != GAME_NEXUIZ && gamemode != GAME_XONOTIC) *conversion_factor *= 1.5;
+ if(!IS_NEXUIZ_DERIVED(gamemode))
+ *conversion_factor *= 1.5;
break;
case 4:
*unit = "mph";
*conversion_factor = 0.0254 * 3.6 * 0.6213711922;
- if(gamemode != GAME_NEXUIZ && gamemode != GAME_XONOTIC) *conversion_factor *= 1.5;
+ if(!IS_NEXUIZ_DERIVED(gamemode))
+ *conversion_factor *= 1.5;
break;
case 5:
*unit = "knots";
*conversion_factor = 0.0254 * 1.943844492; // 1 m/s = 1.943844492 knots, because 1 knot = 1.852 km/h
- if(gamemode != GAME_NEXUIZ && gamemode != GAME_XONOTIC) *conversion_factor *= 1.5;
+ if(!IS_NEXUIZ_DERIVED(gamemode))
+ *conversion_factor *= 1.5;
break;
}
}
char blurstring[32];
char topspeedstring[48];
char texstring[MAX_QPATH];
+ char entstring[32];
qboolean red = false;
soundstring[0] = 0;
fpsstring[0] = 0;
datestring[0] = 0;
speedstring[0] = 0;
blurstring[0] = 0;
- texstring[0] = 0;
topspeedstring[0] = 0;
+ texstring[0] = 0;
+ entstring[0] = 0;
if (showfps.integer)
{
red = (showfps_framerate < 1.0f);
vec3_t org;
vec3_t dest;
vec3_t temp;
- trace_t trace;
+ trace_t svtrace, cltrace;
+ int hitnetentity = -1;
Matrix4x4_OriginFromMatrix(&r_refdef.view.matrix, org);
VectorSet(temp, 65536, 0, 0);
Matrix4x4_Transform(&r_refdef.view.matrix, temp, dest);
- trace.hittexture = NULL; // to make sure
- // TODO change this trace to be stopped by anything "visible" (i.e. with a drawsurface), but not stuff like weapclip
- // probably needs adding a new SUPERCONTENTS type
- trace = CL_TraceLine(org, dest, MOVE_NORMAL, NULL, SUPERCONTENTS_SOLID, true, false, NULL, true, true);
- if(trace.hittexture)
- strlcpy(texstring, trace.hittexture->name, sizeof(texstring));
+ // clear the traces as we may or may not fill them out, and mark them with an invalid fraction so we know if we did
+ memset(&svtrace, 0, sizeof(svtrace));
+ memset(&cltrace, 0, sizeof(cltrace));
+ svtrace.fraction = 2.0;
+ cltrace.fraction = 2.0;
+ // ray hits models (even animated ones) and ignores translucent materials
+ if (SVVM_prog != NULL)
+ svtrace = SV_TraceLine(org, dest, MOVE_HITMODEL, NULL, SUPERCONTENTS_SOLID, 0, MATERIALFLAGMASK_TRANSLUCENT, collision_extendmovelength.value);
+ cltrace = CL_TraceLine(org, dest, MOVE_HITMODEL, NULL, SUPERCONTENTS_SOLID, 0, MATERIALFLAGMASK_TRANSLUCENT, collision_extendmovelength.value, true, false, &hitnetentity, true, true);
+ if (cltrace.hittexture)
+ strlcpy(texstring, cltrace.hittexture->name, sizeof(texstring));
else
strlcpy(texstring, "(no texture hit)", sizeof(texstring));
fps_strings++;
+ if (svtrace.fraction < cltrace.fraction)
+ {
+ if (svtrace.ent != NULL)
+ {
+ prvm_prog_t *prog = SVVM_prog;
+ dpsnprintf(entstring, sizeof(entstring), "server entity %i", (int)PRVM_EDICT_TO_PROG(svtrace.ent));
+ }
+ else
+ strlcpy(entstring, "(no entity hit)", sizeof(entstring));
+ }
+ else
+ {
+ if (CLVM_prog != NULL && cltrace.ent != NULL)
+ {
+ prvm_prog_t *prog = CLVM_prog;
+ dpsnprintf(entstring, sizeof(entstring), "client entity %i", (int)PRVM_EDICT_TO_PROG(cltrace.ent));
+ }
+ else if (hitnetentity > 0)
+ dpsnprintf(entstring, sizeof(entstring), "network entity %i", hitnetentity);
+ else if (hitnetentity == 0)
+ strlcpy(entstring, "world entity", sizeof(entstring));
+ else
+ strlcpy(entstring, "(no entity hit)", sizeof(entstring));
+ }
+ fps_strings++;
}
if (fps_strings)
{
DrawQ_String(fps_x, fps_y, texstring, 0, fps_scalex, fps_scaley, 1, 1, 1, 1, 0, NULL, true, FONT_INFOBAR);
fps_y += fps_scaley;
}
+ if (entstring[0])
+ {
+ fps_x = vid_conwidth.integer - DrawQ_TextWidth(entstring, 0, fps_scalex, fps_scaley, true, FONT_INFOBAR);
+ DrawQ_Fill(fps_x, fps_y, vid_conwidth.integer - fps_x, fps_scaley, 0, 0, 0, 0.5, 0);
+ DrawQ_String(fps_x, fps_y, entstring, 0, fps_scalex, fps_scaley, 1, 1, 1, 1, 0, NULL, true, FONT_INFOBAR);
+ fps_y += fps_scaley;
+ }
}
}
Sbar_DrawScoreboard ();
else if (cl.intermission == 1)
{
- if(gamemode == GAME_NEXUIZ) // display full scoreboard (that is, show scores + map name)
+ if(IS_OLDNEXUIZ_DERIVED(gamemode)) // display full scoreboard (that is, show scores + map name)
{
Sbar_DrawScoreboard();
return;
else if (gamemode == GAME_DELUXEQUAKE)
{
}
- else if (gamemode == GAME_SOM)
- {
- if (sb_showscores || (cl.stats[STAT_HEALTH] <= 0 && cl_deathscoreboard.integer))
- Sbar_DrawScoreboard ();
- else if (sb_lines)
- {
- // this is the top left of the sbar area
- sbar_x = 0;
- sbar_y = vid_conheight.integer - 24*3;
-
- // armor
- if (cl.stats[STAT_ARMOR])
- {
- if (cl.stats[STAT_ITEMS] & IT_ARMOR3)
- Sbar_DrawPic(0, 0, somsb_armor[2]);
- else if (cl.stats[STAT_ITEMS] & IT_ARMOR2)
- Sbar_DrawPic(0, 0, somsb_armor[1]);
- else if (cl.stats[STAT_ITEMS] & IT_ARMOR1)
- Sbar_DrawPic(0, 0, somsb_armor[0]);
- Sbar_DrawNum(24, 0, cl.stats[STAT_ARMOR], 3, cl.stats[STAT_ARMOR] <= 25);
- }
-
- // health
- Sbar_DrawPic(0, 24, somsb_health);
- Sbar_DrawNum(24, 24, cl.stats[STAT_HEALTH], 3, cl.stats[STAT_HEALTH] <= 25);
-
- // ammo icon
- if (cl.stats[STAT_ITEMS] & IT_SHELLS)
- Sbar_DrawPic(0, 48, somsb_ammo[0]);
- else if (cl.stats[STAT_ITEMS] & IT_NAILS)
- Sbar_DrawPic(0, 48, somsb_ammo[1]);
- else if (cl.stats[STAT_ITEMS] & IT_ROCKETS)
- Sbar_DrawPic(0, 48, somsb_ammo[2]);
- else if (cl.stats[STAT_ITEMS] & IT_CELLS)
- Sbar_DrawPic(0, 48, somsb_ammo[3]);
- Sbar_DrawNum(24, 48, cl.stats[STAT_AMMO], 3, false);
- if (cl.stats[STAT_SHELLS])
- Sbar_DrawNum(24 + 3*24, 48, cl.stats[STAT_SHELLS], 1, true);
- }
- }
- else if (gamemode == GAME_NEXUIZ)
+ else if (IS_OLDNEXUIZ_DERIVED(gamemode))
{
if (sb_showscores || (cl.stats[STAT_HEALTH] <= 0 && cl_deathscoreboard.integer))
{
// keys (hipnotic only)
//MED 01/04/97 moved keys here so they would not be overwritten
- if (gamemode == GAME_HIPNOTIC)
+ if (gamemode == GAME_HIPNOTIC || gamemode == GAME_QUOTH)
{
if (cl.stats[STAT_ITEMS] & IT_KEY1)
Sbar_DrawPic (209, 3, sb_items[0]);
xmin = (int) (vid_conwidth.integer - (16 + 25) * 8 * FONT_SBAR->maxwidth) / 2; // 16 characters until name, then we assume 25 character names (they can be longer but usually aren't)
xmax = vid_conwidth.integer - xmin;
- if(gamemode == GAME_NEXUIZ)
+ if(IS_OLDNEXUIZ_DERIVED(gamemode))
DrawQ_Pic (xmin - 8, ymin - 8, 0, xmax-xmin+1 + 2*8, ymax-ymin+1 + 2*8, 0, 0, 0, sbar_alpha_bg.value, 0);
DrawQ_Pic ((vid_conwidth.integer - sb_ranking->width)/2, 8, sb_ranking, 0, 0, 1, 1, 1, 1 * sbar_alpha_fg.value, 0);
if(cl.stats[STAT_TOTALSECRETS])
{
Sbar_DrawNum (160, 104, cl.stats[STAT_SECRETS], 3, 0);
- if (gamemode != GAME_NEXUIZ)
+ if (!IS_OLDNEXUIZ_DERIVED(gamemode))
Sbar_DrawPic (232, 104, sb_slash);
Sbar_DrawNum (240, 104, cl.stats[STAT_TOTALSECRETS], 3, 0);
}
if(cl.stats[STAT_TOTALMONSTERS])
{
Sbar_DrawNum (160, 144, cl.stats[STAT_MONSTERS], 3, 0);
- if (gamemode != GAME_NEXUIZ)
+ if (!IS_OLDNEXUIZ_DERIVED(gamemode))
Sbar_DrawPic (232, 144, sb_slash);
Sbar_DrawNum (240, 144, cl.stats[STAT_TOTALMONSTERS], 3, 0);
}