/* * Specifies the model that will be used as the world */ void RI_BeginRegistration(char *model) { char fullname[MAX_QPATH]; cvar_t *flushmap; registration_sequence++; r_oldviewcluster = -1; /* force markleafs */ Com_sprintf(fullname, sizeof(fullname), "maps/%s.bsp", model); /* explicitly free the old map if different this guarantees that mod_known[0] is the world map */ flushmap = ri.Cvar_Get("flushmap", "0", 0); if (strcmp(mod_known[0].name, fullname) || flushmap->value) { Mod_Free(&mod_known[0]); } r_worldmodel = Mod_ForName(fullname, true); r_viewcluster = -1; }
/* @@@@@@@@@@@@@@@@@@@@@ R_BeginRegistration Specifies the model that will be used as the world @@@@@@@@@@@@@@@@@@@@@ */ void R_BeginRegistration (char *model) { char fullname[MAX_QPATH]; cvar_t *flushmap; r_registering = true; #ifdef RB_IMAGE_CACHE EmptyImageCache(); #endif registration_sequence++; r_oldviewcluster = -1; // force markleafs Com_sprintf (fullname, sizeof(fullname), "maps/%s.bsp", model); // explicitly free the old map if different // this guarantees that mod_known[0] is the world map flushmap = Cvar_Get ("flushmap", "0", 0); if ( strcmp(mod_known[0].name, fullname) || flushmap->intvalue) Mod_Free (&mod_known[0]); r_worldmodel = Mod_ForName(fullname, true); r_viewcluster = -1; }
/* ================= CL_ParseBeam ================= */ void CL_ParseBeam (const char *modelname, qboolean parse_only) { int i, ent, index; vec3_t start, end; beam_t *b; ent = MSG_ReadShort (); start[0] = MSG_ReadCoord (); start[1] = MSG_ReadCoord (); start[2] = MSG_ReadCoord (); end[0] = MSG_ReadCoord (); end[1] = MSG_ReadCoord (); end[2] = MSG_ReadCoord (); if (parse_only) return; // JDH: parse message only, don't do anything if (ent == cl.viewentity) VectorCopy (end, playerbeam_end); // for cl_truelightning index = MAX_BEAMS; for (i = 0, b = cl_beams ; i < MAX_BEAMS ; i++, b++) { // override any beam with the same entity if (b->entity == ent) { index = i; break; } // make note of first available slot, but continue checking for same ent: // if ((index == MAX_BEAMS) && (!b->model || (b->endtime < cl.time))) if ((index == MAX_BEAMS) && (!b->model || BEAM_INACTIVE(b))) { index = i; } } if (index < MAX_BEAMS) { b = cl_beams + index; b->entity = ent; b->model = Mod_ForName (modelname, true); b->starttime = cl.time - 0.2; // JDH: for demo rewind (see note in AllocParticle) b->endtime = cl.time + 0.2; VectorCopy (start, b->start); VectorCopy (end, b->end); #ifdef _DEBUG // if (cls.demoplayback && !cl_demorewind.value) // CL_PushBeam (b); #endif return; } Con_Print ("beam list overflow!\n"); }
void VID_Restart(void) { int i; if (!display) return; VID_Close(); VID_Open(); for(i=1;i < MAX_MODELS;i++) { if (cl.model_name[i][0] == 0) break; cl.model_precache[i] = Mod_ForName(cl.model_name[i], false); if (!cl.model_precache[i]) { Com_Printf("Unable to reload model '%s'.\n", cl.model_name[i]); Host_EndGame(); return; } } if (cl.model_precache[1]) { cl.worldmodel = cl.model_precache[1]; R_NewMap(); R_DrawFlat_NewMap(); } CL_ClearTEnts(); /* Not the prettiest, but the safest for now... */ vid_restarted = 1; }
/* @@@@@@@@@@@@@@@@@@@@@ RE_RegisterModel @@@@@@@@@@@@@@@@@@@@@ */ struct model_s *RE_RegisterModel(char *name) { model_t *mod; mod = Mod_ForName(name, false); if (mod) { int i; mod->registration_sequence = registration_sequence; // register any images used by the models if (mod->type == mod_sprite) { dsprite_t *sprout; sprout = (dsprite_t *) mod->extradata; for (i = 0; i < sprout->numframes; i++) mod->skins[i] = R_FindImage(sprout->frames[i].name, it_sprite); } else if (mod->type == mod_alias) { dmdl_t *pheader; pheader = (dmdl_t *) mod->extradata; for (i = 0; i < pheader->num_skins; i++) mod->skins[i] = R_FindImage((char *) pheader + pheader->ofs_skins + i * MAX_SKINNAME, it_skin); // PGM mod->numframes = pheader->num_frames; // PGM } else if (mod->type == mod_brush) { for (i = 0; i < mod->numtexinfo; i++) mod->texinfo[i].image->registration_sequence = registration_sequence; } } return mod; }
static void CL_TEnts_Precache (int phase) { if (!phase) return; cl_sfx_wizhit = S_PrecacheSound ("wizard/hit.wav"); cl_sfx_knighthit = S_PrecacheSound ("hknight/hit.wav"); cl_sfx_tink1 = S_PrecacheSound ("weapons/tink1.wav"); cl_sfx_ric1 = S_PrecacheSound ("weapons/ric1.wav"); cl_sfx_ric2 = S_PrecacheSound ("weapons/ric2.wav"); cl_sfx_ric3 = S_PrecacheSound ("weapons/ric3.wav"); cl_sfx_r_exp3 = S_PrecacheSound ("weapons/r_exp3.wav"); cl_mod_bolt = Mod_ForName ("progs/bolt.mdl", true); cl_mod_bolt2 = Mod_ForName ("progs/bolt2.mdl", true); cl_mod_bolt3 = Mod_ForName ("progs/bolt3.mdl", true); cl_spr_explod = Mod_ForName ("progs/s_explod.spr", true); cl_mod_beam = Mod_ForName ("progs/beam.mdl", false); if (!cl_mod_beam) cl_mod_beam = cl_mod_bolt; }
/* @@@@@@@@@@@@@@@@@@@@@ R_RegisterModel @@@@@@@@@@@@@@@@@@@@@ */ struct model_s * R_RegisterModel(const char *name) { model_t *mod; int i; dsprite_t *sprout; dmdl_t *pheader; mod = Mod_ForName (name, false); if (mod) { mod->registration_sequence = registration_sequence; // register any images used by the models switch (mod->type) { case mod_brush: { for (i=0 ; i<mod->numtexinfo ; i++) mod->texinfo[i].image->registration_sequence = registration_sequence; } break; case mod_sprite: { sprout = (dsprite_t *)mod->extradata; for (i=0 ; i<sprout->numframes ; i++) { if (mod->skins[i]) mod->skins[i]->registration_sequence = registration_sequence; } } break; case mod_alias: { pheader = (dmdl_t *)mod->extradata; for (i=0 ; i<pheader->num_skins ; i++) { if (mod->skins[i]) mod->skins[i]->registration_sequence = registration_sequence; } mod->numframes = pheader->num_frames; } break; default: break; } } return mod; }
/* @@@@@@@@@@@@@@@@@@@@@ R_RegisterModel @@@@@@@@@@@@@@@@@@@@@ */ struct model_s *R_RegisterModel (char *name) { model_t *mod; int i; mod = Mod_ForName (name, false); if (mod) { if (mod->type == mod_brush) { for (i=0 ; i<mod->numtexinfo ; i++) mod->texinfo[i].image->registration_sequence = registration_sequence; } } return mod; }
static void Host_Viewmodel_f (void) { edict_t *e; model_t *m; e = FindViewthing (); if (!e) return; m = Mod_ForName (Cmd_Argv (1), false); if (!m) { Sys_Printf ("Can't load %s\n", Cmd_Argv (1)); return; } SVfloat (e, frame) = 0; cl.model_precache[(int) SVfloat (e, modelindex)] = m; }
/* ================== Host_Viewmodel_f ================== */ static void Host_Viewmodel_f(void) { edict_t *e; model_t *m; e = FindViewthing(); if (!e) return; m = Mod_ForName(Cmd_Argv(1), false); if (!m) { Con_Printf("Can't load %s\n", Cmd_Argv(1)); return; } e->v.frame = 0; cl.model_precache[(int)e->v.modelindex] = m; }
void R_BeginRegistration (char *model) { char fullname[MAX_QPATH]; Prof_Begin(__FUNCTION__); registration_sequence++; r_oldviewcluster = -1; // force markleafs Com_sprintf (fullname, sizeof(fullname), "maps/%s.bsp", model); Mod_FreeAll (); Hunk_Begin (&hunk_ref); r_worldmodel = Mod_ForName(fullname, true); r_viewcluster = -1; Prof_End(); }
/* @@@@@@@@@@@@@@@@@@@@@ R_RegisterModel @@@@@@@@@@@@@@@@@@@@@ */ struct model_s *R_RegisterModel (char *name) { model_t *mod; int i; Prof_Begin(__FUNCTION__); mod = Mod_ForName (name, false); if (mod) { // register any images used by the models if (mod->type == mod_brush) { #ifndef PSP for (i=0 ; i<mod->numtexinfo ; i++) mod->texinfo[i].image->registration_sequence = registration_sequence; #endif } } Prof_End(); return mod; }
/* ================== CL_ParseServerInfo ================== */ void CL_ParseServerInfo(void) { char *level; const char *mapname; int i, maxlen; int nummodels, numsounds; char model_precache[MAX_MODELS][MAX_QPATH]; char sound_precache[MAX_SOUNDS][MAX_QPATH]; Con_DPrintf("Serverinfo packet received.\n"); // // wipe the client_state_t struct // CL_ClearState(); // parse protocol version number i = MSG_ReadLong(); if (!Protocol_Known(i)) { Con_Printf("Server returned unknown protocol version %i\n", i); return; } cl.protocol = i; // parse maxclients cl.maxclients = MSG_ReadByte(); if (cl.maxclients < 1 || cl.maxclients > MAX_SCOREBOARD) { Con_Printf("Bad maxclients (%u) from server\n", cl.maxclients); return; } cl.players = Hunk_AllocName(cl.maxclients * sizeof(*cl.players), "players"); // parse gametype cl.gametype = MSG_ReadByte(); // parse signon message level = cl.levelname; maxlen = sizeof(cl.levelname); snprintf(level, maxlen, "%s", MSG_ReadString()); // seperate the printfs so the server message can have a color Con_Printf("\n\n\35\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36" "\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\37\n\n"); Con_Printf("%c%s\n", 2, level); Con_Printf("Using protocol %i\n", cl.protocol); // // first we go through and touch all of the precache data that still // happens to be in the cache, so precaching something else doesn't // needlessly purge it // // precache models memset(cl.model_precache, 0, sizeof(cl.model_precache)); for (nummodels = 1;; nummodels++) { char *in, *model; in = MSG_ReadString(); if (!in[0]) break; if (nummodels == max_models(cl.protocol)) { Host_Error("Server sent too many model precaches (max = %d)", max_models(cl.protocol)); return; } model = model_precache[nummodels]; maxlen = sizeof(model_precache[0]); snprintf(model, maxlen, "%s", in); Mod_TouchModel(model); } // precache sounds memset(cl.sound_precache, 0, sizeof(cl.sound_precache)); for (numsounds = 1;; numsounds++) { char *in, *sound; in = MSG_ReadString(); if (!in[0]) break; if (numsounds == max_sounds(cl.protocol)) { Host_Error("Server sent too many sound precaches (max = %d)", max_sounds(cl.protocol)); return; } sound = sound_precache[numsounds]; maxlen = sizeof(sound_precache[0]); snprintf(sound, maxlen, "%s", in); S_TouchSound(sound); } // copy the naked name of the map file to the cl structure mapname = COM_SkipPath(model_precache[1]); COM_StripExtension(mapname, cl.mapname, sizeof(cl.mapname)); // // now we try to load everything else until a cache allocation fails // for (i = 1; i < nummodels; i++) { cl.model_precache[i] = Mod_ForName(model_precache[i], false); if (cl.model_precache[i] == NULL) { Con_Printf("Model %s not found\n", model_precache[i]); return; } CL_KeepaliveMessage(); } S_BeginPrecaching(); for (i = 1; i < numsounds; i++) { cl.sound_precache[i] = S_PrecacheSound(sound_precache[i]); CL_KeepaliveMessage(); } S_EndPrecaching(); // local state cl_entities[0].model = cl.model_precache[1]; cl.worldmodel = BrushModel(cl_entities[0].model); R_NewMap(); Hunk_Check(); // make sure nothing is hurt noclip_anglehack = false; // noclip is turned off at start }
void CL_ParseTEnt (void) { int type; vec3_t pos; vec3_t pos2; vec3_t vel; vec3_t dir; vec3_t mins; vec3_t maxs; vec3_t vel1; vec3_t vel2; int count; int thecol; int speed; vec3_t endpos; int amount; dlight_t *dl; int rnd; int colorStart, colorLength; type = MSG_ReadByte (); switch (type) { case TE_WIZSPIKE: // spike hitting wall pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); R_RunParticleEffect (pos, vec3_origin, 20, 30); S_StartSound (-1, 0, cl_sfx_wizhit, pos, 1, 1); break; case TE_KNIGHTSPIKE: // spike hitting wall pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); R_RunParticleEffect (pos, vec3_origin, 226, 20); S_StartSound (-1, 0, cl_sfx_knighthit, pos, 1, 1); break; case TE_SPIKE: // spike hitting wall pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); if (particleset == 7){ //R_FlareTest (pos, 1, 255, 0, 0); R_FlareTest (pos, 1, rand()&255, rand()&255, rand()&255, 0, NULL); // tseting random colored flares with nails } else R_RunParticleEffect (pos, vec3_origin, 0, 10); if ( rand() % 5 ) S_StartSound (-1, 0, cl_sfx_tink1, pos, 1, 1); else { rnd = rand() & 3; if (rnd == 1) S_StartSound (-1, 0, cl_sfx_ric1, pos, 1, 1); else if (rnd == 2) S_StartSound (-1, 0, cl_sfx_ric2, pos, 1, 1); else S_StartSound (-1, 0, cl_sfx_ric3, pos, 1, 1); } break; case TE_SUPERSPIKE: // super spike hitting wall pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); R_RunParticleEffect (pos, vec3_origin, 0, 20); if ( rand() % 5 ) S_StartSound (-1, 0, cl_sfx_tink1, pos, 1, 1); else { rnd = rand() & 3; if (rnd == 1) S_StartSound (-1, 0, cl_sfx_ric1, pos, 1, 1); else if (rnd == 2) S_StartSound (-1, 0, cl_sfx_ric2, pos, 1, 1); else S_StartSound (-1, 0, cl_sfx_ric3, pos, 1, 1); } break; // TomazQuake code case TE_SNOW: pos[0] = MSG_ReadCoord (); // mins pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); pos2[0] = MSG_ReadCoord (); // maxs pos2[1] = MSG_ReadCoord (); pos2[2] = MSG_ReadCoord (); amount = MSG_ReadShort (); R_Snow(pos, pos2, amount); break; case TE_RAIN: pos[0] = MSG_ReadCoord (); // mins pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); pos2[0] = MSG_ReadCoord (); // maxs pos2[1] = MSG_ReadCoord (); pos2[2] = MSG_ReadCoord (); amount = MSG_ReadShort (); R_Rain(pos, pos2, amount); break; // TomazQuake code case TE_GUNSHOT: // bullet hitting wall pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); if (particleset == 2){ R_Smoke (pos, vec3_origin, 0, 20); R_Decal (pos, 4, 6, 0, 0); } else R_RunParticleEffect (pos, vec3_origin, 0, 20); break; case TE_EXPLOSION: // rocket explosion pos[0] = MSG_ReadCoord(); pos[1] = MSG_ReadCoord(); pos[2] = MSG_ReadCoord(); if (particleset == 2){ // R_Smoke (pos, vec3_origin, 0, 20); R_ParticleExplosionSpritey (pos, 13, 6, 2); R_Decal (pos, 13, 6, 2, 0); } else R_ParticleExplosion (pos); dl = CL_AllocDlight (0); if (r_coloreddyns->value){ dl->color[0] = 4.0f; dl->color[1] = 2.0f; dl->color[2] = 0.5f; // TODO: get avg color from model } VectorCopy (pos, dl->origin); dl->radius = 350; dl->die = cl.time + 0.5; dl->decay = 300; // 2000-05-02 NVS SVC_TE te_explosion by Maddes start // 2001-09-11 Colored lightning by LordHavoc/Sarcazm/Maddes start if ((nvs_current_csvc->value >= 0.50) && (cls.signon > 1)) { dl->flashcolor[0] = dl->color[0] = MSG_ReadCoord(); dl->flashcolor[1] = dl->color[1] = MSG_ReadCoord(); dl->flashcolor[2] = dl->color[2] = MSG_ReadCoord(); dl->flashcolor[3] = MSG_ReadCoord(); } // 2001-09-11 Colored lightning by LordHavoc/Sarcazm/Maddes end // 2000-05-02 NVS SVC_TE te_explosion by Maddes end S_StartSound (-1, 0, cl_sfx_r_exp3, pos, 1, 1); break; case TE_TAREXPLOSION: // tarbaby explosion pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); R_BlobExplosion (pos); S_StartSound (-1, 0, cl_sfx_r_exp3, pos, 1, 1); break; case TE_LIGHTNING1: // lightning bolts CL_ParseBeam (Mod_ForName("progs/bolt.mdl", true)); break; case TE_LIGHTNING2: // lightning bolts CL_ParseBeam (Mod_ForName("progs/bolt2.mdl", true)); break; case TE_LIGHTNING3: // lightning bolts CL_ParseBeam (Mod_ForName("progs/bolt3.mdl", true)); break; // PGM 01/21/97 case TE_BEAM: // grappling hook beam CL_ParseBeam (Mod_ForName("progs/beam.mdl", true)); break; // PGM 01/21/97 case TE_LAVASPLASH: pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); R_LavaSplash (pos); break; case TE_TELEPORT: pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); R_TeleportSplash (pos); break; case TE_EXPLOSION2: // color mapped explosion pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); colorStart = MSG_ReadByte (); colorLength = MSG_ReadByte (); R_ParticleExplosion2 (pos, colorStart, colorLength); dl = CL_AllocDlight (0); VectorCopy (pos, dl->origin); dl->radius = 350; dl->die = cl.time + 0.5; dl->decay = 300; S_StartSound (-1, 0, cl_sfx_r_exp3, pos, 1, 1); break; // case TE_IMPLOSION: // pos[0] = MSG_ReadCoord (); // pos[1] = MSG_ReadCoord (); // pos[2] = MSG_ReadCoord (); // S_StartSound (-1, 0, cl_sfx_r_exp3, pos, 1, 1); // break; case TE_RAILTRAIL: // Straight out of Quake2! pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); endpos[0] = MSG_ReadCoord (); endpos[1] = MSG_ReadCoord (); endpos[2] = MSG_ReadCoord (); vel[0] = MSG_ReadCoord (); vel[1] = MSG_ReadCoord (); vel[2] = MSG_ReadCoord (); R_RailTrail (pos, endpos); // R_RocketTrail (pos, endpos, 7); break; case TE_BLOOD: pos[0] = MSG_ReadCoord(); pos[1] = MSG_ReadCoord(); pos[2] = MSG_ReadCoord(); vel[0] = (float)MSG_ReadChar(); vel[1] = (float)MSG_ReadChar(); vel[2] = (float)MSG_ReadChar(); count = MSG_ReadByte(); R_Blood(count, pos, pos, vel, vel); break; case TE_BLOODSHOWER: mins[0] = MSG_ReadCoord(); mins[1] = MSG_ReadCoord(); mins[2] = MSG_ReadCoord(); maxs[0] = MSG_ReadCoord(); maxs[1] = MSG_ReadCoord(); maxs[2] = MSG_ReadCoord(); speed = MSG_ReadCoord(); count = MSG_ReadShort(); vel1[0] = -speed; vel1[1] = -speed; vel1[2] = -speed; vel2[0] = speed; vel2[1] = speed; vel2[2] = speed; R_Blood(count, mins, maxs, vel1, vel2); break; case TE_PLASMABURN: // plasma burn pos[0] = MSG_ReadCoord(); pos[1] = MSG_ReadCoord(); pos[2] = MSG_ReadCoord(); // all thius is, is just a quick white flash dl = CL_AllocDlight (0); VectorCopy (pos, dl->origin); dl->radius = 250; dl->die = cl.time + 0.2; dl->decay = 1500; break; case TE_TEI_SMOKE: // makes some puff of smoke // the direction doesn't do much in DP // but we do it anyway pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); vel[0] = MSG_ReadCoord (); vel[1] = MSG_ReadCoord (); vel[2] = MSG_ReadCoord (); count = MSG_ReadByte(); R_Smoke (pos, vel, 0, count * 4); break; case TE_TEI_BIGEXPLOSION: // rocket explosion pos[0] = MSG_ReadCoord(); pos[1] = MSG_ReadCoord(); pos[2] = MSG_ReadCoord(); R_ParticleExplosion (pos); // in dp, this is just a explosion with a //much much much much bigger dynamic light. Why? don't ask. dl = CL_AllocDlight (0); if (r_coloreddyns->value){ dl->color[0] = 0.6f; dl->color[1] = 0.5f; dl->color[2] = 0.1f; // TODO: get avg color from model } VectorCopy (pos, dl->origin); dl->radius = 850; dl->die = cl.time + 1; dl->decay = 800; S_StartSound (-1, 0, cl_sfx_r_exp3, pos, 1, 1); break; // Darkplaces QUAD DAMAGE TE's case TE_GUNSHOTQUAD: // bullet hitting wall... one that does 4x damage pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); R_RunParticleEffect (pos, vec3_origin, 0, 20); dl = CL_AllocDlight (0); if (r_coloreddyns->value){ dl->color[0] = 0.1f;dl->color[1] = 0.1f;dl->color[2] = 1.0f;} VectorCopy (pos, dl->origin); dl->radius = 200; dl->die = cl.time + 0.2; dl->decay = 1500; break; case TE_SPIKEQUAD: // spike hitting wall WITH A BLUE FLASH of QUAD DAMAGE POWER! pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); R_RunParticleEffect (pos, vec3_origin, 0, 10); dl = CL_AllocDlight (0); if (r_coloreddyns->value){ dl->color[0] = 0.1f;dl->color[1] = 0.1f;dl->color[2] = 1.0f;} VectorCopy (pos, dl->origin); dl->radius = 200; dl->die = cl.time + 0.2; dl->decay = 1500; if ( rand() % 5 ) S_StartSound (-1, 0, cl_sfx_tink1, pos, 1, 1); else { rnd = rand() & 3; if (rnd == 1) S_StartSound (-1, 0, cl_sfx_ric1, pos, 1, 1); else if (rnd == 2) S_StartSound (-1, 0, cl_sfx_ric2, pos, 1, 1); else S_StartSound (-1, 0, cl_sfx_ric3, pos, 1, 1); } break; case TE_SUPERSPIKEQUAD: // THE INFAMOUSLY REDUNDANT SPIKE FUNCTION GETS FLASH TOO pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); R_RunParticleEffect (pos, vec3_origin, 0, 20); dl = CL_AllocDlight (0); if (r_coloreddyns->value){ dl->color[0] = 0.1f;dl->color[1] = 0.1f;dl->color[2] = 1.0f;} VectorCopy (pos, dl->origin); dl->radius = 200; dl->die = cl.time + 0.2; dl->decay = 1500; if ( rand() % 5 ) S_StartSound (-1, 0, cl_sfx_tink1, pos, 1, 1); else { rnd = rand() & 3; if (rnd == 1) S_StartSound (-1, 0, cl_sfx_ric1, pos, 1, 1); else if (rnd == 2) S_StartSound (-1, 0, cl_sfx_ric2, pos, 1, 1); else S_StartSound (-1, 0, cl_sfx_ric3, pos, 1, 1); } break; case TE_EXPLOSIONQUAD: // one explosion no one wants to be part of pos[0] = MSG_ReadCoord(); pos[1] = MSG_ReadCoord(); pos[2] = MSG_ReadCoord(); R_ParticleExplosion (pos); dl = CL_AllocDlight (0); if (r_coloreddyns->value){ dl->color[0] = 0.1f; dl->color[1] = 0.1f; dl->color[2] = 1.0f; } VectorCopy (pos, dl->origin); dl->radius = 350; dl->die = cl.time + 0.5; dl->decay = 300; S_StartSound (-1, 0, cl_sfx_r_exp3, pos, 1, 1); break; // --------------------------------------------------------- // Weird Teitei effects implemented by Leilei // --------------------------------------------------------- case TE_TEI_G3: // This was used for the Nex weapon in // super old (2002) Nexuiz alphas pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); endpos[0] = MSG_ReadCoord (); endpos[1] = MSG_ReadCoord (); endpos[2] = MSG_ReadCoord (); vel[0] = MSG_ReadCoord () * 0.25; // NONSTANDARD NOTE - this is "Angles" in the spec vel[1] = MSG_ReadCoord () * 0.25;; // but in DP the angles aren't actually used vel[2] = MSG_ReadCoord () * 0.25;; // for *ANYTHING* so we'll use them for color instead! // LH, can you 'color' the angles too? // vel[0] is inner colorindex // vel[1] is outer colorindex // vel[2] might tell it how to blend // thecol = FindColorNoFB((int)vel[0],(int)vel[1],(int)vel[2]); if (vel[0] > 63) vel[0] = 63; if (vel[1] > 63) vel[1] = 63; if (vel[2] > 63) vel[2] = 63; if (vel[0] < 0) vel[0] = 0; if (vel[1] < 0) vel[1] = 0; if (vel[2] < 0) vel[2] = 0; //thecol = BestColor((int)vel[0],(int)vel[1],(int)vel[2]); thecol = palmap2[(int)vel[0]][(int)vel[1]][(int)vel[2]]; R_BeamBeam (pos, endpos, thecol, 1); break; case TE_TEI_PLASMAHIT: // Nexuiz electro explosion! pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); vel[0] = MSG_ReadCoord (); // in dp, angle/dir isn't really used vel[1] = MSG_ReadCoord (); vel[2] = MSG_ReadCoord (); // tei is messy :( count = MSG_ReadByte(); R_PlasmaExplosion (pos, 40, 7, count); dl = CL_AllocDlight (0); if (r_coloreddyns->value){ dl->color[0] = 0.2f; dl->color[1] = 0.2f; dl->color[2] = 1.0f; } VectorCopy (pos, dl->origin); dl->radius = 250; dl->die = cl.time + 0.3; dl->decay = 800; break; default: // 2001-12-16 Various crashes changed to host errors by Maddes start // Sys_Error ("CL_ParseTEnt: bad type"); Host_Error ("CL_ParseTEnt: bad type %i", type); break; // 2001-12-16 Various crashes changed to host errors by Maddes end } }
void CL_ParseServerInfo (void) { char *str; int i; int nummodels, numsounds; char model_precache[MAX_MODELS][MAX_QPATH]; char sound_precache[MAX_SOUNDS][MAX_QPATH]; Con_DPrintf ("Serverinfo packet received.\n"); // // wipe the client_state_t struct // CL_ClearState (); // parse protocol version number i = MSG_ReadLong (); if (i != PROTOCOL_VERSION) { Con_Printf ("Server returned version %i, not %i", i, PROTOCOL_VERSION); return; } // parse maxclients cl.maxclients = MSG_ReadByte (); if (cl.maxclients < 1 || cl.maxclients > MAX_SCOREBOARD) { Con_Printf("Bad maxclients (%u) from server\n", cl.maxclients); return; } cl.scores = (scoreboard_t*) Hunk_AllocName (cl.maxclients*sizeof(*cl.scores), "scores"); // parse gametype cl.gametype = MSG_ReadByte (); // parse signon message str = MSG_ReadString (); strncpy (cl.levelname, str, sizeof(cl.levelname)-1); // seperate the printfs so the server message can have a color Con_Printf("\n\n\35\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\37\n\n"); Con_Printf ("%c%s\n", 2, str); // // first we go through and touch all of the precache data that still // happens to be in the cache, so precaching something else doesn't // needlessly purge it // // precache models memset (cl.model_precache, 0, sizeof(cl.model_precache)); for (nummodels=1 ; ; nummodels++) { str = MSG_ReadString (); if (!str[0]) break; if (nummodels==MAX_MODELS) { Con_Printf ("Server sent too many model precaches\n"); return; } strcpy (model_precache[nummodels], str); Mod_TouchModel (str); } // precache sounds memset (cl.sound_precache, 0, sizeof(cl.sound_precache)); for (numsounds=1 ; ; numsounds++) { str = MSG_ReadString (); if (!str[0]) break; if (numsounds==MAX_SOUNDS) { Con_Printf ("Server sent too many sound precaches\n"); return; } strcpy (sound_precache[numsounds], str); S_TouchSound (str); } // // now we try to load everything else until a cache allocation fails // for (i=1 ; i<nummodels ; i++) { cl.model_precache[i] = Mod_ForName (model_precache[i], false); if (cl.model_precache[i] == NULL) { Con_Printf("Model %s not found\n", model_precache[i]); return; } CL_KeepaliveMessage (); } S_BeginPrecaching (); for (i=1 ; i<numsounds ; i++) { cl.sound_precache[i] = S_PrecacheSound (sound_precache[i]); CL_KeepaliveMessage (); } S_EndPrecaching (); // local state cl_entities[0].model = cl.worldmodel = cl.model_precache[1]; R_NewMap (); Hunk_Check (); // make sure nothing is hurt noclip_anglehack = false; // noclip is turned off at start }
/* ================= CL_ParseTEnt ================= */ void CL_ParseTEnt (void) { int type; vec3_t pos; #ifdef QUAKE2 vec3_t endpos; #endif dlight_t *dl; int rnd; int colorStart, colorLength; type = MSG_ReadByte (); switch (type) { case TE_WIZSPIKE: // spike hitting wall pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); if (r_part_spikes.value == 2 && !cl_q3gunshot_mod) cl_q3gunshot_mod = Mod_ForName ("progs/bullet.md3", true); R_RunParticleEffect (pos, vec3_origin, 20, 30); S_StartSound (-1, 0, cl_sfx_wizhit, pos, 1, 1); break; case TE_KNIGHTSPIKE: // spike hitting wall pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); if (r_part_spikes.value == 2 && !cl_q3gunshot_mod) cl_q3gunshot_mod = Mod_ForName ("progs/bullet.md3", true); R_RunParticleEffect (pos, vec3_origin, 226, 20); S_StartSound (-1, 0, cl_sfx_knighthit, pos, 1, 1); break; case TE_SPIKE: // spike hitting wall pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); if (r_part_spikes.value == 2 && !cl_q3gunshot_mod) cl_q3gunshot_mod = Mod_ForName ("progs/bullet.md3", true); //R00k--start if (r_decal_bullets.value) { R_SpawnDecalStatic(pos, decal_mark, 8); } //R00k--end #ifdef GLTEST Test_Spawn (pos); #else R_RunParticleEffect (pos, vec3_origin, 0, 10); #endif if ( rand() % 5 ) S_StartSound (-1, 0, cl_sfx_tink1, pos, 1, 1); else { rnd = rand() & 3; if (rnd == 1) S_StartSound (-1, 0, cl_sfx_ric1, pos, 1, 1); else if (rnd == 2) S_StartSound (-1, 0, cl_sfx_ric2, pos, 1, 1); else S_StartSound (-1, 0, cl_sfx_ric3, pos, 1, 1); } break; case TE_SUPERSPIKE: // super spike hitting wall pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); if (r_part_spikes.value == 2 && !cl_q3gunshot_mod) cl_q3gunshot_mod = Mod_ForName ("progs/bullet.md3", true); R_RunParticleEffect (pos, vec3_origin, 0, 20); //R00k--start if (r_decal_bullets.value) { R_SpawnDecalStatic(pos, decal_mark, 10); } //R00k--end if ( rand() % 5 ) S_StartSound (-1, 0, cl_sfx_tink1, pos, 1, 1); else { rnd = rand() & 3; if (rnd == 1) S_StartSound (-1, 0, cl_sfx_ric1, pos, 1, 1); else if (rnd == 2) S_StartSound (-1, 0, cl_sfx_ric2, pos, 1, 1); else S_StartSound (-1, 0, cl_sfx_ric3, pos, 1, 1); } break; case TE_GUNSHOT: // bullet hitting wall pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); R_SurfacePoint(); if (r_part_gunshots.value == 2 && !cl_q3gunshot_mod) cl_q3gunshot_mod = Mod_ForName ("progs/bullet.md3", true); if(!Q_strncmp(texturehit,"sky",3) ) //Don't draw decals or sparks on the skybox break; //R00k--start if (r_decal_bullets.value) { R_SpawnDecalStatic(pos, decal_mark, 8); } //R00k--end if(!Q_strncmp(texturehit,"metal",5) ) { rnd = rand() & 3; if (rnd == 1) S_StartSound (-1, 0, cl_sfx_mric1, pos, 1, 1); else if (rnd == 2) S_StartSound (-1, 0, cl_sfx_mric2, pos, 1, 1); else S_StartSound (-1, 0, cl_sfx_mric3, pos, 1, 1); } else if(!Q_strncmp(texturehit,"wood",4) ) { rnd = rand() & 3; if (rnd == 1) S_StartSound (-1, 0, cl_sfx_wric1, pos, 1, 1); else if (rnd == 2) S_StartSound (-1, 0, cl_sfx_wric2, pos, 1, 1); else S_StartSound (-1, 0, cl_sfx_wric3, pos, 1, 1); } else { rnd = rand() & 3; if (rnd == 1) S_StartSound (-1, 0, cl_sfx_ric1, pos, 1, 1); else if (rnd == 2) S_StartSound (-1, 0, cl_sfx_ric2, pos, 1, 1); else S_StartSound (-1, 0, cl_sfx_ric3, pos, 1, 1); } R_RunParticleEffect (pos, vec3_origin, 0, 20); break; case TE_EXPLOSION: // rocket explosion pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); R_ParticleExplosion (pos); if (r_decal_explosions.value) { R_SpawnDecalStatic(pos, decal_burn, 100); } dl = CL_AllocDlight (0); VectorCopy (pos, dl->origin); dl->radius = 350; dl->die = cl.time + 0.5; dl->decay = 300; S_StartSound (-1, 0, cl_sfx_r_exp3, pos, 1, 1); break; case TE_TAREXPLOSION: // tarbaby explosion pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); R_BlobExplosion (pos); S_StartSound (-1, 0, cl_sfx_r_exp3, pos, 1, 1); break; case TE_LIGHTNING1: // lightning bolts CL_ParseBeam (Mod_ForName("progs/bolt.mdl", true)); break; case TE_LIGHTNING2: // lightning bolts CL_ParseBeam (Mod_ForName("progs/bolt2.mdl", true)); break; case TE_LIGHTNING3: // lightning bolts CL_ParseBeam (Mod_ForName("progs/bolt3.mdl", true)); break; // PGM 01/21/97 case TE_BEAM: // grappling hook beam CL_ParseBeam (Mod_ForName("progs/beam.mdl", true)); break; // PGM 01/21/97 case TE_LAVASPLASH: pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); R_LavaSplash (pos); dl = CL_AllocDlight (0); VectorCopy (pos, dl->origin); dl->radius = 150; dl->die = cl.time + 0.75; dl->decay = 200; break; case TE_TELEPORT: pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); if (r_part_telesplash.value == 2 && !cl_q3teleport_mod) cl_q3teleport_mod = Mod_ForName ("progs/telep.md3", true); R_TeleportSplash (pos); break; case TE_EXPLOSION2: // color mapped explosion pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); colorStart = MSG_ReadByte (); colorLength = MSG_ReadByte (); R_ParticleExplosion2 (pos, colorStart, colorLength); if (r_decal_explosions.value) { R_SpawnDecalStatic(pos, decal_burn, 100); } dl = CL_AllocDlight (0); VectorCopy (pos, dl->origin); dl->radius = 350; dl->die = cl.time + 0.5; dl->decay = 300; S_StartSound (-1, 0, cl_sfx_r_exp3, pos, 1, 1); break; #ifdef QUAKE2 case TE_IMPLOSION: pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); S_StartSound (-1, 0, cl_sfx_imp, pos, 1, 1); break; case TE_RAILTRAIL: pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); endpos[0] = MSG_ReadCoord (); endpos[1] = MSG_ReadCoord (); endpos[2] = MSG_ReadCoord (); S_StartSound (-1, 0, cl_sfx_rail, pos, 1, 1); S_StartSound (-1, 1, cl_sfx_r_exp3, endpos, 1, 1); R_RocketTrail (pos, endpos, 0+128); R_ParticleExplosion (endpos); dl = CL_AllocDlight (-1); VectorCopy (endpos, dl->origin); dl->radius = 350; dl->die = cl.time + 0.5; dl->decay = 300; break; #endif default: Sys_Error ("CL_ParseTEnt: bad type"); } }
/* ================= CL_ParseTEnt ================= */ void CL_ParseTEnt(void) { int type; vec3_t pos; dlight_t *dl; int rnd; explosion_t *ex; int cnt; type = MSG_ReadByte(); switch (type) { case TE_WIZSPIKE: // spike hitting wall pos[0] = MSG_ReadCoord(); pos[1] = MSG_ReadCoord(); pos[2] = MSG_ReadCoord(); R_RunParticleEffect(pos, vec3_origin, 20, 30); S_StartSound(-1, 0, cl_sfx_wizhit, pos, 1, 1); break; case TE_KNIGHTSPIKE: // spike hitting wall pos[0] = MSG_ReadCoord(); pos[1] = MSG_ReadCoord(); pos[2] = MSG_ReadCoord(); R_RunParticleEffect(pos, vec3_origin, 226, 20); S_StartSound(-1, 0, cl_sfx_knighthit, pos, 1, 1); break; case TE_SPIKE: // spike hitting wall pos[0] = MSG_ReadCoord(); pos[1] = MSG_ReadCoord(); pos[2] = MSG_ReadCoord(); R_RunParticleEffect(pos, vec3_origin, 0, 10); if (rand() % 5) S_StartSound(-1, 0, cl_sfx_tink1, pos, 1, 1); else { rnd = rand() & 3; if (rnd == 1) S_StartSound(-1, 0, cl_sfx_ric1, pos, 1, 1); else if (rnd == 2) S_StartSound(-1, 0, cl_sfx_ric2, pos, 1, 1); else S_StartSound(-1, 0, cl_sfx_ric3, pos, 1, 1); } break; case TE_SUPERSPIKE: // super spike hitting wall pos[0] = MSG_ReadCoord(); pos[1] = MSG_ReadCoord(); pos[2] = MSG_ReadCoord(); R_RunParticleEffect(pos, vec3_origin, 0, 20); if (rand() % 5) S_StartSound(-1, 0, cl_sfx_tink1, pos, 1, 1); else { rnd = rand() & 3; if (rnd == 1) S_StartSound(-1, 0, cl_sfx_ric1, pos, 1, 1); else if (rnd == 2) S_StartSound(-1, 0, cl_sfx_ric2, pos, 1, 1); else S_StartSound(-1, 0, cl_sfx_ric3, pos, 1, 1); } break; case TE_EXPLOSION: // rocket explosion // particles pos[0] = MSG_ReadCoord(); pos[1] = MSG_ReadCoord(); pos[2] = MSG_ReadCoord(); R_ParticleExplosion(pos); // light dl = CL_AllocDlight(0); VectorCopy(pos, dl->origin); dl->radius = 350; dl->die = cl.time + 0.5; dl->decay = 300; dl->color = dl_colors[DLIGHT_FLASH]; // sound S_StartSound(-1, 0, cl_sfx_r_exp3, pos, 1, 1); // sprite ex = CL_AllocExplosion(); VectorCopy(pos, ex->origin); ex->start = cl.time; ex->model = Mod_ForName("progs/s_explod.spr", true); break; case TE_TAREXPLOSION: // tarbaby explosion pos[0] = MSG_ReadCoord(); pos[1] = MSG_ReadCoord(); pos[2] = MSG_ReadCoord(); R_BlobExplosion(pos); S_StartSound(-1, 0, cl_sfx_r_exp3, pos, 1, 1); break; case TE_LIGHTNING1: // lightning bolts CL_ParseBeam(Mod_ForName("progs/bolt.mdl", true)); break; case TE_LIGHTNING2: // lightning bolts CL_ParseBeam(Mod_ForName("progs/bolt2.mdl", true)); break; case TE_LIGHTNING3: // lightning bolts CL_ParseBeam(Mod_ForName("progs/bolt3.mdl", true)); break; case TE_LAVASPLASH: pos[0] = MSG_ReadCoord(); pos[1] = MSG_ReadCoord(); pos[2] = MSG_ReadCoord(); R_LavaSplash(pos); break; case TE_TELEPORT: pos[0] = MSG_ReadCoord(); pos[1] = MSG_ReadCoord(); pos[2] = MSG_ReadCoord(); R_TeleportSplash(pos); break; case TE_GUNSHOT: // bullet hitting wall cnt = MSG_ReadByte(); pos[0] = MSG_ReadCoord(); pos[1] = MSG_ReadCoord(); pos[2] = MSG_ReadCoord(); R_RunParticleEffect(pos, vec3_origin, 0, 20 * cnt); break; case TE_BLOOD: // bullets hitting body cnt = MSG_ReadByte(); pos[0] = MSG_ReadCoord(); pos[1] = MSG_ReadCoord(); pos[2] = MSG_ReadCoord(); R_RunParticleEffect(pos, vec3_origin, 73, 20 * cnt); break; case TE_LIGHTNINGBLOOD: // lightning hitting body pos[0] = MSG_ReadCoord(); pos[1] = MSG_ReadCoord(); pos[2] = MSG_ReadCoord(); R_RunParticleEffect(pos, vec3_origin, 225, 50); break; default: Sys_Error("%s: bad type", __func__); } }
/* ================= CL_ParseTEnt ================= */ void CL_ParseTEnt (void) { int type; vec3_t pos; #ifdef QUAKE2 vec3_t endpos; #endif dlight_t *dl; int rnd; int colorStart, colorLength; type = MSG_ReadByte (); switch (type) { case TE_WIZSPIKE: // spike hitting wall pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); R_RunParticleEffect (pos, vec3_origin, 20, 30); S_StartSound (-1, 0, cl_sfx_wizhit, pos, 1, 1); break; case TE_KNIGHTSPIKE: // spike hitting wall pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); R_RunParticleEffect (pos, vec3_origin, 226, 20); S_StartSound (-1, 0, cl_sfx_knighthit, pos, 1, 1); break; case TE_SPIKE: // spike hitting wall pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); #ifdef GLTEST Test_Spawn (pos); #else R_RunParticleEffect (pos, vec3_origin, 0, 10); #endif if ( rand() % 5 ) S_StartSound (-1, 0, cl_sfx_tink1, pos, 1, 1); else { rnd = rand() & 3; if (rnd == 1) S_StartSound (-1, 0, cl_sfx_ric1, pos, 1, 1); else if (rnd == 2) S_StartSound (-1, 0, cl_sfx_ric2, pos, 1, 1); else S_StartSound (-1, 0, cl_sfx_ric3, pos, 1, 1); } break; case TE_SUPERSPIKE: // super spike hitting wall pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); R_RunParticleEffect (pos, vec3_origin, 0, 20); if ( rand() % 5 ) S_StartSound (-1, 0, cl_sfx_tink1, pos, 1, 1); else { rnd = rand() & 3; if (rnd == 1) S_StartSound (-1, 0, cl_sfx_ric1, pos, 1, 1); else if (rnd == 2) S_StartSound (-1, 0, cl_sfx_ric2, pos, 1, 1); else S_StartSound (-1, 0, cl_sfx_ric3, pos, 1, 1); } break; case TE_GUNSHOT: // bullet hitting wall pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); R_RunParticleEffect (pos, vec3_origin, 0, 20); break; case TE_EXPLOSION: // rocket explosion pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); R_ParticleExplosion (pos); dl = CL_AllocDlight (0); VectorCopy (pos, dl->origin); dl->radius = 350; dl->die = cl.time + 0.5f; dl->decay = 300; S_StartSound (-1, 0, cl_sfx_r_exp3, pos, 1, 1); break; case TE_TAREXPLOSION: // tarbaby explosion pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); R_BlobExplosion (pos); S_StartSound (-1, 0, cl_sfx_r_exp3, pos, 1, 1); break; case TE_LIGHTNING1: // lightning bolts CL_ParseBeam (Mod_ForName("progs/bolt.mdl", TRUE)); break; case TE_LIGHTNING2: // lightning bolts CL_ParseBeam (Mod_ForName("progs/bolt2.mdl", TRUE)); break; case TE_LIGHTNING3: // lightning bolts CL_ParseBeam (Mod_ForName("progs/bolt3.mdl", TRUE)); break; // PGM 01/21/97 case TE_BEAM: // grappling hook beam CL_ParseBeam (Mod_ForName("progs/beam.mdl", TRUE)); break; // PGM 01/21/97 case TE_LAVASPLASH: pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); R_LavaSplash (pos); break; case TE_TELEPORT: pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); R_TeleportSplash (pos); break; case TE_EXPLOSION2: // color mapped explosion pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); colorStart = MSG_ReadByte (); colorLength = MSG_ReadByte (); R_ParticleExplosion2 (pos, colorStart, colorLength); dl = CL_AllocDlight (0); VectorCopy (pos, dl->origin); dl->radius = 350; dl->die = cl.time + 0.5f; dl->decay = 300; S_StartSound (-1, 0, cl_sfx_r_exp3, pos, 1, 1); break; #ifdef QUAKE2 case TE_IMPLOSION: pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); S_StartSound (-1, 0, cl_sfx_imp, pos, 1, 1); break; case TE_RAILTRAIL: pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); endpos[0] = MSG_ReadCoord (); endpos[1] = MSG_ReadCoord (); endpos[2] = MSG_ReadCoord (); S_StartSound (-1, 0, cl_sfx_rail, pos, 1, 1); S_StartSound (-1, 1, cl_sfx_r_exp3, endpos, 1, 1); R_RocketTrail (pos, endpos, 0+128); R_ParticleExplosion (endpos); dl = CL_AllocDlight (-1); VectorCopy (endpos, dl->origin); dl->radius = 350; dl->die = cl.time + 0.5f; dl->decay = 300; break; #endif default: Sys_Error ("CL_ParseTEnt: bad type"); } }
/* ================= CL_ParseTEnt ================= */ void CL_ParseTEnt(void) { int type; vec3_t pos; dlight_t *dl; int rnd; type = MSG_ReadByte(); switch (type) { case TE_WIZSPIKE: // spike hitting wall pos[0] = MSG_ReadCoord(); pos[1] = MSG_ReadCoord(); pos[2] = MSG_ReadCoord(); R_RunParticleEffect(pos, vec3_origin, 20, 30); S_StartSound(-1, 0, cl_sfx_wizhit, pos, 1, 1); break; case TE_KNIGHTSPIKE: // spike hitting wall pos[0] = MSG_ReadCoord(); pos[1] = MSG_ReadCoord(); pos[2] = MSG_ReadCoord(); R_RunParticleEffect(pos, vec3_origin, 226, 20); S_StartSound(-1, 0, cl_sfx_knighthit, pos, 1, 1); break; case TE_SPIKE: // spike hitting wall pos[0] = MSG_ReadCoord(); pos[1] = MSG_ReadCoord(); pos[2] = MSG_ReadCoord(); R_RunParticleEffect(pos, vec3_origin, 0, 10); if (rand() % 5) S_StartSound(-1, 0, cl_sfx_tink1, pos, 1, 1); else { rnd = rand() & 3; if (rnd == 1) S_StartSound(-1, 0, cl_sfx_ric1, pos, 1, 1); else if (rnd == 2) S_StartSound(-1, 0, cl_sfx_ric2, pos, 1, 1); else S_StartSound(-1, 0, cl_sfx_ric3, pos, 1, 1); } break; case TE_SUPERSPIKE: // super spike hitting wall pos[0] = MSG_ReadCoord(); pos[1] = MSG_ReadCoord(); pos[2] = MSG_ReadCoord(); R_RunParticleEffect(pos, vec3_origin, 0, 20); if (rand() % 5) S_StartSound(-1, 0, cl_sfx_tink1, pos, 1, 1); else { rnd = rand() & 3; if (rnd == 1) S_StartSound(-1, 0, cl_sfx_ric1, pos, 1, 1); else if (rnd == 2) S_StartSound(-1, 0, cl_sfx_ric2, pos, 1, 1); else S_StartSound(-1, 0, cl_sfx_ric3, pos, 1, 1); } break; case TE_GUNSHOT: // bullet hitting wall pos[0] = MSG_ReadCoord(); pos[1] = MSG_ReadCoord(); pos[2] = MSG_ReadCoord(); R_RunParticleEffect(pos, vec3_origin, 0, 20); break; case TE_EXPLOSION: // rocket explosion pos[0] = MSG_ReadCoord(); pos[1] = MSG_ReadCoord(); pos[2] = MSG_ReadCoord(); R_ParticleExplosion(pos); dl = CL_AllocDlight(); VectorCopy(pos, dl->origin); dl->radius = 350; dl->die = cl.time + 0.5; dl->decay = 300; S_StartSound(-1, 0, cl_sfx_r_exp3, pos, 1, 1); break; case TE_TAREXPLOSION: // tarbaby explosion pos[0] = MSG_ReadCoord(); pos[1] = MSG_ReadCoord(); pos[2] = MSG_ReadCoord(); R_BlobExplosion(pos); S_StartSound(-1, 0, cl_sfx_r_exp3, pos, 1, 1); break; case TE_LIGHTNING1: // lightning bolts CL_ParseBeam(Mod_ForName("progs/bolt.mdl", true)); break; case TE_LIGHTNING2: // lightning bolts CL_ParseBeam(Mod_ForName("progs/bolt2.mdl", true)); break; case TE_LIGHTNING3: // lightning bolts CL_ParseBeam(Mod_ForName("progs/bolt3.mdl", true)); break; case TE_LAVASPLASH: pos[0] = MSG_ReadCoord(); pos[1] = MSG_ReadCoord(); pos[2] = MSG_ReadCoord(); R_LavaSplash(pos); break; case TE_TELEPORT: pos[0] = MSG_ReadCoord(); pos[1] = MSG_ReadCoord(); pos[2] = MSG_ReadCoord(); R_TeleportSplash(pos); break; default: Sys_Error("CL_ParseTEnt: bad type"); } }
/* ================== NQD_ParseServerData ================== */ static void NQD_ParseServerData (void) { char *str; int i; int nummodels, numsounds; char mapname[MAX_QPATH]; int cs2; qbool gpl_map; #ifdef GLQUAKE extern qbool r_gpl_map; #endif Com_DPrintf ("Serverdata packet received.\n"); // // wipe the client_state_t struct // CL_ClearState (); // parse protocol version number i = MSG_ReadLong (); if (i != NQ_PROTOCOL_VERSION) Host_Error ("Server returned version %i, not %i", i, NQ_PROTOCOL_VERSION); // parse maxclients nq_maxclients = MSG_ReadByte (); if (nq_maxclients < 1 || nq_maxclients > NQ_MAX_CLIENTS) Host_Error ("Bad maxclients (%u) from server", nq_maxclients); // parse gametype cl.gametype = MSG_ReadByte() ? GAME_DEATHMATCH : GAME_COOP; // parse signon message str = MSG_ReadString (); strlcpy (cl.levelname, str, sizeof(cl.levelname)); // separate the printfs so the server message can have a color Com_Printf("\n\n\35\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\37\n\n"); Com_Printf ("%c%s\n", 2, str); // // first we go through and touch all of the precache data that still // happens to be in the cache, so precaching something else doesn't // needlessly purge it // // precache models for (nummodels=1 ; ; nummodels++) { str = MSG_ReadString (); if (!str[0]) break; if (nummodels == MAX_MODELS) Host_Error ("Server sent too many model precaches"); strlcpy (cl.model_name[nummodels], str, sizeof(cl.model_name[0])); Mod_TouchModel (str); } // precache sounds for (numsounds=1 ; ; numsounds++) { str = MSG_ReadString (); if (!str[0]) break; if (numsounds == MAX_SOUNDS) Host_Error ("Server sent too many sound precaches"); strlcpy (cl.sound_name[numsounds], str, sizeof(cl.sound_name[0])); S_TouchSound (str); } // // now we try to load everything else until a cache allocation fails // cl.clipmodels[1] = CM_LoadMap (cl.model_name[1], true, NULL, &cl.map_checksum2); COM_StripExtension (COM_SkipPath(cl.model_name[1]), mapname); cs2 = Com_TranslateMapChecksum (mapname, cl.map_checksum2); gpl_map = (cl.map_checksum2 != cs2); cl.map_checksum2 = cs2; #ifdef GLQUAKE r_gpl_map = gpl_map; #endif for (i = 1; i < nummodels; i++) { cl.model_precache[i] = Mod_ForName (cl.model_name[i], false, i == 1); if (cl.model_precache[i] == NULL) Host_Error ("Model %s not found", cl.model_name[i]); if (cl.model_name[i][0] == '*') cl.clipmodels[i] = CM_InlineModel(cl.model_name[i]); } for (i=1 ; i<numsounds ; i++) { cl.sound_precache[i] = S_PrecacheSound (cl.sound_name[i]); } // local state if (!cl.model_precache[1]) Host_Error ("NQD_ParseServerData: NULL worldmodel"); COM_StripExtension (COM_SkipPath (cl.model_name[1]), mapname); Cvar_ForceSet (&host_mapname, mapname); CL_ClearParticles (); CL_FindModelNumbers (); R_NewMap (cl.model_precache[1]); TP_NewMap (); Hunk_Check (); // make sure nothing is hurt nq_signon = 0; nq_num_entities = 0; nq_drawpings = false; // unless we have the ProQuake extension cl.servertime_works = true; cl.allow_fbskins = true; r_refdef2.allow_cheats = true; // why not cls.state = ca_onserver; }
/* ================== CL_ParseServerInfo ================== */ void CL_ParseServerInfo (void) { const char *str; int i; int nummodels, numsounds; char model_precache[MAX_MODELS][MAX_QPATH]; char sound_precache[MAX_SOUNDS][MAX_QPATH]; Con_DPrintf ("Serverinfo packet received.\n"); // // wipe the client_state_t struct // CL_ClearState (); // parse protocol version number i = MSG_ReadLong (); //johnfitz -- support multiple protocols if (i != PROTOCOL_NETQUAKE && i != PROTOCOL_FITZQUAKE) { Con_Printf ("\n"); //becuase there's no newline after serverinfo print Host_Error ("Server returned version %i, not %i or %i\n", i, PROTOCOL_NETQUAKE, PROTOCOL_FITZQUAKE); } cl.protocol = i; //johnfitz // parse maxclients cl.maxclients = MSG_ReadByte (); if (cl.maxclients < 1 || cl.maxclients > MAX_SCOREBOARD) { Con_Printf("Bad maxclients (%u) from server\n", cl.maxclients); return; } cl.scores = (scoreboard_t *) Hunk_AllocName (cl.maxclients*sizeof(*cl.scores), "scores"); // parse gametype cl.gametype = MSG_ReadByte (); // parse signon message str = MSG_ReadString (); q_strlcpy (cl.levelname, str, sizeof(cl.levelname)); // seperate the printfs so the server message can have a color Con_Printf ("\n%s\n", Con_Quakebar(40)); //johnfitz Con_Printf ("%c%s\n", 2, str); //johnfitz -- tell user which protocol this is Con_Printf ("Using protocol %i\n", i); // first we go through and touch all of the precache data that still // happens to be in the cache, so precaching something else doesn't // needlessly purge it // precache models memset (cl.model_precache, 0, sizeof(cl.model_precache)); for (nummodels = 1 ; ; nummodels++) { str = MSG_ReadString (); if (!str[0]) break; if (nummodels==MAX_MODELS) { Con_Printf ("Server sent too many model precaches\n"); return; } q_strlcpy (model_precache[nummodels], str, MAX_QPATH); Mod_TouchModel (str); } //johnfitz -- check for excessive models if (nummodels >= 256) Con_Warning ("%i models exceeds standard limit of 256.\n", nummodels); //johnfitz // precache sounds memset (cl.sound_precache, 0, sizeof(cl.sound_precache)); for (numsounds = 1 ; ; numsounds++) { str = MSG_ReadString (); if (!str[0]) break; if (numsounds==MAX_SOUNDS) { Con_Printf ("Server sent too many sound precaches\n"); return; } q_strlcpy (sound_precache[numsounds], str, MAX_QPATH); S_TouchSound (str); } //johnfitz -- check for excessive sounds if (numsounds >= 256) Con_Warning ("%i sounds exceeds standard limit of 256.\n", numsounds); //johnfitz // // now we try to load everything else until a cache allocation fails // // copy the naked name of the map file to the cl structure -- O.S COM_StripExtension (COM_SkipPath(model_precache[1]), cl.mapname, sizeof(cl.mapname)); for (i = 1; i < nummodels; i++) { cl.model_precache[i] = Mod_ForName (model_precache[i], false); if (cl.model_precache[i] == NULL) { Con_Printf("Model %s not found\n", model_precache[i]); return; } CL_KeepaliveMessage (); } S_BeginPrecaching (); for (i = 1; i < numsounds; i++) { cl.sound_precache[i] = S_PrecacheSound (sound_precache[i]); CL_KeepaliveMessage (); } S_EndPrecaching (); // local state cl_entities[0].model = cl.worldmodel = cl.model_precache[1]; R_NewMap (); //johnfitz -- clear out string; we don't consider identical //messages to be duplicates if the map has changed in between con_lastcenterstring[0] = 0; //johnfitz Hunk_Check (); // make sure nothing is hurt noclip_anglehack = false; // noclip is turned off at start warn_about_nehahra_protocol = true; //johnfitz -- warn about nehahra protocol hack once per server connection //johnfitz -- reset developer stats memset(&dev_stats, 0, sizeof(dev_stats)); memset(&dev_peakstats, 0, sizeof(dev_peakstats)); memset(&dev_overflows, 0, sizeof(dev_overflows)); }
/* ================= CL_ParseTEnt ================= */ void CL_ParseTEnt (void) { int type; vec3_t pos; dlight_t *dl; int rnd; int colorStart, colorLength; type = MSG_ReadByte (); switch (type) { case TE_WIZSPIKE: // spike hitting wall pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); R_RunParticleEffect (pos, vec3_origin, 20, 30); #ifdef SUPPORTS_SOFTWARE_FTESTAIN R_AddStain(pos, -20, 11); //qbism ftestain #endif S_StartSound (-1, 0, cl_sfx_wizhit, pos, 1, 1); break; case TE_KNIGHTSPIKE: // spike hitting wall pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); R_RunParticleEffect (pos, vec3_origin, 226, 20); #ifdef SUPPORTS_SOFTWARE_FTESTAIN R_AddStain(pos, -20, 15); //qbism ftestain #endif S_StartSound (-1, 0, cl_sfx_knighthit, pos, 1, 1); break; case TE_SPIKE: // spike hitting wall pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); R_RunParticleEffect (pos, vec3_origin, 0, 10); #ifdef SUPPORTS_SOFTWARE_FTESTAIN R_AddStain(pos, -30, 10); //qbism ftestain #endif if ( rand() % 5 ) { S_StartSound (-1, 0, cl_sfx_tink1, pos, 1, 1); } else { rnd = rand() & 3; if (rnd == 1) S_StartSound (-1, 0, cl_sfx_ric1, pos, 1, 1); else if (rnd == 2) S_StartSound (-1, 0, cl_sfx_ric2, pos, 1, 1); else S_StartSound (-1, 0, cl_sfx_ric3, pos, 1, 1); } break; case TE_SUPERSPIKE: // super spike hitting wall pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); R_RunParticleEffect (pos, vec3_origin, 0, 20); #ifdef SUPPORTS_SOFTWARE_FTESTAIN R_AddStain(pos, -30, 10); //qbism ftestain #endif if ( rand() % 5 ) { S_StartSound (-1, 0, cl_sfx_tink1, pos, 1, 1); } else { rnd = rand() & 3; if (rnd == 1) S_StartSound (-1, 0, cl_sfx_ric1, pos, 1, 1); else if (rnd == 2) S_StartSound (-1, 0, cl_sfx_ric2, pos, 1, 1); else S_StartSound (-1, 0, cl_sfx_ric3, pos, 1, 1); } break; case TE_GUNSHOT: // bullet hitting wall pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); #ifdef SUPPORTS_KUROK if (!kurok) #endif { R_RunParticleEffect (pos, vec3_origin, 0, 20); #ifdef SUPPORTS_SOFTWARE_FTESTAIN R_AddStain(pos, -40, 12); //qbism ftestain #endif } break; case TE_EXPLOSION: // rocket explosion pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); R_ParticleExplosion (pos); dl = CL_AllocDlight (0); VectorCopy (pos, dl->origin); dl->radius = 350; dl->die = cl.time + 0.5; dl->decay = 300; #ifdef SUPPORTS_KUROK if(kurok) { dl->color[0] = MSG_ReadCoord (); dl->color[1] = MSG_ReadCoord (); dl->color[2] = MSG_ReadCoord (); } #endif #ifdef SUPPORTS_SOFTWARE_FTESTAIN R_AddStain(pos, -30, 45); //qbism ftestain #endif S_StartSound (-1, 0, cl_sfx_r_exp3, pos, 1, 1); break; case TE_TAREXPLOSION: // tarbaby explosion pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); R_BlobExplosion (pos); #ifdef SUPPORTS_KUROK if(kurok) { dl = CL_AllocDlight (0); VectorCopy (pos, dl->origin); dl->radius = 150; dl->die = cl.time + 0.75; dl->decay = 200; dl->color[0] = MSG_ReadCoord (); dl->color[1] = MSG_ReadCoord (); dl->color[2] = MSG_ReadCoord (); } #endif #ifdef SUPPORTS_SOFTWARE_FTESTAIN R_AddStain(pos, -20, 60); //qbism ftestain #endif S_StartSound (-1, 0, cl_sfx_r_exp3, pos, 1, 1); break; case TE_LIGHTNING1: // lightning bolts CL_ParseBeam (Mod_ForName("progs/bolt.mdl", true)); break; case TE_LIGHTNING2: // lightning bolts CL_ParseBeam (Mod_ForName("progs/bolt2.mdl", true)); break; case TE_LIGHTNING3: // lightning bolts CL_ParseBeam (Mod_ForName("progs/bolt3.mdl", true)); break; // PGM 01/21/97 case TE_BEAM: // grappling hook beam CL_ParseBeam (Mod_ForName("progs/beam.mdl", true)); break; // PGM 01/21/97 case TE_LAVASPLASH: pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); R_LavaSplash (pos); break; case TE_TELEPORT: pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); R_TeleportSplash (pos); break; case TE_EXPLOSION2: // color mapped explosion pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); colorStart = MSG_ReadByte (); colorLength = MSG_ReadByte (); R_ParticleExplosion2 (pos, colorStart, colorLength); dl = CL_AllocDlight (0); VectorCopy (pos, dl->origin); dl->radius = 350; dl->die = cl.time + 0.5; dl->decay = 300; #ifdef SUPPORTS_SOFTWARE_FTESTAIN R_AddStain(pos, -30, 50); //qbism ftestain #endif S_StartSound (-1, 0, cl_sfx_r_exp3, pos, 1, 1); break; default: Sys_Error ("CL_ParseTEnt: bad type"); } }
static void CL_ParseStream (int type, qboolean parse_only) { int ent; int tag; int flags; int skin; vec3_t source; vec3_t dest; stream_t *stream; float duration; model_t *models[4]; ent = MSG_ReadShort(); flags = MSG_ReadByte(); tag = flags&15; duration = (float)MSG_ReadByte()*HX_FRAME_TIME; skin = 0; if(type == TE_STREAM_COLORBEAM) { skin = MSG_ReadByte(); } source[0] = MSG_ReadCoord(); source[1] = MSG_ReadCoord(); source[2] = MSG_ReadCoord(); dest[0] = MSG_ReadCoord(); dest[1] = MSG_ReadCoord(); dest[2] = MSG_ReadCoord(); if (parse_only) return; models[1] = models[2] = models[3] = NULL; switch(type) { case TE_STREAM_CHAIN: models[0] = Mod_ForName("models/stchain.mdl", true); break; case TE_STREAM_SUNSTAFF1: models[0] = Mod_ForName("models/stsunsf1.mdl", true); models[1] = Mod_ForName("models/stsunsf2.mdl", true); models[2] = Mod_ForName("models/stsunsf3.mdl", true); models[3] = Mod_ForName("models/stsunsf4.mdl", true); break; case TE_STREAM_SUNSTAFF2: models[0] = Mod_ForName("models/stsunsf5.mdl", true); models[2] = Mod_ForName("models/stsunsf3.mdl", true); models[3] = Mod_ForName("models/stsunsf4.mdl", true); break; case TE_STREAM_LIGHTNING: models[0] = Mod_ForName("models/stlghtng.mdl", true); // duration*=2; break; case TE_STREAM_LIGHTNING_SMALL: models[0] = Mod_ForName("models/stltng2.mdl", true); // duration*=2; break; case TE_STREAM_FAMINE: models[0] = Mod_ForName("models/fambeam.mdl", true); break; case TE_STREAM_COLORBEAM: models[0] = Mod_ForName("models/stclrbm.mdl", true); break; case TE_STREAM_ICECHUNKS: models[0] = Mod_ForName("models/stice.mdl", true); break; case TE_STREAM_GAZE: models[0] = Mod_ForName("models/stmedgaz.mdl", true); break; default: Sys_Error("ParseStream: bad type"); } if((stream = CL_NewStream(ent, tag)) == NULL) { Con_Print("stream list overflow\n"); return; } stream->type = type; stream->tag = tag; stream->flags = flags; stream->entity = ent; stream->skin = skin; stream->models[0] = models[0]; stream->models[1] = models[1]; stream->models[2] = models[2]; stream->models[3] = models[3]; stream->endTime = cl.time + duration; stream->startTime = cl.time - duration; // JDH stream->lastTrailTime = 0; VectorCopy(source, stream->source); VectorCopy(dest, stream->dest); if(flags & STREAM_ATTACHED) { VectorSubtract(source, cl_entities[ent].origin, stream->offset); } }
/* ================== CL_ParseServerInfo ================== */ void CL_ParseServerInfo (void) { char *str, tempname[MAX_QPATH];; int i; int nummodels, numsounds; char model_precache[MAX_MODELS][MAX_QPATH]; char sound_precache[MAX_SOUNDS][MAX_QPATH]; extern qboolean r_loadq3player; //void R_PreMapLoad (char *); char mapname[MAX_QPATH]; Con_DPrintf ("Serverinfo packet received.\n"); // // wipe the client_state_t struct // CL_ClearState (); // parse protocol version number i = MSG_ReadLong (); if (i != PROTOCOL_VERSION) { Con_Printf ("Server returned version %i, not %i", i, PROTOCOL_VERSION); return; } // parse maxclients cl.maxclients = MSG_ReadByte (); if (cl.maxclients < 1 || cl.maxclients > MAX_SCOREBOARD) { Con_Printf("Bad maxclients (%u) from server\n", cl.maxclients); return; } cl.scores = Hunk_AllocName (cl.maxclients*sizeof(*cl.scores), "scores"); // parse gametype cl.gametype = MSG_ReadByte (); // parse signon message str = MSG_ReadString (); strncpy (cl.levelname, str, sizeof(cl.levelname)-1); // seperate the printfs so the server message can have a color Con_Printf("\n\n\35\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\37\n\n"); Con_Printf ("%c%s\n", 2, str); // // first we go through and touch all of the precache data that still // happens to be in the cache, so precaching something else doesn't // needlessly purge it // // precache models for (i=0 ; i<NUM_MODELINDEX ; i++) cl_modelindex[i] = -1; // precache models memset (cl.model_precache, 0, sizeof(cl.model_precache)); for (nummodels=1 ; ; nummodels++) { str = MSG_ReadString (); if (!str[0]) break; if (nummodels==MAX_MODELS) { Con_Printf ("Server sent too many model precaches\n"); return; } if (r_loadq3models.value) { if (!strcmp(str, "progs/player.mdl") && FS_FindFile("progs/player/head.md3") && FS_FindFile("progs/player/upper.md3") && FS_FindFile("progs/player/lower.md3")) { Q_strncpyz (tempname, "progs/player/lower.md3", MAX_QPATH); str = tempname; cl_modelindex[mi_player] = nummodels; r_loadq3player = true; } else { COM_StripExtension (str, tempname); strcat (tempname, ".md3"); if (FS_FindFile(tempname)) str = tempname; } } Q_strncpyz (model_precache[nummodels], str, sizeof(model_precache[nummodels])); Mod_TouchModel (str); if (!strcmp(model_precache[nummodels], "progs/player.mdl")) cl_modelindex[mi_player] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/eyes.mdl")) cl_modelindex[mi_eyes] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/missile.mdl")) cl_modelindex[mi_rocket] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/grenade.mdl")) cl_modelindex[mi_grenade] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/flame.mdl")) cl_modelindex[mi_flame1] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/flame2.mdl")) cl_modelindex[mi_flame2] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/s_expl.spr")) cl_modelindex[mi_explo1] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/s_explod.spr")) cl_modelindex[mi_explo2] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/s_bubble.spr")) cl_modelindex[mi_bubble] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/gib1.mdl")) cl_modelindex[mi_gib1] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/gib2.mdl")) cl_modelindex[mi_gib2] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/gib3.mdl")) cl_modelindex[mi_gib3] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/fish.mdl")) cl_modelindex[mi_fish] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/dog.mdl")) cl_modelindex[mi_dog] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/soldier.mdl")) cl_modelindex[mi_soldier] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/enforcer.mdl")) cl_modelindex[mi_enforcer] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/knight.mdl")) cl_modelindex[mi_knight] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/hknight.mdl")) cl_modelindex[mi_hknight] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/wizard.mdl")) cl_modelindex[mi_scrag] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/ogre.mdl")) cl_modelindex[mi_ogre] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/demon.mdl")) cl_modelindex[mi_fiend] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/shalrath.mdl")) cl_modelindex[mi_vore] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/shambler.mdl")) cl_modelindex[mi_shambler] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/h_dog.mdl")) cl_modelindex[mi_h_dog] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/h_guard.mdl")) cl_modelindex[mi_h_soldier] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/h_mega.mdl")) cl_modelindex[mi_h_enforcer] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/h_knight.mdl")) cl_modelindex[mi_h_knight] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/h_hknight.mdl")) cl_modelindex[mi_h_hknight] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/h_wizard.mdl")) cl_modelindex[mi_h_scrag] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/h_ogre.mdl")) cl_modelindex[mi_h_ogre] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/h_demon.mdl")) cl_modelindex[mi_h_fiend] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/h_shal.mdl")) cl_modelindex[mi_h_vore] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/h_shams.mdl")) cl_modelindex[mi_h_shambler] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/h_zombie.mdl")) cl_modelindex[mi_h_zombie] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/h_player.mdl")) cl_modelindex[mi_h_player] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/w_s_key.mdl")) cl_modelindex[mi_w_s_key] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/w_g_key.mdl")) cl_modelindex[mi_w_g_key] = nummodels; } if (r_loadq3player) { if (nummodels + 1 >= MAX_MODELS) { Con_Printf ("Server sent too many model precaches -> can't load Q3 player model\n"); Q_strncpyz (model_precache[cl_modelindex[mi_player]], cl_modelnames[mi_player], sizeof(model_precache[cl_modelindex[mi_player]])); } else { Q_strncpyz (model_precache[nummodels], "progs/player/upper.md3", sizeof(model_precache[nummodels])); cl_modelindex[mi_q3torso] = nummodels++; Q_strncpyz (model_precache[nummodels], "progs/player/head.md3", sizeof(model_precache[nummodels])); cl_modelindex[mi_q3head] = nummodels++; } } // precache sounds memset (cl.sound_precache, 0, sizeof(cl.sound_precache)); for (numsounds=1 ; ; numsounds++) { str = MSG_ReadString (); if (!str[0]) break; if (numsounds==MAX_SOUNDS) { Con_Printf ("Server sent too many sound precaches\n"); return; } strcpy (sound_precache[numsounds], str); S_TouchSound (str); } //COM_StripExtension (COM_SkipPath(model_precache[1]), mapname); //R_PreMapLoad (mapname); // // now we try to load everything else until a cache allocation fails // loading_num_step[loading_level] = nummodels + numsounds; sprintf(loading_name[loading_level], "Models and Sounds"); for (i=1 ; i<nummodels ; i++) { cl.model_precache[i] = Mod_ForName (model_precache[i], false); if (cl.model_precache[i] == NULL) { Con_Printf("Model %s not found\n", model_precache[i]); return; } CL_KeepaliveMessage (); loading_cur_step[loading_level]++; SCR_UpdateScreen (); } // load the extra "no-flamed-torch" model cl.model_precache[nummodels] = Mod_ForName ("progs/flame0.mdl", false); cl_modelindex[mi_flame0] = nummodels++; cl.model_precache[nummodels] = Mod_ForName ("progs/flag.mdl", false); cl_modelindex[mi_flag] = nummodels++; S_BeginPrecaching (); for (i=1 ; i<numsounds ; i++) { cl.sound_precache[i] = S_PrecacheSound (sound_precache[i]); CL_KeepaliveMessage (); loading_cur_step[loading_level]++; SCR_UpdateScreen (); } S_EndPrecaching (); Clear_LoadingFill (); // local state cl_entities[0].model = cl.worldmodel = cl.model_precache[1]; R_NewMap (); Hunk_Check (); // make sure nothing is hurt noclip_anglehack = false; // noclip is turned off at start }
/* ================== CL_ParseServerInfo ================== */ void CL_ParseServerInfo (void) { char *str; int i; int nummodels, numsounds; static char model_precache[MAX_MODELS][MAX_QPATH]; static char sound_precache[MAX_SOUNDS][MAX_QPATH]; Con_DPrintf ("Serverinfo packet received.\n"); // // wipe the client_state_t struct // CL_ClearState (); // parse protocol version number i = MSG_ReadLong (); if (i != PROTOCOL_VERSION) { Con_Printf ("Server returned version %i, not %i", i, PROTOCOL_VERSION); return; } // parse maxclients cl.maxclients = MSG_ReadByte (); if (cl.maxclients < 1 || cl.maxclients > MAX_SCOREBOARD) { Con_Printf("Bad maxclients (%u) from server\n", cl.maxclients); return; } cl.scores = Hunk_AllocName (cl.maxclients*sizeof(*cl.scores), "scores"); // parse gametype cl.gametype = MSG_ReadByte (); if (cl.gametype == GAME_DEATHMATCH) sv_kingofhill = MSG_ReadShort (); // parse signon message str = MSG_ReadString (); strncpy (cl.levelname, str, sizeof(cl.levelname)-1); // seperate the printfs so the server message can have a color Con_Printf("\n\n\35\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\37\n\n"); Con_Printf ("%c%s\n", 2, str); // // first we go through and touch all of the precache data that still // happens to be in the cache, so precaching something else doesn't // needlessly purge it // // precache models memset (cl.model_precache, 0, sizeof(cl.model_precache)); for (nummodels=1 ; ; nummodels++) { str = MSG_ReadString (); if (!str[0]) break; if (nummodels==MAX_MODELS) { Con_Printf ("Server sent too many model precaches\n"); return; } strcpy (model_precache[nummodels], str); Mod_TouchModel (str); } // precache sounds memset (cl.sound_precache, 0, sizeof(cl.sound_precache)); for (numsounds=1 ; ; numsounds++) { str = MSG_ReadString (); if (!str[0]) break; if (numsounds==MAX_SOUNDS) { Con_Printf ("Server sent too many sound precaches\n"); return; } strcpy (sound_precache[numsounds], str); S_TouchSound (str); } // // now we try to load everything else until a cache allocation fails // if (precache.value) { total_loading_size = nummodels + numsounds; current_loading_size = 1; loading_stage = 2; } //always precache the world!!! cl.model_precache[1] = Mod_ForName (model_precache[1], false); for (i=2 ; i<nummodels ; i++) { if (precache.value) { cl.model_precache[i] = Mod_ForName (model_precache[i], false); current_loading_size++; //SCR_DrawLoading(); //D_ShowLoadingSize(); } else cl.model_precache[i] = (model_t *)Mod_FindName (model_precache[i]); if (cl.model_precache[i] == NULL) { Con_Printf("Model %s not found\n", model_precache[i]); return; } CL_KeepaliveMessage (); } player_models[0] = (model_t *)Mod_FindName ("models/paladin.mdl"); player_models[1] = (model_t *)Mod_FindName ("models/crusader.mdl"); player_models[2] = (model_t *)Mod_FindName ("models/necro.mdl"); player_models[3] = (model_t *)Mod_FindName ("models/assassin.mdl"); #ifndef NO_PRAVEUS player_models[4] = (model_t *)Mod_FindName ("models/succubus.mdl"); #endif S_BeginPrecaching (); for (i=1 ; i<numsounds ; i++) { cl.sound_precache[i] = S_PrecacheSound (sound_precache[i]); if (precache.value) { current_loading_size++; //SCR_DrawLoading(); //D_ShowLoadingSize(); } CL_KeepaliveMessage (); } S_EndPrecaching (); total_loading_size = 0; loading_stage = 0; // local state cl_entities[0].model = cl.worldmodel = cl.model_precache[1]; R_NewMap (); puzzle_strings = (char *)COM_LoadHunkFile ("puzzles.txt"); Hunk_Check (); // make sure nothing is hurt noclip_anglehack = false; // noclip is turned off at start }
/* ================= CL_ParseBeam ================= */ void CL_ParseBeam (int type) { int ent; vec3_t start, end; beam_t *b; struct model_s *m; int i; ent = MSG_ReadShort (); start[0] = MSG_ReadCoord (); start[1] = MSG_ReadCoord (); start[2] = MSG_ReadCoord (); end[0] = MSG_ReadCoord (); end[1] = MSG_ReadCoord (); end[2] = MSG_ReadCoord (); // ZQuake protocol extension: // TE_LIGHTNING1 with entity num in -1288..-265 range is TE_BEAM if (type == 1 && (ent >= -1288 && ent <= -265) /* 1024 slots */) { if (!cl_beam_mod) cl_beam_mod = Mod_ForName ("progs/beam.mdl", true); m = cl_beam_mod; ent -= -1288; goto do_beam; } switch (type) { case 1: if (!cl_bolt1_mod) cl_bolt1_mod = Mod_ForName ("progs/bolt.mdl", true); m = cl_bolt1_mod; break; case 2: if (!cl_bolt2_mod) cl_bolt2_mod = Mod_ForName ("progs/bolt2.mdl", true); m = cl_bolt2_mod; break; case 3: if (!cl_bolt3_mod) cl_bolt3_mod = Mod_ForName ("progs/bolt3.mdl", true); m = cl_bolt3_mod; break; case 4: default: if (!cl_beam_mod) cl_beam_mod = Mod_ForName ("progs/beam.mdl", true); m = cl_beam_mod; break; } do_beam: if (ent == Cam_PlayerNum() + 1) VectorCopy (end, playerbeam_end); // for cl_fakeshaft // override any beam with the same entity for (i = 0, b = cl_beams; i < MAX_BEAMS; i++, b++) { if (b->entity == ent) { b->model = m; b->endtime = cl.time + 0.2; VectorCopy (start, b->start); VectorCopy (end, b->end); return; } } // find a free beam for (i = 0, b = cl_beams; i < MAX_BEAMS; i++, b++) { if (!b->model || b->endtime < cl.time) { b->entity = ent; b->model = m; b->endtime = cl.time + 0.2; VectorCopy (start, b->start); VectorCopy (end, b->end); return; } } Com_DPrintf ("beam list overflow!\n"); }
/* ================== CL_ParseServerInfo ================== */ static void CL_ParseServerInfo (void) { const char *str; int i; int nummodels, numsounds; char model_precache[MAX_MODELS][MAX_QPATH]; char sound_precache[MAX_SOUNDS][MAX_QPATH]; // rjr edict_t *ent; Con_DPrintf ("Serverinfo packet received.\n"); // // wipe the client_state_t struct // CL_ClearState (); // parse protocol version number cl_protocol = MSG_ReadLong (); switch (cl_protocol) { case PROTOCOL_RAVEN_111: case PROTOCOL_RAVEN_112: case PROTOCOL_UQE_113: Con_Printf ("\nServer using protocol %i\n", cl_protocol); break; default: Con_Printf ("\nServer returned version %i, not %i or %i\n", cl_protocol, PROTOCOL_RAVEN_112, PROTOCOL_UQE_113); return; } // parse maxclients cl.maxclients = MSG_ReadByte (); if (cl.maxclients < 1 || cl.maxclients > MAX_CLIENTS) { Con_Printf("Bad maxclients (%d) from server\n", cl.maxclients); return; } cl.scores = (scoreboard_t *) Hunk_AllocName (cl.maxclients*sizeof(*cl.scores), "scores"); // parse gametype cl.gametype = MSG_ReadByte (); if (cl.gametype == GAME_DEATHMATCH && cl_protocol > PROTOCOL_RAVEN_111) sv_kingofhill = MSG_ReadShort (); // parse signon message str = MSG_ReadString (); q_strlcpy (cl.levelname, str, sizeof(cl.levelname)); // seperate the printfs so the server message can have a color Con_Printf("\n\n\35\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\37\n\n"); Con_Printf ("%c%s\n", 2, str); // // first we go through and touch all of the precache data that still // happens to be in the cache, so precaching something else doesn't // needlessly purge it // // precache models memset (cl.model_precache, 0, sizeof(cl.model_precache)); for (nummodels = 1 ; ; nummodels++) { str = MSG_ReadString (); if (!str[0]) break; if (nummodels == MAX_MODELS) { Con_Printf ("Server sent too many model precaches\n"); return; } q_strlcpy (model_precache[nummodels], str, MAX_QPATH); Mod_TouchModel (str); } // precache sounds memset (cl.sound_precache, 0, sizeof(cl.sound_precache)); for (numsounds = 1 ; ; numsounds++) { str = MSG_ReadString (); if (!str[0]) break; if (numsounds == MAX_SOUNDS) { Con_Printf ("Server sent too many sound precaches\n"); return; } q_strlcpy (sound_precache[numsounds], str, MAX_QPATH); S_TouchSound (str); } // // now we try to load everything else until a cache allocation fails // if (precache.integer) { total_loading_size = nummodels + numsounds; current_loading_size = 1; loading_stage = 2; } // copy the naked name of the map file to the cl structure COM_StripExtension (COM_SkipPath(model_precache[1]), cl.mapname, sizeof(cl.mapname)); //always precache the world!!! cl.model_precache[1] = Mod_ForName (model_precache[1], false); for (i = 2; i < nummodels; i++) { if (precache.integer) { cl.model_precache[i] = Mod_ForName (model_precache[i], false); current_loading_size++; D_ShowLoadingSize(); } else cl.model_precache[i] = (model_t *)Mod_FindName (model_precache[i]); if (cl.model_precache[i] == NULL) { Host_Error("Model %s not found", model_precache[i]); return; } CL_KeepaliveMessage (); } player_models[0] = (model_t *)Mod_FindName ("models/paladin.mdl"); // Note: old demo doesnt have necro and crusader classes. add // a GAME_OLD_DEMO flag check ? player_models[1] = (model_t *)Mod_FindName ("models/crusader.mdl"); player_models[2] = (model_t *)Mod_FindName ("models/necro.mdl"); player_models[3] = (model_t *)Mod_FindName ("models/assassin.mdl"); if (gameflags & GAME_PORTALS) player_models[4] = (model_t *)Mod_FindName ("models/succubus.mdl"); S_BeginPrecaching (); for (i = 1; i < numsounds; i++) { cl.sound_precache[i] = S_PrecacheSound (sound_precache[i]); if (precache.integer) { current_loading_size++; D_ShowLoadingSize(); } CL_KeepaliveMessage (); } S_EndPrecaching (); total_loading_size = 0; loading_stage = 0; // local state cl_entities[0].model = cl.worldmodel = cl.model_precache[1]; R_NewMap (); if (!sv.active) { PR_LoadStrings(); } PR_LoadPuzzleStrings(); // mission pack, objectives strings if (gameflags & GAME_PORTALS) PR_LoadInfoStrings(); Hunk_Check (); // make sure nothing is hurt // we connected to the server, make sure the mouse is going - S.A. menu_disabled_mouse = false; IN_ActivateMouse(); }
/* ================= CL_ParseTEnt ================= */ void CL_ParseTEnt (void) { int type; vec3_t pos; cdlight_t *dl; int rnd; explosion_t *ex; int cnt; type = MSG_ReadByte (); switch (type) { case TE_WIZSPIKE: // spike hitting wall pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); CL_RunParticleEffect (pos, vec3_origin, 20, 30); S_StartSound (-1, 0, cl_sfx_wizhit, pos, 1, ATTN_NORM); { dl = CL_AllocDlight (0); VectorCopy (pos, dl->origin); dl->radius = 250; dl->die = cl.time + 0.5; dl->decay = 300; R_ColorWizLight (dl); } break; case TE_KNIGHTSPIKE: // spike hitting wall pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); CL_RunParticleEffect (pos, vec3_origin, 226, 20); S_StartSound (-1, 0, cl_sfx_knighthit, pos, 1, ATTN_NORM); { dl = CL_AllocDlight (0); VectorCopy (pos, dl->origin); dl->radius = 250; dl->die = cl.time + 0.5; dl->decay = 300; R_ColorDLight (dl, 408, 242, 117); } break; case TE_SPIKE: // spike hitting wall pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); CL_RunParticleEffect (pos, vec3_origin, 0, 10); if ( rand() % 5 ) S_StartSound (-1, 0, cl_sfx_tink1, pos, 1, ATTN_NORM); else { rnd = rand() & 3; if (rnd == 1) S_StartSound (-1, 0, cl_sfx_ric1, pos, 1, ATTN_NORM); else if (rnd == 2) S_StartSound (-1, 0, cl_sfx_ric2, pos, 1, ATTN_NORM); else S_StartSound (-1, 0, cl_sfx_ric3, pos, 1, ATTN_NORM); } break; case TE_SUPERSPIKE: // super spike hitting wall pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); CL_RunParticleEffect (pos, vec3_origin, 0, 20); if ( rand() % 5 ) S_StartSound (-1, 0, cl_sfx_tink1, pos, 1, ATTN_NORM); else { rnd = rand() & 3; if (rnd == 1) S_StartSound (-1, 0, cl_sfx_ric1, pos, 1, ATTN_NORM); else if (rnd == 2) S_StartSound (-1, 0, cl_sfx_ric2, pos, 1, ATTN_NORM); else S_StartSound (-1, 0, cl_sfx_ric3, pos, 1, ATTN_NORM); } break; case TE_EXPLOSION: // rocket explosion particles pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); if (cl_explosion.value == 6) CL_TeleportSplash (pos); else if (cl_explosion.value == 7) CL_RunParticleEffect (pos, vec3_origin, 73, 20*32); else if (cl_explosion.value == 8) CL_RunParticleEffect (pos, vec3_origin, 225, 50); else if (cl_explosion.value != 1 && cl_explosion.value != 3) CL_ParticleExplosion (pos); dl = CL_AllocDlight (0); VectorCopy (pos, dl->origin); dl->radius = 350; dl->die = cl.time + 0.5; dl->decay = 300; R_ColorDLight (dl, 408, 242, 117); // sound S_StartSound (-1, 0, cl_sfx_r_exp3, pos, 1, ATTN_NORM); // sprite if (cl_explosion.value != 6 && cl_explosion.value != 7 && cl_explosion.value != 8) { if (!cl_explo_mod) cl_explo_mod = Mod_ForName ("progs/s_explod.spr", true); ex = CL_AllocExplosion (); VectorCopy (pos, ex->origin); ex->start = cl.time; ex->model = cl_explo_mod; } break; case TE_TAREXPLOSION: // tarbaby explosion pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); CL_BlobExplosion (pos); { dl = CL_AllocDlight (0); VectorCopy (pos, dl->origin); dl->radius = 350; dl->die = cl.time + 0.5; dl->decay = 300; R_ColorDLight (dl, 399, 141, 228); } S_StartSound (-1, 0, cl_sfx_r_exp3, pos, 1, ATTN_NORM); break; case TE_LIGHTNING1: // lightning bolts CL_ParseBeam (1); break; case TE_LIGHTNING2: // lightning bolts CL_ParseBeam (2); break; case TE_LIGHTNING3: // lightning bolts CL_ParseBeam (3); break; case TE_LAVASPLASH: pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); CL_LavaSplash (pos); break; case TE_TELEPORT: pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); CL_TeleportSplash (pos); break; case TE_GUNSHOT: // bullet hitting wall if (cls.nqprotocol) cnt = 1; else cnt = MSG_ReadByte (); pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); CL_RunParticleEffect (pos, vec3_origin, 0, 20*cnt); break; case TE_BLOOD: // bullets hitting body if (cls.nqprotocol) { // NQ_TE_EXPLOSION2 int colorStart, colorLength; pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); colorStart = MSG_ReadByte (); colorLength = MSG_ReadByte (); CL_ParticleExplosion2 (pos, colorStart, colorLength); dl = CL_AllocDlight (0); VectorCopy (pos, dl->origin); dl->radius = 350; dl->die = cl.time + 0.5; dl->decay = 300; S_StartSound (-1, 0, cl_sfx_r_exp3, pos, 1, ATTN_NORM); break; } cnt = MSG_ReadByte (); pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); CL_RunParticleEffect (pos, vec3_origin, 73, 20*cnt); break; case TE_LIGHTNINGBLOOD: // lightning hitting body if (cls.nqprotocol) { // NQ_TE_BEAM - grappling hook beam CL_ParseBeam (4); break; } pos[0] = MSG_ReadCoord (); pos[1] = MSG_ReadCoord (); pos[2] = MSG_ReadCoord (); CL_RunParticleEffect (pos, vec3_origin, 225, 50); break; default: Host_Error ("CL_ParseTEnt: bad type"); } }
void CL_ParseTEnt (void) { byte type; dlight_t *dl; tent_obj_t *to; explosion_t *ex; int colorStart, colorLength; int cnt = -1; vec3_t pos; sfx_t *spike_sound[] = { cl_sfx_ric3, cl_sfx_ric3, cl_sfx_ric2, cl_sfx_ric1, }; type = MSG_ReadByte (net_message); switch (type) { case TE_WIZSPIKE: // spike hitting wall MSG_ReadCoordV (net_message, pos); r_funcs->particles->R_WizSpikeEffect (pos); S_StartSound (-1, 0, cl_sfx_wizhit, pos, 1, 1); break; case TE_KNIGHTSPIKE: // spike hitting wall MSG_ReadCoordV (net_message, pos); r_funcs->particles->R_KnightSpikeEffect (pos); S_StartSound (-1, 0, cl_sfx_knighthit, pos, 1, 1); break; case TE_SPIKE: // spike hitting wall MSG_ReadCoordV (net_message, pos); r_funcs->particles->R_SpikeEffect (pos); { int i; sfx_t *sound; i = (rand () % 20) - 16; if (i >= 0) sound = spike_sound[i]; else sound = cl_sfx_tink1; S_StartSound (-1, 0, sound, pos, 1, 1); } break; case TE_SUPERSPIKE: // super spike hitting wall MSG_ReadCoordV (net_message, pos); r_funcs->particles->R_SuperSpikeEffect (pos); { int i; sfx_t *sound; i = (rand () % 20) - 16; if (i >= 0) sound = spike_sound[i]; else sound = cl_sfx_tink1; S_StartSound (-1, 0, sound, pos, 1, 1); } break; case TE_EXPLOSION: // rocket explosion // particles MSG_ReadCoordV (net_message, pos); r_funcs->particles->R_ParticleExplosion (pos); // light dl = r_funcs->R_AllocDlight (0); if (dl) { VectorCopy (pos, dl->origin); dl->radius = 350; dl->die = cl.time + 0.5; dl->decay = 300; QuatSet (0.86, 0.31, 0.24, 0.7, dl->color); } // sound S_StartSound (-1, 0, cl_sfx_r_exp3, pos, 1, 1); // sprite to = new_tent_object (); to->next = cl_explosions; cl_explosions = to; ex = &to->to.ex; ex->tent = new_temp_entity (); VectorCopy (pos, ex->tent->ent.origin); ex->start = cl.time; //FIXME need better model management if (!cl_spr_explod->cache.data) cl_spr_explod = Mod_ForName ("progs/s_explod.spr", true); ex->tent->ent.model = cl_spr_explod; CL_TransformEntity (&ex->tent->ent, ex->tent->ent.angles, true); break; case TE_TAREXPLOSION: // tarbaby explosion MSG_ReadCoordV (net_message, pos); r_funcs->particles->R_BlobExplosion (pos); S_StartSound (-1, 0, cl_sfx_r_exp3, pos, 1, 1); break; case TE_LIGHTNING1: // lightning bolts CL_ParseBeam (cl_mod_bolt); break; case TE_LIGHTNING2: // lightning bolts CL_ParseBeam (cl_mod_bolt2); break; case TE_LIGHTNING3: // lightning bolts CL_ParseBeam (cl_mod_bolt3); break; // PGM 01/21/97 case TE_BEAM: // grappling hook beam CL_ParseBeam (cl_mod_beam); break; // PGM 01/21/97 case TE_LAVASPLASH: MSG_ReadCoordV (net_message, pos); r_funcs->particles->R_LavaSplash (pos); break; case TE_TELEPORT: MSG_ReadCoordV (net_message, pos); r_funcs->particles->R_TeleportSplash (pos); break; case TE_EXPLOSION2: // color mapped explosion MSG_ReadCoordV (net_message, pos); colorStart = MSG_ReadByte (net_message); colorLength = MSG_ReadByte (net_message); S_StartSound (-1, 0, cl_sfx_r_exp3, pos, 1, 1); r_funcs->particles->R_ParticleExplosion2 (pos, colorStart, colorLength); dl = r_funcs->R_AllocDlight (0); if (!dl) break; VectorCopy (pos, dl->origin); dl->radius = 350; dl->die = cl.time + 0.5; dl->decay = 300; colorStart = (colorStart + (rand () % colorLength)) * 3; VectorScale (&r_data->vid->palette[colorStart], 1.0 / 255.0, dl->color); dl->color[3] = 0.7; break; case TE_GUNSHOT: // bullet hitting wall cnt = MSG_ReadByte (net_message) * 20; MSG_ReadCoordV (net_message, pos); r_funcs->particles->R_GunshotEffect (pos, cnt); break; case TE_BLOOD: // bullet hitting body cnt = MSG_ReadByte (net_message) * 20; MSG_ReadCoordV (net_message, pos); r_funcs->particles->R_BloodPuffEffect (pos, cnt); break; case TE_LIGHTNINGBLOOD: // lightning hitting body MSG_ReadCoordV (net_message, pos); // light dl = r_funcs->R_AllocDlight (0); if (dl) { VectorCopy (pos, dl->origin); dl->radius = 150; dl->die = cl.time + 0.1; dl->decay = 200; QuatSet (0.25, 0.40, 0.65, 1, dl->color); } r_funcs->particles->R_LightningBloodEffect (pos); break; default: Sys_Error ("CL_ParseTEnt: bad type %d", type); } }