[nexuiz-commits] r6488 - in branches/nexuiz-2.0: . data data/maps data/models/items data/models/turrets data/qcsrc/client data/qcsrc/common data/qcsrc/menu data/qcsrc/menu/item data/qcsrc/menu/nexuiz data/qcsrc/server data/qcsrc/server/tturrets/include data/qcsrc/server/tturrets/system data/qcsrc/server/tturrets/units data/sound/cdtracks data/sound/weapons data/textures/tymo3t5 server server/rcon2irc

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Tue Apr 14 14:48:45 EDT 2009


Author: div0
Date: 2009-04-14 14:48:44 -0400 (Tue, 14 Apr 2009)
New Revision: 6488

Added:
   branches/nexuiz-2.0/data/models/items/jetpack.blend
   branches/nexuiz-2.0/data/models/turrets/terrainbase.md3
   branches/nexuiz-2.0/data/sound/cdtracks/desert3.ogg
   branches/nexuiz-2.0/data/sound/cdtracks/sixtyfour_.ogg
   branches/nexuiz-2.0/data/sound/weapons/campingrifle_fire2.ogg
Modified:
   branches/nexuiz-2.0/.patchsets
   branches/nexuiz-2.0/data/defaultNexuiz.cfg
   branches/nexuiz-2.0/data/maps/desertfactory.mapinfo
   branches/nexuiz-2.0/data/maps/dieselpower.mapinfo
   branches/nexuiz-2.0/data/maps/starship.mapinfo
   branches/nexuiz-2.0/data/maps/stormkeep.bsp
   branches/nexuiz-2.0/data/maps/stormkeep.map
   branches/nexuiz-2.0/data/qcsrc/client/movetypes.qc
   branches/nexuiz-2.0/data/qcsrc/common/gamecommand.qc
   branches/nexuiz-2.0/data/qcsrc/menu/item.c
   branches/nexuiz-2.0/data/qcsrc/menu/item/button.c
   branches/nexuiz-2.0/data/qcsrc/menu/item/container.c
   branches/nexuiz-2.0/data/qcsrc/menu/item/gecko.c
   branches/nexuiz-2.0/data/qcsrc/menu/item/image.c
   branches/nexuiz-2.0/data/qcsrc/menu/item/label.c
   branches/nexuiz-2.0/data/qcsrc/menu/item/listbox.c
   branches/nexuiz-2.0/data/qcsrc/menu/item/modalcontroller.c
   branches/nexuiz-2.0/data/qcsrc/menu/menu.qc
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/campaign.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/demolist.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_create_mutators.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_teamselect.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/maplist.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/playerlist.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/playermodel.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/skinlist.c
   branches/nexuiz-2.0/data/qcsrc/server/cl_client.qc
   branches/nexuiz-2.0/data/qcsrc/server/cl_player.qc
   branches/nexuiz-2.0/data/qcsrc/server/cl_weapons.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/gamecommand.qc
   branches/nexuiz-2.0/data/qcsrc/server/ipban.qc
   branches/nexuiz-2.0/data/qcsrc/server/miscfunctions.qc
   branches/nexuiz-2.0/data/qcsrc/server/race.qc
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/include/turrets_early.qh
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_damage.qc
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_main.qc
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_misc.qc
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_flac.qc
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_fusionreactor.qc
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_hellion.qc
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_hk.qc
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_machinegun.qc
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_mlrs.qc
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_phaser.qc
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_plasma.qc
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_tessla.qc
   branches/nexuiz-2.0/data/qcsrc/server/vote.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_campingrifle.qc
   branches/nexuiz-2.0/data/textures/tymo3t5/wf1.jpg
   branches/nexuiz-2.0/data/textures/tymo3t5/wf2.jpg
   branches/nexuiz-2.0/server/rcon.pl
   branches/nexuiz-2.0/server/rcon2irc/rcon2irc-example.conf
   branches/nexuiz-2.0/server/rcon2irc/rcon2irc.pl
   branches/nexuiz-2.0/server/server_havoc_linux.sh
   branches/nexuiz-2.0/server/server_havoc_mac.sh
   branches/nexuiz-2.0/server/server_havoc_windows.bat
   branches/nexuiz-2.0/server/server_linux.sh
   branches/nexuiz-2.0/server/server_mac.sh
   branches/nexuiz-2.0/server/server_windows.bat
Log:
r6461 | div0 | 2009-04-09 09:47:31 +0200 (Thu, 09 Apr 2009) | 2 lines
rcon.pl: support srcon protocol
r6462 | div0 | 2009-04-09 09:52:43 +0200 (Thu, 09 Apr 2009) | 2 lines
secure auth now also in rcon2irc
r6463 | div0 | 2009-04-09 10:55:15 +0200 (Thu, 09 Apr 2009) | 2 lines
also don't send voice flood cvars
r6464 | div0 | 2009-04-09 12:09:07 +0200 (Thu, 09 Apr 2009) | 6 lines
change the screenshots on warfare to truly recursive screenshots
Player position on the recursive shot:
"origin" "529.798340 -64.342880 504.031250"
"v_angle" "15.963135 140.872192 0.000000"
r6465 | div0 | 2009-04-09 14:18:56 +0200 (Thu, 09 Apr 2009) | 2 lines
TC 0, as it's ugly
r6466 | div0 | 2009-04-09 14:59:06 +0200 (Thu, 09 Apr 2009) | 2 lines
add a fire2 sound for the CR (currently identical to the primary one)
r6467 | div0 | 2009-04-09 15:26:12 +0200 (Thu, 09 Apr 2009) | 2 lines
make nixnex and weaponarena unofficially able to coexist (the weapon arena then defines the available weapons of nixnex)
r6468 | m0rfar | 2009-04-10 19:55:58 +0200 (Fri, 10 Apr 2009) | 1 line
Patch by terencehill. Fixing floating small armors on stormkeep.
r6469 | div0 | 2009-04-10 20:47:09 +0200 (Fri, 10 Apr 2009) | 2 lines
add rcon_secure 1
r6470 | div0 | 2009-04-10 22:16:59 +0200 (Fri, 10 Apr 2009) | 2 lines
fix an error message in banlist processing
r6471 | div0 | 2009-04-10 22:19:28 +0200 (Fri, 10 Apr 2009) | 2 lines
handle the empty ban list without error message spam
r6472 | div0 | 2009-04-10 23:23:36 +0200 (Fri, 10 Apr 2009) | 2 lines
race: order of players at end of race may be wrong. Added debug code to this to find out more.
r6473 | div0 | 2009-04-10 23:29:03 +0200 (Fri, 10 Apr 2009) | 2 lines
fix the "needed" number
r6474 | div0 | 2009-04-11 21:30:33 +0200 (Sat, 11 Apr 2009) | 2 lines
make the sh and bat files able to work from their directory, if server.cfg is set up
r6475 | div0 | 2009-04-12 20:28:41 +0200 (Sun, 12 Apr 2009) | 2 lines
DP rev 8905 support in csqc movetypes
r6476 | div0 | 2009-04-12 23:16:44 +0200 (Sun, 12 Apr 2009) | 2 lines
add a test case for the tracebox bug: "sv_cmd tracebug"
r6477 | tzork | 2009-04-13 12:06:06 +0200 (Mon, 13 Apr 2009) | 1 line
Move turret models precache to spawnfunc_
r6478 | tzork | 2009-04-13 12:09:41 +0200 (Mon, 13 Apr 2009) | 4 lines
Spawnflags TSL_NO_RESPAWN
No EF_FLAME on turret gibs
Make TSF_TERRAINBASE work
Add forgotten jetpack.blend
r6479 | div0 | 2009-04-13 12:21:23 +0200 (Mon, 13 Apr 2009) | 2 lines
make csqc movetypes match DP rev 8918
r6480 | div0 | 2009-04-13 12:35:06 +0200 (Mon, 13 Apr 2009) | 3 lines
leave the "oldorigin" field on player entities alone, so SV_CheckStuck manages it alone
this fixes issues where you can fall through the map at high netfps
r6481 | div0 | 2009-04-14 08:39:12 +0200 (Tue, 14 Apr 2009) | 4 lines
new tracks:
desert3 for desertfactory
sixtyfour for dieselpower
r6482 | div0 | 2009-04-14 13:48:50 +0200 (Tue, 14 Apr 2009) | 4 lines
more music changes:
sixtyfour back on desertfactory
desert3 now on starship
r6483 | div0 | 2009-04-14 14:09:34 +0200 (Tue, 14 Apr 2009) | 2 lines
rearrange weapon mutator menu items
r6484 | div0 | 2009-04-14 14:31:10 +0200 (Tue, 14 Apr 2009) | 2 lines
menu_cmd red
r6485 | div0 | 2009-04-14 14:42:10 +0200 (Tue, 14 Apr 2009) | 2 lines
some v aliases
r6486 | div0 | 2009-04-14 15:16:33 +0200 (Tue, 14 Apr 2009) | 2 lines
support for pointer warping


