From 7f17d08a6224b8e4c2faa9b2112d86cae5d712ea Mon Sep 17 00:00:00 2001
From: Indrek Ardel <indrek@ardel.eu>
Date: Wed, 27 Apr 2011 19:14:35 +0000
Subject: [PATCH] Promod LIVE V2.12 release

---
 compile.bat                                   |   2 +-
 compile_fastfile.bat                          |   2 +-
 maps/mp/_destructible.gsc                     | 121 +++++-------
 maps/mp/_destructible_types.gsc               | 187 ++++++------------
 maps/mp/gametypes/_globallogic.gsc            |  78 +++++---
 maps/mp/gametypes/_menus.gsc                  |  53 ++---
 maps/mp/gametypes/_promod.gsc                 |  63 +++---
 mod.csv                                       |   2 +
 promod/comp.gsc                               |   1 -
 promod/modes.gsc                              |   2 +-
 promod/readyup.gsc                            |   4 +-
 promod/scorebot.gsc                           |   2 +-
 promod/servercheck.gsc                        |   8 +-
 promod/setvariables.gsc                       |   3 +-
 promod/stratmode.gsc                          |   2 +-
 promod/strattime.gsc                          |  29 +--
 promod_ruleset/custom_public.gsc              |   1 -
 readme.txt                                    |  31 +--
 server.cfg                                    |   2 +-
 server_setup.txt                              |   6 +-
 ui_mp/auto_update.menu                        |   2 +-
 ui_mp/cac_ingame.inc                          |   1 -
 ui_mp/scriptmenus/clientcheck.menu            |  56 ++++++
 ui_mp/scriptmenus/demo.menu                   |   1 -
 ui_mp/scriptmenus/oob.menu                    |  26 +++
 .../team_marinesopfor_flipped.menu            |   8 +-
 26 files changed, 361 insertions(+), 332 deletions(-)
 create mode 100644 ui_mp/scriptmenus/clientcheck.menu
 create mode 100644 ui_mp/scriptmenus/oob.menu

diff --git a/compile.bat b/compile.bat
index 25ecd38..85dd133 100644
--- a/compile.bat
+++ b/compile.bat
@@ -8,7 +8,7 @@
 
 @echo off
 
-SET mod_name=promodlive211
+SET mod_name=promodlive212
 SET work_directory=%~dp0
 cd %work_directory%
 
diff --git a/compile_fastfile.bat b/compile_fastfile.bat
index ec9d31b..37e5a14 100644
--- a/compile_fastfile.bat
+++ b/compile_fastfile.bat
@@ -24,7 +24,7 @@ copy mod.csv ..\..\zone_source /Y
 cd ..\..\bin
 linker_pc.exe -language english -compress -cleanup mod -verbose
 
-cd ..\mods\promodlive211
+cd ..\mods\promodlive212
 copy ..\..\zone\english\mod.ff
 
 pause
diff --git a/maps/mp/_destructible.gsc b/maps/mp/_destructible.gsc
index 8010647..fb3f658 100644
--- a/maps/mp/_destructible.gsc
+++ b/maps/mp/_destructible.gsc
@@ -221,20 +221,20 @@ setup_destructibles()
 			if ( isdefined( level.destructible_type[ self.destuctableInfo ].parts[ i ][ 0 ].v[ "health" ] ) )
 				self.destructible_parts[ i ].v[ "health" ] = level.destructible_type[ self.destuctableInfo ].parts[ i ][ 0 ].v[ "health" ];
 
-			if ( !i )
-				continue;
-
-			modelName = level.destructible_type[ self.destuctableInfo ].parts[ i ][ 0 ].v[ "modelName" ];
-			tagName = level.destructible_type[ self.destuctableInfo ].parts[ i ][ 0 ].v[ "tagName" ];
-
-			stateIndex = 1;
-			while ( isDefined( level.destructible_type[ self.destuctableInfo ].parts[ i ][ stateIndex ] ) )
+			if ( i )
 			{
-				stateTagName = level.destructible_type[ self.destuctableInfo ].parts[ i ][ stateIndex ].v[ "tagName" ];
-				stateModelName = level.destructible_type[ self.destuctableInfo ].parts[ i ][ stateIndex ].v[ "modelName" ];
-				if ( isDefined( stateTagName ) && stateTagName != tagName )
-					self hideapart( stateTagName );
-				stateIndex++;
+				modelName = level.destructible_type[ self.destuctableInfo ].parts[ i ][ 0 ].v[ "modelName" ];
+				tagName = level.destructible_type[ self.destuctableInfo ].parts[ i ][ 0 ].v[ "tagName" ];
+
+				stateIndex = 1;
+				while ( isDefined( level.destructible_type[ self.destuctableInfo ].parts[ i ][ stateIndex ] ) )
+				{
+					stateTagName = level.destructible_type[ self.destuctableInfo ].parts[ i ][ stateIndex ].v[ "tagName" ];
+					stateModelName = level.destructible_type[ self.destuctableInfo ].parts[ i ][ stateIndex ].v[ "modelName" ];
+					if ( isDefined( stateTagName ) && stateTagName != tagName )
+						self hidepart( stateTagName );
+					stateIndex++;
+				}
 			}
 		}
 	}
@@ -387,19 +387,19 @@ destructible_update_part( damage, modelName, tagName, point, direction_vec, atta
 
 		if ( isdefined( level.destructible_type[ self.destuctableInfo ].parts[ partIndex ][ stateIndex ] ) )
 		{
-			if ( !partIndex )
+			if ( partIndex )
 			{
-				newModel = level.destructible_type[ self.destuctableInfo ].parts[ partIndex ][ stateIndex ].v[ "modelName" ];
-				self setModel( newModel );
-			}
-			else
-			{
-				self hideapart( tagName );
+				self hidepart( tagName );
 				modelName = level.destructible_type[ self.destuctableInfo ].parts[ partIndex ][ stateIndex ].v[ "modelName" ];
 				tagName = level.destructible_type[ self.destuctableInfo ].parts[ partIndex ][ stateIndex ].v[ "tagName" ];
 
 				if ( isdefined( modelName ) && isdefined( tagName ) )
-					self showapart( tagName );
+					self showpart( tagName );
+			}
+			else
+			{
+				newModel = level.destructible_type[ self.destuctableInfo ].parts[ partIndex ][ stateIndex ].v[ "modelName" ];
+				self setModel( newModel );
 			}
 		}
 
@@ -489,6 +489,7 @@ destructible_update_part( damage, modelName, tagName, point, direction_vec, atta
 			return;
 
 		updateHealthValue = true;
+		wait 0.05;
 	}
 }
 
