]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - world.c
fix for EF_FLAME and lots of other bugs with 16bit/8bit fields (modelindex, frame...
[xonotic/darkplaces.git] / world.c
diff --git a/world.c b/world.c
index 764023a279812ffac6875f7a21d44aab39bc2602..d8d092ff3a745e5cfec99cf500a5a5b6237a8e8e 100644 (file)
--- a/world.c
+++ b/world.c
@@ -125,19 +125,18 @@ void SV_InitBoxHull (void)
        for (i=0 ; i<6 ; i++)
        {
                box_clipnodes[i].planenum = i;
-               
+
                side = i&1;
-               
+
                box_clipnodes[i].children[side] = CONTENTS_EMPTY;
                if (i != 5)
                        box_clipnodes[i].children[side^1] = i + 1;
                else
                        box_clipnodes[i].children[side^1] = CONTENTS_SOLID;
-               
+
                box_planes[i].type = i>>1;
                box_planes[i].normal[i>>1] = 1;
        }
-
 }
 
 
@@ -418,7 +417,7 @@ void SV_LinkEdict (edict_t *ent, qboolean touch_triggers)
 
        if (ent->area.prev)
                SV_UnlinkEdict (ent);   // unlink from old position
-               
+
        if (ent == sv.edicts)
                return;         // don't add the world
 
@@ -859,7 +858,7 @@ loc0:
                        if (PROG_TO_EDICT(clip->passedict->v.owner) == touch)
                                continue;       // don't clip against owner
                        // LordHavoc: corpse code
-                       if (clip->passedict->v.solid == SOLID_CORPSE && touch->v.solid == SOLID_SLIDEBOX)
+                       if (clip->passedict->v.solid == SOLID_CORPSE && (touch->v.solid == SOLID_SLIDEBOX || touch->v.solid == SOLID_CORPSE))
                                continue;
                        if (clip->passedict->v.solid == SOLID_SLIDEBOX && touch->v.solid == SOLID_CORPSE)
                                continue;
@@ -870,6 +869,28 @@ loc0:
                        trace = SV_ClipMoveToEntity (touch, clip->start, clip->mins2, clip->maxs2, clip->end);
                else
                        trace = SV_ClipMoveToEntity (touch, clip->start, clip->mins, clip->maxs, clip->end);
+               // LordHavoc: take the 'best' answers from the new trace and combine with existing data
+               if (trace.allsolid)
+                       clip->trace.allsolid = true;
+               if (trace.startsolid)
+               {
+                       clip->trace.startsolid = true;
+                       if (!clip->trace.ent)
+                               clip->trace.ent = trace.ent;
+               }
+               if (trace.inopen)
+                       clip->trace.inopen = true;
+               if (trace.inwater)
+                       clip->trace.inwater = true;
+               if (trace.fraction < clip->trace.fraction)
+               {
+                       clip->trace.fraction = trace.fraction;
+                       VectorCopy(trace.endpos, clip->trace.endpos);
+                       clip->trace.plane = trace.plane;
+                       clip->trace.endcontents = trace.endcontents;
+                       clip->trace.ent = trace.ent;
+               }
+               /*
                if (trace.allsolid)
                {
                        clip->trace = trace;
@@ -885,6 +906,7 @@ loc0:
                        else
                                clip->trace = trace;
                }
+               */
        }
 
 // recurse down both sides
@@ -976,7 +998,7 @@ trace_t SV_Move (vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end, int type, e
        clip.trace = SV_ClipMoveToEntity (sv.edicts, start, mins, maxs, end);
 
        // clip to entities
-       if (!clip.trace.allsolid)
+       //if (!clip.trace.allsolid)
        {
                // create the bounding box of the entire move
                SV_MoveBounds ( start, clip.mins2, clip.maxs2, end, clip.boxmins, clip.boxmaxs );