]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_parse.c
q3 shader parsing now sets more materialflags (such as transparency)
[xonotic/darkplaces.git] / cl_parse.c
index 4f509d7cc4a4b9e015c918e98cfcd1b84b6e9e4d..2e920c5de3c5dbc388d69929169c284d7249e017 100644 (file)
@@ -287,6 +287,16 @@ Con_DPrintf("CL_SignonReply: %i\n", cls.signon);
                        MSG_WriteByte (&cls.message, clc_stringcmd);
                        MSG_WriteString (&cls.message, va("pmodel %i\n", cl_pmodel.integer));
                }
+               if (*cl_playermodel.string)
+               {
+                       MSG_WriteByte (&cls.message, clc_stringcmd);
+                       MSG_WriteString (&cls.message, va("playermodel %s\n", cl_playermodel.string));
+               }
+               if (*cl_playerskin.string)
+               {
+                       MSG_WriteByte (&cls.message, clc_stringcmd);
+                       MSG_WriteString (&cls.message, va("playerskin %s\n", cl_playerskin.string));
+               }
 
                MSG_WriteByte (&cls.message, clc_stringcmd);
                MSG_WriteString (&cls.message, va("rate %i\n", cl_rate.integer));
@@ -344,7 +354,7 @@ void CL_ParseServerInfo (void)
        cl.maxclients = MSG_ReadByte ();
        if (cl.maxclients < 1 || cl.maxclients > MAX_SCOREBOARD)
        {
-               Con_Printf("Bad maxclients (%u) from server\n", cl.maxclients);
+               Host_Error("Bad maxclients (%u) from server\n", cl.maxclients);
                return;
        }
        Mem_EmptyPool(cl_scores_mempool);
@@ -364,6 +374,11 @@ void CL_ParseServerInfo (void)
        // check memory integrity
        Mem_CheckSentinelsGlobal();
 
+       S_StopAllSounds();
+       // if server is active, we already began a loading plaque
+       if (!sv.active)
+               SCR_BeginLoadingPlaque();
+
        // disable until we get textures for it
        R_ResetSkyBox();
 
@@ -426,7 +441,7 @@ void CL_ParseServerInfo (void)
        {
                CL_KeepaliveMessage();
 
-               // Don't lock the sfx here, S_ServerSounds already did that 
+               // Don't lock the sfx here, S_ServerSounds already did that
                cl.sound_precache[i] = S_PrecacheSound (parse_sound_precache[i], true, false);
        }
 
