]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - world.c
duplicated PRVM_ExecuteProgram to become MVM_ExecuteProgram,
[xonotic/darkplaces.git] / world.c
diff --git a/world.c b/world.c
index 1340079650afed31b6332079979486330ed8270a..20abb84aadc1ccba954e669a59d1cd3da0f13974 100644 (file)
--- a/world.c
+++ b/world.c
@@ -36,7 +36,7 @@ void World_Init(void)
 
 //============================================================================
 
-// World_ClearLink is used for new headnodes
+/// World_ClearLink is used for new headnodes
 void World_ClearLink (link_t *l)
 {
        l->entitynumber = 0;
@@ -76,13 +76,18 @@ void World_PrintAreaStats(world_t *world, const char *worldname)
 
 /*
 ===============
-World_Clear
+World_SetSize
 
 ===============
 */
-void World_Clear(world_t *world)
+void World_SetSize(world_t *world, const char *filename, const vec3_t mins, const vec3_t maxs)
 {
        int i;
+
+       strlcpy(world->filename, filename, sizeof(world->filename));
+       VectorCopy(mins, world->mins);
+       VectorCopy(maxs, world->maxs);
+
        // the areagrid_marknumber is not allowed to be 0
        if (world->areagrid_marknumber < 1)
                world->areagrid_marknumber = 1;
@@ -105,9 +110,28 @@ void World_Clear(world_t *world)
        World_ClearLink(&world->areagrid_outside);
        for (i = 0;i < AREA_GRIDNODES;i++)
                World_ClearLink(&world->areagrid[i]);
-       Con_DPrintf("areagrid settings: divisions %ix%ix1 : box %f %f %f : %f %f %f size %f %f %f grid %f %f %f (mingrid %f)\n", AREA_GRID, AREA_GRID, world->areagrid_mins[0], world->areagrid_mins[1], world->areagrid_mins[2], world->areagrid_maxs[0], world->areagrid_maxs[1], world->areagrid_maxs[2], world->areagrid_size[0], world->areagrid_size[1], world->areagrid_size[2], 1.0f / world->areagrid_scale[0], 1.0f / world->areagrid_scale[1], 1.0f / world->areagrid_scale[2], sv_areagrid_mingridsize.value);
+       if (developer.integer >= 10)
+               Con_Printf("areagrid settings: divisions %ix%ix1 : box %f %f %f : %f %f %f size %f %f %f grid %f %f %f (mingrid %f)\n", AREA_GRID, AREA_GRID, world->areagrid_mins[0], world->areagrid_mins[1], world->areagrid_mins[2], world->areagrid_maxs[0], world->areagrid_maxs[1], world->areagrid_maxs[2], world->areagrid_size[0], world->areagrid_size[1], world->areagrid_size[2], 1.0f / world->areagrid_scale[0], 1.0f / world->areagrid_scale[1], 1.0f / world->areagrid_scale[2], sv_areagrid_mingridsize.value);
 }
 
+/*
+===============
+World_UnlinkAll
+
+===============
+*/
+void World_UnlinkAll(world_t *world)
+{
+       int i;
+       link_t *grid;
+       // unlink all entities one by one
+       grid = &world->areagrid_outside;
+       while (grid->next != grid)
+               World_UnlinkEdict(PRVM_EDICT_NUM(grid->next->entitynumber));
+       for (i = 0, grid = world->areagrid;i < AREA_GRIDNODES;i++, grid++)
+               while (grid->next != grid)
+                       World_UnlinkEdict(PRVM_EDICT_NUM(grid->next->entitynumber));
+}
 
 /*
 ===============
@@ -127,7 +151,7 @@ void World_UnlinkEdict(prvm_edict_t *ent)
        }
 }
 
-int World_EntitiesInBox(world_t *world, vec3_t mins, vec3_t maxs, int maxlist, prvm_edict_t **list)
+int World_EntitiesInBox(world_t *world, const vec3_t mins, const vec3_t maxs, int maxlist, prvm_edict_t **list)
 {
        int numlist;
        link_t *grid;
@@ -211,27 +235,27 @@ void World_LinkEdict_AreaGrid(world_t *world, prvm_edict_t *ent)
 
        if (entitynumber <= 0 || entitynumber >= prog->max_edicts || PRVM_EDICT_NUM(entitynumber) != ent)
        {
-               Con_Printf ("SV_LinkEdict_AreaGrid: invalid edict %p (edicts is %p, edict compared to prog->edicts is %i)\n", ent, prog->edicts, entitynumber);
+               Con_Printf ("World_LinkEdict_AreaGrid: invalid edict %p (edicts is %p, edict compared to prog->edicts is %i)\n", (void *)ent, (void *)prog->edicts, entitynumber);
                return;
        }
 
-       igridmins[0] = (int) floor((ent->priv.server->areamins[0] + sv.world.areagrid_bias[0]) * sv.world.areagrid_scale[0]);
-       igridmins[1] = (int) floor((ent->priv.server->areamins[1] + sv.world.areagrid_bias[1]) * sv.world.areagrid_scale[1]);
-       //igridmins[2] = (int) floor((ent->priv.server->areamins[2] + sv.world.areagrid_bias[2]) * sv.world.areagrid_scale[2]);
-       igridmaxs[0] = (int) floor((ent->priv.server->areamaxs[0] + sv.world.areagrid_bias[0]) * sv.world.areagrid_scale[0]) + 1;
-       igridmaxs[1] = (int) floor((ent->priv.server->areamaxs[1] + sv.world.areagrid_bias[1]) * sv.world.areagrid_scale[1]) + 1;
-       //igridmaxs[2] = (int) floor((ent->priv.server->areamaxs[2] + sv.world.areagrid_bias[2]) * sv.world.areagrid_scale[2]) + 1;
+       igridmins[0] = (int) floor((ent->priv.server->areamins[0] + world->areagrid_bias[0]) * world->areagrid_scale[0]);
+       igridmins[1] = (int) floor((ent->priv.server->areamins[1] + world->areagrid_bias[1]) * world->areagrid_scale[1]);
+       //igridmins[2] = (int) floor((ent->priv.server->areamins[2] + world->areagrid_bias[2]) * world->areagrid_scale[2]);
+       igridmaxs[0] = (int) floor((ent->priv.server->areamaxs[0] + world->areagrid_bias[0]) * world->areagrid_scale[0]) + 1;
+       igridmaxs[1] = (int) floor((ent->priv.server->areamaxs[1] + world->areagrid_bias[1]) * world->areagrid_scale[1]) + 1;
+       //igridmaxs[2] = (int) floor((ent->priv.server->areamaxs[2] + world->areagrid_bias[2]) * world->areagrid_scale[2]) + 1;
        if (igridmins[0] < 0 || igridmaxs[0] > AREA_GRID || igridmins[1] < 0 || igridmaxs[1] > AREA_GRID || ((igridmaxs[0] - igridmins[0]) * (igridmaxs[1] - igridmins[1])) > ENTITYGRIDAREAS)
        {
                // wow, something outside the grid, store it as such
-               World_InsertLinkBefore (&ent->priv.server->areagrid[0], &sv.world.areagrid_outside, entitynumber);
+               World_InsertLinkBefore (&ent->priv.server->areagrid[0], &world->areagrid_outside, entitynumber);
                return;
        }
 
        gridnum = 0;
        for (igrid[1] = igridmins[1];igrid[1] < igridmaxs[1];igrid[1]++)
        {
-               grid = sv.world.areagrid + igrid[1] * AREA_GRID + igridmins[0];
+               grid = world->areagrid + igrid[1] * AREA_GRID + igridmins[0];
                for (igrid[0] = igridmins[0];igrid[0] < igridmaxs[0];igrid[0]++, grid++, gridnum++)
                        World_InsertLinkBefore (&ent->priv.server->areagrid[gridnum], grid, entitynumber);
        }