]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_parse.c
Mod_FindNonSolidLocation now takes a radius and can output to a different vector...
[xonotic/darkplaces.git] / cl_parse.c
index e5419cbbbd59270454ebd1867ead9fcbe5c312e5..9863aa3c75e07d65d63c4d19f98327c0b2b76a73 100644 (file)
@@ -106,22 +106,22 @@ CL_ParseStartSoundPacket
 */
 void CL_ParseStartSoundPacket(int largesoundindex)
 {
-    vec3_t  pos;
-    int        channel, ent;
-    int        sound_num;
-    int        volume;
-    int        field_mask;
-    float      attenuation;
-       int             i;
+       vec3_t  pos;
+       int     channel, ent;
+       int     sound_num;
+       int     volume;
+       int     field_mask;
+       float   attenuation;
+       int             i;
 
-    field_mask = MSG_ReadByte();
+       field_mask = MSG_ReadByte();
 
-    if (field_mask & SND_VOLUME)
+       if (field_mask & SND_VOLUME)
                volume = MSG_ReadByte ();
        else
                volume = DEFAULT_SOUND_PACKET_VOLUME;
 
-    if (field_mask & SND_ATTENUATION)
+       if (field_mask & SND_ATTENUATION)
                attenuation = MSG_ReadByte () / 64.0;
        else
                attenuation = DEFAULT_SOUND_PACKET_ATTENUATION;
@@ -153,7 +153,7 @@ void CL_ParseStartSoundPacket(int largesoundindex)
        for (i = 0;i < 3;i++)
                pos[i] = MSG_ReadCoord ();
 
-    S_StartSound (ent, channel, cl.sound_precache[sound_num], pos, volume/255.0, attenuation);
+       S_StartSound (ent, channel, cl.sound_precache[sound_num], pos, volume/255.0, attenuation);
 }
 
 /*
@@ -449,8 +449,10 @@ void CL_ParseServerInfo (void)
        // entire entity array was cleared, so just fill in a few fields
        ent->state_current.active = true;
        ent->render.model = cl.worldmodel = cl.model_precache[1];
-       ent->render.scale = 1;
+       //ent->render.scale = 1;
        ent->render.alpha = 1;
+       Matrix4x4_CreateFromQuakeEntity(&ent->render.matrix, 0, 0, 0, 0, 0, 0, 1);
+       Matrix4x4_Invert_Simple(&ent->render.inversematrix, &ent->render.matrix);
        CL_BoundingBoxForEntity(&ent->render);
        // clear entlife array
        memset(entlife, 0, MAX_EDICTS);
@@ -510,7 +512,7 @@ void CL_MoveLerpEntityStates(entity_t *ent)
                VectorCopy(ent->state_current.origin, ent->persistent.neworigin);
                VectorCopy(ent->state_current.angles, ent->persistent.newangles);
        }
-       else// if (ent->state_current.flags & RENDER_STEP)
+       else if (ent->state_current.flags & RENDER_STEP)
        {
                // monster interpolation
                if (DotProduct(odelta, odelta) + DotProduct(adelta, adelta) > 0.01)
@@ -523,22 +525,20 @@ void CL_MoveLerpEntityStates(entity_t *ent)
                        VectorCopy(ent->state_current.angles, ent->persistent.newangles);
                }
        }
-       /*
        else
        {
                // not a monster
                ent->persistent.lerpstarttime = cl.mtime[1];
                // no lerp if it's singleplayer
-               //if (sv.active && svs.maxclients == 1 && !ent->state_current.flags & RENDER_STEP)
-               //      ent->persistent.lerpdeltatime = 0;
-               //else
+               if (sv.active && svs.maxclients == 1 && !ent->state_current.flags & RENDER_STEP)
+                       ent->persistent.lerpdeltatime = 0;
+               else
                        ent->persistent.lerpdeltatime = cl.mtime[0] - cl.mtime[1];
                VectorCopy(ent->persistent.neworigin, ent->persistent.oldorigin);
                VectorCopy(ent->persistent.newangles, ent->persistent.oldangles);
                VectorCopy(ent->state_current.origin, ent->persistent.neworigin);
                VectorCopy(ent->state_current.angles, ent->persistent.newangles);
        }
-       */
 }
 
 /*
@@ -848,12 +848,13 @@ void CL_ParseStatic (int large)
        ent->render.skinnum = ent->state_baseline.skin;
        ent->render.effects = ent->state_baseline.effects;
        ent->render.alpha = 1;
-       ent->render.scale = 1;
-       ent->render.alpha = 1;
+       //ent->render.scale = 1;
 
-       VectorCopy (ent->state_baseline.origin, ent->render.origin);
-       VectorCopy (ent->state_baseline.angles, ent->render.angles);
+       //VectorCopy (ent->state_baseline.origin, ent->render.origin);
+       //VectorCopy (ent->state_baseline.angles, ent->render.angles);
 
+       Matrix4x4_CreateFromQuakeEntity(&ent->render.matrix, ent->state_baseline.origin[0], ent->state_baseline.origin[1], ent->state_baseline.origin[2], ent->state_baseline.angles[0], ent->state_baseline.angles[1], ent->state_baseline.angles[2], 1);
+       Matrix4x4_Invert_Simple(&ent->render.inversematrix, &ent->render.matrix);
        CL_BoundingBoxForEntity(&ent->render);
 
        // This is definitely cheating...
@@ -1007,7 +1008,8 @@ void CL_ParseTempEntity (void)
        case TE_WIZSPIKE:
                // spike hitting wall
                MSG_ReadVector(pos);
-               Mod_FindNonSolidLocation(pos, cl.worldmodel);
+               Mod_FindNonSolidLocation(pos, pos, cl.worldmodel, 4);
+               CL_AllocDlight (NULL, pos, 50, 0.25f, 1.00f, 0.25f, 250, 0.2);
                CL_RunParticleEffect (pos, vec3_origin, 20, 30);
                S_StartSound (-1, 0, cl_sfx_wizhit, pos, 1, 1);
                break;
@@ -1015,7 +1017,8 @@ void CL_ParseTempEntity (void)
        case TE_KNIGHTSPIKE:
                // spike hitting wall
                MSG_ReadVector(pos);
-               Mod_FindNonSolidLocation(pos, cl.worldmodel);
+               Mod_FindNonSolidLocation(pos, pos, cl.worldmodel, 4);
+               CL_AllocDlight (NULL, pos, 50, 1.0f, 0.60f, 0.20f, 250, 0.2);
                CL_RunParticleEffect (pos, vec3_origin, 226, 20);
                S_StartSound (-1, 0, cl_sfx_knighthit, pos, 1, 1);
                break;
@@ -1023,7 +1026,7 @@ void CL_ParseTempEntity (void)
        case TE_SPIKE:
                // spike hitting wall
                MSG_ReadVector(pos);
-               Mod_FindNonSolidLocation(pos, cl.worldmodel);
+               Mod_FindNonSolidLocation(pos, pos, cl.worldmodel, 4);
                // LordHavoc: changed to spark shower
                CL_SparkShower(pos, vec3_origin, 15);
                if ( rand() % 5 )
@@ -1042,7 +1045,7 @@ void CL_ParseTempEntity (void)
        case TE_SPIKEQUAD:
                // quad spike hitting wall
                MSG_ReadVector(pos);
-               Mod_FindNonSolidLocation(pos, cl.worldmodel);
+               Mod_FindNonSolidLocation(pos, pos, cl.worldmodel, 4);
                // LordHavoc: changed to spark shower
                CL_SparkShower(pos, vec3_origin, 15);
                CL_AllocDlight (NULL, pos, 200, 0.1f, 0.1f, 1.0f, 1000, 0.2);
@@ -1063,7 +1066,7 @@ void CL_ParseTempEntity (void)
        case TE_SUPERSPIKE:
                // super spike hitting wall
                MSG_ReadVector(pos);
-               Mod_FindNonSolidLocation(pos, cl.worldmodel);
+               Mod_FindNonSolidLocation(pos, pos, cl.worldmodel, 4);
                // LordHavoc: changed to dust shower
                CL_SparkShower(pos, vec3_origin, 30);
                if ( rand() % 5 )
@@ -1082,7 +1085,7 @@ void CL_ParseTempEntity (void)
        case TE_SUPERSPIKEQUAD:
                // quad super spike hitting wall
                MSG_ReadVector(pos);
-               Mod_FindNonSolidLocation(pos, cl.worldmodel);
+               Mod_FindNonSolidLocation(pos, pos, cl.worldmodel, 4);
                // LordHavoc: changed to dust shower
                CL_SparkShower(pos, vec3_origin, 30);
                CL_AllocDlight (NULL, pos, 200, 0.1f, 0.1f, 1.0f, 1000, 0.2);
@@ -1103,6 +1106,7 @@ void CL_ParseTempEntity (void)
        case TE_BLOOD:
                // blood puff
                MSG_ReadVector(pos);
+               Mod_FindNonSolidLocation(pos, pos, cl.worldmodel, 4);
                dir[0] = MSG_ReadChar ();
                dir[1] = MSG_ReadChar ();
                dir[2] = MSG_ReadChar ();
@@ -1112,21 +1116,22 @@ void CL_ParseTempEntity (void)
        case TE_BLOOD2:
                // blood puff
                MSG_ReadVector(pos);
+               Mod_FindNonSolidLocation(pos, pos, cl.worldmodel, 4);
                CL_BloodPuff(pos, vec3_origin, 10);
                break;
        case TE_SPARK:
                // spark shower
                MSG_ReadVector(pos);
+               Mod_FindNonSolidLocation(pos, pos, cl.worldmodel, 4);
                dir[0] = MSG_ReadChar ();
                dir[1] = MSG_ReadChar ();
                dir[2] = MSG_ReadChar ();
                count = MSG_ReadByte ();
-               Mod_FindNonSolidLocation(pos, cl.worldmodel);
                CL_SparkShower(pos, dir, count);
                break;
        case TE_PLASMABURN:
                MSG_ReadVector(pos);
-               Mod_FindNonSolidLocation(pos, cl.worldmodel);
+               Mod_FindNonSolidLocation(pos, pos, cl.worldmodel, 4);
                CL_AllocDlight (NULL, pos, 200, 1, 1, 1, 1000, 0.2);
                CL_PlasmaBurn(pos);
                break;
@@ -1174,7 +1179,7 @@ void CL_ParseTempEntity (void)
        case TE_GUNSHOT:
                // bullet hitting wall
                MSG_ReadVector(pos);
-               Mod_FindNonSolidLocation(pos, cl.worldmodel);
+               Mod_FindNonSolidLocation(pos, pos, cl.worldmodel, 4);
                // LordHavoc: changed to dust shower
                CL_SparkShower(pos, vec3_origin, 15);
                break;
@@ -1182,7 +1187,7 @@ void CL_ParseTempEntity (void)
        case TE_GUNSHOTQUAD:
                // quad bullet hitting wall
                MSG_ReadVector(pos);
-               Mod_FindNonSolidLocation(pos, cl.worldmodel);
+               Mod_FindNonSolidLocation(pos, pos, cl.worldmodel, 4);
                CL_SparkShower(pos, vec3_origin, 15);
                CL_AllocDlight (NULL, pos, 200, 0.1f, 0.1f, 1.0f, 1000, 0.2);
                break;
@@ -1190,7 +1195,7 @@ void CL_ParseTempEntity (void)
        case TE_EXPLOSION:
                // rocket explosion
                MSG_ReadVector(pos);
-               Mod_FindNonSolidLocation(pos, cl.worldmodel);
+               Mod_FindNonSolidLocation(pos, pos, cl.worldmodel, 10);
                CL_ParticleExplosion (pos);
                // LordHavoc: boosted color from 1.0, 0.8, 0.4 to 1.25, 1.0, 0.5
                CL_AllocDlight (NULL, pos, 350, 1.25f, 1.0f, 0.5f, 700, 0.5);
@@ -1200,7 +1205,7 @@ void CL_ParseTempEntity (void)
        case TE_EXPLOSIONQUAD:
                // quad rocket explosion
                MSG_ReadVector(pos);
-               Mod_FindNonSolidLocation(pos, cl.worldmodel);
+               Mod_FindNonSolidLocation(pos, pos, cl.worldmodel, 10);
                CL_ParticleExplosion (pos);
                CL_AllocDlight (NULL, pos, 600, 0.5f, 0.4f, 1.0f, 1200, 0.5);
                S_StartSound (-1, 0, cl_sfx_r_exp3, pos, 1, 1);
@@ -1209,7 +1214,7 @@ void CL_ParseTempEntity (void)
        case TE_EXPLOSION3:
                // Nehahra movie colored lighting explosion
                MSG_ReadVector(pos);
-               Mod_FindNonSolidLocation(pos, cl.worldmodel);
+               Mod_FindNonSolidLocation(pos, pos, cl.worldmodel, 10);
                CL_ParticleExplosion (pos);
                CL_AllocDlight (NULL, pos, 350, MSG_ReadCoord(), MSG_ReadCoord(), MSG_ReadCoord(), 700, 0.5);
                S_StartSound (-1, 0, cl_sfx_r_exp3, pos, 1, 1);
@@ -1218,7 +1223,7 @@ void CL_ParseTempEntity (void)
        case TE_EXPLOSIONRGB:
                // colored lighting explosion
                MSG_ReadVector(pos);
-               Mod_FindNonSolidLocation(pos, cl.worldmodel);
+               Mod_FindNonSolidLocation(pos, pos, cl.worldmodel, 10);
                CL_ParticleExplosion (pos);
                color[0] = MSG_ReadByte() * (1.0 / 255.0);
                color[1] = MSG_ReadByte() * (1.0 / 255.0);
@@ -1230,7 +1235,7 @@ void CL_ParseTempEntity (void)
        case TE_TAREXPLOSION:
                // tarbaby explosion
                MSG_ReadVector(pos);
-               Mod_FindNonSolidLocation(pos, cl.worldmodel);
+               Mod_FindNonSolidLocation(pos, pos, cl.worldmodel, 10);
                CL_BlobExplosion (pos);
 
                S_StartSound (-1, 0, cl_sfx_r_exp3, pos, 1, 1);
@@ -1240,13 +1245,13 @@ void CL_ParseTempEntity (void)
 
        case TE_SMALLFLASH:
                MSG_ReadVector(pos);
-               Mod_FindNonSolidLocation(pos, cl.worldmodel);
+               Mod_FindNonSolidLocation(pos, pos, cl.worldmodel, 10);
                CL_AllocDlight (NULL, pos, 200, 1, 1, 1, 1000, 0.2);
                break;
 
        case TE_CUSTOMFLASH:
                MSG_ReadVector(pos);
-               Mod_FindNonSolidLocation(pos, cl.worldmodel);
+               Mod_FindNonSolidLocation(pos, pos, cl.worldmodel, 4);
                radius = MSG_ReadByte() * 8;
                velspeed = (MSG_ReadByte() + 1) * (1.0 / 256.0);
                color[0] = MSG_ReadByte() * (1.0 / 255.0);
@@ -1280,7 +1285,7 @@ void CL_ParseTempEntity (void)
                // lightning bolts
                if (!cl_model_bolt3)
                        cl_model_bolt3 = Mod_ForName("progs/bolt3.mdl", true, false, false);
-               CL_ParseBeam (cl_model_bolt3, true);
+               CL_ParseBeam (cl_model_bolt3, false);
                break;
 
 // PGM 01/21/97
@@ -1315,7 +1320,7 @@ void CL_ParseTempEntity (void)
        case TE_EXPLOSION2:
                // color mapped explosion
                MSG_ReadVector(pos);
-               Mod_FindNonSolidLocation(pos, cl.worldmodel);
+               Mod_FindNonSolidLocation(pos, pos, cl.worldmodel, 10);
                colorStart = MSG_ReadByte ();
                colorLength = MSG_ReadByte ();
                CL_ParticleExplosion2 (pos, colorStart, colorLength);
@@ -1336,13 +1341,13 @@ void CL_ParseTempEntity (void)
                MSG_ReadVector(pos);
                MSG_ReadVector(dir);
                count = MSG_ReadByte ();
-               Mod_FindNonSolidLocation(pos, cl.worldmodel);
+               Mod_FindNonSolidLocation(pos, pos, cl.worldmodel, 4);
                CL_Tei_Smoke(pos, dir, count);
                break;
 
        case TE_TEI_BIGEXPLOSION:
                MSG_ReadVector(pos);
-               Mod_FindNonSolidLocation(pos, cl.worldmodel);
+               Mod_FindNonSolidLocation(pos, pos, cl.worldmodel, 10);
                CL_ParticleExplosion (pos);
                CL_AllocDlight (NULL, pos, 500, 1.25f, 1.0f, 0.5f, 500, 9999);
                S_StartSound (-1, 0, cl_sfx_r_exp3, pos, 1, 1);
@@ -1352,7 +1357,7 @@ void CL_ParseTempEntity (void)
                MSG_ReadVector(pos);
                MSG_ReadVector(dir);
                count = MSG_ReadByte ();
-               Mod_FindNonSolidLocation(pos, cl.worldmodel);
+               Mod_FindNonSolidLocation(pos, pos, cl.worldmodel, 5);
                CL_Tei_PlasmaHit(pos, dir, count);
                CL_AllocDlight (NULL, pos, 500, 0.3, 0.6, 1.0f, 2000, 9999);
                break;
@@ -1578,9 +1583,6 @@ void CL_ParseServerMessage (void)
                        if (i >= cl.maxclients)
                                Host_Error ("CL_ParseServerMessage: svc_updatecolors >= cl.maxclients");
                        cl.scores[i].colors = MSG_ReadByte ();
-                       // update our color cvar if our color changed
-                       if (i == cl.playerentity - 1)
-                               Cvar_SetValue ("_cl_color", cl.scores[i].colors);
                        break;
 
                case svc_particle: