That should make NQ physics (sv_nomsec 1) work a bit better. And yeah, slide works now, though QuakeRally seems to have too much gravity on slopes.
git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@236 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
parent
7b411a7abe
commit
527e3ee7a0
2 changed files with 91 additions and 54 deletions
|
@ -210,33 +210,22 @@ returns the blocked flags (1 = floor, 2 = step / wall)
|
|||
==================
|
||||
*/
|
||||
#define STOP_EPSILON 0.1
|
||||
|
||||
int ClipVelocity (vec3_t in, vec3_t normal, vec3_t out, float overbounce)
|
||||
//courtesy of darkplaces, it's just more efficient.
|
||||
void ClipVelocity (vec3_t in, vec3_t normal, vec3_t out, float overbounce)
|
||||
{
|
||||
float backoff;
|
||||
float change;
|
||||
int i, blocked;
|
||||
|
||||
blocked = 0;
|
||||
if (normal[2] > 0)
|
||||
blocked |= 1; // floor
|
||||
if (!normal[2])
|
||||
blocked |= 2; // step
|
||||
|
||||
backoff = DotProduct (in, normal) * overbounce;
|
||||
int i;
|
||||
float backoff;
|
||||
|
||||
for (i=0 ; i<3 ; i++)
|
||||
{
|
||||
change = normal[i]*backoff;
|
||||
out[i] = in[i] - change;
|
||||
backoff = -DotProduct (in, normal) * overbounce;
|
||||
VectorMA(in, backoff, normal, out);
|
||||
|
||||
for (i = 0;i < 3;i++)
|
||||
if (out[i] > -STOP_EPSILON && out[i] < STOP_EPSILON)
|
||||
out[i] = 0;
|
||||
}
|
||||
|
||||
return blocked;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
============
|
||||
SV_FlyMove
|
||||
|
@ -332,40 +321,49 @@ int SV_FlyMove (edict_t *ent, float time, trace_t *steptrace)
|
|||
return 3;
|
||||
}
|
||||
|
||||
VectorCopy (trace.plane.normal, planes[numplanes]);
|
||||
numplanes++;
|
||||
|
||||
//
|
||||
// modify original_velocity so it parallels all of the clip planes
|
||||
//
|
||||
for (i=0 ; i<numplanes ; i++)
|
||||
if (1)
|
||||
{
|
||||
ClipVelocity (original_velocity, planes[i], new_velocity, 1);
|
||||
for (j=0 ; j<numplanes ; j++)
|
||||
if (j != i)
|
||||
{
|
||||
if (DotProduct (new_velocity, planes[j]) < 0)
|
||||
break; // not ok
|
||||
}
|
||||
if (j == numplanes)
|
||||
break;
|
||||
}
|
||||
|
||||
if (i != numplanes)
|
||||
{ // go along this plane
|
||||
VectorCopy (new_velocity, ent->v.velocity);
|
||||
ClipVelocity(ent->v.velocity, trace.plane.normal, ent->v.velocity, 1);
|
||||
break;
|
||||
}
|
||||
else
|
||||
{ // go along the crease
|
||||
if (numplanes != 2)
|
||||
{
|
||||
VectorCopy (trace.plane.normal, planes[numplanes]);
|
||||
numplanes++;
|
||||
|
||||
//
|
||||
// modify original_velocity so it parallels all of the clip planes
|
||||
//
|
||||
for (i=0 ; i<numplanes ; i++)
|
||||
{
|
||||
// Con_Printf ("clip velocity, numplanes == %i\n",numplanes);
|
||||
VectorCopy (vec3_origin, ent->v.velocity);
|
||||
return 7;
|
||||
ClipVelocity (original_velocity, planes[i], new_velocity, 1);
|
||||
for (j=0 ; j<numplanes ; j++)
|
||||
if (j != i)
|
||||
{
|
||||
if (DotProduct (new_velocity, planes[j]) < 0)
|
||||
break; // not ok
|
||||
}
|
||||
if (j == numplanes)
|
||||
break;
|
||||
}
|
||||
|
||||
if (i != numplanes)
|
||||
{ // go along this plane
|
||||
VectorCopy (new_velocity, ent->v.velocity);
|
||||
}
|
||||
else
|
||||
{ // go along the crease
|
||||
if (numplanes != 2)
|
||||
{
|
||||
Con_Printf ("clip velocity, numplanes == %i\n",numplanes);
|
||||
VectorCopy (vec3_origin, ent->v.velocity);
|
||||
return 7;
|
||||
}
|
||||
CrossProduct (planes[0], planes[1], dir);
|
||||
VectorNormalize(dir); //fixes slow falling in corners
|
||||
d = DotProduct (dir, ent->v.velocity);
|
||||
VectorScale (dir, d, ent->v.velocity);
|
||||
}
|
||||
CrossProduct (planes[0], planes[1], dir);
|
||||
d = DotProduct (dir, ent->v.velocity);
|
||||
VectorScale (dir, d, ent->v.velocity);
|
||||
}
|
||||
|
||||
//
|
||||
|
@ -1334,6 +1332,8 @@ void SV_WalkMove (edict_t *ent)
|
|||
&& fabs(oldorg[0] - ent->v.origin[0]) < 0.03125 )
|
||||
{ // stepping up didn't make any progress
|
||||
clip = SV_TryUnstick (ent, oldvel);
|
||||
|
||||
// Con_Printf("Try unstick fwd\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1341,6 +1341,9 @@ void SV_WalkMove (edict_t *ent)
|
|||
if ( clip & 2 )
|
||||
{
|
||||
vec3_t lastpos, lastvel, lastdown;
|
||||
|
||||
// Con_Printf("couldn't do it\n");
|
||||
|
||||
//retry with a smaller step (allows entering smaller areas with a step of 4)
|
||||
VectorCopy (downmove, lastdown);
|
||||
VectorCopy (ent->v.origin, lastpos);
|
||||
|
@ -1373,6 +1376,8 @@ void SV_WalkMove (edict_t *ent)
|
|||
&& fabs(oldorg[0] - ent->v.origin[0]) < 0.03125 )
|
||||
{ // stepping up didn't make any progress
|
||||
clip = SV_TryUnstick (ent, oldvel);
|
||||
|
||||
// Con_Printf("Try unstick up\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1384,10 +1389,15 @@ void SV_WalkMove (edict_t *ent)
|
|||
VectorCopy (lastvel, ent->v.velocity);
|
||||
|
||||
SV_WallFriction (ent, &steptrace);
|
||||
|
||||
// Con_Printf("wall friction\n");
|
||||
}
|
||||
|
||||
else if (clip & 2)
|
||||
{
|
||||
SV_WallFriction (ent, &steptrace);
|
||||
// Con_Printf("wall friction 2\n");
|
||||
}
|
||||
}
|
||||
|
||||
// move down
|
||||
|
@ -1408,6 +1418,8 @@ void SV_WalkMove (edict_t *ent)
|
|||
// cause the player to hop up higher on a slope too steep to climb
|
||||
VectorCopy (nosteporg, ent->v.origin);
|
||||
VectorCopy (nostepvel, ent->v.velocity);
|
||||
|
||||
// Con_Printf("down not good\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1427,6 +1439,7 @@ From normal Quake in an attempt to fix physics in QuakeRally
|
|||
void SV_Physics_Client (edict_t *ent, int num)
|
||||
{
|
||||
qboolean readyforjump;
|
||||
float oldvel;
|
||||
|
||||
if ( svs.clients[num-1].state < cs_spawned )
|
||||
return; // unconnected slot
|
||||
|
@ -1464,14 +1477,25 @@ void SV_Physics_Client (edict_t *ent, int num)
|
|||
break;
|
||||
|
||||
case MOVETYPE_WALK:
|
||||
oldvel = ent->v.velocity[0];
|
||||
if (!SV_RunThink (ent))
|
||||
return;
|
||||
if (!SV_CheckWater (ent) && ! ((int)ent->v.flags & FL_WATERJUMP) )
|
||||
SV_AddGravity (ent, ent->v.gravity);
|
||||
|
||||
if (fabs(oldvel - ent->v.velocity[0])> 100)
|
||||
Con_Printf("grav: %f -> %f\n", oldvel, ent->v.velocity[0]);
|
||||
|
||||
SV_CheckStuck (ent);
|
||||
|
||||
if (fabs(oldvel - ent->v.velocity[0])> 100)
|
||||
Con_Printf("stuck: %f -> %f\n", oldvel, ent->v.velocity[0]);
|
||||
|
||||
SV_WalkMove (ent);
|
||||
|
||||
if (fabs(oldvel - ent->v.velocity[0])> 100)
|
||||
Con_Printf("walk: %f -> %f\n", oldvel, ent->v.velocity[0]);
|
||||
|
||||
break;
|
||||
|
||||
case MOVETYPE_TOSS:
|
||||
|
@ -1671,6 +1695,19 @@ qboolean SV_Physics (void)
|
|||
|
||||
pr_global_struct->frametime = host_frametime;
|
||||
|
||||
for (i = 0; i < sv.allocated_client_slots; i++)
|
||||
{
|
||||
host_client = &svs.clients[i];
|
||||
if (host_client->state == cs_spawned)
|
||||
if (sv_nomsec.value || SV_PlayerPhysicsQC
|
||||
#ifndef NQPROT
|
||||
)
|
||||
#else
|
||||
|| (host_client->nqprot))
|
||||
#endif
|
||||
SV_ClientThink();
|
||||
}
|
||||
|
||||
SV_ProgStartFrame ();
|
||||
|
||||
PR_RunThreads();
|
||||
|
|
|
@ -3914,9 +3914,6 @@ haveannothergo:
|
|||
sv_player->v.button0 = newcmd.buttons & 1;
|
||||
sv_player->v.button2 = (newcmd.buttons & 2)>>1;
|
||||
|
||||
cmd = newcmd;
|
||||
SV_ClientThink ();
|
||||
|
||||
cl->lastcmd = newcmd;
|
||||
cl->lastcmd.buttons = 0; // avoid multiple fires on lag
|
||||
continue;
|
||||
|
@ -4104,7 +4101,7 @@ void SVQ2_ExecuteClientMessage (client_t *cl)
|
|||
|
||||
if (!sv.paused)
|
||||
{
|
||||
if (sv_nomsec.value)
|
||||
/*if (sv_nomsec.value)
|
||||
{
|
||||
cmd = newcmd;
|
||||
SV_ClientThink ();
|
||||
|
@ -4112,7 +4109,7 @@ void SVQ2_ExecuteClientMessage (client_t *cl)
|
|||
cl->lastcmd = newcmd;
|
||||
cl->lastcmd.buttons = 0; // avoid multiple fires on lag
|
||||
break;
|
||||
}
|
||||
}*/
|
||||
SV_PreRunCmd();
|
||||
|
||||
if (net_drop < 20)
|
||||
|
@ -4603,6 +4600,9 @@ void SV_ClientThink (void)
|
|||
{
|
||||
vec3_t v_angle;
|
||||
|
||||
cmd = host_client->lastcmd;
|
||||
sv_player = host_client->edict;
|
||||
|
||||
sv_player->v.movement[0] = cmd.forwardmove;
|
||||
sv_player->v.movement[1] = cmd.sidemove;
|
||||
sv_player->v.movement[2] = cmd.upmove;
|
||||
|
|
Loading…
Reference in a new issue