]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - world.c
sounds now follow their owner (so riding a lift doesn't leave the sound at the start...
[xonotic/darkplaces.git] / world.c
diff --git a/world.c b/world.c
index 6fceef78097595f637210c50b9ecc531dc855861..7af2672b7ebda74d312c04da70d75e5b1925ff8d 100644 (file)
--- a/world.c
+++ b/world.c
@@ -184,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;
                }
        }
 }
@@ -250,9 +250,9 @@ void SV_TouchAreaGrid(edict_t *ent)
                        {
                                next = l->next;
                                touch = EDICT_NUM(l->entitynumber);
-                               if (touch->areagridmarknumber == sv_areagrid_marknumber)
+                               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]
@@ -260,6 +260,7 @@ void SV_TouchAreaGrid(edict_t *ent)
                                 || ent->v->absmin[2] > touch->v->absmax[2]
                                 || ent->v->absmax[2] < touch->v->absmin[2])
                                        continue;
+                               // LordHavoc: id bug that won't be fixed: triggers do not ignore their owner like solid objects do
                                if (touch == ent)
                                        continue;
                                if (!touch->v->touch || touch->v->solid != SOLID_TRIGGER)
@@ -282,7 +283,10 @@ void SV_TouchAreaGrid(edict_t *ent)
 void SV_LinkEdict_AreaGrid(edict_t *ent)
 {
        areagrid_t *grid;
-       int igrid[3], igridmins[3], igridmaxs[3], gridnum;
+       int igrid[3], igridmins[3], igridmaxs[3], gridnum, entitynumber = NUM_FOR_EDICT(ent);
+
+       if (entitynumber <= 0 || entitynumber >= sv.max_edicts || EDICT_NUM(entitynumber) != ent)
+               Host_Error("SV_LinkEdict_AreaGrid: invalid edict %p (sv.edicts is %p, edict compared to sv.edicts is %i)\n", ent, sv.edicts, entitynumber);
 
        igridmins[0] = (int) ((ent->v->absmin[0] + sv_areagrid_bias[0]) * sv_areagrid_scale[0]);
        igridmins[1] = (int) ((ent->v->absmin[1] + sv_areagrid_bias[1]) * sv_areagrid_scale[1]);
@@ -294,9 +298,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, NUM_FOR_EDICT(ent));
+                       InsertLinkBefore (&ent->e->areagrid[0], &sv_areagrid_outside.trigger_edicts, entitynumber);
                else
-                       InsertLinkBefore (&ent->areagrid[0], &sv_areagrid_outside.solid_edicts, NUM_FOR_EDICT(ent));
+                       InsertLinkBefore (&ent->e->areagrid[0], &sv_areagrid_outside.solid_edicts, entitynumber);
                return;
        }
 
@@ -307,9 +311,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, NUM_FOR_EDICT(ent));
+                               InsertLinkBefore (&ent->e->areagrid[gridnum], &grid->trigger_edicts, entitynumber);
                        else
-                               InsertLinkBefore (&ent->areagrid[gridnum], &grid->solid_edicts, NUM_FOR_EDICT(ent));
+                               InsertLinkBefore (&ent->e->areagrid[gridnum], &grid->solid_edicts, entitynumber);
                }
        }
 }
@@ -324,13 +328,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
@@ -342,6 +346,7 @@ void SV_LinkEdict (edict_t *ent, qboolean touch_triggers)
                model = sv.models[(int) ent->v->modelindex];
                if (model != NULL)
                {
+                       Mod_CheckLoaded(model);
                        if (model->type != mod_brush)
                                Host_Error("SOLID_BSP with non-BSP model\n");
 
@@ -452,17 +457,17 @@ trace_t SV_ClipMoveToEntity (edict_t *ent, vec3_t start, vec3_t mins, vec3_t max
 {
        int i;
        trace_t trace;
-       model_t *model;
-
-       i = ent->v->modelindex;
-       if ((unsigned int) i >= MAX_MODELS)
-               Host_Error("SV_ClipMoveToEntity: invalid modelindex\n");
-       model = sv.models[i];
-       if (i != 0 && model == NULL)
-               Host_Error("SV_ClipMoveToEntity: invalid modelindex\n");
+       model_t *model = NULL;
 
        if ((int) ent->v->solid == SOLID_BSP)
        {
+               i = ent->v->modelindex;
+               if ((unsigned int) i >= MAX_MODELS)
+                       Host_Error("SV_ClipMoveToEntity: invalid modelindex\n");
+               model = sv.models[i];
+               if (i != 0 && model == NULL)
+                       Host_Error("SV_ClipMoveToEntity: invalid modelindex\n");
+
                Mod_CheckLoaded(model);
                if (model->type != mod_brush)
                {
@@ -495,9 +500,9 @@ void SV_ClipToNode(moveclip_t *clip, link_t *list)
        {
                next = l->next;
                touch = EDICT_NUM(l->entitynumber);
-               if (touch->areagridmarknumber == sv_areagrid_marknumber)
+               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]