[nexuiz-commits] r8223 - in branches/nexuiz-2.0: . Docs data data/gfx/menu/silver data/models data/qcsrc/client data/qcsrc/common data/qcsrc/menu/nexuiz data/qcsrc/server data/qcsrc/server/monsters data/qcsrc/server/tturrets/include data/qcsrc/server/tturrets/system data/qcsrc/server/tturrets/units data/qcsrc/server/vehicles data/textures/common

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Sat Nov 7 12:17:43 EST 2009


Author: div0
Date: 2009-11-07 12:17:43 -0500 (Sat, 07 Nov 2009)
New Revision: 8223

Added:
   branches/nexuiz-2.0/data/models/monsters/
   branches/nexuiz-2.0/data/models/vehicles/
   branches/nexuiz-2.0/data/qcsrc/server/monsters/monster_zombie.qc
   branches/nexuiz-2.0/data/textures/common/caulk.tga
   branches/nexuiz-2.0/data/textures/common/clip.tga
   branches/nexuiz-2.0/data/textures/common/donotenter.tga
   branches/nexuiz-2.0/data/textures/common/full_clip.tga
   branches/nexuiz-2.0/data/textures/common/hint.tga
   branches/nexuiz-2.0/data/textures/common/nodraw.tga
   branches/nexuiz-2.0/data/textures/common/origin.tga
   branches/nexuiz-2.0/data/textures/common/trigger.tga
Removed:
   branches/nexuiz-2.0/data/models/racers/
   branches/nexuiz-2.0/data/models/spiderbot/
   branches/nexuiz-2.0/data/qcsrc/server/server.cbp
Modified:
   branches/nexuiz-2.0/.patchsets
   branches/nexuiz-2.0/Docs/eventlog.txt
   branches/nexuiz-2.0/data/ctfscoring-div0.cfg
   branches/nexuiz-2.0/data/gfx/menu/silver/skinvalues.txt
   branches/nexuiz-2.0/data/gfx/menu/silver/tooltip.tga
   branches/nexuiz-2.0/data/qcsrc/client/View.qc
   branches/nexuiz-2.0/data/qcsrc/common/constants.qh
   branches/nexuiz-2.0/data/qcsrc/common/util.qc
   branches/nexuiz-2.0/data/qcsrc/common/util.qh
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/credits.c
   branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/slider_decibels.c
   branches/nexuiz-2.0/data/qcsrc/server/cl_client.qc
   branches/nexuiz-2.0/data/qcsrc/server/cl_physics.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/ipban.qc
   branches/nexuiz-2.0/data/qcsrc/server/keyhunt.qc
   branches/nexuiz-2.0/data/qcsrc/server/movelib.qc
   branches/nexuiz-2.0/data/qcsrc/server/progs.src
   branches/nexuiz-2.0/data/qcsrc/server/steerlib.qc
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/include/turrets_early.qh
   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_ewheel.qc
   branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_walker.qc
   branches/nexuiz-2.0/data/qcsrc/server/vehicles/racer.qc
   branches/nexuiz-2.0/data/qcsrc/server/vehicles/spiderbot.qc
   branches/nexuiz-2.0/data/qcsrc/server/vehicles/vehicles.qc
   branches/nexuiz-2.0/data/qcsrc/server/vehicles/vehicles.qh
   branches/nexuiz-2.0/data/qcsrc/server/verbstack.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_fireball.qc
   branches/nexuiz-2.0/data/qcsrc/server/w_rocketlauncher.qc
   branches/nexuiz-2.0/data/textures/common/antiportal.tga
   branches/nexuiz-2.0/data/textures/common/forcecaulk.tga
   branches/nexuiz-2.0/data/textures/common/invisible.tga
   branches/nexuiz-2.0/data/vehicle_racer.cfg
   branches/nexuiz-2.0/data/vehicle_spiderbot.cfg
Log:
r8202 | m0rfar | 2009-11-01 15:33:53 -0500 (Sun, 01 Nov 2009) | 1 line
silver menuskin tweak
r8203 | div0 | 2009-11-03 15:39:30 -0500 (Tue, 03 Nov 2009) | 2 lines
fix a pseudo leak
r8204 | tzork | 2009-11-04 08:03:02 -0500 (Wed, 04 Nov 2009) | 1 line
New DEATH_'s
r8205 | tzork | 2009-11-04 08:06:55 -0500 (Wed, 04 Nov 2009) | 1 line
Vehicle updates.
r8206 | tzork | 2009-11-04 08:17:39 -0500 (Wed, 04 Nov 2009) | 1 line
Minor turret tweaks.
r8207 | tzork | 2009-11-04 08:27:14 -0500 (Wed, 04 Nov 2009) | 1 line
lib updates
r8208 | tzork | 2009-11-04 08:32:25 -0500 (Wed, 04 Nov 2009) | 1 line
Remove code::blocks project file, its never in sync.
r8209 | tzork | 2009-11-04 08:37:21 -0500 (Wed, 04 Nov 2009) | 1 line
monster_zombie (not enabled by default, -DMONSTES_ENABLED to enable)
r8210 | tzork | 2009-11-04 08:42:20 -0500 (Wed, 04 Nov 2009) | 1 line
New editor images for some common/* shaders
r8211 | div0 | 2009-11-04 10:20:03 -0500 (Wed, 04 Nov 2009) | 2 lines
updated div0 scorign
r8212 | samual | 2009-11-04 11:24:20 -0500 (Wed, 04 Nov 2009) | 1 line
Remove the dark background of the listbox with the credits dialog (It doesn't look right with it)
r8213 | div0 | 2009-11-05 14:21:31 -0500 (Thu, 05 Nov 2009) | 2 lines
add a fteqcc bug test case
r8214 | div0 | 2009-11-05 15:25:46 -0500 (Thu, 05 Nov 2009) | 2 lines
don't guide rockets when holding secondary
r8215 | div0 | 2009-11-05 15:31:36 -0500 (Thu, 05 Nov 2009) | 2 lines
do not do laserplay stuff if damage is <= 0
r8216 | tzork | 2009-11-05 19:58:47 -0500 (Thu, 05 Nov 2009) | 1 line
VEHICLES_ENABLED not supposed to be #defined by default (yet).
r8217 | div0 | 2009-11-06 14:12:57 -0500 (Fri, 06 Nov 2009) | 2 lines
use glowmod for nexuiz 2.6 and above (checked using gameversion cvar)
r8218 | div0 | 2009-11-06 14:44:36 -0500 (Fri, 06 Nov 2009) | 2 lines
speed up exp function ;)
r8219 | div0 | 2009-11-06 14:56:01 -0500 (Fri, 06 Nov 2009) | 2 lines
float2range11 :P


Modified: branches/nexuiz-2.0/.patchsets
===================================================================
--- branches/nexuiz-2.0/.patchsets	2009-11-07 17:16:16 UTC (rev 8222)
+++ branches/nexuiz-2.0/.patchsets	2009-11-07 17:17:43 UTC (rev 8223)
@@ -1,2 +1,2 @@
 master = svn://svn.icculus.org/nexuiz/trunk
-revisions_applied = 1-7945,7948-7948,7951-8199
+revisions_applied = 1-7945,7948-7948,7951-8219

Modified: branches/nexuiz-2.0/Docs/eventlog.txt
===================================================================
--- branches/nexuiz-2.0/Docs/eventlog.txt	2009-11-07 17:16:16 UTC (rev 8222)
+++ branches/nexuiz-2.0/Docs/eventlog.txt	2009-11-07 17:17:43 UTC (rev 8223)
@@ -148,6 +148,10 @@
 	 10014 = mirror damage
 	 10015 = g_touchexplode
 	 10100 = turret
+	10150 = spiderbot miniguns
+	10151 = spiderbot rocket
+	10152 = spiderbot, cushed by
+	10300 = custom deathmessage
 
    weapon death flags are:
        256 = secondary fire

Modified: branches/nexuiz-2.0/data/ctfscoring-div0.cfg
===================================================================
--- branches/nexuiz-2.0/data/ctfscoring-div0.cfg	2009-11-07 17:16:16 UTC (rev 8222)
+++ branches/nexuiz-2.0/data/ctfscoring-div0.cfg	2009-11-07 17:17:43 UTC (rev 8223)
@@ -1,38 +1,38 @@
 set g_ctf_flagscore_pickup_base                   0
-set g_ctf_flagscore_pickup_dropped_early          3
-set g_ctf_flagscore_pickup_dropped_late           3
+set g_ctf_flagscore_pickup_dropped_early          1
+set g_ctf_flagscore_pickup_dropped_late           1
 set g_ctf_flagscore_capture                      25
-set g_ctf_flagscore_kill                          2
-set g_ctf_flagpenalty_drop                        5
-set g_ctf_flagpenalty_suicidedrop                 5
-set g_ctf_flagpenalty_returned                    2
-set g_ctf_flagscore_return                        3
+set g_ctf_flagscore_kill                          3
+set g_ctf_flagpenalty_drop                        2
+set g_ctf_flagpenalty_suicidedrop                 2
+set g_ctf_flagpenalty_returned                    1
+set g_ctf_flagscore_return                        5 // not adjusted as this would suck for team game
 set g_ctf_flagscore_return_rogue                 10
-set g_ctf_flagscore_return_by_killer              3
+set g_ctf_flagscore_return_by_killer              5
 set g_ctf_flagscore_return_rogue_by_killer       10
 
 // succeeded capture (pickup capture)            25 (0 for enemy)
-// failed capture (pickup kill drop return)      -7 (5 for enemy)
-// failed (shot into void) (pickup kill drop)    -5 (2 for enemy)
-// capture retry (kill drop pickup)              -2 (2 for enemy)
-// suicide, then retake (suicidedrop pickup)      0 (0 for enemy)
+// failed capture (pickup kill drop return)      -3 (8 for enemy)
+// failed (shot into void) (pickup kill drop)    -2 (3 for enemy)
+// capture retry (kill drop pickup)              -1 (3 for enemy)
+// suicide, then retake (suicidedrop pickup)     -1 (0 for enemy)
 
 set g_ctf_personalscore_pickup_base                   0
-set g_ctf_personalscore_pickup_dropped_early          3
-set g_ctf_personalscore_pickup_dropped_late           3
+set g_ctf_personalscore_pickup_dropped_early          1
+set g_ctf_personalscore_pickup_dropped_late           1
 set g_ctf_personalscore_capture                      25
-set g_ctf_personalscore_kill                          2
-set g_ctf_personalpenalty_drop                        5
-set g_ctf_personalpenalty_suicidedrop                 5
-set g_ctf_personalpenalty_returned                    2
-set g_ctf_personalscore_return                        3
+set g_ctf_personalscore_kill                          3
+set g_ctf_personalpenalty_drop                        2
+set g_ctf_personalpenalty_suicidedrop                 2
+set g_ctf_personalpenalty_returned                    1
+set g_ctf_personalscore_return                        2 // lowered so it's better if the killer does the return
 set g_ctf_personalscore_return_rogue                 10
-set g_ctf_personalscore_return_by_killer              3
+set g_ctf_personalscore_return_by_killer              5
 set g_ctf_personalscore_return_rogue_by_killer       10
 // AWIN = 25
-// AFAIL = -7
-// AFAILVOID = -5
-// DWIN = 5
-// ARETRY = -2
-// DRETRY = 2
+// AFAIL = -3
+// AFAILVOID = -2
+// DWIN = 8 (5 if someone else returned)
+// ARETRY = -1
+// DRETRY = 3
 // ATAKE = 0

Modified: branches/nexuiz-2.0/data/gfx/menu/silver/skinvalues.txt
===================================================================
--- branches/nexuiz-2.0/data/gfx/menu/silver/skinvalues.txt	2009-11-07 17:16:16 UTC (rev 8222)
+++ branches/nexuiz-2.0/data/gfx/menu/silver/skinvalues.txt	2009-11-07 17:17:43 UTC (rev 8223)
@@ -135,8 +135,8 @@
 ALPHA_LISTBOX_SELECTED          0.4
 COLOR_LISTBOX_WAITING           '1 0 0'
 ALPHA_LISTBOX_WAITING           0.5
-COLOR_LISTBOX_BACKGROUND		'0 0 0'
-ALPHA_LISTBOX_BACKGROUND		0
+COLOR_LISTBOX_BACKGROUND        '0 0 0'
+ALPHA_LISTBOX_BACKGROUND        0.20
 
 // item: map list
 COLOR_MAPLIST_TITLE             '1 1 1'

Modified: branches/nexuiz-2.0/data/gfx/menu/silver/tooltip.tga
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/models/monsters (from rev 8219, trunk/data/models/monsters)

Copied: branches/nexuiz-2.0/data/models/vehicles (from rev 8219, trunk/data/models/vehicles)

Modified: branches/nexuiz-2.0/data/qcsrc/client/View.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/client/View.qc	2009-11-07 17:16:16 UTC (rev 8222)
+++ branches/nexuiz-2.0/data/qcsrc/client/View.qc	2009-11-07 17:17:43 UTC (rev 8223)
@@ -5,6 +5,8 @@
 #define rld_size_x 256
 #define rld_size_y 16
 
+void CSQC_WAKIZASHI_HUD();
+
 entity porto;
 vector polyline[16];
 float trace_dphitcontents;
@@ -588,13 +590,10 @@
 	hud = getstati(STAT_HUD);
 	if(hud == HUD_SPIDERBOT)
 	{
-		vector sz;
 		CSQC_spider_HUD();
-		sz = drawgetimagesize(SPIDER_CROSS);
-		sz_x *= cvar_or("cl_vehicle_spiderbot_cross_size",1);
-		sz_y *= cvar_or("cl_vehicle_spiderbot_cross_size",1);
-		drawpic('0.5 0 0' * (vid_conwidth - sz_x) + '0 0.5 0' * (vid_conheight - sz_y), SPIDER_CROSS, sz, '1 1 1', cvar_or("cl_vehicle_spiderbot_cross_alpha",0.6), DRAWFLAG_NORMAL);
 	}
+	else if(hud == HUD_WAKIZASHI)
+        CSQC_WAKIZASHI_HUD();
 	else
 	{
 		if(cvar("r_letterbox") == 0)
@@ -850,12 +849,17 @@
 	float rockets,reload,heat,hp,shield,i;
 	vector p,pp;
 
-	rockets = getstati(STAT_SPIDERBOT_ROCKETS);
-	heat    = min(getstatf(STAT_SPIDERBOT_HEAT),1);
-	reload  = min(getstatf(STAT_SPIDERBOT_RELOAD),1);
-	hp      = min(getstatf(STAT_SPIDERBOT_HEALTH),1);
-	shield  = min(getstatf(STAT_SPIDERBOT_SHIELD),1);
+    p = drawgetimagesize(SPIDER_CROSS);
+    p_x *= cvar_or("cl_vehicle_spiderbot_cross_size", 1);
+    p_y *= cvar_or("cl_vehicle_spiderbot_cross_size", 1);
+    drawpic('0.5 0 0' * (vid_conwidth - p_x) + '0 0.5 0' * (vid_conheight - p_y), SPIDER_CROSS, p, '1 1 1', cvar_or("cl_vehicle_spiderbot_cross_alpha",0.6), DRAWFLAG_NORMAL);
 
+    hp      = bound(0,getstatf(STAT_VEHICLESTAT_HEALTH), 1);
+	shield  = bound(0,getstatf(STAT_VEHICLESTAT_SHIELD), 1);
+	heat    = min(getstatf(STAT_VEHICLESTAT_RELOAD1), 1);
+	rockets =     getstati(STAT_VEHICLESTAT_AMMO2);
+	reload  = min(getstatf(STAT_VEHICLESTAT_RELOAD2), 1);
+
 	// Draw health bar
 	p = '0.5 0 0' * (vid_conwidth - (rkt_size * 8));
 	p = p + '0 1 0' * vid_conheight - '0 32 0';
@@ -906,6 +910,84 @@
 	}
 
 }
+
+void CSQC_WAKIZASHI_HUD()
+{
+	// 0--1 floats. 1 = 100%, 0.6 = 50%.
+	float health, shield, energy, rockets;
+
+    float i;
+	vector p, pp;
+
+    p = drawgetimagesize(SPIDER_CROSS);
+    p_x *= cvar_or("cl_vehicle_spiderbot_cross_size", 1);
+    p_y *= cvar_or("cl_vehicle_spiderbot_cross_size", 1);
+    drawpic('0.5 0 0' * (vid_conwidth - p_x) + '0 0.5 0' * (vid_conheight - p_y), SPIDER_CROSS, p, '1 1 1', cvar_or("cl_vehicle_spiderbot_cross_alpha",0.6), DRAWFLAG_NORMAL);
+
+/*
+const float STAT_VEHICLESTAT_HEALTH  = 60;
+const float STAT_VEHICLESTAT_SHIELD  = 61;
+const float STAT_VEHICLESTAT_ENERGY  = 62;
+const float STAT_VEHICLESTAT_AMMO1   = 63;
+const float STAT_VEHICLESTAT_RELAOD1 = 64;
+const float STAT_VEHICLESTAT_AMMO2   = 65;
+const float STAT_VEHICLESTAT_RELOAD2 = 66;
+*/
+    health  = min(getstatf(STAT_VEHICLESTAT_HEALTH),  1);
+	shield  = min(getstatf(STAT_VEHICLESTAT_SHIELD),  1);
+	energy  = min(getstatf(STAT_VEHICLESTAT_ENERGY),  1);
+	rockets = bound(0,getstatf(STAT_VEHICLESTAT_RELOAD1), 1);
+
+
+	p = '0.5 0 0' * (vid_conwidth - (rkt_size * 8));
+	p = p + '0 1 0' * vid_conheight - '0 32 0';
+
+	// Draw health bar
+	p_y += 8;
+	drawfill(p, '256 0 0' * health + '0 8 0' , '0 0.7 0', 0.75, DRAWFLAG_NORMAL);
+	p_x += 256 * health;
+	drawfill(p, '256 0 0' * (1 - health) + '0 8 0' , '0 0 0', 0.75, DRAWFLAG_NORMAL);
+
+	// Draw shiled bar
+	p_x -= 256 * health;
+	p_y += 4;
+	drawfill(p, '256 0 0' * shield + '0 4 0' , '0.25 0.25 1', 0.5, DRAWFLAG_NORMAL);
+
+	// Draw energy
+	//p_x -= 256 * health;
+	p_y -= 8;
+	drawfill(p, '256 0 0' * energy + '0 4 0' , '1 1 1', 0.75, DRAWFLAG_NORMAL);
+
+	// Draw rockets bar
+	p_y += 12;
+	drawfill(p, '256 0 0' * rockets + '0 4 0' , '1 0 0', 0.75, DRAWFLAG_NORMAL);
+
+
+	/*
+	// Draw energy bar
+	p = '0.5 0 0' * (vid_conwidth - 256);
+	p = p + '0 1 0' * vid_conheight - '0 34  0';
+	drawfill(p, '256 0 0' * (1 - energy) + '0 2 0' ,'0 0 1', 0.5, DRAWFLAG_NORMAL);
+	p_x += 256 * (1 - energy);
+	drawfill(p, '256 0 0' * energy  + '0 2 0' , '1 0 0', 0.5, DRAWFLAG_NORMAL);
+
+	// Draw rockets bar
+	p_y += 8;
+	drawfill(p, '256 0 0' * rockets + '0 8 0' , '1 0 0', 0.75, DRAWFLAG_NORMAL);
+	p_x += 256 * health;
+	drawfill(p, '256 0 0' * (1 - rockets) + '0 8 0' , '0 0 0', 0.75, DRAWFLAG_NORMAL);
+    */
+
+
+	if (sb_showscores)
+	{
+		Sbar_DrawScoreboard();
+		Sbar_DrawCenterPrint();
+	}
+
+}
+
+
 void CSQC_common_hud(void)
 {
 	// Sbar_SortFrags(); done in Sbar_Draw
@@ -922,6 +1004,10 @@
 		case HUD_SPIDERBOT:
 			CSQC_spider_HUD();
 			break;
+
+		case HUD_WAKIZASHI:
+			CSQC_WAKIZASHI_HUD();
+			break;
 	}
 }
 

