]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_parse.c
q3bsp is still not working yet, but getting closer
[xonotic/darkplaces.git] / cl_parse.c
index c51570b9ac8d61ccc60d5087fee44b28278027ee..c8ac50b9422f955b6f0659781772e1f35b9f6104 100644 (file)
@@ -221,13 +221,13 @@ void CL_ParseEntityLump(char *entdata)
        data = entdata;
        if (!data)
                return;
-       if (!COM_ParseToken(&data))
+       if (!COM_ParseToken(&data, false))
                return; // error
        if (com_token[0] != '{')
                return; // error
        while (1)
        {
-               if (!COM_ParseToken(&data))
+               if (!COM_ParseToken(&data, false))
                        return; // error
                if (com_token[0] == '}')
                        break; // end of worldspawn
@@ -237,7 +237,7 @@ void CL_ParseEntityLump(char *entdata)
                        strcpy(key, com_token);
                while (key[strlen(key)-1] == ' ') // remove trailing spaces
                        key[strlen(key)-1] = 0;
-               if (!COM_ParseToken(&data))
+               if (!COM_ParseToken(&data, false))
                        return; // error
                strcpy(value, com_token);
                if (!strcmp("sky", key))
@@ -331,9 +331,9 @@ void CL_ParseServerInfo (void)
 
 // parse protocol version number
        i = MSG_ReadLong ();
-       if (i != PROTOCOL_VERSION && i != DPPROTOCOL_VERSION1 && i != DPPROTOCOL_VERSION2 && i != DPPROTOCOL_VERSION3 && i != 250)
+       if (i != PROTOCOL_VERSION && i != DPPROTOCOL_VERSION1 && i != DPPROTOCOL_VERSION2 && i != DPPROTOCOL_VERSION3 && i != DPPROTOCOL_VERSION4 && i != 250)
        {
-               Host_Error ("Server is protocol %i, not %i, %i, %i or %i", i, DPPROTOCOL_VERSION1, DPPROTOCOL_VERSION2, DPPROTOCOL_VERSION3, PROTOCOL_VERSION);
+               Host_Error ("Server is protocol %i, not %i, %i, %i, %i or %i", i, DPPROTOCOL_VERSION1, DPPROTOCOL_VERSION2, DPPROTOCOL_VERSION3, DPPROTOCOL_VERSION4, PROTOCOL_VERSION);
                return;
        }
        Nehahrademcompatibility = false;
@@ -342,7 +342,7 @@ void CL_ParseServerInfo (void)
        if (cls.demoplayback && demo_nehahra.integer)
                Nehahrademcompatibility = true;
        dpprotocol = i;
-       if (dpprotocol != DPPROTOCOL_VERSION1 && dpprotocol != DPPROTOCOL_VERSION2 && dpprotocol != DPPROTOCOL_VERSION3)
+       if (dpprotocol != DPPROTOCOL_VERSION1 && dpprotocol != DPPROTOCOL_VERSION2 && dpprotocol != DPPROTOCOL_VERSION3 && dpprotocol != DPPROTOCOL_VERSION4)
                dpprotocol = 0;
 
 // parse maxclients
@@ -532,7 +532,7 @@ void CL_MoveLerpEntityStates(entity_t *ent)
                // not a monster
                ent->persistent.lerpstarttime = cl.mtime[1];
                // no lerp if it's singleplayer
-               if (sv.active && svs.maxclients == 1)
+               if (cl.islocalgame)
                        ent->persistent.lerpdeltatime = 0;
                else
                        ent->persistent.lerpdeltatime = cl.mtime[0] - cl.mtime[1];
@@ -653,22 +653,32 @@ void CL_ParseUpdate (int bits)
 }
 
 static entity_frame_t entityframe;
+extern mempool_t *cl_entities_mempool;
 void CL_ReadEntityFrame(void)
 {
-       entity_t *ent;
-       int i;
-       EntityFrame_Read(&cl.entitydatabase);
-       EntityFrame_FetchFrame(&cl.entitydatabase, EntityFrame_MostRecentlyRecievedFrameNum(&cl.entitydatabase), &entityframe);
-       for (i = 0;i < entityframe.numentities;i++)
+       if (dpprotocol == DPPROTOCOL_VERSION1 || dpprotocol == DPPROTOCOL_VERSION2 || dpprotocol == DPPROTOCOL_VERSION3)
        {
-               // copy the states
-               ent = &cl_entities[entityframe.entitydata[i].number];
-               ent->state_previous = ent->state_current;
-               ent->state_current = entityframe.entitydata[i];
-               CL_MoveLerpEntityStates(ent);
-               // the entity lives again...
-               entlife[ent->state_current.number] = 2;
-               cl_entities_active[ent->state_current.number] = true;
+               int i;
+               entity_t *ent;
+               EntityFrame_Read(&cl.entitydatabase);
+               EntityFrame_FetchFrame(&cl.entitydatabase, EntityFrame_MostRecentlyRecievedFrameNum(&cl.entitydatabase), &entityframe);
+               for (i = 0;i < entityframe.numentities;i++)
+               {
+                       // copy the states
+                       ent = &cl_entities[entityframe.entitydata[i].number];
+                       ent->state_previous = ent->state_current;
+                       ent->state_current = entityframe.entitydata[i];
+                       CL_MoveLerpEntityStates(ent);
+                       // the entity lives again...
+                       entlife[ent->state_current.number] = 2;
+                       cl_entities_active[ent->state_current.number] = true;
+               }
+       }
+       else
+       {
+               if (!cl.entitydatabase4)
+                       cl.entitydatabase4 = EntityFrame4_AllocDatabase(cl_entities_mempool);
+               EntityFrame4_CL_ReadFrame(cl.entitydatabase4);
        }
 }
 