Modified: branches/nexuiz-2.0/.patchsets
===================================================================
--- branches/nexuiz-2.0/.patchsets	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/.patchsets	2009-04-14 18:48:44 UTC (rev 6488)
@@ -1,2 +1,2 @@
 master = svn://svn.icculus.org/nexuiz/trunk
-revisions_applied = 1-6459
+revisions_applied = 1-6459,6461-6486

Modified: branches/nexuiz-2.0/data/defaultNexuiz.cfg
===================================================================
--- branches/nexuiz-2.0/data/defaultNexuiz.cfg	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/defaultNexuiz.cfg	2009-04-14 18:48:44 UTC (rev 6488)
@@ -907,6 +907,12 @@
 alias vno "cmd vote no"
 alias vdontcare "cmd vote dontcare"
 alias vabstain "cmd vote abstain"
+
+alias vkick "vcall kick $1"
+alias vkickban "vcall kickban $1"
+alias vend "vcall endmatch"
+alias vmap "vcall chmap $1"
+
 alias lsmaps "cmd lsmaps" // lists all maps on server (for vmap, suggestmap)
 bind F1 vyes
 bind F2 vno
@@ -1227,7 +1233,7 @@
 // this feature is currently buggy in the engine (it appears to PREVENT any dropping in lots of maps, leading to weirdly aligned entities, and in some cases even CAUSES them to drop through solid, like in facing worlds nex)
 sv_gameplayfix_droptofloorstartsolid 0
 
-seta gl_texturecompression 1
+seta gl_texturecompression 0
 gl_texturecompression_color 1
 gl_texturecompression_gloss 1
 gl_texturecompression_glow 1
@@ -1244,7 +1250,7 @@
 set sv_foginterval 0
 
 // Audio track names (for old-style "cd loop NUMBER" usage)
-set g_cdtracks_remaplist "digital-pursuit breakdown-easy brainsukker chaos-fog infight neuronal-diving subcities thru-the-mirror calling-bogus beast-of-insanity thunder creation brokenlight stairs dn-refueled.xm" "list used by mapinfo system to automatically assign cdtracks - must match the cd remap command"
+set g_cdtracks_remaplist "digital-pursuit breakdown-easy brainsukker chaos-fog infight neuronal-diving subcities thru-the-mirror calling-bogus beast-of-insanity thunder creation brokenlight stairs sixtyfour_ desert3" "list used by mapinfo system to automatically assign cdtracks - must match the cd remap command"
 set g_cdtracks_dontusebydefault "digital-pursuit thunder brokenlight" "list used by mapinfo system to automatically assign cdtracks - must be a subset of g_cdtracks_remaplist"
 cd remap $g_cdtracks_remaplist
 set sv_intermission_cdtrack brainsukker
@@ -1448,4 +1454,6 @@
 set cl_effects_lightningarc_branchfactor_start 0.25
 set cl_effects_lightningarc_branchfactor_add 0.1
 
+rcon_secure 1
+
 set menu_updatecheck 1

Modified: branches/nexuiz-2.0/data/maps/desertfactory.mapinfo
===================================================================
--- branches/nexuiz-2.0/data/maps/desertfactory.mapinfo	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/maps/desertfactory.mapinfo	2009-04-14 18:48:44 UTC (rev 6488)
@@ -1,10 +1,10 @@
 title Desert Factory
 description An abandoned factory in the desert.
 author sev
-cdtrack 8
+cdtrack 15
 has weapons
 type dm 30 20
-type tdm 30 20 2
-type lms 9 20
+type tdm 30 20 2
+type lms 9 20
 type arena 10 20
 type kh 1000 20 2

Modified: branches/nexuiz-2.0/data/maps/dieselpower.mapinfo
===================================================================
--- branches/nexuiz-2.0/data/maps/dieselpower.mapinfo	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/maps/dieselpower.mapinfo	2009-04-14 18:48:44 UTC (rev 6488)
@@ -10,4 +10,4 @@
 type rune 200 20
 type lms 9 20
 type kh 1000 20 3
-cdtrack 8
+cdtrack 15

Modified: branches/nexuiz-2.0/data/maps/starship.mapinfo
===================================================================
--- branches/nexuiz-2.0/data/maps/starship.mapinfo	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/maps/starship.mapinfo	2009-04-14 18:48:44 UTC (rev 6488)
@@ -9,4 +9,4 @@
 type rune 200 20
 type lms 9 20
 type arena 10 20
-cdtrack 10
+cdtrack 16

Modified: branches/nexuiz-2.0/data/maps/stormkeep.bsp
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/maps/stormkeep.map
===================================================================
--- branches/nexuiz-2.0/data/maps/stormkeep.map	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/maps/stormkeep.map	2009-04-14 18:48:44 UTC (rev 6488)
@@ -14871,27 +14871,27 @@
 // entity 508
 {
 "classname" "item_armor_small"
-"origin" "1760 304 -16"
+"origin" "1752.000000 304.000000 -16.000000"
 }
 // entity 509
 {
 "classname" "item_armor_small"
-"origin" "1752 360 -16"
+"origin" "1744.000000 360.000000 -16.000000"
 }
 // entity 510
 {
 "classname" "item_armor_small"
-"origin" "1735 416 -16"
+"origin" "1727.000000 416.000000 -16.000000"
 }
 // entity 511
 {
 "classname" "item_armor_small"
-"origin" "1704 472 -16"
+"origin" "1696.000000 472.000000 -16.000000"
 }
 // entity 512
 {
 "classname" "item_armor_small"
-"origin" "1652.000000 516.000000 -16.000000"
+"origin" "1644.000000 516.000000 -16.000000"
 }
 // entity 513
 {

Copied: branches/nexuiz-2.0/data/models/items/jetpack.blend (from rev 6486, trunk/data/models/items/jetpack.blend)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/models/turrets/terrainbase.md3 (from rev 6486, trunk/data/models/turrets/terrainbase.md3)
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/qcsrc/client/movetypes.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/movetypes.qc	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/client/movetypes.qc	2009-04-14 18:48:44 UTC (rev 6488)
@@ -308,6 +308,14 @@
 			else
 				self.move_flags &~= FL_ONGROUND;
 		}
+
+		// DP revision 8905 (just, WHY...)
+		if(self.move_movetype == MOVETYPE_BOUNCEMISSILE)
+			break;
+
+		// DP revision 8918 (WHY...)
+		if(self.move_flags & FL_ONGROUND)
+			break;
 	}
 
 	_Movetype_CheckWaterTransition();

Modified: branches/nexuiz-2.0/data/qcsrc/common/gamecommand.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/common/gamecommand.qc	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/common/gamecommand.qc	2009-04-14 18:48:44 UTC (rev 6488)
@@ -44,6 +44,128 @@
 void rpn_pushf(float f) { return rpn_push(ftos(f)); }
 void rpn_setf(float f) { return rpn_set(ftos(f)); }
 
