]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_parse.c
-Changed the dpv buffer to 1 MB.
[xonotic/darkplaces.git] / cl_parse.c
index eb1437c975baf2500677550bd82968d71894ccd4..43b82068ba0fb1757cbefcf1966b03ed8457f809 100644 (file)
@@ -99,8 +99,6 @@ char *svc_strings[128] =
 cvar_t demo_nehahra = {0, "demo_nehahra", "0"};
 cvar_t developer_networkentities = {0, "developer_networkentities", "0"};
 
-mempool_t *cl_scores_mempool;
-
 /*
 ==================
 CL_ParseStartSoundPacket
@@ -144,14 +142,19 @@ void CL_ParseStartSoundPacket(int largesoundindex)
        else
                sound_num = MSG_ReadByte ();
 
-       if (sound_num >= MAX_SOUNDS)
-               Host_Error("CL_ParseStartSoundPacket: sound_num (%i) >= MAX_SOUNDS (%i)\n", sound_num, MAX_SOUNDS);
+       MSG_ReadVector(pos, cl.protocol);
 
+       if (sound_num >= MAX_SOUNDS)
+       {
+               Con_Printf("CL_ParseStartSoundPacket: sound_num (%i) >= MAX_SOUNDS (%i)\n", sound_num, MAX_SOUNDS);
+               return;
+       }
 
        if (ent >= MAX_EDICTS)
-               Host_Error ("CL_ParseStartSoundPacket: ent = %i", ent);
-
-       MSG_ReadVector(pos, cl.protocol);
+       {
+               Con_Printf("CL_ParseStartSoundPacket: ent = %i", ent);
+               return;
+       }
 
        S_StartSound (ent, channel, cl.sound_precache[sound_num], pos, volume/255.0f, attenuation);
 }
@@ -287,6 +290,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));
@@ -322,6 +335,7 @@ void CL_ParseServerInfo (void)
        entity_t *ent;
 
        Con_DPrint("Serverinfo packet received.\n");
+
 //
 // wipe the client_state_t struct
 //
@@ -338,17 +352,16 @@ void CL_ParseServerInfo (void)
                return;
        }
        cl.protocol = i;
-       Con_DPrintf("Protocol %i\n", cl.protocol);
+       Con_DPrintf("Server protocol is %i\n", cl.protocol);
 
 // parse maxclients
        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);
-       cl.scores = Mem_Alloc(cl_scores_mempool, cl.maxclients*sizeof(*cl.scores));
+       cl.scores = Mem_Alloc(cl_mempool, cl.maxclients*sizeof(*cl.scores));
 
 // parse gametype
        cl.gametype = MSG_ReadByte ();
@@ -364,6 +377,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 +444,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 +610,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 +622,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 +650,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 +738,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);
 }
 
 /*
@@ -852,6 +873,9 @@ void CL_ParseBeam (model_t *m, int lightning)
                ent = 0;
        }
 
+       if (ent >= cl_max_entities)
+               CL_ExpandEntities(ent);
+
        // override any beam with the same entity
        for (i = 0, b = cl_beams;i < cl_max_beams;i++, b++)
        {
@@ -1141,7 +1165,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 +1263,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 +1287,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 +1419,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++;
@@ -1470,6 +1493,8 @@ void CL_ParseServerMessage(void)
                        cl.viewentity = (unsigned short)MSG_ReadShort ();
                        if (cl.viewentity >= MAX_EDICTS)
                                Host_Error("svc_setview >= MAX_EDICTS\n");
+                       if (cl.viewentity >= cl_max_entities)
+                               CL_ExpandEntities(cl.viewentity);
                        // LordHavoc: assume first setview recieved is the real player entity
                        if (!cl.playerentity)
                                cl.playerentity = cl.viewentity;
@@ -1516,7 +1541,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;
                                        }
@@ -1568,12 +1593,16 @@ void CL_ParseServerMessage(void)
                        i = (unsigned short) MSG_ReadShort ();
                        if (i < 0 || i >= MAX_EDICTS)
                                Host_Error ("CL_ParseServerMessage: svc_spawnbaseline: invalid entity number %i", i);
+                       if (i >= cl_max_entities)
+                               CL_ExpandEntities(i);
                        CL_ParseBaseline (cl_entities + i, false);
                        break;
                case svc_spawnbaseline2:
                        i = (unsigned short) MSG_ReadShort ();
                        if (i < 0 || i >= MAX_EDICTS)
                                Host_Error ("CL_ParseServerMessage: svc_spawnbaseline2: invalid entity number %i", i);
+                       if (i >= cl_max_entities)
+                               CL_ExpandEntities(i);
                        CL_ParseBaseline (cl_entities + i, true);
                        break;
                case svc_spawnstatic:
@@ -1597,7 +1626,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 ();
@@ -1742,9 +1773,12 @@ void CL_Parse_DumpPacket(void)
 void CL_Parse_Init(void)
 {
        // LordHavoc: added demo_nehahra cvar
-       cl_scores_mempool = Mem_AllocPool("client player info", 0, NULL);
        Cvar_RegisterVariable (&demo_nehahra);
        if (gamemode == GAME_NEHAHRA)
                Cvar_SetValue("demo_nehahra", 1);
        Cvar_RegisterVariable(&developer_networkentities);
 }
+
+void CL_Parse_Shutdown(void)
+{
+}