Modified: branches/nexuiz-2.0/data/qcsrc/common/constants.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/common/constants.qh	2009-11-07 17:16:16 UTC (rev 8222)
+++ branches/nexuiz-2.0/data/qcsrc/common/constants.qh	2009-11-07 17:17:43 UTC (rev 8223)
@@ -272,16 +272,17 @@
 const float STAT_HUD = 50;
 const float HUD_NORMAL = 0;
 const float HUD_SPIDERBOT = 10;
+const float HUD_WAKIZASHI = 11;
 
-const float STAT_SPIDERBOT_HEALTH  = 60;
-const float STAT_SPIDERBOT_ROCKETS = 61;
-const float STAT_SPIDERBOT_HEAT    = 62;
-const float STAT_SPIDERBOT_RELOAD  = 63;
-const float STAT_SPIDERBOT_ENERGY  = 64;
-const float STAT_SPIDERBOT_SHIELD  = 65;
+const float STAT_VEHICLESTAT_HEALTH  = 60;
+const float STAT_VEHICLESTAT_SHIELD  = 61;
+const float STAT_VEHICLESTAT_ENERGY  = 62;
+const float STAT_VEHICLESTAT_AMMO1   = 63;
+const float STAT_VEHICLESTAT_RELOAD1 = 64;
+const float STAT_VEHICLESTAT_AMMO2   = 65;
+const float STAT_VEHICLESTAT_RELOAD2 = 66;
 
 //const float STAT_SPIDERBOT_AIM     53 // compressShotOrigin
-
 //const float STAT_SPIDERBOT_TARGET  54 // compressShotOrigin
 
 
@@ -441,8 +442,20 @@
 float DEATH_TOUCHEXPLODE = 10015;
 float DEATH_CHEAT = 10016;
 float DEATH_FIRE = 10017;
-float DEATH_TURRET = 10100;
+float DEATH_TURRET = 10020;
 
+float DEATH_SBMINIGUN = 10030;
+float DEATH_SBROCKET  = 10031;
+float DEATH_SBCRUSH   = 10032;
+float DEATH_SBBLOWUP  = 10033;
+
+float DEATH_WAKIGUN    = 10040;
+float DEATH_WAKIROCKET = 10041;
+float DEATH_WAKIBLOWUP = 10042;
+
+float DEATH_CUSTOM = 10300;
+
+
 float DEATH_WEAPONMASK = 0xFF;
 float DEATH_HITTYPEMASK = 0x1F00; // which is WAY below 10000 used for normal deaths
 float HITTYPE_SECONDARY = 0x100;

Modified: branches/nexuiz-2.0/data/qcsrc/common/util.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/common/util.qc	2009-11-07 17:16:16 UTC (rev 8222)
+++ branches/nexuiz-2.0/data/qcsrc/common/util.qc	2009-11-07 17:17:43 UTC (rev 8223)
@@ -1651,11 +1651,14 @@
 #endif
 #endif
 
+float float2range11(float f)
+{
+	// continuous function mapping all reals into -1..1
+	return f / (fabs(f) + 1);
+}
+
 float float2range01(float f)
 {
 	// continuous function mapping all reals into 0..1
-	if(f >= 0)
-		return 1.0 - 0.5 / (1.0 + f);
-	else
-		return 0.0 + 0.5 / (1.0 - f);
+	return 0.5 + 0.5 * float2range11(f);
 }

Modified: branches/nexuiz-2.0/data/qcsrc/common/util.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/common/util.qh	2009-11-07 17:16:16 UTC (rev 8222)
+++ branches/nexuiz-2.0/data/qcsrc/common/util.qh	2009-11-07 17:17:43 UTC (rev 8223)
@@ -198,4 +198,5 @@
 // the NULL function
 const var void func_null(void);
 const var string string_null;
+float float2range11(float f);
 float float2range01(float f);

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/credits.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/credits.c	2009-11-07 17:16:16 UTC (rev 8222)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/credits.c	2009-11-07 17:17:43 UTC (rev 8223)
@@ -12,6 +12,8 @@
 	ATTRIB(NexuizCreditsList, realUpperMargin, float, 0)
 	ATTRIB(NexuizCreditsList, bufferIndex, float, 0)
 	ATTRIB(NexuizCreditsList, scrolling, float, 0)
+
+	ATTRIB(NexuizListBox, alphaBG, float, 0)
 ENDCLASS(NexuizCreditsList)
 entity makeNexuizCreditsList();
 #endif

Modified: branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/slider_decibels.c
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/slider_decibels.c	2009-11-07 17:16:16 UTC (rev 8222)
+++ branches/nexuiz-2.0/data/qcsrc/menu/nexuiz/slider_decibels.c	2009-11-07 17:17:43 UTC (rev 8223)
@@ -11,6 +11,9 @@
 
 float exp(float x)
 {
+	return pow(2.718281828459045, x);
+
+	/* wtf did I do here?
 	float i;
 	float t, s;
 
@@ -24,6 +27,7 @@
 	}
 
 	return s;
+	*/
 }
 
 float ln(float x)

Modified: branches/nexuiz-2.0/data/qcsrc/server/cl_client.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/cl_client.qc	2009-11-07 17:16:16 UTC (rev 8222)
+++ branches/nexuiz-2.0/data/qcsrc/server/cl_client.qc	2009-11-07 17:17:43 UTC (rev 8223)
@@ -2404,7 +2404,11 @@
 		}
 
 		if(frametime)
+		{
+			if(cvar("gameversion") >= 20600) // only do this for 2.6 and above FIXME remove this check when making 2.6
+				self.glowmod = colormapPaletteColor(self.clientcolors & 0x0F, TRUE) * 2;
 			player_powerups();
+		}
 
 		if (self.deadflag != DEAD_NO)
 		{

Modified: branches/nexuiz-2.0/data/qcsrc/server/cl_physics.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/cl_physics.qc	2009-11-07 17:16:16 UTC (rev 8222)
+++ branches/nexuiz-2.0/data/qcsrc/server/cl_physics.qc	2009-11-07 17:17:43 UTC (rev 8223)
@@ -547,7 +547,11 @@
 	float buttons_prev;
 	float not_allowed_to_move;
 	string c;
-	
+
+    if(self.PlayerPhysplug)
+        if(self.PlayerPhysplug())
+            return;
+
 	if(g_race || g_cts)
 	{
 		// if record times matter
@@ -631,10 +635,6 @@
 	}
 	else if(self.specialcommand_pos && (c != substring(specialcommand, self.specialcommand_pos - 1, 1)))
 		self.specialcommand_pos = 0;
-	
-    if(self.PlayerPhysplug)
-        if(self.PlayerPhysplug())
-            return;
 
 	if(!sv_maxidle_spectatorsareidle || self.movetype == MOVETYPE_WALK)
 	{

Modified: branches/nexuiz-2.0/data/qcsrc/server/defs.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/defs.qh	2009-11-07 17:16:16 UTC (rev 8222)
+++ branches/nexuiz-2.0/data/qcsrc/server/defs.qh	2009-11-07 17:17:43 UTC (rev 8223)
@@ -622,3 +622,5 @@
 
 .entity clientdata;
 .entity personal;
+
+string deathmessage;

Modified: branches/nexuiz-2.0/data/qcsrc/server/g_damage.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/g_damage.qc	2009-11-07 17:16:16 UTC (rev 8222)
+++ branches/nexuiz-2.0/data/qcsrc/server/g_damage.qc	2009-11-07 17:17:43 UTC (rev 8223)
@@ -236,6 +236,7 @@
 			s = "A corpse";
 		else
 			s = targ.netname;
+
 		a = attacker.netname;
 
 		if (targ == attacker)
@@ -376,7 +377,7 @@
 					if((cvar("sv_fragmessage_information_typefrag")) && (targ.BUTTON_CHAT)) {
 						centerprint(attacker, strcat(DAMAGE_CENTERPRINT_SPACER, blood_message, "^1You typefragged ^7", s, GetAdvancedDeathReports(targ)));
 						centerprint(targ, strcat(DAMAGE_CENTERPRINT_SPACER, victim_message, "^1You were typefragged by ^7", a, GetAdvancedDeathReports(attacker)));
-					} else { 
+					} else {
 						centerprint(attacker, strcat(DAMAGE_CENTERPRINT_SPACER, blood_message, "^4You fragged ^7", s, GetAdvancedDeathReports(targ)));
 						centerprint(targ, strcat(DAMAGE_CENTERPRINT_SPACER, victim_message, "^1You were fragged by ^7", a, GetAdvancedDeathReports(attacker)));
 					}
@@ -420,6 +421,22 @@
 						else
 							bprint("^1", s, "^1 ", substring(inflictor.message2, 0, p), a, "^1", substring(inflictor.message2, p+1, strlen(inflictor.message2) - (p+1)), "\n");
 					}
+					else if(deathtype == DEATH_SBCRUSH)
+                        bprint ("^1",s, "^1 was crushed by ^1", a, "\n");
+					else if(deathtype == DEATH_SBMINIGUN)
+                        bprint ("^1",s, "^1 got shredded by ^1", a, "\n");
+					else if(deathtype == DEATH_SBROCKET)
+                        bprint ("^1",s, "^1 was blased to bits by ^1", a, "\n");
+					else if(deathtype == DEATH_SBBLOWUP)
+                        bprint ("^1",s, "^1 got cought in the destruction of ^1", a, "'s vehicle\n");
+
+					else if(deathtype == DEATH_WAKIGUN)
+                        bprint ("^1",s, "^1 was bolted down by ^1", a, "\n");
+					else if(deathtype == DEATH_WAKIROCKET)
+                        bprint ("^1",s, "^1 could find no shelter from ^1", a, "'s rockets\n");
+					else if(deathtype == DEATH_WAKIBLOWUP)
+                        bprint ("^1",s, "^1 dies when ^1", a, "'s wakizashi dies.\n");
+
 					else if(deathtype == DEATH_TURRET)
 						bprint ("^1",s, "^1 was pushed into the line of fire by ^1", a, "\n");
 					else if(deathtype == DEATH_TOUCHEXPLODE)
@@ -427,7 +444,9 @@
 					else if(deathtype == DEATH_CHEAT)
 						bprint ("^1",s, "^1 was unfairly eliminated by ^1", a, "\n");
 					else if (deathtype == DEATH_FIRE)
-						bprint ("^1",s, "^1 was burnt to death by ^1", a, "\n");
+					bprint ("^1",s, "^1 was burnt to death by ^1", a, "\n");
+					else if (deathtype == DEATH_CUSTOM)
+						bprint ("^1",s, "^1 ", deathmessage, " by ^1", a, "\n");
 					else
 						bprint ("^1",s, "^1 was fragged by ", a, "\n");
 				}
@@ -555,6 +574,8 @@
 					bprint ("^1",s, "^1 is now conserved for centuries to come\n");
 			else if(deathtype == DEATH_TURRET)
 				bprint ("^1",s, "^1 was mowed down by a turret \n");
+            else if (deathtype == DEATH_CUSTOM)
+                bprint ("^1",s, "^1 ", deathmessage, "\n");
 			else if(deathtype == DEATH_TOUCHEXPLODE)
 				bprint ("^1",s, "^1 died in an accident\n");
 			else if(deathtype == DEATH_CHEAT)
@@ -582,9 +603,11 @@
 
 			LogDeath("accident", deathtype, targ, targ);
 		}
+
 		targ.death_origin = targ.origin;
 		if(targ != attacker)
 			targ.killer_origin = attacker.origin;
+
 		// FIXME: this should go in PutClientInServer
 		if (targ.killcount)
 			targ.killcount = 0;

Modified: branches/nexuiz-2.0/data/qcsrc/server/ipban.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/ipban.qc	2009-11-07 17:16:16 UTC (rev 8222)
+++ branches/nexuiz-2.0/data/qcsrc/server/ipban.qc	2009-11-07 17:17:43 UTC (rev 8223)
@@ -180,12 +180,12 @@
 	float i, n;
 	
 	if(cvar_string("g_ban_sync_uri") == "")
-		return;
+		goto killme;
 	if(cvar("g_ban_sync_interval") == 0) // < 0 is okay, it means "sync on level start only"
-		return;
+		goto killme;
 	argc = tokenize_console(cvar_string("g_ban_sync_trusted_servers"));
 	if(argc == 0)
-		return;
+		goto killme;
 
 	if(OnlineBanList_Servers)
 		strunzone(OnlineBanList_Servers);
@@ -212,6 +212,12 @@
 	
 	if(cvar("g_ban_sync_interval") > 0)
 		self.nextthink = time + max(60, cvar("g_ban_sync_interval") * 60);
+	else
+		goto killme;
+	return;
+
+:killme
+	remove(self);
 }
 
 #define BAN_MAX 64

Modified: branches/nexuiz-2.0/data/qcsrc/server/keyhunt.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/keyhunt.qc	2009-11-07 17:16:16 UTC (rev 8222)
+++ branches/nexuiz-2.0/data/qcsrc/server/keyhunt.qc	2009-11-07 17:17:43 UTC (rev 8223)
@@ -1,3 +1,5 @@
+#message I can spam the compiler output too - and fteqcc sucks and always cuts off the last character
+
 #define FOR_EACH_KH_KEY(v) for(v = kh_worldkeylist; v; v = v.kh_worldkeynext )
 
 // #define KH_PLAYER_USE_ATTACHMENT