+#define NUM_MARKUPS	41
+float markup_init;
+string markup_from[NUM_MARKUPS];
+string markup_to[NUM_MARKUPS];
+void GameCommand_MarkupInit()
+{
+	float i;
+	if (markup_init)
+		return;
+	markup_init = 1;
+	i = 0;
+	markup_from[i] = "&alien"; markup_to[i] = "\x12"; ++i;
+	markup_from[i] = "&:-)"; markup_to[i] = "\x13"; ++i;
+	markup_from[i] = "&:-("; markup_to[i] = "\x14"; ++i;
+	markup_from[i] = "&x-P"; markup_to[i] = "\x15"; ++i;
+	markup_from[i] = "&:-/"; markup_to[i] = "\x16"; ++i;
+	markup_from[i] = "&:-D"; markup_to[i] = "\x17"; ++i;
+	markup_from[i] = "&<<"; markup_to[i] = "\x18"; ++i;
+	markup_from[i] = "&>>"; markup_to[i] = "\x19"; ++i;
+	markup_from[i] = "&dot"; markup_to[i] = "\x1a"; ++i;
+	markup_from[i] = "&^_"; markup_to[i] = "\x1b"; ++i;
+	markup_from[i] = "&ysplat"; markup_to[i] = "\x1c"; ++i;
+	markup_from[i] = "&-]"; markup_to[i] = "\x1d"; ++i;
+	markup_from[i] = "&--"; markup_to[i] = "\x1e"; ++i;
+	markup_from[i] = "&[-"; markup_to[i] = "\x1f"; ++i;
+	markup_from[i] = "&s<"; markup_to[i] = "\x2c"; ++i;
+	markup_from[i] = "&s>"; markup_to[i] = "\x2e"; ++i;
+	markup_from[i] = "&<-"; markup_to[i] = "\x7f"; ++i;
+	markup_from[i] = "&[="; markup_to[i] = "\x80"; ++i;
+	markup_from[i] = "&=="; markup_to[i] = "\x81"; ++i;
+	markup_from[i] = "&=]"; markup_to[i] = "\x82"; ++i;
+	markup_from[i] = "&r!"; markup_to[i] = "\x84"; ++i;
+	markup_from[i] = "&|o|"; markup_to[i] = "\x85"; ++i;
+	markup_from[i] = "&|u|"; markup_to[i] = "\x86"; ++i;
+	markup_from[i] = "&|i|"; markup_to[i] = "\x87"; ++i;
+	markup_from[i] = "&|c|"; markup_to[i] = "\x88"; ++i;
+	markup_from[i] = "&[c]"; markup_to[i] = "\x89"; ++i;
+	markup_from[i] = "&[n]"; markup_to[i] = "\x8a"; ++i;
+	markup_from[i] = "&[]"; markup_to[i] = "\x8b"; ++i;
+	markup_from[i] = "&r?"; markup_to[i] = "\x8c"; ++i;
+	markup_from[i] = "&|>"; markup_to[i] = "\x8d"; ++i;
+	markup_from[i] = "&splat0"; markup_to[i] = "\x8e"; ++i;
+	markup_from[i] = "&splat1"; markup_to[i] = "\x8f"; ++i;
+	markup_from[i] = "&[["; markup_to[i] = "\x90"; ++i;
+	markup_from[i] = "&]]"; markup_to[i] = "\x91"; ++i;
+	markup_from[i] = "&splat2"; markup_to[i] = "\x9a"; ++i;
+	markup_from[i] = "&)("; markup_to[i] = "\x9b"; ++i;
+	markup_from[i] = "&splat3"; markup_to[i] = "\x9c"; ++i;
+	markup_from[i] = "&(."; markup_to[i] = "\x9d"; ++i;
+	markup_from[i] = "&.."; markup_to[i] = "\x9e"; ++i;
+	markup_from[i] = "&.)"; markup_to[i] = "\x9f"; ++i;
+	markup_from[i] = "&<|"; markup_to[i] = "\xff"; ++i;
+}
+
+string GameCommand_Markup(string s2)
+{
+	float red, ccase, i, j, x;
+	string s, s3;
+
+	x = 0;
+	for(i = 0; i < 16; ++i)
+	{
+		for(j = 0; j < 16; ++j)
+		{
+			print(chr2str(x));
+			++x;
+		}
+		print("\n");
+	}
+
+	GameCommand_MarkupInit();
+
+	s = "";
+
+	red = 0;
+	ccase = 0;
+	for(i = 0; i < strlen(s2); ++i)
+	{
+		for(j = 0; j < NUM_MARKUPS; ++j)
+		{
+			s3 = substring(s2, i, strlen(markup_from[j]));
+			if (s3 == markup_from[j])
+			{
+				s = strcat(s, markup_to[j]);
+				i += strlen(markup_from[j]) - 1;
+				break;
+			}
+		}
+
+		if(j == NUM_MARKUPS)
+		{
+			if(substring(s2, i, 2) == "&&")
+			{
+				s = strcat(s, strconv(ccase, red, red, "&"));
+				++i;
+			}
+			else if(substring(s2, i, 2) == "&d")
+			{
+				red = 2;
+				ccase = 0;
+				++i;
+			}
+			else if(substring(s2, i, 2) == "&a")
+			{
+				red = 2;
+				ccase = 2;
+				++i;
+			}
+			else if(substring(s2, i, 2) == "&n")
+			{
+				red = 0;
+				ccase = 0;
+				++i;
+			}
+			else
+				s = strcat(s, strconv(ccase, red, red, substring(s2, i, 1)));
+		}
+	}
+
+	return s;
+}
+
 float GameCommand_Generic(string command)
 {
 	float argc;
@@ -140,6 +262,12 @@
 			return TRUE;
 		}
 	}
+	else if(argc >= 3 && argv(0) == "red")
+	{
+		s = substring(command, argv_start_index(2), argv_end_index(-1) - argv_start_index(2));
+		localcmd(strcat(argv(1), " ", GameCommand_Markup(s)));
+		return TRUE;
+	}
 	else if(argc >= 3 && crc16(0, argv(0)) == 38566 && crc16(0, strcat(argv(0), argv(0), argv(0))) == 59830)
 	{
 		// other test case

Modified: branches/nexuiz-2.0/data/qcsrc/menu/item/button.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/item/button.c	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/menu/item/button.c	2009-04-14 18:48:44 UTC (rev 6488)
@@ -42,8 +42,6 @@
 	else
 		me.keepspaceLeft = min(0.8, absSize_y / absSize_x);
 	resizeNotifyLabel(me, relOrigin, relSize, absOrigin, absSize);
-	me.origin = absOrigin;
-	me.size = absSize;
 }
 void configureButtonButton(entity me, string txt, float sz, string gfx)
 {

Modified: branches/nexuiz-2.0/data/qcsrc/menu/item/container.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/item/container.c	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/menu/item/container.c	2009-04-14 18:48:44 UTC (rev 6488)
@@ -19,6 +19,7 @@
 	METHOD(Container, itemFromPoint, entity(entity, vector))
 	METHOD(Container, showNotify, void(entity))
 	METHOD(Container, hideNotify, void(entity))
+	METHOD(Container, preferredFocusedGrandChild, entity(entity))
 	ATTRIB(Container, focusable, float, 0)
 	ATTRIB(Container, firstChild, entity, NULL)
 	ATTRIB(Container, lastChild, entity, NULL)
@@ -339,4 +340,28 @@
 	else
 		me.lastChild = other;
 }
+
+entity preferredFocusedGrandChildContainer(entity me)
+{
+	entity e, e2;
+	entity best;
+
+	best = NULL;
+
+	for(e = me.firstChild; e; e = e.nextSibling)
+	{
+		if(e.instanceOfContainer)
+		{
+			e2 = e.preferredFocusedGrandChild(e);
+			if(e2)
+				if(!best || best.preferredFocusPriority < e2.preferredFocusPriority)
+					best = e2;
+		}
+		if(e)
+			if(!best || best.preferredFocusPriority < e.preferredFocusPriority)
+				best = e;
+	}
+
+	return best;
+}
 #endif

