]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - world.c
reverted dynamic allocation of sv.edicts because there are FAR too many broken pointe...
[xonotic/darkplaces.git] / world.c
diff --git a/world.c b/world.c
index de5df5c5c4e97210ea3f034bb6fbcb200c407fd6..b121576248dd107c86a8fe6cefc77e385dde2852 100644 (file)
--- a/world.c
+++ b/world.c
@@ -72,41 +72,30 @@ typedef struct
 }
 moveclip_t;
 
-//#define EDICT_FROM_AREA(l) ((edict_t *)((qbyte *)l - (int)&(((edict_t *)0)->area)))
-#define EDICT_FROM_AREA(l) ((edict_t *)l->entity)
-
 //============================================================================
 
 // ClearLink is used for new headnodes
-void ClearLink (link_t *l)
+static void ClearLink (link_t *l)
 {
-       l->entity = NULL;
+       l->entitynumber = 0;
        l->prev = l->next = l;
 }
 
-void RemoveLink (link_t *l)
+static void RemoveLink (link_t *l)
 {
        l->next->prev = l->prev;
        l->prev->next = l->next;
 }
 
-void InsertLinkBefore (link_t *l, link_t *before, void *ent)
+static void InsertLinkBefore (link_t *l, link_t *before, int entitynumber)
 {
-       l->entity = ent;
+       l->entitynumber = entitynumber;
        l->next = before;
        l->prev = before->prev;
        l->prev->next = l;
        l->next->prev = l;
 }
 
-void InsertLinkAfter (link_t *l, link_t *after)
-{
-       l->next = after->next;
-       l->prev = after;
-       l->prev->next = l;
-       l->next->prev = l;
-}
-
 
 /*
 ===============================================================================
@@ -195,10 +184,10 @@ void SV_UnlinkEdict (edict_t *ent)
        int i;
        for (i = 0;i < ENTITYGRIDAREAS;i++)
        {
-               if (ent->areagrid[i].prev)
+               if (ent->e->areagrid[i].prev)
                {
-                       RemoveLink (&ent->areagrid[i]);
-                       ent->areagrid[i].prev = ent->areagrid[i].next = NULL;
+                       RemoveLink (&ent->e->areagrid[i]);
+                       ent->e->areagrid[i].prev = ent->e->areagrid[i].next = NULL;
                }
        }
 }
@@ -228,7 +217,7 @@ void SV_TouchAreaGrid(edict_t *ent)
        for (l = sv_areagrid_outside.trigger_edicts.next;l != &sv_areagrid_outside.trigger_edicts;l = next)
        {
                next = l->next;
-               touch = EDICT_FROM_AREA(l);
+               touch = EDICT_NUM(l->entitynumber);
                if (ent->v->absmin[0] > touch->v->absmax[0]
                 || ent->v->absmax[0] < touch->v->absmin[0]
                 || ent->v->absmin[1] > touch->v->absmax[1]
@@ -260,10 +249,10 @@ void SV_TouchAreaGrid(edict_t *ent)
                        for (l = grid->trigger_edicts.next;l != &grid->trigger_edicts;l = next)
                        {
                                next = l->next;
-                               touch = EDICT_FROM_AREA(l);
-                               if (touch->areagridmarknumber == sv_areagrid_marknumber)
+                               touch = EDICT_NUM(l->entitynumber);
+                               if (touch->e->areagridmarknumber == sv_areagrid_marknumber)
                                        continue;
-                               touch->areagridmarknumber = sv_areagrid_marknumber;
+                               touch->e->areagridmarknumber = sv_areagrid_marknumber;
                                if (ent->v->absmin[0] > touch->v->absmax[0]
                                 || ent->v->absmax[0] < touch->v->absmin[0]
                                 || ent->v->absmin[1] > touch->v->absmax[1]
@@ -305,9 +294,9 @@ void SV_LinkEdict_AreaGrid(edict_t *ent)
        {
                // wow, something outside the grid, store it as such
                if (ent->v->solid == SOLID_TRIGGER)
-                       InsertLinkBefore (&ent->areagrid[0], &sv_areagrid_outside.trigger_edicts, ent);
+                       InsertLinkBefore (&ent->e->areagrid[0], &sv_areagrid_outside.trigger_edicts, NUM_FOR_EDICT(ent));
                else
-                       InsertLinkBefore (&ent->areagrid[0], &sv_areagrid_outside.solid_edicts, ent);
+                       InsertLinkBefore (&ent->e->areagrid[0], &sv_areagrid_outside.solid_edicts, NUM_FOR_EDICT(ent));
                return;
        }
 
@@ -318,9 +307,9 @@ void SV_LinkEdict_AreaGrid(edict_t *ent)
                for (igrid[0] = igridmins[0];igrid[0] < igridmaxs[0];igrid[0]++, grid++, gridnum++)
                {
                        if (ent->v->solid == SOLID_TRIGGER)
-                               InsertLinkBefore (&ent->areagrid[gridnum], &grid->trigger_edicts, ent);
+                               InsertLinkBefore (&ent->e->areagrid[gridnum], &grid->trigger_edicts, NUM_FOR_EDICT(ent));
                        else
-                               InsertLinkBefore (&ent->areagrid[gridnum], &grid->solid_edicts, ent);
+                               InsertLinkBefore (&ent->e->areagrid[gridnum], &grid->solid_edicts, NUM_FOR_EDICT(ent));
                }
        }
 }
@@ -335,13 +324,13 @@ void SV_LinkEdict (edict_t *ent, qboolean touch_triggers)
 {
        model_t *model;
 
-       if (ent->areagrid[0].prev)
+       if (ent->e->areagrid[0].prev)
                SV_UnlinkEdict (ent);   // unlink from old position
 
        if (ent == sv.edicts)
                return;         // don't add the world
 
-       if (ent->free)
+       if (ent->e->free)
                return;
 
 // set the abs box
@@ -505,10 +494,10 @@ void SV_ClipToNode(moveclip_t *clip, link_t *list)
        for (l = list->next;l != list;l = next)
        {
                next = l->next;
-               touch = EDICT_FROM_AREA(l);
-               if (touch->areagridmarknumber == sv_areagrid_marknumber)
+               touch = EDICT_NUM(l->entitynumber);
+               if (touch->e->areagridmarknumber == sv_areagrid_marknumber)
                        continue;
-               touch->areagridmarknumber = sv_areagrid_marknumber;
+               touch->e->areagridmarknumber = sv_areagrid_marknumber;
                sv_areagrid_stats_entitychecks++;
 
                if (clip->boxmins[0] > touch->v->absmax[0]