]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - world.c
report invalid edicts when attempting to link them
[xonotic/darkplaces.git] / world.c
diff --git a/world.c b/world.c
index b121576248dd107c86a8fe6cefc77e385dde2852..d30f9f34d076b1ba1dadda5f9a460c27c3bb0379 100644 (file)
--- a/world.c
+++ b/world.c
@@ -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]);
@@ -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)
                {