r2306 - in branches/nexuiz-2.0/data: . menu/data menu/options models qcsrc/server

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Fri Apr 13 19:56:17 EDT 2007


Author: div0
Date: 2007-04-13 19:56:17 -0400 (Fri, 13 Apr 2007)
New Revision: 2306

Added:
   branches/nexuiz-2.0/data/models/sprites/
   branches/nexuiz-2.0/data/qcsrc/server/waypointsprites.qc
Modified:
   branches/nexuiz-2.0/data/default.cfg
   branches/nexuiz-2.0/data/menu/data/player.menu
   branches/nexuiz-2.0/data/menu/options/player.menu
   branches/nexuiz-2.0/data/qcsrc/server/cl_client.qc
   branches/nexuiz-2.0/data/qcsrc/server/cl_impulse.qc
   branches/nexuiz-2.0/data/qcsrc/server/cl_player.qc
   branches/nexuiz-2.0/data/qcsrc/server/clientcommands.qc
   branches/nexuiz-2.0/data/qcsrc/server/ctf.qc
   branches/nexuiz-2.0/data/qcsrc/server/defs.qh
   branches/nexuiz-2.0/data/qcsrc/server/g_world.qc
   branches/nexuiz-2.0/data/qcsrc/server/miscfunctions.qc
   branches/nexuiz-2.0/data/qcsrc/server/progs.src
Log:
waypoint sprites system
zoom
menu fixes
quit_and_redirect


Modified: branches/nexuiz-2.0/data/default.cfg
===================================================================
--- branches/nexuiz-2.0/data/default.cfg	2007-04-13 22:50:26 UTC (rev 2305)
+++ branches/nexuiz-2.0/data/default.cfg	2007-04-13 23:56:17 UTC (rev 2306)
@@ -1,3 +1,7 @@
+// changes a cvar and reports it to the server (for the menu to notify the
+// server about changes)
+alias setreport "set $1 $2 ; sendcvar $1"
+
 // Nexuiz version (formatted for humans)
 set g_nexuizversion 2.2.3
 
@@ -60,6 +64,8 @@
 _cl_playerskin 0
 crosshair 5
 fov 90
+set cl_zoomfactor 5  // how much +zoom will zoom (1-16)
+set cl_zoomspeed 3.5 // how fast it will zoom (0.5-16), negative values mean instant zoom
 freelook 1
 sensitivity 6
 seta scmenu_mouse_speed 1
@@ -804,3 +810,28 @@
 set g_chat_flood_burst_team 0            // /
 set g_chat_flood_notify_flooder 1        // when 0, the flooder still can see his own message
 set g_chat_teamcolors 0                  // colorize nicknames in team color for chat
+
+set g_waypointsprite_normdistance 512
+set g_waypointsprite_minscale 1
+set g_waypointsprite_minalpha 0.2
+set g_waypointsprite_distancealphaexponent 2
+set g_waypointsprite_timealphaexponent 1
+set g_waypointsprite_deployed_lifetime 10
+set g_waypointsprite_deadlifetime 2
+set g_waypointsprite_limitedrange 5120
+set g_waypointsprite_stuffbinds 0
+alias "g_waypointsprite_personal"       "impulse 30"
+alias "g_waypointsprite_personal_p"     "impulse 31"
+alias "g_waypointsprite_personal_d"     "impulse 32"
+alias "g_waypointsprite_team_helpme"    "impulse 33"
+alias "g_waypointsprite_team_here"      "impulse 34"
+alias "g_waypointsprite_team_here_p"    "impulse 35"
+alias "g_waypointsprite_team_here_d"    "impulse 36"
+alias "g_waypointsprite_team_danger"    "impulse 37"
+alias "g_waypointsprite_team_danger_p"  "impulse 38"
+alias "g_waypointsprite_team_danger_d"  "impulse 39"
+alias "g_waypointsprite_clear_personal" "impulse 47"
+alias "g_waypointsprite_clear"          "impulse 48"
+alias "g_waypointsprite_toggle"         "impulse 49"
+// key for that?
+seta cl_hidewaypoints 0

Modified: branches/nexuiz-2.0/data/menu/data/player.menu
===================================================================
--- branches/nexuiz-2.0/data/menu/data/player.menu	2007-04-13 22:50:26 UTC (rev 2305)
+++ branches/nexuiz-2.0/data/menu/data/player.menu	2007-04-13 23:56:17 UTC (rev 2306)
@@ -64,6 +64,20 @@
 			link		"##up"
 		}
 	}
+	Item Data_ServerCvar ZoomFactor
+	{
+		cvarName	"cl_zoomfactor"
+		syncCmd     "setreport cl_zoomfactor"
+		defValue	"5"
+
+		Item DataLink_Value Value
+		{
+			minValue	1.5
+			maxValue	8.0
+			stepValue	0.5
+			link		"##up"
+		}
+	}
 	Item Data_Cvar ViewSize
 	{
 		cvarName	"viewsize"
@@ -77,23 +91,26 @@
 			link		"##up"
 		}
 	}
