r2331 - in branches/nexuiz-2.0/data: . gfx menu/data qcsrc/common qcsrc/menu qcsrc/server

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Tue Apr 17 01:38:14 EDT 2007


Author: div0
Date: 2007-04-17 01:38:14 -0400 (Tue, 17 Apr 2007)
New Revision: 2331

Added:
   branches/nexuiz-2.0/data/gfx/crosshair10.tga
   branches/nexuiz-2.0/data/gfx/crosshair9.tga
   branches/nexuiz-2.0/data/qcsrc/common/gamecommand.qc
   branches/nexuiz-2.0/data/qcsrc/menu/gamecommand.qc
   branches/nexuiz-2.0/data/qcsrc/server/gamecommand.qc
Modified:
   branches/nexuiz-2.0/data/default.cfg
   branches/nexuiz-2.0/data/menu/data/player.menu
   branches/nexuiz-2.0/data/qcsrc/common/util.qh
   branches/nexuiz-2.0/data/qcsrc/menu/mbuiltin.qc
   branches/nexuiz-2.0/data/qcsrc/menu/menu.qc
   branches/nexuiz-2.0/data/qcsrc/menu/msys.qc
   branches/nexuiz-2.0/data/qcsrc/menu/progs.src
   branches/nexuiz-2.0/data/qcsrc/server/cl_weapons.qc
   branches/nexuiz-2.0/data/qcsrc/server/cl_weaponsystem.qc
   branches/nexuiz-2.0/data/qcsrc/server/defs.qh
   branches/nexuiz-2.0/data/qcsrc/server/g_damage.qc
   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
   branches/nexuiz-2.0/data/qcsrc/server/t_items.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_common.qc
   branches/nexuiz-2.0/data/qcsrc/server/waypointsprites.qc
Log:
gamecommand support;
maplist commands now edit directly using gamecommand;
adminmsg command;
waypointsprites now fade out in one second when dead;
m0rfar's crosshairs;
hit sounds only once per frame;
hit sounds for spectators;
weapon display for spectators;
attach sprites to local player and make them exteriormodeltoclient;
work around fteqcc warning by changing Item_SpawnFunc to Item_SpawnByItemCode


Modified: branches/nexuiz-2.0/data/default.cfg
===================================================================
--- branches/nexuiz-2.0/data/default.cfg	2007-04-16 22:55:16 UTC (rev 2330)
+++ branches/nexuiz-2.0/data/default.cfg	2007-04-17 05:38:14 UTC (rev 2331)
@@ -208,10 +208,6 @@
 seta g_maplist_index 0 // this is used internally for saving position in maplist cycle
 seta g_maplist_selectrandom 0 // if 1, a random map will be chosen as next map; DEPRECATED in favor of g_maplist_shuffle
 seta g_maplist_shuffle 0 // new randomization method: like selectrandom, but avoid playing the same maps in short succession. This works by taking out the first element and inserting it into g_maplist with a bias to the end of the list.
-alias g_maplist_shufflenow "set _g_maplist_shufflenow 1"
-alias g_maplist_add "set _g_maplist_add $1"
-alias g_maplist_remove "set _g_maplist_remove $1"
-alias g_maplist_putfirst "set _g_maplist_putfirst $1"
 // timeout for kill credit when your damage knocks someone into a death trap
 set g_maxpushtime 8.0
 
@@ -728,7 +724,6 @@
 set g_balance_nixnex_ammoincr_cells 2
 
 // score log
-alias printstats "set _printstats 1"	// print status on demand
 set sv_logscores_console 0		// print scores to server console
 set sv_logscores_file 0			// print scores to file
 set sv_logscores_filename scores.log	// filename
@@ -777,8 +772,6 @@
 seta cl_shownames 1 // show player names pointed to (0: never, 1: teamplay only, 2: always)
 set sv_allow_shownames 1
 
-alias teamstatus "set _scoreboard 1"
-
 con_chatwidth 0.6
 con_chat 5
 con_chatpos -7
@@ -818,7 +811,7 @@
 set g_waypointsprite_distancealphaexponent 2
 set g_waypointsprite_timealphaexponent 1
 set g_waypointsprite_deployed_lifetime 10
-set g_waypointsprite_deadlifetime 2
+set g_waypointsprite_deadlifetime 1
 set g_waypointsprite_limitedrange 5120
 set g_waypointsprite_stuffbinds 0
 alias "g_waypointsprite_personal"       "impulse 30"
@@ -836,3 +829,13 @@
 alias "g_waypointsprite_toggle"         "impulse 49"
 // key for that?
 seta cl_hidewaypoints 0
+
+// command extensions
+alias qc_cmd               "sv_cmd $*" // menu QC will override this to menu_cmd
+alias adminmsg             "sv_cmd adminmsg $*"
+alias teamstatus           "sv_cmd teamstatus"
+alias printstats           "sv_cmd printstats" // print status on demand
+alias g_maplist_add        "qc_cmd rpn /maps/$1.mapcfg fexists_assert /g_maplist g_maplist /$1 union def"
+alias g_maplist_remove     "qc_cmd rpn /g_maplist g_maplist /$1 difference def"
+alias g_maplist_putfirst   "qc_cmd rpn /maps/$1.mapcfg fexists_assert /g_maplist /$1 g_maplist union def"
+alias g_maplist_shufflenow "qc_cmd rpn /g_maplist g_maplist shuffle def"

