+ case QW_TE_LAVASPLASH:
+ MSG_ReadVector(pos, cls.protocol);
+ CL_ParticleEffect(EFFECT_TE_LAVASPLASH, 1, pos, pos, vec3_origin, vec3_origin, NULL, 0);
+ break;
+
+ case QW_TE_TELEPORT:
+ MSG_ReadVector(pos, cls.protocol);
+ CL_ParticleEffect(EFFECT_TE_TELEPORT, 1, pos, pos, vec3_origin, vec3_origin, NULL, 0);
+ break;
+
+ case QW_TE_GUNSHOT:
+ // bullet hitting wall
+ radius = MSG_ReadByte();
+ MSG_ReadVector(pos, cls.protocol);
+ CL_FindNonSolidLocation(pos, pos, 4);
+ 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_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_ParticleEffect(EFFECT_TE_BLOOD, 2.5, pos, pos, vec3_origin, vec3_origin, NULL, 0);
+ break;
+
+ default:
+ Host_Error("CL_ParseTempEntity: bad type %d (hex %02X)", type, type);
+ }
+ }
+ else
+ {
+ type = MSG_ReadByte();
+ switch (type)
+ {
+ case TE_WIZSPIKE:
+ // spike hitting wall
+ MSG_ReadVector(pos, cls.protocol);
+ CL_FindNonSolidLocation(pos, pos, 4);
+ 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;
+
+ case TE_KNIGHTSPIKE:
+ // spike hitting wall
+ MSG_ReadVector(pos, cls.protocol);
+ CL_FindNonSolidLocation(pos, pos, 4);
+ 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;
+
+ case TE_SPIKE:
+ // spike hitting wall
+ MSG_ReadVector(pos, cls.protocol);
+ CL_FindNonSolidLocation(pos, pos, 4);
+ 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
+ {
+ 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_SPIKEQUAD:
+ // quad spike hitting wall
+ MSG_ReadVector(pos, cls.protocol);
+ CL_FindNonSolidLocation(pos, pos, 4);
+ 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
+ {
+ 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
+ MSG_ReadVector(pos, cls.protocol);
+ CL_FindNonSolidLocation(pos, pos, 4);
+ 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
+ {
+ 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:
+ // quad super spike hitting wall
+ MSG_ReadVector(pos, cls.protocol);
+ CL_FindNonSolidLocation(pos, pos, 4);
+ 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
+ {
+ 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;
+ // LordHavoc: added for improved blood splatters
+ case TE_BLOOD:
+ // blood puff
+ MSG_ReadVector(pos, cls.protocol);
+ CL_FindNonSolidLocation(pos, pos, 4);
+ dir[0] = MSG_ReadChar();
+ dir[1] = MSG_ReadChar();
+ dir[2] = MSG_ReadChar();
+ count = MSG_ReadByte();
+ CL_ParticleEffect(EFFECT_TE_BLOOD, count, pos, pos, dir, dir, NULL, 0);
+ break;
+ case TE_SPARK:
+ // spark shower
+ MSG_ReadVector(pos, cls.protocol);
+ CL_FindNonSolidLocation(pos, pos, 4);
+ dir[0] = MSG_ReadChar();
+ dir[1] = MSG_ReadChar();
+ dir[2] = MSG_ReadChar();
+ count = MSG_ReadByte();
+ 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);
+ CL_ParticleEffect(EFFECT_TE_PLASMABURN, 1, pos, pos, vec3_origin, vec3_origin, NULL, 0);
+ break;
+ // LordHavoc: added for improved gore
+ case TE_BLOODSHOWER:
+ // vaporized body
+ MSG_ReadVector(pos, cls.protocol); // mins
+ MSG_ReadVector(pos2, cls.protocol); // maxs
+ velspeed = MSG_ReadCoord(cls.protocol); // speed
+ count = (unsigned short) MSG_ReadShort(); // number of particles
+ 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
+ MSG_ReadVector(pos2, cls.protocol); // maxs
+ MSG_ReadVector(dir, cls.protocol); // dir
+ count = (unsigned short) MSG_ReadShort(); // number of particles
+ 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 != 0, velspeed);
+ break;
+
+ case TE_PARTICLERAIN:
+ // general purpose particle effect
+ MSG_ReadVector(pos, cls.protocol); // mins
+ MSG_ReadVector(pos2, cls.protocol); // maxs
+ MSG_ReadVector(dir, cls.protocol); // dir
+ count = (unsigned short) MSG_ReadShort(); // number of particles
+ colorStart = MSG_ReadByte(); // color
+ CL_ParticleRain(pos, pos2, dir, count, colorStart, 0);
+ break;
+
+ case TE_PARTICLESNOW:
+ // general purpose particle effect
+ MSG_ReadVector(pos, cls.protocol); // mins
+ MSG_ReadVector(pos2, cls.protocol); // maxs
+ MSG_ReadVector(dir, cls.protocol); // dir
+ count = (unsigned short) MSG_ReadShort(); // number of particles
+ colorStart = MSG_ReadByte(); // color
+ CL_ParticleRain(pos, pos2, dir, count, colorStart, 1);
+ break;
+
+ case TE_GUNSHOT:
+ // bullet hitting wall
+ MSG_ReadVector(pos, cls.protocol);
+ CL_FindNonSolidLocation(pos, pos, 4);
+ 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);
+ 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_ParticleEffect(EFFECT_TE_EXPLOSION, 1, pos, pos, vec3_origin, vec3_origin, NULL, 0);