r5071 - trunk/data/qcsrc/server
DONOTREPLY at icculus.org
DONOTREPLY at icculus.org
Fri Nov 21 08:57:35 EST 2008
Author: div0
Date: 2008-11-21 08:57:34 -0500 (Fri, 21 Nov 2008)
New Revision: 5071
Modified:
trunk/data/qcsrc/server/cl_physics.qc
trunk/data/qcsrc/server/miscfunctions.qc
Log:
more bug rigs improvements
Modified: trunk/data/qcsrc/server/cl_physics.qc
===================================================================
--- trunk/data/qcsrc/server/cl_physics.qc 2008-11-21 12:50:00 UTC (rev 5070)
+++ trunk/data/qcsrc/server/cl_physics.qc 2008-11-21 13:57:34 UTC (rev 5071)
@@ -165,7 +165,7 @@
if(g_bugrigs && self.movetype == MOVETYPE_WALK)
{
self.disableclientprediction = 1;
- self.movetype = MOVETYPE_NONE;
+ self.movetype = MOVETYPE_NOCLIP;
}
if (self.punchangle != '0 0 0')
@@ -316,101 +316,102 @@
self.teleport_time = 0;
}
}
- else if (self.movetype == MOVETYPE_NOCLIP || self.movetype == MOVETYPE_FLY)
+ else if (g_bugrigs && self.classname == "player")
{
- // noclipping or flying
- self.flags = self.flags - (self.flags & FL_ONGROUND);
-
- self.velocity = self.velocity * (1 - frametime * sv_friction);
- makevectors(self.v_angle);
- //wishvel = v_forward * self.movement_x + v_right * self.movement_y + v_up * self.movement_z;
- wishvel = v_forward * self.movement_x + v_right * self.movement_y + '0 0 1' * self.movement_z;
- // acceleration
- wishdir = normalize(wishvel);
- wishspeed = vlen(wishvel);
- if (wishspeed > sv_maxspeed*maxspd_mod)
- wishspeed = sv_maxspeed*maxspd_mod;
- if (time >= self.teleport_time)
- {
- f = wishspeed - (self.velocity * wishdir);
- if (f > 0)
- self.velocity = self.velocity + wishdir * min(f, sv_accelerate*maxspd_mod * frametime * wishspeed);
- }
- }
- else if (g_bugrigs)
- {
// using this move type for "big rigs"
// the engine does not push the entity!
-
+
float accel, steer, myspeed, steerfactor, accelfactor, upspeed, friction;
- vector neworigin, up, angles_save;
+ vector neworigin, up, angles_save, rigvel, rigvel_xy;
+ angles_save = self.angles;
accel = self.movement_x / sv_maxspeed;
steer = self.movement_y / sv_maxspeed;
- angles_save = self.angles;
- self.angles_x = 0;
- self.angles_z = 0;
- makevectors(self.angles); // new forward direction!
- myspeed = self.velocity * v_forward;
- upspeed = self.velocity * v_up;
+ // if(self.flags & FL_ONGROUND || 1) // BUG RIGS: responsive to movement while in air (matches big rigs better where the car is NEVER in air)
+ {
+ self.angles_x = 0;
+ self.angles_z = 0;
+ makevectors(self.angles); // new forward direction!
+ myspeed = self.velocity * v_forward;
+ upspeed = self.velocity * v_up;
- // responsiveness factor for steering and acceleration
- f = 1 / (1 + pow(max(0, myspeed / 400), 2));
+ // responsiveness factor for steering and acceleration
+ f = 1 / (1 + pow(max(0, myspeed / 400), 2));
- steerfactor = -myspeed * f;
- accelfactor = f * 800;
+ steerfactor = -myspeed * f;
+ accelfactor = f * 800;
- // BUG RIGS: make friction FAIL if reversing
- if(accel < 0)
- {
- if(myspeed <= 0)
- friction = 0;
+ // BUG RIGS: make friction FAIL if reversing
+ if(accel < 0)
+ {
+ if(myspeed <= 0)
+ friction = 0;
+ else
+ myspeed = max(0, myspeed - frametime * 1000);
+ }
else
- myspeed = max(0, myspeed - frametime * 1000);
+ myspeed = max(0, myspeed - frametime * 50);
+ // terminal velocity = velocity at which 50 == accelfactor, that is, 1549 units/sec
+
+ // BUG RIGS: stop when reversing and releasing the button
+ if(myspeed < 0 && accel == 0)
+ myspeed = 0;
+
+ self.angles_y += steer * frametime * steerfactor; // apply steering
+ makevectors(self.angles); // new forward direction!
+
+ myspeed += accel * accelfactor * frametime;
+
+ rigvel = myspeed * v_forward + '0 0 1' * upspeed;
}
+ /*
else
- myspeed = max(0, myspeed - frametime * 50);
- // terminal velocity = velocity at which 50 == accelfactor, that is, 1549 units/sec
+ {
+ myspeed = vlen(self.velocity);
- // BUG RIGS: stop when reversing and releasing the button
- if(myspeed < 0 && accel == 0)
- myspeed = 0;
+ // responsiveness factor for steering and acceleration
+ f = 1 / (1 + pow(max(0, myspeed / 400), 2));
+ steerfactor = -myspeed * f;
+ self.angles_y += steer * frametime * steerfactor; // apply steering
- self.angles_y += steer * frametime * steerfactor; // apply steering
- makevectors(self.angles); // new forward direction!
+ rigvel = self.velocity;
+ makevectors(self.angles); // new forward direction!
+ }
+ */
- myspeed += accel * accelfactor * frametime;
+ rigvel_z -= frametime * sv_gravity; // 4x gravity plays better
+ rigvel_xy = rigvel;
+ rigvel_xy_z = 0;
- self.velocity = v_forward * myspeed;
- upspeed -= frametime * sv_gravity;
-
tracebox(self.origin, self.mins, self.maxs, self.origin + '0 0 1024', MOVE_NORMAL, self);
up = trace_endpos - self.origin;
// BUG RIGS: align the move to the surface instead of doing collision testing
// can we move?
- neworigin = trace_endpos + self.velocity * frametime;
- tracebox(trace_endpos, self.mins, self.maxs, neworigin, MOVE_NORMAL, self);
+ tracebox(trace_endpos, self.mins, self.maxs, trace_endpos + rigvel_xy * frametime, MOVE_NORMAL, self);
// align to surface
- tracebox(trace_endpos, self.mins, self.maxs, neworigin - up + '0 0 1' * upspeed * frametime, MOVE_NORMAL, self);
+ tracebox(trace_endpos, self.mins, self.maxs, trace_endpos - up + '0 0 1' * rigvel_z * frametime, MOVE_NORMAL, self);
- if(trace_fraction >= 0.5)
- self.origin = trace_endpos;
+ if(trace_fraction < 0.5)
+ {
+ trace_fraction = 1;
+ neworigin = self.origin;
+ }
else
- trace_fraction = 1;
+ neworigin = trace_endpos;
// now set angles_x so that the car points parallel to the surface
if(trace_fraction < 1)
{
- self.angles = vectoangles(normalize(
+ self.angles = vectoangles(
'1 0 0' * v_forward_x * trace_plane_normal_z
+
'0 1 0' * v_forward_y * trace_plane_normal_z
+
'0 0 1' * -(v_forward_x * trace_plane_normal_x + v_forward_y * trace_plane_normal_y)
- ));
+ );
self.flags |= FL_ONGROUND;
}
else
@@ -421,9 +422,29 @@
self.flags (-) FL_ONGROUND;
}
- // relink
- setorigin(self, self.origin);
+ self.velocity = (neworigin - self.origin) * (1.0 / frametime);
}
+ else if (self.movetype == MOVETYPE_NOCLIP || self.movetype == MOVETYPE_FLY)
+ {
+ // noclipping or flying
+ self.flags = self.flags - (self.flags & FL_ONGROUND);
+
+ self.velocity = self.velocity * (1 - frametime * sv_friction);
+ makevectors(self.v_angle);
+ //wishvel = v_forward * self.movement_x + v_right * self.movement_y + v_up * self.movement_z;
+ wishvel = v_forward * self.movement_x + v_right * self.movement_y + '0 0 1' * self.movement_z;
+ // acceleration
+ wishdir = normalize(wishvel);
+ wishspeed = vlen(wishvel);
+ if (wishspeed > sv_maxspeed*maxspd_mod)
+ wishspeed = sv_maxspeed*maxspd_mod;
+ if (time >= self.teleport_time)
+ {
+ f = wishspeed - (self.velocity * wishdir);
+ if (f > 0)
+ self.velocity = self.velocity + wishdir * min(f, sv_accelerate*maxspd_mod * frametime * wishspeed);
+ }
+ }
else if (self.waterlevel >= 2)
{
// swimming
Modified: trunk/data/qcsrc/server/miscfunctions.qc
===================================================================
--- trunk/data/qcsrc/server/miscfunctions.qc 2008-11-21 12:50:00 UTC (rev 5070)
+++ trunk/data/qcsrc/server/miscfunctions.qc 2008-11-21 13:57:34 UTC (rev 5071)
@@ -920,7 +920,7 @@
void readlevelcvars(void)
{
sv_clones = cvar("sv_clones");
- g_bugrigs = cvar("g_bigrigs");
+ g_bugrigs = cvar("g_bugrigs");
sv_cheats = cvar("sv_cheats");
sv_gentle = cvar("sv_gentle");
sv_foginterval = cvar("sv_foginterval");
More information about the nexuiz-commits
mailing list