Copied: branches/nexuiz-2.0/data/gfx/crosshair10.tga (from rev 2329, trunk/data/gfx/crosshair10.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/gfx/crosshair9.tga (from rev 2329, trunk/data/gfx/crosshair9.tga)
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/menu/data/player.menu
===================================================================
--- branches/nexuiz-2.0/data/menu/data/player.menu	2007-04-16 22:55:16 UTC (rev 2330)
+++ branches/nexuiz-2.0/data/menu/data/player.menu	2007-04-17 05:38:14 UTC (rev 2331)
@@ -144,9 +144,9 @@
 			{
 				minValue 0
 				stepValue 1
-				maxValue 8
+				maxValue 10
 
-				descList	"'' '$gfx/crosshair1' '$gfx/crosshair2' '$gfx/crosshair3' '$gfx/crosshair4' '$gfx/crosshair5' '$gfx/crosshair6' '$gfx/crosshair7' '$gfx/crosshair8'"
+				descList	"'' '$gfx/crosshair1' '$gfx/crosshair2' '$gfx/crosshair3' '$gfx/crosshair4' '$gfx/crosshair5' '$gfx/crosshair6' '$gfx/crosshair7' '$gfx/crosshair8' '$gfx/crosshair9' '$gfx/crosshair10'"
 
 				link		"##up"
 			}

Copied: branches/nexuiz-2.0/data/qcsrc/common/gamecommand.qc (from rev 2317, trunk/data/qcsrc/common/gamecommand.qc)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/common/gamecommand.qc	                        (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/common/gamecommand.qc	2007-04-17 05:38:14 UTC (rev 2331)
@@ -0,0 +1,253 @@
+#define MAX_RPN_STACK 8
+float rpn_error;
+float rpn_sp;
+string rpn_stack[MAX_RPN_STACK];
+string rpn_pop() {
+	if(rpn_sp > 0) {
+		--rpn_sp;
+		return rpn_stack[rpn_sp];
+	} else {
+		print("rpn: stack underflow\n");
+		rpn_error = TRUE;
+		return "";
+	}
+}
+void rpn_push(string s) {
+	if(rpn_sp < MAX_RPN_STACK) {
+		rpn_stack[rpn_sp] = s;
+		++rpn_sp;
+	} else {
+		print("rpn: stack overflow\n");
+		rpn_error = TRUE;
+	}
+}
+string rpn_get() {
+	if(rpn_sp > 0) {
+		return rpn_stack[rpn_sp - 1];
+	} else {
+		print("rpn: empty stack\n");
+		rpn_error = TRUE;
+		return "";
+	}
+}
+void rpn_set(string s) {
+	if(rpn_sp > 0) {
+		rpn_stack[rpn_sp - 1] = s;
+	} else {
+		print("rpn: empty stack\n");
+		rpn_error = TRUE;
+	}
+}
+float rpn_getf() { return stof(rpn_get()); }
+float rpn_popf() { return stof(rpn_pop()); }
+void rpn_pushf(float f) { return rpn_push(ftos(f)); }
+void rpn_setf(float f) { return rpn_set(ftos(f)); }
+
+float GameCommand_Generic(string command)
+{
+	float argc;
+	argc = tokenize(command);
+	if(argv(0) == "help")
+	{
+		print("  rpn EXPRESSION... - a RPN calculator.\n");
+		print("    Operator description (x: string, s: set, f: float):\n");
+		print("    x pop ----------------------------->     : removes the top\n");
+		print("    x dup -----------------------------> x x : duplicates the top\n");
+		print("    x x exch --------------------------> x x : swap the top two\n");
+		print("    /cvarname load --------------------> x   : loads a cvar\n");
+		print("    /cvarname x def ------------------->     : writes to a cvar\n");
+		print("    f f add|sub|mul|div|mod -----------> f   : adds/... two numbers\n");
+		print("    f neg|abs|sgn|rand ----------------> f   : negates/... a number\n");
+		print("    s s union|intersection|difference -> s   : set operations\n");
+		print("    s shuffle -------------------------> s   : randomly arrange elements\n");
+		print("    Set operations operate on 'such''strings' like g_maplist.\n");
+		print("    Unknown tokens insert their cvar value.\n");
+		return TRUE;
+	}
+	
+	if(argv(0) == "rpn")
+	{
+		if(argc >= 2)
+		{
+			float rpnpos;
+			string rpncmd;
+			string s, s2;
+			float f, f2;
+			float i, j;
+			rpn_sp = 0;
+			rpn_error = FALSE;
+			for(rpnpos = 1; rpnpos < argc; ++rpnpos)
+			{
+				rpncmd = argv(rpnpos);
+				f = strlen(rpncmd);
+				if(rpncmd == "") {
+				} else if(stof(substring(rpncmd, 0, 1)) > 0) {
+					rpn_push(rpncmd);
+				} else if(substring(rpncmd, 0, 1) == "0") {
+					rpn_push(rpncmd);
+				} else if(f >= 2 && substring(rpncmd, 0, 1) == "+") {
+					rpn_push(rpncmd);
+				} else if(f >= 2 && substring(rpncmd, 0, 1) == "-") {
+					rpn_push(rpncmd);
+				} else if(f >= 2 && substring(rpncmd, 0, 1) == "/") {
+					rpn_push(substring(rpncmd, 1, strlen(rpncmd) - 1));
+				} else if(rpncmd == "def" || rpncmd == "=") {
+					s = rpn_pop();
+					s2 = rpn_pop();
+#ifdef MENUQC
+					registercvar(s2, "", 0);
+#else
+					registercvar(s2, "");
+#endif
+					if(!rpn_error) // don't change cvars if a stack error had happened!
+						cvar_set(s2, s);
+				} else if(rpncmd == "load") {
+					rpn_set(cvar_string(rpn_get()));
+				} else if(rpncmd == "exch") {
+					s = rpn_pop();
+					s2 = rpn_get();
+					rpn_set(s);
+					rpn_push(s2);
+				} else if(rpncmd == "dup") {
+					rpn_push(rpn_get());
+				} else if(rpncmd == "pop") {
+					rpn_pop();
+				} else if(rpncmd == "add" || rpncmd == "+") {
+					f = rpn_popf();
+					rpn_setf(rpn_getf() + f);
+				} else if(rpncmd == "sub" || rpncmd == "-") {
+					f = rpn_popf();
+					rpn_setf(rpn_getf() - f);
+				} else if(rpncmd == "mul" || rpncmd == "*") {
+					f = rpn_popf();
+					rpn_setf(rpn_getf() * f);
+				} else if(rpncmd == "div" || rpncmd == "/") {
+					f = rpn_popf();
+					rpn_setf(rpn_getf() / f);
+				} else if(rpncmd == "mod" || rpncmd == "%") {
+					f = rpn_popf();
+					f2 = rpn_getf();
+					rpn_setf(f2 - f * floor(f2 / f));
+				} else if(rpncmd == "abs") {
+					rpn_setf(fabs(rpn_getf()));
+				} else if(rpncmd == "sgn") {
+					f = rpn_getf();
+					if(f < 0)
+						rpn_set("-1");
+					else if(f > 0)
+						rpn_set("1");
+					else
+						rpn_set("0");
+				} else if(rpncmd == "neg" || rpncmd == "~") {
+					rpn_setf(-rpn_getf());
+				} else if(rpncmd == "rand") {
+					rpn_setf(ceil(random() * rpn_getf()) - 1);
+				} else if(rpncmd == "union") {
+					// s s2 union
+					s2 = rpn_pop();
+					s = rpn_get();
+					f = tokenize(s);
+					f2 = tokenize(strcat(s, s2));
+					// tokens 0..(f-1) represent s
+					// tokens f..f2 represent s2
+					// UNION: add all tokens to s that are in s2 but not in s
+					s = "";
+					for(i = 0; i < f; ++i)
+						s = strcat(s, "'", argv(i), "'");
+					for(i = f; i < f2; ++i) {
+						for(j = 0; j < f; ++j)
+							if(argv(i) == argv(j))
+								goto skip_union;
+						s = strcat(s, "'", argv(i), "'");
+:skip_union
+					}
+					rpn_set(s);
+					tokenize(command);
+				} else if(rpncmd == "intersection") {
+					// s s2 intersection
+					s2 = rpn_pop();
+					s = rpn_get();
+					f = tokenize(s);
+					f2 = tokenize(strcat(s, s2));
+					// tokens 0..(f-1) represent s
+					// tokens f..f2 represent s2
+					// INTERSECTION: keep only the tokens from s that are also in s2
+					s = "";
+					for(i = 0; i < f; ++i) {
+						for(j = f; j < f2; ++j)
+							if(argv(i) == argv(j))
+							{
+								s = strcat(s, "'", argv(i), "'");
+								break;
+							}
+					}
+					rpn_set(s);
+					tokenize(command);
+				} else if(rpncmd == "difference") {
+					// s s2 difference
+					s2 = rpn_pop();
+					s = rpn_get();
+					f = tokenize(s);
+					f2 = tokenize(strcat(s, s2));
+					// tokens 0..(f-1) represent s
+					// tokens f..f2 represent s2
+					// DIFFERENCE: keep only the tokens from s that are not in s2
+					s = "";
+					for(i = 0; i < f; ++i) {
+						for(j = f; j < f2; ++j)
+							if(argv(i) == argv(j))
+								goto skip_difference;
+						s = strcat(s, "'", argv(i), "'");
+:skip_difference
+					}
+					rpn_set(s);
+					tokenize(command);
+				} else if(rpncmd == "shuffle") {
+					// s shuffle
+					s = rpn_get();
+					f = tokenize(s);
+
+					for(i = 0; i < f - 1; ++i) {
+						// move a random item from i..f-1 to position i
+						s = "";
+						f2 = ceil(random() * (f - i) + i) - 1;
+						for(j = 0; j < i; ++j)
+							s = strcat(s, "'", argv(j), "'");
+						s = strcat(s, "'", argv(f2), "'");
+						for(j = i; j < f; ++j)
+							if(j != f2)
+								s = strcat(s, "'", argv(j), "'");
+						f = tokenize(s);
+					}
+
+					rpn_set(s);
+					tokenize(command);
+				} else if(rpncmd == "fexists_assert") {
+					s = rpn_pop();
+					if(!rpn_error)
+					{
+						f = fopen(s, FILE_READ);
+						if(f != -1)
+							fclose(f);
+						else {
+							print("rpn: ERROR: ", s, " does not exist!\n");
+							rpn_error = TRUE;
+						}
+					}
+				} else {
+					rpn_push(cvar_string(rpncmd));
+				}
+				if(rpn_error)
+					break;
+			}
+			while(rpn_sp > 0)
+			{
+				s = rpn_pop();
+				print("rpn: still on stack: ", s, "\n");
+			}
+			return TRUE;
+		}
+	}
+
+	return FALSE;
+}

Modified: branches/nexuiz-2.0/data/qcsrc/common/util.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/common/util.qh	2007-04-16 22:55:16 UTC (rev 2330)
+++ branches/nexuiz-2.0/data/qcsrc/common/util.qh	2007-04-17 05:38:14 UTC (rev 2331)
@@ -6,3 +6,7 @@
 void wordwrap_sprint(string s, float l);
 #endif
 void wordwrap_cb(string s, float l, void(string) callback)
+
+float GameCommand_Generic(string cmd);
+// returns TRUE if handled, FALSE otherwise
+// uses tokenize on its argument!

Copied: branches/nexuiz-2.0/data/qcsrc/menu/gamecommand.qc (from rev 2317, trunk/data/qcsrc/menu/gamecommand.qc)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/gamecommand.qc	                        (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/menu/gamecommand.qc	2007-04-17 05:38:14 UTC (rev 2331)
@@ -0,0 +1,23 @@
+void GameCommand_Init()
+{
+	// make gg call menu QC commands
+	localcmd("alias qc_cmd \"menu_cmd $*\"\n");
+}
+
+void GameCommand(string command)
+{
+	float argc;
+	argc = tokenize(command);
+
+	if(argv(0) == "help" || argc == 0)
+	{
+		print("Usage: menu_cmd COMMAND..., where possible commands are:\n");
+		GameCommand_Generic("help");
+		return;
+	}
+
+	if(GameCommand_Generic(command))
+		return;
+
+	print("Invalid command. For a list of supported commands, try menu_cmd help.\n");
+}

Modified: branches/nexuiz-2.0/data/qcsrc/menu/mbuiltin.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/mbuiltin.qc	2007-04-16 22:55:16 UTC (rev 2330)
+++ branches/nexuiz-2.0/data/qcsrc/menu/mbuiltin.qc	2007-04-17 05:38:14 UTC (rev 2331)
@@ -122,7 +122,8 @@
 void	strunzone(string s) = #57;
 #endif
 
-float	tokenize(string s)  = #58
+float	tokenize(string s) = #58;
+float(string s, string separator1, ...) tokenizebyseparator = #479;
 string	argv(float n)  = #59;
 
 float	isserver(void)  = #60;

Modified: branches/nexuiz-2.0/data/qcsrc/menu/menu.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/menu.qc	2007-04-16 22:55:16 UTC (rev 2330)
+++ branches/nexuiz-2.0/data/qcsrc/menu/menu.qc	2007-04-17 05:38:14 UTC (rev 2331)
@@ -31,6 +31,9 @@
 
 	// init menu
 	Menu_Init();
+
+	// menu QC is running; make the aliases use its GameCommand()
+	GameCommand_Init();
 };
 
 // required menu functions
@@ -148,4 +151,4 @@
 	// make sure everything is reset
 	setkeydest( KEY_GAME );
 	setmousetarget( MT_CLIENT );
-};
\ No newline at end of file
+};

