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;
*/
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;
switch (type)
{
case ev_string:
- sprintf (line, "%s", PRVM_GetString(val->string));
+ strlcpy (line, PRVM_GetString (val->string), sizeof (line));
break;
case ev_entity:
n = val->edict;
break;
case ev_function:
f = pr_functions + val->function;
- snprintf (line, sizeof (line), "%s", PRVM_GetString(f->s_name));
+ strlcpy (line, PRVM_GetString (f->s_name), sizeof (line));
break;
case ev_field:
def = PRVM_ED_FieldAtOfs ( val->_int );
*/
// 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;
if (ed->e->free)
{
- Con_Printf ("%s: FREE\n",PRVM_NAME);
+ Con_Printf("%s: FREE\n",PRVM_NAME);
return;
}
if (strlen(name) > 256)
{
- strncpy(tempstring2, name, 256);
+ memcpy (tempstring2, name, 256);
tempstring2[256] = tempstring2[257] = tempstring2[258] = '.';
tempstring2[259] = 0;
name = tempstring2;
name = PRVM_ValueString(d->type, (prvm_eval_t *)v);
if (strlen(name) > 256)
{
- strncpy(tempstring2, name, 256);
+ memcpy (tempstring2, name, 256);
tempstring2[256] = tempstring2[257] = tempstring2[258] = '.';
tempstring2[259] = 0;
name = tempstring2;
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);
}
/*
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;
}
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));
}
/*
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 ; i<prog->num_edicts ; i++)
PRVM_ED_PrintNum (i);
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;
}
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;
char *name;
int type;
- FS_Printf (f,"{\n");
+ FS_Print(f,"{\n");
for (i=0 ; i<prog->progs->numglobaldefs ; i++)
{
def = &prog->globaldefs[i];
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");
}
/*
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;
}
return new;
}
-
/*
=============
PRVM_ED_ParseEval
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);
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;
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 <program name> <edict number> <field> <value>\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
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;
}
}
//
-// 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;
}
{
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;
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
void PRVM_ResetProg()
{
- mempool_t *t1, *t2, *t3;
+ /*mempool_t *t1, *t2, *t3;
t1 = prog->progs_mempool;
t2 = prog->edictstring_mempool;
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)();
}
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);
prog->flag |= PRVM_OP_STATE;
PRVM_GCALL(reset_cmd)();
+ PRVM_GCALL(init_cmd)();
// init mempools
PRVM_MEM_Alloc();
/*
if (!sv.active)
{
- Con_Printf("no progs loaded\n");
+ Con_Print("no progs loaded\n");
return;
}
*/
}
if (strlen(name) > 256)
{
- strncpy(tempstring2, name, 256);
+ memcpy (tempstring2, name, 256);
tempstring2[256] = tempstring2[257] = tempstring2[258] = '.';
tempstring2[259] = 0;
name = tempstring2;
strcat(tempstring, "\n");
if (strlen(tempstring) >= 4096)
{
- Con_Printf("%s", tempstring);
+ Con_Print(tempstring);
tempstring[0] = 0;
}
if (counts[i])
// 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 <program name>\n");
+ Con_Print("prvm_globals <program name>\n");
return;
}
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);
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()