+void CL_VM_CB_BeginIncreaseEdicts(void)
+{
+ // links don't survive the transition, so unlink everything
+ World_UnlinkAll(&cl.world);
+}
+
+void CL_VM_CB_EndIncreaseEdicts(void)
+{
+ int i;
+ prvm_edict_t *ent;
+
+ // link every entity except world
+ for (i = 1, ent = prog->edicts;i < prog->max_edicts;i++, ent++)
+ if (!ent->priv.server->free)
+ CL_LinkEdict(ent);
+}
+
+void CL_VM_CB_InitEdict(prvm_edict_t *e)
+{
+ int edictnum = PRVM_NUM_FOR_EDICT(e);
+ entity_render_t *entrender;
+ CL_ExpandCSQCRenderEntities(edictnum);
+ entrender = cl.csqcrenderentities + edictnum;
+ e->priv.server->move = false; // don't move on first frame
+ memset(entrender, 0, sizeof(*entrender));
+ entrender->shadertime = cl.time;
+}
+
+extern void R_DecalSystem_Reset(decalsystem_t *decalsystem);
+
+void CL_VM_CB_FreeEdict(prvm_edict_t *ed)
+{
+ entity_render_t *entrender = cl.csqcrenderentities + PRVM_NUM_FOR_EDICT(ed);
+ R_DecalSystem_Reset(&entrender->decalsystem);
+ memset(entrender, 0, sizeof(*entrender));
+ World_UnlinkEdict(ed);
+ memset(ed->fields.client, 0, sizeof(*ed->fields.client));
+ VM_RemoveEdictSkeleton(ed);
+ World_Physics_RemoveFromEntity(&cl.world, ed);
+ World_Physics_RemoveJointFromEntity(&cl.world, ed);
+}
+
+void CL_VM_CB_CountEdicts(void)
+{
+ int i;
+ prvm_edict_t *ent;
+ int active = 0, models = 0, solid = 0;
+
+ for (i=0 ; i<prog->num_edicts ; i++)
+ {
+ ent = PRVM_EDICT_NUM(i);
+ if (ent->priv.server->free)
+ continue;
+ active++;
+ if (ent->fields.client->solid)
+ solid++;
+ if (ent->fields.client->model)
+ models++;
+ }
+
+ Con_Printf("num_edicts:%3i\n", prog->num_edicts);
+ Con_Printf("active :%3i\n", active);
+ Con_Printf("view :%3i\n", models);
+ Con_Printf("touch :%3i\n", solid);
+}
+
+qboolean CL_VM_CB_LoadEdict(prvm_edict_t *ent)
+{
+ return true;
+}
+