]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - prvm_edict.c
clean up field offset handling a bit, now uses vec_t instead of float,
[xonotic/darkplaces.git] / prvm_edict.c
index fbf632ed433f9766dbaf31a3e04abe6818d0cf96..5ac8db89643ba091159dd626f08065a530e0464c 100644 (file)
@@ -39,6 +39,8 @@ cvar_t prvm_backtraceforwarnings = {0, "prvm_backtraceforwarnings", "0", "print
 cvar_t prvm_leaktest = {0, "prvm_leaktest", "0", "try to detect memory leaks in strings or entities"};
 cvar_t prvm_leaktest_ignore_classnames = {0, "prvm_leaktest_ignore_classnames", "", "classnames of entities to NOT leak check because they are found by find(world, classname, ...) but are actually spawned by QC code (NOT map entities)"};
 cvar_t prvm_errordump = {0, "prvm_errordump", "0", "write a savegame on crash to crash-server.dmp"};
+cvar_t prvm_reuseedicts_startuptime = {0, "prvm_reuseedicts_startuptime", "2", "allows immediate re-use of freed entity slots during start of new level (value in seconds)"};
+cvar_t prvm_reuseedicts_neverinsameframe = {0, "prvm_reuseedicts_neverinsameframe", "1", "never allows re-use of freed entity slots during same frame"};
 
 qboolean prvm_runawaycheck = true;
 
@@ -75,13 +77,14 @@ void PRVM_MEM_Alloc(void)
        prog->edictprivate = Mem_Alloc(prog->progs_mempool, prog->max_edicts * prog->edictprivate_size);
 
        // alloc edict fields
-       prog->edictsfields = Mem_Alloc(prog->progs_mempool, prog->max_edicts * prog->edict_size);
+       prog->entityfieldsarea = prog->entityfields * prog->max_edicts;
+       prog->edictsfields = (vec_t *)Mem_Alloc(prog->progs_mempool, prog->entityfieldsarea * sizeof(vec_t));
 
        // set edict pointers
        for(i = 0; i < prog->max_edicts; i++)
        {
                prog->edicts[i].priv.required = (prvm_edict_private_t *)((unsigned char  *)prog->edictprivate + i * prog->edictprivate_size);
-               prog->edicts[i].fields.vp = (void*)((unsigned char *)prog->edictsfields + i * prog->edict_size);
+               prog->edicts[i].fields.vp = prog->edictsfields + i * prog->entityfields;
        }
 }
 
@@ -93,9 +96,6 @@ PRVM_MEM_IncreaseEdicts
 void PRVM_MEM_IncreaseEdicts(void)
 {
        int             i;
-       int             oldmaxedicts = prog->max_edicts;
-       void    *oldedictsfields = prog->edictsfields;
-       void    *oldedictprivate = prog->edictprivate;
 
        if(prog->max_edicts >= prog->limit_edicts)
                return;
@@ -105,23 +105,18 @@ void PRVM_MEM_IncreaseEdicts(void)
        // increase edicts
        prog->max_edicts = min(prog->max_edicts + 256, prog->limit_edicts);
 
-       prog->edictsfields = Mem_Alloc(prog->progs_mempool, prog->max_edicts * prog->edict_size);
-       prog->edictprivate = Mem_Alloc(prog->progs_mempool, prog->max_edicts * prog->edictprivate_size);
-
-       memcpy(prog->edictsfields, oldedictsfields, oldmaxedicts * prog->edict_size);
-       memcpy(prog->edictprivate, oldedictprivate, oldmaxedicts * prog->edictprivate_size);
+       prog->entityfieldsarea = prog->entityfields * prog->max_edicts;
+       prog->edictsfields = (vec_t*)Mem_Realloc(prog->progs_mempool, (void *)prog->edictsfields, prog->entityfieldsarea * sizeof(vec_t));
+       prog->edictprivate = (void *)Mem_Realloc(prog->progs_mempool, (void *)prog->edictprivate, prog->max_edicts * prog->edictprivate_size);
 
        //set e and v pointers
        for(i = 0; i < prog->max_edicts; i++)
        {
                prog->edicts[i].priv.required  = (prvm_edict_private_t *)((unsigned char  *)prog->edictprivate + i * prog->edictprivate_size);
-               prog->edicts[i].fields.vp = (void*)((unsigned char *)prog->edictsfields + i * prog->edict_size);
+               prog->edicts[i].fields.vp = prog->edictsfields + i * prog->entityfields;
        }
 
        PRVM_GCALL(end_increase_edicts)();
-
-       Mem_Free(oldedictsfields);
-       Mem_Free(oldedictprivate);
 }
 
 //============================================================================