@@ -592,7 +607,10 @@ void CL_ParseClientdata (int bits)
 {
        int i, j;
 
+       VectorCopy (cl.mpunchangle[0], cl.mpunchangle[1]);
+       VectorCopy (cl.mpunchvector[0], cl.mpunchvector[1]);
        VectorCopy (cl.mvelocity[0], cl.mvelocity[1]);
+       cl.mviewzoom[1] = cl.mviewzoom[0];
 
        if (cl.protocol != PROTOCOL_DARKPLACES6)
        {
@@ -601,15 +619,16 @@ void CL_ParseClientdata (int bits)
                cl.stats[STAT_VIEWZOOM] = 255;
        }
        cl.idealpitch = 0;
-       cl.punchangle[0] = 0;
-       cl.punchangle[1] = 0;
-       cl.punchangle[2] = 0;
-       cl.punchvector[0] = 0;
-       cl.punchvector[1] = 0;
-       cl.punchvector[2] = 0;
+       cl.mpunchangle[0][0] = 0;
+       cl.mpunchangle[0][1] = 0;
+       cl.mpunchangle[0][2] = 0;
+       cl.mpunchvector[0][0] = 0;
+       cl.mpunchvector[0][1] = 0;
+       cl.mpunchvector[0][2] = 0;
        cl.mvelocity[0][0] = 0;
        cl.mvelocity[0][1] = 0;
        cl.mvelocity[0][2] = 0;
+       cl.mviewzoom[0] = 1;
 
        bits &= 0xFFFF;
        if (bits & SU_EXTEND1)
@@ -628,18 +647,18 @@ void CL_ParseClientdata (int bits)
                if (bits & (SU_PUNCH1<<i) )
                {
                        if (cl.protocol == PROTOCOL_DARKPLACES1 || cl.protocol == PROTOCOL_DARKPLACES2 || cl.protocol == PROTOCOL_DARKPLACES3 || cl.protocol == PROTOCOL_DARKPLACES4 || cl.protocol == PROTOCOL_DARKPLACES5 || cl.protocol == PROTOCOL_DARKPLACES6)
-                               cl.punchangle[i] = MSG_ReadAngle16i();
+                               cl.mpunchangle[0][i] = MSG_ReadAngle16i();
                        else if (cl.protocol == PROTOCOL_QUAKE || cl.protocol == PROTOCOL_NEHAHRAMOVIE)
-                               cl.punchangle[i] = MSG_ReadChar();
+                               cl.mpunchangle[0][i] = MSG_ReadChar();
                        else
                                Host_Error("CL_ParseClientData: unknown cl.protocol %i\n", cl.protocol);
                }
                if (bits & (SU_PUNCHVEC1<<i))
                {
                        if (cl.protocol == PROTOCOL_DARKPLACES1 || cl.protocol == PROTOCOL_DARKPLACES2 || cl.protocol == PROTOCOL_DARKPLACES3 || cl.protocol == PROTOCOL_DARKPLACES4)
-                               cl.punchvector[i] = MSG_ReadCoord16i();
+                               cl.mpunchvector[0][i] = MSG_ReadCoord16i();
                        else if (cl.protocol == PROTOCOL_DARKPLACES5 || cl.protocol == PROTOCOL_DARKPLACES6)
-                               cl.punchvector[i] = MSG_ReadCoord32f();
+                               cl.mpunchvector[0][i] = MSG_ReadCoord32f();
                        else
                                Host_Error("CL_ParseClientData: unknown cl.protocol %i\n", cl.protocol);
                }
@@ -716,8 +735,7 @@ void CL_ParseClientdata (int bits)
        cl.activeweapon = cl.stats[STAT_ACTIVEWEAPON];
 
        // viewzoom interpolation
-       cl.viewzoomold = cl.viewzoomnew;
-       cl.viewzoomnew = (float) max(cl.stats[STAT_VIEWZOOM], 2) * (1.0f / 255.0f);
+       cl.mviewzoom[0] = (float) max(cl.stats[STAT_VIEWZOOM], 2) * (1.0f / 255.0f);
 }
 
 /*
@@ -1141,7 +1159,7 @@ void CL_ParseTempEntity(void)
                color[0] = MSG_ReadCoord(cl.protocol) * (2.0f / 1.0f);
                color[1] = MSG_ReadCoord(cl.protocol) * (2.0f / 1.0f);
                color[2] = MSG_ReadCoord(cl.protocol) * (2.0f / 1.0f);
-               CL_AllocDlight(NULL, &tempmatrix, 350, color[0], color[1], color[2], 700, 0.5, 0, -1, true, 1, 0.25, 0.25, 1, 1, LIGHTFLAG_NORMALMODE | LIGHTFLAG_REALTIMEMODE);        
+               CL_AllocDlight(NULL, &tempmatrix, 350, color[0], color[1], color[2], 700, 0.5, 0, -1, true, 1, 0.25, 0.25, 1, 1, LIGHTFLAG_NORMALMODE | LIGHTFLAG_REALTIMEMODE);
                S_StartSound(-1, 0, cl_sfx_r_exp3, pos, 1, 1);
                break;
 
@@ -1239,8 +1257,8 @@ void CL_ParseTempEntity(void)
        case TE_TELEPORT:
                MSG_ReadVector(pos, cl.protocol);
                Matrix4x4_CreateTranslate(&tempmatrix, pos[0], pos[1], pos[2]);
-               CL_AllocDlight(NULL, &tempmatrix, 500, 1.0f, 1.0f, 1.0f, 1500, 99.0f, 0, -1, true, 1, 0.25, 1, 0, 0, LIGHTFLAG_NORMALMODE | LIGHTFLAG_REALTIMEMODE);
-//             CL_TeleportSplash(pos);
+               CL_AllocDlight(NULL, &tempmatrix, 200, 1.0f, 1.0f, 1.0f, 600, 99.0f, 0, -1, true, 1, 0.25, 1, 0, 0, LIGHTFLAG_NORMALMODE | LIGHTFLAG_REALTIMEMODE);
+               CL_TeleportSplash(pos);
                break;
 
        case TE_EXPLOSION2:
@@ -1263,8 +1281,7 @@ void CL_ParseTempEntity(void)
                MSG_ReadVector(pos, cl.protocol);
                MSG_ReadVector(pos2, cl.protocol);
                MSG_ReadVector(dir, cl.protocol);
-               CL_BeamParticle(pos, pos2, 12, 1, 0.3, 0.1, 1, 1);
-               CL_BeamParticle(pos, pos2, 5, 1, 0.9, 0.3, 1, 1);
+               CL_BeamParticle(pos, pos2, 8, 1, 1, 1, 1, 1);
                break;
 
        case TE_TEI_SMOKE:
@@ -1396,7 +1413,7 @@ void CL_ParseServerMessage(void)
                                i &= 31;
                                while(count > 0)
                                {
-                                       snprintf (temp, sizeof (temp), "%3i:%s ", cmdlog[i], cmdlogname[i]);
+                                       dpsnprintf (temp, sizeof (temp), "%3i:%s ", cmdlog[i], cmdlogname[i]);
                                        strlcat (description, temp, sizeof (description));
                                        count--;
                                        i++;
@@ -1516,7 +1533,7 @@ void CL_ParseServerMessage(void)
                                        if (i >= 1 && i < MAX_SOUNDS)
                                        {
                                                sfx_t *sfx = S_PrecacheSound (s, true, false);
-                                               if (!sfx)
+                                               if (!sfx && snd_initialized.integer)
                                                        Con_Printf("svc_precache: S_PrecacheSound(\"%s\") failed\n", s);
                                                cl.sound_precache[i] = sfx;
                                        }
@@ -1597,7 +1614,9 @@ void CL_ParseServerMessage(void)
 
                case svc_signonnum:
                        i = MSG_ReadByte ();
-                       if (i <= cls.signon)
+                       // LordHavoc: it's rude to kick off the client if they missed the
+                       // reconnect somehow, so allow signon 1 even if at signon 1
+                       if (i <= cls.signon && i != 1)
                                Host_Error ("Received signon %i when at %i", i, cls.signon);
                        cls.signon = i;
                        CL_SignonReply ();
@@ -1748,3 +1767,8 @@ void CL_Parse_Init(void)
                Cvar_SetValue("demo_nehahra", 1);
        Cvar_RegisterVariable(&developer_networkentities);
 }
+
+void CL_Parse_Shutdown(void)
+{
+       Mem_FreePool (&cl_scores_mempool);
+}