Modified: branches/nexuiz-2.0/data/qcsrc/menu/msys.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/msys.qc	2007-04-16 22:55:16 UTC (rev 2330)
+++ branches/nexuiz-2.0/data/qcsrc/menu/msys.qc	2007-04-17 05:38:14 UTC (rev 2331)
@@ -267,7 +267,7 @@
 float ERR_NULLSTRING			= -1;
 float ERR_BADDRAWFLAG			= -2;
 float ERR_BADSCALE			= -3;
-float ERR_BADSIZE			= ERR_BADSCALE;
+//float ERR_BADSIZE			= ERR_BADSCALE;
 float ERR_NOTCACHED			= -4;
 
 /* not supported at the moment

Modified: branches/nexuiz-2.0/data/qcsrc/menu/progs.src
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/progs.src	2007-04-16 22:55:16 UTC (rev 2330)
+++ branches/nexuiz-2.0/data/qcsrc/menu/progs.src	2007-04-17 05:38:14 UTC (rev 2331)
@@ -185,4 +185,8 @@
 ../common/campaign_setup.qc
 ../common/campaign_file.qc
 
+// GameCommand() extension
+../common/gamecommand.qc
+gamecommand.qc
+
 menu.qc

Modified: branches/nexuiz-2.0/data/qcsrc/server/cl_weapons.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/cl_weapons.qc	2007-04-16 22:55:16 UTC (rev 2330)
+++ branches/nexuiz-2.0/data/qcsrc/server/cl_weapons.qc	2007-04-17 05:38:14 UTC (rev 2331)
@@ -110,7 +110,7 @@
 		remove(wep);
 		goto leave;
 	}
-	(Item_SpawnFunc(w))();
+	Item_SpawnByItemCode(w);
 	if(startitem_failed)
 		goto leave;
 	if(doreduce)

Modified: branches/nexuiz-2.0/data/qcsrc/server/cl_weaponsystem.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/cl_weaponsystem.qc	2007-04-16 22:55:16 UTC (rev 2330)
+++ branches/nexuiz-2.0/data/qcsrc/server/cl_weaponsystem.qc	2007-04-17 05:38:14 UTC (rev 2331)
@@ -123,6 +123,17 @@
 		e.angles = vectoangles(v_forward);
 }
 
+float CL_Weaponentity_CustomizeEntityForClient()
+{
+	if(other == self.owner)
+		self.viewmodelforclient = other;
+	else
+		if(other.classname == "spectator")
+			if(other.enemy == self.owner)
+				self.viewmodelforclient = other;
+	return TRUE;
+}
+
 .string weaponname;
 void() CL_Weaponentity_Think =
 {
@@ -225,6 +236,7 @@
 	self.weaponentity.viewmodelforclient = self;
 	self.weaponentity.flags = 0;
 	self.weaponentity.think = CL_Weaponentity_Think;
+	self.weaponentity.customizeentityforclient = CL_Weaponentity_CustomizeEntityForClient;
 	self.weaponentity.nextthink = time;
 	self.weaponentity.scale = 0.61;
 

Modified: branches/nexuiz-2.0/data/qcsrc/server/defs.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/defs.qh	2007-04-16 22:55:16 UTC (rev 2330)
+++ branches/nexuiz-2.0/data/qcsrc/server/defs.qh	2007-04-17 05:38:14 UTC (rev 2331)
@@ -93,6 +93,7 @@
 .float		dmgtime;
 
 .float		killcount;
+.float hitsound;
 
 .float watersound_finished;
 .float iscreature;
@@ -286,10 +287,9 @@
 
 
 typedef .float floatfield;
-typedef void(void) spawnfunc;
 floatfield Item_CounterField(float it);
 float Item_WeaponCode(float it);
-spawnfunc Item_SpawnFunc(float it);
+void Item_SpawnByItemCode(float it);
 
 float W_AmmoItemCode(float wpn);
 float W_ItemCode(float wpn);

Modified: branches/nexuiz-2.0/data/qcsrc/server/g_damage.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/g_damage.qc	2007-04-16 22:55:16 UTC (rev 2330)
+++ branches/nexuiz-2.0/data/qcsrc/server/g_damage.qc	2007-04-17 05:38:14 UTC (rev 2331)
@@ -394,9 +394,9 @@
 	if(targ != attacker)
 	if(!targ.deadflag)
 	if(damage > 0)
-	if(clienttype(attacker) == CLIENTTYPE_REAL)
 	if(targ.classname == "player")
-		stuffcmd(attacker, "play2 misc/hit.wav\n");
+	if(attacker)
+		attacker.hitsound += 1;
 
 	if (cvar("g_minstagib"))
 	{
@@ -410,8 +410,7 @@
 			targ.armorvalue -= 1;
 			centerprint(targ, strcat("^3Remaining extra lives: ",ftos(targ.armorvalue),"\n"));
 			damage = 0;
-			if(clienttype(targ) == CLIENTTYPE_REAL) stuffcmd(targ, "play2 misc/hit.wav\n");
-			//stuffcmd(attacker, "play2 misc/hit.wav\n");
+			targ.hitsound += 1;
 		}
 		else if (deathtype == IT_NEX && targ.items & IT_STRENGTH)
 		{
@@ -547,7 +546,7 @@
 				{
 					attacker.armorvalue = attacker.armorvalue - 1;
 					centerprint(attacker, strcat("^3Remaining extra lives: ",ftos(attacker.armorvalue),"\n"));
-					if(clienttype(attacker) == CLIENTTYPE_REAL) stuffcmd(attacker, "play2 misc/hit.wav\n");
+					attacker.hitsound += 1;
 				}
 				mirrordamage = 0;
 			}

Modified: branches/nexuiz-2.0/data/qcsrc/server/g_world.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/g_world.qc	2007-04-16 22:55:16 UTC (rev 2330)
+++ branches/nexuiz-2.0/data/qcsrc/server/g_world.qc	2007-04-17 05:38:14 UTC (rev 2331)
@@ -2,7 +2,7 @@
 
 string GetMapname();
 void GotoNextMap();
-void HandleMaplistShuffleCommands();
+void ShuffleMaplist()
 float() DoNextMapOverride;
 
 void SetDefaultAlpha()
@@ -57,7 +57,8 @@
 	if(cvar("_sv_init"))
 	{
 		cvar_set("_sv_init", "0");
-		HandleMaplistShuffleCommands();
+		if(cvar("g_maplist_shuffle"))
+			ShuffleMaplist();
 		tokenize(cvar_string("g_maplist"));
 		if(argv(0) != GetMapname())
 		{
@@ -340,12 +341,6 @@
 	// 63 testing
 	lightstyle(63, "a");
 
-	registercvar("_g_maplist_shufflenow", "0");
-	registercvar("_g_maplist_have_shuffled", "0");
-	registercvar("_g_maplist_add", "");
-	registercvar("_g_maplist_remove", "");
-	registercvar("_g_maplist_putfirst", "");
-
 	player_count = 0;
 	lms_lowest_lives = 0;
 	lms_next_place = 0;
@@ -887,31 +882,45 @@
 ===============================================================================
 */
 
