Index: cmodel.c
===================================================================
--- cmodel.c (revision 15241)
+++ cmodel.c (working copy)
@@ -687,13 +687,16 @@
trace_t trace;
cBspModel_t *model;
const char **name;
+ int worldFound;
/* trace against world first */
if (CM_TestLine(start, stop))
- return 1;
+ worldFound = 1;
+ else
+ worldFound = 0;
/* no local models */
if (!inlineList)
- return 0;
+ return worldFound;
for (name = inlineList; *name; name++) {
/* check whether this is really an inline model */
@@ -710,7 +713,7 @@
}
/* not blocked */
- return 0;
+ return worldFound;
}
@@ -2184,7 +2187,7 @@
/* FIXME: What about visibility checks - should LEVEL_ACTORCLIP
* be removed here, too? Problem is, the tnode functions are used
* for pathfinding, too */
- if (level <= LEVEL_WEAPONCLIP) {
+ if (level <= LEVEL_LASTVISIBLE) {
curTile->cheads[curTile->numcheads].cnode = node;
curTile->cheads[curTile->numcheads].level = level;
curTile->numcheads++;
@@ -2219,7 +2222,12 @@
curTile->numtheads++;
assert(curTile->numtheads < LEVEL_MAX);
- BuildTracingNode_r(curTile->cmodels[i].headnode, i);
+ /*
+ If this level (i) is the last visible level or earlier, then trace it.
+ Otherwise don't; we have separate checks for entities.
+ */
+ if (i <= LEVEL_LASTVISIBLE)
+ BuildTracingNode_r(curTile->cmodels[i].headnode, i);
}
}
@@ -3027,6 +3035,9 @@
}
inlineList = list;
+ /* Update the tracing nodes to ensure that we have the shortest paths */
+ CM_MakeTracingNodes();
+
/* get dimensions */
if (VectorNotEmpty(angles)) {
vec3_t minVec, maxVec;