r5083 - in trunk/data: . qcsrc/server

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Sun Nov 23 06:15:26 EST 2008


Author: div0
Date: 2008-11-23 06:15:25 -0500 (Sun, 23 Nov 2008)
New Revision: 5083

Modified:
   trunk/data/defaultNexuiz.cfg
   trunk/data/qcsrc/server/cl_physics.qc
   trunk/data/qcsrc/server/miscfunctions.qc
Log:
hopefully no change to race car physics, but now parametrized. Five Big Rigs bugs are now controlled by cvars and can be turned off to get "more real" race car physics!


Modified: trunk/data/defaultNexuiz.cfg
===================================================================
--- trunk/data/defaultNexuiz.cfg	2008-11-23 00:51:43 UTC (rev 5082)
+++ trunk/data/defaultNexuiz.cfg	2008-11-23 11:15:25 UTC (rev 5083)
@@ -1199,3 +1199,18 @@
 alias menu_showteamselect "menu_cmd directmenu TeamSelect"
 alias menu_sync "menu_cmd sync"
 bind f5 menu_showteamselect
+
+set g_bugrigs 0
+set g_bugrigs_planar_movement 1 // BROTRR bug emulation
+set g_bugrigs_reverse_speeding 1 // BROTRR bug emulation
+set g_bugrigs_reverse_spinning 1 // BROTRR bug emulation
+set g_bugrigs_reverse_stopping 1 // BROTRR bug emulation
+set g_bugrigs_air_steering 1 // BROTRR bug emulation
+set g_bugrigs_angle_smoothing 5 // smooth the car angle a bit, looks nice
+set g_bugrigs_friction_floor 50 // units/sec friction on floor
+set g_bugrigs_friction_brake 950 // units/sec friction for braking
+set g_bugrigs_friction_air 0 // (very small) v <- v - v^2 * g_bugrigs_friction_air
+set g_bugrigs_accel 800 // acceleration
+set g_bugrigs_speed_ref 400 // reference speed for accel and steer responsiveness
+set g_bugrigs_speed_pow 2 // reference power for accel and steer responsiveness
+set g_bugrigs_steer 1 // steering amount

Modified: trunk/data/qcsrc/server/cl_physics.qc
===================================================================
--- trunk/data/qcsrc/server/cl_physics.qc	2008-11-23 00:51:43 UTC (rev 5082)
+++ trunk/data/qcsrc/server/cl_physics.qc	2008-11-23 11:15:25 UTC (rev 5083)
@@ -137,6 +137,199 @@
 		return ret * angle_mult;
 }
 
