From: Cloudwalk <cloudwalk009@gmail.com>
Date: Wed, 21 Jul 2021 19:57:40 +0000 (-0400)
Subject: edict: Move free and freetime into prvm_edict_t itself
X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=66ec69f1c020739371ac074baa7bb652834ecece;p=xonotic%2Fdarkplaces.git

edict: Move free and freetime into prvm_edict_t itself
---

diff --git a/cl_collision.c b/cl_collision.c
index 2cd3a619..97303e7a 100644
--- a/cl_collision.c
+++ b/cl_collision.c
@@ -104,7 +104,7 @@ model_t *CL_GetModelByIndex(int modelindex)
 model_t *CL_GetModelFromEdict(prvm_edict_t *ed)
 {
 	prvm_prog_t *prog = CLVM_prog;
-	if (!ed || ed->priv.server->free)
+	if (!ed || ed->free)
 		return NULL;
 	return CL_GetModelByIndex((int)PRVM_clientedictfloat(ed, modelindex));
 }
@@ -117,7 +117,7 @@ void CL_LinkEdict(prvm_edict_t *ent)
 	if (ent == prog->edicts)
 		return;		// don't add the world
 
-	if (ent->priv.server->free)
+	if (ent->free)
 		return;
 
 	// set the abs box
diff --git a/clvm_cmds.c b/clvm_cmds.c
index 23c438f6..cbb31b42 100644
--- a/clvm_cmds.c
+++ b/clvm_cmds.c
@@ -50,7 +50,7 @@ static void VM_CL_setorigin (prvm_prog_t *prog)
 		VM_Warning(prog, "setorigin: can not modify world entity\n");
 		return;
 	}
-	if (e->priv.required->free)
+	if (e->free)
 	{
 		VM_Warning(prog, "setorigin: can not modify free entity\n");
 		return;
@@ -151,7 +151,7 @@ static void VM_CL_setsize (prvm_prog_t *prog)
 		VM_Warning(prog, "setsize: can not modify world entity\n");
 		return;
 	}
-	if (e->priv.server->free)
+	if (e->free)
 	{
 		VM_Warning(prog, "setsize: can not modify free entity\n");
 		return;
@@ -537,7 +537,7 @@ static void VM_CL_droptofloor (prvm_prog_t *prog)
 		VM_Warning(prog, "droptofloor: can not modify world entity\n");
 		return;
 	}
-	if (ent->priv.server->free)
+	if (ent->free)
 	{
 		VM_Warning(prog, "droptofloor: can not modify free entity\n");
 		return;
@@ -761,14 +761,14 @@ static void VM_CL_R_AddEntities (prvm_prog_t *prog)
 		// so we can easily check if CSQC entity #edictnum is currently drawn
 		cl.csqcrenderentities[i].entitynumber = 0;
 		ed = &prog->edicts[i];
-		if(ed->priv.required->free)
+		if(ed->free)
 			continue;
 		CSQC_Think(ed);
-		if(ed->priv.required->free)
+		if(ed->free)
 			continue;
 		// note that for RF_USEAXIS entities, Predraw sets v_forward/v_right/v_up globals that are read by CSQC_AddRenderEdict
 		CSQC_Predraw(ed);
-		if(ed->priv.required->free)
+		if(ed->free)
 			continue;
 		if(!((int)PRVM_clientedictfloat(ed, drawmask) & drawmask))
 			continue;
@@ -2523,7 +2523,7 @@ static void VM_CL_makestatic (prvm_prog_t *prog)
 		VM_Warning(prog, "makestatic: can not modify world entity\n");
 		return;
 	}
-	if (ent->priv.server->free)
+	if (ent->free)
 	{
 		VM_Warning(prog, "makestatic: can not modify free entity\n");
 		return;
@@ -2619,7 +2619,7 @@ static void VM_CL_copyentity (prvm_prog_t *prog)
 		VM_Warning(prog, "copyentity: can not read world entity\n");
 		return;
 	}
-	if (in->priv.server->free)
+	if (in->free)
 	{
 		VM_Warning(prog, "copyentity: can not read free entity\n");
 		return;
@@ -2630,7 +2630,7 @@ static void VM_CL_copyentity (prvm_prog_t *prog)
 		VM_Warning(prog, "copyentity: can not modify world entity\n");
 		return;
 	}
-	if (out->priv.server->free)
+	if (out->free)
 	{
 		VM_Warning(prog, "copyentity: can not modify free entity\n");
 		return;
@@ -3089,7 +3089,7 @@ static void VM_CL_setattachment (prvm_prog_t *prog)
 		VM_Warning(prog, "setattachment: can not modify world entity\n");
 		return;
 	}