Copied: branches/nexuiz-2.0/data/qcsrc/server/monsters/monster_zombie.qc (from rev 8219, trunk/data/qcsrc/server/monsters/monster_zombie.qc)
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/monsters/monster_zombie.qc	                        (rev 0)
+++ branches/nexuiz-2.0/data/qcsrc/server/monsters/monster_zombie.qc	2009-11-07 17:17:43 UTC (rev 8223)
@@ -0,0 +1,555 @@
+//#define MONSTES_ENABLED
+#ifdef MONSTES_ENABLED
+
+#define zombie_anim_attackleap         0
+#define zombie_anim_attackrun1         1
+#define zombie_anim_attackrun2         2
+#define zombie_anim_attackrun3         3
+#define zombie_anim_attackstanding1    4
+#define zombie_anim_attackstanding2    5
+#define zombie_anim_attackstanding3    6
+#define zombie_anim_blockend           7
+#define zombie_anim_blockstart         8
+#define zombie_anim_deathback1         9
+#define zombie_anim_deathback2         10
+#define zombie_anim_deathback3         11
+#define zombie_anim_deathfront1        12
+#define zombie_anim_deathfront2        13
+#define zombie_anim_deathfront3        14
+#define zombie_anim_deathleft1         15
+#define zombie_anim_deathleft2         16
+#define zombie_anim_deathright1        17
+#define zombie_anim_deathright2        18
+#define zombie_anim_idle               19
+#define zombie_anim_painback1          20
+#define zombie_anim_painback2          21
+#define zombie_anim_painfront1         22
+#define zombie_anim_painfront2         23
+#define zombie_anim_runbackwards       24
+#define zombie_anim_runbackwardsleft   25
+#define zombie_anim_runbackwardsright  26
+#define zombie_anim_runforward         27
+#define zombie_anim_runforwardleft     28
+#define zombie_anim_runforwardright    29
+#define zombie_anim_spawn              30
+
+#define ZOMBIE_MIN					 '-18 -18 -25'
+#define ZOMBIE_MAX					 '18 18 47'
+
+#define ZV_IDLE     10
+
+#define ZV_PATH     100
+#define ZV_HUNT     200
+
+#define ZV_ATTACK_FIND  10
+#define ZV_ATTACK_RUN   20
+#define ZV_ATTACK_STAND 30
+
+#define ZV_PATH2 10000
+
+//.entity verbs_idle;
+//.entity verbs_attack;
+//.entity verbs_move;
+
+//.float  state_timeout;
+//.void() monster_state;
+#define MONSTERFLAG_NORESPAWN 2
+
+void zombie_spawn();
+
+float zombie_scoretarget(entity trg)
+{
+    float  tmp;
+    vector ang1;
+
+    if (trg.takedamage == DAMAGE_AIM)
+    if not (trg.flags & FL_NOTARGET)
+    if (trg.deadflag == DEAD_NO)
+    if (trg.team != self.team)
+    {
+        if((self.origin_z - trg.origin_z) < 128)
+        {
+            ang1 = normalize(self.origin - trg.origin);
+            tmp = vlen(ang1 - v_forward);
+            if(tmp > 1.5)
+            {
+                traceline(self.origin + '0 0 47',trg.origin + '0 0 32',MOVE_NORMAL,self);
+                if(trace_ent != trg)
+                    return 0;
+
+                return (cvar("g_monster_zombie_targetrange") - vlen(self.origin - trg.origin)) * tmp;
+            }
+            else if(self.enemy == trg)
+                return (cvar("g_monster_zombie_targetrange") - vlen(self.origin - trg.origin)) * tmp;
+        }
+    }
+
+    return 0;
+}
+
+void zombie_corpse_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
+{
+    //dprint("zombie_corpse_damage\n");
+    Violence_GibSplash_At(hitloc, force, 2, bound(0, damage, 200) / 16, self, attacker);
+
+    self.health -= damage;
+
+    if(self.health < 0)
+    {
+        Violence_GibSplash(self, 1, 1, attacker);
+        remove(self);
+    }
+}
+
+void zombie_die(vector dir)
+{
+    vector v;
+    float f;
+
+    entity dummy;
+
+    dummy = spawn();
+    setmodel(dummy,"models/monsters/zombie.dpm");
+    setorigin(dummy, self.origin);
+    dummy.velocity  = self.velocity;
+    dummy.movetype  = MOVETYPE_BOUNCE;
+    dummy.think     = SUB_Remove;
+    dummy.nextthink = time + 3;
+    dummy.health    = 50;
+    dummy.takedamage = DAMAGE_YES;
+    dummy.event_damage = zombie_corpse_damage;
+    dummy.solid      = SOLID_CORPSE;
+    setsize(dummy,self.mins,self.maxs);
+
+    SUB_SetFade(dummy,time + 5,2);
+
+
+    v = normalize(self.origin - dir);
+    f = vlen(v_forward - v) - 1;
+    if(f > 0.5)
+        dummy.frame = zombie_anim_deathfront1 + rint(random() * 2);
+    else if(f < 0.5)
+        dummy.frame = zombie_anim_deathback1 + rint(random() * 2);
+    else
+    {
+        f = vlen(v_right - v) - 1;
+        if(f > 0.5)
+            dummy.frame = zombie_anim_deathright1 + rint(random() * 2);
+        else if(f < 0.5)
+            dummy.frame = zombie_anim_deathleft1 + rint(random() * 2);
+    }
+
+
+    if(self.spawnflags & MONSTERFLAG_NORESPAWN)
+    {
+        self.think = SUB_Remove;
+        self.nextthink = time;
+        return;
+    }
+
+    setmodel(self,"");
+    self.solid          = SOLID_NOT;
+    self.takedamage     = DAMAGE_NO;
+    self.event_damage   = SUB_Null;
+    self.enemy          = world;
+    self.think          = zombie_spawn;
+    self.nextthink      = time + cvar("g_monster_zombie_respawntime");
+    self.pain_finished  = self.nextthink;
+}
+
+void zombie_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
+{
+
+    vector v;
+    float f;
+
+    v = normalize(self.origin - hitloc);
+    f = vlen(v_forward - v) - 1;
+
+
+    self.health -= damage;
+    self.velocity = self.velocity + force;
+    if(self.health <= 0)
+    {
+        zombie_die(hitloc);
+        return;
+    }
+
+    Violence_GibSplash_At(hitloc, force, 2, bound(0, damage, 200) / 16, self, attacker);
+
+	if (damage > 50)
+		Violence_GibSplash_At(hitloc, force * -0.1, 3, 1, self, attacker);
+	if (damage > 100)
+		Violence_GibSplash_At(hitloc, force * -0.2, 3, 1, self, attacker);
+
+    if (time > self.pain_finished)
+    {
+        if(f < 0.5)
+        {
+            if(random() < 0.5)
+                self.frame = zombie_anim_painback1;
+            else
+                self.frame = zombie_anim_painback2;
+        }
+        else
+        {
+            if(random() < 0.5)
+                self.frame = zombie_anim_painfront1;
+            else
+                self.frame = zombie_anim_painfront2;
+        }
+
+        self.pain_finished = time + 0.36;
+    }
+}
+
+.vector bvec;
+.float bvec_time;
+
+void zombie_move()
+{
+    vector real_angle;
+    float vz, tdiff, tspeed;
+
+    tdiff = time - self.zoomstate;
+    tspeed = tdiff * cvar("g_monster_zombie_turnspeed");
+    vz = self.velocity_z;
+    self.zoomstate = time;
+
+    if(self.bvec_time < time)
+    {
+        self.bvec_time = time + 0.2;
+        self.bvec = steerlib_beamsteer(steerlib_attract2(self.moveto,0.5,500,0.95),512,32,34,64);
+    }
+
+    if(self.enemy)
+        self.moveto = self.enemy.origin;
+    else
+        self.moveto = self.origin + v_forward;
+
+    self.steerto = normalize(steerlib_attract2(self.moveto,0.5,500,0.95) + self.bvec);
+
+    self.angles_y = safeangle(self.angles_y);
+    real_angle = vectoangles(self.steerto) - self.angles;
+    self.angles_y += bound(-10, real_angle_y, 10);
+
+    if(vlen(self.origin - self.moveto) > 64)
+    {
+        movelib_move_simple(v_forward ,cvar("g_monster_zombie_movespeed"),0.6);
+        if(time > self.pain_finished)
+            if(self.attack_finished_single < time)
+                self.frame = zombie_anim_runforward;
+    }
+    else
+    {
+        movelib_beak_simple(cvar("g_monster_zombie_stopspeed"));
+        if(time > self.pain_finished)
+            if(self.attack_finished_single < time)
+                self.frame = zombie_anim_idle;
+    }
+
+    self.velocity_z = vz;
+    self.steerto = self.origin;
+}
+
+float zombie_verb_idle_roam(float eval)
+{
+    switch (eval)
+    {
+    case VCM_EVAL:
+
+        if(self.enemy)
+            return VS_CALL_NO;
+
+        return verb.verb_static_value;
+
+    case VCM_DO:
+
+        self.moveto = v_forward * 128;
+        self.steerto = v_forward; //steerlib_beamsteer(v_forward,512,32,34,64);
+
+        return VS_CALL_YES_DOING;
+    }
+
+    return VS_CALL_YES_DONE;
+}
+
+float zombie_verb_idle_stand(float eval)
+{
+    switch (eval)
+    {
+    case VCM_EVAL:
+
+        if(self.enemy)
+            return VS_CALL_NO;
+
+        return verb.verb_static_value;
+
+    case VCM_DO:
+
+        self.moveto   = self.origin;
+        self.frame    = zombie_anim_idle;
+        self.velocity = '0 0 0';
+
+        return VS_CALL_YES_DOING;
+    }
+
+    return VS_CALL_YES_DONE;
+}
+
+float zombie_verb_idle(float eval)
+{
+    switch (eval)
+    {
+    case VCM_EVAL:
+
+        if(self.enemy)
+            return VS_CALL_NO;
+
+        return verb.verb_static_value;
+
+    case VCM_DO:
+        float t;
+
+        t = cvar("g_monster_zombie_idle_timer_max") -  cvar("g_monster_zombie_idle_timer_min");
+        t = cvar("g_monster_zombie_idle_timer_min") + (random() * t);
+
+        if(random() < 0.5)
+            verbstack_push(self.verbs_idle, zombie_verb_idle_roam,  ZV_IDLE + 1, t, self);
+        else
+            verbstack_push(self.verbs_idle, zombie_verb_idle_stand, ZV_IDLE + 1, 0.1, self);
+
+        return VS_CALL_YES_DOING;
+    }
+
+    return VS_CALL_YES_DONE;
+}
+
+float zombie_verb_attack_findtarget(float eval)
+{
+    switch (eval)
+    {
+    case VCM_EVAL:
+        if(self.enemy)
+            return VS_CALL_NO;
+
+        return verb.verb_static_value;
+
+    case VCM_DO:
+
+        entity trg, best_trg;
+        float trg_score, best_trg_score;
+
+        trg = findradius(self.origin,cvar("g_monster_zombie_targetrange"));
+        while(trg)
+        {
+            trg_score = zombie_scoretarget(trg);
+            if(trg_score > best_trg_score)
+            {
+                best_trg = trg;
+                best_trg_score = trg_score;
+            }
+
+            trg = trg.chain;
+        }
+
+        if(best_trg)
+        {
+            self.enemy = best_trg;
+            dprint("Selected: ",best_trg.netname, " as target.\n");
+        }
+
+        return VS_CALL_YES_DOING;
+    }
+
+    return VS_CALL_YES_DONE;
+}
+
+void zombie_runattack_damage()
+{
+    entity oldself;
+    oldself = self;
+    self = self.owner;
+
+    if(vlen(self.origin - self.enemy.origin) > cvar("g_monster_zombie_attack_run_hitrange"))
+        return;
+
+    if(vlen(normalize(self.origin - self.enemy.origin) - v_forward) < 1.6)
+        return;
+
+    Damage(self.enemy, self, self, cvar("g_monster_zombie_attack_run_damage"), DEATH_TURRET, self.enemy.origin, normalize(self.enemy.origin - self.origin)  * cvar("g_monster_zombie_attack_run_force"));
+
+    self = oldself;
+    self.think = SUB_Remove;
+    self.nextthink = time;
+}
+
+float zombie_verb_attack_run(float eval)
+{
+    switch (eval)
+    {
+    case VCM_EVAL:
+        if not (self.enemy)
+            return VS_CALL_NO;
+
+        if(self.attack_finished_single > time)
+            return VS_CALL_NO;
+
+        if(vlen(self.origin - self.enemy.origin) > cvar("g_monster_zombie_attack_run_range"))
+            return VS_CALL_NO;
+
+        if(vlen(normalize(self.origin - self.enemy.origin) - v_forward) < 1.6)
+            return VS_CALL_NO;
+
+        return verb.verb_static_value;
+
+    case VCM_DO:
+        entity pain;
+        pain = spawn();
+        pain.owner = self;
+        pain.think = zombie_runattack_damage;
+        pain.nextthink = time + cvar("g_monster_zombie_attack_run_delay");
+
+        self.attack_finished_single = time + 0.7;
+        self.frame = zombie_anim_attackrun1 + rint(random() * 2);
+
+        return VS_CALL_YES_DOING;
+    }
+
+    return VS_CALL_YES_DONE;
+}
+
+void zombie_standattack_damage()
+{
+    //entity oldself;
+    //oldself = self;
+    //self = self.owner;
+
+    setorigin(self,self.owner.origin + v_forward * 32);
+    RadiusDamage(self, self.owner, cvar("g_monster_zombie_attack_stand_damage"),cvar("g_monster_zombie_attack_stand_damage"),16,self, cvar("g_monster_zombie_attack_stand_force"),DEATH_TURRET,world);
+    //float RadiusDamage (entity inflictor, entity attacker, float coredamage, float edgedamage, float rad, entity ignore, float forceintensity, float deathtype, entity directhitentity)
+
+
+    //self = oldself;
+    self.think = SUB_Remove;
+    self.nextthink = time;
+}
+
+float zombie_verb_attack_stand(float eval)
+{
+    switch (eval)
+    {
+    case VCM_EVAL:
+        if not (self.enemy)
+            return VS_CALL_NO;
+
+        if(self.attack_finished_single > time)
+            return VS_CALL_NO;
+
+        if(vlen(self.origin - self.enemy.origin) > cvar("g_monster_zombie_attack_stand_range"))
+            return VS_CALL_NO;
+
+        if(vlen(normalize(self.origin - self.enemy.origin) - v_forward) < 1.8)
+            return VS_CALL_NO;
+
+        return verb.verb_static_value;
+
+    case VCM_DO:
+        entity pain;
+        pain = spawn();
+        pain.owner = self;
+        pain.think = zombie_runattack_damage;
+        pain.nextthink = time + cvar("g_monster_zombie_attack_stand_delay");
+
+        self.attack_finished_single = time + 0.7;
+        self.frame = zombie_anim_attackstanding1 + rint(random() * 1);
+        dprint("frame:",ftos(self.frame),"\n");
+
+        return VS_CALL_YES_DOING;
+    }
+
+    return VS_CALL_YES_DONE;
+}
+
+void zombie_think()
+{
+    self.angles_x *= -1;
+    makevectors(self.angles);
+    self.angles_x *= -1;
+
+    if (zombie_scoretarget(self.enemy) == 0)
+        self.enemy = world;
+
+    verbstack_pop(self.verbs_attack);
+    //verbstack_pop(self.verbs_move);
+
+    if not (self.enemy)
+        verbstack_pop(self.verbs_idle);
+
+    zombie_move();
+
+    if(self.enemy)
+        self.nextthink = time;
+    else
+        self.nextthink = time + 0.2;
+}
+
+void zombie_spawn()
+{
+    setmodel(self,"models/monsters/zombie.dpm");
+
+    self.solid          = SOLID_BBOX;
+    self.takedamage     = DAMAGE_AIM;
+    self.event_damage   = zombie_damage;
+    self.enemy          = world;
+    self.frame          = zombie_anim_spawn;
+    self.think          = zombie_think;
+    self.nextthink      = time + 2.1;
+    self.pain_finished  = self.nextthink;
+    self.movetype       = MOVETYPE_WALK;
+    self.health         = cvar("g_monster_zombie_health");
+    self.velocity       = '0 0 0';
+    self.angles         = self.pos2;
+    self.moveto         = self.origin;
+    self.flags          = FL_MONSTER;
+
+    setorigin(self,self.pos1);
+    setsize(self,ZOMBIE_MIN,ZOMBIE_MAX);
+}
+
+
+void spawnfunc_monster_zombie()
+{
+    if not(cvar("g_monsters"))
+    {
+        remove(self);
+        return;
+    }
+
+    precache_model("models/monsters/zombie.dpm");
+
+
+    self.verbs_idle   = spawn();
+    self.verbs_attack = spawn();
+
+    self.verbs_idle.owner = self;
+    self.verbs_attack.owner = self;
+
+    self.think      = zombie_spawn;
+    self.nextthink  = time + 2;
+
+    traceline(self.origin + '0 0 10', self.origin - '0 0 32', MOVE_WORLDONLY, self);
+
+    self.pos1 = trace_endpos;
+    self.pos2 = self.angles;
+    self.team = MAX_SHOT_DISTANCE -1;
+
+    verbstack_push(self.verbs_idle, zombie_verb_idle, ZV_IDLE,0 , self);
+
+    verbstack_push(self.verbs_attack, zombie_verb_attack_findtarget, ZV_ATTACK_FIND,0 , self);
+    verbstack_push(self.verbs_attack, zombie_verb_attack_run, ZV_ATTACK_RUN,0 , self);
+    verbstack_push(self.verbs_attack, zombie_verb_attack_stand, ZV_ATTACK_STAND,0 , self);
+
+}
+
+#endif // MONSTES_ENABLED

