X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=world.c;h=427fe1cb0e0ee8ab436a3c6b0600dc7c1d176945;hb=f2033ea3754b3531a570ec7d407f154415047db5;hp=8195fa762c9c9e0d46c73167786818dc1f2adf46;hpb=d159736a199e4043ed98cde48f6d5716ec40845c;p=xonotic%2Fdarkplaces.git diff --git a/world.c b/world.c index 8195fa76..427fe1cb 100644 --- a/world.c +++ b/world.c @@ -395,27 +395,6 @@ void SV_LinkEdict (prvm_edict_t *ent, qboolean touch_triggers) -/* -=============================================================================== - -POINT TESTING IN HULLS - -=============================================================================== -*/ - -/* -============ -SV_TestEntityPosition - -This could be a lot more efficient... -============ -*/ -int SV_TestEntityPosition (prvm_edict_t *ent) -{ - return SV_Move (ent->fields.server->origin, ent->fields.server->mins, ent->fields.server->maxs, ent->fields.server->origin, MOVE_NORMAL, ent).startsolid; -} - - /* =============================================================================== @@ -438,7 +417,6 @@ trace_t SV_ClipMoveToEntity(prvm_edict_t *ent, const vec3_t start, const vec3_t model_t *model = NULL; matrix4x4_t matrix, imatrix; float tempnormal[3], starttransformed[3], endtransformed[3]; - float starttransformedmins[3], starttransformedmaxs[3], endtransformedmins[3], endtransformedmaxs[3]; memset(&trace, 0, sizeof(trace)); trace.fraction = trace.realfraction = 1; @@ -495,14 +473,10 @@ trace_t SV_ClipMoveToEntity(prvm_edict_t *ent, const vec3_t start, const vec3_t int frame; frame = (int)ent->fields.server->frame; frame = bound(0, frame, (model->numframes - 1)); - VectorAdd(starttransformed, maxs, starttransformedmaxs); - VectorAdd(endtransformed, maxs, endtransformedmaxs); - VectorAdd(starttransformed, mins, starttransformedmins); - VectorAdd(endtransformed, mins, endtransformedmins); - model->TraceBox(model, frame, &trace, starttransformedmins, starttransformedmaxs, endtransformedmins, endtransformedmaxs, hitsupercontents); + model->TraceBox(model, frame, &trace, starttransformed, mins, maxs, endtransformed, hitsupercontents); } else - Collision_ClipTrace_Box(&trace, ent->fields.server->mins, ent->fields.server->maxs, starttransformed, mins, maxs, endtransformed, hitsupercontents, SUPERCONTENTS_SOLID); + Collision_ClipTrace_Box(&trace, ent->fields.server->mins, ent->fields.server->maxs, starttransformed, mins, maxs, endtransformed, hitsupercontents, ent->fields.server->solid == SOLID_CORPSE ? SUPERCONTENTS_CORPSE : SUPERCONTENTS_BODY, 0, NULL); trace.fraction = bound(0, trace.fraction, 1); trace.realfraction = bound(0, trace.realfraction, 1); @@ -527,14 +501,9 @@ SV_ClipMoveToWorld trace_t SV_ClipMoveToWorld(const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int movetype, int hitsupercontents) { trace_t trace; - float starttransformedmins[3], starttransformedmaxs[3], endtransformedmins[3], endtransformedmaxs[3]; memset(&trace, 0, sizeof(trace)); trace.fraction = trace.realfraction = 1; - VectorAdd(start, maxs, starttransformedmaxs); - VectorAdd(end, maxs, endtransformedmaxs); - VectorAdd(start, mins, starttransformedmins); - VectorAdd(end, mins, endtransformedmins); - sv.worldmodel->TraceBox(sv.worldmodel, 0, &trace, starttransformedmins, starttransformedmaxs, endtransformedmins, endtransformedmaxs, hitsupercontents); + sv.worldmodel->TraceBox(sv.worldmodel, 0, &trace, start, mins, maxs, end, hitsupercontents); trace.fraction = bound(0, trace.fraction, 1); trace.realfraction = bound(0, trace.realfraction, 1); VectorLerp(start, trace.fraction, end, trace.endpos); @@ -560,6 +529,7 @@ trace_t SV_Move(const vec3_t start, const vec3_t mins, const vec3_t maxs, const int passedictprog; qboolean pointtrace; prvm_edict_t *traceowner, *touch; + prvm_eval_t *val; trace_t trace; // bounding box of entire move area vec3_t clipboxmins, clipboxmaxs; @@ -584,17 +554,29 @@ 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->fields.server->solid == SOLID_SLIDEBOX) - hitsupercontentsmask |= SUPERCONTENTS_PLAYERCLIP; - if ((int)passedict->fields.server->flags & FL_MONSTER) - hitsupercontentsmask |= SUPERCONTENTS_MONSTERCLIP; + val = PRVM_GETEDICTFIELDVALUE(passedict, eval_dphitcontentsmask); + if (val && val->_float) + hitsupercontentsmask = (int)val->_float; + else if (passedict->fields.server->solid == SOLID_SLIDEBOX) + { + if ((int)passedict->fields.server->flags & FL_MONSTER) + hitsupercontentsmask = SUPERCONTENTS_SOLID | SUPERCONTENTS_BODY | SUPERCONTENTS_MONSTERCLIP; + else + hitsupercontentsmask = SUPERCONTENTS_SOLID | SUPERCONTENTS_BODY | SUPERCONTENTS_PLAYERCLIP; + } + else if (passedict->fields.server->solid == SOLID_CORPSE) + hitsupercontentsmask = SUPERCONTENTS_SOLID | SUPERCONTENTS_BODY; + else + hitsupercontentsmask = SUPERCONTENTS_SOLID | SUPERCONTENTS_BODY | SUPERCONTENTS_CORPSE; } + else + hitsupercontentsmask = SUPERCONTENTS_SOLID | SUPERCONTENTS_BODY | SUPERCONTENTS_CORPSE; // clip to world cliptrace = SV_ClipMoveToWorld(clipstart, clipmins, clipmaxs, clipend, type, hitsupercontentsmask); + cliptrace.startsolid = cliptrace.bmodelstartsolid; if (cliptrace.startsolid || cliptrace.fraction < 1) cliptrace.ent = prog->edicts; if (type == MOVE_WORLDONLY) @@ -674,12 +656,6 @@ trace_t SV_Move(const vec3_t start, const vec3_t mins, const vec3_t maxs, const // don't clip points against points (they can't collide) if (pointtrace && VectorCompare(touch->fields.server->mins, touch->fields.server->maxs) && (type != MOVE_MISSILE || !((int)touch->fields.server->flags & FL_MONSTER))) continue; - // don't clip corpse against character - if (passedict->fields.server->solid == SOLID_CORPSE && (touch->fields.server->solid == SOLID_SLIDEBOX || touch->fields.server->solid == SOLID_CORPSE)) - continue; - // don't clip character against corpse - if (passedict->fields.server->solid == SOLID_SLIDEBOX && touch->fields.server->solid == SOLID_CORPSE) - continue; } // might interact, so do an exact clip @@ -692,6 +668,8 @@ trace_t SV_Move(const vec3_t start, const vec3_t mins, const vec3_t maxs, const cliptrace.allsolid = true; if (trace.startsolid) { + if (touch->fields.server->solid == SOLID_BSP) + cliptrace.bmodelstartsolid = true; cliptrace.startsolid = true; if (cliptrace.realfraction == 1) cliptrace.ent = touch; @@ -710,6 +688,9 @@ trace_t SV_Move(const vec3_t start, const vec3_t mins, const vec3_t maxs, const VectorCopy(trace.endpos, cliptrace.endpos); cliptrace.plane = trace.plane; cliptrace.ent = touch; + cliptrace.hitsupercontents = trace.hitsupercontents; + cliptrace.hitq3surfaceflags = trace.hitq3surfaceflags; + cliptrace.hittexture = trace.hittexture; } cliptrace.startsupercontents |= trace.startsupercontents; }