-	Item Data_Cvar WeaponAutoswitch
+	Item Data_ServerCvar WeaponAutoswitch
 	{
 		cvarName	"cl_autoswitch"
+		syncCmd     "setreport cl_autoswitch"
 		defValue	1
 
 		[DataLink_OnOffSwitch]
 	}
-	Item Data_Cvar NoGibs
+	Item Data_ServerCvar NoGibs
 	{
 		cvarName	"cl_nogibs"
+		syncCmd     "setreport cl_nogibs"
 		defValue	"0"
 	
 		[DataLink_OnOffSwitch]
 	}
-	Item Data_Cvar PlayerShowNames
+	Item Data_ServerCvar PlayerShowNames
 	{
 		cvarName "cl_shownames"
+		syncCmd  "setreport cl_shownames"
 		defValue "1"
 		
 		Item DataLink_TextSwitch Switch
@@ -103,6 +120,19 @@
 			link  "##up"
 		}
 	}
+	Item Data_ServerCvar ShowWaypoints
+	{
+		cvarName "cl_hidewaypoints"
+		syncCmd  "setreport cl_hidewaypoints"
+		defValue "0"
+		
+		Item DataLink_TextSwitch Switch
+		{
+			valueList "'0' '1'"
+			descList "'Display' 'Hide'"
+			link  "##up"
+		}
+	}
 	Item DataContainer Crosshair
 	{
 		Item Data_Cvar Type

Modified: branches/nexuiz-2.0/data/menu/options/player.menu
===================================================================
--- branches/nexuiz-2.0/data/menu/options/player.menu	2007-04-13 22:50:26 UTC (rev 2305)
+++ branches/nexuiz-2.0/data/menu/options/player.menu	2007-04-13 23:56:17 UTC (rev 2306)
@@ -142,6 +142,11 @@
 			text	"Field of View"
 			target	"::Data::Player::FOV::Value"
 		}
+		Derive Nex_Option_Slider ZoomFactor
+		{
+			text	"Zoom factor"
+			target	"::Data::Player::ZoomFactor::Value"
+		}
 		Derive Nex_Option_Slider ViewSize
 		{
 			text	"View Size"
@@ -192,6 +197,11 @@
 			text    "Show player names"
 			target  "::Data::Player::PlayerShowNames::Switch"
 		}		
+		Derive Nex_Option_Switch ShowWaypoints
+		{
+			text    "Map waypoints"
+			target  "::Data::Player::ShowWaypoints::Switch"
+		}		
 		Derive Nex_Option_Slider MapDLSpeed
 		{
 			text	"Download Speed"

Copied: branches/nexuiz-2.0/data/models/sprites (from rev 2303, trunk/data/models/sprites)

Modified: branches/nexuiz-2.0/data/qcsrc/server/cl_client.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/cl_client.qc	2007-04-13 22:50:26 UTC (rev 2305)
+++ branches/nexuiz-2.0/data/qcsrc/server/cl_client.qc	2007-04-13 23:56:17 UTC (rev 2306)
@@ -287,6 +287,8 @@
 		WriteEntity(MSG_ONE, self);
 	}
 
+	WaypointSprite_PlayerDead();
+
 	DropAllRunes(self);
 
 	if(self.flagcarried)
@@ -457,6 +459,7 @@
 		self.oldvelocity = self.velocity;
 
 		self.viewzoom = 0.6;
+		self.has_zoomed = 0;
 
 		self.customizeentityforclient = Client_customizeentityforclient;
 
@@ -745,12 +748,14 @@
 	
 	FixClientCvars(self);
 
+	// waypoint sprites
+	WaypointSprite_InitClient(self);
+
 	// Wazat's grappling hook
 	SetGrappleHookBindings();
 
-	// get autoswitch state from player
-	stuffcmd(self, "alias autoswitch \"set cl_autoswitch $1; cmd autoswitch $1\"\n");
-	stuffcmd(self, "cmd autoswitch $cl_autoswitch\n");
+	// get autoswitch state from player when he toggles it
+	stuffcmd(self, "alias autoswitch \"set cl_autoswitch $1 ; cmd autoswitch $1\"\n");
 
 	// get version info from player
 	stuffcmd(self, "cmd clientversion $gameversion\n");
@@ -823,6 +828,8 @@
 		self.teambubbleentity = world;
 	}
 
+	WaypointSprite_PlayerGone();
+
 	DropAllRunes(self);
 
 	if(self.flagcarried)
@@ -1443,21 +1450,60 @@
 
 		W_WeaponFrame();
 
