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
|
#define STOP_EPSILON 0.1
|
||||||
|
//courtesy of darkplaces, it's just more efficient.
|
||||||
int ClipVelocity (vec3_t in, vec3_t normal, vec3_t out, float overbounce)
|
void ClipVelocity (vec3_t in, vec3_t normal, vec3_t out, float overbounce)
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
float backoff;
|
float backoff;
|
||||||
float change;
|
|
||||||
int i, blocked;
|
|
||||||
|
|
||||||
blocked = 0;
|
backoff = -DotProduct (in, normal) * overbounce;
|
||||||
if (normal[2] > 0)
|
VectorMA(in, backoff, normal, out);
|
||||||
blocked |= 1; // floor
|
|
||||||
if (!normal[2])
|
|
||||||
blocked |= 2; // step
|
|
||||||
|
|
||||||
backoff = DotProduct (in, normal) * overbounce;
|
for (i = 0;i < 3;i++)
|
||||||
|
|
||||||
for (i=0 ; i<3 ; i++)
|
|
||||||
{
|
|
||||||
change = normal[i]*backoff;
|
|
||||||
out[i] = in[i] - change;
|
|
||||||
if (out[i] > -STOP_EPSILON && out[i] < STOP_EPSILON)
|
if (out[i] > -STOP_EPSILON && out[i] < STOP_EPSILON)
|
||||||
out[i] = 0;
|
out[i] = 0;
|
||||||
}
|
|
||||||
|
|
||||||
return blocked;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
============
|
============
|
||||||
SV_FlyMove
|
SV_FlyMove
|
||||||
|
@ -332,12 +321,19 @@ int SV_FlyMove (edict_t *ent, float time, trace_t *steptrace)
|
||||||
return 3;
|
return 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (1)
|
||||||
|
{
|
||||||
|
ClipVelocity(ent->v.velocity, trace.plane.normal, ent->v.velocity, 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
VectorCopy (trace.plane.normal, planes[numplanes]);
|
VectorCopy (trace.plane.normal, planes[numplanes]);
|
||||||
numplanes++;
|
numplanes++;
|
||||||
|
|
||||||
//
|
//
|
||||||
// modify original_velocity so it parallels all of the clip planes
|
// modify original_velocity so it parallels all of the clip planes
|
||||||
//
|
//
|
||||||
for (i=0 ; i<numplanes ; i++)
|
for (i=0 ; i<numplanes ; i++)
|
||||||
{
|
{
|
||||||
ClipVelocity (original_velocity, planes[i], new_velocity, 1);
|
ClipVelocity (original_velocity, planes[i], new_velocity, 1);
|
||||||
|
@ -359,14 +355,16 @@ int SV_FlyMove (edict_t *ent, float time, trace_t *steptrace)
|
||||||
{ // go along the crease
|
{ // go along the crease
|
||||||
if (numplanes != 2)
|
if (numplanes != 2)
|
||||||
{
|
{
|
||||||
// Con_Printf ("clip velocity, numplanes == %i\n",numplanes);
|
Con_Printf ("clip velocity, numplanes == %i\n",numplanes);
|
||||||
VectorCopy (vec3_origin, ent->v.velocity);
|
VectorCopy (vec3_origin, ent->v.velocity);
|
||||||
return 7;
|
return 7;
|
||||||
}
|
}
|
||||||
CrossProduct (planes[0], planes[1], dir);
|
CrossProduct (planes[0], planes[1], dir);
|
||||||
|
VectorNormalize(dir); //fixes slow falling in corners
|
||||||
d = DotProduct (dir, ent->v.velocity);
|
d = DotProduct (dir, ent->v.velocity);
|
||||||
VectorScale (dir, d, ent->v.velocity);
|
VectorScale (dir, d, ent->v.velocity);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// if original velocity is against the original velocity, stop dead
|
// if original velocity is against the original velocity, stop dead
|
||||||
|
@ -1334,6 +1332,8 @@ void SV_WalkMove (edict_t *ent)
|
||||||
&& fabs(oldorg[0] - ent->v.origin[0]) < 0.03125 )
|
&& fabs(oldorg[0] - ent->v.origin[0]) < 0.03125 )
|
||||||
{ // stepping up didn't make any progress
|
{ // stepping up didn't make any progress
|
||||||
clip = SV_TryUnstick (ent, oldvel);
|
clip = SV_TryUnstick (ent, oldvel);
|
||||||
|
|
||||||
|
// Con_Printf("Try unstick fwd\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1341,6 +1341,9 @@ void SV_WalkMove (edict_t *ent)
|
||||||
if ( clip & 2 )
|
if ( clip & 2 )
|
||||||
{
|
{
|
||||||
vec3_t lastpos, lastvel, lastdown;
|
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)
|
//retry with a smaller step (allows entering smaller areas with a step of 4)
|
||||||
VectorCopy (downmove, lastdown);
|
VectorCopy (downmove, lastdown);
|
||||||
VectorCopy (ent->v.origin, lastpos);
|
VectorCopy (ent->v.origin, lastpos);
|
||||||
|
@ -1373,6 +1376,8 @@ void SV_WalkMove (edict_t *ent)
|
||||||
&& fabs(oldorg[0] - ent->v.origin[0]) < 0.03125 )
|
&& fabs(oldorg[0] - ent->v.origin[0]) < 0.03125 )
|
||||||
{ // stepping up didn't make any progress
|
{ // stepping up didn't make any progress
|
||||||
clip = SV_TryUnstick (ent, oldvel);
|
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);
|
VectorCopy (lastvel, ent->v.velocity);
|
||||||
|
|
||||||
SV_WallFriction (ent, &steptrace);
|
SV_WallFriction (ent, &steptrace);
|
||||||
|
|
||||||
|
// Con_Printf("wall friction\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (clip & 2)
|
else if (clip & 2)
|
||||||
|
{
|
||||||
SV_WallFriction (ent, &steptrace);
|
SV_WallFriction (ent, &steptrace);
|
||||||
|
// Con_Printf("wall friction 2\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// move down
|
// 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
|
// cause the player to hop up higher on a slope too steep to climb
|
||||||
VectorCopy (nosteporg, ent->v.origin);
|
VectorCopy (nosteporg, ent->v.origin);
|
||||||
VectorCopy (nostepvel, ent->v.velocity);
|
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)
|
void SV_Physics_Client (edict_t *ent, int num)
|
||||||
{
|
{
|
||||||
qboolean readyforjump;
|
qboolean readyforjump;
|
||||||
|
float oldvel;
|
||||||
|
|
||||||
if ( svs.clients[num-1].state < cs_spawned )
|
if ( svs.clients[num-1].state < cs_spawned )
|
||||||
return; // unconnected slot
|
return; // unconnected slot
|
||||||
|
@ -1464,14 +1477,25 @@ void SV_Physics_Client (edict_t *ent, int num)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MOVETYPE_WALK:
|
case MOVETYPE_WALK:
|
||||||
|
oldvel = ent->v.velocity[0];
|
||||||
if (!SV_RunThink (ent))
|
if (!SV_RunThink (ent))
|
||||||
return;
|
return;
|
||||||
if (!SV_CheckWater (ent) && ! ((int)ent->v.flags & FL_WATERJUMP) )
|
if (!SV_CheckWater (ent) && ! ((int)ent->v.flags & FL_WATERJUMP) )
|
||||||
SV_AddGravity (ent, ent->v.gravity);
|
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);
|
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);
|
SV_WalkMove (ent);
|
||||||
|
|
||||||
|
if (fabs(oldvel - ent->v.velocity[0])> 100)
|
||||||
|
Con_Printf("walk: %f -> %f\n", oldvel, ent->v.velocity[0]);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MOVETYPE_TOSS:
|
case MOVETYPE_TOSS:
|
||||||
|
@ -1671,6 +1695,19 @@ qboolean SV_Physics (void)
|
||||||
|
|
||||||
pr_global_struct->frametime = host_frametime;
|
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 ();
|
SV_ProgStartFrame ();
|
||||||
|
|
||||||
PR_RunThreads();
|
PR_RunThreads();
|
||||||
|
|
|
@ -3914,9 +3914,6 @@ haveannothergo:
|
||||||
sv_player->v.button0 = newcmd.buttons & 1;
|
sv_player->v.button0 = newcmd.buttons & 1;
|
||||||
sv_player->v.button2 = (newcmd.buttons & 2)>>1;
|
sv_player->v.button2 = (newcmd.buttons & 2)>>1;
|
||||||
|
|
||||||
cmd = newcmd;
|
|
||||||
SV_ClientThink ();
|
|
||||||
|
|
||||||
cl->lastcmd = newcmd;
|
cl->lastcmd = newcmd;
|
||||||
cl->lastcmd.buttons = 0; // avoid multiple fires on lag
|
cl->lastcmd.buttons = 0; // avoid multiple fires on lag
|
||||||
continue;
|
continue;
|
||||||
|
@ -4104,7 +4101,7 @@ void SVQ2_ExecuteClientMessage (client_t *cl)
|
||||||
|
|
||||||
if (!sv.paused)
|
if (!sv.paused)
|
||||||
{
|
{
|
||||||
if (sv_nomsec.value)
|
/*if (sv_nomsec.value)
|
||||||
{
|
{
|
||||||
cmd = newcmd;
|
cmd = newcmd;
|
||||||
SV_ClientThink ();
|
SV_ClientThink ();
|
||||||
|
@ -4112,7 +4109,7 @@ void SVQ2_ExecuteClientMessage (client_t *cl)
|
||||||
cl->lastcmd = newcmd;
|
cl->lastcmd = newcmd;
|
||||||
cl->lastcmd.buttons = 0; // avoid multiple fires on lag
|
cl->lastcmd.buttons = 0; // avoid multiple fires on lag
|
||||||
break;
|
break;
|
||||||
}
|
}*/
|
||||||
SV_PreRunCmd();
|
SV_PreRunCmd();
|
||||||
|
|
||||||
if (net_drop < 20)
|
if (net_drop < 20)
|
||||||
|
@ -4603,6 +4600,9 @@ void SV_ClientThink (void)
|
||||||
{
|
{
|
||||||
vec3_t v_angle;
|
vec3_t v_angle;
|
||||||
|
|
||||||
|
cmd = host_client->lastcmd;
|
||||||
|
sv_player = host_client->edict;
|
||||||
|
|
||||||
sv_player->v.movement[0] = cmd.forwardmove;
|
sv_player->v.movement[0] = cmd.forwardmove;
|
||||||
sv_player->v.movement[1] = cmd.sidemove;
|
sv_player->v.movement[1] = cmd.sidemove;
|
||||||
sv_player->v.movement[2] = cmd.upmove;
|
sv_player->v.movement[2] = cmd.upmove;
|
||||||
|
|
Loading…
Reference in a new issue