command argument completion for a few commands.
fix off-by-one pvs bug. add another settings preset. fix classic particles colour issue. fix d3d9 renderer's scissoring (including splitscreen huds) git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@5125 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
parent
9221a1a6ae
commit
904a701281
31 changed files with 1087 additions and 842 deletions
|
@ -1975,6 +1975,22 @@ void CL_Record_f (void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int QDECL CompleteDemoList (const char *name, qofs_t flags, time_t mtime, void *parm, searchpathfuncs_t *spath)
|
||||||
|
{
|
||||||
|
struct xcommandargcompletioncb_s *ctx = parm;
|
||||||
|
ctx->cb(name, ctx);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
void CL_DemoList_c(int argn, char *partial, struct xcommandargcompletioncb_s *ctx)
|
||||||
|
{
|
||||||
|
if (argn == 1)
|
||||||
|
{
|
||||||
|
COM_EnumerateFiles(va("%s*.qwd", partial), CompleteDemoList, ctx);
|
||||||
|
COM_EnumerateFiles(va("%s*.dem", partial), CompleteDemoList, ctx);
|
||||||
|
COM_EnumerateFiles(va("%s*.mvd", partial), CompleteDemoList, ctx);
|
||||||
|
COM_EnumerateFiles(va("%s*.mvd.gz", partial), CompleteDemoList, ctx);
|
||||||
|
}
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
====================
|
====================
|
||||||
CL_ReRecord_f
|
CL_ReRecord_f
|
||||||
|
|
|
@ -4254,15 +4254,15 @@ void CL_Init (void)
|
||||||
|
|
||||||
Cmd_AddCommandD ("changing", CL_Changing_f, "Part of network protocols. This command should not be used manually.");
|
Cmd_AddCommandD ("changing", CL_Changing_f, "Part of network protocols. This command should not be used manually.");
|
||||||
Cmd_AddCommand ("disconnect", CL_Disconnect_f);
|
Cmd_AddCommand ("disconnect", CL_Disconnect_f);
|
||||||
Cmd_AddCommand ("record", CL_Record_f);
|
Cmd_AddCommandAD ("record", CL_Record_f, CL_DemoList_c, NULL);
|
||||||
Cmd_AddCommand ("rerecord", CL_ReRecord_f);
|
Cmd_AddCommandAD ("rerecord", CL_ReRecord_f, CL_DemoList_c, "Reconnects to the previous/current server, but starts recording a clean demo.");
|
||||||
Cmd_AddCommand ("stop", CL_Stop_f);
|
Cmd_AddCommandD ("stop", CL_Stop_f, "Stop demo recording.");
|
||||||
Cmd_AddCommand ("playdemo", CL_PlayDemo_f);
|
Cmd_AddCommandAD ("playdemo", CL_PlayDemo_f, CL_DemoList_c, NULL);
|
||||||
Cmd_AddCommand ("qtvplay", CL_QTVPlay_f);
|
Cmd_AddCommand ("qtvplay", CL_QTVPlay_f);
|
||||||
Cmd_AddCommand ("qtvlist", CL_QTVList_f);
|
Cmd_AddCommand ("qtvlist", CL_QTVList_f);
|
||||||
Cmd_AddCommand ("qtvdemos", CL_QTVDemos_f);
|
Cmd_AddCommand ("qtvdemos", CL_QTVDemos_f);
|
||||||
Cmd_AddCommandD ("demo_jump", CL_DemoJump_f, "Jump to a specified time in a demo. Prefix with a + or - for a relative offset. Seeking backwards will restart the demo and the fast forward, which can take some time in long demos.");
|
Cmd_AddCommandD ("demo_jump", CL_DemoJump_f, "Jump to a specified time in a demo. Prefix with a + or - for a relative offset. Seeking backwards will restart the demo and the fast forward, which can take some time in long demos.");
|
||||||
Cmd_AddCommand ("timedemo", CL_TimeDemo_f);
|
Cmd_AddCommandAD ("timedemo", CL_TimeDemo_f, CL_DemoList_c, NULL);
|
||||||
Cmd_AddCommand ("crashme_endgame", CL_CrashMeEndgame_f);
|
Cmd_AddCommand ("crashme_endgame", CL_CrashMeEndgame_f);
|
||||||
|
|
||||||
Cmd_AddCommandD ("showpic", SCR_ShowPic_Script_f, "showpic <imagename> <placename> <x> <y> <zone> [width] [height] [touchcommand]\nDisplays an image onscreen, that potentially has a key binding attached to it when clicked/touched.\nzone should be one of: TL, TR, BL, BR, MM, TM, BM, ML, MR. This serves as an extra offset to move the image around the screen without any foreknowledge of the screen resolution.");
|
Cmd_AddCommandD ("showpic", SCR_ShowPic_Script_f, "showpic <imagename> <placename> <x> <y> <zone> [width] [height] [touchcommand]\nDisplays an image onscreen, that potentially has a key binding attached to it when clicked/touched.\nzone should be one of: TL, TR, BL, BR, MM, TM, BM, ML, MR. This serves as an extra offset to move the image around the screen without any foreknowledge of the screen resolution.");
|
||||||
|
|
|
@ -1945,9 +1945,12 @@ void SCR_ImageName (const char *mapname)
|
||||||
|
|
||||||
if (!scr_disabled_for_loading)
|
if (!scr_disabled_for_loading)
|
||||||
{
|
{
|
||||||
Sbar_Changed ();
|
|
||||||
scr_drawloading = true;
|
scr_drawloading = true;
|
||||||
SCR_UpdateScreen ();
|
if (qrenderer != QR_NONE)
|
||||||
|
{
|
||||||
|
Sbar_Changed ();
|
||||||
|
SCR_UpdateScreen ();
|
||||||
|
}
|
||||||
scr_drawloading = false;
|
scr_drawloading = false;
|
||||||
scr_disabled_for_loading = true;
|
scr_disabled_for_loading = true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1195,6 +1195,7 @@ void CL_WriteRecordQ2DemoMessage(sizebuf_t *msg);
|
||||||
void CL_Stop_f (void);
|
void CL_Stop_f (void);
|
||||||
void CL_Record_f (void);
|
void CL_Record_f (void);
|
||||||
void CL_ReRecord_f (void);
|
void CL_ReRecord_f (void);
|
||||||
|
void CL_DemoList_c(int argn, char *partial, struct xcommandargcompletioncb_s *ctx);
|
||||||
void CL_PlayDemo_f (void);
|
void CL_PlayDemo_f (void);
|
||||||
void CL_QTVPlay_f (void);
|
void CL_QTVPlay_f (void);
|
||||||
void CL_QTVPoll (void);
|
void CL_QTVPoll (void);
|
||||||
|
|
|
@ -759,10 +759,10 @@ void IN_MoveMouse(struct mouse_s *mouse, float *movements, int pnum, float frame
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef QUAKESTATS
|
#ifdef QUAKESTATS
|
||||||
if (cl.playerview[pnum].stats[STAT_VIEWZOOM])
|
if (cl.playerview[pnum].statsf[STAT_VIEWZOOM])
|
||||||
{
|
{
|
||||||
mouse_x *= cl.playerview[pnum].stats[STAT_VIEWZOOM]/255.0f;
|
mouse_x *= cl.playerview[pnum].statsf[STAT_VIEWZOOM]/255.0f;
|
||||||
mouse_y *= cl.playerview[pnum].stats[STAT_VIEWZOOM]/255.0f;
|
mouse_y *= cl.playerview[pnum].statsf[STAT_VIEWZOOM]/255.0f;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -345,66 +345,63 @@ void CompleteCommand (qboolean force)
|
||||||
const char *desc;
|
const char *desc;
|
||||||
|
|
||||||
s = key_lines[edit_line];
|
s = key_lines[edit_line];
|
||||||
|
if (*s == ' ' || *s == '\t')
|
||||||
|
s++;
|
||||||
if (*s == '\\' || *s == '/')
|
if (*s == '\\' || *s == '/')
|
||||||
s++;
|
s++;
|
||||||
|
if (*s == ' ' || *s == '\t')
|
||||||
|
s++;
|
||||||
|
|
||||||
for (cmd = s; *cmd; cmd++)
|
//check for singular matches and complete if found
|
||||||
|
cmd = force?NULL:Cmd_CompleteCommand (s, true, true, 2, NULL);
|
||||||
|
if (!cmd)
|
||||||
{
|
{
|
||||||
if (*cmd == ' ' || *cmd == '\t')
|
if (!force)
|
||||||
break;
|
cmd = Cmd_CompleteCommand (s, false, true, 1, &desc);
|
||||||
}
|
else
|
||||||
if (*cmd)
|
cmd = Cmd_CompleteCommand (s, true, true, con_commandmatch, &desc);
|
||||||
cmd = s;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//check for singular matches and complete if found
|
|
||||||
cmd = force?NULL:Cmd_CompleteCommand (s, true, true, 2, NULL);
|
|
||||||
if (!cmd)
|
|
||||||
{
|
|
||||||
if (!force)
|
|
||||||
cmd = Cmd_CompleteCommand (s, false, true, 1, &desc);
|
|
||||||
else
|
|
||||||
cmd = Cmd_CompleteCommand (s, true, true, con_commandmatch, &desc);
|
|
||||||
if (cmd)
|
|
||||||
{
|
|
||||||
//complete to that (maybe partial) cmd.
|
|
||||||
Key_ClearTyping();
|
|
||||||
Key_ConsoleInsert("/");
|
|
||||||
Key_ConsoleInsert(cmd);
|
|
||||||
s = key_lines[edit_line]+1;
|
|
||||||
|
|
||||||
//if its the only match, add a space ready for arguments.
|
|
||||||
cmd = Cmd_CompleteCommand (s, true, true, 0, NULL);
|
|
||||||
if (cmd && !strcmp(s, cmd))
|
|
||||||
{
|
|
||||||
Key_ConsoleInsert(" ");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!con_commandmatch)
|
|
||||||
con_commandmatch = 1;
|
|
||||||
|
|
||||||
if (desc)
|
|
||||||
Con_Footerf(NULL, false, "%s: %s", cmd, desc);
|
|
||||||
else
|
|
||||||
Con_Footerf(NULL, false, "");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//complete to a partial match.
|
|
||||||
cmd = Cmd_CompleteCommand (s, false, true, 0, &desc);
|
|
||||||
if (cmd)
|
if (cmd)
|
||||||
{
|
{
|
||||||
int i = key_lines[edit_line][0] == '/'?1:0;
|
if (strlen(cmd) < strlen(s))
|
||||||
if (i != 1 || strcmp(key_lines[edit_line]+i, cmd))
|
return;
|
||||||
{ //if successful, use that instead.
|
|
||||||
Key_ClearTyping();
|
|
||||||
Key_ConsoleInsert("/");
|
|
||||||
Key_ConsoleInsert(cmd);
|
|
||||||
|
|
||||||
s = key_lines[edit_line]; //readjust to cope with the insertion of a /
|
//complete to that (maybe partial) cmd.
|
||||||
if (*s == '\\' || *s == '/')
|
Key_ClearTyping();
|
||||||
s++;
|
Key_ConsoleInsert("/");
|
||||||
|
Key_ConsoleInsert(cmd);
|
||||||
|
s = key_lines[edit_line]+1;
|
||||||
|
|
||||||
|
//if its the only match, add a space ready for arguments.
|
||||||
|
cmd = Cmd_CompleteCommand (s, true, true, 0, NULL);
|
||||||
|
if (cmd && !strcmp(s, cmd))
|
||||||
|
{
|
||||||
|
Key_ConsoleInsert(" ");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!con_commandmatch)
|
||||||
|
con_commandmatch = 1;
|
||||||
|
|
||||||
|
if (desc)
|
||||||
|
Con_Footerf(NULL, false, "%s: %s", cmd, desc);
|
||||||
|
else
|
||||||
|
Con_Footerf(NULL, false, "");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//complete to a partial match.
|
||||||
|
cmd = Cmd_CompleteCommand (s, false, true, 0, &desc);
|
||||||
|
if (cmd)
|
||||||
|
{
|
||||||
|
int i = key_lines[edit_line][0] == '/'?1:0;
|
||||||
|
if (i != 1 || strcmp(key_lines[edit_line]+i, cmd))
|
||||||
|
{ //if successful, use that instead.
|
||||||
|
Key_ClearTyping();
|
||||||
|
Key_ConsoleInsert("/");
|
||||||
|
Key_ConsoleInsert(cmd);
|
||||||
|
|
||||||
|
s = key_lines[edit_line]; //readjust to cope with the insertion of a /
|
||||||
|
if (*s == '\\' || *s == '/')
|
||||||
|
s++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
con_commandmatch++;
|
con_commandmatch++;
|
||||||
|
@ -1991,6 +1988,17 @@ void Key_AliasEdit_f (void)
|
||||||
Con_Printf("Not an alias\n");
|
Con_Printf("Not an alias\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Key_Bind_c(int argn, char *partial, struct xcommandargcompletioncb_s *ctx)
|
||||||
|
{
|
||||||
|
keyname_t *kn;
|
||||||
|
size_t len = strlen(partial);
|
||||||
|
//FIXME: shift, ctrl, alt prefixes (+combos)
|
||||||
|
for (kn=keynames ; kn->name ; kn++)
|
||||||
|
{
|
||||||
|
if (!Q_strncasecmp(partial,kn->name, len))
|
||||||
|
ctx->cb(kn->name, ctx);
|
||||||
|
}
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
===================
|
===================
|
||||||
Key_Bind_f
|
Key_Bind_f
|
||||||
|
@ -2287,10 +2295,10 @@ void Key_Init (void)
|
||||||
//
|
//
|
||||||
// register our functions
|
// register our functions
|
||||||
//
|
//
|
||||||
Cmd_AddCommand ("bind",Key_Bind_f);
|
Cmd_AddCommandAD ("bind",Key_Bind_f, Key_Bind_c, NULL);
|
||||||
Cmd_AddCommand ("in_bind",Key_Bind_f);
|
Cmd_AddCommand ("in_bind",Key_Bind_f);
|
||||||
Cmd_AddCommand ("bindlevel",Key_BindLevel_f);
|
Cmd_AddCommand ("bindlevel",Key_BindLevel_f);
|
||||||
Cmd_AddCommand ("unbind",Key_Unbind_f);
|
Cmd_AddCommandAD ("unbind",Key_Unbind_f, Key_Bind_c, NULL);
|
||||||
Cmd_AddCommand ("unbindall",Key_Unbindall_f);
|
Cmd_AddCommand ("unbindall",Key_Unbindall_f);
|
||||||
Cmd_AddCommand ("aliasedit",Key_AliasEdit_f);
|
Cmd_AddCommand ("aliasedit",Key_AliasEdit_f);
|
||||||
|
|
||||||
|
|
|
@ -713,6 +713,7 @@ const char *presetname[] =
|
||||||
{
|
{
|
||||||
"286", //everything turned off to make it as fast as possible, even if you're crippled without it
|
"286", //everything turned off to make it as fast as possible, even if you're crippled without it
|
||||||
"Fast", //typical deathmatch settings.
|
"Fast", //typical deathmatch settings.
|
||||||
|
"Spasm", //faithful NQ aesthetics (fairly strict, but not all out).
|
||||||
"Vanilla", //vanilla effects enabled, no content replacement.
|
"Vanilla", //vanilla effects enabled, no content replacement.
|
||||||
"Normal", //content replacement enabled
|
"Normal", //content replacement enabled
|
||||||
"Nice", //potentially expensive, but not painful
|
"Nice", //potentially expensive, but not painful
|
||||||
|
@ -739,6 +740,7 @@ const char *presetexec[] =
|
||||||
"seta r_drawflat 1;"
|
"seta r_drawflat 1;"
|
||||||
"seta r_lightmap 0;"
|
"seta r_lightmap 0;"
|
||||||
"seta r_nolerp 1;"
|
"seta r_nolerp 1;"
|
||||||
|
"seta r_noframegrouplerp 1;"
|
||||||
"seta r_nolightdir 1;"
|
"seta r_nolightdir 1;"
|
||||||
"seta r_dynamic 0;"
|
"seta r_dynamic 0;"
|
||||||
"seta r_bloom 0;"
|
"seta r_bloom 0;"
|
||||||
|
@ -797,12 +799,13 @@ const char *presetexec[] =
|
||||||
"r_nolightdir 0;"
|
"r_nolightdir 0;"
|
||||||
"seta gl_simpleitems 0;"
|
"seta gl_simpleitems 0;"
|
||||||
|
|
||||||
, //vanilla options.
|
, //quakespasm-esque options.
|
||||||
"r_part_density 1;"
|
"r_part_density 1;"
|
||||||
"gl_polyblend 1;"
|
"gl_polyblend 1;"
|
||||||
"r_dynamic 1;"
|
"r_dynamic 2;"
|
||||||
"gl_flashblend 0;"
|
"gl_flashblend 0;"
|
||||||
"cl_nolerp 0;" //projectiles lerped at least.
|
"cl_nolerp 0;" //projectiles lerped at least.
|
||||||
|
"r_noframegrouplerp 1;" //flames won't lerp
|
||||||
"r_waterwarp 1;"
|
"r_waterwarp 1;"
|
||||||
"r_drawflame 1;"
|
"r_drawflame 1;"
|
||||||
"v_gunkick 1;"
|
"v_gunkick 1;"
|
||||||
|
@ -810,24 +813,27 @@ const char *presetexec[] =
|
||||||
"cl_bob 0.02;"
|
"cl_bob 0.02;"
|
||||||
//these things are perhaps a little extreme
|
//these things are perhaps a little extreme
|
||||||
"r_loadlit 0;"
|
"r_loadlit 0;"
|
||||||
"r_nolerp 1;"
|
"vid_hardwaregamma 1;"
|
||||||
"seta vid_hardwaregamma 1;"
|
|
||||||
"r_softwarebanding 1;" //ugly software banding.
|
|
||||||
"d_mipcap 0 2;" //gl without anisotropic filtering favours too-distant mips too often, so lets just pretend it doesn't exist. should probably mess with lod instead or something
|
"d_mipcap 0 2;" //gl without anisotropic filtering favours too-distant mips too often, so lets just pretend it doesn't exist. should probably mess with lod instead or something
|
||||||
"gl_affinemodels 1;"
|
|
||||||
"gl_texturemode nnl;" //yup, we went there.
|
|
||||||
"gl_texturemode2d n.l;" //yeah, 2d too.
|
|
||||||
"r_part_classic_square 1;" //blocky baby!
|
|
||||||
"r_part_classic_expgrav 1;" //vanillaery
|
"r_part_classic_expgrav 1;" //vanillaery
|
||||||
"r_part_classic_opaque 1;"
|
"r_part_classic_opaque 1;"
|
||||||
// "r_particlesystem script;" //q2 or hexen2 particle effects need to be loadable
|
// "r_particlesystem script;" //q2 or hexen2 particle effects need to be loadable
|
||||||
"cl_sbar 1;" //its a style thing
|
"cl_sbar 2;" //its a style thing
|
||||||
"sv_nqplayerphysics 1;" //gb wanted this
|
"sv_nqplayerphysics 1;" //gb wanted this, should give nq physics to people who want nq settings. note that this disables prediction.
|
||||||
"cl_demoreel 1;" //yup, arcadey
|
"cl_demoreel 1;" //yup, arcadey
|
||||||
//"d_mipcap \"0 3\";" //logically correct, but will fuck up on ATI drivers if increased mid-map, because ATI will just ignore any levels that are not currently enabled.
|
//"d_mipcap \"0 3\";" //logically correct, but will fuck up on ATI drivers if increased mid-map, because ATI will just ignore any levels that are not currently enabled.
|
||||||
"seta cl_gibfilter 0;"
|
"cl_gibfilter 0;"
|
||||||
"seta cl_deadbodyfilter 0;"
|
"seta cl_deadbodyfilter 0;"
|
||||||
|
|
||||||
|
, //vanilla-esque options.
|
||||||
|
"gl_texturemode nnl;" //yup, we went there.
|
||||||
|
"gl_texturemode2d n.l;" //yeah, 2d too.
|
||||||
|
"r_nolerp 1;"
|
||||||
|
"cl_sbar 1;"
|
||||||
|
"gl_affinemodels 1;"
|
||||||
|
"r_softwarebanding 1;" //ugly software banding.
|
||||||
|
"r_part_classic_square 1;" //blocky baby!
|
||||||
|
|
||||||
, // normal (faithful) options, but with content replacement thrown in
|
, // normal (faithful) options, but with content replacement thrown in
|
||||||
//#ifdef MINIMAL
|
//#ifdef MINIMAL
|
||||||
// "r_particlesystem classic;"
|
// "r_particlesystem classic;"
|
||||||
|
@ -841,6 +847,7 @@ const char *presetexec[] =
|
||||||
"gl_load24bit 1;"
|
"gl_load24bit 1;"
|
||||||
"r_replacemodels \"md3 md2\";"
|
"r_replacemodels \"md3 md2\";"
|
||||||
"r_coronas 1;"
|
"r_coronas 1;"
|
||||||
|
"r_dynamic 1;"
|
||||||
"r_softwarebanding 0;"
|
"r_softwarebanding 0;"
|
||||||
"d_mipcap 0 1000;"
|
"d_mipcap 0 1000;"
|
||||||
"gl_affinemodels 0;"
|
"gl_affinemodels 0;"
|
||||||
|
@ -852,6 +859,7 @@ const char *presetexec[] =
|
||||||
"cl_demoreel 0;"
|
"cl_demoreel 0;"
|
||||||
"r_loadlit 1;"
|
"r_loadlit 1;"
|
||||||
"r_nolerp 0;"
|
"r_nolerp 0;"
|
||||||
|
"r_noframegrouplerp 0;"
|
||||||
|
|
||||||
, // nice options
|
, // nice options
|
||||||
// "r_stains 0.75;"
|
// "r_stains 0.75;"
|
||||||
|
@ -865,6 +873,7 @@ const char *presetexec[] =
|
||||||
"r_waterstyle 2;"
|
"r_waterstyle 2;"
|
||||||
"gl_blendsprites 1;"
|
"gl_blendsprites 1;"
|
||||||
// "r_fastsky -1;"
|
// "r_fastsky -1;"
|
||||||
|
"r_dynamic 0;"
|
||||||
"r_shadow_realtime_dlight 1;"
|
"r_shadow_realtime_dlight 1;"
|
||||||
// "gl_detail 1;"
|
// "gl_detail 1;"
|
||||||
"r_lightstylesmooth 1;"
|
"r_lightstylesmooth 1;"
|
||||||
|
@ -910,8 +919,9 @@ void M_Menu_Preset_f (void)
|
||||||
MB_TEXT("^Ue080^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue082", true),
|
MB_TEXT("^Ue080^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue082", true),
|
||||||
MB_CONSOLECMD("simple (untextured)", "fps_preset 286;menupop\n", "Lacks textures, particles, pretty much everything."),
|
MB_CONSOLECMD("simple (untextured)", "fps_preset 286;menupop\n", "Lacks textures, particles, pretty much everything."),
|
||||||
MB_CONSOLECMD("fast (deathmatch)", "fps_preset fast;menupop\n", "Fullscreen effects off to give consistant framerates"),
|
MB_CONSOLECMD("fast (deathmatch)", "fps_preset fast;menupop\n", "Fullscreen effects off to give consistant framerates"),
|
||||||
|
MB_CONSOLECMD("spasm (nq compat)", "fps_preset spasm;menupop\n", "Aims for visual compatibility with common NQ engines. Also affects mods slightly."),
|
||||||
MB_CONSOLECMD("vanilla (softwarey)", "fps_preset vanilla;menupop\n", "This is for purists! Party like its 1995! No sanity spared!"),
|
MB_CONSOLECMD("vanilla (softwarey)", "fps_preset vanilla;menupop\n", "This is for purists! Party like its 1995! No sanity spared!"),
|
||||||
MB_CONSOLECMD("normal (faithful)", "fps_preset normal;menupop\n", "An updated but still faithful appearance, using content replacements where applicable"),
|
MB_CONSOLECMD("normal (qw faithful)", "fps_preset normal;menupop\n", "An updated but still faithful appearance, using content replacements where applicable"),
|
||||||
MB_CONSOLECMD("nice (dynamic)", "fps_preset nice;menupop\n", "For people who like nice things, but still want to actually play"),
|
MB_CONSOLECMD("nice (dynamic)", "fps_preset nice;menupop\n", "For people who like nice things, but still want to actually play"),
|
||||||
#ifdef RTLIGHTS
|
#ifdef RTLIGHTS
|
||||||
MB_CONSOLECMD("realtime (all on)", "fps_preset realtime;menupop\n", "For people who value pretty over fast/smooth. Not viable for deathmatch."),
|
MB_CONSOLECMD("realtime (all on)", "fps_preset realtime;menupop\n", "For people who value pretty over fast/smooth. Not viable for deathmatch."),
|
||||||
|
@ -937,11 +947,13 @@ void M_Menu_Preset_f (void)
|
||||||
else if (gl_load24bit.ival)
|
else if (gl_load24bit.ival)
|
||||||
item = 3; //normal
|
item = 3; //normal
|
||||||
else if (r_softwarebanding_cvar.ival)
|
else if (r_softwarebanding_cvar.ival)
|
||||||
item = 4;
|
item = 4; //vanilla
|
||||||
|
else if (cl_sbar.ival == 2)
|
||||||
|
item = 5; //spasm
|
||||||
else if (!r_drawflat.ival)
|
else if (!r_drawflat.ival)
|
||||||
item = 5;
|
item = 6; //fast
|
||||||
else
|
else
|
||||||
item = 6;
|
item = 7; //simple
|
||||||
item -= bias;
|
item -= bias;
|
||||||
while (item --> 0)
|
while (item --> 0)
|
||||||
menu->selecteditem = menu->selecteditem->common.next;
|
menu->selecteditem = menu->selecteditem->common.next;
|
||||||
|
|
|
@ -516,9 +516,14 @@ static void Surf_AddDynamicLightsColours (msurface_t *surf)
|
||||||
local[0] -= surf->texturemins[0];
|
local[0] -= surf->texturemins[0];
|
||||||
local[1] -= surf->texturemins[1];
|
local[1] -= surf->texturemins[1];
|
||||||
|
|
||||||
r = cl_dlights[lnum].color[0]*128;
|
if (r_dynamic.ival == 2)
|
||||||
g = cl_dlights[lnum].color[1]*128;
|
r = g = b = 128;
|
||||||
b = cl_dlights[lnum].color[2]*128;
|
else
|
||||||
|
{
|
||||||
|
r = cl_dlights[lnum].color[0]*128;
|
||||||
|
g = cl_dlights[lnum].color[1]*128;
|
||||||
|
b = cl_dlights[lnum].color[2]*128;
|
||||||
|
}
|
||||||
|
|
||||||
/* if (cl_dlights[lnum].type == 1) //a wierd effect.
|
/* if (cl_dlights[lnum].type == 1) //a wierd effect.
|
||||||
{
|
{
|
||||||
|
|
|
@ -106,8 +106,8 @@ cvar_t r_refractreflect_scale = CVARD ("r_refractreflect_scale", "0.5", "Use
|
||||||
cvar_t gl_miptexLevel = CVAR ("gl_miptexLevel", "0");
|
cvar_t gl_miptexLevel = CVAR ("gl_miptexLevel", "0");
|
||||||
cvar_t r_drawviewmodel = CVARF ("r_drawviewmodel", "1", CVAR_ARCHIVE);
|
cvar_t r_drawviewmodel = CVARF ("r_drawviewmodel", "1", CVAR_ARCHIVE);
|
||||||
cvar_t r_drawviewmodelinvis = CVAR ("r_drawviewmodelinvis", "0");
|
cvar_t r_drawviewmodelinvis = CVAR ("r_drawviewmodelinvis", "0");
|
||||||
cvar_t r_dynamic = CVARF ("r_dynamic", IFMINIMAL("0","1"),
|
cvar_t r_dynamic = CVARFD ("r_dynamic", IFMINIMAL("0","1"),
|
||||||
CVAR_ARCHIVE);
|
CVAR_ARCHIVE, "-1: the engine will bypass dlights completely, allowing for better batching.\n0: no standard dlights at all.\n1: coloured dlights will be used, they may show through walls. These are not realtime things.\n2: The dlights will be forced to monochrome (this does not affect coronas/flashblends/rtlights attached to the same light).");
|
||||||
cvar_t r_fastturb = CVARF ("r_fastturb", "0",
|
cvar_t r_fastturb = CVARF ("r_fastturb", "0",
|
||||||
CVAR_SHADERSYSTEM);
|
CVAR_SHADERSYSTEM);
|
||||||
cvar_t r_fastsky = CVARF ("r_fastsky", "0",
|
cvar_t r_fastsky = CVARF ("r_fastsky", "0",
|
||||||
|
@ -1280,6 +1280,10 @@ qboolean R_ApplyRenderer_Load (rendererstate_t *newr)
|
||||||
vid.dpi_x = 0;
|
vid.dpi_x = 0;
|
||||||
vid.dpi_y = 0;
|
vid.dpi_y = 0;
|
||||||
|
|
||||||
|
#ifndef CLIENTONLY
|
||||||
|
sv.world.lastcheckpvs = NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (qrenderer != QR_NONE) //graphics stuff only when not dedicated
|
if (qrenderer != QR_NONE) //graphics stuff only when not dedicated
|
||||||
{
|
{
|
||||||
size_t sz;
|
size_t sz;
|
||||||
|
|
|
@ -40,6 +40,8 @@ cvar_t scr_scoreboard_teamsort = CVARD("scr_scoreboard_teamsort", "0", "On the s
|
||||||
cvar_t scr_scoreboard_titleseperator = CVAR("scr_scoreboard_titleseperator", "1");
|
cvar_t scr_scoreboard_titleseperator = CVAR("scr_scoreboard_titleseperator", "1");
|
||||||
cvar_t sbar_teamstatus = CVARD("sbar_teamstatus", "1", "Display the last team say from each of your team members just above the sbar area.");
|
cvar_t sbar_teamstatus = CVARD("sbar_teamstatus", "1", "Display the last team say from each of your team members just above the sbar area.");
|
||||||
|
|
||||||
|
cvar_t cl_sbaralpha = CVARAD("cl_sbaralpha", "0.75", "scr_sbaralpha", "Specifies the transparency of the status bar. Only Takes effect when cl_sbar is set to 2."); //with premultiplied alpha, this needs to affect the RGB values too.
|
||||||
|
|
||||||
//===========================================
|
//===========================================
|
||||||
//rogue changed and added defines
|
//rogue changed and added defines
|
||||||
#define RIT_SHELLS (1u<<7)
|
#define RIT_SHELLS (1u<<7)
|
||||||
|
@ -1112,6 +1114,7 @@ void Sbar_Init (void)
|
||||||
Cvar_Register(&scr_scoreboard_titleseperator, "Scoreboard settings");
|
Cvar_Register(&scr_scoreboard_titleseperator, "Scoreboard settings");
|
||||||
|
|
||||||
Cvar_Register(&sbar_teamstatus, "Status bar settings");
|
Cvar_Register(&sbar_teamstatus, "Status bar settings");
|
||||||
|
Cvar_Register(&cl_sbaralpha, "Status bar settings");
|
||||||
|
|
||||||
Cmd_AddCommand ("+showscores", Sbar_ShowScores);
|
Cmd_AddCommand ("+showscores", Sbar_ShowScores);
|
||||||
Cmd_AddCommand ("-showscores", Sbar_DontShowScores);
|
Cmd_AddCommand ("-showscores", Sbar_DontShowScores);
|
||||||
|
@ -1675,7 +1678,7 @@ void Sbar_DrawInventory (playerview_t *pv)
|
||||||
float wleft, wtop;
|
float wleft, wtop;
|
||||||
apic_t *ibar;
|
apic_t *ibar;
|
||||||
|
|
||||||
headsup = !(cl_sbar.value || (scr_viewsize.value<100&&cl.splitclients==1));
|
headsup = !(cl_sbar.value || (scr_viewsize.value<100));
|
||||||
hudswap = cl_hudswap.value; // Get that nasty float out :)
|
hudswap = cl_hudswap.value; // Get that nasty float out :)
|
||||||
|
|
||||||
//coord for the left of the weapons, with hud
|
//coord for the left of the weapons, with hud
|
||||||
|
@ -1695,7 +1698,12 @@ void Sbar_DrawInventory (playerview_t *pv)
|
||||||
ibar = sb_ibar;
|
ibar = sb_ibar;
|
||||||
|
|
||||||
if (!headsup)
|
if (!headsup)
|
||||||
|
{
|
||||||
|
if (cl_sbar.ival != 1 && scr_viewsize.value >= 100)
|
||||||
|
R2D_ImageColours (cl_sbaralpha.value, cl_sbaralpha.value, cl_sbaralpha.value, cl_sbaralpha.value);
|
||||||
Sbar_DrawPic (0, -24, 320, 24, ibar);
|
Sbar_DrawPic (0, -24, 320, 24, ibar);
|
||||||
|
R2D_ImageColours (1, 1, 1, 1);
|
||||||
|
}
|
||||||
|
|
||||||
// weapons
|
// weapons
|
||||||
for (i=0 ; i<7 ; i++)
|
for (i=0 ; i<7 ; i++)
|
||||||
|
@ -1921,7 +1929,7 @@ int Sbar_TranslateHudClick(void)
|
||||||
float vx = mousecursor_x - sbar_rect.x;
|
float vx = mousecursor_x - sbar_rect.x;
|
||||||
float vy = mousecursor_y - (sbar_rect.y + (sbar_rect.height-SBAR_HEIGHT));
|
float vy = mousecursor_y - (sbar_rect.y + (sbar_rect.height-SBAR_HEIGHT));
|
||||||
|
|
||||||
qboolean headsup = !(cl_sbar.value || (scr_viewsize.value<100&&cl.splitclients==1));
|
qboolean headsup = !(cl_sbar.value || (scr_viewsize.value<100));
|
||||||
qboolean hudswap = cl_hudswap.value; // Get that nasty float out :)
|
qboolean hudswap = cl_hudswap.value; // Get that nasty float out :)
|
||||||
|
|
||||||
//inventory. clicks do specific-weapon impulses.
|
//inventory. clicks do specific-weapon impulses.
|
||||||
|
@ -2082,8 +2090,13 @@ Sbar_DrawNormal
|
||||||
*/
|
*/
|
||||||
void Sbar_DrawNormal (playerview_t *pv)
|
void Sbar_DrawNormal (playerview_t *pv)
|
||||||
{
|
{
|
||||||
if (cl_sbar.value || (scr_viewsize.value<100&&cl.splitclients==1))
|
if (cl_sbar.value || (scr_viewsize.value<100))
|
||||||
|
{
|
||||||
|
if (cl_sbar.ival != 1 && scr_viewsize.value >= 100)
|
||||||
|
R2D_ImageColours (cl_sbaralpha.value, cl_sbaralpha.value, cl_sbaralpha.value, cl_sbaralpha.value);
|
||||||
Sbar_DrawPic (0, 0, 320, 24, sb_sbar);
|
Sbar_DrawPic (0, 0, 320, 24, sb_sbar);
|
||||||
|
R2D_ImageColours (1, 1, 1, 1);
|
||||||
|
}
|
||||||
|
|
||||||
//hipnotic's keys appear to the right of health.
|
//hipnotic's keys appear to the right of health.
|
||||||
if (sbar_hipnotic)
|
if (sbar_hipnotic)
|
||||||
|
@ -2189,7 +2202,7 @@ qboolean Sbar_ShouldDraw (playerview_t *pv)
|
||||||
return false;
|
return false;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
headsup = !(cl_sbar.value || (scr_viewsize.value<100&&cl.splitclients==1));
|
headsup = !(cl_sbar.value || (scr_viewsize.value<100));
|
||||||
if ((sb_updates >= vid.numpages) && !headsup)
|
if ((sb_updates >= vid.numpages) && !headsup)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -2755,7 +2768,7 @@ void Sbar_Draw (playerview_t *pv)
|
||||||
qboolean minidmoverlay;
|
qboolean minidmoverlay;
|
||||||
extern cvar_t scr_centersbar;
|
extern cvar_t scr_centersbar;
|
||||||
|
|
||||||
headsup = !(cl_sbar.value || (scr_viewsize.value<100&&cl.splitclients==1));
|
headsup = !(cl_sbar.value || (scr_viewsize.value<100));
|
||||||
if ((sb_updates >= vid.numpages) && !headsup)
|
if ((sb_updates >= vid.numpages) && !headsup)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
@ -1172,8 +1172,8 @@ void V_ApplyAFov(playerview_t *pv)
|
||||||
if (!afov) //make sure its sensible.
|
if (!afov) //make sure its sensible.
|
||||||
afov = scr_fov.value;
|
afov = scr_fov.value;
|
||||||
#ifdef QUAKESTATS
|
#ifdef QUAKESTATS
|
||||||
if (pv && pv->stats[STAT_VIEWZOOM])
|
if (pv && pv->statsf[STAT_VIEWZOOM])
|
||||||
afov *= pv->stats[STAT_VIEWZOOM]/255.0f;
|
afov *= pv->statsf[STAT_VIEWZOOM]/255.0f;
|
||||||
#endif
|
#endif
|
||||||
afov = bound(0.001, afov, 170);
|
afov = bound(0.001, afov, 170);
|
||||||
|
|
||||||
|
|
|
@ -727,6 +727,21 @@ void Cmd_Exec_f (void)
|
||||||
BZ_Free(f);
|
BZ_Free(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int QDECL CompleteExecList (const char *name, qofs_t flags, time_t mtime, void *parm, searchpathfuncs_t *spath)
|
||||||
|
{
|
||||||
|
struct xcommandargcompletioncb_s *ctx = parm;
|
||||||
|
ctx->cb(name, ctx);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
void Cmd_Exec_c(int argn, char *partial, struct xcommandargcompletioncb_s *ctx)
|
||||||
|
{
|
||||||
|
if (argn == 1)
|
||||||
|
{
|
||||||
|
COM_EnumerateFiles(va("configs/%s*.cfg", partial), CompleteExecList, ctx);
|
||||||
|
COM_EnumerateFiles(va("%s*.cfg", partial), CompleteExecList, ctx);
|
||||||
|
COM_EnumerateFiles(va("%s*.rc", partial), CompleteExecList, ctx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
===============
|
===============
|
||||||
|
@ -1198,6 +1213,7 @@ typedef struct cmd_function_s
|
||||||
char *name;
|
char *name;
|
||||||
char *description;
|
char *description;
|
||||||
xcommand_t function;
|
xcommand_t function;
|
||||||
|
xcommandargcompletion_t argcompletion;
|
||||||
|
|
||||||
qbyte restriction; //restriction of admin level
|
qbyte restriction; //restriction of admin level
|
||||||
} cmd_function_t;
|
} cmd_function_t;
|
||||||
|
@ -1667,7 +1683,7 @@ Cmd_AddCommand
|
||||||
============
|
============
|
||||||
*/
|
*/
|
||||||
|
|
||||||
qboolean Cmd_AddCommandD (char *cmd_name, xcommand_t function, char *desc)
|
qboolean Cmd_AddCommandAD (char *cmd_name, xcommand_t function, xcommandargcompletion_t argcompletion, char *desc)
|
||||||
{
|
{
|
||||||
cmd_function_t *cmd;
|
cmd_function_t *cmd;
|
||||||
|
|
||||||
|
@ -1696,6 +1712,7 @@ qboolean Cmd_AddCommandD (char *cmd_name, xcommand_t function, char *desc)
|
||||||
|
|
||||||
cmd = (cmd_function_t*)Z_Malloc (sizeof(cmd_function_t)+strlen(cmd_name)+1);
|
cmd = (cmd_function_t*)Z_Malloc (sizeof(cmd_function_t)+strlen(cmd_name)+1);
|
||||||
cmd->name = (char*)(cmd+1);
|
cmd->name = (char*)(cmd+1);
|
||||||
|
cmd->argcompletion = argcompletion;
|
||||||
cmd->description = desc;
|
cmd->description = desc;
|
||||||
strcpy(cmd->name, cmd_name);
|
strcpy(cmd->name, cmd_name);
|
||||||
cmd->function = function;
|
cmd->function = function;
|
||||||
|
@ -1706,9 +1723,13 @@ qboolean Cmd_AddCommandD (char *cmd_name, xcommand_t function, char *desc)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qboolean Cmd_AddCommandD (char *cmd_name, xcommand_t function, char *desc)
|
||||||
|
{
|
||||||
|
return Cmd_AddCommandAD(cmd_name, function, NULL, desc);
|
||||||
|
}
|
||||||
qboolean Cmd_AddCommand (char *cmd_name, xcommand_t function)
|
qboolean Cmd_AddCommand (char *cmd_name, xcommand_t function)
|
||||||
{
|
{
|
||||||
return Cmd_AddCommandD(cmd_name, function, NULL);
|
return Cmd_AddCommandAD(cmd_name, function, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Cmd_RemoveCommand (char *cmd_name)
|
void Cmd_RemoveCommand (char *cmd_name)
|
||||||
|
@ -1942,7 +1963,7 @@ typedef struct {
|
||||||
char result[256];
|
char result[256];
|
||||||
const char *desc;
|
const char *desc;
|
||||||
} match_t;
|
} match_t;
|
||||||
void Cmd_CompleteCheck(char *check, match_t *match, const char *desc) //compare cumulative strings and join the result
|
void Cmd_CompleteCheck(const char *check, match_t *match, const char *desc) //compare cumulative strings and join the result
|
||||||
{
|
{
|
||||||
if (*match->result)
|
if (*match->result)
|
||||||
{
|
{
|
||||||
|
@ -1971,6 +1992,59 @@ void Cmd_CompleteCheck(char *check, match_t *match, const char *desc) //compare
|
||||||
match->desc = desc;
|
match->desc = desc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
struct cmdargcompletionctx_s
|
||||||
|
{
|
||||||
|
struct xcommandargcompletioncb_s cb;
|
||||||
|
cmd_function_t *cmd;
|
||||||
|
char *prefix;
|
||||||
|
size_t prefixlen;
|
||||||
|
match_t *match;
|
||||||
|
const char *desc;
|
||||||
|
};
|
||||||
|
void Cmd_CompleteCheckArg(const char *value, void *vctx) //compare cumulative strings and join the result
|
||||||
|
{
|
||||||
|
struct cmdargcompletionctx_s *ctx = vctx;
|
||||||
|
match_t *match = ctx->match;
|
||||||
|
const char *desc = ctx->desc;
|
||||||
|
|
||||||
|
if (ctx->prefixlen >= countof(match->result)-1)
|
||||||
|
return; //don't allow overflows.
|
||||||
|
|
||||||
|
if (*match->result)
|
||||||
|
{
|
||||||
|
char *r;
|
||||||
|
const char *check;
|
||||||
|
if (match->allowcutdown)
|
||||||
|
{
|
||||||
|
for(r = match->result, check=ctx->prefix; check < ctx->prefix+ctx->prefixlen && *r == *check && *r; r++, check++)
|
||||||
|
;
|
||||||
|
if (check == ctx->prefix+ctx->prefixlen)
|
||||||
|
{
|
||||||
|
for(check=value; *r == *check && *r; r++, check++)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
*r = '\0';
|
||||||
|
match->cutdown = true;
|
||||||
|
if (match->matchnum > 0)
|
||||||
|
match->matchnum--;
|
||||||
|
}
|
||||||
|
else if (match->matchnum > 0)
|
||||||
|
{
|
||||||
|
memcpy(match->result, ctx->prefix, ctx->prefixlen);
|
||||||
|
Q_strncpyz(match->result+ctx->prefixlen, value, sizeof(match->result)-ctx->prefixlen);
|
||||||
|
match->desc = desc;
|
||||||
|
match->matchnum--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (match->matchnum > 0)
|
||||||
|
match->matchnum--;
|
||||||
|
memcpy(match->result, ctx->prefix, ctx->prefixlen);
|
||||||
|
Q_strncpyz(match->result+ctx->prefixlen, value, sizeof(match->result)-ctx->prefixlen);
|
||||||
|
match->desc = desc;
|
||||||
|
}
|
||||||
|
}
|
||||||
char *Cmd_CompleteCommand (char *partial, qboolean fullonly, qboolean caseinsens, int matchnum, const char **descptr)
|
char *Cmd_CompleteCommand (char *partial, qboolean fullonly, qboolean caseinsens, int matchnum, const char **descptr)
|
||||||
{
|
{
|
||||||
extern cvar_group_t *cvar_groups;
|
extern cvar_group_t *cvar_groups;
|
||||||
|
@ -1984,11 +2058,19 @@ char *Cmd_CompleteCommand (char *partial, qboolean fullonly, qboolean caseinsens
|
||||||
cvar_t *cvar;
|
cvar_t *cvar;
|
||||||
char *sp;
|
char *sp;
|
||||||
|
|
||||||
sp = strchr(partial, ' ');
|
for (sp = partial; *sp; sp++)
|
||||||
if (sp)
|
{
|
||||||
len = sp - partial;
|
if (*sp == ' ' || *sp == '\t')
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
len = sp - partial;
|
||||||
|
if (*sp)
|
||||||
|
{
|
||||||
|
while (*sp == ' ' || *sp == '\t')
|
||||||
|
sp++;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
len = Q_strlen(partial);
|
sp = NULL;
|
||||||
|
|
||||||
if (descptr)
|
if (descptr)
|
||||||
*descptr = NULL;
|
*descptr = NULL;
|
||||||
|
@ -2014,7 +2096,21 @@ char *Cmd_CompleteCommand (char *partial, qboolean fullonly, qboolean caseinsens
|
||||||
{
|
{
|
||||||
for (cmd=cmd_functions ; cmd ; cmd=cmd->next)
|
for (cmd=cmd_functions ; cmd ; cmd=cmd->next)
|
||||||
if (!Q_strncasecmp (partial,cmd->name, len) && (matchnum == -1 || !partial[len] || strlen(cmd->name) == len))
|
if (!Q_strncasecmp (partial,cmd->name, len) && (matchnum == -1 || !partial[len] || strlen(cmd->name) == len))
|
||||||
Cmd_CompleteCheck(cmd->name, &match, cmd->description);
|
{
|
||||||
|
if (sp && cmd->argcompletion)
|
||||||
|
{
|
||||||
|
struct cmdargcompletionctx_s ctx;
|
||||||
|
ctx.cb.cb = Cmd_CompleteCheckArg;
|
||||||
|
ctx.cmd = cmd;
|
||||||
|
ctx.prefix = partial;
|
||||||
|
ctx.prefixlen = sp-partial;
|
||||||
|
ctx.match = &match;
|
||||||
|
ctx.desc = cmd->description;
|
||||||
|
cmd->argcompletion(1, sp, &ctx.cb);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Cmd_CompleteCheck(cmd->name, &match, cmd->description);
|
||||||
|
}
|
||||||
for (a=cmd_alias ; a ; a=a->next)
|
for (a=cmd_alias ; a ; a=a->next)
|
||||||
if (!Q_strncasecmp (partial, a->name, len) && (matchnum == -1 || !partial[len] || strlen(a->name) == len))
|
if (!Q_strncasecmp (partial, a->name, len) && (matchnum == -1 || !partial[len] || strlen(a->name) == len))
|
||||||
Cmd_CompleteCheck(a->name, &match, "");
|
Cmd_CompleteCheck(a->name, &match, "");
|
||||||
|
@ -3675,12 +3771,12 @@ void Cmd_Init (void)
|
||||||
//
|
//
|
||||||
// register our commands
|
// register our commands
|
||||||
//
|
//
|
||||||
Cmd_AddCommand ("cfg_save",Cmd_WriteConfig_f);
|
Cmd_AddCommandAD ("cfg_save",Cmd_WriteConfig_f, Cmd_Exec_c, NULL);
|
||||||
|
|
||||||
Cmd_AddCommand ("cfg_load",Cmd_Exec_f);
|
Cmd_AddCommandAD ("cfg_load",Cmd_Exec_f, Cmd_Exec_c, NULL);
|
||||||
Cmd_AddCommand ("cfg_reset",Cmd_Reset_f);
|
Cmd_AddCommand ("cfg_reset",Cmd_Reset_f);
|
||||||
|
|
||||||
Cmd_AddCommand ("exec",Cmd_Exec_f);
|
Cmd_AddCommandAD ("exec",Cmd_Exec_f, Cmd_Exec_c, NULL);
|
||||||
Cmd_AddCommand ("echo",Cmd_Echo_f);
|
Cmd_AddCommand ("echo",Cmd_Echo_f);
|
||||||
Cmd_AddCommand ("alias",Cmd_Alias_f);
|
Cmd_AddCommand ("alias",Cmd_Alias_f);
|
||||||
Cmd_AddCommand ("newalias",Cmd_Alias_f);
|
Cmd_AddCommand ("newalias",Cmd_Alias_f);
|
||||||
|
|
|
@ -71,6 +71,12 @@ then searches for a command or variable that matches the first token.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
typedef void (*xcommand_t) (void);
|
typedef void (*xcommand_t) (void);
|
||||||
|
struct xcommandargcompletioncb_s
|
||||||
|
{
|
||||||
|
void(*cb)(const char *arg, struct xcommandargcompletioncb_s *ctx);
|
||||||
|
//private stuff follows.
|
||||||
|
};
|
||||||
|
typedef void (*xcommandargcompletion_t)(int argn, char *partial, struct xcommandargcompletioncb_s *ctx);
|
||||||
|
|
||||||
int Cmd_Level(char *name);
|
int Cmd_Level(char *name);
|
||||||
void Cmd_EnumerateLevel(int level, char *buf, size_t bufsize);
|
void Cmd_EnumerateLevel(int level, char *buf, size_t bufsize);
|
||||||
|
@ -83,6 +89,7 @@ void Cmd_RemoveCommands (xcommand_t function); //unregister all commands that us
|
||||||
void Cmd_RemoveCommand (char *cmd_name);
|
void Cmd_RemoveCommand (char *cmd_name);
|
||||||
qboolean Cmd_AddCommand (char *cmd_name, xcommand_t function);
|
qboolean Cmd_AddCommand (char *cmd_name, xcommand_t function);
|
||||||
qboolean Cmd_AddCommandD (char *cmd_name, xcommand_t function, char *description);
|
qboolean Cmd_AddCommandD (char *cmd_name, xcommand_t function, char *description);
|
||||||
|
qboolean Cmd_AddCommandAD (char *cmd_name, xcommand_t function, xcommandargcompletion_t argcomplete, char *description);
|
||||||
// called by the init functions of other parts of the program to
|
// called by the init functions of other parts of the program to
|
||||||
// register commands and functions to call for them.
|
// register commands and functions to call for them.
|
||||||
// The cmd_name is referenced later, so it should not be in temp memory
|
// The cmd_name is referenced later, so it should not be in temp memory
|
||||||
|
|
|
@ -1975,11 +1975,12 @@ static qbyte *Q1BSP_ClusterPVS (model_t *model, int cluster, pvsbuffer_t *buffer
|
||||||
memset(buffer->buffer, 0xff, model->pvsbytes);
|
memset(buffer->buffer, 0xff, model->pvsbytes);
|
||||||
return buffer->buffer;
|
return buffer->buffer;
|
||||||
}
|
}
|
||||||
cluster++;
|
|
||||||
|
|
||||||
if (merge == PVM_FAST && model->pvs)
|
if (merge == PVM_FAST && model->pvs)
|
||||||
return model->pvs + cluster * model->pvsbytes;
|
return model->pvs + cluster * model->pvsbytes;
|
||||||
|
|
||||||
|
cluster++;
|
||||||
|
|
||||||
if (!buffer)
|
if (!buffer)
|
||||||
buffer = &mod_tempvis;
|
buffer = &mod_tempvis;
|
||||||
|
|
||||||
|
|
|
@ -197,6 +197,7 @@ struct world_s
|
||||||
unsigned int framenum;
|
unsigned int framenum;
|
||||||
int lastcheck; // used by PF_checkclient
|
int lastcheck; // used by PF_checkclient
|
||||||
double lastchecktime; // for monster ai
|
double lastchecktime; // for monster ai
|
||||||
|
qbyte *lastcheckpvs; // for monster ai
|
||||||
|
|
||||||
float defaultgravityscale; //0 in QW, 1 for anything else (inc csqc)
|
float defaultgravityscale; //0 in QW, 1 for anything else (inc csqc)
|
||||||
|
|
||||||
|
|
|
@ -3621,12 +3621,13 @@ void D3D9BE_VBO_Destroy(vboarray_t *vearray, void *mem)
|
||||||
void D3D9BE_Scissor(srect_t *srect)
|
void D3D9BE_Scissor(srect_t *srect)
|
||||||
{
|
{
|
||||||
RECT rect;
|
RECT rect;
|
||||||
|
|
||||||
if (srect)
|
if (srect)
|
||||||
{
|
{
|
||||||
rect.left = (srect->x) * vid.fbpwidth;
|
rect.left = (srect->x) * vid.fbpwidth;
|
||||||
rect.right = (srect->x + srect->width) * vid.fbpwidth;
|
rect.right = (srect->x + srect->width) * vid.fbpwidth;
|
||||||
rect.top = (srect->y) * vid.fbpheight;
|
rect.top = (1 - (srect->height + srect->y))*vid.fbpheight; //our api was made for gl. :(
|
||||||
rect.bottom = (srect->y + srect->height) * vid.fbpheight;
|
rect.bottom = (1 - (srect->y))*vid.fbpheight; //our api was made for gl. :(
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -3190,6 +3190,13 @@ static void BE_Program_Set_Attributes(const program_t *prog, unsigned int perm,
|
||||||
shaderstate.lastuniform = 0;
|
shaderstate.lastuniform = 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
else
|
||||||
|
{
|
||||||
|
vec4_t param4;
|
||||||
|
Vector4Set(param4, shaderstate.identitylighting, shaderstate.identitylighting, shaderstate.identitylighting, 1);
|
||||||
|
qglUniform4fvARB(ph, 1, (GLfloat*)param4);
|
||||||
|
}
|
||||||
|
break;
|
||||||
case SP_E_LMSCALE:
|
case SP_E_LMSCALE:
|
||||||
#if MAXRLIGHTMAPS > 1
|
#if MAXRLIGHTMAPS > 1
|
||||||
if (perm & PERMUTATION_LIGHTSTYLES)
|
if (perm & PERMUTATION_LIGHTSTYLES)
|
||||||
|
@ -3230,19 +3237,17 @@ static void BE_Program_Set_Attributes(const program_t *prog, unsigned int perm,
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
vec4_t colscale[4];
|
|
||||||
if (shaderstate.curentity->model && (shaderstate.curentity->model->engineflags & MDLF_NEEDOVERBRIGHT) && !shaderstate.force2d)
|
if (shaderstate.curentity->model && (shaderstate.curentity->model->engineflags & MDLF_NEEDOVERBRIGHT) && !shaderstate.force2d)
|
||||||
{
|
{
|
||||||
float sc = (1<<bound(0, gl_overbright.ival, 2)) * shaderstate.identitylighting;
|
float sc = (1<<bound(0, gl_overbright.ival, 2)) * shaderstate.identitylighting;
|
||||||
VectorSet(colscale[0], sc, sc, sc);
|
Vector4Set(param4, sc, sc, sc, 1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
VectorSet(colscale[0], shaderstate.identitylighting, shaderstate.identitylighting, shaderstate.identitylighting);
|
Vector4Set(param4, shaderstate.identitylighting, shaderstate.identitylighting, shaderstate.identitylighting, 1);
|
||||||
}
|
}
|
||||||
colscale[0][3] = 1;
|
|
||||||
|
|
||||||
qglUniform4fvARB(ph, 1, (GLfloat*)colscale);
|
qglUniform4fvARB(ph, 1, (GLfloat*)param4);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -701,6 +701,10 @@ qboolean Mod_PurgeModel(model_t *mod, enum mod_purge_e ptype)
|
||||||
mod->pvs = NULL;
|
mod->pvs = NULL;
|
||||||
mod->phs = NULL;
|
mod->phs = NULL;
|
||||||
|
|
||||||
|
#ifndef CLIENTONLY
|
||||||
|
sv.world.lastcheckpvs = NULL; //if the server has that cached, flush it just in case.
|
||||||
|
#endif
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5181,7 +5185,8 @@ TRACE(("LoadBrushModel %i\n", __LINE__));
|
||||||
|
|
||||||
submod->radius = RadiusFromBounds (submod->mins, submod->maxs);
|
submod->radius = RadiusFromBounds (submod->mins, submod->maxs);
|
||||||
|
|
||||||
submod->numclusters = bm->visleafs;
|
submod->numclusters = (i==0)?bm->visleafs:0;
|
||||||
|
submod->pvsbytes = ((submod->numclusters+31)>>3)&~3;
|
||||||
|
|
||||||
if (i)
|
if (i)
|
||||||
submod->entities_raw = NULL;
|
submod->entities_raw = NULL;
|
||||||
|
|
|
@ -1933,6 +1933,7 @@ struct shader_field_names_s shader_unif_names[] =
|
||||||
/*ent properties*/
|
/*ent properties*/
|
||||||
{"e_vblend", SP_E_VBLEND},
|
{"e_vblend", SP_E_VBLEND},
|
||||||
{"e_lmscale", SP_E_LMSCALE}, /*overbright shifting*/
|
{"e_lmscale", SP_E_LMSCALE}, /*overbright shifting*/
|
||||||
|
{"e_vlscale", SP_E_VLSCALE}, /*no lightmaps, no overbrights*/
|
||||||
{"e_origin", SP_E_ORIGIN},
|
{"e_origin", SP_E_ORIGIN},
|
||||||
{"e_time", SP_E_TIME},
|
{"e_time", SP_E_TIME},
|
||||||
{"e_eyepos", SP_E_EYEPOS},
|
{"e_eyepos", SP_E_EYEPOS},
|
||||||
|
@ -5278,7 +5279,7 @@ void QDECL R_BuildLegacyTexnums(shader_t *shader, const char *fallbackname, cons
|
||||||
if (!TEXVALID(tex->bump) && *mapname)
|
if (!TEXVALID(tex->bump) && *mapname)
|
||||||
tex->bump = R_LoadHiResTexture(va("%s_norm", mapname), NULL, imageflags|IF_TRYBUMP);
|
tex->bump = R_LoadHiResTexture(va("%s_norm", mapname), NULL, imageflags|IF_TRYBUMP);
|
||||||
if (!TEXVALID(tex->bump) && (r_shadow_bumpscale_basetexture.ival||*imagename=='#'||gl_load24bit.ival))
|
if (!TEXVALID(tex->bump) && (r_shadow_bumpscale_basetexture.ival||*imagename=='#'||gl_load24bit.ival))
|
||||||
tex->bump = Image_GetTexture(va("%s_norm", imagename), subpath, imageflags|IF_TRYBUMP, (r_shadow_bumpscale_basetexture.ival||*imagename=='#')?mipdata[0]:NULL, palette, width, height, TF_HEIGHT8PAL);
|
tex->bump = Image_GetTexture(va("%s_norm", imagename), subpath, imageflags|IF_TRYBUMP|(*imagename=='#'?IF_LINEAR:0), (r_shadow_bumpscale_basetexture.ival||*imagename=='#')?mipdata[0]:NULL, palette, width, height, TF_HEIGHT8PAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (loadflags & SHADER_HASTOPBOTTOM)
|
if (loadflags & SHADER_HASTOPBOTTOM)
|
||||||
|
|
|
@ -4229,7 +4229,7 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
||||||
"varying vec2 tc;\n"
|
"varying vec2 tc;\n"
|
||||||
"varying vec4 vc;\n"
|
"varying vec4 vc;\n"
|
||||||
"uniform vec4 e_colourident;\n"
|
"uniform vec4 e_colourident;\n"
|
||||||
"uniform vec4 e_lmscale;\n"
|
"uniform vec4 e_vlscale;\n"
|
||||||
"void main ()\n"
|
"void main ()\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
"vec4 col = texture2D(s_t0, tc);\n"
|
"vec4 col = texture2D(s_t0, tc);\n"
|
||||||
|
@ -4237,7 +4237,7 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
||||||
"if (col.a < float(MASK))\n"
|
"if (col.a < float(MASK))\n"
|
||||||
"discard;\n"
|
"discard;\n"
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
"gl_FragColor = fog4blend(col * vc * e_colourident * e_lmscale);\n"
|
"gl_FragColor = fog4blend(col * vc * e_colourident * e_vlscale);\n"
|
||||||
"}\n"
|
"}\n"
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
},
|
},
|
||||||
|
|
|
@ -3564,11 +3564,10 @@ static void QCBUILTIN PF_TraceToss (pubprogfuncs_t *prinst, struct globalvars_s
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
pvsbuffer_t checkpvsbuffer;
|
pvsbuffer_t checkpvsbuffer;
|
||||||
qbyte *checkpvs;
|
|
||||||
vec3_t checkorg;
|
vec3_t checkorg;
|
||||||
extern cvar_t sv_nopvs;
|
extern cvar_t sv_nopvs;
|
||||||
|
|
||||||
int PF_newcheckclient (pubprogfuncs_t *prinst, int check)
|
void PF_newcheckclient (pubprogfuncs_t *prinst, world_t *w)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
// qbyte *pvs;
|
// qbyte *pvs;
|
||||||
|
@ -3577,15 +3576,15 @@ int PF_newcheckclient (pubprogfuncs_t *prinst, int check)
|
||||||
|
|
||||||
// cycle to the next one
|
// cycle to the next one
|
||||||
|
|
||||||
if (check < 1)
|
if (w->lastcheck < 1)
|
||||||
check = 1;
|
w->lastcheck = 1;
|
||||||
if (check > sv.allocated_client_slots)
|
if (w->lastcheck > sv.allocated_client_slots)
|
||||||
check = sv.allocated_client_slots;
|
w->lastcheck = sv.allocated_client_slots;
|
||||||
|
|
||||||
if (check == sv.allocated_client_slots)
|
if (w->lastcheck == sv.allocated_client_slots)
|
||||||
i = 1;
|
i = 1;
|
||||||
else
|
else
|
||||||
i = check + 1;
|
i = w->lastcheck + 1;
|
||||||
|
|
||||||
for ( ; ; i++)
|
for ( ; ; i++)
|
||||||
{
|
{
|
||||||
|
@ -3594,7 +3593,7 @@ int PF_newcheckclient (pubprogfuncs_t *prinst, int check)
|
||||||
|
|
||||||
ent = EDICT_NUM(prinst, i);
|
ent = EDICT_NUM(prinst, i);
|
||||||
|
|
||||||
if (i == check)
|
if (i == w->lastcheck)
|
||||||
break; // didn't find anything else
|
break; // didn't find anything else
|
||||||
|
|
||||||
if (ED_ISFREE(ent))
|
if (ED_ISFREE(ent))
|
||||||
|
@ -3611,14 +3610,14 @@ int PF_newcheckclient (pubprogfuncs_t *prinst, int check)
|
||||||
// get the PVS for the entity
|
// get the PVS for the entity
|
||||||
VectorAdd (ent->v->origin, ent->v->view_ofs, checkorg);
|
VectorAdd (ent->v->origin, ent->v->view_ofs, checkorg);
|
||||||
if (sv.world.worldmodel->type == mod_heightmap || sv_nopvs.ival)
|
if (sv.world.worldmodel->type == mod_heightmap || sv_nopvs.ival)
|
||||||
checkpvs = NULL;
|
w->lastcheckpvs = NULL;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
cluster = sv.world.worldmodel->funcs.ClusterForPoint(sv.world.worldmodel, checkorg);
|
cluster = sv.world.worldmodel->funcs.ClusterForPoint(sv.world.worldmodel, checkorg);
|
||||||
checkpvs = sv.world.worldmodel->funcs.ClusterPVS (sv.world.worldmodel, cluster, &checkpvsbuffer, PVM_FAST);
|
w->lastcheckpvs = sv.world.worldmodel->funcs.ClusterPVS (sv.world.worldmodel, cluster, &checkpvsbuffer, PVM_FAST);
|
||||||
}
|
}
|
||||||
|
|
||||||
return i;
|
w->lastcheck = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -3637,7 +3636,6 @@ name checkclient ()
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
#define MAX_CHECK 16
|
#define MAX_CHECK 16
|
||||||
int c_invis, c_notvis;
|
|
||||||
int PF_checkclient_Internal (pubprogfuncs_t *prinst)
|
int PF_checkclient_Internal (pubprogfuncs_t *prinst)
|
||||||
{
|
{
|
||||||
edict_t *ent, *self;
|
edict_t *ent, *self;
|
||||||
|
@ -3649,7 +3647,7 @@ int PF_checkclient_Internal (pubprogfuncs_t *prinst)
|
||||||
// find a new check if on a new frame
|
// find a new check if on a new frame
|
||||||
if (w->physicstime - w->lastchecktime >= 0.1)
|
if (w->physicstime - w->lastchecktime >= 0.1)
|
||||||
{
|
{
|
||||||
w->lastcheck = PF_newcheckclient (prinst, w->lastcheck);
|
PF_newcheckclient (prinst, w);
|
||||||
w->lastchecktime = w->physicstime;
|
w->lastchecktime = w->physicstime;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3668,18 +3666,16 @@ int PF_checkclient_Internal (pubprogfuncs_t *prinst)
|
||||||
if (DotProduct(dist, dist) > 2048*2048)
|
if (DotProduct(dist, dist) > 2048*2048)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (checkpvs)
|
if (w->lastcheckpvs)
|
||||||
{
|
{
|
||||||
clust = w->worldmodel->funcs.ClusterForPoint(w->worldmodel, view);
|
clust = w->worldmodel->funcs.ClusterForPoint(w->worldmodel, view);
|
||||||
if ( (clust<0) || !(checkpvs[clust>>3] & (1<<(clust&7)) ) )
|
if ( (clust<0) || !(w->lastcheckpvs[clust>>3] & (1<<(clust&7)) ) )
|
||||||
{
|
{
|
||||||
c_notvis++;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// might be able to see it
|
// might be able to see it. the qc will do some tracelines to ensure that it can.
|
||||||
c_invis++;
|
|
||||||
return w->lastcheck;
|
return w->lastcheck;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1292,6 +1292,38 @@ void SV_Savegame (const char *savename, qboolean mapchange)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int QDECL CompleteSaveList (const char *name, qofs_t flags, time_t mtime, void *parm, searchpathfuncs_t *spath)
|
||||||
|
{
|
||||||
|
struct xcommandargcompletioncb_s *ctx = parm;
|
||||||
|
char trimmed[256];
|
||||||
|
size_t l;
|
||||||
|
Q_strncpyz(trimmed, name+6, sizeof(trimmed));
|
||||||
|
l = strlen(trimmed);
|
||||||
|
if (l >= 9 && !Q_strcasecmp(trimmed+l-9, "/info.fsv"))
|
||||||
|
{
|
||||||
|
trimmed[l-9] = 0;
|
||||||
|
ctx->cb(trimmed, ctx);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
static int QDECL CompleteSaveListLegacy (const char *name, qofs_t flags, time_t mtime, void *parm, searchpathfuncs_t *spath)
|
||||||
|
{
|
||||||
|
struct xcommandargcompletioncb_s *ctx = parm;
|
||||||
|
char stripped[64];
|
||||||
|
COM_StripExtension(name, stripped, sizeof(stripped));
|
||||||
|
ctx->cb(stripped, ctx);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
void SV_Savegame_c(int argn, char *partial, struct xcommandargcompletioncb_s *ctx)
|
||||||
|
{
|
||||||
|
if (argn == 1)
|
||||||
|
{
|
||||||
|
COM_EnumerateFiles(va("saves/%s*/info.fsv", partial), CompleteSaveList, ctx);
|
||||||
|
COM_EnumerateFiles(va("%s*.sav", partial), CompleteSaveListLegacy, ctx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void SV_Savegame_f (void)
|
void SV_Savegame_f (void)
|
||||||
{
|
{
|
||||||
if (Cmd_Argc() <= 2)
|
if (Cmd_Argc() <= 2)
|
||||||
|
|
|
@ -628,6 +628,7 @@ typedef struct client_s
|
||||||
#endif
|
#endif
|
||||||
unsigned int zquake_extensions;
|
unsigned int zquake_extensions;
|
||||||
unsigned int max_net_ents; /*highest entity number the client can receive (limited by either protocol or client's buffer size)*/
|
unsigned int max_net_ents; /*highest entity number the client can receive (limited by either protocol or client's buffer size)*/
|
||||||
|
unsigned int max_net_staticents; /*limit to the number of static ents supported by the client*/
|
||||||
unsigned int max_net_clients; /*max number of player slots supported by the client */
|
unsigned int max_net_clients; /*max number of player slots supported by the client */
|
||||||
unsigned int maxmodels; /*max models supported by whatever the protocol is*/
|
unsigned int maxmodels; /*max models supported by whatever the protocol is*/
|
||||||
|
|
||||||
|
@ -1563,6 +1564,7 @@ int SV_MVD_GotQTVRequest(vfsfile_t *clientstream, char *headerstart, char *heade
|
||||||
// savegame.c
|
// savegame.c
|
||||||
void SV_LegacySavegame_f(void);
|
void SV_LegacySavegame_f(void);
|
||||||
void SV_Savegame_f (void);
|
void SV_Savegame_f (void);
|
||||||
|
void SV_Savegame_c(int argn, char *partial, struct xcommandargcompletioncb_s *ctx);
|
||||||
void SV_Loadgame_f (void);
|
void SV_Loadgame_f (void);
|
||||||
void SV_AutoSave(void);
|
void SV_AutoSave(void);
|
||||||
void SV_FlushLevelCache(void);
|
void SV_FlushLevelCache(void);
|
||||||
|
|
|
@ -403,6 +403,37 @@ static void SV_MapList_f(void)
|
||||||
COM_EnumerateFiles("maps/*.hmp", ShowMapList, NULL);
|
COM_EnumerateFiles("maps/*.hmp", ShowMapList, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int QDECL CompleteMapList (const char *name, qofs_t flags, time_t mtime, void *parm, searchpathfuncs_t *spath)
|
||||||
|
{
|
||||||
|
struct xcommandargcompletioncb_s *ctx = parm;
|
||||||
|
char stripped[64];
|
||||||
|
if (name[5] == 'b' && name[6] == '_') //skip box models
|
||||||
|
return true;
|
||||||
|
|
||||||
|
COM_StripExtension(name+5, stripped, sizeof(stripped));
|
||||||
|
ctx->cb(stripped, ctx);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
static int QDECL CompleteMapListExt (const char *name, qofs_t flags, time_t mtime, void *parm, searchpathfuncs_t *spath)
|
||||||
|
{
|
||||||
|
struct xcommandargcompletioncb_s *ctx = parm;
|
||||||
|
if (name[5] == 'b' && name[6] == '_') //skip box models
|
||||||
|
return true;
|
||||||
|
|
||||||
|
ctx->cb(name+5, ctx);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
static void SV_Map_c(int argn, char *partial, struct xcommandargcompletioncb_s *ctx)
|
||||||
|
{
|
||||||
|
if (argn == 1)
|
||||||
|
{
|
||||||
|
COM_EnumerateFiles(va("maps/%s*.bsp", partial), CompleteMapList, ctx);
|
||||||
|
COM_EnumerateFiles(va("maps/%s*.map", partial), CompleteMapListExt, ctx);
|
||||||
|
COM_EnumerateFiles(va("maps/%s*.cm", partial), CompleteMapList, ctx);
|
||||||
|
COM_EnumerateFiles(va("maps/%s*.hmp", partial), CompleteMapList, ctx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//static void gtcallback(struct cvar_s *var, char *oldvalue)
|
//static void gtcallback(struct cvar_s *var, char *oldvalue)
|
||||||
//{
|
//{
|
||||||
// Con_Printf("g_gametype changed\n");
|
// Con_Printf("g_gametype changed\n");
|
||||||
|
@ -2978,13 +3009,13 @@ void SV_InitOperatorCommands (void)
|
||||||
Cmd_AddCommand ("mod", SV_SendGameCommand_f);
|
Cmd_AddCommand ("mod", SV_SendGameCommand_f);
|
||||||
|
|
||||||
Cmd_AddCommand ("killserver", SV_KillServer_f);
|
Cmd_AddCommand ("killserver", SV_KillServer_f);
|
||||||
Cmd_AddCommand ("map", SV_Map_f);
|
|
||||||
Cmd_AddCommandD ("precaches", SV_PrecacheList_f, "Displays a list of current server precaches.");
|
Cmd_AddCommandD ("precaches", SV_PrecacheList_f, "Displays a list of current server precaches.");
|
||||||
|
Cmd_AddCommandAD ("map", SV_Map_f, SV_Map_c, "Changes map. If a second argument is specified then that is normally the name of the initial start spot.");
|
||||||
#ifdef Q3SERVER
|
#ifdef Q3SERVER
|
||||||
Cmd_AddCommand ("spmap", SV_Map_f);
|
Cmd_AddCommandAD ("spmap", SV_Map_f, SV_Map_c, NULL);
|
||||||
#endif
|
#endif
|
||||||
Cmd_AddCommand ("gamemap", SV_Map_f);
|
Cmd_AddCommandAD ("gamemap", SV_Map_f, SV_Map_c, NULL);
|
||||||
Cmd_AddCommand ("changelevel", SV_Map_f);
|
Cmd_AddCommandAD ("changelevel", SV_Map_f, SV_Map_c, NULL);
|
||||||
Cmd_AddCommand ("listmaps", SV_MapList_f);
|
Cmd_AddCommand ("listmaps", SV_MapList_f);
|
||||||
Cmd_AddCommand ("maplist", SV_MapList_f);
|
Cmd_AddCommand ("maplist", SV_MapList_f);
|
||||||
|
|
||||||
|
|
|
@ -458,9 +458,6 @@ void SV_CalcPHS (void)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (model->pvsbytes > 4096)
|
|
||||||
return;
|
|
||||||
|
|
||||||
//FIXME: this can take a significant time on some maps, and should ideally be pushed to a worker thread.
|
//FIXME: this can take a significant time on some maps, and should ideally be pushed to a worker thread.
|
||||||
num = model->numclusters;
|
num = model->numclusters;
|
||||||
rowbytes = model->pvsbytes;
|
rowbytes = model->pvsbytes;
|
||||||
|
@ -514,7 +511,7 @@ void SV_CalcPHS (void)
|
||||||
if (f)
|
if (f)
|
||||||
{
|
{
|
||||||
VFS_READ(f, hdr, sizeof(hdr));
|
VFS_READ(f, hdr, sizeof(hdr));
|
||||||
if (memcmp(hdr, "QPHS\1\0\0\0", 8) || VFS_GETLEN(f) != rowbytes*num + 8)
|
if (!memcmp(hdr, "QPHS\1\0\0\0", 8) && VFS_GETLEN(f) == rowbytes*num + 8)
|
||||||
{
|
{
|
||||||
VFS_READ(f, model->phs, rowbytes*num);
|
VFS_READ(f, model->phs, rowbytes*num);
|
||||||
VFS_CLOSE(f);
|
VFS_CLOSE(f);
|
||||||
|
|
|
@ -1882,6 +1882,7 @@ void SV_ClientProtocolExtensionsChanged(client_t *client)
|
||||||
if (client->fteprotocolextensions2 & PEXT2_REPLACEMENTDELTAS)
|
if (client->fteprotocolextensions2 & PEXT2_REPLACEMENTDELTAS)
|
||||||
{
|
{
|
||||||
client->max_net_clients = ISQWCLIENT(client)?QWMAX_CLIENTS:NQMAX_CLIENTS;
|
client->max_net_clients = ISQWCLIENT(client)?QWMAX_CLIENTS:NQMAX_CLIENTS;
|
||||||
|
client->max_net_staticents = ~0u; //unlimited in both fte+qss.
|
||||||
|
|
||||||
//you need to reconnect for this to update, of course. so make sure its not *too* low...
|
//you need to reconnect for this to update, of course. so make sure its not *too* low...
|
||||||
client->max_net_ents = bound(512, pr_maxedicts.ival, MAX_EDICTS);
|
client->max_net_ents = bound(512, pr_maxedicts.ival, MAX_EDICTS);
|
||||||
|
@ -1895,7 +1896,8 @@ void SV_ClientProtocolExtensionsChanged(client_t *client)
|
||||||
client->max_net_ents += 512;
|
client->max_net_ents += 512;
|
||||||
if (client->fteprotocolextensions & PEXT_ENTITYDBL2)
|
if (client->fteprotocolextensions & PEXT_ENTITYDBL2)
|
||||||
client->max_net_ents += 1024;
|
client->max_net_ents += 1024;
|
||||||
|
client->max_net_staticents = 512; //the ezquake limit, too few people use vanilla to really care about that (it would be too unstable anyway). fodquake has no limit.
|
||||||
|
|
||||||
if (client->fteprotocolextensions & PEXT_MODELDBL)
|
if (client->fteprotocolextensions & PEXT_MODELDBL)
|
||||||
client->maxmodels = 512;
|
client->maxmodels = 512;
|
||||||
}
|
}
|
||||||
|
@ -1903,6 +1905,7 @@ void SV_ClientProtocolExtensionsChanged(client_t *client)
|
||||||
{
|
{
|
||||||
client->max_net_clients = 255;
|
client->max_net_clients = 255;
|
||||||
client->max_net_ents = bound(512, pr_maxedicts.ival, 32768);
|
client->max_net_ents = bound(512, pr_maxedicts.ival, 32768);
|
||||||
|
client->max_net_staticents = 1024; //its quite low, proportionally.
|
||||||
client->maxmodels = MAX_PRECACHE_MODELS; //protocol limit of 16 bits. 15 bits for late precaches. client limit of 1k
|
client->maxmodels = MAX_PRECACHE_MODELS; //protocol limit of 16 bits. 15 bits for late precaches. client limit of 1k
|
||||||
|
|
||||||
client->datagram.maxsize = sizeof(host_client->datagram_buf);
|
client->datagram.maxsize = sizeof(host_client->datagram_buf);
|
||||||
|
@ -1911,6 +1914,7 @@ void SV_ClientProtocolExtensionsChanged(client_t *client)
|
||||||
{
|
{
|
||||||
client->max_net_clients = NQMAX_CLIENTS;
|
client->max_net_clients = NQMAX_CLIENTS;
|
||||||
client->max_net_ents = bound(512, pr_maxedicts.ival, 32768); //fitzquake supports 65535, but our writeentity builtin works differently, which causes problems.
|
client->max_net_ents = bound(512, pr_maxedicts.ival, 32768); //fitzquake supports 65535, but our writeentity builtin works differently, which causes problems.
|
||||||
|
client->max_net_staticents = 4096; //quakespasm has 4k, more than 3k starts to have issues with the msg_init buffer size.
|
||||||
client->maxmodels = MAX_PRECACHE_MODELS;
|
client->maxmodels = MAX_PRECACHE_MODELS;
|
||||||
maxpacketentities = client->max_net_ents;
|
maxpacketentities = client->max_net_ents;
|
||||||
|
|
||||||
|
@ -1924,6 +1928,7 @@ void SV_ClientProtocolExtensionsChanged(client_t *client)
|
||||||
client->max_net_ents = bound(512, pr_maxedicts.ival, 8192);
|
client->max_net_ents = bound(512, pr_maxedicts.ival, 8192);
|
||||||
else
|
else
|
||||||
client->max_net_ents = bound(512, pr_maxedicts.ival, 600);
|
client->max_net_ents = bound(512, pr_maxedicts.ival, 600);
|
||||||
|
client->max_net_staticents = 128; //yeah, its low.
|
||||||
}
|
}
|
||||||
|
|
||||||
if (client->fteprotocolextensions2 & PEXT2_MAXPLAYERS)
|
if (client->fteprotocolextensions2 & PEXT2_MAXPLAYERS)
|
||||||
|
@ -5107,10 +5112,10 @@ void SV_InitLocal (void)
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
Cmd_AddCommand ("savegame_legacy", SV_LegacySavegame_f);
|
Cmd_AddCommand ("savegame_legacy", SV_LegacySavegame_f);
|
||||||
Cmd_AddCommand ("savegame", SV_Savegame_f);
|
Cmd_AddCommandAD ("savegame", SV_Savegame_f, SV_Savegame_c, NULL);
|
||||||
Cmd_AddCommand ("loadgame", SV_Loadgame_f);
|
Cmd_AddCommandAD ("loadgame", SV_Loadgame_f, SV_Savegame_c, NULL);
|
||||||
Cmd_AddCommand ("save", SV_Savegame_f);
|
Cmd_AddCommandAD ("save", SV_Savegame_f, SV_Savegame_c, NULL);
|
||||||
Cmd_AddCommand ("load", SV_Loadgame_f);
|
Cmd_AddCommandAD ("load", SV_Loadgame_f, SV_Savegame_c, NULL);
|
||||||
|
|
||||||
SV_MVDInit();
|
SV_MVDInit();
|
||||||
|
|
||||||
|
|
|
@ -1312,9 +1312,12 @@ void SV_SendClientPrespawnInfo(client_t *client)
|
||||||
|
|
||||||
if (client->prespawn_stage == PRESPAWN_SPAWNSTATIC)
|
if (client->prespawn_stage == PRESPAWN_SPAWNSTATIC)
|
||||||
{
|
{
|
||||||
|
int maxstatics = sv.num_static_entities;
|
||||||
|
if (maxstatics > 1024 && ISDPCLIENT(client))
|
||||||
|
maxstatics = 1024;
|
||||||
while (client->netchan.message.cursize < maxsize) //static entities
|
while (client->netchan.message.cursize < maxsize) //static entities
|
||||||
{
|
{
|
||||||
if (client->prespawn_idx >= sv.num_static_entities)
|
if (client->prespawn_idx >= maxstatics)
|
||||||
{
|
{
|
||||||
client->prespawn_stage++;
|
client->prespawn_stage++;
|
||||||
client->prespawn_idx = 0;
|
client->prespawn_idx = 0;
|
||||||
|
|
|
@ -20,7 +20,7 @@ uniform sampler2D s_t0;
|
||||||
varying vec2 tc;
|
varying vec2 tc;
|
||||||
varying vec4 vc;
|
varying vec4 vc;
|
||||||
uniform vec4 e_colourident;
|
uniform vec4 e_colourident;
|
||||||
uniform vec4 e_lmscale;
|
uniform vec4 e_vlscale;
|
||||||
void main ()
|
void main ()
|
||||||
{
|
{
|
||||||
vec4 col = texture2D(s_t0, tc);
|
vec4 col = texture2D(s_t0, tc);
|
||||||
|
@ -28,6 +28,6 @@ void main ()
|
||||||
if (col.a < float(MASK))
|
if (col.a < float(MASK))
|
||||||
discard;
|
discard;
|
||||||
#endif
|
#endif
|
||||||
gl_FragColor = fog4blend(col * vc * e_colourident * e_lmscale);
|
gl_FragColor = fog4blend(col * vc * e_colourident * e_vlscale);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -2948,7 +2948,7 @@ static void BE_CreatePipeline(program_t *p, unsigned int shaderflags, unsigned i
|
||||||
pipeCreateInfo.renderPass = (permu&PERMUTATION_BEM_DEPTHONLY)?vk.shadow_renderpass:vk.renderpass[0];
|
pipeCreateInfo.renderPass = (permu&PERMUTATION_BEM_DEPTHONLY)?vk.shadow_renderpass:vk.renderpass[0];
|
||||||
pipeCreateInfo.subpass = 0;
|
pipeCreateInfo.subpass = 0;
|
||||||
pipeCreateInfo.basePipelineHandle = VK_NULL_HANDLE;
|
pipeCreateInfo.basePipelineHandle = VK_NULL_HANDLE;
|
||||||
pipeCreateInfo.basePipelineIndex = -1; //not sure what this is about.
|
pipeCreateInfo.basePipelineIndex = -1; //used to create derivatives for pipelines created in the same call.
|
||||||
|
|
||||||
// pipeCreateInfo.flags = VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT;
|
// pipeCreateInfo.flags = VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT;
|
||||||
|
|
||||||
|
|
|
@ -2585,7 +2585,7 @@ qboolean VK_SCR_UpdateScreen (void)
|
||||||
{
|
{
|
||||||
VkImageMemoryBarrier imgbarrier = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER};
|
VkImageMemoryBarrier imgbarrier = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER};
|
||||||
imgbarrier.pNext = NULL;
|
imgbarrier.pNext = NULL;
|
||||||
imgbarrier.srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT|VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
|
imgbarrier.srcAccessMask = /*VK_ACCESS_TRANSFER_READ_BIT|*/VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
|
||||||
imgbarrier.dstAccessMask = 0;
|
imgbarrier.dstAccessMask = 0;
|
||||||
imgbarrier.oldLayout = fblayout;
|
imgbarrier.oldLayout = fblayout;
|
||||||
imgbarrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
|
imgbarrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
|
||||||
|
|
Loading…
Reference in a new issue