@@ -224,7 +219,7 @@ void PRVM_ED_ClearEdict (prvm_edict_t *e)
        PRVM_GCALL(init_edict)(e);
 }
 
-const char *PRVM_AllocationOrigin()
+const char *PRVM_AllocationOrigin(void)
 {
        char *buf = NULL;
        if(prog->leaktest_active)
@@ -247,7 +242,9 @@ qboolean PRVM_ED_CanAlloc(prvm_edict_t *e)
 {
        if(!e->priv.required->free)
                return false;
-       if(e->priv.required->freetime < prog->starttime + 2)
+       if(realtime <= e->priv.required->freetime && prvm_reuseedicts_neverinsameframe.integer)
+               return false; // never allow reuse in same frame (causes networking trouble)
+       if(e->priv.required->freetime < prog->starttime + prvm_reuseedicts_startuptime.value)
                return true;
        if(realtime > e->priv.required->freetime + 1)
                return true;
@@ -448,7 +445,7 @@ char *PRVM_ValueString (etype_t type, prvm_eval_t *val)
                break;
        case ev_entity:
                n = val->edict;
-               if (n < 0 || n >= prog->limit_edicts)
+               if (n < 0 || n >= prog->max_edicts)
                        dpsnprintf (line, sizeof(line), "entity %i (invalid!)", n);
                else
                        dpsnprintf (line, sizeof(line), "entity %i", n);
@@ -659,7 +656,7 @@ void PRVM_ED_Print(prvm_edict_t *ed, const char *wildcard_fieldname)
                                // Didn't match; skip
                                continue;
 
-               v = (int *)((char *)ed->fields.vp + d->ofs*4);
+               v = (int *)(ed->fields.vp + d->ofs);
 
        // if the value is still all 0, skip the field
                type = d->type & ~DEF_SAVEGLOBAL;
@@ -737,7 +734,7 @@ void PRVM_ED_Write (qfile_t *f, prvm_edict_t *ed)
                if (name[strlen(name)-2] == '_')
                        continue;       // skip _x, _y, _z vars
 
-               v = (int *)((char *)ed->fields.vp + d->ofs*4);
+               v = (int *)(ed->fields.vp + d->ofs);
 
        // if the value is still all 0, skip the field
                type = d->type & ~DEF_SAVEGLOBAL;
@@ -991,9 +988,9 @@ qboolean PRVM_ED_ParseEpair(prvm_edict_t *ent, ddef_t *key, const char *s, qbool
        mfunction_t *func;
 
        if (ent)
-               val = (prvm_eval_t *)((int *)ent->fields.vp + key->ofs);
+               val = (prvm_eval_t *)(ent->fields.vp + key->ofs);
        else
-               val = (prvm_eval_t *)((int *)prog->globals.generic + key->ofs);
+               val = (prvm_eval_t *)(prog->globals.generic + key->ofs);
        switch (key->type & ~DEF_SAVEGLOBAL)
        {
        case ev_string:
@@ -1042,12 +1039,12 @@ qboolean PRVM_ED_ParseEpair(prvm_edict_t *ent, ddef_t *key, const char *s, qbool
                        s++;
                i = atoi(s);
                if (i >= prog->limit_edicts)
-                       Con_Printf("PRVM_ED_ParseEpair: ev_entity reference too large (edict %u >= MAX_EDICTS %u) on %s\n", (unsigned int)i, (unsigned int)MAX_EDICTS, PRVM_NAME);
+                       Con_Printf("PRVM_ED_ParseEpair: ev_entity reference too large (edict %u >= MAX_EDICTS %u) on %s\n", (unsigned int)i, prog->limit_edicts, PRVM_NAME);
                while (i >= prog->max_edicts)
                        PRVM_MEM_IncreaseEdicts();
                // if IncreaseEdicts was called the base pointer needs to be updated
                if (ent)
-                       val = (prvm_eval_t *)((int *)ent->fields.vp + key->ofs);
+                       val = (prvm_eval_t *)(ent->fields.vp + key->ofs);
                val->edict = PRVM_EDICT_TO_PROG(PRVM_EDICT_NUM((int)i));
                break;
 
@@ -1148,6 +1145,105 @@ void PRVM_GameCommand_Menu_f(void)
        PRVM_GameCommand("menu", "menu_cmd");
 }
 
+/*
+=============
+PRVM_ED_EdictGet_f
+
+Console command to load a field of a specified edict
+=============
+*/
+void PRVM_ED_EdictGet_f(void)
+{
+       prvm_edict_t *ed;
+       ddef_t *key;
+       const char *s;
+       prvm_eval_t *v;
+
+       if(Cmd_Argc() != 4 && Cmd_Argc() != 5)
+       {
+               Con_Print("prvm_edictget <program name> <edict number> <field> [<cvar>]\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));
+               goto fail;
+       }
+
+       v = (prvm_eval_t *)(ed->fields.vp + key->ofs);
+       s = PRVM_UglyValueString(key->type, v);
+       if(Cmd_Argc() == 5)
+       {
+               cvar_t *cvar = Cvar_FindVar(Cmd_Argv(4));
+               if (cvar && cvar->flags & CVAR_READONLY)
+               {
+                       Con_Printf("prvm_edictget: %s is read-only\n", cvar->name);
+                       goto fail;
+               }
+               Cvar_Get(Cmd_Argv(4), s, 0, NULL);
+       }
+       else
+               Con_Printf("%s\n", s);
+
+fail:
+       PRVM_End;
+}
+
+void PRVM_ED_GlobalGet_f(void)
+{
+       ddef_t *key;
+       const char *s;
+       prvm_eval_t *v;
+
+       if(Cmd_Argc() != 3 && Cmd_Argc() != 4)
+       {
+               Con_Print("prvm_globalget <program name> <global> [<cvar>]\n");
+               return;
+       }
+
+       PRVM_Begin;
+       if(!PRVM_SetProgFromString(Cmd_Argv(1)))
+       {
+               Con_Printf("Wrong program name %s !\n", Cmd_Argv(1));
+               return;
+       }
+
+       key = PRVM_ED_FindGlobal(Cmd_Argv(2));
+       if(!key)
+       {
+               Con_Printf( "No global '%s' in %s!\n", Cmd_Argv(2), Cmd_Argv(1) );
+               goto fail;
+       }
+
+       v = (prvm_eval_t *) &prog->globals.generic[key->ofs];
+       s = PRVM_UglyValueString(key->type, v);
+       if(Cmd_Argc() == 4)
+       {
+               cvar_t *cvar = Cvar_FindVar(Cmd_Argv(3));
+               if (cvar && cvar->flags & CVAR_READONLY)
+               {
+                       Con_Printf("prvm_globalget: %s is read-only\n", cvar->name);
+                       goto fail;
+               }
+               Cvar_Get(Cmd_Argv(3), s, 0, NULL);
+       }
+       else
+               Con_Printf("%s\n", s);
+
+fail:
+       PRVM_End;
+}
+
 /*
 =============
 PRVM_ED_EdictSet_f
@@ -1493,6 +1589,7 @@ void PRVM_FindOffsets(void)
        prog->fieldoffsets.glow_color                     = PRVM_ED_FindFieldOffset("glow_color");
        prog->fieldoffsets.glow_size                      = PRVM_ED_FindFieldOffset("glow_size");
        prog->fieldoffsets.glow_trail                     = PRVM_ED_FindFieldOffset("glow_trail");
+       prog->fieldoffsets.glowmod                        = PRVM_ED_FindFieldOffset("glowmod");
        prog->fieldoffsets.gravity                        = PRVM_ED_FindFieldOffset("gravity");
        prog->fieldoffsets.groundentity                   = PRVM_ED_FindFieldOffset("groundentity");
        prog->fieldoffsets.hull                           = PRVM_ED_FindFieldOffset("hull");
@@ -1522,6 +1619,7 @@ void PRVM_FindOffsets(void)
        prog->fieldoffsets.rendermode                     = PRVM_ED_FindFieldOffset("rendermode"); // HalfLife support
        prog->fieldoffsets.scale                          = PRVM_ED_FindFieldOffset("scale");
        prog->fieldoffsets.shadertime                     = PRVM_ED_FindFieldOffset("shadertime");
+       prog->fieldoffsets.skeletonindex                  = PRVM_ED_FindFieldOffset("skeletonindex");
        prog->fieldoffsets.style                          = PRVM_ED_FindFieldOffset("style");
        prog->fieldoffsets.tag_entity                     = PRVM_ED_FindFieldOffset("tag_entity");
        prog->fieldoffsets.tag_index                      = PRVM_ED_FindFieldOffset("tag_index");
@@ -1531,6 +1629,26 @@ void PRVM_FindOffsets(void)
        prog->fieldoffsets.yaw_speed                      = PRVM_ED_FindFieldOffset("yaw_speed");
        prog->fieldoffsets.bouncefactor                   = PRVM_ED_FindFieldOffset("bouncefactor");
        prog->fieldoffsets.bouncestop                     = PRVM_ED_FindFieldOffset("bouncestop");
+
+       prog->fieldoffsets.solid                          = PRVM_ED_FindFieldOffset("solid");
+       prog->fieldoffsets.movetype                       = PRVM_ED_FindFieldOffset("movetype");
+       prog->fieldoffsets.modelindex                     = PRVM_ED_FindFieldOffset("modelindex");
+       prog->fieldoffsets.mins                           = PRVM_ED_FindFieldOffset("mins");
+       prog->fieldoffsets.maxs                           = PRVM_ED_FindFieldOffset("maxs");
+       prog->fieldoffsets.mass                           = PRVM_ED_FindFieldOffset("mass");
+       prog->fieldoffsets.origin                         = PRVM_ED_FindFieldOffset("origin");
+       prog->fieldoffsets.velocity                       = PRVM_ED_FindFieldOffset("velocity");
+       //prog->fieldoffsets.axis_forward                   = PRVM_ED_FindFieldOffset("axis_forward");
+       //prog->fieldoffsets.axis_left                      = PRVM_ED_FindFieldOffset("axis_left");
+       //prog->fieldoffsets.axis_up                        = PRVM_ED_FindFieldOffset("axis_up");
+       //prog->fieldoffsets.spinvelocity                   = PRVM_ED_FindFieldOffset("spinvelocity");
+       prog->fieldoffsets.angles                         = PRVM_ED_FindFieldOffset("angles");
+       prog->fieldoffsets.avelocity                      = PRVM_ED_FindFieldOffset("avelocity");
+       prog->fieldoffsets.aiment                         = PRVM_ED_FindFieldOffset("aiment");
+       prog->fieldoffsets.enemy                          = PRVM_ED_FindFieldOffset("enemy");
+       prog->fieldoffsets.jointtype                      = PRVM_ED_FindFieldOffset("jointtype");
+       prog->fieldoffsets.movedir                        = PRVM_ED_FindFieldOffset("movedir");
+
        prog->funcoffsets.CSQC_ConsoleCommand             = PRVM_ED_FindFunctionOffset("CSQC_ConsoleCommand");
        prog->funcoffsets.CSQC_Ent_Remove                 = PRVM_ED_FindFunctionOffset("CSQC_Ent_Remove");
        prog->funcoffsets.CSQC_Ent_Spawn                  = PRVM_ED_FindFunctionOffset("CSQC_Ent_Spawn");
@@ -1571,6 +1689,7 @@ void PRVM_FindOffsets(void)
        prog->globaloffsets.gettaginfo_parent             = PRVM_ED_FindGlobalOffset("gettaginfo_parent");
        prog->globaloffsets.gettaginfo_right              = PRVM_ED_FindGlobalOffset("gettaginfo_right");
        prog->globaloffsets.gettaginfo_up                 = PRVM_ED_FindGlobalOffset("gettaginfo_up");
+       prog->globaloffsets.transparent_offset            = PRVM_ED_FindGlobalOffset("transparent_offset");
        prog->globaloffsets.intermission                  = PRVM_ED_FindGlobalOffset("intermission");
        prog->globaloffsets.require_spawnfunc_prefix      = PRVM_ED_FindGlobalOffset("require_spawnfunc_prefix");
        prog->globaloffsets.sb_showscores                 = PRVM_ED_FindGlobalOffset("sb_showscores");
@@ -1630,8 +1749,8 @@ PRVM_ResetProg
 ===============
 */
 
-void PRVM_LeakTest();
-void PRVM_ResetProg()
+void PRVM_LeakTest(void);
+void PRVM_ResetProg(void)
 {
        PRVM_LeakTest();
        PRVM_GCALL(reset_cmd)();
@@ -1749,8 +1868,6 @@ void PRVM_LoadProgs (const char * filename, int numrequiredfunc, char **required
 
        prog->statement_profile = (double *)Mem_Alloc(prog->progs_mempool, prog->progs->numstatements * sizeof(*prog->statement_profile));
 
-       // moved edict_size calculation down below field adding code
-
        //pr_global_struct = (globalvars_t *)((unsigned char *)progs + progs->ofs_globals);
        prog->globals.generic = (float *)((unsigned char *)prog->progs + prog->progs->ofs_globals);
 
@@ -1773,7 +1890,7 @@ void PRVM_LoadProgs (const char * filename, int numrequiredfunc, char **required
                prog->functions[i].numparms = LittleLong (dfunctions[i].numparms);
                prog->functions[i].locals = LittleLong (dfunctions[i].locals);
                memcpy(prog->functions[i].parm_size, dfunctions[i].parm_size, sizeof(dfunctions[i].parm_size));
-               if(prog->functions[i]->first_statement < 0 || prog->functions[i]->first_statement >= prog->progs->numstatements)
+               if(prog->functions[i].first_statement >= prog->progs->numstatements)
                        PRVM_ERROR("PRVM_LoadProgs: out of bounds function statement (function %d) in %s", i, PRVM_NAME);
                // TODO bounds check parm_start, s_name, s_file, numparms, locals, parm_size
        }
@@ -1810,6 +1927,7 @@ void PRVM_LoadProgs (const char * filename, int numrequiredfunc, char **required
                        prog->progs->entityfields++;
                prog->progs->numfielddefs++;
        }
+       prog->entityfields = prog->progs->entityfields;
 
        // check required functions
        for(i=0 ; i < numrequiredfunc ; i++)
@@ -1824,11 +1942,6 @@ void PRVM_LoadProgs (const char * filename, int numrequiredfunc, char **required
        for (i=0 ; i<prog->progs->numglobals ; i++)
                ((int *)prog->globals.generic)[i] = LittleLong (((int *)prog->globals.generic)[i]);
 
-       // moved edict_size calculation down here, below field adding code
-       // LordHavoc: this no longer includes the prvm_edict_t header
-       prog->edict_size = prog->progs->entityfields * 4;
-       prog->edictareasize = prog->edict_size * prog->limit_edicts;
-
        // LordHavoc: bounds check anything static
        for (i = 0,st = prog->statements;i < prog->progs->numstatements;i++,st++)
        {
@@ -2002,7 +2115,7 @@ void PRVM_Fields_f (void)
                        name = PRVM_GetString(d->s_name);
                        if (name[strlen(name)-2] == '_')
                                continue;       // skip _x, _y, _z vars
-                       v = (int *)((char *)ed->fields.vp + d->ofs*4);
+                       v = (int *)(ed->fields.vp + d->ofs);
                        // if the value is still all 0, skip the field
                        for (j = 0;j < prvm_type_size[d->type & ~DEF_SAVEGLOBAL];j++)
                        {
@@ -2189,12 +2302,15 @@ void PRVM_Init (void)
        Cmd_AddCommand ("prvm_edicts", PRVM_ED_PrintEdicts_f, "prints all data about all entities in the selected VM (server, client, menu)");
        Cmd_AddCommand ("prvm_edictcount", PRVM_ED_Count_f, "prints number of active entities in the selected VM (server, client, menu)");
        Cmd_AddCommand ("prvm_profile", PRVM_Profile_f, "prints execution statistics about the most used QuakeC functions in the selected VM (server, client, menu)");
+       Cmd_AddCommand ("prvm_childprofile", PRVM_ChildProfile_f, "prints execution statistics about the most used QuakeC functions in the selected VM (server, client, menu), sorted by time taken in function with child calls");
        Cmd_AddCommand ("prvm_callprofile", PRVM_CallProfile_f, "prints execution statistics about the most time consuming QuakeC calls from the engine in the selected VM (server, client, menu)");
        Cmd_AddCommand ("prvm_fields", PRVM_Fields_f, "prints usage statistics on properties (how many entities have non-zero values) in the selected VM (server, client, menu)");
        Cmd_AddCommand ("prvm_globals", PRVM_Globals_f, "prints all global variables in the selected VM (server, client, menu)");
        Cmd_AddCommand ("prvm_global", PRVM_Global_f, "prints value of a specified global variable in the selected VM (server, client, menu)");
        Cmd_AddCommand ("prvm_globalset", PRVM_GlobalSet_f, "sets value of a specified global variable in the selected VM (server, client, menu)");
        Cmd_AddCommand ("prvm_edictset", PRVM_ED_EdictSet_f, "changes value of a specified property of a specified entity in the selected VM (server, client, menu)");
+       Cmd_AddCommand ("prvm_edictget", PRVM_ED_EdictGet_f, "retrieves the value of a specified property of a specified entity in the selected VM (server, client menu) into a cvar or to the console");
+       Cmd_AddCommand ("prvm_globalget", PRVM_ED_GlobalGet_f, "retrieves the value of a specified global variable in the selected VM (server, client menu) into a cvar or to the console");
        Cmd_AddCommand ("prvm_printfunction", PRVM_PrintFunction_f, "prints a disassembly (QuakeC instructions) of the specified function in the selected VM (server, client, menu)");
        Cmd_AddCommand ("cl_cmd", PRVM_GameCommand_Client_f, "calls the client QC function GameCommand with the supplied string as argument");
        Cmd_AddCommand ("menu_cmd", PRVM_GameCommand_Menu_f, "calls the menu QC function GameCommand with the supplied string as argument");
@@ -2209,6 +2325,8 @@ void PRVM_Init (void)
        Cvar_RegisterVariable (&prvm_leaktest);
        Cvar_RegisterVariable (&prvm_leaktest_ignore_classnames);
        Cvar_RegisterVariable (&prvm_errordump);
+       Cvar_RegisterVariable (&prvm_reuseedicts_startuptime);
+       Cvar_RegisterVariable (&prvm_reuseedicts_neverinsameframe);
 
        // COMMANDLINEOPTION: PRVM: -norunaway disables the runaway loop check (it might be impossible to exit DarkPlaces if used!)
        prvm_runawaycheck = !COM_CheckParm("-norunaway");
@@ -2235,17 +2353,17 @@ void PRVM_InitProg(int prognr)
        prog->starttime = Sys_DoubleTime();
 
        prog->error_cmd = Host_Error;
-       prog->leaktest_active = prvm_leaktest.integer;
+       prog->leaktest_active = prvm_leaktest.integer != 0;
 }
 
-int PRVM_GetProgNr()
+int PRVM_GetProgNr(void)
 {
        return prog - prog_list;
 }
 
 void *_PRVM_Alloc(size_t buffersize, const char *filename, int fileline)
 {
-       return _Mem_Alloc(prog->progs_mempool, buffersize, filename, fileline);
+       return _Mem_Alloc(prog->progs_mempool, NULL, buffersize, 16, filename, fileline);
 }
 
 void _PRVM_Free(void *buffer, const char *filename, int fileline)
@@ -2268,48 +2386,6 @@ unsigned int PRVM_EDICT_NUM_ERROR(unsigned int n, char *filename, int fileline)
        return 0;
 }
 
-/*
-int NUM_FOR_EDICT_ERROR(prvm_edict_t *e)
-{
-       PRVM_ERROR ("PRVM_NUM_FOR_EDICT: bad pointer %p (world is %p, entity number would be %i)", e, prog->edicts, e - prog->edicts);
-       return 0;
-}
-
-int PRVM_NUM_FOR_EDICT(prvm_edict_t *e)
-{
-       int n;
-       n = e - prog->edicts;
-       if ((unsigned int)n >= prog->limit_edicts)
-               Host_Error ("PRVM_NUM_FOR_EDICT: bad pointer");
-       return n;
-}
-
-//int NoCrash_NUM_FOR_EDICT(prvm_edict_t *e)
-//{
-//     return e - prog->edicts;
-//}
-
-//#define      PRVM_EDICT_TO_PROG(e) ((unsigned char *)(((prvm_edict_t *)e)->v) - (unsigned char *)(prog->edictsfields))
-//#define PRVM_PROG_TO_EDICT(e) (prog->edicts + ((e) / (progs->entityfields * 4)))
-int PRVM_EDICT_TO_PROG(prvm_edict_t *e)
-{
-       int n;
-       n = e - prog->edicts;
-       if ((unsigned int)n >= (unsigned int)prog->max_edicts)
-               Host_Error("PRVM_EDICT_TO_PROG: invalid edict %8p (number %i compared to world at %8p)", e, n, prog->edicts);
-       return n;// EXPERIMENTAL
-       //return (unsigned char *)e->v - (unsigned char *)prog->edictsfields;
-}
-prvm_edict_t *PRVM_PROG_TO_EDICT(int n)
-{
-       if ((unsigned int)n >= (unsigned int)prog->max_edicts)
-               Host_Error("PRVM_PROG_TO_EDICT: invalid edict number %i", n);
-       return prog->edicts + n; // EXPERIMENTAL
-       //return prog->edicts + ((n) / (progs->entityfields * 4));
-}
-*/
-
-
 sizebuf_t vm_tempstringsbuf;
 
 const char *PRVM_GetString(int num)
@@ -2560,7 +2636,7 @@ static qboolean PRVM_IsStringReferenced(string_t string)
                        ddef_t *d = &prog->fielddefs[i];
                        if((etype_t)((int) d->type & ~DEF_SAVEGLOBAL) != ev_string)
                                continue;
-                       if(string == ((prvm_eval_t *) &((float*)ed->fields.vp)[d->ofs])->string)
+                       if(string == ((prvm_eval_t *) &ed->fields.vp[d->ofs])->string)
                                return true;
                }
        }
@@ -2667,7 +2743,7 @@ static qboolean PRVM_IsEdictReferenced(prvm_edict_t *edict, int mark)
                        ddef_t *d = &prog->fielddefs[i];
                        if((etype_t)((int) d->type & ~DEF_SAVEGLOBAL) != ev_entity)
                                continue;
-                       if(edictnum == ((prvm_eval_t *) &((float*)ed->fields.vp)[d->ofs])->edict)
+                       if(edictnum == ((prvm_eval_t *) &ed->fields.vp[d->ofs])->edict)
                                return true;
                }
        }
@@ -2675,7 +2751,7 @@ static qboolean PRVM_IsEdictReferenced(prvm_edict_t *edict, int mark)
        return false;
 }
 
-static void PRVM_MarkReferencedEdicts()
+static void PRVM_MarkReferencedEdicts(void)
 {
        int j;
        qboolean found_new;
@@ -2712,7 +2788,7 @@ static void PRVM_MarkReferencedEdicts()
        Con_DPrintf("leak check used %d stages to find all references\n", stage);
 }
 
-void PRVM_LeakTest()
+void PRVM_LeakTest(void)
 {
        int i, j;
        qboolean leaked = false;