From f3ae58608b4c827e14793ee1715c2f0a3c6e1650 Mon Sep 17 00:00:00 2001 From: Spoike Date: Wed, 24 Jan 2018 12:13:32 +0000 Subject: [PATCH] QUAKETC with dpmaster fix. don't archive csprogs when it's getting saved into demos anyway. bound bones when using a model with less bones than the relative skeletal object. mute(dprint) xinput restarts. git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@5205 fc73d0e0-1445-4013-8a0c-d673dee63da5 --- engine/client/in_win.c | 7 +- engine/client/net_master.c | 29 +++- engine/client/pr_csqc.c | 11 +- engine/client/quakedef.h | 1 + engine/common/com_mesh.c | 2 +- engine/common/common.c | 1 + engine/common/fs.c | 1 + engine/common/protocol.h | 2 + engine/gl/gl_font.c | 228 +++++++++++++++++++-------- engine/gl/r_bishaders.h | 8 +- engine/qclib/qcc.h | 2 + engine/server/sv_main.c | 14 +- engine/shaders/glsl/defaultskin.glsl | 2 +- engine/shaders/glsl/rtlight.glsl | 2 +- 14 files changed, 227 insertions(+), 83 deletions(-) diff --git a/engine/client/in_win.c b/engine/client/in_win.c index 192028c87..33f823e17 100644 --- a/engine/client/in_win.c +++ b/engine/client/in_win.c @@ -1792,6 +1792,8 @@ void INS_StartupJoystick (void) } if (pXInputGetState) { + XINPUT_STATE xistate; + numdevs = 0; for (id = 0; id < 4; id++) { if (joy_count == countof(wjoy)) @@ -1802,8 +1804,11 @@ void INS_StartupJoystick (void) wjoy[joy_count].devid = DEVID_UNSET;//id; wjoy[joy_count].numbuttons = 18; //xinput supports 16 buttons, we emulate two more with the two triggers. joy_count++; + + if (ERROR_DEVICE_NOT_AVAILABLE != pXInputGetState(id, &xistate)) + numdevs++; } - Con_Printf("XInput is enabled (max %i controllers)\n", id); + Con_DPrintf("XInput is enabled (%i controllers found)\n", numdevs); } else Con_Printf("XInput not installed\n"); diff --git a/engine/client/net_master.c b/engine/client/net_master.c index ef1fa875e..c659f18a1 100644 --- a/engine/client/net_master.c +++ b/engine/client/net_master.c @@ -140,11 +140,21 @@ net_masterlist_t net_masterlist[] = { // {MP_QUAKEWORLD, CVARFC("net_qwmasterextraHistoric", "kubus.rulez.pl:27000", CVAR_NOSAVE, Net_Masterlist_Callback), "kubus.rulez.pl"}, // {MP_QUAKEWORLD, CVARFC("net_qwmasterextraHistoric", "telefrag.me:27000", CVAR_NOSAVE, Net_Masterlist_Callback), "telefrag.me"}, // {MP_QUAKEWORLD, CVARFC("net_qwmasterextraHistoric", "master.teamdamage.com:27000", CVAR_NOSAVE, Net_Masterlist_Callback), "master.teamdamage.com"}, -#endif + //Total conversions will need to define their own in defaults.cfg or whatever. {MP_DPMASTER, CVARFC("net_masterextra1", "ghdigital.com:27950 207.55.114.154:27950", CVAR_NOSAVE, Net_Masterlist_Callback)}, //207.55.114.154 (was 69.59.212.88 (admin: LordHavoc) {MP_DPMASTER, CVARFC("net_masterextra2", "dpmaster.deathmask.net:27950 107.161.23.68:27950 [2604:180::4ac:98c1]:27950", CVAR_NOSAVE, Net_Masterlist_Callback)}, //107.161.23.68 (admin: Willis) {MP_DPMASTER, CVARFC("net_masterextra3", "dpmaster.tchr.no:27950 92.62.40.73:27950", CVAR_NOSAVE, Net_Masterlist_Callback)}, //92.62.40.73 (admin: tChr) +#else + {MP_DPMASTER, CVARFC("net_masterextra1", "", CVAR_NOSAVE, Net_Masterlist_Callback)}, + {MP_DPMASTER, CVARFC("net_masterextra2", "", CVAR_NOSAVE, Net_Masterlist_Callback)}, + {MP_DPMASTER, CVARFC("net_masterextra3", "", CVAR_NOSAVE, Net_Masterlist_Callback)}, +#endif + {MP_DPMASTER, CVARFC("net_masterextra4", "", CVAR_NOSAVE, Net_Masterlist_Callback)}, + {MP_DPMASTER, CVARFC("net_masterextra5", "", CVAR_NOSAVE, Net_Masterlist_Callback)}, + {MP_DPMASTER, CVARFC("net_masterextra6", "", CVAR_NOSAVE, Net_Masterlist_Callback)}, + {MP_DPMASTER, CVARFC("net_masterextra7", "", CVAR_NOSAVE, Net_Masterlist_Callback)}, + {MP_DPMASTER, CVARFC("net_masterextra8", "", CVAR_NOSAVE, Net_Masterlist_Callback)}, #ifdef Q2CLIENT // {MP_QUAKE2, CVARFC("net_q2masterextra1", "satan.idsoftware.com:27900", CVAR_NOSAVE, Net_Masterlist_Callback), "Official Quake2 master server"}, @@ -275,7 +285,14 @@ void SV_Master_SingleHeartbeat(net_masterlist_t *master) break; #endif case MP_DPMASTER: - if (sv_listen_dp.value || sv_listen_nq.value) //set listen to 1 to allow qw connections, 2 to allow nq connections too. + //fte normally uses quakeworld masters for clients that support qw protocols, and dpmaster for clients that support nq protocols. + //unfortunately qwmasters don't support ipv6, and total conversions don't want to use qwmasters. + //we default to FTE-Quake when running quake so at least that part is fair. + //however, I made QSS also look for FTE-Quake servers too, so that's messy with listen_nq 0, but that's true if listen_dp is set. + //so we want to be quite permissive here, at least with custom builds that will default to these cvars set to 0. +#if defined(NQPROT) && !defined(QUAKETC) + if (sv_listen_dp.value || sv_listen_nq.value) +#endif { if (sv_reportheartbeats.value) { @@ -2471,6 +2488,7 @@ void MasterInfo_Request(master_t *mast) case MP_NETQUAKE: //there is no nq udp master protocol break; +#endif case MP_DPMASTER: { char *str; @@ -2483,14 +2501,13 @@ void MasterInfo_Request(master_t *mast) //for compat with dp, we use the nq netchan version. which is stupid, but whatever //we ask for ipv6 addresses from ipv6 masters (assuming it resolved okay) if (mast->adr.type == NA_IPV6) - str = va("%c%c%c%cgetserversExt %s %u empty full ipv6"/*\x0A\n"*/, 255, 255, 255, 255, game, NQ_NETCHAN_VERSION); + str = va("%c%c%c%cgetserversExt %s %u empty full ipv6"/*\x0A\n"*/, 255, 255, 255, 255, game, com_protocolversion.ival); else - str = va("%c%c%c%cgetservers %s %u empty full"/*\x0A\n"*/, 255, 255, 255, 255, game, NQ_NETCHAN_VERSION); + str = va("%c%c%c%cgetservers %s %u empty full"/*\x0A\n"*/, 255, 255, 255, 255, game, com_protocolversion.ival); NET_SendPollPacket (strlen(str), str, mast->adr); } } break; -#endif } break; case MT_BCAST: @@ -2523,6 +2540,7 @@ void MasterInfo_Request(master_t *mast) NET_SendPollPacket(net_message.cursize, net_message.data, mast->adr); SZ_Clear(&net_message); break; +#endif case MP_DPMASTER: //fixme { char *str; @@ -2530,7 +2548,6 @@ void MasterInfo_Request(master_t *mast) NET_SendPollPacket (strlen(str), str, mast->adr); } break; -#endif } break; } diff --git a/engine/client/pr_csqc.c b/engine/client/pr_csqc.c index c32aa165b..a58f7ca42 100644 --- a/engine/client/pr_csqc.c +++ b/engine/client/pr_csqc.c @@ -6854,6 +6854,7 @@ void CSQC_Shutdown(void) //when the qclib needs a file, it calls out to this function. void *PDECL CSQC_PRLoadFile (const char *path, unsigned char *(PDECL *buf_get)(void *ctx, size_t len), void *buf_ctx, size_t *sz) { + extern cvar_t sv_demo_write_csqc; qbyte *file = NULL; if (!strcmp(path, "csprogs.dat")) @@ -6898,8 +6899,16 @@ void *PDECL CSQC_PRLoadFile (const char *path, unsigned char *(PDECL *buf_get)(v file = NULL; //not valid } + //we write the csprogs into our archive if it was loaded from outside of there. + //this is to ensure that demos will play on the same machine later on... + //this is unreliable though, and redundant if we're writing the csqc into the demos themselves. + //also kinda irrelevant with sv_pure. #ifndef FTE_TARGET_WEB - if (file) + if (file +#ifndef CLIENTONLY + && !sv_demo_write_csqc.ival +#endif + ) //back it up COM_WriteFile(newname, FS_GAMEONLY, file, *sz); #endif diff --git a/engine/client/quakedef.h b/engine/client/quakedef.h index 9a393082c..97d876f87 100644 --- a/engine/client/quakedef.h +++ b/engine/client/quakedef.h @@ -297,6 +297,7 @@ extern cvar_t fs_gamename; extern cvar_t pm_downloads_url; extern cvar_t pm_autoupdate; extern cvar_t com_protocolname; +extern cvar_t com_protocolversion; extern cvar_t com_nogamedirnativecode; extern cvar_t com_parseutf8; extern cvar_t com_parseezquake; diff --git a/engine/common/com_mesh.c b/engine/common/com_mesh.c index 00c7c2d08..762b1f3f7 100644 --- a/engine/common/com_mesh.c +++ b/engine/common/com_mesh.c @@ -1224,7 +1224,7 @@ const float *Alias_GetBoneInformation(galiasinfo_t *inf, framestate_t *framestat //try to return data in-place. if (numgroups==1 && lerps[0].lerpcount == 1) - return Alias_ConvertBoneData(lerps[0].skeltype, lerps[0].pose[0], lerps[0].endbone, inf->ofsbones, targettype, targetbuffer, targetbufferalt, maxbufferbones); + return Alias_ConvertBoneData(lerps[0].skeltype, lerps[0].pose[0], min(lerps[0].endbone, inf->numbones), inf->ofsbones, targettype, targetbuffer, targetbufferalt, maxbufferbones); for (lerp = lerps; numgroups--; lerp++) { diff --git a/engine/common/common.c b/engine/common/common.c index fe1059211..80b9a6c9e 100644 --- a/engine/common/common.c +++ b/engine/common/common.c @@ -109,6 +109,7 @@ cvar_t gameversion_min = CVARD("gameversion_min","", "gamecode version for serve cvar_t gameversion_max = CVARD("gameversion_max","", "gamecode version for server browsers"); cvar_t fs_gamename = CVARAFD("com_fullgamename", NULL, "fs_gamename", CVAR_NOSET, "The filesystem is trying to run this game"); cvar_t com_protocolname = CVARAD("com_protocolname", NULL, "com_gamename", "The protocol game name used for dpmaster queries. For compatibility with DP, you can set this to 'DarkPlaces-Quake' in order to be listed in DP's master server, and to list DP servers."); +cvar_t com_protocolversion = CVARAD("com_protocolversion", "3", NULL, "The protocol version used for dpmaster queries."); //3 by default, for compat with DP/NQ, even if our QW protocol uses different versions entirely. really it only matters for master servers. cvar_t com_parseutf8 = CVARD("com_parseutf8", "1", "Interpret console messages/playernames/etc as UTF-8. Requires special fonts. -1=iso 8859-1. 0=quakeascii(chat uses high chars). 1=utf8, revert to ascii on decode errors. 2=utf8 ignoring errors"); //1 parse. 2 parse, but stop parsing that string if a char was malformed. cvar_t com_parseezquake = CVARD("com_parseezquake", "0", "Treat chevron chars from configs as a per-character flag. You should use this only for compat with nquake's configs."); cvar_t com_highlightcolor = CVARD("com_highlightcolor", STRINGIFY(COLOR_RED), "ANSI colour to be used for highlighted text, used when com_parseutf8 is active."); diff --git a/engine/common/fs.c b/engine/common/fs.c index 77761bbde..e896eff89 100644 --- a/engine/common/fs.c +++ b/engine/common/fs.c @@ -5984,6 +5984,7 @@ void COM_InitFilesystem (void) Cvar_Register(&pm_downloads_url, "Filesystem"); Cvar_Register(&pm_autoupdate, "Filesystem"); Cvar_Register(&com_protocolname, "Server Info"); + Cvar_Register(&com_protocolversion, "Server Info"); Cvar_Register(&fs_game, "Filesystem"); #ifdef Q2SERVER Cvar_Register(&fs_gamedir, "Filesystem"); diff --git a/engine/common/protocol.h b/engine/common/protocol.h index 5055df47e..4a94163b5 100644 --- a/engine/common/protocol.h +++ b/engine/common/protocol.h @@ -128,11 +128,13 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. //========================================= #define PORT_NQSERVER 26000 +#define PORT_DPMASTER PORT_Q3MASTER #define PORT_QWCLIENT 27001 #define PORT_QWMASTER 27000 #define PORT_QWSERVER 27500 #define PORT_Q2CLIENT 27901 #define PORT_Q2SERVER 27910 +#define PORT_Q3MASTER 27950 #define PORT_Q3SERVER 27960 //hexen2: 26900 diff --git a/engine/gl/gl_font.c b/engine/gl/gl_font.c index 177976de6..a6db6f127 100644 --- a/engine/gl/gl_font.c +++ b/engine/gl/gl_font.c @@ -782,69 +782,114 @@ static struct charcache_s *Font_LoadPlaceholderGlyph(font_t *f, CHARIDXTYPE char { struct charcache_s *c; unsigned int out[169*4], i, o, g, b, w, h, d, n; - d = (f->charheight >= 11); - if (d) - { //two rows - h = 11; - if (charidx > 0xffff) - n = 3; - else if (charidx > 0xff) - n = 2; + if (charidx == 0xe080 || charidx == 0xe081 || charidx == 0xe082 || charidx == 0xe083) + { //scrollbar glyps + w = min(16,f->charheight); + h = max(1,w/8); + d = 0; + + if (charidx == 0xe083) //centre + { + h *= 3; + memset(out+w*h*0, 0xff, w*4*h); + } else - n = 1; - w = n*4-1; - n*=2; + { + memset(out+w*h*0, 0xff, w*4*h); + memset(out+w*h*1, 0x00, w*4*h); + memset(out+w*h*2, 0xff, w*4*h); + for (i = 0; i < h; i++) + { + if (charidx == 0xe080) //left + memset(out+w*(i+h*1), 0xff, h*4); + if (charidx == 0xe082) //right + memset(out+w*(i+h*1)+w-h, 0xff, h*4); + } + h *= 3; + } + } + else if (charidx == 0xe01d || charidx == 0xe01e || charidx == 0xe01f) + { //horizontal separator + w = min(16,f->charheight); + h = max(1,w/8); + d = 0; + memset(out, 0xff, w*4*h); + } + else if (charidx == 0xe00b) + { + h = min(16,f->charheight); + w = max(1,h/8); + d = 1; + memset(out, 0xff, w*4*h); } else - { //single row. bye bye fixed-width. - if (charidx > 0xfffff) - n = 6; - else if (charidx > 0xffff) - n = 5; - else if (charidx > 0xfff) - n = 4; - else if (charidx > 0xff) - n = 3; - else - n = 2; - w = n*4-1; - h = 5; - } - - //figure out if we can get away with giving it a little more border to boost readability - b = (h+2 < f->charheight); - w += b*2; - h += b*2; - - memset(out, 0xff, sizeof(out)); - - for (i = 0; i < n; i++) { - g = hex[0xf & (charidx>>(i<<2))]; - o = b + w*b; + d = (f->charheight >= 11); if (d) - { //stradle them over the two rows. - if (i >= (n>>1)) - o += 4*(n-i-1); + { //two rows + h = 11; + if (charidx > 0xffff) + n = 3; + else if (charidx > 0xff) + n = 2; else + n = 1; + w = n*4-1; + n*=2; + } + else + { //single row. bye bye fixed-width. + if (charidx > 0xfffff) + n = 6; + else if (charidx > 0xffff) + n = 5; + else if (charidx > 0xfff) + n = 4; + else if (charidx > 0xff) + n = 3; + else + n = 2; + w = n*4-1; + h = 5; + } + + //figure out if we can get away with giving it a little more border to boost readability + b = (h+2 < f->charheight); + w += b*2; + h += b*2; + + memset(out, 0xff, sizeof(out)); + + for (i = 0; i < n; i++) + { + g = hex[0xf & (charidx>>(i<<2))]; + o = b + w*b; + if (d) + { //stradle them over the two rows. + if (i >= (n>>1)) + o += 4*(n-i-1); + else + { + o += 4*((n>>1)-i-1); + o += w * 6; + } + } + else + o += 4*(n-i-1); //just arrange them in order + for (; g; g>>=3, o+=w) { - o += 4*((n>>1)-i-1); - o += w * 6; + if (g & 4) out[o+0] = 0xff0000ff; + if (g & 2) out[o+1] = 0xff0000ff; + if (g & 1) out[o+2] = 0xff0000ff; } } - else - o += 4*(n-i-1); //just arrange them in order - for (; g; g>>=3, o+=w) - { - if (g & 4) out[o+0] = 0xff0000ff; - if (g & 2) out[o+1] = 0xff0000ff; - if (g & 1) out[o+2] = 0xff0000ff; - } + + d = 1; } c = Font_LoadGlyphData(f, charidx, FT_PIXEL_MODE_RGBA, out, w, h, w*4); if (c) { - c->advance = w+1; + c->advance = w+d; c->left = 0; c->top = (f->charheight-h-1)/2; } @@ -895,7 +940,8 @@ static struct charcache_s *Font_TryLoadGlyph(font_t *f, CHARIDXTYPE charidx) } return c; } - charidx &= 0x7f; + if ((charidx&0x7f) > 0x20) + charidx &= 0x7f; } #endif @@ -1724,7 +1770,9 @@ struct font_s *Font_LoadFont(float vheight, const char *fontfilename) { FMT_AUTO, //freetype, or quake FMT_QUAKE, //first is default - FMT_ISO88591, //latin-1 (first 256 chars of unicode too) + FMT_ISO88591, //latin-1 (first 256 chars of unicode too, c1 glyphs are usually invisible) + FMT_WINDOWS1252,//variation of latin-1 with extra glyphs + FMT_KOI8U, //image is 16*16 koi8-u codepage. FMT_HORIZONTAL, //unicode, charcount=width/(height-2). single strip of chars, like halflife. } fmt = FMT_AUTO; @@ -1777,6 +1825,10 @@ struct font_s *Font_LoadFont(float vheight, const char *fontfilename) fmt = FMT_QUAKE; else if (*t == 'l') fmt = FMT_ISO88591; + else if (*t == 'w') + fmt = FMT_WINDOWS1252; + else if (*t == 'k') + fmt = FMT_KOI8U; else if (*t == 'h') fmt = FMT_HORIZONTAL; } @@ -2036,11 +2088,52 @@ struct font_s *Font_LoadFont(float vheight, const char *fontfilename) if (defaultplane != INVALIDPLANE) { if (!f->faces) - { + { + static const unsigned short iso88591[] = { + 0x80,0x81,0x82,0x83, 0x84,0x85,0x86,0x87, 0x88,0x89,0x8a,0x8b, 0x8c,0x8d,0x8e,0x8f, + 0x90,0x91,0x92,0x93, 0x94,0x95,0x96,0x97, 0x98,0x99,0x9a,0x9b, 0x9c,0x9d,0x9e,0x9f}; + static const unsigned short win1252[] = { + 0x20ac, 0x81,0x201a,0x0192, 0x201e,0x2026,0x2020,0x2021, 0x02c6,0x2030,0x0160,0x2039, 0x0152, 0x8d,0x017d, 0x8f, + 0x90,0x2018,0x2019,0x101c, 0x201d,0x2022,0x2013,0x2014, 0x02dc,0x2122,0x0161,0x203a, 0x0153, 0x9d,0x017e,0x0178}; + static const unsigned short koi8u[] = { + 0x2500,0x2502,0x250C,0x2510, 0x2514,0x2518,0x251C,0x2524, 0x252C,0x2534,0x253C,0x2580, 0x2584,0x2588,0x258C,0x2590, + 0x2591,0x2592,0x2593,0x2320, 0x25A0,0x2219,0x221A,0x2248, 0x2264,0x2265,0x00A0,0x2321, 0x00B0,0x00B2,0x00B7,0x00F7, + 0x2550,0x2551,0x2552,0x0451, 0x0454,0x2554,0x0456,0x0457, 0x2557,0x2558,0x2559,0x255A, 0x255B,0x0491,0x255D,0x255E, + 0x255F,0x2560,0x2561,0x0401, 0x0404,0x2563,0x0406,0x0407, 0x2566,0x2567,0x2568,0x2569, 0x256A,0x0490,0x256C,0x00A9, + 0x044E,0x0430,0x0431,0x0446, 0x0434,0x0435,0x0444,0x0433, 0x0445,0x0438,0x0439,0x043A, 0x043B,0x043C,0x043D,0x043E, + 0x043F,0x044F,0x0440,0x0441, 0x0442,0x0443,0x0436,0x0432, 0x044C,0x044B,0x0437,0x0448, 0x044D,0x0449,0x0447,0x044A, + 0x042E,0x0410,0x0411,0x0426, 0x0414,0x0415,0x0424,0x0413, 0x0425,0x0418,0x0419,0x041A, 0x041B,0x041C,0x041D,0x041E, + 0x041F,0x042F,0x0420,0x0421, 0x0422,0x0423,0x0416,0x0412, 0x042C,0x042B,0x0417,0x0428, 0x042D,0x0429,0x0427,0x042A}; + const unsigned short *c1; + unsigned int c1size; + + if (fmt==FMT_AUTO) + fmt=FMT_QUAKE; + + if (fmt == FMT_WINDOWS1252) + { //some tools use these extra ones (latin-1 has no visible c1 entries) + c1 = win1252; + c1size = countof(win1252); + } + else if (fmt == FMT_KOI8U) + { //lots of russians in the quake scene + c1 = koi8u; + c1size = countof(koi8u); + } + else + { + c1 = iso88591; + c1size = countof(iso88591); + } + c1size += 128; + /*force it to load, even if there's nothing there*/ for (i = ((fmt==FMT_QUAKE)?32:0); i < ((fmt==FMT_QUAKE)?128:256); i++) { - c = Font_GetCharStore(f, i); + if (i >= 128 && i < c1size) + c = Font_GetCharStore(f, c1[i-128]); + else + c = Font_GetCharStore(f, i); c->advance = f->charheight; c->bmh = PLANEWIDTH/16; @@ -2054,19 +2147,22 @@ struct font_s *Font_LoadFont(float vheight, const char *fontfilename) } } - /*pack the default chars into it*/ - for (i = 0xe000; i <= 0xe0ff; i++) + if (fmt == FMT_QUAKE) { - c = Font_GetCharStore(f, i); - c->advance = f->charheight; - c->bmh = PLANEWIDTH/16; - c->bmw = PLANEWIDTH/16; - c->bmx = ((i&15))*(PLANEWIDTH/16); - c->bmy = ((i&0xf0)/16)*(PLANEWIDTH/16); - c->left = 0; - c->top = 0; - c->nextchar = 0; //these chars are not linked in - c->texplane = defaultplane; + /*pack the default chars into it*/ + for (i = 0xe000; i <= 0xe0ff; i++) + { + c = Font_GetCharStore(f, i); + c->advance = f->charheight; + c->bmh = PLANEWIDTH/16; + c->bmw = PLANEWIDTH/16; + c->bmx = ((i&15))*(PLANEWIDTH/16); + c->bmy = ((i&0xf0)/16)*(PLANEWIDTH/16); + c->left = 0; + c->top = 0; + c->nextchar = 0; //these chars are not linked in + c->texplane = defaultplane; + } } } return f; diff --git a/engine/gl/r_bishaders.h b/engine/gl/r_bishaders.h index bb9a13ec2..0879cafe0 100644 --- a/engine/gl/r_bishaders.h +++ b/engine/gl/r_bishaders.h @@ -2768,7 +2768,7 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND "!!cvarf gl_specular\n" "!!cvardf gl_affinemodels=0\n" "!!cvardf r_tessellation_level=5\n" -"!!samps diffuse normalmap specular fullbright upper lower paletted\n" +"!!samps diffuse normalmap specular fullbright upper lower paletted reflectmask reflectcube\n" "#include \"sys/defs.h\"\n" @@ -10998,7 +10998,7 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND "!!cvarf r_glsl_offsetmapping_scale\n" "!!cvardf r_glsl_pcf\n" "!!cvardf r_tessellation_level=5\n" -"!!samps shadowmap diffuse normalmap specular upper lower reflectcube reflectmask\n" +"!!samps shadowmap diffuse normalmap specular upper lower reflectcube reflectmask projectionmap\n" "#include \"sys/defs.h\"\n" @@ -11211,7 +11211,11 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND "void main ()\n" "{\n" +"#ifdef ORTHO\n" +"float colorscale = 1.0;\n" +"#else\n" "float colorscale = max(1.0 - (dot(lightvector, lightvector)/(l_lightradius*l_lightradius)), 0.0);\n" +"#endif\n" "#ifdef PCF\n" /*filter the light by the shadowmap. logically a boolean, but we allow fractions for softer shadows*/ "colorscale *= ShadowmapFilter(s_shadowmap, vtexprojcoord);\n" diff --git a/engine/qclib/qcc.h b/engine/qclib/qcc.h index c4520f3f7..713e03ecf 100644 --- a/engine/qclib/qcc.h +++ b/engine/qclib/qcc.h @@ -1170,3 +1170,5 @@ vfile_t *QCC_FindVFile(const char *name); vfile_t *QCC_AddVFile(const char *name, void *data, size_t size); void QCC_CatVFile(vfile_t *, const char *fmt, ...); void QCC_InsertVFile(vfile_t *, size_t pos, const char *fmt, ...); + +void *QCC_ReadFile(const char *fname, unsigned char *(*buf_get)(void *ctx, size_t len), void *buf_ctx, size_t *out_size); diff --git a/engine/server/sv_main.c b/engine/server/sv_main.c index 09f83470f..74efcf1d2 100644 --- a/engine/server/sv_main.c +++ b/engine/server/sv_main.c @@ -144,8 +144,10 @@ cvar_t sv_phs = CVARD("sv_phs", "1", "If 1, do not use the phs. It is genera cvar_t sv_resetparms = CVAR("sv_resetparms", "0"); cvar_t sv_pupglow = CVARFD("sv_pupglow", "", CVAR_SERVERINFO, "Instructs clients to enable hexen2-style powerup pulsing."); +#ifdef SV_MASTER cvar_t sv_master = CVAR("sv_master", "0"); cvar_t sv_masterport = CVAR("sv_masterport", "0"); +#endif cvar_t pext_ezquake_nochunks = CVARD("pext_ezquake_nochunks", "0", "Prevents ezquake clients from being able to use the chunked download extension. This sidesteps numerous ezquake issues, and will make downloads slower but more robust."); @@ -1251,13 +1253,13 @@ static void SVC_GetInfo (char *challenge, int fullstatus) Q_strncpyz(resp, svs.info, sizeof(response) - (resp-response)); //this is a DP protocol query, so some QW fields are not needed Info_RemoveKey(resp, "maxclients"); //replaced with sv_maxclients - Info_RemoveKey(resp, "map"); //replaced with mapname + Info_RemoveKey(resp, "map"); //replaced with mapname + Info_RemoveKey(resp, "*gamedir"); //replaced with modname + Info_RemoveKey(resp, "*z_ext"); //uninteresting and spammy. Info_SetValueForKey(resp, "gamename", protocolname, sizeof(response) - (resp-response)); Info_SetValueForKey(resp, "modname", FS_GetGamedir(true), sizeof(response) - (resp-response)); // Info_SetValueForKey(resp, "gamedir", FS_GetGamedir(true), sizeof(response) - (resp-response)); -#ifdef NQPROT - Info_SetValueForKey(resp, "protocol", va("%d", NQ_NETCHAN_VERSION), sizeof(response) - (resp-response)); -#endif + Info_SetValueForKey(resp, "protocol", va("%d", com_protocolversion.ival), sizeof(response) - (resp-response)); Info_SetValueForKey(resp, "clients", va("%d", numclients), sizeof(response) - (resp-response)); Info_SetValueForKey(resp, "sv_maxclients", maxclients.string, sizeof(response) - (resp-response)); Info_SetValueForKey(resp, "mapname", Info_ValueForKey(svs.info, "map"), sizeof(response) - (resp-response)); @@ -4832,6 +4834,7 @@ float SV_Frame (void) IWebRun(); #endif +#ifdef SV_MASTER if (sv_master.ival) { if (sv_masterport.ival) @@ -4839,6 +4842,7 @@ float SV_Frame (void) else SVM_Think(PORT_QWMASTER); } +#endif #ifdef PLUGINS if (isDedicated) @@ -5145,8 +5149,10 @@ void SV_InitLocal (void) Cvar_Register (&sv_showconnectionlessmessages, cvargroup_servercontrol); Cvar_Register (&sv_banproxies, cvargroup_serverpermissions); +#ifdef SV_MASTER Cvar_Register (&sv_master, cvargroup_servercontrol); Cvar_Register (&sv_masterport, cvargroup_servercontrol); +#endif Cvar_Register (&filterban, cvargroup_servercontrol); diff --git a/engine/shaders/glsl/defaultskin.glsl b/engine/shaders/glsl/defaultskin.glsl index b8b5b89c5..035b4963b 100644 --- a/engine/shaders/glsl/defaultskin.glsl +++ b/engine/shaders/glsl/defaultskin.glsl @@ -11,7 +11,7 @@ !!cvarf gl_specular !!cvardf gl_affinemodels=0 !!cvardf r_tessellation_level=5 -!!samps diffuse normalmap specular fullbright upper lower paletted +!!samps diffuse normalmap specular fullbright upper lower paletted reflectmask reflectcube #include "sys/defs.h" diff --git a/engine/shaders/glsl/rtlight.glsl b/engine/shaders/glsl/rtlight.glsl index 11029ae4a..f14bba633 100644 --- a/engine/shaders/glsl/rtlight.glsl +++ b/engine/shaders/glsl/rtlight.glsl @@ -9,7 +9,7 @@ !!cvarf r_glsl_offsetmapping_scale !!cvardf r_glsl_pcf !!cvardf r_tessellation_level=5 -!!samps shadowmap diffuse normalmap specular upper lower reflectcube reflectmask +!!samps shadowmap diffuse normalmap specular upper lower reflectcube reflectmask projectionmap #include "sys/defs.h"