+void RaceCarPhysics()
+{
+	// using this move type for "big rigs"
+	// the engine does not push the entity!
+
+	float accel, steer, f;
+	vector angles_save, rigvel;
+
+	angles_save = self.angles;
+	accel = bound(-1, self.movement_x / sv_maxspeed, 1);
+	steer = bound(-1, self.movement_y / sv_maxspeed, 1);
+
+	if(g_bugrigs_reverse_speeding)
+	{
+		if(accel < 0)
+		{
+			// back accel is DIGITAL
+			// to prevent speedhack
+			if(accel < -0.5)
+				accel = -1;
+			else
+				accel = 0;
+		}
+	}
+
+	self.angles_x = 0;
+	self.angles_z = 0;
+	makevectors(self.angles); // new forward direction!
+
+	if(self.flags & FL_ONGROUND || g_bugrigs_air_steering)
+	{
+		float myspeed, upspeed, steerfactor, accelfactor;
+
+		myspeed = self.velocity * v_forward;
+		upspeed = self.velocity * v_up;
+
+		// responsiveness factor for steering and acceleration
+		f = 1 / (1 + pow(max(-myspeed, myspeed) / g_bugrigs_speed_ref, g_bugrigs_speed_pow));
+
+		if(myspeed < 0 && g_bugrigs_reverse_spinning)
+			steerfactor = -myspeed * g_bugrigs_steer;
+		else
+			steerfactor = -myspeed * f * g_bugrigs_steer;
+
+		if(myspeed < 0 && g_bugrigs_reverse_speeding)
+			accelfactor = g_bugrigs_accel;
+		else
+			accelfactor = f * g_bugrigs_accel;
+
+		if(accel < 0)
+		{
+			if(myspeed > 0)
+			{
+				myspeed = max(0, myspeed - frametime * (g_bugrigs_friction_floor - g_bugrigs_friction_brake * accel));
+			}
+			else
+			{
+				if(!g_bugrigs_reverse_speeding)
+					myspeed = min(0, myspeed + frametime * g_bugrigs_friction_floor);
+			}
+		}
+		else
+		{
+			if(myspeed >= 0)
+			{
+				myspeed = max(0, myspeed - frametime * g_bugrigs_friction_floor);
+			}
+			else
+			{
+				if(g_bugrigs_reverse_stopping)
+					myspeed = 0;
+				else
+					myspeed = min(0, myspeed + frametime * (g_bugrigs_friction_floor + g_bugrigs_friction_brake * accel));
+			}
+		}
+		// terminal velocity = velocity at which 50 == accelfactor, that is, 1549 units/sec
+
+		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 = vlen(self.velocity);
+
+		// responsiveness factor for steering and acceleration
+		f = 1 / (1 + pow(max(0, myspeed / g_bugrigs_speed_ref), g_bugrigs_speed_pow));
+		steerfactor = -myspeed * f;
+		self.angles_y += steer * frametime * steerfactor; // apply steering
+
+		rigvel = self.velocity;
+		makevectors(self.angles); // new forward direction!
+	}
+
+	rigvel = rigvel * max(0, 1 - vlen(rigvel) * g_bugrigs_friction_air);
+
+	if(g_bugrigs_planar_movement)
+	{
+		vector rigvel_xy, neworigin, up;
+
+		rigvel_z -= frametime * sv_gravity; // 4x gravity plays better
+		rigvel_xy = rigvel;
+		rigvel_xy_z = 0;
+
+		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?
+		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, trace_endpos - up + '0 0 1' * rigvel_z * frametime, MOVE_NORMAL, self);
+
+		if(trace_fraction < 0.5)
+		{
+			trace_fraction = 1;
+			neworigin = self.origin;
+		}
+		else
+			neworigin = trace_endpos;
+
+		if(trace_fraction < 1)
+		{
+			// now set angles_x so that the car points parallel to the surface
+			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
+		{
+			// now set angles_x so that the car points forward, but is tilted in velocity direction
+			self.flags (-) FL_ONGROUND;
+		}
+
+		self.velocity = (neworigin - self.origin) * (1.0 / frametime);
+		self.movetype = MOVETYPE_NOCLIP;
+	}
+	else
+	{
+		rigvel_z -= frametime * sv_gravity; // 4x gravity plays better
+		self.velocity = rigvel;
+		self.movetype = MOVETYPE_FLY;
+	}
+
+	trace_fraction = 1;
+	tracebox(self.origin, self.mins, self.maxs, self.origin - '0 0 4', MOVE_NORMAL, self);
+	if(trace_fraction != 1)
+	{
+		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)
+				);
+	}
+	else
+	{
+		vector vel_local;
+
+		vel_local_x = v_forward * self.velocity;
+		vel_local_y = v_right * self.velocity;
+		vel_local_z = v_up * self.velocity;
+
+		self.angles_x = racecar_angle(vel_local_x, vel_local_z);
+		self.angles_z = racecar_angle(-vel_local_y, vel_local_z);
+	}
+
+	// smooth the angles
+	vector vf1, vu1, smoothangles;
+	makevectors(self.angles);
+	f = bound(0, frametime * g_bugrigs_angle_smoothing, 1);
+	if(f == 0)
+		f = 1;
+	vf1 = v_forward * f;
+	vu1 = v_up * f;
+	makevectors(angles_save);
+	vf1 = vf1 + v_forward * (1 - f);
+	vu1 = vu1 + v_up * (1 - f);
+	smoothangles = vectoangles2(vf1, vu1);
+	self.angles_x = -smoothangles_x;
+	self.angles_z =  smoothangles_z;
+}
+
 .vector movement_old;
 .float buttons_old;
 .vector v_angle_old;
@@ -182,12 +375,6 @@
 	if (self.movetype == MOVETYPE_NONE && self.disableclientprediction != 2)
 		return;
 