Modified: branches/nexuiz-2.0/data/qcsrc/server/movelib.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/movelib.qc	2009-11-07 17:16:16 UTC (rev 8222)
+++ branches/nexuiz-2.0/data/qcsrc/server/movelib.qc	2009-11-07 17:17:43 UTC (rev 8223)
@@ -2,7 +2,7 @@
 
 /**
     Simulate drag
-    self.velocity = movelib_vdrag(self.velocity,0.02,0.5);
+    self.velocity = movelib_dragvec(self.velocity,0.02,0.5);
 **/
 vector movelib_dragvec(float drag, float exp)
 {
@@ -18,7 +18,7 @@
 
 /**
     Simulate drag
-    self.velocity = movelib_vdrag(somespeed,0.01,0.7);
+    self.velocity *= movelib_dragflt(somespeed,0.01,0.7);
 **/
 float movelib_dragflt(float fspeed,float drag,float exp)
 {
@@ -34,7 +34,7 @@
 /**
     Do a inertia simulation based on velocity.
     Basicaly, this allows you to simulate loss of steering with higher speed.
-    self.velocity = movelib_inertia_fromspeed(self.velocity,newvel,1000,0.1,0.9);
+    self.velocity = movelib_inertmove_byspeed(self.velocity,newvel,1000,0.1,0.9);
 **/
 vector movelib_inertmove_byspeed(vector vel_new, float vel_max,float newmin,float oldmax)
 {
@@ -102,7 +102,7 @@
 }
 
 /*
-.float theMass;
+.float mass;
 .float side_friction;
 .float ground_friction;
 .float air_friction;
@@ -137,9 +137,9 @@
     old_speed    = vlen(self.velocity);
     old_dir      = normalize(self.velocity);
 
-    //ggravity      =  (sv_gravity / self.theMass) * '0 0 100';
-    acceleration =  (force / self.theMass) * dir;
-    //acceleration -= old_dir * (old_speed / self.theMass);
+    //ggravity      =  (sv_gravity / self.mass) * '0 0 100';
+    acceleration =  (force / self.mass) * dir;
+    //acceleration -= old_dir * (old_speed / self.mass);
     acceleration -= ggravity;
 
     if(self.waterlevel > 1)
@@ -165,6 +165,7 @@
 {
     self.velocity = self.velocity * (1 - blendrate) + (newdir * blendrate) * velo;
 }
+
 void movelib_beak_simple(float force)
 {
     float mspeed;
@@ -178,18 +179,21 @@
     self.velocity_z = vz;
 }
 
-
-void movelib_groundalign4point(float spring_length,float spring_up,float blendrate)
+/**
+Pitches and rolls the entity to match the gound.
+Yed need to set v_up and v_forward (generally by calling makevectors) before calling this.
+**/
+void movelib_groundalign4point(float spring_length, float spring_up, float blendrate)
 {
-    vector a,b,c,d,e,r,push_angle, ahead,side;
+    vector a, b, c, d, e, r, push_angle, ahead, side;
 
     push_angle_y = 0;
     r = (self.absmax + self.absmin) * 0.5 + (v_up * spring_up);
     e = v_up * spring_length;
 
     // Put springs slightly inside bbox
-    ahead = v_forward * (self.maxs_x * 0.85);
-    side  = v_right   * (self.maxs_y * 0.85);
+    ahead = v_forward * (self.maxs_x * 0.8);
+    side  = v_right   * (self.maxs_y * 0.8);
 
     a = r + ahead + side;
     b = r + ahead - side;

Modified: branches/nexuiz-2.0/data/qcsrc/server/progs.src
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/progs.src	2009-11-07 17:16:16 UTC (rev 8222)
+++ branches/nexuiz-2.0/data/qcsrc/server/progs.src	2009-11-07 17:17:43 UTC (rev 8223)
@@ -165,5 +165,5 @@
 monsters/fight.qc
 monsters/ai.qc
 monsters/m_monsters.qc
-
+monsters/monster_zombie.qc
 csqcprojectile.qc

Deleted: branches/nexuiz-2.0/data/qcsrc/server/server.cbp
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/server.cbp	2009-11-07 17:16:16 UTC (rev 8222)
+++ branches/nexuiz-2.0/data/qcsrc/server/server.cbp	2009-11-07 17:17:43 UTC (rev 8223)
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
-<CodeBlocks_project_file>
-	<FileVersion major="1" minor="6" />
-	<Project>
-		<Option title="server" />
-		<Option pch_mode="2" />
-		<Option compiler="quakec" />
-		<Build>
-			<Target title="Standard">
-				<Option output="bin\Debug\server" prefix_auto="1" extension_auto="1" />
-				<Option object_output="obj\Debug\" />
-				<Option type="1" />
-				<Option compiler="quakec" />
-				<Compiler>
-					<Add option="-g" />
-				</Compiler>
-			</Target>
-		</Build>
-		<Compiler>
-			<Add option="-Wall" />
-		</Compiler>
-		<Extensions>
-			<code_completion />
-			<envvars />
-			<debugger />
-			<lib_finder disable_auto="1" />
-		</Extensions>
-	</Project>
-</CodeBlocks_project_file>

Modified: branches/nexuiz-2.0/data/qcsrc/server/steerlib.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/steerlib.qc	2009-11-07 17:16:16 UTC (rev 8222)
+++ branches/nexuiz-2.0/data/qcsrc/server/steerlib.qc	2009-11-07 17:17:43 UTC (rev 8223)
@@ -11,11 +11,13 @@
 /**
     Uniform push from a point
 **/
+#define steerlib_push(point) normalize(self.origin - point)
+/*
 vector steerlib_push(vector point)
 {
     return normalize(self.origin - point);
 }
-
+*/
 /**
     Pull toward a point, The further away, the stronger the pull.
 **/
@@ -156,6 +158,8 @@
     float distance;
 
     distance = max(vlen(self.origin - point),min_distance);
+    if (min_distance < distance)
+        return '0 0 0';
 
     return dodge_dir * (min_distance/distance);
 }
@@ -187,6 +191,36 @@
 }
 
 /**
+    flocking by .flock_id
+    Group will move towards the unified direction while keeping close to eachother.
+    xy only version (for ground movers).
+**/
+vector steerlib_flock2d(float radius, float standoff,float separation_force,float flock_force)
+{
+    entity flock_member;
+    vector push,pull;
+    float ccount;
+
+    flock_member = findradius(self.origin,radius);
+    while(flock_member)
+    {
+        if(flock_member != self)
+        if(flock_member.flock_id == self.flock_id)
+        {
+            ++ccount;
+            push = push + (steerlib_repell(flock_member.origin, standoff) * separation_force);
+            pull = pull + (steerlib_arrive(flock_member.origin + flock_member.velocity, radius) * flock_force);
+        }
+        flock_member = flock_member.chain;
+    }
+
+    push_z = 0;
+    pull_z = 0;
+
+    return push + (pull * (1 / ccount));
+}
+
+/**
     All members want to be in the center, and keep away from eachother.
     The furtehr form the center the more they want to be there.
 
@@ -220,6 +254,7 @@
 /**
     Steer towards the direction least obstructed.
     Run four tracelines in a forward funnel, bias each diretion negative if something is found there.
+    You need to call makevectors() (or equivalent) before this function to set v_forward and v_right
 **/
 vector steerlib_traceavoid(float pitch,float length)
 {
@@ -228,6 +263,7 @@
     vector upwish,downwish,leftwish,rightwish;
     vector v_left,v_down;
 
+
     v_left = v_right * -1;
     v_down = v_up * -1;
 
@@ -254,7 +290,6 @@
     fdown_right = trace_fraction;
 
     //te_lightning1(world,self.origin, trace_endpos);
-
     upwish    = v_up    * (fup_left   + fup_right);
     downwish  = v_down  * (fdown_left + fdown_right);
     leftwish  = v_left  * (fup_left   + fdown_left);
@@ -266,7 +301,7 @@
 
 /**
     Steer towards the direction least obstructed.
-    Run two tracelines in a forward trident, bias each diretion negative if something is found there.
+    Run tracelines in a forward trident, bias each direction negative if something is found there.
 **/
 vector steerlib_traceavoid_flat(float pitch, float length, vector vofs)
 {
@@ -339,6 +374,7 @@
     return 1;
 }
 
+//#define BEAMSTEER_VISUAL
 float beamsweep(vector from, vector dir,float length, float step,float step_up, float step_down)
 {
     float i;
@@ -369,10 +405,10 @@
 
         if(beamsweep_badpoint(trace_endpos,0))
             return i / length;
-
-        //te_lightning1(world,a+u,b+u);
-        //te_lightning1(world,b+u,b-d);
-
+#ifdef BEAMSTEER_VISUAL
+        te_lightning1(world,a+u,b+u);
+        te_lightning1(world,b+u,b-d);
+#endif
         a = trace_endpos;
     }
 
@@ -386,8 +422,18 @@
 
     dir_z *= 0.15;
     vr = vectoangles(dir);
-    vr_x *= -1;
+    //vr_x *= -1;
 
+    tracebox(self.origin , self.mins,self.maxs,self.origin +  (dir * length) ,MOVE_NOMONSTERS,self);
+    if(trace_fraction == 1.0)
+    {
+        //te_lightning1(self,self.origin,self.origin +  (dir * length));
+        return dir;
+    }
+
+
+
+
     makevectors(vr);
     bm_forward = beamsweep(self.origin, v_forward, length, step, step_up, step_down);
 

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-11-07 17:16:16 UTC (rev 8222)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/include/turrets_early.qh	2009-11-07 17:17:43 UTC (rev 8223)
@@ -5,6 +5,8 @@
 
 #message "with tZork turrets"
 
+float turret_count;
+
 vector real_origin(entity ent);
 
 /// Map time control over pain inflicted

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-11-07 17:16:16 UTC (rev 8222)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_main.qc	2009-11-07 17:17:43 UTC (rev 8223)
@@ -927,11 +927,11 @@
 * (unless you have a very good reason not to)
 * if the return value is 0, the turret should be removed.
 */
-float turret_count;
 float turret_stdproc_init (string cvar_base_name, float csqc_shared, string base, string head)
 {
 	entity e,ee;
 
+
     e = find(world, classname, "turret_manager");
     if not (e)
     {
@@ -960,7 +960,6 @@
     if (self.spawnflags & TSF_TERRAINBASE)
     {
         entity tb;
-        //precache_model("models/turrets/terrainbase.md3");
         tb = spawn();
         setmodel(tb,"models/turrets/terrainbase.md3");
         setorigin(tb,self.origin);
@@ -1295,7 +1294,8 @@
         self.think     = turret_think;
 
     ++turret_count;
-    self.nextthink = time + self.ticrate + (turret_count * sys_ticrate);
+    self.nextthink = time + 1;
+    self.nextthink +=  turret_count * sys_ticrate;
 
     self.tur_head.team = self.team;
     self.view_ofs = '0 0 0';

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-11-07 17:16:16 UTC (rev 8222)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/system/system_misc.qc	2009-11-07 17:17:43 UTC (rev 8223)
@@ -1,16 +1,19 @@
 //--// Some support routines //--//
 
 #define anglemodss(a) (a - floor(a / 360) * 360)
+
 float(float v) anglemods =
 {
 	v = v - 360 * floor(v / 360);
 	return v;
-};
+}
+
 float safeangle(float a)
 {
-    if((a > -361) && (a < 361))
+    if((a >= -360) && (a <= 360))
         return a;
 
+
     a -= (360 * floor(a / 360));
 
     return a;

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_ewheel.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_ewheel.qc	2009-11-07 17:16:16 UTC (rev 8222)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_ewheel.qc	2009-11-07 17:17:43 UTC (rev 8223)
@@ -168,7 +168,7 @@
             movelib_move_simple(v_forward,cvar("g_turrets_unit_ewheel_speed_slower"),0.4);
         }
     }
-    else if (self.tur_dist_enemy < self.target_range_optimal - 10)
+    else if (self.tur_dist_enemy < self.target_range_optimal * 0.5)
     {
         self.frame = ewheel_amin_bck_slow;
         movelib_move_simple(v_forward * -1,cvar("g_turrets_unit_ewheel_speed_slow"),0.4);

Modified: branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_walker.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_walker.qc	2009-11-07 17:16:16 UTC (rev 8222)
+++ branches/nexuiz-2.0/data/qcsrc/server/tturrets/units/unit_walker.qc	2009-11-07 17:17:43 UTC (rev 8223)
@@ -866,7 +866,7 @@
     vector vtmp;
     entity e;
 
-    self.origin = self.wkr_spawn.origin;
+    setorigin(self,self.wkr_spawn.origin);
 
     self.angles = self.wkr_spawn.angles;
     vtmp = self.wkr_spawn.origin;
@@ -891,6 +891,7 @@
         }
     }
 }
+
 void walker_diehook()
 {
     turret_trowgib2(self.origin,self.velocity + v_up * 200,'-0.6 -0.2 -02',self,time + random() * 1);

Modified: branches/nexuiz-2.0/data/qcsrc/server/vehicles/racer.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/vehicles/racer.qc	2009-11-07 17:16:16 UTC (rev 8222)
+++ branches/nexuiz-2.0/data/qcsrc/server/vehicles/racer.qc	2009-11-07 17:17:43 UTC (rev 8223)
@@ -1,99 +1,276 @@
-#define RACER_MIN '-40 -40 0'
-#define RACER_MAX '40 40 44'
+#define RACER_MIN '-80 -80 -40'
+#define RACER_MAX '80 80 40'
 
 void racer_exit(float eject);
 void racer_enter();
 
+float racer_power_air;
+float racer_power_solid;
+float racer_power_min;
+float racer_anglestabilizer;
+float racer_springlength;
+
+float racer_healthmax;
+float racer_shieldmax;
+float racer_energymax;
+
 float  jetfromtag_power;
 float  jetfromtag_normpower;
-float  jetfromtag_nosolid;
 vector jetfromtag_origin;
+float  jetfromtag_groundcontact;
 
-vector jetfromtag(string tagname,float jet_length,float air_power,float solid_power)
+.entity ccamera;
+
+void racer_loadsettings()
 {
+    racer_power_min         = cvar("g_vehicle_racer_power_min");
+    racer_power_air         = cvar("g_vehicle_racer_power_air");
+    racer_power_solid       = cvar("g_vehicle_racer_power_solid");
+    racer_springlength      = cvar("g_vehicle_racer_springlength");
+    racer_anglestabilizer   = cvar("g_vehicle_racer_anglestabilizer");
+
+    racer_healthmax = cvar("g_vehicle_racer_health");
+    racer_shieldmax = cvar("g_vehicle_racer_shield");
+    racer_energymax = cvar("g_vehicle_racer_energy_max");
+
+}
+
+vector racer_jetfromtag(string tagname)
+{
     vector force_dir;
     float  air_frac, solid_frac, air_pwr, solid_pwr;
 
     jetfromtag_origin = gettaginfo(self,gettagindex(self,tagname));
-    v_forward = normalize(v_forward);
+    v_forward  = normalize(v_forward) * -1;
 
-    force_dir = jetfromtag_origin - v_forward * jet_length;
+    force_dir = jetfromtag_origin - (v_forward  * racer_springlength);
     traceline(jetfromtag_origin, force_dir, MOVE_NORMAL, self);
+    //te_lightning1(world,jetfromtag_origin, force_dir);
 
+    trace_fraction *= trace_fraction;
+
     solid_frac = 1 - trace_fraction;
-    air_frac   = trace_fraction;
+    air_frac = trace_fraction;
 
-    if(solid_frac < 0.1)
-        jetfromtag_nosolid += 1;
+    if (trace_fraction != 1.0)
+        jetfromtag_groundcontact = 1;
 
-    solid_pwr = solid_frac * solid_power;
-    air_pwr   = air_frac * air_power;
+    solid_pwr = solid_frac * racer_power_solid;
+    air_pwr   = air_frac * racer_power_air;
 
     jetfromtag_power     = solid_pwr + air_pwr;
-    jetfromtag_normpower = jetfromtag_power / (air_power+solid_power);
-    if(trace_fraction == 1)
-        return v_forward;
-    else
-        return v_forward * (jetfromtag_power + cvar("g_vehicle_racer_power_min"));
+    jetfromtag_normpower = jetfromtag_power / (racer_power_air + racer_power_solid);
+
+    return v_forward  * max(jetfromtag_power, racer_power_min);
 }
 
-void racer_align4point(float spring_length,float spring_up,float blendrate)
+void racer_align4point()
 {
-    vector fl_org,fl_force,fr_org,fr_force,bl_org,bl_force,br_org,br_force;
-    vector push_vector,align;
+    vector push_vector;
     float fl_push, fr_push, bl_push, br_push;
 
-    jetfromtag_nosolid = 0;
+    jetfromtag_groundcontact = 0;
 
-    fr_force = jetfromtag("tag_engine_fr",spring_length,cvar("g_vehicle_racer_power_air"), cvar("g_vehicle_racer_power_solid"));
-    fr_org   = jetfromtag_origin; fr_push = jetfromtag_normpower;
+    push_vector = racer_jetfromtag("tag_engine_fr");
+    fr_push = jetfromtag_normpower;
+    traceline(jetfromtag_origin, jetfromtag_origin + self.velocity * frametime, MOVE_NORMAL,self);
+    if(trace_fraction != 1)
+        self.velocity += normalize(self.origin - trace_endpos) * (vlen(self.velocity) * 1.25);
 
-    fl_force = jetfromtag("tag_engine_fl",spring_length,cvar("g_vehicle_racer_power_air"), cvar("g_vehicle_racer_power_solid"));
-    fl_org   = jetfromtag_origin; fl_push = jetfromtag_normpower;
+    push_vector += racer_jetfromtag("tag_engine_fl");
+    fl_push = jetfromtag_normpower;
+    traceline(jetfromtag_origin, jetfromtag_origin + self.velocity * frametime, MOVE_NORMAL,self);
+    if(trace_fraction != 1)
+        self.velocity += normalize(self.origin - trace_endpos) * (vlen(self.velocity) * 1.25);
 
-    br_force = jetfromtag("tag_engine_br",spring_length,cvar("g_vehicle_racer_power_air"), cvar("g_vehicle_racer_power_solid"));
-    br_org   = jetfromtag_origin; br_push = jetfromtag_normpower;
+    push_vector += racer_jetfromtag("tag_engine_br");
+    br_push = jetfromtag_normpower;
+    traceline(jetfromtag_origin, jetfromtag_origin + self.velocity * frametime, MOVE_NORMAL,self);
+    if(trace_fraction != 1)
+        self.velocity += normalize(self.origin - trace_endpos) * (vlen(self.velocity) * 1.25);
 
-    bl_force = jetfromtag("tag_engine_bl",spring_length,cvar("g_vehicle_racer_power_air"), cvar("g_vehicle_racer_power_solid"));
-    bl_org   = jetfromtag_origin; bl_push = jetfromtag_normpower;
+    push_vector += racer_jetfromtag("tag_engine_bl");
+    bl_push = jetfromtag_normpower;
+    traceline(jetfromtag_origin, jetfromtag_origin + self.velocity * frametime, MOVE_NORMAL,self);
+    if(trace_fraction != 1)
+        self.velocity += normalize(self.origin - trace_endpos) * (vlen(self.velocity) * 1.25);
 
-    push_vector = fr_force + fl_force + br_force + bl_force;
+    self.velocity =  self.velocity + (push_vector * frametime);
+    self.velocity_z -= sv_gravity * frametime;
 
-    align = align;
+    push_vector_x = (fl_push - bl_push);
+    push_vector_x += (fr_push - br_push);
+    push_vector_x *= 360;
 
-    align_x = (fl_push - bl_push);
-    align_x += (fr_push - br_push);
-    align_x *= 360;
+    push_vector_z = (fr_push - fl_push);
+    push_vector_z += (br_push - bl_push);
+    push_vector_z *= 360;
 
-    align_z = (fl_push - fr_push);
-    align_z += (bl_push - br_push);
-    align_z *= 360;
+    if(!push_vector_z)
+        if(self.angles_z > 0)
+            self.angles_z = max(0, self.angles_z - (racer_anglestabilizer * frametime));
+        else
+            self.angles_z = min(0, self.angles_z + (racer_anglestabilizer * frametime));
+    else
+        self.angles_z += push_vector_z * frametime;
 
-    self.angles_x *= 0.96;
-    self.angles_z *= 0.96;
+    if(!push_vector_x)
+        if(self.angles_x > 0)
+            self.angles_x = max(0, self.angles_x - (racer_anglestabilizer * frametime));
+        else
+            self.angles_x = min(0, self.angles_x + (racer_anglestabilizer * frametime));
+    else
+        self.angles_x += push_vector_x * frametime;
+}
 
-    self.angles_x += align_x * frametime;
-    self.angles_z += align_z * frametime;
 
-    self.velocity =  self.velocity + (push_vector * frametime);
-    self.velocity_z -= sv_gravity * frametime;
+void racer_bolt_explode()
+{
+    vector org2;
+
+    org2 = findbetterlocation (self.origin, 8);
+    pointparticles(particleeffectnum("laser_impact"), org2, trace_plane_normal * 1000, 1);
+    RadiusDamage (self, self.realowner, cvar("g_vehicle_racer_laser_damage"), 0, cvar("g_vehicle_racer_laser_radius"), world, 150, DEATH_WAKIGUN, world);
+    sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM);
+
+    remove (self);
 }
 
-void racer_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
+void racer_rocket_explode()
 {
-    self.velocity += force;
+    vector org2;
+
+    //if not(self.owner)
+    //    self.owner = self.realowner;
+
+    sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+    org2 = findbetterlocation (self.origin, 16);
+    pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1);
+    RadiusDamage (self, self.realowner ,cvar("g_vehicle_racer_rocket_damage"), 0, cvar("g_vehicle_racer_rocket_radius"), world, 150, DEATH_WAKIROCKET, world);
+
+    remove (self);
 }
 
+void racer_fire_cannon(string tagname)
+{
+    entity bolt;
+
+    bolt = spawn();
+    bolt.solid           = SOLID_BBOX;
+    bolt.movetype        = MOVETYPE_FLYMISSILE;
+    bolt.flags           = FL_PROJECTILE | FL_NOTARGET;
+    bolt.owner           = self;
+    bolt.realowner       = self.owner;
+    bolt.touch           = racer_bolt_explode;
+    bolt.think           = racer_bolt_explode;
+    bolt.nextthink       = time + 9;
+    bolt.bot_dodge       = TRUE;
+    bolt.bot_dodgerating = cvar("g_vehicle_racer_laser_damage");
+    setorigin(bolt, gettaginfo(self,gettagindex(self,tagname)));
+    bolt.velocity = v_forward * cvar("g_vehicle_racer_laser_speed");
+
+    CSQCProjectile(bolt, TRUE, PROJECTILE_LASER, TRUE);
+}
+
+void racer_rocket_think()
+{
+    vector newdir,olddir;
+
+    self.nextthink  = time;
+
+    if ((self.owner.deadflag != DEAD_NO) || (self.cnt < time))
+    {
+        racer_rocket_explode();
+        return;
+    }
+
+    if not (self.realowner.vehicle)
+    {
+        UpdateCSQCProjectile(self);
+        return;
+    }
+
+    self.solid      = SOLID_BBOX;
+    self.touch      = racer_rocket_explode;
+
+    olddir = normalize(self.velocity);
+    newdir = normalize((0.5 * (self.enemy.absmin + self.enemy.absmax)) - self.origin);
+
+    self.velocity = normalize(olddir + newdir * cvar("g_vehicle_spiderbot_rocket_turnrate")) * cvar("g_vehicle_racer_rocket_speed");
+
+    UpdateCSQCProjectile(self);
+}
+
+void racer_fire_rocket(string tagname)
+{
+    entity rocket;
+    dprint("self.owner=",self.owner.netname,"\n");
+
+    rocket = spawn();
+    setsize (rocket, '-1 -1 -1', '1 1 1');
+    rocket.solid           = SOLID_BBOX;
+    rocket.movetype        = MOVETYPE_FLYMISSILE;
+    rocket.flags           = FL_PROJECTILE;
+    rocket.owner           = self;
+    rocket.realowner       = self.owner;
+    rocket.touch           = racer_rocket_explode;
+    rocket.bot_dodge       = TRUE;
+    rocket.bot_dodgerating = cvar("g_vehicle_racer_rocket_damage");
+    setorigin(rocket, gettaginfo(self,gettagindex(self,tagname)));
+
+    if( (self.tur_head.gun1) && (self.tur_head.cnt > time))
+        rocket.enemy = self.tur_head.gun1;
+
+    if(rocket.enemy)
+    {
+        rocket.cnt             = time + 9;
+        rocket.velocity = v_forward * cvar("g_vehicle_racer_rocket_speed");
+        rocket.think = racer_rocket_think;
+        rocket.nextthink = time;
+        CSQCProjectile(rocket, FALSE, PROJECTILE_ROCKET, FALSE); // no culling, has fly sound
+        //dprint("Tracking...", rocket.enemy.netname, " (", rocket.enemy.classname, ")\n");
+    }
+    else
+    {
+        rocket.velocity = v_forward * cvar("g_vehicle_racer_rocket_speed");
+        rocket.think = racer_rocket_explode;
+        rocket.nextthink = time + 9;
+        CSQCProjectile(rocket, TRUE, PROJECTILE_ROCKET, TRUE);
+    }
+}
+
+float racer_customizeentityforclient()
+{
+
+    if(self.deadflag == DEAD_DEAD)
+        return FALSE;
+
+    /*
+    if(other == self.owner)
+        self.alpha = -1;
+    else
+        self.alpha = 1;
+    */
+
+    return TRUE;
+}
+
 float racer_pplug()
 {
-    entity player,racer;
-    float ftmp,ftmp2;
+    entity player, racer;
+    float ftmp, ftmp2;
+    vector df;
 
 
-    player = self;
-    racer = self.vehicle;
-    player.fixangle = FALSE;
+    if(cvar("g_vehicle_racer_reload"))
+    {
+        racer_loadsettings();
+        cvar_set("g_vehicle_racer_reload","0");
+    }
 
+    player          = self;
+    racer           = self.vehicle;
+
     player.BUTTON_ZOOM = 0;
     player.BUTTON_CROUCH = 0;
 
@@ -107,72 +284,134 @@
         return 0;
     }
 
