X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=world.c;h=6665620eb9110a94bd17f869e7ee7545400f1832;hb=05b6edf1a4dac900a2d587ce8f26077642ba1792;hp=6cc992fe580f0be38d808a8e18479b8ebd87efe5;hpb=45e00ad85bfa8678f192f530a1ed64286336417e;p=xonotic%2Fdarkplaces.git diff --git a/world.c b/world.c index 6cc992fe..6665620e 100644 --- a/world.c +++ b/world.c @@ -433,7 +433,7 @@ Handles selection or creation of a clipping hull, and offseting (and eventually rotation) of the end points ================== */ -trace_t SV_ClipMoveToEntity(edict_t *ent, const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int movetype) +trace_t SV_ClipMoveToEntity(edict_t *ent, const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int movetype, int hitsupercontents) { trace_t trace; model_t *model = NULL; @@ -501,10 +501,10 @@ trace_t SV_ClipMoveToEntity(edict_t *ent, const vec3_t start, const vec3_t mins, VectorAdd(endtransformed, maxs, endtransformedmaxs); VectorAdd(starttransformed, mins, starttransformedmins); VectorAdd(endtransformed, mins, endtransformedmins); - model->TraceBox(model, frame, &trace, starttransformedmins, starttransformedmaxs, endtransformedmins, endtransformedmaxs, SUPERCONTENTS_SOLID); + model->TraceBox(model, frame, &trace, starttransformedmins, starttransformedmaxs, endtransformedmins, endtransformedmaxs, hitsupercontents); } else - Collision_ClipTrace_Box(&trace, ent->v->mins, ent->v->maxs, starttransformed, mins, maxs, endtransformed, SUPERCONTENTS_SOLID, SUPERCONTENTS_SOLID); + Collision_ClipTrace_Box(&trace, ent->v->mins, ent->v->maxs, starttransformed, mins, maxs, endtransformed, hitsupercontents, SUPERCONTENTS_SOLID); trace.fraction = bound(0, trace.fraction, 1); trace.realfraction = bound(0, trace.realfraction, 1); @@ -536,6 +536,7 @@ trace_t SV_Move(const vec3_t start, const vec3_t mins, const vec3_t maxs, const { vec3_t hullmins, hullmaxs; int i; + int hitsupercontentsmask; int passedictprog; qboolean pointtrace; edict_t *traceowner, *touch; @@ -563,8 +564,17 @@ trace_t SV_Move(const vec3_t start, const vec3_t mins, const vec3_t maxs, const Con_Printf("move(%f %f %f,%f %f %f)", clipstart[0], clipstart[1], clipstart[2], clipend[0], clipend[1], clipend[2]); #endif + hitsupercontentsmask = SUPERCONTENTS_SOLID; + if (passedict) + { + if (passedict->v->solid == SOLID_SLIDEBOX) + hitsupercontentsmask |= SUPERCONTENTS_PLAYERCLIP; + if ((int)passedict->v->flags & FL_MONSTER) + hitsupercontentsmask |= SUPERCONTENTS_MONSTERCLIP; + } + // clip to world - cliptrace = SV_ClipMoveToEntity(sv.edicts, clipstart, clipmins, clipmaxs, clipend, type); + cliptrace = SV_ClipMoveToEntity(sv.edicts, clipstart, clipmins, clipmaxs, clipend, type, hitsupercontentsmask); if (cliptrace.startsolid || cliptrace.fraction < 1) cliptrace.ent = sv.edicts; if (type == MOVE_WORLDONLY) @@ -654,9 +664,9 @@ trace_t SV_Move(const vec3_t start, const vec3_t mins, const vec3_t maxs, const // might interact, so do an exact clip if ((int)touch->v->flags & FL_MONSTER) - trace = SV_ClipMoveToEntity(touch, clipstart, clipmins2, clipmaxs2, clipend, type); + trace = SV_ClipMoveToEntity(touch, clipstart, clipmins2, clipmaxs2, clipend, type, hitsupercontentsmask); else - trace = SV_ClipMoveToEntity(touch, clipstart, clipmins, clipmaxs, clipend, type); + trace = SV_ClipMoveToEntity(touch, clipstart, clipmins, clipmaxs, clipend, type, hitsupercontentsmask); // LordHavoc: take the 'best' answers from the new trace and combine with existing data if (trace.allsolid) cliptrace.allsolid = true;