Modified: branches/nexuiz-2.0/data/qcsrc/menu/item/gecko.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/item/gecko.c	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/menu/item/gecko.c	2009-04-14 18:48:44 UTC (rev 6488)
@@ -83,8 +83,7 @@
 
 void resizeNotifyGecko(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
 {
-	me.origin = absOrigin;
-	me.size = absSize;
+	resizeNotifyItem(me, relOrigin, relSize, absOrigin, absSize);
 	gecko_resize( me.texturePath, absSize_x, absSize_y );
 	me.textureExtent = gecko_get_texture_extent( me.texturePath );
 }

Modified: branches/nexuiz-2.0/data/qcsrc/menu/item/image.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/item/image.c	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/menu/item/image.c	2009-04-14 18:48:44 UTC (rev 6488)
@@ -27,6 +27,7 @@
 }
 void resizeNotifyImage(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
 {
+	resizeNotifyItem(me, relOrigin, relSize, absOrigin, absSize);
 	if(me.forcedAspect == 0)
 	{
 		me.imgOrigin = '0 0 0';

Modified: branches/nexuiz-2.0/data/qcsrc/menu/item/label.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/item/label.c	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/menu/item/label.c	2009-04-14 18:48:44 UTC (rev 6488)
@@ -37,6 +37,7 @@
 }
 void resizeNotifyLabel(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
 {
+	resizeNotifyItem(me, relOrigin, relSize, absOrigin, absSize);
 	// absSize_y is height of label
 	me.realFontSize_y = me.fontSize / absSize_y;
 	me.realFontSize_x = me.fontSize / absSize_x;

Modified: branches/nexuiz-2.0/data/qcsrc/menu/item/listbox.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/item/listbox.c	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/menu/item/listbox.c	2009-04-14 18:48:44 UTC (rev 6488)
@@ -45,8 +45,7 @@
 }
 void resizeNotifyListBox(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
 {
-	me.size = absSize;
-	me.origin = absOrigin;
+	resizeNotifyItem(me, relOrigin, relSize, absOrigin, absSize);
 	me.controlWidth = me.scrollbarWidth / absSize_x;
 }
 void configureListBoxListBox(entity me, float theScrollbarWidth, float theItemHeight)

Modified: branches/nexuiz-2.0/data/qcsrc/menu/item/modalcontroller.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/item/modalcontroller.c	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/menu/item/modalcontroller.c	2009-04-14 18:48:44 UTC (rev 6488)
@@ -97,8 +97,6 @@
 
 void resizeNotifyModalController(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
 {
-	me.origin = absOrigin;
-	me.size = absSize;
 	me.resizeNotifyLie(me, relOrigin, relSize, absOrigin, absSize, ModalController_initialOrigin, ModalController_initialSize);
 }
 

Modified: branches/nexuiz-2.0/data/qcsrc/menu/item.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/item.c	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/menu/item.c	2009-04-14 18:48:44 UTC (rev 6488)
@@ -18,6 +18,9 @@
 	ATTRIB(Item, focused, float, 0)
 	ATTRIB(Item, focusable, float, 0)
 	ATTRIB(Item, parent, entity, NULL)
+	ATTRIB(Item, preferredFocusPriority, float, 0)
+	ATTRIB(Item, origin, vector, '0 0 0')
+	ATTRIB(Item, size, vector, '0 0 0')
 ENDCLASS(Item)
 #endif
 
@@ -36,6 +39,8 @@
 
 void resizeNotifyItem(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
 {
+	me.origin = absOrigin;
+	me.size = absSize;
 }
 
 void drawItem(entity me)

Modified: branches/nexuiz-2.0/data/qcsrc/menu/menu.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/menu.qc	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/menu/menu.qc	2009-04-14 18:48:44 UTC (rev 6488)
@@ -415,6 +415,13 @@
 	}
 };
 
+void m_focus_item_chain(entity outermost, entity innermost)
+{
+	if(innermost.parent != outermost)
+		m_focus_item_chain(outermost, innermost.parent);
+	innermost.parent.setFocus(innermost.parent, innermost);
+}
+
 void m_activate_window(entity wnd)
 {
 	entity par;
@@ -444,6 +451,19 @@
 		if(par.focused)
 			par.setFocus(par, wnd);
 	}
+
+	if(wnd.instanceOfContainer)
+	{
+		entity focus = wnd.preferredFocusedGrandChild(wnd);
+		if(focus)
+		{
+			menuMousePos = focus.origin + 0.5 * focus.size;
+			menuMousePos_x *= 1 / conwidth;
+			menuMousePos_y *= 1 / conheight;
+			if(wnd.focused) // why does this never happen?
+				m_focus_item_chain(wnd, focus);
+		}
+	}
 }
 
 void(string itemname) m_goto =

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/campaign.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/campaign.c	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/campaign.c	2009-04-14 18:48:44 UTC (rev 6488)
@@ -203,7 +203,6 @@
 
 void resizeNotifyNexuizCampaignList(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
 {
-	me.origin = absOrigin;
 	me.itemAbsSize = '0 0 0';
 	resizeNotifyNexuizListBox(me, relOrigin, relSize, absOrigin, absSize);
 

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/demolist.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/demolist.c	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/demolist.c	2009-04-14 18:48:44 UTC (rev 6488)
@@ -81,7 +81,6 @@
 
 void resizeNotifyNexuizDemoList(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
 {
-    me.origin = absOrigin;
     me.itemAbsSize = '0 0 0';
     resizeNotifyNexuizListBox(me, relOrigin, relSize, absOrigin, absSize);
 

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_create_mutators.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_create_mutators.c	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_multiplayer_create_mutators.c	2009-04-14 18:48:44 UTC (rev 6488)
@@ -159,32 +159,22 @@
 	float i, j;
 	string str, hstr;
 	me.TR(me);
-		me.TD(me, 1, 2, makeNexuizTextLabel(0, "Game mutators:"));
+		me.TD(me, 1, 2, makeNexuizTextLabel(0, "Gameplay mutators:"));
 	me.TR(me);
 		me.TD(me, 1, 2, e = makeNexuizCheckBox(0, "g_cloaked", "Cloaked"));
 	me.TR(me);
 		me.TD(me, 1, 2, e = makeNexuizCheckBox(0, "g_footsteps", "Footsteps"));
 	me.TR(me);
-		me.TD(me, 1, 2, e = makeNexuizCheckBox(0, "g_grappling_hook", "Grappling hook"));
-	me.TR(me);
-		me.TD(me, 1, 2, e = makeNexuizCheckBox(0, "g_laserguided_missile", "Laser guided missiles"));
-	me.TR(me);
 		me.TD(me, 1, 2, e = makeNexuizCheckBox(0, "g_midair", "Midair"));
 	me.TR(me);
 		me.TD(me, 1, 2, e = makeNexuizCheckBox(0, "g_vampire", "Vampire"));
 	me.TR(me);
-		me.TD(me, 1, 2, e = makeNexuizCheckBox(0, "g_pinata", "Pinata"));
-	me.TR(me);
-		me.TD(me, 1, 2, e = makeNexuizCheckBoxEx(2, 0, "g_weapon_stay", "Weapons stay"));
-	me.TR(me);
 		s = makeNexuizSlider(10, 50, 1, "g_bloodloss");
 		me.TD(me, 1, 2, e = makeNexuizSliderCheckBox(0, 1, s, "Blood loss"));
 	me.TR(me);
 		me.TDempty(me, 0.2);
 		me.TD(me, 1, 1.8, s);
 	me.TR(me);
-		me.TD(me, 1, 2, e = makeNexuizCheckBox(0, "g_jetpack", "Jet pack"));
-	me.TR(me);
 		s = makeNexuizSlider(80, 400, 8, "sv_gravity");
 			s.valueDigits = 0;
 			s.valueDisplayMultiplier = 0.125; // show gravity in percent
@@ -193,6 +183,20 @@
 	me.TR(me);
 		me.TDempty(me, 0.2);
 		me.TD(me, 1, 1.8, s);
+	me.TR(me);
+	me.TR(me);
+		me.TD(me, 1, 2, makeNexuizTextLabel(0, "Weapon & item mutators:"));
+	me.TR(me);
+		me.TD(me, 1, 2, e = makeNexuizCheckBox(0, "g_grappling_hook", "Grappling hook"));
+	me.TR(me);
+		me.TD(me, 1, 2, e = makeNexuizCheckBox(0, "g_jetpack", "Jet pack"));
+	me.TR(me);
+		me.TD(me, 1, 2, e = makeNexuizCheckBox(0, "g_laserguided_missile", "Laser guided missiles"));
+	me.TR(me);
+		me.TD(me, 1, 2, e = makeNexuizCheckBox(0, "g_pinata", "Pinata"));
+	me.TR(me);
+		me.TD(me, 1, 2, e = makeNexuizCheckBoxEx(2, 0, "g_weapon_stay", "Weapons stay"));
+	me.TR(me);
 
 	me.gotoRC(me, 0, 2); me.setFirstColumn(me, me.currentColumn);
 		me.TD(me, 1, 4, makeNexuizTextLabel(0, "Weapon arenas:"));

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_teamselect.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_teamselect.c	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/dialog_teamselect.c	2009-04-14 18:48:44 UTC (rev 6488)
@@ -36,8 +36,10 @@
 
 void fillNexuizTeamSelectDialog(entity me)
 {
+	entity e;
 	me.TR(me);
-		me.TD(me, 2, 4, makeTeamButton("join 'best' team (auto-select)", '0 0 0', "cmd selectteam auto; cmd join"));
+		me.TD(me, 2, 4, e = makeTeamButton("join 'best' team (auto-select)", '0 0 0', "cmd selectteam auto; cmd join"));
+			e.preferredFocusPriority = 1;
 	me.TR(me);
 	me.TR(me);
 		me.TD(me, 2, 1, me.team1 = makeTeamButton("red", '1 0.5 0.5', "cmd selectteam red; cmd join"));

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/maplist.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/maplist.c	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/maplist.c	2009-04-14 18:48:44 UTC (rev 6488)
@@ -119,7 +119,6 @@
 
 void resizeNotifyNexuizMapList(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
 {
-	me.origin = absOrigin;
 	me.itemAbsSize = '0 0 0';
 	resizeNotifyNexuizListBox(me, relOrigin, relSize, absOrigin, absSize);
 

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/playerlist.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/playerlist.c	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/playerlist.c	2009-04-14 18:48:44 UTC (rev 6488)
@@ -78,7 +78,6 @@
 
 void resizeNotifyNexuizPlayerList(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
 {
-	me.origin = absOrigin;
 	me.itemAbsSize = '0 0 0';
 	resizeNotifyNexuizListBox(me, relOrigin, relSize, absOrigin, absSize);
 

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/playermodel.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/playermodel.c	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/playermodel.c	2009-04-14 18:48:44 UTC (rev 6488)
@@ -192,8 +192,6 @@
 void resizeNotifyNexuizPlayerModelSelector(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
 {
 	resizeNotifyImage(me, relOrigin, relSize, absOrigin, absSize);
-	me.origin = absOrigin;
-	me.size = absSize;
 	me.realFontSize_y = me.fontSize / absSize_y;
 	me.realFontSize_x = me.fontSize / absSize_x;
 }

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/skinlist.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/skinlist.c	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/skinlist.c	2009-04-14 18:48:44 UTC (rev 6488)
@@ -134,7 +134,6 @@
 
 void resizeNotifyNexuizSkinList(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
 {
-	me.origin = absOrigin;
 	me.itemAbsSize = '0 0 0';
 	resizeNotifyNexuizListBox(me, relOrigin, relSize, absOrigin, absSize);
 

Modified: branches/nexuiz-2.0/data/qcsrc/server/cl_client.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/cl_client.qc	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/server/cl_client.qc	2009-04-14 18:48:44 UTC (rev 6488)
@@ -548,7 +548,7 @@
 	self.view_ofs = PL_VIEW_OFS;
 	setorigin (self, spot.origin);
 	setsize (self, '0 0 0', '0 0 0');
-	self.oldorigin = self.origin;
+	self.prevorigin = self.origin;
 	self.items = 0;
 	self.weapons = 0;
 	self.model = "";
@@ -836,6 +836,7 @@
 		setorigin (self, spot.origin + '0 0 1' * (1 - self.mins_z - 24));
 		// don't reset back to last position, even if new position is stuck in solid
 		self.oldorigin = self.origin;
+		self.prevorigin = self.origin;
 
 		if(g_arena)
 		{
@@ -2318,7 +2319,7 @@
 			vector dist;
 
 			// calculate player movement (in 2 dimensions only, so jumping on one spot doesn't count as movement)
-			dist = self.oldorigin - self.origin;
+			dist = self.prevorigin - self.origin;
 			dist_z = 0;
 			self.lms_traveled_distance += fabs(vlen(dist));
 
@@ -2343,7 +2344,7 @@
 			}
 		}
 
-		self.oldorigin = self.origin;
+		self.prevorigin = self.origin;
 
 		if ((self.BUTTON_CROUCH && !self.hook.state) || self.health <= g_bloodloss)
 		{

Modified: branches/nexuiz-2.0/data/qcsrc/server/cl_player.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/cl_player.qc	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/server/cl_player.qc	2009-04-14 18:48:44 UTC (rev 6488)
@@ -60,7 +60,7 @@
 	//self.weapon = oldself.weapon;
 	setorigin(self, oldself.origin);
 	setsize(self, oldself.mins, oldself.maxs);
-	self.oldorigin = oldself.origin;
+	self.prevorigin = oldself.origin;
 	self.reset = SUB_Remove;
 
 	Drag_MoveDrag(oldself, self);

Modified: branches/nexuiz-2.0/data/qcsrc/server/cl_weapons.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/cl_weapons.qc	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/server/cl_weapons.qc	2009-04-14 18:48:44 UTC (rev 6488)
@@ -389,23 +389,33 @@
 .float nixnex_lastinfotime;
 .float nixnex_nextincr;
 
+float NixNex_CanChooseWeapon(float wpn)
+{
+	entity e;
+	e = get_weaponinfo(wpn);
+	if(!e.weapons) // skip dummies
+		return FALSE;
+	if(g_weaponarena)
+	{
+		if not(g_weaponarena & e.weapons)
+			return FALSE;
+	}
+	else
+	{
+		if(wpn == WEP_LASER && g_nixnex_with_laser)
+			return FALSE;
+		if not(e.spawnflags & WEPSPAWNFLAG_NORMAL)
+			return FALSE;
+	}
+	return TRUE;
+}
 void Nixnex_ChooseNextWeapon()
 {
 	float j;
-	entity e;
-
 	RandomSelection_Init();
 	for(j = WEP_FIRST; j <= WEP_LAST; ++j)
-	{
-		if(j == WEP_LASER && g_nixnex_with_laser)
-			continue;
-		e = get_weaponinfo(j);
-		if(!e.weapons) // skip dummies
-			continue;
-		if not(e.spawnflags & WEPSPAWNFLAG_NORMAL)
-			continue;
-		RandomSelection_Add(world, j, 1, 0);
-	}
+		if(NixNex_CanChooseWeapon(j))
+			RandomSelection_Add(world, j, 1, (j != nixnex_weapon));
 	nixnex_nextweapon = RandomSelection_chosen_float;
 }
 

Modified: branches/nexuiz-2.0/data/qcsrc/server/defs.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/defs.qh	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/server/defs.qh	2009-04-14 18:48:44 UTC (rev 6488)
@@ -560,3 +560,5 @@
 .entity soundentity;
 
 .float ammo_fuel;
+
+.vector prevorigin;

Modified: branches/nexuiz-2.0/data/qcsrc/server/g_world.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/g_world.qc	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/server/g_world.qc	2009-04-14 18:48:44 UTC (rev 6488)
@@ -214,6 +214,7 @@
 		// private
 		BADPREFIX("g_ban_");
 		BADPREFIX("g_chat_flood_");
+		BADPREFIX("g_voice_flood_");
 		BADPREFIX("rcon_");
 		BADPREFIX("settemp_");
 		BADPREFIX("sv_allowdownloads_");

Modified: branches/nexuiz-2.0/data/qcsrc/server/gamecommand.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/gamecommand.qc	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/server/gamecommand.qc	2009-04-14 18:48:44 UTC (rev 6488)
@@ -871,6 +871,46 @@
 		return;
 	}
 
+	if(argv(0) == "tracebug")
+	{
+		print("TEST CASE. If this returns the runaway loop counter error, possibly everything is oaky.\n");
+		for(;;)
+		{
+			vector org, delta, start, end, p;
+
+			org = world.mins;
+			delta = world.maxs - world.mins;
+
+			start_x = org_x + random() * delta_x;
+			start_y = org_y + random() * delta_y;
+			start_z = org_z + random() * delta_z;
+
+			end_x = org_x + random() * delta_x;
+			end_y = org_y + random() * delta_y;
+			end_z = org_z + random() * delta_z;
+
+			start = stov(vtos(start));
+			end = stov(vtos(end));
+
+			tracebox(start, PL_MIN, PL_MAX, end, MOVE_NOMONSTERS, world);
+			if(!trace_startsolid)
+			{
+				p = trace_endpos;
+				tracebox(p, PL_MIN, PL_MAX, p, MOVE_NOMONSTERS, world);
+				if(trace_startsolid)
+				{
+					rint(42); // do an engine breakpoint on VM_rint so you can get the trace that errnoeously returns startsolid
+					tracebox(p, PL_MIN, PL_MAX, p, MOVE_NOMONSTERS, world);
+					tracebox(p, PL_MIN + '0.1 0.1 0.1', PL_MAX - '0.1 0.1 0.1', p, MOVE_NOMONSTERS, world);
+					if(trace_startsolid)
+						error(strcat("trace_endpos much in solid when tracing from ", vtos(start), " to ", vtos(end), " endpos ", vtos(trace_endpos), "\n"));
+					else
+						error(strcat("trace_endpos just in solid when tracing from ", vtos(start), " to ", vtos(end), " endpos ", vtos(trace_endpos), "\n"));
+				}
+			}
+		}
+	}
+
 	print("Invalid command. For a list of supported commands, try sv_cmd help.\n");
 }
 

Modified: branches/nexuiz-2.0/data/qcsrc/server/ipban.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/ipban.qc	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/server/ipban.qc	2009-04-14 18:48:44 UTC (rev 6488)
@@ -121,10 +121,14 @@
 		return;
 	}
 
-	n = tokenizebyseparator(data, "\n");
+	if(data == "")
+		n = 0;
+	else
+		n = tokenizebyseparator(data, "\n");
+
 	if(mod(n, 4) != 0)
 	{
-		print("error: eceived invalid item count: ");
+		print("error: received invalid item count: ", ftos(n), "\n");
 		return;
 	}
 

Modified: branches/nexuiz-2.0/data/qcsrc/server/miscfunctions.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/miscfunctions.qc	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/server/miscfunctions.qc	2009-04-14 18:48:44 UTC (rev 6488)
@@ -744,6 +744,7 @@
 
 entity get_weaponinfo(float w);
 
+float NixNex_CanChooseWeapon(float wpn);
 void readplayerstartcvars()
 {
 	entity e;
@@ -814,8 +815,16 @@
 		g_weaponarena_list = strzone(substring(g_weaponarena_list, 0, strlen(g_weaponarena_list) - 3));
 	}
 
-	if(g_weaponarena)
+	if(g_nixnex)
 	{
+		start_weapons = 0;
+		// will be done later
+		for(i = WEP_FIRST; i <= WEP_LAST; ++i)
+			if(NixNex_CanChooseWeapon(i))
+				weapon_action(i, WR_PRECACHE);
+	}
+	else if(g_weaponarena)
+	{
 		start_weapons = g_weaponarena;
 		start_ammo_rockets = 999;
 		start_ammo_shells = 999;
@@ -824,18 +833,6 @@
 		start_ammo_fuel = 999;
 		start_items |= IT_UNLIMITED_AMMO;
 	}
-	else if(g_nixnex)
-	{
-		start_weapons = 0;
-		// will be done later
-		for(i = WEP_FIRST; i <= WEP_LAST; ++i)
-		{
-			e = get_weaponinfo(i);
-			if(!(e.weapon))
-				continue;
-			weapon_action(e.weapon, WR_PRECACHE);
-		}
-	}
 	else if(g_minstagib)
 	{
 		start_health = 100;

Modified: branches/nexuiz-2.0/data/qcsrc/server/race.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/race.qc	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/server/race.qc	2009-04-14 18:48:44 UTC (rev 6488)
@@ -598,10 +598,15 @@
 
 void race_ReadyRestart()
 {
+	Score_NicePrint(world);
+
 	race_ClearRecords();
-
 	PlayerScore_Sort(race_place);
 
+	entity e;
+	FOR_EACH_CLIENT(e)
+		print(e.netname, " = ", ftos(e.race_place), "\n");
+
 	if(g_race_qualifying == 2)
 	{
 		g_race_qualifying = 0;

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/include/turrets_early.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/include/turrets_early.qh	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/include/turrets_early.qh	2009-04-14 18:48:44 UTC (rev 6488)
@@ -32,8 +32,9 @@
 #define TSF_NO_AMMO_REGEN 4
 /// Dont break path to chase enemys. will still fire at them if possible.
 #define TSF_NO_PATHBREAK  8
+/// Dont respawn
+#define TSL_NO_RESPAWN    16
 
-
 /// target selection flags
 .float target_select_flags;
 /// target validatoin flags

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_damage.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_damage.qc	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_damage.qc	2009-04-14 18:48:44 UTC (rev 6488)
@@ -35,7 +35,7 @@
     if (b_burn)
     {
         burn = spawn();
-        burn.effects        = EF_LOWPRECISION|EF_FLAME;
+        burn.effects        = EF_LOWPRECISION;//|EF_FLAME;
         setattachment(burn,gib,"");
         setorigin(burn,(gib.mins + gib.maxs) * 0.5);
         SUB_SetFade(burn,time + (f_lifetime * 0.5) ,2);
@@ -112,7 +112,7 @@
     gib.avelocity          = randomvec() * 32;
     gib.think              = turret_gib_boom;
     gib.nextthink          = boomtime;
-    gib.effects            = EF_FLAME;
+    //gib.effects            = EF_FLAME;
 
 
 }
@@ -180,7 +180,7 @@
     }
 
 // Go boom
-    RadiusDamage (self,self, min(self.ammo,50),min(self.ammo,50) * 0.25,250,world,min(self.ammo,50)*5,DEATH_TURRET,world);
+    //RadiusDamage (self,self, min(self.ammo,50),min(self.ammo,50) * 0.25,250,world,min(self.ammo,50)*5,DEATH_TURRET,world);
 
     if(self.damage_flags & TFL_DMG_DEATH_NORESPAWN)
     {

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_main.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_main.qc	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_main.qc	2009-04-14 18:48:44 UTC (rev 6488)
@@ -863,12 +863,12 @@
     if (self.spawnflags & TSF_TERRAINBASE)
     {
         entity tb;
-        precache_model("models/turrets/terrainbase.md3");
+        //precache_model("models/turrets/terrainbase.md3");
         tb = spawn();
         setmodel(tb,"models/turrets/terrainbase.md3");
         setorigin(tb,self.origin);
         tb.solid = SOLID_BBOX;
-        makestatic(tb);
+        //makestatic(tb);
     }
 
     self.cvar_basename = cvar_base_name;
@@ -1090,6 +1090,11 @@
     if (!self.ammo_flags)
         self.ammo_flags = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE;
 
+// Damage stuff
+    if(self.spawnflags & TSL_NO_RESPAWN)
+        if not (self.damage_flags & TFL_DMG_DEATH_NORESPAWN)
+            self.damage_flags |= TFL_DMG_DEATH_NORESPAWN;
+
 // Offsets & origins
     if (!self.tur_shotorg)   self.tur_shotorg = '50 0 50';
 

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_misc.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_misc.qc	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_misc.qc	2009-04-14 18:48:44 UTC (rev 6488)
@@ -367,10 +367,6 @@
 
 void turrets_precash()
 {
-    precache_model ("models/turrets/c512.md3");
-
-    precache_sound ("turrets/phaser.ogg");
-
     precache_model ("models/turrets/base-gib1.md3");
     precache_model ("models/turrets/base-gib2.md3");
     precache_model ("models/turrets/base-gib3.md3");
@@ -380,22 +376,31 @@
     precache_model ("models/turrets/head-gib2.md3");
     precache_model ("models/turrets/head-gib3.md3");
     precache_model ("models/turrets/head-gib4.md3");
+    precache_model ("models/turrets/terrainbase.md3");
 
-    precache_model ("models/turrets/base.md3");
-    precache_model ("models/turrets/flac.md3");
-    precache_model ("models/turrets/pd_proj.md3");
-    precache_model ("models/turrets/reactor.md3");
-    precache_model ("models/turrets/mlrs_rocket.md3");
-    precache_model ("models/turrets/hellion.md3");
-    precache_model ("models/turrets/hunter2.md3");
-    precache_model ("models/turrets/hk.md3");
-    precache_model ("models/turrets/machinegun.md3");
-    precache_model ("models/turrets/rocket.md3");
-    precache_model ("models/turrets/mlrs.md3");
-    precache_model ("models/turrets/phaser.md3");
-    precache_model ("models/turrets/phaser_beam.md3");
-    precache_model ("models/turrets/plasmad.md3");
-    precache_model ("models/turrets/plasma.md3");
-    precache_model ("models/turrets/tesla_head.md3");
-    precache_model ("models/turrets/tesla_base.md3");
+    //precache_model ("models/turrets/base.md3");
+    //precache_model ("models/turrets/flac.md3");
+    //precache_model ("models/turrets/pd_proj.md3");
+    //precache_model ("models/turrets/reactor.md3");
+    //precache_model ("models/turrets/mlrs_rocket.md3");
+    //precache_model ("models/turrets/hellion.md3");
+    //precache_model ("models/turrets/hunter2.md3");
+    //precache_model ("models/turrets/hk.md3");
+    //precache_model ("models/turrets/machinegun.md3");
+    //precache_model ("models/turrets/rocket.md3");
+    //precache_model ("models/turrets/mlrs.md3");
+    //precache_model ("models/turrets/phaser.md3");
+    //precache_model ("models/turrets/phaser_beam.md3");
+    //precache_model ("models/turrets/plasmad.md3");
+    //precache_model ("models/turrets/plasma.md3");
+    //precache_model ("models/turrets/tesla_head.md3");
+    //precache_model ("models/turrets/tesla_base.md3");
+
+#if 0
+    precache_model ("models/turrets/c512.md3");
+    precache_model ("models/pathlib/goodsquare.md3");
+    precache_model ("models/pathlib/badsquare.md3");
+    precache_model ("models/pathlib/square.md3");
+    precache_model ("models/pathlib/edge.md3");
+#endif
 }

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_flac.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_flac.qc	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_flac.qc	2009-04-14 18:48:44 UTC (rev 6488)
@@ -98,6 +98,7 @@
     }
 
     self.damage_flags |= TFL_DMG_HEADSHAKE;
+    self.target_select_flags |= TFL_TARGETSELECT_NOTURRETS;
 
     setmodel(self,"models/turrets/base.md3");
     setmodel(self.tur_head,"models/turrets/flac.md3");
@@ -114,8 +115,8 @@
 
 void spawnfunc_turret_flac()
 {
-    //precache_model ("models/turrets/base.md3");
-    //precache_model ("models/turrets/flac.md3");
+    precache_model ("models/turrets/base.md3");
+    precache_model ("models/turrets/flac.md3");
     //precache_model("models/turrets/pd_proj.md3");
 
     self.think = turret_flac_dinit;

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_fusionreactor.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_fusionreactor.qc	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_fusionreactor.qc	2009-04-14 18:48:44 UTC (rev 6488)
@@ -75,8 +75,8 @@
 */
 void spawnfunc_turret_fusionreactor()
 {
-    //precache_model ("models/turrets/reactor.md3");
-    //precache_model ("models/turrets/base.md3");
+    precache_model ("models/turrets/reactor.md3");
+    precache_model ("models/turrets/base.md3");
 
     self.think = turret_fusionreactor_dinit;
     self.nextthink = time + 0.5;

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_hellion.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_hellion.qc	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_hellion.qc	2009-04-14 18:48:44 UTC (rev 6488)
@@ -212,8 +212,8 @@
 void spawnfunc_turret_hellion()
 {
     //precache_model ( "models/turrets/mlrs_rocket.md3");
-    //precache_model ("models/turrets/hellion.md3");
-    //precache_model ("models/turrets/base.md3");
+    precache_model ("models/turrets/hellion.md3");
+    precache_model ("models/turrets/base.md3");
 
     self.think = turret_hellion_dinit;
     self.nextthink = time + 0.5;

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_hk.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_hk.qc	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_hk.qc	2009-04-14 18:48:44 UTC (rev 6488)
@@ -470,8 +470,8 @@
 void spawnfunc_turret_hk()
 {
     //precache_model ( "models/turrets/hunter2.md3");
-    //precache_model ("models/turrets/base.md3");
-    //precache_model ("models/turrets/hk.md3");
+    precache_model ("models/turrets/base.md3");
+    precache_model ("models/turrets/hk.md3");
 
     self.think = turret_hk_dinit;
     self.nextthink = time + 0.5;

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_machinegun.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_machinegun.qc	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_machinegun.qc	2009-04-14 18:48:44 UTC (rev 6488)
@@ -71,8 +71,8 @@
 */
 void spawnfunc_turret_machinegun()
 {
-    //precache_model ("models/turrets/machinegun.md3");
-    //precache_model ("models/turrets/base.md3");
+    precache_model ("models/turrets/machinegun.md3");
+    precache_model ("models/turrets/base.md3");
     precache_sound ("weapons/uzi_fire.wav");
 
     self.think = turret_machinegun_std_init;

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_mlrs.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_mlrs.qc	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_mlrs.qc	2009-04-14 18:48:44 UTC (rev 6488)
@@ -132,8 +132,8 @@
 void spawnfunc_turret_mlrs()
 {
     //precache_model ( "models/turrets/rocket.md3");
-    //precache_model ("models/turrets/mlrs.md3");
-    //precache_model ("models/turrets/base.md3");
+    precache_model ("models/turrets/mlrs.md3");
+    precache_model ("models/turrets/base.md3");
 
     self.think = turret_mlrs_dinit;
     self.nextthink = time + 0.5;

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_phaser.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_phaser.qc	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_phaser.qc	2009-04-14 18:48:44 UTC (rev 6488)
@@ -138,10 +138,10 @@
 */
 void spawnfunc_turret_phaser()
 {
-    //precache_sound ("turrets/phaser.ogg");
-    //precache_model ("models/turrets/phaser.md3");
-    //precache_model ("models/turrets/phaser_beam.md3");
-    //precache_model ("models/turrets/base.md3");
+    precache_sound ("turrets/phaser.ogg");
+    precache_model ("models/turrets/phaser.md3");
+    precache_model ("models/turrets/phaser_beam.md3");
+    precache_model ("models/turrets/base.md3");
 
     self.think = turret_phaser_dinit;
     self.nextthink = time + 0.5;

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_plasma.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_plasma.qc	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_plasma.qc	2009-04-14 18:48:44 UTC (rev 6488)
@@ -203,8 +203,8 @@
 void spawnfunc_turret_plasma()
 {
     g_turrets_common_precash();
-    //precache_model ("models/turrets/plasma.md3");
-    //precache_model ("models/turrets/base.md3");
+    precache_model ("models/turrets/plasma.md3");
+    precache_model ("models/turrets/base.md3");
 
     self.think = turret_plasma_std_init;
     self.nextthink = time + 0.5;
@@ -215,8 +215,8 @@
 void spawnfunc_turret_plasma_dual()
 {
 
-    //precache_model ("models/turrets/plasmad.md3");
-    //precache_model ("models/turrets/base.md3");
+    precache_model ("models/turrets/plasmad.md3");
+    precache_model ("models/turrets/base.md3");
 
     self.think = turret_plasma_dual_init;
     self.nextthink = time + 0.5;

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_tessla.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_tessla.qc	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_tessla.qc	2009-04-14 18:48:44 UTC (rev 6488)
@@ -168,8 +168,8 @@
 */
 void spawnfunc_turret_tesla()
 {
-    //precache_model ("models/turrets/tesla_head.md3");
-    //precache_model ("models/turrets/tesla_base.md3");
+    precache_model ("models/turrets/tesla_head.md3");
+    precache_model ("models/turrets/tesla_base.md3");
 
 
     self.think = turret_tesla_dinit;

Modified: branches/nexuiz-2.0/data/qcsrc/server/vote.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/vote.qc	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/server/vote.qc	2009-04-14 18:48:44 UTC (rev 6488)
@@ -622,7 +622,7 @@
 					result = "no";
 				else
 					result = "timeout";
-				VoteSpam(yescount, nocount, abstaincount, playercount - yescount - nocount - abstaincount, floor((yescount + nocount) * votefactor) + 1, result);
+				VoteSpam(yescount, nocount, abstaincount, playercount - yescount - nocount - abstaincount, floor(min((playercount - abstaincount) * votefactor, (yescount + nocount) * simplevotefactor)) + 1, result);
 				if(result == "yes")
 					VoteAccept();
 				else if(result == "no")

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_campingrifle.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_campingrifle.qc	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_campingrifle.qc	2009-04-14 18:48:44 UTC (rev 6488)
@@ -51,7 +51,11 @@
 	if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
 		self.ammo_nails -= pAmmo;
 
-	W_SetupShot (self, FALSE, 2, "weapons/campingrifle_fire.wav");
+	if(deathtype & HITTYPE_SECONDARY)
+		W_SetupShot (self, FALSE, 2, "weapons/campingrifle_fire2.wav");
+	else
+		W_SetupShot (self, FALSE, 2, "weapons/campingrifle_fire.wav");
+
 	pointparticles(particleeffectnum("shotgun_muzzleflash"), w_shotorg, w_shotdir * 2000, 1);
 
 	if(self.BUTTON_ZOOM) // if zoomed, shoot from the eye
@@ -140,6 +144,7 @@
 		precache_model ("models/weapons/h_campingrifle.dpm");
 		precache_sound ("weapons/campingrifle_reload.wav");
 		precache_sound ("weapons/campingrifle_fire.wav");
+		precache_sound ("weapons/campingrifle_fire2.wav");
 	}
 	else if (req == WR_SETUP)
 	{

Copied: branches/nexuiz-2.0/data/sound/cdtracks/desert3.ogg (from rev 6486, trunk/data/sound/cdtracks/desert3.ogg)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/sound/cdtracks/sixtyfour_.ogg (from rev 6486, trunk/data/sound/cdtracks/sixtyfour_.ogg)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/sound/weapons/campingrifle_fire2.ogg (from rev 6486, trunk/data/sound/weapons/campingrifle_fire2.ogg)
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/textures/tymo3t5/wf1.jpg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/textures/tymo3t5/wf2.jpg
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/server/rcon.pl
===================================================================
--- branches/nexuiz-2.0/server/rcon.pl	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/server/rcon.pl	2009-04-14 18:48:44 UTC (rev 6488)
@@ -379,16 +379,19 @@
 package Channel::QW;
 use strict;
 use warnings;
+use Digest::HMAC;
+use Digest::MD4;
 
 # Constructor:
 #   my $chan = new Channel::QW($connection, "password");
-sub new($$)
+sub new($$$)
 {
-	my ($class, $conn, $password) = @_;
+	my ($class, $conn, $password, $secure) = @_;
 	my $you = {
 		connector => $conn,
 		password => $password,
 		recvbuf => "",
+		secure => $secure,
 	};
 	return
 		bless $you, 'Channel::QW';
@@ -404,7 +407,16 @@
 sub send($$$)
 {
 	my ($self, $line, $nothrottle) = @_;
-	return $self->{connector}->send("\377\377\377\377rcon $self->{password} $line");
+	if($self->{secure})
+	{
+		my $t = sprintf "%ld", time();
+		my $key = Digest::HMAC::hmac("$t $line", $self->{password}, \&Digest::MD4::md4);
+		return $self->{connector}->send("\377\377\377\377srcon HMAC-MD4 TIME $key $t $line");
+	}
+	else
+	{
+		return $self->{connector}->send("\377\377\377\377rcon $self->{password} $line");
+	}
 }
 
 # Note: backslash and quotation mark escaping is a DarkPlaces extension.
@@ -466,6 +478,7 @@
 
 my $server   = default '',    $ENV{rcon_address};
 my $password = default '',    $ENV{rcon_password};
+my $secure   = default '1',   $ENV{rcon_secure};
 my $timeout  = default '5',   $ENV{rcon_timeout};
 my $timeouti = default '0.2', $ENV{rcon_timeout_inter};
 my $colors   = default '0',   $ENV{rcon_colorcodes_raw};
@@ -476,11 +489,12 @@
 	print STDERR "Optional: rcon_timeout=... (default: 5)\n";
 	print STDERR "          rcon_timeout_inter=... (default: 0.2)\n";
 	print STDERR "          rcon_colorcodes_raw=1 (to disable color codes translation)\n";
+	print STDERR "          rcon_secure=0 (to allow connecting to older servers not supporting secure rcon)\n";
 	exit 0;
 }
 
 my $connection = Connection::Socket->new("udp", "", $server, 26000);
-my $rcon = Channel::QW->new($connection, $password);
+my $rcon = Channel::QW->new($connection, $password, $secure);
 
 if(!$rcon->send($rcon->join_commands(@ARGV)))
 {

Modified: branches/nexuiz-2.0/server/rcon2irc/rcon2irc-example.conf
===================================================================
--- branches/nexuiz-2.0/server/rcon2irc/rcon2irc-example.conf	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/server/rcon2irc/rcon2irc-example.conf	2009-04-14 18:48:44 UTC (rev 6488)
@@ -26,13 +26,14 @@
 #irc_trigger = nexnexnex
 
 # Tuning
+#dp_secure = 1
 #dp_server_from_wan =
-#dp_listen = 141.2.16.23:27771
+#dp_listen = 
 #dp_status_delay = 30
 #irc_reconnect_delay = 300
 #irc_admin_timeout = 3600
 #irc_admin_quote_re =
-#irc_local = 141.2.16.23
+#irc_local = 
 #irc_ping_delay = 120
 #irc_nickserv_identify = PRIVMSG NickServ :IDENTIFY %2$s
 #irc_nickserv_ghost = PRIVMSG NickServ :GHOST %1$s %2$s
@@ -46,3 +47,6 @@
 #irc_nickserv_identify = AUTHSERV AUTH myauthname %2$s
 #irc_nickserv_ghost =
 #irc_nickserv_ghost_attempts = 0
+
+# Example: connect to a non-secure DP server
+#dp_secure = 0

Modified: branches/nexuiz-2.0/server/rcon2irc/rcon2irc.pl
===================================================================
--- branches/nexuiz-2.0/server/rcon2irc/rcon2irc.pl	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/server/rcon2irc/rcon2irc.pl	2009-04-14 18:48:44 UTC (rev 6488)
@@ -436,16 +436,19 @@
 package Channel::QW;
 use strict;
 use warnings;
+use Digest::HMAC;
+use Digest::MD4;
 
 # Constructor:
 #   my $chan = new Channel::QW($connection, "password");
-sub new($$)
+sub new($$$)
 {
-	my ($class, $conn, $password) = @_;
+	my ($class, $conn, $password, $secure) = @_;
 	my $you = {
 		connector => $conn,
 		password => $password,
 		recvbuf => "",
+		secure => $secure,
 	};
 	return
 		bless $you, 'Channel::QW';
@@ -461,7 +464,16 @@
 sub send($$$)
 {
 	my ($self, $line, $nothrottle) = @_;
-	return $self->{connector}->send("\377\377\377\377rcon $self->{password} $line");
+	if($self->{secure})
+	{
+		my $t = sprintf "%ld", time();
+		my $key = Digest::HMAC::hmac("$t $line", $self->{password}, \&Digest::MD4::md4);
+		return $self->{connector}->send("\377\377\377\377srcon HMAC-MD4 TIME $key $t $line");
+	}
+	else
+	{
+		return $self->{connector}->send("\377\377\377\377rcon $self->{password} $line");
+	}
 }
 
 # Note: backslash and quotation mark escaping is a DarkPlaces extension.
@@ -653,6 +665,7 @@
 	irc_quakenet_challengeprefix => ':Q!TheQBot at CServe.quakenet.org NOTICE [^:]+ :CHALLENGE',
 
 	dp_server => undef,
+	dp_secure => 1,
 	dp_listen => "", 
 	dp_password => undef,
 	dp_status_delay => 30,
@@ -740,7 +753,7 @@
 # Create the two channels to gateway between...
 
 $channels{irc} = new Channel::Line(new Connection::Socket(tcp => $config{irc_local} => $config{irc_server} => 6667));
-$channels{dp} = new Channel::QW(my $dpsock = new Connection::Socket(udp => $config{dp_listen} => $config{dp_server} => 26000), $config{dp_password});
+$channels{dp} = new Channel::QW(my $dpsock = new Connection::Socket(udp => $config{dp_listen} => $config{dp_server} => 26000), $config{dp_password}, $config{dp_secure});
 $config{dp_listen} = $dpsock->sockname();
 print "Listening on $config{dp_listen}\n";
 

Modified: branches/nexuiz-2.0/server/server_havoc_linux.sh
===================================================================
--- branches/nexuiz-2.0/server/server_havoc_linux.sh	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/server/server_havoc_linux.sh	2009-04-14 18:48:44 UTC (rev 6488)
@@ -6,4 +6,18 @@
 esac
 
 cd "`dirname "${0}"`"
+
+if ! [ -x "$executable" ]; then
+	if [ -x "../$executable" ] && { [ -f ~/.nexuiz/data/server.cfg ] || [ -f ../data/server.cfg ] || [ -f ~/.nexuiz/havoc/server.cfg ] || [ -f ../havoc/server.cfg ]; }; then
+		cd ..
+	else
+		echo "This script is not properly set up yet."
+		echo "Please refer to the instructions in readme.txt."
+		echo "In short:"
+		echo "- copy server.cfg to the data directory and adjust its settings"
+		echo "- move this file to the main directory of your Nexuiz installation"
+		exit 1
+	fi
+fi
+
 exec ./${executable} -game havoc +serverconfig server.cfg "${@}"

Modified: branches/nexuiz-2.0/server/server_havoc_mac.sh
===================================================================
--- branches/nexuiz-2.0/server/server_havoc_mac.sh	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/server/server_havoc_mac.sh	2009-04-14 18:48:44 UTC (rev 6488)
@@ -3,4 +3,18 @@
 executable="nexuiz-osx-dedicated"
 
 cd "`dirname "${0}"`"
+
+if ! [ -x "$executable" ]; then
+	if [ -x "../$executable" ] && { [ -f ~/.nexuiz/data/server.cfg ] || [ -f ../data/server.cfg ] || [ -f ~/.nexuiz/havoc/server.cfg ] || [ -f ../havoc/server.cfg ]; }; then
+		cd ..
+	else
+		echo "This script is not properly set up yet."
+		echo "Please refer to the instructions in readme.txt."
+		echo "In short:"
+		echo "- copy server.cfg to the data directory and adjust its settings"
+		echo "- move this file to the main directory of your Nexuiz installation"
+		exit 1
+	fi
+fi
+
 exec ./${executable} -game havoc +serverconfig server.cfg "${@}"

Modified: branches/nexuiz-2.0/server/server_havoc_windows.bat
===================================================================
--- branches/nexuiz-2.0/server/server_havoc_windows.bat	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/server/server_havoc_windows.bat	2009-04-14 18:48:44 UTC (rev 6488)
@@ -5,4 +5,24 @@
 
 %~d0
 cd "%~p0"
+
+if exist %executable% goto good
+if not exist ..\%executable% goto bad
+if exist ..\data\server.cfg goto halfgood
+if exist ..\havoc\server.cfg goto halfgood
+goto bad
+
+:bad
+echo This script is not properly set up yet.
+echo Please refer to the instructions in readme.txt.
+echo In short:
+echo - copy server.cfg to the data directory and adjust its settings
+echo - move this file to the main directory of your Nexuiz installation
+pause
+exit
+
+:halfgood
+cd ..
+
+:good
 .\%executable% -game havoc +serverconfig server.cfg %*

Modified: branches/nexuiz-2.0/server/server_linux.sh
===================================================================
--- branches/nexuiz-2.0/server/server_linux.sh	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/server/server_linux.sh	2009-04-14 18:48:44 UTC (rev 6488)
@@ -6,4 +6,18 @@
 esac
 
 cd "`dirname "${0}"`"
+
+if ! [ -x "$executable" ]; then
+	if [ -x "../$executable" ] && { [ -f ~/.nexuiz/data/server.cfg ] || [ -f ../data/server.cfg ]; }; then
+		cd ..
+	else
+		echo "This script is not properly set up yet."
+		echo "Please refer to the instructions in readme.txt."
+		echo "In short:"
+		echo "- copy server.cfg to the data directory and adjust its settings"
+		echo "- move this file to the main directory of your Nexuiz installation"
+		exit 1
+	fi
+fi
+
 exec ./${executable} +serverconfig server.cfg "${@}"

Modified: branches/nexuiz-2.0/server/server_mac.sh
===================================================================
--- branches/nexuiz-2.0/server/server_mac.sh	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/server/server_mac.sh	2009-04-14 18:48:44 UTC (rev 6488)
@@ -3,4 +3,18 @@
 executable="nexuiz-osx-dedicated"
 
 cd "`dirname "${0}"`"
+
+if ! [ -x "$executable" ]; then
+	if [ -x "../$executable" ] && { [ -f ~/.nexuiz/data/server.cfg ] || [ -f ../data/server.cfg ]; }; then
+		cd ..
+	else
+		echo "This script is not properly set up yet."
+		echo "Please refer to the instructions in readme.txt."
+		echo "In short:"
+		echo "- copy server.cfg to the data directory and adjust its settings"
+		echo "- move this file to the main directory of your Nexuiz installation"
+		exit 1
+	fi
+fi
+
 exec ./${executable} +serverconfig server.cfg "${@}"

Modified: branches/nexuiz-2.0/server/server_windows.bat
===================================================================
--- branches/nexuiz-2.0/server/server_windows.bat	2009-04-14 17:58:42 UTC (rev 6487)
+++ branches/nexuiz-2.0/server/server_windows.bat	2009-04-14 18:48:44 UTC (rev 6488)
@@ -5,4 +5,23 @@
 
 %~d0
 cd "%~p0"
+
+if exist %executable% goto good
+if not exist ..\%executable% goto bad
+if exist ..\data\server.cfg goto halfgood
+goto bad
+
+:bad
+echo This script is not properly set up yet.
+echo Please refer to the instructions in readme.txt.
+echo In short:
+echo - copy server.cfg to the data directory and adjust its settings
+echo - move this file to the main directory of your Nexuiz installation
+pause
+exit
+
+:halfgood
+cd ..
+
+:good
 .\%executable% +serverconfig server.cfg %*



More information about the nexuiz-commits mailing list