+    if(racer.deadflag != DEAD_NO)
+    {
+        self = player;
+        player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0;
+        return 1;
+    }
+
+    racer_align4point();
+
     racer.angles_x *= -1;
     makevectors(racer.angles);
-    racer.angles_x *= -1;
 
-    // Turn Body
-    ftmp = cvar("g_vehicle_racer_turnspeed") / server_fps;
+    // Rotate Body
+    ftmp = cvar("g_vehicle_racer_turnspeed") * sys_ticrate;
     ftmp2 = ftmp * -1;
 
     ftmp = bound(ftmp2,shortangle_f(player.v_angle_y - racer.angles_y,racer.angles_y),ftmp);
+    ftmp2 = safeangle(racer.angles_y + ftmp);
 
+    // Roll
+    ftmp = bound(-90,shortangle_f(player.v_angle_z + ((racer.angles_y - ftmp2) * cvar("g_vehicle_racer_turnroll")), racer.angles_z),90);
+    ftmp = safeangle(racer.angles_z + ftmp);
+    racer.angles_z = ftmp;
+
+    // Turn
+    racer.angles_y = ftmp2;
+
+    // Pitch Body
+    ftmp = cvar("g_vehicle_racer_pitchspeed") * sys_ticrate;
+    ftmp2 = ftmp * -1;
+
+    ftmp = bound(ftmp2,shortangle_f(player.v_angle_x - racer.angles_x,racer.angles_x),ftmp);
+    racer.angles_x = safeangle(racer.angles_x + ftmp);
+    racer.angles_x *= -1;
+
+
+    if(player.movement_x != 0)
     {
-        racer.angles_y = safeangle(racer.angles_y + ftmp);
-        if(player.BUTTON_JUMP)
+        if(player.movement_x > 0)
+            df += v_forward  * cvar("g_vehicle_racer_speed_forward");
+        else if(player.movement_x < 0)
+            df -= v_forward  * cvar("g_vehicle_racer_speed_forward");
+    }
+
+    if(player.movement_y != 0)
+    {
+        if(player.movement_y < 0)
+            df -= v_right * cvar("g_vehicle_racer_speed_strafe");
+        else if(player.movement_y > 0)
+            df += v_right * cvar("g_vehicle_racer_speed_strafe");
+    }
+
+    // limit _z to avoid flying on normal thrust
+    if(df_z > 0)
+        df_z = min(df_z,700);
+
+    // Afterburn
+
+    //if (jetfromtag_groundcontact)
+    if (player.BUTTON_JUMP)
+    if(racer.vehicle_energy >= (cvar("g_vehicle_racer_speed_afterburn_cost")* frametime))
+    {
+        racer.wait = time + cvar("g_vehicle_racer_energy_usepause");
+        racer.vehicle_energy -= cvar("g_vehicle_racer_speed_afterburn_cost") * frametime;
+        df += (v_forward * cvar("g_vehicle_racer_speed_afterburn"));
+    }
+
+    racer.velocity  += df * frametime;
+
+    df = (vlen(racer.velocity) * cvar("g_vehicle_racer_downforce") * v_up) * frametime;
+    racer.velocity  = racer.velocity - df;
+    player.movement = racer.velocity;
+
+    if(cvar("g_vehicle_racer_drag"))
+        racer.velocity  = movelib_dragvec(cvar("g_vehicle_racer_drag"), cvar("g_vehicle_racer_dragexp"));
+
+    if(self.owner.cursor_trace_ent)
+    {
+        //dprint("Lock: ", self.owner.cursor_trace_ent.classname, "\n");
+        //if not (self.tur_head.enemy)
+        //    bprint(self.owner,"Locked: ",
+        self.tur_head.gun1 = self.owner.cursor_trace_ent;
+        self.tur_head.cnt = time + 1;
+    }
+
+    if(player.BUTTON_ATCK)
+    if(time > racer.attack_finished_single)
+    if(racer.vehicle_energy >= cvar("g_vehicle_racer_laser_cost"))
+    {
+        racer.vehicle_energy -= cvar("g_vehicle_racer_laser_cost");
+        racer.wait = time + cvar("g_vehicle_racer_energy_usepause");
+
+        if(racer.cnt)
         {
-            player.BUTTON_JUMP = 0;
-            racer.velocity  = racer.velocity  + v_forward * 250 + v_up * 600;
+            racer_fire_cannon("tag_fire1");
+            racer.cnt = 0;
         }
         else
         {
-            if(vlen(player.movement) == 0)
-            {
-                self = racer;
-                ftmp = self.velocity_z;
-                self.velocity = self.velocity - self.velocity * cvar("g_vehicle_racer_speed_stop");
-                self.velocity_z = ftmp;
-            }
-            else
-            {
+            racer_fire_cannon("tag_fire2");
+            racer.cnt = 1;
+        }
+        racer.attack_finished_single = time + cvar("g_vehicle_racer_laser_refire");
+    }
 
-                if(player.movement_x != 0)
-                {
-                    if(player.movement_x > 0)
-                        player.movement_x = 1;
-                    else if(player.movement_x < 0)
-                        player.movement_x = -1;
-                }
+    if(player.BUTTON_ATCK2)
+    if(time > racer.delay)
+    {
+        racer_fire_rocket("tag_rocket_r");
+        racer_fire_rocket("tag_rocket_l");
+        racer.delay = time + cvar("g_vehicle_racer_rocket_refire");
+        racer.lip = time;
 
-                if(player.movement_y != 0)
-                {
-                    if(player.movement_y < 0)
-                        player.movement_y = -1;
-                    else if(player.movement_y > 0)
-                        player.movement_y = 1;
-                }
-
-                self = racer;
-                self.velocity  = self.velocity + ((v_right * player.movement_y) * cvar("g_vehicle_racer_speed_strafe")) * frametime;
-                self.velocity  = self.velocity + ((v_forward * player.movement_x) * cvar("g_vehicle_racer_speed_forward")) * frametime;
-            }
-        }
-        self = racer;
     }
 
-    vector df;
+    player.vehicle_reload1 = (time - racer.lip) / (racer.delay-racer.lip);
+    //player.vehicle_energy = racer.vehicle_energy;
 
-    self = racer;
+    vehicle_stdproc_shiledregen(CCVAR("_shield"), frametime);
+    vehicle_stdproc_healthregen(CCVAR("_health"), frametime);
 
-    df = vlen(self.velocity) * cvar("g_vehicle_racer_downforce") * v_up;
-    self.velocity = self.velocity - df;
-    player.movement = racer.velocity;
-    racer_align4point(cvar("g_vehicle_racer_springlength"),100,cvar("g_vehicle_racer_inert"));
+    if (racer.wait < time)
+        vehicle_stdproc_energyregen(CCVAR("_energy"), frametime);
+    else
+        player.vehicle_energy = (racer.vehicle_energy / CCVAR("_energy"));
 
-    if(cvar("g_vehicle_racer_drag"))
-        self.velocity  = movelib_dragvec(cvar("g_vehicle_racer_drag"),cvar("g_vehicle_racer_dragexp"));
+    self = player;
 
-    self = player;
     player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0;
     setorigin(player,racer.origin + '0 0 32');
     player.velocity = racer.velocity;
@@ -190,59 +429,65 @@
 void racer_enter()
 {
     self.owner = other;
-    self.owner.angles = self.angles;
 
-    //setattachment(other,self,"");
+
     self.nextthink = 0;
-    self.think = SUB_Null;
+    self.flags               = 0;
+    self.vehicle_hudmodel.viewmodelforclient = self.owner;
+    self.colormap             = self.owner.colormap;
+
+    self.owner.PlayerPhysplug = racer_pplug;
     self.owner.takedamage     = DAMAGE_NO;
+    self.owner.event_damage   = SUB_Null;
+    self.owner.vehicle        = self;
+    self.owner.angles = self.angles;
     self.owner.solid          = SOLID_NOT;
     self.owner.movetype       = MOVETYPE_NOCLIP;
-    //setsize(self.owner,spiderbot_MIN,spiderbot_MAX);
     self.owner.alpha          = -1;
-    self.owner.PlayerPhysplug = racer_pplug;
-    self.owner.vehicle        = self;
-    self.owner.event_damage   = SUB_Null;
-    //self.event_damage         = vehicle_stdproc_damage ;
-    self.colormap             = self.owner.colormap;
-    //self.tur_head.colormap    = self.owner.colormap;
-    //self.vehicle_hudmodel.viewmodelforclient = self.owner;
-    //self.owner.hud            = HUD_SPIDEBOT;
-    //self.owner.vehicle_health = (self.vehicle_health / cvar("g_vehicle_spiderbot_health"));
-    //self.owner.vehicle_shield = (self.vehicle_shield / cvar("g_vehicle_spiderbot_shield"));
+    self.owner.hud            = HUD_WAKIZASHI;
+    self.owner.effects        |= EF_NODRAW;
+    self.owner.view_ofs = '0 0 0';
 
-    //setorigin(self.owner,self.origin);
-    //setattachment(self.owner,self,"");
-    //setorigin(self.owner,'0 0 0');
+    self.owner.vehicle_health = (self.vehicle_health / cvar("g_vehicle_racer_health"));
+    self.owner.vehicle_shield = (self.vehicle_shield / cvar("g_vehicle_racer_shield"));
 
+    setorigin(other,self.origin + '0 0 32');
+    other.velocity = self.velocity;
+
+    other.flags &~= FL_ONGROUND;
     msg_entity = other;
     WriteByte (MSG_ONE, SVC_SETVIEWPORT);
     WriteEntity( MSG_ONE, self.vehicle_viewport);
 
-    WriteByte (MSG_ONE, SVC_SETVIEWANGLES);  // 10 = SVC_SETVIEWANGLES
-    WriteAngle(MSG_ONE,  self.angles_x);    // tilt
+    WriteByte (MSG_ONE, SVC_SETVIEWANGLES); // 10 = SVC_SETVIEWANGLES
+    WriteAngle(MSG_ONE,  self.angles_x * -1);    // tilt
     WriteAngle(MSG_ONE,  self.angles_y);    // yaw
     WriteAngle(MSG_ONE,  0);                // roll
-
-    //self.owner.view_ofs = '0 0 0';
-    //self.tur_head.nodrawtoclient = self.owner;
 }
 
 void racer_exit(float eject)
 {
+	self.colormap   = 1024;
+	self.flags      = FL_NOTARGET;
     self.velocity = '0 0 0';
 
+    if not (self.owner)
+        return;
+
     msg_entity = self.owner;
     WriteByte (MSG_ONE, SVC_SETVIEWPORT);
     WriteEntity( MSG_ONE, self.owner);
 
-    WriteByte (MSG_ONE, SVC_SETVIEWANGLES);  // 10 = SVC_SETVIEWANGLES
-    WriteAngle(MSG_ONE,  0);                // tilt
-    WriteAngle(MSG_ONE,  self.angles_y);    // yaw
-    WriteAngle(MSG_ONE,  0);                // roll
+    WriteByte (MSG_ONE, SVC_SETVIEWANGLES);    // 10 = SVC_SETVIEWANGLES
+    WriteAngle(MSG_ONE,  0);                   // tilt
+    WriteAngle(MSG_ONE,  self.angles_y); // yaw
+    WriteAngle(MSG_ONE,  0);                   // roll
 
-    self.think = racer_think;
-    self.nextthink = time;
+    if (self.deadflag == DEAD_NO)
+    {
+        self.think = racer_think;
+        self.nextthink = time;
+    }
 
     self.owner.takedamage     = DAMAGE_AIM;
     self.owner.solid          = SOLID_SLIDEBOX;
@@ -250,19 +495,17 @@
 
     setsize(self.owner,PL_MIN,PL_MAX);
 
+    self.owner.effects        &~= EF_NODRAW;
     self.owner.alpha          = 1;
     self.owner.PlayerPhysplug = SUB_Null;
     self.owner.vehicle        = world;
 	self.owner.view_ofs       = PL_VIEW_OFS;
 	self.owner.event_damage   = PlayerDamage;
-	//self.owner.hud            = HUD_NORMAL;
+	self.owner.hud            = HUD_NORMAL;
+	//self.owner.exteriormodeltoclient = self;
 
-	self.colormap            = 1024;
-	//self.tur_head.colormap = 1024;
 
-	//self.vehicle_hudmodel.viewmodelforclient = self;
-	//self.tur_head.nodrawtoclient             = self;
-    setattachment(self.owner,world,"");
+    self.vehicle_hudmodel.viewmodelforclient = self;
 
 	if(eject)
 	{
@@ -271,12 +514,34 @@
 	    self.owner.velocity = (v_up + v_forward * 0.25) * 750;
 	}
 	else
-        setorigin(self.owner,self.origin + '0 0 64' - v_forward * 200);
+	{
+	    self.owner.velocity = (v_forward) * -150;
+        setorigin(self.owner,self.origin - v_forward * 128);
+	}
 
     self.owner = world;
 }
 
+void racer_entercap()
+{
+    entity oldself;
+    entity oldother;
 
+    oldself = self;
+    oldother = other;
+
+    other = self.enemy;
+    self = self.owner;
+
+    racer_enter();
+
+    other = oldother;
+    self = oldself;
+
+    self.think = SUB_Remove;
+    self.nextthink = time;
+}
+
 void racer_touch()
 {
     if(self.owner)
@@ -303,6 +568,15 @@
     if(other.vehicle != world)
         return;
 
+    /*
+    entity entercap;
+    entercap = spawn();
+    entercap.enemy = other;
+    entercap.owner = self;
+    entercap.think = racer_entercap;
+    entercap.nextthink = time;
+    */
+
     racer_enter();
 }
 
@@ -316,114 +590,160 @@
 }
 */
 
-void racer_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force);
 void racer_spawn()
 {
     self.think = racer_think;
     self.nextthink = time;
 
-    //self.vehicle_health = CCVAR("_health");
-    //self.vehicle_shield = CCVAR("_shield");
-    //self.event_damage = vehicle_stdproc_damage;
-    self.event_damage = racer_damage;
-    //self.iscreature = TRUE;
-    self.scale = 0.5;
+    self.flags      = FL_NOTARGET;
+    self.effects   = 0;
+
+    self.vehicle_health = CCVAR("_health");
+    self.vehicle_shield = CCVAR("_shield");
+
+    self.event_damage = vehicle_stdproc_damage;
+    self.touch      = racer_touch;
+
+    self.iscreature = TRUE;
+    self.scale      = 0.5;
     self.movetype   = MOVETYPE_FLY;
     self.solid      = SOLID_SLIDEBOX;
-    //self.takedamage = DAMAGE_AIM;
-    self.touch      = racer_touch;
-    //self.alpha = self.tur_head.alpha = self.gun1.alpha = self.gun2.alpha = 1;
+    self.takedamage = DAMAGE_AIM;
+
     self.alpha = 1;
-    //self.tur_head.angles = '0 0 0';
-	//self.colormap = 1024;
-	//self.tur_head.colormap = 1024;
+	self.colormap = 1024;
 	self.deadflag    = DEAD_NO;
     self.bot_attack = TRUE;
-    setorigin(self,self.origin + '0 0 128');
-    setsize(self,RACER_MIN*0.5,RACER_MAX*0.5);
-    setorigin(self,self.tur_aimpos);
+
+    self.vehicle_energy = 1;
+    self.vehicle_hudmodel.viewmodelforclient = self;
+
+    setorigin(self, self.pos1);
+    self.angles = self.pos2;
+
+    setsize(self,RACER_MIN * 0.5,RACER_MAX * 0.5);
     pointparticles(particleeffectnum("teleport"), self.origin + '0 0 64', '0 0 0', 1);
+    self.delay = time;
 }
 
+
 void racer_blowup()
 {
-    /*
+
     sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
-    pointparticles(particleeffectnum("rocket_explode"), findbetterlocation (self.origin, 16), '0 0 0', 1);
+    pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1);
 
-    //RadiusDamage (self, self.owner, self.owner.shot_dmg, self.owner.shot_dmg * 0.5, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
-    RadiusDamage (self, self, 250, 15, 250, world, 250, DEATH_TURRET, world);
+    self.deadflag    = DEAD_DEAD;
+    self.vehicle_exit(VHEF_NORMAL);
+    RadiusDamage (self, self, 250, 15, 250, world, 250, DEATH_WAKIBLOWUP, world);
 
-    self.alpha = self.tur_head.alpha = self.gun1.alpha = self.gun2.alpha = -1;
+    self.alpha = -1;
     self.nextthink  = time + 10;
-    self.think      = spiderbot_spawn;
+    self.think      = racer_spawn;
+    self.movetype   = MOVETYPE_NONE;
+    self.effects    = EF_NODRAW;
 
-    setorigin(self,self.tur_aimpos);
-    */
+    self.avelocity_z  = 0;
+    self.colormod = '0 0 0';
+
+    setorigin(self,self.pos1);
 }
 
