X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=sv_phys.c;h=7558be896a987111e13bffa2f26f8f174138c480;hp=6c9d2db7cb34d12fe765139734133c6e156fff30;hb=1b94bbb1a2eb689286a262ffa1baee2ae635250a;hpb=4e402f83fc7aa1989f298c38847661bdf6d7883d diff --git a/sv_phys.c b/sv_phys.c index 6c9d2db7..7558be89 100644 --- a/sv_phys.c +++ b/sv_phys.c @@ -121,7 +121,7 @@ trace_t SV_TracePoint(const vec3_t start, int type, prvm_edict_t *passedict, int dp_model_t *model; // list of entities to test for collisions int numtouchedicts; - prvm_edict_t *touchedicts[MAX_EDICTS]; + static prvm_edict_t *touchedicts[MAX_EDICTS]; //return SV_TraceBox(start, vec3_origin, vec3_origin, end, type, passedict, hitsupercontentsmask); @@ -266,27 +266,30 @@ trace_t SV_TraceLine(const vec3_t start, const vec3_t end, int type, prvm_edict_ dp_model_t *model; // list of entities to test for collisions int numtouchedicts; - prvm_edict_t *touchedicts[MAX_EDICTS]; + static prvm_edict_t *touchedicts[MAX_EDICTS]; #ifdef COLLISION_STUPID_TRACE_ENDPOS_IN_SOLID_WORKAROUND vec3_t end; vec_t len = 0; - if(!VectorCompare(start, pEnd)) + if (VectorCompare(start, pEnd)) + return SV_TracePoint(start, type, passedict, hitsupercontentsmask); + + if(collision_endposnudge.value > 0) { // TRICK: make the trace 1 qu longer! VectorSubtract(pEnd, start, end); len = VectorNormalizeLength(end); - VectorAdd(pEnd, end, end); + VectorMA(pEnd, collision_endposnudge.value, end, end); } else VectorCopy(pEnd, end); +#else + if (VectorCompare(start, end)) + return SV_TracePoint(start, type, passedict, hitsupercontentsmask); #endif //return SV_TraceBox(start, vec3_origin, vec3_origin, end, type, passedict, hitsupercontentsmask); - if (VectorCompare(start, end)) - return SV_TracePoint(start, type, passedict, hitsupercontentsmask); - VectorCopy(start, clipstart); VectorCopy(end, clipend); VectorClear(clipmins2); @@ -296,7 +299,7 @@ trace_t SV_TraceLine(const vec3_t start, const vec3_t end, int type, prvm_edict_ #endif // clip to world - Collision_ClipLineToWorld(&cliptrace, sv.worldmodel, clipstart, clipend, hitsupercontentsmask); + Collision_ClipLineToWorld(&cliptrace, sv.worldmodel, clipstart, clipend, hitsupercontentsmask, false); cliptrace.bmodelstartsolid = cliptrace.startsolid; if (cliptrace.startsolid || cliptrace.fraction < 1) cliptrace.ent = prog->edicts; @@ -390,15 +393,15 @@ trace_t SV_TraceLine(const vec3_t start, const vec3_t end, int type, prvm_edict_ if (type == MOVE_MISSILE && (int)touch->fields.server->flags & FL_MONSTER) Collision_ClipToGenericEntity(&trace, model, touch->priv.server->frameblend, &touch->priv.server->skeleton, touch->fields.server->mins, touch->fields.server->maxs, bodysupercontents, &matrix, &imatrix, clipstart, clipmins2, clipmaxs2, clipend, hitsupercontentsmask); else - Collision_ClipLineToGenericEntity(&trace, model, touch->priv.server->frameblend, &touch->priv.server->skeleton, touch->fields.server->mins, touch->fields.server->maxs, bodysupercontents, &matrix, &imatrix, clipstart, clipend, hitsupercontentsmask); + Collision_ClipLineToGenericEntity(&trace, model, touch->priv.server->frameblend, &touch->priv.server->skeleton, touch->fields.server->mins, touch->fields.server->maxs, bodysupercontents, &matrix, &imatrix, clipstart, clipend, hitsupercontentsmask, false); Collision_CombineTraces(&cliptrace, &trace, (void *)touch, touch->fields.server->solid == SOLID_BSP); } finished: #ifdef COLLISION_STUPID_TRACE_ENDPOS_IN_SOLID_WORKAROUND - if(!VectorCompare(start, pEnd)) - Collision_ShortenTrace(&cliptrace, len / (len + 1), pEnd); + if(!VectorCompare(start, pEnd) && collision_endposnudge.value > 0) + Collision_ShortenTrace(&cliptrace, len / (len + collision_endposnudge.value), pEnd); #endif return cliptrace; } @@ -445,22 +448,34 @@ trace_t SV_TraceBox(const vec3_t start, const vec3_t mins, const vec3_t maxs, co dp_model_t *model; // list of entities to test for collisions int numtouchedicts; - prvm_edict_t *touchedicts[MAX_EDICTS]; + static prvm_edict_t *touchedicts[MAX_EDICTS]; #ifdef COLLISION_STUPID_TRACE_ENDPOS_IN_SOLID_WORKAROUND vec3_t end; vec_t len = 0; - if(!VectorCompare(start, pEnd)) + if (VectorCompare(mins, maxs)) + { + vec3_t shiftstart, shiftend; + VectorAdd(start, mins, shiftstart); + VectorAdd(pEnd, mins, shiftend); + if (VectorCompare(start, pEnd)) + trace = SV_TracePoint(shiftstart, type, passedict, hitsupercontentsmask); + else + trace = SV_TraceLine(shiftstart, shiftend, type, passedict, hitsupercontentsmask); + VectorSubtract(trace.endpos, mins, trace.endpos); + return trace; + } + + if(!VectorCompare(start, pEnd) && collision_endposnudge.value > 0) { // TRICK: make the trace 1 qu longer! VectorSubtract(pEnd, start, end); len = VectorNormalizeLength(end); - VectorAdd(pEnd, end, end); + VectorMA(pEnd, collision_endposnudge.value, end, end); } else VectorCopy(pEnd, end); -#endif - +#else if (VectorCompare(mins, maxs)) { vec3_t shiftstart, shiftend; @@ -473,6 +488,7 @@ trace_t SV_TraceBox(const vec3_t start, const vec3_t mins, const vec3_t maxs, co VectorSubtract(trace.endpos, mins, trace.endpos); return trace; } +#endif VectorCopy(start, clipstart); VectorCopy(end, clipend); @@ -597,8 +613,8 @@ trace_t SV_TraceBox(const vec3_t start, const vec3_t mins, const vec3_t maxs, co finished: #ifdef COLLISION_STUPID_TRACE_ENDPOS_IN_SOLID_WORKAROUND - if(!VectorCompare(start, pEnd)) - Collision_ShortenTrace(&cliptrace, len / (len + 1), pEnd); + if(!VectorCompare(start, pEnd) && collision_endposnudge.value > 0) + Collision_ShortenTrace(&cliptrace, len / (len + collision_endposnudge.value), pEnd); #endif return cliptrace; } @@ -636,7 +652,7 @@ int SV_PointSuperContents(const vec3_t point) int frame; // list of entities to test for collisions int numtouchedicts; - prvm_edict_t *touchedicts[MAX_EDICTS]; + static prvm_edict_t *touchedicts[MAX_EDICTS]; // get world supercontents at this point if (sv.worldmodel && sv.worldmodel->PointSuperContents) @@ -713,7 +729,8 @@ void SV_LinkEdict_TouchAreaGrid_Call(prvm_edict_t *touch, prvm_edict_t *ent) void SV_LinkEdict_TouchAreaGrid(prvm_edict_t *ent) { int i, numtouchedicts, old_self, old_other; - prvm_edict_t *touch, *touchedicts[MAX_EDICTS]; + prvm_edict_t *touch; + static prvm_edict_t *touchedicts[MAX_EDICTS]; if (ent == prog->edicts) return; // don't add the world @@ -823,8 +840,8 @@ void SV_LinkEdict (prvm_edict_t *ent) { if (model != NULL) { - if (!model->TraceBox && developer.integer >= 1) - Con_Printf("edict %i: SOLID_BSP with non-collidable model\n", PRVM_NUM_FOR_EDICT(ent)); + if (!model->TraceBox) + Con_DPrintf("edict %i: SOLID_BSP with non-collidable model\n", PRVM_NUM_FOR_EDICT(ent)); if (ent->fields.server->angles[0] || ent->fields.server->angles[2] || ent->fields.server->avelocity[0] || ent->fields.server->avelocity[2]) { @@ -1111,16 +1128,14 @@ qboolean SV_RunThink (prvm_edict_t *ent) SV_Impact Two entities have touched, so run their touch functions -returns true if the impact kept the origin of the touching entity intact ================== */ extern void VM_SetTraceGlobals(const trace_t *trace); extern sizebuf_t vm_tempstringsbuf; -qboolean SV_Impact (prvm_edict_t *e1, trace_t *trace) +void SV_Impact (prvm_edict_t *e1, trace_t *trace) { int restorevm_tempstringsbuf_cursize; int old_self, old_other; - vec3_t org; prvm_edict_t *e2 = (prvm_edict_t *)trace->ent; prvm_eval_t *val; @@ -1128,8 +1143,6 @@ qboolean SV_Impact (prvm_edict_t *e1, trace_t *trace) old_other = prog->globals.server->other; restorevm_tempstringsbuf_cursize = vm_tempstringsbuf.cursize; - VectorCopy(e1->fields.server->origin, org); - VM_SetTraceGlobals(trace); prog->globals.server->time = sv.time; @@ -1162,8 +1175,6 @@ qboolean SV_Impact (prvm_edict_t *e1, trace_t *trace) prog->globals.server->self = old_self; prog->globals.server->other = old_other; vm_tempstringsbuf.cursize = restorevm_tempstringsbuf_cursize; - - return VectorCompare(e1->fields.server->origin, org); } @@ -1206,7 +1217,7 @@ If stepnormal is not NULL, the plane normal of any vertical wall hit will be sto static float SV_Gravity (prvm_edict_t *ent); static qboolean SV_PushEntity (trace_t *trace, prvm_edict_t *ent, vec3_t push, qboolean failonbmodelstartsolid, qboolean dolink); #define MAX_CLIP_PLANES 5 -static int SV_FlyMove (prvm_edict_t *ent, float time, qboolean applygravity, float *stepnormal, int hitsupercontentsmask) +static int SV_FlyMove (prvm_edict_t *ent, float time, qboolean applygravity, float *stepnormal, int hitsupercontentsmask, float stepheight) { int blocked, bumpcount; int i, j, numplanes; @@ -1219,6 +1230,11 @@ static int SV_FlyMove (prvm_edict_t *ent, float time, qboolean applygravity, flo if (time <= 0) return 0; gravity = 0; + + if(sv_gameplayfix_nogravityonground.integer) + if((int)ent->fields.server->flags & FL_ONGROUND) + applygravity = false; + if (applygravity) { if (sv_gameplayfix_gravityunaffectedbyticrate.integer) @@ -1243,9 +1259,6 @@ static int SV_FlyMove (prvm_edict_t *ent, float time, qboolean applygravity, flo break; VectorScale(ent->fields.server->velocity, time_left, push); -#if 0 - VectorAdd(ent->fields.server->origin, push, end); -#endif if(!SV_PushEntity(&trace, ent, push, false, false)) { // we got teleported by a touch function @@ -1254,64 +1267,6 @@ static int SV_FlyMove (prvm_edict_t *ent, float time, qboolean applygravity, flo break; } -#if 0 - //if (trace.fraction < 0.002) - { -#if 1 - vec3_t start; - trace_t testtrace; - VectorCopy(ent->fields.server->origin, start); - start[2] += 3;//0.03125; - VectorMA(ent->fields.server->origin, time_left, ent->fields.server->velocity, end); - end[2] += 3;//0.03125; - testtrace = SV_TraceBox(start, ent->fields.server->mins, ent->fields.server->maxs, end, MOVE_NORMAL, ent, hitsupercontentsmask); - if (trace.fraction < testtrace.fraction && !testtrace.startsolid && (testtrace.fraction == 1 || DotProduct(trace.plane.normal, ent->fields.server->velocity) < DotProduct(testtrace.plane.normal, ent->fields.server->velocity))) - { - Con_Printf("got further (new %f > old %f)\n", testtrace.fraction, trace.fraction); - trace = testtrace; - } -#endif -#if 0 - //j = -1; - for (i = 0;i < numplanes;i++) - { - VectorCopy(ent->fields.server->origin, start); - VectorMA(ent->fields.server->origin, time_left, ent->fields.server->velocity, end); - VectorMA(start, 3, planes[i], start); - VectorMA(end, 3, planes[i], end); - testtrace = SV_TraceBox(start, ent->fields.server->mins, ent->fields.server->maxs, end, MOVE_NORMAL, ent, hitsupercontentsmask); - if (trace.fraction < testtrace.fraction) - { - trace = testtrace; - VectorCopy(start, ent->fields.server->origin); - //j = i; - } - } - //if (j >= 0) - // VectorAdd(ent->fields.server->origin, planes[j], start); -#endif - } -#endif - -#if 0 - Con_Printf("entity %i bump %i: velocity %f %f %f trace %f", ent - prog->edicts, bumpcount, ent->fields.server->velocity[0], ent->fields.server->velocity[1], ent->fields.server->velocity[2], trace.fraction); - if (trace.fraction < 1) - Con_Printf(" : %f %f %f", trace.plane.normal[0], trace.plane.normal[1], trace.plane.normal[2]); - Con_Print("\n"); -#endif - -#if 0 - if (trace.bmodelstartsolid) - { - // LordHavoc: note: this code is what makes entities stick in place - // if embedded in world only (you can walk through other objects if - // stuck) - // entity is trapped in another solid - VectorClear(ent->fields.server->velocity); - return 3; - } -#endif - if (trace.fraction == 1) break; if (trace.plane.normal[2]) @@ -1331,9 +1286,55 @@ static int SV_FlyMove (prvm_edict_t *ent, float time, qboolean applygravity, flo ent->fields.server->groundentity = PRVM_EDICT_TO_PROG(trace.ent); } } + else if (stepheight) + { + // step - handle it immediately + vec3_t org; + vec3_t steppush; + trace_t steptrace; + trace_t steptrace2; + trace_t steptrace3; + //Con_Printf("step %f %f %f : ", ent->fields.server->origin[0], ent->fields.server->origin[1], ent->fields.server->origin[2]); + VectorSet(steppush, 0, 0, stepheight); + VectorCopy(ent->fields.server->origin, org); + if(!SV_PushEntity(&steptrace, ent, steppush, false, false)) + { + blocked |= 8; + break; + } + //Con_Printf("%f %f %f : ", ent->fields.server->origin[0], ent->fields.server->origin[1], ent->fields.server->origin[2]); + if(!SV_PushEntity(&steptrace2, ent, push, false, false)) + { + blocked |= 8; + break; + } + //Con_Printf("%f %f %f : ", ent->fields.server->origin[0], ent->fields.server->origin[1], ent->fields.server->origin[2]); + VectorSet(steppush, 0, 0, org[2] - ent->fields.server->origin[2]); + if(!SV_PushEntity(&steptrace3, ent, steppush, false, false)) + { + blocked |= 8; + break; + } + //Con_Printf("%f %f %f : ", ent->fields.server->origin[0], ent->fields.server->origin[1], ent->fields.server->origin[2]); + // accept the new position if it made some progress... + if (fabs(ent->fields.server->origin[0] - org[0]) >= 0.03125 || fabs(ent->fields.server->origin[1] - org[1]) >= 0.03125) + { + //Con_Printf("accepted (delta %f %f %f)\n", ent->fields.server->origin[0] - org[0], ent->fields.server->origin[1] - org[1], ent->fields.server->origin[2] - org[2]); + trace = steptrace2; + VectorCopy(ent->fields.server->origin, trace.endpos); + time_left *= 1 - trace.fraction; + numplanes = 0; + continue; + } + else + { + //Con_Printf("REJECTED (delta %f %f %f)\n", ent->fields.server->origin[0] - org[0], ent->fields.server->origin[1] - org[1], ent->fields.server->origin[2] - org[2]); + VectorCopy(org, ent->fields.server->origin); + } + } else { - // step + // step - return it to caller blocked |= 2; // save the trace for player extrafriction if (stepnormal) @@ -1371,47 +1372,42 @@ static int SV_FlyMove (prvm_edict_t *ent, float time, qboolean applygravity, flo VectorCopy(trace.plane.normal, planes[numplanes]); numplanes++; - if (sv_newflymove.integer) - ClipVelocity(ent->fields.server->velocity, trace.plane.normal, ent->fields.server->velocity, 1); - else + // modify original_velocity so it parallels all of the clip planes + for (i = 0;i < numplanes;i++) { - // modify original_velocity so it parallels all of the clip planes - for (i = 0;i < numplanes;i++) + ClipVelocity(original_velocity, planes[i], new_velocity, 1); + for (j = 0;j < numplanes;j++) { - ClipVelocity(original_velocity, planes[i], new_velocity, 1); - for (j = 0;j < numplanes;j++) + if (j != i) { - if (j != i) - { - // not ok - if (DotProduct(new_velocity, planes[j]) < 0) - break; - } + // not ok + if (DotProduct(new_velocity, planes[j]) < 0) + break; } - if (j == numplanes) - break; } + if (j == numplanes) + break; + } - if (i != numplanes) - { - // go along this plane - VectorCopy(new_velocity, ent->fields.server->velocity); - } - else + if (i != numplanes) + { + // go along this plane + VectorCopy(new_velocity, ent->fields.server->velocity); + } + else + { + // go along the crease + if (numplanes != 2) { - // go along the crease - if (numplanes != 2) - { - VectorClear(ent->fields.server->velocity); - blocked = 7; - break; - } - CrossProduct(planes[0], planes[1], dir); - // LordHavoc: thanks to taniwha of QuakeForge for pointing out this fix for slowed falling in corners - VectorNormalize(dir); - d = DotProduct(dir, ent->fields.server->velocity); - VectorScale(dir, d, ent->fields.server->velocity); + VectorClear(ent->fields.server->velocity); + blocked = 7; + break; } + CrossProduct(planes[0], planes[1], dir); + // LordHavoc: thanks to taniwha of QuakeForge for pointing out this fix for slowed falling in corners + VectorNormalize(dir); + d = DotProduct(dir, ent->fields.server->velocity); + VectorScale(dir, d, ent->fields.server->velocity); } // if current velocity is against the original velocity, @@ -1483,7 +1479,7 @@ static qboolean SV_PushEntity (trace_t *trace, prvm_edict_t *ent, vec3_t push, q { int type; int bump; - vec3_t original; + vec3_t original, original_velocity; vec3_t end; VectorCopy(ent->fields.server->origin, original); @@ -1498,7 +1494,7 @@ static qboolean SV_PushEntity (trace_t *trace, prvm_edict_t *ent, vec3_t push, q *trace = SV_TraceBox(ent->fields.server->origin, ent->fields.server->mins, ent->fields.server->maxs, end, type, ent, SV_GenericHitSuperContentsMask(ent)); bump = 0; - while (trace->startsolid && sv_gameplayfix_nudgeoutofsolid.integer) + while (trace->bmodelstartsolid && sv_gameplayfix_nudgeoutofsolid.integer) { vec_t nudge = -trace->startdepth + sv_gameplayfix_nudgeoutofsolid_bias.value; VectorMA(ent->fields.server->origin, nudge, trace->startdepthnormal, ent->fields.server->origin); @@ -1513,8 +1509,11 @@ static qboolean SV_PushEntity (trace_t *trace, prvm_edict_t *ent, vec3_t push, q if (trace->bmodelstartsolid && failonbmodelstartsolid) return true; - VectorCopy (trace->endpos, ent->fields.server->origin); + + VectorCopy(ent->fields.server->origin, original); + VectorCopy(ent->fields.server->velocity, original_velocity); + SV_LinkEdict(ent); #if 0 @@ -1529,9 +1528,9 @@ static qboolean SV_PushEntity (trace_t *trace, prvm_edict_t *ent, vec3_t push, q SV_LinkEdict_TouchAreaGrid(ent); if((ent->fields.server->solid >= SOLID_TRIGGER && trace->ent && (!((int)ent->fields.server->flags & FL_ONGROUND) || ent->fields.server->groundentity != PRVM_EDICT_TO_PROG(trace->ent)))) - return SV_Impact (ent, trace); + SV_Impact (ent, trace); - return true; + return VectorCompare(ent->fields.server->origin, original) && VectorCompare(ent->fields.server->velocity, original_velocity); } @@ -1555,7 +1554,7 @@ void SV_PushMove (prvm_edict_t *pusher, float movetime) dp_model_t *pushermodel; trace_t trace, trace2; matrix4x4_t pusherfinalmatrix, pusherfinalimatrix; - unsigned short moved_edicts[MAX_EDICTS]; + static unsigned short moved_edicts[MAX_EDICTS]; if (!pusher->fields.server->velocity[0] && !pusher->fields.server->velocity[1] && !pusher->fields.server->velocity[2] && !pusher->fields.server->avelocity[0] && !pusher->fields.server->avelocity[1] && !pusher->fields.server->avelocity[2]) { @@ -1967,8 +1966,8 @@ qboolean SV_UnstickEntity (prvm_edict_t *ent) Con_DPrintf("Unstuck entity %i (classname \"%s\") with offset %f %f %f.\n", (int)PRVM_EDICT_TO_PROG(ent), PRVM_GetString(ent->fields.server->classname), offset[0], offset[1], offset[2]); return true; case UNSTICK_STUCK: - if (developer.integer >= 100) - Con_Printf("Stuck entity %i (classname \"%s\").\n", (int)PRVM_EDICT_TO_PROG(ent), PRVM_GetString(ent->fields.server->classname)); + if (developer_extra.integer) + Con_DPrintf("Stuck entity %i (classname \"%s\").\n", (int)PRVM_EDICT_TO_PROG(ent), PRVM_GetString(ent->fields.server->classname)); return false; default: Con_Printf("SV_UnstickEntityReturnOffset returned a value outside its enum.\n"); @@ -2157,7 +2156,13 @@ Only used by players */ void SV_WalkMove (prvm_edict_t *ent) { - int clip, oldonground, originalmove_clip, originalmove_flags, originalmove_groundentity, hitsupercontentsmask; + int clip; + int oldonground; + //int originalmove_clip; + int originalmove_flags; + int originalmove_groundentity; + int hitsupercontentsmask; + int type; vec3_t upmove, downmove, start_origin, start_velocity, stepnormal, originalmove_origin, originalmove_velocity; trace_t downtrace, trace; qboolean applygravity; @@ -2181,10 +2186,29 @@ void SV_WalkMove (prvm_edict_t *ent) VectorCopy (ent->fields.server->origin, start_origin); VectorCopy (ent->fields.server->velocity, start_velocity); - clip = SV_FlyMove (ent, sv.frametime, applygravity, NULL, hitsupercontentsmask); + clip = SV_FlyMove (ent, sv.frametime, applygravity, NULL, hitsupercontentsmask, sv_gameplayfix_stepmultipletimes.integer ? sv_stepheight.value : 0); + + if(sv_gameplayfix_downtracesupportsongroundflag.integer) + if(!(clip & 1)) + { + // only try this if there was no floor in the way in the trace (no, + // this check seems to be not REALLY necessary, because if clip & 1, + // our trace will hit that thing too) + VectorSet(upmove, ent->fields.server->origin[0], ent->fields.server->origin[1], ent->fields.server->origin[2] + 1); + VectorSet(downmove, ent->fields.server->origin[0], ent->fields.server->origin[1], ent->fields.server->origin[2] - 1); + if (ent->fields.server->movetype == MOVETYPE_FLYMISSILE) + type = MOVE_MISSILE; + else if (ent->fields.server->solid == SOLID_TRIGGER || ent->fields.server->solid == SOLID_NOT) + type = MOVE_NOMONSTERS; // only clip against bmodels + else + type = MOVE_NORMAL; + trace = SV_TraceBox(upmove, ent->fields.server->mins, ent->fields.server->maxs, downmove, type, ent, SV_GenericHitSuperContentsMask(ent)); + if(trace.fraction < 1 && trace.plane.normal[2] > 0.7) + clip |= 1; // but we HAVE found a floor + } // if the move did not hit the ground at any point, we're not on ground - if (!(clip & 1)) + if(!(clip & 1)) ent->fields.server->flags = (int)ent->fields.server->flags & ~FL_ONGROUND; SV_CheckVelocity(ent); @@ -2202,7 +2226,7 @@ void SV_WalkMove (prvm_edict_t *ent) VectorCopy(ent->fields.server->origin, originalmove_origin); VectorCopy(ent->fields.server->velocity, originalmove_velocity); - originalmove_clip = clip; + //originalmove_clip = clip; originalmove_flags = (int)ent->fields.server->flags; originalmove_groundentity = ent->fields.server->groundentity; @@ -2241,7 +2265,7 @@ void SV_WalkMove (prvm_edict_t *ent) // move forward ent->fields.server->velocity[2] = 0; - clip = SV_FlyMove (ent, sv.frametime, applygravity, stepnormal, hitsupercontentsmask); + clip = SV_FlyMove (ent, sv.frametime, applygravity, stepnormal, hitsupercontentsmask, 0); ent->fields.server->velocity[2] += start_velocity[2]; if(clip & 8) { @@ -2617,7 +2641,7 @@ void SV_Physics_Step (prvm_edict_t *ent) { ent->fields.server->flags -= FL_ONGROUND; SV_CheckVelocity(ent); - SV_FlyMove(ent, sv.frametime, true, NULL, SV_GenericHitSuperContentsMask(ent)); + SV_FlyMove(ent, sv.frametime, true, NULL, SV_GenericHitSuperContentsMask(ent), 0); SV_LinkEdict(ent); SV_LinkEdict_TouchAreaGrid(ent); ent->priv.server->waterposition_forceupdate = true; @@ -2629,7 +2653,7 @@ void SV_Physics_Step (prvm_edict_t *ent) int hitsound = ent->fields.server->velocity[2] < sv_gravity.value * -0.1; SV_CheckVelocity(ent); - SV_FlyMove(ent, sv.frametime, true, NULL, SV_GenericHitSuperContentsMask(ent)); + SV_FlyMove(ent, sv.frametime, true, NULL, SV_GenericHitSuperContentsMask(ent), 0); SV_LinkEdict(ent); SV_LinkEdict_TouchAreaGrid(ent);