-void() DumpStats =
+void(float final) DumpStats =
 {
 	local float file;
 	local string s;
+	local float to_console;
+	local float to_eventlog;
+	local float to_file;
 
-	if(cvar("_printstats"))
-		cvar_set("_printstats", "0");
-	else if(!gameover)
-		return;
+	to_console = cvar("sv_logscores_console");
+	to_eventlog = cvar("sv_eventlog");
+	to_file = cvar("sv_logscores_file");
 
-	if(gameover)
+	if(!final)
+	{
+		to_console = TRUE; // always print printstats replies
+		to_eventlog = FALSE; // but never print them to the event log
+	}
+
+	if(to_eventlog)
+		if(cvar("sv_eventlog_console"))
+			to_console = FALSE; // otherwise we get the output twice
+
+	if(final)
 		s = ":scores:";
 	else
 		s = ":status:";
-
 	s = strcat(s, GetMapname(), ":", ftos(rint(time)));
 
-	if(cvar("sv_eventlog") && gameover)
-		GameLogEcho(s, FALSE);
-	else if(cvar("sv_logscores_console"))
+	if(to_console)
 		ServerConsoleEcho(s, FALSE);
-	if(cvar("sv_logscores_file"))
+	if(to_eventlog)
+		GameLogEcho(s, FALSE);
+	if(to_file)
 	{
 		file = fopen(cvar_string("sv_logscores_filename"), FILE_APPEND);
-		fputs(file, strcat(s, "\n"));
+		if(file == -1)
+			to_file = FALSE;
+		else
+			fputs(file, strcat(s, "\n"));
 	}
 
 	FOR_EACH_CLIENT(other)
@@ -923,20 +932,20 @@
 			s = strcat(s, ftos(rint(time - other.jointime)), ":");
 			s = strcat(s, ftos(other.team), ":");
 
-			if(cvar("sv_logscores_file"))
-				fputs(file, strcat(s, other.netname, "\n"));
-			if(cvar("sv_eventlog") && gameover)
-				GameLogEcho(strcat(s, ftos(other.playerid), ":", other.netname), TRUE);
-			else if(cvar("sv_logscores_console"))
+			if(to_console)
 				ServerConsoleEcho(strcat(s, other.netname), TRUE);
+			if(to_eventlog)
+				GameLogEcho(strcat(s, ftos(other.playerid), ":", other.netname), TRUE);
+			if(to_file)
+				fputs(file, strcat(s, other.netname, "\n"));
 		}
 	}
 
