diff --git a/engine/Makefile b/engine/Makefile index bb6a3717..84380104 100644 --- a/engine/Makefile +++ b/engine/Makefile @@ -1104,6 +1104,7 @@ ifneq (,$(findstring linux,$(FTE_TARGET))) SV_DIR=sv_linux$(BITS) SV_EXE_NAME=../fteqw.sv$(BITS) SV_LDFLAGS= + SV_CFLAGS=$(SERVER_ONLY_CFLAGS) -DMULTITHREAD NPFTE_OBJS=httpclient.o image.o sys_linux_threads.o sys_npfte.o sys_axfte.o sys_plugfte.o NPFTE_DLL_NAME=../npfte$(BITS).so diff --git a/engine/botlib/be_aas_route.c b/engine/botlib/be_aas_route.c index 9205e6d2..8e1c556e 100644 --- a/engine/botlib/be_aas_route.c +++ b/engine/botlib/be_aas_route.c @@ -1739,10 +1739,11 @@ int AAS_AreaRouteToGoalArea(int areanum, vec3_t origin, int goalareanum, int tra // into the portal area t += aasworld.portalmaxtraveltimes[portalnum]; // + + *reachnum = aasworld.areasettings[areanum].firstreachablearea + + areacache->reachabilities[clusterareanum]; if (origin) { - *reachnum = aasworld.areasettings[areanum].firstreachablearea + - areacache->reachabilities[clusterareanum]; reach = aasworld.reachability + *reachnum; t += AAS_AreaTravelTime(areanum, origin, reach->start); } //end if diff --git a/engine/client/cl_cam.c b/engine/client/cl_cam.c index b4a29370..e58d2989 100644 --- a/engine/client/cl_cam.c +++ b/engine/client/cl_cam.c @@ -919,7 +919,6 @@ void Cam_Track(playerview_t *pv, usercmd_t *cmd) void Cam_SetModAutoTrack(int userid) { //this is a hint from the server about who to track int slot; - playerview_t *pv = &cl.playerview[0]; cl.autotrack_hint = -1; for (slot = 0; slot < cl.allocated_client_slots; slot++) { diff --git a/engine/client/cl_cg.c b/engine/client/cl_cg.c index e2a448a4..0ee2b632 100644 --- a/engine/client/cl_cg.c +++ b/engine/client/cl_cg.c @@ -397,8 +397,9 @@ typedef struct { size_t maxfrags; size_t numfrags; } q3markFragment_ctx_t; -static void CG_MarkFragments_Callback(q3markFragment_ctx_t *ctx, vec3_t *fte_restrict points, size_t numtris, shader_t *shader) +static void CG_MarkFragments_Callback(void *vctx, vec3_t *fte_restrict points, size_t numtris, shader_t *shader) { + q3markFragment_ctx_t *ctx = vctx; size_t i; if (numtris > ctx->maxfrags-ctx->numfrags) numtris = ctx->maxfrags-ctx->numfrags; diff --git a/engine/client/cl_demo.c b/engine/client/cl_demo.c index 2a39d721..3c63ee90 100644 --- a/engine/client/cl_demo.c +++ b/engine/client/cl_demo.c @@ -1986,7 +1986,10 @@ vfsfile_t *CL_OpenFileInZipOrSys(char *name, qboolean usesystempath) //tries to determine the demo type void CL_PlayDemoFile(vfsfile_t *f, char *demoname, qboolean issyspath) { - qofs_t start; +#if defined(Q2CLIENT) || defined(NQPROT) + //figure out where we started + qofs_t start = VFS_TELL(f); +#endif if (!VFS_GETLEN (f)) { @@ -1995,9 +1998,6 @@ void CL_PlayDemoFile(vfsfile_t *f, char *demoname, qboolean issyspath) return; } - //figure out where we started - start = VFS_TELL(f); - #ifdef Q2CLIENT { int len; @@ -2015,6 +2015,7 @@ void CL_PlayDemoFile(vfsfile_t *f, char *demoname, qboolean issyspath) CL_PlayDemoStream(f, NULL, demoname, issyspath, DPB_QUAKE2, 0); return; } + VFS_SEEK(f, start); } #endif diff --git a/engine/client/cl_ents.c b/engine/client/cl_ents.c index f091fcfb..b0c487a0 100644 --- a/engine/client/cl_ents.c +++ b/engine/client/cl_ents.c @@ -1580,7 +1580,12 @@ void CLNQ_ParseEntity(unsigned int bits) state->dpflags = (bits & NQU_NOLERP)?RENDER_STEP:0; if (bits & NQU_MODEL) - state->modelindex = MSG_ReadByte (); + { + if (CPNQ_IS_BJP) + state->modelindex = MSG_ReadShort (); + else + state->modelindex = MSG_ReadByte (); + } if (bits & NQU_FRAME) state->frame = MSG_ReadByte(); @@ -2438,7 +2443,6 @@ void CLQ1_AddVisibleBBoxes(void) wedict_t *e; int i; shader_t *s; - extern world_t csqc_world; vec3_t min, max, size; switch(r_showbboxes.ival & 3) @@ -2453,7 +2457,10 @@ void CLQ1_AddVisibleBBoxes(void) #endif #ifdef CSQC_DAT case 2: - w = &csqc_world; + { + extern world_t csqc_world; + w = &csqc_world; + } break; #endif case 3: diff --git a/engine/client/cl_main.c b/engine/client/cl_main.c index 71638bb7..e297084c 100644 --- a/engine/client/cl_main.c +++ b/engine/client/cl_main.c @@ -732,15 +732,15 @@ void CL_CheckForResend (void) { extern cvar_t dpcompat_nopreparse; memset(&connectinfo, 0, sizeof(connectinfo)); + Q_strncpyz (cls.servername, "internalserver", sizeof(cls.servername)); + Cvar_ForceSet(&cl_servername, cls.servername); + if (!NET_StringToAdr(cls.servername, 0, &connectinfo.adr)) + return; //erk? connectinfo.trying = true; connectinfo.istransfer = false; NET_InitClient(true); - Q_strncpyz (cls.servername, "internalserver", sizeof(cls.servername)); - Cvar_ForceSet(&cl_servername, cls.servername); - NET_StringToAdr(cls.servername, 0, &connectinfo.adr); - cls.state = ca_disconnected; switch (svs.gametype) { @@ -1363,7 +1363,11 @@ void CL_Rcon_f (void) return; } - NET_StringToAdr (rcon_address.string, PORT_QWSERVER, &to); + if (!NET_StringToAdr (rcon_address.string, PORT_QWSERVER, &to)) + { + Con_Printf("Unable to resolve target address\n"); + return; + } } NET_SendPacket (NS_CLIENT, strlen(message)+1, message, &to); @@ -1715,7 +1719,7 @@ void CL_Disconnect (void) Alias_WipeStuffedAliases(); //now start up the csqc/menu module again. -// CSQC_UnconnectedInit(); +// (void)CSQC_UnconnectedInit(); } #undef serverrunning @@ -1732,7 +1736,7 @@ void CL_Disconnect_f (void) connectinfo.trying = false; - CSQC_UnconnectedInit(); + (void)CSQC_UnconnectedInit(); } /* @@ -2730,14 +2734,16 @@ void CL_ConnectionlessPacket (void) netadr_t adr; char *data = MSG_ReadStringLine(); Con_TPrintf ("redirect to %s\n", data); - NET_StringToAdr(data, PORT_QWSERVER, &adr); - data = "\xff\xff\xff\xffgetchallenge\n"; - - if (NET_CompareAdr(&connectinfo.adr, &net_from)) + if (NET_StringToAdr(data, PORT_QWSERVER, &adr)) { - connectinfo.istransfer = true; - connectinfo.adr = adr; - NET_SendPacket (NS_CLIENT, strlen(data), data, &adr); + data = "\xff\xff\xff\xffgetchallenge\n"; + + if (NET_CompareAdr(&connectinfo.adr, &net_from)) + { + connectinfo.istransfer = true; + connectinfo.adr = adr; + NET_SendPacket (NS_CLIENT, strlen(data), data, &adr); + } } return; } @@ -4463,6 +4469,7 @@ void Host_RunFilePrompted(void *ctx, int button) Host_DoRunFile(f); } +#ifdef WEBCLIENT static qboolean isurl(char *url) { #ifdef FTE_TARGET_WEB @@ -4470,6 +4477,7 @@ static qboolean isurl(char *url) #endif return /*!strncmp(url, "data:", 5) || */!strncmp(url, "http://", 7) || !strncmp(url, "https://", 8); } +#endif qboolean FS_FixupGamedirForExternalFile(char *input, char *filename, size_t fnamelen); @@ -5058,7 +5066,6 @@ double Host_Frame (double time) if (cls.demoplayback && !cl.stillloading) { - extern qboolean shader_reload_needed; //this can take some time when you have weird glsl. qboolean haswork = cl.sendprespawn || COM_HasWork(); if (!hadwork && !haswork) CL_ProgressDemoTime(); @@ -5427,7 +5434,6 @@ void CL_ArgumentOverrides(void) void CL_ExecInitialConfigs(char *resetcommand) { int qrc, hrc, def; - extern cvar_t fs_gamename, com_protocolname; //these come from the manifest, so shouldn't be reset by cvarreset Cbuf_Execute (); //make sure any pending console commands are done with. mostly, anyway... SCR_ShowPic_Clear(true); diff --git a/engine/client/cl_parse.c b/engine/client/cl_parse.c index 96598421..2641a399 100644 --- a/engine/client/cl_parse.c +++ b/engine/client/cl_parse.c @@ -25,7 +25,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. void CL_GetNumberedEntityInfo (int num, float *org, float *ang); void CLDP_ParseDarkPlaces5Entities(void); static void CL_SetStatNumeric (int pnum, int stat, int ivalue, float fvalue); -static void CL_SetStatInt (int pnum, int stat, int ivalue); +#define CL_SetStatInt(pnum,stat,ival) do{int thevalue=ival; CL_SetStatNumeric(pnum,stat,thevalue,thevalue);}while(0) static qboolean CL_CheckModelResources (char *name); char cl_dp_csqc_progsname[128]; @@ -2292,7 +2292,7 @@ void DL_Abort(qdownload_t *dl, enum qdlabort aborttype) for (b = dl->dlblocks; b; b = n) { if (b->state == DLB_RECEIVED) - VFS_PRINTF(parts, "c %"PRIx64" %"PRIx64"\n", (long long)b->start, (long long)b->end); + VFS_PRINTF(parts, "c %"PRIx64" %"PRIx64"\n", (quint64_t)b->start, (quint64_t)b->end); else { for(;;) @@ -2307,7 +2307,7 @@ void DL_Abort(qdownload_t *dl, enum qdlabort aborttype) } break; } - VFS_PRINTF(parts, "m %"PRIx64" %"PRIx64"\n", (long long)b->start, (long long)b->end); + VFS_PRINTF(parts, "m %"PRIx64" %"PRIx64"\n", (quint64_t)b->start, (quint64_t)b->end); } n = b->next; @@ -3297,15 +3297,15 @@ void CLNQ_ParseProtoVersion(void) cls.protocol_nq = (cls.protocol_nq==CPNQ_PROQUAKE3_4)?CPNQ_PROQUAKE3_4:CPNQ_ID; cls.z_ext = 0; - if (protover == NEHD_PROTOCOL_VERSION) + if (protover == PROTOCOL_VERSION_NEHD) Host_EndGame ("Nehahra demo net protocol is not supported\n"); - else if (protover == FITZ_PROTOCOL_VERSION) + else if (protover == PROTOCOL_VERSION_FITZ) { //fitzquake 0.85 cls.protocol_nq = CPNQ_FITZ666; Con_DPrintf("FitzQuake 666 protocol\n"); } - else if (protover == RMQ_PROTOCOL_VERSION) + else if (protover == PROTOCOL_VERSION_RMQ) { int fl; cls.protocol_nq = CPNQ_FITZ666; @@ -3323,7 +3323,7 @@ void CLNQ_ParseProtoVersion(void) if (fl & ~(RMQFL_SHORTANGLE|RMQFL_FLOATANGLE|RMQFL_24BITCOORD|RMQFL_FLOATCOORD|RMQFL_EDICTSCALE)) Con_Printf("WARNING: Server is using unsupported RMQ extensions\n"); } - else if (protover == DP5_PROTOCOL_VERSION) + else if (protover == PROTOCOL_VERSION_DP5) { //darkplaces5 cls.protocol_nq = CPNQ_DP5; @@ -3332,7 +3332,7 @@ void CLNQ_ParseProtoVersion(void) Con_DPrintf("DP5 protocols\n"); } - else if (protover == DP6_PROTOCOL_VERSION) + else if (protover == PROTOCOL_VERSION_DP6) { //darkplaces6 (it's a small difference from dp5) cls.protocol_nq = CPNQ_DP6; @@ -3343,7 +3343,7 @@ void CLNQ_ParseProtoVersion(void) Con_DPrintf("DP6 protocols\n"); } - else if (protover == DP7_PROTOCOL_VERSION) + else if (protover == PROTOCOL_VERSION_DP7) { //darkplaces7 (it's a small difference from dp5) cls.protocol_nq = CPNQ_DP7; @@ -3354,18 +3354,29 @@ void CLNQ_ParseProtoVersion(void) Con_DPrintf("DP7 protocols\n"); } - else if (protover == H2_PROTOCOL_VERSION) + else if (protover == PROTOCOL_VERSION_H2) { Host_EndGame ("\nUnable to connect to standard Hexen2 servers. Host the game with "DISTRIBUTION"\n"); } - else if (protover != NQ_PROTOCOL_VERSION) + else if (protover == PROTOCOL_VERSION_BJP1) { - Host_EndGame ("Server is using protocol version %i, which is not supported by this version of " FULLENGINENAME ".", protover); + cls.protocol_nq = CPNQ_BJP1; + Con_DPrintf("bjp1 %i protocol\n", PROTOCOL_VERSION_BJP1); } - else + else if (protover == PROTOCOL_VERSION_BJP2) { + cls.protocol_nq = CPNQ_BJP2; + Con_DPrintf("bjp2 %i protocol\n", PROTOCOL_VERSION_BJP2); + } + else if (protover == PROTOCOL_VERSION_BJP3) + { + cls.protocol_nq = CPNQ_BJP3; + Con_DPrintf("bjp3 %i protocol\n", PROTOCOL_VERSION_BJP2); + } + else if (protover == PROTOCOL_VERSION_NQ) Con_DPrintf("Standard NQ protocols\n"); - } + else + Host_EndGame ("Server is using protocol version %i, which is not supported by this version of " FULLENGINENAME ".", protover); if (cls.fteprotocolextensions & PEXT_FLOATCOORDS) { if (netprim.anglesize < 2) @@ -3639,7 +3650,13 @@ void CLNQ_ParseClientdata (void) if (bits & SU_WEAPONFRAME) weaponframe |= (unsigned char)MSG_ReadByte(); if (bits & SU_ARMOR) armour |= (unsigned char)MSG_ReadByte(); - if (bits & SU_WEAPONMODEL) weaponmodel |= (unsigned char)MSG_ReadByte(); + if (bits & SU_WEAPONMODEL) + { + if (CPNQ_IS_BJP) + weaponmodel |= (unsigned short)MSG_ReadShort(); + else + weaponmodel |= (unsigned char)MSG_ReadByte(); + } health |= MSG_ReadShort(); currentammo |= MSG_ReadByte(); shells |= MSG_ReadByte(); @@ -4086,7 +4103,10 @@ void CL_ParseBaseline (entity_state_t *es) memcpy(es, &nullentitystate, sizeof(entity_state_t)); - es->modelindex = MSG_ReadByte (); + if (cls.protocol == CP_NETQUAKE && CPNQ_IS_BJP) + es->modelindex = MSG_ReadShort (); + else + es->modelindex = MSG_ReadByte (); es->frame = MSG_ReadByte (); es->colormap = MSG_ReadByte(); es->skinnum = MSG_ReadByte(); @@ -4298,7 +4318,7 @@ void CL_ParseStaticSound (qboolean large) for (i=0 ; i<3 ; i++) org[i] = MSG_ReadCoord (); - if (large) + if (large || (cls.protocol == CP_NETQUAKE && cls.protocol_nq == CPNQ_BJP2)) sound_num = (unsigned short)MSG_ReadShort(); else sound_num = MSG_ReadByte (); @@ -4532,7 +4552,7 @@ void CLNQ_ParseStartSoundPacket(void) /*unpack mangling*/ channel = (channel & 7) | ((channel & 0x0f1) << 1); - if (field_mask & DPSND_LARGESOUND) + if ((field_mask & DPSND_LARGESOUND) || (cls.protocol == CP_NETQUAKE && (cls.protocol_nq == CPNQ_BJP2 || cls.protocol_nq == CPNQ_BJP3))) //bjp2 kinda sucks sound_num = (unsigned short)MSG_ReadShort(); else sound_num = (unsigned char)MSG_ReadByte (); @@ -5002,10 +5022,6 @@ static void CL_SetStatNumeric (int pnum, int stat, int ivalue, float fvalue) } #endif } -static void CL_SetStatInt (int pnum, int stat, int ivalue) -{ - CL_SetStatNumeric(pnum,stat,ivalue,ivalue); -} void CL_SetStatString (int pnum, int stat, char *value) { @@ -5894,7 +5910,7 @@ static void CL_ParseItemTimer(void) atof(Cmd_Argv(3))}; float radius = atof(Cmd_Argv(4)); //unsigned int rgb = strtoul(Cmd_Argv(5), NULL, 16); - char *timername = Cmd_Argv(6); +// char *timername = Cmd_Argv(6); unsigned int entnum = strtoul(Cmd_Argv(7), NULL, 0); struct itemtimer_s *timer; @@ -6180,6 +6196,8 @@ void CL_ParsePortalState(void) a1 = MSG_ReadByte(); #ifdef Q2BSPS CMQ2_SetAreaPortalState(cl.worldmodel, a1, !!(mode&1)); +#else + (void)a1; #endif break; case 0xc0: @@ -6195,6 +6213,9 @@ void CL_ParsePortalState(void) } #ifdef Q3BSPS CMQ3_SetAreaPortalState(cl.worldmodel, a1, a2, !!(mode&1)); +#else + (void)a1; + (void)a2; #endif break; @@ -6827,11 +6848,12 @@ void CLQ2_ParseServerMessage (void) seat = 0; if (cmd == svcq2_playerinfo && (cls.fteprotocolextensions & PEXT_SPLITSCREEN)) - { + { //playerinfo should not normally be seen here. + //so we can just 'borrow' it for seat numbers for targetted svcs. SHOWNET(va("%i", cmd)); seat = MSG_ReadByte (); if (seat >= MAX_SPLITS) - Host_EndGame ("CLQ2_ParseServerMessage: Invalid seat", cmd); + Host_EndGame ("CLQ2_ParseServerMessage: Unsupported seat (%i)", seat); cmd = MSG_ReadByte (); } diff --git a/engine/client/cl_plugin.inc b/engine/client/cl_plugin.inc index 62ebb8ac..5ba7c19c 100644 --- a/engine/client/cl_plugin.inc +++ b/engine/client/cl_plugin.inc @@ -837,7 +837,6 @@ static qintptr_t VARGS Plug_GetWeaponStats(void *offset, quintptr_t mask, const struct wstats_s *result = VM_POINTER(arg[1]); size_t maxresults = VM_LONG(arg[2]); - int count = 0; int i; if (VM_OOB(arg[0], maxresults*sizeof(*result))) diff --git a/engine/client/cl_pred.c b/engine/client/cl_pred.c index 348de2f2..96a39f41 100644 --- a/engine/client/cl_pred.c +++ b/engine/client/cl_pred.c @@ -574,7 +574,6 @@ short LerpAngles16(short to, short from, float frac) void CL_CalcClientTime(void) { - extern float demtime; if (!cls.state) { cl.servertime += host_frametime; @@ -989,7 +988,6 @@ void CL_PredictMovePNum (int seat) if ((cl.inframes[cl.validsequence & UPDATE_MASK].playerstate[pv->cam_spec_track].messagenum == cl.validsequence) || (pv->cam_spec_track+1 < cl.maxlerpents && cl.lerpents[pv->cam_spec_track+1].sequence == cl.lerpentssequence)) { - extern cvar_t cl_chasecam; pv->cam_state = CAM_EYECAM; pv->viewentity = pv->cam_spec_track+1; cam_nowlocked = true; diff --git a/engine/client/cl_screen.c b/engine/client/cl_screen.c index cd0de24a..7e1298dc 100644 --- a/engine/client/cl_screen.c +++ b/engine/client/cl_screen.c @@ -2298,7 +2298,7 @@ static void SCR_ScreenShot_f (void) Con_Printf ("Couldn't write %s\n", sysname); } -void *SCR_ScreenShot_FBO(int fbwidth, int fbheight, enum uploadfmt *fmt) +void *SCR_ScreenShot_Capture(int fbwidth, int fbheight, enum uploadfmt *fmt) { int width, height; void *buf; @@ -2342,8 +2342,9 @@ void *SCR_ScreenShot_FBO(int fbwidth, int fbheight, enum uploadfmt *fmt) Q_strncpyz(r_refdef.rt_destcolour[0].texname, "", sizeof(r_refdef.rt_destcolour[0].texname)); BE_RenderToTextureUpdate2d(true); - if (width != fbwidth || height != fbheight) + if (!buf || width != fbwidth || height != fbheight) { + *fmt = TF_INVALID; BZ_Free(buf); return NULL; } @@ -2427,7 +2428,7 @@ static void SCR_ScreenShot_Mega_f(void) r_refdef.stereomethod = STEREO_LEFTONLY; } - buffers[buf] = SCR_ScreenShot_FBO(fbwidth, fbheight, &fmt[buf]); + buffers[buf] = SCR_ScreenShot_Capture(fbwidth, fbheight, &fmt[buf]); if (width[buf] != width[0] || height[buf] != height[0] || fmt[buf] != fmt[0]) { //invalid is better than unmatched. @@ -2467,14 +2468,13 @@ static void SCR_ScreenShot_VR_f(void) int height; //equirectangular 360 * 180 gives a nice clean ratio int px = 4; int step = atof(Cmd_Argv(3)); - unsigned int *left_buffer; - unsigned int *right_buffer; - unsigned int *buf; + void *left_buffer, *right_buffer, *buf; enum uploadfmt fmt; int lx, rx, x, y; vec3_t baseang; float ang; - extern cvar_t r_projection, r_stereo_separation; + qboolean fail = false; + extern cvar_t r_projection, r_stereo_separation, r_stereo_convergence;; VectorCopy(r_refdef.viewangles, baseang); if (width <= 2) @@ -2484,7 +2484,7 @@ static void SCR_ScreenShot_VR_f(void) step = 5; left_buffer = BZF_Malloc (width*height*2*px); - right_buffer = left_buffer + width*height; + right_buffer = (qbyte*)left_buffer + width*height*px; if (strstr (screenyname, "..") || strchr(screenyname, ':') || *screenyname == '.' || *screenyname == '/') screenyname = ""; @@ -2520,7 +2520,7 @@ static void SCR_ScreenShot_VR_f(void) r_refdef.stereomethod = STEREO_OFF; cl.playerview->simangles[0] = 0; //pitch is BAD - cl.playerview->simangles[1] = baseang[1];// - 360.0*(lx + 0.5*(rx-lx)) / width; + cl.playerview->simangles[1] = baseang[1] + r_stereo_convergence.value*0.5; cl.playerview->simangles[2] = 0; //roll is BAD VectorCopy(cl.playerview->simangles, cl.playerview->viewangles); @@ -2530,29 +2530,68 @@ static void SCR_ScreenShot_VR_f(void) r_refdef.eyeoffset[0] = sin(ang) * r_stereo_separation.value * 0.5; r_refdef.eyeoffset[1] = cos(ang) * r_stereo_separation.value * 0.5; r_refdef.eyeoffset[2] = 0; - buf = SCR_ScreenShot_FBO(width, height, &fmt); - if (buf && fmt == TF_BGRA32) + buf = SCR_ScreenShot_Capture(width, height, &fmt); + switch(fmt) { + case TF_BGRA32: for (y = 0; y < height; y++) for (x = lx; x < rx; x++) - left_buffer[y*width + x] = buf[y*width + /*(width-step)/2 +*/ x]; + ((unsigned int*)left_buffer)[y*width + x] = ((unsigned int*)buf)[y*width + x]; + break; + case TF_RGB24: + for (y = 0; y < height; y++) + for (x = lx; x < rx; x++) + { + ((qbyte*)left_buffer)[(y*width + x)*4+0] = ((qbyte*)buf)[(y*width + x)*3+2]; + ((qbyte*)left_buffer)[(y*width + x)*4+1] = ((qbyte*)buf)[(y*width + x)*3+1]; + ((qbyte*)left_buffer)[(y*width + x)*4+2] = ((qbyte*)buf)[(y*width + x)*3+0]; + ((qbyte*)left_buffer)[(y*width + x)*4+3] = 255; + } + break; + default: + fail = true; + break; } BZ_Free(buf); + + cl.playerview->simangles[0] = 0; //pitch is BAD + cl.playerview->simangles[1] = baseang[1] - r_stereo_convergence.value*0.5; + cl.playerview->simangles[2] = 0; //roll is BAD + VectorCopy(cl.playerview->simangles, cl.playerview->viewangles); + + r_refdef.eyeoffset[0] *= -1; r_refdef.eyeoffset[1] *= -1; r_refdef.eyeoffset[2] = 0; - buf = SCR_ScreenShot_FBO(width, height, &fmt); - if (buf && fmt == TF_BGRA32) + buf = SCR_ScreenShot_Capture(width, height, &fmt); + switch(fmt) { + case TF_BGRA32: for (y = 0; y < height; y++) for (x = lx; x < rx; x++) - right_buffer[y*width + x] = buf[y*width + /*(width-step)/2 +*/ x]; + ((unsigned int*)right_buffer)[y*width + x] = ((unsigned int*)buf)[y*width + x]; + break; + case TF_RGB24: + for (y = 0; y < height; y++) + for (x = lx; x < rx; x++) + { + ((qbyte*)right_buffer)[(y*width + x)*4+0] = ((qbyte*)buf)[(y*width + x)*3+2]; + ((qbyte*)right_buffer)[(y*width + x)*4+1] = ((qbyte*)buf)[(y*width + x)*3+1]; + ((qbyte*)right_buffer)[(y*width + x)*4+2] = ((qbyte*)buf)[(y*width + x)*3+0]; + ((qbyte*)right_buffer)[(y*width + x)*4+3] = 255; + } + break; + default: + fail = true; + break; } BZ_Free(buf); } - if (SCR_ScreenShot(filename, FS_GAMEONLY, &left_buffer, 1, width, height*2, TF_BGRA32)) + if (fail) + Con_Printf ("Unable to capture suitable screen image\n"); + else if (SCR_ScreenShot(filename, FS_GAMEONLY, &left_buffer, 1, width, height*2, TF_BGRA32)) { char sysname[1024]; FS_NativePath(filename, FS_GAMEONLY, sysname, sizeof(sysname)); diff --git a/engine/client/cl_tent.c b/engine/client/cl_tent.c index 09b08a0d..ea97d6e0 100644 --- a/engine/client/cl_tent.c +++ b/engine/client/cl_tent.c @@ -2411,20 +2411,20 @@ void CL_Laser (vec3_t start, vec3_t end, int colors) void CLQ2_ParseSteam(void) { vec3_t pos, dir; - qbyte colour; + /*qbyte colour; short magnitude; - unsigned int duration; + unsigned int duration;*/ signed int id = MSG_ReadShort(); - qbyte count = MSG_ReadByte(); + /*qbyte count =*/ MSG_ReadByte(); MSG_ReadPos(pos); MSG_ReadPos(dir); - colour = MSG_ReadByte(); - magnitude = MSG_ReadShort(); + /*colour =*/ MSG_ReadByte(); + /*magnitude =*/ MSG_ReadShort(); if (id == -1) - duration = MSG_ReadLong(); + /*duration =*/ MSG_ReadLong(); else - duration = 0; + /*duration = 0;*/ Con_Printf("FIXME: CLQ2_ParseSteam: stub\n"); } diff --git a/engine/client/cl_ui.c b/engine/client/cl_ui.c index 3e4b9df2..f6bfe075 100644 --- a/engine/client/cl_ui.c +++ b/engine/client/cl_ui.c @@ -802,13 +802,15 @@ static qintptr_t UI_SystemCalls(void *offset, quintptr_t mask, qintptr_t fn, con { serverinfo_t *info; COM_Parse(cmdtext + 5); - NET_StringToAdr(com_token, 0, &ui_pings[i]); - info = Master_InfoForServer(&ui_pings[i]); - if (info) + if (NET_StringToAdr(com_token, 0, &ui_pings[i])) { - info->special |= SS_KEEPINFO; - info->sends++; - Master_QueryServer(info); + info = Master_InfoForServer(&ui_pings[i]); + if (info) + { + info->special |= SS_KEEPINFO; + info->sends++; + Master_QueryServer(info); + } } break; } @@ -819,8 +821,8 @@ static qintptr_t UI_SystemCalls(void *offset, quintptr_t mask, qintptr_t fn, con netadr_t na; MasterInfo_Refresh(); - NET_StringToAdr("255.255.255.255", PORT_Q3SERVER, &na); - NET_SendPollPacket (14, va("%c%c%c%cgetstatus\n", 255, 255, 255, 255), na); + if (NET_StringToAdr("255.255.255.255", PORT_Q3SERVER, &na)) + NET_SendPollPacket (14, va("%c%c%c%cgetstatus\n", 255, 255, 255, 255), na); } else #endif diff --git a/engine/client/client.h b/engine/client/client.h index 24d0f6e6..504e5780 100644 --- a/engine/client/client.h +++ b/engine/client/client.h @@ -444,12 +444,16 @@ typedef struct { CPNQ_ID, CPNQ_PROQUAKE3_4, + CPNQ_BJP1, //16bit models, strict 8bit sounds + CPNQ_BJP2, //16bit models, strict 16bit sounds + CPNQ_BJP3, //16bit models, flagged 16bit sounds CPNQ_FITZ666, /*and rmqe999 protocol*/ CPNQ_DP5, CPNQ_DP6, CPNQ_DP7 } protocol_nq; #define CPNQ_IS_DP (cls.protocol_nq >= CPNQ_DP5) + #define CPNQ_IS_BJP (cls.protocol_nq >= CPNQ_BJP1 && cls.protocol_nq <= CPNQ_BJP3) int protocol_q2; @@ -1549,10 +1553,10 @@ int CIN_RunCinematic (struct cinematics_s *cin, qbyte **outdata, int *outwidth, typedef struct cin_s cin_t; #ifdef NOMEDIA #define Media_Playing() false -#define Media_Init() 0 +#define Media_Init() (void)0 #define Media_PlayingFullScreen() false #define Media_PlayFilm(n,e) false -#define Media_StopFilm(a) true +#define Media_StopFilm(a) (void)true #else /*media playing system*/ qboolean Media_PlayingFullScreen(void); diff --git a/engine/client/clq2_ents.c b/engine/client/clq2_ents.c index 120d42be..caf0832e 100644 --- a/engine/client/clq2_ents.c +++ b/engine/client/clq2_ents.c @@ -121,7 +121,6 @@ sfx_t *S_PrecacheSexedSound(int entnum, const char *soundname) void CLQ2_EntityEvent(entity_state_t *es) { - float ATTN_IDLE = 2; switch (es->u.q2.event) { case Q2EV_NONE: @@ -2092,9 +2091,6 @@ CL_AddViewWeapon */ static void CLQ2_AddViewWeapon (int seat, q2player_state_t *ps, q2player_state_t *ops) { - entity_t gun; // view model - extern cvar_t cl_gunx, cl_guny, cl_gunz; - extern cvar_t cl_gunanglex, cl_gunangley, cl_gunanglez; playerview_t *pv = &cl.playerview[seat]; pv->vm.oldmodel = NULL; @@ -2115,8 +2111,6 @@ static void CLQ2_AddViewWeapon (int seat, q2player_state_t *ps, q2player_state_t AngleVectors(pv->simangles, pv->vw_axis[0], pv->vw_axis[1], pv->vw_axis[2]); VectorInverse(pv->vw_axis[1]); - memset (&gun, 0, sizeof(gun)); - pv->vm.oldmodel = cl.model_precache[ps->gunindex]; if (!pv->vm.oldmodel) return; @@ -2126,42 +2120,6 @@ static void CLQ2_AddViewWeapon (int seat, q2player_state_t *ps, q2player_state_t pv->vm.prevframe = ps->gunframe; else pv->vm.prevframe = ops->gunframe; -/* - gun.shaderRGBAf[0] = 1; - gun.shaderRGBAf[1] = 1; - gun.shaderRGBAf[2] = 1; - if (r_drawviewmodel.value < 1 || r_drawviewmodel.value > 0) - gun.shaderRGBAf[3] = r_drawviewmodel.value; - else - gun.shaderRGBAf[3] = 1; - - // set up gun position -#ifdef PEXT_SCALE - gun.scale = 1; -#endif - - gun.origin[0] = cl_gunz.value; - gun.origin[1] = -cl_gunx.value; - gun.origin[2] = -cl_guny.value; - - gun.angles[0] = cl_gunanglex.value; - gun.angles[1] = cl_gunangley.value; - gun.angles[2] = cl_gunanglez.value; - - gun.framestate.g[FS_REG].frame[0] = ps->gunframe; - if (gun.framestate.g[FS_REG].frame[0] == 0) - gun.framestate.g[FS_REG].frame[1] = 0; // just changed weapons, don't lerp from old - else - gun.framestate.g[FS_REG].frame[1] = ops->gunframe; - - gun.playerindex = -1; - - gun.flags = Q2RF_MINLIGHT | RF_DEPTHHACK | RF_WEAPONMODEL; - gun.framestate.g[FS_REG].lerpweight[0] = cl.lerpfrac; - gun.framestate.g[FS_REG].lerpweight[1] = 1-cl.lerpfrac; - VectorCopy (gun.origin, gun.oldorigin); // don't lerp at all - V_AddEntity (&gun); -*/ } @@ -2274,7 +2232,9 @@ Emits all entities, particles, and lights to the refresh */ void CLQ2_AddEntities (void) { +#ifdef _DEBUG extern cvar_t chase_active, chase_back, chase_up; +#endif int seat; if (cls.state != ca_active) return; diff --git a/engine/client/console.c b/engine/client/console.c index 3c056951..6a58fc94 100644 --- a/engine/client/console.c +++ b/engine/client/console.c @@ -931,7 +931,7 @@ void VARGS Con_Printf (const char *fmt, ...) if (!Sys_IsMainThread()) { - COM_AddWork(0, Con_PrintFromThread, NULL, Z_StrDup(msg), 0, 0); + COM_AddWork(WG_MAIN, Con_PrintFromThread, NULL, Z_StrDup(msg), 0, 0); return; } @@ -1007,7 +1007,7 @@ static void Con_DPrintFromThread (void *ctx, void *data, size_t a, size_t b) Con_Log(data); else { - Sys_Printf ("%s", data); // also echo to debugging console + Sys_Printf ("%s", (const char*)data); // also echo to debugging console Con_PrintCon(&con_main, data, con_main.parseflags); } BZ_Free(data); @@ -1043,7 +1043,7 @@ void VARGS Con_DPrintf (const char *fmt, ...) if (!Sys_IsMainThread()) { if (developer.ival) - COM_AddWork(0, Con_DPrintFromThread, NULL, Z_StrDup(msg), 0, 0); + COM_AddWork(WG_MAIN, Con_DPrintFromThread, NULL, Z_StrDup(msg), 0, 0); return; } diff --git a/engine/client/image.c b/engine/client/image.c index 9afd23eb..138684c0 100644 --- a/engine/client/image.c +++ b/engine/client/image.c @@ -2561,7 +2561,7 @@ static qboolean Image_ReadDDSFile(texid_t tex, unsigned int flags, char *fname, mips->mipcount = mipnum; - COM_AddWork(0, Image_LoadTextureMips, tex, mips, 0, 0); + COM_AddWork(WG_MAIN, Image_LoadTextureMips, tex, mips, 0, 0); return true; } #endif @@ -2606,8 +2606,6 @@ static qboolean Image_ReadBLPFile(texid_t tex, unsigned int flags, char *fname, if (blp->encoding == 2) { - int blocksize; - //s3tc/dxt switch(blp->alphaencoding) { @@ -2617,15 +2615,12 @@ static qboolean Image_ReadBLPFile(texid_t tex, unsigned int flags, char *fname, mips->encoding = PTI_S3RGBA1; else mips->encoding = PTI_S3RGB1; - blocksize = 8; break; case 1: //dxt2/3 mips->encoding = PTI_S3RGBA3; - blocksize = 16; break; case 7: //dxt4/5 mips->encoding = PTI_S3RGBA5; - blocksize = 16; break; } for (miplevel = 0; miplevel < 16; ) @@ -2735,7 +2730,7 @@ static qboolean Image_ReadBLPFile(texid_t tex, unsigned int flags, char *fname, mips->mipcount = miplevel; } - COM_AddWork(0, Image_LoadTextureMips, tex, mips, 0, 0); + COM_AddWork(WG_MAIN, Image_LoadTextureMips, tex, mips, 0, 0); return true; } @@ -4049,7 +4044,7 @@ static qboolean Image_LoadRawTexture(texid_t tex, unsigned int flags, void *rawd if (flags & IF_NOWORKER) Image_LoadTexture_Failed(tex, NULL, 0, 0); else - COM_AddWork(0, Image_LoadTexture_Failed, tex, NULL, 0, 0); + COM_AddWork(WG_MAIN, Image_LoadTexture_Failed, tex, NULL, 0, 0); return false; } Image_GenerateMips(mips, flags); @@ -4061,7 +4056,7 @@ static qboolean Image_LoadRawTexture(texid_t tex, unsigned int flags, void *rawd if (flags & IF_NOWORKER) Image_LoadTextureMips(tex, mips, 0, 0); else - COM_AddWork(0, Image_LoadTextureMips, tex, mips, 0, 0); + COM_AddWork(WG_MAIN, Image_LoadTextureMips, tex, mips, 0, 0); return true; } @@ -4154,7 +4149,7 @@ qboolean Image_LoadTextureFromMemory(texid_t tex, int flags, const char *iname, if (flags & IF_NOWORKER) Image_LoadTextureMips(tex, mips, 0, 0); else - COM_AddWork(0, Image_LoadTextureMips, tex, mips, 0, 0); + COM_AddWork(WG_MAIN, Image_LoadTextureMips, tex, mips, 0, 0); return true; } #endif @@ -4252,7 +4247,7 @@ static qboolean Image_LoadCubemapTexture(texid_t tex, char *nicename) if (tex->flags & IF_NOWORKER) Image_LoadTextureMips(tex, mips, 0, 0); else - COM_AddWork(0, Image_LoadTextureMips, tex, mips, 0, 0); + COM_AddWork(WG_MAIN, Image_LoadTextureMips, tex, mips, 0, 0); return true; } @@ -4291,7 +4286,7 @@ void Image_LoadHiResTextureWorker(void *ctx, void *data, size_t a, size_t b) if (tex->flags & IF_NOWORKER) Image_LoadTexture_Failed(tex, NULL, 0, 0); else - COM_AddWork(0, Image_LoadTexture_Failed, tex, NULL, 0, 0); + COM_AddWork(WG_MAIN, Image_LoadTexture_Failed, tex, NULL, 0, 0); } return; } @@ -4481,7 +4476,7 @@ void Image_LoadHiResTextureWorker(void *ctx, void *data, size_t a, size_t b) if (tex->flags & IF_NOWORKER) Image_LoadTexture_Failed(tex, NULL, 0, 0); else - COM_AddWork(0, Image_LoadTexture_Failed, tex, NULL, 0, 0); + COM_AddWork(WG_MAIN, Image_LoadTexture_Failed, tex, NULL, 0, 0); } @@ -4589,7 +4584,6 @@ void Image_Downloaded(struct dl_download *dl) image_t *Image_GetTexture(const char *identifier, const char *subpath, unsigned int flags, void *fallbackdata, void *fallbackpalette, int fallbackwidth, int fallbackheight, uploadfmt_t fallbackfmt) { image_t *tex; - static int seq; qboolean dontposttoworker = (flags & (IF_NOWORKER | IF_LOADNOW)); qboolean lowpri = (flags & IF_LOWPRIORITY); @@ -4701,9 +4695,9 @@ image_t *Image_GetTexture(const char *identifier, const char *subpath, unsigned else #endif if (lowpri) - COM_AddWork(1, Image_LoadHiResTextureWorker, tex, NULL, 0, 0); + COM_AddWork(WG_LOADER, Image_LoadHiResTextureWorker, tex, NULL, 0, 0); else - COM_AddWork(1, Image_LoadHiResTextureWorker, tex, NULL, 0, 0); + COM_AddWork(WG_LOADER, Image_LoadHiResTextureWorker, tex, NULL, 0, 0); } return tex; } diff --git a/engine/client/in_generic.c b/engine/client/in_generic.c index 6fcb95dd..c8ed97b4 100644 --- a/engine/client/in_generic.c +++ b/engine/client/in_generic.c @@ -517,7 +517,13 @@ void IN_MoveMouse(struct mouse_s *mouse, float *movements, int pnum, float frame int mfwt; qboolean strafe_x, strafe_y; int wpnum; +#ifdef PEXT_CSQC +#ifdef MULTITHREAD extern qboolean runningindepphys; +#else + const qboolean runningindepphys = false; +#endif +#endif //small performance boost if (mouse->type == M_INVALID) diff --git a/engine/client/in_morphos.c b/engine/client/in_morphos.c index eb59dcc7..2af7be8e 100644 --- a/engine/client/in_morphos.c +++ b/engine/client/in_morphos.c @@ -213,7 +213,7 @@ void INS_ProcessInputMessage(struct InputEvent *msg, qboolean consumemotion) void INS_Commands(void) { } -void INS_EnumerateDevices(void *ctx, void(*callback)(void *ctx, char *type, char *devicename, int *qdevid)) +void INS_EnumerateDevices(void *ctx, void(*callback)(void *ctx, const char *type, const char *devicename, int *qdevid)) { } void INS_Move (float *movements, int pnum) diff --git a/engine/client/in_sdl.c b/engine/client/in_sdl.c index 3d8841c8..0b042dd9 100644 --- a/engine/client/in_sdl.c +++ b/engine/client/in_sdl.c @@ -912,7 +912,7 @@ void INS_Accumulate(void) //input polling void INS_Commands (void) //used to Cbuf_AddText joystick button events in windows. { } -void INS_EnumerateDevices(void *ctx, void(*callback)(void *ctx, char *type, char *devicename, int *qdevid)) +void INS_EnumerateDevices(void *ctx, void(*callback)(void *ctx, const char *type, const char *devicename, int *qdevid)) { } diff --git a/engine/client/in_win.c b/engine/client/in_win.c index 97b68db9..11bb8aa5 100644 --- a/engine/client/in_win.c +++ b/engine/client/in_win.c @@ -98,7 +98,7 @@ HRESULT (WINAPI *pDirectInputCreate)(HINSTANCE hinst, DWORD dwVersion, // mouse variables static cvar_t in_dinput = CVARF("in_dinput","0", CVAR_ARCHIVE); -static cvar_t in_xinput = CVARFD("in_xinput","0", CVAR_ARCHIVE, "Enables the use of xinput for controllers.\nNote that if you have a headset plugged in, that headset will be used for audio playback if no specific audio device is configured (may require snd_restart too)."); +static cvar_t in_xinput = CVARFD("in_xinput","0", CVAR_ARCHIVE, "Enables the use of xinput for controllers.\nNote that if you have a headset plugged in, that headset will be used for audio playback if no specific audio device is configured."); static cvar_t in_builtinkeymap = CVARF("in_builtinkeymap", "0", CVAR_ARCHIVE); static cvar_t in_simulatemultitouch = CVAR("in_simulatemultitouch", "0"); static cvar_t in_nonstandarddeadkeys = CVARD("in_nonstandarddeadkeys", "1", "Discard input events that result in multiple keys. Only the last key will be used. This results in behaviour that differs from eg notepad. To use a dead key, press it twice instead of the dead key followed by space."); @@ -2066,7 +2066,7 @@ void INS_JoyMove (float *movements, int pnum) } } -void INS_EnumerateDevices(void *ctx, void(*callback)(void *ctx, char *type, char *devicename, int *qdevid)) +void INS_EnumerateDevices(void *ctx, void(*callback)(void *ctx, const char *type, const char *devicename, int *qdevid)) { int idx; diff --git a/engine/client/input.h b/engine/client/input.h index e01bf86f..76546c49 100644 --- a/engine/client/input.h +++ b/engine/client/input.h @@ -58,7 +58,7 @@ void INS_ReInit (void); void INS_Init (void); void INS_Shutdown (void); void INS_Commands (void); //final chance to call IN_MouseMove/IN_KeyEvent each frame -void INS_EnumerateDevices(void *ctx, void(*callback)(void *ctx, char *type, char *devicename, int *qdevid)); +void INS_EnumerateDevices(void *ctx, void(*callback)(void *ctx, const char *type, const char *devicename, int *qdevid)); void INS_SetupControllerAudioDevices(qboolean enabled); //creates audio devices for each controller (where controllers have their own audio devices) #define DEVID_UNSET -1 diff --git a/engine/client/m_items.c b/engine/client/m_items.c index 51e75038..58fd5817 100644 --- a/engine/client/m_items.c +++ b/engine/client/m_items.c @@ -411,7 +411,6 @@ static qboolean MI_Selectable(menuoption_t *op) static void M_CheckMouseMove(void) { qboolean foundexclusive = false; - int mgt; menu_t *menu; menuoption_t *option; @@ -424,8 +423,6 @@ static void M_CheckMouseMove(void) if (mousemoved) { - mgt = M_GameType(); - for (menu = firstmenu; menu; menu = menu->parent) { if (menu->exclusive) @@ -450,7 +447,7 @@ static void M_CheckMouseMove(void) if (!option->common.noselectionsound) { #ifdef HEXEN2 - if (mgt == MGT_HEXEN2) + if (M_GameType() == MGT_HEXEN2) S_LocalSound ("raven/menu1.wav"); else #endif @@ -930,7 +927,6 @@ menuoption_t *MC_AddCursorSmall(menu_t *menu, menuresel_t *reselection, int x, i menupicture_t *MC_AddCursor(menu_t *menu, menuresel_t *reselection, int x, int y) { - int mgt; menupicture_t *n = Z_Malloc(sizeof(menupicture_t)); if (reselection) menu->reselection = reselection; @@ -944,8 +940,7 @@ menupicture_t *MC_AddCursor(menu_t *menu, menuresel_t *reselection, int x, int y n->common.next = menu->options; menu->options = (menuoption_t *)n; - mgt = M_GameType(); - switch(mgt) + switch(M_GameType()) { #ifdef Q2CLIENT case MGT_QUAKE2: @@ -1806,9 +1801,6 @@ menuoption_t *M_PrevSelectableItem(menu_t *m, menuoption_t *old) void M_Complex_Key(int key, int unicode) { - int mgt; - mgt = M_GameType(); - if (!currentmenu) return; //erm... @@ -1832,7 +1824,7 @@ void M_Complex_Key(int key, int unicode) return; #ifdef HEXEN2 - if (mgt == MGT_HEXEN2) + if (M_GameType() == MGT_HEXEN2) S_LocalSound ("raven/menu1.wav"); else #endif @@ -1869,7 +1861,7 @@ void M_Complex_Key(int key, int unicode) //remove M_RemoveMenu(currentmenu); #ifdef HEXEN2 - if (mgt == MGT_HEXEN2) + if (M_GameType() == MGT_HEXEN2) S_LocalSound ("raven/menu3.wav"); else #endif @@ -1882,7 +1874,7 @@ void M_Complex_Key(int key, int unicode) if (currentmenu->selecteditem) { #ifdef HEXEN2 - if (mgt == MGT_HEXEN2) + if (M_GameType() == MGT_HEXEN2) S_LocalSound ("raven/menu1.wav"); else #endif @@ -1898,7 +1890,7 @@ void M_Complex_Key(int key, int unicode) if (currentmenu->selecteditem) { #ifdef HEXEN2 - if (mgt == MGT_HEXEN2) + if (M_GameType() == MGT_HEXEN2) S_LocalSound ("raven/menu1.wav"); else #endif @@ -1932,7 +1924,7 @@ void M_Complex_Key(int key, int unicode) { Cbuf_AddText(currentmenu->selecteditem->button.command, RESTRICT_LOCAL); #ifdef HEXEN2 - if (mgt == MGT_HEXEN2) + if (M_GameType() == MGT_HEXEN2) S_LocalSound ("raven/menu2.wav"); else #endif @@ -1964,107 +1956,12 @@ void M_Complex_Key(int key, int unicode) - -typedef struct { - int itemselected; - menu_t *dropout; - menutext_t *op[64]; - char *text[64]; - - menu_t *parent; -} guiinfo_t; - -static qboolean MC_GuiKey(int key, menu_t *menu) -{ - guiinfo_t *info = (guiinfo_t *)menu->data; - switch(key) - { - case K_ESCAPE: - if (info->dropout) - MC_GuiKey(key, info->dropout); - else - { - guiinfo_t *gui; - M_RemoveMenu(menu); - if (menu->parent) - { - gui = (guiinfo_t *)menu->parent->data; - gui->dropout = NULL; - } - } - break; - - case K_ENTER: - case K_KP_ENTER: - case K_RIGHTARROW: - if (info->dropout) - MC_GuiKey(key, info->dropout); - else - { - int y, i; - guiinfo_t *gui; - info->dropout = M_CreateMenu(sizeof(guiinfo_t)); - currentmenu = info->dropout; - info->dropout->key = MC_GuiKey; - info->dropout->exclusive = false; - info->dropout->parent = menu; - info->dropout->xpos = 0; - info->dropout->ypos = menu->ypos+info->itemselected*8; - for (i = 0; info->text[i]; i++) - if (info->dropout->xpos < strlen(info->text[i])) - info->dropout->xpos = strlen(info->text[i]); - info->dropout->xpos*=8; - info->dropout->xpos+=menu->xpos; - gui = (guiinfo_t *)info->dropout->data; - gui->text[0] = "Hello"; - gui->text[1] = "Hello again"; - gui->text[2] = "Hello yet again"; - for (y = 0, i = 0; gui->text[i]; i++, y+=1*8) - { - info->op[i] = MC_AddRedText(info->dropout, 0, 0, y, gui->text[i], false); - } - } - break; - case K_LEFTARROW: - if (info->dropout) - MC_GuiKey(key, info->dropout); - else - { - guiinfo_t *gui; - M_RemoveMenu(menu); - if (menu->parent) - { - gui = (guiinfo_t *)menu->parent->data; - gui->dropout = NULL; - } - } - break; - case K_UPARROW: - info->op[info->itemselected]->isred = true; - if (info->itemselected) - info->itemselected--; - info->op[info->itemselected]->isred = false; - break; - case K_DOWNARROW: - if (!info->op[info->itemselected]) - break; - info->op[info->itemselected]->isred = true; - if (info->text[info->itemselected+1]) - info->itemselected++; - info->op[info->itemselected]->isred = false; - break; - } - - return true; -} - - extern int m_save_demonum; qboolean MC_Main_Key (int key, menu_t *menu) //here purly to restart demos. { if (key == K_ESCAPE || key == K_MOUSE2) { - extern cvar_t cl_demoreel, con_stayhidden; + extern cvar_t con_stayhidden; //don't spam menu open+close events if we're not going to be allowing the console to appear if (con_stayhidden.ival && cls.state == ca_disconnected) @@ -2073,15 +1970,6 @@ qboolean MC_Main_Key (int key, menu_t *menu) //here purly to restart demos. Key_Dest_Remove(kdm_emenu); m_state = m_none; -/* if (m_save_demonum != -1) - { - cls.demonum = m_save_demonum; - m_save_demonum = -1; - - if (cls.demonum != -1 && !cls.demoplayback && cls.state == ca_disconnected && cl_demoreel.ival) - CL_NextDemo (); - } -*/ return true; } return false; @@ -2095,8 +1983,6 @@ void M_Menu_Main_f (void) mpic_t *p; static menuresel_t resel; - int mgt; - #ifdef CSQC_DAT if (CSQC_ConsoleCommand(va("%s %s", Cmd_Argv(0), Cmd_Args()))) return; @@ -2137,9 +2023,8 @@ void M_Menu_Main_f (void) S_LocalSound ("misc/menu2.wav"); - mgt = M_GameType(); #ifdef Q2CLIENT - if (mgt == MGT_QUAKE2) //quake2 main menu. + if (M_GameType() == MGT_QUAKE2) //quake2 main menu. { if (R_GetShaderSizes(R2D_SafeCachePic("pics/m_main_quit"), NULL, NULL, true) > 0) { @@ -2195,7 +2080,7 @@ void M_Menu_Main_f (void) else #endif #ifdef HEXEN2 - if (mgt == MGT_HEXEN2) + if (M_GameType() == MGT_HEXEN2) { p = R2D_SafeCachePic("gfx/menu/title0.lmp"); if (R_GetShaderSizes(p, NULL, NULL, true) <= 0) diff --git a/engine/client/m_master.c b/engine/client/m_master.c index b4b0bad7..bc18302b 100644 --- a/engine/client/m_master.c +++ b/engine/client/m_master.c @@ -777,9 +777,9 @@ dojoin: char safename[128]; Q_strncpyz(safename, server->name, sizeof(safename)); //ALWAYS sanitize your inputs. - while(s = strchr(safename, ';')) + while((s = strchr(safename, ';'))) *s = ' '; - while(s = strchr(safename, '\n')) + while((s = strchr(safename, '\n'))) *s = ' '; if (key == 'c') Sys_SaveClipboard(va("%s - %s\n", server->name, NET_AdrToString(buf, sizeof(buf), &server->adr))); diff --git a/engine/client/m_mp3.c b/engine/client/m_mp3.c index d1f28ab1..0d952249 100644 --- a/engine/client/m_mp3.c +++ b/engine/client/m_mp3.c @@ -36,7 +36,9 @@ static char media_friendlyname[MAX_QPATH]; #define MEDIA_GAMEMUSIC (1u<<0) //cd music. also music command etc. #define MEDIA_CVARLIST (1u<<1) //cvar abuse. handy for preserving times when switching tracks. #define MEDIA_PLAYLIST (1u<<2) // +#if !defined(NOMEDIA) static unsigned int media_playlisttypes; +#endif static unsigned int media_playlistcurrent; static int cdplayingtrack; //currently playing cd track (becomes 0 when paused) @@ -57,10 +59,12 @@ static int cdnumtracks; //maximum cd track we can play. //cvar abuse +#if !defined(NOMEDIA) static int music_playlist_last; static cvar_t music_playlist_index = CVAR("music_playlist_index", "-1"); // created dynamically: CVAR("music_playlist_list0+", ""), // created dynamically: CVAR("music_playlist_sampleposition0+", "-1"), +#endif static qboolean Media_Changed (unsigned int mediatype) @@ -115,9 +119,9 @@ qboolean Media_NamedTrack(const char *track, const char *looptrack) }; char trackname[MAX_QPATH]; int ie, ip; + qboolean found = false; #endif char *trackend; - qboolean found = false; if (!track || !*track) //ignore calls if the primary track is invalid. whatever is already playing will continue to play. return false; @@ -138,9 +142,7 @@ qboolean Media_NamedTrack(const char *track, const char *looptrack) if (!strcmp(looptrack, "-")) //- for the looptrack argument can be used to prevent looping. looptrack = ""; -#if defined(NOMEDIA) - found = false; -#else +#ifndef NOMEDIA for(ip = 0; path[ip] && !found; ip++) { if (tracknum) @@ -3233,6 +3235,8 @@ void Media_RecordFrame (void) case TF_RGBA32: qglReadPixels(0, 0, vid.fbpwidth, vid.fbpheight, GL_RGBA, GL_UNSIGNED_BYTE, 0); break; + default: + break; } qglBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0); } @@ -3444,7 +3448,6 @@ void Media_StopRecordFilm_f (void) if (pbo_format) { int i; - int imagesize = vid.fbpwidth * vid.fbpheight * 4; while (pbo_oldest < captureframe) { qbyte *buffer; @@ -3559,7 +3562,7 @@ static void Media_RecordFilm (char *recordingname, qboolean demo) #ifdef CAN_USE_PBOS pbo_format = TF_INVALID; if (qrenderer == QR_OPENGL && !gl_config.gles && gl_config.glversion >= 2.1) - { //both tgas and vfw favour bgr24, so lets get the gl drivers to suffer instead of us. + { //both tgas and vfw favour bgr24, so lets get the gl drivers to suffer instead of us, where possible. if (vid.fbpwidth & 3) pbo_format = TF_BGRA32; //don't bother changing pack alignment, just use something that is guarenteed to not need anything. else diff --git a/engine/client/m_multi.c b/engine/client/m_multi.c index 73c97d7e..6b2f31ba 100644 --- a/engine/client/m_multi.c +++ b/engine/client/m_multi.c @@ -420,16 +420,14 @@ void MSetup_TransDraw (int x, int y, menucustom_t *option, menu_t *menu) void M_Menu_Setup_f (void) { - int mgt; setupmenu_t *info; menu_t *menu; menucustom_t *ci; menubutton_t *b; static menuresel_t resel; - mgt = M_GameType(); #ifdef Q2CLIENT - if (mgt == MGT_QUAKE2) //quake2 main menu. + if (M_GameType() == MGT_QUAKE2) //quake2 main menu. { if (R2D_SafeCachePic("pics/m_banner_player_setup")) { @@ -481,7 +479,7 @@ void M_Menu_Setup_f (void) (info->teamedit = MC_AddEdit(menu, 64, 160, 56, "Your team", team.string)); #ifdef HEXEN2 info->ticlass = -1; - if (mgt == MGT_HEXEN2) + if (M_GameType() == MGT_HEXEN2) { static const char *classnames[] = { @@ -597,7 +595,6 @@ qboolean MultiBeginGame (union menuoption_s *option,struct menu_s *menu, int key } void M_Menu_GameOptions_f (void) { - extern cvar_t pr_maxedicts; static const char *deathmatchoptions[] = { "Cooperative", "Deathmatch 1", diff --git a/engine/client/m_options.c b/engine/client/m_options.c index 63c0cd6c..fce7b166 100644 --- a/engine/client/m_options.c +++ b/engine/client/m_options.c @@ -172,19 +172,27 @@ qboolean M_Options_InvertMouse (menucheck_t *option, struct menu_s *menu, chk_se } } +#if defined(WEBCLIENT) && defined(_WIN32) +#define HAVEAUTOUPDATE void M_Options_Remove(menu_t *m) { menucombo_t *c = m->data; if (c) Sys_SetAutoUpdateSetting(c->selectedoption); } +#endif //options menu. void M_Menu_Options_f (void) { - extern cvar_t crosshair, r_projection, sv_autosave; + extern cvar_t crosshair, r_projection; +#ifndef CLIENTONLY + extern cvar_t sv_autosave; +#endif int y; +#ifdef HAVEAUTOUPDATE +#define HAVEAUTOUPDATE menuoption_t *updatecbo; static const char *autoupopts[] = { "Revert", @@ -193,7 +201,7 @@ void M_Menu_Options_f (void) "Untested(Latest)", NULL }; - +#endif static const char *projections[] = { "Regular", "Stereographic", @@ -209,9 +217,11 @@ void M_Menu_Options_f (void) "2", "3", "4", + "5", NULL }; +#ifndef CLIENTONLY static const char *autosaveopts[] = { "Off", "30 secs", @@ -221,7 +231,7 @@ void M_Menu_Options_f (void) "5 mins", NULL }; - static const char *autsavevals[] = { + static const char *autosavevals[] = { "0", "0.5", "1", @@ -230,6 +240,7 @@ void M_Menu_Options_f (void) "5", NULL }; +#endif menubulk_t bulk[] = { MB_CONSOLECMD("Customize controls", "menu_keys\n", "Modify keyboard and mouse inputs."), @@ -246,9 +257,11 @@ void M_Menu_Options_f (void) MB_CHECKBOXCVAR("Lookspring", lookspring, 0), MB_CHECKBOXCVAR("Lookstrafe", lookstrafe, 0), MB_CHECKBOXCVAR("Windowed Mouse", _windowed_mouse, 0), +#ifdef HAVEAUTOUPDATE MB_COMBORETURN("Auto Update", autoupopts, Sys_GetAutoUpdateSetting(), updatecbo, "This downloads engine updates from the internet, when a new build is available."), +#endif #ifndef CLIENTONLY - MB_COMBOCVAR("Auto Save", sv_autosave, autosaveopts, autsavevals, NULL), + MB_COMBOCVAR("Auto Save", sv_autosave, autosaveopts, autosavevals, NULL), #endif MB_SPACING(4), // removed hud options (cl_sbar, cl_hudswap, old-style chat, old-style msg) @@ -300,9 +313,10 @@ void M_Menu_Options_f (void) } #endif - +#ifdef HAVEAUTOUPDATE menu->data = updatecbo; menu->remove = M_Options_Remove; +#endif } #ifndef __CYGWIN__ @@ -1220,6 +1234,7 @@ qboolean M_VideoApplyShadowLighting (union menuoption_s *op,struct menu_s *menu, if (key != K_ENTER && key != K_KP_ENTER && key != K_MOUSE1) return false; +#ifdef RTLIGHTS { char *cvarsrw = "0"; char *cvarsrws = "0"; @@ -1243,6 +1258,7 @@ qboolean M_VideoApplyShadowLighting (union menuoption_s *op,struct menu_s *menu, Cbuf_AddText(va("r_vertexlight %s;r_shadow_realtime_world %s;r_shadow_realtime_world_shadows %s\n", cvarv, cvarsrw, cvarsrws), RESTRICT_LOCAL); #endif } +#endif { char *cvard = "0"; @@ -1269,11 +1285,20 @@ qboolean M_VideoApplyShadowLighting (union menuoption_s *op,struct menu_s *menu, cvarvd = "1"; break; } +#ifdef RTLIGHTS #ifdef MINIMAL Cbuf_AddText(va("r_shadow_realtime_dlight %s;r_shadow_realtime_dlight_shadows %s;r_dynamic %s\n", cvarsrd, cvarsrds, cvard), RESTRICT_LOCAL); #else Cbuf_AddText(va("r_shadow_realtime_dlight %s;r_shadow_realtime_dlight_shadows %s;r_dynamic %s;r_vertexdlight %s\n", cvarsrd, cvarsrds, cvard, cvarvd), RESTRICT_LOCAL); #endif +#else +#ifdef MINIMAL + Cbuf_AddText(va("r_dynamic %s\n", cvard), RESTRICT_LOCAL); +#else + Cbuf_AddText(va("r_dynamic %s;r_vertexdlight %s\n", cvard, cvarvd), RESTRICT_LOCAL); +#endif +#endif + (void)cvarsrd, (void)cvarsrds, (void)cvard, (void)cvarvd; } Cbuf_AddText("vid_restart\n", RESTRICT_LOCAL); @@ -1288,9 +1313,11 @@ void M_Menu_Lighting_f (void) #ifndef MINIMAL extern cvar_t r_vertexlight, r_vertexdlights; #endif - extern cvar_t r_stains, r_shadows, r_shadow_realtime_world, r_loadlits, r_dynamic; + extern cvar_t r_stains, r_shadows, r_loadlits; extern cvar_t r_lightstylesmooth, r_nolightdir; - extern cvar_t r_shadow_realtime_dlight, r_shadow_realtime_dlight_shadows; +#ifdef RTLIGHTS + extern cvar_t r_dynamic, r_shadow_realtime_world, r_shadow_realtime_dlight, r_shadow_realtime_dlight_shadows; +#endif extern cvar_t r_fb_models, r_rocketlight, r_powerupglow; extern cvar_t v_powerupshell, r_explosionlight; //extern cvar_t r_fb_bmodels, r_shadow_realtime_world_lightmaps, r_lightstylespeed; @@ -1298,10 +1325,12 @@ void M_Menu_Lighting_f (void) static const char *lightingopts[] = { "Standard", +#ifdef RTLIGHTS "Realtime", "RT+Shadows", #ifndef MINIMAL "Vertex", +#endif #endif NULL }; @@ -1309,11 +1338,13 @@ void M_Menu_Lighting_f (void) { "None", "Standard", +#ifdef RTLIGHTS "Realtime", "RT+Shadows", "Threaded Lightmaps", #ifndef MINIMAL "Vertex", +#endif #endif NULL }; @@ -1381,9 +1412,9 @@ void M_Menu_Lighting_f (void) int y; menu_t *menu = M_Options_Title(&y, sizeof(lightingmenuinfo_t)); -#ifdef RTLIGHTS int lightselect, dlightselect; +#ifdef RTLIGHTS if (r_shadow_realtime_world.ival) { if (r_shadow_realtime_world_shadows.ival) @@ -1391,13 +1422,16 @@ void M_Menu_Lighting_f (void) else lightselect = 1; } -#ifndef MINIMAL - else if (r_vertexlight.ival) - lightselect = 3; -#endif else +#endif +#ifndef MINIMAL + if (r_vertexlight.ival) + lightselect = 3; + else +#endif lightselect = 0; +#ifdef RTLIGHTS if (r_shadow_realtime_dlight.ival) { if (r_shadow_realtime_dlight_shadows.ival) @@ -1411,11 +1445,12 @@ void M_Menu_Lighting_f (void) else if (r_vertexdlights.ival) dlightselect = 5; #endif - else if (r_dynamic.ival > 0) + else +#endif + if (r_dynamic.ival > 0) dlightselect = 1; else dlightselect = 0; -#endif { lightingmenuinfo_t *info = menu->data; @@ -1423,9 +1458,9 @@ void M_Menu_Lighting_f (void) { MB_REDTEXT("Lighting Options", false), MB_TEXT("^Ue080^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue082", false), -#ifdef RTLIGHTS MB_COMBORETURN("Lighting Mode", lightingopts, lightselect, info->lightcombo, "Selects method used for world lighting. Realtime lighting requires appropriate realtime lighting files for maps."), MB_COMBORETURN("Dynamic Lighting Mode", dlightopts, dlightselect, info->dlightcombo, "Selects method used for dynamic lighting such as explosion lights and muzzle flashes."), +#ifdef RTLIGHTS MB_CHECKBOXCVARTIP("Soft Shadows", r_shadow_shadowmapping, 0, "Enables softer shadows instead of course-edged pixelated shadows."), MB_CMD("Apply Lighting", M_VideoApplyShadowLighting, "Applies set lighting modes and restarts video."), MB_SPACING(4), @@ -1456,6 +1491,7 @@ menucombo_t *skillcombo; menucombo_t *mapcombo; } singleplayerinfo_t; +#ifndef CLIENTONLY static const char *maplist_q1[] = { "start", @@ -1528,7 +1564,7 @@ static const char *mapoptions_q1[] = NULL }; - +#ifdef Q2CLIENT static const char *maplist_q2[] = { "base1", @@ -1614,6 +1650,8 @@ static const char *mapoptions_q2[] = "boss2 (Unit 9 Boss Levels: Final Showdown)", NULL }; +#endif +#endif qboolean M_Apply_SP_Cheats (union menuoption_s *op,struct menu_s *menu,int key) { @@ -1638,8 +1676,10 @@ qboolean M_Apply_SP_Cheats (union menuoption_s *op,struct menu_s *menu,int key) break; } +#ifndef CLIENTONLY if ((unsigned int)info->mapcombo->selectedoption >= sizeof(maplist_q1)/sizeof(maplist_q1[0])) Cbuf_AddText(va("map %s\n", maplist_q1[info->mapcombo->selectedoption]), RESTRICT_LOCAL); +#endif M_RemoveMenu(menu); Cbuf_AddText("menu_spcheats\n", RESTRICT_LOCAL); @@ -1649,6 +1689,7 @@ qboolean M_Apply_SP_Cheats (union menuoption_s *op,struct menu_s *menu,int key) void M_Menu_Singleplayer_Cheats_Quake (void) { + #ifndef CLIENTONLY static const char *skilloptions[] = { "Easy", @@ -1658,15 +1699,13 @@ void M_Menu_Singleplayer_Cheats_Quake (void) "None Set", NULL }; - - singleplayerinfo_t *info; - int cursorpositionY; - #ifndef CLIENTONLY int currentskill; int currentmap; extern cvar_t sv_gravity, sv_cheats, sv_maxspeed, skill; extern cvar_t host_mapname; #endif + singleplayerinfo_t *info; + int cursorpositionY; int y; menu_t *menu = M_Options_Title(&y, sizeof(*info)); info = menu->data; @@ -1725,6 +1764,7 @@ void M_Menu_Singleplayer_Cheats_Quake (void) menu->cursoritem = (menuoption_t*)MC_AddWhiteText(menu, 170, 0, cursorpositionY, NULL, false); } +#ifdef Q2CLIENT // Quake 2 typedef struct { @@ -1760,7 +1800,6 @@ qboolean M_Apply_SP_Cheats_Q2 (union menuoption_s *op,struct menu_s *menu,int ke return true; } - void M_Menu_Singleplayer_Cheats_Quake2 (void) { @@ -1848,11 +1887,9 @@ void M_Menu_Singleplayer_Cheats_Quake2 (void) menu->selecteditem = (union menuoption_s *)info->skillcombo; menu->cursoritem = (menuoption_t*)MC_AddWhiteText(menu, 170, 0, cursorpositionY, NULL, false); } +#endif // Quake 2 -// Hexen 2 - -// Quake 2 - +#ifdef HEXEN2 // Hexen 2 typedef struct { menucombo_t *skillcombo; menucombo_t *mapcombo; @@ -2203,6 +2240,7 @@ void M_Menu_Singleplayer_Cheats_Hexen2 (void) menu->selecteditem = (union menuoption_s *)info->skillcombo; menu->cursoritem = (menuoption_t*)MC_AddWhiteText(menu, 250, 0, cursorpositionY, NULL, false); } +#endif void M_Menu_Singleplayer_Cheats_f (void) { diff --git a/engine/client/m_single.c b/engine/client/m_single.c index 5fa39e92..ded960a5 100644 --- a/engine/client/m_single.c +++ b/engine/client/m_single.c @@ -295,8 +295,8 @@ void M_Menu_SinglePlayer_f (void) #ifndef CLIENTONLY menubutton_t *b; mpic_t *p; -#endif static menuresel_t resel; +#endif Key_Dest_Add(kdm_emenu); m_state = m_complex; diff --git a/engine/client/menu.c b/engine/client/menu.c index 2ffa792b..c1270438 100644 --- a/engine/client/menu.c +++ b/engine/client/menu.c @@ -1276,7 +1276,7 @@ void M_Reinit(void) { M_Init_Internal(); - CSQC_UnconnectedInit(); + (void)CSQC_UnconnectedInit(); } } @@ -1329,7 +1329,7 @@ void M_Reinit(void) if (!MP_Init()) #endif { - CSQC_UnconnectedInit(); + (void)CSQC_UnconnectedInit(); } } void M_Init (void) diff --git a/engine/client/net_master.c b/engine/client/net_master.c index 35510258..aef7326a 100644 --- a/engine/client/net_master.c +++ b/engine/client/net_master.c @@ -333,7 +333,7 @@ void SV_Master_Worker_Resolve(void *ctx, void *data, size_t a, size_t b) first = false; } work->success = !!found; - COM_AddWork(0, SV_Master_Worker_Resolved, NULL, work, a, b); + COM_AddWork(WG_MAIN, SV_Master_Worker_Resolved, NULL, work, a, b); } /* @@ -388,7 +388,7 @@ void SV_Master_Heartbeat (void) struct thr_res *work = Z_Malloc(sizeof(*work) + strlen(net_masterlist[i].cv.string)); strcpy(work->str, net_masterlist[i].cv.string); net_masterlist[i].resolving = true; //don't spam work - COM_AddWork(0, SV_Master_Worker_Resolve, NULL, work, i, 0); + COM_AddWork(WG_MAIN, SV_Master_Worker_Resolve, NULL, work, i, 0); } } else @@ -1259,9 +1259,10 @@ serverinfo_t *Master_FindRoute(netadr_t target) if (chain) *chain = 0; - NET_StringToAdr(cl_proxyaddr.string, 0, &pa); - - prox = Master_InfoForServer(&pa); + if (NET_StringToAdr(cl_proxyaddr.string, 0, &pa)) + prox = Master_InfoForServer(&pa); + else + prox = NULL; if (chain) *chain = '@'; } @@ -1419,7 +1420,7 @@ void CLMaster_AddMaster_Worker_Resolve(void *ctx, void *data, size_t a, size_t b //add the main ip address work->adr = adrs[0]; - COM_AddWork(0, CLMaster_AddMaster_Worker_Resolved, NULL, work, a, b); + COM_AddWork(WG_MAIN, CLMaster_AddMaster_Worker_Resolved, NULL, work, a, b); //add dupes too (eg: ipv4+ipv6) for (i = 1; i < found; i++) @@ -1445,7 +1446,7 @@ void CLMaster_AddMaster_Worker_Resolve(void *ctx, void *data, size_t a, size_t b alt->sends = 1; alt->nosave = true; alt->adr = adrs[i]; - COM_AddWork(0, CLMaster_AddMaster_Worker_Resolved, NULL, alt, a, b); + COM_AddWork(WG_MAIN, CLMaster_AddMaster_Worker_Resolved, NULL, alt, a, b); } } } @@ -1468,7 +1469,7 @@ void Master_AddMaster (char *address, enum mastertype_e mastertype, enum masterp strcpy(mast->address, address); mast->sends = 1; - COM_AddWork(1, CLMaster_AddMaster_Worker_Resolve, NULL, mast, 0, 0); + COM_AddWork(WG_LOADER, CLMaster_AddMaster_Worker_Resolve, NULL, mast, 0, 0); } void MasterInfo_Shutdown(void) @@ -2104,7 +2105,10 @@ char *jsonnode(int level, char *node) if (level == 1) { if (!strcmp(key, "IPAddress")) - NET_StringToAdr(com_token, 0, &adr); + { + if (!NET_StringToAdr(com_token, 0, &adr)) + adr.type = NA_INVALID; + } if (!strcmp(key, "Port")) port = atoi(com_token); if (!strcmp(key, "DNS")) @@ -2843,14 +2847,14 @@ int CL_ReadServerInfo(char *msg, enum masterprotocol_e prototype, qboolean favor { case PROTOCOL_VERSION_QW: info->special = SS_QUAKEWORLD; break; #ifdef NQPROT - case NQ_PROTOCOL_VERSION: info->special = SS_NETQUAKE; break; - case H2_PROTOCOL_VERSION: info->special = SS_NETQUAKE; break; //erk - case NEHD_PROTOCOL_VERSION: info->special = SS_NETQUAKE; break; - case FITZ_PROTOCOL_VERSION: info->special = SS_NETQUAKE; break; - case RMQ_PROTOCOL_VERSION: info->special = SS_NETQUAKE; break; - case DP5_PROTOCOL_VERSION: info->special = SS_DARKPLACES; break; //dp actually says 3... but hey, that's dp being WEIRD. - case DP6_PROTOCOL_VERSION: info->special = SS_DARKPLACES; break; - case DP7_PROTOCOL_VERSION: info->special = SS_DARKPLACES; break; + case PROTOCOL_VERSION_NQ: info->special = SS_NETQUAKE; break; + case PROTOCOL_VERSION_H2: info->special = SS_NETQUAKE; break; //erk + case PROTOCOL_VERSION_NEHD: info->special = SS_NETQUAKE; break; + case PROTOCOL_VERSION_FITZ: info->special = SS_NETQUAKE; break; + case PROTOCOL_VERSION_RMQ: info->special = SS_NETQUAKE; break; + case PROTOCOL_VERSION_DP5: info->special = SS_DARKPLACES; break; //dp actually says 3... but hey, that's dp being WEIRD. + case PROTOCOL_VERSION_DP6: info->special = SS_DARKPLACES; break; + case PROTOCOL_VERSION_DP7: info->special = SS_DARKPLACES; break; #endif default: if (PROTOCOL_VERSION_Q2 >= info->protocol && info->protocol >= PROTOCOL_VERSION_Q2_MIN) diff --git a/engine/client/p_classic.c b/engine/client/p_classic.c index 7efa2a1f..e38c84e2 100644 --- a/engine/client/p_classic.c +++ b/engine/client/p_classic.c @@ -847,11 +847,10 @@ static void Classic_BrightField (vec3_t org) extern float r_avertexnormals[NUMVERTEXNORMALS][3]; float beamlength = 16; - int count; int i; cparticle_t *p; float angle; - float sr, sp, sy, cr, cp, cy; + float sp, sy, cp, cy; vec3_t forward; float dist; @@ -859,12 +858,15 @@ static void Classic_BrightField (vec3_t org) particleframe = cl_framecount; dist = 64; - count = 50; if (!avelocities[0][0]) { - for (i=0 ; ispawnparam1, ptype->spawnparam2), outstrlen); break; + case SM_MESHSURFACE: + Q_strncatz(outstr, va("spawnmode meshsurface\n"), outstrlen); + break; } if (ptype->spawnvel || ptype->spawnvelvert || all) Q_strncatz(outstr, va("spawnvel %g %g\n", ptype->spawnvel, ptype->spawnvelvert), outstrlen); @@ -4138,7 +4141,6 @@ static void PScript_ApplyOrgVel(vec3_t oorg, vec3_t ovel, vec3_t eforg, vec3_t a static void PScript_EffectSpawned(part_type_t *ptype, vec3_t org, vec3_t axis[3], int dlkey, float countscale) { - extern cvar_t r_rocketlight; extern cvar_t r_lightflicker; if (ptype->nummodels) { diff --git a/engine/client/pr_skelobj.c b/engine/client/pr_skelobj.c index a543d8ae..69ee64b8 100644 --- a/engine/client/pr_skelobj.c +++ b/engine/client/pr_skelobj.c @@ -198,6 +198,7 @@ static void bonemat_fromqcvectors(float *out, const float vx[3], const float vy[ out[10] = vz[2]; out[11] = t[2]; } +#ifndef SERVERONLY static void bonemat_fromaxisorg(float *out, vec3_t axis[3], const float t[3]) { out[0] = axis[0][0]; @@ -213,6 +214,7 @@ static void bonemat_fromaxisorg(float *out, vec3_t axis[3], const float t[3]) out[10]= axis[2][2]; out[11]= t[2]; } +#endif static void bonemat_fromentity(world_t *w, wedict_t *ed, float *trans) { vec3_t d[3], a; @@ -932,7 +934,9 @@ void skel_info_f(void) { if (skelobjects[i].world) { +#ifndef SERVERONLY extern world_t csqc_world; +#endif Con_Printf("doll %i:\n", i); #ifndef CLIENTONLY if (skelobjects[i].world == &sv.world) diff --git a/engine/client/quakedef.h b/engine/client/quakedef.h index 649dbf57..06f1a416 100644 --- a/engine/client/quakedef.h +++ b/engine/client/quakedef.h @@ -325,7 +325,13 @@ extern cvar_t worker_flush; qboolean COM_DoWork(int thread, qboolean leavelocked); #define COM_MainThreadWork() while (COM_DoWork(0, false) && worker_flush.ival) /*called each frame to do any gl uploads or whatever*/ #define COM_MainThreadFlush() while (COM_DoWork(0, false)) /*make sure the main thread has done ALL work pending*/ -void COM_AddWork(int thread, void(*func)(void *ctx, void *data, size_t a, size_t b), void *ctx, void *data, size_t a, size_t b); +typedef enum +{ + WG_MAIN = 0, + WG_LOADER = 1, + WG_COUNT = 2 //main and loaders +} wgroup_t; +void COM_AddWork(wgroup_t thread, void(*func)(void *ctx, void *data, size_t a, size_t b), void *ctx, void *data, size_t a, size_t b); qboolean COM_HasWork(void); void COM_WorkerFullSync(void); void COM_DestroyWorkerThread(void); diff --git a/engine/client/r_d3.c b/engine/client/r_d3.c index 64a296bd..118b56d1 100644 --- a/engine/client/r_d3.c +++ b/engine/client/r_d3.c @@ -5,10 +5,17 @@ #include "shader.h" #endif +//FIXME: shadowmaps should build a cache of the nearby area surfaces and flag those models as RF_NOSHADOW or something + void Mod_SetParent (mnode_t *node, mnode_t *parent); static int D3_ClusterForPoint (struct model_s *model, vec3_t point); #ifndef SERVERONLY +void ModD3_GenAreaVBO(void *ctx, void *data, size_t a, size_t b) +{ + model_t *sub = ctx; + BE_GenBrushModelVBO(sub); +} static qboolean Mod_LoadMap_Proc(model_t *model, char *data) { char token[256]; @@ -106,6 +113,7 @@ static qboolean Mod_LoadMap_Proc(model_t *model, char *data) data = COM_ParseOut(data, token, sizeof(token)); b[surf].shader = R_RegisterShader_Vertex(token); +// R_BuildDefaultTexnums(NULL, b[surf].shader); data = COM_ParseOut(data, token, sizeof(token)); numverts = atoi(token); data = COM_ParseOut(data, token, sizeof(token)); @@ -116,7 +124,7 @@ static qboolean Mod_LoadMap_Proc(model_t *model, char *data) m[surf].numvertexes = numverts; m[surf].numindexes = numindicies; - vdata = ZG_Malloc(&model->memgroup, numverts * (sizeof(vecV_t) + sizeof(vec2_t) + sizeof(vec3_t) + sizeof(vec4_t)) + numindicies * sizeof(index_t)); + vdata = ZG_Malloc(&sub->memgroup, numverts * (sizeof(vecV_t) + sizeof(vec2_t) + sizeof(vec3_t) + sizeof(vec4_t)) + numindicies * sizeof(index_t)); m[surf].colors4f_array[0] = (vec4_t*)vdata;vdata += sizeof(vec4_t)*numverts; m[surf].xyz_array = (vecV_t*)vdata;vdata += sizeof(vecV_t)*numverts; @@ -194,7 +202,8 @@ static qboolean Mod_LoadMap_Proc(model_t *model, char *data) sub->fromgame = fg_doom3; sub->type = mod_brush; - BE_GenBrushModelVBO(sub); + COM_AddWork(WG_MAIN, ModD3_GenAreaVBO, sub, NULL, MLS_LOADED, 0); + COM_AddWork(WG_MAIN, Mod_ModelLoaded, sub, NULL, MLS_LOADED, 0); } else if (!strcmp(token, "shadowModel")) { @@ -358,7 +367,8 @@ static qboolean Mod_LoadMap_Proc(model_t *model, char *data) qboolean R_CullBox (vec3_t mins, vec3_t maxs); static int walkno; -/*convert each portal to a 2d box, because its much much simpler than true poly clipping*/ +/*fixme: convert each portal to a 2d box, because its much much simpler than true poly clipping*/ +/*fixme: use occlusion tests, with temporal coherance (draw the portal as black or something if we think its invisible)*/ static void D3_WalkPortal(model_t *mod, int start, vec_t bounds[4], unsigned char *vis) { int i; @@ -393,70 +403,56 @@ static void D3_WalkPortal(model_t *mod, int start, vec_t bounds[4], unsigned cha unsigned char *D3_CalcVis(model_t *mod, vec3_t org) { int start; - static unsigned char vis[256]; + static qbyte visbuf[256]; + qbyte *usevis; vec_t newbounds[4]; + int area; + entity_t ent; + start = D3_ClusterForPoint(mod, org); /*figure out which area we're in*/ if (start < 0) { /*outside the world, just make it all visible, and take the fps hit*/ - memset(vis, 255, 4); - return vis; + memset(visbuf, 255, 4); + usevis = visbuf; } else if (r_novis.value) - return vis; + usevis = visbuf; else { - memset(vis, 0, 4); + memset(visbuf, 0, 4); /*make a bounds the size of the view*/ newbounds[0] = -1; newbounds[1] = 1; newbounds[2] = -1; newbounds[3] = 1; walkno++; - D3_WalkPortal(mod, start, newbounds, vis); + D3_WalkPortal(mod, start, newbounds, visbuf); // Con_Printf("%x %x %x %x\n", vis[0], vis[1], vis[2], vis[3]); - return vis; + usevis = visbuf; } -} - -/*emits static entities, one for each area, which is only visible if that area is in the vis*/ -void D3_GenerateAreas(model_t *mod) -{ - entity_t *ent; - - int area; + //now generate the various entities for that region. + memset(&ent, 0, sizeof(ent)); for (area = 0; area < 256*8; area++) { - if (cl.num_statics == cl_max_static_entities) + if (usevis[area>>3] & (1u<<(area&7))) { - cl_max_static_entities += 16; - cl_static_entities = BZ_Realloc(cl_static_entities, sizeof(*cl_static_entities) * cl_max_static_entities); + ent.model = Mod_FindName(va("*_area%i", area)); + ent.scale = 1; + AngleVectors(ent.angles, ent.axis[0], ent.axis[1], ent.axis[2]); + VectorInverse(ent.axis[1]); + ent.shaderRGBAf[0] = 1; + ent.shaderRGBAf[1] = 1; + ent.shaderRGBAf[2] = 1; + ent.shaderRGBAf[3] = 1; + + V_AddEntity(&ent); } - - ent = &cl_static_entities[cl.num_statics].ent; - cl_static_entities[cl.num_statics].mdlidx = 0; - memset(ent, 0, sizeof(*ent)); - ent->model = Mod_FindName(va("*_area%i", area)); - ent->scale = 1; - AngleVectors(ent->angles, ent->axis[0], ent->axis[1], ent->axis[2]); - VectorInverse(ent->axis[1]); - ent->shaderRGBAf[0] = 1; - ent->shaderRGBAf[1] = 1; - ent->shaderRGBAf[2] = 1; - ent->shaderRGBAf[3] = 1; - - /*put it in that area*/ - cl_static_entities[cl.num_statics].pvscache.num_leafs = 1; - cl_static_entities[cl.num_statics].pvscache.leafnums[0] = area; - - if (ent->model && ent->model->loadstate != MLS_NOTLOADED) - cl.num_statics++; - else - break; } + return usevis; } #endif @@ -526,7 +522,7 @@ typedef struct cm_surface_s int numedges; vec4_t *edge; - shader_t *shader; +// shader_t *shader; struct cm_surface_s *next; } cm_surface_t; @@ -1167,7 +1163,8 @@ qboolean QDECL D3_LoadMap_CollisionMap(model_t *mod, void *buf, size_t bufsize) buf = COM_ParseOut(buf, token, sizeof(token)); #ifndef SERVERONLY - surf->shader = R_RegisterShader_Vertex(token); +// surf->shader = R_RegisterShader_Vertex(token); +// R_BuildDefaultTexnums(NULL, surf->shader); #endif if (filever == 3) @@ -1320,6 +1317,8 @@ qboolean QDECL D3_LoadMap_CollisionMap(model_t *mod, void *buf, size_t bufsize) BZ_Free(buf); } #endif + + return true; } diff --git a/engine/client/r_surf.c b/engine/client/r_surf.c index 36e3dc88..030fe12e 100644 --- a/engine/client/r_surf.c +++ b/engine/client/r_surf.c @@ -2801,7 +2801,7 @@ void R_GenWorldEBO(void *ctx, void *data, size_t a, size_t b) Surf_SimpleWorld(es, pvs); - COM_AddWork(0, R_GeneratedWorldEBO, es, NULL, 0, 0); + COM_AddWork(WG_MAIN, R_GeneratedWorldEBO, es, NULL, 0, 0); } #endif @@ -2816,7 +2816,6 @@ void Surf_DrawWorld (void) //surfvis vs entvis - the key difference is that surfvis is surfaces while entvis is volume. though surfvis should be frustum culled also for lighting. entvis doesn't care. qbyte *surfvis, *entvis; qbyte frustumvis_[MAX_MAP_LEAFS/8]; - extern cvar_t temp1; RSpeedLocals(); if (r_refdef.flags & RDF_NOWORLDMODEL) @@ -2883,7 +2882,7 @@ void Surf_DrawWorld (void) for (i = 0; i < MAX_LIGHTSTYLES; i++) webogenerating->lightstylevalues[i] = d_lightstylevalue[i]; Q_strncpyz(webogenerating->dbgid, "webostate", sizeof(webogenerating->dbgid)); - COM_AddWork(1, R_GenWorldEBO, webogenerating, NULL, 0, 0); + COM_AddWork(WG_LOADER, R_GenWorldEBO, webogenerating, NULL, 0, 0); } } if (webostate) @@ -3057,8 +3056,8 @@ void Surf_Clear(model_t *mod) { int i; vbo_t *vbo; - if (mod->fromgame == fg_doom3) - return;/*they're on the hunk*/ +// if (mod->fromgame == fg_doom3) +// return;/*they're on the hunk*/ #ifdef THREADEDWORLD while(webogenerating) @@ -3580,11 +3579,6 @@ TRACE(("dbg: Surf_NewMap: tp\n")); TP_NewMap(); R_SetSky(cl.skyname); -#ifdef MAP_PROC - if (cl.worldmodel->fromgame == fg_doom3) - D3_GenerateAreas(cl.worldmodel); -#endif - for (i = 0; i < cl.num_statics; i++) { vec3_t mins, maxs; diff --git a/engine/client/renderer.c b/engine/client/renderer.c index 0d913dab..be61f17b 100644 --- a/engine/client/renderer.c +++ b/engine/client/renderer.c @@ -252,6 +252,7 @@ cvar_t vid_dpi_x = CVARFD ("vid_dpi_x", "0", CVAR_NOSET, "For mods that ne cvar_t vid_dpi_y = CVARFD ("vid_dpi_y", "0", CVAR_NOSET, "For mods that need to determine the physical screen size (like with touchscreens). 0 means unknown"); cvar_t r_stereo_separation = CVARD("r_stereo_separation", "4", "How far apart your eyes are, in quake units. A non-zero value will enable stereoscoping rendering. You might need some of them retro 3d glasses. Hardware support is recommended, see r_stereo_context."); +cvar_t r_stereo_convergence = CVARD("r_stereo_convergence", "0", "Nudges the angle of each eye inwards when using stereoscopic rendering."); cvar_t r_stereo_method = CVARFD("r_stereo_method", "0", CVAR_ARCHIVE, "Value 0 = Off.\nValue 1 = Attempt hardware acceleration. Requires vid_restart.\nValue 2 = red/cyan.\nValue 3 = red/blue.\nValue 4=red/green.\nValue 5=eye strain."); extern cvar_t r_dodgytgafiles; @@ -737,6 +738,7 @@ void Renderer_Init(void) Cvar_Register (&r_wireframe_smooth, GRAPHICALNICETIES); Cvar_Register (&r_refract_fbo, GRAPHICALNICETIES); Cvar_Register (&r_stereo_separation, GRAPHICALNICETIES); + Cvar_Register (&r_stereo_convergence, GRAPHICALNICETIES); Cvar_Register (&r_stereo_method, GRAPHICALNICETIES); Cvar_Register(&scr_viewsize, SCREENOPTIONS); diff --git a/engine/client/snd_al.c b/engine/client/snd_al.c index 1bbef2d6..455142ab 100644 --- a/engine/client/snd_al.c +++ b/engine/client/snd_al.c @@ -206,6 +206,7 @@ static ALC_API ALCboolean (ALC_APIENTRY *palcIsExtensionPresent)( ALCdevice //#include "AL/al.h" //#include "AL/alext.h" +#if defined(VOICECHAT) //capture-specific stuff static ALC_API void (ALC_APIENTRY *palcGetIntegerv)( ALCdevice *device, ALCenum param, ALCsizei size, ALCint *data ); static ALC_API ALCdevice * (ALC_APIENTRY *palcCaptureOpenDevice)( const ALCchar *devicename, ALCuint frequency, ALCenum format, ALCsizei buffersize ); @@ -216,6 +217,7 @@ static ALC_API void (ALC_APIENTRY *palcCaptureSamples)( ALCdevice *dev #define ALC_CAPTURE_DEVICE_SPECIFIER 0x310 #define ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER 0x311 #define ALC_CAPTURE_SAMPLES 0x312 +#endif #endif diff --git a/engine/client/snd_mem.c b/engine/client/snd_mem.c index 42c09096..a24189bf 100644 --- a/engine/client/snd_mem.c +++ b/engine/client/snd_mem.c @@ -831,7 +831,7 @@ void S_LoadSoundWorker (void *ctx, void *ctxdata, size_t a, size_t b) else { Con_SafePrintf ("Couldn't load %s\n", namebuffer); - COM_AddWork(0, S_LoadedOrFailed, s, NULL, SLS_FAILED, 0); + COM_AddWork(WG_MAIN, S_LoadedOrFailed, s, NULL, SLS_FAILED, 0); return; } } @@ -880,7 +880,7 @@ void S_LoadSoundWorker (void *ctx, void *ctxdata, size_t a, size_t b) { //FIXME: check to see if queued for download. Con_DPrintf ("Couldn't load %s\n", namebuffer); - COM_AddWork(0, S_LoadedOrFailed, s, NULL, SLS_FAILED, 0); + COM_AddWork(WG_MAIN, S_LoadedOrFailed, s, NULL, SLS_FAILED, 0); return; } @@ -891,7 +891,7 @@ void S_LoadSoundWorker (void *ctx, void *ctxdata, size_t a, size_t b) if (AudioInputPlugins[i](s, data, filesize, snd_speed)) { //wake up the main thread in case it decided to wait for us. - COM_AddWork(0, S_LoadedOrFailed, s, NULL, SLS_LOADED, 0); + COM_AddWork(WG_MAIN, S_LoadedOrFailed, s, NULL, SLS_LOADED, 0); BZ_Free(data); return; } @@ -901,7 +901,7 @@ void S_LoadSoundWorker (void *ctx, void *ctxdata, size_t a, size_t b) if (s->loadstate != SLS_FAILED) Con_Printf ("Format not recognised: %s\n", namebuffer); - COM_AddWork(0, S_LoadedOrFailed, s, NULL, SLS_FAILED, 0); + COM_AddWork(WG_MAIN, S_LoadedOrFailed, s, NULL, SLS_FAILED, 0); BZ_Free(data); return; } @@ -911,7 +911,7 @@ qboolean S_LoadSound (sfx_t *s) if (s->loadstate == SLS_NOTLOADED && sndcardinfo) { s->loadstate = SLS_LOADING; - COM_AddWork(1, S_LoadSoundWorker, s, NULL, 0, 0); + COM_AddWork(WG_LOADER, S_LoadSoundWorker, s, NULL, 0, 0); } if (s->loadstate == SLS_FAILED) return false; //it failed to load once before, don't bother trying again. diff --git a/engine/client/snd_ov.c b/engine/client/snd_ov.c index f14226b2..3a13f694 100644 --- a/engine/client/snd_ov.c +++ b/engine/client/snd_ov.c @@ -151,8 +151,6 @@ static sfxcache_t *OV_DecodeSome(struct sfx_s *sfx, struct sfxcache_s *buf, ssam int outspeed = snd_speed; - int errorcode = 1; - // Con_Printf("Minlength = %03i ", minlength); start *= 2*dec->srcchannels; @@ -287,12 +285,12 @@ static sfxcache_t *OV_DecodeSome(struct sfx_s *sfx, struct sfxcache_s *buf, ssam } return buf; } -static void OV_CanceledDecoder(void *ctx, void *data, size_t a, size_t b) +/*static void OV_CanceledDecoder(void *ctx, void *data, size_t a, size_t b) { sfx_t *s = ctx; if (s->loadstate != SLS_LOADING) s->loadstate = SLS_NOTLOADED; -} +}*/ static void OV_CancelDecoder(sfx_t *s) { ovdecoderbuffer_t *dec; @@ -320,7 +318,7 @@ static void OV_CancelDecoder(sfx_t *s) //due to the nature of message passing, we can get into a state where the main thread is going to flag us as loaded when we have already failed. //that is bad. //so post a message to the main thread to override it, just in case. -// COM_AddWork(0, OV_CanceledDecoder, s, NULL, SLS_NOTLOADED, 0); +// COM_AddWork(WG_MAIN, OV_CanceledDecoder, s, NULL, SLS_NOTLOADED, 0); s->loadstate = SLS_NOTLOADED; } diff --git a/engine/client/sys_droid.c b/engine/client/sys_droid.c index 3de26235..7fe9a204 100644 --- a/engine/client/sys_droid.c +++ b/engine/client/sys_droid.c @@ -84,7 +84,7 @@ void INS_Move(float *movements, int pnum) void INS_Commands(void) { } -void INS_EnumerateDevices(void *ctx, void(*callback)(void *ctx, char *type, char *devicename, int *qdevid)) +void INS_EnumerateDevices(void *ctx, void(*callback)(void *ctx, const char *type, const char *devicename, int *qdevid)) { } void INS_Init(void) diff --git a/engine/client/view.c b/engine/client/view.c index 1936208e..b9532200 100644 --- a/engine/client/view.c +++ b/engine/client/view.c @@ -1907,7 +1907,7 @@ void R_DrawNameTags(void) } } - if ((!cl.spectator && !cls.demoplayback || !scr_autoid.ival) && (!cl.teamplay || !scr_autoid_team.ival)) + if (((!cl.spectator && !cls.demoplayback) || !scr_autoid.ival) && (!cl.teamplay || !scr_autoid_team.ival)) return; if (cls.state != ca_active || !cl.validsequence || cl.intermissionmode != IM_NONE) return; diff --git a/engine/common/bothdefs.h b/engine/common/bothdefs.h index ae189124..bda367d3 100644 --- a/engine/common/bothdefs.h +++ b/engine/common/bothdefs.h @@ -211,7 +211,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define SVRANKING #define USE_SQLITE #ifdef SERVERONLY - #define USE_MYSQL //allow mysql in dedicated servers. +// #define USE_MYSQL //allow mysql in dedicated servers. #endif #if defined(_WIN32) && !defined(FTE_SDL) && !defined(WINRT) #define SUBSERVERS //use subserver code. diff --git a/engine/common/cmd.c b/engine/common/cmd.c index c566ed8d..75d58318 100644 --- a/engine/common/cmd.c +++ b/engine/common/cmd.c @@ -265,7 +265,7 @@ void Cbuf_AddText (const char *text, int level) if (!Sys_IsMainThread()) { - COM_AddWork(0, Cbuf_WorkerAddText, NULL, Z_StrDup(text), level, 0); + COM_AddWork(WG_MAIN, Cbuf_WorkerAddText, NULL, Z_StrDup(text), level, 0); return; } diff --git a/engine/common/com_mesh.c b/engine/common/com_mesh.c index df2e1ad4..84521bc5 100644 --- a/engine/common/com_mesh.c +++ b/engine/common/com_mesh.c @@ -36,7 +36,7 @@ void Mod_DoCRC(model_t *mod, char *buffer, int buffersize) for (len = buffersize, p = buffer; len; len--, p++) QCRC_ProcessByte(&crc, *p); - COM_AddWork(0, Mod_UpdateCRC, (mod->engineflags & MDLF_PLAYER) ? pmodel_name : emodel_name, NULL, crc, 0); + COM_AddWork(WG_MAIN, Mod_UpdateCRC, (mod->engineflags & MDLF_PLAYER) ? pmodel_name : emodel_name, NULL, crc, 0); if (!(mod->engineflags & MDLF_PLAYER)) { //eyes @@ -1025,14 +1025,8 @@ void R_LightArrays(const entity_t *entity, vecV_t *coords, avec4_t *colours, int } } } -#endif - static void R_LerpFrames(mesh_t *mesh, galiaspose_t *p1, galiaspose_t *p2, float lerp, float expand, float lerpcutoff) { -#ifdef SERVERONLY - //no lerping in dedicated servers. too lazy. - mesh->xyz_array = p1->ofsverts; -#else extern cvar_t r_nolerp; // r_nolightdir is unused float blerp = 1-lerp; int i; @@ -1124,9 +1118,9 @@ static void R_LerpFrames(mesh_t *mesh, galiaspose_t *p1, galiaspose_t *p2, float } } } -#endif } #endif +#endif #ifdef SKELETALMODELS /* @@ -1151,7 +1145,9 @@ static qboolean Alias_BuildSkelLerps(skellerps_t *lerps, struct framestateregion galiasanimation_t *g; unsigned int b; float totalweight = 0; +#ifndef SERVERONLY extern cvar_t r_nolerp; +#endif lerps->skeltype = SKEL_IDENTITY; //sometimes nothing else is valid. @@ -1623,16 +1619,20 @@ void Alias_Shutdown(void) qboolean Alias_GAliasBuildMesh(mesh_t *mesh, vbo_t **vbop, galiasinfo_t *inf, int surfnum, entity_t *e, qboolean usebones) { - extern cvar_t r_nolerp; galiasanimation_t *g1, *g2; +#ifndef SERVERONLY + extern cvar_t r_nolerp; float lerpcutoff; +#endif int frame1; int frame2; float lerp; float fg1time; // float fg2time; +#ifdef SKELETALMODELS qboolean bytecolours = false; +#endif if (!inf->numanimations) { @@ -1670,7 +1670,9 @@ qboolean Alias_GAliasBuildMesh(mesh_t *mesh, vbo_t **vbop, galiasinfo_t *inf, in #ifndef SERVERONLY mesh->colors4f_array[0] = inf->ofs_rgbaf; mesh->colors4b_array = inf->ofs_rgbaub; +#ifdef SKELETALMODELS bytecolours = !!inf->ofs_rgbaub; +#endif mesh->st_array = inf->ofs_st_array; #endif mesh->trneighbors = inf->ofs_trineighbours; @@ -1923,9 +1925,8 @@ qboolean Alias_GAliasBuildMesh(mesh_t *mesh, vbo_t **vbop, galiasinfo_t *inf, in frame2=0; } - lerpcutoff = inf->lerpcutoff * r_lerpmuzzlehack.value; - #ifndef SERVERONLY + lerpcutoff = inf->lerpcutoff * r_lerpmuzzlehack.value; if (/*qrenderer != QR_OPENGL ||*/ Sh_StencilShadowsActive() || e->fatness || lerpcutoff) { mesh->xyz2_array = NULL; @@ -1937,7 +1938,9 @@ qboolean Alias_GAliasBuildMesh(mesh_t *mesh, vbo_t **vbop, galiasinfo_t *inf, in #endif { galiaspose_t *p1 = &g1->poseofs[frame1]; +#ifndef SERVERONLY galiaspose_t *p2 = &g2->poseofs[frame2]; +#endif meshcache.vbo.indicies = inf->vboindicies; meshcache.vbo.indexcount = inf->numindexes; @@ -2054,7 +2057,7 @@ qboolean Mod_Trace_Trisoup(vecV_t *posedata, index_t *indexes, int numindexes, v float frac; vec3_t impactpoint; - shader_t *lineshader = NULL; +// shader_t *lineshader = NULL; for (i = 0; i < numindexes; i+=3) { @@ -2208,7 +2211,9 @@ qboolean Mod_Trace(model_t *model, int forcehullnum, int frame, vec3_t axis[3], vecV_t *posedata; index_t *indexes; int surfnum = 0; +#ifdef SKELETALMODELS int cursurfnum = -1; +#endif vec3_t start_l, end_l; @@ -2348,6 +2353,7 @@ static void Mod_ClampModelSize(model_t *mod) #endif } +#ifndef SERVERONLY static int R_FindTriangleWithEdge (index_t *indexes, int numtris, int start, int end, int ignore) { int i; @@ -2377,27 +2383,27 @@ static int R_FindTriangleWithEdge (index_t *indexes, int numtris, int start, int return match; } -static void Mod_BuildTriangleNeighbours ( int *neighbours, index_t *indexes, int numtris ) -{ - int i, *n; - index_t *index; +#endif - for (i = 0, index = indexes, n = neighbours; i < numtris; i++, index += 3, n += 3) - { - n[0] = R_FindTriangleWithEdge (indexes, numtris, index[1], index[0], i); - n[1] = R_FindTriangleWithEdge (indexes, numtris, index[2], index[1], i); - n[2] = R_FindTriangleWithEdge (indexes, numtris, index[0], index[2], i); - } -} void Mod_CompileTriangleNeighbours(model_t *loadmodel, galiasinfo_t *galias) { #ifndef SERVERONLY if (Sh_StencilShadowsActive()) { + int i, *n; + index_t *index; + index_t *indexes = galias->ofs_indexes; + int numtris = galias->numindexes/3; int *neighbours; - neighbours = ZG_Malloc(&loadmodel->memgroup, sizeof(int)*galias->numindexes/3*3); + neighbours = ZG_Malloc(&loadmodel->memgroup, sizeof(int)*numtris*3); galias->ofs_trineighbours = neighbours; - Mod_BuildTriangleNeighbours(neighbours, galias->ofs_indexes, galias->numindexes/3); + + for (i = 0, index = indexes, n = neighbours; i < numtris; i++, index += 3, n += 3) + { + n[0] = R_FindTriangleWithEdge (indexes, numtris, index[1], index[0], i); + n[1] = R_FindTriangleWithEdge (indexes, numtris, index[2], index[1], i); + n[2] = R_FindTriangleWithEdge (indexes, numtris, index[0], index[2], i); + } } #endif } @@ -2571,7 +2577,6 @@ void Mod_BuildTextureVectors(galiasinfo_t *galias) vec3_t *nv, *sv, *tv; vec2_t *tc; index_t *idx; - int vbospace = 0; //don't fail on dedicated servers if (!BE_VBO_Begin) @@ -3170,39 +3175,6 @@ static void *Q1MDL_LoadSkins_GL (galiasinfo_t *galias, dmdl_t *pq1inmodel, model frames[0].texels = saved; memcpy(saved, pskintype+1, s); Mod_FloodFillSkin(saved, outskin->skinwidth, outskin->skinheight); - -#if 0 -//the extra underscore is to stop replacement matches - if (!TEXVALID(texture)) - { - snprintf(skinname, sizeof(skinname), "%s__%i.", basename, i); - switch (skintranstype) - { - default: - texture = r_nulltex;//R_LoadTexture(skinname,outskin->skinwidth,outskin->skinheight, TF_SOLID8, saved, IF_NOALPHA|IF_NOGAMMA); - if (r_fb_models.ival) - { - snprintf(skinname, sizeof(skinname), "%s__%i_luma.", basename, i); - fbtexture = r_nulltex;//R_LoadTextureFB(skinname, outskin->skinwidth, outskin->skinheight, saved, IF_NOGAMMA); - } - if (r_loadbumpmapping) - { - snprintf(skinname, sizeof(skinname), "%s__%i_bump.", basename, i); - bumptexture = r_nulltex;//R_LoadTexture8BumpPal(skinname, outskin->skinwidth, outskin->skinheight, saved, IF_NOGAMMA); - } - break; - case 2: - texture = r_nulltex;//R_LoadTexture(skinname,outskin->skinwidth,outskin->skinheight, TF_H2_T7G1, saved, IF_NOGAMMA); - break; - case 3: - texture = r_nulltex;//R_LoadTexture(skinname,outskin->skinwidth,outskin->skinheight, TF_H2_TRANS8_0, saved, IF_NOGAMMA); - break; - case 4: - texture = r_nulltex;//R_LoadTexture(skinname,outskin->skinwidth,outskin->skinheight, TF_H2_T4A4, saved, IF_NOGAMMA); - break; - } - } -#endif } else frames = ZG_Malloc(&loadmodel->memgroup, sizeof(*frames)); @@ -3344,7 +3316,7 @@ static void *Q1MDL_LoadSkins_GL (galiasinfo_t *galias, dmdl_t *pq1inmodel, model void Mesh_HandleFramegroupsFile(model_t *mod, galiasinfo_t *galias) { - unsigned int numanims, a, p, n, g, oldnumanims = galias->numanimations, targpose; + unsigned int numanims, a, p, g, oldnumanims = galias->numanimations, targpose; galiasanimation_t *o, *oldanims = galias->ofsanimations, *frame; frameinfo_t *framegroups = ParseFrameInfo(mod->name, &numanims); if (framegroups) @@ -3356,7 +3328,7 @@ void Mesh_HandleFramegroupsFile(model_t *mod, galiasinfo_t *galias) for (p = 0; p < framegroups[a].posecount; p++) { targpose = framegroups[a].firstpose + p; - for (n = 0, g = 0, frame = oldanims; g < oldnumanims; g++, frame++) + for (g = 0, frame = oldanims; g < oldnumanims; g++, frame++) { if (targpose < frame->numposes) break; @@ -4635,6 +4607,7 @@ qboolean QDECL Mod_LoadQ3Model(model_t *mod, void *buffer, size_t fsize) vec3_t *tvector; vec2_t *st_array; md3Shader_t *inshader; + int externalskins; #endif // int version; int s, i, j, d; @@ -4655,7 +4628,6 @@ qboolean QDECL Mod_LoadQ3Model(model_t *mod, void *buffer, size_t fsize) int size; - int externalskins; md3Header_t *header; md3Surface_t *surf; @@ -4671,8 +4643,6 @@ qboolean QDECL Mod_LoadQ3Model(model_t *mod, void *buffer, size_t fsize) #ifndef SERVERONLY externalskins = Mod_CountSkinFiles(mod->name); -#else - externalskins = 0; #endif min[0] = min[1] = min[2] = 0; @@ -5994,7 +5964,6 @@ qboolean QDECL Mod_LoadDarkPlacesModel(model_t *mod, void *buffer, size_t fsize) unsigned int *index; index_t *outdex; // groan... int numtransforms; - int numverts; header = buffer; @@ -6048,7 +6017,6 @@ qboolean QDECL Mod_LoadDarkPlacesModel(model_t *mod, void *buffer, size_t fsize) mesh->ofs_groupids = BigLong(mesh->ofs_groupids); - numverts = mesh->num_verts; numtransforms = 0; //count and byteswap the transformations vert = (dpmvertex_t*)((char *)buffer+mesh->ofs_verts); @@ -6064,11 +6032,11 @@ qboolean QDECL Mod_LoadDarkPlacesModel(model_t *mod, void *buffer, size_t fsize) #ifdef SERVERONLY transforms = ZG_Malloc(&mod->memgroup, numtransforms*sizeof(galisskeletaltransforms_t) + mesh->num_tris*3*sizeof(index_t)); #else - outst = ZG_Malloc(&mod->memgroup, numverts*sizeof(vec2_t) + numtransforms*sizeof(galisskeletaltransforms_t) + mesh->num_tris*3*sizeof(index_t)); + outst = ZG_Malloc(&mod->memgroup, mesh->num_verts*sizeof(vec2_t) + numtransforms*sizeof(galisskeletaltransforms_t) + mesh->num_tris*3*sizeof(index_t)); m->ofs_st_array = (vec2_t*)outst; m->numverts = mesh->num_verts; inst = (float*)((char*)buffer + mesh->ofs_texcoords); - for (j = 0; j < numverts; j++, outst+=2, inst+=2) + for (j = 0; j < mesh->num_verts; j++, outst+=2, inst+=2) { outst[0] = BigFloat(inst[0]); outst[1] = BigFloat(inst[1]); diff --git a/engine/common/common.c b/engine/common/common.c index 44de32f8..f09b2037 100644 --- a/engine/common/common.c +++ b/engine/common/common.c @@ -78,10 +78,10 @@ glibc SUCKS. 64bit glibc is depending upon glibc 2.14 because of some implementa or something. anyway, the actual interface is the same. the old version might be slower, but when updating glibc generally results in also installing systemd, requiring the new version is NOT an option. */ -#if defined(__GNUC__) && defined(__LP64__) +#if defined(__GNUC__) && defined(__LP64__) && defined(__linux__) #include /* for glibc version */ #if defined(__GLIBC__) && (__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 14) - __asm__(".symver oldmemcpy,memcpy@GLIBC_2.2.5"); + __asm__(".symver oldmemcpy,memcpy@GLIBC_2.2.5"); void *oldmemcpy(void *__restrict dst, const void *__restrict src, size_t len); __attribute__ ((visibility ("hidden"))) void *memcpy(void *__restrict dst, const void *__restrict src, size_t len) { return oldmemcpy(dst,src,len); @@ -4763,9 +4763,6 @@ cvar_t worker_flush = CVARD("worker_flush", "1", "If set, process the entire loa cvar_t worker_count = CVARFDC("worker_count", "", CVAR_NOTFROMSERVER, "Specifies the number of worker threads to utilise.", COM_WorkerCount_Change); cvar_t worker_sleeptime = CVARFD("worker_sleeptime", "0", CVAR_NOTFROMSERVER, "Causes workers to sleep for a period of time after each job."); -#define WG_MAIN 0 -#define WG_LOADER 1 -#define WG_COUNT 2 //main and loaders #define WORKERTHREADS 16 //max /*multithreading worker thread stuff*/ static int com_liveworkers[WG_COUNT]; @@ -4781,7 +4778,6 @@ static struct com_worker_s } request; volatile int ackseq; } com_worker[WORKERTHREADS]; -static unsigned int mainthreadid; qboolean com_workererror; static struct com_work_s { @@ -4803,8 +4799,7 @@ qboolean COM_HasWork(void) } return false; } -//thread==0 is main thread, thread==1 is a worker thread -void COM_AddWork(int tg, void(*func)(void *ctx, void *data, size_t a, size_t b), void *ctx, void *data, size_t a, size_t b) +void COM_AddWork(wgroup_t tg, void(*func)(void *ctx, void *data, size_t a, size_t b), void *ctx, void *data, size_t a, size_t b) { struct com_work_s *work; @@ -4900,7 +4895,7 @@ qboolean COM_DoWork(int tg, qboolean leavelocked) //nothing going on, if leavelocked then noone can add anything until we sleep. return false; } -static void COM_WorkerSync_ThreadAck(void *ctx, void *data, size_t a, size_t b) +/*static void COM_WorkerSync_ThreadAck(void *ctx, void *data, size_t a, size_t b) { int us; int *ackbuf = ctx; @@ -4920,6 +4915,7 @@ static void COM_WorkerSync_ThreadAck(void *ctx, void *data, size_t a, size_t b) Sys_ConditionSignal(com_workercondition[WG_MAIN]); Sys_UnlockConditional(com_workercondition[WG_MAIN]); } +*/ /*static void COM_WorkerSync_SignalMain(void *ctx, void *data, size_t a, size_t b) { Sys_LockConditional(com_workercondition[a]); @@ -5261,9 +5257,9 @@ static void COM_InitWorkerThread(void) //technically its ready now... - if (COM_CheckParm("-noworker")) + if (COM_CheckParm("-noworker") || COM_CheckParm("-noworkers")) { - worker_count.string = "0"; + worker_count.enginevalue = "0"; worker_count.flags |= CVAR_NOSET; } Cvar_Register(&worker_count, NULL); diff --git a/engine/common/common.h b/engine/common/common.h index b84aa802..283fafe9 100644 --- a/engine/common/common.h +++ b/engine/common/common.h @@ -37,11 +37,19 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #define qintptr_t intptr_t #define quintptr_t uintptr_t + #define qint32_t qint32_t + #define quint32_t quint32_t + #define qint64_t qint64_t + #define quint64_t quint64_t #else + #define qint32_t int + #define quint32_t unsigned qint32_t #if defined(_WIN64) #define qintptr_t __int64 #define FTE_WORDSIZE 64 #define quintptr_t unsigned qintptr_t + #define qint64_t __int64 + #define quint64_t unsigned __int64 #elif defined(_WIN32) #ifndef _MSC_VER #define __w64 @@ -50,16 +58,25 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. typedef unsigned __int32 __w64 quintptr_t; // #define qintptr_t __int32 // #define quintptr_t unsigned qintptr_t + #define qint64_t __int64 + #define quint64_t unsigned __int64 #define FTE_WORDSIZE 32 #else - #if __WORDSIZE == 64 + #ifdef __LP64__ + #define qintptr_t long + #define qint64_t long + #define FTE_WORDSIZE 64 + #elif __WORDSIZE == 64 #define qintptr_t long long + #define qint64_t long long #define FTE_WORDSIZE 64 #else #define qintptr_t long + #define qint64_t long long #define FTE_WORDSIZE 32 #endif #define quintptr_t unsigned qintptr_t + #define quint64_t unsigned qint64_t #endif #endif @@ -397,13 +414,13 @@ extern char com_configdir[MAX_OSPATH]; //dir to put cfg_save configs in #define FS_64BIT #endif #if 1//def FS_64BIT - typedef unsigned long long qofs_t; //type to use for a file offset + typedef quint64_t qofs_t; //type to use for a file offset #define qofs_Make(low,high) (low | (((qofs_t)(high))<<32)) #define qofs_Low(o) ((o)&0xffffffffu) #define qofs_High(o) ((o)>>32) #define qofs_Error(o) ((o) == ~0ull) #else - typedef unsigned int qofs_t; //type to use for a file offset + typedef quint32_t qofs_t; //type to use for a file offset #define qofs_Make(low,high) (low) #define qofs_Low(o) (o) #define qofs_High(o) (0) diff --git a/engine/common/fs.c b/engine/common/fs.c index 1243a2e1..f9ace2c6 100644 --- a/engine/common/fs.c +++ b/engine/common/fs.c @@ -2516,7 +2516,7 @@ qboolean FS_PathURLCache(const char *url, char *path, size_t pathsize) { const char *FS_GetCleanPath(const char *pattern, char *outbuf, int outlen); char tmp[MAX_QPATH]; - char *o = tmp, *e = o + sizeof(tmp)-1; + char *o = tmp; const char *i = url; strcpy(o, "downloads/"); o += strlen(o); @@ -3814,6 +3814,7 @@ static ftemanifest_t *FS_GenerateLegacyManifest(char *newbasedir, int sizeof_new return man; } +#ifdef WEBCLIENT static char *FS_RelativeURL(char *base, char *file, char *buffer, int bufferlen) { //fixme: cope with windows paths @@ -3847,16 +3848,15 @@ static char *FS_RelativeURL(char *base, char *file, char *buffer, int bufferlen) return buffer; } -#ifdef WEBCLIENT static struct dl_download *curpackagedownload; static enum manifestdeptype_e fspdl_type; static enum { - X_DLONLY, - X_COPY, - X_MULTIUNZIP, - X_UNZIP, - X_GZ, - X_XZ + X_DLONLY, //simple pk3 file + X_COPY, //we copy it from an existing install (ie: special install path for total conversion) + X_MULTIUNZIP, //zip with multiple files that need extracting + X_UNZIP, //pull a single file from a zip + X_GZ, //dlonly+ungzip + X_XZ //dlonly+unxzip } fspdl_extracttype; static char fspdl_internalname[MAX_QPATH]; static char fspdl_temppath[MAX_OSPATH]; @@ -4256,6 +4256,8 @@ static qboolean FS_BeginPackageDownload(struct manpack_s *pack, char *baseurl, q tmpf = NULL; #endif break; + default: + break; } if (!tmpf) @@ -4697,12 +4699,12 @@ qboolean FS_ChangeGame(ftemanifest_t *man, qboolean allowreloadconfigs, qboolean { FS_ReloadPackFilesFlags(~0); + Sys_UnlockMutex(fs_thread_mutex); + FS_BeginManifestUpdates(); COM_CheckRegistered(); - Sys_UnlockMutex(fs_thread_mutex); - if (allowreloadconfigs) { qboolean vidrestart = false; @@ -4751,10 +4753,12 @@ qboolean FS_ChangeGame(ftemanifest_t *man, qboolean allowreloadconfigs, qboolean #endif } } -#ifndef SERVERONLY else if (vidrestart) + { +#ifndef SERVERONLY Cbuf_AddText ("vid_reload\n", RESTRICT_LOCAL); #endif + } } //rebuild the cache now, should be safe to waste some cycles on it diff --git a/engine/common/fs_zip.c b/engine/common/fs_zip.c index 1f5b3d79..d99425fd 100644 --- a/engine/common/fs_zip.c +++ b/engine/common/fs_zip.c @@ -52,15 +52,19 @@ void *zlib_handle; #endif #endif +#ifndef Z_U4 +#define z_crc_t uLongf +#endif + //#pragma comment(lib, MSVCLIBSPATH "zlib.lib") static int (ZEXPORT *qinflateEnd) (z_streamp strm) ZSTATIC(inflateEnd); static int (ZEXPORT *qinflate) (z_streamp strm, int flush) ZSTATIC(inflate); static int (ZEXPORT *qinflateInit2_) (z_streamp strm, int windowBits, const char *version, int stream_size) ZSTATIC(inflateInit2_); -//static uLong (ZEXPORT *qcrc32) (uLong crc, const Bytef *buf, uInt len) ZSTATIC(crc32); +//static z_crc_t (ZEXPORT *qcrc32) (uLong crc, const Bytef *buf, uInt len) ZSTATIC(crc32); #ifdef ZIPCRYPT -static const uLongf *(ZEXPORT *qget_crc_table) (void) ZSTATIC(get_crc_table); +static const z_crc_t *(ZEXPORT *qget_crc_table) (void) ZSTATIC(get_crc_table); #endif #define qinflateInit2(strm, windowBits) \ @@ -288,7 +292,7 @@ static int QDECL FS_GZ_Dec_Write(vfsfile_t *f, const void *buffer, int len) { if (n->inlen >= 8) { - unsigned int crc = (n->in[0]<<0) | (n->in[1]<<8) | (n->in[2]<<16) | (n->in[3]<<24); + //unsigned int crc = (n->in[0]<<0) | (n->in[1]<<8) | (n->in[2]<<16) | (n->in[3]<<24); unsigned int isize = (n->in[4]<<0) | (n->in[5]<<8) | (n->in[6]<<16) | (n->in[7]<<24); if (n->strm.total_out != isize) return -1; //the file we just received decoded to a different length (yay, concat...). @@ -853,7 +857,7 @@ static vfsfile_t *FSZIP_Decompress_ToTempFile(struct decompressstate *decompress zipfile_t *source = decompress->source; qboolean encrypted = decompress->encrypted; unsigned int cryptkeys[3]; - const uLongf *crctab = decompress->crctable; + const z_crc_t *crctab = decompress->crctable; memcpy(cryptkeys, decompress->initialkey, sizeof(cryptkeys)); diff --git a/engine/common/gl_q2bsp.c b/engine/common/gl_q2bsp.c index 021f8d8b..f5753149 100644 --- a/engine/common/gl_q2bsp.c +++ b/engine/common/gl_q2bsp.c @@ -57,11 +57,12 @@ qboolean Mod_LoadEdges (model_t *loadmodel, qbyte *mod_base, lump_t *l, qboolean qboolean Mod_LoadMarksurfaces (model_t *loadmodel, qbyte *mod_base, lump_t *l, qboolean lm); qboolean Mod_LoadSurfedges (model_t *loadmodel, qbyte *mod_base, lump_t *l); - +#ifdef Q2BSPS static qboolean CM_NativeTrace(model_t *model, int forcehullnum, int frame, vec3_t axis[3], vec3_t start, vec3_t end, vec3_t mins, vec3_t maxs, qboolean capsule, unsigned int contents, trace_t *trace); static unsigned int CM_NativeContents(struct model_s *model, int hulloverride, int frame, vec3_t axis[3], vec3_t p, vec3_t mins, vec3_t maxs); static unsigned int Q2BSP_PointContents(model_t *mod, vec3_t axis[3], vec3_t p); static int CM_PointCluster (model_t *mod, vec3_t p); +#endif float RadiusFromBounds (vec3_t mins, vec3_t maxs) { @@ -3875,9 +3876,11 @@ static cmodel_t *CM_LoadMap (model_t *mod, qbyte *filein, size_t filelen, qboole char loadname[32]; qbyte *mod_base = (qbyte *)filein; +#ifndef SERVERONLY void (*buildmeshes)(model_t *mod, msurface_t *surf, builddata_t *cookie) = NULL; qbyte *facedata = NULL; unsigned int facesize = 0; +#endif cminfo_t *prv; COM_FileBase (mod->name, loadname, sizeof(loadname)); @@ -4263,7 +4266,7 @@ static cmodel_t *CM_LoadMap (model_t *mod, qbyte *filein, size_t filelen, qboole bd->buildfunc = buildmeshes; memcpy(bd+1, facedata + mod->firstmodelsurface*facesize, facesize*mod->nummodelsurfaces); } - COM_AddWork(0, ModBrush_LoadGLStuff, mod, bd, 0, 0); + COM_AddWork(WG_MAIN, ModBrush_LoadGLStuff, mod, bd, 0, 0); } #endif @@ -4320,10 +4323,10 @@ static cmodel_t *CM_LoadMap (model_t *mod, qbyte *filein, size_t filelen, qboole bd->buildfunc = buildmeshes; memcpy(bd+1, facedata + mod->firstmodelsurface*facesize, facesize*mod->nummodelsurfaces); } - COM_AddWork(0, ModBrush_LoadGLStuff, mod, bd, i, 0); + COM_AddWork(WG_MAIN, ModBrush_LoadGLStuff, mod, bd, i, 0); } #endif - COM_AddWork(0, Mod_ModelLoaded, mod, NULL, MLS_LOADED, 0); + COM_AddWork(WG_MAIN, Mod_ModelLoaded, mod, NULL, MLS_LOADED, 0); } #ifdef TERRAIN @@ -4426,7 +4429,6 @@ can just be stored out and get a proper clipping hull structure. void CM_InitBoxHull (void) { int i; - int side; mplane_t *p; q2cbrushside_t *s; @@ -4455,8 +4457,6 @@ void CM_InitBoxHull (void) for (i=0 ; i<6 ; i++) { - side = i&1; - //the pointers s = &box_sides[i]; p = &box_planes[i]; diff --git a/engine/common/net.h b/engine/common/net.h index c039372c..c2d90780 100644 --- a/engine/common/net.h +++ b/engine/common/net.h @@ -62,11 +62,7 @@ struct sockaddr_qstorage { short dontusesa_family; unsigned char dontusesa_pad[6]; -#if defined(_MSC_VER) || defined(MINGW) - __int64 sa_align; -#else - int sa_align[2]; -#endif + qint64_t sa_align; unsigned char sa_pad2[112]; }; @@ -269,14 +265,17 @@ void Huff_EmitByte(int ch, qbyte *buffer, int *count); #define CCREP_RULE_INFO 0x85 //server->client protocol info -#define NQ_PROTOCOL_VERSION 15 -#define H2_PROTOCOL_VERSION 19 -#define NEHD_PROTOCOL_VERSION 250 -#define FITZ_PROTOCOL_VERSION 666 -#define RMQ_PROTOCOL_VERSION 999 -#define DP5_PROTOCOL_VERSION 3502 -#define DP6_PROTOCOL_VERSION 3503 -#define DP7_PROTOCOL_VERSION 3504 +#define PROTOCOL_VERSION_NQ 15 +#define PROTOCOL_VERSION_H2 19 +#define PROTOCOL_VERSION_NEHD 250 +#define PROTOCOL_VERSION_FITZ 666 +#define PROTOCOL_VERSION_RMQ 999 +#define PROTOCOL_VERSION_DP5 3502 +#define PROTOCOL_VERSION_DP6 3503 +#define PROTOCOL_VERSION_DP7 3504 +#define PROTOCOL_VERSION_BJP1 10000 +#define PROTOCOL_VERSION_BJP2 10001 +#define PROTOCOL_VERSION_BJP3 10002 /*RMQ protocol flags*/ #define RMQFL_SHORTANGLE (1 << 1) diff --git a/engine/common/net_ice.c b/engine/common/net_ice.c index 946537d2..4ec15e41 100644 --- a/engine/common/net_ice.c +++ b/engine/common/net_ice.c @@ -668,13 +668,15 @@ qboolean QDECL ICE_Set(struct icestate_s *con, const char *prop, const char *val { Z_Free(con->stunserver); con->stunserver = Z_StrDup(value); - NET_StringToAdr(con->stunserver, con->stunport, &con->pubstunserver); + if (!NET_StringToAdr(con->stunserver, con->stunport, &con->pubstunserver)) + return false; } else if (!strcmp(prop, "stunport")) { con->stunport = atoi(value); if (con->stunserver) - NET_StringToAdr(con->stunserver, con->stunport, &con->pubstunserver); + if (!NET_StringToAdr(con->stunserver, con->stunport, &con->pubstunserver)) + return false; } /* else if (!strcmp(prop, "sdp")) @@ -785,7 +787,7 @@ qboolean QDECL ICE_Set(struct icestate_s *con, const char *prop, const char *val return false; return true; } -qboolean QDECL ICE_Get(struct icestate_s *con, char *prop, char *value, int valuelen) +qboolean QDECL ICE_Get(struct icestate_s *con, const char *prop, char *value, int valuelen) { if (!strcmp(prop, "sid")) Q_strncpyz(value, con->conname, valuelen); @@ -983,9 +985,7 @@ void ICE_Tick(void) { struct icecandidate_s *rc; rc = con->rc; - if (rc) - NET_StringToAdr(rc->info.addr, rc->info.port, &con->chosenpeer); - else + if (!rc || !NET_StringToAdr(rc->info.addr, rc->info.port, &con->chosenpeer)) con->chosenpeer.type = NA_INVALID; ICE_Set(con, "state", STRINGIFY(ICE_CONNECTED)); } diff --git a/engine/common/net_ssl_gnutls.c b/engine/common/net_ssl_gnutls.c index 0ae119f8..24a1480a 100644 --- a/engine/common/net_ssl_gnutls.c +++ b/engine/common/net_ssl_gnutls.c @@ -201,7 +201,7 @@ typedef struct #define CAFILE "/etc/ssl/certs/ca-certificates.crt" -static void QDECL SSL_Close(vfsfile_t *vfs) +static qboolean QDECL SSL_Close(vfsfile_t *vfs) { gnutlsfile_t *file = (void*)vfs; @@ -213,6 +213,7 @@ static void QDECL SSL_Close(vfsfile_t *vfs) if (file->stream) VFS_CLOSE(file->stream); file->stream = NULL; + return true; } static int QDECL SSL_CheckCert(gnutls_session_t session) { diff --git a/engine/common/net_wins.c b/engine/common/net_wins.c index bcbf9384..5f853f84 100644 --- a/engine/common/net_wins.c +++ b/engine/common/net_wins.c @@ -81,7 +81,6 @@ cvar_t net_enabled = CVARD("net_enabled", "1", "If 0, disables all network acce extern cvar_t sv_public, sv_listen_qw, sv_listen_nq, sv_listen_dp, sv_listen_q3; -static qboolean allowconnects = false; @@ -439,7 +438,7 @@ static void NET_AdrToStringDoResolve(void *ctx, void *data, size_t a, size_t b) NET_BaseAdrToString(adrstring, NI_MAXHOST, n); } } - COM_AddWork(0, resolved, ctx, adrstring, a, b); + COM_AddWork(WG_MAIN, resolved, ctx, adrstring, a, b); Z_Free(n); } @@ -448,7 +447,7 @@ void NET_AdrToStringResolve (netadr_t *adr, void (*resolved)(void *ctx, void *da netadr_t *n = Z_Malloc(sizeof(*n) + sizeof(void*)); *n = *adr; *(void**)(n+1) = resolved; - COM_AddWork(2, NET_AdrToStringDoResolve, ctx, n, a, b); + COM_AddWork(WG_LOADER, NET_AdrToStringDoResolve, ctx, n, a, b); } */ @@ -824,6 +823,7 @@ size_t NET_StringToSockaddr2 (const char *s, int defaultport, struct sockaddr_qs char dupbase[256]; int len; size_t i; + double restime = Sys_DoubleTime(); memset(&udp6hint, 0, sizeof(udp6hint)); udp6hint.ai_family = 0;//Any... we check for AF_INET6 or 4 @@ -863,6 +863,13 @@ size_t NET_StringToSockaddr2 (const char *s, int defaultport, struct sockaddr_qs if (error) //failed, try string with no port. error = pgetaddrinfo(s, NULL, &udp6hint, &addrinfo); //remember, this func will return any address family that could be using the udp protocol... (ip4 or ip6) } + + restime = Sys_DoubleTime()-restime; + if (restime > 0.5) + { //adding this in an attempt to debug somewhat periodic stalls that I'm being told about. + Con_DPrintf("DNS resolution of %s %s %f seconds (on %s thread)\n", s, error?"failed after":"took", restime, Sys_IsMainThread()?"main":"worker"); + } + if (error) { return false; @@ -1764,20 +1771,26 @@ ftenet_connections_t *FTENET_CreateCollection(qboolean listen) col->islisten = listen; return col; } +#if !defined(SERVERONLY) && !defined(CLIENTONLY) static ftenet_generic_connection_t *FTENET_Loop_EstablishConnection(qboolean isserver, const char *address, netadr_t adr); +#endif static ftenet_generic_connection_t *FTENET_UDP4_EstablishConnection(qboolean isserver, const char *address, netadr_t adr); static ftenet_generic_connection_t *FTENET_UDP6_EstablishConnection(qboolean isserver, const char *address, netadr_t adr); +#ifdef TCPCONNECT static ftenet_generic_connection_t *FTENET_TCP4Connect_EstablishConnection(qboolean isserver, const char *address, netadr_t adr); static ftenet_generic_connection_t *FTENET_TCP6Connect_EstablishConnection(qboolean isserver, const char *address, netadr_t adr); static ftenet_generic_connection_t *FTENET_TLS4Connect_EstablishConnection(qboolean isserver, const char *address, netadr_t adr); static ftenet_generic_connection_t *FTENET_TLS6Connect_EstablishConnection(qboolean isserver, const char *address, netadr_t adr); +#endif #ifdef USEIPX static ftenet_generic_connection_t *FTENET_IPX_EstablishConnection(qboolean isserver, const char *address, netadr_t adr); #endif #ifdef HAVE_WEBSOCKCL static ftenet_generic_connection_t *FTENET_WebSocket_EstablishConnection(qboolean isserver, const char *address, netadr_t adr); #endif +#ifdef IRCCONNECT static ftenet_generic_connection_t *FTENET_IRCConnect_EstablishConnection(qboolean isserver, const char *address, netadr_t adr); +#endif #ifdef HAVE_NATPMP static ftenet_generic_connection_t *FTENET_NATPMP_EstablishConnection(qboolean isserver, const char *address, netadr_t adr); #endif @@ -2095,7 +2108,7 @@ qboolean FTENET_AddToCollection(ftenet_connections_t *col, const char *name, con ftenet_generic_connection_t *(*establish[countof(adr)])(qboolean isserver, const char *address, netadr_t adr); char address[countof(adr)][256]; unsigned int i, j; - qboolean success; + qboolean success = false; if (strchr(name, ':')) return false; @@ -2109,7 +2122,10 @@ qboolean FTENET_AddToCollection(ftenet_connections_t *col, const char *name, con else if (islisten) NET_PortToAdr(addrtype, address[i], &adr[i]); else - NET_StringToAdr(address[i], 0, &adr[i]); + { + if (!NET_StringToAdr(address[i], 0, &adr[i])) + return false; + } switch(adr[i].type) { @@ -3377,7 +3393,7 @@ handshakeerror: } if ((ctrl & 0x7f) == 127) { - unsigned long long ullpaylen; + quint64_t ullpaylen; //as a payload is not allowed to be encoded as too large a type, and quakeworld never used packets larger than 1450 bytes anyway, this code isn't needed (65k is the max even without this) if (sizeof(ullpaylen) < 8) { @@ -3389,14 +3405,14 @@ handshakeerror: if (payoffs + 8 > st->inlen) break; ullpaylen = - (unsigned long long)((unsigned char*)st->inbuffer)[payoffs+0]<<56ull | - (unsigned long long)((unsigned char*)st->inbuffer)[payoffs+1]<<48ull | - (unsigned long long)((unsigned char*)st->inbuffer)[payoffs+2]<<40ull | - (unsigned long long)((unsigned char*)st->inbuffer)[payoffs+3]<<32ull | - (unsigned long long)((unsigned char*)st->inbuffer)[payoffs+4]<<24ull | - (unsigned long long)((unsigned char*)st->inbuffer)[payoffs+5]<<16ull | - (unsigned long long)((unsigned char*)st->inbuffer)[payoffs+6]<< 8ull | - (unsigned long long)((unsigned char*)st->inbuffer)[payoffs+7]<< 0ull; + (quint64_t)((unsigned char*)st->inbuffer)[payoffs+0]<<56ull | + (quint64_t)((unsigned char*)st->inbuffer)[payoffs+1]<<48ull | + (quint64_t)((unsigned char*)st->inbuffer)[payoffs+2]<<40ull | + (quint64_t)((unsigned char*)st->inbuffer)[payoffs+3]<<32ull | + (quint64_t)((unsigned char*)st->inbuffer)[payoffs+4]<<24ull | + (quint64_t)((unsigned char*)st->inbuffer)[payoffs+5]<<16ull | + (quint64_t)((unsigned char*)st->inbuffer)[payoffs+6]<< 8ull | + (quint64_t)((unsigned char*)st->inbuffer)[payoffs+7]<< 0ull; if (ullpaylen < 0x10000) { Con_Printf ("%s: payload size (%"PRIu64") encoded badly\n", NET_AdrToString (adr, sizeof(adr), &st->remoteaddr), ullpaylen); @@ -3936,7 +3952,8 @@ qboolean FTENET_IRCConnect_GetPacket(ftenet_generic_connection_t *gcon) cvar_t *ircsomething = Cvar_Get("ircsomething", "moo", 0, "IRC Connect"); cvar_t *ircclientaddr = Cvar_Get("ircclientaddr", "127.0.0.1", 0, "IRC Connect"); - NET_StringToAdr(con->ircserver.address.irc.host, 6667, &ip); + if (!NET_StringToAdr(con->ircserver.address.irc.host, 6667, &ip)) + return false; con->generic.thesocket = TCP_OpenStream(&ip); //when hosting, the specified nick is the name we're using. @@ -5002,23 +5019,24 @@ qboolean NET_EnsureRoute(ftenet_connections_t *collection, char *routename, char { netadr_t adr; - NET_StringToAdr(host, 0, &adr); - - switch(adr.type) + if (NET_StringToAdr(host, 0, &adr)) { - case NA_WEBSOCKET: - case NA_TLSV4: - case NA_TLSV6: - case NA_TCP: - case NA_TCPV6: - case NA_IRC: - if (!FTENET_AddToCollection(collection, routename, host, adr.type, islisten)) - return false; - Con_Printf("Establishing connection to %s\n", host); - break; - default: - //not recognised, or not needed - break; + switch(adr.type) + { + case NA_WEBSOCKET: + case NA_TLSV4: + case NA_TLSV6: + case NA_TCP: + case NA_TCPV6: + case NA_IRC: + if (!FTENET_AddToCollection(collection, routename, host, adr.type, islisten)) + return false; + Con_Printf("Establishing connection to %s\n", host); + break; + default: + //not recognised, or not needed + break; + } } return true; } @@ -5557,7 +5575,8 @@ void NET_GetLocalAddress (int socket, netadr_t *out) buff[512-1] = 0; if (!NET_StringToAdr (buff, 0, &adr)) //urm - NET_StringToAdr ("127.0.0.1", 0, &adr); + if (!NET_StringToAdr ("127.0.0.1", 0, &adr)) + return; namelen = sizeof(address); @@ -5648,6 +5667,7 @@ void NET_ClientPort_f(void) qboolean NET_WasSpecialPacket(netsrc_t netsrc) { +#ifdef HAVE_NATPMP ftenet_connections_t *collection = NULL; if (netsrc == NS_SERVER) { @@ -5661,6 +5681,7 @@ qboolean NET_WasSpecialPacket(netsrc_t netsrc) collection = cls.sockets; #endif } +#endif #ifdef SUPPORT_ICE if (ICE_WasStun(netsrc)) @@ -5851,8 +5872,6 @@ void SVNET_RegisterCvars(void) void NET_CloseServer(void) { - allowconnects = false; - FTENET_CloseCollection(svs.sockets); svs.sockets = NULL; } @@ -5869,8 +5888,6 @@ void NET_InitServer(void) #endif } - allowconnects = true; - #ifdef HAVE_IPV4 Cvar_ForceCallback(&sv_port_ipv4); #endif diff --git a/engine/common/netinc.h b/engine/common/netinc.h index e861058b..6bd1f5ab 100644 --- a/engine/common/netinc.h +++ b/engine/common/netinc.h @@ -235,8 +235,8 @@ struct icestate_s; typedef struct { struct icestate_s *(QDECL *ICE_Create)(void *module, char *conname, char *peername, enum icemode_e mode, enum iceproto_e proto); //doesn't start pinging anything. - qboolean (QDECL *ICE_Set)(struct icestate_s *con, char *prop, char *value); - qboolean (QDECL *ICE_Get)(struct icestate_s *con, char *prop, char *value, int valuesize); + qboolean (QDECL *ICE_Set)(struct icestate_s *con, const char *prop, const char *value); + qboolean (QDECL *ICE_Get)(struct icestate_s *con, const char *prop, char *value, int valuesize); struct icecandinfo_s *(QDECL *ICE_GetLCandidateInfo)(struct icestate_s *con); //retrieves candidates that need reporting to the peer. void (QDECL *ICE_AddRCandidateInfo)(struct icestate_s *con, struct icecandinfo_s *cand); //stuff that came from the peer. void (QDECL *ICE_Close)(struct icestate_s *con); //bye then. diff --git a/engine/common/plugin.c b/engine/common/plugin.c index 06118c1b..ff8a879a 100644 --- a/engine/common/plugin.c +++ b/engine/common/plugin.c @@ -135,10 +135,10 @@ void Plug_RegisterBuiltin(char *name, Plug_Builtin_t bi, int flags) static qintptr_t VARGS Plug_GetNativePointer(void *offset, quintptr_t mask, const qintptr_t *args) { +#ifdef SUPPORT_ICE char *p = (char *)VM_POINTER(args[0]); if (offset) //QVMs are not allowed to call this return 0; -#ifdef SUPPORT_ICE if (!strcmp(p, ICE_API_CURRENT)) return (qintptr_t)&iceapi; #endif diff --git a/engine/common/pr_bgcmd.c b/engine/common/pr_bgcmd.c index 2708e739..3b57bca7 100644 --- a/engine/common/pr_bgcmd.c +++ b/engine/common/pr_bgcmd.c @@ -96,7 +96,9 @@ char *PF_VarString (pubprogfuncs_t *prinst, int first, struct globalvars_s *pr_g static int debuggerresume; static int debuggerresumeline; extern int isPlugin; //if 2, we were invoked by a debugger, and we need to give it debug locations (and it'll feed us continue/steps/breakpoints) +#ifndef SERVERONLY static int debuggerstacky; +#endif #if defined(_WIN32) && !defined(FTE_SDL) #include @@ -139,6 +141,13 @@ size_t debuggerwnd; qboolean QCExternalDebuggerCommand(char *text) { +#if defined(CSQC_DAT) && !defined(SERVERONLY) + extern world_t csqc_world; +#endif +#if defined(MENU_DAT) && !defined(SERVERONLY) + extern world_t menu_world; +#endif + if (!isPlugin) return false; if ((!strncmp(text, "qcstep", 6) && (text[6] == 0 || text[6] == ' ')) || (!strncmp(text, "qcresume", 8) && (text[8] == 0 || text[8] == ' '))) @@ -187,16 +196,15 @@ qboolean QCExternalDebuggerCommand(char *text) else if (!strncmp(text, "qcinspect ", 10)) { //called on mouse-over events in the gui - extern world_t csqc_world, menu_world; char *variable; - char *function; +// char *function; char resultbuffer[8192], tmpbuffer[8192]; char *vmnames[4] = {"cur: ", "ssqc: ", "csqc: ", "menu: "}; char *values[4] = {NULL, NULL, NULL, NULL}; int i; Cmd_TokenizeString(text, false, false); variable = Cmd_Argv(1); - function = Cmd_Argv(2); +// function = Cmd_Argv(2); //togglebreakpoint just finds the first statement (via the function table for file names) with the specified line number, and sets some unused high bit that causes it to be an invalid opcode. @@ -243,7 +251,7 @@ qboolean QCExternalDebuggerCommand(char *text) } else if (!strncmp(text, "qcreload", 8)) { -#ifdef MENU_DAT +#if defined(MENU_DAT) && !defined(SERVERONLY) Cbuf_AddText("menu_restart\n", RESTRICT_LOCAL); #endif #ifndef CLIENTONLY @@ -255,7 +263,6 @@ qboolean QCExternalDebuggerCommand(char *text) } else if (!strncmp(text, "qcbreakpoint ", 13)) { - extern world_t csqc_world, menu_world; int mode; char *filename; int line; @@ -1744,7 +1751,7 @@ void QCBUILTIN PF_hash_createtab (pubprogfuncs_t *prinst, struct globalvars_s *p } if (i == pf_hash_maxtables) { //all slots taken, expand list - if (!ZF_ReallocElements(&pf_hashtab, &pf_hash_maxtables, pf_hash_maxtables+64, sizeof(*pf_hashtab))) + if (!ZF_ReallocElements((void**)&pf_hashtab, &pf_hash_maxtables, pf_hash_maxtables+64, sizeof(*pf_hashtab))) { G_FLOAT(OFS_RETURN) = 0; return; @@ -2684,7 +2691,6 @@ void QCBUILTIN PF_copyentity (pubprogfuncs_t *prinst, struct globalvars_s *pr_gl void QCBUILTIN PF_entityprotection (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals) { - world_t *w = prinst->parms->user; wedict_t *e = G_WEDICT(prinst, OFS_PARM0); int prot = G_FLOAT(OFS_PARM1); @@ -3547,7 +3553,7 @@ void QCBUILTIN PF_buf_create (pubprogfuncs_t *prinst, struct globalvars_s *pr_g int i; const char *type = ((prinst->callargc>0)?PR_GetStringOfs(prinst, OFS_PARM0):"string"); - unsigned int flags = ((prinst->callargc>1)?G_FLOAT(OFS_PARM1):0); +// unsigned int flags = ((prinst->callargc>1)?G_FLOAT(OFS_PARM1):1); if (!Q_strcasecmp(type, "string")) ; diff --git a/engine/common/sys.h b/engine/common/sys.h index fe953cef..994d7892 100644 --- a/engine/common/sys.h +++ b/engine/common/sys.h @@ -127,12 +127,23 @@ qboolean Sys_ConditionSignal(void *condv); //lock first qboolean Sys_ConditionBroadcast(void *condv); //lock first void Sys_DestroyConditional(void *condv); #else -#define Sys_IsMainThread() (true) -#define Sys_CreateMutex() (NULL) -#define Sys_LockMutex(m) (true) -#define Sys_UnlockMutex(m) (true) -#define Sys_DestroyMutex(m) -#define Sys_IsThread(t) (!t) + #ifdef __GNUC__ //gcc complains about if (true) when these are maros. msvc complains about static not being called in headers. gah. + static inline qboolean Sys_MutexStub(void) {return true;} + static inline void *Sys_CreateMutex(void) {return NULL;} + #define Sys_IsMainThread() Sys_MutexStub() + #define Sys_DestroyMutex(m) Sys_MutexStub() + #define Sys_IsMainThread() Sys_MutexStub() + #define Sys_LockMutex(m) Sys_MutexStub() + #define Sys_UnlockMutex(m) Sys_MutexStub() + static inline qboolean Sys_IsThread(void *thread) {return !thread;} + #else + #define Sys_IsMainThread() (qboolean)(true) + #define Sys_CreateMutex() (void*)(NULL) + #define Sys_LockMutex(m) (qboolean)(true) + #define Sys_UnlockMutex(m) (qboolean)(true) + #define Sys_DestroyMutex(m) (void)0 + #define Sys_IsThread(t) (!t) + #endif #endif void Sys_Sleep(double seconds); diff --git a/engine/dotnet2005/ftequake.vcproj b/engine/dotnet2005/ftequake.vcproj index 599d30b1..f324eb6c 100644 --- a/engine/dotnet2005/ftequake.vcproj +++ b/engine/dotnet2005/ftequake.vcproj @@ -20228,6 +20228,170 @@ /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/engine/gl/gl_alias.c b/engine/gl/gl_alias.c index 4040ea17..aceefb84 100644 --- a/engine/gl/gl_alias.c +++ b/engine/gl/gl_alias.c @@ -2194,7 +2194,6 @@ static void R_Sprite_GenerateTrisoup(entity_t *e, int bemode) vec4_t *rgba; scenetris_t *t; - extern cvar_t gl_blendsprites; shader_t *shader = NULL; mspriteframe_t *frame; @@ -2260,9 +2259,9 @@ static void R_Sprite_GenerateTrisoup(entity_t *e, int bemode) } else { +#ifdef RTLIGHTS extern cvar_t r_shadow_realtime_world_lightmaps; //lit sprites need to sample the world lighting. with rtlights that generally means they're 0. -#ifdef RTLIGHTS if (r_shadow_realtime_world.ival) lightmap = r_shadow_realtime_world_lightmaps.value; else @@ -2498,8 +2497,8 @@ void BE_GenModelBatches(batch_t **batches, const dlight_t *dl, unsigned int bemo model_t *emodel; unsigned int orig_numstris = cl_numstris; unsigned int orig_numvisedicts = cl_numvisedicts; - unsigned int orig_numstrisidx = cl_numstrisidx; - unsigned int orig_numstrisvert = cl_numstrisvert; +// unsigned int orig_numstrisidx = cl_numstrisidx; +// unsigned int orig_numstrisvert = cl_numstrisvert; /*clear the batch list*/ for (i = 0; i < SHADER_SORT_COUNT; i++) diff --git a/engine/gl/gl_backend.c b/engine/gl/gl_backend.c index 32e5bffc..b42c5036 100644 --- a/engine/gl/gl_backend.c +++ b/engine/gl/gl_backend.c @@ -2249,7 +2249,7 @@ static void deformgen(const deformv_t *deformv, int cnt, vecV_t *src, vecV_t *ds for (j = 0; j < 4; j++) { VectorSubtract(quad[j], rot_centre, tv); - Matrix3_Multiply_Vec3(result, tv, quad[j]); + Matrix3_Multiply_Vec3((const vec3_t*)result, tv, quad[j]); VectorAdd(rot_centre, quad[j], quad[j]); } } @@ -2397,7 +2397,7 @@ static void alphagen(const shaderpass_t *pass, int cnt, avec4_t *const src, avec { VectorSubtract(r_origin, shaderstate.curentity->origin, v1); - if (!Matrix3_Compare(shaderstate.curentity->axis, axisDefault)) + if (!Matrix3_Compare((const vec3_t*)shaderstate.curentity->axis, (const vec3_t*)axisDefault)) { Matrix3_Multiply_Vec3(shaderstate.curentity->axis, v1, v2); } @@ -2844,7 +2844,10 @@ static void BE_SubmitMeshChain(qboolean usetesselation) #ifndef GLSLONLY static void DrawPass(const shaderpass_t *pass) { - int i, j, k; + int i; +#if MAXRLIGHTMAPS > 1 + int j, k; +#endif int tmu; int lastpass = pass->numMergedPasses; unsigned int attr = (1u<entitylock); } +#endif static void *Terr_ReadV1(heightmap_t *hm, hmsection_t *s, void *ptr, int len) { @@ -884,7 +888,7 @@ static void *Terr_ReadV1(heightmap_t *hm, hmsection_t *s, void *ptr, int len) /*load in the mixture/lighting*/ lmstart = BZ_Malloc(SECTTEXSIZE*SECTTEXSIZE*4); memcpy(lmstart, ds->texmap, SECTTEXSIZE*SECTTEXSIZE*4); - COM_AddWork(0, Terr_WorkerLoadedSectionLightmap, hm, lmstart, s->sx, s->sy); + COM_AddWork(WG_MAIN, Terr_WorkerLoadedSectionLightmap, hm, lmstart, s->sx, s->sy); s->mesh.colors4f_array[0] = s->colours; if (flags & TSF_HASCOLOURS) @@ -1199,6 +1203,7 @@ static void Terr_SaveV2(heightmap_t *hm, hmsection_t *s, vfsfile_t *f, int sx, i VFS_WRITE(f, strm.buffer, strm.pos); strm.pos = 0; } +#ifndef SERVERONLY static void Terr_WorkerLoadedSectionLightmap(void *ctx, void *data, size_t a, size_t b) { heightmap_t *hm = ctx; @@ -1223,6 +1228,7 @@ static void Terr_WorkerLoadedSectionLightmap(void *ctx, void *data, size_t a, si BZ_Free(data); } #endif +#endif static void *Terr_ReadV2(heightmap_t *hm, hmsection_t *s, void *ptr, int len) { #ifndef SERVERONLY @@ -1363,7 +1369,7 @@ static void *Terr_ReadV2(heightmap_t *hm, hmsection_t *s, void *ptr, int len) } if (lmstart) - COM_AddWork(0, Terr_WorkerLoadedSectionLightmap, hm, lmstart, s->sx, s->sy); + COM_AddWork(WG_MAIN, Terr_WorkerLoadedSectionLightmap, hm, lmstart, s->sx, s->sy); /*load any static ents*/ j = Terr_Read_SInt(&strm); @@ -1597,9 +1603,9 @@ static hmsection_t *Terr_ReadSection(heightmap_t *hm, hmsection_t *s, int ver, v s->loadstate = TSLS_LOADING2; if (failed) - COM_AddWork(0, Terr_WorkerFailedSection, s, NULL, s->sx, s->sy); + COM_AddWork(WG_MAIN, Terr_WorkerFailedSection, s, NULL, s->sx, s->sy); else - COM_AddWork(0, Terr_WorkerLoadedSection, s, NULL, s->sx, s->sy); + COM_AddWork(WG_MAIN, Terr_WorkerLoadedSection, s, NULL, s->sx, s->sy); return s; } @@ -1638,9 +1644,9 @@ qboolean Terr_DownloadedSection(char *fname) } #endif +#ifndef SERVERONLY static void Terr_LoadSection(heightmap_t *hm, hmsection_t *s, int sx, int sy, unsigned int flags) { -#ifndef SERVERONLY //when using networked terrain, the client will never load a section from disk, but will only load it from the server //one section at a time. if (mod_terrain_networked.ival && !sv.state) @@ -1653,20 +1659,19 @@ static void Terr_LoadSection(heightmap_t *hm, hmsection_t *s, int sx, int sy, un CL_CheckOrEnqueDownloadFile(Terr_DiskSectionName(hm, sx, sy, fname, sizeof(fname)), Terr_TempDiskSectionName(hm, sx, sy), DLLF_OVERWRITE|DLLF_TEMPORARY); return; } -#endif if (!s) { Terr_GenerateSection(hm, sx, sy, true); } } +#endif static void Terr_LoadSectionWorker(void *ctx, void *data, size_t a, size_t b) { heightmap_t *hm = data; hmsection_t *s = ctx; int sx = a; int sy = b; - int flags = 0; void *diskimage; qofs_t len; char fname[MAX_QPATH]; @@ -2199,6 +2204,7 @@ static void Terr_DoEditNotify(heightmap_t *hm) } } +#ifndef SERVERONLY //garbage collect the oldest section, to make space for another static qboolean Terr_Collect(heightmap_t *hm) { @@ -2239,6 +2245,7 @@ static qboolean Terr_Collect(heightmap_t *hm) return false; } #endif +#endif /*purge all sections, but not root lightmaps only are purged whenever the client rudely kills lightmaps (purges all lightmaps on map changes, to cope with models/maps potentially being unloaded) @@ -4345,8 +4352,6 @@ void Heightmap_FindTouchedLeafs (model_t *mod, pvscache_t *ent, float *mins, flo void Heightmap_LightPointValues (model_t *mod, vec3_t point, vec3_t res_diffuse, vec3_t res_ambient, vec3_t res_dir) { - float time = realtime; - res_diffuse[0] = 128; res_diffuse[1] = 128; res_diffuse[2] = 128; @@ -5249,8 +5254,8 @@ void Terr_ParseEntityLump(char *data, heightmap_t *heightmap) void Terr_FinishTerrain(model_t *mod) { - heightmap_t *hm = mod->terrain; #ifndef SERVERONLY + heightmap_t *hm = mod->terrain; if (qrenderer != QR_NONE) { if (*hm->skyname) @@ -6453,7 +6458,7 @@ void QCBUILTIN PF_brush_selected(pubprogfuncs_t *prinst, struct globalvars_s *pr model_t *mod = vmw->Get_CModel(vmw, G_FLOAT(OFS_PARM0)); heightmap_t *hm = mod?mod->terrain:NULL; unsigned int brushid = G_INT(OFS_PARM1); - unsigned int faceid = G_INT(OFS_PARM2); +// unsigned int faceid = G_INT(OFS_PARM2); unsigned int state = G_FLOAT(OFS_PARM3); unsigned int i; brushes_t *br; diff --git a/engine/gl/gl_model.c b/engine/gl/gl_model.c index 3f9a0b86..abb07c4f 100644 --- a/engine/gl/gl_model.c +++ b/engine/gl/gl_model.c @@ -971,7 +971,9 @@ void Mod_LoadModelWorker (void *ctx, void *data, size_t a, size_t b) unsigned *buf = NULL; char mdlbase[MAX_QPATH]; char *replstr; +#ifdef DSPMODELS qboolean doomsprite = false; +#endif unsigned int magic, i; size_t filesize; char ext[8]; @@ -986,7 +988,7 @@ void Mod_LoadModelWorker (void *ctx, void *data, size_t a, size_t b) mod->maxs[1] = 16; mod->maxs[2] = 16; mod->engineflags = 0; - COM_AddWork(0, Mod_ModelLoaded, mod, NULL, MLS_LOADED, 0); + COM_AddWork(WG_MAIN, Mod_ModelLoaded, mod, NULL, MLS_LOADED, 0); return; } @@ -1042,11 +1044,13 @@ void Mod_LoadModelWorker (void *ctx, void *data, size_t a, size_t b) COM_FileExtension(mod->name, ext, sizeof(ext)); if (!Q_strcasecmp(ext, "spr") || !Q_strcasecmp(ext, "sp2")) replstr = ""; // sprite +#ifdef DSPMODELS else if (!Q_strcasecmp(ext, "dsp")) // doom sprite { replstr = ""; doomsprite = true; } +#endif else // assume models replstr = r_replacemodels.string; @@ -1080,7 +1084,7 @@ void Mod_LoadModelWorker (void *ctx, void *data, size_t a, size_t b) TRACE(("Mod_LoadModel: doomsprite: \"%s\"\n", mod->name)); Mod_LoadDoomSprite(mod); BZ_Free(buf); - COM_AddWork(0, Mod_ModelLoaded, mod, NULL, MLS_LOADED, 0); + COM_AddWork(WG_MAIN, Mod_ModelLoaded, mod, NULL, MLS_LOADED, 0); return; } #endif @@ -1149,7 +1153,7 @@ void Mod_LoadModelWorker (void *ctx, void *data, size_t a, size_t b) BZ_Free(buf); - COM_AddWork(0, Mod_ModelLoaded, mod, NULL, MLS_LOADED, 0); + COM_AddWork(WG_MAIN, Mod_ModelLoaded, mod, NULL, MLS_LOADED, 0); return; } @@ -1161,7 +1165,7 @@ void Mod_LoadModelWorker (void *ctx, void *data, size_t a, size_t b) mod->maxs[1] = 16; mod->maxs[2] = 16; mod->engineflags = 0; - COM_AddWork(0, Mod_ModelLoaded, mod, NULL, MLS_FAILED, verbose); + COM_AddWork(WG_MAIN, Mod_ModelLoaded, mod, NULL, MLS_FAILED, verbose); } @@ -1174,9 +1178,9 @@ model_t *Mod_LoadModel (model_t *mod, enum mlverbosity_e verbose) // Mod_LoadModelWorker(mod, MLV_WARN, 0); // else if (verbose == MLV_ERROR || verbose == MLV_WARNSYNC) - COM_AddWork(0, Mod_LoadModelWorker, mod, NULL, verbose, 0); + COM_AddWork(WG_MAIN, Mod_LoadModelWorker, mod, NULL, verbose, 0); else - COM_AddWork(1, Mod_LoadModelWorker, mod, NULL, verbose, 0); + COM_AddWork(WG_LOADER, Mod_LoadModelWorker, mod, NULL, verbose, 0); } if (verbose == MLV_ERROR) @@ -1216,7 +1220,7 @@ model_t *Mod_ForName (const char *name, enum mlverbosity_e verbosity) =============================================================================== */ - +#ifndef SERVERONLY static const struct { const char *oldname; @@ -1264,6 +1268,7 @@ static const char *Mod_RemapBuggyTexture(const char *name, const qbyte *data, un } return NULL; } +#endif void Mod_FinishTexture(texture_t *tx, const char *loadname, qboolean safetoloadfromwads) @@ -4830,12 +4835,12 @@ TRACE(("LoadBrushModel %i\n", __LINE__)); TRACE(("LoadBrushModel %i\n", __LINE__)); if (!isDedicated || ode) { - COM_AddWork(0, ModBrush_LoadGLStuff, submod, NULL, i, 0); + COM_AddWork(WG_MAIN, ModBrush_LoadGLStuff, submod, NULL, i, 0); } TRACE(("LoadBrushModel %i\n", __LINE__)); if (i) - COM_AddWork(0, Mod_ModelLoaded, submod, NULL, MLS_LOADED, 0); + COM_AddWork(WG_MAIN, Mod_ModelLoaded, submod, NULL, MLS_LOADED, 0); if (i < submod->numsubmodels-1) { // duplicate the basic information char name[MAX_QPATH]; diff --git a/engine/gl/gl_model.h b/engine/gl/gl_model.h index d81bc86c..d453ffbf 100644 --- a/engine/gl/gl_model.h +++ b/engine/gl/gl_model.h @@ -39,6 +39,7 @@ typedef enum { SHADER_SORT_PORTAL, SHADER_SORT_SKY, SHADER_SORT_OPAQUE, + //fixme: occlusion tests SHADER_SORT_DECAL, SHADER_SORT_SEETHROUGH, SHADER_SORT_BANNER, diff --git a/engine/gl/gl_rlight.c b/engine/gl/gl_rlight.c index ded783a9..2c43604a 100644 --- a/engine/gl/gl_rlight.c +++ b/engine/gl/gl_rlight.c @@ -1670,7 +1670,9 @@ void GLQ1BSP_LightPointValues(model_t *model, vec3_t point, vec3_t res_diffuse, { vec3_t end; float *r; +#ifdef RTLIGHTS extern cvar_t r_shadow_realtime_world, r_shadow_realtime_world_lightmaps; +#endif if (!model->lightdata || r_fullbright.ival) { diff --git a/engine/gl/gl_rmain.c b/engine/gl/gl_rmain.c index 2cc22d2c..0e8bca09 100644 --- a/engine/gl/gl_rmain.c +++ b/engine/gl/gl_rmain.c @@ -60,6 +60,7 @@ cvar_t gl_affinemodels = SCVAR("gl_affinemodels","0"); cvar_t gl_finish = SCVAR("gl_finish","0"); cvar_t gl_dither = SCVAR("gl_dither", "1"); extern cvar_t r_stereo_separation; +extern cvar_t r_stereo_convergence; extern cvar_t r_stereo_method; extern cvar_t r_postprocshader, r_fxaa; @@ -405,7 +406,9 @@ void R_SetupGL (float stereooffset) newa[0] = r_refdef.viewangles[0]; newa[1] = r_refdef.viewangles[1]; newa[2] = r_refdef.viewangles[2] + gl_screenangle.value; - if (1) + if (stereooffset) + newa[1] += r_stereo_convergence.value * ((stereooffset>0)?-0.5:0.5); //can we get away with this cheapness? rip 6dof + if (0) { vec3_t paxis[3]; AngleVectors (newa, paxis[0], paxis[1], paxis[2]); diff --git a/engine/gl/gl_screen.c b/engine/gl/gl_screen.c index e6f1f896..08c6f4f0 100644 --- a/engine/gl/gl_screen.c +++ b/engine/gl/gl_screen.c @@ -296,8 +296,8 @@ char *GLVID_GetRGBInfo(int *truewidth, int *trueheight, enum uploadfmt *fmt) } ret = BZ_Realloc(ret, (*truewidth)*(*trueheight)*3); } -#ifdef _DEBUG - else if (!gl_config.gles && gl_config.glversion >= 1.2) +#if 1//def _DEBUG + else if (!gl_config.gles && sh_config.texfmt[PTI_BGRA8]) { *fmt = TF_BGRA32; ret = BZ_Malloc((*truewidth)*(*trueheight)*4); diff --git a/engine/gl/gl_shader.c b/engine/gl/gl_shader.c index aefefb0e..dbd06a78 100644 --- a/engine/gl/gl_shader.c +++ b/engine/gl/gl_shader.c @@ -832,7 +832,7 @@ static void Shader_ClutterParms(shader_t *shader, shaderpass_t *pass, char **ptr static void Shader_SkyParms(shader_t *shader, shaderpass_t *pass, char **ptr) { skydome_t *skydome; - float skyheight; +// float skyheight; char *boxname; if (shader->skydome) @@ -846,7 +846,7 @@ static void Shader_SkyParms(shader_t *shader, shaderpass_t *pass, char **ptr) boxname = Shader_ParseString(ptr); Shader_ParseSkySides(shader->name, boxname, skydome->farbox_textures); - skyheight = Shader_ParseFloat(shader, ptr, 512); + /*skyheight =*/ Shader_ParseFloat(shader, ptr, 512); boxname = Shader_ParseString(ptr); Shader_ParseSkySides(shader->name, boxname, skydome->nearbox_textures); @@ -1867,10 +1867,10 @@ static void Shader_HLSL11ProgramName (shader_t *shader, shaderpass_t *pass, char static void Shader_ProgramParam ( shader_t *shader, shaderpass_t *pass, char **ptr ) { +#if 1 + Con_DPrintf("shader %s: 'param' no longer supported\n", shader->name); +#elif defined(GLQUAKE) cvar_t *cv = NULL; - int specialint = 0; - float specialfloat = 0; - vec3_t specialvec = {0}; enum shaderprogparmtype_e parmtype = SP_BAD; char *token; qboolean silent = false; @@ -1952,9 +1952,12 @@ static void Shader_ProgramParam ( shader_t *shader, shaderpass_t *pass, char **p else token = Shader_ParseSensString(ptr); -#if 0//def GLQUAKE if (qrenderer == QR_OPENGL) { + int specialint = 0; + float specialfloat = 0; + vec3_t specialvec = {0}; + int p; qboolean foundone; unsigned int uniformloc; @@ -2493,11 +2496,10 @@ static void Shaderpass_ClampMap (shader_t *shader, shaderpass_t *pass, char **pt static void Shaderpass_VideoMap (shader_t *shader, shaderpass_t *pass, char **ptr) { - char *token; - - token = Shader_ParseSensString (ptr); + char *token = Shader_ParseSensString (ptr); #ifdef NOMEDIA + (void)token; #else if (pass->cin) Z_Free (pass->cin); diff --git a/engine/gl/gl_vidlinuxglx.c b/engine/gl/gl_vidlinuxglx.c index 1e09ed92..fa627768 100644 --- a/engine/gl/gl_vidlinuxglx.c +++ b/engine/gl/gl_vidlinuxglx.c @@ -2026,7 +2026,7 @@ void INS_ReInit(void) void INS_Shutdown(void) { } -void INS_EnumerateDevices(void *ctx, void(*callback)(void *ctx, char *type, char *devicename, int *qdevid)) +void INS_EnumerateDevices(void *ctx, void(*callback)(void *ctx, const char *type, const char *devicename, int *qdevid)) { } diff --git a/engine/gl/gl_vidmacos.c b/engine/gl/gl_vidmacos.c index 10ef685b..535da7ac 100644 --- a/engine/gl/gl_vidmacos.c +++ b/engine/gl/gl_vidmacos.c @@ -205,7 +205,7 @@ void INS_Shutdown (void) void INS_Commands (void) { } -void INS_EnumerateDevices(void *ctx, void(*callback)(void *ctx, char *type, char *devicename, int *qdevid)) +void INS_EnumerateDevices(void *ctx, void(*callback)(void *ctx, const char *type, const char *devicename, int *qdevid)) { } void INS_Move (float *movements, int pnum) diff --git a/engine/gl/gl_vidnt.c b/engine/gl/gl_vidnt.c index e215a0dd..0fae6211 100644 --- a/engine/gl/gl_vidnt.c +++ b/engine/gl/gl_vidnt.c @@ -2359,7 +2359,7 @@ LONG WINAPI GLMainWndProc ( { COPYDATASTRUCT *cds = (COPYDATASTRUCT*)lParam; #ifdef WTHREAD - COM_AddWork(0, MainThreadWndProc, NULL, memcpy(Z_Malloc(cds->cbData), cds->lpData, cds->cbData), uMsg, cds->cbData); + COM_AddWork(WG_MAIN, MainThreadWndProc, NULL, memcpy(Z_Malloc(cds->cbData), cds->lpData, cds->cbData), uMsg, cds->cbData); #else Host_RunFile(cds->lpData, cds->cbData, NULL); #endif @@ -2368,7 +2368,7 @@ LONG WINAPI GLMainWndProc ( break; case WM_KILLFOCUS: #ifdef WTHREAD - COM_AddWork(0, MainThreadWndProc, NULL, NULL, uMsg, 0); + COM_AddWork(WG_MAIN, MainThreadWndProc, NULL, NULL, uMsg, 0); #else GLAppActivate(FALSE, Minimized);//FIXME: thread if (modestate == MS_FULLDIB) @@ -2378,7 +2378,7 @@ LONG WINAPI GLMainWndProc ( break; case WM_SETFOCUS: #ifdef WTHREAD - COM_AddWork(0, MainThreadWndProc, NULL, NULL, uMsg, 0); + COM_AddWork(WG_MAIN, MainThreadWndProc, NULL, NULL, uMsg, 0); #else if (!GLAppActivate(TRUE, Minimized))//FIXME: thread break; @@ -2396,7 +2396,7 @@ LONG WINAPI GLMainWndProc ( case WM_MOVE: VID_UpdateWindowStatus (hWnd); #ifdef WTHREAD - COM_AddWork(0, MainThreadWndProc, NULL, NULL, uMsg, 0); + COM_AddWork(WG_MAIN, MainThreadWndProc, NULL, NULL, uMsg, 0); #else Cvar_ForceCallback(&vid_conautoscale); #endif @@ -2535,7 +2535,7 @@ LONG WINAPI GLMainWndProc ( { VID_UpdateWindowStatus (hWnd); #ifdef WTHREAD - COM_AddWork(0, MainThreadWndProc, NULL, NULL, uMsg, 0); + COM_AddWork(WG_MAIN, MainThreadWndProc, NULL, NULL, uMsg, 0); #else Cvar_ForceCallback(&vid_conautoscale); #endif diff --git a/engine/gl/glmod_doom.c b/engine/gl/glmod_doom.c index b2259c8c..0550f90d 100644 --- a/engine/gl/glmod_doom.c +++ b/engine/gl/glmod_doom.c @@ -2221,7 +2221,7 @@ qboolean QDECL Mod_LoadDoomLevel(model_t *mod, void *buffer, size_t fsize) QuakifyThings(mod, thingsl); - COM_AddWork(0, Doom_LoadShaders, mod, NULL, 0, 0); + COM_AddWork(WG_MAIN, Doom_LoadShaders, mod, NULL, 0, 0); return true; } diff --git a/engine/gl/shader.h b/engine/gl/shader.h index 93c80a37..903ceb0c 100644 --- a/engine/gl/shader.h +++ b/engine/gl/shader.h @@ -515,7 +515,6 @@ struct shader_s texnums_t *defaulttextures; //must always have at least one entry. multiple will only appear if the diffuse texture was animmapped. struct shader_s *next; int id; - //end of shared fields. shader_t *bemoverrides[bemoverride_max]; shader_t *remapto; //render using this shader instead. for q3 nonsense. @@ -551,7 +550,7 @@ struct shader_s SHADER_NODLIGHT = 1 << 15, //from surfaceflags SHADER_HASLIGHTMAP = 1 << 16, SHADER_HASTOPBOTTOM = 1 << 17, - SHADER_STATICDATA = 1 << 18, //set if true: no deforms, no tcgen, rgbgen=identitylighting, alphagen=identity, tmu0=st + tmu1=lm(if available) for every pass, no norms +// SHADER_STATICDATA = 1 << 18, //set if true: no deforms, no tcgen, rgbgen=identitylighting, alphagen=identity, tmu0=st + tmu1=lm(if available) for every pass, no norms SHADER_HASREFLECT = 1 << 19, //says that we need to generate a reflection image first SHADER_HASREFRACT = 1 << 20, //says that we need to generate a refraction image first SHADER_HASREFRACTDEPTH = 1 << 21, //refraction generation needs to generate a depth texture too. @@ -586,7 +585,6 @@ struct shader_s char modelname[1]; } *clutter; -// meshfeatures_t features; bucket_t bucket; }; diff --git a/engine/http/httpclient.c b/engine/http/httpclient.c index 334ca97b..7939bc7a 100644 --- a/engine/http/httpclient.c +++ b/engine/http/httpclient.c @@ -295,7 +295,7 @@ void Cookie_Feed(char *domain, int secure, char *name, char *value) { cookie_t **link, *c; Sys_LockMutex(com_resourcemutex); - for(link = &cookies; c = *link; link = &(*link)->next) + for(link = &cookies; (c=*link)!=NULL; link = &(*link)->next) { if (!strcmp(c->domain, domain) && c->secure == secure && !strcmp(c->name, name)) break; @@ -368,7 +368,7 @@ void Cookie_Regurgitate(char *domain, int secure, char *buffer, size_t buffersiz { qboolean hascookies = false; cookie_t *c; - char *l = buffer; +// char *l = buffer; buffersize -= 3; //\r\n\0 *buffer = 0; Sys_LockMutex(com_resourcemutex); @@ -1328,7 +1328,7 @@ static int DL_Thread_Work(void *arg) } #if defined(LOADERTHREAD) && !defined(NPFTE) - COM_AddWork(0, HTTP_Wake_Think, NULL, NULL, 0, 0); + COM_AddWork(WG_MAIN, HTTP_Wake_Think, NULL, NULL, 0, 0); #endif return 0; } diff --git a/engine/http/webgen.c b/engine/http/webgen.c index d86cf0aa..542f9b8c 100644 --- a/engine/http/webgen.c +++ b/engine/http/webgen.c @@ -15,7 +15,7 @@ static char lastrecordedmvd[MAX_QPATH]; static IWeb_FileGen_t *IWeb_GenerationBuffer; static size_t IWeb_GenerationBufferTotal; - +/* static void IWeb_MoreGeneratedResize(size_t newsize) { IWeb_FileGen_t *ob; @@ -37,6 +37,7 @@ static void IWeb_MoreGeneratedResize(size_t newsize) IWeb_GenerationBufferTotal = newsize; } +*/ static void IWeb_Generate(const char *buf) { size_t count = strlen(buf); @@ -72,6 +73,7 @@ static void IWeb_Generate(const char *buf) int Rank_Enumerate (unsigned int first, unsigned int last, void (*callback) (const rankinfo_t *ri)); //leader first. +/* static void IWeb_ParseForm(char *info, int infolen, char *text) { char *eq, *and; @@ -196,7 +198,7 @@ static void IWeb_GenerateAdminFile(char *parms, char *content, int contentlength IWeb_Generate("

Remote administration is not enabled.

"); IWeb_Generate(""); } - +*/ static void IWeb_GenerateRankingsFileCallback(const rankinfo_t *ri) { diff --git a/engine/qclib/initlib.c b/engine/qclib/initlib.c index 2b52923e..88ae27a5 100644 --- a/engine/qclib/initlib.c +++ b/engine/qclib/initlib.c @@ -733,13 +733,6 @@ eval_t *PDECL PR_FindGlobal(pubprogfuncs_t *ppf, const char *globname, progsnum_ return NULL; } -//fixme: remove? -static void PDECL SetGlobalEdict(pubprogfuncs_t *ppf, struct edict_s *ed, int ofs) -{ - progfuncs_t *progfuncs = (progfuncs_t*)ppf; - ((int*)pr_globals)[ofs] = EDICT_TO_PROG(progfuncs, ed); -} - char *PDECL PR_VarString (pubprogfuncs_t *ppf, int first) { progfuncs_t *progfuncs = (progfuncs_t*)ppf; @@ -1027,7 +1020,8 @@ string_t PDECL PR_AllocTempString (pubprogfuncs_t *ppf, const char *str) return 0; len = strlen(str)+1; res = PR_AllocTempStringLen(ppf, &out, len); - memcpy(out, str, len); + if (res) + memcpy(out, str, len); return res; #else progfuncs_t *progfuncs = (progfuncs_t*)ppf; diff --git a/engine/qclib/pr_edict.c b/engine/qclib/pr_edict.c index 98b9b4e8..41ea9342 100644 --- a/engine/qclib/pr_edict.c +++ b/engine/qclib/pr_edict.c @@ -21,7 +21,7 @@ Sets everything to NULL */ void PDECL QC_ClearEdict (pubprogfuncs_t *ppf, struct edict_s *ed) { - progfuncs_t *progfuncs = (progfuncs_t*)ppf; +// progfuncs_t *progfuncs = (progfuncs_t*)ppf; edictrun_t *e = (edictrun_t *)ed; int num = e->entnum; memset (e->fields, 0, e->fieldsize); @@ -1882,7 +1882,6 @@ int PDECL PR_LoadEnts(pubprogfuncs_t *ppf, const char *file, float killonspawnfl char filename[128]; int num; - int numbuiltins; edictrun_t *ed=NULL; ddef16_t *d16; ddef32_t *d32; @@ -2005,7 +2004,6 @@ int PDECL PR_LoadEnts(pubprogfuncs_t *ppf, const char *file, float killonspawnfl filename[0] = '\0'; header_crc = 0; - numbuiltins = 0; while(1) { diff --git a/engine/qclib/pr_exec.c b/engine/qclib/pr_exec.c index 0e3f21b2..ae074f2d 100644 --- a/engine/qclib/pr_exec.c +++ b/engine/qclib/pr_exec.c @@ -603,7 +603,7 @@ pbool LocateDebugTerm(progfuncs_t *progfuncs, char *key, eval_t **result, etype_ char *c, *c2; etype_t type = ev_void; struct edictrun_s *ed; - etype_t ptrtype = ev_void; +// etype_t ptrtype = ev_void; c = strchr(key, '.'); if (c) *c = '\0'; @@ -807,7 +807,7 @@ char *PDECL PR_EvaluateDebugString(pubprogfuncs_t *ppf, char *key) { if (!LocateDebugTerm(progfuncs, key+1, &val, &type, &fakeval) && val != &fakeval) return "(unable to evaluate)"; - QC_snprintfz(buf, sizeof(buf), "(%s*)%#x", ((type>=10)?"???":basictypenames[type]), (char*)val - progfuncs->funcs.stringtable); + QC_snprintfz(buf, sizeof(buf), "(%s*)%#x", ((type>=10)?"???":basictypenames[type]), (unsigned int)((char*)val - progfuncs->funcs.stringtable)); return buf; } @@ -1955,6 +1955,10 @@ pbool PDECL PR_GetBuiltinCallInfo (pubprogfuncs_t *ppf, int *builtinnum, char *f op = pr_statements32[st].op; a = pr_statements32[st].a; break; + default: + op = OP_DONE; + a = 0; + break; } *builtinnum = 0; diff --git a/engine/qclib/qcc.h b/engine/qclib/qcc.h index 54eba760..24d1b018 100644 --- a/engine/qclib/qcc.h +++ b/engine/qclib/qcc.h @@ -1057,6 +1057,7 @@ static void inline QCC_PR_Expect (char *string) void editbadfile(char *fname, int line); char *TypeName(QCC_type_t *type, char *buffer, int buffersize); +void QCC_PR_AddIncludePath(const char *newinc); void QCC_PR_IncludeChunk (char *data, pbool duplicate, char *filename); void QCC_PR_IncludeChunkEx(char *data, pbool duplicate, char *filename, CompilerConstant_t *cnst); void QCC_PR_CloseProcessor(void); diff --git a/engine/qclib/qcc_pr_comp.c b/engine/qclib/qcc_pr_comp.c index 6f3fb467..1df282e2 100644 --- a/engine/qclib/qcc_pr_comp.c +++ b/engine/qclib/qcc_pr_comp.c @@ -8605,7 +8605,7 @@ QCC_ref_t *QCC_PR_RefExpression (QCC_ref_t *retbuf, int priority, int exprflags) } if (priority > 1 && exprflags & EXPR_WARN_ABOVE_1) - QCC_PR_ParseWarning(WARN_UNARYNOTSCOPE, "unary-not applies to non-unary expression"); + QCC_PR_ParseWarning(WARN_UNARYNOTSCOPE, "suggest parenthesis for unary operator that applies to multiple terms"); break; } @@ -12661,7 +12661,7 @@ void QCC_PR_ParseDefs (char *classname) QCC_def_t *def, *d; QCC_sref_t dynlength; QCC_function_t *f; - int i = 0; // warning: ‘i’ may be used uninitialized in this function +// int i = 0; // warning: ‘i’ may be used uninitialized in this function pbool shared=false; pbool isstatic=defaultstatic; pbool externfnc=false; diff --git a/engine/qclib/qcc_pr_lex.c b/engine/qclib/qcc_pr_lex.c index a7969f74..39ef6d44 100644 --- a/engine/qclib/qcc_pr_lex.c +++ b/engine/qclib/qcc_pr_lex.c @@ -112,7 +112,7 @@ void QCC_PR_CloseProcessor(void) *qccincludedir[i] = 0; currentchunk = NULL; } -void QCC_PR_AddIncludePath(char *newinc) +void QCC_PR_AddIncludePath(const char *newinc) { int i; @@ -1445,13 +1445,25 @@ void QCC_PR_LexString (void) if (!c) QCC_PR_ParseError (ERR_EOF, "EOF inside quote"); - if (!qccwarningaction[WARN_NOTUTF8] && c < 0 && utf8_check(&pr_token[c-1], &code)) + /* + if (!qccwarningaction[WARN_NOTUTF8] && (c&0x80)) { //convert 0xe000 private-use area to quake's charset (if they don't have the utf-8 warning enabled) //note: this may have a small false-positive risk. - if (code >= 0xe000 && code <= 0xe0ff) - pr_file_p += utf8_check(&pr_token[c-1], &code)-1; + if (utf8_check(pr_file_p-1, &code)) + { + if (code >= 0xe000 && code <= 0xe0ff) + { + pr_file_p += utf8_check(pr_file_p-1, &code)-1; + c = code & 0xff; + } + else + QCC_PR_ParseWarning(WARN_DODGYCHARSET, "non-ascii chars outside of quake-mapped private-use area", sizeof(pr_token)-1); + } + else + QCC_PR_ParseWarning(WARN_DODGYCHARSET, "source file is not unicode", sizeof(pr_token)-1); } + */ /* //these two conditions are generally part of the C preprocessor. if (c == '\\' && *pr_file_p == '\r' && pr_file_p[1] == '\n') @@ -4722,9 +4734,9 @@ QCC_type_t *QCC_PR_ParseType (int newtype, pbool silentfail) pbool isnonvirt = false; pbool isstatic = false; pbool isignored = false; - pbool ispublic = false; - pbool isprivate = false; - pbool isprotected = false; +// pbool ispublic = false; +// pbool isprivate = false; +// pbool isprotected = false; while(1) { if (QCC_PR_CheckKeyword(1, "nonvirtual")) @@ -4738,11 +4750,11 @@ QCC_type_t *QCC_PR_ParseType (int newtype, pbool silentfail) else if (QCC_PR_CheckKeyword(1, "strip")) isignored = true; else if (QCC_PR_CheckKeyword(1, "public")) - ispublic = true; + /*ispublic = true*/; else if (QCC_PR_CheckKeyword(1, "private")) - isprivate = true; + /*isprivate = true*/; else if (QCC_PR_CheckKeyword(1, "protected")) - isprotected = true; + /*isprotected = true*/; else break; } diff --git a/engine/server/pr_cmds.c b/engine/server/pr_cmds.c index b3f925e8..8269a434 100644 --- a/engine/server/pr_cmds.c +++ b/engine/server/pr_cmds.c @@ -9297,8 +9297,8 @@ static void QCBUILTIN PF_SendPacket(pubprogfuncs_t *prinst, struct globalvars_s const char *address = PR_GetStringOfs(prinst, OFS_PARM0); const char *contents = PF_VarString(prinst, 1, pr_globals); - NET_StringToAdr(address, 0, &to); - NET_SendPacket(NS_SERVER, strlen(contents), contents, &to); + if (NET_StringToAdr(address, 0, &to)) + NET_SendPacket(NS_SERVER, strlen(contents), contents, &to); } //be careful to not touch the resource unless we're meant to, to avoid stalling @@ -9356,6 +9356,11 @@ static void QCBUILTIN PF_resourcestatus(pubprogfuncs_t *prinst, struct globalvar } } break; + case RESTYPE_PARTICLE: + case RESTYPE_SHADER: + case RESTYPE_SKIN: + case RESTYPE_TEXTURE: + //FIXME default: G_FLOAT(OFS_RETURN) = -1; break; diff --git a/engine/server/savegame.c b/engine/server/savegame.c index 9463ed4a..2b29ccb8 100644 --- a/engine/server/savegame.c +++ b/engine/server/savegame.c @@ -1097,7 +1097,6 @@ void SV_Savegame (const char *savename, qboolean mapchange) extern cvar_t temp1; extern cvar_t noexit; extern cvar_t pr_maxedicts; - extern cvar_t scr_sshot_type; client_t *cl; @@ -1230,7 +1229,7 @@ void SV_Savegame (const char *savename, qboolean mapchange) { int width; int height; - qbyte *rgbbuffer; + void *rgbbuffer; image_t *img; //poke the various modes into redrawing the screen (without huds), to avoid any menus or console drawn over the top of the current backbuffer. @@ -1257,6 +1256,7 @@ void SV_Savegame (const char *savename, qboolean mapchange) rgbbuffer = VID_GetRGBInfo(&width, &height, &fmt); if (rgbbuffer) { +// extern cvar_t scr_sshot_type; SCR_ScreenShot(savefilename, FS_GAMEONLY, &rgbbuffer, 1, width, height, fmt); BZ_Free(rgbbuffer); diff --git a/engine/server/server.h b/engine/server/server.h index b264808b..4de2b367 100644 --- a/engine/server/server.h +++ b/engine/server/server.h @@ -1104,7 +1104,7 @@ qboolean MSV_ClusterLogin(char *guid, char *userinfo, size_t userinfosize); void MSV_PollSlaves(void); void MSV_Status(void); #else -#define SSV_UpdateAddresses() false +#define SSV_UpdateAddresses() ((void)0) #define MSV_ClusterLogin(guid,info,infosize) false #define SSV_IsSubServer() false #endif diff --git a/engine/server/sv_ccmds.c b/engine/server/sv_ccmds.c index 76c1cfa6..5e218704 100644 --- a/engine/server/sv_ccmds.c +++ b/engine/server/sv_ccmds.c @@ -48,17 +48,17 @@ static const struct banflags_s const char *names[2]; } banflags[] = { - {BAN_BAN, "ban"}, - {BAN_PERMIT, "safe", "permit"}, - {BAN_CUFF, "cuff"}, - {BAN_MUTE, "mute"}, - {BAN_CRIPPLED, "cripple"}, - {BAN_DEAF, "deaf"}, - {BAN_LAGGED, "lag", "lagged"}, - {BAN_VIP, "vip"}, - {BAN_BLIND, "blind"}, - {BAN_SPECONLY, "spec"}, - {BAN_STEALTH, "stealth"} + {BAN_BAN, {"ban"}}, + {BAN_PERMIT, {"safe", "permit"}}, + {BAN_CUFF, {"cuff"}}, + {BAN_MUTE, {"mute"}}, + {BAN_CRIPPLED, {"cripple"}}, + {BAN_DEAF, {"deaf"}}, + {BAN_LAGGED, {"lag", "lagged"}}, + {BAN_VIP, {"vip"}}, + {BAN_BLIND, {"blind"}}, + {BAN_SPECONLY, {"spec"}}, + {BAN_STEALTH, {"stealth"}} }; //generic helper function for naming players. @@ -434,7 +434,6 @@ void SV_Map_f (void) qboolean waschangelevel = false; int i; char *startspot; - float oldtime; nextserver = 0; @@ -651,7 +650,6 @@ void SV_Map_f (void) MP_Toggle(0); #endif - oldtime = sv.time; if (preserveplayers && svprogfuncs) { for (i=0 ; iexpiretime) - Q_strncatz(middlebit, va(",\t+%"PRIu64, (unsigned long long)nb->expiretime - bantime), sizeof(middlebit)); + Q_strncatz(middlebit, va(",\t+%"PRIu64, (quint64_t)(nb->expiretime - bantime)), sizeof(middlebit)); if (nb->reason[0]) Q_strncatz(middlebit, ",\t", sizeof(middlebit)); Con_Printf("%s%s%s\n", NET_AdrToStringMasked(adr, sizeof(adr), &nb->adr, &nb->adrmask), middlebit, nb->reason); @@ -1302,7 +1300,7 @@ static void SV_FilterList_f (void) if (nb->expiretime) { time_t secs = nb->expiretime - curtime; - Con_Printf("%s %s +%"PRIu64":%02u\n", NET_AdrToStringMasked(adr, sizeof(adr), &nb->adr, &nb->adrmask), banflagtext, (unsigned long long)(secs/60), (unsigned int)(secs%60)); + Con_Printf("%s %s +%"PRIu64":%02u\n", NET_AdrToStringMasked(adr, sizeof(adr), &nb->adr, &nb->adrmask), banflagtext, (quint64_t)(secs/60), (unsigned int)(secs%60)); } else Con_Printf("%s %s\n", NET_AdrToStringMasked(adr, sizeof(adr), &nb->adr, &nb->adrmask), banflagtext); @@ -1487,9 +1485,9 @@ static void SV_WriteIP_f (void) } } if (bi->reason[0]) - s = va("addip %s %s %"PRIu64" \"%s\"\n", NET_AdrToStringMasked(adr, sizeof(adr), &bi->adr, &bi->adrmask), banflagtext, (unsigned long long) bi->expiretime, bi->reason); + s = va("addip %s %s %"PRIu64" \"%s\"\n", NET_AdrToStringMasked(adr, sizeof(adr), &bi->adr, &bi->adrmask), banflagtext, (quint64_t) bi->expiretime, bi->reason); else if (bi->expiretime) - s = va("addip %s %s %"PRIu64"\n", NET_AdrToStringMasked(adr, sizeof(adr), &bi->adr, &bi->adrmask), banflagtext, (unsigned long long) bi->expiretime); + s = va("addip %s %s %"PRIu64"\n", NET_AdrToStringMasked(adr, sizeof(adr), &bi->adr, &bi->adrmask), banflagtext, (quint64_t) bi->expiretime); else s = va("addip %s %s\n", NET_AdrToStringMasked(adr, sizeof(adr), &bi->adr, &bi->adrmask), banflagtext); VFS_WRITE(f, s, strlen(s)); diff --git a/engine/server/sv_ents.c b/engine/server/sv_ents.c index 4df8ffce..5e76dd97 100644 --- a/engine/server/sv_ents.c +++ b/engine/server/sv_ents.c @@ -1747,16 +1747,23 @@ void SVDP_EmitEntityDelta(entity_state_t *from, entity_state_t *to, sizebuf_t *m void SVDP_EmitEntitiesUpdate (client_t *client, packet_entities_t *to, sizebuf_t *msg) { - client_frame_t *fromframe; packet_entities_t *from; int oldindex, newindex; int oldnum, newnum; int oldmax; // this is the frame that we are going to delta update from - fromframe = &client->frameunion.frames[client->netchan.incoming_sequence-1 & UPDATE_MASK]; - from = &fromframe->entities; - oldmax = from->num_entities; + if (!client->netchan.incoming_sequence) + { + oldmax = 0; + from = NULL; + } + else + { + client_frame_t *fromframe = &client->frameunion.frames[(client->netchan.incoming_sequence-1) & UPDATE_MASK]; + from = &fromframe->entities; + oldmax = from->num_entities; + } // Con_Printf ("frame %i\n", client->netchan.incoming_sequence); diff --git a/engine/server/sv_init.c b/engine/server/sv_init.c index 96aa7105..a8bf3c20 100644 --- a/engine/server/sv_init.c +++ b/engine/server/sv_init.c @@ -760,8 +760,9 @@ void SV_WipeServerState(void) if (sv.stringsalloced) { unsigned int i; + char **ptrs = (char**)&sv.strings; for (i = 0; i < sizeof(sv.strings) / sizeof(sv.strings.ptrs[0]); i++) - Z_Free((char*)sv.strings.ptrs[i]); + Z_Free(ptrs[i]); } memset (&sv, 0, sizeof(sv)); sv.logindatabase = -1; diff --git a/engine/server/sv_main.c b/engine/server/sv_main.c index 8127093a..582ae091 100644 --- a/engine/server/sv_main.c +++ b/engine/server/sv_main.c @@ -2389,18 +2389,18 @@ client_t *SVC_DirectConnect(void) protocol = (protocol==SCP_PROQUAKE)?SCP_PROQUAKE:SCP_NETQUAKE; else switch(sv_protocol_nq.ival) { - case RMQ_PROTOCOL_VERSION: - case FITZ_PROTOCOL_VERSION: + case PROTOCOL_VERSION_RMQ: + case PROTOCOL_VERSION_FITZ: protocol = SCP_FITZ666; break; case 15: //don't trip up on proquake's angle change. protocol = (protocol==SCP_PROQUAKE)?SCP_PROQUAKE:SCP_NETQUAKE; break; - case DP6_PROTOCOL_VERSION: + case PROTOCOL_VERSION_DP6: protocol = SCP_DARKPLACES6; break; - case DP7_PROTOCOL_VERSION: + case PROTOCOL_VERSION_DP7: protocol = SCP_DARKPLACES7; break; default: @@ -3812,12 +3812,13 @@ void SV_OpenRoute_f(void) netadr_t to; char data[64]; - NET_StringToAdr(Cmd_Argv(1), PORT_QWCLIENT, &to); + if (NET_StringToAdr(Cmd_Argv(1), PORT_QWCLIENT, &to)) + { + sprintf(data, "\xff\xff\xff\xff%c", S2C_CONNECTION); - sprintf(data, "\xff\xff\xff\xff%c", S2C_CONNECTION); - - Netchan_OutOfBandPrint(NS_SERVER, &to, "hello"); -// NET_SendPacket (strlen(data)+1, data, to); + Netchan_OutOfBandPrint(NS_SERVER, &to, "hello"); +// NET_SendPacket (strlen(data)+1, data, to); + } } //============================================================================ diff --git a/engine/server/sv_send.c b/engine/server/sv_send.c index b6fa44a7..c0a0ebc0 100644 --- a/engine/server/sv_send.c +++ b/engine/server/sv_send.c @@ -1835,7 +1835,7 @@ void SV_UpdateQCStats(edict_t *ent, int *statsi, char const** statss, float *sta } /*this function calculates the current stat values for the given client*/ -void SV_CalcClientStats(client_t *client, int statsi[MAX_CL_STATS], float statsf[MAX_CL_STATS], char const **statss) +void SV_CalcClientStats(client_t *client, int statsi[MAX_CL_STATS], float statsf[MAX_CL_STATS], const char **statss) { edict_t *ent; ent = client->edict; @@ -1938,7 +1938,7 @@ void SV_UpdateClientStats (client_t *client, int pnum, sizebuf_t *msg, client_fr { int statsi[MAX_CL_STATS]; float statsf[MAX_CL_STATS]; - char *statss[MAX_CL_STATS]; + const char *statss[MAX_CL_STATS]; int i, m; /*figure out what the stat values should be*/ @@ -1963,8 +1963,7 @@ void SV_UpdateClientStats (client_t *client, int pnum, sizebuf_t *msg, client_fr //diff string stats. for (i=0 ; istatss[i], *n=statss[i]; + const char *o=client->statss[i], *n=statss[i]; if (o != n) { if (!o) @@ -1974,8 +1973,8 @@ void SV_UpdateClientStats (client_t *client, int pnum, sizebuf_t *msg, client_fr if (strcmp(o, n)) client->pendingstats[(i+MAX_CL_STATS)>>5u] |= 1u<<((i+MAX_CL_STATS)&0x1f); //FIXME: we could always just run the QCGC on the player's string stats too. wouldn't need string compares that way - if (client->statss) - Z_Free(client->statss[i]); + if (client->statss[i]) + Z_Free((void*)client->statss[i]); client->statss[i] = (statss[i]&&*statss[i])?Z_StrDup(statss[i]):NULL; } } @@ -2041,7 +2040,7 @@ void SV_UpdateClientStats (client_t *client, int pnum, sizebuf_t *msg, client_fr { if (client->pendingstats[(i+MAX_CL_STATS)>>5u] & (1u<<((i+MAX_CL_STATS)&0x1f))) { - char *s = client->statss[i]; + const char *s = client->statss[i]; if (!s) s = ""; @@ -2105,7 +2104,13 @@ void SV_UpdateClientStats (client_t *client, int pnum, sizebuf_t *msg, client_fr if (statss[i] || client->statss[i]) if (strcmp(statss[i]?statss[i]:"", client->statss[i]?client->statss[i]:"")) { - client->statss[i] = statss[i]; + if (client->statss[i]) + Z_Free((void*)client->statss[i]); + if (statss[i] && *statss[i]) + client->statss[i] = Z_StrDup(statss[i]); + else + client->statss[i] = NULL; + if (pnum) { ClientReliableWrite_Begin(client->controller, svcfte_choosesplitclient, 5+strlen(statss[i])); @@ -2884,7 +2889,7 @@ void SV_SendClientMessages (void) c->netchan.nqunreliableonly = false; c->send_message = false; //nq sends one packet only for each server physics frame - if (c->nextservertimeupdate < pt && c->state >= ca_connected) + if (c->nextservertimeupdate < pt && c->state >= cs_connected) { c->send_message = true; c->nextservertimeupdate = pt + 1.0/77; @@ -2953,7 +2958,7 @@ void SV_SendMVDMessage(void) sizebuf_t msg; int statsi[MAX_CL_STATS]; float statsf[MAX_CL_STATS]; - char *statss[MAX_CL_STATS]; + const char *statss[MAX_CL_STATS]; float min_fps; extern cvar_t sv_demofps; extern cvar_t sv_demoPings; @@ -3032,7 +3037,14 @@ void SV_SendMVDMessage(void) if (strcmp(statss[j]?statss[j]:"", demo.statss[i][j]?demo.statss[i][j]:"")) { sizebuf_t *msg = MVDWrite_Begin(dem_stats, i, 3+strlen(statss[j])); - demo.statss[i][j] = statss[j]; + + if (demo.statss[i][j]) + Z_Free(demo.statss[i][j]); + if (statss[j] && *statss[j]) + demo.statss[i][j] = Z_StrDup(statss[j]); + else + demo.statss[i][j] = NULL; + MSG_WriteByte(msg, svcfte_updatestatstring); MSG_WriteByte(msg, j); MSG_WriteString(msg, statss[j]); diff --git a/engine/server/sv_sys_unix.c b/engine/server/sv_sys_unix.c index 3d9908de..eb173fc7 100644 --- a/engine/server/sv_sys_unix.c +++ b/engine/server/sv_sys_unix.c @@ -689,7 +689,6 @@ int main(int argc, char *argv[]) quakeparms_t parms; // fd_set fdset; // extern int net_socket; - int j; signal(SIGPIPE, SIG_IGN); tcgetattr(STDIN_FILENO, &orig); diff --git a/engine/server/sv_user.c b/engine/server/sv_user.c index 08497c64..1b755cfb 100644 --- a/engine/server/sv_user.c +++ b/engine/server/sv_user.c @@ -500,7 +500,7 @@ void SVNQ_New_f (void) protext1 = host_client->fteprotocolextensions; protext2 = host_client->fteprotocolextensions2; - protmain = NQ_PROTOCOL_VERSION; + protmain = PROTOCOL_VERSION_NQ; protfl = 0; //force floatcoords as required. if (sv.nqdatagram.prim.coordsize >= 4) @@ -525,33 +525,33 @@ void SVNQ_New_f (void) if (protfl) { protext1 &= ~PEXT_FLOATCOORDS; //never report floatcoords when using rmq protocol, as the base protocol allows us to be more specific anyway. - protmain = RMQ_PROTOCOL_VERSION; + protmain = PROTOCOL_VERSION_RMQ; protoname = "RMQ"; } else { - protmain = FITZ_PROTOCOL_VERSION; + protmain = PROTOCOL_VERSION_FITZ; protoname = "666"; } } else { host_client->protocol = (host_client->protocol!=SCP_NETQUAKE)?SCP_PROQUAKE:SCP_NETQUAKE; //identical other than the client->server angles - protmain = NQ_PROTOCOL_VERSION; + protmain = PROTOCOL_VERSION_NQ; protoname = "NQ"; } maxplayers = 16; break; case SCP_DARKPLACES6: SV_LogPlayer(host_client, "new (DP6)"); - protmain = DP6_PROTOCOL_VERSION; + protmain = PROTOCOL_VERSION_DP6; protext1 &= ~PEXT_FLOATCOORDS; //always enabled, try not to break things maxplayers = 255; protoname = "DPP6"; break; case SCP_DARKPLACES7: SV_LogPlayer(host_client, "new (DP7)"); - protmain = DP7_PROTOCOL_VERSION; + protmain = PROTOCOL_VERSION_DP7; protext1 &= ~PEXT_FLOATCOORDS; //always enabled, try not to break things maxplayers = 255; protoname = "DPP7"; @@ -580,11 +580,18 @@ void SVNQ_New_f (void) } COM_FileBase(sv.modelname, mapname, sizeof(mapname)); - Q_snprintfz (message, sizeof(message), "%c\n%s - "DISTRIBUTION" (%s%s%s%s %s) - %s", 2, gamedir, - protoname,(protext1||(protext2&~(PEXT2_REPLACEMENTDELTAS|PEXT2_VOICECHAT)))?"+":"",(protext2&PEXT2_REPLACEMENTDELTAS)?"F":"",(protext2&PEXT2_VOICECHAT)?"V":"", - build, mapname); - MSG_WriteByte (&host_client->netchan.message, svc_print); - MSG_WriteString (&host_client->netchan.message,message); +// if (host_client->netchan.remote_address.type != NA_LOOPBACK) //don't display this to localhost, because its just spam at the end of the day. you don't want to see it in single player. + { + //note that certain clients glitch out if this does not have a trailing new line. + //note that those clients will also glitch out from vanilla servers too. + //vanilla prints something like: VERSION 1.08 SERVER (%i CRC) + //which isn't all that useful. so lets customise it to advertise properly, as well as provide gamedir and map (file)name info + Q_snprintfz (message, sizeof(message), "%c\n%s - "DISTRIBUTION" (%s%s%s%s %s) - %s", 2, gamedir, + protoname,(protext1||(protext2&~(PEXT2_REPLACEMENTDELTAS|PEXT2_VOICECHAT)))?"+":"",(protext2&PEXT2_REPLACEMENTDELTAS)?"F":"",(protext2&PEXT2_VOICECHAT)?"V":"", + build, mapname); + MSG_WriteByte (&host_client->netchan.message, svc_print); + MSG_WriteString (&host_client->netchan.message,message); + } if (host_client->protocol == SCP_DARKPLACES6 || host_client->protocol == SCP_DARKPLACES7) { @@ -625,7 +632,7 @@ void SVNQ_New_f (void) MSG_WriteLong (&host_client->netchan.message, protext2); } MSG_WriteLong (&host_client->netchan.message, protmain); - if (protmain == RMQ_PROTOCOL_VERSION) + if (protmain == PROTOCOL_VERSION_RMQ) MSG_WriteLong (&host_client->netchan.message, protfl); MSG_WriteByte (&host_client->netchan.message, (sv.allocated_client_slots>maxplayers)?maxplayers:sv.allocated_client_slots); @@ -3669,18 +3676,15 @@ void SV_Pause_f (void) static void SV_UpdateSeats(client_t *controller) { - client_t *cl, *prev; + client_t *cl; int curclients; - for (curclients = 0, cl = controller; cl; cl = cl->controlled) - { - prev = cl; - curclients++; - } - if (controller->protocol == SCP_QUAKE2) return; //wait for the clientinfo stuff instead. + for (curclients = 0, cl = controller; cl; cl = cl->controlled) + curclients++; + ClientReliableWrite_Begin(controller, svc_signonnum, 2+curclients); ClientReliableWrite_Byte(controller, curclients); for (curclients = 0, cl = controller; cl; cl = cl->controlled, curclients++) @@ -5234,13 +5238,15 @@ void SVNQ_Begin_f (void) // call the spawn function pr_global_struct->time = sv.world.physicstime; pr_global_struct->self = EDICT_TO_PROG(svprogfuncs, sv_player); - PR_ExecuteProgram (svprogfuncs, pr_global_struct->ClientConnect); + if (pr_global_ptrs->ClientConnect) + PR_ExecuteProgram (svprogfuncs, pr_global_struct->ClientConnect); sv.skipbprintclient = NULL; // actually spawn the player pr_global_struct->time = sv.world.physicstime; pr_global_struct->self = EDICT_TO_PROG(svprogfuncs, sv_player); - PR_ExecuteProgram (svprogfuncs, pr_global_struct->PutClientInServer); + if (pr_global_ptrs->PutClientInServer) + PR_ExecuteProgram (svprogfuncs, pr_global_struct->PutClientInServer); } } } @@ -5311,7 +5317,28 @@ void SVNQ_PreSpawn_f (void) host_client->prespawn_idx = 0; if (sv_mapcheck.value) - Con_Printf("Warning: %s cannot be enforced on NQ clients.\n", sv_mapcheck.name); //as you can fake it in a client anyway, this is hardly a significant issue. + { + const char *prot = ""; + switch(host_client->protocol) + { + case SCP_NETQUAKE: + prot = " (nq)"; + break; + case SCP_PROQUAKE: + prot = " (pq)"; + break; + case SCP_FITZ666: + prot = " (fitz)"; + break; + case SCP_DARKPLACES6: + prot = " (dpp6)"; + break; + case SCP_DARKPLACES7: + prot = " (dpp7)"; + break; + } + Con_Printf("Warning: %s cannot be enforced on player %s%s.\n", sv_mapcheck.name, host_client->name, prot); //as you can fake it in a client anyway, this is hardly a significant issue. + } } host_client->send_message = true; @@ -6222,7 +6249,6 @@ SV_RunCmd */ void SV_RunCmd (usercmd_t *ucmd, qboolean recurse) { - extern int isPlugin; edict_t *ent; int i, n; int oldmsec; @@ -6254,10 +6280,11 @@ void SV_RunCmd (usercmd_t *ucmd, qboolean recurse) if ((tmp_time = realtime - host_client->last_check) >= sv_cheatspeedchecktime.value) { + extern int isPlugin; double tmp_time; tmp_time = tmp_time * 1000.0 * sv_cheatpc.value/100.0; if (host_client->msecs > tmp_time && - isPlugin < 2) //debugging can result in WEIRD timings, so don't warn about weird timings if we're likely to get blocked out for long periods + isPlugin < 2) //qc-debugging can result in WEIRD timings, so don't warn about weird timings if we're likely to get blocked out for long periods { host_client->msec_cheating++; SV_BroadcastTPrintf(PRINT_HIGH, diff --git a/engine/web/gl_vidweb.c b/engine/web/gl_vidweb.c index 65176ee6..c790f6c0 100644 --- a/engine/web/gl_vidweb.c +++ b/engine/web/gl_vidweb.c @@ -306,7 +306,7 @@ void INS_Accumulate(void) void INS_Commands (void) { } -void INS_EnumerateDevices(void *ctx, void(*callback)(void *ctx, char *type, char *devicename, int *qdevid)) +void INS_EnumerateDevices(void *ctx, void(*callback)(void *ctx, const char *type, const char *devicename, int *qdevid)) { } diff --git a/fteqtv/qw.c b/fteqtv/qw.c index 051a7b0c..4b3ffa66 100644 --- a/fteqtv/qw.c +++ b/fteqtv/qw.c @@ -1601,8 +1601,8 @@ void SendNQClientData(sv_t *tv, viewer_t *v, netmsg_t *msg) WriteByte (msg, 0); } -// [always sent] if (bits & SU_ITEMS) - WriteLong (msg, pl->stats[STAT_ITEMS]); + if (bits & SU_ITEMS) + WriteLong (msg, pl->stats[STAT_ITEMS]); if (bits & SU_WEAPONFRAME) WriteByte (msg, pl->current.weaponframe); diff --git a/quakec/menusys/menusys/mitem_combo.qc b/quakec/menusys/menusys/mitem_combo.qc index 3a8d3927..f2f338a6 100644 --- a/quakec/menusys/menusys/mitem_combo.qc +++ b/quakec/menusys/menusys/mitem_combo.qc @@ -6,6 +6,8 @@ Will show actual value when focused, and will show readable value when not. The possible values is a separate popup. */ +//FIXME: should probably set up a grabs to intercept right-click / escape outside of the item + class mitem_combo; class mitem_combo_popup; @@ -20,11 +22,7 @@ class mitem_combo : mitem float firstrow; float visrows; - virtual void() item_remove = - { - strunzone(mstrlist); - super::item_remove(); - }; + virtual void() item_remove; }; class mitem_combo_popup : mitem @@ -34,6 +32,22 @@ class mitem_combo_popup : mitem virtual void(mitem newfocus, float changedflag) item_focuschange; mitem_combo pfriend; + + virtual void() item_remove = + { + if (pfriend) + pfriend.cfriend = 0; + super::item_remove(); + }; +}; + +void() mitem_combo::item_remove = +{ + mitem_combo_popup p = cfriend; + if (p) + p.item_remove(); + strunzone(mstrlist); + super::item_remove(); }; void(vector pos) mitem_combo::item_draw = @@ -63,11 +77,13 @@ void(vector pos) mitem_combo::item_draw = pos_x += item_size_x / 2; + +/* //border ui.drawfill(pos, [item_size_x/2, 1], TD_BOT, item_alpha, 0); ui.drawfill(pos, [1, item_size_y - 1], TD_RGT, item_alpha, 0); ui.drawfill(pos + [item_size_x/2-1, 1], [1, item_size_y - 1], TD_LFT, item_alpha, 0); ui.drawfill(pos + [0, item_size_y-1], [item_size_x/2, 1], TD_TOP, item_alpha, 0); - +*/ //silly strings need to get cut off properly. ui.setcliparea(pos[0], pos[1], item_size_x/2, item_size_y); pos_y += (item_size_y - item_scale)*0.5; @@ -109,11 +125,12 @@ void(vector pos) mitem_combo_popup::item_draw = ui.drawfill(pos, item_size, item_rgb, item_alpha, 0); +/* //border ui.drawfill(pos, [item_size_x, 1], TD_BOT, item_alpha, 0); ui.drawfill(pos, [1, item_size_y - 1], TD_RGT, item_alpha, 0); ui.drawfill(pos + [item_size_x-1, 1], [1, item_size_y - 1], TD_LFT, item_alpha, 0); ui.drawfill(pos + [0, item_size_y-1], [item_size_x, 1], TD_TOP, item_alpha, 0); - pos_x += 1; +*/ pos_x += 1; v = tokenize(f.mstrlist); for (c = 0; c < v; c += 2) @@ -179,8 +196,15 @@ float(vector pos, float scan, float char, float down) mitem_combo::item_keypress } } - if (scan == K_ESCAPE) + if (scan == K_ESCAPE || scan == K_MOUSE2) + { + if (cfriend) + { + cfriend.item_remove(); + return TRUE; + } return FALSE; + } else if (scan == K_MWHEELUP || (scan == K_UPARROW && cfriend)) { i -= 2; diff --git a/quakec/menusys/menusys/mitem_edittext.qc b/quakec/menusys/menusys/mitem_edittext.qc index 14024a8b..5a24c215 100644 --- a/quakec/menusys/menusys/mitem_edittext.qc +++ b/quakec/menusys/menusys/mitem_edittext.qc @@ -24,11 +24,11 @@ void(vector pos) mitem_edit::item_draw = super::item_draw(pos); pos_x += item_size_x / 2; - ui.drawfill(pos, [item_size_x/2, 1], TD_BOT, item_alpha, 0); +/* ui.drawfill(pos, [item_size_x/2, 1], TD_BOT, item_alpha, 0); ui.drawfill(pos, [1, self.item_size_y - 1], TD_RGT, item_alpha, 0); ui.drawfill(pos + [item_size_x/2-1, 1], [1, item_size_y - 1], TD_LFT, item_alpha, 0); ui.drawfill(pos + [0, item_size_y-1], [item_size_x/2, 1], TD_TOP, item_alpha, 0); - pos_y += (item_size_y - item_scale)*0.5; +*/ pos_y += (item_size_y - item_scale)*0.5; pos_x += 1; spos = min(spos, strlen(curval)); diff --git a/quakec/menusys/menusys/mitems.qc b/quakec/menusys/menusys/mitems.qc index bb529977..b2dea100 100644 --- a/quakec/menusys/menusys/mitems.qc +++ b/quakec/menusys/menusys/mitems.qc @@ -51,8 +51,13 @@ var float dp_workarounds; #define TD_RGT '0.2 0.2 0.2' #define TD_BOT '0.0 0.0 0.0' -#define MENUBACK_RGB '0.5 0.5 0.6' +#ifndef MENUBACK_RGB +#define MENUBACK_RGB '0.4 0.365 0.29' +//#define MENUBACK_RGB '0.5 0.5 0.6' +#endif +#ifndef MENUBACK_ALPHA #define MENUBACK_ALPHA 0.8 +#endif //#ifdef TARGET_FTE //#pragma TARGET FTE