- next = l->next;
- touch = EDICT_FROM_AREA(l);
- if (touch == ent)
- continue;
- if (!touch->v.touch || touch->v.solid != SOLID_TRIGGER)
- continue;
- if (ent->v.absmin[0] > touch->v.absmax[0]
- || ent->v.absmin[1] > touch->v.absmax[1]
- || ent->v.absmin[2] > touch->v.absmax[2]
- || ent->v.absmax[0] < touch->v.absmin[0]
- || ent->v.absmax[1] < touch->v.absmin[1]
- || ent->v.absmax[2] < touch->v.absmin[2] )
- continue;
- old_self = pr_global_struct->self;
- old_other = pr_global_struct->other;
-
- pr_global_struct->self = EDICT_TO_PROG(touch);
- pr_global_struct->other = EDICT_TO_PROG(ent);
- pr_global_struct->time = sv.time;
- PR_ExecuteProgram (touch->v.touch);
-
- pr_global_struct->self = old_self;
- pr_global_struct->other = old_other;
- }
-
-// recurse down both sides
- if (node->axis == -1)
- return;
-
- // LordHavoc: optimized recursion
-// if (ent->v.absmax[node->axis] > node->dist) SV_TouchLinks (ent, node->children[0]);
-// if (ent->v.absmin[node->axis] < node->dist) SV_TouchLinks (ent, node->children[1]);
- if (ent->v.absmax[node->axis] > node->dist)
- {
- if (ent->v.absmin[node->axis] < node->dist)
- SV_TouchLinks(ent, node->children[1]); // order reversed to reduce code
- node = node->children[0];
- goto loc0;
- }
- else
- {
- if (ent->v.absmin[node->axis] < node->dist)
- {
- node = node->children[1];
- goto loc0;
- }
- }
-}
-
-
-/*
-===============
-SV_FindTouchedLeafs
-
-===============
-*/
-void SV_FindTouchedLeafs (edict_t *ent, mnode_t *node)
-{
- mplane_t *splitplane;
- mleaf_t *leaf;
- int sides;
- int leafnum;
-
-loc0:
- if (node->contents == CONTENTS_SOLID)
- return;
-
-// add an efrag if the node is a leaf
-
- if ( node->contents < 0)
- {
- if (ent->num_leafs == MAX_ENT_LEAFS)
- return;
-
- leaf = (mleaf_t *)node;
- leafnum = leaf - sv.worldmodel->leafs - 1;
-
- ent->leafnums[ent->num_leafs] = leafnum;
- ent->num_leafs++;
- return;
- }
-
-// NODE_MIXED
-
- splitplane = node->plane;
- sides = BOX_ON_PLANE_SIDE(ent->v.absmin, ent->v.absmax, splitplane);
-
-// recurse down the contacted sides
- // LordHavoc: optimized recursion
-// if (sides & 1) SV_FindTouchedLeafs (ent, node->children[0]);
-// if (sides & 2) SV_FindTouchedLeafs (ent, node->children[1]);
- switch (sides)
- {
- case 1:
- node = node->children[0];
- goto loc0;
- case 2:
- node = node->children[1];
- goto loc0;
- default: // 3
- if (node->children[0]->contents != CONTENTS_SOLID)
- SV_FindTouchedLeafs (ent, node->children[0]);
- node = node->children[1];
- goto loc0;
- }
-}
-
-/*
-===============
-SV_LinkEdict
-
-===============
-*/
-void SV_LinkEdict (edict_t *ent, qboolean touch_triggers)
-{
- areanode_t *node;
-
- if (ent->area.prev)
- SV_UnlinkEdict (ent); // unlink from old position
-
- if (ent == sv.edicts)
- return; // don't add the world
-
- if (ent->free)
- return;
-
-// set the abs box
-
-// LordHavoc: enabling rotating bmodels
- if (ent->v.solid == SOLID_BSP && (ent->v.angles[0] || ent->v.angles[1] || ent->v.angles[2]) )
- { // expand for rotation
- float max, v;
- int i;
-
- max = 0;
- for (i=0 ; i<3 ; i++)
- {
- v =fabs( ent->v.mins[i]);
- if (v > max)
- max = v;
- v =fabs( ent->v.maxs[i]);
- if (v > max)
- max = v;
- }
- for (i=0 ; i<3 ; i++)