+void racer_dietouch()
+{
+    if(self.wait > time)
+        return;
+
+    self.wait = time + 0.75;
+
+    pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1);
+}
+
 void racer_die()
 {
+    self.health       = 0;
+    self.event_damage = SUB_Null;
+    self.iscreature   = FALSE;
+    self.solid        = SOLID_NOT;
+    self.takedamage   = DAMAGE_NO;
+    self.touch        = racer_dietouch;
+    self.deadflag     = DEAD_DYING;
+    self.movetype     = MOVETYPE_BOUNCE;
+    self.wait = time;
 
-    /*
-    self.health = 0;
-    self.event_damage = SUB_Null;
-    self.iscreature = FALSE;
-    self.solid      = SOLID_NOT;
-    self.takedamage = DAMAGE_NO;
-    self.touch      = SUB_Null;
-    self.nextthink  = time + random() * 2;
-    self.think      = spiderbot_blowup;
-    self.deadflag    = DEAD_DEAD;
-	self.vehicle_hudmodel.viewmodelforclient = self;
-	self.frame = 0;
-	self.tur_head.frame = 0;
-	*/
+    pointparticles(particleeffectnum("rocket_explode"), findbetterlocation (self.origin, 16), '0 0 0', 1);
+
+    self.velocity     += '0 0 128';
+
+    if(random() < 0.5)
+        self.avelocity_z  = 16;
+    else
+        self.avelocity_z  = -16;
+
+    self.colormod = '-0.5 -0.5 -0.5';
+
+	self.think     = racer_blowup;
+	self.nextthink = time + 3;
 }
 
 void racer_dinit()
 {
 
-    server_fps = (1 / sys_ticrate);
+    if (self.netname == "")
+        self.netname     = "Race PoD";
 
-    /*
-    addstat(STAT_HUD, AS_INT,  hud);
-	addstat(STAT_SPIDERBOT_ROCKETS, AS_INT,   rockets);
-	addstat(STAT_SPIDERBOT_RELOAD,  AS_FLOAT, rockets_reload);
-	addstat(STAT_SPIDERBOT_HEAT,    AS_FLOAT, vehicle_heat);
-	addstat(STAT_SPIDERBOT_HEALTH,  AS_FLOAT, vehicle_health);
-	addstat(STAT_SPIDERBOT_SHIELD,  AS_FLOAT, vehicle_shield);
-	*/
+    self.cvar_basename      = "g_vehicle_racer";
 
-    if (self.netname == "")      self.netname     = "Race PoD";
+    self.vehicle_viewport   = spawn();
+    self.vehicle_hudmodel   = spawn();
+    //self.ccamera            = spawn();
 
-    self.vehicle_viewport = spawn();
-    self.event_damage = racer_damage;
-    //self.gravity = 2;
-    //self.vehicle_hudmodel = spawn();
-    //self.vehicle_flags = VHF_HASSHIELD | VHF_SHIELDREGEN | VHF_HEALTHREGEN;
-    //self.cvar_basename = "g_vehicle_spiderbot";
+    setorigin(self, self.origin);
 
-    setmodel (self.vehicle_viewport, "models/null.md3");
-    setmodel(self,"models/racers/waka.dpm");
+    setmodel(self,"models/vehicles/wakizashi.dpm");
+    setmodel(self.vehicle_hudmodel, "models/vehicles/wakizashi_cockpit.dpm");
+    setmodel (self.vehicle_viewport, "null");
 
-    setattachment(self.vehicle_viewport,self,"");
-    //self.tur_head.customizeentityforclient = spiderbot_customizeentityforclient;
+    setattachment(self.vehicle_hudmodel, self, "");
+    setattachment(self.vehicle_viewport, self, "tag_viewport");
 
-    setorigin(self.vehicle_viewport,'-400 0 40');
-    self.tur_aimpos = self.origin;
+    self.vehicle_hudmodel.viewmodelforclient = self;
+    self.customizeentityforclient            = racer_customizeentityforclient;
+
+    self.tur_head     = spawn();
+
+    self.pos1         = self.origin;
+    self.pos2         = self.angles;
+    self.angles       = '0 0 0';
+    self.angles       = self.pos1;
+
+    self.vehicle_die  = racer_die;
+    self.vehicle_exit = racer_exit;
+
+    addstat(STAT_HUD, AS_INT,  hud);
+	addstat(STAT_VEHICLESTAT_HEALTH,  AS_FLOAT, vehicle_health);
+	addstat(STAT_VEHICLESTAT_SHIELD,  AS_FLOAT, vehicle_shield);
+	addstat(STAT_VEHICLESTAT_ENERGY,  AS_FLOAT, vehicle_energy);
+
+	addstat(STAT_VEHICLESTAT_AMMO1,   AS_INT,   vehicle_ammo1);
+	addstat(STAT_VEHICLESTAT_RELOAD1, AS_FLOAT, vehicle_reload1);
+
+	addstat(STAT_VEHICLESTAT_AMMO2,   AS_INT,   vehicle_ammo2);
+	addstat(STAT_VEHICLESTAT_RELOAD2, AS_FLOAT, vehicle_reload2);
+
     racer_spawn();
-
-    //self.vehicle_die = spiderbot_die;
-    //self.vehicle_exit = spiderbot_exit;
 }
 
-void spawnfunc_racer()
+void spawnfunc_vehicle_racer()
 {
     g_turrets_common_precash();
+    racer_loadsettings();
 
-    precache_model ( "models/racers/waka.dpm");
+    self.vehicle_flags      = VHF_HASSHIELD | VHF_SHIELDREGEN;
+    precache_model ("models/vehicles/wakizashi.dpm");
+    precache_model ("models/vehicles/wakizashi_cockpit.dpm");
+    precache_model ("models/rocket.md3");
 
     self.think = racer_dinit;
-    self.nextthink = time + 0.5;
+    self.nextthink = time + 1;
 }

Modified: branches/nexuiz-2.0/data/qcsrc/server/vehicles/spiderbot.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/vehicles/spiderbot.qc	2009-11-07 17:16:16 UTC (rev 8222)
+++ branches/nexuiz-2.0/data/qcsrc/server/vehicles/spiderbot.qc	2009-11-07 17:17:43 UTC (rev 8223)
@@ -1,137 +1,7 @@
-#define MODEL_SPIDERBOT_FORWARD_START 1
-#define MODEL_SPIDERBOT_FORWARD_END 31
-#define MODEL_SPIDERBOT_FORWARD_LENGTH 31
-
-#define MODEL_SPIDERBOT_BACKWARDS_START 32
-#define MODEL_SPIDERBOT_BACKWARDS_END 62
-#define MODEL_SPIDERBOT_BACKWARDS_LENGTH 31
-
-#define MODEL_SPIDERBOT_LEFT_START 63
-#define MODEL_SPIDERBOT_LEFT_END 93
-#define MODEL_SPIDERBOT_LEFT_LENGTH 31
-
-#define MODEL_SPIDERBOT_RIGHT_START 94
-#define MODEL_SPIDERBOT_RIGHT_END 124
-#define MODEL_SPIDERBOT_RIGHT_LENGTH 31
-
-#define MODEL_SPIDERBOT_JUMP_START 125
-#define MODEL_SPIDERBOT_JUMP_END 155
-#define MODEL_SPIDERBOT_JUMP_LENGTH 31
-
-#define spiderbot_MIN '-75 -75 5'
-#define spiderbot_MAX '75 75 105'
+#define spiderbot_MIN '-75 -75 0'
+#define spiderbot_MAX '75 75 100'
 #define spiderbot_spawnpnt wkr_spawn
 
-/*
-.void() anim_now;
-.void() anim_next;
-
-void spider_anim_idle()
-{
-    movelib_beak_simple(cvar("g_vehicle_spiderbot_speed_stop"));
-    if(self.anim_next != self.anim_now)
-        self.anim_now = self.anim_next;
-}
-
-void spider_anim_forward()
-{
-    movelib_move_simple(normalize(v_forward),cvar("g_vehicle_spiderbot_speed_walk"),cvar("g_vehicle_spiderbot_movement_inertia"));
-
-    if((self.frame < MODEL_SPIDERBOT_FORWARD_START) || (self.frame > MODEL_SPIDERBOT_FORWARD_END))
-        self.frame = MODEL_SPIDERBOT_FORWARD_START;
-    else
-        self.frame += 0.8;
-
-    if(self.frame > MODEL_SPIDERBOT_FORWARD_END)
-        self.anim_now = self.anim_next;
-}
-
-void spider_anim_backward()
-{
-    movelib_move_simple(normalize(v_forward * -1),cvar("g_vehicle_spiderbot_speed_walk"),cvar("g_vehicle_spiderbot_movement_inertia"));
-
-    if(self.frame < MODEL_SPIDERBOT_BACKWARDS_START)
-        self.frame = MODEL_SPIDERBOT_BACKWARDS_START;
-    else
-        self.frame += 0.8;
-
-    if(self.frame > MODEL_SPIDERBOT_BACKWARDS_END)
-        self.anim_now = self.anim_next;
-}
-
-void spider_anim_strafel()
-{
-    movelib_move_simple(normalize(v_right * -1),cvar("g_vehicle_spiderbot_speed_strafe"),cvar("g_vehicle_spiderbot_movement_inertia"));
-
-    if(self.frame < MODEL_SPIDERBOT_LEFT_START)
-        self.frame = MODEL_SPIDERBOT_LEFT_START;
-    else
-        self.frame += 0.8;
-
-    if(self.frame > MODEL_SPIDERBOT_LEFT_END)
-        self.anim_now = self.anim_next;
-}
-
-void spider_anim_strafer()
-{
-    movelib_move_simple(normalize(v_right),cvar("g_vehicle_spiderbot_speed_strafe"),cvar("g_vehicle_spiderbot_movement_inertia"));
-
-    if(self.frame < MODEL_SPIDERBOT_RIGHT_START)
-        self.frame = MODEL_SPIDERBOT_RIGHT_START;
-    else
-        self.frame += 0.8;
-
-    if(self.frame > MODEL_SPIDERBOT_RIGHT_END)
-        self.anim_now = self.anim_next;
-}
-
-void spider_anim_jump()
-{
-    //movelib_move_simple(normalize(v_forward),cvar("g_vehicle_spiderbot_speed_walk"),cvar("g_vehicle_spiderbot_movement_inertia"));
-
-    if(self.frame < MODEL_SPIDERBOT_JUMP_START)
-        self.frame = MODEL_SPIDERBOT_JUMP_START;
-    else
-        self.frame += 1;
-
-    if(self.frame <= 8)
-        movelib_beak_simple(cvar("g_vehicle_spiderbot_speed_stop"));
-
-    if(self.frame == 9)
-        self.velocity = v_forward * 400 + v_up * 400;
-
-    if(self.frame >= 19)
-        movelib_beak_simple(cvar("g_vehicle_spiderbot_speed_stop"));
-
-    if(self.frame > MODEL_SPIDERBOT_JUMP_END)
-        self.anim_now = self.anim_next;
-}
-
-void anim_do()
-{
-    if not (self.anim_now)
-        self.anim_now = self.anim_next;
-
-    self.anim_now();
-}
-
-*/
-
-/*
-void anim_do()
-{
-    self.frame = self.frame + 0.8;
-    if ((self.frame < self.anim_start) || (self.frame > self.anim_end))
-        if(self.anim_start == 0)
-        {
-            self.frame = 0;
-            self.anim_end = 0;
-        }
-        else
-            self.frame = self.anim_start;
-}
-*/
-
 void spiderbot_exit(float eject);
 void spiderbot_enter();
 
@@ -156,10 +26,10 @@
         self.owner = self.realowner;
 
     RadiusDamage (self, self.owner,
-     cvar("g_vehicle_spiderbot_rocket_damage"),
-     cvar("g_vehicle_spiderbot_rocket_edgedamage"),
-     cvar("g_vehicle_spiderbot_rocket_radius"), world,
-     cvar("g_vehicle_spiderbot_rocket_force"), DEATH_TURRET, world);
+        cvar("g_vehicle_spiderbot_rocket_damage"),
+        cvar("g_vehicle_spiderbot_rocket_edgedamage"),
+        cvar("g_vehicle_spiderbot_rocket_radius"), world,
+        cvar("g_vehicle_spiderbot_rocket_force"), DEATH_SBROCKET, world);
 
     remove (self);
 }
@@ -199,16 +69,26 @@
     self.solid      = SOLID_BBOX;
     self.touch      = spiderbot_rocket_touch;
     olddir = normalize(self.velocity);
-    newdir = normalize(self.owner.cursor_trace_endpos - self.origin);
+    //newdir = normalize(self.owner.cursor_trace_endpos - self.origin);
+    newdir = normalize(self.pos1 - self.origin);
     newdir += randomvec() * cvar("g_vehicle_spiderbot_rocket_noise");
     self.velocity = normalize(olddir + newdir * cvar("g_vehicle_spiderbot_rocket_turnrate")) * cvar("g_vehicle_spiderbot_rocket_speed");
 
     UpdateCSQCProjectile(self);
 }
 
+void spiderbot_rocket_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
+{
+    self.health -= damage;
+    self.velocity += force;
+    if(self.health < 1)
+        spiderbot_rocket_explode();
+}
+
+
 void spiderbot_rocket_do()
 {
-    entity missile;
+    entity rocket;
 
     if(self.gun2.cnt > time)
         return;
@@ -228,24 +108,29 @@
     self.gun2.cnt = time + self.attack_finished_single;
 
     sound (self, CHAN_WEAPON, "weapons/rocket_fire.wav", VOL_BASE, ATTN_NORM);
-    missile                    = spawn ();
-    setsize (missile, '-3 -1 -1', '3 1 1'); // give it some size so it can be shot
-    setorigin(missile,gettaginfo(self.tur_head,gettagindex(self.tur_head,"tag_fire")));
-    te_explosion (missile.origin);
+    rocket                    = spawn ();
+    setsize (rocket, '-1 -1 -1', '1 1 1'); // give it some size so it can be shot
+    setorigin(rocket,gettaginfo(self.tur_head,gettagindex(self.tur_head,"tag_fire")));
+    te_explosion (rocket.origin);
 
-    missile.classname       = "spiderbot_rocket";
-    missile.owner           = self.owner;
-    missile.bot_dodge       = TRUE;
-    missile.bot_dodgerating = 75;
-    missile.nextthink       = time;// + 0.2;
-    missile.movetype        = MOVETYPE_FLYMISSILE;
-    missile.velocity        = normalize(v_forward + (v_up * 0.5) + randomvec() * 0.25) * cvar("g_vehicle_spiderbot_rocket_speed");
-    missile.angles          = vectoangles(missile.velocity);
-    missile.think           = spiderbot_rocket_think;
-    missile.flags           = FL_PROJECTILE;
-    missile.solid           = SOLID_NOT;
+    rocket.classname       = "spiderbot_rocket";
+    rocket.bot_dodge       = TRUE;
+    rocket.bot_dodgerating = cvar("g_vehicle_spiderbot_rocket_damage");
+    rocket.cnt             = time + cvar("g_vehicle_spiderbot_rocket_lifetime");
+    rocket.health          = cvar("g_vehicle_spiderbot_rocket_health");
+    rocket.takedamage      = DAMAGE_AIM;
+    rocket.event_damage    = spiderbot_rocket_damage;
+    rocket.owner           = self.owner;
+    rocket.nextthink       = time;
+    rocket.movetype        = MOVETYPE_FLYMISSILE;
+    rocket.velocity        = normalize(v_forward + (v_up * 0.5) + randomvec() * 0.25) * cvar("g_vehicle_spiderbot_rocket_speed");
+    rocket.angles          = vectoangles(rocket.velocity);
+    rocket.think           = spiderbot_rocket_think;
+    rocket.flags           = FL_PROJECTILE;
+    rocket.solid           = SOLID_NOT;
+    rocket.pos1            = self.owner.cursor_trace_endpos;
 
-	CSQCProjectile(missile, FALSE, PROJECTILE_ROCKET, FALSE); // no culling, has fly sound
+	CSQCProjectile(rocket, FALSE, PROJECTILE_ROCKET, FALSE); // no culling, has fly sound
 }
 
 void spiderbot_minigun_fire_Flash_Go() {
@@ -257,6 +142,7 @@
 
 	self.frame = self.frame + 2;
 	self.alpha = self.alpha - 0.2;
+	self.scale -= 0.01;
 	self.nextthink = time + 0.02;
 }
 
@@ -271,90 +157,91 @@
     sound (gun, CHAN_WEAPON, "weapons/uzi_fire.wav", VOL_BASE, ATTN_NORM);
 
     fireBullet (v, v_forward, cvar("g_vehicle_spiderbot_minigun_spread"), cvar("g_vehicle_spiderbot_minigun_damage"),
-        cvar("g_vehicle_spiderbot_minigun_spread"), DEATH_TURRET, 0);
+        cvar("g_vehicle_spiderbot_minigun_spread"), DEATH_SBMINIGUN, 0);
 
     if not (gun.enemy)
     {
         gun.enemy = spawn();
         setattachment(gun.enemy , gun, "barrels");
-        setorigin(gun.enemy ,gun.enemy.origin + '48 0 0');
+        setorigin(gun.enemy ,gun.enemy.origin + '52 0 0');
     }
 
-    flash = gun.enemy; //spawn();
-    setmodel(flash, "models/uziflash.md3"); // precision set below
+    flash = gun.enemy;
+    setmodel(flash, "models/uziflash.md3");
     flash.think = spiderbot_minigun_fire_Flash_Go;
     flash.nextthink = time + 0.02;
     flash.frame = 2;
     flash.angles_z = flash.v_angle_z + random() * 180;
     flash.alpha = 1;
     flash.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION;