-	if (e->priv.server->free)
+	if (e->free)
 	{
 		VM_Warning(prog, "setattachment: can not modify free entity\n");
 		return;
@@ -3229,7 +3229,7 @@ int CL_GetTagMatrix (prvm_prog_t *prog, matrix4x4_t *out, prvm_edict_t *ent, int
 
 	if (ent == prog->edicts)
 		return 1;
-	if (ent->priv.server->free)
+	if (ent->free)
 		return 2;
 
 	model = CL_GetModelFromEdict(ent);
@@ -3321,7 +3321,7 @@ static void VM_CL_gettagindex (prvm_prog_t *prog)
 		VM_Warning(prog, "VM_CL_gettagindex(entity #%i): can't affect world entity\n", PRVM_NUM_FOR_EDICT(ent));
 		return;
 	}
-	if (ent->priv.server->free)
+	if (ent->free)
 	{
 		VM_Warning(prog, "VM_CL_gettagindex(entity #%i): can't affect free entity\n", PRVM_NUM_FOR_EDICT(ent));
 		return;
@@ -4416,7 +4416,7 @@ static void VM_CL_walkmove (prvm_prog_t *prog)
 		VM_Warning(prog, "walkmove: can not modify world entity\n");
 		return;
 	}
-	if (ent->priv.server->free)
+	if (ent->free)
 	{
 		VM_Warning(prog, "walkmove: can not modify free entity\n");
 		return;
@@ -4487,7 +4487,7 @@ static void VM_CL_checkpvs (prvm_prog_t *prog)
 	VectorCopy(PRVM_G_VECTOR(OFS_PARM0), viewpos);
 	viewee = PRVM_G_EDICT(OFS_PARM1);
 
-	if(viewee->priv.required->free)
+	if(viewee->free)
 	{
 		VM_Warning(prog, "checkpvs: can not check free entity\n");
 		PRVM_G_FLOAT(OFS_RETURN) = 4;
diff --git a/csprogs.c b/csprogs.c
index bd30f466..f74a206b 100644
--- a/csprogs.c
+++ b/csprogs.c
@@ -883,7 +883,7 @@ static void CLVM_end_increase_edicts(prvm_prog_t *prog)
 
 	// link every entity except world
 	for (i = 1, ent = prog->edicts;i < prog->num_edicts;i++, ent++)
-		if (!ent->priv.server->free && !VectorCompare(PRVM_clientedictvector(ent, absmin), PRVM_clientedictvector(ent, absmax)))
+		if (!ent->free && !VectorCompare(PRVM_clientedictvector(ent, absmin), PRVM_clientedictvector(ent, absmax)))
 			CL_LinkEdict(ent);
 }
 
@@ -919,7 +919,7 @@ static void CLVM_count_edicts(prvm_prog_t *prog)
 	for (i=0 ; i<prog->num_edicts ; i++)
 	{
 		ent = PRVM_EDICT_NUM(i);
-		if (ent->priv.server->free)
+		if (ent->free)
 			continue;
 		active++;
 		if (PRVM_clientedictfloat(ent, solid))
@@ -1191,7 +1191,7 @@ qbool CL_VM_GetEntitySoundOrigin(int entnum, vec3_t out)
 
 	ed = PRVM_EDICT_NUM(entnum - MAX_EDICTS);
 
-	if(!ed->priv.required->free)
+	if(!ed->free)
 	{
 		mod = CL_GetModelFromEdict(ed);
 		VectorCopy(PRVM_clientedictvector(ed, origin), out);
diff --git a/gl_rmain.c b/gl_rmain.c
index 3efa46d2..e5516ded 100644
--- a/gl_rmain.c
+++ b/gl_rmain.c
@@ -6123,7 +6123,7 @@ static void R_DrawEntityBBoxes(prvm_prog_t *prog)
 	for (i = 0; i < prog->num_edicts; i++)
 	{
 		edict = PRVM_EDICT_NUM(i);
-		if (edict->priv.server->free)
+		if (edict->free)
 			continue;
 		// exclude the following for now, as they don't live in world coordinate space and can't be solid:
 		if (PRVM_gameedictedict(edict, tag_entity) != 0)
diff --git a/menu.c b/menu.c
index 2dc43ec9..ce154097 100644
--- a/menu.c
+++ b/menu.c
@@ -5269,7 +5269,7 @@ static void MVM_count_edicts(prvm_prog_t *prog)
 	for (i=0 ; i<prog->num_edicts ; i++)
 	{
 		ent = PRVM_EDICT_NUM(i);
-		if (ent->priv.required->free)
+		if (ent->free)
 			continue;
 		active++;
 	}
diff --git a/progs.h b/progs.h
index fd8d109c..0756c35b 100644
--- a/progs.h
+++ b/progs.h
@@ -67,15 +67,11 @@ typedef struct edict_odefunc_s
 
 typedef struct edict_engineprivate_s
 {
-	// true if this edict is unused
-	qbool free;
-	// sv.time when the object was freed (to prevent early reuse which could
-	// mess up client interpolation or obscure severe QuakeC bugs)
-	double freetime;
 	// mark for the leak detector
 	int mark;
 	// place in the code where it was allocated (for the leak detector)
 	const char *allocation_origin;
+
 	// initially false to prevent projectiles from moving on their first frame
 	// (even if they were spawned by an synchronous client think)
 	qbool move;
diff --git a/progsvm.h b/progsvm.h
index ea08900d..92ead5dc 100644
--- a/progsvm.h
+++ b/progsvm.h
@@ -74,23 +74,27 @@ typedef struct prvm_required_field_s
 	const char *name;
 } prvm_required_field_t;
 
-
+#define PRVM_EDICT_MARK_WAIT_FOR_SETORIGIN -1
+#define PRVM_EDICT_MARK_SETORIGIN_CAUGHT -2
 // AK: I dont call it engine private cause it doesnt really belongs to the engine
 //     it belongs to prvm.
 typedef struct prvm_edict_private_s
 {
-	qbool free;
-	double freetime; // realtime of last change to "free" (i.e. also set on allocation)
-	int mark; // used during leaktest (0 = unref, >0 = referenced); special values during server physics:
-#define PRVM_EDICT_MARK_WAIT_FOR_SETORIGIN -1
-#define PRVM_EDICT_MARK_SETORIGIN_CAUGHT -2
+	// mark for the leak detector
+	int mark;
+	// place in the code where it was allocated (for the leak detector)
 	const char *allocation_origin;
 } prvm_edict_private_t;
 
 typedef struct prvm_edict_s
 {
+	// true if this edict is unused
+	qbool free;
+	// sv.time when the object was freed (to prevent early reuse which could
+	// mess up client interpolation or obscure severe QuakeC bugs)
+	double freetime;
+
 	// engine-private fields (stored in dynamically resized array)
-	//edict_engineprivate_t *e;
 	union
 	{
 		prvm_edict_private_t *required;
diff --git a/prvm_cmds.c b/prvm_cmds.c
index 07adabf3..269aac00 100644
--- a/prvm_cmds.c
+++ b/prvm_cmds.c
@@ -930,7 +930,7 @@ void VM_ftoe(prvm_prog_t *prog)
 	VM_SAFEPARMCOUNT(1, VM_ftoe);
 
 	ent = (prvm_int_t)PRVM_G_FLOAT(OFS_PARM0);
-	if (ent < 0 || ent >= prog->max_edicts || PRVM_PROG_TO_EDICT(ent)->priv.required->free)
+	if (ent < 0 || ent >= prog->max_edicts || PRVM_PROG_TO_EDICT(ent)->free)
 		ent = 0; // return world instead of a free or invalid entity
 
 	PRVM_G_INT(OFS_RETURN) = ent;
@@ -1033,7 +1033,7 @@ void VM_remove(prvm_prog_t *prog)
 		if (developer.integer > 0)
 			VM_Warning(prog, "VM_remove: tried to remove the null entity or a reserved entity!\n" );
 	}
-	else if( ed->priv.required->free )
+	else if( ed->free )
 	{
 		if (developer.integer > 0)
 			VM_Warning(prog, "VM_remove: tried to remove an already freed entity!\n" );
@@ -1071,7 +1071,7 @@ void VM_find(prvm_prog_t *prog)
 	{
 		prog->xfunction->builtinsprofile++;
 		ed = PRVM_EDICT_NUM(e);
-		if (ed->priv.required->free)
+		if (ed->free)
 			continue;
 		t = PRVM_E_STRING(ed,f);
 		if (!t)
@@ -1112,7 +1112,7 @@ void VM_findfloat(prvm_prog_t *prog)
 	{
 		prog->xfunction->builtinsprofile++;
 		ed = PRVM_EDICT_NUM(e);
-		if (ed->priv.required->free)
+		if (ed->free)
 			continue;
 		if (PRVM_E_FLOAT(ed,f) == s)
 		{
@@ -1163,7 +1163,7 @@ void VM_findchain(prvm_prog_t *prog)
 	for (i = 1;i < prog->num_edicts;i++, ent = PRVM_NEXT_EDICT(ent))
 	{
 		prog->xfunction->builtinsprofile++;
-		if (ent->priv.required->free)
+		if (ent->free)
 			continue;
 		t = PRVM_E_STRING(ent,f);
 		if (!t)
@@ -1214,7 +1214,7 @@ void VM_findchainfloat(prvm_prog_t *prog)
 	for (i = 1;i < prog->num_edicts;i++, ent = PRVM_NEXT_EDICT(ent))
 	{
 		prog->xfunction->builtinsprofile++;
-		if (ent->priv.required->free)
+		if (ent->free)
 			continue;
 		if (PRVM_E_FLOAT(ent,f) != s)
 			continue;
@@ -1252,7 +1252,7 @@ void VM_findflags(prvm_prog_t *prog)
 	{
 		prog->xfunction->builtinsprofile++;
 		ed = PRVM_EDICT_NUM(e);
-		if (ed->priv.required->free)
+		if (ed->free)
 			continue;
 		if (!PRVM_E_FLOAT(ed,f))
 			continue;
@@ -1300,7 +1300,7 @@ void VM_findchainflags(prvm_prog_t *prog)
 	for (i = 1;i < prog->num_edicts;i++, ent = PRVM_NEXT_EDICT(ent))
 	{
 		prog->xfunction->builtinsprofile++;
-		if (ent->priv.required->free)
+		if (ent->free)
 			continue;
 		if (!PRVM_E_FLOAT(ent,f))
 			continue;
@@ -1514,7 +1514,7 @@ void VM_nextent(prvm_prog_t *prog)
 			return;
 		}
 		ent = PRVM_EDICT_NUM(i);
-		if (!ent->priv.required->free)
+		if (!ent->free)
 		{
 			VM_RETURN_EDICT(ent);
 			return;
@@ -2037,7 +2037,7 @@ void VM_writetofile(prvm_prog_t *prog)
 	}
 
 	ent = PRVM_G_EDICT(OFS_PARM1);
-	if(ent->priv.required->free)
+	if(ent->free)
 	{
 		VM_Warning(prog, "VM_writetofile: %s: entity %i is free !\n", prog->name, PRVM_NUM_FOR_EDICT(ent));
 		return;
@@ -2138,7 +2138,7 @@ void VM_getentityfieldstring(prvm_prog_t *prog)
 	
 	// get the entity
 	ent = PRVM_G_EDICT(OFS_PARM1);
-	if(ent->priv.required->free)
+	if(ent->free)
 	{
 		PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(prog, "");
 		VM_Warning(prog, "VM_entityfielddata: %s: entity %i is free !\n", prog->name, PRVM_NUM_FOR_EDICT(ent));
@@ -2185,7 +2185,7 @@ void VM_putentityfieldstring(prvm_prog_t *prog)
 
 	// get the entity
 	ent = PRVM_G_EDICT(OFS_PARM1);
-	if(ent->priv.required->free)
+	if(ent->free)
 	{
 		VM_Warning(prog, "VM_entityfielddata: %s: entity %i is free !\n", prog->name, PRVM_NUM_FOR_EDICT(ent));
 		PRVM_G_FLOAT(OFS_RETURN) = 0.0f;
@@ -2998,7 +2998,7 @@ void VM_parseentitydata(prvm_prog_t *prog)
 
 	// get edict and test it
 	ent = PRVM_G_EDICT(OFS_PARM0);
-	if (ent->priv.required->free)
+	if (ent->free)
 		prog->error_cmd("VM_parseentitydata: %s: Can only set already spawned entities (entity %i is free)!", prog->name, PRVM_NUM_FOR_EDICT(ent));
 
 	data = PRVM_G_STRING(OFS_PARM1);
@@ -4678,7 +4678,7 @@ void VM_changeyaw (prvm_prog_t *prog)
 		VM_Warning(prog, "changeyaw: can not modify world entity\n");
 		return;
 	}
-	if (ent->priv.server->free)
+	if (ent->free)
 	{
 		VM_Warning(prog, "changeyaw: can not modify free entity\n");
 		return;
@@ -4734,7 +4734,7 @@ void VM_changepitch (prvm_prog_t *prog)
 		VM_Warning(prog, "changepitch: can not modify world entity\n");
 		return;
 	}
-	if (ent->priv.server->free)
+	if (ent->free)
 	{
 		VM_Warning(prog, "changepitch: can not modify free entity\n");
 		return;
@@ -5136,7 +5136,7 @@ void VM_digest_hex(prvm_prog_t *prog)
 void VM_wasfreed (prvm_prog_t *prog)
 {
 	VM_SAFEPARMCOUNT(1, VM_wasfreed);
-	PRVM_G_FLOAT(OFS_RETURN) = PRVM_G_EDICT(OFS_PARM0)->priv.required->free;
+	PRVM_G_FLOAT(OFS_RETURN) = PRVM_G_EDICT(OFS_PARM0)->free;
 }
 
 void VM_SetTraceGlobals(prvm_prog_t *prog, const trace_t *trace)
@@ -6315,7 +6315,7 @@ void VM_getsurfacenearpoint(prvm_prog_t *prog)
 	ed = PRVM_G_EDICT(OFS_PARM0);
 	VectorCopy(PRVM_G_VECTOR(OFS_PARM1), point);
 
-	if (!ed || ed->priv.server->free)
+	if (!ed || ed->free)
 		return;
 	model = getmodel(prog, ed);
 	if (!model || !model->num_surfaces)
diff --git a/prvm_edict.c b/prvm_edict.c
index 3c50397e..78bcdabc 100644
--- a/prvm_edict.c
+++ b/prvm_edict.c
@@ -204,8 +204,8 @@ freed and sets the allocation origin.
 void PRVM_ED_ClearEdict(prvm_prog_t *prog, prvm_edict_t *e)
 {
 	memset(e->fields.fp, 0, prog->entityfields * sizeof(prvm_vec_t));
-	e->priv.required->free = false;
-	e->priv.required->freetime = host.realtime;
+	e->free = false;
+	e->freetime = host.realtime;
 	if(e->priv.required->allocation_origin)
 		Mem_Free((char *)e->priv.required->allocation_origin);
 	e->priv.required->allocation_origin = PRVM_AllocationOrigin(prog);
@@ -235,15 +235,15 @@ Returns if this particular edict could get allocated by PRVM_ED_Alloc
 */
 qbool PRVM_ED_CanAlloc(prvm_prog_t *prog, prvm_edict_t *e)
 {
-	if(!e->priv.required->free)
+	if(!e->free)
 		return false;
 	if(prvm_reuseedicts_always_allow == host.realtime)
 		return true;
-	if(host.realtime <= e->priv.required->freetime + 0.1 && prvm_reuseedicts_neverinsameframe.integer)
+	if(host.realtime <= e->freetime + 0.1 && 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)
+	if(e->freetime < prog->starttime + prvm_reuseedicts_startuptime.value)
 		return true;
-	if(host.realtime > e->priv.required->freetime + 1)
+	if(host.realtime > e->freetime + 1)
 		return true;
 	return false; // entity slot still blocked because the entity was freed less than one second ago
 }
@@ -308,8 +308,8 @@ void PRVM_ED_Free(prvm_prog_t *prog, prvm_edict_t *ed)
 
 	prog->free_edict(prog, ed);
 
-	ed->priv.required->free = true;
-	ed->priv.required->freetime = host.realtime;
+	ed->free = true;
+	ed->freetime = host.realtime;
 	if(ed->priv.required->allocation_origin)
 	{
 		Mem_Free((char *)ed->priv.required->allocation_origin);
@@ -654,7 +654,7 @@ void PRVM_ED_Print(prvm_prog_t *prog, prvm_edict_t *ed, const char *wildcard_fie
 	char	tempstring[MAX_INPUTLINE], tempstring2[260]; // temporary string buffers
 	char	valuebuf[MAX_INPUTLINE];
 
-	if (ed->priv.required->free)
+	if (ed->free)
 	{
 		Con_Printf("%s: FREE\n",prog->name);
 		return;
@@ -737,7 +737,7 @@ void PRVM_ED_Write (prvm_prog_t *prog, qfile_t *f, prvm_edict_t *ed)
 
 	FS_Print(f, "{\n");
 
-	if (ed->priv.required->free)
+	if (ed->free)
 	{
 		FS_Print(f, "}\n");
 		return;
@@ -1351,8 +1351,8 @@ const char *PRVM_ED_ParseEdict (prvm_prog_t *prog, const char *data, prvm_edict_
 	}
 
 	if (!init) {
-		ent->priv.required->free = true;
-		ent->priv.required->freetime = host.realtime;
+		ent->free = true;
+		ent->freetime = host.realtime;
 	}
 
 	return data;
@@ -1379,7 +1379,7 @@ qbool PRVM_ED_CallSpawnFunction(prvm_prog_t *prog, prvm_edict_t *ent, const char
 //
 // immediately call spawn function, but only if there is a self global and a classname
 //
-	if (!ent->priv.required->free)
+	if (!ent->free)
 	{
 		if (!PRVM_alledictstring(ent, classname))
 		{
@@ -1455,7 +1455,7 @@ qbool PRVM_ED_CallSpawnFunction(prvm_prog_t *prog, prvm_edict_t *ent, const char
 
 void PRVM_ED_CallPostspawnFunction (prvm_prog_t *prog, prvm_edict_t *ent)
 {
-	if(!ent->priv.required->free)
+	if(!ent->free)
 	if (PRVM_serverfunction(SV_OnEntityPostSpawnFunction))
 	{
 		// self = ent
@@ -1530,7 +1530,7 @@ void PRVM_ED_LoadFromFile (prvm_prog_t *prog, const char *data)
 
 		PRVM_ED_CallPrespawnFunction(prog, ent);
 
-		if(ent->priv.required->free)
+		if(ent->free)
 		{
 			inhibited++;
 			continue;
@@ -1544,7 +1544,7 @@ void PRVM_ED_LoadFromFile (prvm_prog_t *prog, const char *data)
 		PRVM_ED_CallPostspawnFunction(prog, ent);
 
 		spawned++;
-		if (ent->priv.required->free)
+		if (ent->free)
 			died++;
 	}
 
@@ -2746,7 +2746,7 @@ static void PRVM_Fields_f(cmd_state_t *cmd)
 	for (ednum = 0;ednum < prog->max_edicts;ednum++)
 	{
 		ed = PRVM_EDICT_NUM(ednum);
-		if (ed->priv.required->free)
+		if (ed->free)
 			continue;
 		for (i = 1;i < prog->numfielddefs;i++)
 		{
@@ -3446,7 +3446,7 @@ static qbool PRVM_IsStringReferenced(prvm_prog_t *prog, string_t string)
 	for(j = 0; j < prog->num_edicts; ++j)
 	{
 		prvm_edict_t *ed = PRVM_EDICT_NUM(j);
-		if (ed->priv.required->free)
+		if (ed->free)
 			continue;
 		for (i=0; i<prog->numfielddefs; ++i)
 		{
@@ -3467,7 +3467,7 @@ static qbool PRVM_IsEdictRelevant(prvm_prog_t *prog, prvm_edict_t *edict)
 	char vabuf2[1024];
 	if(PRVM_NUM_FOR_EDICT(edict) <= prog->reserved_edicts)
 		return true; // world or clients
-	if (edict->priv.required->freetime <= prog->inittime)
+	if (edict->freetime <= prog->inittime)
 		return true; // created during startup
 	if (prog == SVVM_prog)
 	{
@@ -3564,7 +3564,7 @@ static void PRVM_MarkReferencedEdicts(prvm_prog_t *prog)
 	for(j = 0; j < prog->num_edicts; ++j)
 	{
 		prvm_edict_t *ed = PRVM_EDICT_NUM(j);
-		if(ed->priv.required->free)
+		if(ed->free)
 			continue;
 		ed->priv.required->mark = PRVM_IsEdictRelevant(prog, ed) ? stage : 0;
 	}
@@ -3590,7 +3590,7 @@ static void PRVM_MarkReferencedEdicts(prvm_prog_t *prog)
 		for(j = 0; j < prog->num_edicts; ++j)
 		{
 			prvm_edict_t *ed = PRVM_EDICT_NUM(j);
-			if(ed->priv.required->free)
+			if(ed->free)
 				continue;
 			if(ed->priv.required->mark)
 				continue;
@@ -3632,7 +3632,7 @@ void PRVM_LeakTest(prvm_prog_t *prog)
 	for(j = 0; j < prog->num_edicts; ++j)
 	{
 		prvm_edict_t *ed = PRVM_EDICT_NUM(j);
-		if(ed->priv.required->free)
+		if(ed->free)
 			continue;
 		if(!ed->priv.required->mark)
 		if(ed->priv.required->allocation_origin)
diff --git a/sv_ccmds.c b/sv_ccmds.c
index 659a2815..639a3253 100644
--- a/sv_ccmds.c
+++ b/sv_ccmds.c
@@ -1556,7 +1556,7 @@ static void SV_Ent_Remove_f(cmd_state_t *cmd)
 				return;
 		}
 
-		if(!ed->priv.required->free)
+		if(!ed->free)
 		{
 			print("Removed a \"%s\"\n", PRVM_GetString(prog, PRVM_serveredictstring(ed, classname)));
 			PRVM_ED_ClearEdict(prog, ed);
@@ -1580,7 +1580,7 @@ static void SV_Ent_Remove_All_f(cmd_state_t *cmd)
 
 	for (i = 0, rmcount = 0, ed = PRVM_EDICT_NUM(i); i < prog->num_edicts; i++, ed = PRVM_NEXT_EDICT(ed))
 	{
-		if(!ed->priv.required->free && !strcmp(PRVM_GetString(prog, PRVM_serveredictstring(ed, classname)), Cmd_Argv(cmd, 1)))
+		if(!ed->free && !strcmp(PRVM_GetString(prog, PRVM_serveredictstring(ed, classname)), Cmd_Argv(cmd, 1)))
 		{
 			if(!i)
 			{
diff --git a/sv_main.c b/sv_main.c
index d1c9e71c..d103ffe6 100644
--- a/sv_main.c
+++ b/sv_main.c
@@ -1556,7 +1556,7 @@ model_t *SV_GetModelFromEdict(prvm_edict_t *ed)
 {
 	prvm_prog_t *prog = SVVM_prog;
 	int modelindex;
-	if (!ed || ed->priv.server->free)
+	if (!ed || ed->free)
 		return NULL;
 	modelindex = (int)PRVM_serveredictfloat(ed, modelindex);
 	return (modelindex > 0 && modelindex < MAX_MODELS) ? sv.models[modelindex] : NULL;
@@ -1583,7 +1583,7 @@ static void SV_CreateBaseline (void)
 		// LadyHavoc: always clear state values, whether the entity is in use or not
 		svent->priv.server->baseline = defaultstate;
 
-		if (svent->priv.server->free)
+		if (svent->free)
 			continue;
 		if (entnum > svs.maxclients && !PRVM_serveredictfloat(svent, modelindex))
 			continue;
@@ -1937,7 +1937,7 @@ void SV_SpawnServer (const char *map)
 	// AK possible hack since num_edicts is still 0
 	ent = PRVM_EDICT_NUM(0);
 	memset (ent->fields.fp, 0, prog->entityfields * sizeof(prvm_vec_t));
-	ent->priv.server->free = false;
+	ent->free = false;
 	PRVM_serveredictstring(ent, model) = PRVM_SetEngineString(prog, sv.worldname);
 	PRVM_serveredictfloat(ent, modelindex) = 1;		// world model
 	PRVM_serveredictfloat(ent, solid) = SOLID_BSP;
@@ -2113,7 +2113,7 @@ static void SVVM_end_increase_edicts(prvm_prog_t *prog)
 
 	// link every entity except world
 	for (i = 1, ent = prog->edicts;i < prog->num_edicts;i++, ent++)
-		if (!ent->priv.server->free && !VectorCompare(PRVM_serveredictvector(ent, absmin), PRVM_serveredictvector(ent, absmax)))
+		if (!ent->free && !VectorCompare(PRVM_serveredictvector(ent, absmin), PRVM_serveredictvector(ent, absmax)))
 			SV_LinkEdict(ent);
 }
 
@@ -2209,7 +2209,7 @@ static void SVVM_count_edicts(prvm_prog_t *prog)
 	for (i=0 ; i<prog->num_edicts ; i++)
 	{
 		ent = PRVM_EDICT_NUM(i);
-		if (ent->priv.server->free)
+		if (ent->free)
 			continue;
 		active++;
 		if (PRVM_serveredictfloat(ent, solid))
diff --git a/sv_phys.c b/sv_phys.c
index a72a7ca6..5633a1d3 100644
--- a/sv_phys.c
+++ b/sv_phys.c
@@ -689,7 +689,7 @@ int SV_EntitiesInBox(const vec3_t mins, const vec3_t maxs, int maxedicts, prvm_e
 		for (edictindex = 1;edictindex < prog->num_edicts;edictindex++)
 		{
 			ed = PRVM_EDICT_NUM(edictindex);
-			if (!ed->priv.required->free && BoxesOverlap(PRVM_serveredictvector(ed, absmin), PRVM_serveredictvector(ed, absmax), paddedmins, paddedmaxs))
+			if (!ed->free && BoxesOverlap(PRVM_serveredictvector(ed, absmin), PRVM_serveredictvector(ed, absmax), paddedmins, paddedmaxs))
 			{
 				resultedicts[numresultedicts++] = ed;
 				if (numresultedicts == maxedicts)
@@ -734,7 +734,7 @@ void SV_LinkEdict_TouchAreaGrid(prvm_edict_t *ent)
 	if (ent == prog->edicts)
 		return;		// don't add the world
 
-	if (ent->priv.server->free)
+	if (ent->free)
 		return;
 
 	if (PRVM_serveredictfloat(ent, solid) == SOLID_NOT)
@@ -811,7 +811,7 @@ void SV_LinkEdict (prvm_edict_t *ent)
 	if (ent == prog->edicts)
 		return;		// don't add the world
 
-	if (ent->priv.server->free)
+	if (ent->free)
 		return;
 
 	modelindex = (int)PRVM_serveredictfloat(ent, modelindex);
@@ -1089,7 +1089,7 @@ static qbool SV_RunThink (prvm_edict_t *ent)
 	if (PRVM_serveredictfloat(ent, nextthink) <= 0 || PRVM_serveredictfloat(ent, nextthink) > sv.time + sv.frametime)
 		return true;
 
-	for (iterations = 0;iterations < 128  && !ent->priv.server->free;iterations++)
+	for (iterations = 0;iterations < 128  && !ent->free;iterations++)
 	{
 		PRVM_serverglobalfloat(time) = max(sv.time, PRVM_serveredictfloat(ent, nextthink));
 		PRVM_serveredictfloat(ent, nextthink) = 0;
@@ -1103,7 +1103,7 @@ static qbool SV_RunThink (prvm_edict_t *ent)
 		if (PRVM_serveredictfloat(ent, nextthink) <= PRVM_serverglobalfloat(time) || PRVM_serveredictfloat(ent, nextthink) > sv.time + sv.frametime || !sv_gameplayfix_multiplethinksperframe.integer)
 			break;
 	}
-	return !ent->priv.server->free;
+	return !ent->free;
 }
 
 /*
@@ -1126,7 +1126,7 @@ static void SV_Impact (prvm_edict_t *e1, trace_t *trace)
 
 	VM_SetTraceGlobals(prog, trace);
 
-	if (!e1->priv.server->free && !e2->priv.server->free && PRVM_serveredictfunction(e1, touch) && PRVM_serveredictfloat(e1, solid) != SOLID_NOT)
+	if (!e1->free && !e2->free && PRVM_serveredictfunction(e1, touch) && PRVM_serveredictfloat(e1, solid) != SOLID_NOT)
 	{
 		PRVM_serverglobalfloat(time) = sv.time;
 		PRVM_serverglobaledict(self) = PRVM_EDICT_TO_PROG(e1);
@@ -1134,7 +1134,7 @@ static void SV_Impact (prvm_edict_t *e1, trace_t *trace)
 		prog->ExecuteProgram(prog, PRVM_serveredictfunction(e1, touch), "QC function self.touch is missing");
 	}
 
-	if (!e1->priv.server->free && !e2->priv.server->free && PRVM_serveredictfunction(e2, touch) && PRVM_serveredictfloat(e2, solid) != SOLID_NOT)
+	if (!e1->free && !e2->free && PRVM_serveredictfunction(e2, touch) && PRVM_serveredictfloat(e2, solid) != SOLID_NOT)
 	{
 		PRVM_serverglobalfloat(time) = sv.time;
 		PRVM_serverglobaledict(self) = PRVM_EDICT_TO_PROG(e2);
@@ -2626,7 +2626,7 @@ void SV_Physics_Toss (prvm_edict_t *ent)
 			// we can trust FL_ONGROUND if groundentity is world because it never moves
 			return;
 		}
-		else if (ent->priv.server->suspendedinairflag && groundentity->priv.server->free)
+		else if (ent->priv.server->suspendedinairflag && groundentity->free)
 		{
 			// if ent was supported by a brush model on previous frame,
 			// and groundentity is now freed, set groundentity to 0 (world)
@@ -2659,7 +2659,7 @@ void SV_Physics_Toss (prvm_edict_t *ent)
 		VectorScale(PRVM_serveredictvector(ent, velocity), movetime, move);
 		if(!SV_PushEntity(&trace, ent, move, true))
 			return; // teleported
-		if (ent->priv.server->free)
+		if (ent->free)
 			return;
 		if (trace.bmodelstartsolid && sv_gameplayfix_unstickentities.integer)
 		{
@@ -2667,7 +2667,7 @@ void SV_Physics_Toss (prvm_edict_t *ent)
 			SV_UnstickEntity(ent);
 			if(!SV_PushEntity(&trace, ent, move, true))
 				return; // teleported
-			if (ent->priv.server->free)
+			if (ent->free)
 				return;
 		}
 		if (trace.fraction == 1)
@@ -3186,22 +3186,22 @@ void SV_Physics (void)
 	// if force_retouch, relink all the entities
 	if (PRVM_serverglobalfloat(force_retouch) > 0)
 		for (i = 1, ent = PRVM_EDICT_NUM(i);i < prog->num_edicts;i++, ent = PRVM_NEXT_EDICT(ent))
-			if (!ent->priv.server->free)
+			if (!ent->free)
 				SV_LinkEdict_TouchAreaGrid(ent); // force retouch even for stationary
 
 	if (sv_gameplayfix_consistentplayerprethink.integer)
 	{
 		// run physics on the client entities in 3 stages
 		for (i = 1, ent = PRVM_EDICT_NUM(i), host_client = svs.clients;i <= svs.maxclients;i++, ent = PRVM_NEXT_EDICT(ent), host_client++)
-			if (!ent->priv.server->free)
+			if (!ent->free)
 				SV_Physics_ClientEntity_PreThink(ent);
 
 		for (i = 1, ent = PRVM_EDICT_NUM(i), host_client = svs.clients;i <= svs.maxclients;i++, ent = PRVM_NEXT_EDICT(ent), host_client++)
-			if (!ent->priv.server->free)
+			if (!ent->free)
 				SV_Physics_ClientEntity(ent);
 
 		for (i = 1, ent = PRVM_EDICT_NUM(i), host_client = svs.clients;i <= svs.maxclients;i++, ent = PRVM_NEXT_EDICT(ent), host_client++)
-			if (!ent->priv.server->free)
+			if (!ent->free)
 				SV_Physics_ClientEntity_PostThink(ent);
 	}
 	else
@@ -3209,7 +3209,7 @@ void SV_Physics (void)
 		// run physics on the client entities
 		for (i = 1, ent = PRVM_EDICT_NUM(i), host_client = svs.clients;i <= svs.maxclients;i++, ent = PRVM_NEXT_EDICT(ent), host_client++)
 		{
-			if (!ent->priv.server->free)
+			if (!ent->free)
 			{
 				SV_Physics_ClientEntity_PreThink(ent);
 				SV_Physics_ClientEntity(ent);
@@ -3222,13 +3222,13 @@ void SV_Physics (void)
 	if (!sv_freezenonclients.integer)
 	{
 		for (;i < prog->num_edicts;i++, ent = PRVM_NEXT_EDICT(ent))
-			if (!ent->priv.server->free)
+			if (!ent->free)
 				SV_Physics_Entity(ent);
 		// make a second pass to see if any ents spawned this frame and make
 		// sure they run their move/think
 		if (sv_gameplayfix_delayprojectiles.integer < 0)
 			for (i = svs.maxclients + 1, ent = PRVM_EDICT_NUM(i);i < prog->num_edicts;i++, ent = PRVM_NEXT_EDICT(ent))
-				if (!ent->priv.server->move && !ent->priv.server->free)
+				if (!ent->priv.server->move && !ent->free)
 					SV_Physics_Entity(ent);
 	}
 
diff --git a/sv_save.c b/sv_save.c
index 799a0d8a..926c90c9 100644
--- a/sv_save.c
+++ b/sv_save.c
@@ -434,7 +434,7 @@ void SV_Loadgame_f(cmd_state_t *cmd)
 				PRVM_MEM_IncreaseEdicts(prog);
 			ent = PRVM_EDICT_NUM(entnum);
 			memset(ent->fields.fp, 0, prog->entityfields * sizeof(prvm_vec_t));
-			ent->priv.server->free = false;
+			ent->free = false;
 
 			if(developer_entityparsing.integer)
 				Con_Printf("SV_Loadgame_f: loading edict %d\n", entnum);
@@ -442,7 +442,7 @@ void SV_Loadgame_f(cmd_state_t *cmd)
 			PRVM_ED_ParseEdict (prog, start, ent);
 
 			// link it into the bsp tree
-			if (!ent->priv.server->free && !VectorCompare(PRVM_serveredictvector(ent, absmin), PRVM_serveredictvector(ent, absmax)))
+			if (!ent->free && !VectorCompare(PRVM_serveredictvector(ent, absmin), PRVM_serveredictvector(ent, absmax)))
 				SV_LinkEdict(ent);
 		}
 
diff --git a/sv_send.c b/sv_send.c
index 984f9635..c42cbc69 100644
--- a/sv_send.c
+++ b/sv_send.c
@@ -709,7 +709,7 @@ static void SV_PrepareEntitiesForSending(void)
 	memset(sv.sendentitiesindex, 0, prog->num_edicts * sizeof(*sv.sendentitiesindex));
 	for (e = 1, ent = PRVM_NEXT_EDICT(prog->edicts);e < prog->num_edicts;e++, ent = PRVM_NEXT_EDICT(ent))
 	{
-		if (!ent->priv.server->free && SV_PrepareEntityForSending(ent, sv.sendentities + sv.numsendentities, e))
+		if (!ent->free && SV_PrepareEntityForSending(ent, sv.sendentities + sv.numsendentities, e))
 		{
 			sv.sendentitiesindex[e] = sv.sendentities + sv.numsendentities;
 			sv.numsendentities++;
@@ -1006,7 +1006,7 @@ void SV_AddCameraEyes(void)
 	// check line of sight to portal entities and add them to PVS
 	for (e = 1, ed = PRVM_NEXT_EDICT(prog->edicts);e < prog->num_edicts;e++, ed = PRVM_NEXT_EDICT(ed))
 	{
-		if (!ed->priv.server->free)
+		if (!ed->free)
 		{
 			if(PRVM_serveredictfunction(ed, camera_transform))
 			{
@@ -1651,7 +1651,7 @@ static void SV_UpdateToReliableMessages (void)
 		if (clientcamera > 0)
 		{
 			int oldclientcamera = host_client->clientcamera;
-			if (clientcamera >= prog->max_edicts || PRVM_EDICT_NUM(clientcamera)->priv.required->free)
+			if (clientcamera >= prog->max_edicts || PRVM_EDICT_NUM(clientcamera)->free)
 				clientcamera = PRVM_NUM_FOR_EDICT(host_client->edict);
 			host_client->clientcamera = clientcamera;
 
diff --git a/sv_user.c b/sv_user.c
index 1cb5a3f0..ff1bdbc3 100644
--- a/sv_user.c
+++ b/sv_user.c
@@ -718,7 +718,7 @@ static void SV_ReadClientMove (void)
 		}
 		// as requested by FrikaC, cursor_trace_ent is reset to world if the
 		// entity is free at time of receipt
-		if (PRVM_EDICT_NUM(move->cursor_entitynumber)->priv.server->free)
+		if (PRVM_EDICT_NUM(move->cursor_entitynumber)->free)
 			move->cursor_entitynumber = 0;
 		if (sv_message.badread) Con_Printf("SV_ReadClientMessage: badread at %s:%i\n", __FILE__, __LINE__);
 	}
diff --git a/svvm_cmds.c b/svvm_cmds.c
index e17c24ea..249e186d 100644
--- a/svvm_cmds.c
+++ b/svvm_cmds.c
@@ -254,7 +254,7 @@ static void VM_SV_setorigin(prvm_prog_t *prog)
 		VM_Warning(prog, "setorigin: can not modify world entity\n");
 		return;
 	}
-	if (e->priv.server->free)
+	if (e->free)
 	{
 		VM_Warning(prog, "setorigin: can not modify free entity\n");
 		return;
@@ -305,7 +305,7 @@ static void VM_SV_setsize(prvm_prog_t *prog)
 		VM_Warning(prog, "setsize: can not modify world entity\n");
 		return;
 	}
-	if (e->priv.server->free)
+	if (e->free)
 	{
 		VM_Warning(prog, "setsize: can not modify free entity\n");
 		return;
@@ -338,7 +338,7 @@ static void VM_SV_setmodel(prvm_prog_t *prog)
 		VM_Warning(prog, "setmodel: can not modify world entity\n");
 		return;
 	}
-	if (e->priv.server->free)
+	if (e->free)
 	{
 		VM_Warning(prog, "setmodel: can not modify free entity\n");
 		return;
@@ -806,7 +806,7 @@ static int VM_SV_newcheckclient(prvm_prog_t *prog, int check)
 		// look up the client's edict
 		ent = PRVM_EDICT_NUM(i);
 		// check if it is to be ignored, but never ignore the one we started on (prevent infinite loop)
-		if (i != check && (ent->priv.server->free || PRVM_serveredictfloat(ent, health) <= 0 || ((int)PRVM_serveredictfloat(ent, flags) & FL_NOTARGET)))
+		if (i != check && (ent->free || PRVM_serveredictfloat(ent, health) <= 0 || ((int)PRVM_serveredictfloat(ent, flags) & FL_NOTARGET)))
 			continue;
 		// found a valid client (possibly the same one again)
 		break;
@@ -853,7 +853,7 @@ static void VM_SV_checkclient(prvm_prog_t *prog)
 
 	// return check if it might be visible
 	ent = PRVM_EDICT_NUM(sv.lastcheck);
-	if (ent->priv.server->free || PRVM_serveredictfloat(ent, health) <= 0)
+	if (ent->free || PRVM_serveredictfloat(ent, health) <= 0)
 	{
 		VM_RETURN_EDICT(prog->edicts);
 		return;
@@ -901,7 +901,7 @@ static void VM_SV_checkpvs(prvm_prog_t *prog)
 	VectorCopy(PRVM_G_VECTOR(OFS_PARM0), viewpos);
 	viewee = PRVM_G_EDICT(OFS_PARM1);
 
-	if(viewee->priv.server->free)
+	if(viewee->free)
 	{
 		VM_Warning(prog, "checkpvs: can not check free entity\n");
 		PRVM_G_FLOAT(OFS_RETURN) = 4;
@@ -1096,7 +1096,7 @@ static void VM_SV_walkmove(prvm_prog_t *prog)
 		VM_Warning(prog, "walkmove: can not modify world entity\n");
 		return;
 	}
-	if (ent->priv.server->free)
+	if (ent->free)
 	{
 		VM_Warning(prog, "walkmove: can not modify free entity\n");
 		return;
@@ -1151,7 +1151,7 @@ static void VM_SV_droptofloor(prvm_prog_t *prog)
 		VM_Warning(prog, "droptofloor: can not modify world entity\n");
 		return;
 	}
-	if (ent->priv.server->free)
+	if (ent->free)
 	{
 		VM_Warning(prog, "droptofloor: can not modify free entity\n");
 		return;
@@ -1307,7 +1307,7 @@ static void VM_SV_aim(prvm_prog_t *prog)
 		VM_Warning(prog, "aim: can not use world entity\n");
 		return;
 	}
-	if (ent->priv.server->free)
+	if (ent->free)
 	{
 		VM_Warning(prog, "aim: can not use free entity\n");
 		return;
@@ -1535,7 +1535,7 @@ static void VM_SV_makestatic(prvm_prog_t *prog)
 		VM_Warning(prog, "makestatic: can not modify world entity\n");
 		return;
 	}
-	if (ent->priv.server->free)
+	if (ent->free)
 	{
 		VM_Warning(prog, "makestatic: can not modify free entity\n");
 		return;
@@ -1768,7 +1768,7 @@ static void VM_SV_copyentity(prvm_prog_t *prog)
 		VM_Warning(prog, "copyentity: can not read world entity\n");
 		return;
 	}
-	if (in->priv.server->free)
+	if (in->free)
 	{
 		VM_Warning(prog, "copyentity: can not read free entity\n");
 		return;
@@ -1779,7 +1779,7 @@ static void VM_SV_copyentity(prvm_prog_t *prog)
 		VM_Warning(prog, "copyentity: can not modify world entity\n");
 		return;
 	}
-	if (out->priv.server->free)
+	if (out->free)
 	{
 		VM_Warning(prog, "copyentity: can not modify free entity\n");
 		return;
@@ -2378,7 +2378,7 @@ static void VM_SV_setattachment(prvm_prog_t *prog)
 		VM_Warning(prog, "setattachment: can not modify world entity\n");
 		return;
 	}
-	if (e->priv.server->free)
+	if (e->free)
 	{
 		VM_Warning(prog, "setattachment: can not modify free entity\n");
 		return;
@@ -2492,7 +2492,7 @@ static int SV_GetTagMatrix (prvm_prog_t *prog, matrix4x4_t *out, prvm_edict_t *e
 
 	if (ent == prog->edicts)
 		return 1;
-	if (ent->priv.server->free)
+	if (ent->free)
 		return 2;
 
 	modelindex = (int)PRVM_serveredictfloat(ent, modelindex);
@@ -2561,7 +2561,7 @@ static void VM_SV_gettagindex(prvm_prog_t *prog)
 		VM_Warning(prog, "VM_SV_gettagindex(entity #%i): can't affect world entity\n", PRVM_NUM_FOR_EDICT(ent));
 		return;
 	}
-	if (ent->priv.server->free)
+	if (ent->free)
 	{
 		VM_Warning(prog, "VM_SV_gettagindex(entity #%i): can't affect free entity\n", PRVM_NUM_FOR_EDICT(ent));
 		return;
@@ -2730,7 +2730,7 @@ static void VM_SV_setmodelindex(prvm_prog_t *prog)
 		VM_Warning(prog, "setmodelindex: can not modify world entity\n");
 		return;
 	}
-	if (e->priv.server->free)
+	if (e->free)
 	{
 		VM_Warning(prog, "setmodelindex: can not modify free entity\n");
 		return;
diff --git a/world.c b/world.c
index 5f703a5d..39e0102c 100644
--- a/world.c
+++ b/world.c
@@ -221,7 +221,7 @@ int World_EntitiesInBox(world_t *world, const vec3_t requestmins, const vec3_t r
 			if (ent->priv.server->areagridmarknumber != world->areagrid_marknumber)
 			{
 				ent->priv.server->areagridmarknumber = world->areagrid_marknumber;
-				if (!ent->priv.server->free && BoxesOverlap(paddedmins, paddedmaxs, ent->priv.server->areamins, ent->priv.server->areamaxs))
+				if (!ent->free && BoxesOverlap(paddedmins, paddedmaxs, ent->priv.server->areamins, ent->priv.server->areamaxs))
 				{
 					if (numlist < maxlist)
 						list[numlist] = ent;
@@ -245,7 +245,7 @@ int World_EntitiesInBox(world_t *world, const vec3_t requestmins, const vec3_t r
 					if (ent->priv.server->areagridmarknumber != world->areagrid_marknumber)
 					{
 						ent->priv.server->areagridmarknumber = world->areagrid_marknumber;
-						if (!ent->priv.server->free && BoxesOverlap(paddedmins, paddedmaxs, ent->priv.server->areamins, ent->priv.server->areamaxs))
+						if (!ent->free && BoxesOverlap(paddedmins, paddedmaxs, ent->priv.server->areamins, ent->priv.server->areamaxs))
 						{
 							if (numlist < maxlist)
 								list[numlist] = ent;
@@ -313,7 +313,7 @@ void World_LinkEdict(world_t *world, prvm_edict_t *ent, const vec3_t mins, const
 		return;
 
 	// don't add free entities
-	if (ent->priv.server->free)
+	if (ent->free)
 		return;
 
 	VectorCopy(mins, ent->priv.server->areamins);
@@ -1862,7 +1862,7 @@ static void World_Physics_Frame_ForceFromEntity(world_t *world, prvm_edict_t *ed
 	if (!forcetype)
 		return;
 	enemy = PRVM_gameedictedict(ed, enemy);
-	if (enemy <= 0 || enemy >= prog->num_edicts || prog->edicts[enemy].priv.required->free || prog->edicts[enemy].priv.server->ode_body == 0)
+	if (enemy <= 0 || enemy >= prog->num_edicts || prog->edicts[enemy].free || prog->edicts[enemy].priv.server->ode_body == 0)
 		return;
 	VectorCopy(PRVM_gameedictvector(ed, movedir), movedir);
 	VectorCopy(PRVM_gameedictvector(ed, origin), origin);
@@ -1914,9 +1914,9 @@ static void World_Physics_Frame_JointFromEntity(world_t *world, prvm_edict_t *ed
 	VectorCopy(PRVM_gameedictvector(ed, movedir), movedir);
 	if(movetype == MOVETYPE_PHYSICS)
 		jointtype = JOINTTYPE_NONE; // can't have both
-	if(enemy <= 0 || enemy >= prog->num_edicts || prog->edicts[enemy].priv.required->free || prog->edicts[enemy].priv.server->ode_body == 0)
+	if(enemy <= 0 || enemy >= prog->num_edicts || prog->edicts[enemy].free || prog->edicts[enemy].priv.server->ode_body == 0)
 		enemy = 0;
-	if(aiment <= 0 || aiment >= prog->num_edicts || prog->edicts[aiment].priv.required->free || prog->edicts[aiment].priv.server->ode_body == 0)
+	if(aiment <= 0 || aiment >= prog->num_edicts || prog->edicts[aiment].free || prog->edicts[aiment].priv.server->ode_body == 0)
 		aiment = 0;
 	// see http://www.ode.org/old_list_archives/2006-January/017614.html
 	// we want to set ERP? make it fps independent and work like a spring constant
@@ -2925,7 +2925,7 @@ static void nearCallback (void *data, dGeomID o1, dGeomID o2)
 		return;
 
 	ed1 = (prvm_edict_t *) dGeomGetData(o1);
-	if(ed1 && ed1->priv.server->free)
+	if(ed1 && ed1->free)
 		ed1 = NULL;
 	if(ed1)
 	{
@@ -2936,7 +2936,7 @@ static void nearCallback (void *data, dGeomID o1, dGeomID o2)
 	}
 
 	ed2 = (prvm_edict_t *) dGeomGetData(o2);
-	if(ed2 && ed2->priv.server->free)
+	if(ed2 && ed2->free)
 		ed2 = NULL;
 	if(ed2)
 	{
@@ -3050,11 +3050,11 @@ void World_Physics_Frame(world_t *world, double frametime, double gravity)
 		if (prog)
 		{
 			for (i = 0, ed = prog->edicts + i;i < prog->num_edicts;i++, ed++)
-				if (!prog->edicts[i].priv.required->free)
+				if (!prog->edicts[i].free)
 					World_Physics_Frame_BodyFromEntity(world, ed);
 			// oh, and it must be called after all bodies were created
 			for (i = 0, ed = prog->edicts + i;i < prog->num_edicts;i++, ed++)
-				if (!prog->edicts[i].priv.required->free)
+				if (!prog->edicts[i].free)
 					World_Physics_Frame_JointFromEntity(world, ed);
 		}
 
@@ -3075,7 +3075,7 @@ void World_Physics_Frame(world_t *world, double frametime, double gravity)
 			{
 				int j;
 				for (j = 0, ed = prog->edicts + j;j < prog->num_edicts;j++, ed++)
-					if (!prog->edicts[j].priv.required->free)
+					if (!prog->edicts[j].free)
 						World_Physics_Frame_ForceFromEntity(world, ed);
 			}
 			// run physics (move objects, calculate new velocities)
@@ -3092,7 +3092,7 @@ void World_Physics_Frame(world_t *world, double frametime, double gravity)
 		if (prog)
 		{
 			for (i = 1, ed = prog->edicts + i;i < prog->num_edicts;i++, ed++)
-				if (!prog->edicts[i].priv.required->free)
+				if (!prog->edicts[i].free)
 					World_Physics_Frame_BodyToEntity(world, ed);
 
 			// print stats
@@ -3104,7 +3104,7 @@ void World_Physics_Frame(world_t *world, double frametime, double gravity)
 				world->physics.ode_activeovjects = 0;
 				for (i = 1, ed = prog->edicts + i;i < prog->num_edicts;i++, ed++)
 				{
-					if (prog->edicts[i].priv.required->free)
+					if (prog->edicts[i].free)
 						continue;
 					body = (dBodyID)prog->edicts[i].priv.server->ode_body;
 					if (!body)