trace = SV_Move (ent->v.origin, ent->v.mins, ent->v.maxs, end, MOVE_NORMAL, ent);
+ /*
if (trace.allsolid)
{ // entity is trapped in another solid
VectorClear(ent->v.velocity);
return 3;
}
+ */
if (trace.fraction > 0)
{ // actually covered some distance
ent->v.angles[1] += trace.fraction * pushangles[1];
SV_LinkEdict (ent, true);
- if (trace.ent)
+ if (trace.ent && (!((int)ent->v.flags & FL_ONGROUND) || ent->v.groundentity != EDICT_TO_PROG(trace.ent)))
SV_Impact (ent, trace.ent);
return trace;
}
case 6: dir[0] = 2; dir[1] = -2; break;
case 7: dir[0] = -2; dir[1] = -2; break;
}
-
+
SV_PushEntity (ent, dir, vec3_origin);
// retry the original move
//
oldonground = (int)ent->v.flags & FL_ONGROUND;
ent->v.flags = (int)ent->v.flags & ~FL_ONGROUND;
-
+
VectorCopy (ent->v.origin, oldorg);
VectorCopy (ent->v.velocity, oldvel);
if (!oldonground && ent->v.waterlevel == 0)
return; // don't stair up while jumping
-
+
if (ent->v.movetype != MOVETYPE_WALK)
return; // gibbed by a trigger
if (sv_nostep.integer)
return;
-
+
if ( (int)sv_player->v.flags & FL_WATERJUMP )
return;
//
// call standard client pre-think
-//
+//
pr_global_struct->time = sv.time;
pr_global_struct->self = EDICT_TO_PROG(ent);
PR_ExecuteProgram (pr_global_struct->PlayerPreThink, "QC function PlayerPreThink is missing");
-
+
//
// do a move
//
SV_CheckStuck (ent);
SV_WalkMove (ent);
break;
-
+
case MOVETYPE_TOSS:
case MOVETYPE_BOUNCE:
SV_Physics_Toss (ent);
SV_CheckWater (ent);
SV_FlyMove (ent, sv.frametime, NULL);
break;
-
+
case MOVETYPE_NOCLIP:
if (!SV_RunThink (ent))
return;
SV_CheckWater (ent);
VectorMA (ent->v.origin, sv.frametime, ent->v.velocity, ent->v.origin);
break;
-
+
default:
Host_Error ("SV_Physics_client: bad movetype %i", (int)ent->v.movetype);
}
//
// call standard player post-think
-//
+//
SV_LinkEdict (ent, true);
pr_global_struct->time = sv.time;
{
trace_t trace;
vec3_t move;
- float backoff;
//edict_t *groundentity;
// regular thinking
if (!SV_RunThink (ent))
if (trace.fraction == 1)
return;
- if (ent->v.movetype == MOVETYPE_BOUNCE)
- backoff = 1.5;
- else if (ent->v.movetype == MOVETYPE_BOUNCEMISSILE)
- backoff = 2.0;
- else
- backoff = 1;
-
- ClipVelocity (ent->v.velocity, trace.plane.normal, ent->v.velocity, backoff);
-
-// stop if on ground
if (ent->v.movetype == MOVETYPE_BOUNCEMISSILE)
+ {
+ ClipVelocity (ent->v.velocity, trace.plane.normal, ent->v.velocity, 2.0);
ent->v.flags = (int)ent->v.flags & ~FL_ONGROUND;
+ }
else if (ent->v.movetype == MOVETYPE_BOUNCE)
{
+ ClipVelocity (ent->v.velocity, trace.plane.normal, ent->v.velocity, 1.5);
// LordHavoc: fixed grenades not bouncing when fired down a slope
if (trace.plane.normal[2] > 0.7 && DotProduct(trace.plane.normal, ent->v.velocity) < 60)
//if (trace.plane.normal[2] > 0.7 && ent->v.velocity[2] < 60)
}
else
{
+ ClipVelocity (ent->v.velocity, trace.plane.normal, ent->v.velocity, 1.0);
if (trace.plane.normal[2] > 0.7)
{
ent->v.flags = (int)ent->v.flags | FL_ONGROUND;
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;
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;
else
clip->trace = trace;
}
+ */
}
// recurse down both sides