-		if (self.button4 || (self.weapon == WEP_NEX && self.button3))
-		{
-			if (cvar("g_minstagib") && self.button3)
-			{
+		if (cvar("g_minstagib"))
+			if(self.button3)
 				if (self.jump_interval <= (time + 0.1))
 				{
 					self.jump_interval = time + 1;
 					W_Laser_Attack();
 				}
+		
+		{
+			float zoomfactor, zoomspeed, zoomdir;
+			zoomfactor = self.cvar_cl_zoomfactor;
+			if(zoomfactor < 1 || zoomfactor > 16)
+				zoomfactor = 2.5;
+			zoomspeed = self.cvar_cl_zoomspeed;
+			if(zoomspeed >= 0) // < 0 is instant zoom
+				if(zoomspeed < 0.5 || zoomspeed > 16)
+					zoomspeed = 3.5;
+			
+			zoomdir = self.button4;
+			if(self.button3)
+				if(self.weapon == WEP_NEX)
+					if(!cvar("g_minstagib"))
+						zoomdir = 1;
+
+			if(zoomdir)
+				self.has_zoomed = 1;
+
+			if(self.has_zoomed)
+			{
+				if(zoomspeed <= 0) // instant zoom
+				{
+					if(zoomdir)
+						self.viewzoom = 1 / zoomfactor;
+					else
+						self.viewzoom = 1;
+				}
+				else
+				{
+					// geometric zoom would be:
+					//   self.viewzoom = bound(1 / zoomfactor, self.viewzoom * pow(zoomfactor, (zoomdir ? -1 : 1) * frametime * zoomspeed), 1);
+					// however, testing showed that arithmetic/harmonic zoom works better
+					if(zoomdir)
+						// self.viewzoom = 1 / bound(1, 1 / self.viewzoom + (zoomdir ? 1 : -1) * frametime * zoomspeed * (zoomfactor - 1), zoomfactor);
+						// zoom in = arithmetic: 1x, 2x, 3x, 4x, ..., 8x
+						self.viewzoom = 1 / bound(1, 1 / self.viewzoom + frametime * zoomspeed * (zoomfactor - 1), zoomfactor);
+					else
+						// self.viewzoom = bound(1 / zoomfactor, self.viewzoom + (zoomdir ? -1 : 1) * frametime * zoomspeed * (1 - 1 / zoomfactor), 1);
+						// zoom out = harmonic: 8/1x, 8/2x, 8/3x, 8/4x, ..., 8/8x
+						self.viewzoom = bound(1 / zoomfactor, self.viewzoom + frametime * zoomspeed * (1 - 1 / zoomfactor), 1);
+				}
 			}
-			else if (self.viewzoom > 0.4)
-				self.viewzoom = max (0.4, self.viewzoom - frametime * 2);
+			else
+				self.viewzoom = min(1, self.viewzoom + frametime); // spawn zoom-in
 		}
-		else if (self.viewzoom < 1.0)
-			self.viewzoom = min (1.0, self.viewzoom + frametime);
 
 		player_powerups();
 		player_regen();
@@ -1550,7 +1596,6 @@
 		CheckRules_Player();
 		UpdateChatBubble();
 		UpdateTeamBubble();
-		if (self.deadflag == DEAD_NO)
 		if (self.impulse)
 			ImpulseCommands ();
 		if (intermission_running)

Modified: branches/nexuiz-2.0/data/qcsrc/server/cl_impulse.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/cl_impulse.qc	2007-04-13 22:50:26 UTC (rev 2305)
+++ branches/nexuiz-2.0/data/qcsrc/server/cl_impulse.qc	2007-04-13 23:56:17 UTC (rev 2306)
@@ -63,27 +63,32 @@
 	if (imp >= 1 && imp <= 12)
 	{
 		// weapon switching impulses
-		if (imp <= 9)
-			W_SwitchWeapon (imp);
-		else if (imp == 10)
-			W_NextWeapon ();
-		else if (imp == 12)
-			W_PreviousWeapon ();
-		else if (imp == 11) // last weapon
-			W_SwitchWeapon (self.cnt);
+		if(self.deadflag == DEAD_NO)
+		{
+			if (imp <= 9)
+				W_SwitchWeapon (imp);
+			else if (imp == 10)
+				W_NextWeapon ();
+			else if (imp == 12)
+				W_PreviousWeapon ();
+			else if (imp == 11) // last weapon
+				W_SwitchWeapon (self.cnt);
+		}
+		else
+			self.impulse = imp; // retry in next frame
 	}
 	else if (imp >= 13 && imp <= 16)
 	{
 		if (cvar("sv_cheats"))
 		{
-			if (imp == 13)
+			if (imp == 13 && self.deadflag == DEAD_NO)
 			{
 				makevectors (self.v_angle);
 				self.velocity = self.velocity + v_forward * 300;
 				CopyBody(1);
 				self.velocity = self.velocity - v_forward * 300;
 			}
-			else if (imp == 14)
+			else if (imp == 14 && self.deadflag == DEAD_NO)
 				CopyBody(0);
 			else if (imp == 15)
 			{
@@ -108,11 +113,88 @@
 	// throw weapon
 	else if (imp == 17)
 	{
-		if (self.weapon != WEP_LASER
-			&& !cvar("g_minstagib") && !cvar("g_instagib")
-			&& !cvar("g_rocketarena") && !cvar("g_lms") && cvar("g_pickup_items") && !cvar("g_nixnex"))
-			W_ThrowWeapon(self.velocity * 0.5 + v_forward * 750, '0 0 0', TRUE);
+		if(self.deadflag == DEAD_NO)
+		{
+			if (self.weapon != WEP_LASER
+				&& !cvar("g_minstagib") && !cvar("g_instagib")
+				&& !cvar("g_rocketarena") && !cvar("g_lms") && cvar("g_pickup_items") && !cvar("g_nixnex"))
+				W_ThrowWeapon(self.velocity * 0.5 + v_forward * 750, '0 0 0', TRUE);
+		}
 	}
+	// deploy waypoints
+	else if (imp >= 30 && imp <= 49)
+	{
+		if(imp == 30)
+		{
+			WaypointSprite_DeployPersonal("waypoint", self.origin);
+			sprint(self, "personal waypoint spawned at location\n");
+		}
+		else if(imp == 31)
+		{
+			WaypointSprite_DeployPersonal("waypoint", self.cursor_trace_endpos);
+			sprint(self, "personal waypoint spawned at crosshair\n");
+		}
+		else if(imp == 32 && vlen(self.death_origin))
+		{
+			WaypointSprite_DeployPersonal("waypoint", self.death_origin);
+			sprint(self, "personal waypoint spawned at death location\n");
+		}
+		else if(imp == 33 && self.deadflag == DEAD_NO)
+		{
+			if(teams_matter)
+				WaypointSprite_Attach("helpme", TRUE);
+			sprint(self, "HELP ME attached\n");
+		}
+		else if(imp == 34)
+		{
+			WaypointSprite_DeployFixed("here", FALSE, self.origin);
+			sprint(self, "HERE spawned at location\n");
+		}
+		else if(imp == 35)
+		{
+			WaypointSprite_DeployFixed("here", FALSE, self.cursor_trace_endpos);
+			sprint(self, "HERE spawned at crosshair\n");
+		}
+		else if(imp == 36 && vlen(self.death_origin))
+		{
+			WaypointSprite_DeployFixed("here", FALSE, self.death_origin);
+			sprint(self, "HERE spawned at death location\n");
+		}
+		else if(imp == 37)
+		{
+			WaypointSprite_DeployFixed("danger", FALSE, self.origin);
+			sprint(self, "DANGER spawned at location\n");
+		}
+		else if(imp == 38)
+		{
+			WaypointSprite_DeployFixed("danger", FALSE, self.cursor_trace_endpos);
+			sprint(self, "DANGER spawned at crosshair\n");
+		}
+		else if(imp == 39 && vlen(self.death_origin))
+		{
+			WaypointSprite_DeployFixed("danger", FALSE, self.death_origin);
+			sprint(self, "DANGER spawned at death location\n");
+		}
+		else if(imp == 47)
+		{
+			WaypointSprite_ClearPersonal();
+			sprint(self, "personal waypoint cleared\n");
+		}
+		else if(imp == 48)
+		{
+			WaypointSprite_ClearOwned();
+			sprint(self, "all waypoints cleared\n");
+		}
+		else if(imp == 49)
+		{
+			self.cvar_cl_hidewaypoints = !(self.cvar_cl_hidewaypoints);
+			sprint(self, "fixed waypoints now ");
+			if(self.cvar_cl_hidewaypoints)
+				sprint(self, "OFF\n");
+			else
+				sprint(self, "ON\n");
+		}
+	}
 	else
 	{
 		if (cvar("sv_cheats"))
@@ -130,11 +212,11 @@
 				traceline(self.origin + self.view_ofs, self.origin + self.view_ofs + v_forward * 65536, FALSE, self);
 				sprint(self, strcat("distance: ", ftos(fabs(vlen(trace_endpos - (self.origin + self.view_ofs)))), "\n"));
 			}
-			else if(imp == 42)
+			else if(imp == 6*9)
 			{
 				CampaignLevelWarp(cvar("_warplevel"));
 			}
-			else if (imp == 99)
+			else if (imp == 99 && self.deadflag == DEAD_NO)
 			{
 				self.items = IT_LASER | IT_UZI | IT_SHOTGUN | IT_GRENADE_LAUNCHER | IT_ELECTRO | IT_CRYLINK | IT_NEX | IT_HAGAR | IT_ROCKET_LAUNCHER;
 				self.ammo_shells = 999;

Modified: branches/nexuiz-2.0/data/qcsrc/server/cl_player.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/cl_player.qc	2007-04-13 22:50:26 UTC (rev 2305)
+++ branches/nexuiz-2.0/data/qcsrc/server/cl_player.qc	2007-04-13 23:56:17 UTC (rev 2306)
@@ -285,6 +285,8 @@
 	{
 		self.deaths += 1;
 
+		// clear waypoints
+		WaypointSprite_PlayerDead();
 		// become fully visible
 		self.alpha = 1;
 		// clear selected player display

Modified: branches/nexuiz-2.0/data/qcsrc/server/clientcommands.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/clientcommands.qc	2007-04-13 22:50:26 UTC (rev 2305)
+++ branches/nexuiz-2.0/data/qcsrc/server/clientcommands.qc	2007-04-13 23:56:17 UTC (rev 2306)
@@ -309,8 +309,10 @@
 			self.classname = "observer";
 			stuffcmd(self,"menu_showteamselect\n");
 		}
-	} else if(argv(0) == "reportcvar") {
+	} else if(argv(0) == "reportcvar") { // old system
 		GetCvars(1);
+	} else if(argv(0) == "sentcvar") { // new system
+		GetCvars(1);
 	} else if(argv(0) == "spectate") {
 		if(cvar("g_lms") || cvar("g_arena"))
 			return; // don't allow spectating in lms, unless player runs out of lives

Modified: branches/nexuiz-2.0/data/qcsrc/server/ctf.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/ctf.qc	2007-04-13 22:50:26 UTC (rev 2305)
+++ branches/nexuiz-2.0/data/qcsrc/server/ctf.qc	2007-04-13 23:56:17 UTC (rev 2306)
@@ -71,7 +71,10 @@
 {
 	if (e.owner)
 	if (e.owner.flagcarried == e)
+	{
+		WaypointSprite_DetachCarrier(e.owner);
 		e.owner.flagcarried = world;
+	}
 	e.owner = world;
 	RegenFlag(e);
 };
@@ -92,6 +95,7 @@
 		return;
 	}
 	bprint(p.netname, "^7 lost the ", e.netname, "\n");
+	WaypointSprite_DetachCarrier(p);
 	LogCTF("dropped", p.team, p.flagcarried);
 
 	setattachment(e, world, "");
@@ -221,6 +225,7 @@
 				UpdateFrags(head, cvar("g_ctf_flagscore_capture_team"));
 
 		sound (self, CHAN_AUTO, self.noise2, 1, ATTN_NONE);
+		WaypointSprite_DetachCarrier(other);
 		RegenFlag (other.flagcarried);
 		other.flagcarried = world;
 		other.next_take_time = time + 1;
@@ -251,6 +256,7 @@
 		self.movetype = MOVETYPE_NONE;
 		setorigin(self, FLAG_CARRY_POS);
 		setattachment(self, other, "");
+		WaypointSprite_AttachCarrier("flagcarrier", other);
 
 		return;
 	}
@@ -290,6 +296,7 @@
 			self.movetype = MOVETYPE_NONE;	// flag must have MOVETYPE_NONE here, otherwise it will drop through the floor...
 			setorigin(self, FLAG_CARRY_POS);
 			setattachment(self, other, "");
+			WaypointSprite_AttachCarrier("flagcarrier", other);
 		}
 	}
 };
@@ -425,6 +432,9 @@
 	//	self.glow_size = 50;
 
 	self.effects = self.effects | EF_FULLBRIGHT | EF_LOWPRECISION;
+	droptofloor();
+
+	WaypointSprite_SpawnFixed("redbase", self.origin + '0 0 37');
 };
 
 /*QUAKED item_flag_team2 (0 0.5 0.8) (-48 -48 -24) (48 48 64)
@@ -478,6 +488,9 @@
 	//	self.glow_size = 50;
 
 	self.effects = self.effects | EF_FULLBRIGHT | EF_LOWPRECISION;
+	droptofloor();
+
+	WaypointSprite_SpawnFixed("bluebase", self.origin + '0 0 37');
 };
 
 

Modified: branches/nexuiz-2.0/data/qcsrc/server/defs.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/defs.qh	2007-04-13 22:50:26 UTC (rev 2305)
+++ branches/nexuiz-2.0/data/qcsrc/server/defs.qh	2007-04-13 23:56:17 UTC (rev 2306)
@@ -252,11 +252,16 @@
 float default_player_alpha;
 float default_weapon_alpha;
 
+.float has_zoomed;
+
 .float() customizeentityforclient;
+.float cvar_cl_zoomfactor;
+.float cvar_cl_zoomspeed;
 .float cvar_cl_playerdetailreduction;
 .float cvar_cl_nogibs;
 .float cvar_scr_centertime;
 .float cvar_cl_shownames;
+.float cvar_cl_hidewaypoints;
 .string cvar_g_nexuizversion;
 
 .float version_nagtime;

Modified: branches/nexuiz-2.0/data/qcsrc/server/g_world.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/g_world.qc	2007-04-13 22:50:26 UTC (rev 2305)
+++ branches/nexuiz-2.0/data/qcsrc/server/g_world.qc	2007-04-13 23:56:17 UTC (rev 2306)
@@ -361,6 +361,9 @@
 		CampaignPreInit();
 
 	InitGameplayMode();
+
+	WaypointSprite_Init();
+
 	//if (cvar("g_domination"))
 	//	dom_init();
 
@@ -726,6 +729,14 @@
 			return TRUE;
 		}
 	}
+	if(cvar_string("quit_and_redirect") != "")
+	{
+		entity head;
+		FOR_EACH_REALCLIENT(head)
+			stuffcmd(head, strcat("\nconnect ", cvar_string("quit_and_redirect"), "\n"));
+		localcmd("wait; wait; wait; wait; wait; wait; wait; wait; wait; wait; wait; wait; wait; wait; wait; wait; wait; wait; wait; wait; wait; wait; quit\n");
+		return TRUE;
+	}
 	if (cvar("samelevel")) // if samelevel is set, stay on same level
 	{
 		// this does not work because it tries to exec maps/nexdm01.mapcfg (which doesn't exist, it should be trying maps/dm_nexdm01.mapcfg for example)

Modified: branches/nexuiz-2.0/data/qcsrc/server/miscfunctions.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/miscfunctions.qc	2007-04-13 22:50:26 UTC (rev 2305)
+++ branches/nexuiz-2.0/data/qcsrc/server/miscfunctions.qc	2007-04-13 23:56:17 UTC (rev 2306)
@@ -350,7 +350,7 @@
 		}
 	}
 	else
-		stuffcmd(self, strcat("cmd reportcvar ", name, " $", name, "\n"));
+		stuffcmd(self, strcat("sendcvar ", name, "\n"));
 }
 void GetCvars_handleFloat(float f, .float field, string name)
 {
@@ -363,10 +363,14 @@
 			self.field = stof(argv(f + 1));
 	}
 	else
-		stuffcmd(self, strcat("cmd reportcvar ", name, " $", name, "\n"));
+		stuffcmd(self, strcat("sendcvar ", name, "\n"));
 }
 void GetCvars(float f)
 {
+	GetCvars_handleFloat(f, autoswitch, "cl_autoswitch");
+	GetCvars_handleFloat(f, cvar_cl_hidewaypoints, "cl_hidewaypoints");
+	GetCvars_handleFloat(f, cvar_cl_zoomfactor, "cl_zoomfactor");
+	GetCvars_handleFloat(f, cvar_cl_zoomspeed, "cl_zoomspeed");
 	GetCvars_handleFloat(f, cvar_cl_playerdetailreduction, "cl_playerdetailreduction");
 	GetCvars_handleFloat(f, cvar_cl_nogibs, "cl_nogibs");
 	GetCvars_handleFloat(f, cvar_scr_centertime, "scr_centertime");

Modified: branches/nexuiz-2.0/data/qcsrc/server/progs.src
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/progs.src	2007-04-13 22:50:26 UTC (rev 2305)
+++ branches/nexuiz-2.0/data/qcsrc/server/progs.src	2007-04-13 23:56:17 UTC (rev 2306)
@@ -14,6 +14,8 @@
 
 miscfunctions.qc
 
+waypointsprites.qc
+
 // general bot utility functions and management
 bots.qc
 

Added: branches/nexuiz-2.0/data/qcsrc/server/waypointsprites.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/waypointsprites.qc	                        (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/server/waypointsprites.qc	2007-04-13 23:56:17 UTC (rev 2306)
@@ -0,0 +1,300 @@
+float waypointsprite_normdistance;
+float waypointsprite_minscale;
+float waypointsprite_fadedistance;
+float waypointsprite_minalpha;
+float waypointsprite_distancealphaexponent;
+float waypointsprite_timealphaexponent;
+float waypointsprite_deployed_lifetime;
+float waypointsprite_deadlifetime;
+float waypointsprite_limitedrange;
+
+..entity owned_by_field;
+
+void WaypointSprite_Init()
+{
+	waypointsprite_fadedistance = vlen(world.maxs - world.mins);
+	waypointsprite_normdistance = cvar("g_waypointsprite_normdistance");
+	waypointsprite_minscale = cvar("g_waypointsprite_minscale");
+	waypointsprite_minalpha = cvar("g_waypointsprite_minalpha");
+	waypointsprite_distancealphaexponent = cvar("g_waypointsprite_distancealphaexponent");
+	waypointsprite_timealphaexponent = cvar("g_waypointsprite_timealphaexponent");
+	waypointsprite_deployed_lifetime = cvar("g_waypointsprite_deployed_lifetime");
+	waypointsprite_deadlifetime = cvar("g_waypointsprite_deadlifetime");
+	waypointsprite_limitedrange = cvar("g_waypointsprite_limitedrange");
+
+	precache_model("models/sprites/bluebase.sp2");
+	precache_model("models/sprites/flagcarrier.sp2");
+	precache_model("models/sprites/here.sp2");
+	precache_model("models/sprites/helpme.sp2");
+	precache_model("models/sprites/redbase.sp2");
+	precache_model("models/sprites/waypoint.sp2");
+	precache_model("models/sprites/danger.sp2");
+}
+
+void WaypointSprite_InitClient(entity e)
+{
+	stuffcmd(e, "\nalias \"g_waypointsprite_personal\" \"impulse 30\"\n alias \"g_waypointsprite_personal_p\" \"impulse 31\"\n alias \"g_waypointsprite_personal_d\" \"impulse 32\"\n alias \"g_waypointsprite_team_helpme\" \"impulse 33\"\n alias \"g_waypointsprite_team_here\" \"impulse 34\"\n alias \"g_waypointsprite_team_here_p\" \"impulse 35\"\n alias \"g_waypointsprite_team_here_d\" \"impulse 36\"\n alias \"g_waypointsprite_team_danger\" \"impulse 37\"\n alias \"g_waypointsprite_team_danger_p\" \"impulse 38\"\n alias \"g_waypointsprite_team_danger_d\" \"impulse 39\"\n alias \"g_waypointsprite_clear_personal\" \"impulse 47\"\n alias \"g_waypointsprite_clear\" \"impulse 48\"\n alias \"g_waypointsprite_toggle\" \"impulse 49\"\n");
+}
+
+void WaypointSprite_Kill(entity wp)
+{
+	if(!wp)
+		return;
+	if(wp.owner)
+		wp.owner.(wp.owned_by_field) = world;
+	remove(wp);
+}
+
+void WaypointSprite_Disown(entity wp, float fadetime)
+{
+	if(!wp)
+		return;
+	if(wp.owner)
+	{
+		if(wp.aiment == wp.owner)
+		{
+			wp.view_ofs = wp.view_ofs + wp.aiment.origin;
+			wp.aiment = world;
+		}
+		wp.owner.(wp.owned_by_field) = world;
+		wp.owner = world;
+
+		if(!wp.health)
+		{
+			wp.health = fadetime;
+			wp.teleport_time = time + fadetime;
+		}
+		else if(fadetime < (wp.teleport_time - time))
+		{
+			// accelerate the waypoint's dying
+			// ensure:
+			//   (wp.teleport_time - time) / wp.health stays
+			//   wp.teleport_time = time + fadetime
+			float current_fadetime;
+			current_fadetime = wp.teleport_time - time;
+			wp.teleport_time = time + fadetime;
+			wp.health = wp.health * fadetime / current_fadetime;
+		}
+	}
+}
+
+void WaypointSprite_Think()
+{
+	float doremove;
+
+	doremove = FALSE;
+
+	if(self.health)
+		if(time >= self.teleport_time)
+			doremove = TRUE;
+
+	if(doremove)
+		WaypointSprite_Kill(self);
+	else
+		self.nextthink = time;
+}
+
+float WaypointSprite_CustomizeEntityForClient()
+{
+	vector realorigin, porigin;
+	float distancealpha, timealpha;
+	float distance;
+
+	if(self.health)
+	{
+		timealpha = bound(0, (self.teleport_time - time) / self.health, 1);
+		if(timealpha == 0)
+			return FALSE;
+		timealpha = pow(timealpha, waypointsprite_timealphaexponent);
+	}
+	else
+		timealpha = 1;
+
+	if(self.enemy)
+		if(self.enemy != other)
+			return FALSE;
+	if(self.team)
+	{
+		if(self.team != other.team)
+			return FALSE;
+		if(other.classname != "player")
+			return FALSE;
+	}
+
+	// do not draw to yourself when attached
+	if(self.aiment)
+		if(other == self.aiment)
+			return FALSE;
+
+	if(self.currentammo) // hidable?
+		if(other.cvar_cl_hidewaypoints) // wants to hide;
+			return FALSE;
+
+	porigin = other.origin + other.view_ofs_z * '0 0 1';
+	realorigin = self.aiment.origin + self.view_ofs;
+	self.origin = realorigin;
+
+	distance = vlen(realorigin - porigin);
+
+	if(self.max_health)
+		if(distance >= self.max_health)
+			return FALSE;
+
+	self.scale = max(1, distance / waypointsprite_normdistance) * waypointsprite_minscale;
+
+	if(self.max_health > waypointsprite_normdistance)
+	{
+		// alpha 1 at normdistance, alpha 0 at maxdistance
+		distancealpha = bound(0, (self.max_health - distance) / (self.max_health - waypointsprite_normdistance), 1);
+		distancealpha = pow(distancealpha, waypointsprite_distancealphaexponent);
+	}
+	else if(self.max_health)
+	{
+		// alpha 1 if visible
+		distancealpha = 1;
+	}
+	else
+	{
+		// alpha 1 at normdistance, alpha minalpha at fadedistance
+		distancealpha = bound(0, (waypointsprite_fadedistance - distance) / (waypointsprite_fadedistance - waypointsprite_normdistance), 1);
+		distancealpha = pow(distancealpha, waypointsprite_distancealphaexponent);
+		distancealpha = distancealpha * (1 - waypointsprite_minalpha) + waypointsprite_minalpha;
+	}
+
+	self.alpha = timealpha * distancealpha;
+
+	return TRUE;
+}
+
+entity WaypointSprite_Spawn(
+	string spr, // sprite
+	float lifetime, float maxdistance, // lifetime, max distance
+	entity ref, vector ofs, // position
+	entity showto, float t, // show to whom? Use a flag to indicate a team
+	entity own, .entity ownfield, // remove when own gets killed
+	float hideable // true when it should be controlled by cl_hidewaypoints
+)
+{
+	entity wp;
+	wp = spawn();
+	wp.classname = "sprite_waypoint";
+	wp.teleport_time = time + lifetime;
+	wp.health = lifetime;
+	wp.view_ofs = ofs;
+	wp.aiment = ref;
+	wp.enemy = showto;
+	wp.team = t;
+	wp.owner = own;
+	wp.currentammo = hideable;
+	if(own)
+	{
+		if(own.ownfield)
+			remove(own.ownfield);
+		own.ownfield = wp;
+		wp.owned_by_field = ownfield;
+	}
+	wp.max_health = maxdistance;
+	wp.customizeentityforclient = WaypointSprite_CustomizeEntityForClient;
+	wp.think = WaypointSprite_Think;
+	wp.nextthink = time;
+	wp.effects = EF_NODEPTHTEST;
+	setmodel(wp, strcat("models/sprites/", spr, ".sp2"));
+	return wp;
+}
+
+entity WaypointSprite_SpawnFixed(
+	string spr,
+	vector ofs
+)
+{
+	return WaypointSprite_Spawn(spr, 0, 0, world, ofs, world, 0, world, enemy, TRUE);
+}
+
+.entity waypointsprite_deployed_fixed;
+entity WaypointSprite_DeployFixed(
+	string spr,
+	float limited_range,
+	vector ofs
+)
+{
+	float t, maxdistance;
+	if(teams_matter)
+		t = self.team;
+	else
+		t = 0;
+	if(limited_range)
+		maxdistance = waypointsprite_limitedrange;
+	else
+		maxdistance = 0;
+	return WaypointSprite_Spawn(spr, waypointsprite_deployed_lifetime, maxdistance, world, ofs, world, t, self, waypointsprite_deployed_fixed, FALSE);
+}
+
+.entity waypointsprite_deployed_personal;
+entity WaypointSprite_DeployPersonal(
+	string spr,
+	vector ofs
+)
+{
+	return WaypointSprite_Spawn(spr, 0, 0, world, ofs, self, 0, self, waypointsprite_deployed_personal, FALSE);
+}
+
+.entity waypointsprite_attached;
+.entity waypointsprite_attachedforcarrier;
+entity WaypointSprite_Attach(
+	string spr,
+	float limited_range
+)
+{
+	float t, maxdistance;
+	if(self.waypointsprite_attachedforcarrier)
+		return world; // can't attach to FC
+	if(teams_matter)
+		t = self.team;
+	else
+		t = 0;
+	if(limited_range)
+		maxdistance = waypointsprite_limitedrange;
+	else
+		maxdistance = 0;
+	return WaypointSprite_Spawn(spr, waypointsprite_deployed_lifetime, maxdistance, self, '0 0 64', world, t, self, waypointsprite_attached, FALSE);
+}
+
+entity WaypointSprite_AttachCarrier(
+	string spr,
+	entity carrier
+)
+{
+	WaypointSprite_Kill(carrier.waypointsprite_attached); // FC overrides attached
+	return WaypointSprite_Spawn(spr, 0, 0, carrier, '0 0 64', world, carrier.team, carrier, waypointsprite_attachedforcarrier, FALSE);
+}
+
+void WaypointSprite_DetachCarrier(entity carrier)
+{
+	WaypointSprite_Disown(carrier.waypointsprite_attachedforcarrier, 1);
+}
+
+void WaypointSprite_ClearPersonal()
+{
+	WaypointSprite_Kill(self.waypointsprite_deployed_personal);
+}
+
+void WaypointSprite_ClearOwned()
+{
+	WaypointSprite_Kill(self.waypointsprite_deployed_fixed);
+	WaypointSprite_Kill(self.waypointsprite_deployed_personal);
+	WaypointSprite_Kill(self.waypointsprite_attached);
+}
+
+void WaypointSprite_PlayerDead()
+{
+	WaypointSprite_Disown(self.waypointsprite_attached, waypointsprite_deadlifetime);
+	WaypointSprite_DetachCarrier(self);
+}
+
+void WaypointSprite_PlayerGone()
+{
+	WaypointSprite_Disown(self.waypointsprite_deployed_fixed, waypointsprite_deadlifetime);
+	WaypointSprite_Kill(self.waypointsprite_deployed_personal);
+	WaypointSprite_Disown(self.waypointsprite_attached, waypointsprite_deadlifetime);
+	WaypointSprite_DetachCarrier(self);
+}




More information about the nexuiz-commits mailing list