+    flash.scale = 1;
+
     if(trail)
         trailparticles(self, particleeffectnum("EF_MGTURRETTRAIL"), v, trace_endpos);
 }
 
 void spiderbot_miniguns_do()
 {
-    if ((self.owner.BUTTON_ATCK) && (self.owner.vehicle_heat < 1) && (self.tur_head.attack_finished_single < time))
+    float ftmp;
+
+    if((self.vehicle_reload1 == 1) || (!self.owner.BUTTON_ATCK))
     {
 
-        self.gun1.angles_z += 36;
-        self.gun2.angles_z -= 36;
+        ftmp = 1 / cvar("g_vehicle_spiderbot_minigun_cooldown") * sys_ticrate;
+        self.owner.vehicle_reload1 = max(self.owner.vehicle_reload1 - ftmp, 0);
+        if(self.owner.vehicle_reload1 <= 0)
+            self.vehicle_reload1 = 0;
+
+        return ;
+    }
+
+    if (self.owner.BUTTON_ATCK)
+    {
+
+        // Animate miniguns
+        self.gun1.angles_z += (1440 * sys_ticrate);
+        self.gun2.angles_z -= (1440 * sys_ticrate);
         if(self.gun1.angles_z >= 360)
         {
             self.gun1.angles_z = 0;
             self.gun2.angles_z = 360;
         }
 
-        self = self.owner;
-        if(self.uzi_bulletcounter == 1)
+        if (self.tur_head.attack_finished_single < time)
         {
-            spiderbot_minigun_fire(self.vehicle.gun1,0);
-            spiderbot_minigun_fire(self.vehicle.gun2,1);
-            self.uzi_bulletcounter = 0;
-        }
-        else
-        {
-            spiderbot_minigun_fire(self.vehicle.gun1,1);
-            spiderbot_minigun_fire(self.vehicle.gun2,0);
-            self.uzi_bulletcounter += 1;
-        }
-
-        self = self.vehicle;
-        self.owner.vehicle_heat += cvar("g_vehicle_spiderbot_minigun_heat");
-        if(self.owner.vehicle_heat >= 1)
-        {
-            self.vehicle_heat = 1;
-            self.owner.vehicle_heat = 1;
-            self.tur_head.attack_finished_single = (1/(cvar("g_vehicle_spiderbot_minigun_cooldown") * server_fps))+time;
-        }
-        else
-            self.tur_head.attack_finished_single = cvar("g_vehicle_spiderbot_minigun_refire") + time;
-
-        return;
-    }
-    else
-        if(self.vehicle_heat != 0)
-        {
-            self.vehicle_heat = max(self.vehicle_heat - cvar("g_vehicle_spiderbot_minigun_cooldown"),0);
-            if(self.tur_head.attack_finished_single < time)
+            // Fire bullets, alternating trails left<->right
+            self = self.owner;
+            if(self.uzi_bulletcounter == 1)
             {
-                self.vehicle_heat = 0;
-                self.owner.vehicle_heat = 0;
+                spiderbot_minigun_fire(self.vehicle.gun1, 0);
+                spiderbot_minigun_fire(self.vehicle.gun2, 1);
+                self.uzi_bulletcounter = 0;
             }
             else
             {
-                if(self.tur_head.uzi_bulletcounter < time)
-                {
-                    self.tur_head.uzi_bulletcounter = time + 0.2;
-                    self.owner.vehicle_heat  = self.vehicle_heat;
-                }
-                else
-                    self.owner.vehicle_heat = 1;
+                spiderbot_minigun_fire(self.vehicle.gun1, 1);
+                spiderbot_minigun_fire(self.vehicle.gun2, 0);
+                self.uzi_bulletcounter += 1;
             }
+
+            self = self.vehicle;
+
+            ftmp = cvar("g_vehicle_spiderbot_minigun_refire") / cvar("g_vehicle_spiderbot_minigun_heat");
+            self.owner.vehicle_reload1 +=  ftmp;
+
+            if(self.owner.vehicle_reload1 >= 1)
+            {
+                self.vehicle_reload1 = 1;
+                self.owner.vehicle_reload1 = 1;
+                self.tur_head.attack_finished_single = cvar("g_vehicle_spiderbot_minigun_cooldown") + time;
+            }
+            else
+                self.tur_head.attack_finished_single = cvar("g_vehicle_spiderbot_minigun_refire") + time;
         }
-        else
-            self.owner.vehicle_heat = max(self.owner.vehicle_heat - cvar("g_vehicle_spiderbot_minigun_cooldown"),0);
 
+        self = self.owner;
+        return;
+    }
 }
 #define SBS_IDLE  0
 #define SBS_JUMP  1
@@ -391,7 +278,6 @@
     player.BUTTON_CROUCH = 0;
     player.switchweapon = 0;
 
-
     if(player.BUTTON_USE)
     {
         self = spider;
@@ -404,20 +290,18 @@
 
     spider.tur_head.angles_x *= -1;
     spider.angles_x *= -1;
-    //player.angles_x *= -1;
     makevectors(spider.angles);
 
-    //ad = player.v_angle - (spider.tur_head.angles + spider.angles);
     ad = player.v_angle -  (spider.tur_head.angles + spider.angles);
 
     // Rotate head
-    ftmp = cvar("g_vehicle_spiderbot_head_turnspeed") / server_fps;
+    ftmp = cvar("g_vehicle_spiderbot_head_turnspeed") * sys_ticrate;
     ftmp2 = ftmp * -1;
     spider.tur_head.angles_y += bound(ftmp2,shortangle_f(ad_y,spider.tur_head.angles_y),ftmp);
     spider.tur_head.angles_y = bound(cvar("g_vehicle_spiderbot_head_turnlimit") * -1,spider.tur_head.angles_y,cvar("g_vehicle_spiderbot_head_turnlimit"));
 
     // Pitch head
-    ftmp = cvar("g_vehicle_spiderbot_head_pitchspeed") / server_fps;
+    ftmp = cvar("g_vehicle_spiderbot_head_pitchspeed") * sys_ticrate;
     ftmp2 = ftmp * -1;
     spider.tur_head.angles_x += bound(ftmp2,shortangle_f(ad_x,spider.tur_head.angles_x),ftmp);
     spider.tur_head.angles_x = bound(cvar("g_vehicle_spiderbot_head_pitchlimit_down"),spider.tur_head.angles_x,cvar("g_vehicle_spiderbot_head_pitchlimit_up"));
@@ -427,7 +311,7 @@
     //player.angles_x *= -1;
 
     // Turn Body
-    ftmp = cvar("g_vehicle_spiderbot_turnspeed") / server_fps;
+    ftmp = cvar("g_vehicle_spiderbot_turnspeed") * sys_ticrate;
     ftmp2 = ftmp * -1;
     ftmp = bound(ftmp2,spider.tur_head.angles_y,ftmp);
 
@@ -438,8 +322,6 @@
         if(player.BUTTON_JUMP)
         {
             player.BUTTON_JUMP = 0;
-            spider.anim_start = MODEL_SPIDERBOT_JUMP_START;
-            spider.anim_end   = MODEL_SPIDERBOT_JUMP_END;
             spider.velocity   = v_forward * 700 + v_up * 600;
             spider.state = SBS_JUMP;
             spider.frame = 4;
@@ -464,16 +346,12 @@
                     if(player.movement_x > 0)
                     {
                         player.movement_x = 1;
-                        spider.anim_start = MODEL_SPIDERBOT_FORWARD_START;
-                        spider.anim_end   = MODEL_SPIDERBOT_FORWARD_END;
                         spider.state = SBS_WALK;
                         spider.frame = 0;
                     }
                     else if(player.movement_x < 0)
                     {
                         player.movement_x = -1;
-                        spider.anim_start = MODEL_SPIDERBOT_BACKWARDS_START;
-                        spider.anim_end   = MODEL_SPIDERBOT_BACKWARDS_END;
                         spider.state = SBS_BACK;
                         spider.frame = 1;
                     }
@@ -485,16 +363,12 @@
                     if(player.movement_y < 0)
                     {
                         player.movement_y = -1;
-                        spider.anim_start = MODEL_SPIDERBOT_LEFT_START;
-                        spider.anim_end   = MODEL_SPIDERBOT_LEFT_END;
                         spider.state = SBS_LEFT;
                         spider.frame = 2;
                     }
                     else if(player.movement_y > 0)
                     {
                         player.movement_y = 1;
-                        spider.anim_start = MODEL_SPIDERBOT_RIGHT_START;
-                        spider.anim_end   = MODEL_SPIDERBOT_RIGHT_END;
                         spider.state = SBS_RIGHT;
                         spider.frame = 3;
                     }
@@ -506,24 +380,25 @@
         movelib_groundalign4point(300,100,0.25);
     }
 
-    //anim_do();
     spiderbot_miniguns_do();
     spiderbot_rocket_do();
-    vehicle_stdproc_regen();
+    vehicle_stdproc_shiledregen(CCVAR("_shield"), frametime);
+    vehicle_stdproc_healthregen(CCVAR("_health"), frametime);
 
     player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0;
-    player.rockets = spider.tur_head.frame;
+    player.vehicle_ammo2 = spider.tur_head.frame;
 
     if(spider.gun2.cnt <= time)
-        player.rockets_reload = 1;
+        player.vehicle_reload2 = 1;
     else
-        player.rockets_reload = 1 - ((spider.gun2.cnt - time) /spider.attack_finished_single);
+        player.vehicle_reload2 = 1 - ((spider.gun2.cnt - time) / spider.attack_finished_single);
 
-    self = player;
-
+    //setorigin(spider,spider.origin);
     setorigin(player,spider.origin + '0 0 64');
     player.velocity = spider.velocity;
 
+    self = player;
+
     return 1;
 }
 
@@ -541,7 +416,7 @@
 void spiderbot_enter()
 {
     // Remove this when bots know how to use the spiderbot
-    if not (clienttype(other) == CLIENTTYPE_REAL)
+    if (clienttype(other) != CLIENTTYPE_REAL)
         return;
 
     self.colormod = self.tur_head.colormod = '0 0 0';
@@ -558,7 +433,7 @@
     self.colormap             = self.owner.colormap;
     self.tur_head.colormap    = self.owner.colormap;
     self.vehicle_hudmodel.viewmodelforclient = self.owner;
-    self.nextthink = 0;
+    self.nextthink            = 0;
     self.owner.angles         = self.angles;
     self.owner.takedamage     = DAMAGE_NO;
     self.owner.solid          = SOLID_NOT;
@@ -570,12 +445,21 @@
     self.owner.hud            = HUD_SPIDERBOT;
     self.owner.vehicle_health = (self.vehicle_health / cvar("g_vehicle_spiderbot_health"));
     self.owner.vehicle_shield = (self.vehicle_shield / cvar("g_vehicle_spiderbot_shield"));
-    self.team                   = self.owner.team;
+    self.owner.view_ofs       = '0 0 0';
+    self.owner.vehicle_ammo1 = self.vehicle_ammo1;
+    self.owner.vehicle_ammo2 = self.vehicle_ammo2;
+    self.owner.vehicle_reload1 = self.vehicle_reload1;
+    self.owner.vehicle_reload2 = self.vehicle_reload2;
 
-    //setorigin(self.owner,self.origin);
-    //setattachment(self.owner,self,"");
-    //setorigin(self.owner,'0 0 0');
+    //if(other.flags & FL_ONGROUND)
+        other.flags &~= FL_ONGROUND;
 
+    //if(self.flags & FL_ONGROUND)
+        self.flags &~= FL_ONGROUND;
+
+    self.team                 = self.owner.team;
+    self.flags               -= FL_NOTARGET;
+
     if(clienttype(other) == CLIENTTYPE_REAL)
     {
         msg_entity = other;
@@ -587,16 +471,15 @@
         WriteAngle(MSG_ONE, self.tur_head.angles_y + self.angles_y);    // yaw
         WriteAngle(MSG_ONE, 0);    // roll
     }
-
-    //WriteAngle(MSG_ONE, self.tur_head.angles_z + self.angles_z);    // roll
-    //self.owner.view_ofs = '0 0 0';
-    //self.tur_head.nodrawtoclient = self.owner;
 }
 
 void spiderbot_exit(float eject)
 {
     entity e;
     self.frame = 5;
+
+    self.flags      |= FL_NOTARGET;
+
     e = findchain(classname,"spiderbot_rocket");
     while(e)
     {
@@ -604,9 +487,6 @@
         {
             e.realowner = self.owner;
             e.owner = world;
-            //e.solid = SOLID_BBOX;
-            //e.think = SUB_Null;
-            //e.nextthink = -1;
         }
         e = e.chain;
     }
@@ -626,7 +506,6 @@
         WriteAngle(MSG_ONE, 0);    // roll
     }
 
-    //setattachment(self.owner,world,"");
     self.think = spiderbot_think;
     self.nextthink = time;
     self.owner.takedamage     = DAMAGE_AIM;
@@ -672,6 +551,20 @@
     self.owner = world;
 }
 
+float spiderbot_crushable(entity e)
+{
+    if(e.classname == "corpse")
+        return 1;
+
+    if(e.classname == "player")
+        return 1;
+
+    if(e.classname == "monster_zombie")
+        return 1;
+
+    return 0;
+}
+
 void spiderbot_touch()
 {
     if(self.owner)
@@ -679,12 +572,12 @@
         if(vlen(self.velocity) == 0)
             return;
 
-        if(other.classname != "player")
+        if not (spiderbot_crushable(other))
             return;
 
-        //todo: add check for velocity here (so we dont cush players runing onto us from behind)
+        //todo: add check for velocity/angle here (so we dont cush players runing onto us from behind)
 
-        Damage(other,self,self.owner,cvar("g_vehicle_spiderbot_crush_dmg"),DEATH_TURRET,'0 0 0', normalize(other.origin - self.origin) * cvar("g_vehicle_spiderbot_crush_force") );
+        Damage(other,self,self.owner,cvar("g_vehicle_spiderbot_crush_dmg"),DEATH_SBCRUSH,'0 0 0', normalize(other.origin - self.origin) * cvar("g_vehicle_spiderbot_crush_force") );
         return;
     }
 
@@ -715,6 +608,7 @@
     self.think = spiderbot_think;
     self.nextthink = time;
 
+    self.velocity = '0 0 -2000';
     self.vehicle_health = CCVAR("_health");
     self.vehicle_shield = CCVAR("_shield");
     self.event_damage = vehicle_stdproc_damage;
@@ -729,7 +623,7 @@
 	self.tur_head.colormap = 1024;
 	self.deadflag    = DEAD_NO;
     self.bot_attack = TRUE;
-
+    self.flags      |= FL_NOTARGET;
     setsize(self,spiderbot_MIN,spiderbot_MAX);
 
     setorigin(self,self.spiderbot_spawnpnt.origin);
@@ -756,10 +650,11 @@
     RadiusDamage (self, self, 250, 15, 250, world, 250, DEATH_TURRET, world);
 
     self.alpha = self.tur_head.alpha = self.gun1.alpha = self.gun2.alpha = -1;
-    self.nextthink  = time + 10;
+    self.nextthink  = time + cvar("g_vehicle_spiderbot_respawntime");
     self.think      = spiderbot_spawn;
+    self.movetype   = MOVETYPE_NONE;
 
-    setorigin(self,self.tur_aimpos);
+    setorigin(self, self.tur_aimpos);
 }
 
 void spiderbot_die()
@@ -795,44 +690,46 @@
     else
         self.spiderbot_spawnpnt.team = self.team;
 
-    server_fps = (1 / sys_ticrate);
-
     addstat(STAT_HUD, AS_INT,  hud);
-	addstat(STAT_SPIDERBOT_ROCKETS, AS_INT,   rockets);
-	addstat(STAT_SPIDERBOT_RELOAD,  AS_FLOAT, rockets_reload);
-	addstat(STAT_SPIDERBOT_HEAT,    AS_FLOAT, vehicle_heat);
-	addstat(STAT_SPIDERBOT_HEALTH,  AS_FLOAT, vehicle_health);
-	addstat(STAT_SPIDERBOT_SHIELD,  AS_FLOAT, vehicle_shield);
+	addstat(STAT_VEHICLESTAT_HEALTH,  AS_FLOAT, vehicle_health);
+	addstat(STAT_VEHICLESTAT_SHIELD,  AS_FLOAT, vehicle_shield);
+	addstat(STAT_VEHICLESTAT_ENERGY,  AS_FLOAT, vehicle_energy);
+	addstat(STAT_VEHICLESTAT_AMMO1,   AS_INT,   vehicle_ammo1);
+	addstat(STAT_VEHICLESTAT_RELOAD1, AS_FLOAT, vehicle_reload1);
+	addstat(STAT_VEHICLESTAT_AMMO2,   AS_INT,   vehicle_ammo2);
+	addstat(STAT_VEHICLESTAT_RELOAD2, AS_FLOAT, vehicle_reload2);
 
-    if (self.netname == "")      self.netname     = "spiderbot";
+    if (self.netname == "")
+        self.netname     = "spiderbot";
 
-    self.tur_head = spawn();
-    self.gun1 = spawn();
-    self.gun2 = spawn();
-    self.vehicle_viewport = spawn();
-    self.gravity = 2;
-    self.vehicle_hudmodel = spawn();
-    self.vehicle_flags = VHF_HASSHIELD | VHF_SHIELDREGEN | VHF_HEALTHREGEN;
-    self.cvar_basename = "g_vehicle_spiderbot";
+    self.tur_head           = spawn();
+    self.gun1               = spawn();
+    self.gun2               = spawn();
+    self.vehicle_viewport   = spawn();
+    self.vehicle_hudmodel   = spawn();
+    self.vehicle_flags      = VHF_HASSHIELD | VHF_SHIELDREGEN | VHF_HEALTHREGEN | VHF_DEATHEJECT;
+    self.cvar_basename      = "g_vehicle_spiderbot";
+    self.gravity            = 2;
 
-    setmodel (self.vehicle_hudmodel, "models/spiderbot/cp.md3");
-    setmodel (self.vehicle_viewport, "null");
-    setmodel(self,"models/spiderbot/spiderbot.dpm");
-    setmodel(self.tur_head,"models/spiderbot/spiderbot_top.dpm");
-    setmodel(self.gun1,"models/spiderbot/spiderbot_barrels.dpm");
-    setmodel(self.gun2,"models/spiderbot/spiderbot_barrels.dpm");
+    setmodel(self, "models/vehicles/spiderbot.dpm");
+    setmodel(self.tur_head, "models/vehicles/spiderbot_top.dpm");
+    setmodel(self.gun1, "models/vehicles/spiderbot_barrels.dpm");
+    setmodel(self.gun2, "models/vehicles/spiderbot_barrels.dpm");
+    setmodel(self.vehicle_hudmodel, "models/vehicles/spiderbot_cockpit.dpm");
+    setmodel(self.vehicle_viewport, "null");
 
-    setattachment(self.tur_head,self,"tag_head");
-    setattachment(self.vehicle_hudmodel,self.tur_head,"");
-    setattachment(self.vehicle_viewport,self.vehicle_hudmodel,"");
-    setattachment(self.gun1,self.tur_head,"tag_hardpoint01");
-    setattachment(self.gun2,self.tur_head,"tag_hardpoint02");
+    setattachment(self.tur_head, self, "tag_head");
+    setattachment(self.vehicle_hudmodel, self.tur_head, "tag_hud");
+    setattachment(self.vehicle_viewport, self.vehicle_hudmodel, "");
 
+    setattachment(self.gun1,self.tur_head, "tag_hardpoint01");
+    setattachment(self.gun2,self.tur_head, "tag_hardpoint02");
+
     self.tur_head.owner = self;
     self.customizeentityforclient          = spiderbot_customizeentityforclient;
 
-    setorigin(self.vehicle_viewport,'35 0 -14');
     self.tur_aimpos = self.origin;
+
     spiderbot_spawn();
 
     self.vehicle_die = spiderbot_die;