-	if(g_bugrigs && self.movetype == MOVETYPE_WALK)
-	{
-		self.disableclientprediction = 1;
-		self.movetype = MOVETYPE_NOCLIP;
-	}
-
 	if (self.punchangle != '0 0 0')
 	{
 		f = vlen(self.punchangle) - 10 * frametime;
@@ -338,141 +525,7 @@
 	}
 	else if (g_bugrigs && self.classname == "player")
 	{
-		// 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, rigvel, rigvel_xy;
-
-		angles_save = self.angles;
-		accel = bound(-1, self.movement_x / sv_maxspeed, 1);
-		steer = bound(-1, self.movement_y / sv_maxspeed, 1);
-
-		if(accel < 0)
-		{
-			// back accel is DIGITAL
-			if(accel < -0.5)
-				accel = -1;
-			else
-				accel = 0;
-		}
-
-		self.angles_x = 0;
-		self.angles_z = 0;
-		makevectors(self.angles); // new forward direction!
-
-		if(self.flags & FL_ONGROUND || g_bugrigs == 1)
-		// BUG RIGS: responsive to movement while in air (matches big rigs better where the car is NEVER in air)
-		// g_bugrigs 2 turns off that bug
-		{
-			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));
-
-			steerfactor = -myspeed * f;
-			accelfactor = f * 800;
-
-			// 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 * 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 = vlen(self.velocity);
-
-			// 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
-
-			rigvel = self.velocity;
-			makevectors(self.angles); // new forward direction!
-		}
-
-		rigvel_z -= frametime * sv_gravity; // 4x gravity plays better
-		rigvel_xy = rigvel;
-		rigvel_xy_z = 0;
-
-		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?
-		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, trace_endpos - up + '0 0 1' * rigvel_z * frametime, MOVE_NORMAL, self);
-
-		if(trace_fraction < 0.5)
-		{
-			trace_fraction = 1;
-			neworigin = self.origin;
-		}
-		else
-			neworigin = trace_endpos;
-
-		self.velocity = (neworigin - self.origin) * (1.0 / frametime);
-
-		if(trace_fraction < 1)
-		{
-			// now set angles_x so that the car points parallel to the surface
-			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
-		{
-			// now set angles_x so that the car points forward, but is tilted in velocity direction
-			vector vel_local;
-
-			vel_local_x = v_forward * self.velocity;
-			vel_local_y = v_right * self.velocity;
-			vel_local_z = v_up * self.velocity;
-
-			self.angles_x = racecar_angle(vel_local_x, vel_local_z);
-			self.angles_z = racecar_angle(-vel_local_y, vel_local_z);
-
-			self.flags (-) FL_ONGROUND;
-		}
-
-		// smooth the angles
-		vector vf1, vu1, smoothangles;
-		makevectors(self.angles);
-		f = frametime * 5;
-		vf1 = v_forward * f;
-		vu1 = v_up * f;
-		makevectors(angles_save);
-		vf1 = vf1 + v_forward * (1 - f);
-		vu1 = vu1 + v_up * (1 - f);
-		smoothangles = vectoangles2(vf1, vu1);
-		self.angles_x = -smoothangles_x;
-		self.angles_z =  smoothangles_z;
+		RaceCarPhysics();
 	}
 	else if (self.movetype == MOVETYPE_NOCLIP || self.movetype == MOVETYPE_FLY)
 	{

Modified: trunk/data/qcsrc/server/miscfunctions.qc
===================================================================
--- trunk/data/qcsrc/server/miscfunctions.qc	2008-11-23 00:51:43 UTC (rev 5082)
+++ trunk/data/qcsrc/server/miscfunctions.qc	2008-11-23 11:15:25 UTC (rev 5083)
@@ -692,7 +692,6 @@
 // requires the same, but is a stronger condition
 float boxinsidebox(vector smins, vector smaxs, vector bmins, vector bmaxs) {return smins_x >= bmins_x && smaxs_x <= bmaxs_x && smins_y >= bmins_y && smaxs_y <= bmaxs_y && smins_z >= bmins_z && smaxs_z <= bmaxs_z;};
 
-float g_bugrigs;
 float g_pickup_shells;
 float g_pickup_shells_max;
 float g_pickup_nails;
@@ -917,10 +916,39 @@
 	}
 }
 
+float g_bugrigs;
+float g_bugrigs_planar_movement;
+float g_bugrigs_reverse_spinning;
+float g_bugrigs_reverse_speeding;
+float g_bugrigs_reverse_stopping;
+float g_bugrigs_air_steering;
+float g_bugrigs_angle_smoothing;
+float g_bugrigs_friction_floor;
+float g_bugrigs_friction_brake;
+float g_bugrigs_friction_air;
+float g_bugrigs_accel;
+float g_bugrigs_speed_ref;
+float g_bugrigs_speed_pow;
+float g_bugrigs_steer;
+
 void readlevelcvars(void)
 {
+ 	g_bugrigs = cvar("g_bugrigs");
+ 	g_bugrigs_planar_movement = cvar("g_bugrigs_planar_movement");
+ 	g_bugrigs_reverse_spinning = cvar("g_bugrigs_reverse_spinning");
+ 	g_bugrigs_reverse_speeding = cvar("g_bugrigs_reverse_speeding");
+ 	g_bugrigs_reverse_stopping = cvar("g_bugrigs_reverse_stopping");
+ 	g_bugrigs_air_steering = cvar("g_bugrigs_air_steering");
+ 	g_bugrigs_angle_smoothing = cvar("g_bugrigs_angle_smoothing");
+ 	g_bugrigs_friction_floor = cvar("g_bugrigs_friction_floor");
+ 	g_bugrigs_friction_brake = cvar("g_bugrigs_friction_brake");
+ 	g_bugrigs_friction_air = cvar("g_bugrigs_friction_air");
+ 	g_bugrigs_accel = cvar("g_bugrigs_accel");
+ 	g_bugrigs_speed_ref = cvar("g_bugrigs_speed_ref");
+ 	g_bugrigs_speed_pow = cvar("g_bugrigs_speed_pow");
+ 	g_bugrigs_steer = cvar("g_bugrigs_steer");
+
  	sv_clones = cvar("sv_clones");
- 	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