X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=cl_parse.c;h=11688accf81d35dbab2065dbaee0c46f7f02a4b1;hb=544356c7bb6288760533142b8ab402f4d8d966ef;hp=d1009147abff537f9ad5187d9d4f2e010be0a90b;hpb=7d08a8ba9d7925d79b903a087b97357968e011de;p=xonotic%2Fdarkplaces.git diff --git a/cl_parse.c b/cl_parse.c index d1009147..11688acc 100644 --- a/cl_parse.c +++ b/cl_parse.c @@ -83,7 +83,7 @@ char *svc_strings[128] = "", // 47 "", // 48 "", // 49 - "svc_cgame", // 50 // [short] length [bytes] data + "svc_unusedlh1", // 50 // "svc_updatestatubyte", // 51 // [byte] stat [byte] value "svc_effect", // 52 // [vector] org [byte] modelindex [byte] startframe [byte] framecount [byte] framerate "svc_effect2", // 53 // [vector] org [short] modelindex [short] startframe [byte] framecount [byte] framerate @@ -157,6 +157,13 @@ char *qw_svc_strings[128] = cvar_t demo_nehahra = {0, "demo_nehahra", "0", "reads all quake demos as nehahra movie protocol"}; cvar_t developer_networkentities = {0, "developer_networkentities", "0", "prints received entities, value is 0-4 (higher for more info)"}; +cvar_t cl_sound_wizardhit = {0, "cl_sound_wizardhit", "wizard/hit.wav", "sound to play during TE_WIZSPIKE (empty cvar disables sound)"}; +cvar_t cl_sound_hknighthit = {0, "cl_sound_hknighthit", "hknight/hit.wav", "sound to play during TE_KNIGHTSPIKE (empty cvar disables sound)"}; +cvar_t cl_sound_tink1 = {0, "cl_sound_tink1", "weapons/tink1.wav", "sound to play with 80% chance during TE_SPIKE/TE_SUPERSPIKE (empty cvar disables sound)"}; +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_sound_r_exp3 = {0, "cl_sound_r_exp3", "weapons/r_exp3.wav", "sound to play during TE_EXPLOSION and related effects (empty cvar disables sound)"}; static qboolean QW_CL_CheckOrDownloadFile(const char *filename); static void QW_CL_RequestNextDownload(void); @@ -334,15 +341,15 @@ void CL_ParseEntityLump(char *entdata) else if (!strcmp("qlsky", key)) // non-standard, introduced by QuakeLives (EEK) R_SetSkyBox(value); else if (!strcmp("fog", key)) - sscanf(value, "%f %f %f %f", &fog_density, &fog_red, &fog_green, &fog_blue); + sscanf(value, "%f %f %f %f", &r_refdef.fog_density, &r_refdef.fog_red, &r_refdef.fog_green, &r_refdef.fog_blue); else if (!strcmp("fog_density", key)) - fog_density = atof(value); + r_refdef.fog_density = atof(value); else if (!strcmp("fog_red", key)) - fog_red = atof(value); + r_refdef.fog_red = atof(value); else if (!strcmp("fog_green", key)) - fog_green = atof(value); + r_refdef.fog_green = atof(value); else if (!strcmp("fog_blue", key)) - fog_blue = atof(value); + r_refdef.fog_blue = atof(value); } } @@ -384,6 +391,7 @@ static qboolean QW_CL_CheckOrDownloadFile(const char *filename) cls.qw_downloadnumber++; cls.qw_downloadpercent = 0; + cls.qw_downloadmemorycursize = 0; return false; } @@ -483,11 +491,12 @@ static void QW_CL_RequestNextDownload(void) // now that we have a world model, set up the world entity, renderer // modules and csqc - cl_entities[0].render.model = cl.worldmodel = cl.model_precache[1]; - CL_BoundingBoxForEntity(&cl_entities[0].render); + cl.entities[0].render.model = cl.worldmodel = cl.model_precache[1]; + CL_BoundingBoxForEntity(&cl.entities[0].render); R_Modules_NewMap(); - CL_CGVM_Start(); + + // TODO: add pmodel/emodel player.mdl/eyes.mdl CRCs to userinfo // done checking sounds and models, send a prespawn command now MSG_WriteByte(&cls.netcon->message, qw_clc_stringcmd); @@ -520,13 +529,13 @@ static void QW_CL_RequestNextDownload(void) S_ServerSounds(cl.sound_name, cls.qw_downloadnumber); // precache any sounds used by the client - cl.sfx_wizhit = S_PrecacheSound("sound/wizard/hit.wav", false, true); - cl.sfx_knighthit = S_PrecacheSound("sound/hknight/hit.wav", false, true); - cl.sfx_tink1 = S_PrecacheSound("sound/weapons/tink1.wav", false, true); - cl.sfx_ric1 = S_PrecacheSound("sound/weapons/ric1.wav", false, true); - cl.sfx_ric2 = S_PrecacheSound("sound/weapons/ric2.wav", false, true); - cl.sfx_ric3 = S_PrecacheSound("sound/weapons/ric3.wav", false, true); - cl.sfx_r_exp3 = S_PrecacheSound("sound/weapons/r_exp3.wav", false, true); + cl.sfx_wizhit = S_PrecacheSound(cl_sound_wizardhit.string, false, true); + cl.sfx_knighthit = S_PrecacheSound(cl_sound_hknighthit.string, false, true); + cl.sfx_tink1 = S_PrecacheSound(cl_sound_tink1.string, false, true); + cl.sfx_ric1 = S_PrecacheSound(cl_sound_ric1.string, false, true); + cl.sfx_ric2 = S_PrecacheSound(cl_sound_ric2.string, false, true); + cl.sfx_ric3 = S_PrecacheSound(cl_sound_ric3.string, false, true); + cl.sfx_r_exp3 = S_PrecacheSound(cl_sound_r_exp3.string, false, true); // sounds for (i = 1;i < MAX_SOUNDS && cl.sound_name[i][0];i++) @@ -580,7 +589,7 @@ static void QW_CL_ParseDownload(void) while (cls.qw_downloadmemorymaxsize < cls.qw_downloadmemorycursize + size) cls.qw_downloadmemorymaxsize *= 2; old = cls.qw_downloadmemory; - cls.qw_downloadmemory = Mem_Alloc(cl_mempool, cls.qw_downloadmemorymaxsize); + cls.qw_downloadmemory = (unsigned char *)Mem_Alloc(cls.permanentmempool, cls.qw_downloadmemorymaxsize); if (old) { memcpy(cls.qw_downloadmemory, old, cls.qw_downloadmemorycursize); @@ -742,7 +751,7 @@ void QW_CL_StartUpload(unsigned char *data, int size) Con_DPrintf("Starting upload of %d bytes...\n", size); - cls.qw_uploaddata = Mem_Alloc(cl_mempool, size); + cls.qw_uploaddata = (unsigned char *)Mem_Alloc(cls.permanentmempool, size); memcpy(cls.qw_uploaddata, data, size); cls.qw_uploadsize = size; cls.qw_uploadpos = 0; @@ -853,7 +862,7 @@ static void QW_CL_ParseNails(void) } } -static void QW_CL_UpdateItemsAndWeapon(void) +static void CL_UpdateItemsAndWeapon(void) { int j; // check for important changes @@ -950,7 +959,6 @@ void CL_ParseServerInfo (void) int i; protocolversion_t protocol; int nummodels, numsounds; - entity_t *ent; Con_DPrint("Serverinfo packet received.\n"); @@ -980,7 +988,7 @@ void CL_ParseServerInfo (void) cls.protocol = protocol; Con_DPrintf("Server protocol is %s\n", Protocol_NameForEnum(cls.protocol)); - cl_num_entities = 1; + cl.num_entities = 1; if (protocol == PROTOCOL_QUAKEWORLD) { @@ -1011,7 +1019,7 @@ void CL_ParseServerInfo (void) i = MSG_ReadByte(); cl.qw_spectator = (i & 128) != 0; cl.playerentity = cl.viewentity = (i & 127) + 1; - cl.scores = (scoreboard_t *)Mem_Alloc(cl_mempool, cl.maxclients*sizeof(*cl.scores)); + cl.scores = (scoreboard_t *)Mem_Alloc(cls.levelmempool, cl.maxclients*sizeof(*cl.scores)); // get the full level name str = MSG_ReadString (); @@ -1054,7 +1062,7 @@ void CL_ParseServerInfo (void) Host_Error("Bad maxclients (%u) from server", cl.maxclients); return; } - cl.scores = (scoreboard_t *)Mem_Alloc(cl_mempool, cl.maxclients*sizeof(*cl.scores)); + cl.scores = (scoreboard_t *)Mem_Alloc(cls.levelmempool, cl.maxclients*sizeof(*cl.scores)); // parse gametype cl.gametype = MSG_ReadByte (); @@ -1112,13 +1120,13 @@ void CL_ParseServerInfo (void) S_ServerSounds (cl.sound_name, numsounds); // precache any sounds used by the client - cl.sfx_wizhit = S_PrecacheSound("sound/wizard/hit.wav", false, true); - cl.sfx_knighthit = S_PrecacheSound("sound/hknight/hit.wav", false, true); - cl.sfx_tink1 = S_PrecacheSound("sound/weapons/tink1.wav", false, true); - cl.sfx_ric1 = S_PrecacheSound("sound/weapons/ric1.wav", false, true); - cl.sfx_ric2 = S_PrecacheSound("sound/weapons/ric2.wav", false, true); - cl.sfx_ric3 = S_PrecacheSound("sound/weapons/ric3.wav", false, true); - cl.sfx_r_exp3 = S_PrecacheSound("sound/weapons/r_exp3.wav", false, true); + cl.sfx_wizhit = S_PrecacheSound(cl_sound_wizardhit.string, false, true); + cl.sfx_knighthit = S_PrecacheSound(cl_sound_hknighthit.string, false, true); + cl.sfx_tink1 = S_PrecacheSound(cl_sound_tink1.string, false, true); + cl.sfx_ric1 = S_PrecacheSound(cl_sound_ric1.string, false, true); + cl.sfx_ric2 = S_PrecacheSound(cl_sound_ric2.string, false, true); + cl.sfx_ric3 = S_PrecacheSound(cl_sound_ric3.string, false, true); + cl.sfx_r_exp3 = S_PrecacheSound(cl_sound_r_exp3.string, false, true); // now we try to load everything that is new @@ -1145,10 +1153,9 @@ void CL_ParseServerInfo (void) } // we now have the worldmodel so we can set up the game world - ent->render.model = cl.worldmodel = cl.model_precache[1]; - CL_BoundingBoxForEntity(&ent->render); + cl.entities[0].render.model = cl.worldmodel = cl.model_precache[1]; + CL_BoundingBoxForEntity(&cl.entities[0].render); R_Modules_NewMap(); - CL_CGVM_Start(); } // check memory integrity @@ -1208,9 +1215,11 @@ void CL_MoveLerpEntityStates(entity_t *ent) ent->persistent.muzzleflash = 0; VectorCopy(ent->state_current.origin, ent->persistent.trail_origin); } - else if (cls.timedemo || cl_nolerp.integer || DotProduct(odelta, odelta) > 1000*1000) + else if (cls.timedemo || cl_nolerp.integer || DotProduct(odelta, odelta) > 1000*1000 || (cl.fixangle[0] && !cl.fixangle[1])) { // don't interpolate the move + // (the fixangle[] check detects teleports, but not constant fixangles + // such as when spectating) ent->persistent.lerpdeltatime = 0; ent->persistent.lerpstarttime = cl.mtime[1]; VectorCopy(ent->state_current.origin, ent->persistent.oldorigin); @@ -1290,7 +1299,7 @@ Server information pertaining to this client only */ void CL_ParseClientdata (void) { - int i, j, bits; + int i, bits; VectorCopy (cl.mpunchangle[0], cl.mpunchangle[1]); VectorCopy (cl.mpunchvector[0], cl.mpunchvector[1]); @@ -1398,20 +1407,6 @@ void CL_ParseClientdata (void) cl.stats[STAT_VIEWZOOM] = (unsigned short) MSG_ReadShort(); } - // check for important changes - - // set flash times - if (cl.olditems != cl.stats[STAT_ITEMS]) - for (j = 0;j < 32;j++) - if ((cl.stats[STAT_ITEMS] & (1<= cl_max_static_entities) + if (cl.num_static_entities >= cl.max_static_entities) Host_Error ("Too many static entities"); - ent = &cl_static_entities[cl_num_static_entities++]; + ent = &cl.static_entities[cl.num_static_entities++]; CL_ParseBaseline (ent, large); // copy it to the current state @@ -1451,7 +1446,7 @@ void CL_ParseStatic (int large) // This is definitely cheating... if (ent->render.model == NULL) - cl_num_static_entities--; + cl.num_static_entities--; } /* @@ -1519,22 +1514,23 @@ void CL_ParseBeam (model_t *m, int lightning) ent = 0; } - if (ent >= cl_max_entities) + if (ent >= cl.max_entities) CL_ExpandEntities(ent); // override any beam with the same entity - i = cl_max_beams; + i = cl.max_beams; if (ent) - for (i = 0, b = cl_beams;i < cl_max_beams;i++, b++) + for (i = 0, b = cl.beams;i < cl.max_beams;i++, b++) if (b->entity == ent) break; // if the entity was not found then just replace an unused beam - if (i == cl_max_beams) - for (i = 0, b = cl_beams;i < cl_max_beams;i++, b++) + if (i == cl.max_beams) + for (i = 0, b = cl.beams;i < cl.max_beams;i++, b++) if (!b->model || b->endtime < cl.time) break; - if (i < cl_max_beams) + if (i < cl.max_beams) { + cl.num_beams = max(cl.num_beams, i + 1); b->entity = ent; b->lightning = lightning; b->model = m; @@ -1542,14 +1538,14 @@ void CL_ParseBeam (model_t *m, int lightning) VectorCopy (start, b->start); VectorCopy (end, b->end); b->relativestartvalid = 0; - if (ent && cl_entities[ent].state_current.active) + if (ent && cl.entities[ent].state_current.active) { entity_state_t *p; matrix4x4_t matrix, imatrix; if (ent == cl.viewentity && cl.movement) - p = &cl_entities[b->entity].state_previous; + p = &cl.entities[b->entity].state_previous; else - p = &cl_entities[b->entity].state_current; + p = &cl.entities[b->entity].state_current; // not really valid yet, we need to get the orientation now // (ParseBeam flagged this because it is received before // entities are received, by now they have been received) @@ -1571,9 +1567,9 @@ void CL_ParseBeam (model_t *m, int lightning) void CL_ParseTempEntity(void) { int type; - vec3_t pos; + vec3_t pos, pos2; + vec3_t vel1, vel2; vec3_t dir; - vec3_t pos2; vec3_t color; int rnd; int colorStart, colorLength, count; @@ -1590,9 +1586,7 @@ void CL_ParseTempEntity(void) // spike hitting wall MSG_ReadVector(pos, cls.protocol); CL_FindNonSolidLocation(pos, pos, 4); - Matrix4x4_CreateTranslate(&tempmatrix, pos[0], pos[1], pos[2]); - //CL_AllocDlight(NULL, &tempmatrix, 100, 0.12f, 0.50f, 0.12f, 500, 0.2, 0, -1, false, 1, 0.25, 1, 0, 0, LIGHTFLAG_NORMALMODE | LIGHTFLAG_REALTIMEMODE); - CL_RunParticleEffect(pos, vec3_origin, 20, 30); + CL_ParticleEffect(EFFECT_TE_WIZSPIKE, 1, pos, pos, vec3_origin, vec3_origin, NULL, 0); S_StartSound(-1, 0, cl.sfx_wizhit, pos, 1, 1); break; @@ -1600,9 +1594,7 @@ void CL_ParseTempEntity(void) // spike hitting wall MSG_ReadVector(pos, cls.protocol); CL_FindNonSolidLocation(pos, pos, 4); - Matrix4x4_CreateTranslate(&tempmatrix, pos[0], pos[1], pos[2]); - //CL_AllocDlight(NULL, &tempmatrix, 100, 0.50f, 0.30f, 0.10f, 500, 0.2, 0, -1, false, 1, 0.25, 1, 0, 0, LIGHTFLAG_NORMALMODE | LIGHTFLAG_REALTIMEMODE); - CL_RunParticleEffect(pos, vec3_origin, 226, 20); + CL_ParticleEffect(EFFECT_TE_KNIGHTSPIKE, 1, pos, pos, vec3_origin, vec3_origin, NULL, 0); S_StartSound(-1, 0, cl.sfx_knighthit, pos, 1, 1); break; @@ -1610,14 +1602,7 @@ void CL_ParseTempEntity(void) // spike hitting wall MSG_ReadVector(pos, cls.protocol); CL_FindNonSolidLocation(pos, pos, 4); - if (cl_particles_quake.integer) - CL_RunParticleEffect(pos, vec3_origin, 0, 10); - else if (cl_particles_bulletimpacts.integer) - { - CL_SparkShower(pos, vec3_origin, 15, 1, 0); - CL_Smoke(pos, vec3_origin, 15, 0); - } - CL_BulletMark(pos); + CL_ParticleEffect(EFFECT_TE_SPIKE, 1, pos, pos, vec3_origin, vec3_origin, NULL, 0); if (rand() % 5) S_StartSound(-1, 0, cl.sfx_tink1, pos, 1, 1); else @@ -1635,14 +1620,7 @@ void CL_ParseTempEntity(void) // super spike hitting wall MSG_ReadVector(pos, cls.protocol); CL_FindNonSolidLocation(pos, pos, 4); - if (cl_particles_quake.integer) - CL_RunParticleEffect(pos, vec3_origin, 0, 20); - else if (cl_particles_bulletimpacts.integer) - { - CL_SparkShower(pos, vec3_origin, 30, 1, 0); - CL_Smoke(pos, vec3_origin, 30, 0); - } - CL_BulletMark(pos); + CL_ParticleEffect(EFFECT_TE_SUPERSPIKE, 1, pos, pos, vec3_origin, vec3_origin, NULL, 0); if (rand() % 5) S_StartSound(-1, 0, cl.sfx_tink1, pos, 1, 1); else @@ -1661,12 +1639,8 @@ void CL_ParseTempEntity(void) // rocket explosion MSG_ReadVector(pos, cls.protocol); CL_FindNonSolidLocation(pos, pos, 10); - CL_ParticleExplosion(pos); - // LordHavoc: boosted color from 1.0, 0.8, 0.4 to 1.25, 1.0, 0.5 - Matrix4x4_CreateTranslate(&tempmatrix, pos[0], pos[1], pos[2]); - CL_AllocDlight(NULL, &tempmatrix, 350, 4.0f, 2.0f, 0.50f, 700, 0.5, 0, -1, true, 1, 0.25, 0.25, 1, 1, LIGHTFLAG_NORMALMODE | LIGHTFLAG_REALTIMEMODE); - if (gamemode != GAME_NEXUIZ) - S_StartSound(-1, 0, cl.sfx_r_exp3, pos, 1, 1); + CL_ParticleEffect(EFFECT_TE_EXPLOSION, 1, pos, pos, vec3_origin, vec3_origin, NULL, 0); + S_StartSound(-1, 0, cl.sfx_r_exp3, pos, 1, 1); CL_Effect(pos, cl.qw_modelindex_s_explod, 0, 6, 10); break; @@ -1674,12 +1648,8 @@ void CL_ParseTempEntity(void) // tarbaby explosion MSG_ReadVector(pos, cls.protocol); CL_FindNonSolidLocation(pos, pos, 10); - CL_BlobExplosion(pos); - - if (gamemode != GAME_NEXUIZ) - S_StartSound(-1, 0, cl.sfx_r_exp3, pos, 1, 1); - Matrix4x4_CreateTranslate(&tempmatrix, pos[0], pos[1], pos[2]); - CL_AllocDlight(NULL, &tempmatrix, 600, 1.6f, 0.8f, 2.0f, 1200, 0.5, 0, -1, true, 1, 0.25, 0.25, 1, 1, LIGHTFLAG_NORMALMODE | LIGHTFLAG_REALTIMEMODE); + CL_ParticleEffect(EFFECT_TE_TAREXPLOSION, 1, pos, pos, vec3_origin, vec3_origin, NULL, 0); + S_StartSound(-1, 0, cl.sfx_r_exp3, pos, 1, 1); break; case QW_TE_LIGHTNING1: @@ -1699,14 +1669,12 @@ void CL_ParseTempEntity(void) case QW_TE_LAVASPLASH: MSG_ReadVector(pos, cls.protocol); - CL_LavaSplash(pos); + CL_ParticleEffect(EFFECT_TE_LAVASPLASH, 1, pos, pos, vec3_origin, vec3_origin, NULL, 0); break; case QW_TE_TELEPORT: MSG_ReadVector(pos, cls.protocol); - Matrix4x4_CreateTranslate(&tempmatrix, pos[0], pos[1], pos[2]); - CL_AllocDlight(NULL, &tempmatrix, 200, 1.0f, 1.0f, 1.0f, 600, 99.0f, 0, -1, true, 1, 0.25, 1, 0, 0, LIGHTFLAG_NORMALMODE | LIGHTFLAG_REALTIMEMODE); - CL_TeleportSplash(pos); + CL_ParticleEffect(EFFECT_TE_TELEPORT, 1, pos, pos, vec3_origin, vec3_origin, NULL, 0); break; case QW_TE_GUNSHOT: @@ -1714,28 +1682,22 @@ void CL_ParseTempEntity(void) radius = MSG_ReadByte(); MSG_ReadVector(pos, cls.protocol); CL_FindNonSolidLocation(pos, pos, 4); - if (cl_particles_quake.integer) - CL_RunParticleEffect(pos, vec3_origin, 0, 20*radius); - else - { - CL_SparkShower(pos, vec3_origin, 15*radius, 1, radius); - CL_Smoke(pos, vec3_origin, 15*radius, radius); - } - // TODO: scatter bullet marks throughout the sphere? - CL_BulletMark(pos); + VectorSet(pos2, pos[0] + radius, pos[1] + radius, pos[2] + radius); + VectorSet(pos, pos[0] - radius, pos[1] - radius, pos[2] - radius); + CL_ParticleEffect(EFFECT_TE_GUNSHOT, radius, pos, pos2, vec3_origin, vec3_origin, NULL, 0); break; case QW_TE_BLOOD: count = MSG_ReadByte(); MSG_ReadVector(pos, cls.protocol); CL_FindNonSolidLocation(pos, pos, 4); - CL_BloodPuff(pos, vec3_origin, 20*count); + CL_ParticleEffect(EFFECT_TE_BLOOD, count, pos, pos, vec3_origin, vec3_origin, NULL, 0); break; case QW_TE_LIGHTNINGBLOOD: MSG_ReadVector(pos, cls.protocol); CL_FindNonSolidLocation(pos, pos, 4); - CL_BloodPuff(pos, vec3_origin, 50); + CL_ParticleEffect(EFFECT_TE_BLOOD, 2.5, pos, pos, vec3_origin, vec3_origin, NULL, 0); break; default: @@ -1751,9 +1713,7 @@ void CL_ParseTempEntity(void) // spike hitting wall MSG_ReadVector(pos, cls.protocol); CL_FindNonSolidLocation(pos, pos, 4); - Matrix4x4_CreateTranslate(&tempmatrix, pos[0], pos[1], pos[2]); - //CL_AllocDlight(NULL, &tempmatrix, 100, 0.12f, 0.50f, 0.12f, 500, 0.2, 0, -1, false, 1, 0.25, 1, 0, 0, LIGHTFLAG_NORMALMODE | LIGHTFLAG_REALTIMEMODE); - CL_RunParticleEffect(pos, vec3_origin, 20, 30); + CL_ParticleEffect(EFFECT_TE_WIZSPIKE, 1, pos, pos, vec3_origin, vec3_origin, NULL, 0); S_StartSound(-1, 0, cl.sfx_wizhit, pos, 1, 1); break; @@ -1761,9 +1721,7 @@ void CL_ParseTempEntity(void) // spike hitting wall MSG_ReadVector(pos, cls.protocol); CL_FindNonSolidLocation(pos, pos, 4); - Matrix4x4_CreateTranslate(&tempmatrix, pos[0], pos[1], pos[2]); - //CL_AllocDlight(NULL, &tempmatrix, 100, 0.50f, 0.30f, 0.10f, 500, 0.2, 0, -1, false, 1, 0.25, 1, 0, 0, LIGHTFLAG_NORMALMODE | LIGHTFLAG_REALTIMEMODE); - CL_RunParticleEffect(pos, vec3_origin, 226, 20); + CL_ParticleEffect(EFFECT_TE_KNIGHTSPIKE, 1, pos, pos, vec3_origin, vec3_origin, NULL, 0); S_StartSound(-1, 0, cl.sfx_knighthit, pos, 1, 1); break; @@ -1771,14 +1729,7 @@ void CL_ParseTempEntity(void) // spike hitting wall MSG_ReadVector(pos, cls.protocol); CL_FindNonSolidLocation(pos, pos, 4); - if (cl_particles_quake.integer) - CL_RunParticleEffect(pos, vec3_origin, 0, 10); - else if (cl_particles_bulletimpacts.integer) - { - CL_SparkShower(pos, vec3_origin, 15, 1, 0); - CL_Smoke(pos, vec3_origin, 15, 0); - } - CL_BulletMark(pos); + CL_ParticleEffect(EFFECT_TE_SPIKE, 1, pos, pos, vec3_origin, vec3_origin, NULL, 0); if (rand() % 5) S_StartSound(-1, 0, cl.sfx_tink1, pos, 1, 1); else @@ -1796,16 +1747,7 @@ void CL_ParseTempEntity(void) // quad spike hitting wall MSG_ReadVector(pos, cls.protocol); CL_FindNonSolidLocation(pos, pos, 4); - if (cl_particles_quake.integer) - CL_RunParticleEffect(pos, vec3_origin, 0, 10); - else if (cl_particles_bulletimpacts.integer) - { - CL_SparkShower(pos, vec3_origin, 15, 1, 0); - CL_Smoke(pos, vec3_origin, 15, 0); - } - CL_BulletMark(pos); - Matrix4x4_CreateTranslate(&tempmatrix, pos[0], pos[1], pos[2]); - CL_AllocDlight(NULL, &tempmatrix, 100, 0.15f, 0.15f, 1.5f, 500, 0.2, 0, -1, true, 1, 0.25, 1, 0, 0, LIGHTFLAG_NORMALMODE | LIGHTFLAG_REALTIMEMODE); + CL_ParticleEffect(EFFECT_TE_SPIKEQUAD, 1, pos, pos, vec3_origin, vec3_origin, NULL, 0); if (rand() % 5) S_StartSound(-1, 0, cl.sfx_tink1, pos, 1, 1); else @@ -1823,14 +1765,7 @@ void CL_ParseTempEntity(void) // super spike hitting wall MSG_ReadVector(pos, cls.protocol); CL_FindNonSolidLocation(pos, pos, 4); - if (cl_particles_quake.integer) - CL_RunParticleEffect(pos, vec3_origin, 0, 20); - else if (cl_particles_bulletimpacts.integer) - { - CL_SparkShower(pos, vec3_origin, 30, 1, 0); - CL_Smoke(pos, vec3_origin, 30, 0); - } - CL_BulletMark(pos); + CL_ParticleEffect(EFFECT_TE_SUPERSPIKE, 1, pos, pos, vec3_origin, vec3_origin, NULL, 0); if (rand() % 5) S_StartSound(-1, 0, cl.sfx_tink1, pos, 1, 1); else @@ -1848,16 +1783,7 @@ void CL_ParseTempEntity(void) // quad super spike hitting wall MSG_ReadVector(pos, cls.protocol); CL_FindNonSolidLocation(pos, pos, 4); - if (cl_particles_quake.integer) - CL_RunParticleEffect(pos, vec3_origin, 0, 20); - else if (cl_particles_bulletimpacts.integer) - { - CL_SparkShower(pos, vec3_origin, 30, 1, 0); - CL_Smoke(pos, vec3_origin, 30, 0); - } - CL_BulletMark(pos); - Matrix4x4_CreateTranslate(&tempmatrix, pos[0], pos[1], pos[2]); - CL_AllocDlight(NULL, &tempmatrix, 100, 0.15f, 0.15f, 1.5f, 500, 0.2, 0, -1, true, 1, 0.25, 1, 0, 0, LIGHTFLAG_NORMALMODE | LIGHTFLAG_REALTIMEMODE); + CL_ParticleEffect(EFFECT_TE_SUPERSPIKEQUAD, 1, pos, pos, vec3_origin, vec3_origin, NULL, 0); if (rand() % 5) S_StartSound(-1, 0, cl.sfx_tink1, pos, 1, 1); else @@ -1880,7 +1806,7 @@ void CL_ParseTempEntity(void) dir[1] = MSG_ReadChar(); dir[2] = MSG_ReadChar(); count = MSG_ReadByte(); - CL_BloodPuff(pos, dir, count); + CL_ParticleEffect(EFFECT_TE_BLOOD, count, pos, pos, dir, dir, NULL, 0); break; case TE_SPARK: // spark shower @@ -1890,14 +1816,12 @@ void CL_ParseTempEntity(void) dir[1] = MSG_ReadChar(); dir[2] = MSG_ReadChar(); count = MSG_ReadByte(); - CL_SparkShower(pos, dir, count, 1, 0); + CL_ParticleEffect(EFFECT_TE_SPARK, count, pos, pos, dir, dir, NULL, 0); break; case TE_PLASMABURN: MSG_ReadVector(pos, cls.protocol); CL_FindNonSolidLocation(pos, pos, 4); - Matrix4x4_CreateTranslate(&tempmatrix, pos[0], pos[1], pos[2]); - CL_AllocDlight(NULL, &tempmatrix, 200, 1, 1, 1, 1000, 0.2, 0, -1, true, 1, 0.25, 1, 0, 0, LIGHTFLAG_NORMALMODE | LIGHTFLAG_REALTIMEMODE); - CL_PlasmaBurn(pos); + CL_ParticleEffect(EFFECT_TE_PLASMABURN, 1, pos, pos, vec3_origin, vec3_origin, NULL, 0); break; // LordHavoc: added for improved gore case TE_BLOODSHOWER: @@ -1906,8 +1830,15 @@ void CL_ParseTempEntity(void) MSG_ReadVector(pos2, cls.protocol); // maxs velspeed = MSG_ReadCoord(cls.protocol); // speed count = (unsigned short) MSG_ReadShort(); // number of particles - CL_BloodShower(pos, pos2, velspeed, count); + vel1[0] = -velspeed; + vel1[1] = -velspeed; + vel1[2] = -velspeed; + vel2[0] = velspeed; + vel2[1] = velspeed; + vel2[2] = velspeed; + CL_ParticleEffect(EFFECT_TE_BLOOD, count, pos, pos2, vel1, vel2, NULL, 0); break; + case TE_PARTICLECUBE: // general purpose particle effect MSG_ReadVector(pos, cls.protocol); // mins @@ -1917,7 +1848,7 @@ void CL_ParseTempEntity(void) colorStart = MSG_ReadByte(); // color colorLength = MSG_ReadByte(); // gravity (1 or 0) velspeed = MSG_ReadCoord(cls.protocol); // randomvel - CL_ParticleCube(pos, pos2, dir, count, colorStart, colorLength, velspeed); + CL_ParticleCube(pos, pos2, dir, count, colorStart, colorLength != 0, velspeed); break; case TE_PARTICLERAIN: @@ -1944,67 +1875,43 @@ void CL_ParseTempEntity(void) // bullet hitting wall MSG_ReadVector(pos, cls.protocol); CL_FindNonSolidLocation(pos, pos, 4); - if (cl_particles_quake.integer) - CL_RunParticleEffect(pos, vec3_origin, 0, 20); - else - { - CL_SparkShower(pos, vec3_origin, 15, 1, 0); - CL_Smoke(pos, vec3_origin, 15, 0); - } - CL_BulletMark(pos); + CL_ParticleEffect(EFFECT_TE_GUNSHOT, 1, pos, pos, vec3_origin, vec3_origin, NULL, 0); break; case TE_GUNSHOTQUAD: // quad bullet hitting wall MSG_ReadVector(pos, cls.protocol); CL_FindNonSolidLocation(pos, pos, 4); - if (cl_particles_quake.integer) - CL_RunParticleEffect(pos, vec3_origin, 0, 20); - else - { - CL_SparkShower(pos, vec3_origin, 15, 1, 0); - CL_Smoke(pos, vec3_origin, 15, 0); - } - CL_BulletMark(pos); - Matrix4x4_CreateTranslate(&tempmatrix, pos[0], pos[1], pos[2]); - CL_AllocDlight(NULL, &tempmatrix, 100, 0.15f, 0.15f, 1.5f, 500, 0.2, 0, -1, true, 1, 0.25, 1, 0, 0, LIGHTFLAG_NORMALMODE | LIGHTFLAG_REALTIMEMODE); + CL_ParticleEffect(EFFECT_TE_GUNSHOTQUAD, 1, pos, pos, vec3_origin, vec3_origin, NULL, 0); break; case TE_EXPLOSION: // rocket explosion MSG_ReadVector(pos, cls.protocol); CL_FindNonSolidLocation(pos, pos, 10); - CL_ParticleExplosion(pos); - // LordHavoc: boosted color from 1.0, 0.8, 0.4 to 1.25, 1.0, 0.5 - Matrix4x4_CreateTranslate(&tempmatrix, pos[0], pos[1], pos[2]); - CL_AllocDlight(NULL, &tempmatrix, 350, 4.0f, 2.0f, 0.50f, 700, 0.5, 0, -1, true, 1, 0.25, 0.25, 1, 1, LIGHTFLAG_NORMALMODE | LIGHTFLAG_REALTIMEMODE); - if (gamemode != GAME_NEXUIZ) - S_StartSound(-1, 0, cl.sfx_r_exp3, pos, 1, 1); + CL_ParticleEffect(EFFECT_TE_EXPLOSION, 1, pos, pos, vec3_origin, vec3_origin, NULL, 0); + S_StartSound(-1, 0, cl.sfx_r_exp3, pos, 1, 1); break; case TE_EXPLOSIONQUAD: // quad rocket explosion MSG_ReadVector(pos, cls.protocol); CL_FindNonSolidLocation(pos, pos, 10); - CL_ParticleExplosion(pos); - Matrix4x4_CreateTranslate(&tempmatrix, pos[0], pos[1], pos[2]); - CL_AllocDlight(NULL, &tempmatrix, 350, 2.5f, 2.0f, 4.0f, 700, 0.5, 0, -1, true, 1, 0.25, 0.25, 1, 1, LIGHTFLAG_NORMALMODE | LIGHTFLAG_REALTIMEMODE); - if (gamemode != GAME_NEXUIZ) - S_StartSound(-1, 0, cl.sfx_r_exp3, pos, 1, 1); + CL_ParticleEffect(EFFECT_TE_EXPLOSIONQUAD, 1, pos, pos, vec3_origin, vec3_origin, NULL, 0); + S_StartSound(-1, 0, cl.sfx_r_exp3, pos, 1, 1); break; case TE_EXPLOSION3: // Nehahra movie colored lighting explosion MSG_ReadVector(pos, cls.protocol); CL_FindNonSolidLocation(pos, pos, 10); - CL_ParticleExplosion(pos); - Matrix4x4_CreateTranslate(&tempmatrix, pos[0], pos[1], pos[2]); color[0] = MSG_ReadCoord(cls.protocol) * (2.0f / 1.0f); color[1] = MSG_ReadCoord(cls.protocol) * (2.0f / 1.0f); color[2] = MSG_ReadCoord(cls.protocol) * (2.0f / 1.0f); + CL_ParticleExplosion(pos); + Matrix4x4_CreateTranslate(&tempmatrix, pos[0], pos[1], pos[2]); CL_AllocDlight(NULL, &tempmatrix, 350, color[0], color[1], color[2], 700, 0.5, 0, -1, true, 1, 0.25, 0.25, 1, 1, LIGHTFLAG_NORMALMODE | LIGHTFLAG_REALTIMEMODE); - if (gamemode != GAME_NEXUIZ) - S_StartSound(-1, 0, cl.sfx_r_exp3, pos, 1, 1); + S_StartSound(-1, 0, cl.sfx_r_exp3, pos, 1, 1); break; case TE_EXPLOSIONRGB: @@ -2017,27 +1924,21 @@ void CL_ParseTempEntity(void) color[2] = MSG_ReadByte() * (2.0f / 255.0f); Matrix4x4_CreateTranslate(&tempmatrix, pos[0], pos[1], pos[2]); CL_AllocDlight(NULL, &tempmatrix, 350, color[0], color[1], color[2], 700, 0.5, 0, -1, true, 1, 0.25, 0.25, 1, 1, LIGHTFLAG_NORMALMODE | LIGHTFLAG_REALTIMEMODE); - if (gamemode != GAME_NEXUIZ) - S_StartSound(-1, 0, cl.sfx_r_exp3, pos, 1, 1); + S_StartSound(-1, 0, cl.sfx_r_exp3, pos, 1, 1); break; case TE_TAREXPLOSION: // tarbaby explosion MSG_ReadVector(pos, cls.protocol); CL_FindNonSolidLocation(pos, pos, 10); - CL_BlobExplosion(pos); - - if (gamemode != GAME_NEXUIZ) - S_StartSound(-1, 0, cl.sfx_r_exp3, pos, 1, 1); - Matrix4x4_CreateTranslate(&tempmatrix, pos[0], pos[1], pos[2]); - CL_AllocDlight(NULL, &tempmatrix, 600, 1.6f, 0.8f, 2.0f, 1200, 0.5, 0, -1, true, 1, 0.25, 0.25, 1, 1, LIGHTFLAG_NORMALMODE | LIGHTFLAG_REALTIMEMODE); + CL_ParticleEffect(EFFECT_TE_TAREXPLOSION, 1, pos, pos, vec3_origin, vec3_origin, NULL, 0); + S_StartSound(-1, 0, cl.sfx_r_exp3, pos, 1, 1); break; case TE_SMALLFLASH: MSG_ReadVector(pos, cls.protocol); CL_FindNonSolidLocation(pos, pos, 10); - Matrix4x4_CreateTranslate(&tempmatrix, pos[0], pos[1], pos[2]); - CL_AllocDlight(NULL, &tempmatrix, 200, 2, 2, 2, 1000, 0.2, 0, -1, true, 1, 0.25, 1, 0, 0, LIGHTFLAG_NORMALMODE | LIGHTFLAG_REALTIMEMODE); + CL_ParticleEffect(EFFECT_TE_SMALLFLASH, 1, pos, pos, vec3_origin, vec3_origin, NULL, 0); break; case TE_CUSTOMFLASH: @@ -2056,7 +1957,7 @@ void CL_ParseTempEntity(void) MSG_ReadVector(pos, cls.protocol); MSG_ReadVector(dir, cls.protocol); count = MSG_ReadByte(); - CL_Flames(pos, dir, count); + CL_ParticleEffect(EFFECT_TE_FLAMEJET, count, pos, pos, dir, dir, NULL, 0); break; case TE_LIGHTNING1: @@ -2088,14 +1989,12 @@ void CL_ParseTempEntity(void) case TE_LAVASPLASH: MSG_ReadVector(pos, cls.protocol); - CL_LavaSplash(pos); + CL_ParticleEffect(EFFECT_TE_LAVASPLASH, 1, pos, pos, vec3_origin, vec3_origin, NULL, 0); break; case TE_TELEPORT: MSG_ReadVector(pos, cls.protocol); - Matrix4x4_CreateTranslate(&tempmatrix, pos[0], pos[1], pos[2]); - CL_AllocDlight(NULL, &tempmatrix, 200, 1.0f, 1.0f, 1.0f, 600, 99.0f, 0, -1, true, 1, 0.25, 1, 0, 0, LIGHTFLAG_NORMALMODE | LIGHTFLAG_REALTIMEMODE); - CL_TeleportSplash(pos); + CL_ParticleEffect(EFFECT_TE_TELEPORT, 1, pos, pos, vec3_origin, vec3_origin, NULL, 0); break; case TE_EXPLOSION2: @@ -2111,15 +2010,14 @@ void CL_ParseTempEntity(void) color[2] = tempcolor[2] * (2.0f / 255.0f); Matrix4x4_CreateTranslate(&tempmatrix, pos[0], pos[1], pos[2]); CL_AllocDlight(NULL, &tempmatrix, 350, color[0], color[1], color[2], 700, 0.5, 0, -1, true, 1, 0.25, 0.25, 1, 1, LIGHTFLAG_NORMALMODE | LIGHTFLAG_REALTIMEMODE); - if (gamemode != GAME_NEXUIZ) - S_StartSound(-1, 0, cl.sfx_r_exp3, pos, 1, 1); + S_StartSound(-1, 0, cl.sfx_r_exp3, pos, 1, 1); break; case TE_TEI_G3: MSG_ReadVector(pos, cls.protocol); MSG_ReadVector(pos2, cls.protocol); MSG_ReadVector(dir, cls.protocol); - CL_BeamParticle(pos, pos2, 8, 1, 1, 1, 1, 1); + CL_ParticleEffect(EFFECT_TE_TEI_G3, 1, pos, pos2, dir, dir, NULL, 0); break; case TE_TEI_SMOKE: @@ -2127,17 +2025,14 @@ void CL_ParseTempEntity(void) MSG_ReadVector(dir, cls.protocol); count = MSG_ReadByte(); CL_FindNonSolidLocation(pos, pos, 4); - CL_Tei_Smoke(pos, dir, count); + CL_ParticleEffect(EFFECT_TE_TEI_SMOKE, count, pos, pos, vec3_origin, vec3_origin, NULL, 0); break; case TE_TEI_BIGEXPLOSION: MSG_ReadVector(pos, cls.protocol); CL_FindNonSolidLocation(pos, pos, 10); - CL_ParticleExplosion(pos); - Matrix4x4_CreateTranslate(&tempmatrix, pos[0], pos[1], pos[2]); - CL_AllocDlight(NULL, &tempmatrix, 500, 2.5f, 2.0f, 1.0f, 500, 9999, 0, -1, true, 1, 0.25, 0.25, 1, 1, LIGHTFLAG_NORMALMODE | LIGHTFLAG_REALTIMEMODE); - if (gamemode != GAME_NEXUIZ) - S_StartSound(-1, 0, cl.sfx_r_exp3, pos, 1, 1); + CL_ParticleEffect(EFFECT_TE_TEI_BIGEXPLOSION, 1, pos, pos, vec3_origin, vec3_origin, NULL, 0); + S_StartSound(-1, 0, cl.sfx_r_exp3, pos, 1, 1); break; case TE_TEI_PLASMAHIT: @@ -2145,9 +2040,7 @@ void CL_ParseTempEntity(void) MSG_ReadVector(dir, cls.protocol); count = MSG_ReadByte(); CL_FindNonSolidLocation(pos, pos, 5); - CL_Tei_PlasmaHit(pos, dir, count); - Matrix4x4_CreateTranslate(&tempmatrix, pos[0], pos[1], pos[2]); - CL_AllocDlight(NULL, &tempmatrix, 500, 0.6, 1.2, 2.0f, 2000, 9999, 0, -1, true, 1, 0.25, 0.25, 1, 1, LIGHTFLAG_NORMALMODE | LIGHTFLAG_REALTIMEMODE); + CL_ParticleEffect(EFFECT_TE_TEI_PLASMAHIT, count, pos, pos, vec3_origin, vec3_origin, NULL, 0); break; default: @@ -2165,8 +2058,6 @@ void CL_VM_Parse_StuffCmd (const char *msg); void CL_VM_Parse_CenterPrint (const char *msg); void CSQC_AddPrintText (const char *msg); void CSQC_ReadEntities (void); -// -static unsigned char cgamenetbuffer[65536]; /* ===================== @@ -2196,7 +2087,6 @@ void CL_ParseServerMessage(void) else if (cl_shownet.integer == 2) Con_Print("------------------\n"); - cl.onground = false; // unless the server says otherwise // // parse the message // @@ -2209,16 +2099,23 @@ void CL_ParseServerMessage(void) cl.mtime[1] = cl.mtime[0]; cl.mtime[0] = realtime; // qw has no clock cl.movement_needupdate = true; + // if true the cl.viewangles are interpolated from cl.mviewangles[] + // during this frame + // (makes spectating players much smoother and prevents mouse movement from turning) + cl.fixangle[1] = cl.fixangle[0]; + cl.fixangle[0] = false; + if (!cls.demoplayback) + VectorCopy(cl.mviewangles[0], cl.mviewangles[1]); // slightly kill qw player entities each frame for (i = 1;i < cl.maxclients;i++) - cl_entities_active[i] = false; + cl.entities_active[i] = false; // kill all qw nails cl.qw_num_nails = 0; // fade weapon view kick - cl.qw_weaponkick = min(cl.qw_weaponkick + 10 * cl.frametime, 0); + cl.qw_weaponkick = min(cl.qw_weaponkick + 10 * (cl.time - cl.oldtime), 0); while (1) { @@ -2315,18 +2212,26 @@ void CL_ParseServerMessage(void) case qw_svc_setangle: for (i=0 ; i<3 ; i++) cl.viewangles[i] = MSG_ReadAngle (cls.protocol); + if (!cls.demoplayback) + { + cl.fixangle[0] = true; + VectorCopy(cl.viewangles, cl.mviewangles[0]); + // disable interpolation if this is new + if (!cl.fixangle[1]) + VectorCopy(cl.viewangles, cl.mviewangles[1]); + } break; case qw_svc_lightstyle: i = MSG_ReadByte (); - if (i >= cl_max_lightstyle) + if (i >= cl.max_lightstyle) { Con_Printf ("svc_lightstyle >= MAX_LIGHTSTYLES"); break; } - strlcpy (cl_lightstyle[i].map, MSG_ReadString(), sizeof (cl_lightstyle[i].map)); - cl_lightstyle[i].map[MAX_STYLESTRING - 1] = 0; - cl_lightstyle[i].length = (int)strlen(cl_lightstyle[i].map); + strlcpy (cl.lightstyle[i].map, MSG_ReadString(), sizeof (cl.lightstyle[i].map)); + cl.lightstyle[i].map[MAX_STYLESTRING - 1] = 0; + cl.lightstyle[i].length = (int)strlen(cl.lightstyle[i].map); break; case qw_svc_sound: @@ -2371,9 +2276,9 @@ void CL_ParseServerMessage(void) i = (unsigned short) MSG_ReadShort(); if (i < 0 || i >= MAX_EDICTS) Host_Error ("CL_ParseServerMessage: svc_spawnbaseline: invalid entity number %i", i); - if (i >= cl_max_entities) + if (i >= cl.max_entities) CL_ExpandEntities(i); - CL_ParseBaseline(cl_entities + i, false); + CL_ParseBaseline(cl.entities + i, false); break; case qw_svc_spawnstatic: CL_ParseStatic(false); @@ -2447,9 +2352,9 @@ void CL_ParseServerMessage(void) // NOTE: in QW this only worked on clients if (i < 0 || i >= MAX_EDICTS) Host_Error("CL_ParseServerMessage: svc_spawnbaseline: invalid entity number %i", i); - if (i >= cl_max_entities) + if (i >= cl.max_entities) CL_ExpandEntities(i); - cl_entities[i].persistent.muzzleflash = 1.0f; + cl.entities[i].persistent.muzzleflash = 1.0f; break; case qw_svc_updateuserinfo: @@ -2526,10 +2431,8 @@ void CL_ParseServerMessage(void) // fully kill the still slightly dead qw player entities each frame for (i = 1;i < cl.maxclients;i++) - if (!cl_entities_active[i]) - cl_entities[i].state_current.active = false; - - QW_CL_UpdateItemsAndWeapon(); + if (!cl.entities_active[i]) + cl.entities[i].state_current.active = false; } else { @@ -2612,6 +2515,13 @@ void CL_ParseServerMessage(void) cl.mtime[1] = cl.mtime[0]; cl.mtime[0] = MSG_ReadFloat (); cl.movement_needupdate = true; + // if true the cl.viewangles are interpolated from cl.mviewangles[] + // during this frame + // (makes spectating players much smoother and prevents mouse movement from turning) + cl.fixangle[1] = cl.fixangle[0]; + cl.fixangle[0] = false; + if (!cls.demoplayback) + VectorCopy(cl.mviewangles[0], cl.mviewangles[1]); break; case svc_clientdata: @@ -2661,13 +2571,21 @@ void CL_ParseServerMessage(void) case svc_setangle: for (i=0 ; i<3 ; i++) cl.viewangles[i] = MSG_ReadAngle (cls.protocol); + if (!cls.demoplayback) + { + cl.fixangle[0] = true; + VectorCopy(cl.viewangles, cl.mviewangles[0]); + // disable interpolation if this is new + if (!cl.fixangle[1]) + VectorCopy(cl.viewangles, cl.mviewangles[1]); + } break; case svc_setview: cl.viewentity = (unsigned short)MSG_ReadShort (); if (cl.viewentity >= MAX_EDICTS) Host_Error("svc_setview >= MAX_EDICTS"); - if (cl.viewentity >= cl_max_entities) + if (cl.viewentity >= cl.max_entities) CL_ExpandEntities(cl.viewentity); // LordHavoc: assume first setview recieved is the real player entity if (!cl.playerentity) @@ -2676,14 +2594,14 @@ void CL_ParseServerMessage(void) case svc_lightstyle: i = MSG_ReadByte (); - if (i >= cl_max_lightstyle) + if (i >= cl.max_lightstyle) { Con_Printf ("svc_lightstyle >= MAX_LIGHTSTYLES"); break; } - strlcpy (cl_lightstyle[i].map, MSG_ReadString(), sizeof (cl_lightstyle[i].map)); - cl_lightstyle[i].map[MAX_STYLESTRING - 1] = 0; - cl_lightstyle[i].length = (int)strlen(cl_lightstyle[i].map); + strlcpy (cl.lightstyle[i].map, MSG_ReadString(), sizeof (cl.lightstyle[i].map)); + cl.lightstyle[i].map[MAX_STYLESTRING - 1] = 0; + cl.lightstyle[i].length = (int)strlen(cl.lightstyle[i].map); break; case svc_sound: @@ -2770,17 +2688,17 @@ void CL_ParseServerMessage(void) i = (unsigned short) MSG_ReadShort (); if (i < 0 || i >= MAX_EDICTS) Host_Error ("CL_ParseServerMessage: svc_spawnbaseline: invalid entity number %i", i); - if (i >= cl_max_entities) + if (i >= cl.max_entities) CL_ExpandEntities(i); - CL_ParseBaseline (cl_entities + i, false); + CL_ParseBaseline (cl.entities + i, false); break; case svc_spawnbaseline2: i = (unsigned short) MSG_ReadShort (); if (i < 0 || i >= MAX_EDICTS) Host_Error ("CL_ParseServerMessage: svc_spawnbaseline2: invalid entity number %i", i); - if (i >= cl_max_entities) + if (i >= cl.max_entities) CL_ExpandEntities(i); - CL_ParseBaseline (cl_entities + i, true); + CL_ParseBaseline (cl.entities + i, true); break; case svc_spawnstatic: CL_ParseStatic (false); @@ -2905,16 +2823,6 @@ void CL_ParseServerMessage(void) case svc_skybox: R_SetSkyBox(MSG_ReadString()); break; - case svc_cgame: - { - int length; - length = (int) ((unsigned short) MSG_ReadShort()); - for (i = 0;i < length;i++) - cgamenetbuffer[i] = MSG_ReadByte(); - if (!msg_badread) - CL_CGVM_ParseNetwork(cgamenetbuffer, length); - } - break; case svc_entities: if (cls.signon == SIGNONS - 1) { @@ -2936,6 +2844,8 @@ void CL_ParseServerMessage(void) } } + CL_UpdateItemsAndWeapon(); + EntityFrameQuake_ISeeDeadEntities(); parsingerror = false; @@ -2969,6 +2879,14 @@ void CL_Parse_Init(void) Cvar_SetValue("demo_nehahra", 1); Cvar_RegisterVariable(&developer_networkentities); + Cvar_RegisterVariable(&cl_sound_wizardhit); + Cvar_RegisterVariable(&cl_sound_hknighthit); + Cvar_RegisterVariable(&cl_sound_tink1); + Cvar_RegisterVariable(&cl_sound_ric1); + Cvar_RegisterVariable(&cl_sound_ric2); + Cvar_RegisterVariable(&cl_sound_ric3); + Cvar_RegisterVariable(&cl_sound_r_exp3); + 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)"); Cmd_AddCommand("skins", QW_CL_Skins_f, "downloads missing qw skins from server");