X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=prvm_edict.c;h=5aa1d6af158f12d58511922791f5eb2dde98431d;hb=449b12475e1848290002970f45fd4bdcd0a4d462;hp=49fa7420320d8a2900bd159007e583640cdf5be3;hpb=9e1d9d449d3f69ade2f01e16e47d1e0ab3cf1688;p=xonotic%2Fdarkplaces.git diff --git a/prvm_edict.c b/prvm_edict.c index 49fa7420..5aa1d6af 100644 --- a/prvm_edict.c +++ b/prvm_edict.c @@ -50,8 +50,10 @@ void PRVM_MEM_Alloc() { int i; + // reserve space for the null entity aka world // check bound of max_edicts - prog->max_edicts = min(prog->max_edicts,prog->limit_edicts); + prog->max_edicts = bound(1, prog->max_edicts, prog->limit_edicts); + prog->num_edicts = bound(1, prog->num_edicts, prog->max_edicts); // edictprivate_size has to be min as big prvm_edict_private_t prog->edictprivate_size = max(prog->edictprivate_size,(int)sizeof(prvm_edict_private_t)); @@ -216,14 +218,14 @@ prvm_edict_t *PRVM_ED_Alloc (void) // the client qc dont need maxclients // thus it doesnt need to use svs.maxclients // AK: changed i=svs.maxclients+1 - // AK: changed so the edict 0 wont spawned -> used as reserved/world entity + // AK: changed so the edict 0 wont spawn -> used as reserved/world entity // although the menu/client has no world for (i = 1;i < prog->num_edicts;i++) { e = PRVM_EDICT_NUM(i); // the first couple seconds of server time can involve a lot of // freeing and allocating, so relax the replacement policy - if (e->e->free && ( e->e->freetime < 2 || prog->time - e->e->freetime > 0.5 ) ) + if (e->e->free && ( e->e->freetime < 2 || (*prog->time - e->e->freetime) > 0.5 ) ) { PRVM_ED_ClearEdict (e); return e; @@ -253,10 +255,14 @@ FIXME: walk all entities and NULL out references to this entity */ void PRVM_ED_Free (prvm_edict_t *ed) { + // dont delete the null entity (world) + if(PRVM_NUM_FOR_EDICT(ed) == 0) + return; + PRVM_GCALL(free_edict)(ed); ed->e->free = true; - ed->e->freetime = prog->time; + ed->e->freetime = *prog->time; } //=========================================================================== @@ -684,7 +690,7 @@ void PRVM_ED_PrintEdicts_f (void) if(Cmd_Argc() != 2) { - Con_Print("prvm_edicts \n"); + Con_Printf("prvm_edicts \n"); return; } @@ -712,7 +718,7 @@ void PRVM_ED_PrintEdict_f (void) if(Cmd_Argc() != 3) { - Con_Print("prvm_edict \n"); + Con_Printf("prvm_edict \n"); return; } @@ -749,7 +755,7 @@ void PRVM_ED_Count_f (void) if(Cmd_Argc() != 2) { - Con_Print("prvm_count \n"); + Con_Printf("prvm_count \n"); return; } @@ -770,7 +776,7 @@ void PRVM_ED_Count_f (void) active++; } - Con_Printf ("num_edicts:%3i\n", sv.num_edicts); + Con_Printf ("num_edicts:%3i\n", prog->num_edicts); Con_Printf ("active :%3i\n", active); } @@ -913,7 +919,7 @@ qboolean PRVM_ED_ParseEpair(prvm_edict_t *ent, ddef_t *key, const char *s) switch (key->type & ~DEF_SAVEGLOBAL) { case ev_string: - val->string = PRVM_SetString(ED_NewString(s)); + val->string = PRVM_SetString(PRVM_ED_NewString(s)); break; case ev_float: @@ -956,7 +962,7 @@ qboolean PRVM_ED_ParseEpair(prvm_edict_t *ent, ddef_t *key, const char *s) def = PRVM_ED_FindField(s); if (!def) { - Con_DPrintf("PRVM_ED_ParseEpair: Can't find field %s on %s\n", s, PRVM_NAME); + Con_DPrintf("PRVM_ED_ParseEpair: Can't find field %s in %s\n", s, PRVM_NAME); return false; } val->_int = PRVM_G_INT(def->ofs); @@ -966,7 +972,7 @@ qboolean PRVM_ED_ParseEpair(prvm_edict_t *ent, ddef_t *key, const char *s) func = PRVM_ED_FindFunction(s); if (!func) { - Con_Printf ("PRVM_ED_ParseEpair: Can't find function %s on %s\n", s, PRVM_NAME); + Con_Printf ("PRVM_ED_ParseEpair: Can't find function %s in %s\n", s, PRVM_NAME); return false; } val->function = func - prog->functions; @@ -1027,7 +1033,7 @@ const char *PRVM_ED_ParseEdict (const char *data, prvm_edict_t *ent) strcpy (keyname, com_token); - // another hack to fix heynames with trailing spaces + // another hack to fix keynames with trailing spaces n = strlen(keyname); while (n && keyname[n-1] == ' ') { @@ -1095,16 +1101,12 @@ void PRVM_ED_LoadFromFile (const char *data) int parsed, inhibited, spawned, died; mfunction_t *func; - ent = NULL; parsed = 0; inhibited = 0; spawned = 0; died = 0; - // time defined ? - if(prog->flag & PRVM_GE_TIME) - PRVM_G_FLOAT(PRVM_ED_FindFieldOffset("time")) = prog->time; - + // parse ents while (1) { @@ -1112,12 +1114,14 @@ void PRVM_ED_LoadFromFile (const char *data) if (!COM_ParseToken(&data, false)) break; if (com_token[0] != '{') - PRVM_ERROR ("PRVM_ED_LoadFromFile: found %s when expecting (%s) {",com_token, PRVM_NAME); + PRVM_ERROR ("PRVM_ED_LoadFromFile: %s: found %s when expecting {", PRVM_NAME, com_token); - if (!ent) + // CHANGED: this is not conform to ED_LoadFromFile + if(!prog->num_edicts) ent = PRVM_EDICT_NUM(0); - else - ent = PRVM_ED_Alloc (); + else + ent = PRVM_ED_Alloc(); + data = PRVM_ED_ParseEdict (data, ent); parsed++; @@ -1167,8 +1171,8 @@ void PRVM_ED_LoadFromFile (const char *data) died++; } - Con_DPrintf ("%s: %i entities parsed, %i inhibited, %i spawned (%i removed self, %i stayed)\n", PRVM_NAME, parsed, inhibited, spawned, died, spawned - died); -} + Con_DPrintf ("%s: %i new entities parsed, %i new inhibited, %i (%i new) spawned (whereas %i removed self, %i stayed)\n", PRVM_NAME, parsed, inhibited, prog->num_edicts, spawned, died, spawned - died); +} // not used /* @@ -1194,7 +1198,7 @@ PRVM_ResetProg void PRVM_ResetProg() { - mempool_t *t1, *t2, *t3; + /*mempool_t *t1, *t2, *t3; t1 = prog->progs_mempool; t2 = prog->edictstring_mempool; @@ -1202,14 +1206,18 @@ void PRVM_ResetProg() Mem_EmptyPool(prog->progs_mempool); Mem_EmptyPool(prog->edictstring_mempool); - Mem_EmptyPool(prog->edicts_mempool); + Mem_EmptyPool(prog->edicts_mempool);*/ + Mem_FreePool(&prog->progs_mempool); + Mem_FreePool(&prog->edictstring_mempool); + Mem_FreePool(&prog->edicts_mempool); memset(prog,0,sizeof(prvm_prog_t)); + /*prog->time = &prog->_time; prog->progs_mempool = t1; prog->edictstring_mempool = t2; - prog->edicts_mempool = t3; + prog->edicts_mempool = t3;*/ PRVM_GCALL(reset_cmd)(); } @@ -1444,7 +1452,7 @@ void PRVM_LoadProgs (const char * filename, int numrequiredfunc, char **required prog->self = PRVM_ED_FindGlobal("self"); if(PRVM_ED_FindGlobal("time")) - prog->flag |= PRVM_GE_TIME; + prog->time = &PRVM_G_FLOAT(PRVM_ED_FindGlobal("time")->ofs); if(PRVM_ED_FindField ("chain")) prog->flag |= PRVM_FE_CHAIN; @@ -1453,10 +1461,11 @@ void PRVM_LoadProgs (const char * filename, int numrequiredfunc, char **required prog->flag |= PRVM_FE_CLASSNAME; if(PRVM_ED_FindField ("nextthink") && PRVM_ED_FindField ("frame") && PRVM_ED_FindField ("think") - && prog->flag & PRVM_GE_TIME && prog->self) + && prog->flag && prog->self) prog->flag |= PRVM_OP_STATE; PRVM_GCALL(reset_cmd)(); + PRVM_GCALL(init_cmd)(); // init mempools PRVM_MEM_Alloc(); @@ -1483,7 +1492,7 @@ void PRVM_Fields_f (void) if(Cmd_Argc() != 2) { - Con_Print("prvm_fields \n"); + Con_Printf("prvm_fields \n"); return; } @@ -1596,7 +1605,7 @@ void PRVM_Globals_f (void) }*/ if(Cmd_Argc () != 2) { - Con_Print ("prvm_globals \n"); + Con_Printf("prvm_globals \n"); return; } @@ -1645,9 +1654,12 @@ void PRVM_InitProg(int prognr) prog = &prog_list[prognr]; + if(prog->loaded) + PRVM_ResetProg(); + memset(prog, 0, sizeof(prvm_prog_t)); - PRVM_GCALL(init_cmd)(); + prog->time = &prog->_time; } int PRVM_GetProgNr()