diff --git a/engine/client/cl_cam.c b/engine/client/cl_cam.c index c50ab2d02..a43d53644 100644 --- a/engine/client/cl_cam.c +++ b/engine/client/cl_cam.c @@ -123,7 +123,7 @@ void Cam_Unlock(int pnum) { if (autocam[pnum]) { - CL_SendClientCommand("ptrack"); + CL_SendClientCommand(true, "ptrack"); autocam[pnum] = CAM_NONE; locked[pnum] = false; Sbar_Changed(); @@ -135,7 +135,7 @@ void Cam_Lock(int pnum, int playernum) cam_lastviewtime[pnum] = -1000; - CL_SendClientCommand("ptrack %i", playernum); + CL_SendClientCommand(true, "ptrack %i", playernum); spec_track[pnum] = playernum; locked[pnum] = false; diff --git a/engine/client/cl_input.c b/engine/client/cl_input.c index 3ba0684eb..3eb60ae2f 100644 --- a/engine/client/cl_input.c +++ b/engine/client/cl_input.c @@ -750,7 +750,7 @@ void CLNQ_SendCmd(void) if (name.modified) { name.modified = false; - CL_SendClientCommand("name \"%s\"\n", name.string); + CL_SendClientCommand(true, "name \"%s\"\n", name.string); } if (nq_dp_protocol > 0) @@ -840,10 +840,11 @@ qboolean allowindepphys; typedef struct clcmdbuf_s { struct clcmdbuf_s *next; int len; + qboolean reliable; char command[4]; //this is dynamically allocated, so this is variably sized. } clcmdbuf_t; clcmdbuf_t *clientcmdlist; -void VARGS CL_SendClientCommand(char *format, ...) +void VARGS CL_SendClientCommand(qboolean reliable, char *format, ...) { qboolean oldallow; va_list argptr; @@ -871,6 +872,7 @@ void VARGS CL_SendClientCommand(char *format, ...) buf = Z_Malloc(sizeof(*buf)+strlen(string)); strcpy(buf->command, string); buf->len = strlen(buf->command); + buf->reliable = reliable; //add to end of the list so that the first of the list is the first to be sent. if (!clientcmdlist) @@ -1032,19 +1034,6 @@ void CL_SendCmd (float frametime) } #endif - { - clcmdbuf_t *next; - while (clientcmdlist) - { - next = clientcmdlist->next; - MSG_WriteByte (&cls.netchan.message, clc_stringcmd); - MSG_WriteString (&cls.netchan.message, clientcmdlist->command); -// Con_Printf("Sending stringcmd %s\n", clientcmdlist->command); - Z_Free(clientcmdlist); - clientcmdlist = next; - } - } - if (cls.demoplayback != DPB_NONE) { if (cls.demoplayback == DPB_MVD) @@ -1078,6 +1067,31 @@ void CL_SendCmd (float frametime) return; // sendcmds come from the demo } + buf.maxsize = sizeof(data); + buf.cursize = 0; + buf.data = data; + CL_SendDownloadReq(&buf); + { + clcmdbuf_t *next; + while (clientcmdlist) + { + next = clientcmdlist->next; + if (clientcmdlist->reliable) + { + MSG_WriteByte (&cls.netchan.message, clc_stringcmd); + MSG_WriteString (&cls.netchan.message, clientcmdlist->command); + } + else + { + MSG_WriteByte (&buf, clc_stringcmd); + MSG_WriteString (&buf, clientcmdlist->command); + } +// Con_Printf("Sending stringcmd %s\n", clientcmdlist->command); + Z_Free(clientcmdlist); + clientcmdlist = next; + } + } + #ifdef NQPROT if (cls.netcon && !cls.netcon->qwprotocol) { @@ -1154,13 +1168,8 @@ void CL_SendCmd (float frametime) // send this and the previous cmds in the message, so // if the last packet was dropped, it can be recovered - buf.maxsize = sizeof(data); - buf.cursize = 0; - buf.data = data; clientcount = cl.splitclients; - CL_SendDownloadReq(&buf); - if (!clientcount) clientcount = 1; if (1) //wait for server data before sending clc_move stuff? nope, mvdsv doesn't like that. diff --git a/engine/client/cl_main.c b/engine/client/cl_main.c index 37d518bc6..40c11696f 100644 --- a/engine/client/cl_main.c +++ b/engine/client/cl_main.c @@ -1301,7 +1301,7 @@ void CL_FullServerinfo_f (void) { unsigned int chksum = strtoul(p, NULL, 0); if (CSQC_Init(chksum)) - CL_SendClientCommand("enablecsqc"); + CL_SendClientCommand(true, "enablecsqc"); } #endif } @@ -1624,7 +1624,7 @@ void CL_Reconnect_f (void) if (cls.state == ca_connected) { Con_TPrintf (TLC_RECONNECTING); - CL_SendClientCommand("new"); + CL_SendClientCommand(true, "new"); return; } @@ -1840,7 +1840,7 @@ client_connect: //fixme: make function cls.netchan.qsocket = cls.netcon; #endif if (cls.q2server < 2) - CL_SendClientCommand("new"); + CL_SendClientCommand(true, "new"); cls.state = ca_connected; Con_TPrintf (TLC_CONNECTED); allowremotecmd = false; // localid required now for remote cmds diff --git a/engine/client/cl_parse.c b/engine/client/cl_parse.c index f11538665..6b57c4117 100644 --- a/engine/client/cl_parse.c +++ b/engine/client/cl_parse.c @@ -315,7 +315,7 @@ void CL_SendDownloadRequest(char *filename) COM_StripExtension (cls.downloadname, cls.downloadtempname); strcat (cls.downloadtempname, ".tmp"); - CL_SendClientCommand("download %s", cls.downloadname); + CL_SendClientCommand(true, "download %s", cls.downloadname); //prevent ftp/http from changing stuff cls.downloadmethod = DL_QWPENDING; @@ -596,7 +596,7 @@ void Model_NextDownload (void) { // done with modellist, request first of static signon messages // CL_SendClientCommand("prespawn %i 0 %i", cl.servercount, cl.worldmodel->checksum2); - CL_SendClientCommand(prespawn_name, cl.servercount, cl.worldmodel->checksum2); + CL_SendClientCommand(true, prespawn_name, cl.servercount, cl.worldmodel->checksum2); } } @@ -661,7 +661,7 @@ void Sound_NextDownload (void) #endif { // CL_SendClientCommand ("modellist %i 0", cl.servercount); - CL_SendClientCommand (modellist_name, cl.servercount, 0); + CL_SendClientCommand (true, modellist_name, cl.servercount, 0); } } @@ -723,7 +723,7 @@ void CL_SendDownloadReq(sizebuf_t *msg) } else { - CL_SendClientCommand("nextdl %i\n", i); + CL_SendClientCommand(false, "nextdl %i\n", i); } return; } @@ -1048,7 +1048,7 @@ void CL_ParseDownload (void) // request next block cls.downloadpercent = percent; - CL_SendClientCommand("nextdl"); + CL_SendClientCommand(true, "nextdl"); } else { @@ -1321,7 +1321,7 @@ void CL_ParseServerData (void) { // ask for the sound list next // CL_SendClientCommand ("soundlist %i 0", cl.servercount); - CL_SendClientCommand (soundlist_name, cl.servercount, 0); + CL_SendClientCommand (true, soundlist_name, cl.servercount, 0); } // now waiting for downloads, etc @@ -1568,20 +1568,20 @@ Con_DPrintf ("CL_SignonReply: %i\n", cls.signon); switch (cls.signon) { case 1: - CL_SendClientCommand("prespawn"); + CL_SendClientCommand(true, "prespawn"); break; case 2: - CL_SendClientCommand("name \"%s\"\n", name.string); + CL_SendClientCommand(true, "name \"%s\"\n", name.string); name.modified = false; - CL_SendClientCommand("color %i %i\n", (int)topcolor.value, (int)bottomcolor.value); + CL_SendClientCommand(true, "color %i %i\n", (int)topcolor.value, (int)bottomcolor.value); - CL_SendClientCommand("spawn %s", ""); + CL_SendClientCommand(true, "spawn %s", ""); break; case 3: - CL_SendClientCommand("begin"); + CL_SendClientCommand(true, "begin"); Cache_Report (); // print remaining memory #ifdef VM_CG CG_Start(); @@ -1774,7 +1774,7 @@ void CL_ParseSoundlist (void) if (n) { // CL_SendClientCommand("soundlist %i %i", cl.servercount, n); - CL_SendClientCommand(soundlist_name, cl.servercount, n); + CL_SendClientCommand(true, soundlist_name, cl.servercount, n); return; } @@ -1845,7 +1845,7 @@ void CL_ParseModellist (qboolean lots) if (n) { // CL_SendClientCommand("modellist %i %i", cl.servercount, n); - CL_SendClientCommand(modellist_name, cl.servercount, (nummodels&0xff00) + n); + CL_SendClientCommand(true, modellist_name, cl.servercount, (nummodels&0xff00) + n); return; } @@ -3588,7 +3588,7 @@ void CLQ2_ParseServerMessage (void) return; case svcq2_reconnect: //8 Con_TPrintf (TLC_RECONNECTING); - CL_SendClientCommand("new"); + CL_SendClientCommand(true, "new"); break; case svcq2_sound: //9 // CLQ2_ParseStartSoundPacket(); diff --git a/engine/client/client.h b/engine/client/client.h index 7e07dafc3..9faff07d5 100644 --- a/engine/client/client.h +++ b/engine/client/client.h @@ -656,7 +656,7 @@ float CL_KeyState (kbutton_t *key, int pnum); char *Key_KeynumToString (int keynum); int Key_StringToKeynum (char *str, int *modifier); -void VARGS CL_SendClientCommand(char *format, ...); +void VARGS CL_SendClientCommand(qboolean reliable, char *format, ...); void CL_AllowIndependantSendCmd(qboolean allow); // diff --git a/engine/client/clq2_cin.c b/engine/client/clq2_cin.c index bf8aa2041..c241c4020 100644 --- a/engine/client/clq2_cin.c +++ b/engine/client/clq2_cin.c @@ -91,7 +91,7 @@ void CIN_FinishCinematic (void) // tell the server to advance to the next map / cinematic if (cls.state == ca_active) { - CL_SendClientCommand("nextserver %i", cl.servercount); + CL_SendClientCommand(true, "nextserver %i", cl.servercount); } } diff --git a/engine/client/clq2_ents.c b/engine/client/clq2_ents.c index 685c3522a..fa2f1a1da 100644 --- a/engine/client/clq2_ents.c +++ b/engine/client/clq2_ents.c @@ -1622,11 +1622,14 @@ void CLQ2_AddPacketEntities (q2frame_t *frame) ent.fatness = 1; #ifdef Q3SHADERS //fixme: do better. //fixme: this is woefully gl specific. :( - ent.shaderRGBA[0] = (!!(renderfx & Q2RF_SHELL_RED)) * 255; - ent.shaderRGBA[1] = (!!(renderfx & Q2RF_SHELL_GREEN)) * 255; - ent.shaderRGBA[2] = (!!(renderfx & Q2RF_SHELL_BLUE)) * 255; - ent.shaderRGBA[3] = ent.alpha*255; - ent.forcedshader = R_RegisterCustom("q2/shell", Shader_DefaultSkinShell); + if (qrenderer == QR_OPENGL) + { + ent.shaderRGBA[0] = (!!(renderfx & Q2RF_SHELL_RED)) * 255; + ent.shaderRGBA[1] = (!!(renderfx & Q2RF_SHELL_GREEN)) * 255; + ent.shaderRGBA[2] = (!!(renderfx & Q2RF_SHELL_BLUE)) * 255; + ent.shaderRGBA[3] = ent.alpha*255; + ent.forcedshader = R_RegisterCustom("q2/shell", Shader_DefaultSkinShell); + } #endif V_AddLerpEntity (&ent); } diff --git a/engine/client/image.c b/engine/client/image.c index b38ef5786..41d8c9dda 100644 --- a/engine/client/image.c +++ b/engine/client/image.c @@ -1102,6 +1102,7 @@ void WritePCXfile (char *filename, qbyte *data, int width, int height, LoadPCX ============ */ +//fixme: endian issues? qbyte *ReadPCXFile(qbyte *buf, int length, int *width, int *height) { pcx_t *pcx; @@ -1175,6 +1176,72 @@ qbyte *ReadPCXFile(qbyte *buf, int length, int *width, int *height) return pcx_rgb; } +//fixme: endian issues? +qbyte *ReadPCXData(qbyte *buf, int length, int width, int height, qbyte *result) +{ + pcx_t *pcx; +// pcx_t pcxbuf; + qbyte *palette; + qbyte *pix; + int x, y; + int dataByte, runLength; + int count; + qbyte *data; + +// +// parse the PCX file +// + + pcx = (pcx_t *)buf; + + if (pcx->manufacturer != 0x0a + || pcx->version != 5 + || pcx->encoding != 1 + || pcx->bits_per_pixel != 8) + { + return NULL; + } + + if (width != pcx->xmax-pcx->xmin+1 || + height > pcx->ymax-pcx->ymin+1) + return NULL; + + + palette = buf + length-768; + + data = (char *)(pcx+1); + + count = (pcx->xmax+1) * (pcx->ymax+1); + + for (y=0 ; yxmax+1); + for (x=0 ; x<=pcx->xmax ; ) + { + dataByte = *data; + data++; + + if((dataByte & 0xC0) == 0xC0) + { + runLength = dataByte & 0x3F; + dataByte = *data; + data++; + } + else + runLength = 1; + + while(runLength-- > 0) + { + *pix++ = dataByte; + x++; + } + } + } + + return result; +} + +//fixme: endian issues? qbyte *ReadPCXPalette(qbyte *buf, int len, qbyte *out) { pcx_t *pcx; diff --git a/engine/client/quakedef.h b/engine/client/quakedef.h index d27580623..4149f5532 100644 --- a/engine/client/quakedef.h +++ b/engine/client/quakedef.h @@ -192,7 +192,7 @@ typedef struct quakeparms_s int argc; char **argv; void *membase; - int memsize; + unsigned int memsize; } quakeparms_t; diff --git a/engine/client/renderer.c b/engine/client/renderer.c index 10390b16a..8c2252bef 100644 --- a/engine/client/renderer.c +++ b/engine/client/renderer.c @@ -1414,6 +1414,8 @@ qboolean R_ApplyRenderer (rendererstate_t *newr) if (host_basepal) BZ_Free(host_basepal); + if (host_colormap) + BZ_Free(host_colormap); host_basepal = (qbyte *)COM_LoadMallocFile ("gfx/palette.lmp"); if (!host_basepal) { @@ -1424,9 +1426,13 @@ qboolean R_ApplyRenderer (rendererstate_t *newr) { memcpy(host_basepal, default_quakepal, 768); } + else + { + host_colormap = BZ_Malloc(256*VID_GRADES); + if (ReadPCXData(pcx, com_filesize, 256, VID_GRADES, host_colormap)) + goto q2colormap; //skip the colormap.lmp file as we already read it + } } - if (host_colormap) - BZ_Free(host_colormap); host_colormap = (qbyte *)COM_LoadMallocFile ("gfx/colormap.lmp"); if (!host_colormap) { @@ -1466,6 +1472,8 @@ qboolean R_ApplyRenderer (rendererstate_t *newr) if (vid.fullbright < 2) vid.fullbright = 0; //transparent colour doesn't count. +q2colormap: + TRACE(("dbg: R_ApplyRenderer: Palette loaded\n")); if (!VID_Init(newr, host_basepal)) @@ -1544,18 +1552,19 @@ TRACE(("dbg: R_ApplyRenderer: loaded\n")); TRACE(("dbg: R_ApplyRenderer: doing that funky phs thang\n")); SV_CalcPHS (); - for (i = 0; i < MAX_MODELS; i++) - { - if (*sv.model_precache[i] && (!strcmp(sv.model_precache[i] + strlen(sv.model_precache[i]) - 4, ".bsp") || i-1 < sv.worldmodel->numsubmodels)) - sv.models[i] = Mod_FindName(sv.model_precache[i]); - else - sv.models[i] = NULL; - } TRACE(("dbg: R_ApplyRenderer: clearing world\n")); SV_ClearWorld (); - if (svprogfuncs) + if (svs.gametype == GT_PROGS) { + for (i = 0; i < MAX_MODELS; i++) + { + if (*sv.model_precache[i] && (!strcmp(sv.model_precache[i] + strlen(sv.model_precache[i]) - 4, ".bsp") || i-1 < sv.worldmodel->numsubmodels)) + sv.models[i] = Mod_FindName(sv.model_precache[i]); + else + sv.models[i] = NULL; + } + ent = sv.edicts; ent->v.model = PR_SetString(svprogfuncs, sv.worldmodel->name); //FIXME: is this a problem for normal ents? for (i=0 ; iedicts) + else if (svs.gametype == GT_QUAKE2) { q2ent = ge->edicts; @@ -1592,6 +1601,8 @@ TRACE(("dbg: R_ApplyRenderer: clearing world\n")); } } } + else + SV_UnspawnServer(); #endif } #endif @@ -1609,7 +1620,10 @@ TRACE(("dbg: R_ApplyRenderer: starting on client state\n")); staticmodelindex[i] = 0; for (j = 1; j < MAX_MODELS; j++) if (cl_static_entities[i].model == cl.model_precache[j]) + { staticmodelindex[i] = j; + break; + } } cl.worldmodel = NULL; @@ -1656,6 +1670,7 @@ TRACE(("dbg: R_ApplyRenderer: efrags\n")); for (i = 0; i < cl.num_statics; i++) //make the static entities reappear. { cl_static_entities[i].model = cl.model_precache[staticmodelindex[i]]; + cl_static_entities[i].colormap = vid.colormap; if (staticmodelindex[i]) //make sure it's worthwhile. { R_AddEfrags(&cl_static_entities[i]); diff --git a/engine/client/sbar.c b/engine/client/sbar.c index 8daf78b83..3790b5b3c 100644 --- a/engine/client/sbar.c +++ b/engine/client/sbar.c @@ -1896,7 +1896,7 @@ void Sbar_DeathmatchOverlay (int start) ) { cl.last_ping_request = realtime; - CL_SendClientCommand("pings"); + CL_SendClientCommand(false, "pings"); } scr_copyeverything = 1; @@ -2055,7 +2055,7 @@ void Sbar_ChatModeOverlay(void) ) { cl.last_ping_request = realtime; - CL_SendClientCommand("pings"); + CL_SendClientCommand(false, "pings"); } scr_copyeverything = 1; diff --git a/engine/client/skin.c b/engine/client/skin.c index c1399deae..959f85a79 100644 --- a/engine/client/skin.c +++ b/engine/client/skin.c @@ -504,7 +504,7 @@ void Skin_NextDownload (void) if (cls.state != ca_active) { // get next signon phase - CL_SendClientCommand("begin %i", cl.servercount); + CL_SendClientCommand(true, "begin %i", cl.servercount); Cache_Report (); // print remaining memory } } diff --git a/engine/client/snd_mp3.c b/engine/client/snd_mp3.c index 0a5fa0c5c..462ab68d4 100644 --- a/engine/client/snd_mp3.c +++ b/engine/client/snd_mp3.c @@ -47,7 +47,13 @@ * */ -# include "../../mp3/libmad/mad.h" +# include "libmad/mad.h" +#define USE_MADLIB +#include "mymad.c" + +#ifdef _MSC_VER +#pragma comment (lib, "../libs/libmad/msvc++/release/libmad.lib") +#endif /* @@ -85,12 +91,12 @@ typedef struct { int mymad_run(struct mad_decoder *decoder); int mymad_reset(struct mad_decoder *decoder); void mymad_finish(struct mad_decoder *decoder); -int startdecode(unsigned char *start, unsigned long length, decoderbuffer_t *buffer); +static int startdecode(unsigned char *start, unsigned long length, decoderbuffer_t *buffer); #define BUFFERSIZEINC (2*1024*1024) int DecodeSomeMP3(sfx_t *s, int minlength); -byte *COM_LoadFile (char *path, int usehunk); +qbyte *COM_LoadFile (char *path, int usehunk); int MP3_decode(unsigned char *start, unsigned long length, decoderbuffer_t *buffer); void CancelDecoder(sfx_t *s); sfxcache_t *S_LoadMP3Sound (sfx_t *s) diff --git a/engine/client/sys_win.c b/engine/client/sys_win.c index 4016b095e..3c26a8644 100644 --- a/engine/client/sys_win.c +++ b/engine/client/sys_win.c @@ -146,7 +146,7 @@ void *Sys_GetGameAPI (void *parms) #define MINIMUM_WIN_MEMORY 0x0800000 -#define MAXIMUM_WIN_MEMORY 0x1000000 +#define MAXIMUM_WIN_MEMORY 0x4000000 #define PAUSE_SLEEP 50 // sleep time on pause or minimization #define NOT_FOCUS_SLEEP 20 // sleep time when not focus @@ -1053,8 +1053,8 @@ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLin if (parms.memsize < (lpBuffer.dwTotalPhys >> 1)) parms.memsize = lpBuffer.dwTotalPhys >> 1; -// if (parms.memsize > MAXIMUM_WIN_MEMORY) -// parms.memsize = MAXIMUM_WIN_MEMORY; + if (parms.memsize > MAXIMUM_WIN_MEMORY) + parms.memsize = MAXIMUM_WIN_MEMORY; if (COM_CheckParm ("-heapsize")) { diff --git a/engine/client/zqtp.c b/engine/client/zqtp.c index b57a54186..edef91808 100644 --- a/engine/client/zqtp.c +++ b/engine/client/zqtp.c @@ -2662,7 +2662,7 @@ static void CL_Say (qboolean team, char *extra) return; } #endif - CL_SendClientCommand("%s \"%s%s\"", team ? "say_team " : "say ", extra?extra:"", sendtext); + CL_SendClientCommand(true, "%s \"%s%s\"", team ? "say_team " : "say ", extra?extra:"", sendtext); } diff --git a/engine/common/cmd.c b/engine/common/cmd.c index 23ca5bcf1..cd138e5f9 100644 --- a/engine/common/cmd.c +++ b/engine/common/cmd.c @@ -1563,9 +1563,9 @@ void Cmd_ForwardToServer (void) #endif if (Cmd_Argc() > 1) - CL_SendClientCommand("%s %s", Cmd_Argv(0), Cmd_Args()); + CL_SendClientCommand(true, "%s %s", Cmd_Argv(0), Cmd_Args()); else - CL_SendClientCommand("%s", Cmd_Argv(0)); + CL_SendClientCommand(true, "%s", Cmd_Argv(0)); } // don't forward the first argument @@ -1586,7 +1586,7 @@ void Cmd_ForwardToServer_f (void) return; // not really connected if (Cmd_Argc() > 1) - CL_SendClientCommand("%s", Cmd_Args()); + CL_SendClientCommand(true, "%s", Cmd_Args()); } #else void Cmd_ForwardToServer (void) diff --git a/engine/common/cvar.c b/engine/common/cvar.c index 587666160..e862cb08f 100644 --- a/engine/common/cvar.c +++ b/engine/common/cvar.c @@ -249,7 +249,7 @@ cvar_t *Cvar_SetCore (cvar_t *var, char *value, qboolean force) else #endif { - CL_SendClientCommand("setinfo \"%s\" \"%s\"\n", var->name, value); + CL_SendClientCommand(true, "setinfo \"%s\" \"%s\"\n", var->name, value); } } } @@ -581,7 +581,7 @@ qboolean Cvar_Command (int level) #ifndef SERVERONLY if (Cmd_ExecLevel > RESTRICT_SERVER) { //directed at a secondary player. - CL_SendClientCommand("%i setinfo %s \"%s\"", Cmd_ExecLevel - RESTRICT_SERVER-1, v->name, str); + CL_SendClientCommand(true, "%i setinfo %s \"%s\"", Cmd_ExecLevel - RESTRICT_SERVER-1, v->name, str); return true; } diff --git a/engine/gl/gl_alias.c b/engine/gl/gl_alias.c index eb0db9be1..203f44c9c 100644 --- a/engine/gl/gl_alias.c +++ b/engine/gl/gl_alias.c @@ -2170,7 +2170,7 @@ void GL_LoadQ1Model (model_t *mod, void *buffer) if (cls.state >= ca_connected) { - CL_SendClientCommand("setinfo %s %d", + CL_SendClientCommand(true, "setinfo %s %d", !strcmp(loadmodel->name, "progs/player.mdl") ? pmodel_name : emodel_name, (int)crc); } diff --git a/engine/gl/gl_hlmdl.c b/engine/gl/gl_hlmdl.c index cdd675a83..3c0942091 100644 --- a/engine/gl/gl_hlmdl.c +++ b/engine/gl/gl_hlmdl.c @@ -113,7 +113,7 @@ void Mod_LoadHLModel (model_t *mod, void *buffer) if (cls.state >= ca_connected) { - CL_SendClientCommand("setinfo %s %d", + CL_SendClientCommand(true, "setinfo %s %d", !strcmp(mod->name, "progs/player.mdl") ? pmodel_name : emodel_name, (int)crc); } diff --git a/engine/gl/gl_ppl.c b/engine/gl/gl_ppl.c index d5fb88c6a..c18842196 100644 --- a/engine/gl/gl_ppl.c +++ b/engine/gl/gl_ppl.c @@ -1969,10 +1969,6 @@ void PPL_BaseEntTextures(void) } else { -#if 0 - if (currententity->keynum == r_refdef.currentplayernum+1) - continue; -#else j = currententity->keynum; while(j) { @@ -1984,7 +1980,7 @@ void PPL_BaseEntTextures(void) } if (j) continue; -#endif + if (cl.viewentity[r_refdef.currentplayernum] && currententity->keynum == cl.viewentity[r_refdef.currentplayernum]) continue; if (!Cam_DrawPlayer(0, currententity->keynum-1)) diff --git a/engine/server/net_preparse.c b/engine/server/net_preparse.c index 005b91fec..afab01c98 100644 --- a/engine/server/net_preparse.c +++ b/engine/server/net_preparse.c @@ -27,6 +27,9 @@ static qboolean ignoreprotocol; //I wanna knick thier mods. #define svcdp_skybox 37 +#define svcdp_showlmp 35 // [string] slotname [string] lmpfilename [short] x [short] y +#define svcdp_hidelmp 36 // [string] slotname + #define TE_EXPLOSION3_NEH 16 // [vector] origin [coord] red [coord] green [coord] blue (fixme: ignored) #define TE_LIGHTNING4_NEH 17 // [string] model [entity] entity [vector] start [vector] end @@ -135,6 +138,12 @@ void NPP_Flush(void) } bufferlen = 0; break; + case svcdp_showlmp: + case svcdp_hidelmp: + ignoreprotocol = true; + Con_Printf ("Ignoring svc_showlmp\n"); + break; + case svc_temp_entity: switch (buffer[1]) { @@ -259,6 +268,9 @@ void NPP_NQWriteByte(int dest, qbyte data) //replacement write func (nq to qw) { switch(data) { + case svcdp_showlmp: + case svcdp_hidelmp: + break; case svc_temp_entity: break; case svc_setangle: @@ -437,12 +449,22 @@ void NPP_NQWriteByte(int dest, qbyte data) //replacement write func (nq to qw) { switch(majortype) { + case svcdp_hidelmp: case svc_setname: case svc_stufftext: case svc_centerprint: if (!data) protocollen = bufferlen; break; + case svcdp_showlmp: // [string] slotname [string] lmpfilename [short] x [short] y + if (!data) + { //second string, plus 4 bytes. + int i; + for (i = 0; i < bufferlen; i++) + if (!buffer[i]) + protocollen = bufferlen+4; + } + break; } } diff --git a/engine/server/svq2_game.c b/engine/server/svq2_game.c index e7155d96f..c5d8798a2 100644 --- a/engine/server/svq2_game.c +++ b/engine/server/svq2_game.c @@ -169,7 +169,6 @@ PF_Configstring */ static void VARGS PFQ2_Configstring (int i, char *val) { - int j; if (i < 0 || i >= Q2MAX_CONFIGSTRINGS) Sys_Error ("configstring: bad index %i\n", i); diff --git a/engine/sw/r_alias.c b/engine/sw/r_alias.c index 715b5a452..1decccac6 100644 --- a/engine/sw/r_alias.c +++ b/engine/sw/r_alias.c @@ -270,6 +270,7 @@ qboolean R_AliasCheckBBox (void) { if (minz > (r_aliastransition + (pmdl->size * r_resfudge))) { + Con_Printf("Trivial accept 2 on %s\n", currententity->model->name); currententity->trivial_accept |= 2; } } @@ -612,7 +613,7 @@ void R_AliasPrepareUnclippedPoints (void) if (r_pixbytes == 4) D_PolysetDraw32 (); -#if id386 +#if 0//id386 else if (t_state & TT_ONE) D_PolysetDrawAsm (); #endif @@ -790,7 +791,6 @@ void R_AliasSetupFrame (void) r_abacklerp[i] = paliashdr->frames[oframe].scale[i]*bl; r_afrntlerp[i] = paliashdr->frames[frame].scale[i]*fl; r_amovelerp[i] = paliashdr->frames[frame].scale_origin[i]*fl + paliashdr->frames[oframe].scale_origin[i]*bl; - } if (paliashdr->frames[frame].type == ALIAS_SINGLE) @@ -901,14 +901,6 @@ void R_AliasDrawModel (alight_t *plighting) r_recursiveaffinetriangles; r_affinetridesc.pstverts = (mstvert_t *)((qbyte *)paliashdr + paliashdr->stverts); -/* { - int i; - for (i = 0; i < pmdl->numstverts; i++) - { - r_affinetridesc.pstverts[i].s = rand()<<8; - r_affinetridesc.pstverts[i].t = rand()<<8; - } - }*/ if (r_affinetridesc.drawtype) { diff --git a/engine/sw/r_draw.c b/engine/sw/r_draw.c index c29b83f7c..71c895b74 100644 --- a/engine/sw/r_draw.c +++ b/engine/sw/r_draw.c @@ -198,8 +198,6 @@ void R_InitSkyBox (void) model_t *wm; wm = cl.worldmodel; - - Hunk_Check(); if (wm->numsurfaces+6 > MAX_MAP_FACES || wm->numvertexes+8 > MAX_MAP_VERTS @@ -214,12 +212,9 @@ void R_InitSkyBox (void) // wm->numedges += 12; r_skysurfedges = wm->surfedges + wm->numsurfedges; // wm->numsurfedges += 24; - - Hunk_Check(); memset (r_skyfaces, 0, 6*sizeof(*r_skyfaces)); - - Hunk_Check(); + for (i=0 ; i<6 ; i++) { r_skyplanes[i].normal[skybox_planes[i*2]] = 1; @@ -238,15 +233,12 @@ void R_InitSkyBox (void) r_skyfaces[i].extents[0] = 256; r_skyfaces[i].extents[1] = 256; } - Hunk_Check(); for (i=0 ; i<24 ; i++) if (box_surfedges[i] > 0) r_skysurfedges[i] = wm->numedges-12 + box_surfedges[i]; else r_skysurfedges[i] = - (wm->numedges-12 + -box_surfedges[i]); - - Hunk_Check(); for(i=0 ; i<12 ; i++) { @@ -254,6 +246,7 @@ void R_InitSkyBox (void) r_skyedges[i].v[1] = wm->numvertexes-8+box_edges[i*2+1]; r_skyedges[i].cachededgeoffset = 0; } + Hunk_Check(); } diff --git a/engine/sw/r_main.c b/engine/sw/r_main.c index 7d8ffff6b..6f4955722 100644 --- a/engine/sw/r_main.c +++ b/engine/sw/r_main.c @@ -637,6 +637,25 @@ void SWR_MarkLeaves (void) } } +//temporary +void SWR_DrawBeam(entity_t *e) +{ + particle_t p; + vec3_t o1, o2; + vec3_t dir; + int len; + VectorSubtract(e->origin, e->oldorigin, dir); + VectorCopy(e->oldorigin, o1); + len = VectorNormalize(dir); + p.alpha = 1; + p.color = 15; + for (; len>=0; len--) + { + VectorAdd(o1, dir, o2); + D_DrawSparkTrans (&p, o1, o2); + VectorCopy(o2, o1); + } +} /* ============= @@ -660,14 +679,29 @@ void SWR_DrawEntitiesOnList (void) for (i=0 ; ikeynum == cl.viewentity[r_refdef.currentplayernum]) - continue; - if (currententity->flags & 2) - continue; - if (!Cam_DrawPlayer(0, currententity->keynum-1)) - continue; + { + j = currententity->keynum; + while(j) + { + if (j == (cl.viewentity[r_refdef.currentplayernum]?cl.viewentity[r_refdef.currentplayernum]:(cl.playernum[r_refdef.currentplayernum]+1))) + break; + j = cl.lerpents[j].tagent; + } + if (j) + continue; + if (cl.viewentity[r_refdef.currentplayernum] && currententity->keynum == cl.viewentity[r_refdef.currentplayernum]) + continue; + if (!Cam_DrawPlayer(0, currententity->keynum-1)) + continue; + } + + if (currententity->flags & Q2RF_BEAM) + { + SWR_DrawBeam(currententity); + continue; + } if (!currententity->model) continue; @@ -1058,6 +1092,8 @@ void R_DrawBEntitiesOnList (void) if (!currententity->model) continue; + if (currententity->flags & Q2RF_BEAM) + continue; switch (currententity->model->type) { diff --git a/engine/sw/sw_draw.c b/engine/sw/sw_draw.c index bed1bcfb2..d6281c506 100644 --- a/engine/sw/sw_draw.c +++ b/engine/sw/sw_draw.c @@ -96,9 +96,13 @@ mpic_t *SWDraw_SafeCachePic (char *extpath) qbyte *file, *image; int width; int height; - _snprintf(alternatename, MAX_QPATH-1,"%s.pcx", path); - + _snprintf(alternatename, MAX_QPATH-1,"pics/%s.pcx", path); file = COM_LoadMallocFile(alternatename); + if (!file) + { + _snprintf(alternatename, MAX_QPATH-1,"%s.pcx", path); + file = COM_LoadMallocFile(alternatename); + } if (file) { image = ReadPCXFile(file, com_filesize, &width, &height); diff --git a/engine/sw/sw_model.c b/engine/sw/sw_model.c index 500b3a25a..071f331dc 100644 --- a/engine/sw/sw_model.c +++ b/engine/sw/sw_model.c @@ -381,7 +381,7 @@ model_t *SWMod_LoadModel (model_t *mod, qboolean crash) case MD3_IDENT: SWMod_LoadAlias3Model (mod, buf); break; - + case IDSPRITEHEADER: SWMod_LoadSpriteModel (mod, buf); break; @@ -2053,7 +2053,7 @@ void * SWMod_LoadAliasFrame (void * pin, int *pframeindex, int numv, for (i=0 ; i<3 ; i++) { - // these are qbyte values, so we don't have to worry about + // these are byte values, so we don't have to worry about // endianness pbboxmin->v[i] = pdaliasframe->bboxmin.v[i]; pbboxmax->v[i] = pdaliasframe->bboxmax.v[i]; @@ -2068,7 +2068,7 @@ void * SWMod_LoadAliasFrame (void * pin, int *pframeindex, int numv, { int k; - // these are all qbyte values, so no need to deal with endianness + // these are all byte values, so no need to deal with endianness pframe[j].lightnormalindex = pinframe[j].lightnormalindex; for (k=0 ; k<3 ; k++) @@ -2109,7 +2109,7 @@ void * SWMod_LoadAliasGroup (void * pin, int *pframeindex, int numv, for (i=0 ; i<3 ; i++) { - // these are qbyte values, so we don't have to worry about endianness + // these are byte values, so we don't have to worry about endianness pbboxmin->v[i] = pingroup->bboxmin.v[i]; pbboxmax->v[i] = pingroup->bboxmax.v[i]; } @@ -2290,7 +2290,7 @@ void SWMod_LoadAliasModel (model_t *mod, void *buffer) if (cls.state >= ca_connected) { - CL_SendClientCommand("setinfo %s %d", + CL_SendClientCommand(true, "setinfo %s %d", !strcmp(loadmodel->name, "progs/player.mdl") ? pmodel_name : emodel_name, (int)crc); } @@ -2508,6 +2508,8 @@ void SWMod_LoadAliasModel (model_t *mod, void *buffer) // end = Hunk_LowMark (); total = end - start; + + Hunk_Check(); Cache_Alloc (&mod->cache, total, loadname); if (!mod->cache.data) @@ -2567,7 +2569,7 @@ void SWMod_LoadAlias2Model (model_t *mod, void *buffer) if (cls.state >= ca_connected) { - CL_SendClientCommand("setinfo %s %d", + CL_SendClientCommand(true, "setinfo %s %d", !strcmp(loadmodel->name, "progs/player.mdl") ? pmodel_name : emodel_name, (int)crc); } @@ -2900,6 +2902,22 @@ typedef struct { float ang[3][3]; } md3tag_t; +qbyte *LoadTextureFile(char *texturename) +{ + qbyte *tex; + if ((tex = COM_LoadMallocFile(texturename))) + return tex; + if ((tex = COM_LoadMallocFile(va("textures/%s.tga", texturename)))) + return tex; + if ((tex = COM_LoadMallocFile(va("textures/%s.jpg", texturename)))) + return tex; + if ((tex = COM_LoadMallocFile(va("%s.tga", texturename)))) + return tex; + if ((tex = COM_LoadMallocFile(va("%s.jpg", texturename)))) + return tex; + + return NULL; +} void SWMod_LoadAlias3Model (model_t *mod, void *buffer) { @@ -2944,7 +2962,7 @@ void SWMod_LoadAlias3Model (model_t *mod, void *buffer) if (cls.state >= ca_connected) { - CL_SendClientCommand("setinfo %s %d", + CL_SendClientCommand(true, "setinfo %s %d", !strcmp(loadmodel->name, "progs/player.mdl") ? pmodel_name : emodel_name, (int)crc); } @@ -3041,13 +3059,13 @@ void SWMod_LoadAlias3Model (model_t *mod, void *buffer) for (i=0 ; iname); + buffer = LoadTextureFile(pinskin->name); if (!buffer) { char altname[256]; strcpy(altname, mod->name); //backup strcpy(COM_SkipPath(altname), COM_SkipPath(pinskin->name)); - buffer = COM_LoadMallocFile(altname); + buffer = LoadTextureFile(altname); } if (!buffer) diff --git a/engine/sw/vid_ddraw.c b/engine/sw/vid_ddraw.c index 0d0e37ac8..b32927630 100644 --- a/engine/sw/vid_ddraw.c +++ b/engine/sw/vid_ddraw.c @@ -292,6 +292,9 @@ qboolean DDRAW_Init(rendererstate_t *info, unsigned char **ppbuffer, int *ppitch ddsd.dwFlags = /*DDSD_CAPS |*/ DDSD_BACKBUFFERCOUNT; ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_COMPLEX; ddsd.dwBackBufferCount = 1; + ddsd.dwRefreshRate = info->rate; + if (ddsd.dwRefreshRate) + ddsd.dwFlags |= DDSD_REFRESHRATE; Con_SafePrintf( "...creating front buffer: "); if ( ( ddrval = lpDirectDraw->lpVtbl->CreateSurface( lpDirectDraw, &ddsd, &lpddsFrontBuffer, NULL ) ) != DD_OK )