X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=prvm_edict.c;h=4cc5872462fa426560f1dc3d9eb9a50e0acfe070;hb=b4b9ae3ea1a4d1252055e9a9969f4048ea3c3182;hp=1bf6e847d85bfab4a73666299e39ac20a7f2efad;hpb=ff690dc14daf8c520c49a10bf62cc4c5ca5b9d19;p=xonotic%2Fdarkplaces.git diff --git a/prvm_edict.c b/prvm_edict.c index 1bf6e847..4cc58724 100644 --- a/prvm_edict.c +++ b/prvm_edict.c @@ -383,7 +383,7 @@ char *PRVM_ValueString (etype_t type, prvm_eval_t *val) switch (type) { case ev_string: - sprintf (line, "%s", PRVM_GetString(val->string)); + strncpy(line, PRVM_GetString(val->string), sizeof(line)); break; case ev_entity: n = val->edict; @@ -470,7 +470,7 @@ char *PRVM_UglyValueString (etype_t type, prvm_eval_t *val) break; case ev_function: f = pr_functions + val->function; - snprintf (line, sizeof (line), "%s", PRVM_GetString(f->s_name)); + strncpy(line, PRVM_GetString(f->s_name), sizeof(line)); break; case ev_field: def = PRVM_ED_FieldAtOfs ( val->_int ); @@ -557,7 +557,7 @@ For debugging */ // LordHavoc: optimized this to print out much more quickly (tempstring) // LordHavoc: changed to print out every 4096 characters (incase there are a lot of fields to print) -void PRVM_ED_Print (prvm_edict_t *ed) +void PRVM_ED_Print(prvm_edict_t *ed) { int l; ddef_t *d; @@ -569,7 +569,7 @@ void PRVM_ED_Print (prvm_edict_t *ed) if (ed->e->free) { - Con_Printf ("%s: FREE\n",PRVM_NAME); + Con_Printf("%s: FREE\n",PRVM_NAME); return; } @@ -617,12 +617,12 @@ void PRVM_ED_Print (prvm_edict_t *ed) strcat(tempstring, "\n"); if (strlen(tempstring) >= 4096) { - Con_Printf("%s", tempstring); + Con_Print(tempstring); tempstring[0] = 0; } } if (tempstring[0]) - Con_Printf("%s", tempstring); + Con_Print(tempstring); } /* @@ -640,11 +640,11 @@ void PRVM_ED_Write (qfile_t *f, prvm_edict_t *ed) char *name; int type; - FS_Printf (f, "{\n"); + FS_Print(f, "{\n"); if (ed->e->free) { - FS_Printf (f, "}\n"); + FS_Print(f, "}\n"); return; } @@ -665,16 +665,16 @@ void PRVM_ED_Write (qfile_t *f, prvm_edict_t *ed) if (j == prvm_type_size[type]) continue; - FS_Printf (f,"\"%s\" ",name); - FS_Printf (f,"\"%s\"\n", PRVM_UglyValueString(d->type, (prvm_eval_t *)v)); + FS_Printf(f,"\"%s\" ",name); + FS_Printf(f,"\"%s\"\n", PRVM_UglyValueString(d->type, (prvm_eval_t *)v)); } - FS_Printf (f, "}\n"); + FS_Print(f, "}\n"); } void PRVM_ED_PrintNum (int ent) { - PRVM_ED_Print (PRVM_EDICT_NUM(ent)); + PRVM_ED_Print(PRVM_EDICT_NUM(ent)); } /* @@ -698,7 +698,7 @@ void PRVM_ED_PrintEdicts_f (void) if(!PRVM_SetProgFromString(Cmd_Argv(1))) return; - Con_Printf ("%s: %i entities\n", PRVM_NAME, prog->num_edicts); + Con_Printf("%s: %i entities\n", PRVM_NAME, prog->num_edicts); for (i=0 ; inum_edicts ; i++) PRVM_ED_PrintNum (i); @@ -729,7 +729,7 @@ void PRVM_ED_PrintEdict_f (void) i = atoi (Cmd_Argv(2)); if (i >= prog->num_edicts) { - Con_Printf("Bad edict number\n"); + Con_Print("Bad edict number\n"); PRVM_End; return; } @@ -776,8 +776,8 @@ void PRVM_ED_Count_f (void) active++; } - Con_Printf ("num_edicts:%3i\n", prog->num_edicts); - Con_Printf ("active :%3i\n", active); + Con_Printf("num_edicts:%3i\n", prog->num_edicts); + Con_Printf("active :%3i\n", active); } PRVM_End; @@ -804,7 +804,7 @@ void PRVM_ED_WriteGlobals (qfile_t *f) char *name; int type; - FS_Printf (f,"{\n"); + FS_Print(f,"{\n"); for (i=0 ; iprogs->numglobaldefs ; i++) { def = &prog->globaldefs[i]; @@ -817,10 +817,10 @@ void PRVM_ED_WriteGlobals (qfile_t *f) continue; name = PRVM_GetString(def->s_name); - FS_Printf (f,"\"%s\" ", name); - FS_Printf (f,"\"%s\"\n", PRVM_UglyValueString(type, (prvm_eval_t *)&prog->globals[def->ofs])); + FS_Printf(f,"\"%s\" ", name); + FS_Printf(f,"\"%s\"\n", PRVM_UglyValueString(type, (prvm_eval_t *)&prog->globals[def->ofs])); } - FS_Printf (f,"}\n"); + FS_Print(f,"}\n"); } /* @@ -853,7 +853,7 @@ void PRVM_ED_ParseGlobals (const char *data) key = PRVM_ED_FindGlobal (keyname); if (!key) { - Con_DPrintf ("'%s' is not a global on %s\n", keyname, PRVM_NAME); + Con_DPrintf("'%s' is not a global on %s\n", keyname, PRVM_NAME); continue; } @@ -896,7 +896,6 @@ char *PRVM_ED_NewString (const char *string) return new; } - /* ============= PRVM_ED_ParseEval @@ -972,7 +971,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 in %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; @@ -985,6 +984,44 @@ qboolean PRVM_ED_ParseEpair(prvm_edict_t *ent, ddef_t *key, const char *s) return true; } +/* +============= +PRVM_ED_EdictSet_f + +Console command to set a field of a specified edict +============= +*/ +void PRVM_ED_EdictSet_f(void) +{ + prvm_edict_t *ed; + ddef_t *key; + + if(Cmd_Argc() != 5) + { + Con_Print("prvm_edictset \n"); + return; + } + + PRVM_Begin; + if(!PRVM_SetProgFromString(Cmd_Argv(1))) + { + Con_Printf("Wrong program name %s !\n", Cmd_Argv(1)); + return; + } + + ed = PRVM_EDICT_NUM(atoi(Cmd_Argv(2))); + + if((key = PRVM_ED_FindField(Cmd_Argv(3))) == 0) + { + Con_Printf("Key %s not found !\n", Cmd_Argv(3)); + return; + } + + PRVM_ED_ParseEpair(ed, key, Cmd_Argv(4)); + + PRVM_End; +} + /* ==================== PRVM_ED_ParseEdict @@ -1058,7 +1095,7 @@ const char *PRVM_ED_ParseEdict (const char *data, prvm_edict_t *ent) key = PRVM_ED_FindField (keyname); if (!key) { - Con_DPrintf ("%s: '%s' is not a field\n", PRVM_NAME, keyname); + Con_DPrintf("%s: '%s' is not a field\n", PRVM_NAME, keyname); continue; } @@ -1134,15 +1171,15 @@ void PRVM_ED_LoadFromFile (const char *data) } // -// immediately call spawn function, but only if there is a self global +// immediately call spawn function, but only if there is a self global and a classname // if(prog->self && prog->flag & PRVM_FE_CLASSNAME) { string_t handle = *(string_t*)&((float*)ent->v)[PRVM_ED_FindFieldOffset("classname")]; if (!handle) { - Con_Printf ("No classname for:\n"); - PRVM_ED_Print (ent); + Con_Print("No classname for:\n"); + PRVM_ED_Print(ent); PRVM_ED_Free (ent); continue; } @@ -1154,8 +1191,8 @@ void PRVM_ED_LoadFromFile (const char *data) { if (developer.integer) // don't confuse non-developers with errors { - Con_Printf ("No spawn function for:\n"); - PRVM_ED_Print (ent); + Con_Print("No spawn function for:\n"); + PRVM_ED_Print(ent); } PRVM_ED_Free (ent); continue; @@ -1171,7 +1208,7 @@ void PRVM_ED_LoadFromFile (const char *data) 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); + 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 @@ -1198,7 +1235,7 @@ PRVM_ResetProg void PRVM_ResetProg() { - mempool_t *t1, *t2, *t3; + /*mempool_t *t1, *t2, *t3; t1 = prog->progs_mempool; t2 = prog->edictstring_mempool; @@ -1206,15 +1243,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->time = &prog->_time; prog->progs_mempool = t1; prog->edictstring_mempool = t2; - prog->edicts_mempool = t3; + prog->edicts_mempool = t3;*/ PRVM_GCALL(reset_cmd)(); } @@ -1229,22 +1269,16 @@ void PRVM_LoadProgs (const char * filename, int numrequiredfunc, char **required int i; dstatement_t *st; ddef_t *infielddefs; - void *temp; dfunction_t *dfunctions; Mem_EmptyPool(prog->progs_mempool); Mem_EmptyPool(prog->edictstring_mempool); - temp = FS_LoadFile (filename, false); - if (temp == 0) + prog->progs = (dprograms_t *)FS_LoadFile (filename, prog->progs_mempool, false); + if (prog->progs == NULL) PRVM_ERROR ("PRVM_LoadProgs: couldn't load %s for %s", filename, PRVM_NAME); - prog->progs = (dprograms_t *)Mem_Alloc(prog->progs_mempool, fs_filesize); - - memcpy(prog->progs, temp, fs_filesize); - Mem_Free(temp); - - Con_DPrintf ("%s programs occupy %iK.\n", PRVM_NAME, fs_filesize/1024); + Con_DPrintf("%s programs occupy %iK.\n", PRVM_NAME, fs_filesize/1024); pr_crc = CRC_Block((qbyte *)prog->progs, fs_filesize); @@ -1462,6 +1496,7 @@ void PRVM_LoadProgs (const char * filename, int numrequiredfunc, char **required prog->flag |= PRVM_OP_STATE; PRVM_GCALL(reset_cmd)(); + PRVM_GCALL(init_cmd)(); // init mempools PRVM_MEM_Alloc(); @@ -1481,7 +1516,7 @@ void PRVM_Fields_f (void) /* if (!sv.active) { - Con_Printf("no progs loaded\n"); + Con_Print("no progs loaded\n"); return; } */ @@ -1575,7 +1610,7 @@ void PRVM_Fields_f (void) strcat(tempstring, "\n"); if (strlen(tempstring) >= 4096) { - Con_Printf("%s", tempstring); + Con_Print(tempstring); tempstring[0] = 0; } if (counts[i]) @@ -1596,12 +1631,12 @@ void PRVM_Globals_f (void) // TODO /*if (!sv.active) { - Con_Printf("no progs loaded\n"); + Con_Print("no progs loaded\n"); return; }*/ if(Cmd_Argc () != 2) { - Con_Print ("prvm_globals \n"); + Con_Print("prvm_globals \n"); return; } @@ -1631,6 +1666,7 @@ void PRVM_Init (void) Cmd_AddCommand ("prvm_profile", PRVM_Profile_f); Cmd_AddCommand ("prvm_fields", PRVM_Fields_f); Cmd_AddCommand ("prvm_globals", PRVM_Globals_f); + Cmd_AddCommand ("prvm_edictset", PRVM_ED_EdictSet_f); // LordHavoc: optional runtime bounds checking (speed drain, but worth it for security, on by default - breaks most QCCX features (used by CRMod and others)) Cvar_RegisterVariable (&prvm_boundscheck); Cvar_RegisterVariable (&prvm_traceqc); @@ -1650,11 +1686,12 @@ void PRVM_InitProg(int prognr) prog = &prog_list[prognr]; + if(prog->loaded) + PRVM_ResetProg(); + memset(prog, 0, sizeof(prvm_prog_t)); prog->time = &prog->_time; - - PRVM_GCALL(init_cmd)(); } int PRVM_GetProgNr()