-	if(cvar("sv_eventlog") && gameover)
-		GameLogEcho(":end", FALSE);
-	else if(cvar("sv_logscores_console"))
+	if(to_console)
 		ServerConsoleEcho(":end", FALSE);
-	if(cvar("sv_logscores_file"))
+	if(to_eventlog)
+		GameLogEcho(":end", FALSE);
+	if(to_file)
 	{
 		fputs(file, ":end\n");
 		fclose(file);
@@ -1001,7 +1010,7 @@
 
 	VoteReset();
 
-	DumpStats();
+	DumpStats(TRUE);
 
 	if(cvar("sv_eventlog"))
 		GameLogEcho(":gameover", FALSE);
@@ -1436,91 +1445,6 @@
 	print_to(e, ".");
 }
 
-void RemoveFromMaplist(string m)
-{
-	string result;
-	float litems;
-	float i;
-	float found;
-
-	litems = tokenize(cvar_string("g_maplist"));
-	found = 0;
-	result = "";
-	for(i = 0; i < litems; ++i)
-	{
-		m = strcat1(m);
-		result = strcat1(result);
-		if(argv(i) == m)
-			found += 1;
-		else
-			result = strcat(result, "'", argv(i), "'");
-	}
-	if(found)
-		cvar_set("g_maplist", result);
-	ServerConsoleEcho(strcat("Removed ", ftos(found), " items."), FALSE);
-}
-
-void AddToMaplist(string m)
-{
-	string result;
-	float found;
-	float litems;
-	float i;
-	float ipos;
-	float inserted;
-
-	if(!TryFile(strcat("maps/", m, ".mapcfg")))
-	{
-		ServerConsoleEcho("Map not found.", FALSE);
-		return;
-	}
-
-	litems = tokenize(cvar_string("g_maplist"));
-	if(cvar("g_maplist_shuffle"))
-		ipos = ceil(random() * (litems + 1)) - 1;
-	else
-		ipos = litems;
-	found = 0;
-	inserted = 0;
-	for(i = 0; i < litems; ++i)
-	{
-		m = strcat1(m);
-		if(i == ipos)
-		{
-			result = strcat(result, "'", m, "'");
-			inserted = 1;
-		}
-		result = strcat(result, "'", argv(i), "'");
-		if(argv(i) == m)
-			found += 1;
-	}
-	if(!inserted)
-		result = strcat(result, "'", m, "'");
-	if(!found)
-	{
-		cvar_set("g_maplist", result);
-		ServerConsoleEcho("Map added.", FALSE);
-	}
-	else
-		ServerConsoleEcho("Map already in list.", FALSE);
-}
-
-void MakeFirstInMaplist(string m)
-{
-	if(!TryFile(strcat("maps/", m, ".mapcfg")))
-	{
-		ServerConsoleEcho("Map not found.", FALSE);
-		return;
-	}
-
-	m = strzone(m);
-	RemoveFromMaplist(m);
-	cvar_set("g_maplist", strcat("'", m, "'", cvar_string("g_maplist")));
-	strunzone(m);
-
-	ServerConsoleEcho("Map added as first one.", FALSE);
-}
-
 void ShuffleMaplist()
 {
 	string result;
@@ -1555,36 +1479,6 @@
 	cvar_set("g_maplist", result);
 }
 