@@ -678,18 +688,21 @@ void CL_EntityUpdateSetup(void)
 
 void CL_EntityUpdateEnd(void)
 {
-       int i;
-       // disable entities that disappeared this frame
-       for (i = 1;i < MAX_EDICTS;i++)
+       if (dpprotocol == PROTOCOL_VERSION || dpprotocol == DPPROTOCOL_VERSION1 || dpprotocol == DPPROTOCOL_VERSION2 || dpprotocol == DPPROTOCOL_VERSION3)
        {
-               // clear only the entities that were active last frame but not this
-               // frame, don't waste time clearing all entities (which would cause
-               // cache misses)
-               if (entlife[i])
+               int i;
+               // disable entities that disappeared this frame
+               for (i = 1;i < MAX_EDICTS;i++)
                {
-                       entlife[i]--;
-                       if (!entlife[i])
-                               cl_entities[i].state_previous.active = cl_entities[i].state_current.active = 0;
+                       // clear only the entities that were active last frame but not this
+                       // frame, don't waste time clearing all entities (which would cause
+                       // cache misses)
+                       if (entlife[i])
+                       {
+                               entlife[i]--;
+                               if (!entlife[i])
+                                       cl_entities[i].state_previous.active = cl_entities[i].state_current.active = 0;
+                       }
                }
        }
 }
@@ -703,7 +716,7 @@ void CL_ParseBaseline (entity_t *ent, int large)
 {
        int i;
 
-       memset(&ent->state_baseline, 0, sizeof(entity_state_t));
+       ClearStateToDefault(&ent->state_baseline);
        ent->state_baseline.active = true;
        if (large)
        {
@@ -722,13 +735,8 @@ void CL_ParseBaseline (entity_t *ent, int large)
                ent->state_baseline.origin[i] = MSG_ReadCoord ();
                ent->state_baseline.angles[i] = MSG_ReadAngle ();
        }
-       ent->state_baseline.alpha = 255;
-       ent->state_baseline.scale = 16;
-       ent->state_baseline.glowsize = 0;
-       ent->state_baseline.glowcolor = 254;
-       ent->state_previous = ent->state_current = ent->state_baseline;
-
        CL_ValidateState(&ent->state_baseline);
+       ent->state_previous = ent->state_current = ent->state_baseline;
 }
 
 
@@ -1496,15 +1504,15 @@ void CL_ParseServerMessage(void)
 
                case svc_version:
                        i = MSG_ReadLong ();
-                       if (i != PROTOCOL_VERSION && i != DPPROTOCOL_VERSION1 && i != DPPROTOCOL_VERSION2 && i != DPPROTOCOL_VERSION3 && i != 250)
-                               Host_Error ("CL_ParseServerMessage: Server is protocol %i, not %i, %i, %i or %i", i, DPPROTOCOL_VERSION1, DPPROTOCOL_VERSION2, DPPROTOCOL_VERSION3, PROTOCOL_VERSION);
+                       if (i != PROTOCOL_VERSION && i != DPPROTOCOL_VERSION1 && i != DPPROTOCOL_VERSION2 && i != DPPROTOCOL_VERSION3 && i != DPPROTOCOL_VERSION4 && i != 250)
+                               Host_Error ("CL_ParseServerMessage: Server is protocol %i, not %i, %i, %i, %i or %i", i, DPPROTOCOL_VERSION1, DPPROTOCOL_VERSION2, DPPROTOCOL_VERSION3, DPPROTOCOL_VERSION4, PROTOCOL_VERSION);
                        Nehahrademcompatibility = false;
                        if (i == 250)
                                Nehahrademcompatibility = true;
                        if (cls.demoplayback && demo_nehahra.integer)
                                Nehahrademcompatibility = true;
                        dpprotocol = i;
-                       if (dpprotocol != DPPROTOCOL_VERSION1 && dpprotocol != DPPROTOCOL_VERSION2 && dpprotocol != DPPROTOCOL_VERSION3)
+                       if (dpprotocol != DPPROTOCOL_VERSION1 && dpprotocol != DPPROTOCOL_VERSION2 && dpprotocol != DPPROTOCOL_VERSION3 && dpprotocol != DPPROTOCOL_VERSION4)
                                dpprotocol = 0;
                        break;