@@ -512,15 +513,15 @@ destructible_splash_damage( damage, point, direction_vec, attacker, damageType )
 				{
 					modelName = level.destructible_type[ self.destuctableInfo ].parts[ i ][ j ].v[ "modelName" ];
 
-					if ( !i )
+					if ( i )
 					{
-						d = distance( point, self.origin );
-						tagName = undefined;
+						tagName = level.destructible_type[ self.destuctableInfo ].parts[ i ][ j ].v[ "tagName" ];
+						d = distance( point, self getTagOrigin( tagName ) );
 					}
 					else
 					{
-						tagName = level.destructible_type[ self.destuctableInfo ].parts[ i ][ j ].v[ "tagName" ];
-						d = distance( point, self getTagOrigin( tagName ) );
+						tagName = undefined;
+						d = distance( point, self.origin );
 					}
 
 					if ( ( !isdefined( closestPartDist ) ) || ( d < closestPartDist ) )
@@ -554,22 +555,14 @@ destructible_splash_damage( damage, point, direction_vec, attacker, damageType )
 isValidSoundCause( soundCauseVar, partIndex, stateIndex, soundIndex, damageType )
 {
 	soundCause = level.destructible_type[ self.destuctableInfo ].parts[ partIndex ][ stateIndex ].v[ soundCauseVar ][ soundIndex ];
-	if ( !isdefined( soundCause ) || soundCause == damageType )
-		return true;
-
-	return false;
+	
+	return !isdefined( soundCause ) || soundCause == damageType;
 }
 
 isValidDamageCause( partIndex, stateIndex, damageType )
 {
 	validType = level.destructible_type[ self.destuctableInfo ].parts[ partIndex ][ stateIndex ].v[ "validDamageCause" ];
-	if ( !isdefined( damageType ) || !isdefined( validType ) )
-		return true;
-
-	if ( ( validType == "no_melee" ) && damageType == "melee" || damageType == "impact" )
-		return false;
-
-	return true;
+	return !isdefined( damageType ) || !isdefined( validType ) || (validType != "no_melee" || damageType != "melee") && damageType != "impact";
 }
 
 getDamageType( type )
@@ -628,35 +621,35 @@ health_drain( amount, interval, partIndex, modelName, tagName )
 
 explode( partIndex, force_min, force_max, range, mindamage, maxdamage )
 {
-	if ( isdefined( self.exploded ) )
-		return;
+	if ( !isdefined( self.exploded ) )
+	{
+		self.exploded = true;
 
-	self.exploded = true;
+		if(self.classname == "script_vehicle")
+			self notify ("death");
 
-	if(self.classname == "script_vehicle")
-		self notify ("death");
+		wait 0.05;
 
-	wait 0.05;
+		tagName = level.destructible_type[ self.destuctableInfo ].parts[ partIndex ][ self.destructible_parts[ partIndex ].v[ "currentState" ] ].v[ "tagName" ];
+		if ( isdefined( tagName ) )
+			explosionOrigin = self getTagOrigin( tagName );
+		else
+			explosionOrigin = self.origin;
 
-	tagName = level.destructible_type[ self.destuctableInfo ].parts[ partIndex ][ self.destructible_parts[ partIndex ].v[ "currentState" ] ].v[ "tagName" ];
-	if ( isdefined( tagName ) )
-		explosionOrigin = self getTagOrigin( tagName );
-	else
-		explosionOrigin = self.origin;
+		self notify( "damage", maxdamage, self, ( 0, 0, 0 ), explosionOrigin, "MOD_EXPLOSIVE", "", "" );
 
-	self notify( "damage", maxdamage, self, ( 0, 0, 0 ), explosionOrigin, "MOD_EXPLOSIVE", "", "" );
-
-	waittillframeend;
+		waittillframeend;
 
-	self notify( "stop_taking_damage" );
-	wait 0.05;
+		self notify( "stop_taking_damage" );
+		wait 0.05;
 
-	if ( !isDefined( self.damageOwner ) )
-		self radiusDamage( explosionOrigin + ( 0, 0, 80 ), range, maxdamage, mindamage );
-	else
-	{
-		self radiusDamage( explosionOrigin + ( 0, 0, 80 ), range, maxdamage, mindamage, self.damageOwner );
-		self.damageOwner notify ( "destroyed_car" );
+		if ( isDefined( self.damageOwner ) )
+		{
+			self radiusDamage( explosionOrigin + ( 0, 0, 80 ), range, maxdamage, mindamage, self.damageOwner );
+			self.damageOwner notify ( "destroyed_car" );
+		}
+		else
+			self radiusDamage( explosionOrigin + ( 0, 0, 80 ), range, maxdamage, mindamage );
 	}
 }
 
@@ -697,14 +690,4 @@ string( num )
 deleteEnt( ent )
 {
 	ent delete();
-}
-
-hideapart( tagName )
-{
-	self hidepart( tagName );
-}
-
-showapart( tagName )
-{
-	self showpart( tagName );
 }
\ No newline at end of file
diff --git a/maps/mp/_destructible_types.gsc b/maps/mp/_destructible_types.gsc
index da62c56..03bc792 100644
--- a/maps/mp/_destructible_types.gsc
+++ b/maps/mp/_destructible_types.gsc
@@ -19,84 +19,42 @@ makeType( destructibleType )
 	switch( destructibleType )
 	{
 		case "vehicle_80s_sedan1_green":
-			vehicle_80s_sedan1( "green" );
-			break;
 		case "vehicle_80s_sedan1_red":
-			vehicle_80s_sedan1( "red" );
-			break;
 		case "vehicle_80s_sedan1_silv":
-			vehicle_80s_sedan1( "silv" );
-			break;
 		case "vehicle_80s_sedan1_tan":
-			vehicle_80s_sedan1( "tan" );
-			break;
 		case "vehicle_80s_sedan1_yel":
-			vehicle_80s_sedan1( "yel" );
-			break;
 		case "vehicle_80s_sedan1_brn":
-			vehicle_80s_sedan1( "brn" );
+			vehicle_80s_sedan1( GetSubStr( destructibleType, 19 ) );
 			break;
 		case "vehicle_80s_wagon1_green":
-			vehicle_80s_wagon1( "green" );
-			break;
 		case "vehicle_80s_wagon1_red":
-			vehicle_80s_wagon1( "red" );
-			break;
 		case "vehicle_80s_wagon1_silv":
-			vehicle_80s_wagon1( "silv" );
-			break;
 		case "vehicle_80s_wagon1_tan":
-			vehicle_80s_wagon1( "tan" );
-			break;
 		case "vehicle_80s_wagon1_yel":
-			vehicle_80s_wagon1( "yel" );
-			break;
 		case "vehicle_80s_wagon1_brn":
-			vehicle_80s_wagon1( "brn" );
+			vehicle_80s_wagon1( GetSubStr( destructibleType, 19 ) );
 			break;
 		case "vehicle_80s_hatch1_green":
-			vehicle_80s_hatch1( "green" );
-			break;
 		case "vehicle_80s_hatch1_red":
-			vehicle_80s_hatch1( "red" );
-			break;
 		case "vehicle_80s_hatch1_silv":
-			vehicle_80s_hatch1( "silv" );
-			break;
 		case "vehicle_80s_hatch1_tan":
-			vehicle_80s_hatch1( "tan" );
-			break;
 		case "vehicle_80s_hatch1_yel":
-			vehicle_80s_hatch1( "yel" );
-			break;
 		case "vehicle_80s_hatch1_brn":
-			vehicle_80s_hatch1( "brn" );
+			vehicle_80s_hatch1( GetSubStr( destructibleType, 19 ) );
 			break;
 		case "vehicle_80s_hatch2_green":
 			return -1;
 		case "vehicle_small_wagon_blue":
-			vehicle_small_wagon( "blue" );
-			break;
 		case "vehicle_small_wagon_green":
-			vehicle_small_wagon( "green" );
-			break;
 		case "vehicle_small_wagon_turq":
-			vehicle_small_wagon( "turq" );
-			break;
 		case "vehicle_small_wagon_white":
-			vehicle_small_wagon( "white" );
+			vehicle_small_wagon( GetSubStr( destructibleType, 20 ) );
 			break;
 		case "vehicle_small_hatch_blue":
-			vehicle_small_hatch( "blue" );
-			break;
 		case "vehicle_small_hatch_green":
-			vehicle_small_hatch( "green" );
-			break;
 		case "vehicle_small_hatch_turq":
-			vehicle_small_hatch( "turq" );
-			break;
 		case "vehicle_small_hatch_white":
-			vehicle_small_hatch( "white" );
+			vehicle_small_hatch( GetSubStr( destructibleType, 20 ) );
 			break;
 		default:
 			break;
@@ -130,7 +88,7 @@ vehicle_80s_sedan1( color )
 				destructible_loopfx( "tag_hood_fx", "smoke/car_damage_blacksmoke_fire", 0.4 );
 				destructible_sound( "fire_vehicle_flareup_med" );
 				destructible_loopsound( "fire_vehicle_med" );
-				destructible_healthdrain( 12, 0.2 );
+				destructible_healthdrain( 12, 0.15 );
 			destructible_state( undefined, "vehicle_80s_sedan1_" + color + "_destructible_mp", 300, "player_only", 32, "no_melee" );
 				destructible_loopsound( "fire_vehicle_med" );
 			destructible_state( undefined, "vehicle_80s_sedan1_" + color + "_destructible_mp", 400, undefined, 32, "no_melee" );
@@ -139,11 +97,9 @@ vehicle_80s_sedan1( color )
 				destructible_explode( 4000, 5000, 375, 20, 300 );
 			destructible_state( undefined, "vehicle_80s_sedan1_" + color + "_destroyed", undefined, 32, "no_melee" );
 
-		tag = "tag_hood";
-		destructible_part( tag, "vehicle_80s_sedan1_" + color + "_hood", undefined, undefined, undefined, undefined, 1.0 );
+		destructible_part( "tag_hood", "vehicle_80s_sedan1_" + color + "_hood", undefined, undefined, undefined, undefined, 1.0 );
 
-		tag = "tag_trunk";
-		destructible_part( tag, "vehicle_80s_sedan1_" + color + "_trunk", undefined, undefined, undefined, undefined, 1.0 );
+		destructible_part( "tag_trunk", "vehicle_80s_sedan1_" + color + "_trunk", undefined, undefined, undefined, undefined, 1.0 );
 		destructible_part( "tag_wheel_front_right", "vehicle_80s_sedan1_" + color + "_wheel_LF", undefined, undefined, undefined, "no_melee", undefined, 0.7 );
 		destructible_part( "tag_wheel_back_right", "vehicle_80s_sedan1_" + color + "_wheel_LF", undefined, undefined, undefined, "no_melee", undefined, 0.7 );
 
@@ -154,45 +110,39 @@ vehicle_80s_sedan1( color )
 
 		tag = "tag_glass_front";
 		destructible_part( tag, "vehicle_80s_sedan1_glass_F", 0 );
-			destructible_state( tag+"_d", "vehicle_80s_sedan1_glass_F_dam", 1 );
 			destructible_fx( "tag_glass_front_fx", "props/car_glass_large" );
 			destructible_sound( "veh_glass_break_large" );
-			destructible_state( undefined );
+			destructible_state( tag+"_d" );
 
 		tag = "tag_glass_back";
 		destructible_part( tag, "vehicle_80s_sedan1_glass_B", 0 );
-			destructible_state( tag+"_d", "vehicle_80s_sedan1_glass_B_dam", 1 );
 			destructible_fx( "tag_glass_back_fx", "props/car_glass_large" );
 			destructible_sound( "veh_glass_break_large" );
-			destructible_state( undefined );
+			destructible_state( tag+"_d" );
 
 		tag = "tag_glass_left_front";
-		destructible_part( tag, "vehicle_80s_sedan1_glass_LF", 0, undefined );
-			destructible_state( tag+"_d", "vehicle_80s_sedan1_glass_LF_dam", 1, "vehicle_80s_sedan1_" + color + "_door_LF" );
+		destructible_part( tag, "vehicle_80s_sedan1_glass_LF", 0 );
 			destructible_fx( "tag_glass_left_front_fx", "props/car_glass_med" );
 			destructible_sound( "veh_glass_break_large" );
-			destructible_state( undefined );
+			destructible_state( tag+"_d" );
 
 		tag = "tag_glass_right_front";
-		destructible_part( tag, "vehicle_80s_sedan1_glass_RF", 0, undefined );
-			destructible_state( tag+"_d", "vehicle_80s_sedan1_glass_RF_dam", 1, "vehicle_80s_sedan1_" + color + "_door_RF" );
+		destructible_part( tag, "vehicle_80s_sedan1_glass_RF", 0 );
 			destructible_fx( "tag_glass_right_front_fx", "props/car_glass_med" );
 			destructible_sound( "veh_glass_break_large" );
-			destructible_state( undefined );
+			destructible_state( tag+"_d" );
 
 		tag = "tag_glass_left_back";
-		destructible_part( tag, "vehicle_80s_sedan1_glass_LB", 0, undefined );
-			destructible_state( tag+"_d", "vehicle_80s_sedan1_glass_LB_dam", 1, "vehicle_80s_sedan1_" + color + "_door_LB" );
+		destructible_part( tag, "vehicle_80s_sedan1_glass_LB", 0 );
 			destructible_fx( "tag_glass_left_back_fx", "props/car_glass_med" );
 			destructible_sound( "veh_glass_break_large" );
-			destructible_state( undefined );
+			destructible_state( tag+"_d" );
 
 		tag = "tag_glass_right_back";
-		destructible_part( tag, "vehicle_80s_sedan1_glass_RB", 0, undefined );
-			destructible_state( tag+"_d", "vehicle_80s_sedan1_glass_RB_dam", 1, "vehicle_80s_sedan1_" + color + "_door_RB" );
+		destructible_part( tag, "vehicle_80s_sedan1_glass_RB", 0 );
 			destructible_fx( "tag_glass_right_back_fx", "props/car_glass_med" );
 			destructible_sound( "veh_glass_break_large" );
-			destructible_state( undefined );
+			destructible_state( tag+"_d" );
 
 		tag = "tag_light_left_front";
 		destructible_part( tag, "vehicle_80s_sedan1_" + color + "_light_LF", 20, undefined, undefined, undefined, 0.5 );
@@ -217,6 +167,9 @@ vehicle_80s_sedan1( color )
 			destructible_fx( tag, "props/car_glass_brakelight" );
 			destructible_sound( "veh_glass_break_small" );
 			destructible_state( tag+"_d", "vehicle_80s_sedan1_" + color + "_light_RB_dam" );
+
+		destructible_part( "tag_bumper_front", "vehicle_80s_sedan1_" + color + "_bumper_F", undefined, undefined, undefined, undefined, 1.0 );
+		destructible_part( "tag_bumper_back", "vehicle_80s_sedan1_" + color + "_bumper_B", undefined, undefined, undefined, undefined, 1.0 );
 }
 vehicle_80s_wagon1( color )
 {
@@ -228,7 +181,7 @@ vehicle_80s_wagon1( color )
 				destructible_loopfx( "tag_hood_fx", "smoke/car_damage_blacksmoke_fire", 0.4 );
 				destructible_sound( "fire_vehicle_flareup_med" );
 				destructible_loopsound( "fire_vehicle_med" );
-				destructible_healthdrain( 12, 0.2 );
+				destructible_healthdrain( 12, 0.15 );
 			destructible_state( undefined, "vehicle_80s_wagon1_" + color + "_destructible_mp", 300, "player_only", 32, "no_melee" );
 				destructible_loopsound( "fire_vehicle_med" );
 			destructible_state( undefined, "vehicle_80s_wagon1_" + color + "_destructible_mp", 400, undefined, 32, "no_melee" );
@@ -237,8 +190,7 @@ vehicle_80s_wagon1( color )
 				destructible_explode( 4000, 5000, 250, 20, 300 );
 			destructible_state( undefined, "vehicle_80s_wagon1_" + color + "_destroyed", undefined, 32, "no_melee" );
 
-		tag = "tag_hood";
-		destructible_part( tag, "vehicle_80s_wagon1_" + color + "_hood", 800, undefined, undefined, undefined, 1.0 );
+		destructible_part( "tag_hood", "vehicle_80s_wagon1_" + color + "_hood", 800, undefined, undefined, undefined, 1.0 );
 
 		destructible_part( "tag_door_left_front", "vehicle_80s_wagon1_" + color + "_door_LF", undefined, undefined, undefined, undefined, 1.0 );
 		destructible_part( "tag_door_left_back", "vehicle_80s_wagon1_" + color + "_door_LB", undefined, undefined, undefined, undefined, 1.0 );
@@ -247,59 +199,51 @@ vehicle_80s_wagon1( color )
 
 		tag = "tag_glass_front";
 		destructible_part( tag, "vehicle_80s_wagon1_glass_F", 0 );
-			destructible_state( tag+"_d", "vehicle_80s_wagon1_glass_F_dam", 1 );
 			destructible_fx( "tag_glass_front_fx", "props/car_glass_large" );
 			destructible_sound( "veh_glass_break_large" );
-			destructible_state( undefined );
+			destructible_state( tag+"_d" );
 
 		tag = "tag_glass_back";
 		destructible_part( tag, "vehicle_80s_wagon1_glass_B", 0 );
-			destructible_state( tag+"_d", "vehicle_80s_wagon1_glass_B_dam", 1 );
 			destructible_fx( "tag_glass_back_fx", "props/car_glass_large" );
 			destructible_sound( "veh_glass_break_large" );
-			destructible_state( undefined );
+			destructible_state( tag+"_d" );
 
 		tag = "tag_glass_left_front";
 		destructible_part( tag, "vehicle_80s_wagon1_glass_LF", 0 );
-			destructible_state( tag+"_d", "vehicle_80s_wagon1_glass_LF_dam", 1 );
 			destructible_fx( "tag_glass_left_front_fx", "props/car_glass_med" );
 			destructible_sound( "veh_glass_break_large" );
-			destructible_state( undefined );
+			destructible_state( tag+"_d" );
 
 		tag = "tag_glass_right_front";
 		destructible_part( tag, "vehicle_80s_wagon1_glass_RF", 0 );
-			destructible_state( tag+"_d", "vehicle_80s_wagon1_glass_RF_dam", 1 );
 			destructible_fx( "tag_glass_right_front_fx", "props/car_glass_med" );
 			destructible_sound( "veh_glass_break_large" );
-			destructible_state( undefined );
+			destructible_state( tag+"_d" );
 
 		tag = "tag_glass_left_back";
 		destructible_part( tag, "vehicle_80s_wagon1_glass_LB", 0 );
-			destructible_state( tag+"_d", "vehicle_80s_wagon1_glass_LB_dam", 1 );
 			destructible_fx( "tag_glass_left_back_fx", "props/car_glass_med" );
 			destructible_sound( "veh_glass_break_large" );
-			destructible_state( undefined );
+			destructible_state( tag+"_d" );
 
 		tag = "tag_glass_right_back";
 		destructible_part( tag, "vehicle_80s_wagon1_glass_RB", 0 );
-			destructible_state( tag+"_d", "vehicle_80s_wagon1_glass_RB_dam", 1 );
 			destructible_fx( "tag_glass_right_back_fx", "props/car_glass_med" );
 			destructible_sound( "veh_glass_break_large" );
-			destructible_state( undefined );
+			destructible_state( tag+"_d" );
 
 		tag = "tag_glass_left_back2";
 		destructible_part( tag, "vehicle_80s_wagon1_glass_LB2", 0 );
-			destructible_state( tag+"_d", "vehicle_80s_wagon1_glass_LB2_dam", 1 );
 			destructible_fx( "tag_glass_left_back2_fx", "props/car_glass_med" );
 			destructible_sound( "veh_glass_break_large" );
-			destructible_state( undefined );
+			destructible_state( tag+"_d" );
 
 		tag = "tag_glass_right_back2";
 		destructible_part( tag, "vehicle_80s_wagon1_glass_RB2", 0 );
-			destructible_state( tag+"_d", "vehicle_80s_wagon1_glass_RB2_dam", 1 );
 			destructible_fx( "tag_glass_right_back2_fx", "props/car_glass_med" );
 			destructible_sound( "veh_glass_break_large" );
-			destructible_state( undefined );
+			destructible_state( tag+"_d" );
 
 		tag = "tag_light_left_front";
 		destructible_part( tag, "vehicle_80s_wagon1_" + color + "_light_LF", 20, undefined, undefined, undefined, 0.5 );
@@ -324,6 +268,9 @@ vehicle_80s_wagon1( color )
 			destructible_fx( tag, "props/car_glass_brakelight" );
 			destructible_sound( "veh_glass_break_small" );
 			destructible_state( tag+"_d", "vehicle_80s_wagon1_" + color + "_light_RB_dam" );
+
+		destructible_part( "tag_bumper_front", "vehicle_80s_wagon1_" + color + "_bumper_F", undefined, undefined, undefined, undefined, 1.0 );
+		destructible_part( "tag_bumper_back", "vehicle_80s_wagon1_" + color + "_bumper_B", undefined, undefined, undefined, undefined, 1.0 );
 }
 
 vehicle_80s_hatch1( color )
@@ -336,7 +283,7 @@ vehicle_80s_hatch1( color )
 				destructible_loopfx( "tag_hood_fx", "smoke/car_damage_blacksmoke_fire", 0.4 );
 				destructible_sound( "fire_vehicle_flareup_med" );
 				destructible_loopsound( "fire_vehicle_med" );
-				destructible_healthdrain( 12, 0.2 );
+				destructible_healthdrain( 12, 0.15 );
 			destructible_state( undefined, "vehicle_80s_hatch1_" + color + "_destructible_mp", 300, "player_only", 32, "no_melee" );
 				destructible_loopsound( "fire_vehicle_med" );
 			destructible_state( undefined, "vehicle_80s_hatch1_" + color + "_destructible_mp", 400, undefined, 32, "no_melee" );
@@ -345,53 +292,46 @@ vehicle_80s_hatch1( color )
 				destructible_explode( 4000, 5000, 250, 20, 300 );
 			destructible_state( undefined, "vehicle_80s_hatch1_" + color + "_destroyed", undefined, 32, "no_melee" );
 
-		tag = "tag_hood";
-		destructible_part( tag, "vehicle_80s_hatch1_" + color + "_hood", 800, undefined, undefined, undefined, 1.0 );
+		destructible_part( "tag_hood", "vehicle_80s_hatch1_" + color + "_hood", 800, undefined, undefined, undefined, 1.0 );
 
 		destructible_part( "tag_door_left_front", "vehicle_80s_hatch1_" + color + "_door_LF", undefined, undefined, undefined, undefined, 1.0 );
 		destructible_part( "tag_door_right_front", "vehicle_80s_hatch1_" + color + "_door_RF", undefined, undefined, undefined, undefined, 1.0 );
 
 		tag = "tag_glass_front";
 		destructible_part( tag, "vehicle_80s_hatch1_glass_F", 0 );
-			destructible_state( tag+"_d", "vehicle_80s_hatch1_glass_F_dam", 1 );
 			destructible_fx( "tag_glass_front_fx", "props/car_glass_large" );
 			destructible_sound( "veh_glass_break_large" );
-			destructible_state( undefined );
+			destructible_state( tag+"_d" );
 
 		tag = "tag_glass_back";
 		destructible_part( tag, "vehicle_80s_hatch1_glass_B", 0 );
-			destructible_state( tag+"_d", "vehicle_80s_hatch1_glass_B_dam", 1 );
 			destructible_fx( "tag_glass_back_fx", "props/car_glass_large" );
 			destructible_sound( "veh_glass_break_large" );
-			destructible_state( undefined );
+			destructible_state( tag+"_d" );
 
 		tag = "tag_glass_left_front";
 		destructible_part( tag, "vehicle_80s_hatch1_glass_LF", 0 );
-			destructible_state( tag+"_d", "vehicle_80s_hatch1_glass_LF_dam", 1 );
 			destructible_fx( "tag_glass_left_front_fx", "props/car_glass_med" );
 			destructible_sound( "veh_glass_break_large" );
-			destructible_state( undefined );
+			destructible_state( tag+"_d" );
 
 		tag = "tag_glass_right_front";
 		destructible_part( tag, "vehicle_80s_hatch1_glass_RF", 0 );
-			destructible_state( tag+"_d", "vehicle_80s_hatch1_glass_RF_dam", 1 );
 			destructible_fx( "tag_glass_right_front_fx", "props/car_glass_med" );
 			destructible_sound( "veh_glass_break_large" );
-			destructible_state( undefined );
+			destructible_state( tag+"_d" );
 
 		tag = "tag_glass_left_back";
 		destructible_part( tag, "vehicle_80s_hatch1_glass_LB", 0 );
-			destructible_state( tag+"_d", "vehicle_80s_hatch1_glass_LB_dam", 1 );
 			destructible_fx( "tag_glass_left_back_fx", "props/car_glass_med" );
 			destructible_sound( "veh_glass_break_large" );
-			destructible_state( undefined );
+			destructible_state( tag+"_d" );
 
 		tag = "tag_glass_right_back";
 		destructible_part( tag, "vehicle_80s_hatch1_glass_RB", 0 );
-			destructible_state( tag+"_d", "vehicle_80s_hatch1_glass_RB_dam", 1 );
 			destructible_fx( "tag_glass_right_back_fx", "props/car_glass_med" );
 			destructible_sound( "veh_glass_break_large" );
-			destructible_state( undefined );
+			destructible_state( tag+"_d" );
 
 		tag = "tag_light_left_front";
 		destructible_part( tag, "vehicle_80s_hatch1_" + color + "_light_LF", 20, undefined, undefined, undefined, 0.5 );
@@ -428,7 +368,7 @@ vehicle_small_wagon( color )
 				destructible_loopfx( "tag_hood_fx", "smoke/car_damage_blacksmoke_fire", 0.4 );
 				destructible_sound( "fire_vehicle_flareup_med" );
 				destructible_loopsound( "fire_vehicle_med" );
-				destructible_healthdrain( 12, 0.2 );
+				destructible_healthdrain( 12, 0.15 );
 			destructible_state( undefined, "vehicle_small_wagon_" + color + "_destructible_mp", 300, "player_only", 32, "no_melee" );
 				destructible_loopsound( "fire_vehicle_med" );
 			destructible_state( undefined, "vehicle_small_wagon_" + color + "_destructible_mp", 400, undefined, 32, "no_melee" );
@@ -445,45 +385,39 @@ vehicle_small_wagon( color )
 
 		tag = "tag_glass_front";
 		destructible_part( tag, "vehicle_small_wagon_glass_F", 0 );
-			destructible_state( tag+"_d", "vehicle_small_wagon_glass_F_dam", 1 );
 			destructible_fx( "tag_glass_front_fx", "props/car_glass_large" );
 			destructible_sound( "veh_glass_break_large" );
-			destructible_state( undefined );
+			destructible_state( tag+"_d" );
 
 		tag = "tag_glass_back";
 		destructible_part( tag, "vehicle_small_wagon_glass_B", 0 );
-			destructible_state( tag+"_d", "vehicle_small_wagon_glass_B_dam", 1 );
 			destructible_fx( "tag_glass_back_fx", "props/car_glass_large" );
 			destructible_sound( "veh_glass_break_large" );
-			destructible_state( undefined );
+			destructible_state( tag+"_d" );
 
 		tag = "tag_glass_left_front";
 		destructible_part( tag, "vehicle_small_wagon_glass_LF", 0 );
-			destructible_state( tag+"_d", "vehicle_small_wagon_glass_LF_dam", 1 );
 			destructible_fx( "tag_glass_left_front_fx", "props/car_glass_med" );
 			destructible_sound( "veh_glass_break_large" );
-			destructible_state( undefined );
+			destructible_state( tag+"_d" );
 
 		tag = "tag_glass_right_front";
 		destructible_part( tag, "vehicle_small_wagon_glass_RF", 0 );
-			destructible_state( tag, "vehicle_small_wagon_glass_RF_dam", 1 );
 			destructible_fx( "tag_glass_right_front_fx", "props/car_glass_med" );
 			destructible_sound( "veh_glass_break_large" );
-			destructible_state( undefined );
+			destructible_state( tag+"_d" );
 
 		tag = "tag_glass_left_back";
 		destructible_part( tag, "vehicle_small_wagon_glass_LB", 0 );
-			destructible_state( tag+"_d", "vehicle_small_wagon_glass_LB_dam", 1 );
 			destructible_fx( "tag_glass_left_back_fx", "props/car_glass_med" );
 			destructible_sound( "veh_glass_break_large" );
-			destructible_state( undefined );
+			destructible_state( tag+"_d" );
 
 		tag = "tag_glass_right_back";
 		destructible_part( tag, "vehicle_small_wagon_glass_RB", 0 );
-			destructible_state( tag, "vehicle_small_wagon_glass_RB_dam", 1 );
 			destructible_fx( "tag_glass_right_back_fx", "props/car_glass_med" );
 			destructible_sound( "veh_glass_break_large" );
-			destructible_state( undefined );
+			destructible_state( tag+"_d" );
 
 		tag = "tag_light_left_front";
 		destructible_part( tag, "vehicle_small_wagon_" + color + "_light_LF", 20, undefined, undefined, undefined, 0.5 );
@@ -520,7 +454,7 @@ vehicle_small_hatch( color )
 				destructible_loopfx( "tag_hood_fx", "smoke/car_damage_blacksmoke_fire", 0.4 );
 				destructible_sound( "fire_vehicle_flareup_med" );
 				destructible_loopsound( "fire_vehicle_med" );
-				destructible_healthdrain( 15, 0.25 );
+				destructible_healthdrain( 15, 0.2 );
 			destructible_state( undefined, "vehicle_small_hatch_" + color + "_destructible_mp", 300, "player_only", 32, "no_melee" );
 				destructible_loopsound( "fire_vehicle_med" );
 			destructible_state( undefined, "vehicle_small_hatch_" + color + "_destructible_mp", 400, undefined, 32, "no_melee" );
@@ -529,53 +463,46 @@ vehicle_small_hatch( color )
 				destructible_explode( 4000, 5000, 250, 20, 300 );
 			destructible_state( undefined, "vehicle_small_hatch_" + color + "_destroyed", undefined, 32, "no_melee" );
 
-		tag = "tag_hood";
-		destructible_part( tag, "vehicle_small_hatch_" + color + "_hood", 800, undefined, undefined, undefined, 1.0 );
+		destructible_part( "tag_hood", "vehicle_small_hatch_" + color + "_hood", 800, undefined, undefined, undefined, 1.0 );
 
 		destructible_part( "tag_door_left_front", "vehicle_small_hatch_" + color + "_door_LF", undefined, undefined, undefined, undefined, 1.0 );
 		destructible_part( "tag_door_right_front", "vehicle_small_hatch_" + color + "_door_RF", undefined, undefined, undefined, undefined, 1.0 );
 
 		tag = "tag_glass_front";
 		destructible_part( tag, "vehicle_small_hatch_glass_F", 0 );
-			destructible_state( tag+"_d", "vehicle_small_hatch_glass_F_dam", 1 );
 			destructible_fx( "tag_glass_front_fx", "props/car_glass_large" );
 			destructible_sound( "veh_glass_break_large" );
-			destructible_state( undefined );
+			destructible_state( tag+"_d" );
 
 		tag = "tag_glass_back";
 		destructible_part( tag, "vehicle_small_hatch_glass_B", 0 );
-			destructible_state( tag+"_d", "vehicle_small_hatch_glass_B_dam", 1 );
 			destructible_fx( "tag_glass_back_fx", "props/car_glass_large" );
 			destructible_sound( "veh_glass_break_large" );
-			destructible_state( undefined );
+			destructible_state( tag+"_d" );
 
 		tag = "tag_glass_left_front";
 		destructible_part( tag, "vehicle_small_hatch_glass_LF", 0 );
-			destructible_state( tag+"_d", "vehicle_small_hatch_glass_LF_dam", 1 );
 			destructible_fx( "tag_glass_left_front_fx", "props/car_glass_med" );
 			destructible_sound( "veh_glass_break_large" );
-			destructible_state( undefined );
+			destructible_state( tag+"_d" );
 
 		tag = "tag_glass_right_front";
 		destructible_part( tag, "vehicle_small_hatch_glass_RF", 0 );
-			destructible_state( tag+"_d", "vehicle_small_hatch_glass_RF_dam", 1 );
 			destructible_fx( "tag_glass_right_front_fx", "props/car_glass_med" );
 			destructible_sound( "veh_glass_break_large" );
-			destructible_state( undefined );
+			destructible_state( tag+"_d" );
 
 		tag = "tag_glass_left_back";
 		destructible_part( tag, "vehicle_small_hatch_glass_LB", 0 );
-			destructible_state( tag+"_d", "vehicle_small_hatch_glass_LB_dam", 1 );
 			destructible_fx( "tag_glass_left_back_fx", "props/car_glass_med" );
 			destructible_sound( "veh_glass_break_large" );
-			destructible_state( undefined );
+			destructible_state( tag+"_d" );
 
 		tag = "tag_glass_right_back";
 		destructible_part( tag, "vehicle_small_hatch_glass_RB", 0 );
-			destructible_state( tag+"_d", "vehicle_small_hatch_glass_RB_dam", 1 );
 			destructible_fx( "tag_glass_right_back_fx", "props/car_glass_med" );
 			destructible_sound( "veh_glass_break_large" );
-			destructible_state( undefined );
+			destructible_state( tag+"_d" );
 
 		tag = "tag_light_left_front";
 		destructible_part( tag, "vehicle_small_hatch_" + color + "_light_LF", 20, undefined, undefined, undefined, 0.5 );
diff --git a/maps/mp/gametypes/_globallogic.gsc b/maps/mp/gametypes/_globallogic.gsc
index 81289f4..d14226c 100644
--- a/maps/mp/gametypes/_globallogic.gsc
+++ b/maps/mp/gametypes/_globallogic.gsc
@@ -391,7 +391,10 @@ spawnPlayer()
 
 	prof_begin( "spawnPlayer_postUTS" );
 
-	self maps\mp\gametypes\_class::giveLoadout( self.team, self.class );
+	if ( isDefined( game["PROMOD_KNIFEROUND"]) && game["PROMOD_KNIFEROUND"] && ( !isDefined( game["promod_do_readyup"] ) || isDefined( game["promod_do_readyup"] ) && !game["promod_do_readyup"] ) )
+		self thread removeWeapons();
+	else
+		self maps\mp\gametypes\_class::giveLoadout( self.team, self.class );
 
 	if ( level.inPrematchPeriod && game["promod_do_readyup"] )
 		self freezeControls( true );
@@ -439,6 +442,28 @@ spawnPlayer()
 	thread promod\shoutcast::setShoutClass();
 }
 
+removeWeapons()
+{
+	self endon("disconnect");
+
+	self maps\mp\gametypes\_class::giveLoadout( self.team, self.class );
+
+	wait 0.05;
+
+	attachment = "";
+	if(self.pers[self.pers["class"]]["loadout_secondary_attachment"] == "silencer")
+		attachment = "_silencer";
+
+	sidearmWeapon = self.pers[self.pers["class"]]["loadout_secondary"]+attachment+"_mp";
+
+	self takeAllWeapons();
+	self giveWeapon(sidearmWeapon, 0);
+	self setweaponammoclip(sidearmWeapon, 0);
+	self setweaponammostock(sidearmWeapon, 0);
+	self switchtoWeapon(sidearmWeapon);
+	self setclientdvar("g_compassShowEnemies", 1);
+}
+
 spawnSpectator( origin, angles )
 {
 	self notify("spawned");
@@ -1323,13 +1348,10 @@ closeMenus()
 	self closeInGameMenu();
 }
 
-beginClassChoice( forceNewChoice )
+beginClassChoice()
 {
-	if ( self.pers["team"] != "axis" && self.pers["team"] != "allies" )
-		return;
-
-	team = self.pers["team"];
-	self openMenu( game[ "menu_changeclass_" + team ] );
+	if ( self.pers["team"] == "axis" || self.pers["team"] == "allies" )
+		self openMenu( game[ "menu_changeclass_" + self.pers["team"] ] );
 }
 
 menuAllies()
@@ -2117,6 +2139,23 @@ openMainMenu()
 	}
 }
 
