]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - pr_edict.c
fixed the SU_ITEMS fix so that it doesn't trash the PROTOCOL_DARKPLACES6 parsing
[xonotic/darkplaces.git] / pr_edict.c
index 5e3f6a4f099079cbe73ac6aa521348a4acdee65a..8b41df06bf3d109ee0e3329c3d47b95126dca9dc 100644 (file)
@@ -34,8 +34,7 @@ int                           pr_edictareasize;               // LordHavoc: in bytes
 
 unsigned short pr_crc;
 
-mempool_t              *progs_mempool;
-mempool_t              *edictstring_mempool;
+mempool_t              *serverprogs_mempool;
 
 int            type_size[8] = {1,sizeof(string_t)/4,1,3,1,1,sizeof(func_t)/4,sizeof(void *)/4};
 
@@ -921,7 +920,7 @@ char *ED_NewString (const char *string)
        int i,l;
 
        l = strlen(string) + 1;
-       new = Mem_Alloc(edictstring_mempool, l);
+       new = PR_Alloc(l);
        new_p = new;
 
        for (i=0 ; i< l ; i++)
@@ -1167,24 +1166,26 @@ void ED_LoadFromFile (const char *data)
                parsed++;
 
 // remove things from different skill levels or deathmatch
-               if (deathmatch.integer)
+               if (gamemode != GAME_TRANSFUSION) //Transfusion does this in QC
                {
-                       if (((int)ent->v->spawnflags & SPAWNFLAG_NOT_DEATHMATCH))
+                       if (deathmatch.integer)
+                       {
+                               if (((int)ent->v->spawnflags & SPAWNFLAG_NOT_DEATHMATCH))
+                               {
+                                       ED_Free (ent);
+                                       inhibited++;
+                                       continue;
+                               }
+                       }
+                       else if ((current_skill <= 0 && ((int)ent->v->spawnflags & SPAWNFLAG_NOT_EASY  ))
+                               || (current_skill == 1 && ((int)ent->v->spawnflags & SPAWNFLAG_NOT_MEDIUM))
+                               || (current_skill >= 2 && ((int)ent->v->spawnflags & SPAWNFLAG_NOT_HARD  )))
                        {
                                ED_Free (ent);
                                inhibited++;
                                continue;
                        }
                }
-               else if ((current_skill <= 0 && ((int)ent->v->spawnflags & SPAWNFLAG_NOT_EASY  ))
-                         || (current_skill == 1 && ((int)ent->v->spawnflags & SPAWNFLAG_NOT_MEDIUM))
-                         || (current_skill >= 2 && ((int)ent->v->spawnflags & SPAWNFLAG_NOT_HARD  )))
-               {
-                       ED_Free (ent);
-                       inhibited++;
-                       continue;
-               }
-
 //
 // immediately call spawn function
 //
@@ -1305,10 +1306,9 @@ void PR_LoadProgs (const char *progsname)
        for (i=0 ; i<GEFV_CACHESIZE ; i++)
                gefvCache[i].field[0] = 0;
 
-       Mem_EmptyPool(progs_mempool);
-       Mem_EmptyPool(edictstring_mempool);
+       PR_FreeAll();
 
-       progs = (dprograms_t *)FS_LoadFile (progsname, progs_mempool, false);
+       progs = (dprograms_t *)FS_LoadFile (progsname, serverprogs_mempool, false);
        if (!progs)
                Host_Error ("PR_LoadProgs: couldn't load %s", progsname);
 
@@ -1333,7 +1333,8 @@ void PR_LoadProgs (const char *progsname)
        // we need to expand the fielddefs list to include all the engine fields,
        // so allocate a new place for it
        infielddefs = (ddef_t *)((qbyte *)progs + progs->ofs_fielddefs);
-       pr_fielddefs = Mem_Alloc(progs_mempool, (progs->numfielddefs + DPFIELDS) * sizeof(ddef_t));
+       pr_fielddefs = PR_Alloc((progs->numfielddefs + DPFIELDS) * sizeof(ddef_t));
+       pr_functions = PR_Alloc(sizeof(mfunction_t) * progs->numfunctions);
 
        pr_statements = (dstatement_t *)((qbyte *)progs + progs->ofs_statements);
 
@@ -1351,7 +1352,6 @@ void PR_LoadProgs (const char *progsname)
                pr_statements[i].c = LittleShort(pr_statements[i].c);
        }
 
-       pr_functions = Mem_Alloc(progs_mempool, sizeof(mfunction_t) * progs->numfunctions);
        for (i = 0;i < progs->numfunctions;i++)
        {
                pr_functions[i].first_statement = LittleLong (dfunctions[i].first_statement);
@@ -1672,8 +1672,7 @@ void PR_Init (void)
        Cvar_RegisterVariable (&pr_boundscheck);
        Cvar_RegisterVariable (&pr_traceqc);
 
-       progs_mempool = Mem_AllocPool("progs.dat", 0, NULL);
-       edictstring_mempool = Mem_AllocPool("edict strings", 0, NULL);
+       serverprogs_mempool = Mem_AllocPool("server progs", 0, NULL);
 
        PR_Cmd_Init();
 }
@@ -1688,8 +1687,25 @@ void PR_Shutdown (void)
 {
        PR_Cmd_Shutdown();
 
-       Mem_FreePool(&edictstring_mempool);
-       Mem_FreePool(&progs_mempool);
+       Mem_FreePool(&serverprogs_mempool);
+}
+
+void *PR_Alloc(size_t buffersize)
+{
+       return Mem_Alloc(serverprogs_mempool, buffersize);
+}
+
+void PR_Free(void *buffer)
+{
+       Mem_Free(buffer);
+}
+
+void PR_FreeAll(void)
+{
+       progs = NULL;
+       pr_fielddefs = NULL;
+       pr_functions = NULL;
+       Mem_EmptyPool(serverprogs_mempool);
 }
 
 // LordHavoc: turned EDICT_NUM into a #define for speed reasons