+ link_t *l;
+ edict_t *touch;
+ areagrid_t *grid;
+ int old_self, old_other, igrid[3], igridmins[3], igridmaxs[3];
+ int i, numtouchedicts;
+ unsigned short touchedictnumbers[MAX_EDICTS];
+
+ sv_areagrid_marknumber++;
+ 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]);
+ //igridmins[2] = (int) ((ent->v->absmin[2] + sv_areagrid_bias[2]) * sv_areagrid_scale[2]);
+ igridmaxs[0] = (int) ((ent->v->absmax[0] + sv_areagrid_bias[0]) * sv_areagrid_scale[0]) + 1;
+ igridmaxs[1] = (int) ((ent->v->absmax[1] + sv_areagrid_bias[1]) * sv_areagrid_scale[1]) + 1;
+ //igridmaxs[2] = (int) ((ent->v->absmax[2] + sv_areagrid_bias[2]) * sv_areagrid_scale[2]) + 1;
+ igridmins[0] = max(0, igridmins[0]);
+ igridmins[1] = max(0, igridmins[1]);
+ //igridmins[2] = max(0, igridmins[2]);
+ igridmaxs[0] = min(AREA_GRID, igridmaxs[0]);
+ igridmaxs[1] = min(AREA_GRID, igridmaxs[1]);
+ //igridmaxs[2] = min(AREA_GRID, igridmaxs[2]);
+
+ // build a list of edicts to touch, because the link loop can be corrupted
+ // by SV_IncreaseEdicts called during touch functions
+ numtouchedicts = 0;
+ for (l = sv_areagrid_outside.trigger_edicts.next;l != &sv_areagrid_outside.trigger_edicts;l = l->next)
+ touchedictnumbers[numtouchedicts++] = l->entitynumber;
+
+ for (igrid[1] = igridmins[1];igrid[1] < igridmaxs[1];igrid[1]++)
+ {
+ grid = sv_areagrid + igrid[1] * AREA_GRID + igridmins[0];
+ for (igrid[0] = igridmins[0];igrid[0] < igridmaxs[0];igrid[0]++, grid++)
+ for (l = grid->trigger_edicts.next;l != &grid->trigger_edicts;l = l->next)
+ touchedictnumbers[numtouchedicts++] = l->entitynumber;
+ }