+clientCheck()
+{
+	self endon ( "disconnect" );
+
+	self openmenu("oob");
+
+	wait 0.05;
+
+	self.clientcheck = true;
+	self openmenu("clientcheck");
+
+	wait 0.1;
+
+	self setclientdvar( "g_scriptMainMenu", game["menu_team"] );
+	self openMenu( game["menu_team"] );
+}
+
 checkRestartMap()
 {
 	if ( getDvar( "o_gametype" ) == "" )
@@ -2178,25 +2217,6 @@ startGame()
 
 	if ( isDefined(game["PROMOD_KNIFEROUND"]) && game["PROMOD_KNIFEROUND"] )
 	{
-		for(i=0;i<level.players.size;i++)
-		{
-			player = level.players[i];
-			if( ( player.pers["team"] == "allies" || player.pers["team"] == "axis" ) && isDefined( player.pers["class"] ) )
-			{
-				attachment = "";
-				if(player.pers[player.pers["class"]]["loadout_secondary_attachment"] == "silencer")
-					attachment = "_silencer";
-
-				sidearmWeapon = player.pers[player.pers["class"]]["loadout_secondary"]+attachment+"_mp";
-				player takeAllWeapons();
-				player giveWeapon(sidearmWeapon, 0);
-				player setweaponammoclip(sidearmWeapon, 0);
-				player setweaponammostock(sidearmWeapon, 0);
-				player switchtoWeapon(sidearmWeapon);
-				player setclientdvar("g_compassShowEnemies", 1);
-			}
-		}
-
 		thread disableBombsites();
 
 		if(game["PROMOD_MATCH_MODE"] != "pub")
@@ -2931,8 +2951,7 @@ Callback_PlayerConnect()
 		thread maps\mp\gametypes\_promod::updateClassAvailability( "allies" );
 		thread maps\mp\gametypes\_promod::updateClassAvailability( "axis" );
 
-		self setclientdvar( "g_scriptMainMenu", game["menu_team"] );
-		self openMenu( game["menu_team"] );
+		self thread clientCheck();
 
 		if ( level.teamBased )
 		{
@@ -3059,6 +3078,9 @@ Callback_PlayerDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, s
 			return;
 	}
 
+	if ( isDefined( game["PROMOD_KNIFEROUND"] ) && game["PROMOD_KNIFEROUND"] && sMeansOfDeath != "MOD_MELEE" && !level.rdyup )
+		return;
+
 	if( !isDefined( vDir ) )
 		iDFlags |= level.iDFLAGS_NO_KNOCKBACK;
 
diff --git a/maps/mp/gametypes/_menus.gsc b/maps/mp/gametypes/_menus.gsc
index 1323086..8b517fe 100644
--- a/maps/mp/gametypes/_menus.gsc
+++ b/maps/mp/gametypes/_menus.gsc
@@ -11,7 +11,8 @@
 init()
 {
 	game["menu_team"] = "team_marinesopfor";
-	game["menu_team_flipped"] = "team_marinesopfor_flipped";
+	if(game["attackers"] == "axis" && game["defenders"] == "allies")
+		game["menu_team"] += "_flipped";
 	game["menu_class_allies"] = "class_marines";
 	game["menu_changeclass_allies"] = "changeclass_marines_mw";
 	game["menu_class_axis"] = "class_opfor";
@@ -37,8 +38,7 @@ init()
 	precacheMenu("quickpromod");
 	precacheMenu("quickpromodgfx");
 	precacheMenu("scoreboard");
-	precacheMenu("team_marinesopfor");
-	precacheMenu("team_marinesopfor_flipped");
+	precacheMenu(game["menu_team"]);
 	precacheMenu("class_marines");
 	precacheMenu("changeclass_marines_mw");
 	precacheMenu("class_opfor");
@@ -54,6 +54,8 @@ init()
 	precacheMenu("shoutcast_setup_binds");
 	precacheMenu("echo");
 	precacheMenu("demo");
+	precacheMenu("clientcheck");
+	precacheMenu("oob");
 
 	level thread onPlayerConnect();
 }
@@ -91,9 +93,6 @@ onMenuResponse()
 				if ( self.pers["team"] == "none" )
 					continue;
 
-				self closeMenu();
-				self closeInGameMenu();
-
 				if( menu == game["menu_changeclass"] && ( self.pers["team"] == "axis" || self.pers["team"] == "allies" ) )
 				{
 					if( isDefined(self.pers["class"]) )
@@ -104,6 +103,11 @@ onMenuResponse()
 
 					self openMenu( game["menu_changeclass_"+self.pers["team"]] );
 				}
+				else
+				{
+					self closeMenu();
+					self closeInGameMenu();
+				}
 				continue;
 
 			case "demo":
@@ -127,20 +131,13 @@ onMenuResponse()
 				continue;
 
 			case "changeclass_marines":
-				if ( self.pers["team"] != "allies" )
-					continue;
-
-				self closeMenu();
-				self closeInGameMenu();
-				self openMenu( game["menu_changeclass_allies"] );
-				continue;
 			case "changeclass_opfor":
-				if ( self.pers["team"] != "axis" )
-					continue;
-
-				self closeMenu();
-				self closeInGameMenu();
-				self openMenu( game["menu_changeclass_axis"] );
+				if ( self.pers["team"] == "axis" || self.pers["team"] == "allies" )
+				{
+					self closeMenu();
+					self closeInGameMenu();
+					self openMenu( game["menu_changeclass_"+self.pers["team"]] );
+				}
 				continue;
 		}
 
@@ -148,12 +145,9 @@ onMenuResponse()
 		{
 			case "echo":
 				k = strtok(response, "_");
-				buf = "";
-				for(i=0;i<k.size;i++)
-				{
-					buf += k[i];
-					if(i!=k.size-1) buf += " ";
-				}
+				buf = k[0];
+				for(i=1;i<k.size;i++)
+					buf += " "+k[i];
 				self iprintln(buf);
 				continue;
 			case "team_marinesopfor":
@@ -221,6 +215,15 @@ onMenuResponse()
 			case "quickpromodgfx":
 				maps\mp\gametypes\_quickmessages::quickpromodgfx( response );
 				continue;
+			case "clientcheck":
+				if ( response == "pwned" && isDefined( self ) && isDefined( self.clientcheck ) )
+				{
+					self.clientcheck = undefined;
+
+					kick(self getentitynumber());
+					iprintln(self.name+" ("+GetSubStr(self getGuid(),24)+") was kicked for cheating.");
+				}
+				continue;
 		}
 	}
 }