-void() HandleMaplistShuffleCommands =
-{
-	// automatically shuffle when setting g_maplist_shuffle
-	if(cvar_string("_g_maplist_add") != "")
-	{
-		AddToMaplist(cvar_string("_g_maplist_add"));
-		cvar_set("_g_maplist_add", "");
-	}
-	if(cvar_string("_g_maplist_remove") != "")
-	{
-		RemoveFromMaplist(cvar_string("_g_maplist_remove"));
-		cvar_set("_g_maplist_remove", "");
-	}
-	if(cvar_string("_g_maplist_putfirst") != "")
-	{
-		MakeFirstInMaplist(cvar_string("_g_maplist_putfirst"));
-		cvar_set("_g_maplist_putfirst", "");
-	}
-	if(cvar("_g_maplist_shufflenow") || (cvar("g_maplist_shuffle") && !cvar("_g_maplist_have_shuffled")))
-	{
-		ShuffleMaplist();
-		cvar_set("_g_maplist_shufflenow", "0");
-		cvar_set("_g_maplist_have_shuffled", "1");
-		ServerConsoleEcho("Shuffled map list.", FALSE);
-	}
-	if(cvar("_g_maplist_have_shuffled"))
-		if(!cvar("g_maplist_shuffle"))
-			cvar_set("_g_maplist_have_shuffled", "0");
-}
-
 /*
 ============
 CheckRules_World
@@ -1613,16 +1507,6 @@
 	if (gameover)	// someone else quit the game already
 		return;
 
-	DumpStats();
-
-	if(cvar("_scoreboard"))
-	{
-		cvar_set("_scoreboard", "0");
-		PrintScoreboard(world);
-	}
-
-	HandleMaplistShuffleCommands();
-
 	timelimit = cvar("timelimit") * 60;
 	fraglimit = cvar("fraglimit");
 
@@ -2040,4 +1924,13 @@
 
 void EndFrame()
 {
+	FOR_EACH_REALCLIENT(self)
+		if(self.classname == "spectator")
+			self.hitsound += self.enemy.hitsound;
+	FOR_EACH_REALCLIENT(self)
+		if(self.hitsound)
+		{
+			stuffcmd(self, "play2 misc/hit.wav\n");
+			self.hitsound = FALSE;
+		}
 }

Copied: branches/nexuiz-2.0/data/qcsrc/server/gamecommand.qc (from rev 2317, trunk/data/qcsrc/server/gamecommand.qc)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/gamecommand.qc	                        (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/server/gamecommand.qc	2007-04-17 05:38:14 UTC (rev 2331)
@@ -0,0 +1,54 @@
+void GameCommand(string command)
+{
+	float argc;
+	argc = tokenize(command);
+
+	if(argv(0) == "help" || argc == 0)
+	{
+		print("Usage: sv_cmd COMMAND..., where possible commands are:\n");
+		print("  adminmsg clientnumber \"message\"\n");
+		print("  teamstatus\n");
+		print("  printstats\n");
+		GameCommand_Generic("help");
+		return;
+	}
+
+	if(GameCommand_Generic(command))
+		return;
+
+	if(argv(0) == "teamstatus")
+	{
+		PrintScoreboard(world);
+		return;
+	}
+
+	if(argv(0) == "printstats")
+	{
+		DumpStats(FALSE);
+		return;
+	}
+
+	if(argv(0) == "adminmsg")
+	{
+		if(argc == 3)
+		{
+			entity client;
+			float entno;
+			entno = stof(argv(1));
+			for(client = world; entno > 0; --entno, client = nextent(client))
+				;
+			if(client.flags & FL_CLIENT)
+			{
+				centerprint_atprio(client, CENTERPRIO_ADMIN, strcat("^3SERVER ADMIN:\n\n^7", argv(2)));
+				sprint(client, strcat("\{1}\{13}^3SERVER ADMIN^7: ", argv(2), "\n"));
+				print("Message sent to ", client.netname, "\n");
+			}
+			else
+				print("Client not found\n");
+			return;
+		}
+	}
+
+	print("Invalid command. For a list of supported commands, try sv_cmd help.\n");
+}
+

Modified: branches/nexuiz-2.0/data/qcsrc/server/miscfunctions.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/miscfunctions.qc	2007-04-16 22:55:16 UTC (rev 2330)
+++ branches/nexuiz-2.0/data/qcsrc/server/miscfunctions.qc	2007-04-17 05:38:14 UTC (rev 2331)
@@ -522,6 +522,7 @@
 #define CENTERPRIO_VOTE 4
 #define CENTERPRIO_NORMAL 5
 #define CENTERPRIO_MAPVOTE 9
+#define CENTERPRIO_ADMIN 99
 .float centerprint_priority;
 .float centerprint_expires;
 void centerprint_atprio(entity e, float prio, string s)

Modified: branches/nexuiz-2.0/data/qcsrc/server/progs.src
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/progs.src	2007-04-16 22:55:16 UTC (rev 2330)
+++ branches/nexuiz-2.0/data/qcsrc/server/progs.src	2007-04-17 05:38:14 UTC (rev 2331)
@@ -81,3 +81,6 @@
 campaign.qc
 ../common/campaign_file.qc
 ../common/campaign_setup.qc
+
+../common/gamecommand.qc
+gamecommand.qc

Modified: branches/nexuiz-2.0/data/qcsrc/server/t_items.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/t_items.qc	2007-04-16 22:55:16 UTC (rev 2330)
+++ branches/nexuiz-2.0/data/qcsrc/server/t_items.qc	2007-04-17 05:38:14 UTC (rev 2331)
@@ -624,19 +624,20 @@
 	}
 }
 
-spawnfunc Item_SpawnFunc(float it)
+void Item_SpawnByItemCode(float it)
 {
 	switch(it)
 	{
-		case IT_SHOTGUN:          return weapon_shotgun;
-		case IT_UZI:              return weapon_uzi;
-		case IT_GRENADE_LAUNCHER: return weapon_grenadelauncher;
-		case IT_ELECTRO:          return weapon_electro;
-		case IT_CRYLINK:          return weapon_crylink;
-		case IT_NEX:              return weapon_nex;
-		case IT_HAGAR:            return weapon_hagar;
-		case IT_ROCKET_LAUNCHER:  return weapon_rocketlauncher;
+		case IT_SHOTGUN:          weapon_shotgun(); break;
+		case IT_UZI:              weapon_uzi(); break;
+		case IT_GRENADE_LAUNCHER: weapon_grenadelauncher(); break;
+		case IT_ELECTRO:          weapon_electro(); break;
+		case IT_CRYLINK:          weapon_crylink(); break;
+		case IT_NEX:              weapon_nex(); break;
+		case IT_HAGAR:            weapon_hagar(); break;
+		case IT_ROCKET_LAUNCHER:  weapon_rocketlauncher(); break;
 		// add all other item spawn functions here
-		default:                  error("requested item can't be spawned");
+		default:
+			error("requested item can't be spawned");
 	}
 }

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_common.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_common.qc	2007-04-16 22:55:16 UTC (rev 2330)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_common.qc	2007-04-17 05:38:14 UTC (rev 2331)
@@ -167,9 +167,6 @@
 			else
 				te_spike (trace_endpos);
 		}
-		//else if (trace_ent.classname == "player" || trace_ent.classname == "corpse" || trace_ent.classname == "gib")
-			//stuffcmd(self, "play2 misc/hit.wav\n");
-			//sound (self, CHAN_BODY, "misc/hit.wav", 1, ATTN_NORM);
 		Damage (trace_ent, self, self, damage, dtype, trace_endpos, dir * damage * 5);
 	}
 }

Modified: branches/nexuiz-2.0/data/qcsrc/server/waypointsprites.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/waypointsprites.qc	2007-04-16 22:55:16 UTC (rev 2330)
+++ branches/nexuiz-2.0/data/qcsrc/server/waypointsprites.qc	2007-04-17 05:38:14 UTC (rev 2331)
@@ -51,10 +51,15 @@
 		return;
 	if(wp.owner)
 	{
-		if(wp.aiment == wp.owner)
+		if(wp.exteriormodeltoclient == wp.owner)
 		{
-			wp.view_ofs = wp.view_ofs + wp.aiment.origin;
-			wp.aiment = world;
+			setattachment(wp, world, "");
+#ifdef ATTACHMENT_WORKS_WITH_EF_NODEPTHTEST
+			setorigin(wp, wp.origin + wp.exteriormodeltoclient.origin);
+#else
+			setorigin(wp, wp.view_ofs + wp.exteriormodeltoclient.origin);
+#endif
+			wp.exteriormodeltoclient = world;
 		}
 		wp.owner.(wp.owned_by_field) = world;
 		wp.owner = world;
@@ -121,19 +126,34 @@
 			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;
 
+#ifdef ATTACHMENT_WORKS_WITH_EF_NODEPTHTEST
+	realorigin = self.exteriormodeltoclient.origin + self.origin;
+#else
+	if(self.exteriormodeltoclient)
+	{
+		if(self.exteriormodeltoclient == other)
+		{
+			setattachment(self, other, "");
+			setorigin(self, self.view_ofs);
+			realorigin = other.origin + self.origin;
+		}
+		else
+		{
+			setattachment(self, world, "");
+			setorigin(self, self.exteriormodeltoclient.origin + self.view_ofs);
+			realorigin = self.origin;
+		}
+	}
+	else
+		realorigin = self.origin;
+#endif
+
 	distance = vlen(realorigin - porigin);
 
 	if(self.max_health)
@@ -180,8 +200,18 @@
 	wp.classname = "sprite_waypoint";
 	wp.teleport_time = time + lifetime;
 	wp.health = lifetime;
-	wp.view_ofs = ofs;
-	wp.aiment = ref;
+	wp.exteriormodeltoclient = ref;
+	if(ref)
+	{
+#ifdef ATTACHMENT_WORKS_WITH_EF_NODEPTHTEST
+		setattachment(wp, ref, "");
+		setorigin(wp, ofs);
+#else
+		wp.view_ofs = ofs;
+#endif
+	}
+	else
+		setorigin(wp, ofs);
 	wp.enemy = showto;
 	wp.team = t;
 	wp.owner = own;
@@ -270,7 +300,7 @@
 
 void WaypointSprite_DetachCarrier(entity carrier)
 {
-	WaypointSprite_Disown(carrier.waypointsprite_attachedforcarrier, 1);
+	WaypointSprite_Disown(carrier.waypointsprite_attachedforcarrier, waypointsprite_deadlifetime);
 }
 
 void WaypointSprite_ClearPersonal()




More information about the nexuiz-commits mailing list