+int SV_EntitiesInBox(vec3_t mins, vec3_t maxs, int maxlist, prvm_edict_t **list)
+{
+ int numlist;
+ areagrid_t *grid;
+ link_t *l;
+ prvm_edict_t *ent;
+ int igrid[3], igridmins[3], igridmaxs[3];
+
+ sv_areagrid_stats_calls++;
+ sv_areagrid_marknumber++;
+ igridmins[0] = (int) ((mins[0] + sv_areagrid_bias[0]) * sv_areagrid_scale[0]);
+ igridmins[1] = (int) ((mins[1] + sv_areagrid_bias[1]) * sv_areagrid_scale[1]);
+ //igridmins[2] = (int) ((mins[2] + sv_areagrid_bias[2]) * sv_areagrid_scale[2]);
+ igridmaxs[0] = (int) ((maxs[0] + sv_areagrid_bias[0]) * sv_areagrid_scale[0]) + 1;
+ igridmaxs[1] = (int) ((maxs[1] + sv_areagrid_bias[1]) * sv_areagrid_scale[1]) + 1;
+ //igridmaxs[2] = (int) ((maxs[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]);
+
+ numlist = 0;
+ // add entities not linked into areagrid because they are too big or
+ // outside the grid bounds
+ if (sv_areagrid_outside.edicts.next != &sv_areagrid_outside.edicts)
+ {
+ for (l = sv_areagrid_outside.edicts.next;l != &sv_areagrid_outside.edicts;l = l->next)
+ {
+ ent = PRVM_EDICT_NUM_UNSIGNED(l->entitynumber);
+ if (ent->priv.server->areagridmarknumber != sv_areagrid_marknumber)
+ {
+ ent->priv.server->areagridmarknumber = sv_areagrid_marknumber;
+ if (!ent->priv.server->free && BoxesOverlap(mins, maxs, ent->fields.server->absmin, ent->fields.server->absmax))
+ {
+ if (numlist < maxlist)
+ list[numlist] = ent;
+ numlist++;
+ }
+ sv_areagrid_stats_entitychecks++;
+ }
+ }
+ }
+ // add grid linked entities
+ 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++)
+ {
+ if (grid->edicts.next != &grid->edicts)
+ {
+ for (l = grid->edicts.next;l != &grid->edicts;l = l->next)
+ {
+ ent = PRVM_EDICT_NUM_UNSIGNED(l->entitynumber);
+ if (ent->priv.server->areagridmarknumber != sv_areagrid_marknumber)
+ {
+ ent->priv.server->areagridmarknumber = sv_areagrid_marknumber;
+ if (!ent->priv.server->free && BoxesOverlap(mins, maxs, ent->fields.server->absmin, ent->fields.server->absmax))
+ {
+ if (numlist < maxlist)
+ list[numlist] = ent;
+ numlist++;
+ }
+ }
+ sv_areagrid_stats_entitychecks++;
+ }
+ }
+ }
+ }
+ return numlist;
+}