@@ -841,13 +738,12 @@
 
 void spawnfunc_vehicle_spiderbot()
 {
-    // g_turrets_common_precash();
-
     precache_model ( "models/vhshield.md3");
-    precache_model ( "models/spiderbot/cp.md3");
-    precache_model ( "models/spiderbot/spiderbot.dpm");
-    precache_model ( "models/spiderbot/spiderbot_top.dpm");
-    precache_model ( "models/spiderbot/spiderbot_barrels.dpm");
+    precache_model ( "models/vehicles/spiderbot.dpm");
+    precache_model ( "models/vehicles/spiderbot_top.dpm");
+    precache_model ( "models/vehicles/spiderbot_barrels.dpm");
+    precache_model ( "models/vehicles/spiderbot_cockpit.dpm");
+    precache_model ( "models/uziflash.md3");
 
     precache_model ( "models/turrets/rocket.md3");
     precache_sound ( "weapons/rocket_impact.wav" );

Modified: branches/nexuiz-2.0/data/qcsrc/server/vehicles/vehicles.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/vehicles/vehicles.qc	2009-11-07 17:16:16 UTC (rev 8222)
+++ branches/nexuiz-2.0/data/qcsrc/server/vehicles/vehicles.qc	2009-11-07 17:17:43 UTC (rev 8223)
@@ -6,48 +6,54 @@
 {
 }
 
-void vehicle_stdproc_regen()
+void vehicle_stdproc_shiledregen(float rmax, float dt)
 {
-    float smax,hmax;
-
-    smax = CCVAR("_shield");
-    hmax = CCVAR("_health");
-
-    if(self.vehicle_flags & VHF_HASSHIELD)
-    if(self.vehicle_flags & VHF_SHIELDREGEN)
-    if(self.vehicle_shield < smax)
+    if(self.vehicle_shield < rmax)
     if(self.dmg_time + CCVAR("_shield_regen_dmgpause") < time)
     {
-        self.vehicle_shield = min(self.vehicle_shield + CCVAR("_shield_regen") / server_fps,smax);
+        self.vehicle_shield = min(self.vehicle_shield + CCVAR("_shield_regen") * dt, rmax);
 
         if(self.owner)
-            self.owner.vehicle_shield = self.vehicle_shield / cvar(strcat(self.cvar_basename,"_shield"));
+            self.owner.vehicle_shield = self.vehicle_shield / rmax;
     }
+}
 
-    if(self.vehicle_flags & VHF_HEALTHREGEN)
+void vehicle_stdproc_healthregen(float rmax, float dt)
+{
+
     if(self.dmg_time + CCVAR("_health_regen_dmgpause") < time)
-    if(self.vehicle_health < hmax)
+    if(self.vehicle_health < rmax)
     {
-        self.vehicle_health = min(self.vehicle_health + CCVAR("_health_regen") / server_fps,hmax);
+        self.vehicle_health = min(self.vehicle_health + CCVAR("_health_regen") * dt, rmax);
 
         if(self.owner)
-            self.owner.vehicle_health = self.vehicle_health / CCVAR("_health");
+            self.owner.vehicle_health = self.vehicle_health / rmax;
     }
 }
 
-void shieldhit_think()
+void vehicle_stdproc_energyregen(float rmax, float dt)
 {
-    self.alpha = self.alpha - 0.125;
-    if not(self.alpha <= 0)
+    if(self.vehicle_energy < rmax)
     {
-        self.nextthink = time;
+        self.vehicle_energy = min(self.vehicle_energy + CCVAR("_energy_regen") * dt, rmax);
+
+        if(self.owner)
+            self.owner.vehicle_energy = self.vehicle_energy / rmax;
     }
-    else
+}
+
+void shieldhit_think()
+{
+    self.alpha = self.alpha - 0.2;
+    if (self.alpha <= 0)
     {
         setmodel(self,"");
         self.alpha = -1;
     }
-    //self.think = SUB_Remove;
+    else
+    {
+        self.nextthink = time + 0.1;
+    }
 }
 
 void vehicle_stdproc_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
@@ -59,40 +65,36 @@
 
     if((self.vehicle_flags & VHF_HASSHIELD) && (self.vehicle_shield > 0))
     {
+
         if not (self.tur_head.enemy)
+        {
             self.tur_head.enemy = spawn();
+            self.tur_head.enemy.effects = EF_LOWPRECISION;
+        }
 
-        entity sh;
+        setmodel(self.tur_head.enemy,"models/vhshield.md3");
+        setattachment(self.tur_head.enemy,self,"");
 
-        sh = self.tur_head.enemy;
-        sh.colormod = '1 1 1';
-        sh.alpha = 0.5;
-        sh.scale  = (128 / vlen(self.maxs - self.mins))*2;
-        //sh.scale = 1.25;
+        self.tur_head.enemy.colormod = '1 1 1';
+        self.tur_head.enemy.alpha = 0.45;
+        self.tur_head.enemy.scale  = (256 / vlen(self.maxs - self.mins));
+        self.tur_head.enemy.angles = vectoangles(normalize(hitloc - self.origin)) - self.angles;
+        self.tur_head.enemy.think = shieldhit_think;
+        self.tur_head.enemy.nextthink = time;
 
-        sh.effects = EF_LOWPRECISION;
-        sh.angles = vectoangles(normalize(hitloc - self.origin)) - self.angles;
-
-        setmodel(sh,"models/vhshield.md3");
-        setattachment(sh,self,"");
-        sh.think = shieldhit_think;
-        sh.nextthink = time;
-
-
         self.vehicle_shield -= damage;
         if(self.vehicle_shield < 0)
         {
-            sh.colormod = '10 0 -1';
+            self.tur_head.enemy.colormod = '10 0 -1';
             ddmg_take = fabs(self.vehicle_shield);
             self.vehicle_shield = 0;
-
+            self.tur_head.enemy.alpha = 0.75;
             self.vehicle_health -= ddmg_take;
         }
     }
     else
         self.vehicle_health -= damage;
 
-
     if(self.owner)
     {
         self.owner.vehicle_health = self.vehicle_health / CCVAR("_health");
@@ -105,7 +107,8 @@
     if(self.vehicle_health <= 0)
     {
         if(self.owner)
-            self.vehicle_exit(VHEF_EJECT);
+            if(self.vehicle_flags & VHF_DEATHEJECT)
+                self.vehicle_exit(VHEF_EJECT);
 
         self.vehicle_die();
     }
@@ -119,5 +122,5 @@
     self.vehicle_enter      = self.vehicle_exit;
     self.vehicle_die        = self.vehicle_exit;
     self.vehicle_spawn      = self.vehicle_exit;
-    self.vehicle_message    = self.vehicle_exit;
+    //self.vehicle_message    = self.vehicle_exit;
 }

Modified: branches/nexuiz-2.0/data/qcsrc/server/vehicles/vehicles.qh
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/vehicles/vehicles.qh	2009-11-07 17:16:16 UTC (rev 8222)
+++ branches/nexuiz-2.0/data/qcsrc/server/vehicles/vehicles.qh	2009-11-07 17:17:43 UTC (rev 8223)
@@ -11,20 +11,27 @@
 //.string cvar_basename;
 
 .float vehicle_flags;
-#define VHF_HASSHIELD 2
+#define VHF_HASSHIELD   2
 #define VHF_SHIELDREGEN 4
 #define VHF_HEALTHREGEN 8
+#define VHF_DEATHEJECT  16
+#define VHF_ENERGYREGEN 32
 
 .float hud;
-.float rockets;
-.float rockets_reload;
+
 .entity gun1;
 .entity gun2;
 
 .float vehicle_health;
 .float vehicle_shield;
-.float vehicle_heat;
+.float vehicle_energy;
 
+.float vehicle_ammo1;
+.float vehicle_reload1;
+
+.float vehicle_ammo2;
+.float vehicle_reload2;
+
 .entity vehicle;
 .entity vehicle_viewport;
 .entity vehicle_hudmodel;
@@ -34,16 +41,14 @@
 
 .float dmg_time;
 
-float server_fps;
-
 #define VHEF_NORMAL 0
 #define VHEF_EJECT 1
 
-.void(float exit_flags) vehicle_exit;
-.void() vehicle_enter;
-.void() vehicle_die;
-.void() vehicle_spawn;
-.float(float message) vehicle_message;
+var .void(float exit_flags) vehicle_exit;
+var .void() vehicle_enter;
+var .void() vehicle_die;
+var .void() vehicle_spawn;
+//var .float(float message) vehicle_message;
 
 #include "vehicles.qc"
 #include "spiderbot.qc"

Modified: branches/nexuiz-2.0/data/qcsrc/server/verbstack.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/verbstack.qc	2009-11-07 17:16:16 UTC (rev 8222)
+++ branches/nexuiz-2.0/data/qcsrc/server/verbstack.qc	2009-11-07 17:17:43 UTC (rev 8223)
@@ -2,9 +2,12 @@
 .entity verbs_idle;
 .entity verbs_attack;
 .entity verbs_move;
+//.entity vchain;
 
 /// This global gets set to the verb in question each time the stack manager calls verb_call
 entity verb;
+//.entity current_verb;
+//.float verb_done;
 
 /// Execure this verb
 #define VCM_DO     0
@@ -31,6 +34,54 @@
 /// verb_call(VCM_DO) returns this when a verb should be deleted by the stack manager
 #define VS_CALL_REMOVE    -3
 
+/*
+void verbstack_updatechain(entity stack)
+{
+    entity vrb, v;
+    if not (stack)
+        return;
+
+    dprint("verbstack_updatechain\n");
+
+    vrb = findchainentity(verbstack, stack);
+    if not (vrb)
+    {
+        stack.vchain = world;
+        return;
+    }
+
+    stack.vchain = vrb;
+    v = vrb;
+
+    while(vrb)
+    {
+        vrb = vrb.chain;
+
+
+    }
+}
+
+void verbstack_remove(entity vverb)
+{
+    entity vstack;
+    dprint("verbstack_remove\n");
+
+    vstack = verb.verbstack;
+    remove(vverb);
+    vverb.verbstack = world;
+    verbstack_updatechain(vstack);
+
+    //vverb.think = SUB_Remove;
+    //vverb.nextthink = time;
+}
+
+void verbstack_thinkremove()
+{
+    dprint("verbstack_thinkremove\n");
+    verbstack_remove(self);
+}
+*/
+
 /**
     Push a new verb onto the specified stack. Set vrb_life to make it time-limited.
 **/
@@ -50,12 +101,18 @@
     vrb.verb_call         = vrb_call;
     vrb.verb_static_value = val_static;
 
+    vrb.classname         = "verb";
+    stack.classname       = "verbstack";
+
     if(vrb_life)
     {
+        //vrb.think     = verbstack_thinkremove;
         vrb.think     = SUB_Remove;
         vrb.nextthink = time + vrb_life;
     }
 
+    //verbstack_updatechain(stack);
+
     return vrb;
 }
 
@@ -71,8 +128,11 @@
     oldself = self;
 
     vrb = findchainentity(verbstack,stack);
+    //vrb = stack.vchain;
+    //dprint("owner:", stack.owner.classname, " vsn:", stack.classname,"\n");
     while(vrb)
     {
+        //dprint("vn:", vrb.classname,"\n");
         verb  = vrb;
         vrb   = vrb.chain;
         self  = verb.owner;
@@ -151,7 +211,7 @@
         vrb   = vrb.chain;
         value = verb.verb_call(VCM_EVAL);
 
-        if(value > 0)
+        if(value < 0)
         {
             if(value == VS_CALL_REMOVE)
                 remove(verb);
@@ -197,4 +257,18 @@
     }
 
     self = oldself;
+
+    //stack.vchain = world;
 }
+
+void verbstack_doverb(entity vrb)
+{
+    float value;
+
+    verb  = vrb;
+    self  = verb.owner;
+    value = verb.verb_call(VCM_DO);
+
+    if(value == VS_CALL_REMOVE)
+        remove(vrb);
+}

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_fireball.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_fireball.qc	2009-11-07 17:16:16 UTC (rev 8222)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_fireball.qc	2009-11-07 17:17:43 UTC (rev 8223)
@@ -61,6 +61,9 @@
 	float d;
 	vector p;
 
+	if(damage <= 0)
+		return;
+
 	RandomSelection_Init();
 	for(e = findradius(self.origin, dist); e; e = e.chain)
 	if(e != self.owner) if(e.takedamage == DAMAGE_AIM) if(e.classname != "player" || !self.owner || IsDifferentTeam(e, self))

Modified: branches/nexuiz-2.0/data/qcsrc/server/w_rocketlauncher.qc
===================================================================
--- branches/nexuiz-2.0/data/qcsrc/server/w_rocketlauncher.qc	2009-11-07 17:16:16 UTC (rev 8222)
+++ branches/nexuiz-2.0/data/qcsrc/server/w_rocketlauncher.qc	2009-11-07 17:17:43 UTC (rev 8223)
@@ -210,7 +210,8 @@
 		else
 		{
 			if(self == self.owner.lastrocket)
-			if(!self.owner.rl_release)
+			if not(self.owner.rl_release)
+			if not(self.BUTTON_ATCK2)
 			if(cvar("g_balance_rocketlauncher_guiderate"))
 			if(time > self.pushltime)
 			if(self.owner.deadflag == DEAD_NO)

Modified: branches/nexuiz-2.0/data/textures/common/antiportal.tga
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/textures/common/caulk.tga (from rev 8219, trunk/data/textures/common/caulk.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/textures/common/clip.tga (from rev 8219, trunk/data/textures/common/clip.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/textures/common/donotenter.tga (from rev 8219, trunk/data/textures/common/donotenter.tga)
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/textures/common/forcecaulk.tga
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/textures/common/full_clip.tga (from rev 8219, trunk/data/textures/common/full_clip.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/textures/common/hint.tga (from rev 8219, trunk/data/textures/common/hint.tga)
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/textures/common/invisible.tga
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/textures/common/nodraw.tga (from rev 8219, trunk/data/textures/common/nodraw.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/textures/common/origin.tga (from rev 8219, trunk/data/textures/common/origin.tga)
===================================================================
(Binary files differ)

Copied: branches/nexuiz-2.0/data/textures/common/trigger.tga (from rev 8219, trunk/data/textures/common/trigger.tga)
===================================================================
(Binary files differ)

Modified: branches/nexuiz-2.0/data/vehicle_racer.cfg
===================================================================
--- branches/nexuiz-2.0/data/vehicle_racer.cfg	2009-11-07 17:16:16 UTC (rev 8222)
+++ branches/nexuiz-2.0/data/vehicle_racer.cfg	2009-11-07 17:17:43 UTC (rev 8223)
@@ -1,15 +1,50 @@
-set g_vehicle_racer_health             250
-set g_vehicle_racer_turnspeed          360
-set g_vehicle_racer_speed_stop         0.1	
-set g_vehicle_racer_speed_forward      2000
-set g_vehicle_racer_speed_strafe       1000
-set g_vehicle_racer_movement_inertia   0.15
+set g_vehicle_racer_reload             1
+
+set g_vehicle_racer_health                250
+
+set g_vehicle_racer_shield                  100
+set g_vehicle_racer_shield_block            1
+set g_vehicle_racer_shield_regen            50
+set g_vehicle_racer_shield_regen_dmgpause   0.25
+set g_vehicle_racer_shield_regen_energyrate 2
+
+set g_vehicle_racer_energy          150
+set g_vehicle_racer_energy_regen    50
+set g_vehicle_racer_energy_usepause 1
+
+set g_vehicle_racer_speed_stop           2000
+set g_vehicle_racer_speed_forward        1600
+set g_vehicle_racer_speed_strafe         750
+
+set g_vehicle_racer_speed_afterburn      3500
+set g_vehicle_racer_speed_afterburn_emin 25
+set g_vehicle_racer_speed_afterburn_cost 100
+
 set g_vehicle_racer_power_air          0
-set g_vehicle_racer_power_solid        5000
+set g_vehicle_racer_power_solid        1000
+
 set g_vehicle_racer_drag               0.25
-set g_vehicle_racer_dragexp            0.75
-set g_vehicle_racer_downforce          0.05
-set g_vehicle_racer_springlength       200
-set g_vehicle_racer_inert              0.25
-set g_vehicle_racer_drag2              0.01
-set g_vehicle_racer_drag2exp           0.85
+set g_vehicle_racer_dragexp            0.9
+
+set g_vehicle_racer_downforce          0.01
+
+set g_vehicle_racer_springlength       150
+set g_vehicle_racer_anglestabilizer    18
+
+set g_vehicle_racer_turnspeed          180
+set g_vehicle_racer_pitchspeed         360
+set g_vehicle_racer_maxpitch           25
+set g_vehicle_racer_turnroll           0.3
+
+set g_vehicle_racer_laser_speed        18000
+set g_vehicle_racer_laser_damage       20
+set g_vehicle_racer_laser_radius       100
+set g_vehicle_racer_laser_refire       0.05
+set g_vehicle_racer_laser_cost         2
+
+set g_vehicle_racer_rocket_speed       1500
+set g_vehicle_racer_rocket_damage      200
+set g_vehicle_racer_rocket_radius      100
+set g_vehicle_racer_rocket_refire      5
+set g_vehicle_racer_rocket_cost        0
+

Modified: branches/nexuiz-2.0/data/vehicle_spiderbot.cfg
===================================================================
--- branches/nexuiz-2.0/data/vehicle_spiderbot.cfg	2009-11-07 17:16:16 UTC (rev 8222)
+++ branches/nexuiz-2.0/data/vehicle_spiderbot.cfg	2009-11-07 17:17:43 UTC (rev 8223)
@@ -1,17 +1,17 @@
-set g_vehicle_spiderbot_respawntime			30
-set g_vehicle_spiderbot_health                  875
-set g_vehicle_spiderbot_health_regen       	10
-set g_vehicle_spiderbot_health_regen_dmgpause   10
+set g_vehicle_spiderbot_respawntime			  30
+set g_vehicle_spiderbot_health                875
+set g_vehicle_spiderbot_health_regen       	  10
+set g_vehicle_spiderbot_health_regen_dmgpause 10
 
-set g_vehicle_spiderbot_shield          125
-set g_vehicle_spiderbot_shield_block    1
-set g_vehicle_spiderbot_shield_regen    25
+set g_vehicle_spiderbot_shield                125
+set g_vehicle_spiderbot_shield_block          1
+set g_vehicle_spiderbot_shield_regen          25
 set g_vehicle_spiderbot_shield_regen_dmgpause 0.25
 
-set g_vehicle_spiderbot_turnspeed       90
-set g_vehicle_spiderbot_head_turnspeed  120
-set g_vehicle_spiderbot_head_turnlimit  120
-set g_vehicle_spiderbot_head_pitchspeed 60
+set g_vehicle_spiderbot_turnspeed            90
+set g_vehicle_spiderbot_head_turnspeed       120
+set g_vehicle_spiderbot_head_turnlimit       120
+set g_vehicle_spiderbot_head_pitchspeed      60
 set g_vehicle_spiderbot_head_pitchlimit_up   8
 set g_vehicle_spiderbot_head_pitchlimit_down -24
 
@@ -20,14 +20,14 @@
 set g_vehicle_spiderbot_speed_strafe       300
 set g_vehicle_spiderbot_movement_inertia   0.25
 
-set g_vehicle_spiderbot_minigun_bulletconstant 200
-set g_vehicle_spiderbot_minigun_damage         20
+set g_vehicle_spiderbot_minigun_damage         25
 set g_vehicle_spiderbot_minigun_spread         0.015
 set g_vehicle_spiderbot_minigun_speed          50000
-set g_vehicle_spiderbot_minigun_refire         0.025
-set g_vehicle_spiderbot_minigun_heat           0.015
-set g_vehicle_spiderbot_minigun_cooldown       0.015
+set g_vehicle_spiderbot_minigun_refire         0.05
 
+set g_vehicle_spiderbot_minigun_heat           10
+set g_vehicle_spiderbot_minigun_cooldown       10
+
 set g_vehicle_spiderbot_rocket_health     100
 set g_vehicle_spiderbot_rocket_damage     75
 set g_vehicle_spiderbot_rocket_edgedamage 15
@@ -44,4 +44,4 @@
 set g_vehicle_spiderbot_crush_force       50
 
 set cl_vehicle_spiderbot_cross_alpha 0.4
-set cl_vehicle_spiderbot_cross_size 1
+set cl_vehicle_spiderbot_cross_size  1



More information about the nexuiz-commits mailing list