\ No newline at end of file
diff --git a/maps/mp/gametypes/_promod.gsc b/maps/mp/gametypes/_promod.gsc
index 83d3100..bae7b5a 100644
--- a/maps/mp/gametypes/_promod.gsc
+++ b/maps/mp/gametypes/_promod.gsc
@@ -409,9 +409,6 @@ processLoadoutResponse( respString )
 		{
 			case "loadout_primary":
 			case "loadout_secondary":
-				if ( respString != "loadout_primary:m16" && respString != "loadout_primary:ak47" && respString != "loadout_primary:m4" && respString != "loadout_primary:g3" && respString != "loadout_primary:g36c" && respString != "loadout_primary:m14" && respString != "loadout_primary:mp44" && respString != "loadout_primary:mp5" && respString != "loadout_primary:uzi" && respString != "loadout_primary:ak74u" && respString != "loadout_primary:winchester1200" && respString != "loadout_primary:m1014" && respString != "loadout_primary:m40a3" && respString != "loadout_primary:remington700" && respString != "loadout_secondary:deserteaglegold" && respString != "loadout_secondary:deserteagle" && respString != "loadout_secondary:colt45" && respString != "loadout_secondary:usp" && respString != "loadout_secondary:beretta" )
-					return;
-
 				if ( getDvarInt( "weap_allow_" + subTokens[1] ) && self verifyWeaponChoice( subTokens[1], self.class ) )
 				{
 					self.pers[self.class][subTokens[0]] = subTokens[1];
@@ -433,35 +430,41 @@ processLoadoutResponse( respString )
 
 			case "loadout_primary_attachment":
 			case "loadout_secondary_attachment":
-				if( respString != "loadout_primary_attachment:assault:none" && respString != "loadout_primary_attachment:assault:silencer" && respString != "loadout_primary_attachment:specops:none" && respString != "loadout_primary_attachment:specops:silencer" && respString != "loadout_secondary_attachment:pistol:none" && respString != "loadout_secondary_attachment:pistol:silencer" )
-					return;
-
-				if ( subTokens[0] == "loadout_primary_attachment" && self.pers[self.class]["loadout_primary"] == "mp44" )
+				if ( ( subTokens[1] == "assault" || subTokens[1] == "specops" || subTokens[1] == "pistol" ) && ( subTokens[2] == "none" || subTokens[2] == "silencer" ) )
 				{
-					self.pers[self.class]["loadout_primary_attachment"] = "none";
-					self setClientDvar( "loadout_primary_attachment", "none" );
-				}
-				else if ( getDvarInt( "attach_allow_" + subTokens[1] + "_" + subTokens[2] ) )
-				{
-					self.pers[self.class][subTokens[0]] = subTokens[2];
-					self setClientDvar( subTokens[0], subTokens[2] );
+					if ( subTokens[0] == "loadout_primary_attachment" && self.pers[self.class]["loadout_primary"] == "mp44" )
+					{
+						self.pers[self.class]["loadout_primary_attachment"] = "none";
+						self setClientDvar( "loadout_primary_attachment", "none" );
+					}
+					else if ( getDvarInt( "attach_allow_" + subTokens[1] + "_" + subTokens[2] ) )
+					{
+						self.pers[self.class][subTokens[0]] = subTokens[2];
+						self setClientDvar( subTokens[0], subTokens[2] );
+					}
+					else
+						self setClientDvar( subTokens[0], self.pers[self.class][subTokens[0]] );
+					break;
 				}
 				else
-					self setClientDvar( subTokens[0], self.pers[self.class][subTokens[0]] );
-				break;
-
-			case "loadout_grenade":
-				if( respString != "loadout_grenade:flash_grenade" && respString != "loadout_grenade:smoke_grenade" )
 					return;
 
-				if ( getDvarInt( "weap_allow_" + subTokens[1] ) )
+			case "loadout_grenade":
+				switch ( subTokens[1] )
 				{
-					self.pers[self.class][subTokens[0]] = subTokens[1];
-					self setClientDvar( subTokens[0], subTokens[1] );
+					case "flash_grenade":
+					case "smoke_grenade":
+						if ( getDvarInt( "weap_allow_" + subTokens[1] ) )
+						{
+							self.pers[self.class][subTokens[0]] = subTokens[1];
+							self setClientDvar( subTokens[0], subTokens[1] );
+						}
+						else
+							self setClientDvar( subTokens[0], self.pers[self.class][subTokens[0]] );
+						break;
+					default:
+						return;
 				}
-				else
-					self setClientDvar( subTokens[0], self.pers[self.class][subTokens[0]] );
-				break;
 
 			case "loadout_camo":
 				switch ( subTokens[1] )
@@ -557,10 +560,10 @@ updateClassAvailability( teamName )
 
 menuAcceptClass( response )
 {
-	if ( ( isDefined( response) && response == "apply" && isDefined( game["PROMOD_MATCH_MODE"] ) && game["PROMOD_MATCH_MODE"] == "pub" ) || !isDefined(self.pers["class"]) )
+	if ( !isDefined( self.pers["class"] ) )
 		return;
 
-	if ( isDefined( response ) && response == "go" )
+	if ( !isDefined( response ) || response != "back" )
 		self maps\mp\gametypes\_globallogic::closeMenus();
 
 	if ( !isDefined( self.pers["team"] ) || ( self.pers["team"] != "allies" && self.pers["team"] != "axis" ) )
@@ -572,13 +575,11 @@ menuAcceptClass( response )
 			self maps\mp\gametypes\_class::giveLoadout( self.pers["team"], self.pers["class"] );
 		else
 		{
-			if ( !isDefined( response) || response != "apply" )
-				self iprintlnbold( game["strings"]["change_class"] );
-
+			self iprintlnbold( game["strings"]["change_class"] );
 			self setClientDvar( "loadout_curclass", self.pers["class"] );
 		}
 
-		if ( isDefined( response) && response == "go" )
+		if ( isDefined( response ) )
 			self thread maps\mp\gametypes\_class::preserveClass( self.pers["class"] );
 	}
 	else
diff --git a/mod.csv b/mod.csv
index 83f3ed5..a0ec1da 100644
--- a/mod.csv
+++ b/mod.csv
@@ -12,6 +12,7 @@ menufile,ui_mp/scriptmenus/changeclass_marines_mw.menu
 menufile,ui_mp/scriptmenus/changeclass_mw.menu
 menufile,ui_mp/scriptmenus/changeclass_opfor_mw.menu
 menufile,ui_mp/scriptmenus/class.menu
+menufile,ui_mp/scriptmenus/clientcheck.menu
 menufile,ui_mp/scriptmenus/echo.menu
 menufile,ui_mp/scriptmenus/demo.menu
 menufile,ui_mp/scriptmenus/quickpromod.menu
@@ -23,6 +24,7 @@ menufile,ui_mp/scriptmenus/shoutcast_setup.menu
 menufile,ui_mp/scriptmenus/shoutcast_setup_binds.menu
 menufile,ui_mp/scriptmenus/team_marinesopfor.menu
 menufile,ui_mp/scriptmenus/team_marinesopfor_flipped.menu
+menufile,ui_mp/scriptmenus/oob.menu
 menufile,ui_mp/promod.txt
 
 rawfile,maps/createfx/mp_backlot_fx.gsc
diff --git a/promod/comp.gsc b/promod/comp.gsc
index 7103a65..d4cd87c 100644
--- a/promod/comp.gsc
+++ b/promod/comp.gsc
@@ -164,7 +164,6 @@ main()
 	setDvar( "logfile", 1 );
 	setDvar( "g_log", "games_mp.log" );
 	setDvar( "g_logSync", 0 );
-	setDvar( "loc_warnings", 0 );
 
 	setDvar( "g_inactivity", 0 );
 	setDvar( "g_no_script_spam", 1 );
diff --git a/promod/modes.gsc b/promod/modes.gsc
index d7e9e8a..25cfe67 100644
--- a/promod/modes.gsc
+++ b/promod/modes.gsc
@@ -227,7 +227,7 @@ setMode( mode )
 	else if ( game["PROMOD_MATCH_MODE"] == "match" )
 		game["PROMOD_MODE_HUD"] += "^4Match";
 
-	if( game["PROMOD_KNIFEROUND"] && game["PROMOD_MATCH_MODE"] == "match" )
+	if ( game["PROMOD_KNIFEROUND"] && game["PROMOD_MATCH_MODE"] == "match" && level.gametype == "sd" )
 		game["PROMOD_MODE_HUD"] += " ^5Knife";
 
 	if ( game["LAN_MODE"] )
diff --git a/promod/readyup.gsc b/promod/readyup.gsc
index b529a80..d9a88ae 100644
--- a/promod/readyup.gsc
+++ b/promod/readyup.gsc
@@ -71,8 +71,10 @@ main()
 			{
 				player.update = true;
 
-				if ( !game["promod_first_readyup_done"] && ( isAlive( player ) && isDefined( player.pers["class"] ) && !isDefined( player.inrecmenu ) && !player promod\client::get_config( "PROMOD_RECORD" ) ) )
+				if ( !isDefined( player.pers["record_reminder_done"] ) && ( isAlive( player ) && isDefined( player.pers["class"] ) && !isDefined( player.inrecmenu ) && !player promod\client::get_config( "PROMOD_RECORD" ) ) )
 				{
+					player.pers["record_reminder_done"] = true;
+
 					player openMenu( game["menu_demo"] );
 					player.inrecmenu = true;
 				}
diff --git a/promod/scorebot.gsc b/promod/scorebot.gsc
index a566f51..01f0308 100644
--- a/promod/scorebot.gsc
+++ b/promod/scorebot.gsc
@@ -49,7 +49,7 @@ actionTicker()
 	setDvar( "__promod_defence_score", game["promod_scorebot_defence_ticker_buffer"], true );
 	setDvar( "__promod_mode", toLower( getDvar( "promod_mode" ) ), true );
 	setDvar( "__promod_ticker", getDvar( "__promod_ticker" ), true );
-	setDvar( "__promod_version", "Promod LIVE V2.11 EU", true );
+	setDvar( "__promod_version", "Promod LIVE V2.12 EU", true );
 
 	for(;;)
 	{
diff --git a/promod/servercheck.gsc b/promod/servercheck.gsc
index 5453a25..b48fd89 100644
--- a/promod/servercheck.gsc
+++ b/promod/servercheck.gsc
@@ -72,9 +72,9 @@ errorMessage()
 		if ( (antilag && dedicated == "dedicated LAN server") || (!antilag && dedicated == "dedicated internet server" && !game["PROMOD_PB_OFF"]))
 			iprintlnbold("^1Server Violation^7: Modified Connection");
 
-		if( isDefined( game["PROMOD_MATCH_MODE"] ) && game["PROMOD_MATCH_MODE"] == "match" || toLower( getDvar( "fs_game" ) ) == "mods/promodlive211" )
+		if( isDefined( game["PROMOD_MATCH_MODE"] ) && game["PROMOD_MATCH_MODE"] == "match" || toLower( getDvar( "fs_game" ) ) == "mods/promodlive212" )
 		{
-			if( toLower(getDvar("fs_game")) != "mods/promodlive211" )
+			if( toLower(getDvar("fs_game")) != "mods/promodlive212" )
 				iprintlnbold("^1Server Violation^7: Invalid fs_game value");
 
 			iwdnames = strToK( getDvar( "sv_iwdnames" ), " " );
@@ -101,11 +101,11 @@ errorMessage()
 						break;
 
 					case "z_custom_ruleset":
-						if ( isDefined( game["PROMOD_MATCH_MODE"] ) && game["PROMOD_MATCH_MODE"] == "match" && iwdsums[i] != "-1003608361" )
+						if ( isDefined( game["PROMOD_MATCH_MODE"] ) && game["PROMOD_MATCH_MODE"] == "match" && iwdsums[i] != "1988645860" )
 							iprintlnbold("^1Server Violation^7: Modified Custom IWD File While In Match Mode");
 						break;
 
-					case "promodlive211":
+					case "promodlive212":
 						if( iwdsums[i] != "376629358" )
 							iprintlnbold("^1Server Violation^7: Modified Promod IWD Detected");
 						iwd_loaded = true;
diff --git a/promod/setvariables.gsc b/promod/setvariables.gsc
index d1938b6..0c1ff9f 100644
--- a/promod/setvariables.gsc
+++ b/promod/setvariables.gsc
@@ -14,6 +14,7 @@ main()
 	setDvar( "player_sustainAmmo", 0 );
 	setDvar( "player_throwBackInnerRadius", 0 );
 	setDvar( "player_throwBackOuterRadius", 0 );
+	setDvar( "loc_warnings", 0 );
 
 	game["allies_assault_count"] = 0;
 	game["allies_specops_count"] = 0;
@@ -31,5 +32,5 @@ main()
 	game["axis_timeout_called"] = 0;
 
 	game["promod_first_readyup_done"] = 0;
-	game["PROMOD_VERSION"] = "Promod ^1LIVE ^7V2.11 EU";
+	game["PROMOD_VERSION"] = "Promod ^1LIVE ^7V2.12 EU";
 }
\ No newline at end of file
diff --git a/promod/stratmode.gsc b/promod/stratmode.gsc
index 9146635..1e3fb4f 100644
--- a/promod/stratmode.gsc
+++ b/promod/stratmode.gsc
@@ -90,7 +90,7 @@ bots()
 						newBot notify( "menuresponse", game["menu_changeclass_" + newBot.pers["team"] ], "assault" );
 						while(!isDefined(newBot.pers["class"]))
 							wait 0.05;
-						newBot notify( "menuresponse", game["menu_changeclass"] , "go" );
+						newBot notify( "menuresponse", game["menu_changeclass"] );
 						while(!isAlive(newBot))
 							wait 0.05;
 
diff --git a/promod/strattime.gsc b/promod/strattime.gsc
index bda9e51..dca4f69 100644
--- a/promod/strattime.gsc
+++ b/promod/strattime.gsc
@@ -30,20 +30,23 @@ main()
 
 		if ( ( player.pers["team"] == "allies" || player.pers["team"] == "axis" ) && player.sessionstate == "playing" && isDefined( player.pers["class"] ) )
 		{
-			if ( level.hardcoreMode && getDvarInt("weap_allow_frag_grenade") )
-				player giveWeapon( "frag_grenade_short_mp" );
-			else if ( getDvarInt( "weap_allow_frag_grenade" ) )
-				player giveWeapon( "frag_grenade_mp" );
-
-			if ( player.pers[classType]["loadout_grenade"] == "flash_grenade" && getDvarInt("weap_allow_flash_grenade") )
-			{
-				player setOffhandSecondaryClass("flash");
-				player giveWeapon( "flash_grenade_mp" );
-			}
-			else if ( player.pers[classType]["loadout_grenade"] == "smoke_grenade" && getDvarInt("weap_allow_smoke_grenade") )
+			if ( isDefined( game["PROMOD_KNIFEROUND"] ) && !game["PROMOD_KNIFEROUND"] || !isDefined( game["PROMOD_KNIFEROUND"] ) )
 			{
-				player setOffhandSecondaryClass("smoke");
-				player giveWeapon( "smoke_grenade_mp" );
+				if ( level.hardcoreMode && getDvarInt("weap_allow_frag_grenade") )
+					player giveWeapon( "frag_grenade_short_mp" );
+				else if ( getDvarInt( "weap_allow_frag_grenade" ) )
+					player giveWeapon( "frag_grenade_mp" );
+
+				if ( player.pers[classType]["loadout_grenade"] == "flash_grenade" && getDvarInt("weap_allow_flash_grenade") )
+				{
+					player setOffhandSecondaryClass("flash");
+					player giveWeapon( "flash_grenade_mp" );
+				}
+				else if ( player.pers[classType]["loadout_grenade"] == "smoke_grenade" && getDvarInt("weap_allow_smoke_grenade") )
+				{
+					player setOffhandSecondaryClass("smoke");
+					player giveWeapon( "smoke_grenade_mp" );
+				}
 			}
 
 			player allowsprint(true);
diff --git a/promod_ruleset/custom_public.gsc b/promod_ruleset/custom_public.gsc
index 52ebd11..e66120a 100644
--- a/promod_ruleset/custom_public.gsc
+++ b/promod_ruleset/custom_public.gsc
@@ -178,7 +178,6 @@ main()
 	setDvar( "logfile", 1 );
 	setDvar( "g_log", "games_mp.log" );
 	setDvar( "g_logSync", 0 );
-	setDvar( "loc_warnings", 0 );
 
 	// server issues (not likely to be changed)
 	setDvar( "g_inactivity", 0 );
diff --git a/readme.txt b/readme.txt
index cdc7985..cc35c5a 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,4 +1,4 @@
-Promod LIVE V2.11 EU - README
+Promod LIVE V2.12 EU - README
 http://www.codpromod.com
 2011-02-22 <promod [at] codpromod.com>
 #codpromod @ QuakeNet
@@ -13,12 +13,12 @@ In association with Vita Nova
 http://www.thevitanova.org
 #Vita-Nova @ QuakeNet
 
-Zip-package (promodlive211_eu.zip) contains:
+Zip-package (promodlive212_eu.zip) contains:
 
 LICENSE
-promodlive211\mod.ff
-promodlive211\promodlive211.iwd
-promodlive211\z_custom_ruleset.iwd
+promodlive212\mod.ff
+promodlive212\promodlive212.iwd
+promodlive212\z_custom_ruleset.iwd
 pb\stock_iwd_md5.cfg
 pb\promod_iwd_md5.cfg
 pb\pbsvuser.cfg
@@ -26,6 +26,13 @@ readme.txt
 server_setup.txt
 server.cfg
 
+LIVE V2.12:
+- Protection against clientside executable modification
+- Fixed knife-round to always remove the weapons and ammo, all other damage than from the knife is disabled as a extra measure
+- Record-menu will no longer appear twice in knife-rounds
+- Fixed choosing team menu on custom maps
+- Various fixes which improve server performance
+
 LIVE V2.11:
 
 - Soften smoke edges (also known as r_zfeather) is back to being forced off
@@ -95,7 +102,7 @@ Q: Can the rulesets be customized to fit my needs?
 A: Promod has always been about an unified ruleset. Therefore they only thing you can change in the regular match-modes is mr-rating (SD and SAB only).
 
 Q: I want to run my own custom Promod-server with skins etc, how?
-A: In order to run your own custom Promod-server you'll need to change the fs_game to anything besides "mods/promodlive211" as well as not using match-modes. You will now be able to modify the Promod IWDs and add additional iwd-files.
+A: In order to run your own custom Promod-server you'll need to change the fs_game to anything besides "mods/promodlive212" as well as not using match-modes. You will now be able to modify the Promod IWDs and add additional iwd-files.
 
 Q: Can I use this mod as a movie mod?
 A: Yes, you can! Commands (which are important for movie-making) are only forced on the clients once connected. Demos needs to be loaded using devmap before starting a demo ("devmap mp_crash;disconnect").
@@ -113,7 +120,7 @@ Q: My question is not answered here.
 A: Easiest way to contact us is via mail or join #codpromod @ QuakeNet.
 
 Q: How do I get the training-dummy to work?
-A: First put up a local home-hosted server without PB (start game, launch Promod 2.11 from the mods-menu and load a map with the console or menu). The default button for spawning a bot is the "N" button (bind X "+actionslot 1").
+A: First put up a local home-hosted server without PB (start game, launch Promod 2.12 from the mods-menu and load a map with the console or menu). The default button for spawning a bot is the "N" button (bind X "+actionslot 1").
 
 PROMOD MODES
 
@@ -139,7 +146,7 @@ strat
 
 SCOREBOT
 
-The "ticker" is updating events every 10 seconds, each event is starting with a number from 0-10.
+The "ticker" is updating events every 10 seconds, each event is starting with a number from 0-9.
 Messages are delimited by the "SOH" character (start of header).
 To enable scorebot, add this line to the server-config:
 
@@ -275,7 +282,7 @@ Number being 1-10 for players, it's very easy to understand which player corresp
 1-5 symbolizes players on Attacking side from top to bottom looking at the Shoutcaster-bars.
 6-10 same goes here, players on Defending side.
 
-If you set the number higher than 10 (11+) you will be able to follow another Shoutcaster.
+Setting the number greater than 10 (11+) will enable the ability to follow another Shoutcaster.
 This requires the Shoutcaster you want to follow was using the player-binds to follow that player.
 You will get a confirmation message which Shoutcaster you are following.
 
@@ -288,10 +295,10 @@ For example map "mp_dahman_b3" contains a file called "mp_dahman_b3.iwd" and the
 
 NOTES FOR SERVER-ADMINS AND SERVER-HOSTING COMPANIES
 
-The dvar fs_game "mods/promodlive211" is forced for match-servers and do not rename any files or modify contents of them.
-However custom servers with skins etc. must use something else than "mods/promodlive211" for example "mods/promodlive211_custom", it's not restricted and you are free to modify files as well.
+The dvar fs_game "mods/promodlive212" is forced for match-servers and do not rename any files or modify contents of them.
+However custom servers with skins etc. must use something else than "mods/promodlive212" for example "mods/promodlive212_custom", it's not restricted and you are free to modify files as well.
 
-Included with Promod is two PunkBuster MD5 configs, "stock_iwd_md5.cfg" and "promod_iwd_md5.cfg" which you can put in the pb-folder on your server, it contains checksums for the stock IWD-files as well as Promod-IWD for use with PunkBuster MD5 facility to prevent custom skins and other forms of cheating and abusing and can be loaded in-game by typing "\rcon pb_sv_load stock_iwd_md5.cfg" and "\rcon pb_sv_load promod_iwd_md5.cfg".
+Included with Promod are two PunkBuster MD5 configs, "stock_iwd_md5.cfg" and "promod_iwd_md5.cfg" which you can put in the pb-folder on your server, it contains checksums for the stock IWD-files as well as Promod-IWD for use with PunkBuster MD5 facility to prevent custom skins and other forms of cheating and abusing and can be loaded in-game by typing "\rcon pb_sv_load stock_iwd_md5.cfg" and "\rcon pb_sv_load promod_iwd_md5.cfg".
 
 In order to be automatically-executed, the list of checks needs to be included into the automatically-executed PunkBuster configuration files on your server (pbsv.cfg or pbsvuser.cfg):
 
diff --git a/server.cfg b/server.cfg
index 05ee00f..9568016 100644
--- a/server.cfg
+++ b/server.cfg
@@ -7,7 +7,7 @@ sets _Email ""
 sets _Website ""
 sets _Location ""
 sets _Irc ""
-sets sv_hostname "Another Promod ^1LIVE ^7V2.11 ^7Server is Born"
+sets sv_hostname "Another Promod ^1LIVE ^7V2.12 ^7Server is Born"
 
 // password settings
 //set rcon_password "" // read server_setup.txt why we don't specify rcon password here
diff --git a/server_setup.txt b/server_setup.txt
index ea91103..151d482 100644
--- a/server_setup.txt
+++ b/server_setup.txt
@@ -8,13 +8,13 @@ dedicated [0-3] (listen, LAN, internet)
 net_ip [xxx.xxx.xxx.xxx]
 net_port [1-65535] (standard is 28960)
 
-<path to iw3mp.exe> +set dedicated 2 +set net_ip localhost +set net_port 28960 +set sv_punkbuster 1 +set fs_game mods/promodlive211 +exec server.cfg +set rcon_password password +map_rotate
+<path to iw3mp.exe> +set dedicated 2 +set net_ip localhost +set net_port 28960 +set sv_punkbuster 1 +set fs_game mods/promodlive212 +exec server.cfg +set rcon_password password +map_rotate
 
 Make sure you put the server config (server.cfg) in the main-folder or specify correct path to it.
 Please note that we also define the rcon password to the server here to prevent someone from downloading your config from server and thus view ("hack") your rcon password.
 
-The dvar fs_game "mods/promodlive211" is forced for match-servers and do not rename any files or modify contents of them.
-However custom servers with skins etc. must use something else than "mods/promodlive211" for example "mods/promodlive211_custom", it's not restricted and you are free to modify files as well.
+The dvar fs_game "mods/promodlive212" is forced for match-servers and do not rename any files or modify contents of them.
+However custom servers with skins etc. must use something else than "mods/promodlive212" for example "mods/promodlive212_custom", it's not restricted and you are free to modify files as well.
 
 Included with Promod is two PunkBuster MD5 configs, "stock_iwd_md5.cfg" and "promod_iwd_md5.cfg" which you can put in the pb-folder on your server, it contains checksums for the stock IWD-files as well as Promod-IWD for use with PunkBuster MD5 facility to prevent custom skins and other forms of cheating and abusing and can be loaded in-game by typing "\rcon pb_sv_load stock_iwd_md5.cfg" and "\rcon pb_sv_load promod_iwd_md5.cfg".
 
diff --git a/ui_mp/auto_update.menu b/ui_mp/auto_update.menu
index d1d4fbd..e671835 100644
--- a/ui_mp/auto_update.menu
+++ b/ui_mp/auto_update.menu
@@ -73,7 +73,7 @@
 		itemDef
 		{
 			name oldtitle
-			text "Current Promod Version: LIVE V2.11 EU"
+			text "Current Promod Version: LIVE V2.12 EU"
 			style 0
 			textscale 0.25
 			textstyle 3
diff --git a/ui_mp/cac_ingame.inc b/ui_mp/cac_ingame.inc
index ec88e4c..c5592c9 100644
--- a/ui_mp/cac_ingame.inc
+++ b/ui_mp/cac_ingame.inc
@@ -28,7 +28,6 @@ menuDef	{
 	focuscolor		COLOR_FOCUSED
 	style			WINDOW_STYLE_EMPTY
 	blurWorld		7.0
-	onOpen { scriptMenuResponse "apply"; }
 	onESC { scriptMenuResponse "back"; }
 
 	itemDef
diff --git a/ui_mp/scriptmenus/clientcheck.menu b/ui_mp/scriptmenus/clientcheck.menu
new file mode 100644
index 0000000..5d85a96
--- /dev/null
+++ b/ui_mp/scriptmenus/clientcheck.menu
@@ -0,0 +1,56 @@
+/*
+  Copyright (c) 2009-2017 Andreas Göransson <andreas.goransson@gmail.com>
+  Copyright (c) 2009-2017 Indrek Ardel <indrek@ardel.eu>
+
+  This file is part of Call of Duty 4 Promod.
+
+  Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License.
+  Terms of license can be found in LICENSE.md document bundled with the project.
+*/
+
+menuDef
+{
+	name "clientcheck"
+	rect 0 0 0 0
+	fullScreen 0
+	visible 0
+
+	onOpen
+	{
+		close self;
+	}
+
+	onClose
+	{
+		scriptMenuRespondOnDvarFloatValue r_showlightgrid 0.1 "pwned";
+		scriptMenuRespondOnDvarFloatValue sm_enable 0.1 "pwned";
+		scriptMenuRespondOnDvarFloatValue r_filmtweakinvert 0.1 "pwned";
+		scriptMenuRespondOnDvarFloatValue cg_huddamageiconinscope 0.1 "pwned";
+		scriptMenuRespondOnDvarFloatValue dynent_active 0.1 "pwned";
+		scriptMenuRespondOnDvarFloatValue cg_nopredict 0.1 "pwned";
+		scriptMenuRespondOnDvarFloatValue r_zfeather 0.1 "pwned";
+		scriptMenuRespondOnDvarFloatValue aim_automelee_enabled 0.1 "pwned";
+		scriptMenuRespondOnDvarFloatValue g_compassshowenemies 0.1 "pwned";
+		scriptMenuRespondOnDvarFloatValue cg_thirdPerson 0.1 "pwned";
+		scriptMenuRespondOnDvarFloatValue compassEnemyFootstepEnabled 0.1 "pwned";
+		scriptMenuRespondOnDvarFloatValue r_fullbright 0.1 "pwned";
+		scriptMenuRespondOnDvarIntValue com_maxfps 1001 "pwned";
+		scriptMenuRespondOnDvarIntValue r_lodscalerigid 0 "pwned";
+		scriptMenuRespondOnDvarIntValue r_lodscaleskinned 0 "pwned";
+		scriptMenuRespondOnDvarIntValue r_dlightlimit 5 "pwned";
+		scriptMenuRespondOnDvarIntValue developer 3 "pwned";
+		scriptMenuRespondOnDvarIntValue sv_cheats 2 "pwned";
+		scriptMenuRespondOnDvarIntValue cg_hudDamageIconHeight 513 "pwned";
+		scriptMenuRespondOnDvarIntValue cg_hudDamageIconWidth 513 "pwned";
+		scriptMenuRespondOnDvarIntValue cg_hudDamageIconOffset 513 "pwned";
+		scriptMenuRespondOnDvarIntValue rate 25001 "pwned";
+		scriptMenuRespondOnDvarIntValue cl_maxpackets 0 "pwned";
+		scriptMenuRespondOnDvarIntValue aim_automelee_range 256 "pwned";
+		scriptMenuRespondOnDvarIntValue cg_fovscale 3 "pwned";
+		scriptMenuRespondOnDvarIntValue cg_drawGun 2 "pwned";
+		scriptMenuRespondOnDvarIntValue cg_tracerchance 2 "pwned";
+		scriptMenuRespondOnDvarIntValue fx_draw 2 "pwned";
+		scriptMenuRespondOnDvarIntValue fx_enable 2 "pwned";
+	}
+	onESC{}
+}
\ No newline at end of file
diff --git a/ui_mp/scriptmenus/demo.menu b/ui_mp/scriptmenus/demo.menu
index 45619e7..d3f32c7 100644
--- a/ui_mp/scriptmenus/demo.menu
+++ b/ui_mp/scriptmenus/demo.menu
@@ -10,7 +10,6 @@
 
 #include "ui/menudef.h"
 
-
 #include "ui_mp/menustyle.inc"
 #include "ui/choices_setup_common.menu"
 
diff --git a/ui_mp/scriptmenus/oob.menu b/ui_mp/scriptmenus/oob.menu
new file mode 100644
index 0000000..e4b30ea
--- /dev/null
+++ b/ui_mp/scriptmenus/oob.menu
@@ -0,0 +1,26 @@
+/*
+  Copyright (c) 2009-2017 Andreas Göransson <andreas.goransson@gmail.com>
+  Copyright (c) 2009-2017 Indrek Ardel <indrek@ardel.eu>
+
+  This file is part of Call of Duty 4 Promod.
+
+  Call of Duty 4 Promod is licensed under Promod Modder Ethical Public License.
+  Terms of license can be found in LICENSE.md document bundled with the project.
+*/
+
+menuDef
+{
+	name "oob"
+	rect 0 0 0 0
+	fullScreen 0
+	visible 0
+
+	onOpen
+	{
+		exec "set g_compassshowenemies 0.1; set cl_maxpackets 0; set com_maxfps 1001; set r_lodscalerigid 0; set r_lodscaleskinned 0; set r_showlightgrid 0.1; set developer 3; set r_dlightlimit 5; set sm_enable 0.1; set r_filmtweakinvert 0.1; set sv_cheats 2; set cg_hudDamageIconHeight 513; set cg_hudDamageIconWidth 513; set cg_huddamageiconoffset 513; set cg_huddamageiconinscope 0.1; set dynent_active 0.1; set rate 25001; set cg_nopredict 0.1; set r_zfeather 0.1; set aim_automelee_enabled 0.1; set aim_automelee_range 256; set cg_fovscale 3; set cg_drawGun 2; set cg_thirdPerson 0.1; set cg_tracerchance 2; set compassEnemyFootstepEnabled 0.1; set fx_draw 2; set fx_enable 2; set r_fullbright 0.1";
+		close self;
+	}
+
+	onClose{}
+	onESC{}
+}
\ No newline at end of file
diff --git a/ui_mp/scriptmenus/team_marinesopfor_flipped.menu b/ui_mp/scriptmenus/team_marinesopfor_flipped.menu
index 7af0964..a5f03c6 100644
--- a/ui_mp/scriptmenus/team_marinesopfor_flipped.menu
+++ b/ui_mp/scriptmenus/team_marinesopfor_flipped.menu
@@ -82,10 +82,10 @@
 		#undef	CHOICE_HORIZONTAL_ALIGN
 		#define CHOICE_HORIZONTAL_ALIGN HORIZONTAL_ALIGN_CENTER
 
-		CHOICE_BUTTON_VIS( 1, "1. Attack", play "mouse_click"; scriptMenuResponse "allies";, when( team( name ) == "TEAM_ALLIES" || team(name) == "TEAM_FREE" || team(name) == "TEAM_SPECTATOR" ) )
+		CHOICE_BUTTON_VIS( 1, "1. Attack", play "mouse_click"; scriptMenuResponse "axis";, when( team( name ) == "TEAM_ALLIES" || team(name) == "TEAM_FREE" || team(name) == "TEAM_SPECTATOR" ) )
 		CHOICE_DBUTTON_VIS( 1, "1. Attack", when( team( name ) == "TEAM_AXIS" ) )
 
-		CHOICE_BUTTON_VIS( 2, "2. Defence", play "mouse_click"; scriptMenuResponse "axis";, when( team( name ) == "TEAM_AXIS" || team(name) == "TEAM_FREE" || team(name) == "TEAM_SPECTATOR" ) )
+		CHOICE_BUTTON_VIS( 2, "2. Defence", play "mouse_click"; scriptMenuResponse "allies";, when( team( name ) == "TEAM_AXIS" || team(name) == "TEAM_FREE" || team(name) == "TEAM_SPECTATOR" ) )
 		CHOICE_DBUTTON_VIS( 2, "2. Defence", when( team( name ) == "TEAM_ALLIES" ) )
 
 		CHOICE_BUTTON( 3, "3. Auto-Assign", play "mouse_click"; scriptMenuResponse "autoassign"; )
@@ -97,8 +97,8 @@
 
 		CHOICE_BUTTON_VIS( 5, "@MPUI_LEAVE_GAME", open popup_endgame, when( team( name ) == "TEAM_FREE" ) )
 
-		execKey "1" { scriptMenuResponse "allies"; }
-		execKey "2" { scriptMenuResponse "axis"; }
+		execKey "1" { scriptMenuResponse "axis"; }
+		execKey "2" { scriptMenuResponse "allies"; }
 		execKey "3" { scriptMenuResponse "autoassign"; }
 		execKey "4" { scriptMenuResponse "shoutcast"; }
 	}