1
0
Fork 0
forked from fte/fteqw

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
This commit is contained in:
Spoike 2018-01-24 12:13:32 +00:00
parent 922b0ca2bb
commit f3ae58608b
14 changed files with 227 additions and 83 deletions

View file

@ -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");

View file

@ -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;
}

View file

@ -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

View file

@ -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;

View file

@ -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++)
{

View file

@ -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.");

View file

@ -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");

View file

@ -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

View file

@ -782,6 +782,48 @@ 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;
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
{
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
{
d = (f->charheight >= 11);
if (d)
{ //two rows
@ -841,10 +883,13 @@ static struct charcache_s *Font_LoadPlaceholderGlyph(font_t *f, CHARIDXTYPE char
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,6 +940,7 @@ static struct charcache_s *Font_TryLoadGlyph(font_t *f, CHARIDXTYPE charidx)
}
return c;
}
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;
}
@ -2037,9 +2089,50 @@ struct font_s *Font_LoadFont(float vheight, const char *fontfilename)
{
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++)
{
if (i >= 128 && i < c1size)
c = Font_GetCharStore(f, c1[i-128]);
else
c = Font_GetCharStore(f, i);
c->advance = f->charheight;
@ -2054,6 +2147,8 @@ struct font_s *Font_LoadFont(float vheight, const char *fontfilename)
}
}
if (fmt == FMT_QUAKE)
{
/*pack the default chars into it*/
for (i = 0xe000; i <= 0xe0ff; i++)
{
@ -2069,6 +2164,7 @@ struct font_s *Font_LoadFont(float vheight, const char *fontfilename)
c->texplane = defaultplane;
}
}
}
return f;
}

View file

@ -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"

View file

@ -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);

View file

@ -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.");
@ -1252,12 +1254,12 @@ static void SVC_GetInfo (char *challenge, int fullstatus)
//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, "*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);

View file

@ -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"

View file

@ -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"