X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=cl_parse.c;h=77ffee399c4fedeb0407fa13e89ba42c6244104b;hb=4eb6393c19467e2a1e45913397aaf11380d1cd83;hp=97ec02351b7ec4fd8a145f2da5adbd08da8380e4;hpb=984163a013087ab3dafb0e3a86554c7c349cd09f;p=xonotic%2Fdarkplaces.git diff --git a/cl_parse.c b/cl_parse.c index 97ec0235..77ffee39 100644 --- a/cl_parse.c +++ b/cl_parse.c @@ -94,6 +94,9 @@ char *svc_strings[128] = "svc_entities", // 57 // [int] deltaframe [int] thisframe [float vector] eye [variable length] entitydata "svc_csqcentities", // 58 // [short] entnum [variable length] entitydata ... [short] 0x0000 "svc_spawnstaticsound2", // 59 // [coord3] [short] samp [byte] vol [byte] aten + "svc_trailparticles", // 60 // [short] entnum [short] effectnum [vector] start [vector] end + "svc_pointparticles", // 61 // [short] effectnum [vector] start [vector] velocity [short] count + "svc_pointparticles1", // 62 // [short] effectnum [vector] start, same as svc_pointparticles except velocity is zero and count is 1 }; char *qw_svc_strings[128] = @@ -165,6 +168,7 @@ cvar_t cl_sound_tink1 = {0, "cl_sound_tink1", "weapons/tink1.wav", "sound to pla cvar_t cl_sound_ric1 = {0, "cl_sound_ric1", "weapons/ric1.wav", "sound to play with 5% chance during TE_SPIKE/TE_SUPERSPIKE (empty cvar disables sound)"}; cvar_t cl_sound_ric2 = {0, "cl_sound_ric2", "weapons/ric2.wav", "sound to play with 5% chance during TE_SPIKE/TE_SUPERSPIKE (empty cvar disables sound)"}; cvar_t cl_sound_ric3 = {0, "cl_sound_ric3", "weapons/ric3.wav", "sound to play with 10% chance during TE_SPIKE/TE_SUPERSPIKE (empty cvar disables sound)"}; +cvar_t cl_readpicture_force = {0, "cl_readpicture_force", "0", "when enabled, the low quality pictures read by ReadPicture() are preferred over the high quality pictures on the file system"}; #define RIC_GUNSHOT 1 #define RIC_GUNSHOTQUAD 2 @@ -364,8 +368,12 @@ void CL_ParseEntityLump(char *entdata) else if (!strcmp("fog", key)) { r_refdef.fog_start = 0; - r_refdef.fog_end = 1000000000; - sscanf(value, "%f %f %f %f %f %f", &r_refdef.fog_density, &r_refdef.fog_red, &r_refdef.fog_green, &r_refdef.fog_blue, &r_refdef.fog_start, &r_refdef.fog_end); + r_refdef.fog_alpha = 1; + r_refdef.fog_end = 16384; +#if _MSC_VER >= 1400 +#define sscanf sscanf_s +#endif + sscanf(value, "%f %f %f %f %f %f %f", &r_refdef.fog_density, &r_refdef.fog_red, &r_refdef.fog_green, &r_refdef.fog_blue, &r_refdef.fog_alpha, &r_refdef.fog_start, &r_refdef.fog_end); } else if (!strcmp("fog_density", key)) r_refdef.fog_density = atof(value); @@ -375,11 +383,19 @@ void CL_ParseEntityLump(char *entdata) r_refdef.fog_green = atof(value); else if (!strcmp("fog_blue", key)) r_refdef.fog_blue = atof(value); + else if (!strcmp("fog_alpha", key)) + r_refdef.fog_alpha = atof(value); + else if (!strcmp("fog_start", key)) + r_refdef.fog_start = atof(value); + else if (!strcmp("fog_end", key)) + r_refdef.fog_end = atof(value); } } extern void CL_Locs_Reload_f(void); extern void CL_VM_Init (void); +static const vec3_t defaultmins = {-4096, -4096, -4096}; +static const vec3_t defaultmaxs = {4096, 4096, 4096}; static void CL_SetupWorldModel(void) { // update the world model @@ -388,16 +404,9 @@ static void CL_SetupWorldModel(void) // set up csqc world for collision culling if (cl.worldmodel) - { - VectorCopy(cl.worldmodel->normalmins, cl.world.areagrid_mins); - VectorCopy(cl.worldmodel->normalmaxs, cl.world.areagrid_maxs); - } + World_SetSize(&cl.world, cl.worldmodel->name, cl.worldmodel->normalmins, cl.worldmodel->normalmaxs); else - { - VectorSet(cl.world.areagrid_mins, -4096, -4096, -4096); - VectorSet(cl.world.areagrid_maxs, 4096, 4096, 4096); - } - World_Clear(&cl.world); + World_SetSize(&cl.world, "", defaultmins, defaultmaxs); // load or reload .loc file for team chat messages CL_Locs_Reload_f(); @@ -415,6 +424,7 @@ static void CL_SetupWorldModel(void) if (cl.loadcsqc) { cl.loadcsqc = false; + CL_VM_Init(); } } @@ -424,7 +434,7 @@ static qboolean QW_CL_CheckOrDownloadFile(const char *filename) qfile_t *file; // see if the file already exists - file = FS_Open(filename, "rb", true, false); + file = FS_OpenVirtualFile(filename, true); if (file) { FS_Close(file); @@ -1035,6 +1045,16 @@ void CL_BeginDownloads(qboolean aborteddownload) // finished loading sounds } + if(gamemode == GAME_NEXUIZ) + Cvar_SetValueQuick(&cl_serverextension_download, false); + // in Nexuiz, the built in download protocol is kinda broken (misses lots + // of dependencies) anyway, and can mess around with the game directory; + // until this is fixed, only support pk3 downloads via curl, and turn off + // individual file downloads other than for CSQC + // on the other end of the download protocol, GAME_NEXUIZ enforces writing + // to dlcache only + // idea: support download of pk3 files using this protocol later + // note: the reason these loops skip already-loaded things is that it // enables this command to be issued during the game if desired @@ -1083,6 +1103,8 @@ void CL_BeginDownloads(qboolean aborteddownload) if (cl.downloadmodel_current == 1) { // we now have the worldmodel so we can set up the game world + // or maybe we do not have it (cl_serverextension_download 0) + // then we need to continue loading ANYWAY! CL_SetupWorldModel(); if (!cl.loadfinished && cl_joinbeforedownloadsfinish.integer) { @@ -1149,7 +1171,7 @@ void CL_BeginDownloads_f(void) // prevent cl_begindownloads from being issued multiple times in one match // to prevent accidentally cancelled downloads if(cl.loadbegun) - Con_DPrintf("cl_begindownloads is only valid once per match\n"); + Con_Printf("cl_begindownloads is only valid once per match\n"); else CL_BeginDownloads(false); } @@ -1166,7 +1188,8 @@ void CL_StopDownload(int size, int crc) // save to disk only if we don't already have it // (this is mainly for playing back demos) existingcrc = FS_CRCFile(cls.qw_downloadname, &existingsize); - if (existingsize) + if (existingsize || gamemode == GAME_NEXUIZ || !strcmp(cls.qw_downloadname, csqc_progname.string)) + // let csprogs ALWAYS go to dlcache, to prevent "viral csprogs"; also, never put files outside dlcache for Nexuiz { if ((int)existingsize != size || existingcrc != crc) { @@ -1275,6 +1298,7 @@ void CL_DownloadBegin_f(void) void CL_StopDownload_f(void) { + Curl_CancelAll(); if (cls.qw_downloadname[0]) { Con_Printf("Download of %s aborted\n", cls.qw_downloadname); @@ -1331,7 +1355,8 @@ An svc_signonnum has been received, perform a client side setup */ static void CL_SignonReply (void) { - Con_DPrintf("CL_SignonReply: %i\n", cls.signon); + if (developer.integer >= 100) + Con_Printf("CL_SignonReply: %i\n", cls.signon); switch (cls.signon) { @@ -1516,6 +1541,10 @@ void CL_ParseServerInfo (void) // parse gametype cl.gametype = MSG_ReadByte (); + // the original id singleplayer demos are bugged and contain + // GAME_DEATHMATCH even for singleplayer + if (cl.maxclients == 1 && cls.protocol == PROTOCOL_QUAKE) + cl.gametype = GAME_COOP; // parse signon message str = MSG_ReadString (); @@ -1615,12 +1644,13 @@ void CL_ParseServerInfo (void) Con_Printf ("Auto-recording to %s.\n", demofile); - cls.demofile = FS_Open (demofile, "wb", false, false); + cls.demofile = FS_OpenRealFile(demofile, "wb", false); if (cls.demofile) { cls.forcetrack = -1; FS_Printf (cls.demofile, "%i\n", cls.forcetrack); cls.demorecording = true; + strlcpy(cls.demoname, demofile, sizeof(cls.demoname)); } else Con_Print ("ERROR: couldn't open.\n"); @@ -1629,7 +1659,7 @@ void CL_ParseServerInfo (void) void CL_ValidateState(entity_state_t *s) { - model_t *model; + dp_model_t *model; if (!s->active) return; @@ -1969,7 +1999,7 @@ void CL_ParseEffect2 (void) CL_Effect(org, modelindex, startframe, framecount, framerate); } -void CL_NewBeam (int ent, vec3_t start, vec3_t end, model_t *m, int lightning) +void CL_NewBeam (int ent, vec3_t start, vec3_t end, dp_model_t *m, int lightning) { int i; beam_t *b = NULL; @@ -2008,7 +2038,7 @@ void CL_NewBeam (int ent, vec3_t start, vec3_t end, model_t *m, int lightning) Con_Print("beam list overflow!\n"); } -void CL_ParseBeam (model_t *m, int lightning) +void CL_ParseBeam (dp_model_t *m, int lightning) { int ent; vec3_t start, end; @@ -2953,7 +2983,7 @@ static void CL_NetworkTimeReceived(double newtime) } // this packet probably contains a player entity update, so we will need // to update the prediction - cl.movement_needupdate = true; + cl.movement_replay = true; // this may get updated later in parsing by svc_clientdata cl.onground = false; // if true the cl.viewangles are interpolated from cl.mviewangles[] @@ -2965,7 +2995,7 @@ static void CL_NetworkTimeReceived(double newtime) VectorCopy(cl.mviewangles[0], cl.mviewangles[1]); } -#define SHOWNET(x) if(cl_shownet.integer==2)Con_Printf("%3i:%s\n", msg_readcount-1, x); +#define SHOWNET(x) if(cl_shownet.integer==2)Con_Printf("%3i:%s(%i)\n", msg_readcount-1, x, cmd); //[515]: csqc qboolean CL_VM_Parse_TempEntity (void); @@ -3327,14 +3357,20 @@ void CL_ParseServerMessage(void) EntityFrameQW_CL_ReadFrame(false); // first update is the final signon stage if (cls.signon == SIGNONS - 1) + { cls.signon = SIGNONS; + CL_SignonReply (); + } break; case qw_svc_deltapacketentities: EntityFrameQW_CL_ReadFrame(true); // first update is the final signon stage if (cls.signon == SIGNONS - 1) + { cls.signon = SIGNONS; + CL_SignonReply (); + } break; case qw_svc_maxspeed: @@ -3549,7 +3585,7 @@ void CL_ParseServerMessage(void) { if (i >= 1 && i < MAX_MODELS) { - model_t *model = Mod_ForName(s, false, false, i == 1); + dp_model_t *model = Mod_ForName(s, false, false, i == 1); if (!model) Con_DPrintf("svc_precache: Mod_ForName(\"%s\") failed\n", s); cl.model_precache[i] = model; @@ -3846,6 +3882,7 @@ void CL_Parse_Init(void) Cvar_RegisterVariable(&cl_nettimesyncboundmode); Cvar_RegisterVariable(&cl_nettimesyncboundtolerance); Cvar_RegisterVariable(&cl_iplog_name); + Cvar_RegisterVariable(&cl_readpicture_force); Cmd_AddCommand("nextul", QW_CL_NextUpload, "sends next fragment of current upload buffer (screenshot for example)"); Cmd_AddCommand("stopul", QW_CL_StopUpload, "aborts current upload (screenshot for example)");