diff --git a/.gitignore b/.gitignore
index 26362f60..a0bc5604 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,4 +6,14 @@
 *.a
 *.framework
 *.exe
-build/
\ No newline at end of file
+*.dll
+*.pdb
+build/
+CMakeLists.txt.user
+cmake_install.cmake
+*.orig
+*.cbp
+*.dsw
+*.vsxproj
+*.vsproj
+*.sln
diff --git a/.travis.yml b/.travis.yml
index 9e165b81..fb18612f 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -5,10 +5,20 @@ compiler:
 os:
   - linux
   - osx
-sudo: true
+addons:
+  apt:
+    packages:
+    - gcc-multilib
+    - g++-multilib
 before_script:
-  - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get install gcc-multilib g++-multilib; fi
+  - curl http://libsdl.org/release/SDL2-devel-2.0.7-mingw.tar.gz | tar xzf -
+  - mv SDL2-2.0.7/i686-w64-mingw32/include/SDL2 cl_dll/
 script:
   - mkdir -p build && cd build
-  - cmake ../ -DCMAKE_EXE_LINKER_FLAGS="-Wl,--no-undefined" -DUSE_VOICEMGR=0 && make -j3 && rm -rf *
-  - cmake ../ -DCMAKE_EXE_LINKER_FLAGS="-Wl,--no-undefined" -DUSE_VOICEMGR=1 && make -j3 && rm -rf *
\ No newline at end of file
+  - cmake ../ -DCMAKE_C_FLAGS="-O2 -pipe -DNDEBUG -fvisibility=hidden -fomit-frame-pointer" -DCMAKE_CXX_FLAGS="-fno-exceptions -fno-rtti" -DCMAKE_EXE_LINKER_FLAGS="-Wl,--no-undefined -Wl,--strip-all" -DGOLDSOURCE_SUPPORT=1 -DUSE_VOICEMGR=0 && make -j3
+  - mkdir -p $TRAVIS_BRANCH-$TRAVIS_OS_NAME-$CC/cl_dlls
+  - mkdir -p $TRAVIS_BRANCH-$TRAVIS_OS_NAME-$CC/dlls
+  - cp cl_dll/client.* $TRAVIS_BRANCH-$TRAVIS_OS_NAME-$CC/cl_dlls
+  - cp dlls/hl.* $TRAVIS_BRANCH-$TRAVIS_OS_NAME-$CC/dlls
+  - tar -J -cf $TRAVIS_BRANCH-$TRAVIS_OS_NAME-$CC.txz $TRAVIS_BRANCH-$TRAVIS_OS_NAME-$CC
+  - curl --upload-file $TRAVIS_BRANCH-$TRAVIS_OS_NAME-$CC.txz https://transfer.sh/$TRAVIS_BRANCH-$TRAVIS_OS_NAME-$CC.txz
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 5c2d6822..0d754eb5 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -31,6 +31,11 @@ option(USE_VGUI2 "Enable VGUI2. UNDONE" OFF)
 option(USE_VOICEMGR "Enable VOICE MANAGER." OFF)
 option(BUILD_CLIENT "Build client dll" ON)
 option(BUILD_SERVER "Build server dll" ON)
+option(GOLDSOURCE_SUPPORT "Build goldsource compatible client library" OFF)
+set(GAMEDIR "valve" CACHE STRING "Gamedir path")
+set(SERVER_INSTALL_DIR "dlls" CACHE STRING "Where put server dll")
+set(CLIENT_INSTALL_DIR "cl_dlls" CACHE STRING "Where put client dll")
+set(SERVER_LIBRARY_NAME "hl" CACHE STRING "Library name for Linux/MacOS/Windows")
 
 #-----------------
 # MAIN BUILD CODE \
@@ -59,4 +64,4 @@ endif()
 
 if(NOT BUILD_SERVER AND NOT BUILD_CLIENT)
 	error("Nothing to build")
-endif()
\ No newline at end of file
+endif()
diff --git a/README.md b/README.md
index bb1cc675..9261b1b3 100644
--- a/README.md
+++ b/README.md
@@ -6,22 +6,41 @@ Half-Life SDK for Xash3D & GoldSource with some fixes.
 
 ### CMake as most universal way
 
-```
-mkdir build && cd build
-cmake ../
-```
+    mkdir build && cd build
+    cmake ../
+    make
 
 You may enable or disable some build options by -Dkey=value. All available build options are defined in CMakeLists.txt at root directory.
+See below if you want to build the GoldSource compatible libraries.
 
 See below, if CMake is not suitable for you:
 
 ### Windows
 
+#### Using msvc
+
+We use compilers provided with Microsoft Visual Studio 6. There're `compile.bat` scripts in both `cl_dll` and `dlls` directories.
+Before running any of those files you must define `MSVCDir` variable which is the path to your msvc installation.
+
+    set MSVCDir=C:\Program Files\Microsoft Visual Studio
+    compile.bat
+
+These scripts also can be ran via wine:
+
+    MSVCDir="z:\home\$USER\.wine\drive_c\Program Files\Microsoft Visual Studio" wine cmd /c compile.bat
+
+The libraries built this way are always GoldSource compatible.
+
+There're dsp projects for MVS 6 in `cl_dll` and `dlls` directories, but we don't keep them up-to-date. You're free to adapt them for yourself and try to import into the newer MVS versions.
+
+#### Using mingw
+
 TODO
 
 ### Linux
 
-TODO
+    (cd dlls && make)
+    (cd cl_dll && make)
 
 ### OS X
 
@@ -29,14 +48,94 @@ TODO
 
 ### FreeBSD
 
-```
-    cd dlls
-    gmake CXX=clang++ CC=clang
-    cd ../cl_dll
-    gmake CXX=clang++ CC=clang
-```
+    (cd dlls && gmake CXX=clang++ CC=clang)
+    (cd cl_dll && gmake CXX=clang++ CC=clang)
 
 ### Android
 
 Just typical `ndk-build`.
+TODO: describe what it is.
 
+### Building GoldSource-compatible libraries
+
+To enable building the goldsource compatible client library add GOLDSOURCE_SUPPORT flag when calling cmake:
+
+    cmake .. -DGOLDSOURCE_SUPPORT=ON
+
+or when using make without cmake:
+
+    make GOLDSOURCE_SUPPORT=1
+
+Unlike original client by Valve the resulting client library will not depend on vgui or SDL2 just like the one that's used in FWGS Xash3d.
+
+Note for **Linux**: GoldSource requires libraries (both client and server) to be compiled with libstdc++ bundled with g++ of major version 4 (versions from 4.6 to 4.9 should work).
+If your Linux distribution does not provide compatible g++ version you have several options.
+
+#### Method 1: Statically build with c++ library
+
+This one is the most simple but has a drawback.
+
+    cmake ../ -DGOLDSOURCE_SUPPORT=ON -DCMAKE_C_FLAGS="-static-libstdc++ -static-libgcc"
+
+The drawback is that the compiled libraries will be larger in size.
+
+#### Method 2: Build in Steam Runtime chroot
+
+This is the official way to build Steam compatible games for Linux.
+
+Clone https://github.com/ValveSoftware/steam-runtime and follow instructions https://github.com/ValveSoftware/steam-runtime#building-in-the-runtime
+
+    sudo ./setup_chroot.sh --i386
+
+Then use cmake and make as usual, but prepend the commands with `schroot --chroot steamrt_scout_i386 --`:
+
+    mkdir build-in-steamrt && cd build-in-steamrt
+    schroot --chroot steamrt_scout_i386 -- cmake ../ -DGOLDSOURCE_SUPPORT=ON
+    schroot --chroot steamrt_scout_i386 -- make
+
+#### Method 3: Create your own chroot with older distro that includes g++ 4.
+
+Use the most suitable way for you to create an old distro 32-bit chroot. E.g. on Debian (and similar) you can use debootstrap.
+
+    sudo debootstrap --arch=i386 jessie /var/chroot/jessie-debian-i386 # On Ubuntu type trusty instead of jessie
+    sudo chroot /var/chroot/jessie-debian-i386
+
+Inside chroot install cmake, make, g++ and libsdl2-dev. Then exit the chroot.
+
+On the host system install schroot. Then create and adapt the following config in /etc/schroot/chroot.d/jessie.conf (you can choose a different name):
+
+```
+[jessie]
+type=directory
+description=Debian jessie i386
+directory=/var/chroot/debian-jessie-i386/
+users=yourusername
+groups=yourusername
+root-groups=root
+preserve-environment=true
+personality=linux32
+```
+
+Insert your actual user name in place of `yourusername`. Then prepend any make or cmake call with `schroot -c jessie --`:
+
+    mkdir build-in-chroot && cd build-in-chroot
+    schroot --chroot jessie -- cmake ../ -DGOLDSOURCE_SUPPORT=ON
+    schroot --chroot jessie -- make
+
+#### Method 4:  Install the needed g++ version yourself
+
+TODO: describe steps.
+
+#### Configuring Qt Creator to use toolchain from chroot
+
+Create a file with the following contents anywhere:
+
+```sh
+#!/bin/sh
+schroot --chroot steamrt_scout_i386 -- cmake "$@"
+```
+
+Make it executable.
+In Qt Creator go to `Tools` -> `Options` -> `Build & Run` -> `CMake`. Add a new cmake tool and specify the path of previously created file.
+Go to `Kits` tab, clone your default configuration and choose your CMake tool there.
+Choose the new kit when opening CMakeLists.txt.
diff --git a/backup.bat b/backup.bat
deleted file mode 100644
index 7e780aa8..00000000
--- a/backup.bat
+++ /dev/null
@@ -1,31 +0,0 @@
-@echo off
-color 4F
-echo 			 XashXT Group 2006 (C)
-echo 			Prepare source for backup
-echo.
-
-if exist backup.log del /f /q backup.log
-if not exist D:\!backup/ mkdir D:\!backup\
-echo 			     Prepare OK!
-echo 		     Please wait: backup in progress
-C:\Progra~1\WinRar\rar a -agMMMYYYY-DD D:\!backup\.rar -dh -m5 @backup.lst >>backup.log
-if errorlevel 1 goto error
-if errorlevel 0 goto ok
-:ok
-cls
-echo 		    Source was sucessfully backuped
-echo 		     and stored in folder "backup"
-echo 		      Press any key for exit. :-)
-if exist backup.log del /f /q backup.log
-exit
-:error
-echo 		    ******************************
-echo 		    ***********Error!*************
-echo 		    ******************************
-echo 		    **See backup.log for details**
-echo 		    ******************************
-echo 		    ******************************
-echo.
-echo 		      press any key for exit :-(
-pause>nul
-exit
diff --git a/backup.lst b/backup.lst
deleted file mode 100644
index 628de079..00000000
--- a/backup.lst
+++ /dev/null
@@ -1,36 +0,0 @@
-//=======================================================================
-//			Copyright XashXT Group 2007 �
-//			list with backup directories
-//=======================================================================
-
-// global stuff
-xash.dsw
-debug.bat
-backup.lst
-backup.bat
-release.bat
-change.log
-make_sdk.bat
-xash_sdk.lst
-
-cl_dll\
-cl_dll\hl\
-common\
-dlls\
-game_shared\
-game_launch\
-engine\
-engine\client\
-engine\client\vgui\
-engine\server\
-engine\common\
-engine\common\imagelib\
-engine\common\soundlib\
-pm_shared\
-mainui\
-mainui\legacy
-utils\
-utils\makefont\
-utils\vgui\
-utils\vgui\include\
-utils\vgui\lib\win32_vc6\
\ No newline at end of file
diff --git a/cl_dll/Android.mk b/cl_dll/Android.mk
index 2600d028..052e62cd 100755
--- a/cl_dll/Android.mk
+++ b/cl_dll/Android.mk
@@ -13,7 +13,6 @@ LOCAL_MODULE := client
 #else
 APP_PLATFORM := android-8
 #endif
-LOCAL_CONLYFLAGS += -std=c99
 
 include $(XASH3D_CONFIG)
 
@@ -79,6 +78,8 @@ SRCS+=./hud_spectator.cpp
 SRCS+=./hud_update.cpp
 SRCS+=./in_camera.cpp
 SRCS+=./input.cpp
+SRCS+=./input_goldsource.cpp
+SRCS+=./input_mouse.cpp
 #SRCS+=./inputw32.cpp
 SRCS+=./menu.cpp
 SRCS+=./message.cpp
@@ -100,8 +101,8 @@ SRCS+=./view.cpp
 SRCS+=./input_xash3d.cpp
 SRCS+=./scoreboard.cpp
 SRCS+=./MOTD.cpp
-INCLUDES =  -I../common -I. -I../game_shared -I../pm_shared -I../engine -I../dlls
-DEFINES = -Wno-write-strings -DLINUX -D_LINUX -Dstricmp=strcasecmp -D_strnicmp=strncasecmp -Dstrnicmp=strncasecmp -DCLIENT_WEAPONS -DCLIENT_DLL -w
+INCLUDES =  -I../common -I. -I../game_shared -I../pm_shared -I../engine -I../dlls -I../utils/false_vgui/include
+DEFINES = -Wno-write-strings -DLINUX -D_LINUX -Dstricmp=strcasecmp -Dstrnicmp=strncasecmp -DCLIENT_WEAPONS -DCLIENT_DLL -w
 
 LOCAL_C_INCLUDES := $(LOCAL_PATH)/. \
 		 $(LOCAL_PATH)/../common \
@@ -109,9 +110,17 @@ LOCAL_C_INCLUDES := $(LOCAL_PATH)/. \
 		 $(LOCAL_PATH)/../game_shared \
 		 $(LOCAL_PATH)/../dlls \
 		 $(LOCAL_PATH)/../dlls/hunger \
-		 $(LOCAL_PATH)/../pm_shared
+		 $(LOCAL_PATH)/../pm_shared \
+		 $(LOCAL_PATH)/../utils/false_vgui/include
 LOCAL_CFLAGS += $(DEFINES) $(INCLUDES)
 
+ifeq ($(GOLDSOURCE_SUPPORT),1)
+	DEFINES += -DGOLDSOURCE_SUPPORT
+	ifeq ($(shell uname -s),Linux)
+		LOCAL_LDLIBS += -ldl
+	endif
+endif
+
 LOCAL_SRC_FILES := $(SRCS) $(SRCS_C)
 
 include $(BUILD_SHARED_LIBRARY)
diff --git a/cl_dll/CMakeLists.txt b/cl_dll/CMakeLists.txt
index a602c660..29e0e8c7 100644
--- a/cl_dll/CMakeLists.txt
+++ b/cl_dll/CMakeLists.txt
@@ -26,9 +26,12 @@ project (CLDLL)
 set (CLDLL_LIBRARY client)
 
 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-write-strings -DLINUX -D_LINUX -Dstricmp=strcasecmp -D_strnicmp=strncasecmp -Dstrnicmp=strncasecmp -DCLIENT_WEAPONS -DCLIENT_DLL -w")
+if (GOLDSOURCE_SUPPORT)
+	set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DGOLDSOURCE_SUPPORT")
+endif()
 set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS}")
 
-set (CLDLL_SOURCES 
+set (CLDLL_SOURCES
 	hunger/zoom.cpp
 	../dlls/hunger/ap9.cpp
 	../dlls/hunger/chaingun.cpp
@@ -53,7 +56,7 @@ set (CLDLL_SOURCES
 	../dlls/squeakgrenade.cpp 
 	../dlls/tripmine.cpp 
 	../dlls/glock.cpp
-	ev_hldm.cpp 
+	ev_hldm.cpp
 	hl/hl_baseentity.cpp
 	hl/hl_events.cpp
 	hl/hl_objects.cpp
@@ -80,7 +83,9 @@ set (CLDLL_SOURCES
 	hud_update.cpp
 	in_camera.cpp
 	input.cpp
-#SRCS+=./inputw32.cpp
+	input_goldsource.cpp
+	input_mouse.cpp
+	input_xash3d.cpp
 	menu.cpp
 	message.cpp
 	overview.cpp
@@ -98,10 +103,10 @@ set (CLDLL_SOURCES
 	tri.cpp
 	util.cpp
 	view.cpp
-	input_xash3d.cpp
 	scoreboard.cpp
 	MOTD.cpp)
-include_directories (. hl/ ../dlls ../dlls/hunger ../dlls/wpn_shared ../common ../engine ../pm_shared ../game_shared ../public)
+
+include_directories (. hl/ ../dlls ../dlls/hunger ../dlls/wpn_shared ../common ../engine ../pm_shared ../game_shared ../public ../utils/false_vgui/include )
 
 if(USE_VOICEMGR)
 	#set(CLDLL_SOURCES
@@ -111,7 +116,21 @@ if(USE_VOICEMGR)
 endif()
 
 add_library (${CLDLL_LIBRARY} SHARED ${CLDLL_SOURCES})
+if (GOLDSOURCE_SUPPORT)
+	target_link_libraries( ${CLDLL_LIBRARY} ${CMAKE_DL_LIBS} )
+endif()
 
-set_target_properties (${CLDLL_SHARED} PROPERTIES
+set_target_properties (${CLDLL_LIBRARY} PROPERTIES
 	POSITION_INDEPENDENT_CODE 1)
 
+if(APPLE OR WIN32 OR ${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
+	set_target_properties(${CLDLL_LIBRARY} PROPERTIES
+		OUTPUT_NAME "client"
+		PREFIX "")
+endif()
+
+install( TARGETS ${CLDLL_LIBRARY}
+	DESTINATION "${GAMEDIR}/${CLIENT_INSTALL_DIR}/"
+	PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE
+	    GROUP_READ GROUP_EXECUTE
+		WORLD_READ WORLD_EXECUTE )
diff --git a/cl_dll/GameStudioModelRenderer.h b/cl_dll/GameStudioModelRenderer.h
index 7d06f70f..881dd144 100644
--- a/cl_dll/GameStudioModelRenderer.h
+++ b/cl_dll/GameStudioModelRenderer.h
@@ -5,11 +5,9 @@
 // $NoKeywords: $
 //=============================================================================
 
+#pragma once
 #if !defined( GAMESTUDIOMODELRENDERER_H )
 #define GAMESTUDIOMODELRENDERER_H
-#if defined( _WIN32 )
-#pragma once
-#endif
 
 /*
 ====================
@@ -23,4 +21,4 @@ public:
 	CGameStudioModelRenderer( void );
 };
 
-#endif // GAMESTUDIOMODELRENDERER_H
\ No newline at end of file
+#endif // GAMESTUDIOMODELRENDERER_H
diff --git a/cl_dll/GameStudioModelRenderer_Sample.h b/cl_dll/GameStudioModelRenderer_Sample.h
index c924ba3e..9c09374b 100644
--- a/cl_dll/GameStudioModelRenderer_Sample.h
+++ b/cl_dll/GameStudioModelRenderer_Sample.h
@@ -5,11 +5,9 @@
 // $NoKeywords: $
 //=============================================================================
 
+#pragma once
 #if !defined( GAMESTUDIOMODELRENDERER_H )
 #define GAMESTUDIOMODELRENDERER_H
-#if defined( _WIN32 )
-#pragma once
-#endif
 
 /*
 ====================
@@ -52,4 +50,4 @@ private:
 	bool m_bLocal;
 };
 
-#endif // GAMESTUDIOMODELRENDERER_H
\ No newline at end of file
+#endif // GAMESTUDIOMODELRENDERER_H
diff --git a/cl_dll/Makefile b/cl_dll/Makefile
index 983b61c0..0ff4dadf 100644
--- a/cl_dll/Makefile
+++ b/cl_dll/Makefile
@@ -45,7 +45,8 @@ SRCS+=./hud_spectator.cpp
 SRCS+=./hud_update.cpp
 SRCS+=./in_camera.cpp
 SRCS+=./input.cpp
-#SRCS+=./inputw32.cpp
+SRCS+=./input_mouse.cpp
+SRCS+=./input_goldsource.cpp
 SRCS+=./menu.cpp
 SRCS+=./message.cpp
 SRCS+=./overview.cpp
@@ -66,15 +67,18 @@ SRCS+=./view.cpp
 SRCS+=./input_xash3d.cpp
 SRCS+=./scoreboard.cpp
 SRCS+=./MOTD.cpp
-INCLUDES =  -I../common -I. -I../game_shared -I../pm_shared -I../engine -I../dlls
+INCLUDES =  -I../common -I. -I../game_shared -I../pm_shared -I../engine -I../dlls -I../utils/false_vgui/include
 DEFINES = -Wno-write-strings -Dstricmp=strcasecmp -D_strnicmp=strncasecmp -Dstrnicmp=strncasecmp -DCLIENT_WEAPONS -DCLIENT_DLL
 CFLAGS = -m32
 OBJS = $(SRCS:.cpp=.o) $(SRCS_C:.c=.o)
 
 LIBS=-lm
+ifeq ($(GOLDSOURCE_SUPPORT),1)
+	DEFINES += -DGOLDSOURCE_SUPPORT
+endif
 
 ifeq ($(shell uname -s),Linux)
-	LIBS=$(LIBS) -ldl
+	LIBS += -ldl
 endif
 
 %.o : %.c
@@ -83,7 +87,7 @@ endif
 %.o : %.cpp
 	$(CXX) $(CFLAGS) $(INCLUDES) $(DEFINES) -fPIC -c $< -o $@
 client.so : $(OBJS)
-	$(CXX) $(OBJS) -o client.so -shared -Wl,--no-undefined -fPIC $(LIBS)
+	$(CXX) $(CFLAGS) $(OBJS) -o client.so -shared -Wl,--no-undefined -fPIC $(LIBS)
 
 clean:
 	$(RM) $(OBJS)
diff --git a/cl_dll/StudioModelRenderer.h b/cl_dll/StudioModelRenderer.h
index 0a56b731..cbfd0d3b 100644
--- a/cl_dll/StudioModelRenderer.h
+++ b/cl_dll/StudioModelRenderer.h
@@ -5,11 +5,9 @@
 // $NoKeywords: $
 //=============================================================================
 
+#pragma once
 #if !defined ( STUDIOMODELRENDERER_H )
 #define STUDIOMODELRENDERER_H
-#if defined( _WIN32 )
-#pragma once
-#endif
 
 /*
 ====================
diff --git a/cl_dll/ammo.cpp b/cl_dll/ammo.cpp
index afd2810f..d6045f9f 100644
--- a/cl_dll/ammo.cpp
+++ b/cl_dll/ammo.cpp
@@ -307,6 +307,9 @@ void CHudAmmo::Reset( void )
 	gHR.Reset();
 
 	//VidInit();
+	wrect_t nullrc = {0,};
+	SetCrosshair( 0, nullrc, 0, 0, 0 ); // reset crosshair
+	m_pWeapon = NULL; // reset last weapon
 }
 
 int CHudAmmo::VidInit( void )
@@ -538,7 +541,7 @@ int CHudAmmo::MsgFunc_HideWeapon( const char *pszName, int iSize, void *pbuf )
 
 	if( gHUD.m_iHideHUDDisplay & ( HIDEHUD_WEAPONS | HIDEHUD_ALL ) )
 	{
-		static wrect_t nullrc;
+		wrect_t nullrc = {0,};
 		gpActiveSel = NULL;
 		SetCrosshair( 0, nullrc, 0, 0, 0 );
 	}
@@ -567,7 +570,7 @@ int CHudAmmo::MsgFunc_HideWeapon( const char *pszName, int iSize, void *pbuf )
 //
 int CHudAmmo::MsgFunc_CurWeapon( const char *pszName, int iSize, void *pbuf )
 {
-	static wrect_t nullrc;
+	wrect_t nullrc = {0,};
 	int fOnTarget = FALSE;
 
 	BEGIN_READ( pbuf, iSize );
@@ -585,6 +588,8 @@ int CHudAmmo::MsgFunc_CurWeapon( const char *pszName, int iSize, void *pbuf )
 	if( iId < 1 )
 	{
 		SetCrosshair( 0, nullrc, 0, 0, 0 );
+		// Clear out the weapon so we don't keep drawing the last active weapon's ammo. - Solokiller
+		m_pWeapon = 0;
 		return 0;
 	}
 
@@ -615,55 +620,58 @@ int CHudAmmo::MsgFunc_CurWeapon( const char *pszName, int iSize, void *pbuf )
 
 	m_pWeapon = pWeapon;
 
-	if( gHUD.m_iFOV >= 90 )
+	if( !( gHUD.m_iHideHUDDisplay & ( HIDEHUD_WEAPONS | HIDEHUD_ALL ) ) )
 	{
-		// normal crosshairs
-		if( fOnTarget && m_pWeapon->hAutoaim )
+		if( gHUD.m_iFOV >= 90 )
 		{
-			if( bIsMultiplayer() )
+			// normal crosshairs
+			if( fOnTarget && m_pWeapon->hAutoaim )
 			{
-				SetCrosshair( m_pWeapon->hAutoaim, m_pWeapon->rcAutoaim, 255, 255, 255 );
+				if( bIsMultiplayer() )
+				{
+					SetCrosshair( m_pWeapon->hAutoaim, m_pWeapon->rcAutoaim, 255, 255, 255 );
+				}
+				else
+				{
+					SetCrosshair( m_pWeapon->hAutoaim, m_pWeapon->rcAutoaim, 255, 0, 0 );
+				}
 			}
 			else
 			{
-				SetCrosshair( m_pWeapon->hAutoaim, m_pWeapon->rcAutoaim, 255, 0, 0 );
+				if( bIsMultiplayer() )
+				{
+					SetCrosshair( m_pWeapon->hCrosshair, m_pWeapon->rcCrosshair, 255, 255, 255 );
+				}
+				else
+				{
+					SetCrosshair( m_pWeapon->hCrosshair, m_pWeapon->rcCrosshair, 255, 0, 0 );
+				}
 			}
 		}
 		else
 		{
-			if( bIsMultiplayer() )
+			// zoomed crosshairs
+			if( fOnTarget && m_pWeapon->hZoomedAutoaim )
 			{
-				SetCrosshair( m_pWeapon->hCrosshair, m_pWeapon->rcCrosshair, 255, 255, 255 );
+				if( bIsMultiplayer() )
+				{
+					SetCrosshair( m_pWeapon->hZoomedAutoaim, m_pWeapon->rcZoomedAutoaim, 255, 255, 255);
+				}
+				else
+				{
+					SetCrosshair( m_pWeapon->hZoomedAutoaim, m_pWeapon->rcZoomedAutoaim, 255, 0, 0);
+				}
 			}
 			else
 			{
-				SetCrosshair( m_pWeapon->hCrosshair, m_pWeapon->rcCrosshair, 255, 0, 0 );
-			}
-		}
-	}
-	else
-	{
-		// zoomed crosshairs
-		if( fOnTarget && m_pWeapon->hZoomedAutoaim )
-		{
-			if( bIsMultiplayer() )
-			{
-				SetCrosshair( m_pWeapon->hZoomedAutoaim, m_pWeapon->rcZoomedAutoaim, 255, 255, 255);
-			}
-			else
-			{
-				SetCrosshair( m_pWeapon->hZoomedAutoaim, m_pWeapon->rcZoomedAutoaim, 255, 0, 0);
-			}
-		}
-		else
-		{
-			if( bIsMultiplayer() )
-			{
-				SetCrosshair( m_pWeapon->hZoomedCrosshair, m_pWeapon->rcZoomedCrosshair, 255, 255, 255 );
-			}
-			else
-			{
-				SetCrosshair( m_pWeapon->hZoomedCrosshair, m_pWeapon->rcZoomedCrosshair, 255, 0, 0 );
+				if( bIsMultiplayer() )
+				{
+					SetCrosshair( m_pWeapon->hZoomedCrosshair, m_pWeapon->rcZoomedCrosshair, 255, 255, 255 );
+				}
+				else
+				{
+					SetCrosshair( m_pWeapon->hZoomedCrosshair, m_pWeapon->rcZoomedCrosshair, 255, 0, 0 );
+				}
 			}
 		}
 	}
@@ -930,11 +938,11 @@ int CHudAmmo::Draw( float flTime )
 			x = ScreenWidth - ( 8 * AmmoWidth ) - iIconWidth;
 			x = gHUD.DrawHudNumber( x, y, iFlags | DHN_3DIGITS, pw->iClip, r, g, b );
 
-			wrect_t rc;
+			/*wrect_t rc;
 			rc.top = 0;
 			rc.left = 0;
 			rc.right = AmmoWidth;
-			rc.bottom = 100;
+			rc.bottom = 100;*/
 
 			int iBarWidth =  AmmoWidth / 10;
 
diff --git a/cl_dll/ammo.h b/cl_dll/ammo.h
index 9134681c..57c08805 100644
--- a/cl_dll/ammo.h
+++ b/cl_dll/ammo.h
@@ -12,7 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
-
+#pragma once
 #ifndef __AMMO_H__
 #define __AMMO_H__
 
diff --git a/cl_dll/ammohistory.h b/cl_dll/ammohistory.h
index f1063ae1..44edc916 100644
--- a/cl_dll/ammohistory.h
+++ b/cl_dll/ammohistory.h
@@ -15,6 +15,9 @@
 //
 // ammohistory.h
 //
+#pragma once
+#ifndef AMMOHISTORY_H
+#define AMMOHISTORY_H
 
 // this is the max number of items in each bucket
 #define MAX_WEAPON_POSITIONS		MAX_WEAPON_SLOTS
@@ -137,3 +140,4 @@ public:
 };
 
 extern HistoryResource gHR;
+#endif // AMMOHISTORY_H
diff --git a/cl_dll/camera.h b/cl_dll/camera.h
index 448b22ca..69a00216 100644
--- a/cl_dll/camera.h
+++ b/cl_dll/camera.h
@@ -7,7 +7,7 @@
 
 // Camera.h  --  defines and such for a 3rd person camera
 // NOTE: must include quakedef.h first
-
+#pragma once
 #ifndef _CAMERA_H_
 #define _CAMERA_H_
 
diff --git a/cl_dll/cdll_int.cpp b/cl_dll/cdll_int.cpp
index 13200a89..fec09792 100644
--- a/cl_dll/cdll_int.cpp
+++ b/cl_dll/cdll_int.cpp
@@ -21,6 +21,13 @@
 #include "hud.h"
 #include "cl_util.h"
 #include "netadr.h"
+#include "parsemsg.h"
+
+#if defined(GOLDSOURCE_SUPPORT) && (defined(_WIN32) || defined(__linux__) || defined(__APPLE__)) && (defined(__i386) || defined(_M_IX86))
+#define USE_VGUI_FOR_GOLDSOURCE_SUPPORT
+#include "VGUI_Panel.h"
+#include "VGUI_App.h"
+#endif
 
 extern "C"
 {
@@ -32,10 +39,21 @@ extern "C"
 cl_enginefunc_t gEngfuncs;
 CHud gHUD;
 mobile_engfuncs_t *gMobileEngfuncs = NULL;
+
+extern "C" int g_bhopcap;
 void InitInput( void );
 void EV_HookEvents( void );
 void IN_Commands( void );
 
+int __MsgFunc_Bhopcap( const char *pszName, int iSize, void *pbuf )
+{
+	BEGIN_READ( pbuf, iSize );
+
+	g_bhopcap = READ_BYTE();
+
+	return 1;
+}
+
 /*
 ========================== 
     Initialize
@@ -76,18 +94,18 @@ int DLLEXPORT HUD_GetHullBounds( int hullnumber, float *mins, float *maxs )
 	switch( hullnumber )
 	{
 	case 0:				// Normal player
-		mins = Vector( -16, -16, -36 );
-		maxs = Vector( 16, 16, 36 );
+		Vector( -16, -16, -36 ).CopyToArray(mins);
+		Vector( 16, 16, 36 ).CopyToArray(maxs);
 		iret = 1;
 		break;
 	case 1:				// Crouched player
-		mins = Vector( -16, -16, -18 );
-		maxs = Vector( 16, 16, 18 );
+		Vector( -16, -16, -18 ).CopyToArray(mins);
+		Vector( 16, 16, 18 ).CopyToArray(maxs);
 		iret = 1;
 		break;
 	case 2:				// Point based hull
-		mins = Vector( 0, 0, 0 );
-		maxs = Vector( 0, 0, 0 );
+		Vector( 0, 0, 0 ).CopyToArray(mins);
+		Vector( 0, 0, 0 ).CopyToArray(maxs);
 		iret = 1;
 		break;
 	}
@@ -165,6 +183,46 @@ int *HUD_GetRect( void )
 	return extent;
 }
 
+#ifdef USE_VGUI_FOR_GOLDSOURCE_SUPPORT
+class TeamFortressViewport : public vgui::Panel
+{
+public:
+	TeamFortressViewport(int x,int y,int wide,int tall);
+	void Initialize( void );
+
+	virtual void paintBackground();
+	void *operator new( size_t stAllocateBlock );
+};
+
+static TeamFortressViewport* gViewPort = NULL;
+
+TeamFortressViewport::TeamFortressViewport(int x, int y, int wide, int tall) : Panel(x, y, wide, tall)
+{
+	gViewPort = this;
+	Initialize();
+}
+
+void TeamFortressViewport::Initialize()
+{
+	//vgui::App::getInstance()->setCursorOveride( vgui::App::getInstance()->getScheme()->getCursor(vgui::Scheme::scu_none) );
+}
+
+void TeamFortressViewport::paintBackground()
+{
+//	int wide, tall;
+//	getParent()->getSize( wide, tall );
+//	setSize( wide, tall );
+	gEngfuncs.VGui_ViewportPaintBackground(HUD_GetRect());
+}
+
+void *TeamFortressViewport::operator new( size_t stAllocateBlock )
+{
+	void *mem = ::operator new( stAllocateBlock );
+	memset( mem, 0, stAllocateBlock );
+	return mem;
+}
+#endif
+
 /*
 ==========================
 	HUD_VidInit
@@ -178,7 +236,25 @@ so the HUD can reinitialize itself.
 int DLLEXPORT HUD_VidInit( void )
 {
 	gHUD.VidInit();
+#ifdef USE_VGUI_FOR_GOLDSOURCE_SUPPORT
+	vgui::Panel* root=(vgui::Panel*)gEngfuncs.VGui_GetPanel();
+	if (root) {
+		gEngfuncs.Con_Printf( "Root VGUI panel exists\n" );
+		root->setBgColor(128,128,0,0);
 
+		if (gViewPort != NULL)
+		{
+			gViewPort->Initialize();
+		}
+		else
+		{
+			gViewPort = new TeamFortressViewport(0,0,root->getWide(),root->getTall());
+			gViewPort->setParent(root);
+		}
+	} else {
+		gEngfuncs.Con_Printf( "Root VGUI panel does not exist\n" );
+	}
+#endif
 	return 1;
 }
 
@@ -196,6 +272,8 @@ void DLLEXPORT HUD_Init( void )
 {
 	InitInput();
 	gHUD.Init();
+
+	gEngfuncs.pfnHookUserMsg( "Bhopcap", __MsgFunc_Bhopcap );
 }
 
 /*
@@ -256,7 +334,13 @@ Called by engine every frame that client .dll is loaded
 */
 
 void DLLEXPORT HUD_Frame( double time )
-{	gEngfuncs.VGui_ViewportPaintBackground(HUD_GetRect());
+{
+#ifdef USE_VGUI_FOR_GOLDSOURCE_SUPPORT
+	if (!gViewPort)
+		gEngfuncs.VGui_ViewportPaintBackground(HUD_GetRect());
+#else
+	gEngfuncs.VGui_ViewportPaintBackground(HUD_GetRect());
+#endif
 }
 
 /*
@@ -291,3 +375,8 @@ void DLLEXPORT HUD_MobilityInterface( mobile_engfuncs_t *gpMobileEngfuncs )
 		return;
 	gMobileEngfuncs = gpMobileEngfuncs;
 }
+
+bool isXashFWGS()
+{
+	return gMobileEngfuncs != NULL;
+}
diff --git a/cl_dll/cl_dll.dsp b/cl_dll/cl_dll.dsp
index 6864326b..17beb9ae 100644
--- a/cl_dll/cl_dll.dsp
+++ b/cl_dll/cl_dll.dsp
@@ -43,7 +43,7 @@ RSC=rc.exe
 # PROP Ignore_Export_Lib 1
 # PROP Target_Dir ""
 # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c
-# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\utils\vgui\include" /I "..\engine" /I "..\common" /I "..\pm_shared" /I "..\dlls" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "CLIENT_DLL" /D "CLIENT_WEAPONS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\utils\false_vgui\include" /I "..\engine" /I "..\common" /I "..\pm_shared" /I "..\dlls" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "CLIENT_DLL" /D "CLIENT_WEAPONS" /YX /FD /c
 # SUBTRACT CPP /Z<none>
 # ADD BASE MTL /nologo /D "NDEBUG" /win32
 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
@@ -80,7 +80,7 @@ SOURCE="$(InputPath)"
 # PROP Ignore_Export_Lib 0
 # PROP Target_Dir ""
 # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c
-# ADD CPP /nologo /G5 /MTd /W3 /Gm /GR /GX /ZI /Od /I "..\dlls" /I "..\common" /I "..\pm_shared" /I "..\engine" /I "..\utils\vgui\include" /I "..\game_shared" /D "_DEBUG" /D "_MBCS" /D "WIN32" /D "_WINDOWS" /D "CLIENT_DLL" /D "CLIENT_WEAPONS" /FR /YX /FD /c
+# ADD CPP /nologo /G5 /MTd /W3 /Gm /GR /GX /ZI /Od /I "..\dlls" /I "..\common" /I "..\pm_shared" /I "..\engine" /I "..\utils\false_vgui\include" /I "..\game_shared" /D "_DEBUG" /D "_MBCS" /D "WIN32" /D "_WINDOWS" /D "CLIENT_DLL" /D "CLIENT_WEAPONS" /FR /YX /FD /c
 # ADD BASE MTL /nologo /D "_DEBUG" /win32
 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
 # ADD BASE RSC /l 0x409 /d "_DEBUG"
@@ -300,7 +300,15 @@ SOURCE=.\input.cpp
 # End Source File
 # Begin Source File
 
-SOURCE=.\inputw32.cpp
+SOURCE=.\input_goldsource.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\input_mouse.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\input_xash3d.cpp
 # End Source File
 # Begin Source File
 
@@ -513,6 +521,10 @@ SOURCE=.\in_defs.h
 # End Source File
 # Begin Source File
 
+SOURCE=.\input_mouse.h
+# End Source File
+# Begin Source File
+
 SOURCE=..\common\itrackeruser.h
 # End Source File
 # Begin Source File
diff --git a/cl_dll/cl_dll.h b/cl_dll/cl_dll.h
index fda4b812..6e1c4e69 100644
--- a/cl_dll/cl_dll.h
+++ b/cl_dll/cl_dll.h
@@ -25,6 +25,9 @@
 //		- Drawing the HUD graphics every frame
 //		- Handling the custum HUD-update packets
 //
+#pragma once
+#ifndef CL_DLL_H
+#define CL_DLL_H
 typedef unsigned char byte;
 typedef unsigned short word;
 typedef float vec_t;
@@ -41,6 +44,11 @@ typedef int ( *pfnUserMsgHook )( const char *pszName, int iSize, void *pbuf );
 #include "exportdef.h"
 #include <string.h>
 
+#if defined(__LP64__) || defined(__LLP64__) || defined(_WIN64) || (defined(__x86_64__) && !defined(__ILP32__) ) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__)
+  #define XASH_64BIT
+#endif
+
 extern cl_enginefunc_t gEngfuncs;
 #include "../engine/mobility_int.h"
 extern mobile_engfuncs_t *gMobileEngfuncs;
+#endif
diff --git a/cl_dll/cl_util.h b/cl_dll/cl_util.h
index 54dcede0..23f12230 100644
--- a/cl_dll/cl_util.h
+++ b/cl_dll/cl_util.h
@@ -15,7 +15,8 @@
 //
 // cl_util.h
 //
-
+#ifndef CL_UTIL_H
+#define CL_UTIL_H
 #include "exportdef.h"
 #include "cvardef.h"
 
@@ -94,8 +95,12 @@ inline void DrawSetTextColor( float r, float g, float b )
 inline int SPR_Height( HSPRITE x, int f )	{ return gEngfuncs.pfnSPR_Height(x, f); }
 inline int SPR_Width( HSPRITE x, int f )	{ return gEngfuncs.pfnSPR_Width(x, f); }
 
-inline 	client_textmessage_t	*TextMessageGet( const char *pName ) { return gEngfuncs.pfnTextMessageGet( pName ); }
-inline 	int						TextMessageDrawChar( int x, int y, int number, int r, int g, int b ) 
+inline client_textmessage_t *TextMessageGet( const char *pName )
+{
+	return gEngfuncs.pfnTextMessageGet( pName );
+}
+
+inline int TextMessageDrawChar( int x, int y, int number, int r, int g, int b ) 
 {
 	return gEngfuncs.pfnDrawCharacter( x, y, number, r, g, b ); 
 }
@@ -115,7 +120,7 @@ inline void GetConsoleStringSize( const char *string, int *width, int *height )
 		gEngfuncs.pfnDrawConsoleStringLen( (char*)string, width, height );
 }
 
-int DrawUtfString( int xpos, int ypos, int iMaxX, char *szIt, int r, int g, int b );
+int DrawUtfString( int xpos, int ypos, int iMaxX, const char *szIt, int r, int g, int b );
 
 inline int ConsoleStringLen( const char *string )
 {
@@ -140,7 +145,7 @@ inline void CenterPrint( const char *string )
 #define GetPlayerInfo ( *gEngfuncs.pfnGetPlayerInfo )
 
 // sound functions
-inline void PlaySound( char *szSound, float vol ) { gEngfuncs.pfnPlaySoundByName( szSound, vol ); }
+inline void PlaySound( const char *szSound, float vol ) { gEngfuncs.pfnPlaySoundByName( szSound, vol ); }
 inline void PlaySound( int iSound, float vol ) { gEngfuncs.pfnPlaySoundByIndex( iSound, vol ); }
 
 #define max(a, b)  (((a) > (b)) ? (a) : (b))
@@ -175,3 +180,6 @@ inline void UnpackRGB( int &r, int &g, int &b, unsigned long ulRGB )\
 }
 
 HSPRITE LoadSprite( const char *pszName );
+
+bool isXashFWGS();
+#endif
diff --git a/cl_dll/com_weapons.cpp b/cl_dll/com_weapons.cpp
index 4f539df9..5621149b 100644
--- a/cl_dll/com_weapons.cpp
+++ b/cl_dll/com_weapons.cpp
@@ -41,12 +41,12 @@ COM_Log
 Log debug messages to file ( appends )
 ====================
 */
-void COM_Log( char *pszFile, char *fmt, ... )
+void COM_Log( const char *pszFile, const char *fmt, ... )
 {
 	va_list		argptr;
 	char		string[1024];
 	FILE *fp;
-	char *pfilename;
+	const char *pfilename;
 
 	if( !pszFile )
 	{
@@ -111,7 +111,7 @@ HUD_PlaySound
 Play a sound, if we are seeing this command for the first time
 =====================
 */
-void HUD_PlaySound( char *sound, float volume )
+void HUD_PlaySound( const char *sound, float volume )
 {
 	if( !g_runfuncs || !g_finalstate )
 		return;
@@ -268,12 +268,12 @@ stub functions for such things as precaching.  So we don't have to modify weapon
  is compiled into both game and client .dlls.
 ======================
 */
-int stub_PrecacheModel( char* s )
+int stub_PrecacheModel( const char* s )
 {
 	return 0;
 }
 
-int stub_PrecacheSound( char* s )
+int stub_PrecacheSound( const char* s )
 {
 	return 0;
 }
@@ -283,7 +283,7 @@ unsigned short stub_PrecacheEvent( int type, const char *s )
 	return 0;
 }
 
-const char *stub_NameForFunction( unsigned long function )
+const char *stub_NameForFunction( void *function )
 {
 	return "func";
 }
diff --git a/cl_dll/com_weapons.h b/cl_dll/com_weapons.h
index 7e1fdd77..efe06ad6 100644
--- a/cl_dll/com_weapons.h
+++ b/cl_dll/com_weapons.h
@@ -1,4 +1,4 @@
-//========= Copyright � 1996-2002, Valve LLC, All rights reserved. ============
+//========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
 //
 // Purpose: 
 //
@@ -7,11 +7,9 @@
 
 // com_weapons.h
 // Shared weapons common function prototypes
+#pragma once
 #if !defined( COM_WEAPONSH )
 #define COM_WEAPONSH
-#ifdef _WIN32
-#pragma once
-#endif
 
 #include "hud_iface.h"
 
@@ -20,7 +18,7 @@ extern "C"
 	void _DLLEXPORT HUD_PostRunCmd( struct local_state_s *from, struct local_state_s *to, struct usercmd_s *cmd, int runfuncs, double time, unsigned int random_seed );
 }
 
-void			COM_Log( char *pszFile, char *fmt, ... );
+void			COM_Log( const char *pszFile, const char *fmt, ... );
 int				CL_IsDead( void );
 
 float			UTIL_SharedRandomFloat( unsigned int seed, float low, float high );
@@ -28,13 +26,13 @@ int				UTIL_SharedRandomLong( unsigned int seed, int low, int high );
 
 int				HUD_GetWeaponAnim( void );
 void			HUD_SendWeaponAnim( int iAnim, int body, int force );
-void			HUD_PlaySound( char *sound, float volume );
+void			HUD_PlaySound( const char *sound, float volume );
 void			HUD_PlaybackEvent( int flags, const struct edict_s *pInvoker, unsigned short eventindex, float delay, float *origin, float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2 );
 void			HUD_SetMaxSpeed( const struct edict_s *ed, float speed );
-int				stub_PrecacheModel( char* s );
-int				stub_PrecacheSound( char* s );
+int				stub_PrecacheModel( const char* s );
+int				stub_PrecacheSound( const char* s );
 unsigned short	stub_PrecacheEvent( int type, const char *s );
-const char		*stub_NameForFunction( unsigned long function );
+const char		*stub_NameForFunction( void *function );
 void			stub_SetModel( struct edict_s *e, const char *m );
 
 extern cvar_t *cl_lw;
diff --git a/cl_dll/compile.bat b/cl_dll/compile.bat
new file mode 100644
index 00000000..9270d4bc
--- /dev/null
+++ b/cl_dll/compile.bat
@@ -0,0 +1,84 @@
+@echo off
+echo Setting environment for minimal Visual C++ 6
+set INCLUDE=%MSVCDir%\VC98\Include
+set LIB=%MSVCDir%\VC98\Lib
+set PATH=%MSVCDir%\VC98\Bin;%MSVCDir%\Common\MSDev98\Bin\;%PATH%
+
+echo -- Compiler is MSVC6
+
+set XASH3DSRC=..\..\Xash3D_original
+set INCLUDES=-I../common -I../engine -I../pm_shared -I../game_shared -I../public -I../external -I../dlls -I../utils/false_vgui/include
+set SOURCES=../dlls/crossbow.cpp^
+	../dlls/crowbar.cpp^
+	../dlls/egon.cpp^
+	../dlls/gauss.cpp^
+	../dlls/handgrenade.cpp^
+	../dlls/hornetgun.cpp^
+	../dlls/mp5.cpp^
+	../dlls/python.cpp^
+	../dlls/rpg.cpp^
+	../dlls/satchel.cpp^
+	../dlls/shotgun.cpp^
+	../dlls/squeakgrenade.cpp^
+	../dlls/tripmine.cpp^
+	../dlls/glock.cpp^
+	ev_hldm.cpp^
+	hl/hl_baseentity.cpp^
+	hl/hl_events.cpp^
+	hl/hl_objects.cpp^
+	hl/hl_weapons.cpp^
+	ammo.cpp^
+	ammo_secondary.cpp^
+	ammohistory.cpp^
+	battery.cpp^
+	cdll_int.cpp^
+	com_weapons.cpp^
+	death.cpp^
+	demo.cpp^
+	entity.cpp^
+	ev_common.cpp^
+	events.cpp^
+	flashlight.cpp^
+	GameStudioModelRenderer.cpp^
+	geiger.cpp^
+	health.cpp^
+	hud.cpp^
+	hud_msg.cpp^
+	hud_redraw.cpp^
+	hud_spectator.cpp^
+	hud_update.cpp^
+	in_camera.cpp^
+	input.cpp^
+	input_goldsource.cpp^
+	input_mouse.cpp^
+	input_xash3d.cpp^
+	menu.cpp^
+	message.cpp^
+	overview.cpp^
+	parsemsg.cpp^
+	../pm_shared/pm_debug.c^
+	../pm_shared/pm_math.c^
+	../pm_shared/pm_shared.c^
+	saytext.cpp^
+	status_icons.cpp^
+	statusbar.cpp^
+	studio_util.cpp^
+	StudioModelRenderer.cpp^
+	text_message.cpp^
+	train.cpp^
+	tri.cpp^
+	util.cpp^
+	view.cpp^
+	scoreboard.cpp^
+	MOTD.cpp
+set DEFINES=/DCLIENT_DLL /DCLIENT_WEAPONS /Dsnprintf=_snprintf /DNO_VOICEGAMEMGR /DGOLDSOURCE_SUPPORT
+set LIBS=user32.lib Winmm.lib
+set OUTNAME=client.dll
+set DEBUG=/debug
+
+cl %DEFINES% %LIBS% %SOURCES% %INCLUDES% -o %OUTNAME% /link /dll /out:%OUTNAME% %DEBUG%
+
+echo -- Compile done. Cleaning...
+
+del *.obj *.exp *.lib *.ilk
+echo -- Done.
diff --git a/cl_dll/death.cpp b/cl_dll/death.cpp
index 455dfd36..579fc255 100644
--- a/cl_dll/death.cpp
+++ b/cl_dll/death.cpp
@@ -187,7 +187,8 @@ int CHudDeathNotice::MsgFunc_DeathMsg( const char *pszName, int iSize, void *pbu
 	gHUD.m_Scoreboard.GetAllPlayersInfo();
 
 	// Get the Killer's name
-	char *killer_name = g_PlayerInfoList[killer].name;
+	const char *killer_name = "";
+	killer_name = g_PlayerInfoList[killer].name;
 	if( !killer_name )
 	{
 		killer_name = "";
@@ -201,11 +202,11 @@ int CHudDeathNotice::MsgFunc_DeathMsg( const char *pszName, int iSize, void *pbu
 	}
 
 	// Get the Victim's name
-	char *victim_name = NULL;
+	const char *victim_name = "";
 	// If victim is -1, the killer killed a specific, non-player object (like a sentrygun)
-	if ( ( (char)victim ) != -1 )
+	if( ( (char)victim ) != -1 )
 		victim_name = g_PlayerInfoList[victim].name;
-	if ( !victim_name )
+	if( !victim_name )
 	{
 		victim_name = "";
 		rgDeathNoticeList[i].szVictim[0] = 0;
@@ -218,7 +219,7 @@ int CHudDeathNotice::MsgFunc_DeathMsg( const char *pszName, int iSize, void *pbu
 	}
 
 	// Is it a non-player object kill?
-	if ( ( (char)victim ) == -1 )
+	if( ( (char)victim ) == -1 )
 	{
 		rgDeathNoticeList[i].iNonPlayerKill = TRUE;
 
@@ -227,10 +228,10 @@ int CHudDeathNotice::MsgFunc_DeathMsg( const char *pszName, int iSize, void *pbu
 	}
 	else
 	{
-		if ( killer == victim || killer == 0 )
+		if( killer == victim || killer == 0 )
 			rgDeathNoticeList[i].iSuicide = TRUE;
 
-		if ( !strcmp( killedwith, "d_teammate" ) )
+		if( !strcmp( killedwith, "d_teammate" ) )
 			rgDeathNoticeList[i].iTeamKill = TRUE;
 	}
 
@@ -285,7 +286,7 @@ int CHudDeathNotice::MsgFunc_DeathMsg( const char *pszName, int iSize, void *pbu
 			// replace the code names with the 'real' names
 			if( !strcmp( killedwith + 2, "egon" ) )
 				strcpy( killedwith, "d_gluon gun" );
-			if ( !strcmp( killedwith + 2, "gauss" ) )
+			if( !strcmp( killedwith + 2, "gauss" ) )
 				strcpy( killedwith, "d_tau cannon" );
 
 			ConsolePrint( killedwith + 2 ); // skip over the "d_" part
diff --git a/cl_dll/demo.h b/cl_dll/demo.h
index a0a1b30e..b7dbaff0 100644
--- a/cl_dll/demo.h
+++ b/cl_dll/demo.h
@@ -5,9 +5,9 @@
 // $NoKeywords: $
 //=============================================================================
 
+#pragma once
 #if !defined( DEMOH )
 #define DEMOH
-#pragma once
 
 // Types of demo messages we can write/parse
 enum
diff --git a/cl_dll/entity.cpp b/cl_dll/entity.cpp
index 07bd0ff3..303a9d25 100644
--- a/cl_dll/entity.cpp
+++ b/cl_dll/entity.cpp
@@ -585,10 +585,10 @@ void DLLEXPORT HUD_TempEntUpdate (
 	static int gTempEntFrame = 0;
 	int			i;
 	TEMPENTITY	*pTemp, *pnext, *pprev;
-	float		freq, gravity, gravitySlow, life, fastFreq;
+	float		/*freq,*/ gravity, gravitySlow, life, fastFreq;
 
 	// Nothing to simulate
-	if ( !*ppTempEntActive )		
+	if( !*ppTempEntActive )	
 		return;
 
 	// in order to have tents collide with players, we have to run the player prediction code so
@@ -601,7 +601,7 @@ void DLLEXPORT HUD_TempEntUpdate (
 	gEngfuncs.pEventAPI->EV_PushPMStates();
 
 	// Now add in all of the players.
-	gEngfuncs.pEventAPI->EV_SetSolidPlayers( -1 );	
+	gEngfuncs.pEventAPI->EV_SetSolidPlayers( -1 );
 
 	// !!!BUGBUG	-- This needs to be time based
 	gTempEntFrame = ( gTempEntFrame + 1 ) & 31;
@@ -623,7 +623,7 @@ void DLLEXPORT HUD_TempEntUpdate (
 	}
 
 	pprev = NULL;
-	freq = client_time * 0.01;
+	//freq = client_time * 0.01;
 	fastFreq = client_time * 5.5;
 	gravity = -frametime * cl_gravity;
 	gravitySlow = gravity * 0.5;
@@ -709,12 +709,12 @@ void DLLEXPORT HUD_TempEntUpdate (
 			}
 			else if( pTemp->flags & FTENT_SPIRAL )
 			{
-				float s, c;
+				/*float s, c;
 				s = sin( pTemp->entity.baseline.origin[2] + fastFreq );
-				c = cos( pTemp->entity.baseline.origin[2] + fastFreq );
+				c = cos( pTemp->entity.baseline.origin[2] + fastFreq );*/
 
-				pTemp->entity.origin[0] += pTemp->entity.baseline.origin[0] * frametime + 8 * sin( client_time * 20 + (int)(size_t)pTemp );
-				pTemp->entity.origin[1] += pTemp->entity.baseline.origin[1] * frametime + 4 * sin( client_time * 30 + (int)(size_t)pTemp );
+				pTemp->entity.origin[0] += pTemp->entity.baseline.origin[0] * frametime + 8 * sin( client_time * 20 + (size_t)pTemp );
+				pTemp->entity.origin[1] += pTemp->entity.baseline.origin[1] * frametime + 4 * sin( client_time * 30 + (size_t)pTemp );
 				pTemp->entity.origin[2] += pTemp->entity.baseline.origin[2] * frametime;
 			}
 			else 
diff --git a/cl_dll/ev_hldm.cpp b/cl_dll/ev_hldm.cpp
index 5bb175eb..98158715 100644
--- a/cl_dll/ev_hldm.cpp
+++ b/cl_dll/ev_hldm.cpp
@@ -38,7 +38,7 @@
 
 extern engine_studio_api_t IEngineStudio;
 
-static int tracerCount[32];
+static int g_tracerCount[32];
 
 extern "C" char PM_FindTextureType( char *name );
 
@@ -104,7 +104,7 @@ float EV_HLDM_PlayTextureSound( int idx, pmtrace_t *ptr, float *vecSrc, float *v
 	char chTextureType = CHAR_TEX_CONCRETE;
 	float fvol;
 	float fvolbar;
-	char *rgsz[4];
+	const char *rgsz[4];
 	int cnt;
 	float fattn = ATTN_NORM;
 	int entity;
@@ -583,7 +583,7 @@ void EV_FireShotGunDouble( event_args_t *args )
 	vec3_t vecSrc, vecAiming;
 	vec3_t vecSpread;
 	vec3_t up, right, forward;
-	float flSpread = 0.01;
+	//float flSpread = 0.01;
 
 	idx = args->entindex;
 	VectorCopy( args->origin, origin );
@@ -616,11 +616,11 @@ void EV_FireShotGunDouble( event_args_t *args )
 
 	if( gEngfuncs.GetMaxClients() > 1 )
 	{
-		EV_HLDM_FireBullets( idx, forward, right, up, 8, vecSrc, vecAiming, 2048, BULLET_PLAYER_BUCKSHOT, 0, &tracerCount[idx - 1], 0.17365, 0.04362 );
+		EV_HLDM_FireBullets( idx, forward, right, up, 8, vecSrc, vecAiming, 2048, BULLET_PLAYER_BUCKSHOT, 0, &g_tracerCount[idx - 1], 0.17365, 0.04362 );
 	}
 	else
 	{
-		EV_HLDM_FireBullets( idx, forward, right, up, 12, vecSrc, vecAiming, 2048, BULLET_PLAYER_BUCKSHOT, 0, &tracerCount[idx - 1], 0.08716, 0.08716 );
+		EV_HLDM_FireBullets( idx, forward, right, up, 12, vecSrc, vecAiming, 2048, BULLET_PLAYER_BUCKSHOT, 0, &g_tracerCount[idx - 1], 0.08716, 0.08716 );
 	}
 }
 
@@ -637,7 +637,7 @@ void EV_FireShotGunSingle( event_args_t *args )
 	vec3_t vecSrc, vecAiming;
 	vec3_t vecSpread;
 	vec3_t up, right, forward;
-	float flSpread = 0.01;
+	//float flSpread = 0.01;
 
 	idx = args->entindex;
 	VectorCopy( args->origin, origin );
@@ -668,11 +668,11 @@ void EV_FireShotGunSingle( event_args_t *args )
 
 	if( gEngfuncs.GetMaxClients() > 1 )
 	{
-		EV_HLDM_FireBullets( idx, forward, right, up, 4, vecSrc, vecAiming, 2048, BULLET_PLAYER_BUCKSHOT, 0, &tracerCount[idx - 1], 0.08716, 0.04362 );
+		EV_HLDM_FireBullets( idx, forward, right, up, 4, vecSrc, vecAiming, 2048, BULLET_PLAYER_BUCKSHOT, 0, &g_tracerCount[idx - 1], 0.08716, 0.04362 );
 	}
 	else
 	{
-		EV_HLDM_FireBullets( idx, forward, right, up, 6, vecSrc, vecAiming, 2048, BULLET_PLAYER_BUCKSHOT, 0, &tracerCount[idx - 1], 0.08716, 0.08716 );
+		EV_HLDM_FireBullets( idx, forward, right, up, 6, vecSrc, vecAiming, 2048, BULLET_PLAYER_BUCKSHOT, 0, &g_tracerCount[idx - 1], 0.08716, 0.08716 );
 	}
 }
 //======================
@@ -694,7 +694,7 @@ void EV_FireMP5( event_args_t *args )
 	int shell;
 	vec3_t vecSrc, vecAiming;
 	vec3_t up, right, forward;
-	float flSpread = 0.01;
+	//float flSpread = 0.01;
 
 	idx = args->entindex;
 	VectorCopy( args->origin, origin );
@@ -733,11 +733,11 @@ void EV_FireMP5( event_args_t *args )
 
 	if( gEngfuncs.GetMaxClients() > 1 )
 	{
-		EV_HLDM_FireBullets( idx, forward, right, up, 1, vecSrc, vecAiming, 8192, BULLET_PLAYER_MP5, 2, &tracerCount[idx - 1], args->fparam1, args->fparam2 );
+		EV_HLDM_FireBullets( idx, forward, right, up, 1, vecSrc, vecAiming, 8192, BULLET_PLAYER_MP5, 2, &g_tracerCount[idx - 1], args->fparam1, args->fparam2 );
 	}
 	else
 	{
-		EV_HLDM_FireBullets( idx, forward, right, up, 1, vecSrc, vecAiming, 8192, BULLET_PLAYER_MP5, 2, &tracerCount[idx - 1], args->fparam1, args->fparam2 );
+		EV_HLDM_FireBullets( idx, forward, right, up, 1, vecSrc, vecAiming, 8192, BULLET_PLAYER_MP5, 2, &g_tracerCount[idx - 1], args->fparam1, args->fparam2 );
 	}
 }
 
@@ -784,7 +784,7 @@ void EV_FirePython( event_args_t *args )
 
 	vec3_t vecSrc, vecAiming;
 	vec3_t up, right, forward;
-	float flSpread = 0.01;
+	//float flSpread = 0.01;
 
 	idx = args->entindex;
 	VectorCopy( args->origin, origin );
@@ -875,16 +875,16 @@ void EV_FireGauss( event_args_t *args )
 	vec3_t angles;
 	vec3_t velocity;
 	float flDamage = args->fparam1;
-	int primaryfire = args->bparam1;
+	//int primaryfire = args->bparam1;
 
 	int m_fPrimaryFire = args->bparam1;
-	int m_iWeaponVolume = GAUSS_PRIMARY_FIRE_VOLUME;
+	//int m_iWeaponVolume = GAUSS_PRIMARY_FIRE_VOLUME;
 	vec3_t vecSrc;
 	vec3_t vecDest;
-	edict_t		*pentIgnore;
+	//edict_t		*pentIgnore;
 	pmtrace_t tr, beam_tr;
 	float flMaxFrac = 1.0;
-	int nTotal = 0;
+	//int nTotal = 0;
 	int fHasPunched = 0;
 	int fFirstBeam = 1;
 	int nMaxHits = 10;
@@ -995,7 +995,7 @@ void EV_FireGauss( event_args_t *args )
 		{
 			float n;
 
-			pentIgnore = NULL;
+			//pentIgnore = NULL;
 
 			n = -DotProduct( tr.plane.normal, forward );
 
@@ -1152,7 +1152,13 @@ enum crowbar_e
 	CROWBAR_ATTACK2MISS,
 	CROWBAR_ATTACK2HIT,
 	CROWBAR_ATTACK3MISS,
+#ifndef CROWBAR_IDLE_ANIM
 	CROWBAR_ATTACK3HIT
+#else
+	CROWBAR_ATTACK3HIT,
+	CROWBAR_IDLE2,
+	CROWBAR_IDLE3
+#endif
 };
 
 int g_iSwing;
@@ -1174,8 +1180,6 @@ void EV_Crowbar( event_args_t *args )
 
 	if( EV_IsLocal( idx ) )
 	{
-		gEngfuncs.pEventAPI->EV_WeaponAnimation( CROWBAR_ATTACK1MISS, 1 );
-
 		switch( (g_iSwing++) % 3 )
 		{
 			case 0:
@@ -1463,13 +1467,13 @@ enum hgun_e
 
 void EV_HornetGunFire( event_args_t *args )
 {
-	int idx, iFireMode;
+	int idx; //, iFireMode;
 	vec3_t origin, angles, vecSrc, forward, right, up;
 
 	idx = args->entindex;
 	VectorCopy( args->origin, origin );
 	VectorCopy( args->angles, angles );
-	iFireMode = args->iparam1;
+	//iFireMode = args->iparam1;
 
 	//Only play the weapon anims if I shot it.
 	if( EV_IsLocal( idx ) )
@@ -1478,7 +1482,7 @@ void EV_HornetGunFire( event_args_t *args )
 		gEngfuncs.pEventAPI->EV_WeaponAnimation( HGUN_SHOOT, 1 );
 	}
 
-	switch( gEngfuncs.pfnRandomLong( 0 , 2 ) )
+	switch( gEngfuncs.pfnRandomLong( 0, 2 ) )
 	{
 		case 0:
 			gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "agrunt/ag_fire1.wav", 1, ATTN_NORM, 0, 100 );
@@ -1614,7 +1618,7 @@ void EV_TrainPitchAdjust( event_args_t *args )
 	int pitch;
 	int stop;
 
-	char sz[256];
+	const char *pszSound;
 
 	idx = args->entindex;
 
@@ -1630,36 +1634,35 @@ void EV_TrainPitchAdjust( event_args_t *args )
 	switch( noise )
 	{
 	case 1:
-		strcpy( sz, "plats/ttrain1.wav" );
+		pszSound = "plats/ttrain1.wav";
 		break;
 	case 2:
-		strcpy( sz, "plats/ttrain2.wav" );
+		pszSound = "plats/ttrain2.wav";
 		break;
 	case 3:
-		strcpy( sz, "plats/ttrain3.wav" );
+		pszSound = "plats/ttrain3.wav";
 		break; 
 	case 4:
-		strcpy( sz, "plats/ttrain4.wav");
+		pszSound = "plats/ttrain4.wav";
 		break;
 	case 5:
-		strcpy( sz, "plats/ttrain6.wav");
+		pszSound = "plats/ttrain6.wav";
 		break;
 	case 6:
-		strcpy( sz, "plats/ttrain7.wav");
+		pszSound = "plats/ttrain7.wav";
 		break;
 	default:
 		// no sound
-		strcpy( sz, "" );
 		return;
 	}
 
 	if( stop )
 	{
-		gEngfuncs.pEventAPI->EV_StopSound( idx, CHAN_STATIC, sz );
+		gEngfuncs.pEventAPI->EV_StopSound( idx, CHAN_STATIC, pszSound );
 	}
 	else
 	{
-		gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_STATIC, sz, m_flVolume, ATTN_NORM, SND_CHANGE_PITCH, pitch );
+		gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_STATIC, pszSound, m_flVolume, ATTN_NORM, SND_CHANGE_PITCH, pitch );
 	}
 }
 
diff --git a/cl_dll/ev_hldm.h b/cl_dll/ev_hldm.h
index e024cb51..9b449bb2 100644
--- a/cl_dll/ev_hldm.h
+++ b/cl_dll/ev_hldm.h
@@ -5,6 +5,7 @@
 // $NoKeywords: $
 //=============================================================================
 
+#pragma once
 #if !defined ( EV_HLDMH )
 #define EV_HLDMH
 
diff --git a/cl_dll/eventscripts.h b/cl_dll/eventscripts.h
index bb835474..c11ee338 100644
--- a/cl_dll/eventscripts.h
+++ b/cl_dll/eventscripts.h
@@ -6,6 +6,7 @@
 //=============================================================================
 
 // eventscripts.h
+#pragma once
 #if !defined ( EVENTSCRIPTSH )
 #define EVENTSCRIPTSH
 
diff --git a/cl_dll/flashlight.cpp b/cl_dll/flashlight.cpp
index 96f2fa63..9a21433f 100644
--- a/cl_dll/flashlight.cpp
+++ b/cl_dll/flashlight.cpp
@@ -51,6 +51,8 @@ void CHudFlashlight::Reset( void )
 {
 	m_fFade = 0;
 	m_fOn = 0;
+	m_iBat = 100;
+	m_flBat = 1.0;
 }
 
 int CHudFlashlight::VidInit( void )
diff --git a/cl_dll/geiger.cpp b/cl_dll/geiger.cpp
index 7ccaf1d3..097889b9 100644
--- a/cl_dll/geiger.cpp
+++ b/cl_dll/geiger.cpp
@@ -65,7 +65,7 @@ int CHudGeiger::Draw( float flTime )
 {
 	int pct;
 	float flvol = 0.0f;
-	int rg[3];
+	//int rg[3];
 	int i;
 
 	if( m_iGeigerRange < 1000 && m_iGeigerRange > 0 )
@@ -79,61 +79,61 @@ int CHudGeiger::Draw( float flTime )
 		{
 			pct = 2;
 			flvol = 0.4;	//Con_Printf( "range > 600\n" );
-			rg[0] = 1;
-			rg[1] = 1;
+			//rg[0] = 1;
+			//rg[1] = 1;
 			i = 2;
 		}
 		else if( m_iGeigerRange > 500 )
 		{
 			pct = 4;
 			flvol = 0.5;	//Con_Printf( "range > 500\n" );
-			rg[0] = 1;
-			rg[1] = 2;
+			//rg[0] = 1;
+			//rg[1] = 2;
 			i = 2;
 		}
 		else if( m_iGeigerRange > 400 )
 		{
 			pct = 8;
 			flvol = 0.6;	//Con_Printf( "range > 400\n" );
-			rg[0] = 1;
-			rg[1] = 2;
-			rg[2] = 3;
+			//rg[0] = 1;
+			//rg[1] = 2;
+			//rg[2] = 3;
 			i = 3;
 		}
 		else if( m_iGeigerRange > 300 )
 		{
 			pct = 8;
 			flvol = 0.7;	//Con_Printf( "range > 300\n" );
-			rg[0] = 2;
-			rg[1] = 3;
-			rg[2] = 4;
+			//rg[0] = 2;
+			//rg[1] = 3;
+			//rg[2] = 4;
 			i = 3;
 		}
 		else if( m_iGeigerRange > 200 )
 		{
 			pct = 28;
 			flvol = 0.78;	//Con_Printf( "range > 200\n" );
-			rg[0] = 2;
-			rg[1] = 3;
-			rg[2] = 4;
+			//rg[0] = 2;
+			//rg[1] = 3;
+			//rg[2] = 4;
 			i = 3;
 		}
 		else if( m_iGeigerRange > 150 )
 		{
 			pct = 40;
 			flvol = 0.80;	//Con_Printf( "range > 150\n" );
-			rg[0] = 3;
-			rg[1] = 4;
-			rg[2] = 5;
+			//rg[0] = 3;
+			//rg[1] = 4;
+			//rg[2] = 5;
 			i = 3;
 		}
 		else if( m_iGeigerRange > 100 )
 		{
 			pct = 60;
 			flvol = 0.85;	//Con_Printf( "range > 100\n" );
-			rg[0] = 3;
-			rg[1] = 4;
-			rg[2] = 5;
+			//rg[0] = 3;
+			//rg[1] = 4;
+			//rg[2] = 5;
 			i = 3;
 		}
 		else if( m_iGeigerRange > 75 )
@@ -141,29 +141,29 @@ int CHudGeiger::Draw( float flTime )
 			pct = 80;
 			flvol = 0.9;	//Con_Printf( "range > 75\n" );
 			//gflGeigerDelay = cl.time + GEIGERDELAY * 0.75;
-			rg[0] = 4;
-			rg[1] = 5;
-			rg[2] = 6;
+			//rg[0] = 4;
+			//rg[1] = 5;
+			//rg[2] = 6;
 			i = 3;
 		}
 		else if( m_iGeigerRange > 50 )
 		{
 			pct = 90;
 			flvol = 0.95;	//Con_Printf( "range > 50\n" );
-			rg[0] = 5;
-			rg[1] = 6;
+			//rg[0] = 5;
+			//rg[1] = 6;
 			i = 2;
 		}
 		else
 		{
 			pct = 95;
 			flvol = 1.0;	//Con_Printf( "range < 50\n" );
-			rg[0] = 5;
-			rg[1] = 6;
+			//rg[0] = 5;
+			//rg[1] = 6;
 			i = 2;
 		}
 
-		flvol = ( flvol * ( (rand() & 127) ) / 255) + 0.25; // UTIL_RandomFloat(0.25, 0.5);
+		flvol = ( flvol * ( ( rand() & 127 ) ) / 255 ) + 0.25; // UTIL_RandomFloat( 0.25, 0.5 );
 
 		if( ( rand() & 127 ) < pct || ( rand() & 127 ) < pct )
 		{
diff --git a/cl_dll/health.h b/cl_dll/health.h
index 132b9cb4..62d7e0bc 100644
--- a/cl_dll/health.h
+++ b/cl_dll/health.h
@@ -12,6 +12,9 @@
 *   without written permission from Valve LLC.
 *
 ****/
+#pragma once
+#ifndef HEALTH_H
+#define HEALTH_H
 
 #define DMG_IMAGE_LIFE		2	// seconds that image is up
 
@@ -122,3 +125,4 @@ private:
 	void CalcDamageDirection( vec3_t vecFrom );
 	void UpdateTiles( float fTime, long bits );
 };
+#endif // HEALTH_H
diff --git a/cl_dll/hl/hl_baseentity.cpp b/cl_dll/hl/hl_baseentity.cpp
index 33195001..c1a56dee 100644
--- a/cl_dll/hl/hl_baseentity.cpp
+++ b/cl_dll/hl/hl_baseentity.cpp
@@ -54,7 +54,8 @@ int CBaseEntity::IsDormant( void ) { return 0; }
 BOOL CBaseEntity::IsInWorld( void ) { return TRUE; }
 int CBaseEntity::ShouldToggle( USE_TYPE useType, BOOL currentState ) { return 0; }
 int CBaseEntity::DamageDecal( int bitsDamageType ) { return -1; }
-CBaseEntity *CBaseEntity::Create( char *szName, const Vector &vecOrigin, const Vector &vecAngles, edict_t *pentOwner ) { return NULL; }
+CBaseEntity *CBaseEntity::Create( const char *szName, const Vector &vecOrigin, const Vector &vecAngles, edict_t *pentOwner ) { return NULL; }
+void CBaseEntity::UpdateOnRemove( void ) { }
 void CBaseEntity::SUB_Remove( void ) { }
 
 // CBaseDelay Stubs
@@ -150,7 +151,7 @@ int CBaseMonster::CheckEnemy( CBaseEntity *pEnemy ) { return 0; }
 void CBaseMonster::PushEnemy( CBaseEntity *pEnemy, Vector &vecLastKnownPos ) { }
 BOOL CBaseMonster::PopEnemy() { return FALSE; }
 void CBaseMonster::SetActivity( Activity NewActivity ) { }
-void CBaseMonster::SetSequenceByName( char *szSequence ) { }
+void CBaseMonster::SetSequenceByName( const char *szSequence ) { }
 int CBaseMonster::CheckLocalMove( const Vector &vecStart, const Vector &vecEnd, CBaseEntity *pTarget, float *pflDist ) { return 0; }
 float CBaseMonster::OpenDoorAndWait( entvars_t *pevDoor ) { return 0.0; }
 void CBaseMonster::AdvanceRoute( float distance ) { }
@@ -218,7 +219,7 @@ void CBaseMonster::MonsterInitDead( void ) { }
 BOOL CBaseMonster::BBoxFlat( void ) { return TRUE; }
 BOOL CBaseMonster::GetEnemy( void ) { return FALSE; }
 void CBaseMonster::TraceAttack( entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType) { }
-CBaseEntity* CBaseMonster::DropItem( char *pszItemName, const Vector &vecPos, const Vector &vecAng ) { return NULL; }
+CBaseEntity* CBaseMonster::DropItem( const char *pszItemName, const Vector &vecPos, const Vector &vecAng ) { return NULL; }
 BOOL CBaseMonster::ShouldFadeOnDeath( void ) { return FALSE; }
 void CBaseMonster::RadiusDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int iClassIgnore, int bitsDamageType ) { }
 void CBaseMonster::RadiusDamage( Vector vecSrc, entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int iClassIgnore, int bitsDamageType ) { }
@@ -262,8 +263,8 @@ void CBasePlayer::PreThink(void) { }
 void CBasePlayer::CheckTimeBasedDamage()  { }
 void CBasePlayer::UpdateGeigerCounter( void ) { }
 void CBasePlayer::CheckSuitUpdate() { }
-void CBasePlayer::SetSuitUpdate(char *name, int fgroup, int iNoRepeatTime) { }
-void CBasePlayer::UpdatePlayerSound ( void ) { }
+void CBasePlayer::SetSuitUpdate( const char *name, int fgroup, int iNoRepeatTime ) { }
+void CBasePlayer::UpdatePlayerSound( void ) { }
 void CBasePlayer::PostThink() { }
 void CBasePlayer::Precache( void ) { }
 int CBasePlayer::Save( CSave &save ) { return 0; }
@@ -280,7 +281,7 @@ void CBasePlayer::ForceClientDllUpdate( void ) { }
 void CBasePlayer::ImpulseCommands() { }
 void CBasePlayer::CheatImpulseCommands( int iImpulse ) { }
 int CBasePlayer::AddPlayerItem( CBasePlayerItem *pItem ) { return FALSE; }
-int CBasePlayer::RemovePlayerItem( CBasePlayerItem *pItem ) { return FALSE; }
+int CBasePlayer::RemovePlayerItem( CBasePlayerItem *pItem, bool bCallHoster ) { return FALSE; }
 void CBasePlayer::ItemPreFrame() { }
 void CBasePlayer::ItemPostFrame() { }
 int CBasePlayer::AmmoInventory( int iAmmoIndex ) { return -1; }
@@ -302,7 +303,7 @@ BOOL CBasePlayer::HasPlayerItem( CBasePlayerItem *pCheckItem ) { return FALSE; }
 BOOL CBasePlayer::SwitchWeapon( CBasePlayerItem *pWeapon )  { return FALSE; }
 Vector CBasePlayer::GetGunPosition( void ) { return g_vecZero; }
 const char *CBasePlayer::TeamID( void ) { return ""; }
-int CBasePlayer::GiveAmmo( int iCount, char *szName, int iMax ) { return 0; }
+int CBasePlayer::GiveAmmo( int iCount, const char *szName, int iMax ) { return 0; }
 void CBasePlayer::AddPoints( int score, BOOL bAllowNegativeScore ) { } 
 void CBasePlayer::AddPointsToTeam( int score, BOOL bAllowNegativeScore ) { } 
 
diff --git a/cl_dll/hl/hl_weapons.cpp b/cl_dll/hl/hl_weapons.cpp
index 4e1e9dd0..a6b6c636 100644
--- a/cl_dll/hl/hl_weapons.cpp
+++ b/cl_dll/hl/hl_weapons.cpp
@@ -84,7 +84,7 @@ AlertMessage
 Print debug messages to console
 ======================
 */
-void AlertMessage( ALERT_TYPE atype, char *szFmt, ... )
+void AlertMessage( ALERT_TYPE atype, const char *szFmt, ... )
 {
 	va_list argptr;
 	static char string[1024];
@@ -105,7 +105,7 @@ bool bIsMultiplayer( void )
 }
 
 //Just loads a v_ model.
-void LoadVModel( char *szViewModel, CBasePlayer *m_pPlayer )
+void LoadVModel( const char *szViewModel, CBasePlayer *m_pPlayer )
 {
 	gEngfuncs.CL_LoadModel( szViewModel, &m_pPlayer->pev->viewmodel );
 }
@@ -160,7 +160,7 @@ BOOL CBasePlayerWeapon::DefaultReload( int iClipSize, int iAnim, float fDelay, i
 	if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 )
 		return FALSE;
 
-	int j = min( iClipSize - m_iClip, m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] );
+	int j = Q_min( iClipSize - m_iClip, m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] );
 
 	if( j == 0 )
 		return FALSE;
@@ -217,7 +217,7 @@ CBasePlayerWeapon::DefaultDeploy
 
 =====================
 */
-BOOL CBasePlayerWeapon::DefaultDeploy( char *szViewModel, char *szWeaponModel, int iAnim, char *szAnimExt, int skiplocal, int	body )
+BOOL CBasePlayerWeapon::DefaultDeploy( const char *szViewModel, const char *szWeaponModel, int iAnim, const char *szAnimExt, int skiplocal, int body )
 {
 	if( !CanDeploy() )
 		return FALSE;
@@ -297,7 +297,7 @@ Only produces random numbers to match the server ones.
 */
 Vector CBaseEntity::FireBulletsPlayer ( ULONG cShots, Vector vecSrc, Vector vecDirShooting, Vector vecSpread, float flDistance, int iBulletType, int iTracerFreq, int iDamage, entvars_t *pevAttacker, int shared_rand )
 {
-	float x = 0, y = 0, z;
+	float x = 0.0f, y = 0.0f, z;
 
 	for( ULONG iShot = 1; iShot <= cShots; iShot++ )
 	{
@@ -569,27 +569,6 @@ void UTIL_ParticleLine( CBasePlayer *player, float *start, float *end, float lif
 	gEngfuncs.pEfxAPI->R_ParticleLine( start, end, r, g, b, life );
 }
 
-/*
-=====================
-CBasePlayerWeapon::PrintState
-
-For debugging, print out state variables to log file
-=====================
-*/
-void CBasePlayerWeapon::PrintState( void )
-{
-	COM_Log( "c:\\hl.log", "%.4f ", gpGlobals->time );
-	COM_Log( "c:\\hl.log", "%.4f ", m_pPlayer->m_flNextAttack );
-	COM_Log( "c:\\hl.log", "%.4f ", m_flNextPrimaryAttack );
-	COM_Log( "c:\\hl.log", "%.4f ", m_flTimeWeaponIdle - gpGlobals->time );
-	COM_Log( "c:\\hl.log", "%i ", m_iClip );
-}
-
-int RandomLong( int a, int b )
-{
-	return gEngfuncs.pfnRandomLong( a, b );
-}
-
 /*
 =====================
 HUD_InitClientWeapons
diff --git a/cl_dll/hud.cpp b/cl_dll/hud.cpp
index 413aa13e..9d814c1f 100644
--- a/cl_dll/hud.cpp
+++ b/cl_dll/hud.cpp
@@ -35,6 +35,7 @@ extern client_sprite_t *GetSpriteList( client_sprite_t *pList, const char *psz,
 
 extern cvar_t *sensitivity;
 cvar_t *cl_lw = NULL;
+cvar_t *cl_viewbob = NULL;
 
 void ShutdownInput( void );
 
@@ -194,6 +195,7 @@ void CHud::Init( void )
 	m_pCvarStealMouse = CVAR_CREATE( "hud_capturemouse", "1", FCVAR_ARCHIVE );
 	m_pCvarDraw = CVAR_CREATE( "hud_draw", "1", FCVAR_ARCHIVE );
 	cl_lw = gEngfuncs.pfnGetCvarPointer( "cl_lw" );
+	cl_viewbob = CVAR_CREATE( "cl_viewbob", "0", FCVAR_ARCHIVE );
 
 	m_pSpriteList = NULL;
 
diff --git a/cl_dll/hud.h b/cl_dll/hud.h
index 45da5456..16b4d7e9 100644
--- a/cl_dll/hud.h
+++ b/cl_dll/hud.h
@@ -19,7 +19,9 @@
 //
 // CHud handles the message, calculation, and drawing the HUD
 //
-
+#pragma once
+#ifndef HUD_H
+#define HUD_H
 #define RGB_YELLOWISH 0x00FFA000 //255,160,0
 #define RGB_REDISH 0x00FF1010 //255,160,0
 #define RGB_GREENISH 0x0000A000 //0,160,0
@@ -480,7 +482,7 @@ public:
 	int Init( void );
 	static char *LocaliseTextString( const char *msg, char *dst_buffer, int buffer_size );
 	static char *BufferedLocaliseTextString( const char *msg );
-	char *LookupString( const char *msg_name, int *msg_dest = NULL );
+	const char *LookupString( const char *msg_name, int *msg_dest = NULL );
 	int MsgFunc_TextMsg( const char *pszName, int iSize, void *pbuf );
 };
 
@@ -541,8 +543,8 @@ public:
 	
 	//had to make these public so CHud could access them (to enable concussion icon)
 	//could use a friend declaration instead...
-	void EnableIcon( char *pszIconName, unsigned char red, unsigned char green, unsigned char blue );
-	void DisableIcon( char *pszIconName );
+	void EnableIcon( const char *pszIconName, unsigned char red, unsigned char green, unsigned char blue );
+	void DisableIcon( const char *pszIconName );
 
 private:
 	typedef struct
@@ -606,11 +608,11 @@ public:
 
 	int m_iFontHeight;
 	int DrawHudNumber( int x, int y, int iFlags, int iNumber, int r, int g, int b );
-	int DrawHudString( int x, int y, int iMaxX, char *szString, int r, int g, int b );
-	int DrawHudStringReverse( int xpos, int ypos, int iMinX, char *szString, int r, int g, int b );
+	int DrawHudString( int x, int y, int iMaxX, const char *szString, int r, int g, int b );
+	int DrawHudStringReverse( int xpos, int ypos, int iMinX, const char *szString, int r, int g, int b );
 	int DrawHudNumberString( int xpos, int ypos, int iMinX, int iNumber, int r, int g, int b );
 	int GetNumWidth( int iNumber, int iFlags );
-	int DrawHudStringLen( char *szIt );
+	int DrawHudStringLen( const char *szIt );
 	void DrawDarkRectangle( int x, int y, int wide, int tall );
 
 private:
@@ -696,3 +698,4 @@ extern int g_iTeamNumber;
 extern int g_iUser1;
 extern int g_iUser2;
 extern int g_iUser3;
+#endif
diff --git a/cl_dll/hud_iface.h b/cl_dll/hud_iface.h
index a7a05e7e..7993bd9d 100644
--- a/cl_dll/hud_iface.h
+++ b/cl_dll/hud_iface.h
@@ -5,9 +5,9 @@
 // $NoKeywords: $
 //=============================================================================
 
+#pragma once
 #if !defined( HUD_IFACEH )
 #define HUD_IFACEH
-#pragma once
 
 #include "exportdef.h"
 
diff --git a/cl_dll/hud_redraw.cpp b/cl_dll/hud_redraw.cpp
index c30df36d..06b25a33 100644
--- a/cl_dll/hud_redraw.cpp
+++ b/cl_dll/hud_redraw.cpp
@@ -199,7 +199,7 @@ const unsigned char colors[8][3] =
 {240, 180,  24}
 };
 
-int CHud::DrawHudString( int xpos, int ypos, int iMaxX, char *szIt, int r, int g, int b )
+int CHud::DrawHudString( int xpos, int ypos, int iMaxX, const char *szIt, int r, int g, int b )
 {
 	if( hud_textmode->value == 2 )
 	{
@@ -233,36 +233,40 @@ int CHud::DrawHudString( int xpos, int ypos, int iMaxX, char *szIt, int r, int g
 	return xpos;
 }
 
-
-
-int DrawUtfString( int xpos, int ypos, int iMaxX, char *szIt, int r, int g, int b )
+int DrawUtfString( int xpos, int ypos, int iMaxX, const char *szIt, int r, int g, int b )
 {
-	// xash3d: reset unicode state
-	gEngfuncs.pfnVGUI2DrawCharacterAdditive( 0, 0, 0, 0, 0, 0, 0 );
-
-	// draw the string until we hit the null character or a newline character
-	for( ; *szIt != 0 && *szIt != '\n'; szIt++ )
+	if (isXashFWGS())
 	{
-		int w = gHUD.m_scrinfo.charWidths['M'];
-		if( xpos + w  > iMaxX )
-			return xpos;
-		if( ( *szIt == '^' ) && ( *( szIt + 1 ) >= '0') && ( *( szIt + 1 ) <= '7') )
-		{
-			szIt++;
-			r = colors[*szIt - '0'][0];
-			g = colors[*szIt - '0'][1];
-			b = colors[*szIt - '0'][2];
-			if( !*(++szIt) )
-				return xpos;
-		}
-		int c = (unsigned int)(unsigned char)*szIt;
-		xpos += gEngfuncs.pfnVGUI2DrawCharacterAdditive( xpos, ypos, c, r, g, b, 0 );
-	}
+		// xash3d: reset unicode state
+		gEngfuncs.pfnVGUI2DrawCharacterAdditive( 0, 0, 0, 0, 0, 0, 0 );
 
-	return xpos;
+		// draw the string until we hit the null character or a newline character
+		for( ; *szIt != 0 && *szIt != '\n'; szIt++ )
+		{
+			int w = gHUD.m_scrinfo.charWidths['M'];
+			if( xpos + w  > iMaxX )
+				return xpos;
+			if( ( *szIt == '^' ) && ( *( szIt + 1 ) >= '0') && ( *( szIt + 1 ) <= '7') )
+			{
+				szIt++;
+				r = colors[*szIt - '0'][0];
+				g = colors[*szIt - '0'][1];
+				b = colors[*szIt - '0'][2];
+				if( !*(++szIt) )
+					return xpos;
+			}
+			int c = (unsigned int)(unsigned char)*szIt;
+			xpos += gEngfuncs.pfnVGUI2DrawCharacterAdditive( xpos, ypos, c, r, g, b, 0 );
+		}
+		return xpos;
+	}
+	else
+	{
+		return gHUD.DrawHudString(xpos, ypos, iMaxX, szIt, r, g, b);
+	}
 }
 
-int CHud::DrawHudStringLen( char *szIt )
+int CHud::DrawHudStringLen( const char *szIt )
 {
 	int l = 0;
 	for( ; *szIt != 0 && *szIt != '\n'; szIt++ )
@@ -280,10 +284,10 @@ int CHud::DrawHudNumberString( int xpos, int ypos, int iMinX, int iNumber, int r
 }
 
 // draws a string from right to left (right-aligned)
-int CHud::DrawHudStringReverse( int xpos, int ypos, int iMinX, char *szString, int r, int g, int b )
+int CHud::DrawHudStringReverse( int xpos, int ypos, int iMinX, const char *szString, int r, int g, int b )
 {
 	// find the end of the string
-	for( char *szIt = szString; *szIt != 0; szIt++ )
+	for( const char *szIt = szString; *szIt != 0; szIt++ )
 		xpos -= gHUD.m_scrinfo.charWidths[(unsigned char)*szIt];
 	if( xpos < iMinX )
 		xpos = iMinX;
diff --git a/cl_dll/hud_spectator.cpp b/cl_dll/hud_spectator.cpp
index ff6eb8ff..5ffce74a 100644
--- a/cl_dll/hud_spectator.cpp
+++ b/cl_dll/hud_spectator.cpp
@@ -175,13 +175,13 @@ void UTIL_StringToVector( float * pVector, const char *pString )
 	}
 }
 
-int UTIL_FindEntityInMap( char * name, float * origin, float * angle )
+int UTIL_FindEntityInMap( const char *name, float *origin, float *angle )
 {
 	int			n, found = 0;
 	char			keyname[256];
 	char			token[2048];
 
-	cl_entity_t *	pEnt = gEngfuncs.GetEntityByIndex( 0 );	// get world model
+	cl_entity_t *pEnt = gEngfuncs.GetEntityByIndex( 0 );	// get world model
 
 	if( !pEnt )
 		return 0;
@@ -189,7 +189,7 @@ int UTIL_FindEntityInMap( char * name, float * origin, float * angle )
 	if( !pEnt->model )
 		return 0;
 
-	char * data = pEnt->model->entities;
+	char *data = pEnt->model->entities;
 
 	while( data )
 	{
@@ -1374,12 +1374,12 @@ void CHudSpectator::DeathMessage( int victim )
 		AddOverviewEntityToList(m_hsprPlayerDead, pl, gEngfuncs.GetClientTime() + 2.0f );
 }
 
-bool CHudSpectator::AddOverviewEntityToList(HSPRITE sprite, cl_entity_t *ent, double killTime)
+bool CHudSpectator::AddOverviewEntityToList( HSPRITE sprite, cl_entity_t *ent, double killTime )
 {
 	for( int i = 0; i < MAX_OVERVIEW_ENTITIES; i++ )
 	{
 		// find empty entity slot
-		if( m_OverviewEntities[i].entity == NULL)
+		if( m_OverviewEntities[i].entity == NULL )
 		{
 			m_OverviewEntities[i].entity = ent;
 			m_OverviewEntities[i].hSprite = sprite;
diff --git a/cl_dll/hud_spectator.h b/cl_dll/hud_spectator.h
index f60353db..7a9ec9d3 100644
--- a/cl_dll/hud_spectator.h
+++ b/cl_dll/hud_spectator.h
@@ -5,9 +5,9 @@
 // $NoKeywords: $
 //=============================================================================
 
-#ifndef SPECTATOR_H
-#define SPECTATOR_H
 #pragma once
+#ifndef HUD_SPECTATOR_H
+#define HUD_SPECTATOR_H
 
 #include "cl_entity.h"
 
@@ -64,11 +64,11 @@ public:
 	void CheckOverviewEntities();
 	void DrawOverview();
 	void DrawOverviewEntities();
-	void GetMapPosition( float * returnvec );
+	void GetMapPosition( float *returnvec );
 	void DrawOverviewLayer();
 	void LoadMapSprites();
 	bool ParseOverviewFile();
-	bool IsActivePlayer( cl_entity_t * ent );
+	bool IsActivePlayer( cl_entity_t *ent );
 	void SetModes( int iMainMode, int iInsetMode );
 	void HandleButtonsDown( int ButtonPressed );
 	void HandleButtonsUp( int ButtonPressed );
diff --git a/cl_dll/in_defs.h b/cl_dll/in_defs.h
index 037c7cc6..d5c352fa 100644
--- a/cl_dll/in_defs.h
+++ b/cl_dll/in_defs.h
@@ -5,9 +5,9 @@
 // $NoKeywords: $
 //=============================================================================
 
+#pragma once
 #if !defined( IN_DEFSH )
 #define IN_DEFSH
-#pragma once
 
 // up / down
 #define	PITCH	0
diff --git a/cl_dll/input_goldsource.cpp b/cl_dll/input_goldsource.cpp
new file mode 100644
index 00000000..f530bdbc
--- /dev/null
+++ b/cl_dll/input_goldsource.cpp
@@ -0,0 +1,1607 @@
+//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================
+
+// in_win.c -- windows 95 mouse and joystick code
+// 02/21/97 JCB Added extended DirectInput code to support external controllers.
+
+#include "input_mouse.h"
+
+#ifdef SUPPORT_GOLDSOURCE_INPUT
+
+#include "hud.h"
+#include "cl_util.h"
+#include "camera.h"
+#include "kbutton.h"
+#include "cvardef.h"
+#include "const.h"
+#include "camera.h"
+#include "in_defs.h"
+#include "keydefs.h"
+#include "view.h"
+
+#ifndef _WIN32
+#define USE_SDL2
+#endif
+
+#ifdef USE_SDL2
+#define ARRAYSIZE(p)		( sizeof(p) /sizeof(p[0]) )
+#include <dlfcn.h>
+#include <SDL2/SDL_mouse.h>
+#include <SDL2/SDL_gamecontroller.h>
+int (*pfnSDL_SetRelativeMouseMode)(SDL_bool);
+Uint32 (*pfnSDL_GetRelativeMouseState)(int* x, int* y);
+int (*pfnSDL_NumJoysticks)(void);
+SDL_bool (*pfnSDL_IsGameController)(int);
+SDL_GameController* (*pfnSDL_GameControllerOpen)(int);
+Sint16 (*pfnSDL_GameControllerGetAxis)(SDL_GameController*, SDL_GameControllerAxis);
+Uint8 (*pfnSDL_GameControllerGetButton)(SDL_GameController*, SDL_GameControllerButton);
+void (*pfnSDL_JoystickUpdate)(void);
+const char* (*pfnSDL_GameControllerName)(SDL_GameController*);
+
+int safe_pfnSDL_SetRelativeMouseMode(SDL_bool mode)
+{
+    if (pfnSDL_SetRelativeMouseMode)
+        return pfnSDL_SetRelativeMouseMode(mode);
+    return -1;
+}
+Uint32 safe_pfnSDL_GetRelativeMouseState(int* x, int* y)
+{
+    if (pfnSDL_GetRelativeMouseState)
+        return pfnSDL_GetRelativeMouseState(x, y);
+    return 0;
+}
+int safe_pfnSDL_NumJoysticks()
+{
+    if (pfnSDL_NumJoysticks)
+        return pfnSDL_NumJoysticks();
+    return -1;
+}
+SDL_bool safe_pfnSDL_IsGameController(int joystick_index)
+{
+    if (pfnSDL_IsGameController)
+        return pfnSDL_IsGameController(joystick_index);
+    return SDL_FALSE;
+}
+SDL_GameController* safe_pfnSDL_GameControllerOpen(int joystick_index)
+{
+    if (pfnSDL_GameControllerOpen)
+        return pfnSDL_GameControllerOpen(joystick_index);
+    return NULL;
+}
+Sint16 safe_pfnSDL_GameControllerGetAxis(SDL_GameController* gamecontroller, SDL_GameControllerAxis axis)
+{
+    if (pfnSDL_GameControllerGetAxis)
+        return pfnSDL_GameControllerGetAxis(gamecontroller, axis);
+    return 0;
+}
+Uint8 safe_pfnSDL_GameControllerGetButton(SDL_GameController* gamecontroller, SDL_GameControllerButton button)
+{
+    if (pfnSDL_GameControllerGetButton)
+        return pfnSDL_GameControllerGetButton(gamecontroller, button);
+    return 0;
+}
+void safe_pfnSDL_JoystickUpdate()
+{
+    if (pfnSDL_JoystickUpdate)
+        pfnSDL_JoystickUpdate();
+}
+const char* safe_pfnSDL_GameControllerName(SDL_GameController* gamecontroller)
+{
+    if (pfnSDL_GameControllerName)
+        return pfnSDL_GameControllerName(gamecontroller);
+    return NULL;
+}
+
+struct SDLFunction
+{
+    void** ppfnFunc;
+    const char* name;
+};
+static SDLFunction sdlFunctions[] = {
+	{(void**)&pfnSDL_SetRelativeMouseMode, "SDL_SetRelativeMouseMode"},
+	{(void**)&pfnSDL_GetRelativeMouseState, "SDL_GetRelativeMouseState"},
+	{(void**)&pfnSDL_NumJoysticks, "SDL_NumJoysticks"},
+	{(void**)&pfnSDL_IsGameController, "SDL_IsGameController"},
+	{(void**)&pfnSDL_GameControllerOpen, "SDL_GameControllerOpen"},
+	{(void**)&pfnSDL_GameControllerGetAxis, "SDL_GameControllerGetAxis"},
+	{(void**)&pfnSDL_GameControllerGetButton, "SDL_GameControllerGetButton"},
+	{(void**)&pfnSDL_JoystickUpdate, "SDL_JoystickUpdate"},
+	{(void**)&pfnSDL_GameControllerName, "SDL_GameControllerName"}
+};
+#endif
+
+#ifdef _WIN32
+#include <process.h>
+#else
+typedef unsigned int DWORD;
+#endif
+
+#define MOUSE_BUTTON_COUNT 5
+
+// use IN_SetVisibleMouse to set:
+int iVisibleMouse = 0;
+
+extern cl_enginefunc_t gEngfuncs;
+
+extern int iMouseInUse;
+
+extern kbutton_t    in_strafe;
+extern kbutton_t    in_mlook;
+extern kbutton_t    in_speed;
+extern kbutton_t    in_jlook;
+
+extern cvar_t   *m_pitch;
+extern cvar_t   *m_yaw;
+extern cvar_t   *m_forward;
+extern cvar_t   *m_side;
+
+extern cvar_t *lookstrafe;
+extern cvar_t *lookspring;
+extern cvar_t *cl_pitchdown;
+extern cvar_t *cl_pitchup;
+extern cvar_t *cl_yawspeed;
+extern cvar_t *cl_sidespeed;
+extern cvar_t *cl_forwardspeed;
+extern cvar_t *cl_pitchspeed;
+extern cvar_t *cl_movespeedkey;
+
+#ifdef _WIN32
+static double s_flRawInputUpdateTime = 0.0f;
+static bool m_bRawInput = false;
+static bool m_bMouseThread = false;
+bool isMouseRelative = false;
+#endif
+
+#ifdef _WIN32
+#include "progdefs.h"
+extern globalvars_t *gpGlobals;
+#endif
+
+extern Vector dead_viewangles;
+
+void V_StopPitchDrift( void )
+{
+
+}
+
+// mouse variables
+cvar_t      *m_filter;
+extern cvar_t      *sensitivity;
+
+// Custom mouse acceleration (0 disable, 1 to enable, 2 enable with separate yaw/pitch rescale)
+static cvar_t *m_customaccel;
+//Formula: mousesensitivity = ( rawmousedelta^m_customaccel_exponent ) * m_customaccel_scale + sensitivity
+// If mode is 2, then x and y sensitivity are scaled by m_pitch and m_yaw respectively.
+// Custom mouse acceleration value.
+static cvar_t *m_customaccel_scale;
+//Max mouse move scale factor, 0 for no limit
+static cvar_t *m_customaccel_max;
+//Mouse move is raised to this power before being scaled by scale factor
+static cvar_t *m_customaccel_exponent;
+
+#ifdef _WIN32
+// if threaded mouse is enabled then the time to sleep between polls
+static cvar_t *m_mousethread_sleep;
+#endif
+
+float       mouse_x, mouse_y;
+
+static int  restore_spi;
+static int  originalmouseparms[3], newmouseparms[3] = {0, 0, 1};
+static int  mouseactive = 0;
+static int  mouseparmsvalid;
+static int  mouseshowtoggle = 1;
+
+// joystick defines and variables
+// where should defines be moved?
+#define JOY_ABSOLUTE_AXIS   0x00000000      // control like a joystick
+#define JOY_RELATIVE_AXIS   0x00000010      // control like a mouse, spinner, trackball
+#define JOY_MAX_AXES        6               // X, Y, Z, R, U, V
+#define JOY_AXIS_X          0
+#define JOY_AXIS_Y          1
+#define JOY_AXIS_Z          2
+#define JOY_AXIS_R          3
+#define JOY_AXIS_U          4
+#define JOY_AXIS_V          5
+
+enum _ControlList
+{
+    AxisNada = 0,
+    AxisForward,
+    AxisLook,
+    AxisSide,
+    AxisTurn
+};
+
+#if !defined(USE_SDL2) && defined(_WIN32)
+DWORD dwAxisFlags[JOY_MAX_AXES] =
+{
+    JOY_RETURNX,
+    JOY_RETURNY,
+    JOY_RETURNZ,
+    JOY_RETURNR,
+    JOY_RETURNU,
+    JOY_RETURNV
+};
+#endif
+
+DWORD   dwAxisMap[ JOY_MAX_AXES ];
+DWORD   dwControlMap[ JOY_MAX_AXES ];
+#if defined(USE_SDL2)
+int pdwRawValue[ JOY_MAX_AXES ];
+#elif defined(_WIN32)
+PDWORD pdwRawValue[ JOY_MAX_AXES ];
+#endif
+DWORD       joy_oldbuttonstate, joy_oldpovstate;
+
+int         joy_id;
+DWORD       joy_numbuttons;
+
+#ifdef USE_SDL2
+SDL_GameController *s_pJoystick = NULL;
+#elif defined(_WIN32)
+DWORD		joy_flags;
+static JOYINFOEX	ji;
+#endif
+
+// none of these cvars are saved over a session
+// this means that advanced controller configuration needs to be executed
+// each time.  this avoids any problems with getting back to a default usage
+// or when changing from one controller to another.  this way at least something
+// works.
+extern cvar_t  *in_joystick;
+cvar_t  *joy_name;
+cvar_t  *joy_advanced;
+cvar_t  *joy_advaxisx;
+cvar_t  *joy_advaxisy;
+cvar_t  *joy_advaxisz;
+cvar_t  *joy_advaxisr;
+cvar_t  *joy_advaxisu;
+cvar_t  *joy_advaxisv;
+cvar_t  *joy_forwardthreshold;
+cvar_t  *joy_sidethreshold;
+cvar_t  *joy_pitchthreshold;
+cvar_t  *joy_yawthreshold;
+cvar_t  *joy_forwardsensitivity;
+cvar_t  *joy_sidesensitivity;
+cvar_t  *joy_pitchsensitivity;
+cvar_t  *joy_yawsensitivity;
+cvar_t  *joy_wwhack1;
+cvar_t  *joy_wwhack2;
+
+int         joy_avail, joy_advancedinit, joy_haspov;
+
+#ifdef _WIN32
+unsigned int s_hMouseThreadId = 0;
+HANDLE  s_hMouseThread = 0;
+HANDLE  s_hMouseQuitEvent = 0;
+HANDLE  s_hMouseThreadActiveLock = 0;
+#endif
+
+/*
+===========
+Force_CenterView_f
+===========
+*/
+void Force_CenterView_f (void)
+{
+    vec3_t viewangles;
+
+    if (!iMouseInUse)
+    {
+        gEngfuncs.GetViewAngles( (float *)viewangles );
+        viewangles[PITCH] = 0;
+        gEngfuncs.SetViewAngles( (float *)viewangles );
+    }
+}
+
+#ifdef _WIN32
+
+LONG mouseThreadActive = 0;
+LONG mouseThreadCenterX = 0;
+LONG mouseThreadCenterY = 0;
+LONG mouseThreadDeltaX = 0;
+LONG mouseThreadDeltaY = 0;
+LONG mouseThreadSleep = 0;
+
+bool MouseThread_ActiveLock_Enter( void )
+{
+    if(!m_bMouseThread)
+        return true;
+
+    return WAIT_OBJECT_0 == WaitForSingleObject( s_hMouseThreadActiveLock,  INFINITE);
+}
+
+void MouseThread_ActiveLock_Exit( void )
+{
+    if(!m_bMouseThread)
+        return;
+
+    SetEvent( s_hMouseThreadActiveLock );
+}
+
+unsigned __stdcall MouseThread_Function( void * pArg )
+{
+    while ( true )
+    {
+        DWORD sleepVal = (DWORD)InterlockedExchangeAdd(&mouseThreadSleep, 0);
+        if(0 > sleepVal) sleepVal = 0;
+        else if(1000 < sleepVal) sleepVal = 1000;
+        if(WAIT_OBJECT_0 == WaitForSingleObject( s_hMouseQuitEvent, sleepVal))
+        {
+            break;
+        }
+
+        if( MouseThread_ActiveLock_Enter() )
+        {
+            if ( InterlockedExchangeAdd(&mouseThreadActive, 0) )
+            {
+                POINT       mouse_pos;
+                POINT       center_pos;
+
+                center_pos.x = InterlockedExchangeAdd(&mouseThreadCenterX, 0);
+                center_pos.y = InterlockedExchangeAdd(&mouseThreadCenterY, 0);
+                GetCursorPos(&mouse_pos);
+
+                mouse_pos.x -= center_pos.x;
+                mouse_pos.y -= center_pos.y;
+
+                if(mouse_pos.x || mouse_pos.y) SetCursorPos( center_pos.x, center_pos.y );
+
+                InterlockedExchangeAdd(&mouseThreadDeltaX, mouse_pos.x);
+                InterlockedExchangeAdd(&mouseThreadDeltaY, mouse_pos.y);
+            }
+
+            MouseThread_ActiveLock_Exit();
+        }
+    }
+
+    return 0;
+}
+
+/// <summary>Updates mouseThreadActive using the global variables mouseactive, iVisibleMouse and m_bRawInput. Should be called after any of these is changed.</summary>
+/// <remarks>Has to be interlocked manually by programmer! Use MouseThread_ActiveLock_Enter and MouseThread_ActiveLock_Exit.</remarks>
+void UpdateMouseThreadActive(void)
+{
+    InterlockedExchange(&mouseThreadActive, mouseactive && !iVisibleMouse && !m_bRawInput);
+}
+
+#endif
+
+void IN_SetMouseMode(bool enable)
+{
+    static bool currentMouseMode = false;
+
+    if(enable == currentMouseMode)
+        return;
+
+    if(enable)
+    {
+#ifdef _WIN32
+        if (mouseparmsvalid)
+            restore_spi = SystemParametersInfo (SPI_SETMOUSE, 0, newmouseparms, 0);
+
+        m_bRawInput = CVAR_GET_FLOAT( "m_rawinput" ) != 0;
+        if(m_bRawInput)
+        {
+#ifdef USE_SDL2
+            safe_pfnSDL_SetRelativeMouseMode(SDL_TRUE);
+#endif
+            isMouseRelative = true;
+        }
+#else
+        safe_pfnSDL_SetRelativeMouseMode(SDL_TRUE);
+#endif
+
+        currentMouseMode = true;
+    }
+    else
+    {
+#ifdef _WIN32
+        if(isMouseRelative)
+        {
+#ifdef USE_SDL2
+            safe_pfnSDL_SetRelativeMouseMode(SDL_FALSE);
+#endif
+            isMouseRelative = false;
+        }
+
+        if (restore_spi)
+            SystemParametersInfo (SPI_SETMOUSE, 0, originalmouseparms, 0);
+#else
+        safe_pfnSDL_SetRelativeMouseMode(SDL_FALSE);
+#endif
+
+        currentMouseMode = false;
+    }
+}
+
+void IN_SetVisibleMouse(bool visible)
+{
+#ifdef _WIN32
+    bool lockEntered = MouseThread_ActiveLock_Enter();
+#endif
+
+    iVisibleMouse = visible;
+
+    IN_SetMouseMode(!visible);
+
+#ifdef _WIN32
+    UpdateMouseThreadActive();
+    if(lockEntered) MouseThread_ActiveLock_Exit();
+#endif
+}
+
+void IN_ResetMouse( void );
+
+/*
+===========
+IN_ActivateMouse
+===========
+*/
+void GoldSourceInput::IN_ActivateMouse (void)
+{
+    if (mouseinitialized)
+    {
+#ifdef _WIN32
+        bool lockEntered = MouseThread_ActiveLock_Enter();
+#endif
+
+        IN_SetMouseMode(true);
+
+        mouseactive = 1;
+
+#ifdef _WIN32
+        UpdateMouseThreadActive();
+        if(lockEntered) MouseThread_ActiveLock_Exit();
+#endif
+
+        // now is a good time to reset mouse positon:
+        IN_ResetMouse();
+    }
+}
+
+
+/*
+===========
+IN_DeactivateMouse
+===========
+*/
+void GoldSourceInput::IN_DeactivateMouse (void)
+{
+    if (mouseinitialized)
+    {
+#ifdef _WIN32
+        bool lockEntered = MouseThread_ActiveLock_Enter();
+#endif
+
+        IN_SetMouseMode(false);
+
+        mouseactive = 0;
+
+#ifdef _WIN32
+        UpdateMouseThreadActive();
+        if(lockEntered) MouseThread_ActiveLock_Exit();
+#endif
+    }
+}
+
+/*
+===========
+IN_StartupMouse
+===========
+*/
+void GoldSourceInput::IN_StartupMouse (void)
+{
+    if ( gEngfuncs.CheckParm ("-nomouse", NULL ) )
+        return;
+
+    mouseinitialized = 1;
+#ifdef _WIN32
+    mouseparmsvalid = SystemParametersInfo (SPI_GETMOUSE, 0, originalmouseparms, 0);
+
+    if (mouseparmsvalid)
+    {
+        if ( gEngfuncs.CheckParm ("-noforcemspd", NULL ) )
+            newmouseparms[2] = originalmouseparms[2];
+
+        if ( gEngfuncs.CheckParm ("-noforcemaccel", NULL ) )
+        {
+            newmouseparms[0] = originalmouseparms[0];
+            newmouseparms[1] = originalmouseparms[1];
+        }
+
+        if ( gEngfuncs.CheckParm ("-noforcemparms", NULL ) )
+        {
+            newmouseparms[0] = originalmouseparms[0];
+            newmouseparms[1] = originalmouseparms[1];
+            newmouseparms[2] = originalmouseparms[2];
+        }
+    }
+#endif
+
+    mouse_buttons = MOUSE_BUTTON_COUNT;
+}
+
+/*
+===========
+IN_Shutdown
+===========
+*/
+void GoldSourceInput::IN_Shutdown (void)
+{
+    IN_DeactivateMouse ();
+
+#ifdef _WIN32
+    if ( s_hMouseQuitEvent )
+    {
+        SetEvent( s_hMouseQuitEvent );
+    }
+
+    if ( s_hMouseThread )
+    {
+        if(WAIT_OBJECT_0 != WaitForSingleObject( s_hMouseThread, 5000 ))
+        {
+            TerminateThread( s_hMouseThread, 0 );
+        }
+        CloseHandle( s_hMouseThread );
+        s_hMouseThread = (HANDLE)0;
+    }
+
+    if ( s_hMouseQuitEvent )
+    {
+        CloseHandle( s_hMouseQuitEvent );
+        s_hMouseQuitEvent = (HANDLE)0;
+    }
+
+    if( s_hMouseThreadActiveLock )
+    {
+        CloseHandle( s_hMouseThreadActiveLock );
+        s_hMouseThreadActiveLock = (HANDLE)0;
+    }
+#endif
+
+#ifdef USE_SDL2
+    for (int j=0; j<ARRAYSIZE(sdlFunctions); ++j) {
+        *(sdlFunctions[j].ppfnFunc) = NULL;
+    }
+    dlclose(sdl2Lib);
+    sdl2Lib = NULL;
+#endif
+}
+
+/*
+===========
+IN_GetMousePos
+
+Ask for mouse position from engine
+===========
+*/
+void IN_GetMousePos( int *mx, int *my )
+{
+    gEngfuncs.GetMousePosition( mx, my );
+}
+
+/*
+===========
+IN_ResetMouse
+
+FIXME: Call through to engine?
+===========
+*/
+void IN_ResetMouse( void )
+{
+    // no work to do in SDL
+#ifdef _WIN32
+    // reset only if mouse is active and not in visible mode:
+    if(mouseactive && !iVisibleMouse)
+    {
+        if ( !m_bRawInput && gEngfuncs.GetWindowCenterX && gEngfuncs.GetWindowCenterY )
+        {
+            bool lockEntered = MouseThread_ActiveLock_Enter();
+
+            int centerX = gEngfuncs.GetWindowCenterX();
+            int centerY = gEngfuncs.GetWindowCenterY();
+
+            SetCursorPos ( centerX, centerY );
+            InterlockedExchange( &mouseThreadCenterX, centerX );
+            InterlockedExchange( &mouseThreadCenterY, centerY );
+            InterlockedExchange( &mouseThreadDeltaX, 0 );
+            InterlockedExchange( &mouseThreadDeltaY, 0 );
+
+            if(lockEntered) MouseThread_ActiveLock_Exit();
+        }
+    }
+#endif
+}
+
+/*
+===========
+IN_MouseEvent
+===========
+*/
+void GoldSourceInput::IN_MouseEvent (int mstate)
+{
+    int     i;
+
+    if ( iMouseInUse || iVisibleMouse )
+        return;
+
+    // perform button actions
+    for (i=0 ; i<mouse_buttons ; i++)
+    {
+        if ( (mstate & (1<<i)) &&
+            !(mouse_oldbuttonstate & (1<<i)) )
+        {
+            gEngfuncs.Key_Event (K_MOUSE1 + i, 1);
+        }
+
+        if ( !(mstate & (1<<i)) &&
+            (mouse_oldbuttonstate & (1<<i)) )
+        {
+            gEngfuncs.Key_Event (K_MOUSE1 + i, 0);
+        }
+    }
+
+    mouse_oldbuttonstate = mstate;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Allows modulation of mouse scaling/senstivity value and application
+//  of custom algorithms.
+// Input  : *x -
+//          *y -
+//-----------------------------------------------------------------------------
+void IN_ScaleMouse( float *x, float *y )
+{
+    float mx = *x;
+    float my = *y;
+
+    // This is the default sensitivity
+    float mouse_senstivity = ( gHUD.GetSensitivity() != 0 ) ? gHUD.GetSensitivity() : sensitivity->value;
+
+    // Using special accleration values
+    if ( m_customaccel->value != 0 )
+    {
+        float raw_mouse_movement_distance = sqrt( mx * mx + my * my );
+        float acceleration_scale = m_customaccel_scale->value;
+        float accelerated_sensitivity_max = m_customaccel_max->value;
+        float accelerated_sensitivity_exponent = m_customaccel_exponent->value;
+        float accelerated_sensitivity = ( (float)pow( raw_mouse_movement_distance, accelerated_sensitivity_exponent ) * acceleration_scale + mouse_senstivity );
+
+        if ( accelerated_sensitivity_max > 0.0001f &&
+            accelerated_sensitivity > accelerated_sensitivity_max )
+        {
+            accelerated_sensitivity = accelerated_sensitivity_max;
+        }
+
+        *x *= accelerated_sensitivity;
+        *y *= accelerated_sensitivity;
+
+        // Further re-scale by yaw and pitch magnitude if user requests alternate mode 2
+        // This means that they will need to up their value for m_customaccel_scale greatly (>40x) since m_pitch/yaw default
+        //  to 0.022
+        if ( m_customaccel->value == 2 )
+        {
+            *x *= m_yaw->value;
+            *y *= m_pitch->value;
+        }
+    }
+    else
+    {
+        // Just apply the default
+        *x *= mouse_senstivity;
+        *y *= mouse_senstivity;
+    }
+}
+
+void GoldSourceInput::IN_GetMouseDelta( int *pOutX, int *pOutY)
+{
+    bool active = mouseactive && !iVisibleMouse;
+    int mx, my;
+
+    if(active)
+    {
+        int deltaX, deltaY;
+#ifdef _WIN32
+        if ( !m_bRawInput )
+        {
+            if ( m_bMouseThread )
+            {
+                // update mouseThreadSleep:
+                InterlockedExchange(&mouseThreadSleep, (LONG)m_mousethread_sleep->value);
+
+                bool lockEntered = MouseThread_ActiveLock_Enter();
+
+                current_pos.x = InterlockedExchange( &mouseThreadDeltaX, 0 );
+                current_pos.y = InterlockedExchange( &mouseThreadDeltaY, 0 );
+
+                if(lockEntered) MouseThread_ActiveLock_Exit();
+            }
+            else
+            {
+                GetCursorPos (&current_pos);
+            }
+        }
+        else
+#endif
+        {
+#ifdef USE_SDL2
+            safe_pfnSDL_GetRelativeMouseState( &deltaX, &deltaY );
+            current_pos.x = deltaX;
+            current_pos.y = deltaY;
+#else
+            GetCursorPos (&current_pos);
+            deltaX = current_pos.x - gEngfuncs.GetWindowCenterX();
+            deltaY = current_pos.y - gEngfuncs.GetWindowCenterY();
+#endif
+        }
+
+#ifdef _WIN32
+        if ( !m_bRawInput )
+        {
+            if ( m_bMouseThread )
+            {
+                mx = current_pos.x;
+                my = current_pos.y;
+            }
+            else
+            {
+                mx = current_pos.x - gEngfuncs.GetWindowCenterX() + mx_accum;
+                my = current_pos.y - gEngfuncs.GetWindowCenterY() + my_accum;
+            }
+        }
+        else
+#endif
+        {
+            mx = deltaX + mx_accum;
+            my = deltaY + my_accum;
+        }
+
+        mx_accum = 0;
+        my_accum = 0;
+
+        // reset mouse position if required, so there is room to move:
+#ifdef _WIN32
+        // do not reset if mousethread would do it:
+        if ( m_bRawInput || !m_bMouseThread )
+#else
+        if(true)
+#endif
+            IN_ResetMouse();
+
+#ifdef _WIN32
+        // update m_bRawInput occasionally:
+        if ( gpGlobals && gpGlobals->time - s_flRawInputUpdateTime > 1.0f )
+        {
+            s_flRawInputUpdateTime = gpGlobals->time;
+
+            bool lockEntered = MouseThread_ActiveLock_Enter();
+
+            m_bRawInput = CVAR_GET_FLOAT( "m_rawinput" ) != 0;
+
+            if(m_bRawInput && !isMouseRelative)
+            {
+#ifdef USE_SDL2
+                safe_pfnSDL_SetRelativeMouseMode(SDL_TRUE);
+#endif
+                isMouseRelative = true;
+            }
+            else if(!m_bRawInput && isMouseRelative)
+            {
+#ifdef USE_SDL2
+                safe_pfnSDL_SetRelativeMouseMode(SDL_FALSE);
+#endif
+                isMouseRelative = false;
+            }
+
+            UpdateMouseThreadActive();
+            if(lockEntered) MouseThread_ActiveLock_Exit();
+        }
+#endif
+    }
+    else
+    {
+        mx = my = 0;
+    }
+
+    if(pOutX) *pOutX = mx;
+    if(pOutY) *pOutY = my;
+}
+
+/*
+===========
+IN_MouseMove
+===========
+*/
+void GoldSourceInput::IN_MouseMove ( float frametime, usercmd_t *cmd)
+{
+    int     mx, my;
+    vec3_t viewangles;
+
+    gEngfuncs.GetViewAngles( (float *)viewangles );
+
+    if ( in_mlook.state & 1)
+    {
+        V_StopPitchDrift ();
+    }
+
+    //jjb - this disbles normal mouse control if the user is trying to
+    //      move the camera, or if the mouse cursor is visible or if we're in intermission
+    if ( !iMouseInUse && !gHUD.m_iIntermission && !iVisibleMouse )
+    {
+        IN_GetMouseDelta( &mx, &my );
+
+        if (m_filter && m_filter->value)
+        {
+            mouse_x = (mx + old_mouse_x) * 0.5;
+            mouse_y = (my + old_mouse_y) * 0.5;
+        }
+        else
+        {
+            mouse_x = mx;
+            mouse_y = my;
+        }
+
+        old_mouse_x = mx;
+        old_mouse_y = my;
+
+        // Apply custom mouse scaling/acceleration
+        IN_ScaleMouse( &mouse_x, &mouse_y );
+
+        // add mouse X/Y movement to cmd
+        if ( (in_strafe.state & 1) || (lookstrafe->value && (in_mlook.state & 1) ))
+            cmd->sidemove += m_side->value * mouse_x;
+        else
+            viewangles[YAW] -= m_yaw->value * mouse_x;
+
+        if ( (in_mlook.state & 1) && !(in_strafe.state & 1))
+        {
+            viewangles[PITCH] += m_pitch->value * mouse_y;
+            if (viewangles[PITCH] > cl_pitchdown->value)
+                viewangles[PITCH] = cl_pitchdown->value;
+            if (viewangles[PITCH] < -cl_pitchup->value)
+                viewangles[PITCH] = -cl_pitchup->value;
+        }
+        else
+        {
+            if ((in_strafe.state & 1) && gEngfuncs.IsNoClipping() )
+            {
+                cmd->upmove -= m_forward->value * mouse_y;
+            }
+            else
+            {
+                cmd->forwardmove -= m_forward->value * mouse_y;
+            }
+        }
+    }
+
+    gEngfuncs.SetViewAngles( (float *)viewangles );
+
+/*
+//#define TRACE_TEST
+#if defined( TRACE_TEST )
+    {
+        int mx, my;
+        void V_Move( int mx, int my );
+        IN_GetMousePos( &mx, &my );
+        V_Move( mx, my );
+    }
+#endif
+*/
+}
+
+/*
+===========
+IN_Accumulate
+===========
+*/
+void GoldSourceInput::IN_Accumulate (void)
+{
+    //only accumulate mouse if we are not moving the camera with the mouse
+    if ( !iMouseInUse && !iVisibleMouse)
+    {
+        if (mouseactive)
+        {
+#ifdef _WIN32
+            if ( !m_bRawInput )
+            {
+                if ( !m_bMouseThread )
+                {
+                    GetCursorPos (&current_pos);
+
+                    mx_accum += current_pos.x - gEngfuncs.GetWindowCenterX();
+                    my_accum += current_pos.y - gEngfuncs.GetWindowCenterY();
+                }
+            }
+            else
+#endif
+            {
+#ifdef USE_SDL2
+                int deltaX, deltaY;
+                safe_pfnSDL_GetRelativeMouseState( &deltaX, &deltaY );
+                mx_accum += deltaX;
+                my_accum += deltaY;
+#else
+                GetCursorPos (&current_pos);
+
+                mx_accum += current_pos.x - gEngfuncs.GetWindowCenterX();
+                my_accum += current_pos.y - gEngfuncs.GetWindowCenterY();
+#endif
+            }
+
+            // force the mouse to the center, so there's room to move
+#ifdef _WIN32
+            // do not reset if mousethread would do it:
+            if ( m_bRawInput || !m_bMouseThread )
+#else
+            if(true)
+#endif
+                IN_ResetMouse();
+
+        }
+    }
+
+}
+
+/*
+===================
+IN_ClearStates
+===================
+*/
+void GoldSourceInput::IN_ClearStates (void)
+{
+    if ( !mouseactive )
+        return;
+
+    mx_accum = 0;
+    my_accum = 0;
+    mouse_oldbuttonstate = 0;
+}
+
+/*
+===============
+IN_StartupJoystick
+===============
+*/
+void IN_StartupJoystick (void)
+{
+    // abort startup if user requests no joystick
+    if ( gEngfuncs.CheckParm ("-nojoy", NULL ) )
+        return;
+
+    // assume no joystick
+    joy_avail = 0;
+#ifdef USE_SDL2
+    int nJoysticks = safe_pfnSDL_NumJoysticks();
+    if ( nJoysticks > 0 )
+    {
+        for ( int i = 0; i < nJoysticks; i++ )
+        {
+            if ( safe_pfnSDL_IsGameController( i ) )
+            {
+                s_pJoystick = safe_pfnSDL_GameControllerOpen( i );
+                if ( s_pJoystick )
+                {
+                    //save the joystick's number of buttons and POV status
+                    joy_numbuttons = SDL_CONTROLLER_BUTTON_MAX;
+                    joy_haspov = 0;
+
+                    // old button and POV states default to no buttons pressed
+                    joy_oldbuttonstate = joy_oldpovstate = 0;
+
+                    // mark the joystick as available and advanced initialization not completed
+                    // this is needed as cvars are not available during initialization
+                    gEngfuncs.Con_Printf ("joystick found\n\n", safe_pfnSDL_GameControllerName(s_pJoystick));
+                    joy_avail = 1;
+                    joy_advancedinit = 0;
+                    break;
+                }
+            }
+        }
+    }
+    else
+    {
+        gEngfuncs.Con_DPrintf ("joystick not found -- driver not present\n\n");
+    }
+#elif defined(_WIN32)
+    int numdevs;
+    JOYCAPS jc;
+    MMRESULT mmr;
+    // verify joystick driver is present
+    if ((numdevs = joyGetNumDevs ()) == 0)
+    {
+        gEngfuncs.Con_DPrintf ("joystick not found -- driver not present\n\n");
+        return;
+    }
+
+    // cycle through the joystick ids for the first valid one
+    for (joy_id=0 ; joy_id<numdevs ; joy_id++)
+    {
+        memset (&ji, 0, sizeof(ji));
+        ji.dwSize = sizeof(ji);
+        ji.dwFlags = JOY_RETURNCENTERED;
+
+        if ((mmr = joyGetPosEx (joy_id, &ji)) == JOYERR_NOERROR)
+            break;
+    }
+
+    // abort startup if we didn't find a valid joystick
+    if (mmr != JOYERR_NOERROR)
+    {
+        gEngfuncs.Con_DPrintf ("joystick not found -- no valid joysticks (%x)\n\n", mmr);
+        return;
+    }
+
+    // get the capabilities of the selected joystick
+    // abort startup if command fails
+    memset (&jc, 0, sizeof(jc));
+    if ((mmr = joyGetDevCaps (joy_id, &jc, sizeof(jc))) != JOYERR_NOERROR)
+    {
+        gEngfuncs.Con_DPrintf ("joystick not found -- invalid joystick capabilities (%x)\n\n", mmr);
+        return;
+    }
+
+    // save the joystick's number of buttons and POV status
+    joy_numbuttons = jc.wNumButtons;
+    joy_haspov = jc.wCaps & JOYCAPS_HASPOV;
+
+    // old button and POV states default to no buttons pressed
+    joy_oldbuttonstate = joy_oldpovstate = 0;
+
+    // mark the joystick as available and advanced initialization not completed
+    // this is needed as cvars are not available during initialization
+    gEngfuncs.Con_Printf ("joystick found\n\n", mmr);
+    joy_avail = 1;
+    joy_advancedinit = 0;
+#else
+    gEngfuncs.Con_DPrintf ("joystick not found -- implement joystick without SDL2\n\n");
+#endif
+}
+
+#ifdef USE_SDL2
+int RawValuePointer (int axis)
+{
+    switch (axis)
+    {
+    default:
+    case JOY_AXIS_X:
+        return safe_pfnSDL_GameControllerGetAxis( s_pJoystick, SDL_CONTROLLER_AXIS_LEFTX );
+    case JOY_AXIS_Y:
+        return safe_pfnSDL_GameControllerGetAxis( s_pJoystick, SDL_CONTROLLER_AXIS_LEFTY );
+    case JOY_AXIS_Z:
+        return safe_pfnSDL_GameControllerGetAxis( s_pJoystick, SDL_CONTROLLER_AXIS_RIGHTX );
+    case JOY_AXIS_R:
+        return safe_pfnSDL_GameControllerGetAxis( s_pJoystick, SDL_CONTROLLER_AXIS_RIGHTY );
+
+    }
+}
+#elif defined(_WIN32)
+PDWORD RawValuePointer (int axis)
+{
+    switch (axis)
+    {
+    case JOY_AXIS_X:
+        return &ji.dwXpos;
+    case JOY_AXIS_Y:
+        return &ji.dwYpos;
+    case JOY_AXIS_Z:
+        return &ji.dwZpos;
+    case JOY_AXIS_R:
+        return &ji.dwRpos;
+    case JOY_AXIS_U:
+        return &ji.dwUpos;
+    case JOY_AXIS_V:
+        return &ji.dwVpos;
+    }
+    // FIX: need to do some kind of error
+    return &ji.dwXpos;
+}
+#endif
+
+/*
+===========
+Joy_AdvancedUpdate_f
+===========
+*/
+void Joy_AdvancedUpdate_f (void)
+{
+
+    // called once by IN_ReadJoystick and by user whenever an update is needed
+    // cvars are now available
+    int i;
+    DWORD dwTemp;
+
+    // initialize all the maps
+    for (i = 0; i < JOY_MAX_AXES; i++)
+    {
+        dwAxisMap[i] = AxisNada;
+        dwControlMap[i] = JOY_ABSOLUTE_AXIS;
+        pdwRawValue[i] = RawValuePointer(i);
+    }
+
+    if( joy_advanced->value == 0.0)
+    {
+        // default joystick initialization
+        // 2 axes only with joystick control
+        dwAxisMap[JOY_AXIS_X] = AxisTurn;
+        // dwControlMap[JOY_AXIS_X] = JOY_ABSOLUTE_AXIS;
+        dwAxisMap[JOY_AXIS_Y] = AxisForward;
+        // dwControlMap[JOY_AXIS_Y] = JOY_ABSOLUTE_AXIS;
+    }
+    else
+    {
+        if ( strcmp ( joy_name->string, "joystick") != 0 )
+        {
+            // notify user of advanced controller
+            gEngfuncs.Con_Printf ("\n%s configured\n\n", joy_name->string);
+        }
+
+        // advanced initialization here
+        // data supplied by user via joy_axisn cvars
+        dwTemp = (DWORD) joy_advaxisx->value;
+        dwAxisMap[JOY_AXIS_X] = dwTemp & 0x0000000f;
+        dwControlMap[JOY_AXIS_X] = dwTemp & JOY_RELATIVE_AXIS;
+        dwTemp = (DWORD) joy_advaxisy->value;
+        dwAxisMap[JOY_AXIS_Y] = dwTemp & 0x0000000f;
+        dwControlMap[JOY_AXIS_Y] = dwTemp & JOY_RELATIVE_AXIS;
+        dwTemp = (DWORD) joy_advaxisz->value;
+        dwAxisMap[JOY_AXIS_Z] = dwTemp & 0x0000000f;
+        dwControlMap[JOY_AXIS_Z] = dwTemp & JOY_RELATIVE_AXIS;
+        dwTemp = (DWORD) joy_advaxisr->value;
+        dwAxisMap[JOY_AXIS_R] = dwTemp & 0x0000000f;
+        dwControlMap[JOY_AXIS_R] = dwTemp & JOY_RELATIVE_AXIS;
+        dwTemp = (DWORD) joy_advaxisu->value;
+        dwAxisMap[JOY_AXIS_U] = dwTemp & 0x0000000f;
+        dwControlMap[JOY_AXIS_U] = dwTemp & JOY_RELATIVE_AXIS;
+        dwTemp = (DWORD) joy_advaxisv->value;
+        dwAxisMap[JOY_AXIS_V] = dwTemp & 0x0000000f;
+        dwControlMap[JOY_AXIS_V] = dwTemp & JOY_RELATIVE_AXIS;
+    }
+
+#if !defined(USE_SDL2) && defined(_WIN32)
+    // compute the axes to collect from DirectInput
+    joy_flags = JOY_RETURNCENTERED | JOY_RETURNBUTTONS | JOY_RETURNPOV;
+    for (i = 0; i < JOY_MAX_AXES; i++)
+    {
+        if (dwAxisMap[i] != AxisNada)
+        {
+            joy_flags |= dwAxisFlags[i];
+        }
+    }
+#endif
+}
+
+
+/*
+===========
+IN_Commands
+===========
+*/
+void GoldSourceInput::IN_Commands (void)
+{
+    int     i, key_index;
+
+    if (!joy_avail)
+    {
+        return;
+    }
+
+    DWORD   buttonstate, povstate;
+
+    // loop through the joystick buttons
+    // key a joystick event or auxillary event for higher number buttons for each state change
+#ifdef USE_SDL2
+    buttonstate = 0;
+    for ( i = 0; i < SDL_CONTROLLER_BUTTON_MAX; i++ )
+    {
+        if ( safe_pfnSDL_GameControllerGetButton( s_pJoystick, (SDL_GameControllerButton)i ) )
+        {
+            buttonstate |= 1<<i;
+        }
+    }
+
+    for (i = 0; i < JOY_MAX_AXES; i++)
+    {
+        pdwRawValue[i] = RawValuePointer(i);
+    }
+#elif defined(_WIN32)
+    buttonstate = ji.dwButtons;
+#endif
+
+    for (i=0 ; i < (int)joy_numbuttons ; i++)
+    {
+        if ( (buttonstate & (1<<i)) && !(joy_oldbuttonstate & (1<<i)) )
+        {
+            key_index = (i < 4) ? K_JOY1 : K_AUX1;
+            gEngfuncs.Key_Event (key_index + i, 1);
+        }
+
+        if ( !(buttonstate & (1<<i)) && (joy_oldbuttonstate & (1<<i)) )
+        {
+            key_index = (i < 4) ? K_JOY1 : K_AUX1;
+            gEngfuncs.Key_Event (key_index + i, 0);
+        }
+    }
+    joy_oldbuttonstate = buttonstate;
+
+    if (joy_haspov)
+    {
+        // convert POV information into 4 bits of state information
+        // this avoids any potential problems related to moving from one
+        // direction to another without going through the center position
+        povstate = 0;
+#if !defined(USE_SDL2) && defined(_WIN32)
+        if(ji.dwPOV != JOY_POVCENTERED)
+        {
+            if (ji.dwPOV == JOY_POVFORWARD)
+                povstate |= 0x01;
+            if (ji.dwPOV == JOY_POVRIGHT)
+                povstate |= 0x02;
+            if (ji.dwPOV == JOY_POVBACKWARD)
+                povstate |= 0x04;
+            if (ji.dwPOV == JOY_POVLEFT)
+                povstate |= 0x08;
+        }
+#endif
+        // determine which bits have changed and key an auxillary event for each change
+        for (i=0 ; i < 4 ; i++)
+        {
+            if ( (povstate & (1<<i)) && !(joy_oldpovstate & (1<<i)) )
+            {
+                gEngfuncs.Key_Event (K_AUX29 + i, 1);
+            }
+
+            if ( !(povstate & (1<<i)) && (joy_oldpovstate & (1<<i)) )
+            {
+                gEngfuncs.Key_Event (K_AUX29 + i, 0);
+            }
+        }
+        joy_oldpovstate = povstate;
+    }
+}
+
+
+/*
+===============
+IN_ReadJoystick
+===============
+*/
+int IN_ReadJoystick (void)
+{
+#ifdef USE_SDL2
+    safe_pfnSDL_JoystickUpdate();
+    return 1;
+#elif defined(_WIN32)
+    memset (&ji, 0, sizeof(ji));
+    ji.dwSize = sizeof(ji);
+    ji.dwFlags = joy_flags;
+
+    if (joyGetPosEx (joy_id, &ji) == JOYERR_NOERROR)
+    {
+        // this is a hack -- there is a bug in the Logitech WingMan Warrior DirectInput Driver
+        // rather than having 32768 be the zero point, they have the zero point at 32668
+        // go figure -- anyway, now we get the full resolution out of the device
+        if (joy_wwhack1->value != 0.0)
+        {
+            ji.dwUpos += 100;
+        }
+        return 1;
+    }
+    else
+    {
+        // read error occurred
+        // turning off the joystick seems too harsh for 1 read error,\
+        // but what should be done?
+        // Con_Printf ("IN_ReadJoystick: no response\n");
+        // joy_avail = 0;
+        return 0;
+    }
+#else
+    return 0;
+#endif
+}
+
+
+/*
+===========
+IN_JoyMove
+===========
+*/
+void IN_JoyMove ( float frametime, usercmd_t *cmd )
+{
+    float   speed, aspeed;
+    float   fAxisValue, fTemp;
+    int     i;
+    vec3_t viewangles;
+
+    gEngfuncs.GetViewAngles( (float *)viewangles );
+
+
+    // complete initialization if first time in
+    // this is needed as cvars are not available at initialization time
+    if( joy_advancedinit != 1 )
+    {
+        Joy_AdvancedUpdate_f();
+        joy_advancedinit = 1;
+    }
+
+    // verify joystick is available and that the user wants to use it
+    if (!joy_avail || !in_joystick->value)
+    {
+        return;
+    }
+
+    // collect the joystick data, if possible
+    if (IN_ReadJoystick () != 1)
+    {
+        return;
+    }
+
+    if (in_speed.state & 1)
+        speed = cl_movespeedkey->value;
+    else
+        speed = 1;
+
+    aspeed = speed * frametime;
+
+    // loop through the axes
+    for (i = 0; i < JOY_MAX_AXES; i++)
+    {
+        // get the floating point zero-centered, potentially-inverted data for the current axis
+#ifdef USE_SDL2
+        fAxisValue = (float)pdwRawValue[i];
+#elif defined(_WIN32)
+        fAxisValue = (float) *pdwRawValue[i];
+        fAxisValue -= 32768.0;
+#endif
+
+        if (joy_wwhack2->value != 0.0)
+        {
+            if (dwAxisMap[i] == AxisTurn)
+            {
+                // this is a special formula for the Logitech WingMan Warrior
+                // y=ax^b; where a = 300 and b = 1.3
+                // also x values are in increments of 800 (so this is factored out)
+                // then bounds check result to level out excessively high spin rates
+                fTemp = 300.0 * pow(abs(fAxisValue) / 800.0, 1.3);
+                if (fTemp > 14000.0)
+                    fTemp = 14000.0;
+                // restore direction information
+                fAxisValue = (fAxisValue > 0.0) ? fTemp : -fTemp;
+            }
+        }
+
+        // convert range from -32768..32767 to -1..1
+        fAxisValue /= 32768.0;
+
+        switch (dwAxisMap[i])
+        {
+        case AxisForward:
+            if ((joy_advanced->value == 0.0) && (in_jlook.state & 1))
+            {
+                // user wants forward control to become look control
+                if (fabs(fAxisValue) > joy_pitchthreshold->value)
+                {
+                    // if mouse invert is on, invert the joystick pitch value
+                    // only absolute control support here (joy_advanced is 0)
+                    if (m_pitch->value < 0.0)
+                    {
+                        viewangles[PITCH] -= (fAxisValue * joy_pitchsensitivity->value) * aspeed * cl_pitchspeed->value;
+                    }
+                    else
+                    {
+                        viewangles[PITCH] += (fAxisValue * joy_pitchsensitivity->value) * aspeed * cl_pitchspeed->value;
+                    }
+                    V_StopPitchDrift();
+                }
+                else
+                {
+                    // no pitch movement
+                    // disable pitch return-to-center unless requested by user
+                    // *** this code can be removed when the lookspring bug is fixed
+                    // *** the bug always has the lookspring feature on
+                    if(lookspring->value == 0.0)
+                    {
+                        V_StopPitchDrift();
+                    }
+                }
+            }
+            else
+            {
+                // user wants forward control to be forward control
+                if (fabs(fAxisValue) > joy_forwardthreshold->value)
+                {
+                    cmd->forwardmove += (fAxisValue * joy_forwardsensitivity->value) * speed * cl_forwardspeed->value;
+                }
+            }
+            break;
+
+        case AxisSide:
+            if (fabs(fAxisValue) > joy_sidethreshold->value)
+            {
+                cmd->sidemove += (fAxisValue * joy_sidesensitivity->value) * speed * cl_sidespeed->value;
+            }
+            break;
+
+        case AxisTurn:
+            if ((in_strafe.state & 1) || (lookstrafe->value && (in_jlook.state & 1)))
+            {
+                // user wants turn control to become side control
+                if (fabs(fAxisValue) > joy_sidethreshold->value)
+                {
+                    cmd->sidemove -= (fAxisValue * joy_sidesensitivity->value) * speed * cl_sidespeed->value;
+                }
+            }
+            else
+            {
+                // user wants turn control to be turn control
+                if (fabs(fAxisValue) > joy_yawthreshold->value)
+                {
+                    if(dwControlMap[i] == JOY_ABSOLUTE_AXIS)
+                    {
+                        viewangles[YAW] += (fAxisValue * joy_yawsensitivity->value) * aspeed * cl_yawspeed->value;
+                    }
+                    else
+                    {
+                        viewangles[YAW] += (fAxisValue * joy_yawsensitivity->value) * speed * 180.0;
+                    }
+
+                }
+            }
+            break;
+
+        case AxisLook:
+            if (in_jlook.state & 1)
+            {
+                if (fabs(fAxisValue) > joy_pitchthreshold->value)
+                {
+                    // pitch movement detected and pitch movement desired by user
+                    if(dwControlMap[i] == JOY_ABSOLUTE_AXIS)
+                    {
+                        viewangles[PITCH] += (fAxisValue * joy_pitchsensitivity->value) * aspeed * cl_pitchspeed->value;
+                    }
+                    else
+                    {
+                        viewangles[PITCH] += (fAxisValue * joy_pitchsensitivity->value) * speed * 180.0;
+                    }
+                    V_StopPitchDrift();
+                }
+                else
+                {
+                    // no pitch movement
+                    // disable pitch return-to-center unless requested by user
+                    // *** this code can be removed when the lookspring bug is fixed
+                    // *** the bug always has the lookspring feature on
+                    if( lookspring->value == 0.0 )
+                    {
+                        V_StopPitchDrift();
+                    }
+                }
+            }
+            break;
+
+        default:
+            break;
+        }
+    }
+
+    // bounds check pitch
+    if (viewangles[PITCH] > cl_pitchdown->value)
+        viewangles[PITCH] = cl_pitchdown->value;
+    if (viewangles[PITCH] < -cl_pitchup->value)
+        viewangles[PITCH] = -cl_pitchup->value;
+
+    gEngfuncs.SetViewAngles( (float *)viewangles );
+}
+
+/*
+===========
+IN_Move
+===========
+*/
+void GoldSourceInput::IN_Move ( float frametime, usercmd_t *cmd)
+{
+    if ( !iMouseInUse && mouseactive )
+    {
+        IN_MouseMove ( frametime, cmd);
+    }
+
+    IN_JoyMove ( frametime, cmd);
+}
+
+/*
+===========
+IN_Init
+===========
+*/
+void GoldSourceInput::IN_Init (void)
+{
+    m_filter                = gEngfuncs.pfnRegisterVariable ( "m_filter","0", FCVAR_ARCHIVE );
+    sensitivity             = gEngfuncs.pfnRegisterVariable ( "sensitivity","3", FCVAR_ARCHIVE ); // user mouse sensitivity setting.
+
+    in_joystick             = gEngfuncs.pfnRegisterVariable ( "joystick","0", FCVAR_ARCHIVE );
+    joy_name                = gEngfuncs.pfnRegisterVariable ( "joyname", "joystick", 0 );
+    joy_advanced            = gEngfuncs.pfnRegisterVariable ( "joyadvanced", "0", 0 );
+    joy_advaxisx            = gEngfuncs.pfnRegisterVariable ( "joyadvaxisx", "0", 0 );
+    joy_advaxisy            = gEngfuncs.pfnRegisterVariable ( "joyadvaxisy", "0", 0 );
+    joy_advaxisz            = gEngfuncs.pfnRegisterVariable ( "joyadvaxisz", "0", 0 );
+    joy_advaxisr            = gEngfuncs.pfnRegisterVariable ( "joyadvaxisr", "0", 0 );
+    joy_advaxisu            = gEngfuncs.pfnRegisterVariable ( "joyadvaxisu", "0", 0 );
+    joy_advaxisv            = gEngfuncs.pfnRegisterVariable ( "joyadvaxisv", "0", 0 );
+    joy_forwardthreshold    = gEngfuncs.pfnRegisterVariable ( "joyforwardthreshold", "0.15", 0 );
+    joy_sidethreshold       = gEngfuncs.pfnRegisterVariable ( "joysidethreshold", "0.15", 0 );
+    joy_pitchthreshold      = gEngfuncs.pfnRegisterVariable ( "joypitchthreshold", "0.15", 0 );
+    joy_yawthreshold        = gEngfuncs.pfnRegisterVariable ( "joyyawthreshold", "0.15", 0 );
+    joy_forwardsensitivity  = gEngfuncs.pfnRegisterVariable ( "joyforwardsensitivity", "-1.0", 0 );
+    joy_sidesensitivity     = gEngfuncs.pfnRegisterVariable ( "joysidesensitivity", "-1.0", 0 );
+    joy_pitchsensitivity    = gEngfuncs.pfnRegisterVariable ( "joypitchsensitivity", "1.0", 0 );
+    joy_yawsensitivity      = gEngfuncs.pfnRegisterVariable ( "joyyawsensitivity", "-1.0", 0 );
+    joy_wwhack1             = gEngfuncs.pfnRegisterVariable ( "joywwhack1", "0.0", 0 );
+    joy_wwhack2             = gEngfuncs.pfnRegisterVariable ( "joywwhack2", "0.0", 0 );
+
+    m_customaccel           = gEngfuncs.pfnRegisterVariable ( "m_customaccel", "0", FCVAR_ARCHIVE );
+    m_customaccel_scale     = gEngfuncs.pfnRegisterVariable ( "m_customaccel_scale", "0.04", FCVAR_ARCHIVE );
+    m_customaccel_max       = gEngfuncs.pfnRegisterVariable ( "m_customaccel_max", "0", FCVAR_ARCHIVE );
+    m_customaccel_exponent  = gEngfuncs.pfnRegisterVariable ( "m_customaccel_exponent", "1", FCVAR_ARCHIVE );
+
+#ifdef _WIN32
+    m_bRawInput             = CVAR_GET_FLOAT( "m_rawinput" ) != 0;
+    m_bMouseThread          = gEngfuncs.CheckParm ("-mousethread", NULL ) != NULL;
+    m_mousethread_sleep     = gEngfuncs.pfnRegisterVariable ( "m_mousethread_sleep", "1", FCVAR_ARCHIVE ); // default to less than 1000 Hz
+
+    m_bMouseThread = m_bMouseThread && NULL != m_mousethread_sleep;
+
+    if (m_bMouseThread)
+    {
+        // init mouseThreadSleep:
+#if 0 // _beginthreadex is not defined on VS 6?
+        InterlockedExchange(&mouseThreadSleep, (LONG)m_mousethread_sleep->value);
+
+        s_hMouseQuitEvent = CreateEvent( NULL, FALSE, FALSE, NULL );
+        s_hMouseThreadActiveLock = CreateEvent( NULL, FALSE, TRUE, NULL );
+        if ( s_hMouseQuitEvent && s_hMouseThreadActiveLock)
+        {
+            s_hMouseThread = (HANDLE)_beginthreadex( NULL, 0, MouseThread_Function, NULL, 0, &s_hMouseThreadId );
+        }
+
+        m_bMouseThread = NULL != s_hMouseThread;
+#else
+        m_bMouseThread = 0;
+#endif
+
+        // at this early stage this won't print anything:
+        // gEngfuncs.Con_DPrintf ("Mouse thread %s.\n", m_bMouseThread ? "initalized" : "failed to initalize");
+    }
+#endif
+
+#ifdef USE_SDL2
+#ifdef __APPLE__
+#define SDL2_FULL_LIBNAME "libsdl2-2.0.0.dylib"
+#else
+#define SDL2_FULL_LIBNAME "libSDL2-2.0.so.0"
+#endif
+	sdl2Lib = dlopen(SDL2_FULL_LIBNAME, RTLD_NOW|RTLD_LOCAL);
+	if (sdl2Lib) {
+		for (int j=0; j<ARRAYSIZE(sdlFunctions); ++j) {
+			*(sdlFunctions[j].ppfnFunc) = dlsym(sdl2Lib, sdlFunctions[j].name);
+			if (*sdlFunctions[j].ppfnFunc == NULL) {
+				gEngfuncs.Con_Printf("Could not load SDL2 function %s: %s\n", sdlFunctions[j].name, dlerror());
+			}
+		}
+	} else {
+		gEngfuncs.Con_Printf("Could not load SDL2: %s\n", dlerror());
+	}
+#endif
+    gEngfuncs.pfnAddCommand ("force_centerview", Force_CenterView_f);
+    gEngfuncs.pfnAddCommand ("joyadvancedupdate", Joy_AdvancedUpdate_f);
+
+    IN_StartupMouse ();
+    IN_StartupJoystick ();
+}
+
+#endif
diff --git a/cl_dll/input_mouse.cpp b/cl_dll/input_mouse.cpp
new file mode 100644
index 00000000..8d57091b
--- /dev/null
+++ b/cl_dll/input_mouse.cpp
@@ -0,0 +1,83 @@
+#include "input_mouse.h"
+#include "exportdef.h"
+#include "hud.h"
+#include "cl_util.h"
+
+// shared between backends
+Vector dead_viewangles(0, 0, 0);
+cvar_t      *sensitivity;
+cvar_t  *in_joystick;
+
+FWGSInput fwgsInput;
+
+#ifdef SUPPORT_GOLDSOURCE_INPUT
+GoldSourceInput goldSourceInput;
+AbstractInput* currentInput = &goldSourceInput;
+#else
+AbstractInput* currentInput = &fwgsInput;
+#endif
+extern "C"  void DLLEXPORT IN_ClientMoveEvent( float forwardmove, float sidemove )
+{
+	currentInput->IN_ClientMoveEvent(forwardmove, sidemove);
+}
+
+extern "C" void DLLEXPORT IN_ClientLookEvent( float relyaw, float relpitch )
+{
+	currentInput->IN_ClientLookEvent(relyaw, relpitch);
+}
+
+void IN_Move( float frametime, usercmd_t *cmd )
+{
+	currentInput->IN_Move(frametime, cmd);
+}
+
+extern "C" void DLLEXPORT IN_MouseEvent( int mstate )
+{
+	currentInput->IN_MouseEvent(mstate);
+}
+
+extern "C" void DLLEXPORT IN_ClearStates( void )
+{
+	currentInput->IN_ClearStates();
+}
+
+extern "C" void DLLEXPORT IN_ActivateMouse( void )
+{
+	currentInput->IN_ActivateMouse();
+}
+
+extern "C" void DLLEXPORT IN_DeactivateMouse( void )
+{
+	currentInput->IN_DeactivateMouse();
+}
+
+extern "C" void DLLEXPORT IN_Accumulate( void )
+{
+	currentInput->IN_Accumulate();
+}
+
+void IN_Commands( void )
+{
+	currentInput->IN_Commands();
+}
+
+void IN_Shutdown( void )
+{
+	currentInput->IN_Shutdown();
+}
+
+void IN_Init( void )
+{
+#ifdef SUPPORT_GOLDSOURCE_INPUT
+	if (isXashFWGS()) {
+		gEngfuncs.Con_Printf( "FWGS Xash3D input is in use\n" );
+		currentInput = &fwgsInput;
+	} else {
+		gEngfuncs.Con_Printf( "GoldSource input is in use\n" );
+		currentInput = &goldSourceInput;
+	}
+#else
+	currentInput = &fwgsInput;
+#endif
+	currentInput->IN_Init();
+}
diff --git a/cl_dll/input_mouse.h b/cl_dll/input_mouse.h
new file mode 100644
index 00000000..c13b7fa2
--- /dev/null
+++ b/cl_dll/input_mouse.h
@@ -0,0 +1,79 @@
+#pragma once
+#ifndef INPUT_MOUSE_H
+#define INPUT_MOUSE_H
+#include "cl_dll.h"
+#include "usercmd.h"
+#include "in_defs.h"
+
+class AbstractInput
+{
+public:
+	virtual void IN_ClientMoveEvent( float forwardmove, float sidemove ) = 0;
+	virtual void IN_ClientLookEvent( float relyaw, float relpitch ) = 0;
+	virtual void IN_Move( float frametime, usercmd_t *cmd ) = 0;
+	virtual void IN_MouseEvent( int mstate ) = 0;
+	virtual void IN_ClearStates( void ) = 0;
+	virtual void IN_ActivateMouse( void ) = 0;
+	virtual void IN_DeactivateMouse( void ) = 0;
+	virtual void IN_Accumulate( void ) = 0;
+	virtual void IN_Commands( void ) = 0;
+	virtual void IN_Shutdown( void ) = 0;
+	virtual void IN_Init( void ) = 0;
+};
+
+class FWGSInput : public AbstractInput
+{
+public:
+	virtual void IN_ClientMoveEvent( float forwardmove, float sidemove );
+	virtual void IN_ClientLookEvent( float relyaw, float relpitch );
+	virtual void IN_Move( float frametime, usercmd_t *cmd );
+	virtual void IN_MouseEvent( int mstate );
+	virtual void IN_ClearStates( void );
+	virtual void IN_ActivateMouse( void );
+	virtual void IN_DeactivateMouse( void );
+	virtual void IN_Accumulate( void );
+	virtual void IN_Commands( void );
+	virtual void IN_Shutdown( void );
+	virtual void IN_Init( void );
+
+protected:
+	float ac_forwardmove;
+	float ac_sidemove;
+	int ac_movecount;
+	float rel_yaw;
+	float rel_pitch;
+};
+
+// No need for goldsource input support on the platforms that are not supported by GoldSource.
+#if defined(GOLDSOURCE_SUPPORT) && (defined(_WIN32) || defined(__linux__) || defined(__APPLE__)) && (defined(__i386) || defined(_M_IX86))
+#define SUPPORT_GOLDSOURCE_INPUT
+class GoldSourceInput : public AbstractInput
+{
+public:
+	virtual void IN_ClientMoveEvent( float forwardmove, float sidemove ) {}
+	virtual void IN_ClientLookEvent( float relyaw, float relpitch ) {}
+	virtual void IN_Move( float frametime, usercmd_t *cmd );
+	virtual void IN_MouseEvent( int mstate );
+	virtual void IN_ClearStates( void );
+	virtual void IN_ActivateMouse( void );
+	virtual void IN_DeactivateMouse( void );
+	virtual void IN_Accumulate( void );
+	virtual void IN_Commands( void );
+	virtual void IN_Shutdown( void );
+	virtual void IN_Init( void );
+
+protected:
+	void IN_GetMouseDelta( int *pOutX, int *pOutY);
+	void IN_MouseMove ( float frametime, usercmd_t *cmd);
+	void IN_StartupMouse (void);
+
+	int         mouse_buttons;
+	int         mouse_oldbuttonstate;
+	POINT       current_pos;
+	int         old_mouse_x, old_mouse_y, mx_accum, my_accum;
+	int         mouseinitialized;
+	void* sdl2Lib;
+};
+#endif
+
+#endif
diff --git a/cl_dll/input_xash3d.cpp b/cl_dll/input_xash3d.cpp
index 63cdfbeb..2ff572ee 100644
--- a/cl_dll/input_xash3d.cpp
+++ b/cl_dll/input_xash3d.cpp
@@ -3,14 +3,9 @@
 #include "cvardef.h"
 #include "kbutton.h"
 #include "keydefs.h"
-cvar_t		*sensitivity;
-cvar_t		*in_joystick;
-#define	PITCH	0
-#define	YAW		1
-#define	ROLL	2 
-
-extern "C"  void DLLEXPORT IN_ClientMoveEvent( float forwardmove, float sidemove );
-extern "C" void DLLEXPORT IN_ClientLookEvent( float relyaw, float relpitch );
+#include "input_mouse.h"
+extern cvar_t		*sensitivity;
+extern cvar_t		*in_joystick;
 
 extern kbutton_t	in_strafe;
 extern kbutton_t	in_mlook;
@@ -37,12 +32,6 @@ extern cvar_t	*cl_movespeedkey;
 cvar_t	*cl_laddermode;
 
 
-float ac_forwardmove;
-float ac_sidemove;
-int ac_movecount;
-float rel_yaw;
-float rel_pitch;
-
 #define F 1U<<0	// Forward
 #define B 1U<<1	// Back
 #define L 1U<<2	// Left
@@ -55,7 +44,7 @@ float rel_pitch;
 #define IMPULSE_UP		4
 
 int CL_IsDead( void );
-Vector dead_viewangles(0, 0, 0);
+extern Vector dead_viewangles;
 
 void IN_ToggleButtons( float forwardmove, float sidemove )
 {
@@ -135,7 +124,7 @@ void IN_ToggleButtons( float forwardmove, float sidemove )
 	}
 }
 
-void IN_ClientMoveEvent( float forwardmove, float sidemove )
+void FWGSInput::IN_ClientMoveEvent( float forwardmove, float sidemove )
 {
 	//gEngfuncs.Con_Printf("IN_MoveEvent\n");
 
@@ -144,14 +133,14 @@ void IN_ClientMoveEvent( float forwardmove, float sidemove )
 	ac_movecount++;
 }
 
-void IN_ClientLookEvent( float relyaw, float relpitch )
+void FWGSInput::IN_ClientLookEvent( float relyaw, float relpitch )
 {
 	rel_yaw += relyaw;
 	rel_pitch += relpitch;
 }
 
 // Rotate camera and add move values to usercmd
-void IN_Move( float frametime, usercmd_t *cmd )
+void FWGSInput::IN_Move( float frametime, usercmd_t *cmd )
 {
 	Vector viewangles;
 	bool fLadder = false;
@@ -235,7 +224,7 @@ void IN_Move( float frametime, usercmd_t *cmd )
 	ac_movecount = 0;
 }
 
-extern "C" void DLLEXPORT IN_MouseEvent( int mstate )
+void FWGSInput::IN_MouseEvent( int mstate )
 {
 	static int mouse_oldbuttonstate;
 	// perform button actions
@@ -257,37 +246,37 @@ extern "C" void DLLEXPORT IN_MouseEvent( int mstate )
 
 // Stubs
 
-extern "C" void DLLEXPORT IN_ClearStates( void )
+void FWGSInput::IN_ClearStates( void )
 {
 	//gEngfuncs.Con_Printf( "IN_ClearStates\n" );
 }
 
-extern "C" void DLLEXPORT IN_ActivateMouse( void )
+void FWGSInput::IN_ActivateMouse( void )
 {
 	//gEngfuncs.Con_Printf( "IN_ActivateMouse\n" );
 }
 
-extern "C" void DLLEXPORT IN_DeactivateMouse( void )
+void FWGSInput::IN_DeactivateMouse( void )
 {
 	//gEngfuncs.Con_Printf( "IN_DeactivateMouse\n" );
 }
 
-extern "C" void DLLEXPORT IN_Accumulate( void )
+void FWGSInput::IN_Accumulate( void )
 {
 	//gEngfuncs.Con_Printf( "IN_Accumulate\n" );
 }
 
-void IN_Commands( void )
+void FWGSInput::IN_Commands( void )
 {
 	//gEngfuncs.Con_Printf( "IN_Commands\n" );
 }
 
-void IN_Shutdown( void )
+void FWGSInput::IN_Shutdown( void )
 {
 }
 
 // Register cvars and reset data
-void IN_Init( void )
+void FWGSInput::IN_Init( void )
 {
 	sensitivity = gEngfuncs.pfnRegisterVariable( "sensitivity", "3", FCVAR_ARCHIVE );
 	in_joystick = gEngfuncs.pfnRegisterVariable( "joystick", "0", FCVAR_ARCHIVE );
diff --git a/cl_dll/inputw32.cpp b/cl_dll/inputw32.cpp
deleted file mode 100644
index 5c8210fa..00000000
--- a/cl_dll/inputw32.cpp
+++ /dev/null
@@ -1,901 +0,0 @@
-//========= Copyright � 1996-2002, Valve LLC, All rights reserved. ============
-//
-// Purpose: 
-//
-// $NoKeywords: $
-//=============================================================================
-
-// in_win.c -- windows 95 mouse and joystick code
-// 02/21/97 JCB Added extended DirectInput code to support external controllers.
-
-#include "hud.h"
-#include "cl_util.h"
-#include "camera.h"
-#include "kbutton.h"
-#include "cvardef.h"
-#include "usercmd.h"
-#include "const.h"
-#include "camera.h"
-#include "in_defs.h"
-#include "../engine/keydefs.h"
-//#include "view.h"
-#include "windows.h"
-
-#define MOUSE_BUTTON_COUNT 5
-
-// Set this to 1 to show mouse cursor.  Experimental
-int g_iVisibleMouse = 0;
-
-extern "C" 
-{
-	void DLLEXPORT IN_ActivateMouse( void );
-	void DLLEXPORT IN_DeactivateMouse( void );
-	void DLLEXPORT IN_MouseEvent( int mstate );
-	void DLLEXPORT IN_Accumulate( void );
-	void DLLEXPORT IN_ClearStates( void );
-}
-
-extern cl_enginefunc_t gEngfuncs;
-
-extern int iMouseInUse;
-
-extern kbutton_t in_strafe;
-extern kbutton_t in_mlook;
-extern kbutton_t in_speed;
-extern kbutton_t in_jlook;
-
-extern cvar_t *m_pitch;
-extern cvar_t *m_yaw;
-extern cvar_t *m_forward;
-extern cvar_t *m_side;
-
-extern cvar_t *lookstrafe;
-extern cvar_t *lookspring;
-extern cvar_t *cl_pitchdown;
-extern cvar_t *cl_pitchup;
-extern cvar_t *cl_yawspeed;
-extern cvar_t *cl_sidespeed;
-extern cvar_t *cl_forwardspeed;
-extern cvar_t *cl_pitchspeed;
-extern cvar_t *cl_movespeedkey;
-
-// mouse variables
-cvar_t *m_filter;
-cvar_t *sensitivity;
-
-int mouse_buttons;
-int mouse_oldbuttonstate;
-POINT current_pos;
-int mouse_x, mouse_y, old_mouse_x, old_mouse_y, mx_accum, my_accum;
-
-static int restore_spi;
-static int originalmouseparms[3], newmouseparms[3] = {0, 0, 1};
-static int mouseactive;
-int mouseinitialized;
-static int mouseparmsvalid;
-static int mouseshowtoggle = 1;
-
-// joystick defines and variables
-// where should defines be moved?
-#define JOY_ABSOLUTE_AXIS	0x00000000		// control like a joystick
-#define JOY_RELATIVE_AXIS	0x00000010		// control like a mouse, spinner, trackball
-#define	JOY_MAX_AXES			6		// X, Y, Z, R, U, V
-#define JOY_AXIS_X			0
-#define JOY_AXIS_Y			1
-#define JOY_AXIS_Z			2
-#define JOY_AXIS_R			3
-#define JOY_AXIS_U			4
-#define JOY_AXIS_V			5
-
-enum _ControlList
-{
-	AxisNada = 0,
-	AxisForward,
-	AxisLook,
-	AxisSide,
-	AxisTurn
-};
-
-DWORD dwAxisFlags[JOY_MAX_AXES] =
-{
-	JOY_RETURNX,
-	JOY_RETURNY,
-	JOY_RETURNZ,
-	JOY_RETURNR,
-	JOY_RETURNU,
-	JOY_RETURNV
-};
-
-DWORD dwAxisMap[JOY_MAX_AXES];
-DWORD dwControlMap[JOY_MAX_AXES];
-PDWORD pdwRawValue[JOY_MAX_AXES];
-
-// none of these cvars are saved over a session
-// this means that advanced controller configuration needs to be executed
-// each time.  this avoids any problems with getting back to a default usage
-// or when changing from one controller to another.  this way at least something
-// works.
-cvar_t *in_joystick;
-cvar_t *joy_name;
-cvar_t *joy_advanced;
-cvar_t *joy_advaxisx;
-cvar_t *joy_advaxisy;
-cvar_t *joy_advaxisz;
-cvar_t *joy_advaxisr;
-cvar_t *joy_advaxisu;
-cvar_t *joy_advaxisv;
-cvar_t *joy_forwardthreshold;
-cvar_t *joy_sidethreshold;
-cvar_t *joy_pitchthreshold;
-cvar_t *joy_yawthreshold;
-cvar_t *joy_forwardsensitivity;
-cvar_t *joy_sidesensitivity;
-cvar_t *joy_pitchsensitivity;
-cvar_t *joy_yawsensitivity;
-cvar_t *joy_wwhack1;
-cvar_t *joy_wwhack2;
-
-int joy_avail, joy_advancedinit, joy_haspov;
-DWORD joy_oldbuttonstate, joy_oldpovstate;
-
-int joy_id;
-DWORD joy_flags;
-DWORD joy_numbuttons;
-
-static JOYINFOEX ji;
-
-/*
-===========
-Force_CenterView_f
-===========
-*/
-void Force_CenterView_f( void )
-{
-	vec3_t viewangles;
-
-	if( !iMouseInUse )
-	{
-		gEngfuncs.GetViewAngles( (float *)viewangles );
-		viewangles[PITCH] = 0;
-		gEngfuncs.SetViewAngles( (float *)viewangles );
-	}
-}
-
-/*
-===========
-IN_ActivateMouse
-===========
-*/
-void DLLEXPORT IN_ActivateMouse( void )
-{
-	if( mouseinitialized )
-	{
-		if( mouseparmsvalid )
-			restore_spi = SystemParametersInfo( SPI_SETMOUSE, 0, newmouseparms, 0 );
-		mouseactive = 1;
-	}
-}
-
-/*
-===========
-IN_DeactivateMouse
-===========
-*/
-void DLLEXPORT IN_DeactivateMouse( void )
-{
-	if( mouseinitialized )
-	{
-		if( restore_spi )
-			SystemParametersInfo( SPI_SETMOUSE, 0, originalmouseparms, 0 );
-		mouseactive = 0;
-	}
-}
-
-/*
-===========
-IN_StartupMouse
-===========
-*/
-void IN_StartupMouse( void )
-{
-	if( gEngfuncs.CheckParm( "-nomouse", NULL ) ) 
-		return;
-
-	mouseinitialized = 1;
-	mouseparmsvalid = SystemParametersInfo( SPI_GETMOUSE, 0, originalmouseparms, 0 );
-
-	if( mouseparmsvalid )
-	{
-		if( gEngfuncs.CheckParm( "-noforcemspd", NULL ) ) 
-			newmouseparms[2] = originalmouseparms[2];
-
-		if( gEngfuncs.CheckParm( "-noforcemaccel", NULL ) ) 
-		{
-			newmouseparms[0] = originalmouseparms[0];
-			newmouseparms[1] = originalmouseparms[1];
-		}
-
-		if( gEngfuncs.CheckParm( "-noforcemparms", NULL ) ) 
-		{
-			newmouseparms[0] = originalmouseparms[0];
-			newmouseparms[1] = originalmouseparms[1];
-			newmouseparms[2] = originalmouseparms[2];
-		}
-	}
-
-	mouse_buttons = MOUSE_BUTTON_COUNT;
-}
-
-/*
-===========
-IN_Shutdown
-===========
-*/
-void IN_Shutdown( void )
-{
-	IN_DeactivateMouse ();
-}
-
-/*
-===========
-IN_GetMousePos
-
-Ask for mouse position from engine
-===========
-*/
-void IN_GetMousePos( int *mx, int *my )
-{
-	gEngfuncs.GetMousePosition( mx, my );
-}
-
-/*
-===========
-IN_ResetMouse
-
-FIXME: Call through to engine?
-===========
-*/
-void IN_ResetMouse( void )
-{
-	SetCursorPos ( gEngfuncs.GetWindowCenterX(), gEngfuncs.GetWindowCenterY() );
-}
-
-/*
-===========
-IN_MouseEvent
-===========
-*/
-void DLLEXPORT IN_MouseEvent( int mstate )
-{
-	int i;
-
-	if( iMouseInUse || g_iVisibleMouse )
-		return;
-
-	// perform button actions
-	for( i = 0; i < mouse_buttons; i++ )
-	{
-		if( ( mstate & ( 1 << i ) ) &&
-			!( mouse_oldbuttonstate & ( 1 << i ) ) )
-		{
-			gEngfuncs.Key_Event( K_MOUSE1 + i, 1 );
-		}
-
-		if( !( mstate & ( 1 << i ) ) &&
-			( mouse_oldbuttonstate & ( 1 << i ) ) )
-		{
-			gEngfuncs.Key_Event( K_MOUSE1 + i, 0 );
-		}
-	}
-
-	mouse_oldbuttonstate = mstate;
-}
-
-/*
-===========
-IN_MouseMove
-===========
-*/
-void IN_MouseMove( float frametime, usercmd_t *cmd )
-{
-	int mx, my;
-	vec3_t viewangles;
-
-	gEngfuncs.GetViewAngles( (float *)viewangles );
-
-	//jjb - this disbles normal mouse control if the user is trying to 
-	//      move the camera, or if the mouse cursor is visible or if we're in intermission
-	if( !iMouseInUse && !g_iVisibleMouse && !gHUD.m_iIntermission )
-	{
-		GetCursorPos( &current_pos );
-
-		mx = current_pos.x - gEngfuncs.GetWindowCenterX() + mx_accum;
-		my = current_pos.y - gEngfuncs.GetWindowCenterY() + my_accum;
-
-		mx_accum = 0;
-		my_accum = 0;
-
-		if( m_filter->value )
-		{
-			mouse_x = ( mx + old_mouse_x ) * 0.5;
-			mouse_y = ( my + old_mouse_y ) * 0.5;
-		}
-		else
-		{
-			mouse_x = mx;
-			mouse_y = my;
-		}
-
-		old_mouse_x = mx;
-		old_mouse_y = my;
-
-		if( gHUD.GetSensitivity() != 0 )
-		{
-			mouse_x *= gHUD.GetSensitivity();
-			mouse_y *= gHUD.GetSensitivity();
-		}
-		else
-		{
-			mouse_x *= sensitivity->value;
-			mouse_y *= sensitivity->value;
-		}
-
-		// add mouse X/Y movement to cmd
-		if( ( in_strafe.state & 1 ) || ( lookstrafe->value && ( in_mlook.state & 1 ) ) )
-			cmd->sidemove += m_side->value * mouse_x;
-		else
-			viewangles[YAW] -= m_yaw->value * mouse_x;
-
-		if( ( in_mlook.state & 1 ) && !( in_strafe.state & 1 ) )
-		{
-			viewangles[PITCH] += m_pitch->value * mouse_y;
-			if( viewangles[PITCH] > cl_pitchdown->value )
-				viewangles[PITCH] = cl_pitchdown->value;
-			if( viewangles[PITCH] < -cl_pitchup->value )
-				viewangles[PITCH] = -cl_pitchup->value;
-		}
-		else
-		{
-			if( ( in_strafe.state & 1 ) && gEngfuncs.IsNoClipping() )
-			{
-				cmd->upmove -= m_forward->value * mouse_y;
-			}
-			else
-			{
-				cmd->forwardmove -= m_forward->value * mouse_y;
-			}
-		}
-
-		// if the mouse has moved, force it to the center, so there's room to move
-		if( mx || my )
-		{
-			IN_ResetMouse();
-		}
-	}
-
-	gEngfuncs.SetViewAngles( (float *)viewangles );
-
-/*
-//#define TRACE_TEST
-#if defined( TRACE_TEST )
-	{
-		int mx, my;
-		void V_Move( int mx, int my );
-		IN_GetMousePos( &mx, &my );
-		V_Move( mx, my );
-	}
-#endif
-*/
-}
-
-/*
-===========
-IN_Accumulate
-===========
-*/
-void DLLEXPORT IN_Accumulate( void )
-{
-	//only accumulate mouse if we are not moving the camera with the mouse
-	if( !iMouseInUse && !g_iVisibleMouse )
-	{
-		if( mouseactive )
-		{
-			GetCursorPos( &current_pos );
-
-			mx_accum += current_pos.x - gEngfuncs.GetWindowCenterX();
-			my_accum += current_pos.y - gEngfuncs.GetWindowCenterY();
-
-			// force the mouse to the center, so there's room to move
-			IN_ResetMouse();
-		}
-	}
-}
-
-/*
-===================
-IN_ClearStates
-===================
-*/
-void DLLEXPORT IN_ClearStates( void )
-{
-	if( !mouseactive )
-		return;
-
-	mx_accum = 0;
-	my_accum = 0;
-	mouse_oldbuttonstate = 0;
-}
-
-/* 
-=============== 
-IN_StartupJoystick 
-=============== 
-*/  
-void IN_StartupJoystick( void ) 
-{ 
-	int numdevs;
-	JOYCAPS jc;
-	MMRESULT mmr;
-
-	// assume no joystick
-	joy_avail = 0; 
-
-	// abort startup if user requests no joystick
-	if( gEngfuncs.CheckParm( "-nojoy", NULL ) ) 
-		return;
-
-	// verify joystick driver is present
-	if( ( numdevs = joyGetNumDevs() ) == 0 )
-	{
-		gEngfuncs.Con_DPrintf( "joystick not found -- driver not present\n\n" );
-		return;
-	}
-
-	// cycle through the joystick ids for the first valid one
-	for( joy_id = 0; joy_id < numdevs; joy_id++ )
-	{
-		memset( &ji, 0, sizeof(ji) );
-		ji.dwSize = sizeof(ji);
-		ji.dwFlags = JOY_RETURNCENTERED;
-
-		if( ( mmr = joyGetPosEx( joy_id, &ji ) ) == JOYERR_NOERROR )
-			break;
-	}
-
-	// abort startup if we didn't find a valid joystick
-	if( mmr != JOYERR_NOERROR )
-	{
-		gEngfuncs.Con_DPrintf( "joystick not found -- no valid joysticks (%x)\n\n", mmr );
-		return;
-	}
-
-	// get the capabilities of the selected joystick
-	// abort startup if command fails
-	memset( &jc, 0, sizeof(jc) );
-	if( ( mmr = joyGetDevCaps( joy_id, &jc, sizeof(jc) ) ) != JOYERR_NOERROR )
-	{
-		gEngfuncs.Con_DPrintf( "joystick not found -- invalid joystick capabilities (%x)\n\n", mmr ); 
-		return;
-	}
-
-	// save the joystick's number of buttons and POV status
-	joy_numbuttons = jc.wNumButtons;
-	joy_haspov = jc.wCaps & JOYCAPS_HASPOV;
-
-	// old button and POV states default to no buttons pressed
-	joy_oldbuttonstate = joy_oldpovstate = 0;
-
-	// mark the joystick as available and advanced initialization not completed
-	// this is needed as cvars are not available during initialization
-	gEngfuncs.Con_Printf( "joystick found\n\n", mmr );
-	joy_avail = 1; 
-	joy_advancedinit = 0;
-}
-
-/*
-===========
-RawValuePointer
-===========
-*/
-PDWORD RawValuePointer( int axis )
-{
-	switch( axis )
-	{
-	case JOY_AXIS_X:
-		return &ji.dwXpos;
-	case JOY_AXIS_Y:
-		return &ji.dwYpos;
-	case JOY_AXIS_Z:
-		return &ji.dwZpos;
-	case JOY_AXIS_R:
-		return &ji.dwRpos;
-	case JOY_AXIS_U:
-		return &ji.dwUpos;
-	case JOY_AXIS_V:
-		return &ji.dwVpos;
-	}
-	// FIX: need to do some kind of error
-	return &ji.dwXpos;
-}
-
-/*
-===========
-Joy_AdvancedUpdate_f
-===========
-*/
-void Joy_AdvancedUpdate_f( void )
-{
-	// called once by IN_ReadJoystick and by user whenever an update is needed
-	// cvars are now available
-	int i;
-	DWORD dwTemp;
-
-	// initialize all the maps
-	for( i = 0; i < JOY_MAX_AXES; i++ )
-	{
-		dwAxisMap[i] = AxisNada;
-		dwControlMap[i] = JOY_ABSOLUTE_AXIS;
-		pdwRawValue[i] = RawValuePointer(i);
-	}
-
-	if( joy_advanced->value == 0.0 )
-	{
-		// default joystick initialization
-		// 2 axes only with joystick control
-		dwAxisMap[JOY_AXIS_X] = AxisTurn;
-		// dwControlMap[JOY_AXIS_X] = JOY_ABSOLUTE_AXIS;
-		dwAxisMap[JOY_AXIS_Y] = AxisForward;
-		// dwControlMap[JOY_AXIS_Y] = JOY_ABSOLUTE_AXIS;
-	}
-	else
-	{
-		if( strcmp( joy_name->string, "joystick" ) != 0 )
-		{
-			// notify user of advanced controller
-			gEngfuncs.Con_Printf( "\n%s configured\n\n", joy_name->string );
-		}
-
-		// advanced initialization here
-		// data supplied by user via joy_axisn cvars
-		dwTemp = (DWORD)joy_advaxisx->value;
-		dwAxisMap[JOY_AXIS_X] = dwTemp & 0x0000000f;
-		dwControlMap[JOY_AXIS_X] = dwTemp & JOY_RELATIVE_AXIS;
-		dwTemp = (DWORD)joy_advaxisy->value;
-		dwAxisMap[JOY_AXIS_Y] = dwTemp & 0x0000000f;
-		dwControlMap[JOY_AXIS_Y] = dwTemp & JOY_RELATIVE_AXIS;
-		dwTemp = (DWORD)joy_advaxisz->value;
-		dwAxisMap[JOY_AXIS_Z] = dwTemp & 0x0000000f;
-		dwControlMap[JOY_AXIS_Z] = dwTemp & JOY_RELATIVE_AXIS;
-		dwTemp = (DWORD)joy_advaxisr->value;
-		dwAxisMap[JOY_AXIS_R] = dwTemp & 0x0000000f;
-		dwControlMap[JOY_AXIS_R] = dwTemp & JOY_RELATIVE_AXIS;
-		dwTemp = (DWORD)joy_advaxisu->value;
-		dwAxisMap[JOY_AXIS_U] = dwTemp & 0x0000000f;
-		dwControlMap[JOY_AXIS_U] = dwTemp & JOY_RELATIVE_AXIS;
-		dwTemp = (DWORD)joy_advaxisv->value;
-		dwAxisMap[JOY_AXIS_V] = dwTemp & 0x0000000f;
-		dwControlMap[JOY_AXIS_V] = dwTemp & JOY_RELATIVE_AXIS;
-	}
-
-	// compute the axes to collect from DirectInput
-	joy_flags = JOY_RETURNCENTERED | JOY_RETURNBUTTONS | JOY_RETURNPOV;
-	for( i = 0; i < JOY_MAX_AXES; i++ )
-	{
-		if( dwAxisMap[i] != AxisNada )
-		{
-			joy_flags |= dwAxisFlags[i];
-		}
-	}
-}
-
-/*
-===========
-IN_Commands
-===========
-*/
-void IN_Commands( void )
-{
-	int i, key_index;
-	DWORD buttonstate, povstate;
-
-	if( !joy_avail )
-	{
-		return;
-	}
-
-	// loop through the joystick buttons
-	// key a joystick event or auxillary event for higher number buttons for each state change
-	buttonstate = ji.dwButtons;
-	for( i = 0; i < (int)joy_numbuttons; i++ )
-	{
-		if( ( buttonstate & ( 1 << i ) ) && !( joy_oldbuttonstate & ( 1 << i ) ) )
-		{
-			key_index = ( i < 4 ) ? K_JOY1 : K_AUX1;
-			gEngfuncs.Key_Event( key_index + i, 1 );
-		}
-
-		if( !( buttonstate & ( 1 << i ) ) && ( joy_oldbuttonstate & ( 1 << i ) ) )
-		{
-			key_index = ( i < 4 ) ? K_JOY1 : K_AUX1;
-			gEngfuncs.Key_Event( key_index + i, 0 );
-		}
-	}
-	joy_oldbuttonstate = buttonstate;
-
-	if( joy_haspov )
-	{
-		// convert POV information into 4 bits of state information
-		// this avoids any potential problems related to moving from one
-		// direction to another without going through the center position
-		povstate = 0;
-		if( ji.dwPOV != JOY_POVCENTERED )
-		{
-			if( ji.dwPOV == JOY_POVFORWARD )
-				povstate |= 0x01;
-			if( ji.dwPOV == JOY_POVRIGHT )
-				povstate |= 0x02;
-			if( ji.dwPOV == JOY_POVBACKWARD )
-				povstate |= 0x04;
-			if( ji.dwPOV == JOY_POVLEFT )
-				povstate |= 0x08;
-		}
-		// determine which bits have changed and key an auxillary event for each change
-		for( i = 0; i < 4; i++ )
-		{
-			if( ( povstate & ( 1 << i ) ) && !( joy_oldpovstate & ( 1 << i ) ) )
-			{
-				gEngfuncs.Key_Event( K_AUX29 + i, 1 );
-			}
-
-			if( !( povstate & ( 1 << i ) ) && ( joy_oldpovstate & ( 1 << i ) ) )
-			{
-				gEngfuncs.Key_Event( K_AUX29 + i, 0 );
-			}
-		}
-		joy_oldpovstate = povstate;
-	}
-}
-
-/*
-=============== 
-IN_ReadJoystick
-=============== 
-*/  
-int IN_ReadJoystick( void )
-{
-	memset( &ji, 0, sizeof(ji) );
-	ji.dwSize = sizeof(ji);
-	ji.dwFlags = joy_flags;
-
-	if( joyGetPosEx( joy_id, &ji ) == JOYERR_NOERROR )
-	{
-		// this is a hack -- there is a bug in the Logitech WingMan Warrior DirectInput Driver
-		// rather than having 32768 be the zero point, they have the zero point at 32668
-		// go figure -- anyway, now we get the full resolution out of the device
-		if( joy_wwhack1->value != 0.0 )
-		{
-			ji.dwUpos += 100;
-		}
-		return 1;
-	}
-	else
-	{
-		// read error occurred
-		// turning off the joystick seems too harsh for 1 read error,\
-		// but what should be done?
-		// Con_Printf( "IN_ReadJoystick: no response\n" );
-		// joy_avail = 0;
-		return 0;
-	}
-}
-
-/*
-===========
-IN_JoyMove
-===========
-*/
-void IN_JoyMove( float frametime, usercmd_t *cmd )
-{
-	float speed, aspeed;
-	float fAxisValue, fTemp;
-	int i;
-	vec3_t viewangles;
-
-	gEngfuncs.GetViewAngles( (float *)viewangles );
-
-	// complete initialization if first time in
-	// this is needed as cvars are not available at initialization time
-	if( joy_advancedinit != 1 )
-	{
-		Joy_AdvancedUpdate_f();
-		joy_advancedinit = 1;
-	}
-
-	// verify joystick is available and that the user wants to use it
-	if( !joy_avail || !in_joystick->value )
-	{
-		return; 
-	}
-
-	// collect the joystick data, if possible
-	if( IN_ReadJoystick () != 1 )
-	{
-		return;
-	}
-
-	if( in_speed.state & 1 )
-		speed = cl_movespeedkey->value;
-	else
-		speed = 1;
-
-	aspeed = speed * frametime;
-
-	// loop through the axes
-	for( i = 0; i < JOY_MAX_AXES; i++ )
-	{
-		// get the floating point zero-centered, potentially-inverted data for the current axis
-		fAxisValue = (float) *pdwRawValue[i];
-		// move centerpoint to zero
-		fAxisValue -= 32768.0;
-
-		if( joy_wwhack2->value != 0.0 )
-		{
-			if( dwAxisMap[i] == AxisTurn )
-			{
-				// this is a special formula for the Logitech WingMan Warrior
-				// y=ax^b; where a = 300 and b = 1.3
-				// also x values are in increments of 800 (so this is factored out)
-				// then bounds check result to level out excessively high spin rates
-				fTemp = 300.0 * pow( abs( fAxisValue ) / 800.0, 1.3 );
-				if( fTemp > 14000.0 )
-					fTemp = 14000.0;
-				// restore direction information
-				fAxisValue = ( fAxisValue > 0.0 ) ? fTemp : -fTemp;
-			}
-		}
-
-		// convert range from -32768..32767 to -1..1
-		fAxisValue /= 32768.0;
-
-		switch( dwAxisMap[i] )
-		{
-		case AxisForward:
-			if( ( joy_advanced->value == 0.0 ) && ( in_jlook.state & 1 ) )
-			{
-				// user wants forward control to become look control
-				if( fabs( fAxisValue ) > joy_pitchthreshold->value )
-				{	
-					// if mouse invert is on, invert the joystick pitch value
-					// only absolute control support here (joy_advanced is 0)
-					if( m_pitch->value < 0.0 )
-					{
-						viewangles[PITCH] -= ( fAxisValue * joy_pitchsensitivity->value ) * aspeed * cl_pitchspeed->value;
-					}
-					else
-					{
-						viewangles[PITCH] += ( fAxisValue * joy_pitchsensitivity->value ) * aspeed * cl_pitchspeed->value;
-					}
-				}
-			}
-			else
-			{
-				// user wants forward control to be forward control
-				if( fabs( fAxisValue ) > joy_forwardthreshold->value )
-				{
-					cmd->forwardmove += ( fAxisValue * joy_forwardsensitivity->value ) * speed * cl_forwardspeed->value;
-				}
-			}
-			break;
-		case AxisSide:
-			if( fabs( fAxisValue ) > joy_sidethreshold->value )
-			{
-				cmd->sidemove += ( fAxisValue * joy_sidesensitivity->value ) * speed * cl_sidespeed->value;
-			}
-			break;
-		case AxisTurn:
-			if( ( in_strafe.state & 1 ) || ( lookstrafe->value && ( in_jlook.state & 1 ) ) )
-			{
-				// user wants turn control to become side control
-				if( fabs( fAxisValue ) > joy_sidethreshold->value )
-				{
-					cmd->sidemove -= ( fAxisValue * joy_sidesensitivity->value ) * speed * cl_sidespeed->value;
-				}
-			}
-			else
-			{
-				// user wants turn control to be turn control
-				if( fabs( fAxisValue ) > joy_yawthreshold->value )
-				{
-					if( dwControlMap[i] == JOY_ABSOLUTE_AXIS )
-					{
-						viewangles[YAW] += ( fAxisValue * joy_yawsensitivity->value ) * aspeed * cl_yawspeed->value;
-					}
-					else
-					{
-						viewangles[YAW] += ( fAxisValue * joy_yawsensitivity->value ) * speed * 180.0;
-					}
-				}
-			}
-			break;
-		case AxisLook:
-			if( in_jlook.state & 1 )
-			{
-				if( fabs( fAxisValue ) > joy_pitchthreshold->value )
-				{
-					// pitch movement detected and pitch movement desired by user
-					if( dwControlMap[i] == JOY_ABSOLUTE_AXIS )
-					{
-						viewangles[PITCH] += ( fAxisValue * joy_pitchsensitivity->value ) * aspeed * cl_pitchspeed->value;
-					}
-					else
-					{
-						viewangles[PITCH] += ( fAxisValue * joy_pitchsensitivity->value ) * speed * 180.0;
-					}
-				}
-			}
-			break;
-		default:
-			break;
-		}
-	}
-
-	// bounds check pitch
-	if( viewangles[PITCH] > cl_pitchdown->value )
-		viewangles[PITCH] = cl_pitchdown->value;
-	if( viewangles[PITCH] < -cl_pitchup->value )
-		viewangles[PITCH] = -cl_pitchup->value;
-
-	gEngfuncs.SetViewAngles( (float *)viewangles );
-}
-
-/*
-===========
-IN_Move
-===========
-*/
-void IN_Move( float frametime, usercmd_t *cmd )
-{
-	if( !iMouseInUse && mouseactive )
-	{
-		IN_MouseMove( frametime, cmd );
-	}
-
-	IN_JoyMove( frametime, cmd );
-}
-
-/*
-===========
-IN_Init
-===========
-*/
-void IN_Init( void )
-{
-	m_filter = gEngfuncs.pfnRegisterVariable( "m_filter","0", FCVAR_ARCHIVE );
-	sensitivity = gEngfuncs.pfnRegisterVariable( "sensitivity","3", FCVAR_ARCHIVE ); // user mouse sensitivity setting.
-
-	in_joystick = gEngfuncs.pfnRegisterVariable( "joystick","0", FCVAR_ARCHIVE );
-	joy_name = gEngfuncs.pfnRegisterVariable( "joyname", "joystick", 0 );
-	joy_advanced = gEngfuncs.pfnRegisterVariable( "joyadvanced", "0", 0 );
-	joy_advaxisx = gEngfuncs.pfnRegisterVariable( "joyadvaxisx", "0", 0 );
-	joy_advaxisy = gEngfuncs.pfnRegisterVariable( "joyadvaxisy", "0", 0 );
-	joy_advaxisz = gEngfuncs.pfnRegisterVariable( "joyadvaxisz", "0", 0 );
-	joy_advaxisr = gEngfuncs.pfnRegisterVariable( "joyadvaxisr", "0", 0 );
-	joy_advaxisu = gEngfuncs.pfnRegisterVariable( "joyadvaxisu", "0", 0 );
-	joy_advaxisv = gEngfuncs.pfnRegisterVariable( "joyadvaxisv", "0", 0 );
-	joy_forwardthreshold = gEngfuncs.pfnRegisterVariable( "joyforwardthreshold", "0.15", 0 );
-	joy_sidethreshold = gEngfuncs.pfnRegisterVariable( "joysidethreshold", "0.15", 0 );
-	joy_pitchthreshold = gEngfuncs.pfnRegisterVariable( "joypitchthreshold", "0.15", 0 );
-	joy_yawthreshold = gEngfuncs.pfnRegisterVariable( "joyyawthreshold", "0.15", 0 );
-	joy_forwardsensitivity = gEngfuncs.pfnRegisterVariable( "joyforwardsensitivity", "-1.0", 0 );
-	joy_sidesensitivity = gEngfuncs.pfnRegisterVariable( "joysidesensitivity", "-1.0", 0 );
-	joy_pitchsensitivity = gEngfuncs.pfnRegisterVariable( "joypitchsensitivity", "1.0", 0 );
-	joy_yawsensitivity = gEngfuncs.pfnRegisterVariable( "joyyawsensitivity", "-1.0", 0 );
-	joy_wwhack1 = gEngfuncs.pfnRegisterVariable( "joywwhack1", "0.0", 0 );
-	joy_wwhack2 = gEngfuncs.pfnRegisterVariable( "joywwhack2", "0.0", 0 );
-
-	gEngfuncs.pfnAddCommand ("force_centerview", Force_CenterView_f);
-	gEngfuncs.pfnAddCommand ("joyadvancedupdate", Joy_AdvancedUpdate_f);
-
-	IN_StartupMouse ();
-	IN_StartupJoystick ();
-}
diff --git a/cl_dll/kbutton.h b/cl_dll/kbutton.h
index 29accdf5..54f1ea93 100644
--- a/cl_dll/kbutton.h
+++ b/cl_dll/kbutton.h
@@ -4,10 +4,9 @@
 //
 // $NoKeywords: $
 //=============================================================================
-
+#pragma once
 #if !defined( KBUTTONH )
 #define KBUTTONH
-#pragma once
 
 typedef struct kbutton_s
 {
diff --git a/cl_dll/menu.cpp b/cl_dll/menu.cpp
index 5f710a33..fc24b917 100644
--- a/cl_dll/menu.cpp
+++ b/cl_dll/menu.cpp
@@ -83,7 +83,7 @@ int CHudMenu::Draw( float flTime )
 	int nlc = 0;
 	for( i = 0; i < MAX_MENU_STRING && g_szMenuString[i] != '\0'; i++ )
 	{
-		if ( g_szMenuString[i] == '\n' )
+		if( g_szMenuString[i] == '\n' )
 			nlc++;
 	}
 
@@ -153,19 +153,21 @@ int CHudMenu::MsgFunc_ShowMenu( const char *pszName, int iSize, void *pbuf )
 		else
 		{
 			// append to the current menu string
-			strncat( g_szPrelocalisedMenuString, READ_STRING(), MAX_MENU_STRING - strlen( g_szPrelocalisedMenuString ) );
+			strncat( g_szPrelocalisedMenuString, READ_STRING(), MAX_MENU_STRING - strlen( g_szPrelocalisedMenuString ) - 1 );
 		}
 		g_szPrelocalisedMenuString[MAX_MENU_STRING - 1] = 0;  // ensure null termination (strncat/strncpy does not)
 
 		if( !NeedMore )
 		{
 			// we have the whole string, so we can localise it now
-			strcpy( g_szMenuString, gHUD.m_TextMessage.BufferedLocaliseTextString( g_szPrelocalisedMenuString ) );
+			strncpy( g_szMenuString, gHUD.m_TextMessage.BufferedLocaliseTextString( g_szPrelocalisedMenuString ), MAX_MENU_STRING );
+			g_szMenuString[MAX_MENU_STRING - 1] = '\0';
 
 			// Swap in characters
 			if( KB_ConvertString( g_szMenuString, &temp ) )
 			{
-				strcpy( g_szMenuString, temp );
+				strncpy( g_szMenuString, temp, MAX_MENU_STRING );
+				g_szMenuString[MAX_MENU_STRING - 1] = '\0';
 				free( temp );
 			}
 		}
diff --git a/cl_dll/message.cpp b/cl_dll/message.cpp
index 5d52d413..ff8d97bf 100644
--- a/cl_dll/message.cpp
+++ b/cl_dll/message.cpp
@@ -29,7 +29,7 @@ DECLARE_MESSAGE( m_Message, GameTitle )
 
 // 1 Global client_textmessage_t for custom messages that aren't in the titles.txt
 client_textmessage_t	g_pCustomMessage;
-char *g_pCustomName = "Custom";
+const char *g_pCustomName = "Custom";
 char g_pCustomText[1024];
 
 int CHudMessage::Init( void )
@@ -260,7 +260,7 @@ void CHudMessage::MessageDrawScan( client_textmessage_t *pMessage, float time )
 			width = 0;
 		}
 		else
-			width += gHUD.m_scrinfo.charWidths[*pText];
+			width += gHUD.m_scrinfo.charWidths[(unsigned char)*pText];
 		pText++;
 		length++;
 	}
@@ -310,7 +310,7 @@ int CHudMessage::Draw( float fTime )
 {
 	int i, drawn;
 	client_textmessage_t *pMessage;
-	float endTime = 0;
+	float endTime = 0.0f;
 
 	drawn = 0;
 
diff --git a/cl_dll/overview.h b/cl_dll/overview.h
index 6748760b..59535fb4 100644
--- a/cl_dll/overview.h
+++ b/cl_dll/overview.h
@@ -5,9 +5,9 @@
 // $NoKeywords: $
 //=============================================================================
 
+#pragma once
 #ifndef OVERVIEW_H
 #define OVERVIEW_H
-#pragma once
 
 //-----------------------------------------------------------------------------
 // Purpose: Handles the drawing of the top-down map and all the things on it
diff --git a/cl_dll/parsemsg.h b/cl_dll/parsemsg.h
index 0e6bd2a3..05efefc3 100644
--- a/cl_dll/parsemsg.h
+++ b/cl_dll/parsemsg.h
@@ -15,6 +15,9 @@
 //
 //  parsemsg.h
 //
+#pragma once
+#ifndef PARSEMSG_H
+#define PARSEMSG_H
 
 #define ASSERT( x )
 
@@ -30,6 +33,7 @@ float READ_COORD( void );
 float READ_ANGLE( void );
 float READ_HIRESANGLE( void );
 
+#endif // PARSEMSG_H
 
 
 
diff --git a/cl_dll/scoreboard.cpp b/cl_dll/scoreboard.cpp
index b20e316c..908d00f3 100644
--- a/cl_dll/scoreboard.cpp
+++ b/cl_dll/scoreboard.cpp
@@ -92,17 +92,17 @@ We have a minimum width of 1-320 - we could have the field widths scale with it?
 
 // X positions
 // relative to the side of the scoreboard
-#define NAME_RANGE_MIN  20
-#define NAME_RANGE_MAX  145
-#define KILLS_RANGE_MIN 130
-#define KILLS_RANGE_MAX 170
-#define DIVIDER_POS		180
-#define DEATHS_RANGE_MIN  185
-#define DEATHS_RANGE_MAX  210
-#define PING_RANGE_MIN	245
-#define PING_RANGE_MAX	295
-#define PL_RANGE_MIN 315
-#define PL_RANGE_MAX 375
+#define NAME_RANGE_MIN  -65
+#define NAME_RANGE_MAX  180
+#define KILLS_RANGE_MIN 165
+#define KILLS_RANGE_MAX 205
+#define DIVIDER_POS		215
+#define DEATHS_RANGE_MIN  220
+#define DEATHS_RANGE_MAX  245
+#define PING_RANGE_MIN	280
+#define PING_RANGE_MAX	330
+#define PL_RANGE_MIN 350
+#define PL_RANGE_MAX 410
 
 int SCOREBOARD_WIDTH = 320;
 
@@ -145,7 +145,7 @@ int CHudScoreboard::Draw( float fTime )
 	int xpos = NAME_RANGE_MIN + xpos_rel;
 
 	FAR_RIGHT = can_show_packetloss ? PL_RANGE_MAX : PING_RANGE_MAX;
-	FAR_RIGHT += 5;
+	FAR_RIGHT += 125;
 	if( cl_scoreboard_bg && cl_scoreboard_bg->value )
 		gHUD.DrawDarkRectangle( xpos - 5, ypos - 5, FAR_RIGHT, ROW_RANGE_MAX );
 	if( !gHUD.m_Teamplay )
@@ -340,7 +340,7 @@ int CHudScoreboard::DrawPlayers( int xpos_rel, float list_slot, int nameoffset,
 	}
 
 	FAR_RIGHT = can_show_packetloss ? PL_RANGE_MAX : PING_RANGE_MAX;
-	FAR_RIGHT += 5;
+	FAR_RIGHT += 125;
 
 	// draw the players, in order,  and restricted to team if set
 	while( 1 )
diff --git a/cl_dll/status_icons.cpp b/cl_dll/status_icons.cpp
index c960d5ef..4b2d9726 100644
--- a/cl_dll/status_icons.cpp
+++ b/cl_dll/status_icons.cpp
@@ -104,7 +104,7 @@ int CHudStatusIcons::MsgFunc_StatusIcon( const char *pszName, int iSize, void *p
 }
 
 // add the icon to the icon list, and set it's drawing color
-void CHudStatusIcons::EnableIcon( char *pszIconName, unsigned char red, unsigned char green, unsigned char blue )
+void CHudStatusIcons::EnableIcon( const char *pszIconName, unsigned char red, unsigned char green, unsigned char blue )
 {
 	int i;
 
@@ -149,7 +149,7 @@ void CHudStatusIcons::EnableIcon( char *pszIconName, unsigned char red, unsigned
 	}
 }
 
-void CHudStatusIcons::DisableIcon( char *pszIconName )
+void CHudStatusIcons::DisableIcon( const char *pszIconName )
 {
 	// find the sprite is in the current list
 	for( int i = 0; i < MAX_ICONSPRITES; i++ )
diff --git a/cl_dll/studio_util.h b/cl_dll/studio_util.h
index 963dcda7..7af94672 100644
--- a/cl_dll/studio_util.h
+++ b/cl_dll/studio_util.h
@@ -5,11 +5,9 @@
 // $NoKeywords: $
 //=============================================================================
 
+#pragma once
 #if !defined( STUDIO_UTIL_H )
 #define STUDIO_UTIL_H
-#if defined( WIN32 )
-#pragma once
-#endif
 
 #ifndef M_PI
 #define M_PI		3.14159265358979323846	// matches value in gcc v2 math.h
diff --git a/cl_dll/text_message.cpp b/cl_dll/text_message.cpp
index af62a915..b959fc87 100644
--- a/cl_dll/text_message.cpp
+++ b/cl_dll/text_message.cpp
@@ -45,14 +45,15 @@ int CHudTextMessage::Init( void )
 char *CHudTextMessage::LocaliseTextString( const char *msg, char *dst_buffer, int buffer_size )
 {
 	char *dst = dst_buffer;
-	for( char *src = (char*)msg; *src != 0 && buffer_size > 0; buffer_size-- )
+	for( char *src = (char*)msg; *src != 0 && ( buffer_size - 1 ) > 0; buffer_size-- )
 	{
 		if( *src == '#' )
 		{
 			// cut msg name out of string
 			static char word_buf[255];
 			char *wdst = word_buf, *word_start = src;
-			for( ++src; ( *src >= 'A' && *src <= 'z' ) || ( *src >= '0' && *src <= '9' ); wdst++, src++ )
+			int wordbuf_size = (int)sizeof(word_buf);
+			for( ++src; ( ( *src >= 'A' && *src <= 'z' ) || ( *src >= '0' && *src <= '9' ) ) && ( wordbuf_size - 1 ) > 0; wdst++, src++, wordbuf_size-- )
 			{
 				*wdst = *src;
 			}
@@ -69,21 +70,20 @@ char *CHudTextMessage::LocaliseTextString( const char *msg, char *dst_buffer, in
 			}
 
 			// copy string into message over the msg name
-			for( char *wsrc = (char*)clmsg->pMessage; *wsrc != 0; wsrc++, dst++ )
+			for( char *wsrc = (char*)clmsg->pMessage; *wsrc != 0 && ( buffer_size - 1 ) > 0; wsrc++, dst++, buffer_size-- )
 			{
 				*dst = *wsrc;
 			}
-			*dst = 0;
+			buffer_size++;
 		}
 		else
 		{
 			*dst = *src;
 			dst++, src++;
-			*dst = 0;
 		}
 	}
 
-	dst_buffer[buffer_size - 1] = 0; // ensure null termination
+	*dst = 0; // ensure null termination
 	return dst_buffer;
 }
 
@@ -91,12 +91,12 @@ char *CHudTextMessage::LocaliseTextString( const char *msg, char *dst_buffer, in
 char *CHudTextMessage::BufferedLocaliseTextString( const char *msg )
 {
 	static char dst_buffer[1024];
-	LocaliseTextString( msg, dst_buffer, 1024 );
+	LocaliseTextString( msg, dst_buffer, sizeof(dst_buffer) );
 	return dst_buffer;
 }
 
 // Simplified version of LocaliseTextString;  assumes string is only one word
-char *CHudTextMessage::LookupString( const char *msg, int *msg_dest )
+const char *CHudTextMessage::LookupString( const char *msg, int *msg_dest )
 {
 	if( !msg )
 		return "";
@@ -108,7 +108,7 @@ char *CHudTextMessage::LookupString( const char *msg, int *msg_dest )
 		client_textmessage_t *clmsg = TextMessageGet( msg + 1 );
 
 		if( !clmsg || !(clmsg->pMessage) )
-			return (char*)msg; // lookup failed, so return the original string
+			return msg; // lookup failed, so return the original string
 
 		if( msg_dest )
 		{
@@ -118,12 +118,12 @@ char *CHudTextMessage::LookupString( const char *msg, int *msg_dest )
 				*msg_dest = -clmsg->effect;
 		}
 
-		return (char*)clmsg->pMessage;
+		return clmsg->pMessage;
 	}
 	else
 	{
 		// nothing special about this message, so just return the same string
-		return (char*)msg;
+		return msg;
 	}
 }
 
@@ -162,42 +162,39 @@ int CHudTextMessage::MsgFunc_TextMsg( const char *pszName, int iSize, void *pbuf
 
 	int msg_dest = READ_BYTE();
 
-	static char szBuf[6][128];
-	char *msg_text = LookupString( READ_STRING(), &msg_dest );
-	msg_text = strcpy( szBuf[0], msg_text );
+#define MSG_BUF_SIZE 128
+	char szBuf[6][MSG_BUF_SIZE];
+
+	strncpy( szBuf[0], LookupString( READ_STRING(), &msg_dest ), MSG_BUF_SIZE - 1 );
+	szBuf[0][MSG_BUF_SIZE - 1] = '\0';
+
+	for( int i = 1; i <= 4; i++ )
+	{
+		// keep reading strings and using C format strings for subsituting the strings into the localised text string
+		strncpy( szBuf[i], LookupString( READ_STRING() ), MSG_BUF_SIZE - 1 );
+		szBuf[i][MSG_BUF_SIZE - 1] = '\0';
+		StripEndNewlineFromString( szBuf[i] ); // these strings are meant for subsitution into the main strings, so cull the automatic end newlines
+	}
 
-	// keep reading strings and using C format strings for subsituting the strings into the localised text string
-	char *sstr1 = LookupString( READ_STRING() );
-	sstr1 = strcpy( szBuf[1], sstr1 );
-	StripEndNewlineFromString( sstr1 );  // these strings are meant for subsitution into the main strings, so cull the automatic end newlines
-	char *sstr2 = LookupString( READ_STRING() );
-	sstr2 = strcpy( szBuf[2], sstr2 );
-	StripEndNewlineFromString( sstr2 );
-	char *sstr3 = LookupString( READ_STRING() );
-	sstr3 = strcpy( szBuf[3], sstr3 );
-	StripEndNewlineFromString( sstr3 );
-	char *sstr4 = LookupString( READ_STRING() );
-	sstr4 = strcpy( szBuf[4], sstr4 );
-	StripEndNewlineFromString( sstr4 );
 	char *psz = szBuf[5];
 
 	switch( msg_dest )
 	{
 	case HUD_PRINTCENTER:
-		sprintf( psz, msg_text, sstr1, sstr2, sstr3, sstr4 );
+		snprintf( psz, MSG_BUF_SIZE, szBuf[0], szBuf[1], szBuf[2], szBuf[3], szBuf[4] );
 		CenterPrint( ConvertCRtoNL( psz ) );
 		break;
 	case HUD_PRINTNOTIFY:
 		psz[0] = 1;  // mark this message to go into the notify buffer
-		sprintf( psz + 1, msg_text, sstr1, sstr2, sstr3, sstr4 );
+		snprintf( psz + 1, MSG_BUF_SIZE - 1, szBuf[0], szBuf[1], szBuf[2], szBuf[3], szBuf[4] );
 		ConsolePrint( ConvertCRtoNL( psz ) );
 		break;
 	case HUD_PRINTTALK:
-		sprintf( psz, msg_text, sstr1, sstr2, sstr3, sstr4 );
-		gHUD.m_SayText.SayTextPrint( ConvertCRtoNL( psz ), 128 );
+		snprintf( psz, MSG_BUF_SIZE, szBuf[0], szBuf[1], szBuf[2], szBuf[3], szBuf[4] );
+		gHUD.m_SayText.SayTextPrint( ConvertCRtoNL( psz ), MSG_BUF_SIZE );
 		break;
 	case HUD_PRINTCONSOLE:
-		sprintf( psz, msg_text, sstr1, sstr2, sstr3, sstr4 );
+		snprintf( psz, MSG_BUF_SIZE, szBuf[0], szBuf[1], szBuf[2], szBuf[3], szBuf[4] );
 		ConsolePrint( ConvertCRtoNL( psz ) );
 		break;
 	}
diff --git a/cl_dll/util_vector.h b/cl_dll/util_vector.h
index ff5f9a91..477d97be 100644
--- a/cl_dll/util_vector.h
+++ b/cl_dll/util_vector.h
@@ -15,6 +15,9 @@
 //  Vector.h
 // A subset of the extdll.h in the project HL Entity DLL
 //
+#pragma once
+#ifndef UTIL_VECTOR_H
+#define UTIL_VECTOR_H
 
 // Misc C-runtime library headers
 #include "stdio.h"
@@ -23,7 +26,7 @@
 
 // Header file containing definition of globalvars_t and entvars_t
 typedef unsigned int func_t;					//
-typedef unsigned int string_t;				// from engine's pr_comp.h;
+typedef int string_t;				// from engine's pr_comp.h;
 typedef float vec_t;				// needed before including progdefs.h
 
 //=========================================================
@@ -124,3 +127,4 @@ inline float DotProduct( const Vector& a, const Vector& b) { return( a.x * b.x +
 inline Vector CrossProduct(const Vector& a, const Vector& b) { return Vector( a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x ); }
 
 #define vec3_t Vector
+#endif // UTIL_VECTOR_H
diff --git a/cl_dll/view.cpp b/cl_dll/view.cpp
index c7eeb00f..e0b267ae 100644
--- a/cl_dll/view.cpp
+++ b/cl_dll/view.cpp
@@ -78,6 +78,7 @@ extern cvar_t	*cl_forwardspeed;
 extern cvar_t	*chase_active;
 extern cvar_t	*scr_ofsx, *scr_ofsy, *scr_ofsz;
 extern cvar_t	*cl_vsmoothing;
+extern cvar_t	*cl_viewbob;
 extern Vector   dead_viewangles;
 
 #define	CAM_MODE_RELAX		1
@@ -90,7 +91,7 @@ float v_cameraFocusAngle = 35.0f;
 int v_cameraMode = CAM_MODE_FOCUS;
 qboolean v_resetCamera = 1;
 
-vec3_t ev_punchangle;
+vec3_t g_ev_punchangle;
 
 cvar_t	*scr_ofsx;
 cvar_t	*scr_ofsy;
@@ -351,11 +352,11 @@ V_CalcIntermissionRefdef
 */
 void V_CalcIntermissionRefdef( struct ref_params_s *pparams )
 {
-	cl_entity_t *ent, *view;
+	cl_entity_t /**ent,*/ *view;
 	float old;
 
 	// ent is the player model ( visible when out of body )
-	ent = gEngfuncs.GetLocalPlayer();
+	//ent = gEngfuncs.GetLocalPlayer();
 
 	// view is the weapon model (only visible from inside body )
 	view = gEngfuncs.GetViewModel();
@@ -527,7 +528,7 @@ void V_CalcNormalRefdef( struct ref_params_s *pparams )
 	V_AddIdle( pparams );
 
 	// offsets
-	if ( pparams->health <= 0 )
+	if( pparams->health <= 0 )
 	{
 		VectorCopy( dead_viewangles, angles );
 	}
@@ -598,6 +599,9 @@ void V_CalcNormalRefdef( struct ref_params_s *pparams )
 	view->angles[ROLL] -= bob * 1;
 	view->angles[PITCH] -= bob * 0.3;
 
+	if( cl_viewbob && cl_viewbob->value )
+		VectorCopy( view->angles, view->curstate.angles );
+
 	// pushing the view origin down off of the same X/Z plane as the ent's origin will give the
 	// gun a very nice 'shifting' effect when the player looks up/down. If there is a problem
 	// with view model distortion, this may be a cause. (SJB). 
@@ -626,9 +630,9 @@ void V_CalcNormalRefdef( struct ref_params_s *pparams )
 	VectorAdd( pparams->viewangles, pparams->punchangle, pparams->viewangles );
 
 	// Include client side punch, too
-	VectorAdd( pparams->viewangles, (float *)&ev_punchangle, pparams->viewangles );
+	VectorAdd( pparams->viewangles, (float *)&g_ev_punchangle, pparams->viewangles );
 
-	V_DropPunchAngle( pparams->frametime, (float *)&ev_punchangle );
+	V_DropPunchAngle( pparams->frametime, (float *)&g_ev_punchangle );
 
 	// smooth out stair step ups
 #if 1
@@ -1307,7 +1311,7 @@ void V_GetMapChasePosition( int target, float *cl_angles, float *origin, float *
 
 int V_FindViewModelByWeaponModel( int weaponindex )
 {
-	static char *modelmap[][2] =
+	static const char *modelmap[][2] =
 	{
 		{ "models/p_crossbow.mdl",	"models/v_crossbow.mdl" },
 		{ "models/p_crowbar.mdl",	"models/v_crowbar.mdl" },
@@ -1336,7 +1340,7 @@ int V_FindViewModelByWeaponModel( int weaponindex )
 		{ NULL, NULL }
 	};
 
-	struct model_s * weaponModel = IEngineStudio.GetModelByIndex( weaponindex );
+	struct model_s *weaponModel = IEngineStudio.GetModelByIndex( weaponindex );
 
 	if( weaponModel )
 	{
@@ -1584,7 +1588,7 @@ Client side punch effect
 */
 void V_PunchAxis( int axis, float punch )
 {
-	ev_punchangle[axis] = punch;
+	g_ev_punchangle[axis] = punch;
 }
 
 /*
diff --git a/common/beamdef.h b/common/beamdef.h
index 3b8c553a..f254428c 100644
--- a/common/beamdef.h
+++ b/common/beamdef.h
@@ -12,7 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
-
+#pragma once
 #ifndef BEAMDEF_H
 #define BEAMDEF_H
 
@@ -57,4 +57,4 @@ struct beam_s
 	struct particle_s	*particles;
 };
 
-#endif//BEAMDEF_H
\ No newline at end of file
+#endif//BEAMDEF_H
diff --git a/common/bspfile.h b/common/bspfile.h
index 809e2fd0..079e1b21 100644
--- a/common/bspfile.h
+++ b/common/bspfile.h
@@ -12,7 +12,7 @@ but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 */
-
+#pragma once
 #ifndef BSPFILE_H
 #define BSPFILE_H
 
diff --git a/common/cl_entity.h b/common/cl_entity.h
index 02f84e35..c003ce30 100644
--- a/common/cl_entity.h
+++ b/common/cl_entity.h
@@ -12,7 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
-
+#pragma once
 #ifndef CL_ENTITY_H
 #define CL_ENTITY_H
 
@@ -102,4 +102,4 @@ struct cl_entity_s
 	colorVec		cvFloorColor;
 };
 
-#endif//CL_ENTITY_H
\ No newline at end of file
+#endif//CL_ENTITY_H
diff --git a/common/com_model.h b/common/com_model.h
index 709f23d9..abc8e8e6 100644
--- a/common/com_model.h
+++ b/common/com_model.h
@@ -12,7 +12,7 @@ but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 */
-
+#pragma once
 #ifndef COM_MODEL_H
 #define COM_MODEL_H
 
@@ -410,4 +410,4 @@ typedef struct
 	mspriteframedesc_t	frames[1];
 } msprite_t;
 
-#endif//COM_MODEL_H
\ No newline at end of file
+#endif//COM_MODEL_H
diff --git a/common/con_nprint.h b/common/con_nprint.h
index 5d87c760..615a1850 100644
--- a/common/con_nprint.h
+++ b/common/con_nprint.h
@@ -12,6 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
+#pragma once
 #ifndef CON_NPRINT_H
 #define CON_NPRINT_H
 
@@ -22,4 +23,4 @@ typedef struct con_nprint_s
 	float	color[3];		// RGB colors ( 0.0 -> 1.0 scale )
 } con_nprint_t;
 
-#endif//CON_NPRINT_H
\ No newline at end of file
+#endif//CON_NPRINT_H
diff --git a/common/const.h b/common/const.h
index b885e44e..fa0f33e6 100644
--- a/common/const.h
+++ b/common/const.h
@@ -12,6 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
+#pragma once
 #ifndef CONST_H
 #define CONST_H
 //
@@ -110,7 +111,9 @@
 #define EF_NOINTERP			32	// don't interpolate the next frame
 #define EF_LIGHT			64	// rocket flare glow sprite
 #define EF_NODRAW			128	// don't draw entity
-
+#define EF_NIGHTVISION			256	// player nightvision
+#define EF_SNIPERLASER			512	// sniper laser effect
+#define EF_FIBERCAMERA			1024	// fiber camera
 
 
 #define EF_NOREFLECT		(1<<24)	// Entity won't reflecting in mirrors
@@ -531,6 +534,7 @@
 #define TEFIRE_FLAG_LOOP	4 // if set, sprite plays at 15 fps, otherwise plays at whatever rate stretches the animation over the sprite's duration.
 #define TEFIRE_FLAG_ALPHA	8 // if set, sprite is rendered alpha blended at 50% else, opaque
 #define TEFIRE_FLAG_PLANAR	16 // if set, all fire sprites have same initial Z instead of randomly filling a cube. 
+#define TEFIRE_FLAG_ADDITIVE	32 // if set, sprite is rendered non-opaque with additive
 
 #define TE_PLAYERATTACHMENT		124	// attaches a TENT to a player (this is a high-priority tent)
 // byte (entity index of player)
@@ -621,8 +625,9 @@
 #define CHAN_BODY			4
 #define CHAN_STREAM			5	// allocate stream channel from the static or dynamic area
 #define CHAN_STATIC			6	// allocate channel from the static area 
-#define CHAN_NETWORKVOICE_BASE	7	// voice data coming across the network
+#define CHAN_NETWORKVOICE_BASE		7	// voice data coming across the network
 #define CHAN_NETWORKVOICE_END		500	// network voice data reserves slots (CHAN_NETWORKVOICE_BASE through CHAN_NETWORKVOICE_END).
+#define CHAN_BOT			501	// channel used for bot chatter.
 
 // attenuation values
 #define ATTN_NONE			0
@@ -724,11 +729,12 @@ enum
 	kRenderFxDeadPlayer,		// kRenderAmt is the player index
 	kRenderFxExplode,			// Scale up really big!
 	kRenderFxGlowShell,			// Glowing Shell
-	kRenderFxClampMinScale		// Keep this sprite from getting very small (SPRITES only!)
+	kRenderFxClampMinScale,		// Keep this sprite from getting very small (SPRITES only!)
+	kRenderFxLightMultiplier	//CTM !!!CZERO added to tell the studiorender that the value in iuser2 is a lightmultiplier
 };
 
 typedef unsigned int		func_t;
-typedef unsigned int		string_t;
+typedef int		string_t;
 
 typedef unsigned char	byte;
 typedef unsigned short	word;
diff --git a/common/cvardef.h b/common/cvardef.h
index f822cc7a..f461c329 100644
--- a/common/cvardef.h
+++ b/common/cvardef.h
@@ -12,6 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
+#pragma once
 #ifndef CVARDEF_H
 #define CVARDEF_H
 
@@ -24,14 +25,15 @@
 #define FCVAR_SPONLY	(1<<6)	// This cvar cannot be changed by clients connected to a multiplayer server.
 #define FCVAR_PRINTABLEONLY	(1<<7)	// This cvar's string cannot contain unprintable characters ( e.g., used for player name etc ).
 #define FCVAR_UNLOGGED	(1<<8)	// If this is a FCVAR_SERVER, don't log changes to the log file / console if we are creating a log
+#define FCVAR_NOEXTRAWHITEPACE (1<<9)  // strip trailing/leading white space from this cvar
 
 typedef struct cvar_s
 {
-	char		*name;
-	char		*string;
+	const char	*name;
+	const char	*string;
 	int		flags;
 	float		value;
 	struct cvar_s	*next;
 } cvar_t;
 
-#endif//CVARDEF_H
\ No newline at end of file
+#endif//CVARDEF_H
diff --git a/common/demo_api.h b/common/demo_api.h
index fa89bbef..1a678b60 100644
--- a/common/demo_api.h
+++ b/common/demo_api.h
@@ -12,7 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
-
+#pragma once
 #ifndef DEMO_API_H
 #define DEMO_API_H
 
@@ -24,4 +24,4 @@ typedef struct demo_api_s
 	void	(*WriteBuffer)( int size, unsigned char *buffer );
 } demo_api_t;
 
-#endif//DEMO_API_H
\ No newline at end of file
+#endif//DEMO_API_H
diff --git a/common/dlight.h b/common/dlight.h
index b139d582..ecb01445 100644
--- a/common/dlight.h
+++ b/common/dlight.h
@@ -12,7 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
-
+#pragma once
 #ifndef DLIGHT_H
 #define DLIGHT_H
 
@@ -28,4 +28,4 @@ typedef struct dlight_s
 	qboolean		dark;	// subtracts light instead of adding
 } dlight_t;
 
-#endif//DLIGHT_H
\ No newline at end of file
+#endif//DLIGHT_H
diff --git a/common/entity_state.h b/common/entity_state.h
index ef5448f1..2ffd70dc 100644
--- a/common/entity_state.h
+++ b/common/entity_state.h
@@ -12,6 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
+#pragma once
 #ifndef ENTITY_STATE_H
 #define ENTITY_STATE_H
 
@@ -183,4 +184,4 @@ typedef struct local_state_s
 	weapon_data_t	weapondata[64];
 } local_state_t;
 
-#endif//ENTITY_STATE_H
\ No newline at end of file
+#endif//ENTITY_STATE_H
diff --git a/common/entity_types.h b/common/entity_types.h
index 25a8fce9..f5754fea 100644
--- a/common/entity_types.h
+++ b/common/entity_types.h
@@ -12,7 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
-
+#pragma once
 #ifndef ENTITY_TYPES_H
 #define ENTITY_TYPES_H
 
@@ -22,4 +22,4 @@
 #define ET_BEAM		3
 #define ET_FRAGMENTED	4	// BMODEL or SPRITE that was split across BSP nodes
 
-#endif//ENTITY_TYPES_H
\ No newline at end of file
+#endif//ENTITY_TYPES_H
diff --git a/common/event_api.h b/common/event_api.h
index a7ff71b2..86c5fbe9 100644
--- a/common/event_api.h
+++ b/common/event_api.h
@@ -12,7 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
-
+#pragma once
 #ifndef EVENT_API_H
 #define EVENT_API_H
 
@@ -51,4 +51,4 @@ typedef struct event_api_s
 	struct msurface_s *( *EV_TraceSurface )( int ground, float *vstart, float *vend );
 } event_api_t;
 
-#endif//EVENT_API_H
\ No newline at end of file
+#endif//EVENT_API_H
diff --git a/common/event_args.h b/common/event_args.h
index d85906cc..4cf63741 100644
--- a/common/event_args.h
+++ b/common/event_args.h
@@ -12,6 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
+#pragma once
 #ifndef EVENT_ARGS_H
 #define EVENT_ARGS_H
 
@@ -44,4 +45,4 @@ typedef struct event_args_s
 	int		bparam2;
 } event_args_t;
 
-#endif//EVENT_ARGS_H
\ No newline at end of file
+#endif//EVENT_ARGS_H
diff --git a/common/event_flags.h b/common/event_flags.h
index 3c1d8fb3..a2d5f3b7 100644
--- a/common/event_flags.h
+++ b/common/event_flags.h
@@ -12,7 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
-
+#pragma once
 #ifndef EVENT_FLAGS_H
 #define EVENT_FLAGS_H
 
@@ -42,4 +42,4 @@
 // Only issue event client side ( from shared code )
 #define FEV_CLIENT		(1<<6)
 
-#endif//EVENT_FLAGS_H
\ No newline at end of file
+#endif//EVENT_FLAGS_H
diff --git a/common/gameinfo.h b/common/gameinfo.h
index 511b3718..ab5f649c 100644
--- a/common/gameinfo.h
+++ b/common/gameinfo.h
@@ -12,7 +12,7 @@ but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 */
-
+#pragma once
 #ifndef GAMEINFO_H
 #define GAMEINFO_H
 
@@ -46,4 +46,4 @@ typedef struct
 	int		gamemode;
 } GAMEINFO;
 
-#endif//GAMEINFO_H
\ No newline at end of file
+#endif//GAMEINFO_H
diff --git a/common/hltv.h b/common/hltv.h
index 79251910..e64dd30b 100644
--- a/common/hltv.h
+++ b/common/hltv.h
@@ -12,7 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
-
+#pragma once
 #ifndef HLTV_H
 #define HLTV_H
 
@@ -56,4 +56,4 @@
 #define MAX_DIRECTOR_CMD_PARAMETERS	4
 #define MAX_DIRECTOR_CMD_STRING	128
 
-#endif//HLTV_H
\ No newline at end of file
+#endif//HLTV_H
diff --git a/common/ivoicetweak.h b/common/ivoicetweak.h
index 541a63fa..96879beb 100644
--- a/common/ivoicetweak.h
+++ b/common/ivoicetweak.h
@@ -12,7 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
-
+#pragma once
 #ifndef IVOICETWEAK_H
 #define IVOICETWEAK_H
 
@@ -37,4 +37,4 @@ typedef struct IVoiceTweak_s
 	int	(*GetSpeakingVolume)( void );
 } IVoiceTweak;
 
-#endif//IVOICETWEAK_H
\ No newline at end of file
+#endif//IVOICETWEAK_H
diff --git a/common/lightstyle.h b/common/lightstyle.h
index 8b42edac..a12702f4 100644
--- a/common/lightstyle.h
+++ b/common/lightstyle.h
@@ -12,7 +12,7 @@ but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 */
-
+#pragma once
 #ifndef LIGHTSTYLE_H
 #define LIGHTSTYLE_H
 
@@ -26,4 +26,4 @@ typedef struct
 	float		time;		// local time is gurantee what new style begins from the start, not mid or end of the sequence
 } lightstyle_t;
 
-#endif//LIGHTSTYLE_H
\ No newline at end of file
+#endif//LIGHTSTYLE_H
diff --git a/common/mathlib.h b/common/mathlib.h
index fadb97fb..6bcf76eb 100644
--- a/common/mathlib.h
+++ b/common/mathlib.h
@@ -13,12 +13,19 @@
 *
 ****/
 // mathlib.h
-
+#pragma once
+#ifndef MATHLIB_H
+#define MATHLIB_H
 #include <math.h>
 
 typedef float vec_t;
 typedef vec_t vec2_t[2];
+
+#ifndef DID_VEC3_T_DEFINE
+#define DID_VEC3_T_DEFINE
 typedef vec_t vec3_t[3];
+#endif
+
 typedef vec_t vec4_t[4];	// x,y,z,w
 
 #ifndef M_PI
@@ -93,3 +100,4 @@ float	anglemod(float a);
 	)										\
 	:										\
 		BoxOnPlaneSide( (emins), (emaxs), (p)))
+#endif // MATHLIB_H
diff --git a/common/net_api.h b/common/net_api.h
index 00831394..da18fc30 100644
--- a/common/net_api.h
+++ b/common/net_api.h
@@ -12,7 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
-
+#pragma once
 #ifndef NET_API_H
 #define NET_API_H
 
@@ -94,4 +94,4 @@ typedef struct net_api_s
 	void		(*SetValueForKey)( char *s, const char *key, const char *value, int maxsize );
 } net_api_t;
 
-#endif//NET_APIH
\ No newline at end of file
+#endif // NET_APIH
diff --git a/common/netadr.h b/common/netadr.h
index dfeea8b0..0d70a22b 100644
--- a/common/netadr.h
+++ b/common/netadr.h
@@ -12,7 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
-
+#pragma once
 #ifndef NETADR_H
 #define NETADR_H
 
@@ -34,4 +34,4 @@ typedef struct netadr_s
 	unsigned short	port;
 } netadr_t;
 
-#endif//NETADR_H
\ No newline at end of file
+#endif//NETADR_H
diff --git a/common/particledef.h b/common/particledef.h
index 3f2ead66..15c95feb 100644
--- a/common/particledef.h
+++ b/common/particledef.h
@@ -12,7 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
-
+#pragma once
 #ifndef PARTICLEDEF_H
 #define PARTICLEDEF_H
 
@@ -51,4 +51,4 @@ typedef struct particle_s
 	unsigned char	context;
 } particle_t;
 
-#endif//PARTICLEDEF_H
\ No newline at end of file
+#endif//PARTICLEDEF_H
diff --git a/common/pmtrace.h b/common/pmtrace.h
index 6394de56..d5dd1453 100644
--- a/common/pmtrace.h
+++ b/common/pmtrace.h
@@ -12,7 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
-
+#pragma once
 #ifndef PM_TRACE_H
 #define PM_TRACE_H
 
@@ -38,4 +38,4 @@ struct pmtrace_s
 	int	hitgroup;
 };
 
-#endif//PM_TRACE_H
\ No newline at end of file
+#endif//PM_TRACE_H
diff --git a/common/qfont.h b/common/qfont.h
index 06408572..beb36ff9 100644
--- a/common/qfont.h
+++ b/common/qfont.h
@@ -12,7 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
-
+#pragma once
 #ifndef QFONT_H
 #define QFONT_H
 
@@ -35,4 +35,4 @@ typedef struct qfont_s
 	byte	data[4];
 } qfont_t;
 
-#endif//QFONT_H
\ No newline at end of file
+#endif//QFONT_H
diff --git a/common/r_efx.h b/common/r_efx.h
index fc27bef7..1a55aa0b 100644
--- a/common/r_efx.h
+++ b/common/r_efx.h
@@ -12,7 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
-
+#pragma once
 #ifndef R_EFX_H
 #define R_EFX_H
 
@@ -192,4 +192,4 @@ struct efx_api_s
 	void		(*R_FireCustomDecal)( int textureIndex, int entity, int modelIndex, float *position, int flags, float scale );
 };
 
-#endif//R_EFX_H
\ No newline at end of file
+#endif//R_EFX_H
diff --git a/common/r_studioint.h b/common/r_studioint.h
index 00384a16..b17e826f 100644
--- a/common/r_studioint.h
+++ b/common/r_studioint.h
@@ -12,8 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
-
-
+#pragma once
 #ifndef R_STUDIOINT_H
 #define R_STUDIOINT_H
 
@@ -151,4 +150,4 @@ typedef struct sv_blending_interface_s
 					const edict_t *pEdict );
 } sv_blending_interface_t;
 
-#endif//R_STUDIOINT_H
\ No newline at end of file
+#endif//R_STUDIOINT_H
diff --git a/common/ref_params.h b/common/ref_params.h
index 0458c4f4..61527eca 100644
--- a/common/ref_params.h
+++ b/common/ref_params.h
@@ -12,7 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
-
+#pragma once
 #ifndef REF_PARAMS_H
 #define REF_PARAMS_H
 
@@ -87,4 +87,4 @@ typedef struct ref_overview_s
 	float		flZoom;
 } ref_overview_t;
 
-#endif//REF_PARAMS_H
\ No newline at end of file
+#endif//REF_PARAMS_H
diff --git a/common/render_api.h b/common/render_api.h
index 7a9fcffe..03973f27 100644
--- a/common/render_api.h
+++ b/common/render_api.h
@@ -12,7 +12,7 @@ but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 */
-
+#pragma once
 #ifndef RENDER_API_H
 #define RENDER_API_H
 
@@ -258,4 +258,4 @@ typedef struct render_interface_s
 	void		(*Mod_ProcessUserData)( struct model_s *mod, qboolean create, const byte *buffer );
 } render_interface_t;
 
-#endif//RENDER_API_H
\ No newline at end of file
+#endif//RENDER_API_H
diff --git a/common/screenfade.h b/common/screenfade.h
index 730f729e..1611f914 100644
--- a/common/screenfade.h
+++ b/common/screenfade.h
@@ -12,7 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
-
+#pragma once
 #ifndef SCREENFADE_H
 #define SCREENFADE_H
 
@@ -26,4 +26,4 @@ typedef struct screenfade_s
 	int	fadeFlags;			// Fading flags
 } screenfade_t;
 
-#endif//SCREENFADE_H
\ No newline at end of file
+#endif//SCREENFADE_H
diff --git a/common/studio_event.h b/common/studio_event.h
index 29ea1f90..cf21e82a 100644
--- a/common/studio_event.h
+++ b/common/studio_event.h
@@ -12,7 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
-
+#pragma once
 #ifndef STUDIO_EVENT_H
 #define STUDIO_EVENT_H
 
@@ -24,4 +24,4 @@ typedef struct mstudioevent_s
 	char		options[64];
 } mstudioevent_t;
 
-#endif//STUDIO_EVENT_H
\ No newline at end of file
+#endif//STUDIO_EVENT_H
diff --git a/common/triangleapi.h b/common/triangleapi.h
index f2e9a309..49dc919f 100644
--- a/common/triangleapi.h
+++ b/common/triangleapi.h
@@ -12,7 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
-
+#pragma once
 #ifndef TRIANGLEAPI_H
 #define TRIANGLEAPI_H
 
diff --git a/common/usercmd.h b/common/usercmd.h
index 96e3c91b..538c60a6 100644
--- a/common/usercmd.h
+++ b/common/usercmd.h
@@ -12,7 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
-
+#pragma once
 #ifndef USERCMD_H
 #define USERCMD_H
 
@@ -36,4 +36,4 @@ typedef struct usercmd_s
 	vec3_t		impact_position;
 } usercmd_t;
 
-#endif//USERCMD_H
\ No newline at end of file
+#endif//USERCMD_H
diff --git a/common/wadfile.h b/common/wadfile.h
index 38a08032..84ffbb2d 100644
--- a/common/wadfile.h
+++ b/common/wadfile.h
@@ -12,7 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
-
+#pragma once
 #ifndef WADFILE_H
 #define WADFILE_H
 
@@ -76,4 +76,4 @@ typedef struct mip_s
 	unsigned int	offsets[4];	// four mip maps stored
 } mip_t;
 
-#endif//WADFILE_H
\ No newline at end of file
+#endif//WADFILE_H
diff --git a/common/weaponinfo.h b/common/weaponinfo.h
index ae78c645..b94857b6 100644
--- a/common/weaponinfo.h
+++ b/common/weaponinfo.h
@@ -12,7 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
-
+#pragma once
 #ifndef WEAPONINFO_H
 #define WEAPONINFO_H
 
@@ -47,4 +47,4 @@ typedef struct weapon_data_s
 	float		fuser4;
 } weapon_data_t;
 
-#endif//WEAPONINFO_H
\ No newline at end of file
+#endif//WEAPONINFO_H
diff --git a/common/wrect.h b/common/wrect.h
index 8dd2ba2f..51e84d88 100644
--- a/common/wrect.h
+++ b/common/wrect.h
@@ -12,7 +12,7 @@ but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 */
-
+#pragma once
 #ifndef WRECT_H
 #define WRECT_H
 
@@ -21,4 +21,4 @@ typedef struct wrect_s
 	int	left, right, top, bottom;
 } wrect_t;
 
-#endif//WRECT_H
\ No newline at end of file
+#endif//WRECT_H
diff --git a/debug.bat b/debug.bat
deleted file mode 100644
index eb702325..00000000
--- a/debug.bat
+++ /dev/null
@@ -1,42 +0,0 @@
-@echo off
-
-set MSDEV=BuildConsole
-set CONFIG=/ShowTime /ShowAgent /nologo /cfg=
-set MSDEV=msdev
-set CONFIG=/make 
-set build_type=debug
-set BUILD_ERROR=
-call vcvars32
-
-%MSDEV% engine/engine.dsp %CONFIG%"engine - Win32 Debug" %build_target%
-if errorlevel 1 set BUILD_ERROR=1
-
-%MSDEV% mainui/mainui.dsp %CONFIG%"mainui - Win32 Debug" %build_target%
-if errorlevel 1 set BUILD_ERROR=1
-
-if "%BUILD_ERROR%"=="" goto build_ok
-
-echo *********************
-echo *********************
-echo *** Build Errors! ***
-echo *********************
-echo *********************
-echo press any key to exit
-echo *********************
-pause>nul
-goto done
-
-
-@rem
-@rem Successful build
-@rem
-:build_ok
-
-rem //delete log files
-if exist engine\engine.plg del /f /q engine\engine.plg
-if exist mainui\mainui.plg del /f /q mainui\mainui.plg
-
-echo
-echo 	     Build succeeded!
-echo
-:done
\ No newline at end of file
diff --git a/dlls/Android.mk b/dlls/Android.mk
index a86a3423..67d0544e 100644
--- a/dlls/Android.mk
+++ b/dlls/Android.mk
@@ -16,7 +16,7 @@ endif
 LOCAL_CFLAGS += -D_LINUX -DCLIENT_WEAPONS -Dstricmp=strcasecmp -Dstrnicmp=strncasecmp -D_snprintf=snprintf \
 	-fno-exceptions -DNO_VOICEGAMEMGR -w
 
-LOCAL_CPPFLAGS := $(LOCAL_CFLAGS) -frtti
+LOCAL_CPPFLAGS := $(LOCAL_CFLAGS)
 
 LOCAL_C_INCLUDES := $(SDL_PATH)/include \
 		    $(LOCAL_PATH)/. \
@@ -91,11 +91,13 @@ LOCAL_SRC_FILES := agrunt.cpp airtank.cpp \
            multiplay_gamerules.cpp \
            nihilanth.cpp \
            nodes.cpp \
+	   observer.cpp \
            osprey.cpp \
            pathcorner.cpp \
            plane.cpp \
            plats.cpp \
            player.cpp \
+	   playermonster.cpp \
            python.cpp \
            rat.cpp \
            roach.cpp \
diff --git a/dlls/CMakeLists.txt b/dlls/CMakeLists.txt
index 700f4d46..dd87ce86 100644
--- a/dlls/CMakeLists.txt
+++ b/dlls/CMakeLists.txt
@@ -111,11 +111,13 @@ set(SVDLL_SOURCES
 	multiplay_gamerules.cpp
 	nihilanth.cpp
 	nodes.cpp
+	observer.cpp
 	osprey.cpp
 	pathcorner.cpp
 	plane.cpp
 	plats.cpp
 	player.cpp
+	playermonster.cpp
 	python.cpp
 	rat.cpp
 	roach.cpp
@@ -162,6 +164,17 @@ endif()
 
 add_library (${SVDLL_LIBRARY} SHARED ${SVDLL_SOURCES})
 
-set_target_properties (${SVDLL_SHARED} PROPERTIES
+set_target_properties (${SVDLL_LIBRARY} PROPERTIES
 	POSITION_INDEPENDENT_CODE 1)
 
+if(APPLE OR WIN32 OR ${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
+	set_target_properties(${SVDLL_LIBRARY} PROPERTIES
+		OUTPUT_NAME ${SERVER_LIBRARY_NAME}
+		PREFIX "")
+endif()
+
+install( TARGETS ${SVDLL_LIBRARY}
+	DESTINATION "${GAMEDIR}/${SERVER_INSTALL_DIR}/"
+	PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE
+	    GROUP_READ GROUP_EXECUTE
+		WORLD_READ WORLD_EXECUTE)
diff --git a/dlls/Makefile b/dlls/Makefile
index c75731d5..3599b9c7 100644
--- a/dlls/Makefile
+++ b/dlls/Makefile
@@ -129,11 +129,13 @@ OBJ = \
 	$(DLL_OBJDIR)/multiplay_gamerules.o \
 	$(DLL_OBJDIR)/nihilanth.o \
 	$(DLL_OBJDIR)/nodes.o \
+	$(DLL_OBJDIR)/observer.o \
 	$(DLL_OBJDIR)/osprey.o \
 	$(DLL_OBJDIR)/pathcorner.o \
 	$(DLL_OBJDIR)/plane.o \
 	$(DLL_OBJDIR)/plats.o \
 	$(DLL_OBJDIR)/player.o \
+	$(DLL_OBJDIR)/playermonster.o \
 	$(DLL_OBJDIR)/python.o \
 	$(DLL_OBJDIR)/rat.o \
 	$(DLL_OBJDIR)/roach.o \
diff --git a/dlls/activity.h b/dlls/activity.h
index 58b2d8cd..90d85a08 100644
--- a/dlls/activity.h
+++ b/dlls/activity.h
@@ -12,7 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
-
+#pragma once
 #ifndef	ACTIVITY_H
 #define	ACTIVITY_H
 
@@ -99,7 +99,7 @@ typedef enum {
 typedef struct
 {
 	int type;
-	char *name;
+	const char *name;
 } activity_map_t;
 
 extern activity_map_t activity_map[];
diff --git a/dlls/activitymap.h b/dlls/activitymap.h
index 92cadae7..b5f789f9 100644
--- a/dlls/activitymap.h
+++ b/dlls/activitymap.h
@@ -12,7 +12,9 @@
 *   without written permission from Valve LLC.
 *
 ****/
-
+#pragma once
+#ifndef ACTIVITYMAP_H
+#define ACTIVITYMAP_H
 #define _A( a ) { a, #a }
 
 activity_map_t activity_map[] =
@@ -93,5 +95,6 @@ _A(	ACT_FLINCH_LEFTARM ),
 _A(	ACT_FLINCH_RIGHTARM ),
 _A(	ACT_FLINCH_LEFTLEG ),
 _A(	ACT_FLINCH_RIGHTLEG ),
-0, NULL
+{ 0, NULL }
 };
+#endif // ACTIVITYMAP_H
diff --git a/dlls/aflock.cpp b/dlls/aflock.cpp
index 1e317632..d50a8165 100644
--- a/dlls/aflock.cpp
+++ b/dlls/aflock.cpp
@@ -567,7 +567,6 @@ void CFlockingFlyer::FlockLeaderThink( void )
 	TraceResult tr;
 	Vector vecDist;// used for general measurements
 	Vector vecDir;// used for general measurements
-	int cProcessed = 0;// keep track of how many other boids we've processed 
 	float flLeftSide;
 	float flRightSide;
 
@@ -840,11 +839,11 @@ void CFlockingFlyer::SquadRemove( CFlockingFlyer *pRemove )
 		{
 			CFlockingFlyer *pLeader = m_pSquadNext;
 
-			// copy the enemy LKP to the new leader
-			pLeader->m_vecEnemyLKP = m_vecEnemyLKP;
-
 			if( pLeader )
 			{
+				// copy the enemy LKP to the new leader
+				pLeader->m_vecEnemyLKP = m_vecEnemyLKP;
+
 				CFlockingFlyer *pList = pLeader;
 
 				while( pList )
diff --git a/dlls/agrunt.cpp b/dlls/agrunt.cpp
index 592ce649..220e6a9b 100644
--- a/dlls/agrunt.cpp
+++ b/dlls/agrunt.cpp
@@ -566,30 +566,30 @@ void CAGrunt::Spawn()
 //=========================================================
 void CAGrunt::Precache()
 {
-	int i;
+	size_t i;
 
 	PRECACHE_MODEL( "models/agrunt.mdl" );
 
 	for( i = 0; i < ARRAYSIZE( pAttackHitSounds ); i++ )
-		PRECACHE_SOUND( (char *)pAttackHitSounds[i] );
+		PRECACHE_SOUND( pAttackHitSounds[i] );
 
 	for( i = 0; i < ARRAYSIZE( pAttackMissSounds ); i++ )
-		PRECACHE_SOUND( (char *)pAttackMissSounds[i] );
+		PRECACHE_SOUND( pAttackMissSounds[i] );
 
 	for( i = 0; i < ARRAYSIZE( pIdleSounds ); i++ )
-		PRECACHE_SOUND( (char *)pIdleSounds[i] );
+		PRECACHE_SOUND( pIdleSounds[i] );
 
 	for( i = 0; i < ARRAYSIZE( pDieSounds ); i++ )
-		PRECACHE_SOUND( (char *)pDieSounds[i] );
+		PRECACHE_SOUND( pDieSounds[i] );
 
 	for( i = 0; i < ARRAYSIZE( pPainSounds ); i++ )
-		PRECACHE_SOUND( (char *)pPainSounds[i] );
+		PRECACHE_SOUND( pPainSounds[i] );
 
 	for( i = 0; i < ARRAYSIZE( pAttackSounds ); i++ )
-		PRECACHE_SOUND( (char *)pAttackSounds[i] );
+		PRECACHE_SOUND( pAttackSounds[i] );
 
 	for( i = 0; i < ARRAYSIZE( pAlertSounds ); i++ )
-		PRECACHE_SOUND( (char *)pAlertSounds[i] );
+		PRECACHE_SOUND( pAlertSounds[i] );
 
 	PRECACHE_SOUND( "hassault/hw_shoot1.wav" );
 
@@ -873,7 +873,7 @@ BOOL CAGrunt::FCanCheckAttacks( void )
 //=========================================================
 BOOL CAGrunt::CheckMeleeAttack1( float flDot, float flDist )
 {
-	if( HasConditions( bits_COND_SEE_ENEMY ) && flDist <= AGRUNT_MELEE_DIST && flDot >= 0.6 && m_hEnemy != NULL )
+	if( HasConditions( bits_COND_SEE_ENEMY ) && flDist <= AGRUNT_MELEE_DIST && flDot >= 0.6 && m_hEnemy != 0 )
 	{
 		return TRUE;
 	}
@@ -1097,7 +1097,7 @@ Schedule_t *CAGrunt::GetScheduleOfType( int Type )
 	case SCHED_FAIL:
 		// no fail schedule specified, so pick a good generic one.
 		{
-			if( m_hEnemy != NULL )
+			if( m_hEnemy != 0 )
 			{
 				// I have an enemy
 				// !!!LATER - what if this enemy is really far away and i'm chasing him?
diff --git a/dlls/animation.cpp b/dlls/animation.cpp
index 86cb78ae..f84ec380 100644
--- a/dlls/animation.cpp
+++ b/dlls/animation.cpp
@@ -208,7 +208,7 @@ void SequencePrecache( void *pmodel, const char *pSequenceName )
 					ALERT( at_error, "Bad sound event %d in sequence %s :: %s (sound is \"%s\")\n", pevent[i].event, pstudiohdr->name, pSequenceName, pevent[i].options );
 				}
 
-				PRECACHE_SOUND( (char *)( gpGlobals->pStringBase + ALLOC_STRING( pevent[i].options ) ) );
+				PRECACHE_SOUND( gpGlobals->pStringBase + ALLOC_STRING( pevent[i].options ) );
 			}
 		}
 	}
@@ -268,8 +268,6 @@ int GetAnimationEvent( void *pmodel, entvars_t *pev, MonsterEvent_t *pMonsterEve
 	if( !pstudiohdr || pev->sequence >= pstudiohdr->numseq || !pMonsterEvent )
 		return 0;
 
-	int events = 0;
-
 	mstudioseqdesc_t *pseqdesc;
 	mstudioevent_t *pevent;
 
@@ -351,7 +349,7 @@ float SetController( void *pmodel, entvars_t *pev, int iController, float flValu
 		}
 	}
 
-	int setting = 255 * ( flValue - pbonecontroller->start ) / ( pbonecontroller->end - pbonecontroller->start );
+	int setting = (int)( 255 * ( flValue - pbonecontroller->start ) / ( pbonecontroller->end - pbonecontroller->start ) );
 
 	if( setting < 0 )
 		setting = 0;
@@ -393,7 +391,7 @@ float SetBlending( void *pmodel, entvars_t *pev, int iBlender, float flValue )
 		}
 	}
 
-	int setting = 255 * ( flValue - pseqdesc->blendstart[iBlender] ) / ( pseqdesc->blendend[iBlender] - pseqdesc->blendstart[iBlender] );
+	int setting = (int)( 255 * ( flValue - pseqdesc->blendstart[iBlender] ) / ( pseqdesc->blendend[iBlender] - pseqdesc->blendstart[iBlender] ) );
 
 	if( setting < 0 )
 		setting = 0;
diff --git a/dlls/animation.h b/dlls/animation.h
index 384c1e98..6def910c 100644
--- a/dlls/animation.h
+++ b/dlls/animation.h
@@ -12,6 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
+#pragma once
 #ifndef ANIMATION_H
 #define ANIMATION_H
 
diff --git a/dlls/apache.cpp b/dlls/apache.cpp
index 538d56ea..488f7a76 100644
--- a/dlls/apache.cpp
+++ b/dlls/apache.cpp
@@ -406,7 +406,7 @@ void CApache::HuntThink( void )
 	if( m_flGoalSpeed < 800 )
 		m_flGoalSpeed += 5;
 
-	if( m_hEnemy != NULL )
+	if( m_hEnemy != 0 )
 	{
 		// ALERT( at_console, "%s\n", STRING( m_hEnemy->pev->classname ) );
 		if( FVisible( m_hEnemy ) )
@@ -500,7 +500,7 @@ void CApache::HuntThink( void )
 	{
 		if( m_flLastSeen + 60 > gpGlobals->time )
 		{
-			if( m_hEnemy != NULL )
+			if( m_hEnemy != 0 )
 			{
 				// make sure it's a good shot
 				if( DotProduct( m_vecTarget, vecEst ) > .965 )
@@ -680,7 +680,6 @@ void CApache::Flight( void )
 void CApache::FireRocket( void )
 {
 	static float side = 1.0;
-	static int count;
 
 	if( m_iRockets <= 0 )
 		return;
@@ -753,13 +752,13 @@ BOOL CApache::FireGun()
 		angles.x = angles.x + 360;
 
 	if( angles.x > m_angGun.x )
-		m_angGun.x = min( angles.x, m_angGun.x + 12 );
+		m_angGun.x = Q_min( angles.x, m_angGun.x + 12 );
 	if( angles.x < m_angGun.x )
-		m_angGun.x = max( angles.x, m_angGun.x - 12 );
+		m_angGun.x = Q_max( angles.x, m_angGun.x - 12 );
 	if( angles.y > m_angGun.y )
-		m_angGun.y = min( angles.y, m_angGun.y + 12 );
+		m_angGun.y = Q_min( angles.y, m_angGun.y + 12 );
 	if( angles.y < m_angGun.y )
-		m_angGun.y = max( angles.y, m_angGun.y - 12 );
+		m_angGun.y = Q_max( angles.y, m_angGun.y - 12 );
 
 	m_angGun.y = SetBoneController( 0, m_angGun.y );
 	m_angGun.x = SetBoneController( 1, m_angGun.x );
diff --git a/dlls/barnacle.cpp b/dlls/barnacle.cpp
index 1e2aa785..ecc1f5d4 100644
--- a/dlls/barnacle.cpp
+++ b/dlls/barnacle.cpp
@@ -170,7 +170,7 @@ void CBarnacle::BarnacleThink( void )
 #endif
 	pev->nextthink = gpGlobals->time + 0.1;
 
-	if( m_hEnemy != NULL )
+	if( m_hEnemy != 0 )
 	{
 		// barnacle has prey.
 		if( !m_hEnemy->IsAlive() )
@@ -183,7 +183,7 @@ void CBarnacle::BarnacleThink( void )
 
 		if( m_fLiftingPrey )
 		{
-			if( m_hEnemy != NULL && m_hEnemy->pev->deadflag != DEAD_NO )
+			if( m_hEnemy != 0 && m_hEnemy->pev->deadflag != DEAD_NO )
 			{
 				// crap, someone killed the prey on the way up.
 				m_hEnemy = NULL;
@@ -352,7 +352,7 @@ void CBarnacle::Killed( entvars_t *pevAttacker, int iGib )
 	pev->solid = SOLID_NOT;
 	pev->takedamage = DAMAGE_NO;
 
-	if( m_hEnemy != NULL )
+	if( m_hEnemy != 0 )
 	{
 		pVictim = m_hEnemy->MyMonsterPointer();
 
diff --git a/dlls/barney.cpp b/dlls/barney.cpp
index 1d0d95b1..8002059c 100644
--- a/dlls/barney.cpp
+++ b/dlls/barney.cpp
@@ -193,7 +193,7 @@ void CBarney::RunTask( Task_t *pTask )
 	switch( pTask->iTask )
 	{
 	case TASK_RANGE_ATTACK1:
-		if( m_hEnemy != NULL && ( m_hEnemy->IsPlayer() ) )
+		if( m_hEnemy != 0 && ( m_hEnemy->IsPlayer() ) )
 		{
 			pev->framerate = 1.5;
 		}
@@ -237,7 +237,7 @@ int CBarney::Classify( void )
 //=========================================================
 void CBarney::AlertSound( void )
 {
-	if( m_hEnemy != NULL )
+	if( m_hEnemy != 0 )
 	{
 		if( FOkToSpeak() )
 		{
@@ -553,7 +553,7 @@ int CBarney::TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float
 
 		// This is a heurstic to determine if the player intended to harm me
 		// If I have an enemy, we can't establish intent (may just be crossfire)
-		if( m_hEnemy == NULL )
+		if( m_hEnemy == 0 )
 		{
 			// If the player was facing directly at me, or I'm already suspicious, get mad
 			if( ( m_afMemory & bits_MEMORY_SUSPICIOUS ) || IsFacing( pevAttacker, pev->origin ) )
@@ -665,7 +665,7 @@ void CBarney::Killed( entvars_t *pevAttacker, int iGib )
 
 		GetAttachment( 0, vecGunPos, vecGunAngles );
 
-		CBaseEntity *pGun = DropItem( "weapon_9mmhandgun", vecGunPos, vecGunAngles );
+		DropItem( "weapon_9mmhandgun", vecGunPos, vecGunAngles );
 	}
 
 	SetUse( NULL );	
@@ -682,7 +682,7 @@ Schedule_t *CBarney::GetScheduleOfType( int Type )
 	switch( Type )
 	{
 	case SCHED_ARM_WEAPON:
-		if( m_hEnemy != NULL )
+		if( m_hEnemy != 0 )
 		{
 			// face enemy, then draw.
 			return slBarneyEnemyDraw;
@@ -770,7 +770,7 @@ Schedule_t *CBarney::GetSchedule( void )
 			return GetScheduleOfType( SCHED_SMALL_FLINCH );
 		}
 
-		if( m_hEnemy == NULL && IsFollowing() )
+		if( m_hEnemy == 0 && IsFollowing() )
 		{
 			if( !m_hTargetEnt->IsAlive() )
 			{
@@ -880,10 +880,10 @@ public:
 	void KeyValue( KeyValueData *pkvd );
 
 	int m_iPose;// which sequence to display	-- temporary, don't need to save
-	static char *m_szPoses[3];
+	static const char *m_szPoses[3];
 };
 
-char *CDeadBarney::m_szPoses[] = { "lying_on_back", "lying_on_side", "lying_on_stomach" };
+const char *CDeadBarney::m_szPoses[] = { "lying_on_back", "lying_on_side", "lying_on_stomach" };
 
 void CDeadBarney::KeyValue( KeyValueData *pkvd )
 {
diff --git a/dlls/basemonster.h b/dlls/basemonster.h
index ad05fccf..2234aaf9 100644
--- a/dlls/basemonster.h
+++ b/dlls/basemonster.h
@@ -12,7 +12,7 @@
 *   use or distribution of this code by or to any unlicensed person is illegal.
 *
 ****/
-
+#pragma once
 #ifndef BASEMONSTER_H
 #define BASEMONSTER_H
 
@@ -195,7 +195,7 @@ public:
 	Task_t *GetTask( void );
 	virtual MONSTERSTATE GetIdealState( void );
 	virtual void SetActivity( Activity NewActivity );
-	void SetSequenceByName( char *szSequence );
+	void SetSequenceByName( const char *szSequence );
 	void SetState( MONSTERSTATE State );
 	virtual void ReportAIState( void );
 
@@ -327,6 +327,6 @@ public:
 	BOOL ExitScriptedSequence();
 	BOOL CineCleanup();
 
-	CBaseEntity* DropItem ( char *pszItemName, const Vector &vecPos, const Vector &vecAng );// drop an item.
+	CBaseEntity* DropItem( const char *pszItemName, const Vector &vecPos, const Vector &vecAng );// drop an item.
 };
 #endif // BASEMONSTER_H
diff --git a/dlls/bigmomma.cpp b/dlls/bigmomma.cpp
index 59f6cae2..434d6134 100644
--- a/dlls/bigmomma.cpp
+++ b/dlls/bigmomma.cpp
@@ -49,7 +49,7 @@ public:
 	virtual int Restore( CRestore &restore );
 	static TYPEDESCRIPTION m_SaveData[];
 
-	int m_preSequence;
+	string_t m_preSequence;
 };
 
 LINK_ENTITY_TO_CLASS( info_bigmomma, CInfoBM )
@@ -411,7 +411,7 @@ void CBigMomma::SetYawSpeed( void )
 {
 	int ys;
 
-	switch ( m_Activity )
+	switch( m_Activity )
 	{
 	case ACT_IDLE:
 		ys = 100;
@@ -677,7 +677,7 @@ void CBigMomma::Precache()
 
 void CBigMomma::Activate( void )
 {
-	if( m_hTargetEnt == NULL )
+	if( m_hTargetEnt == 0 )
 		Remember( bits_MEMORY_ADVANCE_NODE );	// Start 'er up
 }
 
@@ -985,7 +985,7 @@ void CBigMomma::RunTask( Task_t *pTask )
 		{
 			float distance;
 
-			if( m_hTargetEnt == NULL )
+			if( m_hTargetEnt == 0 )
 				TaskFail();
 			else
 			{
@@ -1002,7 +1002,7 @@ void CBigMomma::RunTask( Task_t *pTask )
 		}
 		break;
 	case TASK_WAIT_NODE:
-		if( m_hTargetEnt != NULL && ( m_hTargetEnt->pev->spawnflags & SF_INFOBM_WAIT ) )
+		if( m_hTargetEnt != 0 && ( m_hTargetEnt->pev->spawnflags & SF_INFOBM_WAIT ) )
 			return;
 
 		if( gpGlobals->time > m_flWaitFinished )
@@ -1056,7 +1056,6 @@ Vector VecCheckSplatToss( entvars_t *pev, const Vector &vecSpot1, Vector vecSpot
 	float time = speed / flGravity;
 	vecGrenadeVel = vecSpot2 - vecSpot1;
 	vecGrenadeVel.z = 0;
-	float distance = vecGrenadeVel.Length();
 	
 	// Travel half the distance to the target in that time (apex is at the midpoint)
 	vecGrenadeVel = vecGrenadeVel * ( 0.5 / time );
diff --git a/dlls/bmodels.cpp b/dlls/bmodels.cpp
index ee676679..fe56b6ac 100644
--- a/dlls/bmodels.cpp
+++ b/dlls/bmodels.cpp
@@ -210,7 +210,7 @@ void CFuncIllusionary::KeyValue( KeyValueData *pkvd )
 {
 	if( FStrEq( pkvd->szKeyName, "skin" ) )//skin is used for content type
 	{
-		pev->skin = atof( pkvd->szValue );
+		pev->skin = atoi( pkvd->szValue );
 		pkvd->fHandled = TRUE;
 	}
 	else
@@ -402,7 +402,7 @@ void CFuncRotating::Spawn()
 	}
 
 	UTIL_SetOrigin( pev, pev->origin );
-	SET_MODEL( ENT(pev), STRING(pev->model) );
+	SET_MODEL( ENT( pev ), STRING( pev->model ) );
 
 	SetUse( &CFuncRotating::RotatingUse );
 	// did level designer forget to assign speed?
@@ -430,15 +430,13 @@ void CFuncRotating::Spawn()
 
 void CFuncRotating::Precache( void )
 {
-	char* szSoundFile = (char*)STRING( pev->message );
+	const char* szSoundFile = STRING( pev->message );
+	BOOL NullSound = FALSE;
 
 	// set up fan sounds
 	if( !FStringNull( pev->message ) && strlen( szSoundFile ) > 0 )
 	{
 		// if a path is set for a wave, use it
-		PRECACHE_SOUND( szSoundFile );
-
-		pev->noiseRunning = ALLOC_STRING( szSoundFile );
 	}
 	else
 	{
@@ -446,42 +444,32 @@ void CFuncRotating::Precache( void )
 		switch( m_sounds )
 		{
 		case 1:
-			PRECACHE_SOUND( "fans/fan1.wav" );
-			pev->noiseRunning = ALLOC_STRING( "fans/fan1.wav" );
+			szSoundFile = "fans/fan1.wav";
 			break;
 		case 2:
-			PRECACHE_SOUND( "fans/fan2.wav" );
-			pev->noiseRunning = ALLOC_STRING( "fans/fan2.wav" );
+			szSoundFile = "fans/fan2.wav";
 			break;
 		case 3:
-			PRECACHE_SOUND( "fans/fan3.wav" );
-			pev->noiseRunning = ALLOC_STRING( "fans/fan3.wav" );
+			szSoundFile = "fans/fan3.wav";
 			break;
 		case 4:
-			PRECACHE_SOUND( "fans/fan4.wav" );
-			pev->noiseRunning = ALLOC_STRING( "fans/fan4.wav" );
+			szSoundFile = "fans/fan4.wav";
 			break;
 		case 5:
-			PRECACHE_SOUND( "fans/fan5.wav" );
-			pev->noiseRunning = ALLOC_STRING( "fans/fan5.wav" );
+			szSoundFile = "fans/fan5.wav";
 			break;
 		case 0:
 		default:
-			if( !FStringNull( pev->message ) && strlen( szSoundFile ) > 0 )
-			{
-				PRECACHE_SOUND( szSoundFile );
-
-				pev->noiseRunning = ALLOC_STRING( szSoundFile );
-				break;
-			}
-			else
-			{
-				pev->noiseRunning = ALLOC_STRING( "common/null.wav" );
-				break;
-			}
+			szSoundFile = "common/null.wav";
+			NullSound = TRUE;
+			break;
 		}
 	}
 
+	if( !NullSound )
+		PRECACHE_SOUND( szSoundFile );
+	pev->noiseRunning = MAKE_STRING( szSoundFile );
+
 	if( pev->avelocity != g_vecZero )
 	{
 		// if fan was spinning, and we went through transition or save/restore,
@@ -550,7 +538,7 @@ void CFuncRotating::RampPitchVol( int fUp )
 		pitch = PITCH_NORM - 1;
 
 	// change the fan's vol and pitch
-	EMIT_SOUND_DYN( ENT( pev ), CHAN_STATIC, (char *)STRING( pev->noiseRunning ), 
+	EMIT_SOUND_DYN( ENT( pev ), CHAN_STATIC, STRING( pev->noiseRunning ), 
 		fvol, m_flAttenuation, SND_CHANGE_PITCH | SND_CHANGE_VOL, pitch );
 }
 
@@ -572,7 +560,7 @@ void CFuncRotating::SpinUp( void )
 		fabs( vecAVel.z ) >= fabs( pev->movedir.z * pev->speed ) )
 	{
 		pev->avelocity = pev->movedir * pev->speed;// set speed in case we overshot
-		EMIT_SOUND_DYN( ENT( pev ), CHAN_STATIC, (char *)STRING( pev->noiseRunning ), 
+		EMIT_SOUND_DYN( ENT( pev ), CHAN_STATIC, STRING( pev->noiseRunning ), 
 			m_flVolume, m_flAttenuation, SND_CHANGE_PITCH | SND_CHANGE_VOL, FANPITCHMAX );
 
 		SetThink( &CFuncRotating::Rotate );
@@ -613,8 +601,8 @@ void CFuncRotating::SpinDown( void )
 		pev->avelocity = g_vecZero;// set speed in case we overshot
 
 		// stop sound, we're done
-		EMIT_SOUND_DYN( ENT( pev ), CHAN_STATIC, (char *)STRING( pev->noiseRunning /* Stop */ ),
-				0, 0, SND_STOP, m_pitch );
+		EMIT_SOUND_DYN( ENT( pev ), CHAN_STATIC, STRING( pev->noiseRunning /* Stop */ ),
+				0, 0, SND_STOP, (int)m_pitch );
 
 		SetThink( &CFuncRotating::Rotate );
 		Rotate();
@@ -642,7 +630,7 @@ void CFuncRotating::RotatingUse( CBaseEntity *pActivator, CBaseEntity *pCaller,
 		if( pev->avelocity != g_vecZero )
 		{
 			SetThink( &CFuncRotating::SpinDown );
-			//EMIT_SOUND_DYN( ENT( pev ), CHAN_WEAPON, (char *)STRING( pev->noiseStop ),
+			//EMIT_SOUND_DYN( ENT( pev ), CHAN_WEAPON, STRING( pev->noiseStop ),
 			//	m_flVolume, m_flAttenuation, 0, m_pitch );
 
 			pev->nextthink = pev->ltime + 0.1;
@@ -650,7 +638,7 @@ void CFuncRotating::RotatingUse( CBaseEntity *pActivator, CBaseEntity *pCaller,
 		else// fan is not moving, so start it
 		{
 			SetThink( &CFuncRotating::SpinUp );
-			EMIT_SOUND_DYN( ENT( pev ), CHAN_STATIC, (char *)STRING( pev->noiseRunning ),
+			EMIT_SOUND_DYN( ENT( pev ), CHAN_STATIC, STRING( pev->noiseRunning ),
 				0.01, m_flAttenuation, 0, FANPITCHMIN );
 
 			pev->nextthink = pev->ltime + 0.1;
@@ -663,7 +651,7 @@ void CFuncRotating::RotatingUse( CBaseEntity *pActivator, CBaseEntity *pCaller,
 			// play stopping sound here
 			SetThink( &CFuncRotating::SpinDown );
 
-			// EMIT_SOUND_DYN( ENT( pev ), CHAN_WEAPON, (char *)STRING( pev->noiseStop ),
+			// EMIT_SOUND_DYN( ENT( pev ), CHAN_WEAPON, STRING( pev->noiseStop ),
 			//	m_flVolume, m_flAttenuation, 0, m_pitch );
 
 			pev->nextthink = pev->ltime + 0.1;
@@ -671,7 +659,7 @@ void CFuncRotating::RotatingUse( CBaseEntity *pActivator, CBaseEntity *pCaller,
 		}
 		else
 		{
-			EMIT_SOUND_DYN( ENT( pev ), CHAN_STATIC, (char *)STRING( pev->noiseRunning ),
+			EMIT_SOUND_DYN( ENT( pev ), CHAN_STATIC, STRING( pev->noiseRunning ),
 				m_flVolume, m_flAttenuation, 0, FANPITCHMAX );
 			pev->avelocity = pev->movedir * pev->speed;
 
diff --git a/dlls/bullsquid.cpp b/dlls/bullsquid.cpp
index 924f1be5..9b4c0c68 100644
--- a/dlls/bullsquid.cpp
+++ b/dlls/bullsquid.cpp
@@ -169,7 +169,7 @@ int CBullsquid::IgnoreConditions( void )
 		iIgnore = bits_COND_SMELL | bits_COND_SMELL_FOOD;
 	}
 
-	if( m_hEnemy != NULL )
+	if( m_hEnemy != 0 )
 	{
 		if( FClassnameIs( m_hEnemy->pev, "monster_headcrab" ) )
 		{
@@ -208,7 +208,7 @@ int CBullsquid::TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, flo
 
 	// if the squid is running, has an enemy, was hurt by the enemy, hasn't been hurt in the last 3 seconds, and isn't too close to the enemy,
 	// it will swerve. (whew).
-	if( m_hEnemy != NULL && IsMoving() && pevAttacker == m_hEnemy->pev && gpGlobals->time - m_flLastHurtTime > 3 )
+	if( m_hEnemy != 0 && IsMoving() && pevAttacker == m_hEnemy->pev && gpGlobals->time - m_flLastHurtTime > 3 )
 	{
 		flDist = ( pev->origin - m_hEnemy->pev->origin ).Length2D();
 
@@ -245,7 +245,7 @@ BOOL CBullsquid::CheckRangeAttack1( float flDot, float flDist )
 
 	if( flDist > 64 && flDist <= 784 && flDot >= 0.5 && gpGlobals->time >= m_flNextSpitTime )
 	{
-		if( m_hEnemy != NULL )
+		if( m_hEnemy != 0 )
 		{
 			if( fabs( pev->origin.z - m_hEnemy->pev->origin.z ) > 256 )
 			{
@@ -304,7 +304,7 @@ BOOL CBullsquid::CheckMeleeAttack2( float flDot, float flDist )
 //=========================================================
 BOOL CBullsquid::FValidateHintType( short sHint )
 {
-	int i;
+	size_t i;
 
 	static short sSquidHints[] =
 	{
@@ -705,7 +705,7 @@ void CBullsquid::RunAI( void )
 		pev->skin = 1;
 	}
 
-	if( m_hEnemy != NULL && m_Activity == ACT_RUN )
+	if( m_hEnemy != 0 && m_Activity == ACT_RUN )
 	{
 		// chasing enemy. Sprint for last bit
 		if( ( pev->origin - m_hEnemy->pev->origin).Length2D() < SQUID_SPRINT_DIST )
@@ -1168,7 +1168,7 @@ MONSTERSTATE CBullsquid::GetIdealState( void )
 		COMBAT goes to ALERT upon death of enemy
 		*/
 		{
-			if( m_hEnemy != NULL && ( iConditions & bits_COND_LIGHT_DAMAGE || iConditions & bits_COND_HEAVY_DAMAGE ) && FClassnameIs( m_hEnemy->pev, "monster_headcrab" ) )
+			if( m_hEnemy != 0 && ( iConditions & bits_COND_LIGHT_DAMAGE || iConditions & bits_COND_HEAVY_DAMAGE ) && FClassnameIs( m_hEnemy->pev, "monster_headcrab" ) )
 			{
 				// if the squid has a headcrab enemy and something hurts it, it's going to forget about the crab for a while.
 				m_hEnemy = NULL;
diff --git a/dlls/buttons.cpp b/dlls/buttons.cpp
index 7b050add..90bc42e5 100644
--- a/dlls/buttons.cpp
+++ b/dlls/buttons.cpp
@@ -275,7 +275,7 @@ IMPLEMENT_SAVERESTORE( CBaseButton, CBaseToggle )
 
 void CBaseButton::Precache( void )
 {
-	char *pszSound;
+	const char *pszSound;
 
 	if( FBitSet( pev->spawnflags, SF_BUTTON_SPARK_IF_OFF ) )// this button should spark in OFF state
 	{
@@ -292,14 +292,14 @@ void CBaseButton::Precache( void )
 	{
 		pszSound = ButtonSound( (int)m_bLockedSound );
 		PRECACHE_SOUND( pszSound );
-		m_ls.sLockedSound = ALLOC_STRING( pszSound );
+		m_ls.sLockedSound = MAKE_STRING( pszSound );
 	}
 
 	if( m_bUnlockedSound )
 	{
 		pszSound = ButtonSound( (int)m_bUnlockedSound );
 		PRECACHE_SOUND( pszSound );
-		m_ls.sUnlockedSound = ALLOC_STRING( pszSound );
+		m_ls.sUnlockedSound = MAKE_STRING( pszSound );
 	}
 
 	// get sentence group names, for doors which are directly 'touched' to open
@@ -343,25 +343,25 @@ void CBaseButton::Precache( void )
 			m_ls.sUnlockedSentence = MAKE_STRING( "EA" );
 			break;
 		case 2: // security door
-			m_ls.sUnlockedSentence = MAKE_STRING("ED");
+			m_ls.sUnlockedSentence = MAKE_STRING( "ED" );
 			break;
 		case 3: // blast door
-			m_ls.sUnlockedSentence = MAKE_STRING("EF");
+			m_ls.sUnlockedSentence = MAKE_STRING( "EF" );
 			break;
 		case 4: // fire door
-			m_ls.sUnlockedSentence = MAKE_STRING("EFIRE");
+			m_ls.sUnlockedSentence = MAKE_STRING( "EFIRE" );
 			break;
 		case 5: // chemical door
-			m_ls.sUnlockedSentence = MAKE_STRING("ECHEM");
+			m_ls.sUnlockedSentence = MAKE_STRING( "ECHEM" );
 			break;
 		case 6: // radiation door
-			m_ls.sUnlockedSentence = MAKE_STRING("ERAD");
+			m_ls.sUnlockedSentence = MAKE_STRING( "ERAD" );
 			break;
 		case 7: // gen containment
-			m_ls.sUnlockedSentence = MAKE_STRING("ECON");
+			m_ls.sUnlockedSentence = MAKE_STRING( "ECON" );
 			break;
 		case 8: // maintenance door
-			m_ls.sUnlockedSentence = MAKE_STRING("EH");
+			m_ls.sUnlockedSentence = MAKE_STRING( "EH" );
 			break;
 		default:
 			m_ls.sUnlockedSentence = 0;
@@ -381,22 +381,22 @@ void CBaseButton::KeyValue( KeyValueData *pkvd )
 	}	
 	else if( FStrEq( pkvd->szKeyName, "locked_sound" ) )
 	{
-		m_bLockedSound = atof( pkvd->szValue );
+		m_bLockedSound = atoi( pkvd->szValue );
 		pkvd->fHandled = TRUE;
 	}
 	else if( FStrEq( pkvd->szKeyName, "locked_sentence" ) )
 	{
-		m_bLockedSentence = atof( pkvd->szValue );
+		m_bLockedSentence = atoi( pkvd->szValue );
 		pkvd->fHandled = TRUE;
 	}
 	else if( FStrEq( pkvd->szKeyName, "unlocked_sound" ) )
 	{
-		m_bUnlockedSound = atof( pkvd->szValue );
+		m_bUnlockedSound = atoi( pkvd->szValue );
 		pkvd->fHandled = TRUE;
 	}
 	else if( FStrEq( pkvd->szKeyName, "unlocked_sentence" ) )
 	{
-		m_bUnlockedSentence = atof( pkvd->szValue );
+		m_bUnlockedSentence = atoi( pkvd->szValue );
 		pkvd->fHandled = TRUE;
 	}
 	else if( FStrEq( pkvd->szKeyName, "sounds" ) )
@@ -421,12 +421,12 @@ int CBaseButton::TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, fl
 	SetTouch( NULL );
 
 	m_hActivator = CBaseEntity::Instance( pevAttacker );
-	if( m_hActivator == NULL )
+	if( m_hActivator == 0 )
 		return 0;
 
 	if( code == BUTTON_RETURN )
 	{
-		EMIT_SOUND( ENT( pev ), CHAN_VOICE, (char*)STRING( pev->noise ), 1, ATTN_NORM );
+		EMIT_SOUND( ENT( pev ), CHAN_VOICE, STRING( pev->noise ), 1, ATTN_NORM );
 
 		// Toggle buttons fire when they get back to their "home" position
 		if( !( pev->spawnflags & SF_BUTTON_TOGGLE ) )
@@ -461,7 +461,7 @@ LINK_ENTITY_TO_CLASS( func_button, CBaseButton )
 
 void CBaseButton::Spawn()
 { 
-	char  *pszSound;
+	const char *pszSound;
 
 	//----------------------------------------------------
 	//determine sounds for buttons
@@ -469,7 +469,7 @@ void CBaseButton::Spawn()
 	//----------------------------------------------------
 	pszSound = ButtonSound( m_sounds );
 	PRECACHE_SOUND( pszSound );
-	pev->noise = ALLOC_STRING( pszSound );
+	pev->noise = MAKE_STRING( pszSound );
 
 	Precache();
 
@@ -525,9 +525,9 @@ void CBaseButton::Spawn()
 // Button sound table. 
 // Also used by CBaseDoor to get 'touched' door lock/unlock sounds
 
-char *ButtonSound( int sound )
+const char *ButtonSound( int sound )
 { 
-	char *pszSound;
+	const char *pszSound;
 
 	switch( sound )
 	{
@@ -657,7 +657,7 @@ void CBaseButton::ButtonUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_
 	{
 		if( !m_fStayPushed && FBitSet( pev->spawnflags, SF_BUTTON_TOGGLE ) )
 		{
-			EMIT_SOUND( ENT( pev ), CHAN_VOICE, (char*)STRING( pev->noise ), 1, ATTN_NORM );
+			EMIT_SOUND( ENT( pev ), CHAN_VOICE, STRING( pev->noise ), 1, ATTN_NORM );
 
 			//SUB_UseTargets( m_eoActivator );
 			ButtonReturn();
@@ -716,7 +716,7 @@ void CBaseButton::ButtonTouch( CBaseEntity *pOther )
 
 	if( code == BUTTON_RETURN )
 	{
-		EMIT_SOUND( ENT( pev ), CHAN_VOICE, (char*)STRING( pev->noise ), 1, ATTN_NORM );
+		EMIT_SOUND( ENT( pev ), CHAN_VOICE, STRING( pev->noise ), 1, ATTN_NORM );
 		SUB_UseTargets( m_hActivator, USE_TOGGLE, 0 );
 		ButtonReturn();
 	}
@@ -729,7 +729,7 @@ void CBaseButton::ButtonTouch( CBaseEntity *pOther )
 //
 void CBaseButton::ButtonActivate()
 {
-	EMIT_SOUND( ENT( pev ), CHAN_VOICE, (char*)STRING( pev->noise ), 1, ATTN_NORM );
+	EMIT_SOUND( ENT( pev ), CHAN_VOICE, STRING( pev->noise ), 1, ATTN_NORM );
 
 	if( !UTIL_IsMasterTriggered( m_sMaster, m_hActivator ) )
 	{
@@ -815,7 +815,7 @@ void CBaseButton::ButtonBackHome( void )
 
 	if( FBitSet( pev->spawnflags, SF_BUTTON_TOGGLE ) )
 	{
-		//EMIT_SOUND( ENT( pev ), CHAN_VOICE, (char*)STRING( pev->noise ), 1, ATTN_NORM );
+		//EMIT_SOUND( ENT( pev ), CHAN_VOICE, STRING( pev->noise ), 1, ATTN_NORM );
 		
 		SUB_UseTargets( m_hActivator, USE_TOGGLE, 0 );
 	}
@@ -869,14 +869,14 @@ LINK_ENTITY_TO_CLASS( func_rot_button, CRotButton )
 
 void CRotButton::Spawn( void )
 {
-	char *pszSound;
+	const char *pszSound;
 	//----------------------------------------------------
 	//determine sounds for buttons
 	//a sound of 0 should not make a sound
 	//----------------------------------------------------
 	pszSound = ButtonSound( m_sounds );
 	PRECACHE_SOUND( pszSound );
-	pev->noise = ALLOC_STRING( pszSound );
+	pev->noise = MAKE_STRING( pszSound );
 
 	// set the axis of rotation
 	CBaseToggle::AxisDir( pev );
@@ -1010,9 +1010,9 @@ void CMomentaryRotButton::Spawn( void )
 	UTIL_SetOrigin( pev, pev->origin );
 	SET_MODEL( ENT( pev ), STRING( pev->model ) );
 
-	char *pszSound = ButtonSound( m_sounds );
+	const char *pszSound = ButtonSound( m_sounds );
 	PRECACHE_SOUND( pszSound );
-	pev->noise = ALLOC_STRING( pszSound );
+	pev->noise = MAKE_STRING( pszSound );
 	m_lastUsed = 0;
 }
 
@@ -1034,7 +1034,7 @@ void CMomentaryRotButton::KeyValue( KeyValueData *pkvd )
 
 void CMomentaryRotButton::PlaySound( void )
 {
-	EMIT_SOUND( ENT( pev ), CHAN_VOICE, (char*)STRING( pev->noise ), 1, ATTN_NORM );
+	EMIT_SOUND( ENT( pev ), CHAN_VOICE, STRING( pev->noise ), 1, ATTN_NORM );
 }
 
 // BUGBUG: This design causes a latentcy.  When the button is retriggered, the first impulse
@@ -1045,7 +1045,11 @@ void CMomentaryRotButton::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, US
 	pev->ideal_yaw = CBaseToggle::AxisDelta( pev->spawnflags, pev->angles, m_start ) / m_flMoveDistance;
 
 	UpdateAllButtons( pev->ideal_yaw, 1 );
-	UpdateTarget( pev->ideal_yaw );
+
+	// Calculate destination angle and use it to predict value, this prevents sending target in wrong direction on retriggering
+	Vector dest = pev->angles + pev->avelocity * ( pev->nextthink - pev->ltime );
+	float value1 = CBaseToggle::AxisDelta( pev->spawnflags, dest, m_start ) / m_flMoveDistance;
+	UpdateTarget( value1 );
 }
 
 void CMomentaryRotButton::UpdateAllButtons( float value, int start )
diff --git a/dlls/cbase.cpp b/dlls/cbase.cpp
index 62b4eaa1..8750bddf 100644
--- a/dlls/cbase.cpp
+++ b/dlls/cbase.cpp
@@ -26,7 +26,7 @@ void EntvarsKeyvalue( entvars_t *pev, KeyValueData *pkvd );
 
 extern "C" void PM_Move ( struct playermove_s *ppmove, int server );
 extern "C" void PM_Init ( struct playermove_s *ppmove  );
-extern "C" char PM_FindTextureType( char *name );
+extern "C" char PM_FindTextureType( const char *name );
 
 extern Vector VecBModelOrigin( entvars_t* pevBModel );
 extern DLL_GLOBAL Vector g_vecAttackDir;
@@ -441,9 +441,16 @@ edict_t *EHANDLE::Get( void )
 
 edict_t *EHANDLE::Set( edict_t *pent )
 {
-	m_pent = pent;  
-	if( pent ) 
-		m_serialnumber = m_pent->serialnumber; 
+	if( pent )
+	{
+		m_pent = pent;
+		m_serialnumber = m_pent->serialnumber;
+	}
+	else
+	{
+		m_pent = NULL;
+		m_serialnumber = 0;
+	}
 	return pent; 
 }
 
@@ -511,7 +518,7 @@ int CBaseEntity::TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, fl
 	// (that is, no actual entity projectile was involved in the attack so use the shooter's origin). 
 	if( pevAttacker == pevInflictor )	
 	{
-		vecTemp = pevInflictor->origin - VecBModelOrigin( pev );
+		vecTemp = pevAttacker->origin - VecBModelOrigin( pev );
 	}
 	else
 	// an actual missile was involved.
@@ -598,7 +605,7 @@ int CBaseEntity::Restore( CRestore &restore )
 		mins = pev->mins;	// Set model is about to destroy these
 		maxs = pev->maxs;
 
-		PRECACHE_MODEL( (char *)STRING( pev->model ) );
+		PRECACHE_MODEL( STRING( pev->model ) );
 		SET_MODEL( ENT( pev ), STRING( pev->model ) );
 		UTIL_SetSize( pev, mins, maxs );	// Reset them
 	}
@@ -739,7 +746,7 @@ int CBaseEntity::DamageDecal( int bitsDamageType )
 
 // NOTE: szName must be a pointer to constant memory, e.g. "monster_class" because the entity
 // will keep a pointer to it after this call.
-CBaseEntity *CBaseEntity::Create( char *szName, const Vector &vecOrigin, const Vector &vecAngles, edict_t *pentOwner )
+CBaseEntity *CBaseEntity::Create( const char *szName, const Vector &vecOrigin, const Vector &vecAngles, edict_t *pentOwner )
 {
 	edict_t	*pent;
 	CBaseEntity *pEntity;
diff --git a/dlls/cbase.h b/dlls/cbase.h
index bb78b5fd..07f4ba8b 100644
--- a/dlls/cbase.h
+++ b/dlls/cbase.h
@@ -12,6 +12,9 @@
 *   without written permission from Valve LLC.
 *
 ****/
+#pragma once
+#ifndef CBASE_H
+#define CBASE_H
 /*
 
 Class Hierachy
@@ -178,7 +181,7 @@ public:
 	virtual void AddPointsToTeam( int score, BOOL bAllowNegativeScore ) {}
 	virtual BOOL AddPlayerItem( CBasePlayerItem *pItem ) { return 0; }
 	virtual BOOL RemovePlayerItem( CBasePlayerItem *pItem ) { return 0; }
-	virtual int GiveAmmo( int iAmount, char *szName, int iMax ) { return -1; };
+	virtual int GiveAmmo( int iAmount, const char *szName, int iMax ) { return -1; };
 	virtual float GetDelay( void ) { return 0; }
 	virtual int IsMoving( void ) { return pev->velocity != g_vecZero; }
 	virtual void OverrideReset( void ) {}
@@ -230,7 +233,7 @@ public:
 	};
 #endif
 
-	void UpdateOnRemove( void );
+	virtual void UpdateOnRemove( void );
 
 	// common member functions
 	void EXPORT SUB_Remove( void );
@@ -281,8 +284,8 @@ public:
 #ifdef _DEBUG
 	void FunctionCheck( void *pFunction, char *name ) 
 	{ 
-		if( pFunction && !NAME_FOR_FUNCTION( (unsigned long)( pFunction ) ) )
-			ALERT( at_error, "No EXPORT: %s:%s (%08lx)\n", STRING( pev->classname ), name, (unsigned long)pFunction );
+		if( pFunction && !NAME_FOR_FUNCTION( (size_t)( pFunction ) ) )
+			ALERT( at_error, "No EXPORT: %s:%s (%08lx)\n", STRING( pev->classname ), name, (size_t)pFunction );
 	}
 
 	BASEPTR	ThinkSet( BASEPTR func, char *name ) 
@@ -315,7 +318,7 @@ public:
 	// used by monsters that are created by the MonsterMaker
 	virtual	void UpdateOwner( void ) { return; };
 
-	static CBaseEntity *Create( char *szName, const Vector &vecOrigin, const Vector &vecAngles, edict_t *pentOwner = NULL );
+	static CBaseEntity *Create( const char *szName, const Vector &vecOrigin, const Vector &vecAngles, edict_t *pentOwner = NULL );
 
 	virtual BOOL FBecomeProne( void ) {return FALSE;};
 	edict_t *edict() { return ENT( pev ); };
@@ -441,7 +444,7 @@ class CBaseDelay : public CBaseEntity
 {
 public:
 	float m_flDelay;
-	int m_iszKillTarget;
+	string_t m_iszKillTarget;
 
 	virtual void KeyValue( KeyValueData *pkvd );
 	virtual int Save( CSave &save );
@@ -660,8 +663,7 @@ class CSound;
 
 #include "basemonster.h"
 
-
-char *ButtonSound( int sound );				// get string of button sound number
+const char *ButtonSound( int sound );				// get string of button sound number
 
 //
 // Generic Button
@@ -786,3 +788,4 @@ public:
 	void Precache( void );
 	void KeyValue( KeyValueData *pkvd );
 };
+#endif
diff --git a/dlls/cdll_dll.h b/dlls/cdll_dll.h
index c960a6ac..0aafafbd 100644
--- a/dlls/cdll_dll.h
+++ b/dlls/cdll_dll.h
@@ -16,7 +16,7 @@
 //  cdll_dll.h
 
 // this file is included by both the game-dll and the client-dll,
-
+#pragma once
 #ifndef CDLL_DLL_H
 #define CDLL_DLL_H
 
diff --git a/dlls/client.cpp b/dlls/client.cpp
index 69555704..6ebe5681 100644
--- a/dlls/client.cpp
+++ b/dlls/client.cpp
@@ -38,6 +38,7 @@
 #include "weaponinfo.h"
 #include "usercmd.h"
 #include "netadr.h"
+#include "pm_shared.h"
 
 extern DLL_GLOBAL ULONG		g_ulModelIndexPlayer;
 extern DLL_GLOBAL BOOL		g_fGameOver;
@@ -47,9 +48,15 @@ extern DLL_GLOBAL ULONG		g_ulFrameCount;
 extern void CopyToBodyQue( entvars_t* pev );
 extern int giPrecacheGrunt;
 extern int gmsgSayText;
+extern int gmsgBhopcap;
+
+extern cvar_t allow_spectators;
 
 extern int g_teamplay;
 
+extern cvar_t bhopcap;
+extern "C" int g_bhopcap;
+
 void LinkUserMessages( void );
 
 /*
@@ -107,19 +114,18 @@ void ClientDisconnect( edict_t *pEntity )
 		WRITE_STRING( text );
 	MESSAGE_END();
 
-	CSound *pSound;
-	pSound = CSoundEnt::SoundPointerForIndex( CSoundEnt::ClientSoundIndex( pEntity ) );
+	CSound *pSound = CSoundEnt::SoundPointerForIndex( CSoundEnt::ClientSoundIndex( pEntity ) );
+
+	// since this client isn't around to think anymore, reset their sound. 
+	if( pSound )
 	{
-		// since this client isn't around to think anymore, reset their sound. 
-		if( pSound )
-		{
-			pSound->Reset();
-		}
+		pSound->Reset();
 	}
 
 	// since the edict doesn't get deleted, fix it so it doesn't interfere.
 	pEntity->v.takedamage = DAMAGE_NO;// don't attract autoaim
 	pEntity->v.solid = SOLID_NOT;// nonsolid
+	pEntity->v.effects = 0;// clear any effects
 	UTIL_SetOrigin( &pEntity->v, pEntity->v.origin );
 
 	g_pGameRules->ClientDisconnected( pEntity );
@@ -204,6 +210,97 @@ void ClientPutInServer( edict_t *pEntity )
 #include "voice_gamemgr.h"
 extern CVoiceGameMgr g_VoiceGameMgr;
 #endif
+
+//-----------------------------------------------------------------------------
+// Purpose: determine if a uchar32 represents a valid Unicode code point
+//-----------------------------------------------------------------------------
+bool Q_IsValidUChar32( unsigned int uVal )
+{
+	// Values > 0x10FFFF are explicitly invalid; ditto for UTF-16 surrogate halves,
+	// values ending in FFFE or FFFF, or values in the 0x00FDD0-0x00FDEF reserved range
+	return ( ( uVal - 0x0u ) < 0x110000u ) && ( (uVal - 0x00D800u) > 0x7FFu ) && ( (uVal & 0xFFFFu) < 0xFFFEu ) && ( ( uVal - 0x00FDD0u ) > 0x1Fu );
+}
+
+// Decode one character from a UTF-8 encoded string. Treats 6-byte CESU-8 sequences
+// as a single character, as if they were a correctly-encoded 4-byte UTF-8 sequence.
+int Q_UTF8ToUChar32( const char *pUTF8_, unsigned int &uValueOut, bool &bErrorOut )
+{
+	const unsigned char *pUTF8 = (const unsigned char*)pUTF8_;
+
+	int nBytes = 1;
+	unsigned int uValue = pUTF8[0];
+	unsigned int uMinValue = 0;
+
+	// 0....... single byte
+	if( uValue < 0x80 )
+		goto decodeFinishedNoCheck;
+
+	// Expecting at least a two-byte sequence with 0xC0 <= first <= 0xF7 (110...... and 11110...)
+	if( ( uValue - 0xC0u ) > 0x37u || ( pUTF8[1] & 0xC0 ) != 0x80 )
+		goto decodeError;
+
+	uValue = ( uValue << 6 ) - ( 0xC0 << 6 ) + pUTF8[1] - 0x80;
+	nBytes = 2;
+	uMinValue = 0x80;
+
+	// 110..... two-byte lead byte
+	if( !( uValue & ( 0x20 << 6 ) ) )
+		goto decodeFinished;
+
+	// Expecting at least a three-byte sequence
+	if( ( pUTF8[2] & 0xC0 ) != 0x80 )
+		goto decodeError;
+
+	uValue = ( uValue << 6 ) - ( 0x20 << 12 ) + pUTF8[2] - 0x80;
+	nBytes = 3;
+	uMinValue = 0x800;
+
+	// 1110.... three-byte lead byte
+decodeFinished:
+	if( uValue >= uMinValue && Q_IsValidUChar32( uValue ) )
+	{
+decodeFinishedNoCheck:
+		uValueOut = uValue;
+		bErrorOut = false;
+		return nBytes;
+	}
+decodeError:
+	uValueOut = '?';
+	bErrorOut = true;
+	return nBytes;
+
+decodeFinishedMaybeCESU8:
+	// Do we have a full UTF-16 surrogate pair that's been UTF-8 encoded afterwards?
+	// That is, do we have 0xD800-0xDBFF followed by 0xDC00-0xDFFF? If so, decode it all.
+	if( ( uValue - 0xD800u ) < 0x400u && pUTF8[3] == 0xED && (unsigned char)( pUTF8[4] - 0xB0 ) < 0x10 && ( pUTF8[5] & 0xC0 ) == 0x80 )
+	{
+		uValue = 0x10000 + ( ( uValue - 0xD800u ) << 10 ) + ( (unsigned char)( pUTF8[4] - 0xB0 ) << 6 ) + pUTF8[5] - 0x80;
+		nBytes = 6;
+		uMinValue = 0x10000;
+	}
+	goto decodeFinished;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Returns true if UTF-8 string contains invalid sequences.
+//-----------------------------------------------------------------------------
+bool Q_UnicodeValidate( const char *pUTF8 )
+{
+	bool bError = false;
+	while( *pUTF8 )
+	{
+		unsigned int uVal;
+		// Our UTF-8 decoder silently fixes up 6-byte CESU-8 (improperly re-encoded UTF-16) sequences.
+		// However, these are technically not valid UTF-8. So if we eat 6 bytes at once, it's an error.
+		int nCharSize = Q_UTF8ToUChar32( pUTF8, uVal, bError );
+		if( bError || nCharSize == 6 )
+			return false;
+		pUTF8 += nCharSize;
+	}
+	return true;
+}
+
+
 //// HOST_SAY
 // String comes in as
 // say blah blah blah
@@ -259,26 +356,19 @@ void Host_Say( edict_t *pEntity, int teamonly )
 	}
 
 	// remove quotes if present
-	if( *p == '"' )
+	if( p && *p == '"' )
 	{
 		p++;
 		p[strlen( p ) - 1] = 0;
 	}
 
-	// make sure the text has content
-	for( pc = p; pc != NULL && *pc != 0; pc++ )
-	{
-		if( !isspace( *pc ) )
-		{
-			pc = NULL;	// we've found an alphanumeric character,  so text is valid
-			break;
-		}
-	}
-	if( pc != NULL )
+	if( !p || !p[0] || !Q_UnicodeValidate ( p ) )
 		return;  // no character found, so say nothing
 
 	// turn on color set 2  (color on,  no sound)
-	if( teamonly )
+	if( player->IsObserver() && ( teamonly ) )
+		sprintf( text, "%c(SPEC) %s: ", 2, STRING( pEntity->v.netname ) );
+	else if( teamonly )
 		sprintf( text, "%c(TEAM) %s: ", 2, STRING( pEntity->v.netname ) );
 	else
 		sprintf( text, "%c%s: ", 2, STRING( pEntity->v.netname ) );
@@ -313,9 +403,14 @@ void Host_Say( edict_t *pEntity, int teamonly )
 		if( g_VoiceGameMgr.PlayerHasBlockedPlayer( client, player ) )
 			continue;
 #endif
-		if( teamonly && g_pGameRules->PlayerRelationship( client, CBaseEntity::Instance( pEntity ) ) != GR_TEAMMATE )
+		if( !player->IsObserver() && teamonly && g_pGameRules->PlayerRelationship( client, CBaseEntity::Instance( pEntity ) ) != GR_TEAMMATE )
 			continue;
 
+		// Spectators can only talk to other specs
+		if( player->IsObserver() && teamonly )
+			if ( !client->IsObserver() )
+				continue;
+
 		MESSAGE_BEGIN( MSG_ONE, gmsgSayText, NULL, client->pev );
 			WRITE_BYTE( ENTINDEX( pEntity ) );
 			WRITE_STRING( text );
@@ -331,7 +426,7 @@ void Host_Say( edict_t *pEntity, int teamonly )
 	// echo to server console
 	g_engfuncs.pfnServerPrint( text );
 
-	char *temp;
+	const char *temp;
 	if( teamonly )
 		temp = "say_team";
 	else
@@ -459,12 +554,50 @@ void ClientCommand( edict_t *pEntity )
 	{
 		GetClassPtr( (CBasePlayer *)pev )->SelectLastItem();
 	}
-	else if( FStrEq( pcmd, "spectate" ) && ( pev->flags & FL_PROXY ) )	// added for proxy support
+	else if( FStrEq( pcmd, "spectate" ) ) // clients wants to become a spectator
 	{
-		CBasePlayer * pPlayer = GetClassPtr( (CBasePlayer *)pev );
+		CBasePlayer *pPlayer = GetClassPtr( (CBasePlayer *)pev );
+		if( !pPlayer->IsObserver() )
+		{
+			// always allow proxies to become a spectator
+			if( ( pev->flags & FL_PROXY ) || allow_spectators.value )
+			{
+				edict_t *pentSpawnSpot = g_pGameRules->GetPlayerSpawnSpot( pPlayer );
+				pPlayer->StartObserver( pev->origin, VARS( pentSpawnSpot )->angles );
 
-		edict_t *pentSpawnSpot = g_pGameRules->GetPlayerSpawnSpot( pPlayer );
-		pPlayer->StartObserver( pev->origin, VARS( pentSpawnSpot )->angles );
+				// notify other clients of player switching to spectator mode
+				UTIL_ClientPrintAll( HUD_PRINTNOTIFY, UTIL_VarArgs( "%s switched to spectator mode\n",
+						( pev->netname && ( STRING( pev->netname ) )[0] != 0 ) ? STRING( pev->netname ) : "unconnected" ) );
+			}
+			else
+				ClientPrint( pev, HUD_PRINTCONSOLE, "Spectator mode is disabled.\n" );
+		}
+		else
+		{
+			pPlayer->StopObserver();
+
+			// notify other clients of player left spectators
+			UTIL_ClientPrintAll( HUD_PRINTNOTIFY, UTIL_VarArgs( "%s has left spectator mode\n",
+					( pev->netname && ( STRING( pev->netname ) )[0] != 0 ) ? STRING( pev->netname ) : "unconnected" ) );
+		}
+	}
+	else if( FStrEq( pcmd, "specmode" ) ) // new spectator mode
+	{
+		CBasePlayer *pPlayer = GetClassPtr( (CBasePlayer *)pev );
+
+		if( pPlayer->IsObserver() )
+			pPlayer->Observer_SetMode( atoi( CMD_ARGV( 1 ) ) );
+	}
+	else if( FStrEq( pcmd, "closemenus" ) )
+	{
+		// just ignore it
+	}
+	else if( FStrEq( pcmd, "follownext" ) )	// follow next player
+	{
+		CBasePlayer *pPlayer = GetClassPtr( (CBasePlayer *)pev );
+
+		if( pPlayer->IsObserver() )
+			pPlayer->Observer_FindNextPlayer( atoi( CMD_ARGV( 1 ) ) ? true : false );
 	}
 	else if( g_pGameRules->ClientCommand( GetClassPtr( (CBasePlayer *)pev ), pcmd ) )
 	{
@@ -506,7 +639,7 @@ void ClientUserInfoChanged( edict_t *pEntity, char *infobuffer )
 		return;
 
 	// msg everyone if someone changes their name,  and it isn't the first time (changing no name to current name)
-	if( pEntity->v.netname && STRING( pEntity->v.netname )[0] != 0 && !FStrEq( STRING( pEntity->v.netname ), g_engfuncs.pfnInfoKeyValue( infobuffer, "name" ) ) )
+	if( pEntity->v.netname && ( STRING( pEntity->v.netname ) )[0] != 0 && !FStrEq( STRING( pEntity->v.netname ), g_engfuncs.pfnInfoKeyValue( infobuffer, "name" ) ) )
 	{
 		char sName[256];
 		char *pName = g_engfuncs.pfnInfoKeyValue( infobuffer, "name" );
@@ -524,12 +657,15 @@ void ClientUserInfoChanged( edict_t *pEntity, char *infobuffer )
 		// Set the name
 		g_engfuncs.pfnSetClientKeyValue( ENTINDEX( pEntity ), infobuffer, "name", sName );
 
-		char text[256];
-		snprintf( text, 256, "* %s changed name to %s\n", STRING( pEntity->v.netname ), g_engfuncs.pfnInfoKeyValue( infobuffer, "name" ) );
-		MESSAGE_BEGIN( MSG_ALL, gmsgSayText, NULL );
-			WRITE_BYTE( ENTINDEX( pEntity ) );
-			WRITE_STRING( text );
-		MESSAGE_END();
+		if( gpGlobals->maxClients > 1 )
+		{
+			char text[256];
+			snprintf( text, 256, "* %s changed name to %s\n", STRING( pEntity->v.netname ), g_engfuncs.pfnInfoKeyValue( infobuffer, "name" ) );
+			MESSAGE_BEGIN( MSG_ALL, gmsgSayText, NULL );
+				WRITE_BYTE( ENTINDEX( pEntity ) );
+				WRITE_STRING( text );
+			MESSAGE_END();
+		}
 
 		// team match?
 		if( g_teamplay )
@@ -621,7 +757,6 @@ void PlayerPreThink( edict_t *pEntity )
 {
 	//ALERT( at_console, "PreThink( %g, frametime %g )\n", gpGlobals->time, gpGlobals->frametime );
 
-	entvars_t *pev = &pEntity->v;
 	CBasePlayer *pPlayer = (CBasePlayer *)GET_PRIVATE( pEntity );
 
 	if( pPlayer )
@@ -639,7 +774,6 @@ void PlayerPostThink( edict_t *pEntity )
 {
 	//ALERT( at_console, "PostThink( %g, frametime %g )\n", gpGlobals->time, gpGlobals->frametime );
 
-	entvars_t *pev = &pEntity->v;
 	CBasePlayer *pPlayer = (CBasePlayer *)GET_PRIVATE( pEntity );
 
 	if( pPlayer )
@@ -674,8 +808,16 @@ void StartFrame( void )
 
 	gpGlobals->teamplay = teamplay.value;
 	g_ulFrameCount++;
-}
 
+	int oldBhopcap = g_bhopcap;
+	g_bhopcap = ( g_pGameRules->IsMultiplayer() && bhopcap.value != 0.0f ) ? 1 : 0;
+	if( g_bhopcap != oldBhopcap )
+	{
+		MESSAGE_BEGIN( MSG_ALL, gmsgBhopcap, NULL );
+			WRITE_BYTE( g_bhopcap );
+		MESSAGE_END();
+	}
+}
 
 void ClientPrecache( void )
 {
@@ -831,7 +973,6 @@ animation right now.
 */
 void PlayerCustomization( edict_t *pEntity, customization_t *pCust )
 {
-	entvars_t *pev = &pEntity->v;
 	CBasePlayer *pPlayer = (CBasePlayer *)GET_PRIVATE( pEntity );
 
 	if( !pPlayer )
@@ -871,7 +1012,6 @@ A spectator has joined the game
 */
 void SpectatorConnect( edict_t *pEntity )
 {
-	entvars_t *pev = &pEntity->v;
 	CBaseSpectator *pPlayer = (CBaseSpectator *)GET_PRIVATE( pEntity );
 
 	if( pPlayer )
@@ -887,7 +1027,6 @@ A spectator has left the game
 */
 void SpectatorDisconnect( edict_t *pEntity )
 {
-	entvars_t *pev = &pEntity->v;
 	CBaseSpectator *pPlayer = (CBaseSpectator *)GET_PRIVATE( pEntity );
 
 	if( pPlayer )
@@ -903,7 +1042,6 @@ A spectator has sent a usercmd
 */
 void SpectatorThink( edict_t *pEntity )
 {
-	entvars_t *pev = &pEntity->v;
 	CBaseSpectator *pPlayer = (CBaseSpectator *)GET_PRIVATE( pEntity );
 
 	if( pPlayer )
@@ -987,7 +1125,7 @@ int AddToFullPack( struct entity_state_s *state, int e, edict_t *ent, edict_t *h
 	int i;
 
 	// don't send if flagged for NODRAW and it's not the host getting the message
-	if( ( ent->v.effects == EF_NODRAW ) && ( ent != host ) )
+	if( ( ent->v.effects & EF_NODRAW ) && ( ent != host ) )
 		return 0;
 
 	// Ignore ents without valid / visible models
@@ -1116,11 +1254,11 @@ int AddToFullPack( struct entity_state_s *state, int e, edict_t *ent, edict_t *h
 	}
 
 	state->rendermode	= ent->v.rendermode;
-	state->renderamt	= ent->v.renderamt; 
+	state->renderamt	= (int)ent->v.renderamt; 
 	state->renderfx		= ent->v.renderfx;
-	state->rendercolor.r	= ent->v.rendercolor.x;
-	state->rendercolor.g	= ent->v.rendercolor.y;
-	state->rendercolor.b	= ent->v.rendercolor.z;
+	state->rendercolor.r	= (byte)ent->v.rendercolor.x;
+	state->rendercolor.g	= (byte)ent->v.rendercolor.y;
+	state->rendercolor.b	= (byte)ent->v.rendercolor.z;
 
 	state->aiment = 0;
 	if( ent->v.aiment )
@@ -1167,7 +1305,7 @@ int AddToFullPack( struct entity_state_s *state, int e, edict_t *ent, edict_t *h
 		//state->team		= ent->v.team;
 
 		state->usehull		= ( ent->v.flags & FL_DUCKING ) ? 1 : 0;
-		state->health		= ent->v.health;
+		state->health		= (int)ent->v.health;
 	}
 
 	return 1;
@@ -1522,12 +1660,12 @@ int GetWeaponData( struct edict_s *player, struct weapon_data_s *info )
 						item->m_iId			= II.iId;
 						item->m_iClip			= gun->m_iClip;
 
-						item->m_flTimeWeaponIdle	= max( gun->m_flTimeWeaponIdle, -0.001 );
-						item->m_flNextPrimaryAttack	= max( gun->m_flNextPrimaryAttack, -0.001 );
-						item->m_flNextSecondaryAttack	= max( gun->m_flNextSecondaryAttack, -0.001 );
+						item->m_flTimeWeaponIdle	= Q_max( gun->m_flTimeWeaponIdle, -0.001 );
+						item->m_flNextPrimaryAttack	= Q_max( gun->m_flNextPrimaryAttack, -0.001 );
+						item->m_flNextSecondaryAttack	= Q_max( gun->m_flNextSecondaryAttack, -0.001 );
 						item->m_fInReload		= gun->m_fInReload;
 						item->m_fInSpecialReload	= gun->m_fInSpecialReload;
-						item->fuser1			= max( gun->pev->fuser1, -0.001 );
+						item->fuser1			= Q_max( gun->pev->fuser1, -0.001 );
 						item->fuser2			= gun->m_flStartThrow;
 						item->fuser3			= gun->m_flReleaseThrow;
 						item->iuser1			= gun->m_chargeReady;
@@ -1557,41 +1695,67 @@ engine sets cd to 0 before calling.
 */
 void UpdateClientData( const struct edict_s *ent, int sendweapons, struct clientdata_s *cd )
 {
-	cd->flags		= ent->v.flags;
-	cd->health		= ent->v.health;
+	if( !ent || !ent->pvPrivateData )
+		return;
+	entvars_t *pev = (entvars_t *)&ent->v;
+	CBasePlayer *pl = (CBasePlayer *)( CBasePlayer::Instance( pev ) );
+	entvars_t *pevOrg = NULL;
 
-	cd->viewmodel		= MODEL_INDEX( STRING( ent->v.viewmodel ) );
+	// if user is spectating different player in First person, override some vars
+	if( pl && pl->pev->iuser1 == OBS_IN_EYE )
+	{
+		if( pl->m_hObserverTarget )
+		{
+			pevOrg = pev;
+			pev = pl->m_hObserverTarget->pev;
+			pl = (CBasePlayer *)(CBasePlayer::Instance( pev ) );
+		}
+	}
 
-	cd->waterlevel		= ent->v.waterlevel;
-	cd->watertype		= ent->v.watertype;
-	cd->weapons		= ent->v.weapons;
+	cd->flags		= pev->flags;
+	cd->health		= pev->health;
+
+	cd->viewmodel		= MODEL_INDEX( STRING( pev->viewmodel ) );
+
+	cd->waterlevel		= pev->waterlevel;
+	cd->watertype		= pev->watertype;
+	cd->weapons		= pev->weapons;
 
 	// Vectors
-	cd->origin		= ent->v.origin;
-	cd->velocity		= ent->v.velocity;
-	cd->view_ofs		= ent->v.view_ofs;
-	cd->punchangle		= ent->v.punchangle;
+	cd->origin		= pev->origin;
+	cd->velocity		= pev->velocity;
+	cd->view_ofs		= pev->view_ofs;
+	cd->punchangle		= pev->punchangle;
 
-	cd->bInDuck		= ent->v.bInDuck;
-	cd->flTimeStepSound	= ent->v.flTimeStepSound;
-	cd->flDuckTime		= ent->v.flDuckTime;
-	cd->flSwimTime		= ent->v.flSwimTime;
-	cd->waterjumptime	= ent->v.teleport_time;
+	cd->bInDuck		= pev->bInDuck;
+	cd->flTimeStepSound	= pev->flTimeStepSound;
+	cd->flDuckTime		= pev->flDuckTime;
+	cd->flSwimTime		= pev->flSwimTime;
+	cd->waterjumptime	= pev->teleport_time;
 
 	strcpy( cd->physinfo, ENGINE_GETPHYSINFO( ent ) );
 
-	cd->maxspeed		= ent->v.maxspeed;
-	cd->fov			= ent->v.fov;
-	cd->weaponanim		= ent->v.weaponanim;
+	cd->maxspeed		= pev->maxspeed;
+	cd->fov			= pev->fov;
+	cd->weaponanim		= pev->weaponanim;
 
-	cd->pushmsec		= ent->v.pushmsec;
+	cd->pushmsec		= pev->pushmsec;
 
+	// Spectator mode
+	if( pevOrg != NULL )
+	{
+		// don't use spec vars from chased player
+		cd->iuser1		= pevOrg->iuser1;
+		cd->iuser2		= pevOrg->iuser2;
+	}
+	else
+	{
+		cd->iuser1		= pev->iuser1;
+		cd->iuser2		= pev->iuser2;
+	}
 #if defined( CLIENT_WEAPONS )
 	if( sendweapons )
 	{
-		entvars_t *pev = (entvars_t *)&ent->v;
-		CBasePlayer *pl = (CBasePlayer *)CBasePlayer::Instance( pev );
-
 		if( pl )
 		{
 			cd->m_flNextAttack = pl->m_flNextAttack;
@@ -1701,7 +1865,7 @@ ConnectionlessPacket
 int ConnectionlessPacket( const struct netadr_s *net_from, const char *args, char *response_buffer, int *response_buffer_size )
 {
 	// Parse stuff from args
-	int max_buffer_size = *response_buffer_size;
+	//int max_buffer_size = *response_buffer_size;
 
 	// Zero it out since we aren't going to respond.
 	// If we wanted to response, we'd write data into response_buffer
@@ -1726,18 +1890,18 @@ int GetHullBounds( int hullnumber, float *mins, float *maxs )
 	switch( hullnumber )
 	{
 	case 0:				// Normal player
-		mins = VEC_HULL_MIN;
-		maxs = VEC_HULL_MAX;
+		VEC_HULL_MIN.CopyToArray(mins);
+		VEC_HULL_MAX.CopyToArray(maxs);
 		iret = 1;
 		break;
 	case 1:				// Crouched player
-		mins = VEC_DUCK_HULL_MIN;
-		maxs = VEC_DUCK_HULL_MAX;
+		VEC_DUCK_HULL_MIN.CopyToArray(mins);
+		VEC_DUCK_HULL_MAX.CopyToArray(maxs);
 		iret = 1;
 		break;
 	case 2:				// Point based hull
-		mins = Vector( 0, 0, 0 );
-		maxs = Vector( 0, 0, 0 );
+		Vector( 0, 0, 0 ).CopyToArray(mins);
+		Vector( 0, 0, 0 ).CopyToArray(maxs);
 		iret = 1;
 		break;
 	}
@@ -1755,10 +1919,10 @@ to be created during play ( e.g., grenades, ammo packs, projectiles, corpses, et
 */
 void CreateInstancedBaselines( void )
 {
-	int iret = 0;
+	/*int iret = 0;
 	entity_state_t state;
 
-	memset( &state, 0, sizeof(state) );
+	memset( &state, 0, sizeof(state) );*/
 
 	// Create any additional baselines here for things like grendates, etc.
 	// iret = ENGINE_INSTANCE_BASELINE( pc->pev->classname, &state );
diff --git a/dlls/client.h b/dlls/client.h
index 6728151b..6feaac1a 100644
--- a/dlls/client.h
+++ b/dlls/client.h
@@ -12,6 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
+#pragma once
 #ifndef CLIENT_H
 #define CLIENT_H
 
diff --git a/dlls/combat.cpp b/dlls/combat.cpp
index da7f9412..28654075 100644
--- a/dlls/combat.cpp
+++ b/dlls/combat.cpp
@@ -460,11 +460,11 @@ Activity CBaseMonster::GetSmallFlinchActivity( void )
 {
 	Activity	flinchActivity;
 	BOOL		fTriedDirection;
-	float		flDot;
+	//float		flDot;
 
 	fTriedDirection = FALSE;
 	UTIL_MakeVectors( pev->angles );
-	flDot = DotProduct( gpGlobals->v_forward, g_vecAttackDir * -1 );
+	//flDot = DotProduct( gpGlobals->v_forward, g_vecAttackDir * -1 );
 
 	switch( m_LastHitGroup )
 	{
@@ -576,8 +576,8 @@ Killed
 */
 void CBaseMonster::Killed( entvars_t *pevAttacker, int iGib )
 {
-	unsigned int	cCount = 0;
-	BOOL		fDone = FALSE;
+	//unsigned int	cCount = 0;
+	//BOOL		fDone = FALSE;
 
 	if( HasMemory( bits_MEMORY_KILLED ) )
 	{
@@ -727,7 +727,7 @@ void CGib::BounceGibTouch( CBaseEntity *pOther )
 			float volume;
 			float zvel = fabs( pev->velocity.z );
 
-			volume = 0.8 * min( 1.0, ( (float)zvel ) / 450.0 );
+			volume = 0.8 * Q_min( 1.0, ( (float)zvel ) / 450.0 );
 
 			CBreakable::MaterialSoundRandom( edict(), (Materials)m_material, volume );
 		}
@@ -920,7 +920,7 @@ int CBaseMonster::TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, f
 			// enemy's last known position is somewhere down the vector that the attack came from.
 			if( pevInflictor )
 			{
-				if( m_hEnemy == NULL || pevInflictor == m_hEnemy->pev || !HasConditions( bits_COND_SEE_ENEMY ) )
+				if( m_hEnemy == 0 || pevInflictor == m_hEnemy->pev || !HasConditions( bits_COND_SEE_ENEMY ) )
 				{
 					m_vecEnemyLKP = pevInflictor->origin;
 				}
@@ -1463,7 +1463,7 @@ void CBaseEntity::FireBullets( ULONG cShots, Vector vecSrc, Vector vecDirShootin
 			}
 		}
 		// make bullet trails
-		UTIL_BubbleTrail( vecSrc, tr.vecEndPos, ( flDistance * tr.flFraction ) / 64.0 );
+		UTIL_BubbleTrail( vecSrc, tr.vecEndPos, (int)( ( flDistance * tr.flFraction ) / 64.0 ) );
 	}
 	ApplyMultiDamage( pev, pevAttacker );
 }
@@ -1483,7 +1483,8 @@ Vector CBaseEntity::FireBulletsPlayer( ULONG cShots, Vector vecSrc, Vector vecDi
 	TraceResult tr;
 	Vector vecRight = gpGlobals->v_right;
 	Vector vecUp = gpGlobals->v_up;
-	float x, y, z;
+	float x = 0.0f, y = 0.0f;
+	float z;
 
 	if( pevAttacker == NULL )
 		pevAttacker = pev;  // the default attacker is ourselves
@@ -1497,7 +1498,7 @@ Vector CBaseEntity::FireBulletsPlayer( ULONG cShots, Vector vecSrc, Vector vecDi
 		// get circular gaussian spread
 		x = UTIL_SharedRandomFloat( shared_rand + iShot, -0.5, 0.5 ) + UTIL_SharedRandomFloat( shared_rand + ( 1 + iShot ) , -0.5, 0.5 );
 		y = UTIL_SharedRandomFloat( shared_rand + ( 2 + iShot ), -0.5, 0.5 ) + UTIL_SharedRandomFloat( shared_rand + ( 3 + iShot ), -0.5, 0.5 );
-		z = x * x + y * y;
+		//z = x * x + y * y;
 
 		Vector vecDir = vecDirShooting +
 						x * vecSpread.x * vecRight +
@@ -1560,7 +1561,7 @@ Vector CBaseEntity::FireBulletsPlayer( ULONG cShots, Vector vecSrc, Vector vecDi
 			}
 		}
 		// make bullet trails
-		UTIL_BubbleTrail( vecSrc, tr.vecEndPos, ( flDistance * tr.flFraction ) / 64.0 );
+		UTIL_BubbleTrail( vecSrc, tr.vecEndPos, (int)( ( flDistance * tr.flFraction ) / 64.0 ) );
 	}
 	ApplyMultiDamage( pev, pevAttacker );
 
diff --git a/dlls/compile.bat b/dlls/compile.bat
new file mode 100644
index 00000000..53c4511b
--- /dev/null
+++ b/dlls/compile.bat
@@ -0,0 +1,121 @@
+@echo off
+echo Setting environment for minimal Visual C++ 6
+set INCLUDE=%MSVCDir%\VC98\Include
+set LIB=%MSVCDir%\VC98\Lib
+set PATH=%MSVCDir%\VC98\Bin;%MSVCDir%\Common\MSDev98\Bin\;%PATH%
+
+echo -- Compiler is MSVC6
+
+set XASH3DSRC=..\..\Xash3D_original
+set INCLUDES=-I../common -I../engine -I../pm_shared -I../game_shared -I../public
+set SOURCES=agrunt.cpp^
+	airtank.cpp^
+	aflock.cpp^
+	animating.cpp^
+	animation.cpp^
+	apache.cpp^
+	barnacle.cpp^
+	barney.cpp^
+	bigmomma.cpp^
+	bloater.cpp^
+	bmodels.cpp^
+	bullsquid.cpp^
+	buttons.cpp^
+	cbase.cpp^
+	client.cpp^
+	combat.cpp^
+	controller.cpp^
+	crossbow.cpp^
+	crowbar.cpp^
+	defaultai.cpp^
+	doors.cpp^
+	effects.cpp^
+	egon.cpp^
+	explode.cpp^
+	flyingmonster.cpp^
+	func_break.cpp^
+	func_tank.cpp^
+	game.cpp^
+	gamerules.cpp^
+	gargantua.cpp^
+	gauss.cpp^
+	genericmonster.cpp^
+	ggrenade.cpp^
+	globals.cpp^
+	glock.cpp^
+	gman.cpp^
+	h_ai.cpp^
+	h_battery.cpp^
+	h_cine.cpp^
+	h_cycler.cpp^
+	h_export.cpp^
+	handgrenade.cpp^
+	hassassin.cpp^
+	headcrab.cpp^
+	healthkit.cpp^
+	hgrunt.cpp^
+	hornet.cpp^
+	hornetgun.cpp^
+	houndeye.cpp^
+	ichthyosaur.cpp^
+	islave.cpp^
+	items.cpp^
+	leech.cpp^
+	lights.cpp^
+	maprules.cpp^
+	monstermaker.cpp^
+	monsters.cpp^
+	monsterstate.cpp^
+	mortar.cpp^
+	mp5.cpp^
+	multiplay_gamerules.cpp^
+	nihilanth.cpp^
+	nodes.cpp^
+	observer.cpp^
+	osprey.cpp^
+	pathcorner.cpp^
+	plane.cpp^
+	plats.cpp^
+	player.cpp^
+	playermonster.cpp^
+	python.cpp^
+	rat.cpp^
+	roach.cpp^
+	rpg.cpp^
+	satchel.cpp^
+	schedule.cpp^
+	scientist.cpp^
+	scripted.cpp^
+	shotgun.cpp^
+	singleplay_gamerules.cpp^
+	skill.cpp^
+	sound.cpp^
+	soundent.cpp^
+	spectator.cpp^
+	squadmonster.cpp^
+	squeakgrenade.cpp^
+	subs.cpp^
+	talkmonster.cpp^
+	teamplay_gamerules.cpp^
+	tempmonster.cpp^
+	tentacle.cpp^
+	triggers.cpp^
+	tripmine.cpp^
+	turret.cpp^
+	util.cpp^
+	weapons.cpp^
+	world.cpp^
+	xen.cpp^
+	zombie.cpp^
+	../pm_shared/pm_debug.c ../pm_shared/pm_math.c ../pm_shared/pm_shared.c
+set DEFINES=/DCLIENT_WEAPONS /Dsnprintf=_snprintf /DNO_VOICEGAMEMGR
+set LIBS=user32.lib
+set OUTNAME=hl.dll
+set DEBUG=/debug
+
+cl %DEFINES% %LIBS% %SOURCES% %INCLUDES% -o %OUTNAME% /link /dll /out:%OUTNAME% %DEBUG% /def:".\hl.def"
+
+echo -- Compile done. Cleaning...
+
+del *.obj *.exp *.lib *.ilk
+echo -- Done.
diff --git a/dlls/controller.cpp b/dlls/controller.cpp
index 3d56325f..e1d57517 100644
--- a/dlls/controller.cpp
+++ b/dlls/controller.cpp
@@ -47,6 +47,7 @@ public:
 
 	void Spawn( void );
 	void Precache( void );
+	void UpdateOnRemove();
 	void SetYawSpeed( void );
 	int Classify( void );
 	void HandleAnimEvent( MonsterEvent_t *pEvent );
@@ -384,6 +385,23 @@ void CController::Precache()
 	UTIL_PrecacheOther( "controller_head_ball" );
 }	
 
+void CController::UpdateOnRemove()
+{
+	CBaseEntity::UpdateOnRemove();
+
+	if( m_pBall[0] )
+	{
+		UTIL_Remove( m_pBall[0] );
+		m_pBall[0] = 0;
+	}
+
+	if( m_pBall[1] )
+	{
+		UTIL_Remove( m_pBall[1] );
+		m_pBall[1] = 0;
+	}
+}
+
 //=========================================================
 // AI Schedules Specific to this monster
 //=========================================================
@@ -614,7 +632,7 @@ void CController::RunTask( Task_t *pTask )
 			Vector vecSrc = vecHand + pev->velocity * ( m_flShootTime - gpGlobals->time );
 			Vector vecDir;
 
-			if( m_hEnemy != NULL )
+			if( m_hEnemy != 0 )
 			{
 				if( HasConditions( bits_COND_SEE_ENEMY ) )
 				{
@@ -707,7 +725,7 @@ Schedule_t *CController::GetSchedule( void )
 	{
 	case MONSTERSTATE_COMBAT:
 		{
-			Vector vecTmp = Intersect( Vector( 0, 0, 0 ), Vector( 100, 4, 7 ), Vector( 2, 10, -3 ), 20.0 );
+			// Vector vecTmp = Intersect( Vector( 0, 0, 0 ), Vector( 100, 4, 7 ), Vector( 2, 10, -3 ), 20.0 );
 
 			// dead enemy
 			if( HasConditions( bits_COND_LIGHT_DAMAGE ) )
@@ -1095,7 +1113,6 @@ class CControllerHeadBall : public CBaseMonster
 	void EXPORT BounceTouch( CBaseEntity *pOther );
 	void MovetoTarget( Vector vecTarget );
 	void Crawl( void );
-	int m_iTrail;
 	int m_flNextAttack;
 	Vector m_vecIdeal;
 	EHANDLE m_hOwner;
@@ -1160,7 +1177,7 @@ void CControllerHeadBall::HuntThink( void )
 	MESSAGE_END();
 
 	// check world boundaries
-	if( gpGlobals->time - pev->dmgtime > 5 || pev->renderamt < 64 || m_hEnemy == NULL || m_hOwner == NULL || pev->origin.x < -4096 || pev->origin.x > 4096 || pev->origin.y < -4096 || pev->origin.y > 4096 || pev->origin.z < -4096 || pev->origin.z > 4096 )
+	if( gpGlobals->time - pev->dmgtime > 5 || pev->renderamt < 64 || m_hEnemy == 0 || m_hOwner == 0 || pev->origin.x < -4096 || pev->origin.x > 4096 || pev->origin.y < -4096 || pev->origin.y > 4096 || pev->origin.z < -4096 || pev->origin.z > 4096 )
 	{
 		SetTouch( NULL );
 		UTIL_Remove( this );
@@ -1340,7 +1357,7 @@ void CControllerZapBall::ExplodeTouch( CBaseEntity *pOther )
 
 		entvars_t *pevOwner;
 
-		if( m_hOwner != NULL )
+		if( m_hOwner != 0 )
 		{
 			pevOwner = m_hOwner->pev;
 		}
diff --git a/dlls/crossbow.cpp b/dlls/crossbow.cpp
index 45fd922c..12d0ff8c 100644
--- a/dlls/crossbow.cpp
+++ b/dlls/crossbow.cpp
@@ -353,7 +353,7 @@ void CCrossbow::PrimaryAttack( void )
 // this function only gets called in multiplayer
 void CCrossbow::FireSniperBolt()
 {
-	m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.75;
+	m_flNextPrimaryAttack = GetNextAttackDelay( 0.75 );
 
 	if( m_iClip == 0 )
 	{
@@ -425,10 +425,11 @@ void CCrossbow::FireBolt()
 	UTIL_MakeVectors( anglesAim );
 
 	anglesAim.x	= -anglesAim.x;
+
+#ifndef CLIENT_DLL
 	Vector vecSrc	= m_pPlayer->GetGunPosition() - gpGlobals->v_up * 2;
 	Vector vecDir	= gpGlobals->v_forward;
 
-#ifndef CLIENT_DLL
 	CCrossbowBolt *pBolt = CCrossbowBolt::BoltCreate();
 	pBolt->pev->origin = vecSrc;
 	pBolt->pev->angles = anglesAim;
@@ -451,7 +452,7 @@ void CCrossbow::FireBolt()
 		// HEV suit - indicate out of ammo condition
 		m_pPlayer->SetSuitUpdate( "!HEV_AMO0", FALSE, 0 );
 
-	m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.75;
+	m_flNextPrimaryAttack = GetNextAttackDelay( 0.75 );
 
 	m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.75;
 
@@ -480,7 +481,7 @@ void CCrossbow::SecondaryAttack()
 
 void CCrossbow::Reload( void )
 {
-	if( m_pPlayer->ammo_bolts <= 0 )
+	if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 || m_iClip == CROSSBOW_MAX_CLIP )
 		return;
 
 	if( m_pPlayer->pev->fov != 0 )
@@ -488,7 +489,7 @@ void CCrossbow::Reload( void )
 		SecondaryAttack();
 	}
 
-	if( DefaultReload( 5, CROSSBOW_RELOAD, 4.5 ) )
+	if( DefaultReload( CROSSBOW_MAX_CLIP, CROSSBOW_RELOAD, 4.5 ) )
 	{
 		EMIT_SOUND_DYN( ENT( m_pPlayer->pev ), CHAN_ITEM, "weapons/xbow_reload1.wav", RANDOM_FLOAT( 0.95, 1.0 ), ATTN_NORM, 0, 93 + RANDOM_LONG( 0, 0xF ) );
 	}
diff --git a/dlls/crowbar.cpp b/dlls/crowbar.cpp
index 4ccec55c..fd1f00a3 100644
--- a/dlls/crowbar.cpp
+++ b/dlls/crowbar.cpp
@@ -27,7 +27,7 @@
 
 LINK_ENTITY_TO_CLASS( weapon_crowbar, CCrowbar )
 
-enum gauss_e
+enum crowbar_e
 {
 	CROWBAR_IDLE = 0,
 	CROWBAR_DRAW,
@@ -37,11 +37,16 @@ enum gauss_e
 	CROWBAR_ATTACK2MISS,
 	CROWBAR_ATTACK2HIT,
 	CROWBAR_ATTACK3MISS,
+#ifndef CROWBAR_IDLE_ANIM	
 	CROWBAR_ATTACK3HIT
+#else
+	CROWBAR_ATTACK3HIT,
+	CROWBAR_IDLE2,
+	CROWBAR_IDLE3
+#endif
 };
 
-
-void CCrowbar::Spawn( )
+void CCrowbar::Spawn()
 {
 	Precache();
 	m_iId = WEAPON_CROWBAR;
@@ -84,6 +89,18 @@ int CCrowbar::GetItemInfo( ItemInfo *p )
 	return 1;
 }
 
+int CCrowbar::AddToPlayer( CBasePlayer *pPlayer )
+{
+	if( CBasePlayerWeapon::AddToPlayer( pPlayer ) )
+	{
+		MESSAGE_BEGIN( MSG_ONE, gmsgWeapPickup, NULL, pPlayer->pev );
+			WRITE_BYTE( m_iId );
+		MESSAGE_END();
+		return TRUE;
+	}
+	return FALSE;
+}
+
 BOOL CCrowbar::Deploy()
 {
 	return DefaultDeploy( "models/v_crowbar.mdl", "models/p_crowbar.mdl", CROWBAR_DRAW, "crowbar" );
@@ -143,8 +160,10 @@ void CCrowbar::PrimaryAttack()
 {
 	if( !Swing( 1 ) )
 	{
+#ifndef CLIENT_DLL
 		SetThink( &CCrowbar::SwingAgain );
 		pev->nextthink = gpGlobals->time + 0.1;
+#endif
 	}
 }
 
@@ -185,17 +204,22 @@ int CCrowbar::Swing( int fFirst )
 		}
 	}
 #endif
-	PLAYBACK_EVENT_FULL( FEV_NOTHOST, m_pPlayer->edict(), m_usCrowbar, 
-	0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, 0,
-	0.0, 0, 0.0 );
+	if( fFirst )
+	{
+		PLAYBACK_EVENT_FULL( FEV_NOTHOST, m_pPlayer->edict(), m_usCrowbar, 
+		0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, 0,
+		0, 0, 0 );
+	}
 
 	if( tr.flFraction >= 1.0 )
 	{
 		if( fFirst )
 		{
 			// miss
-			m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.5;
-
+			m_flNextPrimaryAttack = GetNextAttackDelay( 0.5 );
+#ifdef CROWBAR_IDLE_ANIM
+			m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 );
+#endif
 			// player "shoot" animation
 			m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
 		}
@@ -223,26 +247,32 @@ int CCrowbar::Swing( int fFirst )
 		fDidHit = TRUE;
 		CBaseEntity *pEntity = CBaseEntity::Instance( tr.pHit );
 
-		ClearMultiDamage();
-
-		if( ( m_flNextPrimaryAttack + 1 < UTIL_WeaponTimeBase() ) || g_pGameRules->IsMultiplayer() )
-		{
-			// first swing does full damage
-			pEntity->TraceAttack( m_pPlayer->pev, gSkillData.plrDmgCrowbar, gpGlobals->v_forward, &tr, DMG_CLUB ); 
-		}
-		else
-		{
-			// subsequent swings do half
-			pEntity->TraceAttack( m_pPlayer->pev, gSkillData.plrDmgCrowbar / 2, gpGlobals->v_forward, &tr, DMG_CLUB ); 
-		}
-		ApplyMultiDamage( m_pPlayer->pev, m_pPlayer->pev );
-
 		// play thwack, smack, or dong sound
-		float flVol = 1.0;
-		int fHitWorld = TRUE;
+                float flVol = 1.0;
+                int fHitWorld = TRUE;
 
 		if( pEntity )
 		{
+			ClearMultiDamage();
+			// If building with the clientside weapon prediction system,
+			// UTIL_WeaponTimeBase() is always 0 and m_flNextPrimaryAttack is >= -1.0f, thus making
+			// m_flNextPrimaryAttack + 1 < UTIL_WeaponTimeBase() always evaluate to false.
+#ifdef CLIENT_WEAPONS
+			if( ( m_flNextPrimaryAttack + 1 == UTIL_WeaponTimeBase() ) || g_pGameRules->IsMultiplayer() )
+#else
+			if( ( m_flNextPrimaryAttack + 1 < UTIL_WeaponTimeBase() ) || g_pGameRules->IsMultiplayer() )
+#endif
+			{
+				// first swing does full damage
+				pEntity->TraceAttack( m_pPlayer->pev, gSkillData.plrDmgCrowbar, gpGlobals->v_forward, &tr, DMG_CLUB ); 
+			}
+			else
+			{
+				// subsequent swings do half
+				pEntity->TraceAttack( m_pPlayer->pev, gSkillData.plrDmgCrowbar / 2, gpGlobals->v_forward, &tr, DMG_CLUB ); 
+			}
+			ApplyMultiDamage( m_pPlayer->pev, m_pPlayer->pev );
+
 			if( pEntity->Classify() != CLASS_NONE && pEntity->Classify() != CLASS_MACHINE )
 			{
 				// Skeletons make different hit sounds.
@@ -319,12 +349,45 @@ int CCrowbar::Swing( int fFirst )
 			m_trHit = tr;
 		}
 
-		m_pPlayer->m_iWeaponVolume = flVol * CROWBAR_WALLHIT_VOLUME;
-#endif
-		m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.25;
+		m_pPlayer->m_iWeaponVolume = (int)( flVol * CROWBAR_WALLHIT_VOLUME );
 
 		SetThink( &CCrowbar::Smack );
 		pev->nextthink = UTIL_WeaponTimeBase() + 0.2;
+#endif
+		m_flNextPrimaryAttack = GetNextAttackDelay( 0.25 );
 	}
+#ifdef CROWBAR_IDLE_ANIM
+	m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 );
+#endif
 	return fDidHit;
 }
+
+#ifdef CROWBAR_IDLE_ANIM
+void CCrowbar::WeaponIdle( void )
+{
+	if( m_flTimeWeaponIdle < UTIL_WeaponTimeBase() )
+	{
+		int iAnim;
+		float flRand = UTIL_SharedRandomFloat( m_pPlayer->random_seed, 0, 1 );
+		if( flRand > 0.9 )
+		{
+			iAnim = CROWBAR_IDLE2;
+			m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 160.0 / 30.0;
+		}
+		else
+		{
+			if( flRand > 0.5 )
+			{
+				iAnim = CROWBAR_IDLE;
+				m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 70.0 / 30.0;
+			}
+			else
+			{
+				iAnim = CROWBAR_IDLE3;
+				m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 160.0 / 30.0;
+			}
+		}
+		SendWeaponAnim( iAnim );
+	}
+}
+#endif
diff --git a/dlls/decals.h b/dlls/decals.h
index ce5a2b53..5de54421 100644
--- a/dlls/decals.h
+++ b/dlls/decals.h
@@ -12,6 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
+#pragma once
 #ifndef DECALS_H
 #define DECALS_H
 
@@ -66,7 +67,7 @@ enum decal_e
 
 typedef struct 
 {
-	char *name;
+	const char *name;
 	int index;
 } DLL_DECALLIST;
 
diff --git a/dlls/doors.cpp b/dlls/doors.cpp
index bf7205ee..c12cc3a0 100644
--- a/dlls/doors.cpp
+++ b/dlls/doors.cpp
@@ -22,6 +22,8 @@
 #include "util.h"
 #include "cbase.h"
 #include "doors.h"
+#include "game.h"
+#include "weapons.h"
 
 extern void SetMovedir( entvars_t *ev );
 
@@ -125,7 +127,7 @@ void PlayLockSounds( entvars_t *pev, locksound_t *pls, int flocked, int fbutton
 		if( fplaysound )
 		{
 			// play 'door locked' sound
-			EMIT_SOUND( ENT( pev ), CHAN_ITEM, (char*)STRING( pls->sLockedSound ), fvol, ATTN_NORM );
+			EMIT_SOUND( ENT( pev ), CHAN_ITEM, STRING( pls->sLockedSound ), fvol, ATTN_NORM );
 			pls->flwaitSound = gpGlobals->time + flsoundwait;
 		}
 
@@ -162,7 +164,7 @@ void PlayLockSounds( entvars_t *pev, locksound_t *pls, int flocked, int fbutton
 		// play 'door unlocked' sound if set
 		if( fplaysound )
 		{
-			EMIT_SOUND( ENT( pev ), CHAN_ITEM, (char*)STRING( pls->sUnlockedSound ), fvol, ATTN_NORM );
+			EMIT_SOUND( ENT( pev ), CHAN_ITEM, STRING( pls->sUnlockedSound ), fvol, ATTN_NORM );
 			pls->flwaitSound = gpGlobals->time + flsoundwait;
 		}
 
@@ -189,42 +191,42 @@ void CBaseDoor::KeyValue( KeyValueData *pkvd )
 {
 	if( FStrEq( pkvd->szKeyName, "skin" ) )//skin is used for content type
 	{
-		pev->skin = atof( pkvd->szValue );
+		pev->skin = atoi( pkvd->szValue );
 		pkvd->fHandled = TRUE;
 	}
 	else if( FStrEq( pkvd->szKeyName, "movesnd" ) )
 	{
-		m_bMoveSnd = atof( pkvd->szValue );
+		m_bMoveSnd = atoi( pkvd->szValue );
 		pkvd->fHandled = TRUE;
 	}
 	else if( FStrEq( pkvd->szKeyName, "stopsnd" ) )
 	{
-		m_bStopSnd = atof( pkvd->szValue );
+		m_bStopSnd = atoi( pkvd->szValue );
 		pkvd->fHandled = TRUE;
 	}
 	else if( FStrEq( pkvd->szKeyName, "healthvalue" ) )
 	{
-		m_bHealthValue = atof( pkvd->szValue );
+		m_bHealthValue = atoi( pkvd->szValue );
 		pkvd->fHandled = TRUE;
 	}
 	else if( FStrEq( pkvd->szKeyName, "locked_sound" ) )
 	{
-		m_bLockedSound = atof( pkvd->szValue );
+		m_bLockedSound = atoi( pkvd->szValue );
 		pkvd->fHandled = TRUE;
 	}
 	else if( FStrEq( pkvd->szKeyName, "locked_sentence" ) )
 	{
-		m_bLockedSentence = atof( pkvd->szValue );
+		m_bLockedSentence = atoi( pkvd->szValue );
 		pkvd->fHandled = TRUE;
 	}
 	else if( FStrEq( pkvd->szKeyName, "unlocked_sound" ) )
 	{
-		m_bUnlockedSound = atof( pkvd->szValue );
+		m_bUnlockedSound = atoi( pkvd->szValue );
 		pkvd->fHandled = TRUE;
 	}
 	else if( FStrEq( pkvd->szKeyName, "unlocked_sentence" ) )
 	{
-		m_bUnlockedSentence = atof( pkvd->szValue );
+		m_bUnlockedSentence = atoi( pkvd->szValue );
 		pkvd->fHandled = TRUE;
 	}
 	else if( FStrEq( pkvd->szKeyName, "WaveHeight" ) )
@@ -328,115 +330,105 @@ void CBaseDoor::SetToggleState( int state )
 
 void CBaseDoor::Precache( void )
 {
-	char *pszSound;
+	const char *pszSound;
+	BOOL NullSound = FALSE;
 
 	// set the door's "in-motion" sound
 	switch( m_bMoveSnd )
 	{
-		case 0:
-			pev->noiseMoving = ALLOC_STRING( "common/null.wav" );
-			break;
 		case 1:
-			PRECACHE_SOUND( "doors/doormove1.wav" );
-			pev->noiseMoving = ALLOC_STRING( "doors/doormove1.wav" );
+			pszSound = "doors/doormove1.wav";
 			break;
 		case 2:
-			PRECACHE_SOUND( "doors/doormove2.wav" );
-			pev->noiseMoving = ALLOC_STRING( "doors/doormove2.wav" );
+			pszSound = "doors/doormove2.wav";
 			break;
 		case 3:
-			PRECACHE_SOUND( "doors/doormove3.wav" );
-			pev->noiseMoving = ALLOC_STRING( "doors/doormove3.wav" );
+			pszSound = "doors/doormove3.wav";
 			break;
 		case 4:
-			PRECACHE_SOUND( "doors/doormove4.wav" );
-			pev->noiseMoving = ALLOC_STRING( "doors/doormove4.wav" );
+			pszSound = "doors/doormove4.wav";
 			break;
 		case 5:
-			PRECACHE_SOUND( "doors/doormove5.wav" );
-			pev->noiseMoving = ALLOC_STRING( "doors/doormove5.wav" );
+			pszSound = "doors/doormove5.wav";
 			break;
 		case 6:
-			PRECACHE_SOUND( "doors/doormove6.wav" );
-			pev->noiseMoving = ALLOC_STRING( "doors/doormove6.wav" );
+			pszSound = "doors/doormove6.wav";
 			break;
 		case 7:
-			PRECACHE_SOUND( "doors/doormove7.wav" );
-			pev->noiseMoving = ALLOC_STRING( "doors/doormove7.wav" );
+			pszSound = "doors/doormove7.wav";
 			break;
 		case 8:
-			PRECACHE_SOUND( "doors/doormove8.wav" );
-			pev->noiseMoving = ALLOC_STRING( "doors/doormove8.wav" );
+			pszSound = "doors/doormove8.wav";
 			break;
 		case 9:
-			PRECACHE_SOUND( "doors/doormove9.wav" );
-			pev->noiseMoving = ALLOC_STRING( "doors/doormove9.wav" );
+			pszSound = "doors/doormove9.wav";
 			break;
 		case 10:
-			PRECACHE_SOUND( "doors/doormove10.wav" );
-			pev->noiseMoving = ALLOC_STRING( "doors/doormove10.wav" );
+			pszSound = "doors/doormove10.wav";
 			break;
+		case 0:
 		default:
-			pev->noiseMoving = ALLOC_STRING( "common/null.wav" );
+			pszSound = "common/null.wav";
+			NullSound = TRUE;
 			break;
 	}
 
+	if( !NullSound )
+		PRECACHE_SOUND( pszSound );
+	pev->noiseMoving = MAKE_STRING( pszSound );
+	NullSound = FALSE;
+
 	// set the door's 'reached destination' stop sound
 	switch( m_bStopSnd )
 	{
-		case 0:
-			pev->noiseArrived = ALLOC_STRING( "common/null.wav" );
-			break;
 		case 1:
-			PRECACHE_SOUND( "doors/doorstop1.wav" );
-			pev->noiseArrived = ALLOC_STRING( "doors/doorstop1.wav" );
+			pszSound = "doors/doorstop1.wav";
 			break;
 		case 2:
-			PRECACHE_SOUND( "doors/doorstop2.wav" );
-			pev->noiseArrived = ALLOC_STRING( "doors/doorstop2.wav" );
+			pszSound = "doors/doorstop2.wav";
 			break;
 		case 3:
-			PRECACHE_SOUND( "doors/doorstop3.wav" );
-			pev->noiseArrived = ALLOC_STRING( "doors/doorstop3.wav" );
+			pszSound = "doors/doorstop3.wav";
 			break;
 		case 4:
-			PRECACHE_SOUND( "doors/doorstop4.wav" );
-			pev->noiseArrived = ALLOC_STRING( "doors/doorstop4.wav" );
+			pszSound = "doors/doorstop4.wav";
 			break;
 		case 5:
-			PRECACHE_SOUND( "doors/doorstop5.wav" );
-			pev->noiseArrived = ALLOC_STRING( "doors/doorstop5.wav" );
+			pszSound = "doors/doorstop5.wav";
 			break;
 		case 6:
-			PRECACHE_SOUND( "doors/doorstop6.wav" );
-			pev->noiseArrived = ALLOC_STRING( "doors/doorstop6.wav");
+			pszSound = "doors/doorstop6.wav";
 			break;
 		case 7:
-			PRECACHE_SOUND( "doors/doorstop7.wav" );
-			pev->noiseArrived = ALLOC_STRING( "doors/doorstop7.wav" );
+			pszSound = "doors/doorstop7.wav";
 			break;
 		case 8:
-			PRECACHE_SOUND( "doors/doorstop8.wav" );
-			pev->noiseArrived = ALLOC_STRING( "doors/doorstop8.wav" );
+			pszSound = "doors/doorstop8.wav";
 			break;
+		case 0:
 		default:
-			pev->noiseArrived = ALLOC_STRING( "common/null.wav" );
+			pszSound = "common/null.wav";
+			NullSound = TRUE;
 			break;
 	}
 
+	if( !NullSound )
+		PRECACHE_SOUND( pszSound );
+	pev->noiseArrived = MAKE_STRING( pszSound );
+
 	// get door button sounds, for doors which are directly 'touched' to open
 	if( m_bLockedSound )
 	{
 		pszSound = ButtonSound( (int)m_bLockedSound );
 		PRECACHE_SOUND( pszSound );
-		m_ls.sLockedSound = ALLOC_STRING( pszSound );
+		m_ls.sLockedSound = MAKE_STRING( pszSound );
 	}
 
 	if( m_bUnlockedSound )
 	{
 		pszSound = ButtonSound( (int)m_bUnlockedSound );
 		PRECACHE_SOUND( pszSound );
-		m_ls.sUnlockedSound = ALLOC_STRING( pszSound );
+		m_ls.sUnlockedSound = MAKE_STRING( pszSound );
 	}
 
 	// get sentence group names, for doors which are directly 'touched' to open
@@ -444,39 +436,39 @@ void CBaseDoor::Precache( void )
 	{
 		case 1:
 			// access denied
-			m_ls.sLockedSentence = ALLOC_STRING( "NA" );
+			m_ls.sLockedSentence = MAKE_STRING( "NA" );
 			break;
 		case 2:
 			// security lockout
-			m_ls.sLockedSentence = ALLOC_STRING( "ND" );
+			m_ls.sLockedSentence = MAKE_STRING( "ND" );
 			break;
 		case 3:
 			// blast door
-			m_ls.sLockedSentence = ALLOC_STRING( "NF" );
+			m_ls.sLockedSentence = MAKE_STRING( "NF" );
 			break;
 		case 4:
 			// fire door
-			m_ls.sLockedSentence = ALLOC_STRING( "NFIRE" );
+			m_ls.sLockedSentence = MAKE_STRING( "NFIRE" );
 			break;
 		case 5:
 			// chemical door
-			m_ls.sLockedSentence = ALLOC_STRING( "NCHEM" );
+			m_ls.sLockedSentence = MAKE_STRING( "NCHEM" );
 			break;
 		case 6:
 			// radiation door
-			m_ls.sLockedSentence = ALLOC_STRING( "NRAD" );
+			m_ls.sLockedSentence = MAKE_STRING( "NRAD" );
 			break;
 		case 7:
 			// gen containment
-			m_ls.sLockedSentence = ALLOC_STRING( "NCON" );
+			m_ls.sLockedSentence = MAKE_STRING( "NCON" );
 			break;
 		case 8:
 			// maintenance door
-			m_ls.sLockedSentence = ALLOC_STRING( "NH" );
+			m_ls.sLockedSentence = MAKE_STRING( "NH" );
 			break;
 		case 9:
 			// broken door
-			m_ls.sLockedSentence = ALLOC_STRING( "NG" );
+			m_ls.sLockedSentence = MAKE_STRING( "NG" );
 			break;
 		default:
 			m_ls.sLockedSentence = 0;
@@ -487,35 +479,35 @@ void CBaseDoor::Precache( void )
 	{
 		case 1:
 			// access granted
-			m_ls.sUnlockedSentence = ALLOC_STRING( "EA" );
+			m_ls.sUnlockedSentence = MAKE_STRING( "EA" );
 			break;
 		case 2:
 			// security door
-			m_ls.sUnlockedSentence = ALLOC_STRING( "ED" );
+			m_ls.sUnlockedSentence = MAKE_STRING( "ED" );
 			break;
 		case 3:
 			// blast door
-			m_ls.sUnlockedSentence = ALLOC_STRING( "EF" );
+			m_ls.sUnlockedSentence = MAKE_STRING( "EF" );
 			break;
 		case 4:
 			// fire door
-			m_ls.sUnlockedSentence = ALLOC_STRING( "EFIRE" );
+			m_ls.sUnlockedSentence = MAKE_STRING( "EFIRE" );
 			break;
 		case 5:
 			// chemical door
-			m_ls.sUnlockedSentence = ALLOC_STRING( "ECHEM" );
+			m_ls.sUnlockedSentence = MAKE_STRING( "ECHEM" );
 			break;
 		case 6:
 			// radiation door
-			m_ls.sUnlockedSentence = ALLOC_STRING( "ERAD" );
+			m_ls.sUnlockedSentence = MAKE_STRING( "ERAD" );
 			break;
 		case 7:
 			// gen containment
-			m_ls.sUnlockedSentence = ALLOC_STRING( "ECON" );
+			m_ls.sUnlockedSentence = MAKE_STRING( "ECON" );
 			break;
 		case 8:
 			// maintenance door
-			m_ls.sUnlockedSentence = ALLOC_STRING( "EH" );
+			m_ls.sUnlockedSentence = MAKE_STRING( "EH" );
 			break;
 		default:
 			m_ls.sUnlockedSentence = 0;
@@ -581,7 +573,7 @@ int CBaseDoor::DoorActivate()
 	else
 	{
 		// door should open
-		if( m_hActivator != NULL && m_hActivator->IsPlayer() )
+		if( m_hActivator != 0 && m_hActivator->IsPlayer() )
 		{
 			// give health if player opened the door (medikit)
 			//VARS( m_eoActivator )->health += m_bHealthValue;
@@ -614,7 +606,7 @@ void CBaseDoor::DoorGoUp( void )
 	// filter them out and leave a client stuck with looping door sounds!
 	if( !FBitSet( pev->spawnflags, SF_DOOR_SILENT ) )
 		if( m_toggle_state != TS_GOING_UP && m_toggle_state != TS_GOING_DOWN )
-			EMIT_SOUND( ENT( pev ), CHAN_STATIC, (char*)STRING( pev->noiseMoving ), 1, ATTN_NORM );
+			EMIT_SOUND( ENT( pev ), CHAN_STATIC, STRING( pev->noiseMoving ), 1, ATTN_NORM );
 
 	m_toggle_state = TS_GOING_UP;
 
@@ -623,7 +615,7 @@ void CBaseDoor::DoorGoUp( void )
 	{
 		float sign = 1.0;
 
-		if( m_hActivator != NULL )
+		if( m_hActivator != 0 )
 		{
 			pevActivator = m_hActivator->pev;
 
@@ -654,8 +646,8 @@ void CBaseDoor::DoorHitTop( void )
 {
 	if( !FBitSet( pev->spawnflags, SF_DOOR_SILENT ) )
 	{
-		STOP_SOUND( ENT( pev ), CHAN_STATIC, (char*)STRING( pev->noiseMoving ) );
-		EMIT_SOUND( ENT( pev ), CHAN_STATIC, (char*)STRING( pev->noiseArrived ), 1, ATTN_NORM );
+		STOP_SOUND( ENT( pev ), CHAN_STATIC, STRING( pev->noiseMoving ) );
+		EMIT_SOUND( ENT( pev ), CHAN_STATIC, STRING( pev->noiseArrived ), 1, ATTN_NORM );
 	}
 
 	ASSERT( m_toggle_state == TS_GOING_UP );
@@ -694,7 +686,7 @@ void CBaseDoor::DoorGoDown( void )
 {
 	if( !FBitSet( pev->spawnflags, SF_DOOR_SILENT ) )
 		if( m_toggle_state != TS_GOING_UP && m_toggle_state != TS_GOING_DOWN )
-			EMIT_SOUND( ENT( pev ), CHAN_STATIC, (char*)STRING( pev->noiseMoving ), 1, ATTN_NORM );	
+			EMIT_SOUND( ENT( pev ), CHAN_STATIC, STRING( pev->noiseMoving ), 1, ATTN_NORM );	
 #ifdef DOOR_ASSERT
 	ASSERT( m_toggle_state == TS_AT_TOP );
 #endif // DOOR_ASSERT
@@ -714,8 +706,8 @@ void CBaseDoor::DoorHitBottom( void )
 {
 	if( !FBitSet( pev->spawnflags, SF_DOOR_SILENT ) )
 	{
-		STOP_SOUND( ENT( pev ), CHAN_STATIC, (char*)STRING( pev->noiseMoving ) );
-		EMIT_SOUND( ENT( pev ), CHAN_STATIC, (char*)STRING( pev->noiseArrived ), 1, ATTN_NORM );
+		STOP_SOUND( ENT( pev ), CHAN_STATIC, STRING( pev->noiseMoving ) );
+		EMIT_SOUND( ENT( pev ), CHAN_STATIC, STRING( pev->noiseArrived ), 1, ATTN_NORM );
 	}
 
 	ASSERT( m_toggle_state == TS_GOING_DOWN );
@@ -746,10 +738,22 @@ void CBaseDoor::Blocked( CBaseEntity *pOther )
 	if( pev->dmg )
 		pOther->TakeDamage( pev, pev, pev->dmg, DMG_CRUSH );
 
+	if( satchelfix.value )
+	{
+		// Detonate satchels
+		if( !strcmp( "monster_satchel", STRING( pOther->pev->classname ) ) )
+			( (CSatchel*)pOther )->Use( this, this, USE_ON, 0 );
+	}
+
 	// if a door has a negative wait, it would never come back if blocked,
 	// so let it just squash the object to death real fast
 	if( m_flWait >= 0 )
 	{
+		// BMod Start - Door sound fix.
+		if( !FBitSet( pev->spawnflags, SF_DOOR_SILENT ) )
+			STOP_SOUND( ENT( pev ), CHAN_STATIC, STRING( pev->noiseMoving ) );
+		// BMod End
+
 		if( m_toggle_state == TS_GOING_DOWN )
 		{
 			DoorGoUp();
@@ -763,7 +767,7 @@ void CBaseDoor::Blocked( CBaseEntity *pOther )
 	// Block all door pieces with the same targetname here.
 	if( !FStringNull( pev->targetname ) )
 	{
-		for(;;)
+		for( ; ; )
 		{
 			pentTarget = FIND_ENTITY_BY_TARGETNAME( pentTarget, STRING( pev->targetname ) );
 
@@ -795,7 +799,7 @@ void CBaseDoor::Blocked( CBaseEntity *pOther )
 							}
 						}
 						if( !FBitSet( pev->spawnflags, SF_DOOR_SILENT ) )
-							STOP_SOUND( ENT( pev ), CHAN_STATIC, (char*)STRING( pev->noiseMoving ) );
+							STOP_SOUND( ENT( pev ), CHAN_STATIC, STRING( pev->noiseMoving ) );
 
 						if( pDoor->m_toggle_state == TS_GOING_DOWN )
 							pDoor->DoorGoUp();
@@ -975,94 +979,88 @@ void CMomentaryDoor::Spawn( void )
 
 	Precache();
 }
-	
+
 void CMomentaryDoor::Precache( void )
 {
+	const char *pszSound;
+	BOOL NullSound = FALSE;
+
 	// set the door's "in-motion" sound
 	switch( m_bMoveSnd )
 	{
-	case 0:
-		pev->noiseMoving = ALLOC_STRING( "common/null.wav" );
-		break;
 	case 1:
-		PRECACHE_SOUND( "doors/doormove1.wav" );
-		pev->noiseMoving = ALLOC_STRING( "doors/doormove1.wav" );
+		pszSound = "doors/doormove1.wav";
 		break;
 	case 2:
-		PRECACHE_SOUND( "doors/doormove2.wav" );
-		pev->noiseMoving = ALLOC_STRING( "doors/doormove2.wav" );
+		pszSound = "doors/doormove2.wav";
 		break;
 	case 3:
-		PRECACHE_SOUND( "doors/doormove3.wav" );
-		pev->noiseMoving = ALLOC_STRING( "doors/doormove3.wav" );
+		pszSound = "doors/doormove3.wav";
 		break;
 	case 4:
-		PRECACHE_SOUND( "doors/doormove4.wav" );
-		pev->noiseMoving = ALLOC_STRING( "doors/doormove4.wav" );
+		pszSound = "doors/doormove4.wav";
 		break;
 	case 5:
-		PRECACHE_SOUND( "doors/doormove5.wav" );
-		pev->noiseMoving = ALLOC_STRING( "doors/doormove5.wav" );
+		pszSound = "doors/doormove5.wav";
 		break;
 	case 6:
-		PRECACHE_SOUND( "doors/doormove6.wav" );
-		pev->noiseMoving = ALLOC_STRING( "doors/doormove6.wav" );
+		pszSound = "doors/doormove6.wav";
 		break;
 	case 7:
-		PRECACHE_SOUND( "doors/doormove7.wav" );
-		pev->noiseMoving = ALLOC_STRING( "doors/doormove7.wav" );
+		pszSound = "doors/doormove7.wav";
 		break;
 	case 8:
-		PRECACHE_SOUND( "doors/doormove8.wav" );
-		pev->noiseMoving = ALLOC_STRING( "doors/doormove8.wav" );
+		pszSound = "doors/doormove8.wav";
 		break;
+	case 0:
 	default:
-		pev->noiseMoving = ALLOC_STRING( "common/null.wav" );
+		pszSound = "common/null.wav";
+		NullSound = TRUE;
 		break;
 	}
 
+	if( !NullSound )
+		PRECACHE_SOUND( pszSound );
+	pev->noiseMoving = MAKE_STRING( pszSound );
+	NullSound = FALSE;
+
 	// set the door's 'reached destination' stop sound
 	switch( m_bStopSnd )
 	{
-	case 0:
-		pev->noiseArrived = ALLOC_STRING( "common/null.wav" );
-		break;
 	case 1:
-		PRECACHE_SOUND( "doors/doorstop1.wav" );
-		pev->noiseArrived = ALLOC_STRING( "doors/doorstop1.wav" );
+		pszSound = "doors/doorstop1.wav";
 		break;
 	case 2:
-		PRECACHE_SOUND( "doors/doorstop2.wav" );
-		pev->noiseArrived = ALLOC_STRING( "doors/doorstop2.wav" );
+		pszSound = "doors/doorstop2.wav";
 		break;
 	case 3:
-		PRECACHE_SOUND( "doors/doorstop3.wav" );
-		pev->noiseArrived = ALLOC_STRING("doors/doorstop3.wav");
+		pszSound = "doors/doorstop3.wav";
 		break;
 	case 4:
-		PRECACHE_SOUND( "doors/doorstop4.wav" );
-		pev->noiseArrived = ALLOC_STRING( "doors/doorstop4.wav" );
+		pszSound = "doors/doorstop4.wav";
 		break;
 	case 5:
-		PRECACHE_SOUND( "doors/doorstop5.wav" );
-		pev->noiseArrived = ALLOC_STRING( "doors/doorstop5.wav" );
+		pszSound = "doors/doorstop5.wav";
 		break;
 	case 6:
-		PRECACHE_SOUND( "doors/doorstop6.wav" );
-		pev->noiseArrived = ALLOC_STRING( "doors/doorstop6.wav" );
+		pszSound = "doors/doorstop6.wav";
 		break;
 	case 7:
-		PRECACHE_SOUND( "doors/doorstop7.wav" );
-		pev->noiseArrived = ALLOC_STRING( "doors/doorstop7.wav" );
+		pszSound = "doors/doorstop7.wav";
 		break;
 	case 8:
-		PRECACHE_SOUND( "doors/doorstop8.wav" );
-		pev->noiseArrived = ALLOC_STRING( "doors/doorstop8.wav" );
+		pszSound = "doors/doorstop8.wav";
 		break;
+	case 0:
 	default:
-		pev->noiseArrived = ALLOC_STRING( "common/null.wav" );
+		pszSound = "common/null.wav";
+		NullSound = TRUE;
 		break;
 	}
+
+	if( !NullSound )
+		PRECACHE_SOUND( pszSound );
+	pev->noiseArrived = MAKE_STRING( pszSound );
 }
 
 void CMomentaryDoor::KeyValue( KeyValueData *pkvd )
@@ -1070,7 +1068,7 @@ void CMomentaryDoor::KeyValue( KeyValueData *pkvd )
 
 	if( FStrEq( pkvd->szKeyName, "movesnd" ) )
 	{
-		m_bMoveSnd = atof( pkvd->szValue );
+		m_bMoveSnd = atoi( pkvd->szValue );
 		pkvd->fHandled = TRUE;
 	}
 	else if( FStrEq( pkvd->szKeyName, "stopsnd" ) )
@@ -1100,23 +1098,26 @@ void CMomentaryDoor::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYP
 	Vector move = m_vecPosition1 + ( value * ( m_vecPosition2 - m_vecPosition1 ) );
 	
 	Vector delta = move - pev->origin;
-	float speed = delta.Length() * 10;
+	//float speed = delta.Length() * 10;
+	float speed = delta.Length() / 0.1; // move there in 0.1 sec
 
 	if( speed != 0 )
 	{
 		// This entity only thinks when it moves, so if it's thinking, it's in the process of moving
-		// play the sound when it starts moving
+		// play the sound when it starts moving(not yet thinking)
 		if( pev->nextthink < pev->ltime || pev->nextthink == 0 )
-			EMIT_SOUND( ENT( pev ), CHAN_STATIC, (char*)STRING( pev->noiseMoving ), 1, ATTN_NORM );
+			EMIT_SOUND( ENT( pev ), CHAN_STATIC, STRING( pev->noiseMoving ), 1, ATTN_NORM );
+		// If we already moving to designated point, return
+		else if( move == m_vecFinalDest )
+			return;
 
 		LinearMove( move, speed );
 		SetMoveDone( &CMomentaryDoor::MomentaryMoveDone );
 	}
-
 }
 
 void CMomentaryDoor::MomentaryMoveDone( void )
 {
-	STOP_SOUND( ENT( pev ), CHAN_STATIC, (char*)STRING( pev->noiseMoving ) );
-	EMIT_SOUND( ENT( pev ), CHAN_STATIC, (char*)STRING( pev->noiseArrived ), 1, ATTN_NORM );
+	STOP_SOUND( ENT( pev ), CHAN_STATIC, STRING( pev->noiseMoving ) );
+	EMIT_SOUND( ENT( pev ), CHAN_STATIC, STRING( pev->noiseArrived ), 1, ATTN_NORM );
 }
diff --git a/dlls/doors.h b/dlls/doors.h
index 7e89b497..fe2b5a85 100644
--- a/dlls/doors.h
+++ b/dlls/doors.h
@@ -12,6 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
+#pragma once
 #ifndef DOORS_H
 #define DOORS_H
 
diff --git a/dlls/effects.cpp b/dlls/effects.cpp
index ecc04a19..bd12f8aa 100644
--- a/dlls/effects.cpp
+++ b/dlls/effects.cpp
@@ -75,7 +75,7 @@ void CBubbling::Spawn( void )
 	pev->solid = SOLID_NOT;							// Remove model & collisions
 	pev->renderamt = 0;								// The engine won't draw this model if this is set to 0 and blending is on
 	pev->rendermode = kRenderTransTexture;
-	int speed = pev->speed > 0 ? pev->speed : -pev->speed;
+	int speed = fabs( pev->speed );
 
 	// HACKHACK!!! - Speed in rendercolor
 	pev->rendercolor.x = speed >> 8;
@@ -229,7 +229,7 @@ void CBeam::BeamInit( const char *pSpriteName, int width )
 	SetFrame( 0 );
 	SetScrollRate( 0 );
 	pev->model = MAKE_STRING( pSpriteName );
-	SetTexture( PRECACHE_MODEL( (char *)pSpriteName ) );
+	SetTexture( PRECACHE_MODEL( pSpriteName ) );
 	SetWidth( width );
 	pev->skin = 0;
 	pev->sequence = 0;
@@ -280,12 +280,12 @@ void CBeam::RelinkBeam( void )
 {
 	const Vector &startPos = GetStartPos(), &endPos = GetEndPos();
 
-	pev->mins.x = min( startPos.x, endPos.x );
-	pev->mins.y = min( startPos.y, endPos.y );
-	pev->mins.z = min( startPos.z, endPos.z );
-	pev->maxs.x = max( startPos.x, endPos.x );
-	pev->maxs.y = max( startPos.y, endPos.y );
-	pev->maxs.z = max( startPos.z, endPos.z );
+	pev->mins.x = Q_min( startPos.x, endPos.x );
+	pev->mins.y = Q_min( startPos.y, endPos.y );
+	pev->mins.z = Q_min( startPos.z, endPos.z );
+	pev->maxs.x = Q_max( startPos.x, endPos.x );
+	pev->maxs.y = Q_max( startPos.y, endPos.y );
+	pev->maxs.z = Q_max( startPos.z, endPos.z );
 	pev->mins = pev->mins - pev->origin;
 	pev->maxs = pev->maxs - pev->origin;
 
@@ -380,8 +380,8 @@ public:
 	void BeamUpdateVars( void );
 
 	int	m_active;
-	int	m_iszStartEntity;
-	int	m_iszEndEntity;
+	string_t	m_iszStartEntity;
+	string_t	m_iszEndEntity;
 	float	m_life;
 	int	m_boltWidth;
 	int	m_noiseAmplitude;
@@ -389,7 +389,7 @@ public:
 	int	m_speed;
 	float	m_restrike;
 	int	m_spriteTexture;
-	int	m_iszSpriteName;
+	string_t	m_iszSpriteName;
 	int	m_frameStart;
 
 	float	m_radius;
@@ -486,7 +486,7 @@ void CLightning::Spawn( void )
 
 void CLightning::Precache( void )
 {
-	m_spriteTexture = PRECACHE_MODEL( (char *)STRING( m_iszSpriteName ) );
+	m_spriteTexture = PRECACHE_MODEL( STRING( m_iszSpriteName ) );
 	CBeam::Precache();
 }
 
@@ -701,7 +701,7 @@ void CLightning::StrikeThink( void )
 			WRITE_BYTE( (int)pev->rendercolor.x );   // r, g, b
 			WRITE_BYTE( (int)pev->rendercolor.y );   // r, g, b
 			WRITE_BYTE( (int)pev->rendercolor.z );   // r, g, b
-			WRITE_BYTE( pev->renderamt );	// brightness
+			WRITE_BYTE( (int)pev->renderamt );	// brightness
 			WRITE_BYTE( m_speed );		// speed
 		MESSAGE_END();
 		DoSparks( pStart->pev->origin, pEnd->pev->origin );
@@ -763,7 +763,7 @@ void CLightning::Zap( const Vector &vecSrc, const Vector &vecDest )
 		WRITE_BYTE( (int)pev->rendercolor.x );   // r, g, b
 		WRITE_BYTE( (int)pev->rendercolor.y );   // r, g, b
 		WRITE_BYTE( (int)pev->rendercolor.z );   // r, g, b
-		WRITE_BYTE( pev->renderamt );	// brightness
+		WRITE_BYTE( (int)pev->renderamt );	// brightness
 		WRITE_BYTE( m_speed );		// speed
 	MESSAGE_END();
 #else
@@ -944,7 +944,7 @@ void CLaser::Spawn( void )
 		m_pSprite = NULL;
 
 	if( m_pSprite )
-		m_pSprite->SetTransparency( kRenderGlow, pev->rendercolor.x, pev->rendercolor.y, pev->rendercolor.z, pev->renderamt, pev->renderfx );
+		m_pSprite->SetTransparency( kRenderGlow, (int)pev->rendercolor.x, (int)pev->rendercolor.y, (int)pev->rendercolor.z, (int)pev->renderamt, (int)pev->renderfx );
 
 	if( pev->targetname && !( pev->spawnflags & SF_BEAM_STARTON ) )
 		TurnOff();
@@ -954,9 +954,9 @@ void CLaser::Spawn( void )
 
 void CLaser::Precache( void )
 {
-	pev->modelindex = PRECACHE_MODEL( (char *)STRING( pev->model ) );
+	pev->modelindex = PRECACHE_MODEL( STRING( pev->model ) );
 	if( m_iszSpriteName )
-		PRECACHE_MODEL( (char *)STRING( m_iszSpriteName ) );
+		PRECACHE_MODEL( STRING( m_iszSpriteName ) );
 }
 
 void CLaser::KeyValue( KeyValueData *pkvd )
@@ -1100,7 +1100,7 @@ void CGlow::Spawn( void )
 	pev->effects = 0;
 	pev->frame = 0;
 
-	PRECACHE_MODEL( (char *)STRING( pev->model ) );
+	PRECACHE_MODEL( STRING( pev->model ) );
 	SET_MODEL( ENT( pev ), STRING( pev->model ) );
 
 	m_maxFrame = (float) MODEL_FRAMES( pev->modelindex ) - 1;
@@ -1160,7 +1160,7 @@ void CSprite::Spawn( void )
 
 void CSprite::Precache( void )
 {
-	PRECACHE_MODEL( (char *)STRING( pev->model ) );
+	PRECACHE_MODEL( STRING( pev->model ) );
 
 	// Reset attachment after save/restore
 	if( pev->aiment )
@@ -1515,7 +1515,7 @@ void CEnvShooter::KeyValue( KeyValueData *pkvd )
 
 void CEnvShooter::Precache( void )
 {
-	m_iGibModelIndex = PRECACHE_MODEL( (char *)STRING( pev->model ) );
+	m_iGibModelIndex = PRECACHE_MODEL( STRING( pev->model ) );
 	CBreakable::MaterialSoundPrecache( (Materials)m_iGibMaterial );
 }
 
@@ -1619,7 +1619,7 @@ void CTestEffect::TestThink( void )
 		for( i = 0; i < m_iBeam; i++ )
 		{
 			t = ( gpGlobals->time - m_flBeamTime[i] ) / ( 3 + m_flStartTime - m_flBeamTime[i] );
-			m_pBeam[i]->SetBrightness( 255 * t );
+			m_pBeam[i]->SetBrightness( (int)( 255 * t ) );
 			// m_pBeam[i]->SetScrollRate( 20 * t );
 		}
 		pev->nextthink = gpGlobals->time + 0.1;
@@ -1749,9 +1749,9 @@ Vector CBlood::BloodPosition( CBaseEntity *pActivator )
 void CBlood::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
 {
 	if( pev->spawnflags & SF_BLOOD_STREAM )
-		UTIL_BloodStream( BloodPosition( pActivator ), Direction(), ( Color() == BLOOD_COLOR_RED ) ? 70 : Color(), BloodAmount() );
+		UTIL_BloodStream( BloodPosition( pActivator ), Direction(), ( Color() == BLOOD_COLOR_RED ) ? 70 : Color(), (int)BloodAmount() );
 	else
-		UTIL_BloodDrips( BloodPosition( pActivator ), Direction(), Color(), BloodAmount() );
+		UTIL_BloodDrips( BloodPosition( pActivator ), Direction(), Color(), (int)BloodAmount() );
 
 	if( pev->spawnflags & SF_BLOOD_DECAL )
 	{
@@ -1947,12 +1947,12 @@ void CFade::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType
 	{
 		if( pActivator->IsNetClient() )
 		{
-			UTIL_ScreenFade( pActivator, pev->rendercolor, Duration(), HoldTime(), pev->renderamt, fadeFlags );
+			UTIL_ScreenFade( pActivator, pev->rendercolor, Duration(), HoldTime(), (int)pev->renderamt, fadeFlags );
 		}
 	}
 	else
 	{
-		UTIL_ScreenFadeAll( pev->rendercolor, Duration(), HoldTime(), pev->renderamt, fadeFlags );
+		UTIL_ScreenFadeAll( pev->rendercolor, Duration(), HoldTime(), (int)pev->renderamt, fadeFlags );
 	}
 	SUB_UseTargets( this, USE_TOGGLE, 0 );
 }
@@ -2005,7 +2005,7 @@ void CMessage::Spawn( void )
 void CMessage::Precache( void )
 {
 	if( pev->noise )
-		PRECACHE_SOUND( (char *)STRING( pev->noise ) );
+		PRECACHE_SOUND( STRING( pev->noise ) );
 }
 
 void CMessage::KeyValue( KeyValueData *pkvd )
@@ -2040,16 +2040,15 @@ void CMessage::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useT
 		if( pActivator && pActivator->IsPlayer() )
 			pPlayer = pActivator;
 		else
-		{
 			pPlayer = CBaseEntity::Instance( g_engfuncs.pfnPEntityOfEntIndex( 1 ) );
-		}
+
 		if( pPlayer )
 			UTIL_ShowMessage( STRING( pev->message ), pPlayer );
 	}
+
 	if( pev->noise )
-	{
 		EMIT_SOUND( edict(), CHAN_BODY, STRING( pev->noise ), pev->scale, pev->speed );
-	}
+
 	if( pev->spawnflags & SF_MESSAGE_ONCE )
 		UTIL_Remove( this );
 
@@ -2071,7 +2070,7 @@ public:
 
 void CEnvFunnel::Precache( void )
 {
-	m_iSprite = PRECACHE_MODEL ( "sprites/flare6.spr" );
+	m_iSprite = PRECACHE_MODEL( "sprites/flare6.spr" );
 }
 
 LINK_ENTITY_TO_CLASS( env_funnel, CEnvFunnel )
@@ -2182,6 +2181,8 @@ public:
 
 void CItemSoda::Precache( void )
 {
+	PRECACHE_MODEL( "models/can.mdl" );
+	PRECACHE_SOUND( "weapons/g_bounce3.wav" );
 }
 
 LINK_ENTITY_TO_CLASS( item_sodacan, CItemSoda )
diff --git a/dlls/effects.h b/dlls/effects.h
index 031b8273..5dd55209 100644
--- a/dlls/effects.h
+++ b/dlls/effects.h
@@ -12,6 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
+#pragma once
 #ifndef EFFECTS_H
 #define EFFECTS_H
 
@@ -238,7 +239,7 @@ public:
 
 	inline int GetWidth( void )
 	{
-		return pev->scale;
+		return (int)pev->scale;
 	}
 
 	inline int GetNoise( void )
@@ -255,17 +256,17 @@ public:
 
 	inline int GetBrightness( void )
 	{
-		return pev->renderamt;
+		return (int)pev->renderamt;
 	}
 
 	inline int GetFrame( void )
 	{
-		return pev->frame;
+		return (int)pev->frame;
 	}
 
 	inline int GetScrollRate( void )
 	{
-		return pev->animtime;
+		return (int)pev->animtime;
 	}
 
 	// Call after you change start/end positions
@@ -321,7 +322,7 @@ public:
 	static	TYPEDESCRIPTION m_SaveData[];
 
 	CSprite	*m_pSprite;
-	int	m_iszSpriteName;
+	string_t	m_iszSpriteName;
 	Vector	m_firePosition;
 };
 #endif		//EFFECTS_H
diff --git a/dlls/egon.cpp b/dlls/egon.cpp
index ec4e78f9..7572205d 100644
--- a/dlls/egon.cpp
+++ b/dlls/egon.cpp
@@ -148,7 +148,7 @@ float CEgon::GetDischargeInterval( void )
 
 BOOL CEgon::HasAmmo( void )
 {
-	if( m_pPlayer->ammo_uranium <= 0 )
+	if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 )
 		return FALSE;
 
 	return TRUE;
@@ -326,7 +326,7 @@ void CEgon::Fire( const Vector &vecOrigSrc, const Vector &vecDir )
 		}
 	}
 #endif
-	float timedist;
+	float timedist = 0.0f;
 
 	switch( m_fireMode )
 	{
@@ -436,13 +436,13 @@ void CEgon::UpdateEffect( const Vector &startPoint, const Vector &endPoint, floa
 	}
 
 	m_pBeam->SetStartPos( endPoint );
-	m_pBeam->SetBrightness( 255 - ( timeBlend * 180 ) );
-	m_pBeam->SetWidth( 40 - ( timeBlend * 20 ) );
+	m_pBeam->SetBrightness( (int)( 255 - ( timeBlend * 180 )) );
+	m_pBeam->SetWidth( (int)( 40 - ( timeBlend * 20 ) ) );
 
 	if( m_fireMode == FIRE_WIDE )
-		m_pBeam->SetColor( 30 + ( 25 * timeBlend ), 30 + ( 30 * timeBlend ), 64 + 80 * fabs( sin( gpGlobals->time * 10 ) ) );
+		m_pBeam->SetColor( (int)( 30 + ( 25 * timeBlend ) ), (int)( 30 + ( 30 * timeBlend ) ), (int)( 64 + 80 * fabs( sin( gpGlobals->time * 10 ) ) ) );
 	else
-		m_pBeam->SetColor( 60 + ( 25 * timeBlend ), 120 + ( 30 * timeBlend ), 64 + 80 * fabs( sin( gpGlobals->time *10 ) ) );
+		m_pBeam->SetColor( (int)( 60 + ( 25 * timeBlend ) ), (int)( 120 + ( 30 * timeBlend ) ), (int)( 64 + 80 * fabs( sin( gpGlobals->time *10 ) ) ) );
 
 	UTIL_SetOrigin( m_pSprite->pev, endPoint );
 	m_pSprite->pev->frame += 8 * gpGlobals->frametime;
diff --git a/dlls/enginecallback.h b/dlls/enginecallback.h
index 1c5ec1b2..a9e37c26 100644
--- a/dlls/enginecallback.h
+++ b/dlls/enginecallback.h
@@ -14,10 +14,14 @@
 ****/
 #ifndef ENGINECALLBACK_H
 #define ENGINECALLBACK_H
+
 #pragma once
 
 #include "event_flags.h"
 
+// Fix warning in MSVC8
+#undef SERVER_EXECUTE
+
 // Must be provided by user of this code
 extern enginefuncs_t g_engfuncs;
 
diff --git a/dlls/explode.h b/dlls/explode.h
index e1c6cce0..001d93ca 100644
--- a/dlls/explode.h
+++ b/dlls/explode.h
@@ -12,6 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
+#pragma once
 #ifndef EXPLODE_H
 #define EXPLODE_H
 
@@ -26,4 +27,4 @@ extern DLL_GLOBAL short g_sModelIndexFireball;
 extern DLL_GLOBAL short g_sModelIndexSmoke;
 
 extern void ExplosionCreate( const Vector &center, const Vector &angles, edict_t *pOwner, int magnitude, BOOL doDamage );
-#endif			//EXPLODE_H
+#endif	// EXPLODE_H
diff --git a/dlls/exportdef.h b/dlls/exportdef.h
index 995613ff..363d8d12 100644
--- a/dlls/exportdef.h
+++ b/dlls/exportdef.h
@@ -1,3 +1,4 @@
+#pragma once
 #ifndef EXPORTDEF_H
 #define EXPORTDEF_H
 #if defined _WIN32 || defined __CYGWIN__
diff --git a/dlls/extdll.h b/dlls/extdll.h
index cbc7ebb9..d6ea4888 100644
--- a/dlls/extdll.h
+++ b/dlls/extdll.h
@@ -12,6 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
+#pragma once
 #ifndef EXTDLL_H
 #define EXTDLL_H
 
@@ -25,11 +26,13 @@
 #endif
 
 // Silence certain warnings
+#ifdef _MSC_VER
 #pragma warning(disable : 4244)		// int or float down-conversion
 #pragma warning(disable : 4305)		// int or float data truncation
 #pragma warning(disable : 4201)		// nameless struct/union
 #pragma warning(disable : 4514)		// unreferenced inline function removed
 #pragma warning(disable : 4100)		// unreferenced formal parameter
+#endif
 
 // Prevent tons of unused windows definitions
 #ifdef _WIN32
@@ -42,9 +45,13 @@
 #include "windows.h"
 #undef HSPRITE
 #else // _WIN32
+#ifndef FALSE
 #define FALSE 0
+#endif
+#ifndef TRUE
 #define TRUE (!FALSE)
-typedef unsigned long ULONG;
+#endif
+typedef unsigned int ULONG;
 typedef unsigned char BYTE;
 typedef int BOOL;
 #define MAX_PATH PATH_MAX
@@ -57,9 +64,13 @@ typedef int BOOL;
 #include "stdlib.h"
 #include "math.h"
 
+#if defined(__LP64__) || defined(__LLP64__) || defined(_WIN64) || (defined(__x86_64__) && !defined(__ILP32__) ) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__)
+  #define XASH_64BIT
+#endif
+
 // Header file containing definition of globalvars_t and entvars_t
 typedef unsigned int func_t;
-typedef unsigned int string_t;				// from engine's pr_comp.h;
+typedef int string_t;				// from engine's pr_comp.h;
 typedef float vec_t;				// needed before including progdefs.h
 
 // Vector class
@@ -78,11 +89,11 @@ typedef float vec_t;				// needed before including progdefs.h
 
 // Shared header between the client DLL and the game DLLs
 #include "cdll_dll.h"
-#ifndef min
-#define min(a,b)  (((a) < (b)) ? (a) : (b))
+#ifndef Q_min
+#define Q_min(a,b)  (((a) < (b)) ? (a) : (b))
 #endif
-#ifndef max
-#define max(a,b)  (((a) > (b)) ? (a) : (b))
+#ifndef Q_max
+#define Q_max(a,b)  (((a) > (b)) ? (a) : (b))
 #endif
 
 #endif //EXTDLL_H
diff --git a/dlls/flyingmonster.h b/dlls/flyingmonster.h
index 4dd87fb4..31ff4e33 100644
--- a/dlls/flyingmonster.h
+++ b/dlls/flyingmonster.h
@@ -13,7 +13,7 @@
 *
 ****/
 // Base class for flying monsters.  This overrides the movement test & execution code from CBaseMonster
-
+#pragma once
 #ifndef FLYINGMONSTER_H
 #define FLYINGMONSTER_H
 
diff --git a/dlls/func_break.cpp b/dlls/func_break.cpp
index 440275c7..1a25d317 100644
--- a/dlls/func_break.cpp
+++ b/dlls/func_break.cpp
@@ -116,7 +116,7 @@ void CBreakable::KeyValue( KeyValueData* pkvd )
 	else if( FStrEq( pkvd->szKeyName, "spawnobject" ) )
 	{
 		int object = atoi( pkvd->szValue );
-		if( object > 0 && object < ARRAYSIZE( pSpawnObjects ) )
+		if( object > 0 && object < (int)ARRAYSIZE( pSpawnObjects ) )
 			m_iszSpawnObject = MAKE_STRING( pSpawnObjects[object] );
 		pkvd->fHandled = TRUE;
 	}
@@ -271,7 +271,7 @@ void CBreakable::MaterialSoundPrecache( Materials precacheMaterial )
 
 	for( i = 0; i < soundCount; i++ )
 	{
-		PRECACHE_SOUND( (char *)pSoundList[i] );
+		PRECACHE_SOUND( pSoundList[i] );
 	}
 }
 
@@ -352,11 +352,11 @@ void CBreakable::Precache( void )
 	if( m_iszGibModel )
 		pGibName = STRING( m_iszGibModel );
 
-	m_idShard = PRECACHE_MODEL( (char *)pGibName );
+	m_idShard = PRECACHE_MODEL( pGibName );
 
 	// Precache the spawn item's data
 	if( m_iszSpawnObject )
-		UTIL_PrecacheOther( (char *)STRING( m_iszSpawnObject ) );
+		UTIL_PrecacheOther( STRING( m_iszSpawnObject ) );
 }
 
 // play shard sound when func_breakable takes damage.
@@ -365,7 +365,7 @@ void CBreakable::DamageSound( void )
 {
 	int pitch;
 	float fvol;
-	char *rgpsz[6];
+	const char *rgpsz[6];
 	int i = 0;
 	int material = m_Material;
 
@@ -586,7 +586,6 @@ void CBreakable::Die( void )
 {
 	Vector vecSpot;// shard origin
 	Vector vecVelocity;// shard velocity
-	CBaseEntity *pEntity = NULL;
 	char cFlag = 0;
 	int pitch;
 	float fvol;
@@ -759,7 +758,7 @@ void CBreakable::Die( void )
 	SetThink( &CBaseEntity::SUB_Remove );
 	pev->nextthink = pev->ltime + 0.1;
 	if( m_iszSpawnObject )
-		CBaseEntity::Create( (char *)STRING( m_iszSpawnObject ), VecBModelOrigin( pev ), pev->angles, edict() );
+		CBaseEntity::Create( STRING( m_iszSpawnObject ), VecBModelOrigin( pev ), pev->angles, edict() );
 
 	if( Explodable() )
 	{
@@ -806,7 +805,7 @@ public:
 
 	static TYPEDESCRIPTION m_SaveData[];
 
-	static char *m_soundNames[3];
+	static const char *m_soundNames[3];
 	int m_lastSound;	// no need to save/restore, just keeps the same sound from playing twice in a row
 	float m_maxSpeed;
 	float m_soundTime;
@@ -822,7 +821,7 @@ IMPLEMENT_SAVERESTORE( CPushable, CBreakable )
 
 LINK_ENTITY_TO_CLASS( func_pushable, CPushable )
 
-char *CPushable::m_soundNames[3] =
+const char *CPushable::m_soundNames[3] =
 {
 	"debris/pushbox1.wav",
 	"debris/pushbox2.wav",
@@ -851,7 +850,7 @@ void CPushable::Spawn( void )
 	UTIL_SetOrigin( pev, pev->origin );
 
 	// Multiply by area of the box's cross-section (assume 1000 units^3 standard volume)
-	pev->skin = ( pev->skin * ( pev->maxs.x - pev->mins.x ) * ( pev->maxs.y - pev->mins.y ) ) * 0.0005;
+	pev->skin = (int)( ( pev->skin * ( pev->maxs.x - pev->mins.x ) * ( pev->maxs.y - pev->mins.y ) ) * 0.0005 );
 	m_soundTime = 0;
 }
 
@@ -894,7 +893,7 @@ void CPushable::KeyValue( KeyValueData *pkvd )
 	}
 	else if( FStrEq( pkvd->szKeyName, "buoyancy" ) )
 	{
-		pev->skin = atof( pkvd->szValue );
+		pev->skin = atoi( pkvd->szValue );
 		pkvd->fHandled = TRUE;
 	}
 	else
diff --git a/dlls/func_break.h b/dlls/func_break.h
index ab5dda41..89c9f54e 100644
--- a/dlls/func_break.h
+++ b/dlls/func_break.h
@@ -12,6 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
+#pragma once
 #ifndef FUNC_BREAK_H
 #define FUNC_BREAK_H
 
@@ -84,7 +85,7 @@ public:
 	Explosions m_Explosion;
 	int m_idShard;
 	float m_angle;
-	int m_iszGibModel;
-	int m_iszSpawnObject;
+	string_t m_iszGibModel;
+	string_t m_iszSpawnObject;
 };
 #endif	// FUNC_BREAK_H
diff --git a/dlls/func_tank.cpp b/dlls/func_tank.cpp
index eab9e621..a3dba841 100644
--- a/dlls/func_tank.cpp
+++ b/dlls/func_tank.cpp
@@ -93,6 +93,7 @@ public:
 	BOOL StartControl( CBasePlayer* pController );
 	void StopControl( void );
 	void ControllerPostFrame( void );
+	virtual void StopFire( void ){}
 
 protected:
 	CBasePlayer* m_pController;
@@ -119,14 +120,14 @@ protected:
 
 	Vector		m_barrelPos;	// Length of the freakin barrel
 	float		m_spriteScale;	// Scale of any sprites we shoot
-	int			m_iszSpriteSmoke;
-	int			m_iszSpriteFlash;
+	string_t	m_iszSpriteSmoke;
+	string_t	m_iszSpriteFlash;
 	TANKBULLET	m_bulletType;	// Bullet type
 	int			m_iBulletDamage; // 0 means use Bullet type's default damage
 	
 	Vector		m_sightOrigin;	// Last sight of target
 	int			m_spread;		// firing spread
-	int			m_iszMaster;	// Master entity (game_team_master or multisource)
+	string_t	m_iszMaster;	// Master entity (game_team_master or multisource)
 };
 
 TYPEDESCRIPTION	CFuncTank::m_SaveData[] =
@@ -190,7 +191,7 @@ void CFuncTank::Spawn( void )
 
 	if( m_fireRate <= 0 )
 		m_fireRate = 1;
-	if( m_spread > MAX_FIRING_SPREADS )
+	if( m_spread > (int)MAX_FIRING_SPREADS )
 		m_spread = 0;
 
 	pev->oldorigin = pev->origin;
@@ -199,13 +200,13 @@ void CFuncTank::Spawn( void )
 void CFuncTank::Precache( void )
 {
 	if( m_iszSpriteSmoke )
-		PRECACHE_MODEL( (char *)STRING( m_iszSpriteSmoke ) );
+		PRECACHE_MODEL( STRING( m_iszSpriteSmoke ) );
 
 	if( m_iszSpriteFlash )
-		PRECACHE_MODEL( (char *)STRING( m_iszSpriteFlash ) );
+		PRECACHE_MODEL( STRING( m_iszSpriteFlash ) );
 
 	if( pev->noise )
-		PRECACHE_SOUND( (char *)STRING( pev->noise ) );
+		PRECACHE_SOUND( STRING( pev->noise ) );
 }
 
 void CFuncTank::KeyValue( KeyValueData *pkvd )
@@ -328,7 +329,7 @@ BOOL CFuncTank::OnControls( entvars_t *pevTest )
 	if( !( pev->spawnflags & SF_TANK_CANCONTROL ) )
 		return FALSE;
 
-	Vector offset = pevTest->origin - pev->origin;
+	//Vector offset = pevTest->origin - pev->origin;
 
 	if( ( m_vecControllerUsePos - pevTest->origin ).Length() < 30 )
 		return TRUE;
@@ -351,6 +352,7 @@ BOOL CFuncTank::StartControl( CBasePlayer *pController )
 	ALERT( at_console, "using TANK!\n");
 
 	m_pController = pController;
+	m_pController->m_pTank = this;
 	if( m_pController->m_pActiveItem )
 	{
 		m_pController->m_pActiveItem->Holster();
@@ -368,6 +370,8 @@ BOOL CFuncTank::StartControl( CBasePlayer *pController )
 
 void CFuncTank::StopControl()
 {
+	StopFire();
+
 	// TODO: bring back the controllers current weapon
 	if( !m_pController )
 		return;
@@ -380,6 +384,8 @@ void CFuncTank::StopControl()
 	m_pController->m_iHideHUD &= ~HIDEHUD_WEAPONS;
 
 	pev->nextthink = 0;
+
+	m_pController->m_pTank = NULL;
 	m_pController = NULL;
 
 	if( IsActive() )
@@ -426,7 +432,6 @@ void CFuncTank::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE use
 		}
 		else if( !m_pController && useType != USE_OFF )
 		{
-			( (CBasePlayer*)pActivator )->m_pTank = this;
 			StartControl( (CBasePlayer*)pActivator );
 		}
 		else
@@ -476,9 +481,9 @@ void CFuncTank::TrackTarget( void )
 {
 	TraceResult tr;
 	edict_t *pPlayer = FIND_CLIENT_IN_PVS( edict() );
-	BOOL updateTime = FALSE, lineOfSight;
+	BOOL updateTime = FALSE;
 	Vector angles, direction, targetPosition, barrelEnd;
-	edict_t *pTarget;
+	edict_t *pTarget = NULL;
 
 	// Get a position to aim for
 	if( m_pController )
@@ -515,12 +520,8 @@ void CFuncTank::TrackTarget( void )
 
 		UTIL_TraceLine( barrelEnd, targetPosition, dont_ignore_monsters, edict(), &tr );
 
-		lineOfSight = FALSE;
-		// No line of sight, don't track
 		if( tr.flFraction == 1.0 || tr.pHit == pTarget )
 		{
-			lineOfSight = TRUE;
-
 			CBaseEntity *pInstance = CBaseEntity::Instance(pTarget);
 			if( InRange( range ) && pInstance && pInstance->IsAlive() )
 			{
@@ -644,7 +645,7 @@ void CFuncTank::Fire( const Vector &barrelEnd, const Vector &forward, entvars_t
 		{
 			CSprite *pSprite = CSprite::SpriteCreate( STRING( m_iszSpriteSmoke ), barrelEnd, TRUE );
 			pSprite->AnimateAndDie( RANDOM_FLOAT( 15.0, 20.0 ) );
-			pSprite->SetTransparency( kRenderTransAlpha, pev->rendercolor.x, pev->rendercolor.y, pev->rendercolor.z, 255, kRenderFxNone );
+			pSprite->SetTransparency( kRenderTransAlpha, (int)pev->rendercolor.x, (int)pev->rendercolor.y, (int)pev->rendercolor.z, 255, kRenderFxNone );
 			pSprite->pev->velocity.z = RANDOM_FLOAT( 40, 80 );
 			pSprite->SetScale( m_spriteScale );
 		}
@@ -687,13 +688,13 @@ void CFuncTank::StartRotSound( void )
 	if( !pev->noise || ( pev->spawnflags & SF_TANK_SOUNDON ) )
 		return;
 	pev->spawnflags |= SF_TANK_SOUNDON;
-	EMIT_SOUND( edict(), CHAN_STATIC, (char*)STRING( pev->noise ), 0.85, ATTN_NORM );
+	EMIT_SOUND( edict(), CHAN_STATIC, STRING( pev->noise ), 0.85, ATTN_NORM );
 }
 
 void CFuncTank::StopRotSound( void )
 {
 	if( pev->spawnflags & SF_TANK_SOUNDON )
-		STOP_SOUND( edict(), CHAN_STATIC, (char*)STRING( pev->noise ) );
+		STOP_SOUND( edict(), CHAN_STATIC, STRING( pev->noise ) );
 	pev->spawnflags &= ~SF_TANK_SOUNDON;
 }
 
@@ -714,7 +715,7 @@ void CFuncTankGun::Fire( const Vector &barrelEnd, const Vector &forward, entvars
 		// FireBullets needs gpGlobals->v_up, etc.
 		UTIL_MakeAimVectors( pev->angles );
 
-		int bulletCount = ( gpGlobals->time - m_fireLast ) * m_fireRate;
+		int bulletCount = (int)( ( gpGlobals->time - m_fireLast ) * m_fireRate );
 		if( bulletCount > 0 )
 		{
 			for( i = 0; i < bulletCount; i++ )
@@ -754,6 +755,7 @@ public:
 	virtual int Save( CSave &save );
 	virtual int Restore( CRestore &restore );
 	static TYPEDESCRIPTION m_SaveData[];
+	virtual void StopFire( void );
 
 private:
 	CLaser *m_pLaser;
@@ -835,7 +837,7 @@ void CFuncTankLaser::Fire( const Vector &barrelEnd, const Vector &forward, entva
 		// TankTrace needs gpGlobals->v_up, etc.
 		UTIL_MakeAimVectors( pev->angles );
 
-		int bulletCount = ( gpGlobals->time - m_fireLast ) * m_fireRate;
+		int bulletCount = (int)( ( gpGlobals->time - m_fireLast ) * m_fireRate );
 		if( bulletCount )
 		{
 			for( i = 0; i < bulletCount; i++ )
@@ -858,6 +860,12 @@ void CFuncTankLaser::Fire( const Vector &barrelEnd, const Vector &forward, entva
 	}
 }
 
+void CFuncTankLaser::StopFire( void )
+{
+	if( m_pLaser )
+		m_pLaser->TurnOff();
+}
+
 class CFuncTankRocket : public CFuncTank
 {
 public:
@@ -879,12 +887,12 @@ void CFuncTankRocket::Fire( const Vector &barrelEnd, const Vector &forward, entv
 
 	if( m_fireLast != 0 )
 	{
-		int bulletCount = ( gpGlobals->time - m_fireLast ) * m_fireRate;
+		int bulletCount = (int)( ( gpGlobals->time - m_fireLast ) * m_fireRate );
 		if( bulletCount > 0 )
 		{
 			for( i = 0; i < bulletCount; i++ )
 			{
-				CBaseEntity *pRocket = CBaseEntity::Create( "rpg_rocket", barrelEnd, pev->angles, edict() );
+				CBaseEntity::Create( "rpg_rocket", barrelEnd, pev->angles, edict() );
 			}
 			CFuncTank::Fire( barrelEnd, forward, pev );
 		}
@@ -917,7 +925,7 @@ void CFuncTankMortar::Fire( const Vector &barrelEnd, const Vector &forward, entv
 {
 	if( m_fireLast != 0 )
 	{
-		int bulletCount = ( gpGlobals->time - m_fireLast ) * m_fireRate;
+		int bulletCount = (int)( ( gpGlobals->time - m_fireLast ) * m_fireRate );
 		// Only create 1 explosion
 		if( bulletCount > 0 )
 		{
diff --git a/dlls/game.cpp b/dlls/game.cpp
index 5575c3e2..8f664963 100644
--- a/dlls/game.cpp
+++ b/dlls/game.cpp
@@ -25,11 +25,13 @@ cvar_t timeleft		= { "mp_timeleft","0" , FCVAR_SERVER | FCVAR_UNLOGGED };	  // "
 
 // multiplayer server rules
 cvar_t teamplay		= { "mp_teamplay","0", FCVAR_SERVER };
-cvar_t fraglimit	= {"mp_fraglimit","0", FCVAR_SERVER };
+cvar_t fraglimit	= { "mp_fraglimit","0", FCVAR_SERVER };
 cvar_t timelimit	= { "mp_timelimit","0", FCVAR_SERVER };
 cvar_t friendlyfire	= { "mp_friendlyfire","0", FCVAR_SERVER };
 cvar_t falldamage	= { "mp_falldamage","0", FCVAR_SERVER };
 cvar_t weaponstay	= { "mp_weaponstay","0", FCVAR_SERVER };
+cvar_t selfgauss	= { "mp_selfgauss", "1", FCVAR_SERVER };
+cvar_t satchelfix	= { "mp_satchelfix", "0", FCVAR_SERVER };
 cvar_t forcerespawn	= { "mp_forcerespawn","1", FCVAR_SERVER };
 cvar_t flashlight	= { "mp_flashlight","0", FCVAR_SERVER };
 cvar_t aimcrosshair	= { "mp_autocrosshair","1", FCVAR_SERVER };
@@ -38,6 +40,9 @@ cvar_t teamlist		= { "mp_teamlist","hgrunt;scientist", FCVAR_SERVER };
 cvar_t teamoverride	= { "mp_teamoverride","1" };
 cvar_t defaultteam	= { "mp_defaultteam","0" };
 cvar_t allowmonsters	= { "mp_allowmonsters","0", FCVAR_SERVER };
+cvar_t bhopcap		= { "mp_bhopcap", "1", FCVAR_SERVER };
+
+cvar_t allow_spectators = { "allow_spectators", "0", FCVAR_SERVER };	// 0 prevents players from being spectators
 
 cvar_t mp_chattime	= { "mp_chattime","10", FCVAR_SERVER };
 
@@ -530,6 +535,7 @@ void GameDLLInit( void )
 	g_footsteps = CVAR_GET_POINTER( "mp_footsteps" );
 
 	CVAR_REGISTER( &displaysoundlist );
+	CVAR_REGISTER( &allow_spectators );
 
 	CVAR_REGISTER( &teamplay );
 	CVAR_REGISTER( &fraglimit );
@@ -541,6 +547,8 @@ void GameDLLInit( void )
 	CVAR_REGISTER( &friendlyfire );
 	CVAR_REGISTER( &falldamage );
 	CVAR_REGISTER( &weaponstay );
+	CVAR_REGISTER( &selfgauss );
+	CVAR_REGISTER( &satchelfix );
 	CVAR_REGISTER( &forcerespawn );
 	CVAR_REGISTER( &flashlight );
 	CVAR_REGISTER( &aimcrosshair );
@@ -549,6 +557,7 @@ void GameDLLInit( void )
 	CVAR_REGISTER( &teamoverride );
 	CVAR_REGISTER( &defaultteam );
 	CVAR_REGISTER( &allowmonsters );
+	CVAR_REGISTER( &bhopcap );
 
 	CVAR_REGISTER( &mp_chattime );
 
diff --git a/dlls/game.h b/dlls/game.h
index 925010f3..0dc5ba87 100644
--- a/dlls/game.h
+++ b/dlls/game.h
@@ -12,7 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
-
+#pragma once
 #ifndef GAME_H
 #define GAME_H
 
@@ -27,6 +27,8 @@ extern cvar_t timelimit;
 extern cvar_t friendlyfire;
 extern cvar_t falldamage;
 extern cvar_t weaponstay;
+extern cvar_t selfgauss;
+extern cvar_t satchelfix;
 extern cvar_t forcerespawn;
 extern cvar_t flashlight;
 extern cvar_t aimcrosshair;
diff --git a/dlls/gamerules.h b/dlls/gamerules.h
index 6ad470d0..04c6eea5 100644
--- a/dlls/gamerules.h
+++ b/dlls/gamerules.h
@@ -15,7 +15,9 @@
 //=========================================================
 // GameRules
 //=========================================================
-
+#pragma once
+#ifndef GAMERULES_H
+#define GAMERULES_H
 //#include "weapons.h"
 //#include "items.h"
 class CBasePlayerItem;
@@ -361,3 +363,4 @@ protected:
 };
 
 extern DLL_GLOBAL CGameRules *g_pGameRules;
+#endif // GAMERULES_H
diff --git a/dlls/gargantua.cpp b/dlls/gargantua.cpp
index 6c65b06f..f3155d7f 100644
--- a/dlls/gargantua.cpp
+++ b/dlls/gargantua.cpp
@@ -200,6 +200,7 @@ class CGargantua : public CBaseMonster
 public:
 	void Spawn( void );
 	void Precache( void );
+	void UpdateOnRemove();
 	void SetYawSpeed( void );
 	int Classify( void );
 	int TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType );
@@ -538,7 +539,6 @@ void CGargantua::FlameControls( float angleX, float angleY )
 void CGargantua::FlameUpdate( void )
 {
 	int		i;
-	static float	offset[2] = { 60, -60 };
 	TraceResult	trace;
 	Vector		vecStart, angleGun;
 	BOOL		streaks = FALSE;
@@ -759,7 +759,7 @@ void CGargantua::Spawn()
 //=========================================================
 void CGargantua::Precache()
 {
-	int i;
+	size_t i;
 
 	PRECACHE_MODEL( "models/garg.mdl" );
 	PRECACHE_MODEL( GARG_EYE_SPRITE_NAME );
@@ -770,39 +770,52 @@ void CGargantua::Precache()
 	PRECACHE_SOUND( GARG_STOMP_BUZZ_SOUND );
 
 	for( i = 0; i < ARRAYSIZE( pAttackHitSounds ); i++ )
-		PRECACHE_SOUND( (char *)pAttackHitSounds[i] );
+		PRECACHE_SOUND( pAttackHitSounds[i] );
 
 	for( i = 0; i < ARRAYSIZE( pBeamAttackSounds ); i++ )
-		PRECACHE_SOUND( (char *)pBeamAttackSounds[i] );
+		PRECACHE_SOUND( pBeamAttackSounds[i] );
 
 	for( i = 0; i < ARRAYSIZE( pAttackMissSounds ); i++ )
-		PRECACHE_SOUND( (char *)pAttackMissSounds[i] );
+		PRECACHE_SOUND( pAttackMissSounds[i] );
 
 	for( i = 0; i < ARRAYSIZE( pRicSounds ); i++ )
-		PRECACHE_SOUND( (char *)pRicSounds[i] );
+		PRECACHE_SOUND( pRicSounds[i] );
 
 	for( i = 0; i < ARRAYSIZE( pFootSounds ); i++ )
-		PRECACHE_SOUND( (char *)pFootSounds[i] );
+		PRECACHE_SOUND( pFootSounds[i] );
 
 	for( i = 0; i < ARRAYSIZE( pIdleSounds ); i++ )
-		PRECACHE_SOUND( (char *)pIdleSounds[i] );
+		PRECACHE_SOUND( pIdleSounds[i] );
 
 	for( i = 0; i < ARRAYSIZE( pAlertSounds ); i++ )
-		PRECACHE_SOUND((char *)pAlertSounds[i]);
+		PRECACHE_SOUND( pAlertSounds[i] );
 
 	for( i = 0; i < ARRAYSIZE( pPainSounds ); i++ )
-		PRECACHE_SOUND( (char *)pPainSounds[i] );
+		PRECACHE_SOUND( pPainSounds[i] );
 
 	for( i = 0; i < ARRAYSIZE( pAttackSounds ); i++ )
-		PRECACHE_SOUND( (char *)pAttackSounds[i] );
+		PRECACHE_SOUND( pAttackSounds[i] );
 
 	for( i = 0; i < ARRAYSIZE( pStompSounds ); i++ )
-		PRECACHE_SOUND( (char *)pStompSounds[i] );
+		PRECACHE_SOUND( pStompSounds[i] );
 
 	for( i = 0; i < ARRAYSIZE( pBreatheSounds ); i++ )
-		PRECACHE_SOUND( (char *)pBreatheSounds[i] );
+		PRECACHE_SOUND( pBreatheSounds[i] );
 }	
 
+void CGargantua::UpdateOnRemove()
+{
+	CBaseEntity::UpdateOnRemove();
+
+	if( m_pEyeGlow )
+	{
+		UTIL_Remove( m_pEyeGlow );
+		m_pEyeGlow = 0;
+	}
+
+	FlameDestroy();
+}
+
 void CGargantua::TraceAttack( entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType )
 {
 	ALERT( at_aiconsole, "CGargantua::TraceAttack\n" );
diff --git a/dlls/gauss.cpp b/dlls/gauss.cpp
index 14aac39b..62af08e1 100644
--- a/dlls/gauss.cpp
+++ b/dlls/gauss.cpp
@@ -24,6 +24,7 @@
 #include "soundent.h"
 #include "shake.h"
 #include "gamerules.h"
+#include "game.h"
 
 #define	GAUSS_PRIMARY_CHARGE_VOLUME	256// how loud gauss is while charging
 #define GAUSS_PRIMARY_FIRE_VOLUME	450// how loud gauss is when discharged
@@ -123,6 +124,12 @@ int CGauss::GetItemInfo( ItemInfo *p )
 	return 1;
 }
 
+BOOL CGauss::IsUseable()
+{
+	// Currently charging, allow the player to fire it first. - Solokiller
+	return CBasePlayerWeapon::IsUseable() || m_fInAttack != 0;
+}
+
 BOOL CGauss::Deploy()
 {
 	m_pPlayer->m_flPlayAftershock = 0.0;
@@ -145,7 +152,7 @@ void CGauss::PrimaryAttack()
 	if( m_pPlayer->pev->waterlevel == 3 )
 	{
 		PlayEmptySound();
-		m_flNextSecondaryAttack = m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.15;
+		m_flNextSecondaryAttack = m_flNextPrimaryAttack = GetNextAttackDelay( 0.15 );
 		return;
 	}
 
@@ -183,7 +190,7 @@ void CGauss::SecondaryAttack()
 			PlayEmptySound();
 		}
 
-		m_flNextSecondaryAttack = m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.5;
+		m_flNextSecondaryAttack = m_flNextPrimaryAttack = GetNextAttackDelay( 0.5 );
 		return;
 	}
 
@@ -224,6 +231,22 @@ void CGauss::SecondaryAttack()
 	}
 	else
 	{
+		// Moved to before the ammo burn.
+		// Because we drained 1 when m_InAttack == 0, then 1 again now before checking if we're out of ammo,
+		// this resuled in the player having -1 ammo, which in turn caused CanDeploy to think it could be deployed.
+		// This will need to be fixed further down the line by preventing negative ammo unless explicitly required (infinite ammo?),
+		// But this check will prevent the problem for now. - Solokiller
+		// TODO: investigate further.
+		if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 )
+                {
+                        // out of ammo! force the gun to fire
+                        StartFire();
+                        m_fInAttack = 0;
+                        m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 1.0;
+                        m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 1;
+                        return;
+                }
+
 		// during the charging process, eat one bit of ammo every once in a while
 		if( UTIL_WeaponTimeBase() >= m_pPlayer->m_flNextAmmoBurn && m_pPlayer->m_flNextAmmoBurn != 1000 )
 		{
@@ -243,23 +266,13 @@ void CGauss::SecondaryAttack()
 			}
 		}
 
-		if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 )
-		{
-			// out of ammo! force the gun to fire
-			StartFire();
-			m_fInAttack = 0;
-			m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 1.0;
-			m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 1;
-			return;
-		}
-
 		if( UTIL_WeaponTimeBase() >= m_pPlayer->m_flAmmoStartCharge )
 		{
 			// don't eat any more ammo after gun is fully charged.
 			m_pPlayer->m_flNextAmmoBurn = 1000;
 		}
 
-		int pitch = ( gpGlobals->time - m_pPlayer->m_flStartCharge ) * ( 150 / GetFullChargeTime() ) + 100;
+		int pitch = (int)( ( gpGlobals->time - m_pPlayer->m_flStartCharge ) * ( 150 / GetFullChargeTime() ) + 100 );
 		if( pitch > 250 ) 
 			 pitch = 250;
 		
@@ -359,11 +372,11 @@ void CGauss::StartFire( void )
 void CGauss::Fire( Vector vecOrigSrc, Vector vecDir, float flDamage )
 {
 	m_pPlayer->m_iWeaponVolume = GAUSS_PRIMARY_FIRE_VOLUME;
-
+	TraceResult tr, beam_tr;
+#ifndef CLIENT_DLL
 	Vector vecSrc = vecOrigSrc;
 	Vector vecDest = vecSrc + vecDir * 8192;
 	edict_t	*pentIgnore;
-	TraceResult tr, beam_tr;
 	float flMaxFrac = 1.0;
 	int nTotal = 0;
 	int fHasPunched = 0;
@@ -371,8 +384,7 @@ void CGauss::Fire( Vector vecOrigSrc, Vector vecDir, float flDamage )
 	int nMaxHits = 10;
 
 	pentIgnore = ENT( m_pPlayer->pev );
-
-#ifdef CLIENT_DLL
+#else
 	if( m_fPrimaryFire == false )
 		 g_irunninggausspred = true;
 #endif	
@@ -501,6 +513,10 @@ void CGauss::Fire( Vector vecOrigSrc, Vector vecDir, float flDamage )
 
 							vecSrc = beam_tr.vecEndPos + vecDir;
 						}
+						else if( !selfgauss.value )
+						{
+							flDamage = 0;
+						}
 					}
 					else
 					{
@@ -559,6 +575,10 @@ void CGauss::WeaponIdle( void )
 		StartFire();
 		m_fInAttack = 0;
 		m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 2.0;
+
+		// Need to set m_flNextPrimaryAttack so the weapon gets a chance to complete its secondary fire animation. - Solokiller
+		if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 )
+			m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.5;
 	}
 	else
 	{
diff --git a/dlls/genericmonster.cpp b/dlls/genericmonster.cpp
index c40bb802..3cc0acc6 100644
--- a/dlls/genericmonster.cpp
+++ b/dlls/genericmonster.cpp
@@ -88,7 +88,7 @@ void CGenericMonster::HandleAnimEvent( MonsterEvent_t *pEvent )
 //=========================================================
 int CGenericMonster::ISoundMask( void )
 {
-	return NULL;
+	return 0;
 }
 
 //=========================================================
@@ -131,7 +131,7 @@ void CGenericMonster::Spawn()
 //=========================================================
 void CGenericMonster::Precache()
 {
-	PRECACHE_MODEL( (char *)STRING( pev->model ) );
+	PRECACHE_MODEL( STRING( pev->model ) );
 }
 
 //=========================================================
diff --git a/dlls/ggrenade.cpp b/dlls/ggrenade.cpp
index 64d9f3cf..0ca516c4 100644
--- a/dlls/ggrenade.cpp
+++ b/dlls/ggrenade.cpp
@@ -49,7 +49,7 @@ void CGrenade::Explode( Vector vecSrc, Vector vecAim )
 // UNDONE: temporary scorching for PreAlpha - find a less sleazy permenant solution.
 void CGrenade::Explode( TraceResult *pTrace, int bitsDamageType )
 {
-	float flRndSound;// sound randomizer
+	// float flRndSound;// sound randomizer
 
 	pev->model = iStringNull;//invisible
 	pev->solid = SOLID_NOT;// intangible
@@ -102,7 +102,7 @@ void CGrenade::Explode( TraceResult *pTrace, int bitsDamageType )
 		UTIL_DecalTrace( pTrace, DECAL_SCORCH2 );
 	}
 
-	flRndSound = RANDOM_FLOAT( 0, 1 );
+	//flRndSound = RANDOM_FLOAT( 0, 1 );
 
 	switch( RANDOM_LONG( 0, 2 ) )
 	{
@@ -144,8 +144,8 @@ void CGrenade::Smoke( void )
 			WRITE_COORD( pev->origin.y );
 			WRITE_COORD( pev->origin.z );
 			WRITE_SHORT( g_sModelIndexSmoke );
-			WRITE_BYTE( ( pev->dmg - 50 ) * 0.80 ); // scale * 10
-			WRITE_BYTE( 12  ); // framerate
+			WRITE_BYTE( (int)( ( pev->dmg - 50 ) * 0.80 ) ); // scale * 10
+			WRITE_BYTE( 12 ); // framerate
 		MESSAGE_END();
 	}
 	UTIL_Remove( this );
@@ -165,7 +165,7 @@ void CGrenade::DetonateUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_T
 
 void CGrenade::PreDetonate( void )
 {
-	CSoundEnt::InsertSound ( bits_SOUND_DANGER, pev->origin, 400, 0.3 );
+	CSoundEnt::InsertSound( bits_SOUND_DANGER, pev->origin, 400, 0.3 );
 
 	SetThink( &CGrenade::Detonate );
 	pev->nextthink = gpGlobals->time + 1;
@@ -207,7 +207,7 @@ void CGrenade::DangerSoundThink( void )
 		return;
 	}
 
-	CSoundEnt::InsertSound ( bits_SOUND_DANGER, pev->origin + pev->velocity * 0.5, pev->velocity.Length(), 0.2 );
+	CSoundEnt::InsertSound( bits_SOUND_DANGER, pev->origin + pev->velocity * 0.5, (int)pev->velocity.Length(), 0.2 );
 	pev->nextthink = gpGlobals->time + 0.2;
 
 	if( pev->waterlevel != 0 )
@@ -253,7 +253,7 @@ void CGrenade::BounceTouch( CBaseEntity *pOther )
 		// go ahead and emit the danger sound.
 
 		// register a radius louder than the explosion, so we make sure everyone gets out of the way
-		CSoundEnt::InsertSound( bits_SOUND_DANGER, pev->origin, pev->dmg / 0.4, 0.3 );
+		CSoundEnt::InsertSound( bits_SOUND_DANGER, pev->origin, (int)( pev->dmg / 0.4 ), 0.3 );
 		m_fRegisteredSound = TRUE;
 	}
 
diff --git a/dlls/glock.cpp b/dlls/glock.cpp
index 22d16012..568a59ad 100644
--- a/dlls/glock.cpp
+++ b/dlls/glock.cpp
@@ -104,6 +104,18 @@ int CGlock::GetItemInfo( ItemInfo *p )
 	return 1;
 }
 
+int CGlock::AddToPlayer( CBasePlayer *pPlayer )
+{
+	if( CBasePlayerWeapon::AddToPlayer( pPlayer ) )
+	{
+		MESSAGE_BEGIN( MSG_ONE, gmsgWeapPickup, NULL, pPlayer->pev );
+			WRITE_BYTE( m_iId );
+		MESSAGE_END();
+		return TRUE;
+	}
+	return FALSE;
+}
+
 BOOL CGlock::Deploy()
 {
 	pev->body = m_fSilencerOn ? SILENCER_ON : SILENCER_OFF;
@@ -177,7 +189,7 @@ void CGlock::GlockFire( float flSpread, float flCycleTime, BOOL fUseAutoAim )
 		if( m_fFireOnEmpty )
 		{
 			PlayEmptySound();
-			m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.2;
+			m_flNextPrimaryAttack = GetNextAttackDelay( 0.2 );
 		}
 
 		return;
@@ -228,7 +240,7 @@ void CGlock::GlockFire( float flSpread, float flCycleTime, BOOL fUseAutoAim )
 
 	PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usFireGlock1, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, body, 0, ( m_iClip == 0 ) ? 1 : 0, m_fSilencerOn );
 
-	m_flNextPrimaryAttack = m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + flCycleTime;
+	m_flNextPrimaryAttack = m_flNextSecondaryAttack = GetNextAttackDelay( flCycleTime );
 
 	if( !m_iClip && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 )
 		// HEV suit - indicate out of ammo condition
@@ -239,8 +251,8 @@ void CGlock::GlockFire( float flSpread, float flCycleTime, BOOL fUseAutoAim )
 
 void CGlock::Reload( void )
 {
-	if( m_pPlayer->ammo_9mm <= 0 )
-		return;
+	if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 || m_iClip == GLOCK_MAX_CLIP )
+                return;
 
 	int body = m_fSilencerOn ? SILENCER_ON : SILENCER_OFF;
 
diff --git a/dlls/gman.cpp b/dlls/gman.cpp
index bdfb60d4..377755f6 100644
--- a/dlls/gman.cpp
+++ b/dlls/gman.cpp
@@ -109,7 +109,7 @@ void CGMan::HandleAnimEvent( MonsterEvent_t *pEvent )
 //=========================================================
 int CGMan::ISoundMask( void )
 {
-	return NULL;
+	return 0;
 }
 
 //=========================================================
@@ -149,7 +149,7 @@ void CGMan::StartTask( Task_t *pTask )
 	switch( pTask->iTask )
 	{
 	case TASK_WAIT:
-		if( m_hPlayer == NULL )
+		if( m_hPlayer == 0 )
 		{
 			m_hPlayer = UTIL_FindEntityByClassname( NULL, "player" );
 		}
@@ -164,7 +164,7 @@ void CGMan::RunTask( Task_t *pTask )
 	{
 	case TASK_WAIT:
 		// look at who I'm talking to
-		if( m_flTalkTime > gpGlobals->time && m_hTalkTarget != NULL )
+		if( m_flTalkTime > gpGlobals->time && m_hTalkTarget != 0 )
 		{
 			float yaw = VecToYaw( m_hTalkTarget->pev->origin - pev->origin ) - pev->angles.y;
 
@@ -177,7 +177,7 @@ void CGMan::RunTask( Task_t *pTask )
 			SetBoneController( 0, yaw );
 		}
 		// look at player, but only if playing a "safe" idle animation
-		else if( m_hPlayer != NULL && pev->sequence == 0 )
+		else if( m_hPlayer != 0 && pev->sequence == 0 )
 		{
 			float yaw = VecToYaw( m_hPlayer->pev->origin - pev->origin ) - pev->angles.y;
 
diff --git a/dlls/h_battery.cpp b/dlls/h_battery.cpp
index fdb7c645..976a5733 100644
--- a/dlls/h_battery.cpp
+++ b/dlls/h_battery.cpp
@@ -91,7 +91,7 @@ void CRecharge::Spawn()
 	UTIL_SetOrigin( pev, pev->origin );		// set size and link into world
 	UTIL_SetSize( pev, pev->mins, pev->maxs );
 	SET_MODEL( ENT( pev ), STRING( pev->model ) );
-	m_iJuice = gSkillData.suitchargerCapacity;
+	m_iJuice = (int)gSkillData.suitchargerCapacity;
 	pev->frame = 0;			
 }
 
@@ -172,7 +172,7 @@ void CRecharge::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE use
 
 void CRecharge::Recharge( void )
 {
-	m_iJuice = gSkillData.suitchargerCapacity;
+	m_iJuice = (int)gSkillData.suitchargerCapacity;
 	pev->frame = 0;	
 	SetThink( &CBaseEntity::SUB_DoNothing );
 }
@@ -185,7 +185,7 @@ void CRecharge::Off( void )
 
 	m_iOn = 0;
 
-	if( ( !m_iJuice ) &&  ( ( m_iReactivate = g_pGameRules->FlHEVChargerRechargeTime() ) > 0 ) )
+	if( ( !m_iJuice ) &&  ( ( m_iReactivate = (int)g_pGameRules->FlHEVChargerRechargeTime() ) > 0 ) )
 	{
 		pev->nextthink = pev->ltime + m_iReactivate;
 		SetThink( &CRecharge::Recharge );
diff --git a/dlls/h_cine.cpp b/dlls/h_cine.cpp
index fc503171..bb07e02c 100644
--- a/dlls/h_cine.cpp
+++ b/dlls/h_cine.cpp
@@ -31,7 +31,7 @@
 class CLegacyCineMonster : public CBaseMonster
 {
 public:
-	void CineSpawn( char *szModel );
+	void CineSpawn( const char *szModel );
 	void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
 	void EXPORT CineThink( void );
 	void Pain( void );
@@ -103,7 +103,7 @@ LINK_ENTITY_TO_CLASS( monster_cine3_barney, CCine3Barney )
 // ********** Scientist SPAWN **********
 //
 
-void CLegacyCineMonster :: CineSpawn( char *szModel )
+void CLegacyCineMonster :: CineSpawn( const char *szModel )
 {
 	PRECACHE_MODEL(szModel);
 	SET_MODEL(ENT(pev), szModel);
diff --git a/dlls/h_cycler.cpp b/dlls/h_cycler.cpp
index d685ac36..5daad4a2 100644
--- a/dlls/h_cycler.cpp
+++ b/dlls/h_cycler.cpp
@@ -34,7 +34,7 @@
 class CCycler : public CBaseMonster
 {
 public:
-	void GenericCyclerSpawn(char *szModel, Vector vecMin, Vector vecMax);
+	void GenericCyclerSpawn( const char *szModel, Vector vecMin, Vector vecMax );
 	virtual int ObjectCaps( void ) { return ( CBaseEntity::ObjectCaps() | FCAP_IMPULSE_USE ); }
 	int TakeDamage( entvars_t* pevInflictor, entvars_t* pevAttacker, float flDamage, int bitsDamageType );
 	void Spawn( void );
@@ -67,7 +67,7 @@ class CGenericCycler : public CCycler
 public:
 	void Spawn( void )
 	{
-		GenericCyclerSpawn( (char *)STRING( pev->model ), Vector( -16, -16, 0 ), Vector( 16, 16, 72 ) );
+		GenericCyclerSpawn( STRING( pev->model ), Vector( -16, -16, 0 ), Vector( 16, 16, 72 ) );
 	}
 };
 
@@ -92,7 +92,7 @@ void CCyclerProbe::Spawn( void )
 }
 
 // Cycler member functions
-void CCycler::GenericCyclerSpawn( char *szModel, Vector vecMin, Vector vecMax )
+void CCycler::GenericCyclerSpawn( const char *szModel, Vector vecMin, Vector vecMax )
 {
 	if( !szModel || !*szModel )
 	{
@@ -255,7 +255,7 @@ void CCyclerSprite::Spawn( void )
 	m_animate		= 1;
 	m_lastTime		= gpGlobals->time;
 
-	PRECACHE_MODEL( (char *)STRING( pev->model ) );
+	PRECACHE_MODEL( STRING( pev->model ) );
 	SET_MODEL( ENT( pev ), STRING( pev->model ) );
 
 	m_maxFrame = (float)MODEL_FRAMES( pev->modelindex ) - 1;
@@ -314,7 +314,7 @@ void CWeaponCycler::Spawn()
 	pev->solid = SOLID_SLIDEBOX;
 	pev->movetype = MOVETYPE_NONE;
 
-	PRECACHE_MODEL( (char *)STRING( pev->model ) );
+	PRECACHE_MODEL( STRING( pev->model ) );
 	SET_MODEL( ENT( pev ), STRING( pev->model ) );
 	m_iszModel = pev->model;
 	m_iModel = pev->modelindex;
@@ -401,18 +401,18 @@ void CWreckage::Spawn( void )
 
 	if( pev->model )
 	{
-		PRECACHE_MODEL( (char *)STRING( pev->model ) );
+		PRECACHE_MODEL( STRING( pev->model ) );
 		SET_MODEL( ENT( pev ), STRING( pev->model ) );
 	}
 	// pev->scale = 5.0;
 
-	m_flStartTime = gpGlobals->time;
+	m_flStartTime = (int)gpGlobals->time;
 }
 
 void CWreckage::Precache()
 {
 	if( pev->model )
-		PRECACHE_MODEL( (char *)STRING( pev->model ) );
+		PRECACHE_MODEL( STRING( pev->model ) );
 }
 
 void CWreckage::Think( void )
diff --git a/dlls/handgrenade.cpp b/dlls/handgrenade.cpp
index a7194aeb..71c29e93 100644
--- a/dlls/handgrenade.cpp
+++ b/dlls/handgrenade.cpp
@@ -99,8 +99,13 @@ void CHandGrenade::Holster( int skiplocal /* = 0 */ )
 	{
 		// no more grenades!
 		m_pPlayer->pev->weapons &= ~( 1 << WEAPON_HANDGRENADE );
-		SetThink( &CBasePlayerItem::DestroyItem );
-		pev->nextthink = gpGlobals->time + 0.1;
+		DestroyItem();
+	}
+
+	if( m_flStartThrow )
+	{
+		m_flStartThrow = 0;
+		m_flReleaseThrow = 0;
 	}
 
 	EMIT_SOUND( ENT( m_pPlayer->pev ), CHAN_WEAPON, "common/null.wav", 1.0, ATTN_NORM );
@@ -170,7 +175,7 @@ void CHandGrenade::WeaponIdle( void )
 
 		m_flReleaseThrow = 0;
 		m_flStartThrow = 0;
-		m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.5;
+		m_flNextPrimaryAttack = GetNextAttackDelay( 0.5 );
 		m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.5;
 
 		m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]--;
@@ -180,7 +185,7 @@ void CHandGrenade::WeaponIdle( void )
 			// just threw last grenade
 			// set attack times in the future, and weapon idle in the future so we can see the whole throw
 			// animation, weapon idle will automatically retire the weapon for us.
-			m_flTimeWeaponIdle = m_flNextSecondaryAttack = m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.5;// ensure that the animation can finish playing
+			m_flTimeWeaponIdle = m_flNextSecondaryAttack = m_flNextPrimaryAttack = GetNextAttackDelay( 0.5 );// ensure that the animation can finish playing
 		}
 		return;
 	}
diff --git a/dlls/hassassin.cpp b/dlls/hassassin.cpp
index 5aac1e53..f51ed4cb 100644
--- a/dlls/hassassin.cpp
+++ b/dlls/hassassin.cpp
@@ -185,7 +185,7 @@ void CHAssassin::SetYawSpeed( void )
 //=========================================================
 void CHAssassin::Shoot( void )
 {
-	if( m_hEnemy == NULL )
+	if( m_hEnemy == 0 )
 	{
 		return;
 	}
@@ -597,7 +597,7 @@ IMPLEMENT_CUSTOM_SCHEDULES( CHAssassin, CBaseMonster )
 //=========================================================
 BOOL CHAssassin::CheckMeleeAttack1( float flDot, float flDist )
 {
-	if( m_flNextJump < gpGlobals->time && ( flDist <= 128 || HasMemory( bits_MEMORY_BADJUMP ) ) && m_hEnemy != NULL )
+	if( m_flNextJump < gpGlobals->time && ( flDist <= 128 || HasMemory( bits_MEMORY_BADJUMP ) ) && m_hEnemy != 0 )
 	{
 		TraceResult tr;
 
@@ -687,7 +687,7 @@ void CHAssassin::RunAI( void )
 
 	// always visible if moving
 	// always visible is not on hard
-	if( g_iSkillLevel != SKILL_HARD || m_hEnemy == NULL || pev->deadflag != DEAD_NO || m_Activity == ACT_RUN || m_Activity == ACT_WALK || !( pev->flags & FL_ONGROUND ) )
+	if( g_iSkillLevel != SKILL_HARD || m_hEnemy == 0 || pev->deadflag != DEAD_NO || m_Activity == ACT_RUN || m_Activity == ACT_WALK || !( pev->flags & FL_ONGROUND ) )
 		m_iTargetRanderamt = 255;
 	else
 		m_iTargetRanderamt = 20;
@@ -699,12 +699,12 @@ void CHAssassin::RunAI( void )
 			EMIT_SOUND( ENT( pev ), CHAN_BODY, "debris/beamstart1.wav", 0.2, ATTN_NORM );
 		}
 
-		pev->renderamt = max( pev->renderamt - 50, m_iTargetRanderamt );
+		pev->renderamt = Q_max( pev->renderamt - 50, m_iTargetRanderamt );
 		pev->rendermode = kRenderTransTexture;
 	}
 	else if( pev->renderamt < m_iTargetRanderamt )
 	{
-		pev->renderamt = min( pev->renderamt + 50, m_iTargetRanderamt );
+		pev->renderamt = Q_min( pev->renderamt + 50, m_iTargetRanderamt );
 		if( pev->renderamt == 255 )
 			pev->rendermode = kRenderNormal;
 	}
diff --git a/dlls/headcrab.cpp b/dlls/headcrab.cpp
index 7248f922..079349b4 100644
--- a/dlls/headcrab.cpp
+++ b/dlls/headcrab.cpp
@@ -190,7 +190,7 @@ void CHeadCrab::HandleAnimEvent( MonsterEvent_t *pEvent )
 			UTIL_MakeVectors( pev->angles );
 
 			Vector vecJumpDir;
-			if( m_hEnemy != NULL )
+			if( m_hEnemy != 0 )
 			{
 				float gravity = g_psv_gravity->value;
 				if( gravity <= 1 )
@@ -510,7 +510,7 @@ Schedule_t *CBabyCrab::GetScheduleOfType( int Type )
 	switch( Type )
 	{
 		case SCHED_FAIL:	// If you fail, try to jump!
-			if( m_hEnemy != NULL )
+			if( m_hEnemy != 0 )
 				return slHCRangeAttack1Fast;
 		break;
 		case SCHED_RANGE_ATTACK1:
diff --git a/dlls/healthkit.cpp b/dlls/healthkit.cpp
index e1b22467..99d53d35 100644
--- a/dlls/healthkit.cpp
+++ b/dlls/healthkit.cpp
@@ -159,7 +159,7 @@ void CWallHealth::Spawn()
 	UTIL_SetOrigin( pev, pev->origin );		// set size and link into world
 	UTIL_SetSize( pev, pev->mins, pev->maxs );
 	SET_MODEL( ENT( pev ), STRING( pev->model ) );
-	m_iJuice = gSkillData.healthchargerCapacity;
+	m_iJuice = (int)gSkillData.healthchargerCapacity;
 	pev->frame = 0;
 }
 
@@ -230,7 +230,7 @@ void CWallHealth::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE u
 void CWallHealth::Recharge( void )
 {
 	EMIT_SOUND( ENT( pev ), CHAN_ITEM, "items/medshot4.wav", 1.0, ATTN_NORM );
-	m_iJuice = gSkillData.healthchargerCapacity;
+	m_iJuice = (int)gSkillData.healthchargerCapacity;
 	pev->frame = 0;			
 	SetThink( &CBaseEntity::SUB_DoNothing );
 }
@@ -243,7 +243,7 @@ void CWallHealth::Off( void )
 
 	m_iOn = 0;
 
-	if( ( !m_iJuice ) && ( ( m_iReactivate = g_pGameRules->FlHealthChargerRechargeTime() ) > 0 ) )
+	if( ( !m_iJuice ) && ( ( m_iReactivate = (int)g_pGameRules->FlHealthChargerRechargeTime() ) > 0 ) )
 	{
 		pev->nextthink = pev->ltime + m_iReactivate;
 		SetThink( &CWallHealth::Recharge );
diff --git a/dlls/hgrunt.cpp b/dlls/hgrunt.cpp
index 43023084..1badc0ed 100644
--- a/dlls/hgrunt.cpp
+++ b/dlls/hgrunt.cpp
@@ -160,7 +160,7 @@ const char *CHGrunt::pGruntSentences[] =
 	"HG_TAUNT", // say rude things
 };
 
-enum
+typedef enum
 {
 	HGRUNT_SENT_NONE = -1,
 	HGRUNT_SENT_GREN = 0,
@@ -317,7 +317,7 @@ void CHGrunt::JustSpoke( void )
 //=========================================================
 void CHGrunt::PrescheduleThink( void )
 {
-	if( InSquad() && m_hEnemy != NULL )
+	if( InSquad() && m_hEnemy != 0 )
 	{
 		if( HasConditions( bits_COND_SEE_ENEMY ) )
 		{
@@ -364,9 +364,9 @@ BOOL CHGrunt::FCanCheckAttacks( void )
 //=========================================================
 BOOL CHGrunt::CheckMeleeAttack1( float flDot, float flDist )
 {
-	CBaseMonster *pEnemy;
+	CBaseMonster *pEnemy = 0;
 
-	if( m_hEnemy != NULL )
+	if( m_hEnemy != 0 )
 	{
 		pEnemy = m_hEnemy->MyMonsterPointer();
 
@@ -754,7 +754,7 @@ Vector CHGrunt::GetGunPosition()
 //=========================================================
 void CHGrunt::Shoot( void )
 {
-	if( m_hEnemy == NULL )
+	if( m_hEnemy == 0 )
 	{
 		return;
 	}
@@ -781,7 +781,7 @@ void CHGrunt::Shoot( void )
 //=========================================================
 void CHGrunt::Shotgun( void )
 {
-	if( m_hEnemy == NULL )
+	if( m_hEnemy == 0 )
 	{
 		return;
 	}
@@ -926,6 +926,7 @@ void CHGrunt::HandleAnimEvent( MonsterEvent_t *pEvent )
 			}
 
 		}
+			break;
 		default:
 			CSquadMonster::HandleAnimEvent( pEvent );
 			break;
@@ -947,24 +948,20 @@ void CHGrunt::Spawn()
 		m_iGruntFlags |= GF_ZSOLDIER;
 	}
 
-	char* szModel = (char*)STRING( pev->model );
-
 	// If this is a zombie soldier with a regular grunt model,
 	// switch to appropriate model.
-	if( IsZombieSoldier() && !FStrEq( szModel, "models/zgrunt.mdl" ) )
+	if( IsZombieSoldier() )
 	{
-		szModel = "models/zgrunt.mdl";
-		pev->model = ALLOC_STRING( szModel );
+		pev->model = MAKE_STRING( "models/zgrunt.mdl" );
 	}
 	else
 	{
 		// Pick regular grunt model.
-		szModel = "models/hgrunt.mdl";
-		pev->model = ALLOC_STRING( szModel );
+		pev->model = MAKE_STRING( "models/hgrunt.mdl" );
 	}
 
 	// Set new model.
-	SET_MODEL( ENT( pev ), (char*)STRING( pev->model ) );
+	SET_MODEL( ENT( pev ), STRING( pev->model ) );
 
 	UTIL_SetSize( pev, VEC_HUMAN_HULL_MIN, VEC_HUMAN_HULL_MAX );
 
@@ -1833,7 +1830,7 @@ IMPLEMENT_CUSTOM_SCHEDULES( CHGrunt, CSquadMonster )
 void CHGrunt::SetActivity( Activity NewActivity )
 {
 	int iSequence = ACTIVITY_NOT_AVAILABLE;
-	void *pmodel = GET_MODEL_PTR( ENT( pev ) );
+	//void *pmodel = GET_MODEL_PTR( ENT( pev ) );
 
 	switch( NewActivity )
 	{
@@ -2042,10 +2039,10 @@ Schedule_t *CHGrunt::GetSchedule( void )
 						// before he starts pluggin away.
 						if( FOkToSpeak() )// && RANDOM_LONG( 0, 1 ) )
 						{
-							if( ( m_hEnemy != NULL ) && m_hEnemy->IsPlayer() )
+							if( ( m_hEnemy != 0 ) && m_hEnemy->IsPlayer() )
 								// player
 								SENTENCEG_PlayRndSz( ENT( pev ), "HG_ALERT", HGRUNT_SENTENCE_VOLUME, GRUNT_ATTN, 0, m_voicePitch );
-							else if( ( m_hEnemy != NULL ) &&
+							else if( ( m_hEnemy != 0 ) &&
 									( m_hEnemy->Classify() != CLASS_PLAYER_ALLY ) && 
 									( m_hEnemy->Classify() != CLASS_HUMAN_PASSIVE ) && 
 									( m_hEnemy->Classify() != CLASS_MACHINE ) )
@@ -2082,7 +2079,7 @@ Schedule_t *CHGrunt::GetSchedule( void )
 				// 10% chance of flinch.
 				int iPercent = RANDOM_LONG( 0, 99 );
 
-				if( iPercent <= 90 && m_hEnemy != NULL )
+				if( iPercent <= 90 && m_hEnemy != 0 )
 				{
 					// only try to take cover if we actually have an enemy!
 
@@ -2336,7 +2333,7 @@ Schedule_t *CHGrunt::GetScheduleOfType( int Type )
 		}
 	case SCHED_FAIL:
 		{
-			if( m_hEnemy != NULL )
+			if( m_hEnemy != 0 )
 			{
 				// grunt has an enemy, so pick a different default fail schedule most likely to help recover.
 				return &slGruntCombatFail[0];
@@ -2436,7 +2433,7 @@ void CHGruntRepel::RepelUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_
 //=========================================================
 // DEAD HGRUNT PROP
 //=========================================================
-char *CDeadHGrunt::m_szPoses[] = { "deadstomach", "deadside", "deadsitting" };
+const char *CDeadHGrunt::m_szPoses[] = { "deadstomach", "deadside", "deadsitting" };
 
 void CDeadHGrunt::KeyValue( KeyValueData *pkvd )
 {
@@ -2459,26 +2456,22 @@ void CDeadHGrunt::Spawn( void )
 	PRECACHE_MODEL( "models/hgrunt.mdl" );
 	PRECACHE_MODEL( "models/zgrunt.mdl" );
 
-	char* szModel = (char*)STRING( pev->model );
-
+	// If this is a zombie soldier with a regular grunt model,
+	// switch to appropriate model.
+	if( pev->spawnflags & SF_HGRUNT_ZSOLDIER )
+	{
+		pev->model = MAKE_STRING( "models/zgrunt.mdl" );
+	}
 	//
 	// Pick regular grunt model.
 	//
-	if( !szModel || !*szModel )
+	else
 	{
-		szModel = "models/hgrunt.mdl";
-		pev->model = ALLOC_STRING( szModel );
-	} 
-	// If this is a zombie soldier with a regular grunt model,
-	// switch to appropriate model.
-	else if( ( pev->spawnflags & SF_HGRUNT_ZSOLDIER ) && !FStrEq( szModel, "models/zgrunt.mdl" ) )
-	{
-		szModel = "models/zgrunt.mdl";
-		pev->model = ALLOC_STRING( szModel );
+		pev->model = MAKE_STRING( "models/hgrunt.mdl" );
 	}
 
 	// Set new model.
-	SET_MODEL( ENT( pev ), (char*)STRING( pev->model ) );
+	SET_MODEL( ENT( pev ), STRING( pev->model ) );
 
 	pev->effects		= 0;
 	pev->yaw_speed		= 8;
diff --git a/dlls/hgrunt.h b/dlls/hgrunt.h
index eebe86e7..d65c014e 100644
--- a/dlls/hgrunt.h
+++ b/dlls/hgrunt.h
@@ -118,7 +118,7 @@ public:
 	void KeyValue(KeyValueData *pkvd);
 
 	int	m_iPose;// which sequence to display	-- temporary, don't need to save
-	static char *m_szPoses[3];
+	static const char *m_szPoses[3];
 };
 
 #endif // HGRUNT_H
diff --git a/dlls/hornet.cpp b/dlls/hornet.cpp
index f05d638f..f6cf80cf 100644
--- a/dlls/hornet.cpp
+++ b/dlls/hornet.cpp
@@ -258,14 +258,14 @@ void CHornet::TrackTarget( void )
 	}
 
 	// UNDONE: The player pointer should come back after returning from another level
-	if( m_hEnemy == NULL )
+	if( m_hEnemy == 0 )
 	{
 		// enemy is dead.
 		Look( 512 );
 		m_hEnemy = BestVisibleEnemy();
 	}
 
-	if( m_hEnemy != NULL && FVisible( m_hEnemy ) )
+	if( m_hEnemy != 0 && FVisible( m_hEnemy ) )
 	{
 		m_vecEnemyLKP = m_hEnemy->BodyTarget( pev->origin );
 	}
@@ -335,7 +335,7 @@ void CHornet::TrackTarget( void )
 
 	// if hornet is close to the enemy, jet in a straight line for a half second.
 	// (only in the single player game)
-	if( m_hEnemy != NULL && !g_pGameRules->IsMultiplayer() )
+	if( m_hEnemy != 0 && !g_pGameRules->IsMultiplayer() )
 	{
 		if( flDelta >= 0.4 && ( pev->origin - m_vecEnemyLKP ).Length() <= 300 )
 		{
@@ -407,7 +407,7 @@ void CHornet::DartTouch( CBaseEntity *pOther )
 
 void CHornet::DieTouch( CBaseEntity *pOther )
 {
-	if( pOther && pOther->pev->takedamage )
+	if( pOther && pOther->pev->takedamage && pev->owner )
 	{
 		// do the damage
 		switch( RANDOM_LONG( 0, 2 ) )
diff --git a/dlls/hornet.h b/dlls/hornet.h
index dc78fc40..f0f0d366 100644
--- a/dlls/hornet.h
+++ b/dlls/hornet.h
@@ -15,7 +15,9 @@
 //=========================================================
 // Hornets
 //=========================================================
-
+#pragma once
+#ifndef HORNET_H
+#define HORNET_H
 //=========================================================
 // Hornet Defines
 //=========================================================
@@ -55,3 +57,4 @@ public:
 	int m_iHornetType;
 	float m_flFlySpeed;
 };
+#endif // HORNET_H
diff --git a/dlls/houndeye.cpp b/dlls/houndeye.cpp
index 8ad523fb..8092943c 100644
--- a/dlls/houndeye.cpp
+++ b/dlls/houndeye.cpp
@@ -137,7 +137,7 @@ int CHoundeye::Classify( void )
 //=========================================================
 BOOL CHoundeye::FValidateHintType( short sHint )
 {
-	int i;
+	size_t i;
 
 	static short sHoundHints[] =
 	{
diff --git a/dlls/ichthyosaur.cpp b/dlls/ichthyosaur.cpp
index 74c6f9d2..68694309 100644
--- a/dlls/ichthyosaur.cpp
+++ b/dlls/ichthyosaur.cpp
@@ -416,7 +416,7 @@ void CIchthyosaur::HandleAnimEvent( MonsterEvent_t *pEvent )
 	case ICHTHYOSAUR_AE_SHAKE_RIGHT:
 	case ICHTHYOSAUR_AE_SHAKE_LEFT:
 		{
-			if( m_hEnemy != NULL && FVisible( m_hEnemy ) )
+			if( m_hEnemy != 0 && FVisible( m_hEnemy ) )
 			{
 				CBaseEntity *pHurt = m_hEnemy;
 
@@ -622,7 +622,7 @@ void CIchthyosaur::RunTask( Task_t *pTask )
 	switch( pTask->iTask )
 	{
 	case TASK_ICHTHYOSAUR_CIRCLE_ENEMY:
-		if( m_hEnemy == NULL )
+		if( m_hEnemy == 0 )
 		{
 			TaskComplete();
 		}
@@ -864,7 +864,7 @@ void CIchthyosaur::Stop( void )
 
 void CIchthyosaur::Swim()
 {
-	int retValue = 0;
+	//int retValue = 0;
 
 	Vector start = pev->origin;
 
@@ -1072,7 +1072,7 @@ Vector CIchthyosaur::DoProbe( const Vector &Probe )
 		}
 	}
 
-	if( bBumpedSomething && ( m_hEnemy == NULL || tr.pHit != m_hEnemy->edict() ) )
+	if( bBumpedSomething && ( m_hEnemy == 0 || tr.pHit != m_hEnemy->edict() ) )
 	{
 		Vector ProbeDir = Probe - pev->origin;
 
diff --git a/dlls/islave.cpp b/dlls/islave.cpp
index ba6a9841..09890a84 100644
--- a/dlls/islave.cpp
+++ b/dlls/islave.cpp
@@ -101,7 +101,7 @@ int CISlave::IRelationship( CBaseEntity *pTarget )
 	return CBaseMonster::IRelationship( pTarget );
 }
 
-void CISlave::CallForHelp( char *szClassname, float flDist, EHANDLE hEnemy, Vector &vecLocation )
+void CISlave::CallForHelp( const char *szClassname, float flDist, EHANDLE hEnemy, Vector &vecLocation )
 {
 	// ALERT( at_aiconsole, "help " );
 
@@ -131,7 +131,7 @@ void CISlave::CallForHelp( char *szClassname, float flDist, EHANDLE hEnemy, Vect
 //=========================================================
 void CISlave::AlertSound( void )
 {
-	if( m_hEnemy != NULL )
+	if( m_hEnemy != 0 )
 	{
 		SENTENCEG_PlayRndSz( ENT( pev ), "SLV_ALERT", 0.85, ATTN_NORM, 0, m_voicePitch );
 
@@ -311,7 +311,7 @@ void CISlave::HandleAnimEvent( MonsterEvent_t *pEvent )
 					WRITE_BYTE( 0 );		// decay * 0.1
 				MESSAGE_END();
 			}
-			if( m_hDead != NULL )
+			if( m_hDead != 0 )
 			{
 				WackBeam( -1, m_hDead );
 				WackBeam( 1, m_hDead );
@@ -331,7 +331,7 @@ void CISlave::HandleAnimEvent( MonsterEvent_t *pEvent )
 		{
 			ClearBeams();
 
-			if( m_hDead != NULL )
+			if( m_hDead != 0 )
 			{
 				Vector vecDest = m_hDead->pev->origin + Vector( 0, 0, 38 );
 				TraceResult trace;
@@ -340,7 +340,7 @@ void CISlave::HandleAnimEvent( MonsterEvent_t *pEvent )
 				if( !trace.fStartSolid )
 				{
 					CBaseEntity *pNew = Create( "monster_alien_slave", m_hDead->pev->origin, m_hDead->pev->angles );
-					CBaseMonster *pNewMonster = pNew->MyMonsterPointer( );
+					//CBaseMonster *pNewMonster = pNew->MyMonsterPointer();
 					pNew->pev->spawnflags |= 1;
 					WackBeam( -1, pNew );
 					WackBeam( 1, pNew );
@@ -430,7 +430,7 @@ BOOL CISlave::CheckRangeAttack2( float flDot, float flDist )
 			}
 		}
 	}
-	if( m_hDead != NULL )
+	if( m_hDead != 0 )
 		return TRUE;
 	else
 		return FALSE;
@@ -476,7 +476,7 @@ void CISlave::Spawn()
 //=========================================================
 void CISlave::Precache()
 {
-	int i;
+	size_t i;
 
 	PRECACHE_MODEL( "models/islave.mdl" );
 	PRECACHE_MODEL( "sprites/lgtning.spr" );
@@ -489,20 +489,27 @@ void CISlave::Precache()
 	PRECACHE_SOUND( "weapons/cbar_miss1.wav" );
 
 	for( i = 0; i < ARRAYSIZE( pAttackHitSounds ); i++ )
-		PRECACHE_SOUND( (char *)pAttackHitSounds[i] );
+		PRECACHE_SOUND( pAttackHitSounds[i] );
 
 	for( i = 0; i < ARRAYSIZE( pAttackMissSounds ); i++ )
-		PRECACHE_SOUND( (char *)pAttackMissSounds[i] );
+		PRECACHE_SOUND( pAttackMissSounds[i] );
 
 	for( i = 0; i < ARRAYSIZE( pPainSounds ); i++ )
-		PRECACHE_SOUND((char *)pPainSounds[i] );
+		PRECACHE_SOUND( pPainSounds[i] );
 
 	for( i = 0; i < ARRAYSIZE( pDeathSounds ); i++ )
-		PRECACHE_SOUND( (char *)pDeathSounds[i] );
+		PRECACHE_SOUND( pDeathSounds[i] );
 
 	UTIL_PrecacheOther( "test_effect" );
 }
 
+void CISlave::UpdateOnRemove()
+{
+	CBaseEntity::UpdateOnRemove();
+
+	ClearBeams();
+}
+
 //=========================================================
 // TakeDamage - get provoked when injured
 //=========================================================
@@ -702,8 +709,8 @@ void CISlave::BeamGlow()
 //=========================================================
 void CISlave::WackBeam( int side, CBaseEntity *pEntity )
 {
-	Vector vecDest;
-	float flDist = 1.0;
+	//Vector vecDest;
+	//float flDist = 1.0;
 
 	if( m_iBeams >= ISLAVE_MAX_BEAMS )
 		return;
diff --git a/dlls/items.cpp b/dlls/items.cpp
index 9873117f..0fa68b17 100644
--- a/dlls/items.cpp
+++ b/dlls/items.cpp
@@ -166,6 +166,7 @@ void CItem::Materialize( void )
 	}
 
 	SetTouch( &CItem::ItemTouch );
+	SetThink( NULL );
 }
 
 #define SF_SUIT_SHORTLOGON		0x0001
diff --git a/dlls/items.h b/dlls/items.h
index 2c31f801..060678c8 100644
--- a/dlls/items.h
+++ b/dlls/items.h
@@ -12,6 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
+#pragma once
 #ifndef ITEMS_H
 #define ITEMS_H
 
diff --git a/dlls/leech.cpp b/dlls/leech.cpp
index ea524aaa..1d64eae1 100644
--- a/dlls/leech.cpp
+++ b/dlls/leech.cpp
@@ -271,15 +271,15 @@ void CLeech::AlertSound( void )
 
 void CLeech::Precache( void )
 {
-	int i;
+	size_t i;
 
 	//PRECACHE_MODEL( "models/icky.mdl" );
 	PRECACHE_MODEL( "models/leech.mdl" );
 
 	for( i = 0; i < ARRAYSIZE( pAttackSounds ); i++ )
-		PRECACHE_SOUND( (char *)pAttackSounds[i] );
+		PRECACHE_SOUND( pAttackSounds[i] );
 	for( i = 0; i < ARRAYSIZE( pAlertSounds ); i++ )
-		PRECACHE_SOUND( (char *)pAlertSounds[i] );
+		PRECACHE_SOUND( pAlertSounds[i] );
 }
 
 int CLeech::TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType )
diff --git a/dlls/lights.cpp b/dlls/lights.cpp
index 2a8b0683..1c39266b 100644
--- a/dlls/lights.cpp
+++ b/dlls/lights.cpp
@@ -38,7 +38,7 @@ public:
 
 private:
 	int m_iStyle;
-	int m_iszPattern;
+	string_t m_iszPattern;
 };
 
 LINK_ENTITY_TO_CLASS( light, CLight )
@@ -99,7 +99,7 @@ void CLight::Spawn( void )
 		if( FBitSet( pev->spawnflags, SF_LIGHT_START_OFF ) )
 			LIGHT_STYLE( m_iStyle, "a" );
 		else if( m_iszPattern )
-			LIGHT_STYLE( m_iStyle, (char *)STRING( m_iszPattern ) );
+			LIGHT_STYLE( m_iStyle, STRING( m_iszPattern ) );
 		else
 			LIGHT_STYLE( m_iStyle, "m" );
 	}
@@ -115,7 +115,7 @@ void CLight::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useTyp
 		if( FBitSet( pev->spawnflags, SF_LIGHT_START_OFF ) )
 		{
 			if( m_iszPattern )
-				LIGHT_STYLE( m_iStyle, (char *)STRING( m_iszPattern ) );
+				LIGHT_STYLE( m_iStyle, STRING( m_iszPattern ) );
 			else
 				LIGHT_STYLE( m_iStyle, "m" );
 			ClearBits( pev->spawnflags, SF_LIGHT_START_OFF );
@@ -155,15 +155,16 @@ void CEnvLight::KeyValue( KeyValueData* pkvd )
 		}
 		else if( j == 4 )
 		{
-			r = r * ( v / 255.0 );
-			g = g * ( v / 255.0 );
-			b = b * ( v / 255.0 );
+			v /= 255;
+			r *= v;
+			g *= v;
+			b *= v;
 		}
 
 		// simulate qrad direct, ambient,and gamma adjustments, as well as engine scaling
-		r = pow( r / 114.0, 0.6 ) * 264;
-		g = pow( g / 114.0, 0.6 ) * 264;
-		b = pow( b / 114.0, 0.6 ) * 264;
+		r = (int)( pow( r / 114.0, 0.6 ) * 264.0 );
+		g = (int)( pow( g / 114.0, 0.6 ) * 264.0 );
+		b = (int)( pow( b / 114.0, 0.6 ) * 264.0 );
 
 		pkvd->fHandled = TRUE;
 		sprintf( szColor, "%d", r );
diff --git a/dlls/maprules.cpp b/dlls/maprules.cpp
index 3eea7486..519f7d2a 100644
--- a/dlls/maprules.cpp
+++ b/dlls/maprules.cpp
@@ -64,9 +64,9 @@ void CRuleEntity::Spawn( void )
 
 void CRuleEntity::KeyValue( KeyValueData *pkvd )
 {
-	if (FStrEq(pkvd->szKeyName, "master"))
+	if( FStrEq(pkvd->szKeyName, "master" ) )
 	{
-		SetMaster( ALLOC_STRING(pkvd->szValue) );
+		SetMaster( ALLOC_STRING( pkvd->szValue ) );
 		pkvd->fHandled = TRUE;
 	}
 	else
@@ -75,9 +75,9 @@ void CRuleEntity::KeyValue( KeyValueData *pkvd )
 
 BOOL CRuleEntity::CanFireForActivator( CBaseEntity *pActivator )
 {
-	if ( m_iszMaster )
+	if( m_iszMaster )
 	{
-		if ( UTIL_IsMasterTriggered( m_iszMaster, pActivator ) )
+		if( UTIL_IsMasterTriggered( m_iszMaster, pActivator ) )
 			return TRUE;
 		else
 			return FALSE;
@@ -135,7 +135,7 @@ public:
 	void	Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
 	void	KeyValue( KeyValueData *pkvd );
 
-	inline	int		Points( void ) { return pev->frags; }
+	inline	int		Points( void ) { return (int)pev->frags; }
 	inline	BOOL	AllowNegativeScore( void ) { return pev->spawnflags & SF_SCORE_NEGATIVE; }
 	inline	BOOL	AwardToTeam( void ) { return pev->spawnflags & SF_SCORE_TEAM; }
 
@@ -153,9 +153,9 @@ void CGameScore::Spawn( void )
 
 void CGameScore::KeyValue( KeyValueData *pkvd )
 {
-	if (FStrEq(pkvd->szKeyName, "points"))
+	if( FStrEq( pkvd->szKeyName, "points" ) )
 	{
-		SetPoints( atoi(pkvd->szValue) );
+		SetPoints( atoi( pkvd->szValue ) );
 		pkvd->fHandled = TRUE;
 	}
 	else
@@ -164,13 +164,13 @@ void CGameScore::KeyValue( KeyValueData *pkvd )
 
 void CGameScore::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
 {
-	if ( !CanFireForActivator( pActivator ) )
+	if( !CanFireForActivator( pActivator ) )
 		return;
 
 	// Only players can use this
-	if ( pActivator->IsPlayer() )
+	if( pActivator->IsPlayer() )
 	{
-		if ( AwardToTeam() )
+		if( AwardToTeam() )
 		{
 			pActivator->AddPointsToTeam( Points(), AllowNegativeScore() );
 		}
@@ -194,7 +194,7 @@ LINK_ENTITY_TO_CLASS( game_end, CGameEnd )
 
 void CGameEnd::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
 {
-	if ( !CanFireForActivator( pActivator ) )
+	if( !CanFireForActivator( pActivator ) )
 		return;
 
 	g_pGameRules->EndMultiplayerGame();
@@ -239,27 +239,27 @@ IMPLEMENT_SAVERESTORE( CGameText, CRulePointEntity )
 
 void CGameText::KeyValue( KeyValueData *pkvd )
 {
-	if (FStrEq(pkvd->szKeyName, "channel"))
+	if( FStrEq( pkvd->szKeyName, "channel" ) )
 	{
 		m_textParms.channel = atoi( pkvd->szValue );
 		pkvd->fHandled = TRUE;
 	}
-	else if (FStrEq(pkvd->szKeyName, "x"))
+	else if( FStrEq( pkvd->szKeyName, "x" ) )
 	{
 		m_textParms.x = atof( pkvd->szValue );
 		pkvd->fHandled = TRUE;
 	}
-	else if (FStrEq(pkvd->szKeyName, "y"))
+	else if( FStrEq(pkvd->szKeyName, "y" ) )
 	{
 		m_textParms.y = atof( pkvd->szValue );
 		pkvd->fHandled = TRUE;
 	}
-	else if (FStrEq(pkvd->szKeyName, "effect"))
+	else if( FStrEq( pkvd->szKeyName, "effect" ) )
 	{
 		m_textParms.effect = atoi( pkvd->szValue );
 		pkvd->fHandled = TRUE;
 	}
-	else if (FStrEq(pkvd->szKeyName, "color"))
+	else if( FStrEq( pkvd->szKeyName, "color" ) )
 	{
 		int color[4];
 		UTIL_StringToIntArray( color, 4, pkvd->szValue );
@@ -269,7 +269,7 @@ void CGameText::KeyValue( KeyValueData *pkvd )
 		m_textParms.a1 = color[3];
 		pkvd->fHandled = TRUE;
 	}
-	else if (FStrEq(pkvd->szKeyName, "color2"))
+	else if( FStrEq( pkvd->szKeyName, "color2" ) )
 	{
 		int color[4];
 		UTIL_StringToIntArray( color, 4, pkvd->szValue );
@@ -279,22 +279,22 @@ void CGameText::KeyValue( KeyValueData *pkvd )
 		m_textParms.a2 = color[3];
 		pkvd->fHandled = TRUE;
 	}
-	else if (FStrEq(pkvd->szKeyName, "fadein"))
+	else if( FStrEq( pkvd->szKeyName, "fadein" ) )
 	{
 		m_textParms.fadeinTime = atof( pkvd->szValue );
 		pkvd->fHandled = TRUE;
 	}
-	else if (FStrEq(pkvd->szKeyName, "fadeout"))
+	else if( FStrEq( pkvd->szKeyName, "fadeout" ) )
 	{
 		m_textParms.fadeoutTime = atof( pkvd->szValue );
 		pkvd->fHandled = TRUE;
 	}
-	else if (FStrEq(pkvd->szKeyName, "holdtime"))
+	else if( FStrEq( pkvd->szKeyName, "holdtime" ) )
 	{
 		m_textParms.holdTime = atof( pkvd->szValue );
 		pkvd->fHandled = TRUE;
 	}
-	else if (FStrEq(pkvd->szKeyName, "fxtime"))
+	else if( FStrEq(pkvd->szKeyName, "fxtime" ) )
 	{
 		m_textParms.fxTime = atof( pkvd->szValue );
 		pkvd->fHandled = TRUE;
@@ -305,16 +305,16 @@ void CGameText::KeyValue( KeyValueData *pkvd )
 
 void CGameText::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
 {
-	if ( !CanFireForActivator( pActivator ) )
+	if( !CanFireForActivator( pActivator ) )
 		return;
 
-	if ( MessageToAll() )
+	if( MessageToAll() )
 	{
 		UTIL_HudMessageAll( m_textParms, MessageGet() );
 	}
 	else
 	{
-		if ( pActivator->IsNetClient() )
+		if( pActivator->IsNetClient() )
 		{
 			UTIL_HudMessage( pActivator, m_textParms, MessageGet() );
 		}
@@ -356,12 +356,12 @@ LINK_ENTITY_TO_CLASS( game_team_master, CGameTeamMaster )
 
 void CGameTeamMaster::KeyValue( KeyValueData *pkvd )
 {
-	if (FStrEq(pkvd->szKeyName, "teamindex"))
+	if( FStrEq( pkvd->szKeyName, "teamindex" ) )
 	{
 		m_teamIndex = atoi( pkvd->szValue );
 		pkvd->fHandled = TRUE;
 	}
-	else if (FStrEq(pkvd->szKeyName, "triggerstate"))
+	else if( FStrEq( pkvd->szKeyName, "triggerstate" ) )
 	{
 		int type = atoi( pkvd->szValue );
 		switch( type )
@@ -384,12 +384,12 @@ void CGameTeamMaster::KeyValue( KeyValueData *pkvd )
 
 void CGameTeamMaster::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
 {
-	if ( !CanFireForActivator( pActivator ) )
+	if( !CanFireForActivator( pActivator ) )
 		return;
 
-	if ( useType == USE_SET )
+	if( useType == USE_SET )
 	{
-		if ( value < 0 )
+		if( value < 0 )
 		{
 			m_teamIndex = -1;
 		}
@@ -400,10 +400,10 @@ void CGameTeamMaster::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TY
 		return;
 	}
 
-	if ( TeamMatch( pActivator ) )
+	if( TeamMatch( pActivator ) )
 	{
 		SUB_UseTargets( pActivator, triggerType, value );
-		if ( RemoveOnFire() )
+		if( RemoveOnFire() )
 			UTIL_Remove( this );
 	}
 }
@@ -415,7 +415,7 @@ BOOL CGameTeamMaster::IsTriggered( CBaseEntity *pActivator )
 
 const char *CGameTeamMaster::TeamID( void )
 {
-	if ( m_teamIndex < 0 )		// Currently set to "no team"
+	if( m_teamIndex < 0 )		// Currently set to "no team"
 		return "";
 
 	return g_pGameRules->GetIndexedTeamName( m_teamIndex );		// UNDONE: Fill this in with the team from the "teamlist"
@@ -423,10 +423,10 @@ const char *CGameTeamMaster::TeamID( void )
 
 BOOL CGameTeamMaster::TeamMatch( CBaseEntity *pActivator )
 {
-	if ( m_teamIndex < 0 && AnyTeam() )
+	if( m_teamIndex < 0 && AnyTeam() )
 		return TRUE;
 
-	if ( !pActivator )
+	if( !pActivator )
 		return FALSE;
 
 	return UTIL_TeamsMatch( pActivator->TeamID(), TeamID() );
@@ -443,7 +443,7 @@ BOOL CGameTeamMaster::TeamMatch( CBaseEntity *pActivator )
 class CGameTeamSet : public CRulePointEntity
 {
 public:
-	void		Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
+	void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
 	inline BOOL RemoveOnFire( void ) { return (pev->spawnflags & SF_TEAMSET_FIREONCE) ? TRUE : FALSE; }
 	inline BOOL ShouldClearTeam( void ) { return (pev->spawnflags & SF_TEAMSET_CLEARTEAM) ? TRUE : FALSE; }
 
@@ -454,10 +454,10 @@ LINK_ENTITY_TO_CLASS( game_team_set, CGameTeamSet )
 
 void CGameTeamSet::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
 {
-	if ( !CanFireForActivator( pActivator ) )
+	if( !CanFireForActivator( pActivator ) )
 		return;
 
-	if ( ShouldClearTeam() )
+	if( ShouldClearTeam() )
 	{
 		SUB_UseTargets( pActivator, USE_SET, -1 );
 	}
@@ -466,7 +466,7 @@ void CGameTeamSet::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE
 		SUB_UseTargets( pActivator, USE_SET, 0 );
 	}
 
-	if ( RemoveOnFire() )
+	if( RemoveOnFire() )
 	{
 		UTIL_Remove( this );
 	}
@@ -506,22 +506,22 @@ IMPLEMENT_SAVERESTORE( CGamePlayerZone, CRuleBrushEntity )
 
 void CGamePlayerZone::KeyValue( KeyValueData *pkvd )
 {
-	if (FStrEq(pkvd->szKeyName, "intarget"))
+	if( FStrEq(pkvd->szKeyName, "intarget" ) )
 	{
 		m_iszInTarget = ALLOC_STRING( pkvd->szValue );
 		pkvd->fHandled = TRUE;
 	}
-	else if (FStrEq(pkvd->szKeyName, "outtarget"))
+	else if( FStrEq( pkvd->szKeyName, "outtarget" ) )
 	{
 		m_iszOutTarget = ALLOC_STRING( pkvd->szValue );
 		pkvd->fHandled = TRUE;
 	}
-	else if (FStrEq(pkvd->szKeyName, "incount"))
+	else if( FStrEq( pkvd->szKeyName, "incount" ) )
 	{
 		m_iszInCount = ALLOC_STRING( pkvd->szValue );
 		pkvd->fHandled = TRUE;
 	}
-	else if (FStrEq(pkvd->szKeyName, "outcount"))
+	else if( FStrEq( pkvd->szKeyName, "outcount" ) )
 	{
 		m_iszOutCount = ALLOC_STRING( pkvd->szValue );
 		pkvd->fHandled = TRUE;
@@ -535,12 +535,12 @@ void CGamePlayerZone::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TY
 	int playersInCount = 0;
 	int playersOutCount = 0;
 
-	if ( !CanFireForActivator( pActivator ) )
+	if( !CanFireForActivator( pActivator ) )
 		return;
 
 	CBaseEntity *pPlayer = NULL;
 
-	for ( int i = 1; i <= gpGlobals->maxClients; i++ )
+	for( int i = 1; i <= gpGlobals->maxClients; i++ )
 	{
 		pPlayer = UTIL_PlayerByIndex( i );
 		if ( pPlayer )
@@ -549,40 +549,40 @@ void CGamePlayerZone::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TY
 			int			hullNumber;
 
 			hullNumber = human_hull;
-			if ( pPlayer->pev->flags & FL_DUCKING )
+			if( pPlayer->pev->flags & FL_DUCKING )
 			{
 				hullNumber = head_hull;
 			}
 
 			UTIL_TraceModel( pPlayer->pev->origin, pPlayer->pev->origin, hullNumber, edict(), &trace );
 
-			if ( trace.fStartSolid )
+			if( trace.fStartSolid )
 			{
 				playersInCount++;
-				if ( m_iszInTarget )
+				if( m_iszInTarget )
 				{
-					FireTargets( STRING(m_iszInTarget), pPlayer, pActivator, useType, value );
+					FireTargets( STRING( m_iszInTarget ), pPlayer, pActivator, useType, value );
 				}
 			}
 			else
 			{
 				playersOutCount++;
-				if ( m_iszOutTarget )
+				if( m_iszOutTarget )
 				{
-					FireTargets( STRING(m_iszOutTarget), pPlayer, pActivator, useType, value );
+					FireTargets( STRING( m_iszOutTarget ), pPlayer, pActivator, useType, value );
 				}
 			}
 		}
 	}
 
-	if ( m_iszInCount )
+	if( m_iszInCount )
 	{
-		FireTargets( STRING(m_iszInCount), pActivator, this, USE_SET, playersInCount );
+		FireTargets( STRING( m_iszInCount ), pActivator, this, USE_SET, playersInCount );
 	}
 
-	if ( m_iszOutCount )
+	if( m_iszOutCount )
 	{
-		FireTargets( STRING(m_iszOutCount), pActivator, this, USE_SET, playersOutCount );
+		FireTargets( STRING( m_iszOutCount ), pActivator, this, USE_SET, playersOutCount );
 	}
 }
 
@@ -605,12 +605,12 @@ LINK_ENTITY_TO_CLASS( game_player_hurt, CGamePlayerHurt )
 
 void CGamePlayerHurt::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
 {
-	if ( !CanFireForActivator( pActivator ) )
+	if( !CanFireForActivator( pActivator ) )
 		return;
 
-	if ( pActivator->IsPlayer() )
+	if( pActivator->IsPlayer() )
 	{
-		if ( pev->dmg < 0 )
+		if( pev->dmg < 0 )
 			pActivator->TakeHealth( -pev->dmg, DMG_GENERIC );
 		else
 			pActivator->TakeDamage( pev, pev, pev->dmg, DMG_GENERIC );
@@ -618,7 +618,7 @@ void CGamePlayerHurt::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TY
 
 	SUB_UseTargets( pActivator, useType, value );
 
-	if ( RemoveOnFire() )
+	if( RemoveOnFire() )
 	{
 		UTIL_Remove( this );
 	}
@@ -643,8 +643,8 @@ public:
 	inline void CountUp( void ) { pev->frags++; }
 	inline void CountDown( void ) { pev->frags--; }
 	inline void ResetCount( void ) { pev->frags = pev->dmg; }
-	inline int  CountValue( void ) { return pev->frags; }
-	inline int	LimitValue( void ) { return pev->health; }
+	inline int CountValue( void ) { return (int)pev->frags; }
+	inline int LimitValue( void ) { return (int)pev->health; }
 
 	inline BOOL HitLimit( void ) { return CountValue() == LimitValue(); }
 
@@ -665,7 +665,7 @@ void CGameCounter::Spawn( void )
 
 void CGameCounter::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
 {
-	if ( !CanFireForActivator( pActivator ) )
+	if( !CanFireForActivator( pActivator ) )
 		return;
 
 	switch( useType )
@@ -681,16 +681,16 @@ void CGameCounter::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE
 		SetCountValue( (int)value );
 		break;
 	}
-	
-	if ( HitLimit() )
+
+	if( HitLimit() )
 	{
 		SUB_UseTargets( pActivator, USE_TOGGLE, 0 );
-		if ( RemoveOnFire() )
+		if( RemoveOnFire() )
 		{
 			UTIL_Remove( this );
 		}
-		
-		if ( ResetOnFire() )
+
+		if( ResetOnFire() )
 		{
 			ResetCount();
 		}
@@ -716,12 +716,12 @@ LINK_ENTITY_TO_CLASS( game_counter_set, CGameCounterSet )
 
 void CGameCounterSet::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
 {
-	if ( !CanFireForActivator( pActivator ) )
+	if( !CanFireForActivator( pActivator ) )
 		return;
 
 	SUB_UseTargets( pActivator, USE_SET, pev->frags );
 
-	if ( RemoveOnFire() )
+	if( RemoveOnFire() )
 	{
 		UTIL_Remove( this );
 	}
@@ -756,19 +756,19 @@ void CGamePlayerEquip::KeyValue( KeyValueData *pkvd )
 {
 	CRulePointEntity::KeyValue( pkvd );
 
-	if ( !pkvd->fHandled )
+	if( !pkvd->fHandled )
 	{
-		for ( int i = 0; i < MAX_EQUIP; i++ )
+		for( int i = 0; i < MAX_EQUIP; i++ )
 		{
-			if ( !m_weaponNames[i] )
+			if( !m_weaponNames[i] )
 			{
 				char tmp[128];
 
 				UTIL_StripToken( pkvd->szKeyName, tmp );
 
-				m_weaponNames[i] = ALLOC_STRING(tmp);
-				m_weaponCount[i] = atoi(pkvd->szValue);
-				m_weaponCount[i] = max(1,m_weaponCount[i]);
+				m_weaponNames[i] = ALLOC_STRING( tmp );
+				m_weaponCount[i] = atoi( pkvd->szValue );
+				m_weaponCount[i] = Q_max( 1, m_weaponCount[i] );
 				pkvd->fHandled = TRUE;
 				break;
 			}
@@ -778,10 +778,10 @@ void CGamePlayerEquip::KeyValue( KeyValueData *pkvd )
 
 void CGamePlayerEquip::Touch( CBaseEntity *pOther )
 {
-	if ( !CanFireForActivator( pOther ) )
+	if( !CanFireForActivator( pOther ) )
 		return;
 
-	if ( UseOnly() )
+	if( UseOnly() )
 		return;
 
 	EquipPlayer( pOther );
@@ -791,21 +791,21 @@ void CGamePlayerEquip::EquipPlayer( CBaseEntity *pEntity )
 {
 	CBasePlayer *pPlayer = NULL;
 
-	if ( pEntity->IsPlayer() )
+	if( pEntity->IsPlayer() )
 	{
 		pPlayer = (CBasePlayer *)pEntity;
 	}
 
-	if ( !pPlayer )
+	if( !pPlayer )
 		return;
 
-	for ( int i = 0; i < MAX_EQUIP; i++ )
+	for( int i = 0; i < MAX_EQUIP; i++ )
 	{
-		if ( !m_weaponNames[i] )
+		if( !m_weaponNames[i] )
 			break;
-		for ( int j = 0; j < m_weaponCount[i]; j++ )
+		for( int j = 0; j < m_weaponCount[i]; j++ )
 		{
- 			pPlayer->GiveNamedItem( STRING(m_weaponNames[i]) );
+ 			pPlayer->GiveNamedItem( STRING( m_weaponNames[i] ) );
 		}
 	}
 }
@@ -844,9 +844,9 @@ const char *CGamePlayerTeam::TargetTeamName( const char *pszTargetName )
 {
 	CBaseEntity *pTeamEntity = NULL;
 
-	while ((pTeamEntity = UTIL_FindEntityByTargetname( pTeamEntity, pszTargetName )) != NULL)
+	while( ( pTeamEntity = UTIL_FindEntityByTargetname( pTeamEntity, pszTargetName ) ) != NULL )
 	{
-		if ( FClassnameIs( pTeamEntity->pev, "game_team_master" ) )
+		if( FClassnameIs( pTeamEntity->pev, "game_team_master" ) )
 			return pTeamEntity->TeamID();
 	}
 
@@ -855,10 +855,10 @@ const char *CGamePlayerTeam::TargetTeamName( const char *pszTargetName )
 
 void CGamePlayerTeam::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
 {
-	if ( !CanFireForActivator( pActivator ) )
+	if( !CanFireForActivator( pActivator ) )
 		return;
 
-	if ( pActivator->IsPlayer() )
+	if( pActivator->IsPlayer() )
 	{
 		const char *pszTargetTeam = TargetTeamName( STRING(pev->target) );
 		if ( pszTargetTeam )
@@ -868,7 +868,7 @@ void CGamePlayerTeam::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TY
 		}
 	}
 	
-	if ( RemoveOnFire() )
+	if( RemoveOnFire() )
 	{
 		UTIL_Remove( this );
 	}
diff --git a/dlls/monsters.cpp b/dlls/monsters.cpp
index 1a2cbf2e..ef6733f3 100644
--- a/dlls/monsters.cpp
+++ b/dlls/monsters.cpp
@@ -133,7 +133,7 @@ int CBaseMonster::Restore( CRestore &restore )
 	m_Activity = ACT_RESET;
 
 	// If we don't have an enemy, clear conditions like see enemy, etc.
-	if( m_hEnemy == NULL )
+	if( m_hEnemy == 0 )
 		m_afConditions = 0;
 
 	return status;
@@ -334,12 +334,10 @@ void CBaseMonster::Look( int iDistance )
 					{
 						if( pev->spawnflags & SF_MONSTER_WAIT_TILL_SEEN )
 						{
-							CBaseMonster *pClient;
-
-							pClient = pSightEnt->MyMonsterPointer();
+							CBaseMonster *pClient = pSightEnt->MyMonsterPointer();
 
 							// don't link this client in the list if the monster is wait till seen and the player isn't facing the monster
-							if( pSightEnt && !pClient->FInViewCone( this ) )
+							if( pClient && !pClient->FInViewCone( this ) )
 							{
 								// we're not in the player's view cone. 
 								continue;
@@ -672,7 +670,7 @@ BOOL CBaseMonster::FRefreshRoute( void )
 			returnCode = BuildRoute( m_vecMoveGoal, bits_MF_TO_LOCATION, NULL );
 			break;
 		case MOVEGOAL_TARGETENT:
-			if( m_hTargetEnt != NULL )
+			if( m_hTargetEnt != 0 )
 			{
 				returnCode = BuildRoute( m_hTargetEnt->pev->origin, bits_MF_TO_TARGETENT, m_hTargetEnt );
 			}
@@ -954,7 +952,7 @@ BOOL CBaseMonster::CheckRangeAttack2( float flDot, float flDist )
 BOOL CBaseMonster::CheckMeleeAttack1( float flDot, float flDist )
 {
 	// Decent fix to keep folks from kicking/punching hornets and snarks is to check the onground flag(sjb)
-	if( flDist <= 64 && flDot >= 0.7 && m_hEnemy != NULL && FBitSet( m_hEnemy->pev->flags, FL_ONGROUND ) )
+	if( flDist <= 64 && flDot >= 0.7 && m_hEnemy != 0 && FBitSet( m_hEnemy->pev->flags, FL_ONGROUND ) )
 	{
 		return TRUE;
 	}
@@ -1165,7 +1163,7 @@ void CBaseMonster::PushEnemy( CBaseEntity *pEnemy, Vector &vecLastKnownPos )
 	{
 		if( m_hOldEnemy[i] == pEnemy )
 			return;
-		if( m_hOldEnemy[i] == NULL ) // someone died, reuse their slot
+		if( m_hOldEnemy[i] == 0 ) // someone died, reuse their slot
 			break;
 	}
 	if( i >= MAX_OLD_ENEMIES )
@@ -1183,7 +1181,7 @@ BOOL CBaseMonster::PopEnemy()
 	// UNDONE: blah, this is bad, we should use a stack but I'm too lazy to code one.
 	for( int i = MAX_OLD_ENEMIES - 1; i >= 0; i-- )
 	{
-		if( m_hOldEnemy[i] != NULL )
+		if( m_hOldEnemy[i] != 0 )
 		{
 			if( m_hOldEnemy[i]->IsAlive()) // cheat and know when they die
 			{
@@ -1240,7 +1238,7 @@ void CBaseMonster::SetActivity( Activity NewActivity )
 //=========================================================
 // SetSequenceByName
 //=========================================================
-void CBaseMonster::SetSequenceByName( char *szSequence )
+void CBaseMonster::SetSequenceByName( const char *szSequence )
 {
 	int iSequence;
 
@@ -1961,7 +1959,7 @@ void CBaseMonster::MoveExecute( CBaseEntity *pTargetEnt, const Vector &vecDir, f
 	while( flTotal > 0.001 )
 	{
 		// don't walk more than 16 units or stairs stop working
-		flStep = min( 16.0, flTotal );
+		flStep = Q_min( 16.0, flTotal );
 		UTIL_MoveToOrigin( ENT( pev ), m_Route[m_iRouteIndex].vecLocation, flStep, MOVE_NORMAL );
 		flTotal -= flStep;
 	}
@@ -2867,7 +2865,7 @@ void CBaseMonster::ReportAIState( void )
 	else
 		ALERT( level, "No Schedule, " );
 
-	if( m_hEnemy != NULL )
+	if( m_hEnemy != 0 )
 		ALERT( level, "\nEnemy is %s", STRING( m_hEnemy->pev->classname ) );
 	else
 		ALERT( level, "No enemy" );
@@ -2954,7 +2952,7 @@ BOOL CBaseMonster::FCheckAITrigger( void )
 	switch( m_iTriggerCondition )
 	{
 	case AITRIGGER_SEEPLAYER_ANGRY_AT_PLAYER:
-		if( m_hEnemy != NULL && m_hEnemy->IsPlayer() && HasConditions( bits_COND_SEE_ENEMY ) )
+		if( m_hEnemy != 0 && m_hEnemy->IsPlayer() && HasConditions( bits_COND_SEE_ENEMY ) )
 		{
 			fFireTarget = TRUE;
 		}
@@ -3325,7 +3323,7 @@ BOOL CBaseMonster::GetEnemy( void )
 	}
 
 	// remember old enemies
-	if( m_hEnemy == NULL && PopEnemy() )
+	if( m_hEnemy == 0 && PopEnemy() )
 	{
 		if( m_pSchedule )
 		{
@@ -3336,7 +3334,7 @@ BOOL CBaseMonster::GetEnemy( void )
 		}
 	}
 
-	if( m_hEnemy != NULL )
+	if( m_hEnemy != 0 )
 	{
 		// monster has an enemy.
 		return TRUE;
@@ -3348,7 +3346,7 @@ BOOL CBaseMonster::GetEnemy( void )
 //=========================================================
 // DropItem - dead monster drops named item 
 //=========================================================
-CBaseEntity *CBaseMonster::DropItem( char *pszItemName, const Vector &vecPos, const Vector &vecAng )
+CBaseEntity *CBaseMonster::DropItem( const char *pszItemName, const Vector &vecPos, const Vector &vecAng )
 {
 	if( !pszItemName )
 	{
@@ -3363,6 +3361,9 @@ CBaseEntity *CBaseMonster::DropItem( char *pszItemName, const Vector &vecPos, co
 		// do we want this behavior to be default?! (sjb)
 		pItem->pev->velocity = pev->velocity;
 		pItem->pev->avelocity = Vector( 0, RANDOM_FLOAT( 0, 100 ), 0 );
+
+		// Dropped items should never respawn (unless this rule changes in the future). - Solokiller
+		pItem->pev->spawnflags |= SF_NORESPAWN;
 		return pItem;
 	}
 	else
diff --git a/dlls/monsters.h b/dlls/monsters.h
index 891c83ce..1a20eaa0 100644
--- a/dlls/monsters.h
+++ b/dlls/monsters.h
@@ -12,6 +12,7 @@
 *   use or distribution of this code by or to any unlicensed person is illegal.
 *
 ****/
+#pragma once
 #ifndef MONSTERS_H
 #include "skill.h"
 #define MONSTERS_H
diff --git a/dlls/monsterstate.cpp b/dlls/monsterstate.cpp
index f29664dc..cec29b79 100644
--- a/dlls/monsterstate.cpp
+++ b/dlls/monsterstate.cpp
@@ -42,7 +42,7 @@ void CBaseMonster::SetState( MONSTERSTATE State )
 
 	// Drop enemy pointers when going to idle
 	case MONSTERSTATE_IDLE:
-		if( m_hEnemy != NULL )
+		if( m_hEnemy != 0 )
 		{
 			m_hEnemy = NULL;// not allowed to have an enemy anymore.
 			ALERT( at_aiconsole, "Stripped\n" );
@@ -92,7 +92,7 @@ void CBaseMonster::RunAI( void )
 		}
 
 		// do these calculations if monster has an enemy.
-		if( m_hEnemy != NULL )
+		if( m_hEnemy != 0 )
 		{
 			CheckEnemy( m_hEnemy );
 		}
@@ -198,7 +198,7 @@ MONSTERSTATE CBaseMonster::GetIdealState( void )
 		COMBAT goes to ALERT upon death of enemy
 		*/
 		{
-			if( m_hEnemy == NULL )
+			if( m_hEnemy == 0 )
 			{
 				m_IdealMonsterState = MONSTERSTATE_ALERT;
 				// pev->effects = EF_BRIGHTFIELD;
diff --git a/dlls/mortar.cpp b/dlls/mortar.cpp
index 33a7d2da..7faf3e56 100644
--- a/dlls/mortar.cpp
+++ b/dlls/mortar.cpp
@@ -45,8 +45,8 @@ public:
 
 	void EXPORT FieldUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
 
-	int m_iszXController;
-	int m_iszYController;
+	string_t m_iszXController;
+	string_t m_iszYController;
 	float m_flSpread;
 	float m_flDelay;
 	int m_iCount;
diff --git a/dlls/mp5.cpp b/dlls/mp5.cpp
index 7d05d5e1..403efa04 100644
--- a/dlls/mp5.cpp
+++ b/dlls/mp5.cpp
@@ -177,7 +177,7 @@ void CMP5::PrimaryAttack()
 		// HEV suit - indicate out of ammo condition
 		m_pPlayer->SetSuitUpdate( "!HEV_AMO0", FALSE, 0 );
 
-	m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.1;
+	m_flNextPrimaryAttack = GetNextAttackDelay( 0.1 );
 
 	if( m_flNextPrimaryAttack < UTIL_WeaponTimeBase() )
 		m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.1;
@@ -227,7 +227,7 @@ void CMP5::SecondaryAttack( void )
 #endif
 	PLAYBACK_EVENT( flags, m_pPlayer->edict(), m_usMP52 );
 
-	m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 1;
+	m_flNextPrimaryAttack = GetNextAttackDelay( 1 );
 	m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 1;
 	m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 5;// idle pretty soon after shooting.
 
@@ -238,7 +238,7 @@ void CMP5::SecondaryAttack( void )
 
 void CMP5::Reload( void )
 {
-	if( m_pPlayer->ammo_9mm <= 0 )
+	if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 || m_iClip == MP5_MAX_CLIP )
 		return;
 
 	DefaultReload( MP5_MAX_CLIP, MP5_RELOAD, 1.5 );
@@ -270,6 +270,12 @@ void CMP5::WeaponIdle( void )
 	m_flTimeWeaponIdle = UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 ); // how long till we do this again.
 }
 
+BOOL CMP5::IsUseable()
+{
+	//Can be used if the player has AR grenades. - Solokiller
+	return CBasePlayerWeapon::IsUseable() || m_pPlayer->m_rgAmmo[m_iSecondaryAmmoType] > 0;
+}
+
 class CMP5AmmoClip : public CBasePlayerAmmo
 {
 	void Spawn( void )
diff --git a/dlls/mpstubb.cpp b/dlls/mpstubb.cpp
index 703a4dba..12b3a82f 100644
--- a/dlls/mpstubb.cpp
+++ b/dlls/mpstubb.cpp
@@ -230,7 +230,7 @@ CBaseEntity *CBaseMonster::BestVisibleEnemy( void )
 				// currently think is the best visible enemy. No need to do 
 				// a distance check, just get mad at this one for now.
 				iBestRelationship = IRelationship( pNextEnt );
-				iNearest = ( pNextEnt->pev->origin - pev->origin ).Length();
+				(int)iNearest = ( pNextEnt->pev->origin - pev->origin ).Length();
 				pReturn = pNextEnt;
 			}
 			else if( IRelationship( pNextEnt ) == iBestRelationship )
@@ -238,7 +238,7 @@ CBaseEntity *CBaseMonster::BestVisibleEnemy( void )
 				// this entity is disliked just as much as the entity that
 				// we currently think is the best visible enemy, so we only
 				// get mad at it if it is closer.
-				iDist = ( pNextEnt->pev->origin - pev->origin ).Length();
+				(int)iDist = ( pNextEnt->pev->origin - pev->origin ).Length();
 
 				if( iDist <= iNearest )
 				{
diff --git a/dlls/multiplay_gamerules.cpp b/dlls/multiplay_gamerules.cpp
index 929c2bf6..7922d413 100644
--- a/dlls/multiplay_gamerules.cpp
+++ b/dlls/multiplay_gamerules.cpp
@@ -92,7 +92,7 @@ CHalfLifeMultiplay::CHalfLifeMultiplay()
 	if( IS_DEDICATED_SERVER() )
 	{
 		// dedicated server
-		char *servercfgfile = (char *)CVAR_GET_STRING( "servercfgfile" );
+		/*const char *servercfgfile = CVAR_GET_STRING( "servercfgfile" );
 
 		if( servercfgfile && servercfgfile[0] )
 		{
@@ -102,11 +102,13 @@ CHalfLifeMultiplay::CHalfLifeMultiplay()
 			sprintf( szCommand, "exec %s\n", servercfgfile );
 			SERVER_COMMAND( szCommand );
 		}
+		*/
+		// this code has been moved into engine, to only run server.cfg once
 	}
 	else
 	{
 		// listen server
-		char *lservercfgfile = (char *)CVAR_GET_STRING( "lservercfgfile" );
+		const char *lservercfgfile = CVAR_GET_STRING( "lservercfgfile" );
 
 		if( lservercfgfile && lservercfgfile[0] )
 		{
@@ -254,7 +256,7 @@ void CHalfLifeMultiplay::Think( void )
 
 			if( pPlayer )
 			{
-				remain = flFragLimit - pPlayer->pev->frags;
+				remain = (int)( flFragLimit - pPlayer->pev->frags );
 				if( remain < bestfrags )
 				{
 					bestfrags = remain;
@@ -298,7 +300,7 @@ BOOL CHalfLifeMultiplay::IsDeathmatch( void )
 //=========================================================
 BOOL CHalfLifeMultiplay::IsCoOp( void )
 {
-	return gpGlobals->coop;
+	return gpGlobals->coop ? TRUE : FALSE;
 }
 
 //=========================================================
@@ -421,7 +423,7 @@ void CHalfLifeMultiplay::InitHUD( CBasePlayer *pl )
 {
 	// notify other clients of player joining the game
 	UTIL_ClientPrintAll( HUD_PRINTNOTIFY, UTIL_VarArgs( "%s has joined the game\n", 
-		( pl->pev->netname && STRING( pl->pev->netname )[0] != 0 ) ? STRING( pl->pev->netname ) : "unconnected" ) );
+		( pl->pev->netname && ( STRING( pl->pev->netname ) )[0] != 0 ) ? STRING( pl->pev->netname ) : "unconnected" ) );
 
 	// team match?
 	if( g_teamplay )
@@ -465,7 +467,7 @@ void CHalfLifeMultiplay::InitHUD( CBasePlayer *pl )
 		{
 			MESSAGE_BEGIN( MSG_ONE, gmsgScoreInfo, NULL, pl->edict() );
 				WRITE_BYTE( i );	// client number
-				WRITE_SHORT( plr->pev->frags );
+				WRITE_SHORT( (int)plr->pev->frags );
 				WRITE_SHORT( plr->m_iDeaths );
 				WRITE_SHORT( 0 );
 				WRITE_SHORT( GetTeamIndex( plr->m_szTeamName ) + 1 );
@@ -650,7 +652,7 @@ void CHalfLifeMultiplay::PlayerKilled( CBasePlayer *pVictim, entvars_t *pKiller,
 	// killed scores
 	MESSAGE_BEGIN( MSG_ALL, gmsgScoreInfo );
 		WRITE_BYTE( ENTINDEX(pVictim->edict()) );
-		WRITE_SHORT( pVictim->pev->frags );
+		WRITE_SHORT( (int)pVictim->pev->frags );
 		WRITE_SHORT( pVictim->m_iDeaths );
 		WRITE_SHORT( 0 );
 		WRITE_SHORT( GetTeamIndex( pVictim->m_szTeamName ) + 1 );
@@ -664,7 +666,7 @@ void CHalfLifeMultiplay::PlayerKilled( CBasePlayer *pVictim, entvars_t *pKiller,
 
 		MESSAGE_BEGIN( MSG_ALL, gmsgScoreInfo );
 			WRITE_BYTE( ENTINDEX( PK->edict() ) );
-			WRITE_SHORT( PK->pev->frags );
+			WRITE_SHORT( (int)PK->pev->frags );
 			WRITE_SHORT( PK->m_iDeaths );
 			WRITE_SHORT( 0 );
 			WRITE_SHORT( GetTeamIndex( PK->m_szTeamName ) + 1 );
@@ -673,12 +675,6 @@ void CHalfLifeMultiplay::PlayerKilled( CBasePlayer *pVictim, entvars_t *pKiller,
 		// let the killer paint another decal as soon as he'd like.
 		PK->m_flNextDecalTime = gpGlobals->time;
 	}
-#ifndef HLDEMO_BUILD
-	if( pVictim->HasNamedPlayerItem( "weapon_satchel" ) )
-	{
-		DeactivateSatchels( pVictim );
-	}
-#endif
 }
 
 //=========================================================
@@ -687,14 +683,14 @@ void CHalfLifeMultiplay::PlayerKilled( CBasePlayer *pVictim, entvars_t *pKiller,
 void CHalfLifeMultiplay::DeathNotice( CBasePlayer *pVictim, entvars_t *pKiller, entvars_t *pevInflictor )
 {
 	// Work out what killed the player, and send a message to all clients about it
-	CBaseEntity *Killer = CBaseEntity::Instance( pKiller );
+	CBaseEntity::Instance( pKiller );
 
 	const char *killer_weapon_name = "world";		// by default, the player is killed by the world
 	int killer_index = 0;
 
 	// Hack to fix name change
-	char *tau = "tau_cannon";
-	char *gluon = "gluon gun";
+	const char *tau = "tau_cannon";
+	const char *gluon = "gluon gun";
 
 	if( pKiller->flags & FL_CLIENT )
 	{
@@ -1218,7 +1214,7 @@ COM_Parse
 Parse a token out of a string
 ==============
 */
-char *COM_Parse( char *data )
+const char *COM_Parse( const char *data )
 {
 	int c;
 	int len;
@@ -1294,9 +1290,9 @@ COM_TokenWaiting
 Returns 1 if additional data is waiting to be processed on this line
 ==============
 */
-int COM_TokenWaiting( char *buffer )
+int COM_TokenWaiting( const char *buffer )
 {
-	char *p;
+	const char *p;
 
 	p = buffer;
 	while( *p && *p!='\n')
@@ -1317,12 +1313,12 @@ ReloadMapCycleFile
 Parses mapcycle.txt file into mapcycle_t structure
 ==============
 */
-int ReloadMapCycleFile( char *filename, mapcycle_t *cycle )
+int ReloadMapCycleFile( const char *filename, mapcycle_t *cycle )
 {
 	char szMap[32];
 	int length;
-	char *pFileList;
-	char *aFileList = pFileList = (char*)LOAD_FILE_FOR_ME( filename, &length );
+	const char *pFileList;
+	const char *aFileList = pFileList = (const char *)LOAD_FILE_FOR_ME( filename, &length );
 	int hasbuffer;
 	mapcycle_item_s *item, *newlist = NULL, *next;
 
@@ -1372,15 +1368,15 @@ int ReloadMapCycleFile( char *filename, mapcycle_t *cycle )
 					if( s && s[0] )
 					{
 						item->minplayers = atoi( s );
-						item->minplayers = max( item->minplayers, 0 );
-						item->minplayers = min( item->minplayers, gpGlobals->maxClients );
+						item->minplayers = Q_max( item->minplayers, 0 );
+						item->minplayers = Q_min( item->minplayers, gpGlobals->maxClients );
 					}
 					s = g_engfuncs.pfnInfoKeyValue( szBuffer, "maxplayers" );
 					if( s && s[0] )
 					{
 						item->maxplayers = atoi( s );
-						item->maxplayers = max( item->maxplayers, 0 );
-						item->maxplayers = min( item->maxplayers, gpGlobals->maxClients );
+						item->maxplayers = Q_max( item->maxplayers, 0 );
+						item->maxplayers = Q_min( item->maxplayers, gpGlobals->maxClients );
 					}
 
 					// Remove keys
@@ -1400,7 +1396,7 @@ int ReloadMapCycleFile( char *filename, mapcycle_t *cycle )
 			}
 		}
 
-		FREE_FILE( aFileList );
+		FREE_FILE( (void*)aFileList );
 	}
 
 	// Fixup circular list pointer
@@ -1536,7 +1532,7 @@ void CHalfLifeMultiplay::ChangeLevel( void )
 	BOOL do_cycle = TRUE;
 
 	// find the map to change to
-	char *mapcfile = (char*)CVAR_GET_STRING( "mapcyclefile" );
+	const char *mapcfile = CVAR_GET_STRING( "mapcyclefile" );
 	ASSERT( mapcfile != NULL );
 
 	szCommands[0] = '\0';
@@ -1654,8 +1650,8 @@ void CHalfLifeMultiplay::SendMOTDToClient( edict_t *client )
 {
 	// read from the MOTD.txt file
 	int length, char_count = 0;
-	char *pFileList;
-	char *aFileList = pFileList = (char*)LOAD_FILE_FOR_ME( (char *)CVAR_GET_STRING( "motdfile" ), &length );
+	const char *pFileList;
+	const char *aFileList = pFileList = (const char*)LOAD_FILE_FOR_ME( CVAR_GET_STRING( "motdfile" ), &length );
 
 	// send the server name
 	MESSAGE_BEGIN( MSG_ONE, gmsgServerName, NULL, client );
@@ -1683,13 +1679,13 @@ void CHalfLifeMultiplay::SendMOTDToClient( edict_t *client )
 		if( char_count < MAX_MOTD_LENGTH )
 			pFileList = aFileList + char_count; 
 		else
-			*pFileList = 0;
+			pFileList = 0;
 
 		MESSAGE_BEGIN( MSG_ONE, gmsgMOTD, NULL, client );
-			WRITE_BYTE( *pFileList ? FALSE : TRUE );	// FALSE means there is still more message to come
+			WRITE_BYTE( pFileList ? FALSE : TRUE );	// FALSE means there is still more message to come
 			WRITE_STRING( chunk );
 		MESSAGE_END();
 	}
 
-	FREE_FILE( aFileList );
+	FREE_FILE( (void*)aFileList );
 }
diff --git a/dlls/nihilanth.cpp b/dlls/nihilanth.cpp
index 58317b3c..1d072db4 100644
--- a/dlls/nihilanth.cpp
+++ b/dlls/nihilanth.cpp
@@ -34,6 +34,7 @@ public:
 
 	void Spawn( void );
 	void Precache( void );
+	void UpdateOnRemove();
 	int Classify( void ) { return CLASS_ALIEN_MILITARY; };
 	int BloodColor( void ) { return BLOOD_COLOR_YELLOW; }
 	void Killed( entvars_t *pevAttacker, int iGib );
@@ -345,6 +346,26 @@ void CNihilanth::Precache( void )
 	PRECACHE_SOUND( "debris/beamstart7.wav" );
 }
 
+void CNihilanth::UpdateOnRemove()
+{
+	CBaseEntity::UpdateOnRemove();
+ 
+	if( m_pBall )
+	{
+		UTIL_Remove( m_pBall );
+		m_pBall = 0;
+	}
+
+	for( int i = 0; i < N_SPHERES; i++ )
+	{
+		if( CBaseEntity* pSphere = (CBaseEntity *)m_hSphere[i] )
+		{
+			UTIL_Remove( pSphere );
+			m_hSphere[i] = 0;
+		}
+	}
+}
+
 void CNihilanth::PainSound( void )
 {
 	if( m_flNextPainSound > gpGlobals->time )
@@ -457,7 +478,7 @@ void CNihilanth::DyingThink( void )
 	{
 		if( m_pBall->pev->renderamt > 0 )
 		{
-			m_pBall->pev->renderamt = max( 0, m_pBall->pev->renderamt - 2 );
+			m_pBall->pev->renderamt = Q_max( 0, m_pBall->pev->renderamt - 2 );
 		}
 		else
 		{
@@ -587,7 +608,7 @@ void CNihilanth::ShootBalls( void )
 
 		while( m_flShootTime < m_flShootEnd && m_flShootTime < gpGlobals->time )
 		{
-			if( m_hEnemy != NULL )
+			if( m_hEnemy != 0 )
 			{
 				Vector vecSrc, vecDir;
 				CNihilanthHVR *pEntity;
@@ -621,14 +642,14 @@ void CNihilanth::MakeFriend( Vector vecStart )
 
 	for( i = 0; i < 3; i++ )
 	{
-		if( m_hFriend[i] != NULL && !m_hFriend[i]->IsAlive() )
+		if( m_hFriend[i] != 0 && !m_hFriend[i]->IsAlive() )
 		{
 			if( pev->rendermode == kRenderNormal ) // don't do it if they are already fading
 				m_hFriend[i]->MyMonsterPointer()->FadeMonster();
 			m_hFriend[i] = NULL;
 		}
 
-		if( m_hFriend[i] == NULL )
+		if( m_hFriend[i] == 0 )
 		{
 			if( RANDOM_LONG( 0, 1 ) == 0 )
 			{
@@ -654,7 +675,7 @@ void CNihilanth::MakeFriend( Vector vecStart )
 						m_hFriend[i] = Create( "monster_alien_slave", node.m_vecOrigin, pev->angles );
 				}
 			}
-			if( m_hFriend[i] != NULL )
+			if( m_hFriend[i] != 0 )
 			{
 				EMIT_SOUND( m_hFriend[i]->edict(), CHAN_WEAPON, "debris/beamstart7.wav", 1.0, ATTN_NORM );
 			}
@@ -701,7 +722,7 @@ void CNihilanth::NextActivity()
 		}
 	}
 
-	if( ( pev->health < gSkillData.nihilanthHealth / 2 || m_iActiveSpheres < N_SPHERES / 2 ) && m_hRecharger == NULL && m_iLevel <= 9 )
+	if( ( pev->health < gSkillData.nihilanthHealth / 2 || m_iActiveSpheres < N_SPHERES / 2 ) && m_hRecharger == 0 && m_iLevel <= 9 )
 	{
 		char szName[64];
 
@@ -742,7 +763,7 @@ void CNihilanth::NextActivity()
 	float flDist = ( m_posDesired - pev->origin ).Length();
 	float flDot = DotProduct( m_vecDesired, gpGlobals->v_forward );
 
-	if( m_hRecharger != NULL )
+	if( m_hRecharger != 0 )
 	{
 		// at we at power up yet?
 		if( flDist < 128.0 )
@@ -767,23 +788,23 @@ void CNihilanth::NextActivity()
 		return;
 	}
 
-	if( m_hEnemy != NULL && !m_hEnemy->IsAlive() )
+	if( m_hEnemy != 0 && !m_hEnemy->IsAlive() )
 	{
-		m_hEnemy = NULL;
+		m_hEnemy = 0;
 	}
 
 	if( m_flLastSeen + 15 < gpGlobals->time )
 	{
-		m_hEnemy = NULL;
+		m_hEnemy = 0;
 	}
 
-	if( m_hEnemy == NULL )
+	if( m_hEnemy == 0 )
 	{
 		Look( 4096 );
 		m_hEnemy = BestVisibleEnemy();
 	}
 
-	if( m_hEnemy != NULL && m_irritation != 0 )
+	if( m_hEnemy != 0 && m_irritation != 0 )
 	{
 		if( m_flLastSeen + 5 > gpGlobals->time && flDist < 256 && flDot > 0 )
 		{
@@ -860,7 +881,7 @@ void CNihilanth::HuntThink( void )
 	}
 
 	// look for current enemy	
-	if( m_hEnemy != NULL && m_hRecharger == NULL )
+	if( m_hEnemy != 0 && m_hRecharger == 0 )
 	{
 		if( FVisible( m_hEnemy ) )
 		{
@@ -874,7 +895,7 @@ void CNihilanth::HuntThink( void )
 		}
 		else
 		{
-			m_flAdj = min( m_flAdj + 10, 1000 );
+			m_flAdj = Q_min( m_flAdj + 10, 1000 );
 		}
 	}
 
@@ -928,7 +949,7 @@ void CNihilanth::Flight( void )
 	if( flDir < 0 )
 		flSpeed = -flSpeed;
 
-	float flDist = DotProduct( m_posDesired - vecEst, gpGlobals->v_forward );
+	//float flDist = DotProduct( m_posDesired - vecEst, gpGlobals->v_forward );
 
 	// sideways drag
 	m_velocity.x = m_velocity.x * ( 1.0 - fabs( gpGlobals->v_right.x ) * 0.05 );
@@ -959,7 +980,7 @@ BOOL CNihilanth::AbsorbSphere( void )
 {
 	for( int i = 0; i < N_SPHERES; i++ )
 	{
-		if( m_hSphere[i] != NULL )
+		if( m_hSphere[i] != 0 )
 		{
 			CNihilanthHVR *pSphere = (CNihilanthHVR *)( (CBaseEntity *)m_hSphere[i] );
 			pSphere->AbsorbInit();
@@ -978,7 +999,7 @@ BOOL CNihilanth::EmitSphere( void )
 
 	for( int i = 0; i < N_SPHERES; i++ )
 	{
-		if( m_hSphere[i] != NULL )
+		if( m_hSphere[i] != 0 )
 		{
 			m_iActiveSpheres++;
 		}
@@ -1007,10 +1028,10 @@ void CNihilanth::TargetSphere( USE_TYPE useType, float value )
 
 	for( i = 0; i < N_SPHERES; i++ )
 	{
-		if( m_hSphere[i] != NULL )
+		if( m_hSphere[i] != 0 )
 		{
 			pSphere = m_hSphere[i]->MyMonsterPointer();
-			if( pSphere->m_hEnemy == NULL )
+			if( pSphere->m_hEnemy == 0 )
 				break;
 		}
 	}
@@ -1036,7 +1057,7 @@ void CNihilanth::HandleAnimEvent( MonsterEvent_t *pEvent )
 		break;
 	case 2:
 		// zen
-		if( m_hEnemy != NULL )
+		if( m_hEnemy != 0 )
 		{
 			if( RANDOM_LONG( 0, 4 ) == 0 )
 				EMIT_SOUND( edict(), CHAN_VOICE, RANDOM_SOUND_ARRAY( pAttackSounds ), 1.0, 0.2 ); 
@@ -1077,7 +1098,7 @@ void CNihilanth::HandleAnimEvent( MonsterEvent_t *pEvent )
 		break;
 	case 3:
 		// prayer
-		if (m_hEnemy != NULL)
+		if( m_hEnemy != 0 )
 		{
 			char szText[32];
 
@@ -1141,7 +1162,7 @@ void CNihilanth::HandleAnimEvent( MonsterEvent_t *pEvent )
 	case 4:
 		// get a sphere
 		{
-			if( m_hRecharger != NULL )
+			if( m_hRecharger != 0 )
 			{
 				if( !EmitSphere() )
 				{
@@ -1157,7 +1178,7 @@ void CNihilanth::HandleAnimEvent( MonsterEvent_t *pEvent )
 		}
 		break;
 	case 6:
-		if( m_hEnemy != NULL )
+		if( m_hEnemy != 0 )
 		{
 			Vector vecSrc, vecAngles;
 			GetAttachment( 2, vecSrc, vecAngles ); 
@@ -1185,8 +1206,22 @@ void CNihilanth::CommandUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_
 	case USE_OFF:
 		{
 			CBaseEntity *pTouch = UTIL_FindEntityByTargetname( NULL, m_szDeadTouch );
-			if( pTouch && m_hEnemy != NULL )
-				pTouch->Touch( m_hEnemy );
+			if( pTouch )
+			{
+				if( m_hEnemy != 0 )
+				{
+					pTouch->Touch( m_hEnemy );
+				}
+				// if the player is using "notarget", the ending sequence won't fire unless we catch it here
+				else
+				{
+					CBaseEntity *pEntity = UTIL_FindEntityByClassname( NULL, "player" );
+					if( pEntity != NULL && pEntity->IsAlive() )
+					{
+						pTouch->Touch( pEntity );
+					}
+				}
+			}
 		}
 		break;
 	case USE_ON:
@@ -1326,7 +1361,7 @@ void CNihilanthHVR::HoverThink( void )
 {
 	pev->nextthink = gpGlobals->time + 0.1;
 
-	if( m_hTargetEnt != NULL )
+	if( m_hTargetEnt != 0 )
 	{
 		CircleTarget( m_hTargetEnt->pev->origin + Vector( 0, 0, 16 * N_SCALE ) );
 	}
@@ -1410,7 +1445,7 @@ void CNihilanthHVR::ZapThink( void )
 	pev->nextthink = gpGlobals->time + 0.05;
 
 	// check world boundaries
-	if( m_hEnemy == NULL ||  pev->origin.x < -4096 || pev->origin.x > 4096 || pev->origin.y < -4096 || pev->origin.y > 4096 || pev->origin.z < -4096 || pev->origin.z > 4096 )
+	if( m_hEnemy == 0 ||  pev->origin.x < -4096 || pev->origin.x > 4096 || pev->origin.y < -4096 || pev->origin.y > 4096 || pev->origin.z < -4096 || pev->origin.z > 4096 )
 	{
 		SetTouch( NULL );
 		UTIL_Remove( this );
@@ -1547,7 +1582,7 @@ void CNihilanthHVR::TeleportThink( void )
 	pev->nextthink = gpGlobals->time + 0.1;
 
 	// check world boundaries
-	if( m_hEnemy == NULL || !m_hEnemy->IsAlive() || pev->origin.x < -4096 || pev->origin.x > 4096 || pev->origin.y < -4096 || pev->origin.y > 4096 || pev->origin.z < -4096 || pev->origin.z > 4096 )
+	if( m_hEnemy == 0 || !m_hEnemy->IsAlive() || pev->origin.x < -4096 || pev->origin.x > 4096 || pev->origin.y < -4096 || pev->origin.y > 4096 || pev->origin.z < -4096 || pev->origin.z > 4096 )
 	{
 		STOP_SOUND( edict(), CHAN_WEAPON, "x/x_teleattack1.wav" );
 		UTIL_Remove( this );
@@ -1559,10 +1594,10 @@ void CNihilanthHVR::TeleportThink( void )
 		STOP_SOUND( edict(), CHAN_WEAPON, "x/x_teleattack1.wav" );
 		UTIL_Remove( this );
 
-		if( m_hTargetEnt != NULL )
+		if( m_hTargetEnt != 0 )
 			m_hTargetEnt->Use( m_hEnemy, m_hEnemy, USE_ON, 1.0 );
 
-		if( m_hTouch != NULL && m_hEnemy != NULL )
+		if( m_hTouch != 0 && m_hEnemy != 0 )
 			m_hTouch->Touch( m_hEnemy );
 	}
 	else 
@@ -1616,10 +1651,10 @@ void CNihilanthHVR::TeleportTouch( CBaseEntity *pOther )
 
 	if( pOther == pEnemy )
 	{
-		if( m_hTargetEnt != NULL )
+		if( m_hTargetEnt != 0 )
 			m_hTargetEnt->Use( pEnemy, pEnemy, USE_ON, 1.0 );
 
-		if( m_hTouch != NULL && pEnemy != NULL )
+		if( m_hTouch != 0 && pEnemy != NULL )
 			m_hTouch->Touch( pEnemy );
 	}
 	else
@@ -1642,7 +1677,7 @@ void CNihilanthHVR::DissipateThink( void )
 	pev->renderamt -= 2;
 	pev->scale += 0.1;
 
-	if( m_hTargetEnt != NULL )
+	if( m_hTargetEnt != 0 )
 	{
 		CircleTarget( m_hTargetEnt->pev->origin + Vector( 0, 0, 4096 ) );
 	}
diff --git a/dlls/nodes.cpp b/dlls/nodes.cpp
index a97b6a80..04705638 100644
--- a/dlls/nodes.cpp
+++ b/dlls/nodes.cpp
@@ -214,7 +214,7 @@ entvars_t *CGraph::LinkEntForLink( CLink *pLink, CNode *pNode )
 //=========================================================
 int CGraph::HandleLinkEnt( int iNode, entvars_t *pevLinkEnt, int afCapMask, NODEQUERY queryType )
 {
-	edict_t *pentWorld;
+	//edict_t *pentWorld;
 	CBaseEntity *pDoor;
 	TraceResult tr;
 
@@ -230,7 +230,7 @@ int CGraph::HandleLinkEnt( int iNode, entvars_t *pevLinkEnt, int afCapMask, NODE
 		ALERT( at_aiconsole, "dead path ent!\n" );
 		return TRUE;
 	}
-	pentWorld = NULL;
+	//pentWorld = NULL;
 
 	// func_door
 	if( FClassnameIs( pevLinkEnt, "func_door" ) || FClassnameIs( pevLinkEnt, "func_door_rotating" ) )
@@ -586,7 +586,7 @@ int CGraph::FindShortestPath( int *piPath, int iStart, int iDest, int iHull, int
 	int iVisitNode;
 	int iCurrentNode;
 	int iNumPathNodes;
-	int iHullMask;
+	int iHullMask = 0;
 
 	if( !m_fGraphPresent || !m_fGraphPointersSet )
 	{
@@ -793,12 +793,12 @@ void inline CalcBounds( int &Lower, int &Upper, int Goal, int Best )
 	int Temp = 2 * Goal - Best;
 	if( Best > Goal )
 	{
-		Lower = max( 0, Temp );
+		Lower = Q_max( 0, Temp );
 		Upper = Best;
 	}
 	else
 	{
-		Upper = min( 255, Temp );
+		Upper = Q_min( 255, Temp );
 		Lower = Best;
 	}
 }
@@ -962,7 +962,7 @@ int CGraph::FindNearestNode( const Vector &vecOrigin, int afNodeTypes )
 		}
 	}
 
-	for( i = max( m_minY, halfY + 1 ); i <= m_maxY; i++ )
+	for( i = Q_max( m_minY, halfY + 1 ); i <= m_maxY; i++ )
 	{
 		for( j = m_RangeStart[1][i]; j <= m_RangeEnd[1][i]; j++ )
 		{
@@ -987,7 +987,7 @@ int CGraph::FindNearestNode( const Vector &vecOrigin, int afNodeTypes )
 		}
 	}
 
-	for( i = min( m_maxZ, halfZ ); i >= m_minZ; i-- )
+	for( i = Q_min( m_maxZ, halfZ ); i >= m_minZ; i-- )
 	{
 		for( j = m_RangeStart[2][i]; j <= m_RangeEnd[2][i]; j++ )
 		{
@@ -1012,7 +1012,7 @@ int CGraph::FindNearestNode( const Vector &vecOrigin, int afNodeTypes )
 		}
 	}
 
-	for( i = max( m_minX, halfX + 1 ); i <= m_maxX; i++ )
+	for( i = Q_max( m_minX, halfX + 1 ); i <= m_maxX; i++ )
 	{
 		for( j = m_RangeStart[0][i]; j <= m_RangeEnd[0][i]; j++ )
 		{
@@ -1034,7 +1034,7 @@ int CGraph::FindNearestNode( const Vector &vecOrigin, int afNodeTypes )
 		}
 	}
 
-	for( i = min( m_maxY, halfY ); i >= m_minY; i-- )
+	for( i = Q_min( m_maxY, halfY ); i >= m_minY; i-- )
 	{
 		for( j = m_RangeStart[1][i]; j <= m_RangeEnd[1][i]; j++ )
 		{
@@ -1055,7 +1055,7 @@ int CGraph::FindNearestNode( const Vector &vecOrigin, int afNodeTypes )
 		}
 	}
 
-	for( i = max( m_minZ, halfZ + 1 ); i <= m_maxZ; i++ )
+	for( i = Q_max( m_minZ, halfZ + 1 ); i <= m_maxZ; i++ )
 	{
 		for( j = m_RangeStart[2][i]; j <= m_RangeEnd[2][i]; j++ )
 		{
@@ -1665,10 +1665,10 @@ void CTestHull::BuildNodeGraph( void )
 
 	int iBadNode;// this is the node that caused graph generation to fail
 
-	int cMaxInitialLinks = 0;
-	int cMaxValidLinks = 0;
+	//int cMaxInitialLinks = 0;
+	//int cMaxValidLinks = 0;
 
-	int iPoolIndex = 0;
+	//int iPoolIndex = 0;
 	int cPoolLinks;// number of links in the pool.
 
 	Vector vecDirToCheckNode;
@@ -2058,11 +2058,16 @@ void CTestHull::BuildNodeGraph( void )
 		fprintf( file, "\nAll Connections are Paired!\n" );
 	}
 
+#ifdef _MSC_VER
+#define SIZET_FMT "%Iu"
+#else
+#define SIZET_FMT "%zu"
+#endif
 	fprintf( file, "-------------------------------------------------------------------------------\n" );
 	fprintf( file, "\n\n-------------------------------------------------------------------------------\n" );
 	fprintf( file, "Total Number of Connections in Pool: %d\n", cPoolLinks );
 	fprintf( file, "-------------------------------------------------------------------------------\n" );
-	fprintf( file, "Connection Pool: %d bytes\n", sizeof(CLink) * cPoolLinks );
+	fprintf( file, "Connection Pool: " SIZET_FMT " bytes\n", sizeof(CLink) * cPoolLinks );
 	fprintf( file, "-------------------------------------------------------------------------------\n" );
 
 	ALERT( at_aiconsole, "%d Nodes, %d Connections\n", WorldGraph.m_cNodes, cPoolLinks );
@@ -2103,7 +2108,7 @@ void CTestHull::BuildNodeGraph( void )
 	WorldGraph.ComputeStaticRoutingTables();
 
 	// save the node graph for this level	
-	WorldGraph.FSaveGraph( (char *)STRING( gpGlobals->mapname ) );
+	WorldGraph.FSaveGraph( STRING( gpGlobals->mapname ) );
 	ALERT( at_console, "Done.\n" );
 }
 
@@ -2358,7 +2363,7 @@ void CQueuePriority::Heap_SiftUp( void )
 // will be loaded. If file cannot be loaded, the node tree
 // will be created and saved to disk.
 //=========================================================
-int CGraph::FLoadGraph( char *szMapName )
+int CGraph::FLoadGraph( const char *szMapName )
 {
 	char szFilename[MAX_PATH];
 	int iVersion;
@@ -2537,7 +2542,7 @@ NoMemory:
 // CGraph - FSaveGraph - It's not rocket science.
 // this WILL overwrite existing files.
 //=========================================================
-int CGraph::FSaveGraph( char *szMapName )
+int CGraph::FSaveGraph( const char *szMapName )
 {
 	int iVersion = GRAPH_VERSION;
 	char szFilename[MAX_PATH];
@@ -2669,7 +2674,7 @@ int CGraph::FSetGraphPointers( void )
 // though. ( I now suspect that we are getting GMT back from
 // these functions and must compensate for local time ) (sjb)
 //=========================================================
-int CGraph::CheckNODFile( char *szMapName )
+int CGraph::CheckNODFile( const char *szMapName )
 {
 	int retValue;
 
diff --git a/dlls/nodes.h b/dlls/nodes.h
index 27b890ed..52b715e5 100644
--- a/dlls/nodes.h
+++ b/dlls/nodes.h
@@ -15,7 +15,9 @@
 //=========================================================
 // nodes.h
 //=========================================================
-
+#pragma once
+#ifndef		NODES_H
+#define		NODES_H
 //=========================================================
 // DEFINE
 //=========================================================
@@ -103,7 +105,11 @@ typedef struct
 //=========================================================
 // CGraph 
 //=========================================================
+#ifdef XASH_64BIT
+#define	GRAPH_VERSION	(int)16 * 10
+#else
 #define	GRAPH_VERSION	(int)16// !!!increment this whever graph/node/link classes change, to obsolesce older disk files.
+#endif
 
 class CGraph
 {
@@ -177,9 +183,9 @@ public:
 	void	InitGraph( void );
 	int		AllocNodes ( void );
 	
-	int		CheckNODFile(char *szMapName);
-	int		FLoadGraph(char *szMapName);
-	int		FSaveGraph(char *szMapName);
+	int		CheckNODFile(const char *szMapName);
+	int		FLoadGraph(const char *szMapName);
+	int		FSaveGraph(const char *szMapName);
 	int		FSetGraphPointers(void);
 	void	CheckNode(Vector vecOrigin, int iNode);
 
@@ -370,3 +376,4 @@ enum
 };
 
 extern CGraph WorldGraph;
+#endif // NODES_H
diff --git a/dlls/observer.cpp b/dlls/observer.cpp
new file mode 100644
index 00000000..22fa3818
--- /dev/null
+++ b/dlls/observer.cpp
@@ -0,0 +1,291 @@
+//=========== (C) Copyright 1999 Valve, L.L.C. All rights reserved. ===========
+//
+// The copyright to the contents herein is the property of Valve, L.L.C.
+// The contents may be used and/or copied only with the written permission of
+// Valve, L.L.C., or in accordance with the terms and conditions stipulated in
+// the agreement/contract under which the contents have been supplied.
+//
+// Purpose: Functionality for the observer chase camera
+//
+// $Workfile:     $
+// $Date:         $
+//
+//-----------------------------------------------------------------------------
+// $Log: $
+//
+// $NoKeywords: $
+//=============================================================================
+#include	"extdll.h"
+#include	"util.h"
+#include	"cbase.h"
+#include	"player.h"
+#include	"weapons.h"
+#include	"pm_shared.h"
+
+extern int gmsgCurWeapon;
+extern int gmsgSetFOV;
+extern int gmsgTeamInfo;
+         
+extern int g_teamplay;
+
+// Find the next client in the game for this player to spectate
+void CBasePlayer::Observer_FindNextPlayer( bool bReverse )
+{
+	// MOD AUTHORS: Modify the logic of this function if you want to restrict the observer to watching
+	//				only a subset of the players. e.g. Make it check the target's team.
+	int iStart;
+	if( m_hObserverTarget )
+		iStart = ENTINDEX( m_hObserverTarget->edict() );
+	else
+		iStart = ENTINDEX( edict() );
+	int iCurrent = iStart;
+	m_hObserverTarget = 0;
+	int iDir = bReverse ? -1 : 1; 
+
+	do
+	{
+		iCurrent += iDir;
+
+		// Loop through the clients
+		if( iCurrent > gpGlobals->maxClients )
+			iCurrent = 1;
+		if( iCurrent < 1 )
+			iCurrent = gpGlobals->maxClients;
+
+		CBaseEntity *pEnt = UTIL_PlayerByIndex( iCurrent );
+		if( !pEnt )
+			continue;
+		if( pEnt == this )
+			continue;
+		// Don't spec observers or players who haven't picked a class yet
+		if( ( (CBasePlayer*)pEnt )->IsObserver() || ( pEnt->pev->effects & EF_NODRAW ) )
+			continue;
+
+		// MOD AUTHORS: Add checks on target here.
+		m_hObserverTarget = pEnt;
+		break;
+	}while( iCurrent != iStart );
+
+	// Did we find a target?
+	if( m_hObserverTarget )
+	{
+		// Move to the target
+		UTIL_SetOrigin( pev, m_hObserverTarget->pev->origin );
+
+		// ALERT( at_console, "Now Tracking %s\n", STRING( m_hObserverTarget->pev->netname ) );
+
+		// Store the target in pev so the physics DLL can get to it
+		if( pev->iuser1 != OBS_ROAMING )
+			pev->iuser2 = ENTINDEX( m_hObserverTarget->edict() );
+	}
+}
+
+// Handle buttons in observer mode
+void CBasePlayer::Observer_HandleButtons()
+{
+	// Slow down mouse clicks
+	if( m_flNextObserverInput > gpGlobals->time )
+		return;
+
+	// Jump changes from modes: Chase to Roaming
+	if( m_afButtonPressed & IN_JUMP )
+	{
+		if( pev->iuser1 == OBS_CHASE_LOCKED )
+			Observer_SetMode( OBS_CHASE_FREE );
+		else if( pev->iuser1 == OBS_CHASE_FREE )
+			Observer_SetMode( OBS_IN_EYE );
+		else if( pev->iuser1 == OBS_IN_EYE )
+			Observer_SetMode( OBS_ROAMING );
+		else if( pev->iuser1 == OBS_ROAMING )
+			Observer_SetMode( OBS_MAP_FREE );
+		else if( pev->iuser1 == OBS_MAP_FREE )
+			Observer_SetMode( OBS_MAP_CHASE );
+		else
+			Observer_SetMode( OBS_CHASE_FREE );	// don't use OBS_CHASE_LOCKED anymore
+
+		m_flNextObserverInput = gpGlobals->time + 0.2;
+	}
+
+	// Attack moves to the next player
+	if ( m_afButtonPressed & IN_ATTACK )//&& pev->iuser1 != OBS_ROAMING )
+	{
+		Observer_FindNextPlayer( false );
+
+		m_flNextObserverInput = gpGlobals->time + 0.2;
+	}
+
+	// Attack2 moves to the prev player
+	if ( m_afButtonPressed & IN_ATTACK2)// && pev->iuser1 != OBS_ROAMING )
+	{
+		Observer_FindNextPlayer( true );
+
+		m_flNextObserverInput = gpGlobals->time + 0.2;
+	}
+}
+
+void CBasePlayer::Observer_CheckTarget()
+{
+	if( pev->iuser1 == OBS_ROAMING )
+		return;
+
+	// try to find a traget if we have no current one
+	if( m_hObserverTarget == 0 )
+	{
+		Observer_FindNextPlayer( false );
+
+		if( m_hObserverTarget == 0 )
+		{
+			// no target found at all 
+
+			int lastMode = pev->iuser1;
+
+			Observer_SetMode( OBS_ROAMING );
+
+			m_iObserverLastMode = lastMode;	// don't overwrite users lastmode
+
+			return;	// we still have np target return
+		}
+	}
+
+	CBasePlayer* target = (CBasePlayer*)( UTIL_PlayerByIndex( ENTINDEX( m_hObserverTarget->edict() ) ) );
+
+	if( !target )
+	{
+		Observer_FindNextPlayer( false );
+		return;
+	}
+
+	// check taget
+	if( target->pev->deadflag == DEAD_DEAD )
+	{
+		if( ( target->m_fDeadTime + 2.0f ) < gpGlobals->time )
+		{
+			// 3 secs after death change target
+			Observer_FindNextPlayer( false );
+			return;
+		}
+	}
+}
+
+void CBasePlayer::Observer_CheckProperties()
+{
+	// try to find a traget if we have no current one
+	if( pev->iuser1 == OBS_IN_EYE && m_hObserverTarget != 0 )
+	{
+		CBasePlayer* target = (CBasePlayer*)( UTIL_PlayerByIndex( ENTINDEX( m_hObserverTarget->edict() ) ) );
+
+		if( !target )
+			return;
+
+		int weapon = ( target->m_pActiveItem != NULL ) ? target->m_pActiveItem->m_iId : 0;
+		// use fov of tracked client
+		if( m_iFOV != target->m_iFOV || m_iObserverWeapon != weapon )
+		{
+			m_iFOV = target->m_iFOV;
+			m_iClientFOV = m_iFOV;
+			// write fov before wepon data, so zoomed crosshair is set correctly
+			MESSAGE_BEGIN( MSG_ONE, gmsgSetFOV, NULL, pev );
+				WRITE_BYTE( m_iFOV );
+			MESSAGE_END();
+
+			m_iObserverWeapon = weapon;
+			//send weapon update
+			MESSAGE_BEGIN( MSG_ONE, gmsgCurWeapon, NULL, pev );
+				WRITE_BYTE( 1 );	// 1 = current weapon, not on target
+				WRITE_BYTE( m_iObserverWeapon );	
+				WRITE_BYTE( 0 );	// clip
+			MESSAGE_END();
+		}
+	}
+	else
+	{
+		m_iFOV = 90;
+
+		if( m_iObserverWeapon != 0 )
+		{
+			m_iObserverWeapon = 0;
+
+			MESSAGE_BEGIN( MSG_ONE, gmsgCurWeapon, NULL, pev );
+				WRITE_BYTE( 1 );	// 1 = current weapon
+				WRITE_BYTE( m_iObserverWeapon );	
+				WRITE_BYTE( 0 );	// clip
+			MESSAGE_END();
+		}
+	}
+}
+
+// Attempt to change the observer mode
+void CBasePlayer::Observer_SetMode( int iMode )
+{
+
+	// Just abort if we're changing to the mode we're already in
+	if( iMode == pev->iuser1 )
+		return;
+
+	// is valid mode ?
+	if( iMode < OBS_CHASE_LOCKED || iMode > OBS_MAP_CHASE )
+		iMode = OBS_IN_EYE; // now it is
+	// verify observer target again
+	if( m_hObserverTarget != 0 )
+	{
+		CBaseEntity *pEnt = m_hObserverTarget;
+
+		if( ( pEnt == this ) || ( pEnt == NULL ) )
+			m_hObserverTarget = 0;
+		else if( ( (CBasePlayer*)pEnt )->IsObserver() || ( pEnt->pev->effects & EF_NODRAW ) )
+			m_hObserverTarget = 0;
+	}
+
+	// set spectator mode
+	pev->iuser1 = iMode;
+
+	// if we are not roaming, we need a valid target to track
+	if( ( iMode != OBS_ROAMING ) && ( m_hObserverTarget == 0 ) )
+	{
+		Observer_FindNextPlayer( false );
+
+		// if we didn't find a valid target switch to roaming
+		if( m_hObserverTarget == 0 )
+		{
+			ClientPrint( pev, HUD_PRINTCENTER, "#Spec_NoTarget" );
+			pev->iuser1 = OBS_ROAMING;
+		}
+	}
+
+	// set target if not roaming
+	if( pev->iuser1 == OBS_ROAMING )
+	{
+		pev->iuser2 = 0;
+	}
+	else
+		pev->iuser2 = ENTINDEX( m_hObserverTarget->edict() );
+
+	pev->iuser3 = 0;	// clear second target from death cam
+	
+	// print spepctaor mode on client screen
+
+	char modemsg[16];
+	sprintf( modemsg,"#Spec_Mode%i", pev->iuser1 );
+	ClientPrint( pev, HUD_PRINTCENTER, modemsg );
+
+	m_iObserverLastMode = iMode;
+}
+
+void CBasePlayer::StopObserver()
+{
+	// Turn off spectator
+	pev->iuser1 = pev->iuser2 = 0;
+	m_iHideHUD = 0;
+
+	GetClassPtr( (CBasePlayer *)pev )->Spawn();
+	pev->nextthink = -1;
+
+	// Update Team Status
+	MESSAGE_BEGIN( MSG_ALL, gmsgTeamInfo );
+		WRITE_BYTE( ENTINDEX( edict() ) ); // index number of primary entity
+	if( g_teamplay )
+		WRITE_STRING( TeamID() );
+	else
+		WRITE_STRING( "Players" );
+	MESSAGE_END();
+}
diff --git a/dlls/osprey.cpp b/dlls/osprey.cpp
index 95088d2b..6a421645 100644
--- a/dlls/osprey.cpp
+++ b/dlls/osprey.cpp
@@ -261,7 +261,7 @@ BOOL COsprey::HasDead()
 {
 	for( int i = 0; i < m_iUnits; i++ )
 	{
-		if( m_hGrunt[i] == NULL || !m_hGrunt[i]->IsAlive() )
+		if( m_hGrunt[i] == 0 || !m_hGrunt[i]->IsAlive() )
 		{
 			return TRUE;
 		}
@@ -285,9 +285,9 @@ CBaseMonster *COsprey::MakeGrunt( Vector vecSrc )
 
 	for( int i = 0; i < m_iUnits; i++ )
 	{
-		if( m_hGrunt[i] == NULL || !m_hGrunt[i]->IsAlive() )
+		if( m_hGrunt[i] == 0 || !m_hGrunt[i]->IsAlive() )
 		{
-			if( m_hGrunt[i] != NULL && m_hGrunt[i]->pev->rendermode == kRenderNormal )
+			if( m_hGrunt[i] != 0 && m_hGrunt[i]->pev->rendermode == kRenderNormal )
 			{
 				m_hGrunt[i]->SUB_StartFadeOut();
 			}
@@ -319,7 +319,7 @@ void COsprey::HoverThink( void )
 	int i;
 	for( i = 0; i < 4; i++ )
 	{
-		if( m_hRepel[i] != NULL && m_hRepel[i]->pev->health > 0 && !( m_hRepel[i]->pev->flags & FL_ONGROUND ) )
+		if( m_hRepel[i] != 0 && m_hRepel[i]->pev->health > 0 && !( m_hRepel[i]->pev->flags & FL_ONGROUND ) )
 		{
 			break;
 		}
diff --git a/dlls/physcallback.h b/dlls/physcallback.h
index 1db276e0..fd68936c 100644
--- a/dlls/physcallback.h
+++ b/dlls/physcallback.h
@@ -12,9 +12,9 @@
 *   without written permission from Valve LLC.
 *
 ****/
+#pragma once
 #ifndef PHYSCALLBACK_H
 #define PHYSCALLBACK_H
-#pragma once
 
 #include "physint.h"
 
diff --git a/dlls/plane.h b/dlls/plane.h
index 35a17611..912062f6 100644
--- a/dlls/plane.h
+++ b/dlls/plane.h
@@ -12,12 +12,12 @@
 *   without written permission from Valve LLC.
 *
 ****/
-#ifndef PLANE_H
-#define PLANE_H
-
 //=========================================================
 // Plane
 //=========================================================
+#ifndef PLANE_H
+#define PLANE_H
+
 class CPlane
 {
 public:
diff --git a/dlls/plats.cpp b/dlls/plats.cpp
index 4b22131b..84e7d82b 100644
--- a/dlls/plats.cpp
+++ b/dlls/plats.cpp
@@ -82,12 +82,12 @@ void CBasePlatTrain::KeyValue( KeyValueData *pkvd )
 	}
 	else if( FStrEq( pkvd->szKeyName, "movesnd" ) )
 	{
-		m_bMoveSnd = atof( pkvd->szValue );
+		m_bMoveSnd = atoi( pkvd->szValue );
 		pkvd->fHandled = TRUE;
 	}
 	else if( FStrEq( pkvd->szKeyName, "stopsnd" ) )
 	{
-		m_bStopSnd = atof( pkvd->szValue );
+		m_bStopSnd = atoi( pkvd->szValue );
 		pkvd->fHandled = TRUE;
 	}
 	else if( FStrEq( pkvd->szKeyName, "volume" ) )
@@ -104,111 +104,100 @@ void CBasePlatTrain::KeyValue( KeyValueData *pkvd )
 
 void CBasePlatTrain::Precache( void )
 {
+	const char *pszSound;
+	BOOL NullSound = FALSE;
+
 	// set the plat's "in-motion" sound
 	switch( m_bMoveSnd )
 	{
-	case 0:
-		pev->noiseMoving = MAKE_STRING( "common/null.wav" );
-		break;
 	case 1:
-		PRECACHE_SOUND( "plats/bigmove1.wav" );
-		pev->noiseMoving = MAKE_STRING( "plats/bigmove1.wav" );
+		pszSound = "plats/bigmove1.wav";
 		break;
 	case 2:
-		PRECACHE_SOUND( "plats/bigmove2.wav" );
-		pev->noiseMoving = MAKE_STRING( "plats/bigmove2.wav" );
+		pszSound = "plats/bigmove2.wav";
 		break;
 	case 3:
-		PRECACHE_SOUND( "plats/elevmove1.wav" );
-		pev->noiseMoving = MAKE_STRING( "plats/elevmove1.wav" );
+		pszSound = "plats/elevmove1.wav";
 		break;
 	case 4:
-		PRECACHE_SOUND( "plats/elevmove2.wav" );
-		pev->noiseMoving = MAKE_STRING( "plats/elevmove2.wav" );
+		pszSound = "plats/elevmove2.wav";
 		break;
 	case 5:
-		PRECACHE_SOUND( "plats/elevmove3.wav" );
-		pev->noiseMoving = MAKE_STRING( "plats/elevmove3.wav" );
+		pszSound = "plats/elevmove3.wav";
 		break;
 	case 6:
-		PRECACHE_SOUND( "plats/freightmove1.wav" );
-		pev->noiseMoving = MAKE_STRING( "plats/freightmove1.wav" );
+		pszSound = "plats/freightmove1.wav";
 		break;
 	case 7:
-		PRECACHE_SOUND( "plats/freightmove2.wav" );
-		pev->noiseMoving = MAKE_STRING( "plats/freightmove2.wav" );
+		pszSound = "plats/freightmove2.wav";
 		break;
 	case 8:
-		PRECACHE_SOUND( "plats/heavymove1.wav" );
-		pev->noiseMoving = MAKE_STRING( "plats/heavymove1.wav" );
+		pszSound = "plats/heavymove1.wav";
 		break;
 	case 9:
-		PRECACHE_SOUND( "plats/rackmove1.wav" );
-		pev->noiseMoving = MAKE_STRING( "plats/rackmove1.wav" );
+		pszSound = "plats/rackmove1.wav";
 		break;
 	case 10:
-		PRECACHE_SOUND( "plats/railmove1.wav" );
-		pev->noiseMoving = MAKE_STRING( "plats/railmove1.wav" );
+		pszSound = "plats/railmove1.wav";
 		break;
 	case 11:
-		PRECACHE_SOUND( "plats/squeekmove1.wav" );
-		pev->noiseMoving = MAKE_STRING( "plats/squeekmove1.wav" );
+		pszSound = "plats/squeekmove1.wav";
 		break;
 	case 12:
-		PRECACHE_SOUND( "plats/talkmove1.wav" );
-		pev->noiseMoving = MAKE_STRING( "plats/talkmove1.wav" );
+		pszSound = "plats/talkmove1.wav";
 		break;
 	case 13:
-		PRECACHE_SOUND( "plats/talkmove2.wav" );
-		pev->noiseMoving = MAKE_STRING( "plats/talkmove2.wav" );
+		pszSound = "plats/talkmove2.wav";
 		break;
+	case 0:
 	default:
-		pev->noiseMoving = MAKE_STRING( "common/null.wav" );
+		pszSound = "common/null.wav";
+		NullSound = TRUE;
 		break;
 	}
 
+	if( !NullSound )
+                PRECACHE_SOUND( pszSound );
+        pev->noiseMoving = MAKE_STRING( pszSound );
+	NullSound = FALSE;
+
 	// set the plat's 'reached destination' stop sound
 	switch( m_bStopSnd )
 	{
-	case 0:
-		pev->noiseArrived = MAKE_STRING( "common/null.wav" );
-		break;
 	case 1:
-		PRECACHE_SOUND( "plats/bigstop1.wav" );
-		pev->noiseArrived = MAKE_STRING( "plats/bigstop1.wav" );
+		pszSound = "plats/bigstop1.wav";
 		break;
 	case 2:
-		PRECACHE_SOUND( "plats/bigstop2.wav" );
-		pev->noiseArrived = MAKE_STRING( "plats/bigstop2.wav" );
+		pszSound = "plats/bigstop2.wav";
 		break;
 	case 3:
-		PRECACHE_SOUND( "plats/freightstop1.wav" );
-		pev->noiseArrived = MAKE_STRING( "plats/freightstop1.wav" );
+		pszSound = "plats/freightstop1.wav";
 		break;
 	case 4:
-		PRECACHE_SOUND( "plats/heavystop2.wav" );
-		pev->noiseArrived = MAKE_STRING( "plats/heavystop2.wav" );
+		pszSound = "plats/heavystop2.wav";
 		break;
 	case 5:
-		PRECACHE_SOUND( "plats/rackstop1.wav" );
-		pev->noiseArrived = MAKE_STRING( "plats/rackstop1.wav" );
+		pszSound = "plats/rackstop1.wav";
 		break;
 	case 6:
-		PRECACHE_SOUND( "plats/railstop1.wav" );
-		pev->noiseArrived = MAKE_STRING( "plats/railstop1.wav" );
+		pszSound = "plats/railstop1.wav";
 		break;
 	case 7:
-		PRECACHE_SOUND( "plats/squeekstop1.wav" );
-		pev->noiseArrived = MAKE_STRING( "plats/squeekstop1.wav" );
+		pszSound = "plats/squeekstop1.wav";
 		break;
 	case 8:
-		PRECACHE_SOUND( "plats/talkstop1.wav" );
-		pev->noiseArrived = MAKE_STRING( "plats/talkstop1.wav" );
+		pszSound = "plats/talkstop1.wav";
 		break;
+	case 0:
 	default:
-		pev->noiseArrived = MAKE_STRING( "common/null.wav" );
+		pszSound = "common/null.wav";
+		NullSound = TRUE;
 		break;
 	}
+
+	if( !NullSound )
+		PRECACHE_SOUND( pszSound );
+	pev->noiseArrived = MAKE_STRING( pszSound );
 }
 
 //
@@ -248,7 +237,7 @@ public:
 	virtual int ObjectCaps( void ) { return (CBaseEntity::ObjectCaps() & ~FCAP_ACROSS_TRANSITION) | FCAP_DONT_SAVE; }
 	void SpawnInsideTrigger( CFuncPlat *pPlatform );
 	void Touch( CBaseEntity *pOther );
-	CFuncPlat *m_pPlatform;
+	EHANDLE m_hPlatform;
 };
 
 /*QUAKED func_plat (0 .5 .8) ? PLAT_LOW_TRIGGER
@@ -340,24 +329,24 @@ static void PlatSpawnInsideTrigger( entvars_t *pevPlatform )
 //
 void CPlatTrigger::SpawnInsideTrigger( CFuncPlat *pPlatform )
 {
-	m_pPlatform = pPlatform;
+	m_hPlatform = pPlatform;
 	// Create trigger entity, "point" it at the owning platform, give it a touch method
 	pev->solid = SOLID_TRIGGER;
 	pev->movetype = MOVETYPE_NONE;
 	pev->origin = pPlatform->pev->origin;
 
 	// Establish the trigger field's size
-	Vector vecTMin = m_pPlatform->pev->mins + Vector( 25, 25, 0 );
-	Vector vecTMax = m_pPlatform->pev->maxs + Vector( 25, 25, 8 );
-	vecTMin.z = vecTMax.z - ( m_pPlatform->m_vecPosition1.z - m_pPlatform->m_vecPosition2.z + 8 );
-	if( m_pPlatform->pev->size.x <= 50 )
+	Vector vecTMin = pPlatform->pev->mins + Vector( 25, 25, 0 );
+	Vector vecTMax = pPlatform->pev->maxs + Vector( 25, 25, 8 );
+	vecTMin.z = vecTMax.z - ( pPlatform->m_vecPosition1.z - pPlatform->m_vecPosition2.z + 8 );
+	if( pPlatform->pev->size.x <= 50 )
 	{
-		vecTMin.x = ( m_pPlatform->pev->mins.x + m_pPlatform->pev->maxs.x ) / 2;
+		vecTMin.x = ( pPlatform->pev->mins.x + pPlatform->pev->maxs.x ) / 2;
 		vecTMax.x = vecTMin.x + 1;
 	}
-	if( m_pPlatform->pev->size.y <= 50 )
+	if( pPlatform->pev->size.y <= 50 )
 	{
-		vecTMin.y = ( m_pPlatform->pev->mins.y + m_pPlatform->pev->maxs.y ) / 2;
+		vecTMin.y = ( pPlatform->pev->mins.y + pPlatform->pev->maxs.y ) / 2;
 		vecTMax.y = vecTMin.y + 1;
 	}
 	UTIL_SetSize( pev, vecTMin, vecTMax );
@@ -373,15 +362,24 @@ void CPlatTrigger::Touch( CBaseEntity *pOther )
 	if( !FClassnameIs( pevToucher, "player" ) )
 		return;
 
+	CFuncPlat *pPlatform = (CFuncPlat*)(CBaseEntity*)m_hPlatform;
+
+	if( !pPlatform )
+	{
+		// The target platform has been removed, remove myself as well. - Solokiller
+		UTIL_Remove( this );
+		return;
+	}
+
 	// Ignore touches by corpses
 	if( !pOther->IsAlive() )
 		return;
 
 	// Make linked platform go up/down.
-	if( m_pPlatform->m_toggle_state == TS_AT_BOTTOM )
-		m_pPlatform->GoUp();
-	else if( m_pPlatform->m_toggle_state == TS_AT_TOP )
-		m_pPlatform->pev->nextthink = m_pPlatform->pev->ltime + 1;// delay going down
+	if( pPlatform->m_toggle_state == TS_AT_BOTTOM )
+		pPlatform->GoUp();
+	else if( pPlatform->m_toggle_state == TS_AT_TOP )
+		pPlatform->pev->nextthink = pPlatform->pev->ltime + 1;// delay going down
 }
 
 //
@@ -418,7 +416,7 @@ void CFuncPlat::PlatUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE
 void CFuncPlat::GoDown( void )
 {
 	if( pev->noiseMovement )
-		EMIT_SOUND( ENT( pev ), CHAN_STATIC, (char*)STRING( pev->noiseMovement ), m_volume, ATTN_NORM );
+		EMIT_SOUND( ENT( pev ), CHAN_STATIC, STRING( pev->noiseMovement ), m_volume, ATTN_NORM );
 
 	ASSERT( m_toggle_state == TS_AT_TOP || m_toggle_state == TS_GOING_UP );
 	m_toggle_state = TS_GOING_DOWN;
@@ -427,15 +425,15 @@ void CFuncPlat::GoDown( void )
 }
 
 //
-// Platform has hit bottom.  Stops and waits forever.
+// Platform has hit bottom. Stops and waits forever.
 //
 void CFuncPlat::HitBottom( void )
 {
 	if( pev->noiseMovement )
-		STOP_SOUND( ENT( pev ), CHAN_STATIC, (char*)STRING( pev->noiseMovement ) );
+		STOP_SOUND( ENT( pev ), CHAN_STATIC, STRING( pev->noiseMovement ) );
 
 	if( pev->noiseStopMoving )
-		EMIT_SOUND( ENT( pev ), CHAN_WEAPON, (char*)STRING( pev->noiseStopMoving ), m_volume, ATTN_NORM );
+		EMIT_SOUND( ENT( pev ), CHAN_WEAPON, STRING( pev->noiseStopMoving ), m_volume, ATTN_NORM );
 
 	ASSERT( m_toggle_state == TS_GOING_DOWN );
 	m_toggle_state = TS_AT_BOTTOM;
@@ -447,7 +445,7 @@ void CFuncPlat::HitBottom( void )
 void CFuncPlat::GoUp( void )
 {
 	if( pev->noiseMovement )
-		EMIT_SOUND( ENT( pev ), CHAN_STATIC, (char*)STRING( pev->noiseMovement ), m_volume, ATTN_NORM );
+		EMIT_SOUND( ENT( pev ), CHAN_STATIC, STRING( pev->noiseMovement ), m_volume, ATTN_NORM );
 
 	ASSERT( m_toggle_state == TS_AT_BOTTOM || m_toggle_state == TS_GOING_DOWN );
 	m_toggle_state = TS_GOING_UP;
@@ -456,15 +454,15 @@ void CFuncPlat::GoUp( void )
 }
 
 //
-// Platform has hit top.  Pauses, then starts back down again.
+// Platform has hit top. Pauses, then starts back down again.
 //
 void CFuncPlat::HitTop( void )
 {
 	if( pev->noiseMovement )
-		STOP_SOUND( ENT( pev ), CHAN_STATIC, (char*)STRING( pev->noiseMovement ) );
+		STOP_SOUND( ENT( pev ), CHAN_STATIC, STRING( pev->noiseMovement ) );
 
 	if( pev->noiseStopMoving )
-		EMIT_SOUND( ENT( pev ), CHAN_WEAPON, (char*)STRING( pev->noiseStopMoving ), m_volume, ATTN_NORM );
+		EMIT_SOUND( ENT( pev ), CHAN_WEAPON, STRING( pev->noiseStopMoving ), m_volume, ATTN_NORM );
 
 	ASSERT( m_toggle_state == TS_GOING_UP );
 	m_toggle_state = TS_AT_TOP;
@@ -484,7 +482,7 @@ void CFuncPlat::Blocked( CBaseEntity *pOther )
 	pOther->TakeDamage( pev, pev, 1, DMG_CRUSH );
 
 	if( pev->noiseMovement )
-		STOP_SOUND( ENT( pev ), CHAN_STATIC, (char*)STRING( pev->noiseMovement ) );
+		STOP_SOUND( ENT( pev ), CHAN_STATIC, STRING( pev->noiseMovement ) );
 
 	// Send the platform back where it came from
 	ASSERT( m_toggle_state == TS_GOING_UP || m_toggle_state == TS_GOING_DOWN );
@@ -554,7 +552,7 @@ void CFuncPlatRot::GoDown( void )
 }
 
 //
-// Platform has hit bottom.  Stops and waits forever.
+// Platform has hit bottom. Stops and waits forever.
 //
 void CFuncPlatRot::HitBottom( void )
 {
@@ -573,7 +571,7 @@ void CFuncPlatRot::GoUp( void )
 }
 
 //
-// Platform has hit top.  Pauses, then starts back down again.
+// Platform has hit top. Pauses, then starts back down again.
 //
 void CFuncPlatRot::HitTop( void )
 {
@@ -672,7 +670,7 @@ void CFuncTrain::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE us
 		pev->nextthink = 0;
 		pev->velocity = g_vecZero;
 		if( pev->noiseStopMoving )
-			EMIT_SOUND( ENT( pev ), CHAN_VOICE, (char*)STRING( pev->noiseStopMoving ), m_volume, ATTN_NORM );
+			EMIT_SOUND( ENT( pev ), CHAN_VOICE, STRING( pev->noiseStopMoving ), m_volume, ATTN_NORM );
 	}
 }
 
@@ -693,9 +691,9 @@ void CFuncTrain::Wait( void )
 
 		// clear the sound channel.
 		if( pev->noiseMovement )
-			STOP_SOUND( edict(), CHAN_STATIC, (char*)STRING( pev->noiseMovement ) );
+			STOP_SOUND( edict(), CHAN_STATIC, STRING( pev->noiseMovement ) );
 		if( pev->noiseStopMoving )
-			EMIT_SOUND( ENT( pev ), CHAN_VOICE, (char*)STRING( pev->noiseStopMoving ), m_volume, ATTN_NORM );
+			EMIT_SOUND( ENT( pev ), CHAN_VOICE, STRING( pev->noiseStopMoving ), m_volume, ATTN_NORM );
 		pev->nextthink = 0;
 		return;
 	}
@@ -706,9 +704,9 @@ void CFuncTrain::Wait( void )
 		// -1 wait will wait forever!		
 		pev->nextthink = pev->ltime + m_flWait;
 		if( pev->noiseMovement )
-			STOP_SOUND( edict(), CHAN_STATIC, (char*)STRING( pev->noiseMovement ) );
+			STOP_SOUND( edict(), CHAN_STATIC, STRING( pev->noiseMovement ) );
 		if( pev->noiseStopMoving )
-			EMIT_SOUND( ENT( pev ), CHAN_VOICE, (char*)STRING( pev->noiseStopMoving ), m_volume, ATTN_NORM );
+			EMIT_SOUND( ENT( pev ), CHAN_VOICE, STRING( pev->noiseStopMoving ), m_volume, ATTN_NORM );
 		SetThink( &CFuncTrain::Next );
 	}
 	else
@@ -730,10 +728,10 @@ void CFuncTrain::Next( void )
 	if( !pTarg )
 	{
 		if( pev->noiseMovement )
-			STOP_SOUND( edict(), CHAN_STATIC, (char*)STRING( pev->noiseMovement ) );
+			STOP_SOUND( edict(), CHAN_STATIC, STRING( pev->noiseMovement ) );
 		// Play stop sound
 		if( pev->noiseStopMoving )
-			EMIT_SOUND( ENT( pev ), CHAN_VOICE, (char*)STRING( pev->noiseStopMoving ), m_volume, ATTN_NORM );
+			EMIT_SOUND( ENT( pev ), CHAN_VOICE, STRING( pev->noiseStopMoving ), m_volume, ATTN_NORM );
 		return;
 	}
 
@@ -743,21 +741,21 @@ void CFuncTrain::Next( void )
 	pev->target = pTarg->pev->target;
 	m_flWait = pTarg->GetDelay();
 
-	if ( m_pevCurrentTarget && m_pevCurrentTarget->speed != 0 )
+	if( m_pevCurrentTarget && m_pevCurrentTarget->speed != 0 )
 	{
 		// don't copy speed from target if it is 0 (uninitialized)
 		pev->speed = m_pevCurrentTarget->speed;
-		ALERT( at_aiconsole, "Train %s speed to %4.2f\n", STRING(pev->targetname), pev->speed );
+		ALERT( at_aiconsole, "Train %s speed to %4.2f\n", STRING( pev->targetname ), pev->speed );
 	}
 	m_pevCurrentTarget = pTarg->pev;// keep track of this since path corners change our target for us.
 
 	pev->enemy = pTarg->edict();//hack
 
-	if(FBitSet(m_pevCurrentTarget->spawnflags, SF_CORNER_TELEPORT))
+	if( FBitSet( m_pevCurrentTarget->spawnflags, SF_CORNER_TELEPORT ) )
 	{
 		// Path corner has indicated a teleport to the next corner.
-		SetBits(pev->effects, EF_NOINTERP);
-		UTIL_SetOrigin(pev, pTarg->pev->origin - (pev->mins + pev->maxs)* 0.5);
+		SetBits( pev->effects, EF_NOINTERP );
+		UTIL_SetOrigin( pev, pTarg->pev->origin - ( pev->mins + pev->maxs ) * 0.5 );
 		Wait(); // Get on with doing the next path corner.
 	}
 	else
@@ -767,13 +765,15 @@ void CFuncTrain::Next( void )
 		// CHANGED this from CHAN_VOICE to CHAN_STATIC around OEM beta time because trains should
 		// use CHAN_STATIC for their movement sounds to prevent sound field problems.
 		// this is not a hack or temporary fix, this is how things should be. (sjb).
-		if ( pev->noiseMovement )
-			STOP_SOUND( edict(), CHAN_STATIC, (char*)STRING(pev->noiseMovement) );
-		if ( pev->noiseMovement )
-			EMIT_SOUND (ENT(pev), CHAN_STATIC, (char*)STRING(pev->noiseMovement), m_volume, ATTN_NORM);
-		ClearBits(pev->effects, EF_NOINTERP);
+		if( pev->noiseMovement )
+		{
+			STOP_SOUND( edict(), CHAN_STATIC, STRING( pev->noiseMovement ) );
+			EMIT_SOUND( ENT( pev ), CHAN_STATIC, STRING( pev->noiseMovement ), m_volume, ATTN_NORM );
+		}
+
+		ClearBits( pev->effects, EF_NOINTERP );
 		SetMoveDone( &CFuncTrain::Wait );
-		LinearMove (pTarg->pev->origin - (pev->mins + pev->maxs)* 0.5, pev->speed);
+		LinearMove( pTarg->pev->origin - ( pev->mins + pev->maxs )* 0.5, pev->speed );
 	}
 }
 
@@ -853,8 +853,8 @@ void CFuncTrain::Precache( void )
 	case 1:
 		PRECACHE_SOUND( "plats/train2.wav" );
 		PRECACHE_SOUND( "plats/train1.wav" );
-		pev->noise = MAKE_STRING("plats/train2.wav" );
-		pev->noise1 = MAKE_STRING("plats/train1.wav" );
+		pev->noise = MAKE_STRING( "plats/train2.wav" );
+		pev->noise1 = MAKE_STRING( "plats/train1.wav" );
 		break;
 	case 2:
 		PRECACHE_SOUND( "plats/platmove1.wav" );
@@ -1061,7 +1061,7 @@ void CFuncTrackTrain::StopSound( void )
 		PLAYBACK_EVENT_FULL( FEV_RELIABLE | FEV_UPDATE, edict(), m_usAdjustPitch, 0.0, 
 			(float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, us_encode, 0, 1, 0 );
 		/*
-		STOP_SOUND( ENT( pev ), CHAN_STATIC, (char*)STRING( pev->noise ) );
+		STOP_SOUND( ENT( pev ), CHAN_STATIC, STRING( pev->noise ) );
 		*/
 		char *brake = "plats/ttrain_brake1.wav";
 
@@ -1094,7 +1094,7 @@ void CFuncTrackTrain::UpdateSound( void )
 	if( !m_soundPlaying )
 	{
 		// play startup sound for train
-		char *start = "plats/ttrain_start1.wav";
+		const char *start = "plats/ttrain_start1.wav";
 
 		if( UseCustomSounds() )
 		{
@@ -1105,14 +1105,14 @@ void CFuncTrackTrain::UpdateSound( void )
 		}
 
 		EMIT_SOUND_DYN( ENT( pev ), CHAN_ITEM, start, m_flVolume, ATTN_NORM, 0, 100 );
-		EMIT_SOUND_DYN( ENT( pev ), CHAN_STATIC, (char*)STRING( pev->noise ), m_flVolume, ATTN_NORM, 0, (int)flpitch );
+		EMIT_SOUND_DYN( ENT( pev ), CHAN_STATIC, STRING( pev->noise ), m_flVolume, ATTN_NORM, 0, (int)flpitch );
 		m_soundPlaying = 1;
 	} 
 	else
 	{
 /*
 		// update pitch
-		EMIT_SOUND_DYN( ENT( pev ), CHAN_STATIC, (char*)STRING( pev->noise ), m_flVolume, ATTN_NORM, SND_CHANGE_PITCH, (int)flpitch );
+		EMIT_SOUND_DYN( ENT( pev ), CHAN_STATIC, STRING( pev->noise ), m_flVolume, ATTN_NORM, SND_CHANGE_PITCH, (int)flpitch );
 */
 		// volume 0.0 - 1.0 - 6 bits
 		// m_sounds 3 bits
@@ -1342,7 +1342,7 @@ BOOL CFuncTrackTrain::OnControls( entvars_t *pevTest )
 
 void CFuncTrackTrain::Find( void )
 {
-	m_ppath = CPathTrack::Instance(FIND_ENTITY_BY_TARGETNAME( NULL, STRING( pev->target ) ) );
+	m_ppath = CPathTrack::Instance( FIND_ENTITY_BY_TARGETNAME( NULL, STRING( pev->target ) ) );
 	if( !m_ppath )
 		return;
 
@@ -1457,7 +1457,7 @@ void CFuncTrackTrain::Spawn( void )
 	pev->speed = 0;
 	pev->velocity = g_vecZero;
 	pev->avelocity = g_vecZero;
-	pev->impulse = m_speed;
+	pev->impulse = (int)m_speed;
 
 	m_dir = 1;
 
@@ -1491,6 +1491,8 @@ void CFuncTrackTrain::Spawn( void )
 
 void CFuncTrackTrain::Precache( void )
 {
+	const char *pszSound;
+
 	if( m_flVolume == 0.0 )
 		m_flVolume = 1.0;
 
@@ -1498,34 +1500,36 @@ void CFuncTrackTrain::Precache( void )
 	{
 	default:
 		// no sound
-		pev->noise = 0;
+		pszSound = NULL;
 		break;
 	case 1:
-		PRECACHE_SOUND( "plats/ttrain1.wav" );
-		pev->noise = MAKE_STRING("plats/ttrain1.wav" );
+		pszSound = "plats/ttrain1.wav";
 		break;
 	case 2:
-		PRECACHE_SOUND( "plats/ttrain2.wav" );
-		pev->noise = MAKE_STRING( "plats/ttrain2.wav" );
+		pszSound = "plats/ttrain2.wav";
 		break;
 	case 3:
-		PRECACHE_SOUND( "plats/ttrain3.wav" );
-		pev->noise = MAKE_STRING( "plats/ttrain3.wav" );
+		pszSound = "plats/ttrain3.wav";
 		break; 
 	case 4:
-		PRECACHE_SOUND( "plats/ttrain4.wav" );
-		pev->noise = MAKE_STRING( "plats/ttrain4.wav" );
+		pszSound = "plats/ttrain4.wav";
 		break;
 	case 5:
-		PRECACHE_SOUND( "plats/ttrain6.wav" );
-		pev->noise = MAKE_STRING( "plats/ttrain6.wav" );
+		pszSound = "plats/ttrain6.wav";
 		break;
 	case 6:
-		PRECACHE_SOUND( "plats/ttrain7.wav" );
-		pev->noise = MAKE_STRING( "plats/ttrain7.wav" );
+		pszSound = "plats/ttrain7.wav";
 		break;
 	}
 
+	if( pszSound )
+	{
+		PRECACHE_SOUND( pszSound );
+		pev->noise = MAKE_STRING( pszSound );
+	}
+	else
+		pev->noise = 0;
+
 	PRECACHE_SOUND( "plats/ttrain_brake1.wav" );
 	PRECACHE_SOUND( "plats/ttrain_start1.wav" );
 
@@ -1656,9 +1660,9 @@ public:
 
 	CFuncTrackTrain	*m_train;
 
-	int m_trackTopName;
-	int m_trackBottomName;
-	int m_trainName;
+	string_t m_trackTopName;
+	string_t m_trackBottomName;
+	string_t m_trainName;
 	TRAIN_CODE m_code;
 	int m_targetState;
 	int m_use;
@@ -2253,7 +2257,7 @@ void CGunTarget::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE us
 	{
 		pev->takedamage = DAMAGE_AIM;
 		m_hTargetEnt = GetNextTarget();
-		if( m_hTargetEnt == NULL )
+		if( m_hTargetEnt == 0 )
 			return;
 		pev->health = pev->max_health;
 		Next();
diff --git a/dlls/player.cpp b/dlls/player.cpp
index 2a265b8d..698e5959 100644
--- a/dlls/player.cpp
+++ b/dlls/player.cpp
@@ -34,6 +34,7 @@
 #include "decals.h"
 #include "gamerules.h"
 #include "game.h"
+#include "pm_shared.h"
 #include "hltv.h"
 
 // #define DUCKFIX
@@ -44,6 +45,8 @@ extern DLL_GLOBAL BOOL g_fDrawLines;
 int gEvilImpulse101;
 extern DLL_GLOBAL int g_iSkillLevel, gDisplayTitle;
 
+extern "C" int g_bhopcap;
+
 BOOL gInitHUD = TRUE;
 
 extern void CopyToBodyQue( entvars_t *pev);
@@ -180,6 +183,7 @@ int gmsgSetFOV = 0;
 int gmsgShowMenu = 0;
 int gmsgGeigerRange = 0;
 int gmsgTeamNames = 0;
+int gmsgBhopcap = 0;
 
 int gmsgStatusText = 0;
 int gmsgStatusValue = 0;
@@ -203,7 +207,8 @@ void LinkUserMessages( void )
 	gmsgDamage = REG_USER_MSG( "Damage", 12 );
 	gmsgBattery = REG_USER_MSG( "Battery", 2);
 	gmsgTrain = REG_USER_MSG( "Train", 1 );
-	gmsgHudText = REG_USER_MSG( "HudText", -1 );
+	//gmsgHudText = REG_USER_MSG( "HudTextPro", -1 );
+	gmsgHudText = REG_USER_MSG( "HudText", -1 ); // we don't use the message but 3rd party addons may!
 	gmsgSayText = REG_USER_MSG( "SayText", -1 );
 	gmsgTextMsg = REG_USER_MSG( "TextMsg", -1 );
 	gmsgWeaponList = REG_USER_MSG( "WeaponList", -1 );
@@ -227,6 +232,7 @@ void LinkUserMessages( void )
 	gmsgFade = REG_USER_MSG( "ScreenFade", sizeof(ScreenFade) );
 	gmsgAmmoX = REG_USER_MSG( "AmmoX", 2 );
 	gmsgTeamNames = REG_USER_MSG( "TeamNames", -1 );
+	gmsgBhopcap = REG_USER_MSG( "Bhopcap", 1 );
 
 	gmsgStatusText = REG_USER_MSG( "StatusText", -1 );
 	gmsgStatusValue = REG_USER_MSG( "StatusValue", 3 );
@@ -461,10 +467,10 @@ int CBasePlayer::TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, fl
 	}
 
 	// keep track of amount of damage last sustained
-	m_lastDamageAmount = flDamage;
+	m_lastDamageAmount = (int)flDamage;
 
 	// Armor. 
-	if( pev->armorvalue && !( bitsDamageType & ( DMG_FALL | DMG_DROWN ) ) )// armor doesn't protect against fall or drown damage!
+	if( !( pev->flags & FL_GODMODE ) && pev->armorvalue && !( bitsDamageType & ( DMG_FALL | DMG_DROWN ) ) )// armor doesn't protect against fall or drown damage!
 	{
 		float flNew = flDamage * flRatio;
 
@@ -664,8 +670,8 @@ void CBasePlayer::PackDeadPlayerItems( void )
 	int iWeaponRules;
 	int iAmmoRules;
 	int i;
-	CBasePlayerWeapon *rgpPackWeapons[20] = {0};// 20 hardcoded for now. How to determine exactly how many weapons we have?
-	int iPackAmmo[MAX_AMMO_SLOTS + 1];
+	CBasePlayerWeapon *rgpPackWeapons[MAX_WEAPONS] = {0,};
+	int iPackAmmo[MAX_AMMO_SLOTS];
 	int iPW = 0;// index into packweapons array
 	int iPA = 0;// index into packammo array
 
@@ -673,7 +679,7 @@ void CBasePlayer::PackDeadPlayerItems( void )
 
 	// get the game rules
 	iWeaponRules = g_pGameRules->DeadPlayerWeapons( this );
- 	iAmmoRules = g_pGameRules->DeadPlayerAmmo( this );
+	iAmmoRules = g_pGameRules->DeadPlayerAmmo( this );
 
 	if( iWeaponRules == GR_PLR_DROP_GUN_NO && iAmmoRules == GR_PLR_DROP_AMMO_NO )
 	{
@@ -683,14 +689,14 @@ void CBasePlayer::PackDeadPlayerItems( void )
 	}
 
 	// go through all of the weapons and make a list of the ones to pack
-	for( i = 0; i < MAX_ITEM_TYPES; i++ )
+	for( i = 0; i < MAX_ITEM_TYPES && iPW < MAX_WEAPONS; i++ )
 	{
 		if( m_rgpPlayerItems[i] )
 		{
 			// there's a weapon here. Should I pack it?
 			CBasePlayerItem *pPlayerItem = m_rgpPlayerItems[i];
 
-			while( pPlayerItem )
+			while( pPlayerItem && iPW < MAX_WEAPONS )
 			{
 				switch( iWeaponRules )
 				{
@@ -789,18 +795,21 @@ void CBasePlayer::RemoveAllItems( BOOL removeSuit )
 
 	m_pLastItem = NULL;
 
+	if( m_pTank != 0 )
+		m_pTank->Use( this, this, USE_OFF, 0 );
+
 	int i;
 	CBasePlayerItem *pPendingItem;
 	for( i = 0; i < MAX_ITEM_TYPES; i++ )
 	{
 		m_pActiveItem = m_rgpPlayerItems[i];
+		m_rgpPlayerItems[i] = NULL;
 		while( m_pActiveItem )
 		{
 			pPendingItem = m_pActiveItem->m_pNext; 
 			m_pActiveItem->Drop();
 			m_pActiveItem = pPendingItem;
 		}
-		m_rgpPlayerItems[i] = NULL;
 	}
 	m_pActiveItem = NULL;
 
@@ -812,9 +821,15 @@ void CBasePlayer::RemoveAllItems( BOOL removeSuit )
 	else
 		pev->weapons &= ~WEAPON_ALLWEAPONS;
 
+	// Turn off flashlight
+	ClearBits( pev->effects, EF_DIMLIGHT );
+
 	for( i = 0; i < MAX_AMMO_SLOTS; i++ )
 		m_rgAmmo[i] = 0;
 
+	if( satchelfix.value )
+		DeactivateSatchels( this );
+
 	UpdateClientData();
 
 	// send Selected Weapon Message to our client
@@ -843,11 +858,8 @@ void CBasePlayer::Killed( entvars_t *pevAttacker, int iGib )
 
 	g_pGameRules->PlayerKilled( this, pevAttacker, g_pevLastInflictor );
 
-	if( m_pTank != NULL )
-	{
+	if( m_pTank != 0 )
 		m_pTank->Use( this, this, USE_OFF, 0 );
-		m_pTank = NULL;
-	}
 
 	// this client isn't going to be thinking for a while, so reset the sound until they respawn
 	pSound = CSoundEnt::SoundPointerForIndex( CSoundEnt::ClientSoundIndex( edict() ) );
@@ -1171,7 +1183,7 @@ void CBasePlayer::WaterMove()
 				// track drowning damage, give it back when
 				// player finally takes a breath
 
-				m_idrowndmg += pev->dmg;
+				m_idrowndmg += (int)pev->dmg;
 			} 
 		}
 		else
@@ -1304,6 +1316,9 @@ void CBasePlayer::PlayerDeathThink( void )
 		StartDeathCam();
 	}
 
+	if( pev->iuser1 )	// player is in spectator mode
+		return;
+
 	// wait for any button down,  or mp_forcerespawn is set and the respawn time is up
 	if( !fAnyButtonDown && !( g_pGameRules->IsMultiplayer() && forcerespawn.value > 0 && ( gpGlobals->time > ( m_fDeadTime + 5 ) ) ) )
 		return;
@@ -1352,7 +1367,9 @@ void CBasePlayer::StartDeathCam( void )
 		}
 
 		CopyToBodyQue( pev );
-		StartObserver( pSpot->v.origin, pSpot->v.v_angle );
+
+		UTIL_SetOrigin( pev, pSpot->v.origin );
+		pev->angles = pev->v_angle = pSpot->v.v_angle;
 	}
 	else
 	{
@@ -1360,23 +1377,86 @@ void CBasePlayer::StartDeathCam( void )
 		TraceResult tr;
 		CopyToBodyQue( pev );
 		UTIL_TraceLine( pev->origin, pev->origin + Vector( 0, 0, 128 ), ignore_monsters, edict(), &tr );
-		StartObserver( tr.vecEndPos, UTIL_VecToAngles( tr.vecEndPos - pev->origin ) );
-		return;
+
+		UTIL_SetOrigin( pev, tr.vecEndPos );
+		pev->angles = pev->v_angle = UTIL_VecToAngles( tr.vecEndPos - pev->origin );
 	}
+
+	// start death cam
+	m_afPhysicsFlags |= PFLAG_OBSERVER;
+	pev->view_ofs = g_vecZero;
+	pev->fixangle = TRUE;
+	pev->solid = SOLID_NOT;
+	pev->takedamage = DAMAGE_NO;
+	pev->movetype = MOVETYPE_NONE;
+	pev->modelindex = 0;
 }
 
 void CBasePlayer::StartObserver( Vector vecPosition, Vector vecViewAngle )
 {
-	m_afPhysicsFlags |= PFLAG_OBSERVER;
+	// clear any clientside entities attached to this player
+	MESSAGE_BEGIN( MSG_PAS, SVC_TEMPENTITY, pev->origin );
+		WRITE_BYTE( TE_KILLPLAYERATTACHMENTS );
+		WRITE_BYTE( (BYTE)entindex() );
+	MESSAGE_END();
 
+	// Holster weapon immediately, to allow it to cleanup
+	if( m_pActiveItem )
+		m_pActiveItem->Holster();
+
+	if( m_pTank != 0 )
+		m_pTank->Use( this, this, USE_OFF, 0 );
+
+	// clear out the suit message cache so we don't keep chattering
+	SetSuitUpdate( NULL, FALSE, 0 );
+
+	// Tell Ammo Hud that the player is dead
+	MESSAGE_BEGIN( MSG_ONE, gmsgCurWeapon, NULL, pev );
+		WRITE_BYTE( 0 );
+		WRITE_BYTE( 0XFF );
+		WRITE_BYTE( 0xFF );
+	MESSAGE_END();
+
+	// reset FOV
+	m_iFOV = m_iClientFOV = 0;
+	pev->fov = m_iFOV;
+	MESSAGE_BEGIN( MSG_ONE, gmsgSetFOV, NULL, pev );
+		WRITE_BYTE( 0 );
+	MESSAGE_END();
+
+	// Setup flags
+	m_iHideHUD = ( HIDEHUD_HEALTH | HIDEHUD_WEAPONS );
+	m_afPhysicsFlags |= PFLAG_OBSERVER;
+	pev->effects = EF_NODRAW;
 	pev->view_ofs = g_vecZero;
 	pev->angles = pev->v_angle = vecViewAngle;
 	pev->fixangle = TRUE;
 	pev->solid = SOLID_NOT;
 	pev->takedamage = DAMAGE_NO;
 	pev->movetype = MOVETYPE_NONE;
-	pev->modelindex = 0;
+	ClearBits( m_afPhysicsFlags, PFLAG_DUCKING );
+	ClearBits( pev->flags, FL_DUCKING );
+	pev->deadflag = DEAD_RESPAWNABLE;
+	pev->health = 1;
+
+	// Clear out the status bar
+	m_fInitHUD = TRUE;
+
+	pev->team = 0;
+	MESSAGE_BEGIN( MSG_ALL, gmsgTeamInfo );
+		WRITE_BYTE( ENTINDEX(edict()) );
+		WRITE_STRING( "" );
+	MESSAGE_END();
+
+	// Remove all the player's stuff
+	RemoveAllItems( FALSE );
+
+	// Move them to the new position
 	UTIL_SetOrigin( pev, vecPosition );
+
+	// Find a player to watch
+	m_flNextObserverInput = 0;
+	Observer_SetMode( m_iObserverLastMode );
 }
 
 //
@@ -1386,6 +1466,9 @@ void CBasePlayer::StartObserver( Vector vecPosition, Vector vecViewAngle )
 
 void CBasePlayer::PlayerUse( void )
 {
+	if( IsObserver() )
+		return;
+
 	// Was use pressed or released?
 	if( !( ( pev->button | m_afButtonPressed | m_afButtonReleased) & IN_USE ) )
 		return;
@@ -1393,12 +1476,11 @@ void CBasePlayer::PlayerUse( void )
 	// Hit Use on a train?
 	if( m_afButtonPressed & IN_USE )
 	{
-		if( m_pTank != NULL )
+		if( m_pTank != 0 )
 		{
 			// Stop controlling the tank
 			// TODO: Send HUD Update
 			m_pTank->Use( this, this, USE_OFF, 0 );
-			m_pTank = NULL;
 			return;
 		}
 		else
@@ -1416,7 +1498,7 @@ void CBasePlayer::PlayerUse( void )
 				if( pTrain && !( pev->button & IN_JUMP ) && FBitSet( pev->flags, FL_ONGROUND ) && (pTrain->ObjectCaps() & FCAP_DIRECTIONAL_USE ) && pTrain->OnControls( pev ) )
 				{
 					m_afPhysicsFlags |= PFLAG_ONTRAIN;
-					m_iTrain = TrainSpeed( pTrain->pev->speed, pTrain->pev->impulse );
+					m_iTrain = TrainSpeed( (int)pTrain->pev->speed, pTrain->pev->impulse );
 					m_iTrain |= TRAIN_NEW;
 					char* usesound = "plats/train_use1.wav";
 
@@ -1599,7 +1681,7 @@ void CBasePlayer::AddPoints( int score, BOOL bAllowNegativeScore )
 
 			if( -score > pev->frags )	// Will this go negative?
 			{
-				score = -pev->frags;		// Sum will be 0
+				score = (int)( -pev->frags );		// Sum will be 0
 			}
 		}
 	}
@@ -1608,7 +1690,7 @@ void CBasePlayer::AddPoints( int score, BOOL bAllowNegativeScore )
 
 	MESSAGE_BEGIN( MSG_ALL, gmsgScoreInfo );
 		WRITE_BYTE( ENTINDEX( edict() ) );
-		WRITE_SHORT( pev->frags );
+		WRITE_SHORT( (int)pev->frags );
 		WRITE_SHORT( m_iDeaths );
 		WRITE_SHORT( 0 );
 		WRITE_SHORT( g_pGameRules->GetTeamIndex( m_szTeamName ) + 1 );
@@ -1670,8 +1752,8 @@ void CBasePlayer::UpdateStatusBar()
 				// allies and medics get to see the targets health
 				if( g_pGameRules->PlayerRelationship( this, pEntity ) == GR_TEAMMATE )
 				{
-					newSBarState[SBAR_ID_TARGETHEALTH] = 100 * ( pEntity->pev->health / pEntity->pev->max_health );
-					newSBarState[SBAR_ID_TARGETARMOR] = pEntity->pev->armorvalue; //No need to get it % based since 100 it's the max.
+					newSBarState[SBAR_ID_TARGETHEALTH] = (int)( 100 * ( pEntity->pev->health / pEntity->pev->max_health ) );
+					newSBarState[SBAR_ID_TARGETARMOR] = (int)pEntity->pev->armorvalue; //No need to get it % based since 100 it's the max.
 				}
 
 				m_flStatusBarDisappearDelay = gpGlobals->time + 1.0;
@@ -1766,6 +1848,16 @@ void CBasePlayer::PreThink( void )
 
 	CheckSuitUpdate();
 
+	// Observer Button Handling
+	if( IsObserver() )
+	{
+		Observer_HandleButtons();
+		Observer_CheckTarget();
+		Observer_CheckProperties();
+		pev->impulse = 0;
+		return;
+	}
+
 	if( pev->deadflag >= DEAD_DYING )
 	{
 		PlayerDeathThink();
@@ -1826,7 +1918,7 @@ void CBasePlayer::PreThink( void )
 
 		if( vel )
 		{
-			m_iTrain = TrainSpeed( pTrain->pev->speed, pTrain->pev->impulse );
+			m_iTrain = TrainSpeed( (int)pTrain->pev->speed, pTrain->pev->impulse );
 			m_iTrain |= TRAIN_ACTIVE|TRAIN_NEW;
 		}
 	}
@@ -1937,7 +2029,7 @@ void CBasePlayer::CheckTimeBasedDamage()
 	int i;
 	BYTE bDuration = 0;
 
-	static float gtbdPrev = 0.0;
+	//static float gtbdPrev = 0.0;
 
 	if( !( m_bitsDamageType & DMG_TIMEBASED ) )
 		return;
@@ -1976,7 +2068,7 @@ void CBasePlayer::CheckTimeBasedDamage()
 				// after the player has been drowning and finally takes a breath
 				if( m_idrowndmg > m_idrownrestored )
 				{
-					int idif = min( m_idrowndmg - m_idrownrestored, 10 );
+					int idif = Q_min( m_idrowndmg - m_idrownrestored, 10 );
 
 					TakeHealth( idif, DMG_GENERIC );
 					m_idrownrestored += idif;
@@ -2198,7 +2290,7 @@ void CBasePlayer::CheckSuitUpdate()
 // seconds, then we won't repeat playback of this word or sentence
 // for at least that number of seconds.
 
-void CBasePlayer::SetSuitUpdate( char *name, int fgroup, int iNoRepeatTime )
+void CBasePlayer::SetSuitUpdate( const char *name, int fgroup, int iNoRepeatTime )
 {
 }
 
@@ -2243,7 +2335,7 @@ void CBasePlayer::UpdatePlayerSound( void )
 	// is louder than his body/movement, use the weapon volume, else, use the body volume.
 	if( FBitSet( pev->flags, FL_ONGROUND ) )
 	{
-		iBodyVolume = pev->velocity.Length(); 
+		iBodyVolume = (int)pev->velocity.Length(); 
 
 		// clamp the noise that can be made by the body, in case a push trigger,
 		// weapon recoil, or anything shoves the player abnormally fast. 
@@ -2276,7 +2368,7 @@ void CBasePlayer::UpdatePlayerSound( void )
 	}
 
 	// decay weapon volume over time so bits_SOUND_COMBAT stays set for a while
-	m_iWeaponVolume -= 250 * gpGlobals->frametime;
+	m_iWeaponVolume -= (int)( 250 * gpGlobals->frametime );
 	if( m_iWeaponVolume < 0 )
 	{
 		iVolume = 0;
@@ -2294,7 +2386,7 @@ void CBasePlayer::UpdatePlayerSound( void )
 	}
 	else if( iVolume > m_iTargetVolume )
 	{
-		iVolume -= 250 * gpGlobals->frametime;
+		iVolume -= (int)( 250 * gpGlobals->frametime );
 
 		if( iVolume < m_iTargetVolume )
 		{
@@ -2323,7 +2415,7 @@ void CBasePlayer::UpdatePlayerSound( void )
 	}
 
 	// keep track of virtual muzzle flash
-	m_iWeaponFlash -= 256 * gpGlobals->frametime;
+	m_iWeaponFlash -= (int)( 256 * gpGlobals->frametime );
 	if( m_iWeaponFlash < 0 )
 		m_iWeaponFlash = 0;
 
@@ -2345,7 +2437,7 @@ void CBasePlayer::PostThink()
 		goto pt_end;
 
 	// Handle Tank controlling
-	if( m_pTank != NULL )
+	if( m_pTank != 0 )
 	{
 		// if they've moved too far from the gun,  or selected a weapon, unuse the gun
 		if( m_pTank->OnControls( pev ) && !pev->weaponmodel )
@@ -2356,7 +2448,6 @@ void CBasePlayer::PostThink()
 		{
 			// they've moved off the platform
 			m_pTank->Use( this, this, USE_OFF, 0 );
-			m_pTank = NULL;
 		}
 	}
 
@@ -2409,7 +2500,7 @@ void CBasePlayer::PostThink()
 	{
 		if( m_flFallVelocity > 64 && !g_pGameRules->IsMultiplayer() )
 		{
-			CSoundEnt::InsertSound( bits_SOUND_PLAYER, pev->origin, m_flFallVelocity, 0.2 );
+			CSoundEnt::InsertSound( bits_SOUND_PLAYER, pev->origin, (int)m_flFallVelocity, 0.2 );
 			// ALERT( at_console, "fall %f\n", m_flFallVelocity );
 		}
 		m_flFallVelocity = 0;
@@ -2430,11 +2521,15 @@ void CBasePlayer::PostThink()
 	CheckPowerups( pev );
 
 	UpdatePlayerSound();
+pt_end:
+	if( pev->deadflag == DEAD_NO )
+		m_vecLastViewAngles = pev->angles;
+	else
+		pev->angles = m_vecLastViewAngles;
 
 	// Track button info so we can detect 'pressed' and 'released' buttons next frame
 	m_afButtonLast = pev->button;
 
-pt_end:
 #if defined( CLIENT_WEAPONS )
 	// Decay timers on weapons
 	// go through all of the weapons and make a list of the ones to pack
@@ -2452,23 +2547,23 @@ pt_end:
 
 				if( gun && gun->UseDecrement() )
 				{
-					gun->m_flNextPrimaryAttack = max( gun->m_flNextPrimaryAttack - gpGlobals->frametime, -1.0 );
-					gun->m_flNextSecondaryAttack = max( gun->m_flNextSecondaryAttack - gpGlobals->frametime, -0.001 );
+					gun->m_flNextPrimaryAttack = Q_max( gun->m_flNextPrimaryAttack - gpGlobals->frametime, -1.0 );
+					gun->m_flNextSecondaryAttack = Q_max( gun->m_flNextSecondaryAttack - gpGlobals->frametime, -0.001 );
 
 					if( gun->m_flTimeWeaponIdle != 1000 )
 					{
-						gun->m_flTimeWeaponIdle = max( gun->m_flTimeWeaponIdle - gpGlobals->frametime, -0.001 );
+						gun->m_flTimeWeaponIdle = Q_max( gun->m_flTimeWeaponIdle - gpGlobals->frametime, -0.001 );
 					}
 
 					if( gun->pev->fuser1 != 1000 )
 					{
-						gun->pev->fuser1 = max( gun->pev->fuser1 - gpGlobals->frametime, -0.001 );
+						gun->pev->fuser1 = Q_max( gun->pev->fuser1 - gpGlobals->frametime, -0.001 );
 					}
 
 					// Only decrement if not flagged as NO_DECREMENT
 					/*if( gun->m_flPumpTime != 1000 )
 					{
-						gun->m_flPumpTime = max( gun->m_flPumpTime - gpGlobals->frametime, -0.001 );
+						gun->m_flPumpTime = Q_max( gun->m_flPumpTime - gpGlobals->frametime, -0.001 );
 					}*/
 				}
 
@@ -3039,7 +3134,7 @@ void CSprayCan::Think( void )
 	}
 	else
 	{
-		UTIL_PlayerDecalTrace( &tr, playernum, pev->frame, TRUE );
+		UTIL_PlayerDecalTrace( &tr, playernum, (int)pev->frame, TRUE );
 		// Just painted last custom frame.
 		if( pev->frame++ >= ( nFrames - 1 ) )
 			UTIL_Remove( this );
@@ -3168,6 +3263,10 @@ void CBasePlayer::ForceClientDllUpdate( void )
 	m_fWeapon = FALSE;          // Force weapon send
 	m_fKnownItem = FALSE;    // Force weaponinit messages.
 	m_fInitHUD = TRUE;		// Force HUD gmsgResetHUD message
+	m_bSentBhopcap = true; // a1ba: Update bhopcap state
+	memset( m_rgAmmoLast, 0, sizeof( m_rgAmmoLast )); // a1ba: Force update AmmoX
+
+
 
 	// Now force all the necessary messages
 	//  to be sent.
@@ -3496,19 +3595,23 @@ int CBasePlayer::AddPlayerItem( CBasePlayerItem *pItem )
 	return FALSE;
 }
 
-int CBasePlayer::RemovePlayerItem( CBasePlayerItem *pItem )
+int CBasePlayer::RemovePlayerItem( CBasePlayerItem *pItem, bool bCallHolster )
 {
+	pItem->pev->nextthink = 0;// crowbar may be trying to swing again, etc.
+	pItem->SetThink( NULL );
+
 	if( m_pActiveItem == pItem )
 	{
 		ResetAutoaim();
-		pItem->Holster();
-		pItem->pev->nextthink = 0;// crowbar may be trying to swing again, etc.
-		pItem->SetThink( NULL );
+		if( bCallHolster )
+			pItem->Holster();
 		m_pActiveItem = NULL;
 		pev->viewmodel = 0;
 		pev->weaponmodel = 0;
 	}
-	else if( m_pLastItem == pItem )
+
+	// In some cases an item can be both the active and last item, like for instance dropping all weapons and only having an exhaustible weapon left. - Solokiller
+	if( m_pLastItem == pItem )
 		m_pLastItem = NULL;
 
 	CBasePlayerItem *pPrev = m_rgpPlayerItems[pItem->iItemSlot()];
@@ -3536,7 +3639,7 @@ int CBasePlayer::RemovePlayerItem( CBasePlayerItem *pItem )
 //
 // Returns the unique ID for the ammo, or -1 if error
 //
-int CBasePlayer::GiveAmmo( int iCount, char *szName, int iMax )
+int CBasePlayer::GiveAmmo( int iCount, const char *szName, int iMax )
 {
 	if( !szName )
 	{
@@ -3557,7 +3660,7 @@ int CBasePlayer::GiveAmmo( int iCount, char *szName, int iMax )
 	if( i < 0 || i >= MAX_AMMO_SLOTS )
 		return -1;
 
-	int iAdd = min( iCount, iMax - m_rgAmmo[i] );
+	int iAdd = Q_min( iCount, iMax - m_rgAmmo[i] );
 	if( iAdd < 1 )
 		return i;
 
@@ -3610,10 +3713,10 @@ Called every frame by the player PostThink
 */
 void CBasePlayer::ItemPostFrame()
 {
-	static int fInSelect = FALSE;
+	//static int fInSelect = FALSE;
 
 	// check if the player is using a tank
-	if( m_pTank != NULL )
+	if( m_pTank != 0 )
 		return;
 
 #if defined( CLIENT_WEAPONS )
@@ -3678,7 +3781,7 @@ void CBasePlayer::SendAmmoUpdate( void )
 			// send "Ammo" update message
 			MESSAGE_BEGIN( MSG_ONE, gmsgAmmoX, NULL, pev );
 				WRITE_BYTE( i );
-				WRITE_BYTE( max( min( m_rgAmmo[i], 254 ), 0 ) );  // clamp the value to one byte
+				WRITE_BYTE( Q_max( Q_min( m_rgAmmo[i], 254 ), 0 ) );  // clamp the value to one byte
 			MESSAGE_END();
 		}
 	}
@@ -3713,6 +3816,9 @@ void CBasePlayer::UpdateClientData( void )
 
 			g_pGameRules->InitHUD( this );
 			m_fGameHUDInitialized = TRUE;
+
+			m_iObserverLastMode = OBS_ROAMING;
+
 			if( g_pGameRules->IsMultiplayer() )
 			{
 				FireTargets( "game_playerjoin", this, this, USE_TOGGLE, 0 );
@@ -3721,6 +3827,12 @@ void CBasePlayer::UpdateClientData( void )
 
 		FireTargets( "game_playerspawn", this, this, USE_TOGGLE, 0 );
 
+		// Send flashlight status
+		MESSAGE_BEGIN( MSG_ONE, gmsgFlashlight, NULL, pev );
+			WRITE_BYTE( FlashlightIsOn() ? 1 : 0 );
+			WRITE_BYTE( m_iFlashBattery );
+		MESSAGE_END();
+
 		InitStatusBar();
 	}
 
@@ -3753,19 +3865,22 @@ void CBasePlayer::UpdateClientData( void )
 
 	if( pev->health != m_iClientHealth )
 	{
-		int iHealth = max( pev->health, 0 );  // make sure that no negative health values are sent
+#define clamp( val, min, max ) ( ((val) > (max)) ? (max) : ( ((val) < (min)) ? (min) : (val) ) )
+		int iHealth = clamp( pev->health, 0, 255 ); // make sure that no negative health values are sent
+		if( pev->health > 0.0f && pev->health <= 1.0f )
+			iHealth = 1;
 
 		// send "health" update message
 		MESSAGE_BEGIN( MSG_ONE, gmsgHealth, NULL, pev );
 			WRITE_BYTE( iHealth );
 		MESSAGE_END();
 
-		m_iClientHealth = pev->health;
+		m_iClientHealth = (int)pev->health;
 	}
 
 	if( pev->armorvalue != m_iClientBattery )
 	{
-		m_iClientBattery = pev->armorvalue;
+		m_iClientBattery = (int)pev->armorvalue;
 
 		ASSERT( gmsgBattery > 0 );
 
@@ -3793,8 +3908,8 @@ void CBasePlayer::UpdateClientData( void )
 		int visibleDamageBits = m_bitsDamageType & DMG_SHOWNHUD;
 
 		MESSAGE_BEGIN( MSG_ONE, gmsgDamage, NULL, pev );
-			WRITE_BYTE( pev->dmg_save );
-			WRITE_BYTE( pev->dmg_take );
+			WRITE_BYTE( (int)pev->dmg_save );
+			WRITE_BYTE( (int)pev->dmg_take );
 			WRITE_LONG( visibleDamageBits );
 			WRITE_COORD( damageOrigin.x );
 			WRITE_COORD( damageOrigin.y );
@@ -3920,6 +4035,15 @@ void CBasePlayer::UpdateClientData( void )
 		UpdateStatusBar();
 		m_flNextSBarUpdateTime = gpGlobals->time + 0.2;
 	}
+
+	// Send the current bhopcap state.
+	if( !m_bSentBhopcap )
+	{
+		m_bSentBhopcap = true;
+		MESSAGE_BEGIN( MSG_ONE, gmsgBhopcap, NULL, pev );
+			WRITE_BYTE( g_bhopcap );
+		MESSAGE_END();
+	}
 }
 
 //=========================================================
@@ -4059,8 +4183,8 @@ Vector CBasePlayer::GetAutoaimVector( float flDelta )
 		{
 			SET_CROSSHAIRANGLE( edict(), -m_vecAutoAim.x, m_vecAutoAim.y );
 
-			m_lastx = m_vecAutoAim.x;
-			m_lasty = m_vecAutoAim.y;
+			m_lastx = (int)m_vecAutoAim.x;
+			m_lasty = (int)m_vecAutoAim.y;
 		}
 	}
 
@@ -4282,7 +4406,8 @@ void CBasePlayer::DropPlayerItem( char *pszItemName )
 		// item we want to drop and hit a BREAK;  pWeapon is the item.
 		if( pWeapon )
 		{
-			g_pGameRules->GetNextBestWeapon( this, pWeapon );
+			if( !g_pGameRules->GetNextBestWeapon( this, pWeapon ) )
+				return; // can't drop the item they asked for, may be our last item or something we can't holster
 
 			UTIL_MakeVectors( pev->angles ); 
 
@@ -4403,10 +4528,10 @@ public:
 	void KeyValue( KeyValueData *pkvd );
 
 	int m_iPose;// which sequence to display	-- temporary, don't need to save
-	static char *m_szPoses[4];
+	static const char *m_szPoses[4];
 };
 
-char *CDeadHEV::m_szPoses[] =
+const char *CDeadHEV::m_szPoses[] =
 {
 	"deadback",
 	"deadsitting",
@@ -4548,7 +4673,7 @@ void CRevertSaved::KeyValue( KeyValueData *pkvd )
 
 void CRevertSaved::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
 {
-	UTIL_ScreenFadeAll( pev->rendercolor, Duration(), HoldTime(), pev->renderamt, FFADE_OUT );
+	UTIL_ScreenFadeAll( pev->rendercolor, Duration(), HoldTime(), (int)pev->renderamt, FFADE_OUT );
 	pev->nextthink = gpGlobals->time + MessageTime();
 	SetThink( &CRevertSaved::MessageThink );
 }
diff --git a/dlls/player.h b/dlls/player.h
index e75787ee..6fc06dbb 100644
--- a/dlls/player.h
+++ b/dlls/player.h
@@ -12,6 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
+#pragma once
 #ifndef PLAYER_H
 #define PLAYER_H
 
@@ -86,6 +87,18 @@ enum sbar_data
 class CBasePlayer : public CBaseMonster
 {
 public:
+	// Spectator camera
+	void	Observer_FindNextPlayer( bool bReverse );
+	void	Observer_HandleButtons();
+	void	Observer_SetMode( int iMode );
+	void	Observer_CheckTarget();
+	void	Observer_CheckProperties();
+	EHANDLE	m_hObserverTarget;
+	float	m_flNextObserverInput;
+	int		m_iObserverWeapon;	// weapon of current tracked target
+	int		m_iObserverLastMode;// last used observer mode
+	int		IsObserver() { return pev->iuser1; };
+
 	int					random_seed;    // See that is shared between client & server for shared weapons code
 
 	int					m_iPlayerSound;// the index of the sound list slot reserved for this player
@@ -243,11 +256,12 @@ public:
 
 	void StartDeathCam( void );
 	void StartObserver( Vector vecPosition, Vector vecViewAngle );
+	void StopObserver();
 
 	void AddPoints( int score, BOOL bAllowNegativeScore );
 	void AddPointsToTeam( int score, BOOL bAllowNegativeScore );
 	BOOL AddPlayerItem( CBasePlayerItem *pItem );
-	BOOL RemovePlayerItem( CBasePlayerItem *pItem );
+	BOOL RemovePlayerItem( CBasePlayerItem *pItem, bool bCallHoster );
 	void DropPlayerItem ( char *pszItemName );
 	BOOL HasPlayerItem( CBasePlayerItem *pCheckItem );
 	BOOL HasNamedPlayerItem( const char *pszItemName );
@@ -261,7 +275,7 @@ public:
 	void GiveNamedItem( const char *szName );
 	void EnableControl(BOOL fControl);
 
-	int  GiveAmmo( int iAmount, char *szName, int iMax );
+	int  GiveAmmo( int iAmount, const char *szName, int iMax );
 	void SendAmmoUpdate(void);
 
 	void WaterMove( void );
@@ -269,7 +283,7 @@ public:
 	void PlayerUse( void );
 
 	void CheckSuitUpdate();
-	void SetSuitUpdate(char *name, int fgroup, int iNoRepeat);
+	void SetSuitUpdate( const char *name, int fgroup, int iNoRepeat );
 	void UpdateGeigerCounter( void );
 	void CheckTimeBasedDamage( void );
 
@@ -293,6 +307,8 @@ public:
 
 	void TabulateAmmo( void );
 
+	Vector m_vecLastViewAngles;
+
 	float m_flStartCharge;
 	float m_flAmmoStartCharge;
 	float m_flPlayAftershock;
@@ -301,13 +317,15 @@ public:
 	//Player ID
 	void InitStatusBar( void );
 	void UpdateStatusBar( void );
-	int m_izSBarState[ SBAR_END ];
+	int m_izSBarState[SBAR_END];
 	float m_flNextSBarUpdateTime;
 	float m_flStatusBarDisappearDelay;
-	char m_SbarString0[ SBAR_STRING_SIZE ];
-	char m_SbarString1[ SBAR_STRING_SIZE ];
+	char m_SbarString0[SBAR_STRING_SIZE];
+	char m_SbarString1[SBAR_STRING_SIZE];
 
 	float m_flNextChatTime;
+
+	bool m_bSentBhopcap; // If false, the player just joined and needs a bhopcap message.
 };
 
 #define AUTOAIM_2DEGREES  0.0348994967025
@@ -315,7 +333,7 @@ public:
 #define AUTOAIM_8DEGREES  0.1391731009601
 #define AUTOAIM_10DEGREES 0.1736481776669
 
-extern int	gmsgHudText;
+extern int gmsgHudText;
 extern BOOL gInitHUD;
 
 #endif // PLAYER_H
diff --git a/dlls/prop.cpp b/dlls/prop.cpp
index c6c4017e..7f7dba48 100644
--- a/dlls/prop.cpp
+++ b/dlls/prop.cpp
@@ -248,7 +248,7 @@ void CProp::MaterialSoundPrecache( Materials precacheMaterial )
 
 	for( i = 0; i < soundCount; i++ )
 	{
-		PRECACHE_SOUND( (char *)pSoundList[i] );
+		PRECACHE_SOUND( pSoundList[i] );
 	}
 }
 
@@ -327,8 +327,8 @@ void CProp::Precache( void )
 	if( m_iszGibModel )
 		pGibName = STRING( m_iszGibModel );
 
-	m_idShard = PRECACHE_MODEL( (char *)pGibName );
-	PRECACHE_MODEL( (char *)STRING( pev->model ) );
+	m_idShard = PRECACHE_MODEL( pGibName );
+	PRECACHE_MODEL( STRING( pev->model ) );
 }
 
 void CProp::DamageSound( void )
diff --git a/dlls/python.cpp b/dlls/python.cpp
index afad2736..8a9483c5 100644
--- a/dlls/python.cpp
+++ b/dlls/python.cpp
@@ -171,7 +171,7 @@ void CPython::PrimaryAttack()
 			Reload();
 		else
 		{
-			EMIT_SOUND( ENT( m_pPlayer->pev ), CHAN_WEAPON, "weapons/357_cock1.wav", 0.8, ATTN_NORM );
+			PlayEmptySound();
 			m_flNextPrimaryAttack = 0.15;
 		}
 
@@ -214,7 +214,7 @@ void CPython::PrimaryAttack()
 
 void CPython::Reload( void )
 {
-	if( m_pPlayer->ammo_357 <= 0 )
+	if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 || m_iClip == PYTHON_MAX_CLIP )
 		return;
 
 	if( m_pPlayer->pev->fov != 0 )
@@ -229,11 +229,9 @@ void CPython::Reload( void )
 #else
 	bUseScope = g_pGameRules->IsMultiplayer();
 #endif
-	int iResult = DefaultReload( PYTHON_MAX_CLIP, PYTHON_RELOAD, 2.0, bUseScope );
-
-	if( iResult )
+	if( DefaultReload( PYTHON_MAX_CLIP, PYTHON_RELOAD, 2.0, bUseScope ) )
 	{
-		m_flSoundDelay = gpGlobals->time + 1.5;
+		m_flSoundDelay = 1.5;
 	}
 }
 
diff --git a/dlls/rpg.cpp b/dlls/rpg.cpp
index 1fec5cf1..fe1fd8a9 100644
--- a/dlls/rpg.cpp
+++ b/dlls/rpg.cpp
@@ -109,8 +109,8 @@ CRpgRocket *CRpgRocket::CreateRpgRocket( Vector vecOrigin, Vector vecAngles, CBa
 	pRocket->pev->angles = vecAngles;
 	pRocket->Spawn();
 	pRocket->SetTouch( &CRpgRocket::RocketTouch );
-	pRocket->m_pLauncher = pLauncher;// remember what RPG fired me. 
-	pRocket->m_pLauncher->m_cActiveRockets++;// register this missile as active for the launcher
+	pRocket->m_hLauncher = pLauncher;// remember what RPG fired me. 
+	pLauncher->m_cActiveRockets++;// register this missile as active for the launcher
 	pRocket->pev->owner = pOwner->edict();
 
 	return pRocket;
@@ -150,10 +150,10 @@ void CRpgRocket::Spawn( void )
 //=========================================================
 void CRpgRocket::RocketTouch( CBaseEntity *pOther )
 {
-	if( m_pLauncher )
+	if( CRpg* pLauncher = (CRpg*)( (CBaseEntity*)( m_hLauncher ) ) )
 	{
 		// my launcher is still around, tell it I'm dead.
-		m_pLauncher->m_cActiveRockets--;
+		pLauncher->m_cActiveRockets--;
 	}
 
 	STOP_SOUND( edict(), CHAN_VOICE, "weapons/rocket1.wav" );
@@ -265,6 +265,11 @@ void CRpgRocket::FollowThink( void )
 		pev->velocity = pev->velocity * 0.2 + vecTarget * flSpeed * 0.798;
 		if( pev->waterlevel == 0 && pev->velocity.Length() < 1500 )
 		{
+			if( CRpg *pLauncher = (CRpg*)( (CBaseEntity*)( m_hLauncher ) ) )
+			{
+				// my launcher is still around, tell it I'm dead.
+				pLauncher->m_cActiveRockets--;
+			}
 			Detonate();
 		}
 	}
@@ -278,13 +283,8 @@ void CRpg::Reload( void )
 {
 	int iResult = 0;
 
-	if( m_iClip == 1 )
-	{
-		// don't bother with any of this if don't need to reload.
-		return;
-	}
-
-	if( m_pPlayer->ammo_rockets <= 0 )
+	// don't bother with any of this if don't need to reload.
+	if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 || m_iClip == RPG_MAX_CLIP )
 		return;
 
 	// because the RPG waits to autoreload when no missiles are active while  the LTD is on, the
@@ -297,7 +297,7 @@ void CRpg::Reload( void )
 	// Set the next attack time into the future so that WeaponIdle will get called more often
 	// than reload, allowing the RPG LTD to be updated
 	
-	m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.5;
+	m_flNextPrimaryAttack = GetNextAttackDelay( 0.5 );
 
 	if( m_cActiveRockets && m_fSpotActive )
 	{
@@ -463,8 +463,10 @@ void CRpg::PrimaryAttack()
 
 		m_iClip--; 
 
-		m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 1.5;
+		m_flNextPrimaryAttack = GetNextAttackDelay( 1.5 );
 		m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 1.5;
+
+		ResetEmptySound();
 	}
 	else
 	{
@@ -492,13 +494,13 @@ void CRpg::WeaponIdle( void )
 {
 	UpdateSpot();
 
-	ResetEmptySound();
-
 	if( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() )
 		return;
 
 	if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] )
 	{
+		ResetEmptySound();
+
 		int iAnim;
 		float flRand = UTIL_SharedRandomFloat( m_pPlayer->random_seed, 0, 1 );
 		if( flRand <= 0.75 || m_fSpotActive )
diff --git a/dlls/satchel.cpp b/dlls/satchel.cpp
index 48ec5b9a..dc8724bd 100644
--- a/dlls/satchel.cpp
+++ b/dlls/satchel.cpp
@@ -23,6 +23,13 @@
 #include "player.h"
 #include "gamerules.h"
 
+enum satchel_state
+{
+	SATCHEL_IDLE = 0,
+	SATCHEL_READY,
+	SATCHEL_RELOAD
+};
+
 enum satchel_e
 {
 	SATCHEL_IDLE1 = 0,
@@ -42,6 +49,7 @@ enum satchel_radio_e
 
 class CSatchelCharge : public CGrenade
 {
+	Vector m_lastBounceOrigin;	// Used to fix a bug in engine: when object isn't moving, but its speed isn't 0 and on ground isn't set
 	void Spawn( void );
 	void Precache( void );
 	void BounceSound( void );
@@ -92,7 +100,7 @@ void CSatchelCharge::Spawn( void )
 
 void CSatchelCharge::SatchelSlide( CBaseEntity *pOther )
 {
-	entvars_t *pevOther = pOther->pev;
+	//entvars_t *pevOther = pOther->pev;
 
 	// don't hit the guy that launched this grenade
 	if( pOther->edict() == pev->owner )
@@ -114,14 +122,19 @@ void CSatchelCharge::SatchelSlide( CBaseEntity *pOther )
 	}
 	if( !( pev->flags & FL_ONGROUND ) && pev->velocity.Length2D() > 10 )
 	{
+		// Fix for a bug in engine: when object isn't moving, but its speed isn't 0 and on ground isn't set
+		if( pev->origin != m_lastBounceOrigin )
 		BounceSound();
 	}
-	StudioFrameAdvance();
+	m_lastBounceOrigin = pev->origin;
+	// There is no model animation so commented this out to prevent net traffic
+	// StudioFrameAdvance();
 }
 
 void CSatchelCharge::SatchelThink( void )
 {
-	StudioFrameAdvance();
+	// There is no model animation so commented this out to prevent net traffic
+	// StudioFrameAdvance();
 	pev->nextthink = gpGlobals->time + 0.1;
 
 	if( !IsInWorld() )
@@ -149,7 +162,7 @@ void CSatchelCharge::SatchelThink( void )
 
 void CSatchelCharge::Precache( void )
 {
-	PRECACHE_MODEL( "models/grenade.mdl" );
+	PRECACHE_MODEL( "models/w_satchel.mdl" );
 	PRECACHE_SOUND( "weapons/g_bounce1.wav" );
 	PRECACHE_SOUND( "weapons/g_bounce2.wav" );
 	PRECACHE_SOUND( "weapons/g_bounce3.wav" );
@@ -188,7 +201,7 @@ int CSatchel::AddDuplicate( CBasePlayerItem *pOriginal )
 	{
 		pSatchel = (CSatchel *)pOriginal;
 
-		if( pSatchel->m_chargeReady != 0 )
+		if( pSatchel->m_chargeReady != SATCHEL_IDLE )
 		{
 			// player has some satchels deployed. Refuse to add more.
 			return FALSE;
@@ -205,7 +218,7 @@ int CSatchel::AddToPlayer( CBasePlayer *pPlayer )
 	int bResult = CBasePlayerItem::AddToPlayer( pPlayer );
 
 	pPlayer->pev->weapons |= ( 1 << m_iId );
-	m_chargeReady = 0;// this satchel charge weapon now forgets that any satchels are deployed by it.
+	m_chargeReady = SATCHEL_IDLE;// this satchel charge weapon now forgets that any satchels are deployed by it.
 
 	if( bResult )
 	{
@@ -257,19 +270,7 @@ int CSatchel::GetItemInfo( ItemInfo *p )
 //=========================================================
 BOOL CSatchel::IsUseable( void )
 {
-	if( m_pPlayer->m_rgAmmo[PrimaryAmmoIndex()] > 0 ) 
-	{
-		// player is carrying some satchels
-		return TRUE;
-	}
-
-	if( m_chargeReady != 0 )
-	{
-		// player isn't carrying any satchels, but has some out
-		return TRUE;
-	}
-
-	return FALSE;
+	return CanDeploy();
 }
 
 BOOL CSatchel::CanDeploy( void )
@@ -280,7 +281,7 @@ BOOL CSatchel::CanDeploy( void )
 		return TRUE;
 	}
 
-	if( m_chargeReady != 0 )
+	if( m_chargeReady )
 	{
 		// player isn't carrying any satchels, but has some out
 		return TRUE;
@@ -316,11 +317,10 @@ void CSatchel::Holster( int skiplocal /* = 0 */ )
 	}
 	EMIT_SOUND( ENT( m_pPlayer->pev ), CHAN_WEAPON, "common/null.wav", 1.0, ATTN_NORM );
 
-	if( !m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] && !m_chargeReady )
+	if( !m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] && m_chargeReady != SATCHEL_READY )
 	{
 		m_pPlayer->pev->weapons &= ~( 1 << WEAPON_SATCHEL );
-		SetThink( &CBasePlayerItem::DestroyItem );
-		pev->nextthink = gpGlobals->time + 0.1;
+		DestroyItem();
 	}
 }
 
@@ -328,38 +328,37 @@ void CSatchel::PrimaryAttack()
 {
 	switch( m_chargeReady )
 	{
-	case 0:
+	case SATCHEL_IDLE:
 		{
-		Throw();
+			Throw();
 		}
 		break;
-	case 1:
+	case SATCHEL_READY:
 		{
-		SendWeaponAnim( SATCHEL_RADIO_FIRE );
+			SendWeaponAnim( SATCHEL_RADIO_FIRE );
 
-		edict_t *pPlayer = m_pPlayer->edict();
+			edict_t *pPlayer = m_pPlayer->edict();
 
-		CBaseEntity *pSatchel = NULL;
+			CBaseEntity *pSatchel = NULL;
 
-		while( ( pSatchel = UTIL_FindEntityInSphere( pSatchel, m_pPlayer->pev->origin, 4096 ) ) != NULL )
-		{
-			if( FClassnameIs( pSatchel->pev, "monster_satchel" ) )
+			while( ( pSatchel = UTIL_FindEntityInSphere( pSatchel, m_pPlayer->pev->origin, 4096 ) ) != NULL )
 			{
-				if( pSatchel->pev->owner == pPlayer )
+				if( FClassnameIs( pSatchel->pev, "monster_satchel" ) )
 				{
-					pSatchel->Use( m_pPlayer, m_pPlayer, USE_ON, 0 );
-					m_chargeReady = 2;
+					if( pSatchel->pev->owner == pPlayer )
+					{
+						pSatchel->Use( m_pPlayer, m_pPlayer, USE_ON, 0 );
+					}
 				}
 			}
-		}
 
-		m_chargeReady = 2;
-		m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.5;
-		m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.5;
-		m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.5;
-		break;
+			m_chargeReady = SATCHEL_RELOAD;
+			m_flNextPrimaryAttack = GetNextAttackDelay( 0.5 );
+			m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.5;
+			m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.5;
+			break;
 		}
-	case 2:
+	case SATCHEL_RELOAD:
 		// we're reloading, don't allow fire
 		break;
 	}
@@ -367,7 +366,7 @@ void CSatchel::PrimaryAttack()
 
 void CSatchel::SecondaryAttack( void )
 {
-	if( m_chargeReady != 2 )
+	if( m_chargeReady != SATCHEL_RELOAD )
 	{
 		Throw();
 	}
@@ -377,11 +376,11 @@ void CSatchel::Throw( void )
 {
 	if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] )
 	{
+#ifndef CLIENT_DLL
 		Vector vecSrc = m_pPlayer->pev->origin;
 
 		Vector vecThrow = gpGlobals->v_forward * 274 + m_pPlayer->pev->velocity;
 
-#ifndef CLIENT_DLL
 		CBaseEntity *pSatchel = Create( "monster_satchel", vecSrc, Vector( 0, 0, 0 ), m_pPlayer->edict() );
 		pSatchel->pev->velocity = vecThrow;
 		pSatchel->pev->avelocity.y = 400;
@@ -397,11 +396,11 @@ void CSatchel::Throw( void )
 		// player "shoot" animation
 		m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
 
-		m_chargeReady = 1;
-		
+		m_chargeReady = SATCHEL_READY;
+
 		m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]--;
 
-		m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 1.0;
+		m_flNextPrimaryAttack = GetNextAttackDelay( 1.0 );
 		m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.5;
 	}
 }
@@ -413,17 +412,17 @@ void CSatchel::WeaponIdle( void )
 
 	switch( m_chargeReady )
 	{
-	case 0:
+	case SATCHEL_IDLE:
 		SendWeaponAnim( SATCHEL_FIDGET1 );
 		// use tripmine animations
 		strcpy( m_pPlayer->m_szAnimExtention, "trip" );
 		break;
-	case 1:
+	case SATCHEL_READY:
 		SendWeaponAnim( SATCHEL_RADIO_FIDGET1 );
 		// use hivehand animations
 		strcpy( m_pPlayer->m_szAnimExtention, "hive" );
 		break;
-	case 2:
+	case SATCHEL_RELOAD:
 		if( !m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] )
 		{
 			m_chargeReady = 0;
@@ -442,9 +441,9 @@ void CSatchel::WeaponIdle( void )
 		// use tripmine animations
 		strcpy( m_pPlayer->m_szAnimExtention, "trip" );
 
-		m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.5;
+		m_flNextPrimaryAttack = GetNextAttackDelay( 0.5 );
 		m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.5;
-		m_chargeReady = 0;
+		m_chargeReady = SATCHEL_IDLE;
 		break;
 	}
 	m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 );// how long till we do this again.
diff --git a/dlls/saverestore.h b/dlls/saverestore.h
index f76613e8..81f9f131 100644
--- a/dlls/saverestore.h
+++ b/dlls/saverestore.h
@@ -13,6 +13,7 @@
 *
 ****/
 // Implementation in UTIL.CPP
+#pragma once
 #ifndef SAVERESTORE_H
 #define SAVERESTORE_H
 
@@ -23,7 +24,7 @@ class CSaveRestoreBuffer
 public:
 	CSaveRestoreBuffer( void );
 	CSaveRestoreBuffer( SAVERESTOREDATA *pdata );
-	~CSaveRestoreBuffer( void );
+	virtual ~CSaveRestoreBuffer( void );
 
 	int			EntityIndex( entvars_t *pevLookup );
 	int			EntityIndex( edict_t *pentLookup );
@@ -41,6 +42,10 @@ protected:
 	SAVERESTOREDATA		*m_pdata;
 	void		BufferRewind( int size );
 	unsigned int	HashString( const char *pszToken );
+private:
+	// effc++ rule 11
+	void operator = ( CSaveRestoreBuffer& );
+	CSaveRestoreBuffer( const CSaveRestoreBuffer& );
 };
 
 class CSave : public CSaveRestoreBuffer
@@ -59,7 +64,7 @@ public:
 	void	WriteVector( const char *pname, const float *value, int count );	// Save a vector
 	void	WritePositionVector( const char *pname, const Vector &value );		// Offset for landmark if necessary
 	void	WritePositionVector( const char *pname, const float *value, int count );	// array of pos vectors
-	void	WriteFunction( const char *pname, const int *value, int count );		// Save a function pointer
+	void	WriteFunction( const char *pname, void **value, int count );		// Save a function pointer
 	int		WriteEntVars( const char *pname, entvars_t *pev );		// Save entvars_t (entvars_t)
 	int		WriteFields( const char *pname, void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCount );
 
@@ -81,7 +86,7 @@ typedef struct
 class CRestore : public CSaveRestoreBuffer
 {
 public:
-	CRestore( SAVERESTOREDATA *pdata ) : CSaveRestoreBuffer( pdata ) { m_global = 0; m_precache = TRUE; }
+	CRestore( SAVERESTOREDATA *pdata ) : CSaveRestoreBuffer( pdata ), m_global(0), m_precache( TRUE ) { }
 	int		ReadEntVars( const char *pname, entvars_t *pev );		// entvars_t
 	int		ReadFields( const char *pname, void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCount );
 	int		ReadField( void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCount, int startField, int size, char *pName, void *pData );
@@ -160,6 +165,9 @@ private:
 	globalentity_t	*Find( string_t globalname );
 	globalentity_t	*m_pList;
 	int				m_listCount;
+	// effc++ rule 11
+	void operator = ( CGlobalState& );
+	CGlobalState( const CGlobalState& );
 };
 
 extern CGlobalState gGlobalState;
diff --git a/dlls/schedule.cpp b/dlls/schedule.cpp
index c28a88fa..4a5cefca 100644
--- a/dlls/schedule.cpp
+++ b/dlls/schedule.cpp
@@ -238,7 +238,7 @@ void CBaseMonster::MaintainSchedule( void )
 			{
 				if( (m_afConditions && !HasConditions( bits_COND_SCHEDULE_DONE ) ) ||
 						( m_pSchedule && (m_pSchedule->iInterruptMask & bits_COND_SCHEDULE_DONE ) ) ||
-						( ( m_MonsterState == MONSTERSTATE_COMBAT ) && ( m_hEnemy == NULL ) )	)
+						( ( m_MonsterState == MONSTERSTATE_COMBAT ) && ( m_hEnemy == 0 ) )	)
 				{
 					GetIdealState();
 				}
@@ -407,7 +407,7 @@ void CBaseMonster::RunTask( Task_t *pTask )
 		{
 			float distance;
 
-			if( m_hTargetEnt == NULL )
+			if( m_hTargetEnt == 0 )
 				TaskFail();
 			else
 			{
@@ -675,7 +675,7 @@ void CBaseMonster::StartTask( Task_t *pTask )
 		}
 	case TASK_FIND_NEAR_NODE_COVER_FROM_ENEMY:
 		{
-			if( m_hEnemy == NULL )
+			if( m_hEnemy == 0 )
 			{
 				TaskFail();
 				return;
@@ -695,7 +695,7 @@ void CBaseMonster::StartTask( Task_t *pTask )
 		}
 	case TASK_FIND_FAR_NODE_COVER_FROM_ENEMY:
 		{
-			if( m_hEnemy == NULL )
+			if( m_hEnemy == 0 )
 			{
 				TaskFail();
 				return;
@@ -715,7 +715,7 @@ void CBaseMonster::StartTask( Task_t *pTask )
 		}
 	case TASK_FIND_NODE_COVER_FROM_ENEMY:
 		{
-			if( m_hEnemy == NULL )
+			if( m_hEnemy == 0 )
 			{
 				TaskFail();
 				return;
@@ -737,7 +737,7 @@ void CBaseMonster::StartTask( Task_t *pTask )
 		{
 			entvars_t *pevCover;
 
-			if( m_hEnemy == NULL )
+			if( m_hEnemy == 0 )
 			{
 				// Find cover from self if no enemy available
 				pevCover = pev;
@@ -821,7 +821,7 @@ void CBaseMonster::StartTask( Task_t *pTask )
 		SetTurnActivity(); 
 		break;
 	case TASK_FACE_TARGET:
-		if( m_hTargetEnt != NULL )
+		if( m_hTargetEnt != 0 )
 		{
 			MakeIdealYaw( m_hTargetEnt->pev->origin );
 			SetTurnActivity(); 
@@ -904,7 +904,7 @@ void CBaseMonster::StartTask( Task_t *pTask )
 					TaskComplete();
 				else 
 				{
-					if( m_hTargetEnt == NULL || !MoveToTarget( newActivity, 2 ) )
+					if( m_hTargetEnt == 0 || !MoveToTarget( newActivity, 2 ) )
 					{
 						TaskFail();
 						ALERT( at_aiconsole, "%s Failed to reach target!!!\n", STRING( pev->classname ) );
@@ -1043,7 +1043,7 @@ void CBaseMonster::StartTask( Task_t *pTask )
 	case TASK_GET_PATH_TO_TARGET:
 		{
 			RouteClear();
-			if( m_hTargetEnt != NULL && MoveToTarget( m_movementActivity, 1 ) )
+			if( m_hTargetEnt != 0 && MoveToTarget( m_movementActivity, 1 ) )
 			{
 				TaskComplete();
 			}
@@ -1272,7 +1272,7 @@ void CBaseMonster::StartTask( Task_t *pTask )
 		}
 	case TASK_PLANT_ON_SCRIPT:
 		{
-			if( m_hTargetEnt != NULL )
+			if( m_hTargetEnt != 0 )
 			{
 				pev->origin = m_hTargetEnt->pev->origin;	// Plant on target
 			}
@@ -1282,7 +1282,7 @@ void CBaseMonster::StartTask( Task_t *pTask )
 		}
 	case TASK_FACE_SCRIPT:
 		{
-			if( m_hTargetEnt != NULL )
+			if( m_hTargetEnt != 0 )
 			{
 				pev->ideal_yaw = UTIL_AngleMod( m_hTargetEnt->pev->angles.y );
 			}
diff --git a/dlls/schedule.h b/dlls/schedule.h
index 0c4fb1ce..6414ff15 100644
--- a/dlls/schedule.h
+++ b/dlls/schedule.h
@@ -15,7 +15,7 @@
 //=========================================================
 // Scheduling 
 //=========================================================
-
+#pragma once
 #ifndef	SCHEDULE_H
 #define	SCHEDULE_H
 
diff --git a/dlls/scientist.cpp b/dlls/scientist.cpp
index f7c6f76a..17fc293d 100644
--- a/dlls/scientist.cpp
+++ b/dlls/scientist.cpp
@@ -395,7 +395,7 @@ void CScientist::Scream( void )
 
 Activity CScientist::GetStoppedActivity( void )
 { 
-	if( m_hEnemy != NULL ) 
+	if( m_hEnemy != 0 ) 
 		return ACT_EXCITED;
 	return CTalkMonster::GetStoppedActivity();
 }
@@ -425,7 +425,10 @@ void CScientist::StartTask( Task_t *pTask )
 		{
 			Talk( 2 );
 			m_hTalkTarget = m_hEnemy;
-			if( m_hEnemy->IsPlayer() )
+
+			//The enemy can be null here. - Solokiller
+			//Discovered while testing the barnacle grapple on headcrabs with scientists in view.
+			if( m_hEnemy != 0 && m_hEnemy->IsPlayer() )
 				PlaySentence( "SC_PLFEAR", 5, VOL_NORM, ATTN_NORM );
 			else
 				PlaySentence( "SC_FEAR", 5, VOL_NORM, ATTN_NORM );
@@ -471,7 +474,7 @@ void CScientist::RunTask( Task_t *pTask )
 			if( RANDOM_LONG( 0, 63 ) < 8 )
 				Scream();
 
-			if( m_hEnemy == NULL )
+			if( m_hEnemy == 0 )
 			{
 				TaskFail();
 			}
@@ -847,8 +850,8 @@ Schedule_t *CScientist::GetSchedule( void )
 				m_fearTime = gpGlobals->time;
 			else if( DisregardEnemy( pEnemy ) )		// After 15 seconds of being hidden, return to alert
 			{
-				m_hEnemy = NULL;
-				pEnemy = NULL;
+				m_hEnemy = 0;
+				pEnemy = 0;
 			}
 		}
 
@@ -975,12 +978,12 @@ MONSTERSTATE CScientist::GetIdealState( void )
 				{
 					// Strip enemy when going to alert
 					m_IdealMonsterState = MONSTERSTATE_ALERT;
-					m_hEnemy = NULL;
+					m_hEnemy = 0;
 					return m_IdealMonsterState;
 				}
 
 				// Follow if only scared a little
-				if( m_hTargetEnt != NULL )
+				if( m_hTargetEnt != 0 )
 				{
 					m_IdealMonsterState = MONSTERSTATE_ALERT;
 					return m_IdealMonsterState;
@@ -1033,7 +1036,7 @@ int CScientist::FriendNumber( int arrayNumber )
 //=========================================================
 // Dead Scientist PROP
 //=========================================================
-char *CDeadScientist::m_szPoses[] =
+const char *CDeadScientist::m_szPoses[] =
 {
 	"lying_on_back",
 	"lying_on_stomach",
diff --git a/dlls/scientist.h b/dlls/scientist.h
index cb955f71..abc06c4b 100644
--- a/dlls/scientist.h
+++ b/dlls/scientist.h
@@ -80,7 +80,7 @@ public:
 
 	void KeyValue(KeyValueData *pkvd);
 	int	m_iPose;// which sequence to display
-	static char *m_szPoses[7];
+	static const char *m_szPoses[7];
 };
 
 //=========================================================
diff --git a/dlls/scripted.cpp b/dlls/scripted.cpp
index f3cf37c5..41638b39 100644
--- a/dlls/scripted.cpp
+++ b/dlls/scripted.cpp
@@ -712,7 +712,7 @@ void CCineMonster::DelayStart( int state )
 			else
 			{
 				pTarget->m_iDelay--;
-				if (pTarget->m_iDelay <= 0)
+				if( pTarget->m_iDelay <= 0 )
 					pTarget->m_startTime = gpGlobals->time + 0.05;
 			}
 		}
@@ -907,15 +907,15 @@ public:
 	BOOL StartSentence( CBaseMonster *pTarget );
 
 private:
-	int m_iszSentence;		// string index for idle animation
-	int m_iszEntity;	// entity that is wanted for this sentence
+	string_t m_iszSentence;		// string index for idle animation
+	string_t m_iszEntity;	// entity that is wanted for this sentence
 	float m_flRadius;		// range to search
 	float m_flDuration;	// How long the sentence lasts
 	float m_flRepeat;	// repeat rate
 	float m_flAttenuation;
 	float m_flVolume;
 	BOOL m_active;
-	int m_iszListener;	// name of entity to look at while talking
+	string_t m_iszListener; // name of entity to look at while talking
 };
 
 #define SF_SENTENCE_ONCE	0x0001
@@ -1068,7 +1068,7 @@ BOOL CScriptedSentence::AcceptableSpeaker( CBaseMonster *pMonster )
 	{
 		if( pev->spawnflags & SF_SENTENCE_FOLLOWERS )
 		{
-			if( pMonster->m_hTargetEnt == NULL || !FClassnameIs( pMonster->m_hTargetEnt->pev, "player" ) )
+			if( pMonster->m_hTargetEnt == 0 || !FClassnameIs( pMonster->m_hTargetEnt->pev, "player" ) )
 				return FALSE;
 		}
 		BOOL override;
@@ -1124,7 +1124,7 @@ BOOL CScriptedSentence::StartSentence( CBaseMonster *pTarget )
 	if( !pTarget )
 	{
 		ALERT( at_aiconsole, "Not Playing sentence %s\n", STRING( m_iszSentence ) );
-		return NULL;
+		return FALSE;
 	}
 
 	BOOL bConcurrent = FALSE;
@@ -1177,7 +1177,7 @@ void CFurniture::Die( void )
 //=========================================================
 void CFurniture::Spawn()
 {
-	PRECACHE_MODEL( (char *)STRING( pev->model ) );
+	PRECACHE_MODEL( STRING( pev->model ) );
 	SET_MODEL( ENT( pev ), STRING( pev->model ) );
 
 	pev->movetype = MOVETYPE_NONE;
diff --git a/dlls/scripted.h b/dlls/scripted.h
index 25348114..59b696f7 100644
--- a/dlls/scripted.h
+++ b/dlls/scripted.h
@@ -12,6 +12,7 @@
 *   use or distribution of this code by or to any unlicensed person is illegal.
 *
 ****/
+#pragma once
 #ifndef SCRIPTED_H
 #define SCRIPTED_H
 
@@ -77,9 +78,9 @@ public:
 	void	AllowInterrupt( BOOL fAllow );
 	int		IgnoreConditions( void );
 
-	int	m_iszIdle;		// string index for idle animation
-	int	m_iszPlay;		// string index for scripted animation
-	int m_iszEntity;	// entity that is wanted for this script
+	string_t m_iszIdle;		// string index for idle animation
+	string_t m_iszPlay;		// string index for scripted animation
+	string_t m_iszEntity;	// entity that is wanted for this script
 	int m_fMoveTo;
 	int m_iFinishSchedule;
 	float m_flRadius;		// range to search
diff --git a/dlls/scriptevent.h b/dlls/scriptevent.h
index 714ac99c..18436a26 100644
--- a/dlls/scriptevent.h
+++ b/dlls/scriptevent.h
@@ -12,6 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
+#pragma once
 #ifndef SCRIPTEVENT_H
 #define SCRIPTEVENT_H
 
@@ -26,4 +27,4 @@
 #define SCRIPT_EVENT_SOUND_VOICE	1008		// Play named wave file (on CHAN_VOICE)
 #define	SCRIPT_EVENT_SENTENCE_RND1	1009		// Play sentence group 25% of the time
 #define SCRIPT_EVENT_NOT_DEAD		1010		// Bring back to life (for life/death sequences)
-#endif //SCRIPTEVENT_H
+#endif // SCRIPTEVENT_H
diff --git a/dlls/shotgun.cpp b/dlls/shotgun.cpp
index 8c96e99c..a08770b3 100644
--- a/dlls/shotgun.cpp
+++ b/dlls/shotgun.cpp
@@ -119,7 +119,7 @@ void CShotgun::PrimaryAttack()
 	if( m_pPlayer->pev->waterlevel == 3 )
 	{
 		PlayEmptySound();
-		m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.15;
+		m_flNextPrimaryAttack = GetNextAttackDelay( 0.15 );
 		return;
 	}
 
@@ -144,6 +144,9 @@ void CShotgun::PrimaryAttack()
 #endif
 	m_pPlayer->pev->effects = (int)( m_pPlayer->pev->effects ) | EF_MUZZLEFLASH;
 
+	// player "shoot" animation
+	m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
+
 	Vector vecSrc = m_pPlayer->GetGunPosition();
 	Vector vecAiming = m_pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES );
 
@@ -169,10 +172,10 @@ void CShotgun::PrimaryAttack()
 		// HEV suit - indicate out of ammo condition
 		m_pPlayer->SetSuitUpdate( "!HEV_AMO0", FALSE, 0 );
 
-	if( m_iClip != 0 )
+	//if( m_iClip != 0 )
 		m_flPumpTime = gpGlobals->time + 0.5;
 
-	m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.75;
+	m_flNextPrimaryAttack = GetNextAttackDelay( 0.75 );
 	m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.75;
 	if( m_iClip != 0 )
 		m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 5.0;
@@ -187,7 +190,7 @@ void CShotgun::SecondaryAttack( void )
 	if( m_pPlayer->pev->waterlevel == 3 )
 	{
 		PlayEmptySound();
-		m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.15;
+		m_flNextPrimaryAttack = GetNextAttackDelay( 0.15 );
 		return;
 	}
 
@@ -240,10 +243,10 @@ void CShotgun::SecondaryAttack( void )
 		// HEV suit - indicate out of ammo condition
 		m_pPlayer->SetSuitUpdate( "!HEV_AMO0", FALSE, 0 );
 
-	if( m_iClip != 0 )
+	//if( m_iClip != 0 )
 		m_flPumpTime = gpGlobals->time + 0.95;
 
-	m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 1.5;
+	m_flNextPrimaryAttack = GetNextAttackDelay( 1.5 );
 	m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 1.5;
 	if( m_iClip != 0 )
 		m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 6.0;
@@ -269,7 +272,7 @@ void CShotgun::Reload( void )
 		m_fInSpecialReload = 1;
 		m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.6;
 		m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.6;
-		m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 1.0;
+		m_flNextPrimaryAttack = GetNextAttackDelay( 1.0 );
 		m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 1.0;
 		return;
 	}
@@ -299,18 +302,21 @@ void CShotgun::Reload( void )
 	}
 }
 
-void CShotgun::WeaponIdle( void )
+void CShotgun::WeaponTick()
 {
-	ResetEmptySound();
-
-	m_pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES );
-
 	if( m_flPumpTime && m_flPumpTime < gpGlobals->time )
 	{
 		// play pumping sound
 		EMIT_SOUND_DYN( ENT( m_pPlayer->pev ), CHAN_ITEM, "weapons/scock1.wav", 1, ATTN_NORM, 0, 95 + RANDOM_LONG( 0, 0x1f ) );
 		m_flPumpTime = 0;
 	}
+}
+
+void CShotgun::WeaponIdle( void )
+{
+	ResetEmptySound();
+
+	m_pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES );
 
 	if( m_flTimeWeaponIdle <  UTIL_WeaponTimeBase() )
 	{
@@ -320,7 +326,7 @@ void CShotgun::WeaponIdle( void )
 		}
 		else if( m_fInSpecialReload != 0 )
 		{
-			if( m_iClip != 8 && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] )
+			if( m_iClip != SHOTGUN_MAX_CLIP && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] )
 			{
 				Reload();
 			}
diff --git a/dlls/skill.cpp b/dlls/skill.cpp
index 2a68e1a5..689bbadb 100644
--- a/dlls/skill.cpp
+++ b/dlls/skill.cpp
@@ -25,13 +25,12 @@ skilldata_t gSkillData;
 // take the name of a cvar, tack a digit for the skill level
 // on, and return the value.of that Cvar 
 //=========================================================
-float GetSkillCvar( char *pName )
+float GetSkillCvar( const char *pName )
 {
-	int iCount;
 	float flValue;
 	char szBuffer[64];
 
-	iCount = sprintf( szBuffer, "%s%d",pName, gSkillData.iSkillLevel );
+	sprintf( szBuffer, "%s%d",pName, gSkillData.iSkillLevel );
 
 	flValue = CVAR_GET_FLOAT( szBuffer );
 
diff --git a/dlls/skill.h b/dlls/skill.h
index 0ea19af7..5c5db757 100644
--- a/dlls/skill.h
+++ b/dlls/skill.h
@@ -15,13 +15,16 @@
 //=========================================================
 // skill.h - skill level concerns
 //=========================================================
+#pragma once
+#ifndef SKILL_H
+#define SKILL_H
 
 struct skilldata_t
 {
 	int iSkillLevel; // game skill level
 
 	// Monster Health & Damage
-	float	agruntHealth;
+	float agruntHealth;
 	float agruntDmgPunch;
 
 	float apacheHealth;
@@ -162,10 +165,11 @@ struct skilldata_t
 };
 
 extern	DLL_GLOBAL	skilldata_t	gSkillData;
-float GetSkillCvar( char *pName );
+float GetSkillCvar( const char *pName );
 
 extern DLL_GLOBAL int		g_iSkillLevel;
 
 #define SKILL_EASY		1
 #define SKILL_MEDIUM	2
 #define SKILL_HARD		3
+#endif // SKILL_H
diff --git a/dlls/sound.cpp b/dlls/sound.cpp
index b97eee12..31d0b7aa 100644
--- a/dlls/sound.cpp
+++ b/dlls/sound.cpp
@@ -182,7 +182,7 @@ void CAmbientGeneric::Spawn( void )
 		m_flAttenuation = ATTN_STATIC;
 	}
 
-	char* szSoundFile = (char*)STRING( pev->message );
+	const char *szSoundFile = STRING( pev->message );
 
 	if( FStringNull( pev->message ) || strlen( szSoundFile ) < 1 )
 	{
@@ -216,7 +216,7 @@ void CAmbientGeneric::Spawn( void )
 
 void CAmbientGeneric::Precache( void )
 {
-	char* szSoundFile = (char*)STRING( pev->message );
+	const char *szSoundFile = STRING( pev->message );
 
 	if( !FStringNull( pev->message ) && strlen( szSoundFile ) > 1 )
 	{
@@ -248,7 +248,7 @@ void CAmbientGeneric::Precache( void )
 // with lfo if active.
 void CAmbientGeneric::RampThink( void )
 {
-	char* szSoundFile = (char*) STRING(pev->message);
+	const char *szSoundFile = STRING( pev->message );
 	int pitch = m_dpv.pitch; 
 	int vol = m_dpv.vol;
 	int flags = 0;
@@ -448,7 +448,7 @@ void CAmbientGeneric::InitModulationParms( void )
 {
 	int pitchinc;
 
-	m_dpv.volrun = pev->health * 10;	// 0 - 100
+	m_dpv.volrun = (int)( pev->health * 10 );	// 0 - 100
 	if( m_dpv.volrun > 100 )
 		m_dpv.volrun = 100;
 	if( m_dpv.volrun < 0 )
@@ -533,7 +533,7 @@ void CAmbientGeneric::InitModulationParms( void )
 //
 void CAmbientGeneric::ToggleUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
 {
-	char* szSoundFile = (char*)STRING( pev->message );
+	const char *szSoundFile = STRING( pev->message );
 	float fraction;
 
 	if( useType != USE_TOGGLE )
@@ -553,7 +553,7 @@ void CAmbientGeneric::ToggleUse( CBaseEntity *pActivator, CBaseEntity *pCaller,
 		if( fraction < 0.0 )
 			fraction = 0.01;
 
-		m_dpv.pitch = fraction * 255;
+		m_dpv.pitch = (int)( fraction * 255 );
 
 		UTIL_EmitAmbientSound( ENT( pev ), pev->origin, szSoundFile, 0, 0, SND_CHANGE_PITCH, m_dpv.pitch );
 		return;
@@ -1567,7 +1567,7 @@ void TEXTURETYPE_Init()
 			continue;
 
 		// null-terminate name and save in sentences array
-		j = min( j, CBTEXTURENAMEMAX - 1 + i );
+		j = Q_min( j, CBTEXTURENAMEMAX - 1 + i );
 		buffer[j] = 0;
 		strcpy( &( grgszTextureName[gcTextures++][0] ), &( buffer[i] ) );
 	}
@@ -1610,7 +1610,7 @@ float TEXTURETYPE_PlaySound( TraceResult *ptr,  Vector vecSrc, Vector vecEnd, in
 	const char *pTextureName;
 	float rgfl1[3];
 	float rgfl2[3];
-	char *rgsz[4];
+	const char *rgsz[4];
 	int cnt;
 	float fattn = ATTN_NORM;
 
@@ -1822,7 +1822,7 @@ IMPLEMENT_SAVERESTORE( CSpeaker, CBaseEntity )
 //
 void CSpeaker::Spawn( void )
 {
-	char *szSoundFile = (char*) STRING( pev->message );
+	const char *szSoundFile = STRING( pev->message );
 
 	if( !m_preset && ( FStringNull( pev->message ) || strlen( szSoundFile ) < 1 ) )
 	{
@@ -1854,7 +1854,7 @@ void CSpeaker::Precache( void )
 }
 void CSpeaker::SpeakerThink( void )
 {
-	char* szSoundFile;
+	const char* szSoundFile = NULL;
 	float flvolume = pev->health * 0.1;
 	float flattenuation = 0.3;
 	int flags = 0;
@@ -1911,7 +1911,7 @@ void CSpeaker::SpeakerThink( void )
 		}
 	}
 	else
-		szSoundFile = (char*)STRING( pev->message );
+		szSoundFile = STRING( pev->message );
 
 	if( szSoundFile[0] == '!' )
 	{
diff --git a/dlls/soundent.h b/dlls/soundent.h
index 6c39a6c0..88def506 100644
--- a/dlls/soundent.h
+++ b/dlls/soundent.h
@@ -17,6 +17,9 @@
 // spawns, and handles the world's active and free sound
 // lists.
 //=========================================================
+#pragma once
+#ifndef SOUNDENT_H
+#define SOUNDENT_H
 
 #define	MAX_WORLD_SOUNDS	64 // maximum number of sounds handled by the world at one time.
 
@@ -91,3 +94,4 @@ public:
 private:
 	CSound		m_SoundPool[ MAX_WORLD_SOUNDS ];
 };
+#endif // SOUNDENT_H
diff --git a/dlls/spectator.h b/dlls/spectator.h
index 90f8678f..c4e895c0 100644
--- a/dlls/spectator.h
+++ b/dlls/spectator.h
@@ -13,6 +13,9 @@
 *
 ****/
 // Spectator.h
+#pragma once
+#ifndef SPECTATOR_H
+#define SPECTATOR_H
 
 class CBaseSpectator : public CBaseEntity 
 {
@@ -25,3 +28,4 @@ public:
 private:
 	void SpectatorImpulseCommand( void );
 };
+#endif // SPECTATOR_H
diff --git a/dlls/squad.h b/dlls/squad.h
index bb2784bb..f8f20aa0 100644
--- a/dlls/squad.h
+++ b/dlls/squad.h
@@ -4,10 +4,12 @@
 //
 // $NoKeywords: $
 //=============================================================================
-
 //=========================================================
 // squad.h
 //=========================================================
+#pragma once
+#ifndef SQUAD_H
+#define SQUAD_H
 
 // these are special group roles that are assigned to members when the group is formed.
 // the reason these are explicitly assigned and tasks like throwing grenades to flush out 
@@ -19,3 +21,4 @@
 #define		bits_SQUAD_FLANK_RIGHT		( 1 << 1 )
 #define		bits_SQUAD_ADVANCE		( 1 << 2 )
 #define		bits_SQUAD_FLUSH_ATTACK		( 1 << 3 )
+#endif // SQUAD_H
diff --git a/dlls/squadmonster.cpp b/dlls/squadmonster.cpp
index a89f39f9..3d476b50 100644
--- a/dlls/squadmonster.cpp
+++ b/dlls/squadmonster.cpp
@@ -192,7 +192,7 @@ BOOL CSquadMonster::SquadAdd( CSquadMonster *pAdd )
 
 	for( int i = 0; i < MAX_SQUAD_MEMBERS - 1; i++ )
 	{
-		if( m_hSquadMember[i] == NULL )
+		if( m_hSquadMember[i] == 0 )
 		{
 			m_hSquadMember[i] = pAdd;
 			pAdd->m_hSquadLeader = this;
@@ -258,7 +258,7 @@ void CSquadMonster::SquadMakeEnemy( CBaseEntity *pEnemy )
 			// reset members who aren't activly engaged in fighting
 			if( pMember->m_hEnemy != pEnemy && !pMember->HasConditions( bits_COND_SEE_ENEMY ) )
 			{
-				if( pMember->m_hEnemy != NULL )
+				if( pMember->m_hEnemy != 0 )
 				{
 					// remember their current enemy
 					pMember->PushEnemy( pMember->m_hEnemy, pMember->m_vecEnemyLKP );
@@ -459,7 +459,7 @@ BOOL CSquadMonster::NoFriendlyFire( void )
 	Vector v_left;
 
 	//!!!BUGBUG - to fix this, the planes must be aligned to where the monster will be firing its gun, not the direction it is facing!!!
-	if( m_hEnemy != NULL )
+	if( m_hEnemy != 0 )
 	{
 		UTIL_MakeVectors( UTIL_VecToAngles( m_hEnemy->Center() - pev->origin ) );
 	}
@@ -508,9 +508,7 @@ BOOL CSquadMonster::NoFriendlyFire( void )
 //=========================================================
 MONSTERSTATE CSquadMonster::GetIdealState ( void )
 {
-	int iConditions;
-
-	iConditions = IScheduleFlags();
+	IScheduleFlags();
 
 	// If no schedule conditions, the new ideal state is probably the reason we're in here.
 	switch( m_MonsterState )
@@ -565,7 +563,7 @@ BOOL CSquadMonster::SquadEnemySplit( void )
 	for( int i = 0; i < MAX_SQUAD_MEMBERS; i++ )
 	{
 		CSquadMonster *pMember = pSquadLeader->MySquadMember( i );
-		if( pMember != NULL && pMember->m_hEnemy != NULL && pMember->m_hEnemy != pEnemy )
+		if( pMember != NULL && pMember->m_hEnemy != 0 && pMember->m_hEnemy != pEnemy )
 		{
 			return TRUE;
 		}
diff --git a/dlls/squadmonster.h b/dlls/squadmonster.h
index 320f36f0..4163867a 100644
--- a/dlls/squadmonster.h
+++ b/dlls/squadmonster.h
@@ -16,6 +16,9 @@
 // CSquadMonster - all the extra data for monsters that
 // form squads.
 //=========================================================
+#pragma once
+#ifndef SQUADMONSTER_H
+#define SQUADMONSTER_H
 
 #define	SF_SQUADMONSTER_LEADER	32
 
@@ -90,7 +93,7 @@ public:
 		else
 			return (CSquadMonster *)( (CBaseEntity *)m_hSquadMember[i] );
 	}
-	int InSquad( void ) { return m_hSquadLeader != NULL; }
+	int InSquad( void ) { return m_hSquadLeader != 0; }
 	int IsLeader( void ) { return m_hSquadLeader == this; }
 	int SquadJoin( int searchRadius );
 	int SquadRecruit( int searchRadius, int maxMembers );
@@ -118,3 +121,4 @@ public:
 	MONSTERSTATE GetIdealState( void );
 	Schedule_t *GetScheduleOfType( int iType );
 };
+#endif // SQUADMONSTER_H
diff --git a/dlls/squeakgrenade.cpp b/dlls/squeakgrenade.cpp
index b0afe709..92d2c318 100644
--- a/dlls/squeakgrenade.cpp
+++ b/dlls/squeakgrenade.cpp
@@ -94,7 +94,7 @@ int CSqueakGrenade::Classify( void )
 	if( m_iMyClass != 0 )
 		return m_iMyClass; // protect against recursion
 
-	if( m_hEnemy != NULL )
+	if( m_hEnemy != 0 )
 	{
 		m_iMyClass = CLASS_INSECT; // no one cares about it
 		switch( m_hEnemy->Classify() )
@@ -180,13 +180,13 @@ void CSqueakGrenade::Killed( entvars_t *pevAttacker, int iGib )
 
 	UTIL_BloodDrips( pev->origin, g_vecZero, BloodColor(), 80 );
 
-	if( m_hOwner != NULL )
+	if( m_hOwner != 0 )
 		RadiusDamage( pev, m_hOwner->pev, pev->dmg, CLASS_NONE, DMG_BLAST );
 	else
 		RadiusDamage( pev, pev, pev->dmg, CLASS_NONE, DMG_BLAST );
 
 	// reset owner so death message happens
-	if( m_hOwner != NULL )
+	if( m_hOwner != 0 )
 		pev->owner = m_hOwner->edict();
 
 	CBaseMonster::Killed( pevAttacker, GIB_ALWAYS );
@@ -230,7 +230,7 @@ void CSqueakGrenade::HuntThink( void )
 		pev->velocity = pev->velocity * 0.9;
 		pev->velocity.z += 8.0;
 	}
-	else if( ( pev->movetype = MOVETYPE_FLY ) )
+	else if( pev->movetype == MOVETYPE_FLY )
 	{
 		pev->movetype = MOVETYPE_BOUNCE;
 	}
@@ -241,7 +241,7 @@ void CSqueakGrenade::HuntThink( void )
 
 	m_flNextHunt = gpGlobals->time + 2.0;
 
-	CBaseEntity *pOther = NULL;
+	//CBaseEntity *pOther = NULL;
 	Vector vecDir;
 	TraceResult tr;
 
@@ -251,7 +251,7 @@ void CSqueakGrenade::HuntThink( void )
 
 	UTIL_MakeVectors( pev->angles );
 
-	if( m_hEnemy == NULL || !m_hEnemy->IsAlive() )
+	if( m_hEnemy == 0 || !m_hEnemy->IsAlive() )
 	{
 		// find target, bounce a bit towards it.
 		Look( 512 );
@@ -270,7 +270,7 @@ void CSqueakGrenade::HuntThink( void )
 	if( flpitch < 80 )
 		flpitch = 80;
 
-	if( m_hEnemy != NULL )
+	if( m_hEnemy != 0 )
 	{
 		if( FVisible( m_hEnemy ) )
 		{
@@ -350,9 +350,9 @@ void CSqueakGrenade::SuperBounceTouch( CBaseEntity *pOther )
 			if( tr.pHit->v.modelindex != pev->modelindex )
 			{
 				// ALERT( at_console, "hit enemy\n" );
-				ClearMultiDamage( );
+				ClearMultiDamage();
 				pOther->TraceAttack( pev, gSkillData.snarkDmgBite, gpGlobals->v_forward, &tr, DMG_SLASH ); 
-				if( m_hOwner != NULL )
+				if( m_hOwner != 0 )
 					ApplyMultiDamage( pev, m_hOwner->pev );
 				else
 					ApplyMultiDamage( pev, pev );
@@ -475,8 +475,7 @@ void CSqueak::Holster( int skiplocal /* = 0 */ )
 	if( !m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] )
 	{
 		m_pPlayer->pev->weapons &= ~( 1 << WEAPON_SNARK );
-		SetThink( &CBasePlayerItem::DestroyItem );
-		pev->nextthink = gpGlobals->time + 0.1;
+		DestroyItem();
 		return;
 	}
 
@@ -533,7 +532,7 @@ void CSqueak::PrimaryAttack()
 
 			m_fJustThrown = 1;
 
-			m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.3;
+			m_flNextPrimaryAttack = GetNextAttackDelay( 0.3 );
 			m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 1.0;
 		}
 	}
diff --git a/dlls/stats.cpp b/dlls/stats.cpp
index 9b21f792..1df298b2 100644
--- a/dlls/stats.cpp
+++ b/dlls/stats.cpp
@@ -48,7 +48,7 @@ float AmmoDamage( const char *pName )
 	return 0;
 }
 
-void UpdateStatsFile( float dataTime, char *pMapname, float health, float ammo, int skillLevel )
+void UpdateStatsFile( float dataTime, const char *pMapname, float health, float ammo, int skillLevel )
 {
 	FILE *fp;
 
@@ -136,7 +136,7 @@ void UpdateStats( CBasePlayer *pPlayer )
 	}
 	else if( ( gStats.nextOutputTime != 0 && gStats.nextOutputTime < gStats.gameTime ) || forceWrite )
 	{
-		UpdateStatsFile( gStats.dataTime, (char *)STRING( gpGlobals->mapname ), health, ammo, (int)CVAR_GET_FLOAT( "skill" ) );
+		UpdateStatsFile( gStats.dataTime, STRING( gpGlobals->mapname ), health, ammo, (int)CVAR_GET_FLOAT( "skill" ) );
 
 		gStats.lastAmmo = ammo;
 		gStats.lastHealth = health;
diff --git a/dlls/subs.cpp b/dlls/subs.cpp
index bc7baf18..2a299ce4 100644
--- a/dlls/subs.cpp
+++ b/dlls/subs.cpp
@@ -107,6 +107,13 @@ void CBaseEntity::UpdateOnRemove( void )
 
 	if( pev->globalname )
 		gGlobalState.EntitySetState( pev->globalname, GLOBAL_DEAD );
+
+	// tell owner ( if any ) that we're dead.This is mostly for MonsterMaker functionality.
+	//Killtarget didn't do this before, so the counter broke. - Solokiller
+	if( CBaseEntity* pOwner = pev->owner ? Instance( pev->owner ) : 0 )
+	{
+		pOwner->DeathNotice( pev );
+	}
 }
 
 // Convenient way to delay removing oneself
@@ -415,6 +422,14 @@ After moving, set origin to exact final destination, call "move done" function
 */
 void CBaseToggle::LinearMoveDone( void )
 {
+	Vector delta = m_vecFinalDest - pev->origin;
+	float error = delta.Length();
+	if( error > 0.03125 )
+	{
+		LinearMove( m_vecFinalDest, 100 );
+		return;
+	}
+
 	UTIL_SetOrigin( pev, m_vecFinalDest );
 	pev->velocity = g_vecZero;
 	pev->nextthink = -1;
diff --git a/dlls/talkmonster.cpp b/dlls/talkmonster.cpp
index a19a9582..ae2a7c95 100644
--- a/dlls/talkmonster.cpp
+++ b/dlls/talkmonster.cpp
@@ -52,7 +52,7 @@ TYPEDESCRIPTION	CTalkMonster::m_SaveData[] =
 IMPLEMENT_SAVERESTORE( CTalkMonster, CBaseMonster )
 
 // array of friend names
-char *CTalkMonster::m_szFriends[TLK_CFRIENDS] =
+const char *CTalkMonster::m_szFriends[TLK_CFRIENDS] =
 {
 	"monster_barney",
 	"monster_scientist",
@@ -392,7 +392,7 @@ void CTalkMonster::StartTask( Task_t *pTask )
 	case TASK_TLK_EYECONTACT:
 		break;
 	case TASK_TLK_IDEALYAW:
-		if( m_hTalkTarget != NULL )
+		if( m_hTalkTarget != 0 )
 		{
 			pev->yaw_speed = 60;
 			float yaw = VecToYaw( m_hTalkTarget->pev->origin - pev->origin ) - pev->angles.y;
@@ -404,11 +404,11 @@ void CTalkMonster::StartTask( Task_t *pTask )
 
 			if( yaw < 0 )
 			{
-				pev->ideal_yaw = min( yaw + 45, 0 ) + pev->angles.y;
+				pev->ideal_yaw = Q_min( yaw + 45, 0 ) + pev->angles.y;
 			}
 			else
 			{
-				pev->ideal_yaw = max( yaw - 45, 0 ) + pev->angles.y;
+				pev->ideal_yaw = Q_max( yaw - 45, 0 ) + pev->angles.y;
 			}
 		}
 		TaskComplete();
@@ -537,7 +537,7 @@ void CTalkMonster::RunTask( Task_t *pTask )
 		}
 		break;
 	case TASK_TLK_EYECONTACT:
-		if( !IsMoving() && IsTalking() && m_hTalkTarget != NULL )
+		if( !IsMoving() && IsTalking() && m_hTalkTarget != 0 )
 		{
 			// ALERT( at_console, "waiting %f\n", m_flStopTalkTime - gpGlobals->time );
 			IdleHeadTurn( m_hTalkTarget->pev->origin );
@@ -562,7 +562,7 @@ void CTalkMonster::RunTask( Task_t *pTask )
 		}
 		break;
 	case TASK_WAIT_FOR_MOVEMENT:
-		if( IsTalking() && m_hTalkTarget != NULL )
+		if( IsTalking() && m_hTalkTarget != 0 )
 		{
 			// ALERT( at_console, "walking, talking\n" );
 			IdleHeadTurn( m_hTalkTarget->pev->origin );
@@ -583,7 +583,7 @@ void CTalkMonster::RunTask( Task_t *pTask )
 			IdleHeadTurn( pev->origin );
 		break;
 	default:
-		if( IsTalking() && m_hTalkTarget != NULL )
+		if( IsTalking() && m_hTalkTarget != 0 )
 		{
 			IdleHeadTurn( m_hTalkTarget->pev->origin );
 		}
@@ -604,7 +604,7 @@ void CTalkMonster::Killed( entvars_t *pevAttacker, int iGib )
 		LimitFollowers( CBaseEntity::Instance( pevAttacker ), 0 );
 	}
 
-	m_hTargetEnt = NULL;
+	m_hTargetEnt = 0;
 	// Don't finish that sentence
 	StopTalking();
 	SetUse( NULL );
@@ -614,7 +614,7 @@ void CTalkMonster::Killed( entvars_t *pevAttacker, int iGib )
 CBaseEntity *CTalkMonster::EnumFriends( CBaseEntity *pPrevious, int listNumber, BOOL bTrace )
 {
 	CBaseEntity *pFriend = pPrevious;
-	char *pszFriend;
+	const char *pszFriend;
 	TraceResult tr;
 	Vector vecCheck;
 
@@ -717,7 +717,7 @@ void CTalkMonster::LimitFollowers( CBaseEntity *pPlayer, int maxFollowers )
 float CTalkMonster::TargetDistance( void )
 {
 	// If we lose the player, or he dies, return a really large distance
-	if( m_hTargetEnt == NULL || !m_hTargetEnt->IsAlive() )
+	if( m_hTargetEnt == 0 || !m_hTargetEnt->IsAlive() )
 		return 1e6;
 
 	return ( m_hTargetEnt->pev->origin - pev->origin ).Length();
@@ -769,7 +769,7 @@ CBaseEntity *CTalkMonster::FindNearestFriend( BOOL fPlayer )
 	Vector vecStart = pev->origin;
 	Vector vecCheck;
 	int i;
-	char *pszFriend;
+	const char *pszFriend;
 	int cfriends;
 
 	vecStart.z = pev->absmax.z;
@@ -860,7 +860,7 @@ void CTalkMonster::Touch( CBaseEntity *pOther )
 //=========================================================
 void CTalkMonster::IdleRespond( void )
 {
-	int pitch = GetVoicePitch();
+	//int pitch = GetVoicePitch();
 
 	// play response
 	PlaySentence( m_szGrp[TLK_ANSWER], RANDOM_FLOAT( 2.8, 3.2 ), VOL_NORM, ATTN_IDLE );
@@ -895,7 +895,7 @@ int CTalkMonster::FOkToSpeak( void )
 		return FALSE;
 
 	// don't talk if you're in combat
-	if( m_hEnemy != NULL && FVisible( m_hEnemy ) )
+	if( m_hEnemy != 0 && FVisible( m_hEnemy ) )
 		return FALSE;
 
 	return TRUE;
@@ -982,7 +982,7 @@ void CTalkMonster::IdleHeadTurn( Vector &vecFriend )
 int CTalkMonster::FIdleSpeak( void )
 { 
 	// try to start a conversation, or make statement
-	int pitch;
+	//int pitch;
 	const char *szIdleGroup;
 	const char *szQuestionGroup;
 	float duration;
@@ -1006,7 +1006,7 @@ int CTalkMonster::FIdleSpeak( void )
 		duration = RANDOM_FLOAT( 2.8, 3.2 );
 	}
 
-	pitch = GetVoicePitch();
+	//pitch = GetVoicePitch();
 
 	// player using this entity is alive and wounded?
 	CBaseEntity *pTarget = m_hTargetEnt;
@@ -1332,10 +1332,10 @@ void CTalkMonster::StopFollowing( BOOL clearSchedule )
 
 		if( m_movementGoal == MOVEGOAL_TARGETENT )
 			RouteClear(); // Stop him from walking toward the player
-		m_hTargetEnt = NULL;
+		m_hTargetEnt = 0;
 		if( clearSchedule )
 			ClearSchedule();
-		if( m_hEnemy != NULL )
+		if( m_hEnemy != 0 )
 			m_IdealMonsterState = MONSTERSTATE_COMBAT;
 	}
 }
@@ -1345,7 +1345,7 @@ void CTalkMonster::StartFollowing( CBaseEntity *pLeader )
 	if( m_pCine )
 		m_pCine->CancelScript();
 
-	if( m_hEnemy != NULL )
+	if( m_hEnemy != 0 )
 		m_IdealMonsterState = MONSTERSTATE_ALERT;
 
 	m_hTargetEnt = pLeader;
diff --git a/dlls/talkmonster.h b/dlls/talkmonster.h
index 1a0c5931..c39a19d2 100644
--- a/dlls/talkmonster.h
+++ b/dlls/talkmonster.h
@@ -12,6 +12,7 @@
 *   use or distribution of this code by or to any unlicensed person is illegal.
 *
 ****/
+#pragma once
 #ifndef TALKMONSTER_H
 #define TALKMONSTER_H
 
@@ -140,7 +141,7 @@ public:
 
 	// For following
 	BOOL			CanFollow( void );
-	BOOL			IsFollowing( void ) { return m_hTargetEnt != NULL && m_hTargetEnt->IsPlayer(); }
+	BOOL			IsFollowing( void ) { return m_hTargetEnt != 0 && m_hTargetEnt->IsPlayer(); }
 	void			StopFollowing( BOOL clearSchedule );
 	void			StartFollowing( CBaseEntity *pLeader );
 	virtual void	DeclineFollowing( void ) {}
@@ -156,7 +157,7 @@ public:
 	static	TYPEDESCRIPTION m_SaveData[];
 
 	
-	static char *m_szFriends[TLK_CFRIENDS];		// array of friend names
+	static const char *m_szFriends[TLK_CFRIENDS];		// array of friend names
 	static float g_talkWaitTime;
 	
 	int			m_bitsSaid;						// set bits for sentences we don't want repeated
@@ -164,8 +165,8 @@ public:
 	int			m_voicePitch;					// pitch of voice for this head
 	const char	*m_szGrp[TLK_CGROUPS];			// sentence group names
 	float		m_useTime;						// Don't allow +USE until this time
-	int			m_iszUse;						// Custom +USE sentence group (follow)
-	int			m_iszUnUse;						// Custom +USE sentence group (stop following)
+	string_t			m_iszUse;						// Custom +USE sentence group (follow)
+	string_t			m_iszUnUse;						// Custom +USE sentence group (stop following)
 
 	float		m_flLastSaidSmelled;// last time we talked about something that stinks
 	float		m_flStopTalkTime;// when in the future that I'll be done saying this sentence.
diff --git a/dlls/teamplay_gamerules.cpp b/dlls/teamplay_gamerules.cpp
index 614bd7bb..87b695e7 100644
--- a/dlls/teamplay_gamerules.cpp
+++ b/dlls/teamplay_gamerules.cpp
@@ -116,7 +116,7 @@ void CHalfLifeTeamplay::Think( void )
 				return;
 			}
 
-			remain = flFragLimit - team_scores[i];
+			remain = (int)( flFragLimit - team_scores[i] );
 			if( remain < bestfrags )
 			{
 				bestfrags = remain;
@@ -157,7 +157,7 @@ BOOL CHalfLifeTeamplay::ClientCommand( CBasePlayer *pPlayer, const char *pcmd )
 		if( CMD_ARGC() < 2 )
 			return TRUE;
 
-		int slot = atoi( CMD_ARGV( 1 ) );
+		//int slot = atoi( CMD_ARGV( 1 ) );
 
 		// select the item from the current menu
 		return TRUE;
@@ -241,7 +241,7 @@ void CHalfLifeTeamplay::InitHUD( CBasePlayer *pPlayer )
 
 	ChangePlayerTeam( pPlayer, pPlayer->m_szTeamName, FALSE, FALSE );
 	UTIL_SayText( text, pPlayer );
-	int clientIndex = pPlayer->entindex();
+	//int clientIndex = pPlayer->entindex();
 	RecountTeams();
 	// update this player with all the other players team info
 	// loop through all active players and send their team info to the new client
@@ -300,7 +300,7 @@ void CHalfLifeTeamplay::ChangePlayerTeam( CBasePlayer *pPlayer, const char *pTea
 
 	MESSAGE_BEGIN( MSG_ALL, gmsgScoreInfo );
 		WRITE_BYTE( clientIndex );
-		WRITE_SHORT( pPlayer->pev->frags );
+		WRITE_SHORT( (int)pPlayer->pev->frags );
 		WRITE_SHORT( pPlayer->m_iDeaths );
 		WRITE_SHORT( 0 );
 		WRITE_SHORT( g_pGameRules->GetTeamIndex( pPlayer->m_szTeamName ) + 1 );
@@ -607,7 +607,7 @@ void CHalfLifeTeamplay::RecountTeams( bool bResendInfo )
 
 			if( tm >= 0 )
 			{
-				team_scores[tm] += plr->pev->frags;
+				team_scores[tm] += (int)plr->pev->frags;
 			}
 
 			if( bResendInfo ) //Someone's info changed, let's send the team info again.
diff --git a/dlls/teamplay_gamerules.h b/dlls/teamplay_gamerules.h
index 06823ca6..12ed038f 100644
--- a/dlls/teamplay_gamerules.h
+++ b/dlls/teamplay_gamerules.h
@@ -15,6 +15,9 @@
 //
 // teamplay_gamerules.h
 //
+#pragma once
+#ifndef TEAMPLAY_GAMERULES_H
+#define TEAMPLAY_GAMERULES_H
 
 #define MAX_TEAMNAME_LENGTH		16
 #define MAX_TEAMS			32
@@ -55,3 +58,4 @@ private:
 	BOOL m_teamLimit;				// This means the server set only some teams as valid
 	char m_szTeamList[TEAMPLAY_TEAMLISTLENGTH];
 };
+#endif // TEAMPLAY_GAMERULES_H
diff --git a/dlls/tentacle.cpp b/dlls/tentacle.cpp
index 637b8946..44b8b45b 100644
--- a/dlls/tentacle.cpp
+++ b/dlls/tentacle.cpp
@@ -486,12 +486,12 @@ void CTentacle::Cycle( void )
 			m_flSoundYaw += 360;
 		if( m_flSoundYaw > 180 )
 			m_flSoundYaw -= 360;
-
+#if 0
 		// ALERT( at_console, "sound %d %.0f\n", m_iSoundLevel, m_flSoundYaw );
 		if( m_flSoundTime < gpGlobals->time )
 		{
 			// play "I hear new something" sound
-			char *sound;
+			const char *sound;
 
 			switch( RANDOM_LONG( 0, 1 ) )
 			{
@@ -505,6 +505,7 @@ void CTentacle::Cycle( void )
 
 			// UTIL_EmitAmbientSound( ENT( pev ), pev->origin + Vector( 0, 0, MyHeight() ), sound, 1.0, ATTN_NORM, 0, 100 );
 		}
+#endif
 		m_flSoundTime = gpGlobals->time + RANDOM_FLOAT( 5.0, 10.0 );
 	}
 
@@ -591,7 +592,7 @@ void CTentacle::Cycle( void )
 				if( m_flNextSong < gpGlobals->time )
 				{
 					// play "I hear new something" sound
-					char *sound;	
+					const char *sound;	
 
 					switch( RANDOM_LONG( 0, 1 ) )
 					{
@@ -791,7 +792,7 @@ void CTentacle::DieThink( void )
 
 void CTentacle::HandleAnimEvent( MonsterEvent_t *pEvent )
 {
-	char *sound;
+	const char *sound;
 
 	switch( pEvent->event )
 	{
diff --git a/dlls/trains.h b/dlls/trains.h
index a9ef0fe8..d481d37f 100644
--- a/dlls/trains.h
+++ b/dlls/trains.h
@@ -12,6 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
+#pragma once
 #ifndef TRAINS_H
 #define TRAINS_H
 
diff --git a/dlls/triggers.cpp b/dlls/triggers.cpp
index d7f9483c..6d8fef04 100644
--- a/dlls/triggers.cpp
+++ b/dlls/triggers.cpp
@@ -114,7 +114,7 @@ public:
 	static TYPEDESCRIPTION m_SaveData[];
 
 private:
-	int m_globalstate;
+	string_t m_globalstate;
 	USE_TYPE triggerType;
 };
 
@@ -267,10 +267,10 @@ public:
 
 	static TYPEDESCRIPTION m_SaveData[];
 
-	int m_cTargets;	// the total number of targets in this manager's fire list.
+	int m_cTargets; // the total number of targets in this manager's fire list.
 	int m_index;	// Current target
 	float m_startTime;// Time we started firing
-	int m_iTargetName[MAX_MULTI_TARGETS];// list if indexes into global string array
+	string_t m_iTargetName[MAX_MULTI_TARGETS];// list if indexes into global string array
 	float m_flTargetDelay[MAX_MULTI_TARGETS];// delay (in seconds) from time of manager fire to target fire
 private:
 	inline BOOL IsClone( void ) { return ( pev->spawnflags & SF_MULTIMAN_CLONE ) ? TRUE : FALSE; }
@@ -527,7 +527,7 @@ void CBaseTrigger::InitTrigger()
 		SetMovedir( pev );
 	pev->solid = SOLID_TRIGGER;
 	pev->movetype = MOVETYPE_NONE;
-	SET_MODEL(ENT(pev), STRING( pev->model ) );    // set size and link into world
+	SET_MODEL( ENT( pev ), STRING( pev->model ) );    // set size and link into world
 	if( CVAR_GET_FLOAT( "showtriggers" ) == 0 )
 		SetBits( pev->effects, EF_NODRAW );
 }
@@ -688,7 +688,7 @@ void PlayCDTrack( int iTrack )
 
 	if( iTrack == -1 )
 	{
-		CLIENT_COMMAND( pClient, "cd pause\n" );
+		CLIENT_COMMAND( pClient, "cd stop\n" );
 	}
 	else
 	{
@@ -1135,7 +1135,7 @@ void CBaseTrigger::ActivateMultiTrigger( CBaseEntity *pActivator )
 	}
 
 	if( !FStringNull( pev->noise ) )
-		EMIT_SOUND( ENT( pev ), CHAN_VOICE, (char*)STRING( pev->noise ), 1, ATTN_NORM );
+		EMIT_SOUND( ENT( pev ), CHAN_VOICE, STRING( pev->noise ), 1, ATTN_NORM );
 
 	// don't trigger again until reset
 	// pev->takedamage = DAMAGE_NO;
@@ -1264,8 +1264,8 @@ void CTriggerVolume::Spawn( void )
 {
 	pev->solid = SOLID_NOT;
 	pev->movetype = MOVETYPE_NONE;
-	SET_MODEL( ENT(pev), STRING( pev->model ) );    // set size and link into world
-	pev->model = NULL;
+	SET_MODEL( ENT( pev ), STRING( pev->model ) );    // set size and link into world
+	pev->model = 0;
 	pev->modelindex = 0;
 }
 
@@ -1323,7 +1323,7 @@ public:
 
 	char m_szMapName[cchMapNameMost];		// trigger_changelevel only:  next map
 	char m_szLandmarkName[cchMapNameMost];		// trigger_changelevel only:  landmark on next map
-	int m_changeTarget;
+	string_t m_changeTarget;
 	float m_changeTargetDelay;
 };
 
@@ -1338,7 +1338,7 @@ TYPEDESCRIPTION	CChangeLevel::m_SaveData[] =
 	DEFINE_FIELD( CChangeLevel, m_changeTargetDelay, FIELD_FLOAT ),
 };
 
-IMPLEMENT_SAVERESTORE(CChangeLevel,CBaseTrigger)
+IMPLEMENT_SAVERESTORE( CChangeLevel, CBaseTrigger )
 
 //
 // Cache user-entity-field values until spawn is called.
@@ -1438,7 +1438,7 @@ void CChangeLevel::UseChangeLevel( CBaseEntity *pActivator, CBaseEntity *pCaller
 void CChangeLevel::ChangeLevelNow( CBaseEntity *pActivator )
 {
 	edict_t	*pentLandmark;
-	LEVELLIST levels[16];
+	//LEVELLIST levels[16];
 
 	ASSERT( !FStrEq( m_szMapName, "" ) );
 
@@ -1689,7 +1689,7 @@ void NextLevel( void )
 	// go back to start if no trigger_changelevel
 	if( FNullEnt( pent ) )
 	{
-		gpGlobals->mapname = ALLOC_STRING( "start" );
+		gpGlobals->mapname = MAKE_STRING( "start" );
 		pChange = GetClassPtr( (CChangeLevel *)NULL );
 		strcpy( pChange->m_szMapName, "start" );
 	}
@@ -2054,7 +2054,7 @@ public:
 	static TYPEDESCRIPTION m_SaveData[];
 
 private:
-	int m_iszNewTarget;
+	string_t m_iszNewTarget;
 };
 
 LINK_ENTITY_TO_CLASS( trigger_changetarget, CTriggerChangeTarget )
@@ -2117,7 +2117,7 @@ public:
 	EHANDLE m_hPlayer;
 	EHANDLE m_hTarget;
 	CBaseEntity *m_pentPath;
-	int m_sPath;
+	string_t m_sPath;
 	float m_flWait;
 	float m_flReturnTime;
 	float m_flStopTime;
@@ -2224,7 +2224,7 @@ void CTriggerCamera::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYP
 	}
 
 	// Nothing to look at!
-	if( m_hTarget == NULL )
+	if( m_hTarget == 0 )
 	{
 		return;
 	}
@@ -2280,10 +2280,10 @@ void CTriggerCamera::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYP
 
 void CTriggerCamera::FollowTarget()
 {
-	if( m_hPlayer == NULL )
+	if( m_hPlayer == 0 )
 		return;
 
-	if( m_hTarget == NULL || m_flReturnTime < gpGlobals->time )
+	if( m_hTarget == 0 || m_flReturnTime < gpGlobals->time )
 	{
 		if( m_hPlayer->IsAlive() )
 		{
diff --git a/dlls/tripmine.cpp b/dlls/tripmine.cpp
index f04d906a..94907bcd 100644
--- a/dlls/tripmine.cpp
+++ b/dlls/tripmine.cpp
@@ -43,6 +43,7 @@ class CTripmineGrenade : public CGrenade
 {
 	void Spawn( void );
 	void Precache( void );
+	void UpdateOnRemove();
 
 	virtual int Save( CSave &save );
 	virtual int Restore( CRestore &restore );
@@ -148,6 +149,13 @@ void CTripmineGrenade::Precache( void )
 	PRECACHE_SOUND( "weapons/mine_charge.wav" );
 }
 
+void CTripmineGrenade::UpdateOnRemove()
+{
+	CBaseEntity::UpdateOnRemove();
+
+	KillBeam();
+}
+
 void CTripmineGrenade::WarningThink( void )
 {
 	// play warning sound
@@ -162,7 +170,7 @@ void CTripmineGrenade::PowerupThink( void )
 {
 	TraceResult tr;
 
-	if( m_hOwner == NULL )
+	if( m_hOwner == 0 )
 	{
 		// find an owner
 		edict_t *oldowner = pev->owner;
@@ -217,7 +225,7 @@ void CTripmineGrenade::PowerupThink( void )
 		MakeBeam();
 
 		// play enabled sound
-		EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "weapons/mine_activate.wav", 0.5, ATTN_NORM, 1.0, 75 );
+		EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "weapons/mine_activate.wav", 0.5, ATTN_NORM, 1, 75 );
 	}
 	pev->nextthink = gpGlobals->time + 0.1;
 }
@@ -280,7 +288,7 @@ void CTripmineGrenade::BeamBreakThink( void )
 	}
 	else
 	{
-		if( m_hOwner == NULL )
+		if( m_hOwner == 0 )
 			bBlowup = 1;
 		else if( m_posOwner != m_hOwner->pev->origin )
 			bBlowup = 1;
@@ -410,8 +418,7 @@ void CTripmine::Holster( int skiplocal /* = 0 */ )
 	{
 		// out of mines
 		m_pPlayer->pev->weapons &= ~( 1 << WEAPON_TRIPMINE );
-		SetThink( &CBasePlayerItem::DestroyItem );
-		pev->nextthink = gpGlobals->time + 0.1;
+		DestroyItem();
 	}
 
 	SendWeaponAnim( TRIPMINE_HOLSTER );
@@ -446,7 +453,7 @@ void CTripmine::PrimaryAttack( void )
 		{
 			Vector angles = UTIL_VecToAngles( tr.vecPlaneNormal );
 
-			CBaseEntity *pEnt = CBaseEntity::Create( "monster_tripmine", tr.vecEndPos + tr.vecPlaneNormal * 8, angles, m_pPlayer->edict() );
+			CBaseEntity::Create( "monster_tripmine", tr.vecEndPos + tr.vecPlaneNormal * 8, angles, m_pPlayer->edict() );
 
 			m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]--;
 
@@ -470,7 +477,7 @@ void CTripmine::PrimaryAttack( void )
 
 	}*/
 
-	m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.3;
+	m_flNextPrimaryAttack = GetNextAttackDelay( 0.3 );
 	m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 );
 }
 
diff --git a/dlls/turret.cpp b/dlls/turret.cpp
index 2dce87fb..093b2032 100644
--- a/dlls/turret.cpp
+++ b/dlls/turret.cpp
@@ -56,6 +56,7 @@ class CBaseTurret : public CBaseMonster
 public:
 	void Spawn( void );
 	virtual void Precache( void );
+	void UpdateOnRemove();
 	void KeyValue( KeyValueData *pkvd );
 	void EXPORT TurretUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
 
@@ -279,6 +280,17 @@ void CBaseTurret::Precache()
 	PRECACHE_SOUND( "turret/tu_alert.wav" );
 }
 
+void CBaseTurret::UpdateOnRemove()
+{
+	CBaseEntity::UpdateOnRemove();
+
+	if( m_pEyeGlow )
+	{
+		UTIL_Remove( m_pEyeGlow );
+		m_pEyeGlow = 0;
+	}
+}
+
 #define TURRET_GLOW_SPRITE "sprites/flare3.spr"
 
 void CTurret::Spawn()
@@ -442,7 +454,7 @@ void CBaseTurret::EyeOff()
 	{
 		if( m_eyeBrightness > 0 )
 		{
-			m_eyeBrightness = max( 0, m_eyeBrightness - 30 );
+			m_eyeBrightness = Q_max( 0, m_eyeBrightness - 30 );
 			m_pEyeGlow->SetBrightness( m_eyeBrightness );
 		}
 	}
@@ -456,7 +468,7 @@ void CBaseTurret::ActiveThink( void )
 	pev->nextthink = gpGlobals->time + 0.1;
 	StudioFrameAdvance();
 
-	if( ( !m_iOn ) || ( m_hEnemy == NULL ) )
+	if( ( !m_iOn ) || ( m_hEnemy == 0 ) )
 	{
 		m_hEnemy = NULL;
 		m_flLastSight = gpGlobals->time + m_flMaxWait;
@@ -826,21 +838,21 @@ void CBaseTurret::SearchThink( void )
 	Ping();
 
 	// If we have a target and we're still healthy
-	if( m_hEnemy != NULL )
+	if( m_hEnemy != 0 )
 	{
 		if( !m_hEnemy->IsAlive() )
 			m_hEnemy = NULL;// Dead enemy forces a search for new one
 	}
 
 	// Acquire Target
-	if( m_hEnemy == NULL )
+	if( m_hEnemy == 0 )
 	{
 		Look( TURRET_RANGE );
 		m_hEnemy = BestVisibleEnemy();
 	}
 
 	// If we've found a target, spin up the barrel and start to attack
-	if( m_hEnemy != NULL )
+	if( m_hEnemy != 0 )
 	{
 		m_flLastSight = 0;
 		m_flSpinUpTime = 0;
@@ -881,20 +893,20 @@ void CBaseTurret::AutoSearchThink( void )
 	pev->nextthink = gpGlobals->time + 0.3;
 
 	// If we have a target and we're still healthy
-	if( m_hEnemy != NULL )
+	if( m_hEnemy != 0 )
 	{
 		if( !m_hEnemy->IsAlive() )
 			m_hEnemy = NULL;// Dead enemy forces a search for new one
 	}
 
 	// Acquire Target
-	if( m_hEnemy == NULL )
+	if( m_hEnemy == 0 )
 	{
 		Look( TURRET_RANGE );
 		m_hEnemy = BestVisibleEnemy();
 	}
 
-	if( m_hEnemy != NULL )
+	if( m_hEnemy != 0 )
 	{
 		SetThink( &CBaseTurret::Deploy );
 		EMIT_SOUND( ENT( pev ), CHAN_BODY, "turret/tu_alert.wav", TURRET_MACHINE_VOLUME, ATTN_NORM );
@@ -903,7 +915,7 @@ void CBaseTurret::AutoSearchThink( void )
 
 void CBaseTurret::TurretDeath( void )
 {
-	BOOL iActive = FALSE;
+	//BOOL iActive = FALSE;
 
 	StudioFrameAdvance();
 	pev->nextthink = gpGlobals->time + 0.1;
@@ -1222,7 +1234,7 @@ void CSentry::SentryTouch( CBaseEntity *pOther )
 
 void CSentry::SentryDeath( void )
 {
-	BOOL iActive = FALSE;
+	//BOOL iActive = FALSE;
 
 	StudioFrameAdvance();
 	pev->nextthink = gpGlobals->time + 0.1;
diff --git a/dlls/util.cpp b/dlls/util.cpp
index d1fceb0a..94c8c68c 100644
--- a/dlls/util.cpp
+++ b/dlls/util.cpp
@@ -118,7 +118,7 @@ float UTIL_SharedRandomFloat( unsigned int seed, float low, float high )
 	U_Random();
 	U_Random();
 
-	range = high - low;
+	range = (int)( high - low );
 	if( !range )
 	{
 		return low;
@@ -625,7 +625,7 @@ static unsigned short FixedUnsigned16( float value, float scale )
 {
 	int output;
 
-	output = value * scale;
+	output = (int)( value * scale );
 	if( output < 0 )
 		output = 0;
 	if( output > 0xFFFF )
@@ -638,7 +638,7 @@ static short FixedSigned16( float value, float scale )
 {
 	int output;
 
-	output = value * scale;
+	output = (int)( value * scale );
 
 	if( output > 32767 )
 		output = 32767;
@@ -937,10 +937,10 @@ TraceResult UTIL_GetGlobalTrace( )
 {
 	TraceResult tr;
 
-	tr.fAllSolid		= gpGlobals->trace_allsolid;
-	tr.fStartSolid		= gpGlobals->trace_startsolid;
-	tr.fInOpen		= gpGlobals->trace_inopen;
-	tr.fInWater		= gpGlobals->trace_inwater;
+	tr.fAllSolid		= (int)gpGlobals->trace_allsolid;
+	tr.fStartSolid		= (int)gpGlobals->trace_startsolid;
+	tr.fInOpen		= (int)gpGlobals->trace_inopen;
+	tr.fInWater		= (int)gpGlobals->trace_inwater;
 	tr.flFraction		= gpGlobals->trace_fraction;
 	tr.flPlaneDist		= gpGlobals->trace_plane_dist;
 	tr.pHit			= gpGlobals->trace_ent;
@@ -1033,7 +1033,7 @@ float UTIL_SplineFraction( float value, float scale )
 	return 3 * valueSquared - 2 * valueSquared * value;
 }
 
-char *UTIL_VarArgs( char *format, ... )
+char *UTIL_VarArgs( const char *format, ... )
 {
 	va_list	argptr;
 	static char string[1024];
@@ -1052,7 +1052,7 @@ Vector UTIL_GetAimVector( edict_t *pent, float flSpeed )
 	return tmp;
 }
 
-int UTIL_IsMasterTriggered(string_t sMaster, CBaseEntity *pActivator)
+int UTIL_IsMasterTriggered( string_t sMaster, CBaseEntity *pActivator )
 {
 	if( sMaster )
 	{
@@ -1112,7 +1112,7 @@ void UTIL_BloodStream( const Vector &origin, const Vector &direction, int color,
 		WRITE_COORD( direction.y );
 		WRITE_COORD( direction.z );
 		WRITE_BYTE( color );
-		WRITE_BYTE( min( amount, 255 ) );
+		WRITE_BYTE( Q_min( amount, 255 ) );
 	MESSAGE_END();
 }				
 
@@ -1144,7 +1144,7 @@ void UTIL_BloodDrips( const Vector &origin, const Vector &direction, int color,
 		WRITE_SHORT( g_sModelIndexBloodSpray );				// initial sprite model
 		WRITE_SHORT( g_sModelIndexBloodDrop );				// droplet sprite models
 		WRITE_BYTE( color );								// color index into host_basepal
-		WRITE_BYTE( min( max( 3, amount / 10 ), 16 ) );		// size
+		WRITE_BYTE( Q_min( Q_max( 3, amount / 10 ), 16 ) );		// size
 	MESSAGE_END();
 }				
 
@@ -1340,7 +1340,7 @@ void UTIL_StringToVector( float *pVector, const char *pString )
 
 		while( *pstr && *pstr != ' ' )
 			pstr++;
-		if( !(*pstr) )
+		if( !( *pstr ) )
 			break;
 		pstr++;
 		pfront = pstr;
@@ -1536,7 +1536,7 @@ void UTIL_PrecacheOther( const char *szClassname )
 // UTIL_LogPrintf - Prints a logged message to console.
 // Preceded by LOG: ( timestamp ) < message >
 //=========================================================
-void UTIL_LogPrintf( char *fmt, ... )
+void UTIL_LogPrintf( const char *fmt, ... )
 {
 	va_list		argptr;
 	static char	string[1024];
@@ -1586,7 +1586,34 @@ void UTIL_StripToken( const char *pKey, char *pDest )
 static int gSizes[FIELD_TYPECOUNT] =
 {
 	sizeof(float),		// FIELD_FLOAT
-	sizeof(int),		// FIELD_STRING
+	sizeof(string_t),		// FIELD_STRING
+	sizeof(void*),		// FIELD_ENTITY
+	sizeof(void*),		// FIELD_CLASSPTR
+	sizeof(void*),		// FIELD_EHANDLE
+	sizeof(void*),		// FIELD_entvars_t
+	sizeof(void*),		// FIELD_EDICT
+	sizeof(float) * 3,	// FIELD_VECTOR
+	sizeof(float) * 3,	// FIELD_POSITION_VECTOR
+	sizeof(void *),		// FIELD_POINTER
+	sizeof(int),		// FIELD_INTEGER
+#ifdef GNUC
+	sizeof(void *) * 2,	// FIELD_FUNCTION
+#else
+	sizeof(void *),		// FIELD_FUNCTION	
+#endif
+	sizeof(int),		// FIELD_BOOLEAN
+	sizeof(short),		// FIELD_SHORT
+	sizeof(char),		// FIELD_CHARACTER
+	sizeof(float),		// FIELD_TIME
+	sizeof(int),		// FIELD_MODELNAME
+	sizeof(int),		// FIELD_SOUNDNAME
+};
+
+// entities has different store size
+static int gInputSizes[FIELD_TYPECOUNT] =
+{
+	sizeof(float),		// FIELD_FLOAT
+	sizeof(string_t),		// FIELD_STRING
 	sizeof(int),		// FIELD_ENTITY
 	sizeof(int),		// FIELD_CLASSPTR
 	sizeof(int),		// FIELD_EHANDLE
@@ -1594,12 +1621,12 @@ static int gSizes[FIELD_TYPECOUNT] =
 	sizeof(int),		// FIELD_EDICT
 	sizeof(float) * 3,	// FIELD_VECTOR
 	sizeof(float) * 3,	// FIELD_POSITION_VECTOR
-	sizeof(int *),		// FIELD_POINTER
+	sizeof(void *),		// FIELD_POINTER
 	sizeof(int),		// FIELD_INTEGER
 #ifdef GNUC
-	sizeof(int *) * 2,	// FIELD_FUNCTION
+	sizeof(void *) * 2,	// FIELD_FUNCTION
 #else
-	sizeof(int *),		// FIELD_FUNCTION	
+	sizeof(void *),		// FIELD_FUNCTION
 #endif
 	sizeof(int),		// FIELD_BOOLEAN
 	sizeof(short),		// FIELD_SHORT
@@ -1831,7 +1858,7 @@ void CSave::WriteString( const char *pname, const int *stringId, int count )
 #if 0
 	if( count != 1 )
 		ALERT( at_error, "No string arrays!\n" );
-	WriteString( pname, (char *)STRING( *stringId ) );
+	WriteString( pname, STRING( *stringId ) );
 #endif
 	size = 0;
 	for( i = 0; i < count; i++ )
@@ -1886,7 +1913,7 @@ void CSave::WritePositionVector( const char *pname, const float *value, int coun
 	}
 }
 
-void CSave::WriteFunction( const char *pname, const int *data, int count )
+void CSave::WriteFunction( const char *pname, void **data, int count )
 {
 	const char *functionName;
 
@@ -1894,7 +1921,7 @@ void CSave::WriteFunction( const char *pname, const int *data, int count )
 	if( functionName )
 		BufferField( pname, strlen( functionName ) + 1, functionName );
 	else
-		ALERT( at_error, "Invalid function pointer in entity!" );
+		ALERT( at_error, "Invalid function pointer in entity!\n" );
 }
 
 void EntvarsKeyvalue( entvars_t *pev, KeyValueData *pkvd )
@@ -1902,7 +1929,7 @@ void EntvarsKeyvalue( entvars_t *pev, KeyValueData *pkvd )
 	int i;
 	TYPEDESCRIPTION *pField;
 
-	for( i = 0; i < ENTVARS_COUNT; i++ )
+	for( i = 0; i < (int)ENTVARS_COUNT; i++ )
 	{
 		pField = &gEntvarsDescription[i];
 
@@ -1913,7 +1940,7 @@ void EntvarsKeyvalue( entvars_t *pev, KeyValueData *pkvd )
 			case FIELD_MODELNAME:
 			case FIELD_SOUNDNAME:
 			case FIELD_STRING:
-				( *(int *)( (char *)pev + pField->fieldOffset ) ) = ALLOC_STRING( pkvd->szValue );
+				( *(string_t *)( (char *)pev + pField->fieldOffset ) ) = ALLOC_STRING( pkvd->szValue );
 				break;
 			case FIELD_TIME:
 			case FIELD_FLOAT:
@@ -1987,7 +2014,7 @@ int CSave::WriteFields( const char *pname, void *pBaseData, TYPEDESCRIPTION *pFi
 		case FIELD_MODELNAME:
 		case FIELD_SOUNDNAME:
 		case FIELD_STRING:
-			WriteString( pTest->fieldName, (int *)pOutputData, pTest->fieldSize );
+			WriteString( pTest->fieldName, (string_t *)pOutputData, pTest->fieldSize );
 			break;
 		case FIELD_CLASSPTR:
 		case FIELD_EVARS:
@@ -2042,7 +2069,7 @@ int CSave::WriteFields( const char *pname, void *pBaseData, TYPEDESCRIPTION *pFi
 			WriteInt( pTest->fieldName, (int *)(char *)pOutputData, pTest->fieldSize );
 			break;
 		case FIELD_FUNCTION:
-			WriteFunction( pTest->fieldName, (int *)pOutputData, pTest->fieldSize );
+			WriteFunction( pTest->fieldName, (void **)pOutputData, pTest->fieldSize );
 			break;
 		default:
 			ALERT( at_error, "Bad field type\n" );
@@ -2137,7 +2164,7 @@ int CRestore::ReadField( void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCou
 				for( j = 0; j < pTest->fieldSize; j++ )
 				{
 					void *pOutputData = ( (char *)pBaseData + pTest->fieldOffset + ( j * gSizes[pTest->fieldType] ) );
-					void *pInputData = (char *)pData + j * gSizes[pTest->fieldType];
+					void *pInputData = (char *)pData + j * gInputSizes[pTest->fieldType];
 
 					switch( pTest->fieldType )
 					{
@@ -2170,21 +2197,21 @@ int CRestore::ReadField( void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCou
 						}
 						pInputData = pString;
 						if( strlen( (char *)pInputData ) == 0 )
-							*( (int *)pOutputData ) = 0;
+							*( (string_t *)pOutputData ) = 0;
 						else
 						{
-							int string;
+							string_t string;
 
 							string = ALLOC_STRING( (char *)pInputData );
 
-							*( (int *)pOutputData ) = string;
+							*( (string_t *)pOutputData ) = string;
 
 							if( !FStringNull( string ) && m_precache )
 							{
 								if( pTest->fieldType == FIELD_MODELNAME )
-									PRECACHE_MODEL( (char *)STRING( string ) );
+									PRECACHE_MODEL( STRING( string ) );
 								else if( pTest->fieldType == FIELD_SOUNDNAME )
-									PRECACHE_SOUND( (char *)STRING( string ) );
+									PRECACHE_SOUND( STRING( string ) );
 							}
 						}
 						break;
@@ -2267,7 +2294,7 @@ int CRestore::ReadField( void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCou
 						if( strlen( (char *)pInputData ) == 0 )
 							*( (void**)pOutputData ) = 0;
 						else
-							*( (void**)pOutputData ) = (void**)FUNCTION_FROM_NAME( (char *)pInputData );
+							*( (void**)pOutputData ) = (void*)FUNCTION_FROM_NAME( (char *)pInputData );
 						break;
 					default:
 						ALERT( at_error, "Bad field type\n" );
diff --git a/dlls/util.h b/dlls/util.h
index e8aee878..7f9dea70 100644
--- a/dlls/util.h
+++ b/dlls/util.h
@@ -12,6 +12,9 @@
 *   without written permission from Valve LLC.
 *
 ****/
+#pragma once
+#ifndef UTIL_H
+#define UTIL_H
 //
 // Misc utility code
 //
@@ -36,10 +39,17 @@ extern globalvars_t				*gpGlobals;
 // Use this instead of ALLOC_STRING on constant strings
 #define STRING(offset)		(const char *)(gpGlobals->pStringBase + (int)offset)
 
-#if !defined __amd64__ || defined(CLIENT_DLL)
-#define MAKE_STRING(str)	((int)(size_t)str - (int)(size_t)STRING(0))
+#if !defined XASH_64BIT || defined(CLIENT_DLL)
+#define MAKE_STRING(str)	((int)str - (int)STRING(0))
 #else
-#define MAKE_STRING ALLOC_STRING
+static inline int MAKE_STRING(const char *szValue)
+{
+	long long ptrdiff = szValue - STRING(0);
+	if( ptrdiff > INT_MAX || ptrdiff < INT_MIN )
+		return ALLOC_STRING( szValue );
+	else
+		return (int)ptrdiff;
+}
 #endif
 
 inline edict_t *FIND_ENTITY_BY_CLASSNAME(edict_t *entStart, const char *pszName) 
@@ -87,8 +97,9 @@ typedef int EOFFSET;
 typedef int BOOL;
 
 // In case this ever changes
+#ifndef M_PI
 #define M_PI			3.14159265358979323846
-
+#endif
 // Keeps clutter down a bit, when declaring external entity/global method prototypes
 #define DECLARE_GLOBAL_METHOD(MethodName)  extern void DLLEXPORT MethodName( void )
 #define GLOBAL_METHOD(funcname)					void DLLEXPORT funcname(void)
@@ -304,7 +315,7 @@ extern float		UTIL_Approach( float target, float value, float speed );
 extern float		UTIL_ApproachAngle( float target, float value, float speed );
 extern float		UTIL_AngleDistance( float next, float cur );
 
-extern char			*UTIL_VarArgs( char *format, ... );
+extern char			*UTIL_VarArgs( const char *format, ... );
 extern void			UTIL_Remove( CBaseEntity *pEntity );
 extern BOOL			UTIL_IsValidEntity( edict_t *pent );
 extern BOOL			UTIL_TeamsMatch( const char *pTeamName1, const char *pTeamName2 );
@@ -364,7 +375,7 @@ extern char *UTIL_dtos3( int d );
 extern char *UTIL_dtos4( int d );
 
 // Writes message to console with timestamp and FragLog header.
-extern void			UTIL_LogPrintf( char *fmt, ... );
+extern void			UTIL_LogPrintf( const char *fmt, ... );
 
 // Sorta like FInViewCone, but for nonmonsters. 
 extern float UTIL_DotPoints ( const Vector &vecSrc, const Vector &vecCheck, const Vector &vecDir );
@@ -534,7 +545,7 @@ void EMIT_GROUPID_SUIT(edict_t *entity, int isentenceg);
 void EMIT_GROUPNAME_SUIT(edict_t *entity, const char *groupname);
 
 #define PRECACHE_SOUND_ARRAY( a ) \
-	{ for (int i = 0; i < ARRAYSIZE( a ); i++ ) PRECACHE_SOUND((char *) a [i]); }
+	{ for (int i = 0; i < (int)ARRAYSIZE( a ); i++ ) PRECACHE_SOUND( a[i] ); }
 
 #define EMIT_SOUND_ARRAY_DYN( chan, array ) \
 	EMIT_SOUND_DYN ( ENT(pev), chan , array [ RANDOM_LONG(0,ARRAYSIZE( array )-1) ], 1.0, ATTN_NORM, 0, RANDOM_LONG(95,105) ); 
@@ -567,3 +578,4 @@ int UTIL_SharedRandomLong( unsigned int seed, int low, int high );
 float UTIL_SharedRandomFloat( unsigned int seed, float low, float high );
 
 float UTIL_WeaponTimeBase( void );
+#endif // UTIL_H
diff --git a/dlls/vector.h b/dlls/vector.h
index d3347983..48c707b4 100644
--- a/dlls/vector.h
+++ b/dlls/vector.h
@@ -12,6 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
+#pragma once
 #ifndef VECTOR_H
 #define VECTOR_H
 
@@ -22,8 +23,8 @@
 class Vector2D
 {
 public:
-	inline Vector2D(void)									{ }
-	inline Vector2D(float X, float Y)						{ x = X; y = Y; }
+	inline Vector2D(void): x( 0.0f ), y( 0.0f )						{ }
+	inline Vector2D(float X, float Y): x( 0.0f ), y( 0.0f )				{ x = X; y = Y; }
 	inline Vector2D operator+(const Vector2D& v)	const	{ return Vector2D( x + v.x, y + v.y );	}
 	inline Vector2D operator-(const Vector2D& v)	const	{ return Vector2D( x - v.x, y - v.y );	}
 	inline Vector2D operator*(float fl)		const	{ return Vector2D( x * fl, y * fl );	}
@@ -33,7 +34,7 @@ public:
 
 	inline Vector2D Normalize ( void ) const
 	{
-		Vector2D vec2;
+		//Vector2D vec2;
 
 		float flLen = Length();
 		if( flLen == 0 )
@@ -60,12 +61,12 @@ class Vector						// same data-layout as engine's vec3_t,
 {								//		which is a vec_t[3]
 public:
 	// Construction/destruction
-	inline Vector( void )								{ }
-	inline Vector( float X, float Y, float Z )		{ x = X; y = Y; z = Z;				}
+	inline Vector( void ): x( 0.0f ), y( 0.0f ), z( 0.0f )								{ }
+	inline Vector( float X, float Y, float Z ): x( 0.0f ), y( 0.0f ), z( 0.0f )	{ x = X; y = Y; z = Z;				}
 	//inline Vector( double X, double Y, double Z )		{ x = (float)X; y = (float)Y; z = (float)Z;	}
 	//inline Vector( int X, int Y, int Z )			{ x = (float)X; y = (float)Y; z = (float)Z;	}
-	inline Vector( const Vector& v )			{ x = v.x; y = v.y; z = v.z;			} 
-	inline Vector( float rgfl[3] )				{ x = rgfl[0]; y = rgfl[1]; z = rgfl[2];	}
+	inline Vector( const Vector& v ): x( 0.0f ), y( 0.0f ), z( 0.0f )	{ x = v.x; y = v.y; z = v.z;			} 
+	inline Vector( float rgfl[3] ): x( 0.0f ), y( 0.0f ), z( 0.0f )	{ x = rgfl[0]; y = rgfl[1]; z = rgfl[2];	}
 
 	// Operators
 	inline Vector operator-( void ) const			{ return Vector( -x, -y, -z );			}
diff --git a/dlls/weapons.cpp b/dlls/weapons.cpp
index 44f5d6f1..84b33464 100644
--- a/dlls/weapons.cpp
+++ b/dlls/weapons.cpp
@@ -301,6 +301,7 @@ void W_Precache( void )
 
 	// common world objects
 	UTIL_PrecacheOther( "item_suit" );
+	UTIL_PrecacheOther( "item_healthkit" );
 	UTIL_PrecacheOther( "item_battery" );
 	UTIL_PrecacheOther( "item_antidote" );
 	UTIL_PrecacheOther( "item_security" );
@@ -322,6 +323,9 @@ void W_Precache( void )
 	UTIL_PrecacheOther( "ammo_9mmAR" );
 	UTIL_PrecacheOther( "ammo_ARgrenades" );
 
+	// 9mm ammo box
+	UTIL_PrecacheOther( "ammo_9mmbox" );
+
 #if !defined( OEM_BUILD ) && !defined( HLDEMO_BUILD )
 	// python
 	UTIL_PrecacheOtherWeapon( "weapon_357" );
@@ -392,7 +396,7 @@ void W_Precache( void )
 	g_sModelIndexBloodSpray = PRECACHE_MODEL( "sprites/bloodspray.spr" ); // initial blood
 	g_sModelIndexBloodDrop = PRECACHE_MODEL( "sprites/blood.spr" ); // splattered blood 
 
-	g_sModelIndexLaser = PRECACHE_MODEL( (char *)g_pModelNameLaser );
+	g_sModelIndexLaser = PRECACHE_MODEL( g_pModelNameLaser );
 	g_sModelIndexLaserDot = PRECACHE_MODEL( "sprites/laserdot.spr" );
 
 	g_sModelIndexFThrow = PRECACHE_MODEL( "sprites/fthrow.spr" );
@@ -519,7 +523,7 @@ void CBasePlayerItem::Materialize( void )
 	pev->solid = SOLID_TRIGGER;
 
 	UTIL_SetOrigin( pev, pev->origin );// link into world.
-	SetTouch( &CBasePlayerItem::DefaultTouch);
+	SetTouch( &CBasePlayerItem::DefaultTouch );
 	SetThink( NULL );
 }
 
@@ -565,7 +569,7 @@ CBaseEntity* CBasePlayerItem::Respawn( void )
 {
 	// make a copy of this weapon that is invisible and inaccessible to players (no touch function). The weapon spawn/respawn code
 	// will decide when to make the weapon visible and touchable.
-	CBaseEntity *pNewWeapon = CBaseEntity::Create( (char *)STRING( pev->classname ), g_pGameRules->VecWeaponRespawnSpot( this ), pev->angles, pev->owner );
+	CBaseEntity *pNewWeapon = CBaseEntity::Create( STRING( pev->classname ), g_pGameRules->VecWeaponRespawnSpot( this ), pev->angles, pev->owner );
 
 	if( pNewWeapon )
 	{
@@ -632,10 +636,12 @@ BOOL CanAttack( float attack_time, float curtime, BOOL isPredicted )
 
 void CBasePlayerWeapon::ItemPostFrame( void )
 {
+	WeaponTick();
+
 	if( ( m_fInReload ) && ( m_pPlayer->m_flNextAttack <= UTIL_WeaponTimeBase() ) )
 	{
 		// complete the reload. 
-		int j = min( iMaxClip() - m_iClip, m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]);	
+		int j = Q_min( iMaxClip() - m_iClip, m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]);	
 
 		// Add them to the clip
 		m_iClip += j;
@@ -716,8 +722,8 @@ void CBasePlayerItem::DestroyItem( void )
 {
 	if( m_pPlayer )
 	{
-		// if attached to a player, remove. 
-		m_pPlayer->RemovePlayerItem( this );
+		// if attached to a player, remove.
+		m_pPlayer->RemovePlayerItem( this, false );
 	}
 
 	Kill();
@@ -759,7 +765,7 @@ void CBasePlayerItem::AttachToPlayer( CBasePlayer *pPlayer )
 	pev->modelindex = 0;// server won't send down to clients if modelindex == 0
 	pev->model = iStringNull;
 	pev->owner = pPlayer->edict();
-	pev->nextthink = gpGlobals->time + .1;
+	pev->nextthink = 0;// Remove think - prevents futher attempts to materialize
 	SetTouch( NULL );
 	SetThink( NULL );
 }
@@ -878,7 +884,7 @@ BOOL CBasePlayerWeapon::AddPrimaryAmmo( int iCount, char *szName, int iMaxClip,
 	else if( m_iClip == 0 )
 	{
 		int i;
-		i = min( m_iClip + iCount, iMaxClip ) - m_iClip;
+		i = Q_min( m_iClip + iCount, iMaxClip ) - m_iClip;
 		m_iClip += i;
 		iIdAmmo = m_pPlayer->GiveAmmo( iCount - i, szName, iMaxCarry );
 	}
@@ -969,7 +975,7 @@ BOOL CBasePlayerWeapon::CanDeploy( void )
 	return TRUE;
 }
 
-BOOL CBasePlayerWeapon::DefaultDeploy( char *szViewModel, char *szWeaponModel, int iAnim, char *szAnimExt, int skiplocal /* = 0 */, int body )
+BOOL CBasePlayerWeapon::DefaultDeploy( const char *szViewModel, const char *szWeaponModel, int iAnim, const char *szAnimExt, int skiplocal /* = 0 */, int body )
 {
 	if( !CanDeploy() )
 		return FALSE;
@@ -992,7 +998,7 @@ BOOL CBasePlayerWeapon::DefaultReload( int iClipSize, int iAnim, float fDelay, i
 	if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 )
 		return FALSE;
 
-	int j = min( iClipSize - m_iClip, m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] );
+	int j = Q_min( iClipSize - m_iClip, m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] );
 
 	if( j == 0 )
 		return FALSE;
@@ -1079,6 +1085,7 @@ void CBasePlayerAmmo::Materialize( void )
 	}
 
 	SetTouch( &CBasePlayerAmmo::DefaultTouch );
+	SetThink( NULL );
 }
 
 void CBasePlayerAmmo::DefaultTouch( CBaseEntity *pOther )
@@ -1167,14 +1174,24 @@ void CBasePlayerWeapon::RetireWeapon( void )
 	m_pPlayer->pev->weaponmodel = iStringNull;
 	//m_pPlayer->pev->viewmodelindex = NULL;
 
-	g_pGameRules->GetNextBestWeapon( m_pPlayer, this );
+	if( !g_pGameRules->GetNextBestWeapon( m_pPlayer, this ) )
+	{
+		// Another weapon wasn't selected. Get rid of current one
+		if( m_pPlayer->m_pActiveItem == this )
+		{
+			m_pPlayer->ResetAutoaim();
+			m_pPlayer->m_pActiveItem->Holster();
+			m_pPlayer->m_pLastItem = NULL;
+			m_pPlayer->m_pActiveItem = NULL;
+		}
+	}
 }
 
 //=========================================================================
 // GetNextAttackDelay - An accurate way of calcualting the next attack time.
 //=========================================================================
 float CBasePlayerWeapon::GetNextAttackDelay( float delay )
-{	
+{
 	if( m_flLastFireTime == 0 || m_flNextPrimaryAttack == -1 )
 	{
 		// At this point, we are assuming that the client has stopped firing
@@ -1193,7 +1210,7 @@ float CBasePlayerWeapon::GetNextAttackDelay( float delay )
 	m_flLastFireTime = gpGlobals->time;
 
 	float flNextAttack = UTIL_WeaponTimeBase() + delay - flCreep;
-	// we need to remember what the m_flNextPrimaryAttack time is set to for each shot, 
+	// we need to remember what the m_flNextPrimaryAttack time is set to for each shot,
 	// store it as m_flPrevPrimaryAttack.
 	m_flPrevPrimaryAttack = flNextAttack - UTIL_WeaponTimeBase();
 	//char szMsg[256];
@@ -1283,6 +1300,18 @@ void CWeaponBox::Kill( void )
 	UTIL_Remove( this );
 }
 
+static const char* IsAmmoForExhaustibleWeapon(const char* ammoName, int& weaponId)
+{
+	for (int i=0; i<MAX_WEAPONS; ++i) {
+		ItemInfo& II = CBasePlayerItem::ItemInfoArray[i];
+		if ((II.iFlags & ITEM_FLAG_EXHAUSTIBLE) && II.pszAmmo1 && FStrEq(ammoName, II.pszAmmo1)) {
+			weaponId = II.iId;
+			return II.pszName;
+		}
+	}
+	return 0;
+}
+
 //=========================================================
 // CWeaponBox - Touch: try to add my contents to the toucher
 // if the toucher is a player.
@@ -1314,8 +1343,37 @@ void CWeaponBox::Touch( CBaseEntity *pOther )
 	{
 		if( !FStringNull( m_rgiszAmmo[i] ) )
 		{
+			// horrific HACK to give player an exhaustible weapon as a real weapon, not just ammo
+			int exhaustibleWeaponId;
+			const char* weaponName = IsAmmoForExhaustibleWeapon(STRING(m_rgiszAmmo[i]), exhaustibleWeaponId);
+			if (weaponName) {
+				bool foundWeapon = false;
+				for( int j = 0; j < MAX_ITEM_TYPES && !foundWeapon; j++ )
+				{
+					CBasePlayerItem *pPlayerItem = pPlayer->m_rgpPlayerItems[j];
+					while( pPlayerItem )
+					{
+						if (pPlayerItem->m_iId == exhaustibleWeaponId) {
+							foundWeapon = true;
+							break;
+						}
+						pPlayerItem = pPlayerItem->m_pNext;
+					}
+				}
+				if (!foundWeapon) {
+					CBasePlayerWeapon* weapon = (CBasePlayerWeapon*)Create(weaponName, pev->origin, pev->angles);
+					if (weapon) {
+						weapon->pev->spawnflags |= SF_NORESPAWN;
+						weapon->m_iDefaultAmmo = 0;
+						if (pPlayer->AddPlayerItem(weapon)) {
+							weapon->AttachToPlayer(pPlayer);
+						}
+					}
+				}
+			}
+
 			// there's some ammo of this type. 
-			pPlayer->GiveAmmo( m_rgAmmo[i], (char *)STRING( m_rgiszAmmo[i] ), MaxAmmoCarry( m_rgiszAmmo[i] ) );
+			pPlayer->GiveAmmo( m_rgAmmo[i], STRING( m_rgiszAmmo[i] ), MaxAmmoCarry( m_rgiszAmmo[i] ) );
 
 			//ALERT( at_console, "Gave %d rounds of %s\n", m_rgAmmo[i], STRING( m_rgiszAmmo[i] ) );
 
@@ -1368,7 +1426,7 @@ BOOL CWeaponBox::PackWeapon( CBasePlayerItem *pWeapon )
 
 	if( pWeapon->m_pPlayer )
 	{
-		if( !pWeapon->m_pPlayer->RemovePlayerItem( pWeapon ) )
+		if( !pWeapon->m_pPlayer->RemovePlayerItem( pWeapon, true ) )
 		{
 			// failed to unhook the weapon from the player!
 			return FALSE;
@@ -1425,7 +1483,7 @@ BOOL CWeaponBox::PackAmmo( int iszName, int iCount )
 	if( iMaxCarry != -1 && iCount > 0 )
 	{
 		//ALERT( at_console, "Packed %d rounds of %s\n", iCount, STRING( iszName ) );
-		GiveAmmo( iCount, (char *)STRING( iszName ), iMaxCarry );
+		GiveAmmo( iCount, STRING( iszName ), iMaxCarry );
 		return TRUE;
 	}
 
@@ -1435,7 +1493,7 @@ BOOL CWeaponBox::PackAmmo( int iszName, int iCount )
 //=========================================================
 // CWeaponBox - GiveAmmo
 //=========================================================
-int CWeaponBox::GiveAmmo( int iCount, char *szName, int iMax, int *pIndex/* = NULL*/ )
+int CWeaponBox::GiveAmmo( int iCount, const char *szName, int iMax, int *pIndex/* = NULL*/ )
 {
 	int i;
 
@@ -1446,7 +1504,7 @@ int CWeaponBox::GiveAmmo( int iCount, char *szName, int iMax, int *pIndex/* = NU
 			if( pIndex )
 				*pIndex = i;
 
-			int iAdd = min( iCount, iMax - m_rgAmmo[i] );
+			int iAdd = Q_min( iCount, iMax - m_rgAmmo[i] );
 			if( iCount == 0 || iAdd > 0 )
 			{
 				m_rgAmmo[i] += iAdd;
@@ -1551,7 +1609,7 @@ IMPLEMENT_SAVERESTORE( CRpg, CBasePlayerWeapon )
 TYPEDESCRIPTION	CRpgRocket::m_SaveData[] =
 {
 	DEFINE_FIELD( CRpgRocket, m_flIgniteTime, FIELD_TIME ),
-	DEFINE_FIELD( CRpgRocket, m_pLauncher, FIELD_CLASSPTR ),
+	DEFINE_FIELD( CRpgRocket, m_hLauncher, FIELD_EHANDLE ),
 };
 
 IMPLEMENT_SAVERESTORE( CRpgRocket, CGrenade )
@@ -1592,6 +1650,13 @@ TYPEDESCRIPTION	CEgon::m_SaveData[] =
 
 IMPLEMENT_SAVERESTORE( CEgon, CBasePlayerWeapon )
 
+TYPEDESCRIPTION CHgun::m_SaveData[] =
+{
+	DEFINE_FIELD( CHgun, m_flRechargeTime, FIELD_FLOAT ),
+};
+
+IMPLEMENT_SAVERESTORE( CHgun, CBasePlayerWeapon )
+
 TYPEDESCRIPTION	CSatchel::m_SaveData[] = 
 {
 	DEFINE_FIELD( CSatchel, m_chargeReady, FIELD_INTEGER ),
diff --git a/dlls/weapons.h b/dlls/weapons.h
index c25bdbc5..7371a984 100644
--- a/dlls/weapons.h
+++ b/dlls/weapons.h
@@ -12,6 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
+#pragma once
 #ifndef WEAPONS_H
 #define WEAPONS_H
 
@@ -355,7 +356,7 @@ public:
 
 	virtual BOOL CanDeploy( void );
 	virtual BOOL IsUseable( void );
-	BOOL DefaultDeploy( char *szViewModel, char *szWeaponModel, int iAnim, char *szAnimExt, int skiplocal = 0, int body = 0 );
+	BOOL DefaultDeploy( const char *szViewModel, const char *szWeaponModel, int iAnim, const char *szAnimExt, int skiplocal = 0, int body = 0 );
 	int DefaultReload( int iClipSize, int iAnim, float fDelay, int body = 0 );
 
 	virtual void ItemPostFrame( void );	// called each frame by the player PostThink
@@ -363,6 +364,7 @@ public:
 	virtual void PrimaryAttack( void ) { return; }				// do "+ATTACK"
 	virtual void SecondaryAttack( void ) { return; }			// do "+ATTACK2"
 	virtual void Reload( void ) { return; }						// do "+RELOAD"
+	virtual void WeaponTick() {}				// Always called at beginning of ItemPostFrame. - Solokiller
 	virtual void WeaponIdle( void ) { return; }					// called when no buttons pressed
 	virtual int UpdateClientData( CBasePlayer *pPlayer );		// sends hud info to client dll, if things have changed
 	virtual void RetireWeapon( void );
@@ -393,8 +395,8 @@ public:
 	int		m_iDefaultAmmo;// how much ammo you get when you pick up this weapon as placed by a level designer.
 
 	// hle time creep vars
-	float m_flPrevPrimaryAttack;
-	float m_flLastFireTime;
+	float	m_flPrevPrimaryAttack;
+	float	m_flLastFireTime;
 };
 
 class CBasePlayerAmmo : public CBaseEntity
@@ -476,7 +478,7 @@ class CWeaponBox : public CBaseEntity
 	void Touch( CBaseEntity *pOther );
 	void KeyValue( KeyValueData *pkvd );
 	BOOL IsEmpty( void );
-	int  GiveAmmo( int iCount, char *szName, int iMax, int *pIndex = NULL );
+	int  GiveAmmo( int iCount, const char *szName, int iMax, int *pIndex = NULL );
 	void SetObjectCollisionBox( void );
 
 public:
@@ -491,7 +493,7 @@ public:
 
 	CBasePlayerItem	*m_rgpPlayerItems[MAX_ITEM_TYPES];// one slot for each 
 
-	int m_rgiszAmmo[MAX_AMMO_SLOTS];// ammo names
+	string_t m_rgiszAmmo[MAX_AMMO_SLOTS];// ammo names
 	int	m_rgAmmo[MAX_AMMO_SLOTS];// ammo quantities
 
 	int m_cAmmoTypes;// how many ammo types packed into this box (if packed by a level designer)
@@ -499,7 +501,7 @@ public:
 
 #ifdef CLIENT_DLL
 bool bIsMultiplayer ( void );
-void LoadVModel ( char *szViewModel, CBasePlayer *m_pPlayer );
+void LoadVModel ( const char *szViewModel, CBasePlayer *m_pPlayer );
 #endif
 
 class CGlock : public CBasePlayerWeapon
@@ -508,7 +510,8 @@ public:
 	void Spawn( void );
 	void Precache( void );
 	int iItemSlot( void ) { return 2; }
-	int GetItemInfo(ItemInfo *p);
+	int GetItemInfo( ItemInfo *p );
+	int AddToPlayer( CBasePlayer *pPlayer );
 
 	void PrimaryAttack( void );
 	void SecondaryAttack( void );
@@ -551,12 +554,16 @@ public:
 	int iItemSlot( void ) { return 1; }
 	void EXPORT SwingAgain( void );
 	void EXPORT Smack( void );
-	int GetItemInfo(ItemInfo *p);
+	int GetItemInfo( ItemInfo *p );
+	int AddToPlayer( CBasePlayer *pPlayer );
 
 	void PrimaryAttack( void );
 	int Swing( int fFirst );
 	BOOL Deploy( void );
 	void Holster( int skiplocal = 0 );
+#ifdef CROWBAR_IDLE_ANIM
+	void WeaponIdle();
+#endif
 	int m_iSwing;
 	TraceResult m_trHit;
 
@@ -623,6 +630,7 @@ public:
 	BOOL Deploy( void );
 	void Reload( void );
 	void WeaponIdle( void );
+	BOOL IsUseable();
 	float m_flNextAnimTime;
 	int m_iShell;
 
@@ -692,6 +700,7 @@ public:
 	void SecondaryAttack( void );
 	BOOL Deploy( );
 	void Reload( void );
+	void WeaponTick();
 	void WeaponIdle( void );
 	int m_fInReload;
 	float m_flNextReload;
@@ -783,7 +792,7 @@ public:
 
 	int m_iTrail;
 	float m_flIgniteTime;
-	CRpg *m_pLauncher;// pointer back to the launcher that fired me. 
+	EHANDLE m_hLauncher; // handle back to the launcher that fired me. 
 };
 
 class CGauss : public CBasePlayerWeapon
@@ -799,7 +808,7 @@ public:
 	int iItemSlot( void ) { return 4; }
 	int GetItemInfo(ItemInfo *p);
 	int AddToPlayer( CBasePlayer *pPlayer );
-
+	BOOL IsUseable();
 	BOOL Deploy( void );
 	void Holster( int skiplocal = 0  );
 
@@ -889,7 +898,9 @@ public:
 	unsigned short m_usEgonStop;
 
 private:
+#ifndef CLIENT_DLL
 	float				m_shootTime;
+#endif
 	EGON_FIREMODE		m_fireMode;
 	float				m_shakeTime;
 	BOOL				m_deployed;
@@ -900,6 +911,11 @@ private:
 class CHgun : public CBasePlayerWeapon
 {
 public:
+#ifndef CLIENT_DLL
+	int		Save( CSave &save );
+	int		Restore( CRestore &restore );
+	static	TYPEDESCRIPTION m_SaveData[];
+#endif
 	void Spawn( void );
 	void Precache( void );
 	int iItemSlot( void ) { return 4; }
diff --git a/dlls/world.cpp b/dlls/world.cpp
index 7610881c..73f03781 100644
--- a/dlls/world.cpp
+++ b/dlls/world.cpp
@@ -292,7 +292,7 @@ globalentity_t *CGlobalState::Find( string_t globalname )
 //#ifdef _DEBUG
 void CGlobalState::DumpGlobals( void )
 {
-	static char *estates[] = { "Off", "On", "Dead" };
+	static const char *estates[] = { "Off", "On", "Dead" };
 	globalentity_t *pTest;
 
 	ALERT( at_console, "-- Globals --\n" );
@@ -484,9 +484,12 @@ void CWorld::Precache( void )
 	///!!!LATER - do we want a sound ent in deathmatch? (sjb)
 	//pSoundEnt = CBaseEntity::Create( "soundent", g_vecZero, g_vecZero, edict() );
 	pSoundEnt = GetClassPtr( ( CSoundEnt *)NULL );
-	pSoundEnt->Spawn();
 
-	if( !pSoundEnt )
+	if( pSoundEnt )
+	{
+		pSoundEnt->Spawn();
+	}
+	else
 	{
 		ALERT ( at_console, "**COULD NOT CREATE SOUNDENT**\n" );
 	}
@@ -582,14 +585,14 @@ void CWorld::Precache( void )
 	// 63 testing
 	LIGHT_STYLE( 63, "a" );
 
-	for( int i = 0; i < ARRAYSIZE( gDecals ); i++ )
+	for( int i = 0; i < (int)ARRAYSIZE( gDecals ); i++ )
 		gDecals[i].index = DECAL_INDEX( gDecals[i].name );
 
 	// init the WorldGraph.
 	WorldGraph.InitGraph();
 
 	// make sure the .NOD file is newer than the .BSP file.
-	if( !WorldGraph.CheckNODFile( ( char * )STRING( gpGlobals->mapname ) ) )
+	if( !WorldGraph.CheckNODFile( STRING( gpGlobals->mapname ) ) )
 	{
 		// NOD file is not present, or is older than the BSP file.
 		WorldGraph.AllocNodes();
@@ -597,7 +600,7 @@ void CWorld::Precache( void )
 	else
 	{
 		// Load the node graph for this level
-		if( !WorldGraph.FLoadGraph ( (char *)STRING( gpGlobals->mapname ) ) )
+		if( !WorldGraph.FLoadGraph( STRING( gpGlobals->mapname ) ) )
 		{
 			// couldn't load, so alloc and prepare to build a graph.
 			ALERT( at_console, "*Error opening .NOD file\n" );
diff --git a/dlls/xen.cpp b/dlls/xen.cpp
index 8e9c771c..1d86beb3 100644
--- a/dlls/xen.cpp
+++ b/dlls/xen.cpp
@@ -98,7 +98,7 @@ void CXenPLight::Spawn( void )
 	pev->frame = RANDOM_FLOAT( 0, 255 );
 
 	m_pGlow = CSprite::SpriteCreate( XEN_PLANT_GLOW_SPRITE, pev->origin + Vector(0,0,(pev->mins.z+pev->maxs.z)*0.5), FALSE );
-	m_pGlow->SetTransparency( kRenderGlow, pev->rendercolor.x, pev->rendercolor.y, pev->rendercolor.z, pev->renderamt, pev->renderfx );
+	m_pGlow->SetTransparency( kRenderGlow, (int)pev->rendercolor.x, (int)pev->rendercolor.y, (int)pev->rendercolor.z, (int)pev->renderamt, (int)pev->renderfx );
 	m_pGlow->SetAttachment( edict(), 1 );
 }
 
@@ -444,9 +444,9 @@ CXenHull *CXenHull::CreateHull( CBaseEntity *source, const Vector &mins, const V
 	CXenHull *pHull = GetClassPtr( (CXenHull *)NULL );
 
 	UTIL_SetOrigin( pHull->pev, source->pev->origin + offset );
-	SET_MODEL( pHull->edict(), STRING(source->pev->model) );
+	SET_MODEL( pHull->edict(), STRING( source->pev->model ) );
 	pHull->pev->solid = SOLID_BBOX;
-	pHull->pev->classname = MAKE_STRING("xen_hull");
+	pHull->pev->classname = MAKE_STRING( "xen_hull" );
 	pHull->pev->movetype = MOVETYPE_NONE;
 	pHull->pev->owner = source->edict();
 	UTIL_SetSize( pHull->pev, mins, maxs );
@@ -497,7 +497,7 @@ void CXenSporeLarge::Spawn( void )
 	UTIL_MakeVectorsPrivate( pev->angles, forward, right, NULL );
 
 	// Rotate the leg hulls into position
-	for( int i = 0; i < ARRAYSIZE( m_hullSizes ); i++ )
+	for( int i = 0; i < (int)ARRAYSIZE( m_hullSizes ); i++ )
 		CXenHull::CreateHull( this, Vector( -12, -12, 0 ), Vector( 12, 12, 120 ), ( m_hullSizes[i].x * forward ) + ( m_hullSizes[i].y * right ) );
 }
 
@@ -527,7 +527,7 @@ const char *CXenSpore::pModelNames[] =
 
 void CXenSpore::Precache( void )
 {
-	PRECACHE_MODEL( (char *)pModelNames[pev->skin] );
+	PRECACHE_MODEL( pModelNames[pev->skin] );
 }
 
 void CXenSpore::Touch( CBaseEntity *pOther )
@@ -536,7 +536,7 @@ void CXenSpore::Touch( CBaseEntity *pOther )
 
 void CXenSpore::Think( void )
 {
-	float flInterval = StudioFrameAdvance();
+	StudioFrameAdvance();
 	pev->nextthink = gpGlobals->time + 0.1;
 #if 0
 	DispatchAnimEvents( flInterval );
diff --git a/dlls/zombie.cpp b/dlls/zombie.cpp
index 5309bd0e..a9810bf7 100644
--- a/dlls/zombie.cpp
+++ b/dlls/zombie.cpp
@@ -448,7 +448,7 @@ void CZombie::AttackSound( void )
 				EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, pAttackSounds[RANDOM_LONG( 0, ARRAYSIZE( pAttackSounds ) - 1 )], 1.0, ATTN_NORM, 0, pitch );
 			}
 		}
-}
+	}
 }
 
 //=========================================================
@@ -537,11 +537,9 @@ void CZombie::Spawn()
 {
 	Precache();
 
-	char* szModel = (char*)STRING( pev->model );
-	if( !szModel || !*szModel )
+	if( !pev->model )
 	{
-		szModel = "models/zombie.mdl";
-		pev->model = ALLOC_STRING( szModel );
+		pev->model = MAKE_STRING( "models/zombie.mdl" );
 	}
 
 	SET_MODEL( ENT( pev ), STRING( pev->model ) );
@@ -634,7 +632,7 @@ void CZombie::Spawn()
 //=========================================================
 void CZombie::Precache()
 {
-	int i;
+	size_t i;
 
 	PRECACHE_MODEL( "models/zombie.mdl" );
 	PRECACHE_MODEL( "models/zombie2.mdl" );
@@ -643,22 +641,22 @@ void CZombie::Precache()
 	PRECACHE_MODEL( "models/lpzombie.mdl" );
 
 	for( i = 0; i < ARRAYSIZE( pAttackHitSounds ); i++ )
-		PRECACHE_SOUND( (char *)pAttackHitSounds[i] );
+		PRECACHE_SOUND( pAttackHitSounds[i] );
 
 	for( i = 0; i < ARRAYSIZE( pAttackMissSounds ); i++ )
-		PRECACHE_SOUND( (char *)pAttackMissSounds[i] );
+		PRECACHE_SOUND( pAttackMissSounds[i] );
 
 	for( i = 0; i < ARRAYSIZE( pAttackSounds ); i++ )
-		PRECACHE_SOUND( (char *)pAttackSounds[i] );
+		PRECACHE_SOUND( pAttackSounds[i] );
 
 	for( i = 0; i < ARRAYSIZE( pIdleSounds ); i++ )
-		PRECACHE_SOUND( (char *)pIdleSounds[i] );
+		PRECACHE_SOUND( pIdleSounds[i] );
 
 	for( i = 0; i < ARRAYSIZE( pAlertSounds ); i++ )
-		PRECACHE_SOUND( (char *)pAlertSounds[i] );
+		PRECACHE_SOUND( pAlertSounds[i] );
 
 	for( i = 0; i < ARRAYSIZE( pPainSounds ); i++ )
-		PRECACHE_SOUND( (char *)pPainSounds[i] );
+		PRECACHE_SOUND( pPainSounds[i] );
 
 	PRECACHE_SOUND_ARRAY( pCopAttackSounds );
 	PRECACHE_SOUND_ARRAY( pCopIdleSounds );
diff --git a/engine/cdll_exp.h b/engine/cdll_exp.h
index bf43654c..e4c1f5d8 100644
--- a/engine/cdll_exp.h
+++ b/engine/cdll_exp.h
@@ -12,6 +12,7 @@ but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 */
+#pragma once
 #ifndef CDLL_EXP_H
 #define CDLL_EXP_H
 
@@ -66,4 +67,4 @@ typedef struct cldll_func_s
 	void	(*pfnClipMoveToEntity)( struct physent_s *pe, const vec3_t start, vec3_t mins, vec3_t maxs, const vec3_t end, struct pmtrace_s *tr );
 } cldll_func_t;
 
-#endif//CDLL_EXP_H
\ No newline at end of file
+#endif//CDLL_EXP_H
diff --git a/engine/cdll_int.h b/engine/cdll_int.h
index eaa7f4e8..abfc43bd 100644
--- a/engine/cdll_int.h
+++ b/engine/cdll_int.h
@@ -18,7 +18,7 @@
 // 4-23-98  
 // JOHN:  client dll interface declarations
 //
-
+#pragma once
 #ifndef CDLL_INT_H
 #define CDLL_INT_H
 
@@ -93,7 +93,7 @@ typedef struct client_textmessage_s
 	const char	*pMessage;
 } client_textmessage_t;
 
-#if __MSC_VER == 1200
+#if _MSC_VER == 1200
 #define ulonglong_t __int64
 #else
 #define ulonglong_t unsigned long long
@@ -128,7 +128,7 @@ typedef struct cl_enginefuncs_s
 	void	(*pfnSPR_DrawAdditive)( int frame, int x, int y, const wrect_t *prc );
 	void	(*pfnSPR_EnableScissor)( int x, int y, int width, int height );
 	void	(*pfnSPR_DisableScissor)( void );
-	client_sprite_t *(*pfnSPR_GetList)( char *psz, int *piCount );
+	client_sprite_t *(*pfnSPR_GetList)( const char *psz, int *piCount );
 
 	// screen handlers
 	void	(*pfnFillRGBA)( int x, int y, int width, int height, int r, int g, int b, int a );
@@ -136,20 +136,20 @@ typedef struct cl_enginefuncs_s
 	void	(*pfnSetCrosshair)( HSPRITE hspr, wrect_t rc, int r, int g, int b );
 
 	// cvar handlers
-	struct cvar_s *(*pfnRegisterVariable)( char *szName, char *szValue, int flags );
-	float	(*pfnGetCvarFloat)( char *szName );
-	char*	(*pfnGetCvarString)( char *szName );
+	struct cvar_s *(*pfnRegisterVariable)( const char *szName, const char *szValue, int flags );
+	float	(*pfnGetCvarFloat)( const char *szName );
+	char*	(*pfnGetCvarString)( const char *szName );
 
 	// command handlers
-	int	(*pfnAddCommand)( char *cmd_name, void (*function)(void) );
-	int	(*pfnHookUserMsg)( char *szMsgName, pfnUserMsgHook pfn );
-	int	(*pfnServerCmd)( char *szCmdString );
-	int	(*pfnClientCmd)( char *szCmdString );
+	int	(*pfnAddCommand)( const char *cmd_name, void (*function)(void) );
+	int	(*pfnHookUserMsg)( const char *szMsgName, pfnUserMsgHook pfn );
+	int	(*pfnServerCmd)( const char *szCmdString );
+	int	(*pfnClientCmd)( const char *szCmdString );
 
 	void	(*pfnGetPlayerInfo)( int ent_num, hud_player_info_t *pinfo );
 
 	// sound handlers
-	void	(*pfnPlaySoundByName)( char *szSound, float volume );
+	void	(*pfnPlaySoundByName)( const char *szSound, float volume );
 	void	(*pfnPlaySoundByIndex)( int iSound, float volume );
 
 	// vector helpers
@@ -158,7 +158,7 @@ typedef struct cl_enginefuncs_s
 	// text message system
 	client_textmessage_t *(*pfnTextMessageGet)( const char *pName );
 	int	(*pfnDrawCharacter)( int x, int y, int number, int r, int g, int b );
-	int	(*pfnDrawConsoleString)( int x, int y, char *string );
+	int	(*pfnDrawConsoleString)( int x, int y, const char *string );
 	void	(*pfnDrawSetTextColor)( float r, float g, float b );
 	void	(*pfnDrawConsoleStringLen)(  const char *string, int *length, int *height );
 
@@ -171,19 +171,19 @@ typedef struct cl_enginefuncs_s
 	void	(*GetViewAngles)( float * );
 	void	(*SetViewAngles)( float * );
 	int	(*GetMaxClients)( void );
-	void	(*Cvar_SetValue)( char *cvar, float value );
+	void	(*Cvar_SetValue)( const char *cvar, float value );
 
 	int       (*Cmd_Argc)( void );	
 	char	*(*Cmd_Argv)( int arg );
-	void	(*Con_Printf)( char *fmt, ... );
-	void	(*Con_DPrintf)( char *fmt, ... );
-	void	(*Con_NPrintf)( int pos, char *fmt, ... );
-	void	(*Con_NXPrintf)( struct con_nprint_s *info, char *fmt, ... );
+	void	(*Con_Printf)( const char *fmt, ... );
+	void	(*Con_DPrintf)( const char *fmt, ... );
+	void	(*Con_NPrintf)( int pos, const char *fmt, ... );
+	void	(*Con_NXPrintf)( struct con_nprint_s *info, const char *fmt, ... );
 
 	const char* (*PhysInfo_ValueForKey)( const char *key );
 	const char* (*ServerInfo_ValueForKey)( const char *key );
 	float	(*GetClientMaxspeed)( void );
-	int	(*CheckParm)( char *parm, char **ppnext );
+	int	(*CheckParm)( const char *parm, const char **ppnext );
 
 	void	(*Key_Event)( int key, int down );
 	void	(*GetMousePosition)( int *mx, int *my );
@@ -205,14 +205,14 @@ typedef struct cl_enginefuncs_s
 	int	(*CL_CreateVisibleEntity)( int type, struct cl_entity_s *ent );
 
 	const struct model_s* (*GetSpritePointer)( HSPRITE hSprite );
-	void	(*pfnPlaySoundByNameAtLocation)( char *szSound, float volume, float *origin );
+	void	(*pfnPlaySoundByNameAtLocation)( const char *szSound, float volume, float *origin );
 	
 	unsigned short (*pfnPrecacheEvent)( int type, const char* psz );
 	void	(*pfnPlaybackEvent)( int flags, const struct edict_s *pInvoker, unsigned short eventindex, float delay, float *origin, float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2 );
 	void	(*pfnWeaponAnim)( int iAnim, int body );
 	float	(*pfnRandomFloat)( float flLow, float flHigh );	
-	long	(*pfnRandomLong)( long lLow, long lHigh );
-	void	(*pfnHookEvent)( char *name, void ( *pfnEvent )( struct event_args_s *args ));
+	int	(*pfnRandomLong)( int lLow, int lHigh );
+	void	(*pfnHookEvent)( const char *name, void ( *pfnEvent )( struct event_args_s *args ));
 	int	(*Con_IsVisible) ();
 	const char *(*pfnGetGameDirectory)( void );
 	struct cvar_s *(*pfnGetCvarPointer)( const char *szName );
@@ -223,8 +223,8 @@ typedef struct cl_enginefuncs_s
 	void*	(*VGui_GetPanel)( );
 	void	(*VGui_ViewportPaintBackground)( int extents[4] );
 
-	byte*	(*COM_LoadFile)( char *path, int usehunk, int *pLength );
-	char*	(*COM_ParseFile)( char *data, char *token );
+	byte*	(*COM_LoadFile)( const char *path, int usehunk, int *pLength );
+	char*	(*COM_ParseFile)( const char *data, const char *token );
 	void	(*COM_FreeFile)( void *buffer );
 
 	struct triangleapi_s	*pTriAPI;
@@ -252,7 +252,7 @@ typedef struct cl_enginefuncs_s
 	// Gets a unique ID for the specified player. This is the same even if you see the player on a different server.
 	// iPlayer is an entity index, so client 0 would use iPlayer=1.
 	// Returns false if there is no player on the server in the specified slot.
-	qboolean	(*GetPlayerUniqueID)(int iPlayer, char playerID[16]);
+	qboolean	(*GetPlayerUniqueID)(int iPlayer, const char playerID[16]);
 
 	// TrackerID access
 	int	(*GetTrackerIDForPlayer)(int playerSlot);
@@ -260,7 +260,7 @@ typedef struct cl_enginefuncs_s
 
 	// Same as pfnServerCmd, but the message goes in the unreliable stream so it can't clog the net stream
 	// (but it might not get there).
-	int	( *pfnServerCmdUnreliable )( char *szCmdString );
+	int	( *pfnServerCmdUnreliable )( const char *szCmdString );
 
 	void	(*pfnGetMousePos)( struct tagPOINT *ppt );
 	void	(*pfnSetMousePos)( int x, int y );
@@ -285,12 +285,12 @@ typedef struct cl_enginefuncs_s
 	const char	*(*LocalPlayerInfo_ValueForKey)( const char* key );
 	int		(*pfnVGUI2DrawCharacter)( int x, int y, int ch, unsigned int font );
 	int		(*pfnVGUI2DrawCharacterAdditive)( int x, int y, int ch, int r, int g, int b, unsigned int font );
-	unsigned int	(*pfnGetApproxWavePlayLen)( char *filename );
+	unsigned int	(*pfnGetApproxWavePlayLen)( const char *filename );
 	void*		(*GetCareerGameUI)( void );	// g-cont. !!!! potential crash-point!
-	void		(*Cvar_Set)( char *name, char *value );
+	void		(*Cvar_Set)( const char *name, const char *value );
 	int		(*pfnIsPlayingCareerMatch)( void );
-	void		(*pfnPlaySoundVoiceByName)( char *szSound, float volume, int pitch );
-	void		(*pfnPrimeMusicStream)( char *filename, int looping );
+	void		(*pfnPlaySoundVoiceByName)( const char *szSound, float volume, int pitch );
+	void		(*pfnPrimeMusicStream)( const char *filename, int looping );
 	double		(*pfnSys_FloatTime)( void );
 
 	// decay funcs
@@ -298,7 +298,7 @@ typedef struct cl_enginefuncs_s
 	void		(*pfnConstructTutorMessageDecayBuffer)( int *buffer, int buflen );
 	void		(*pfnResetTutorMessageDecayData)( void );
 
-	void		(*pfnPlaySoundByNameAtPitch)( char *szSound, float volume, int pitch );
+	void		(*pfnPlaySoundByNameAtPitch)( const char *szSound, float volume, int pitch );
 	void		(*pfnFillRGBABlend)( int x, int y, int width, int height, int r, int g, int b, int a );
 	int		(*pfnGetAppID)( void );
 	cmdalias_t	*(*pfnGetAliases)( void );
@@ -311,4 +311,4 @@ typedef struct cl_enginefuncs_s
 }
 #endif
 
-#endif//CDLL_INT_H
\ No newline at end of file
+#endif//CDLL_INT_H
diff --git a/engine/custom.h b/engine/custom.h
index d48ee72d..02aa2089 100644
--- a/engine/custom.h
+++ b/engine/custom.h
@@ -12,7 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
-
+#pragma once
 #ifndef CUSTOM_H
 #define CUSTOM_H
 
diff --git a/engine/customentity.h b/engine/customentity.h
index 63e672f8..f524ae79 100644
--- a/engine/customentity.h
+++ b/engine/customentity.h
@@ -12,7 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
-
+#pragma once
 #ifndef CUSTOMENTITY_H
 #define CUSTOMENTITY_H
 
diff --git a/engine/edict.h b/engine/edict.h
index b0469b86..8584a0d9 100644
--- a/engine/edict.h
+++ b/engine/edict.h
@@ -12,7 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
-
+#pragma once
 #ifndef EDICT_H
 #define EDICT_H
 
@@ -39,4 +39,4 @@ struct edict_s
 	// other fields from progs come immediately after
 };
 
-#endif//EDICT_H
\ No newline at end of file
+#endif//EDICT_H
diff --git a/engine/eiface.h b/engine/eiface.h
index 903451f5..f6cf2f51 100644
--- a/engine/eiface.h
+++ b/engine/eiface.h
@@ -12,7 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
-
+#pragma once
 #ifndef EIFACE_H
 #define EIFACE_H
 
@@ -57,7 +57,8 @@ typedef enum
 {
 	force_exactfile,			// File on client must exactly match server's file
 	force_model_samebounds,		// For model files only, the geometry must fit in the same bbox
-	force_model_specifybounds		// For model files only, the geometry must fit in the specified bbox
+	force_model_specifybounds,		// For model files only, the geometry must fit in the specified bbox
+	force_model_specifybounds_if_avail	// For Steam model files only, the geometry must fit in the specified bbox (if the file is available)
 } FORCE_TYPE;
 
 // Returned by TraceLine
@@ -88,18 +89,18 @@ typedef struct
 	int	fPlayTrack;
 } CDStatus;
 		
-typedef unsigned long	CRC32_t;
+typedef unsigned int	CRC32_t;
 
 // Engine hands this to DLLs for functionality callbacks
 typedef struct enginefuncs_s
 {
-	int	(*pfnPrecacheModel)( char* s );
-	int	(*pfnPrecacheSound)( char* s );
+	int	(*pfnPrecacheModel)( const char *s );
+	int	(*pfnPrecacheSound)( const char *s );
 	void	(*pfnSetModel)( edict_t *e, const char *m );
 	int	(*pfnModelIndex)( const char *m );
 	int	(*pfnModelFrames)( int modelIndex );
 	void	(*pfnSetSize)( edict_t *e, const float *rgflMin, const float *rgflMax );
-	void	(*pfnChangeLevel)( char* s1, char* s2 );
+	void	(*pfnChangeLevel)( const char *s1, const char *s2 );
 	void	(*pfnGetSpawnParms)( edict_t *ent );
 	void	(*pfnSaveSpawnParms)( edict_t *ent );
 	float	(*pfnVecToYaw)( const float *rgflVector );
@@ -131,12 +132,12 @@ typedef struct enginefuncs_s
 	void	(*pfnTraceModel)( const float *v1, const float *v2, int hullNumber, edict_t *pent, TraceResult *ptr );
 	const char *(*pfnTraceTexture)( edict_t *pTextureEntity, const float *v1, const float *v2 );
 	void	(*pfnTraceSphere)( const float *v1, const float *v2, int fNoMonsters, float radius, edict_t *pentToSkip, TraceResult *ptr );
-	void	(*pfnGetAimVector)( edict_t* ent, float speed, float *rgflReturn );
-	void	(*pfnServerCommand)( char* str );
+	void	(*pfnGetAimVector)( edict_t *ent, float speed, float *rgflReturn );
+	void	(*pfnServerCommand)( const char *str );
 	void	(*pfnServerExecute)( void );
-	void	(*pfnClientCommand)( edict_t* pEdict, char* szFmt, ... );
+	void	(*pfnClientCommand)( edict_t* pEdict, const char *szFmt, ... );
 	void	(*pfnParticleEffect)( const float *org, const float *dir, float color, float count );
-	void	(*pfnLightStyle)( int style, char* val );
+	void	(*pfnLightStyle)( int style, const char *val );
 	int	(*pfnDecalIndex)( const char *name );
 	int	(*pfnPointContents)( const float *rgflVector );
 	void	(*pfnMessageBegin)( int msg_dest, int msg_type, const float *pOrigin, edict_t *ed );
@@ -154,9 +155,9 @@ typedef struct enginefuncs_s
 	const char* (*pfnCVarGetString)( const char *szVarName );
 	void	(*pfnCVarSetFloat)( const char *szVarName, float flValue );
 	void	(*pfnCVarSetString)( const char *szVarName, const char *szValue );
-	void	(*pfnAlertMessage)( ALERT_TYPE atype, char *szFmt, ... );
-	void	(*pfnEngineFprintf)( FILE *pfile, char *szFmt, ... );
-	void*	(*pfnPvAllocEntPrivateData)( edict_t *pEdict, long cb );
+	void	(*pfnAlertMessage)( ALERT_TYPE atype, const char *szFmt, ... );
+	void	(*pfnEngineFprintf)( FILE *pfile, const char *szFmt, ... );
+	void*	(*pfnPvAllocEntPrivateData)( edict_t *pEdict, int cb );
 	void*	(*pfnPvEntPrivateData)( edict_t *pEdict );
 	void	(*pfnFreeEntPrivateData)( edict_t *pEdict );
 	const char *(*pfnSzFromIndex)( int iString );
@@ -171,8 +172,8 @@ typedef struct enginefuncs_s
 	int	(*pfnRegUserMsg)( const char *pszName, int iSize );
 	void	(*pfnAnimationAutomove)( const edict_t* pEdict, float flTime );
 	void	(*pfnGetBonePosition)( const edict_t* pEdict, int iBone, float *rgflOrigin, float *rgflAngles );
-	unsigned long (*pfnFunctionFromName)( const char *pName );
-	const char *(*pfnNameForFunction)( unsigned long function );
+	void* (*pfnFunctionFromName)( const char *pName );
+	const char *(*pfnNameForFunction)( void *function );
 	void	(*pfnClientPrintf)( edict_t* pEdict, PRINT_TYPE ptype, const char *szMsg ); // JOHN: engine callbacks so game DLL can print messages to individual clients
 	void	(*pfnServerPrint)( const char *szMsg );
 	const char *(*pfnCmd_Args)( void );		// these 3 added 
@@ -183,12 +184,12 @@ typedef struct enginefuncs_s
 	void	(*pfnCRC32_ProcessBuffer)( CRC32_t *pulCRC, void *p, int len );
 	void	(*pfnCRC32_ProcessByte)( CRC32_t *pulCRC, unsigned char ch );
 	CRC32_t	(*pfnCRC32_Final)( CRC32_t pulCRC );
-	long	(*pfnRandomLong)( long lLow, long lHigh );
+	int	(*pfnRandomLong)( int lLow, int lHigh );
 	float	(*pfnRandomFloat)( float flLow, float flHigh );
 	void	(*pfnSetView)( const edict_t *pClient, const edict_t *pViewent );
 	float	(*pfnTime)( void );
 	void	(*pfnCrosshairAngle)( const edict_t *pClient, float pitch, float yaw );
-	byte*	(*pfnLoadFileForMe)( char *filename, int *pLength );
+	byte*	(*pfnLoadFileForMe)( const char *filename, int *pLength );
 	void	(*pfnFreeFile)( void *buffer );
 	void	(*pfnEndSection)( const char *pszSectionName ); // trigger_endsection
 	int	(*pfnCompareFileTime)( char *filename1, char *filename2, int *iCompare );
@@ -200,12 +201,12 @@ typedef struct enginefuncs_s
 	void	(*pfnRunPlayerMove)( edict_t *fakeclient, const float *viewangles, float forwardmove, float sidemove, float upmove, unsigned short buttons, byte impulse, byte msec );
 	int	(*pfnNumberOfEntities)( void );
 	char*	(*pfnGetInfoKeyBuffer)( edict_t *e );			// passing in NULL gets the serverinfo
-	char*	(*pfnInfoKeyValue)( char *infobuffer, char *key );
-	void	(*pfnSetKeyValue)( char *infobuffer, char *key, char *value );
-	void	(*pfnSetClientKeyValue)( int clientIndex, char *infobuffer, char *key, char *value );
-	int	(*pfnIsMapValid)( char *filename );
+	char*	(*pfnInfoKeyValue)( char *infobuffer, const char *key );
+	void	(*pfnSetKeyValue)( char *infobuffer, const char *key, const char *value );
+	void	(*pfnSetClientKeyValue)( int clientIndex, char *infobuffer, const char *key, const char *value );
+	int	(*pfnIsMapValid)( const char *filename );
 	void	(*pfnStaticDecal)( const float *origin, int decalIndex, int entityIndex, int modelIndex );
-	int	(*pfnPrecacheGeneric)( char *s );
+	int	(*pfnPrecacheGeneric)( const char *s );
 	int	(*pfnGetPlayerUserId)( edict_t *e ); // returns the server assigned userid for this player.  useful for logging frags, etc.  returns -1 if the edict couldn't be found in the list of clients
 	void	(*pfnBuildSoundMsg)( edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed );
 	int	(*pfnIsDedicatedServer)( void );			// is this a dedicated server?
@@ -227,7 +228,7 @@ typedef struct enginefuncs_s
 
 	void	(*pfnDeltaSetField)	( struct delta_s *pFields, const char *fieldname );
 	void	(*pfnDeltaUnsetField)( struct delta_s *pFields, const char *fieldname );
-	void	(*pfnDeltaAddEncoder)( char *name, void (*conditionalencode)( struct delta_s *pFields, const unsigned char *from, const unsigned char *to ) );
+	void	(*pfnDeltaAddEncoder)( const char *name, void (*conditionalencode)( struct delta_s *pFields, const unsigned char *from, const unsigned char *to ) );
 	int	(*pfnGetCurrentPlayer)( void );
 	int	(*pfnCanSkipPlayer)( const edict_t *player );
 	int	(*pfnDeltaFindField)( struct delta_s *pFields, const char *fieldname );
@@ -235,7 +236,7 @@ typedef struct enginefuncs_s
 	void	(*pfnDeltaUnsetFieldByIndex)( struct delta_s *pFields, int fieldNumber );
 	void	(*pfnSetGroupMask)( int mask, int op );
 	int	(*pfnCreateInstancedBaseline)( int classname, struct entity_state_s *baseline );
-	void	(*pfnCvar_DirectSet)( struct cvar_s *var, char *value );
+	void	(*pfnCvar_DirectSet)( struct cvar_s *var, const char *value );
 
 	// Forces the client and server to be running with the same version of the specified file
 	//  ( e.g., a player model ).
@@ -244,7 +245,7 @@ typedef struct enginefuncs_s
 
 	void	(*pfnGetPlayerStats)( const edict_t *pClient, int *ping, int *packet_loss );
 
-	void	(*pfnAddServerCommand)( char *cmd_name, void (*function) (void) );
+	void	(*pfnAddServerCommand)( const char *cmd_name, void (*function) (void) );
 
 	// For voice communications, set which clients hear eachother.
 	// NOTE: these functions take player entity indices (starting at 1).
@@ -255,7 +256,7 @@ typedef struct enginefuncs_s
 
 	void	*(*pfnSequenceGet)( const char *fileName, const char *entryName );
 	void	*(*pfnSequencePickSentence)( const char *groupName, int pickMethod, int *picked );
-	int	(*pfnGetFileSize)( char *filename );
+	int	(*pfnGetFileSize)( const char *filename );
 	unsigned int (*pfnGetApproxWavePlayLen)( const char *filepath );
 	int	(*pfnIsCareerMatch)( void );
 	int	(*pfnGetLocalizedStringLength)( const char *label );
@@ -273,10 +274,10 @@ typedef struct enginefuncs_s
 // Passed to pfnKeyValue
 typedef struct KeyValueData_s
 {
-	char	*szClassName;	// in: entity classname
-	char	*szKeyName;	// in: name of key
-	char	*szValue;		// in: value of key
-	long	fHandled;		// out: DLL sets to true if key-value pair was understood
+	const char	*szClassName;	// in: entity classname
+	const char	*szKeyName;	// in: name of key
+	const char	*szValue;		// in: value of key
+	int	fHandled;		// out: DLL sets to true if key-value pair was understood
 } KeyValueData;
 
 
@@ -354,7 +355,7 @@ typedef enum _fieldtypes
 	FIELD_TYPECOUNT		// MUST BE LAST
 } FIELDTYPE;
 
-#ifndef offsetof
+#if !defined(offsetof) && !defined(GNUC)
 #define offsetof(s,m)	(size_t)&(((s *)0)->m)
 #endif
 
@@ -373,13 +374,15 @@ typedef enum _fieldtypes
 typedef struct 
 {
 	FIELDTYPE		fieldType;
-	char		*fieldName;
+	const char		*fieldName;
 	int		fieldOffset;
 	short		fieldSize;
 	short		flags;
 } TYPEDESCRIPTION;
 
+#ifndef ARRAYSIZE
 #define ARRAYSIZE(p)	(sizeof(p)/sizeof(p[0]))
+#endif
 
 typedef struct 
 {
@@ -433,7 +436,7 @@ typedef struct
 
 	void	(*pfnPM_Move)( struct playermove_s *ppmove, qboolean server );
 	void	(*pfnPM_Init)( struct playermove_s *ppmove );
-	char	(*pfnPM_FindTextureType)( char *name );
+	char	(*pfnPM_FindTextureType)( const char *name );
 	void	(*pfnSetupVisibility)( struct edict_s *pViewEntity, struct edict_s *pClient, unsigned char **pvs, unsigned char **pas );
 	void	(*pfnUpdateClientData) ( const struct edict_s *ent, int sendweapons, struct clientdata_s *cd );
 	int	(*pfnAddToFullPack)( struct entity_state_s *state, int e, edict_t *ent, edict_t *host, int hostflags, int player, unsigned char *pSet );
diff --git a/engine/keydefs.h b/engine/keydefs.h
index ea22139f..5593d75a 100644
--- a/engine/keydefs.h
+++ b/engine/keydefs.h
@@ -12,7 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
-
+#pragma once
 #ifndef KEYDEFS_H
 #define KEYDEFS_H
 
@@ -130,4 +130,4 @@
 #define K_MOUSE4		244
 #define K_MOUSE5		245
 
-#endif//KEYDEFS_H
\ No newline at end of file
+#endif//KEYDEFS_H
diff --git a/engine/menu_int.h b/engine/menu_int.h
index 53b0725a..d907bd87 100644
--- a/engine/menu_int.h
+++ b/engine/menu_int.h
@@ -12,7 +12,7 @@ but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 */
-
+#pragma once
 #ifndef MENU_INT_H
 #define MENU_INT_H
 
@@ -155,7 +155,7 @@ typedef struct ui_enginefuncs_s
 	// menu interface is freezed at version 0.75
 	// new functions starts here 
 	float	(*pfnRandomFloat)( float flLow, float flHigh );	
-	long	(*pfnRandomLong)( long lLow, long lHigh );
+	int	(*pfnRandomLong)( int lLow, int lHigh );
 
 	void	(*pfnSetCursor)( void *hCursor );			// change cursor
 	int	(*pfnIsMapValid)( char *filename );
@@ -185,4 +185,4 @@ typedef struct
 
 typedef int (*MENUAPI)( UI_FUNCTIONS *pFunctionTable, ui_enginefuncs_t* engfuncs, ui_globalvars_t *pGlobals );
 
-#endif//MENU_INT_H
\ No newline at end of file
+#endif//MENU_INT_H
diff --git a/engine/physint.h b/engine/physint.h
index af923a00..2b4ac8f7 100644
--- a/engine/physint.h
+++ b/engine/physint.h
@@ -12,7 +12,7 @@ but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 */
-
+#pragma once
 #ifndef PHYSINT_H
 #define PHYSINT_H
 
@@ -111,4 +111,4 @@ typedef struct physics_interface_s
 	int		(*pfnRestoreDecal)( struct decallist_s *entry, edict_t *pEdict, qboolean adjacent );
 } physics_interface_t;
 
-#endif//PHYSINT_H
\ No newline at end of file
+#endif//PHYSINT_H
diff --git a/engine/progdefs.h b/engine/progdefs.h
index 74004a27..31cfb3cb 100644
--- a/engine/progdefs.h
+++ b/engine/progdefs.h
@@ -12,7 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
-
+#pragma once
 #ifndef PROGDEFS_H
 #define PROGDEFS_H
 
@@ -215,4 +215,4 @@ typedef struct entvars_s
 	edict_t		*euser4;
 } entvars_t;
 
-#endif//PROGDEFS_H
\ No newline at end of file
+#endif//PROGDEFS_H
diff --git a/engine/shake.h b/engine/shake.h
index c644a476..a3e49324 100644
--- a/engine/shake.h
+++ b/engine/shake.h
@@ -12,7 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
-
+#pragma once
 #ifndef SHAKE_H
 #define SHAKE_H
 
@@ -36,7 +36,7 @@ extern int gmsgFade;
 #define FFADE_OUT		0x0001		// Fade out (not in)
 #define FFADE_MODULATE	0x0002		// Modulate (don't blend)
 #define FFADE_STAYOUT	0x0004		// ignores the duration, stays faded out until new ScreenFade message received
-
+#define FFADE_LONGFADE	0x0008		// used to indicate the fade can be longer than 16 seconds (added for czero)
 
 // This structure is sent over the net to describe a screen fade event
 typedef struct
@@ -47,4 +47,4 @@ typedef struct
 	byte		r, g, b, a;	// fade to color ( max alpha )
 } ScreenFade;
 
-#endif // SHAKE_H
\ No newline at end of file
+#endif // SHAKE_H
diff --git a/engine/sprite.h b/engine/sprite.h
index afc81a4e..4368c1ac 100644
--- a/engine/sprite.h
+++ b/engine/sprite.h
@@ -12,7 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
-
+#pragma once
 #ifndef SPRITE_H
 #define SPRITE_H
 
@@ -99,4 +99,4 @@ typedef struct
 	frametype_t	type;
 } dframetype_t;
 
-#endif//SPRITE_H
\ No newline at end of file
+#endif//SPRITE_H
diff --git a/engine/studio.h b/engine/studio.h
index b5b709bb..88254c96 100644
--- a/engine/studio.h
+++ b/engine/studio.h
@@ -12,7 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
-
+#pragma once
 #ifndef STUDIO_H
 #define STUDIO_H
 
@@ -33,14 +33,14 @@ Studio models are position independent, so the cache manager can move them.
 // studio limits
 #define MAXSTUDIOTRIANGLES		32768	// max triangles per model
 #define MAXSTUDIOVERTS		4096	// max vertices per submodel
-#define MAXSTUDIOSEQUENCES		256	// total animation sequences
+#define MAXSTUDIOSEQUENCES		2048	// total animation sequences
 #define MAXSTUDIOSKINS		256	// total textures
 #define MAXSTUDIOSRCBONES		512	// bones allowed at source movement
 #define MAXSTUDIOBONES		128	// total bones actually used
 #define MAXSTUDIOMODELS		32	// sub-models per model
 #define MAXSTUDIOBODYPARTS		32	// body parts per submodel
 #define MAXSTUDIOGROUPS		16	// sequence groups (e.g. barney01.mdl, barney02.mdl, e.t.c)
-#define MAXSTUDIOANIMATIONS		512	// max frames per sequence
+#define MAXSTUDIOANIMATIONS		2048	// max frames per sequence
 #define MAXSTUDIOMESHES		256	// max textures per model
 #define MAXSTUDIOEVENTS		1024	// events per model
 #define MAXSTUDIOPIVOTS		256	// pivot points
@@ -213,11 +213,9 @@ typedef struct cache_user_s
 typedef struct
 {
 	char		label[32];	// textual name
-	char		name[64];		// file name
-	cache_user_t	cache;		// cache index pointer
-#ifndef __amd64
-	int		data;		// hack for group 0
-#endif
+	char		name[64];	// file name
+	int		unused1;	// was "cache"  - index pointer
+	int		unused2;	// was "data" -  hack for group 0
 } mstudioseqgroup_t;
 
 // sequence descriptions
diff --git a/make_sdk.bat b/make_sdk.bat
deleted file mode 100644
index 96602839..00000000
--- a/make_sdk.bat
+++ /dev/null
@@ -1,62 +0,0 @@
-@echo off
-color 5A
-echo 			 XashXT Group 2010 (C)
-echo 			   Create Xash3D SDK
-echo.
-
-if not exist D:\Xash3D\src_main\xash_sdk/ mkdir D:\Xash3D\src_main\xash_sdk\
-if not exist D:\Xash3D\src_main\xash_sdk\engine/ mkdir D:\Xash3D\src_main\xash_sdk\engine\
-if not exist D:\Xash3D\src_main\xash_sdk\common/ mkdir D:\Xash3D\src_main\xash_sdk\common\
-if not exist D:\Xash3D\src_main\xash_sdk\mainui/ mkdir D:\Xash3D\src_main\xash_sdk\mainui\
-if not exist D:\Xash3D\src_main\xash_sdk\mainui\legacy/ mkdir D:\Xash3D\src_main\xash_sdk\mainui\legacy
-if not exist D:\Xash3D\src_main\xash_sdk\utils/ mkdir D:\Xash3D\src_main\xash_sdk\utils\
-if not exist D:\Xash3D\src_main\xash_sdk\utils\makefont/ mkdir D:\Xash3D\src_main\xash_sdk\utils\makefont
-if not exist D:\Xash3D\src_main\xash_sdk\utils\vgui/ mkdir D:\Xash3D\src_main\xash_sdk\utils\vgui
-if not exist D:\Xash3D\src_main\xash_sdk\utils\vgui\include/ mkdir D:\Xash3D\src_main\xash_sdk\utils\vgui\include
-if not exist D:\Xash3D\src_main\xash_sdk\utils\vgui\lib/ mkdir D:\Xash3D\src_main\xash_sdk\utils\vgui\lib
-if not exist D:\Xash3D\src_main\xash_sdk\utils\vgui\lib\win32_vc6/ mkdir D:\Xash3D\src_main\xash_sdk\utils\vgui\lib\win32_vc6
-if not exist D:\Xash3D\src_main\xash_sdk\game_launch/ mkdir D:\Xash3D\src_main\xash_sdk\game_launch\
-if not exist D:\Xash3D\src_main\xash_sdk\cl_dll/ mkdir D:\Xash3D\src_main\xash_sdk\cl_dll\
-if not exist D:\Xash3D\src_main\xash_sdkcl_dll\hl/ mkdir D:\Xash3D\src_main\xash_sdk\cl_dll\hl\
-if not exist D:\Xash3D\src_main\xash_sdk\dlls/ mkdir D:\Xash3D\src_main\xash_sdk\dlls\
-if not exist D:\Xash3D\src_main\xash_sdk\dlls\wpn_shared/ mkdir D:\Xash3D\src_main\xash_sdk\dlls\wpn_shared\
-if not exist D:\Xash3D\src_main\xash_sdk\game_shared/ mkdir D:\Xash3D\src_main\xash_sdk\game_shared\
-if not exist D:\Xash3D\src_main\xash_sdk\pm_shared/ mkdir D:\Xash3D\src_main\xash_sdk\pm_shared\
-@copy /Y engine\*.h xash_sdk\engine\*.h
-@copy /Y game_launch\*.* xash_sdk\game_launch\*.*
-@copy /Y mainui\*.* xash_sdk\mainui\*.*
-@copy /Y mainui\legacy\*.* xash_sdk\mainui\legacy\*.*
-@copy /Y common\*.* xash_sdk\common\*.*
-@copy /Y cl_dll\*.* xash_sdk\cl_dll\*.*
-@copy /Y cl_dll\hl\*.* xash_sdk\cl_dll\hl\*.*
-@copy /Y dlls\*.* xash_sdk\dlls\*.*
-@copy /Y dlls\wpn_shared\*.* xash_sdk\dlls\wpn_shared\*.*
-@copy /Y utils\makefont\*.* xash_sdk\utils\makefont\*.*
-@copy /Y utils\vgui\include\*.* xash_sdk\utils\vgui\include\*.*
-@copy /Y utils\vgui\lib\win32_vc6\*.* xash_sdk\utils\vgui\lib\win32_vc6\*.*
-@copy /Y game_shared\*.* xash_sdk\game_shared\*.*
-@copy /Y pm_shared\*.* xash_sdk\pm_shared\*.*
-@copy /Y xash_sdk.dsw xash_sdk\xash_sdk.dsw
-echo 			     Prepare OK!
-echo 		     Please wait: creating SDK in progress
-C:\Progra~1\WinRar\rar a xash_sdk -dh -k -r -s -df -m5 @xash_sdk.lst >>makesdk.log
-if errorlevel 1 goto error
-if errorlevel 0 goto ok
-:ok
-cls
-echo 		     SDK was sucessfully created
-echo 		     and stored in RAR-chive "xash_sdk"
-echo 		      Press any key for exit. :-)
-if exist makesdk.log del /f /q makesdk.log
-exit
-:error
-echo 		    ******************************
-echo 		    ***********Error!*************
-echo 		    ******************************
-echo 		    *See makesdk.log for details**
-echo 		    ******************************
-echo 		    ******************************
-echo.
-echo 		      press any key for exit :-(
-pause>nul
-exit
\ No newline at end of file
diff --git a/pm_shared/pm_debug.c b/pm_shared/pm_debug.c
index 3baccaef..3b0879c7 100644
--- a/pm_shared/pm_debug.c
+++ b/pm_shared/pm_debug.c
@@ -23,8 +23,10 @@
 
 #include <string.h>
 
+#ifdef _MSC_VER
 #pragma warning(disable : 4244)
 #pragma warning(disable : 4305)
+#endif
 
 extern playermove_t *pmove;
 
diff --git a/pm_shared/pm_debug.h b/pm_shared/pm_debug.h
index 4959d165..6c91d62e 100644
--- a/pm_shared/pm_debug.h
+++ b/pm_shared/pm_debug.h
@@ -12,6 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
+#pragma once
 #ifndef PM_DEBUG_H
 #define PM_DEBUG_H
 
diff --git a/pm_shared/pm_defs.h b/pm_shared/pm_defs.h
index d29bff19..82480806 100644
--- a/pm_shared/pm_defs.h
+++ b/pm_shared/pm_defs.h
@@ -12,7 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
-
+#pragma once
 #ifndef PM_DEFS_H
 #define PM_DEFS_H
 
@@ -201,7 +201,7 @@ typedef struct playermove_s
 	pmtrace_t		(*PM_PlayerTrace)( float *start, float *end, int traceFlags, int ignore_pe );
 #endif
 	struct pmtrace_s	*(*PM_TraceLine)( float *start, float *end, int flags, int usehulll, int ignore_pe );
-	long		(*RandomLong)( long lLow, long lHigh );
+	int		(*RandomLong)( int lLow, int lHigh );
 	float		(*RandomFloat)( float flLow, float flHigh );
 	int		(*PM_GetModelType)( struct model_s *mod );
 	void		(*PM_GetModelBounds)( struct model_s *mod, float *mins, float *maxs );
diff --git a/pm_shared/pm_info.h b/pm_shared/pm_info.h
index 321527f2..9a971d53 100644
--- a/pm_shared/pm_info.h
+++ b/pm_shared/pm_info.h
@@ -12,6 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
+#pragma once
 #ifndef PM_INFO_H
 #define PM_INFO_H
 
diff --git a/pm_shared/pm_materials.h b/pm_shared/pm_materials.h
index cd1051d2..9bc71b72 100644
--- a/pm_shared/pm_materials.h
+++ b/pm_shared/pm_materials.h
@@ -12,6 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
+#pragma once
 #ifndef PM_MATERIALS_H
 #define PM_MATERIALS_H
 
@@ -28,4 +29,5 @@
 #define CHAR_TEX_COMPUTER		'P'
 #define CHAR_TEX_GLASS		'Y'
 #define CHAR_TEX_FLESH		'F'
+#define CHAR_TEX_SNOW		'N'
 #endif//PM_MATERIALS_H
diff --git a/pm_shared/pm_math.c b/pm_shared/pm_math.c
index 3718dc63..4bb4b93f 100644
--- a/pm_shared/pm_math.c
+++ b/pm_shared/pm_math.c
@@ -25,7 +25,9 @@
 // fall over
 #define	ROLL	2 
 
+#ifdef _MSC_VER
 #pragma warning(disable : 4244)
+#endif
 
 vec3_t vec3_origin = { 0,0,0 };
 int nanmask = 255 << 23;
@@ -237,7 +239,7 @@ float AngleBetweenVectors( const vec3_t v1, const vec3_t v2 )
 	if( !l1 || !l2 )
 		return 0.0f;
 
-	angle = acos( DotProduct( v1, v2 ) ) / ( l1 * l2 );
+	angle = acos( DotProduct( v1, v2 ) / ( l1 * l2 ) );
 	angle = ( angle  * 180.0f ) / M_PI;
 
 	return angle;
diff --git a/pm_shared/pm_movevars.h b/pm_shared/pm_movevars.h
index 35fa5b4f..61eb06fd 100644
--- a/pm_shared/pm_movevars.h
+++ b/pm_shared/pm_movevars.h
@@ -6,6 +6,7 @@
 //=============================================================================
 
 // pm_movevars.h
+#pragma once
 #if !defined( PM_MOVEVARSH )
 #define PM_MOVEVARSH
 
diff --git a/pm_shared/pm_shared.c b/pm_shared/pm_shared.c
index de855a50..9aed8093 100644
--- a/pm_shared/pm_shared.c
+++ b/pm_shared/pm_shared.c
@@ -27,16 +27,20 @@
 #include <stdlib.h> // atoi
 #include <ctype.h>  // isspace
 
+int g_bhopcap = 1;
+
 #ifdef CLIENT_DLL
-	// Spectator Mode
-	int	iJumpSpectator;
-extern	float	vJumpOrigin[3];
-extern	float	vJumpAngles[3];
+// Spectator Mode
+int iJumpSpectator;
+extern float vJumpOrigin[3];
+extern float vJumpAngles[3];
 #endif
 
 static int pm_shared_initialized = 0;
 
+#ifdef _MSC_VER
 #pragma warning( disable : 4305 )
+#endif
 
 playermove_t *pmove = NULL;
 
@@ -87,8 +91,13 @@ playermove_t *pmove = NULL;
 
 #define PLAYER_LONGJUMP_SPEED		350 // how fast we longjump
 
+#define PLAYER_DUCKING_MULTIPLIER	0.333
+
 // double to float warning
+#ifdef _MSC_VER
 #pragma warning(disable : 4244)
+#endif
+
 #define max(a, b)  (((a) > (b)) ? (a) : (b))
 #define min(a, b)  (((a) < (b)) ? (a) : (b))
 // up / down
@@ -547,7 +556,7 @@ void PM_UpdateStepSound( void )
 	float fvol;
 	vec3_t knee;
 	vec3_t feet;
-	vec3_t center;
+	//vec3_t center;
 	float height;
 	float speed;
 	float velrun;
@@ -590,7 +599,7 @@ void PM_UpdateStepSound( void )
 	{
 		fWalking = speed < velrun;		
 
-		VectorCopy( pmove->origin, center );
+		//VectorCopy( pmove->origin, center );
 		VectorCopy( pmove->origin, knee );
 		VectorCopy( pmove->origin, feet );
 
@@ -1060,7 +1069,7 @@ Only used by players.  Moves along the ground when player is a MOVETYPE_WALK.
 */
 void PM_WalkMove()
 {
-	int clip;
+	//int clip;
 	int oldonground;
 	int i;
 
@@ -1070,7 +1079,7 @@ void PM_WalkMove()
 	vec3_t wishdir;
 	float wishspeed;
 
-	vec3_t dest, start;
+	vec3_t dest; //, start;
 	vec3_t original, originalvel;
 	vec3_t down, downvel;
 	float downdist, updist;
@@ -1133,7 +1142,7 @@ void PM_WalkMove()
 	dest[2] = pmove->origin[2];
 
 	// first try moving directly to the next spot
-	VectorCopy( dest, start );
+	//VectorCopy( dest, start );
 	trace = pmove->PM_PlayerTrace( pmove->origin, dest, PM_NORMAL, -1 );
 	// If we made it all the way, then copy trace end
 	//  as new player position.
@@ -1156,7 +1165,8 @@ void PM_WalkMove()
 	VectorCopy( pmove->velocity, originalvel ); // velocity.
 
 	// Slide move
-	clip = PM_FlyMove();
+	//clip = PM_FlyMove();
+	PM_FlyMove();
 
 	// Copy the results out
 	VectorCopy( pmove->origin, down );
@@ -1181,7 +1191,8 @@ void PM_WalkMove()
 	}
 
 	// slide move the rest of the way.
-	clip = PM_FlyMove();
+	//clip = PM_FlyMove();
+	PM_FlyMove();
 
 	// Now try going back down from the end point
 	//  press down the stepheight
@@ -1992,8 +2003,8 @@ void PM_Duck( void )
 	int buttonsChanged = ( pmove->oldbuttons ^ pmove->cmd.buttons );	// These buttons have changed this frame
 	int nButtonPressed = buttonsChanged & pmove->cmd.buttons;		// The changed ones still down are "pressed"
 
-	int duckchange = buttonsChanged & IN_DUCK ? 1 : 0;
-	int duckpressed = nButtonPressed & IN_DUCK ? 1 : 0;
+	//int duckchange = buttonsChanged & IN_DUCK ? 1 : 0;
+	//int duckpressed = nButtonPressed & IN_DUCK ? 1 : 0;
 
 	if( pmove->cmd.buttons & IN_DUCK )
 	{
@@ -2017,9 +2028,9 @@ void PM_Duck( void )
 
 	if( pmove->flags & FL_DUCKING )
 	{
-		pmove->cmd.forwardmove *= 0.333;
-		pmove->cmd.sidemove *= 0.333;
-		pmove->cmd.upmove *= 0.333;
+		pmove->cmd.forwardmove *= PLAYER_DUCKING_MULTIPLIER;
+		pmove->cmd.sidemove *= PLAYER_DUCKING_MULTIPLIER;
+		pmove->cmd.upmove *= PLAYER_DUCKING_MULTIPLIER;
 	}
 
 	if( ( pmove->cmd.buttons & IN_DUCK ) || ( pmove->bInDuck ) || ( pmove->flags & FL_DUCKING ) )
@@ -2110,16 +2121,24 @@ void PM_LadderMove( physent_t *pLadder )
 	{
 		float forward = 0, right = 0;
 		vec3_t vpn, v_right;
+		float flSpeed = MAX_CLIMB_SPEED;
+
+		// they shouldn't be able to move faster than their maxspeed
+		if( flSpeed > pmove->maxspeed )
+			flSpeed = pmove->maxspeed;
 
 		AngleVectors( pmove->angles, vpn, v_right, NULL );
+
+		if( pmove->flags & FL_DUCKING )
+			flSpeed *= PLAYER_DUCKING_MULTIPLIER;
 		if( pmove->cmd.buttons & IN_BACK )
-			forward -= MAX_CLIMB_SPEED;
+			forward -= flSpeed;
 		if( pmove->cmd.buttons & IN_FORWARD )
-			forward += MAX_CLIMB_SPEED;
+			forward += flSpeed;
 		if( pmove->cmd.buttons & IN_MOVELEFT )
-			right -= MAX_CLIMB_SPEED;
+			right -= flSpeed;
 		if( pmove->cmd.buttons & IN_MOVERIGHT )
-			right += MAX_CLIMB_SPEED;
+			right += flSpeed;
 
 		if( pmove->cmd.buttons & IN_JUMP )
 		{
@@ -2251,6 +2270,7 @@ void PM_AddGravity()
 	pmove->basevelocity[2] = 0;
 	PM_CheckVelocity();
 }
+
 /*
 ============
 PM_PushEntity
@@ -2538,7 +2558,8 @@ void PM_Jump( void )
 	// In the air now.
 	pmove->onground = -1;
 
-	PM_PreventMegaBunnyJumping();
+	if( g_bhopcap )
+		PM_PreventMegaBunnyJumping();
 
 	if( tfc )
 	{
diff --git a/pm_shared/pm_shared.h b/pm_shared/pm_shared.h
index 124d37ba..c315353b 100644
--- a/pm_shared/pm_shared.h
+++ b/pm_shared/pm_shared.h
@@ -12,7 +12,7 @@
 *   without written permission from Valve LLC.
 *
 ****/
-
+#pragma once
 #ifndef PM_SHARED_H
 #define PM_SHARED_H
 
diff --git a/release.bat b/release.bat
deleted file mode 100644
index dae2d16c..00000000
--- a/release.bat
+++ /dev/null
@@ -1,42 +0,0 @@
-@echo off
-
-set MSDEV=BuildConsole
-set CONFIG=/ShowTime /ShowAgent /nologo /cfg=
-set MSDEV=msdev
-set CONFIG=/make 
-set build_type=release
-set BUILD_ERROR=
-call vcvars32
-
-%MSDEV% engine/engine.dsp %CONFIG%"engine - Win32 Release" %build_target%
-if errorlevel 1 set BUILD_ERROR=1
-
-%MSDEV% mainui/mainui.dsp %CONFIG%"mainui - Win32 Release" %build_target%
-if errorlevel 1 set BUILD_ERROR=1
-
-if "%BUILD_ERROR%"=="" goto build_ok
-
-echo *********************
-echo *********************
-echo *** Build Errors! ***
-echo *********************
-echo *********************
-echo press any key to exit
-echo *********************
-pause>nul
-goto done
-
-
-@rem
-@rem Successful build
-@rem
-:build_ok
-
-rem //delete log files
-if exist engine\engine.plg del /f /q engine\engine.plg
-if exist mainui\mainui.plg del /f /q mainui\mainui.plg
-
-echo
-echo 	     Build succeeded!
-echo
-:done
\ No newline at end of file
diff --git a/utils/false_vgui/include/VGUI.h b/utils/false_vgui/include/VGUI.h
new file mode 100644
index 00000000..c33e0589
--- /dev/null
+++ b/utils/false_vgui/include/VGUI.h
@@ -0,0 +1,95 @@
+//========= Copyright � 1996-2002, Valve LLC, All rights reserved. ============
+//
+// Purpose: 
+//
+// $NoKeywords: $
+//=============================================================================
+
+#ifndef VGUI_H
+#define VGUI_H
+
+//If you are going to add stuff to the vgui core...
+//
+//Keep it simple.
+//
+//Never put code in a header.
+//
+//The name of the class is the name of the the file
+//
+//Each class gets its own .cpp file for its definition and a .h for its header. Helper
+//classes can be used but only within the .cpp and not referenceable from anywhere else.
+//
+//Don't add unneeded files. Keep the API clean.
+//
+//No platform specific code in vgui\lib-src\vgui dir. Code in vgui\lib-src\vgui should 
+//only include from vgui\include or standard C includes. ie, if I see windows.h included
+//anywhere but vgui\lib-src\win32 I will hunt you down and kill you. Don't give me any crap
+//that mfc is platform inspecific.
+//
+//Always use <> and not "" for includes
+//
+//Use minimum dependencies in headers. Don't include another header if you can get away
+//with forward declaring (which is usually the case)
+//
+//No macros in headers. They are tools of satan. This also means no use of DEFINEs, use enum
+//
+//Minimize global functions
+//
+//No global variables.
+//
+//Panel is getting pretty plump, try and avoid adding junk to it if you can
+
+//TODO: Look and Feel support
+//		add Panel::setPaintProxy, if _paintProxy exists, it calls _paintProxy->paint 
+//		instead of Panel::paint. Components should implement their painting in a seperate
+//      plugin class. Perhaps to encourage this, Panel::paint should just go away completely
+//      The other option is to have Panel have the interface Paintable
+//      class Paintable
+//      {
+//      public:
+//			virtual void paint()=0;
+//      };
+//      Then a component can implement its paint in the class itself and then call 
+//		setPaintProxy(this). If this is the case _paintProxy->paint should always be called
+//      and never Panel::paint from within paintTraverse
+//TODO: Figure out the 'Valve' Look and Feel and implement that instead of a the Java one
+//TODO: Determine ownership policy for Borders, Layouts, etc..
+//TODO: tooltips support
+//TODO: ComboKey (hot key support)
+//TODO: add Background.cpp, remove paintBackground from all components
+//		Panel implements setBackground, Panel::paintBackground calls _background->paintBackground
+//		similiar to the way Border works. 
+//TODO: Builtin components should never overide paintBackground, only paint
+//TODO: All protected members should be converted to private
+//TODO: All member variables should be moved to the top of the class prototype
+//TODO: All private methods should be prepended with private
+//TODO: Use of word internal in method names is not consistent and confusing
+//TODO: Cleanup so bullshit publics are properly named, maybe even figure out
+//      a naming convention for them
+//TODO: Breakup InputSignal into logical pieces
+//TODO: Button is in a state of disarray, it should have ButtonModel support
+//TODO: get rid of all the stupid strdup laziness, convert to vgui_strdup
+//TODO: actually figure out policy on String and implement it consistently
+//TODO: implement createLayoutInfo for other Layouts than need it
+//TODO: BorderLayout should have option for a null LayoutInfo defaulting to center
+//TODO: SurfaceBase should go away, put it in Surface
+//TODO: ActionSignals and other Signals should just set a flag when they fire.
+//		then App can come along later and fire all the signals
+//TODO: Change all method naming to starting with a capital letter.
+
+#ifdef _WIN32
+# define VGUIAPI __declspec( dllexport )
+#else
+# define VGUIAPI  __attribute__ ((visibility("default")))
+#include <sys/types.h> // size_t define
+#endif
+
+#define null 0L
+
+typedef unsigned char  uchar;
+typedef unsigned short ushort;
+typedef unsigned int   uint;
+typedef unsigned long  ulong;
+
+#endif
+
diff --git a/utils/false_vgui/include/VGUI_App.h b/utils/false_vgui/include/VGUI_App.h
new file mode 100644
index 00000000..6e70f909
--- /dev/null
+++ b/utils/false_vgui/include/VGUI_App.h
@@ -0,0 +1,130 @@
+//========= Copyright � 1996-2002, Valve LLC, All rights reserved. ============
+//
+// Purpose: 
+//
+// $NoKeywords: $
+//=============================================================================
+
+#ifndef VGUI_APP_H
+#define VGUI_APP_H
+
+#include<VGUI.h>
+#include<VGUI_MouseCode.h>
+#include<VGUI_KeyCode.h>
+#include<VGUI_Dar.h>
+#include<VGUI_Cursor.h>
+
+namespace vgui
+{
+
+class Panel;
+class TickSignal;
+class Scheme;
+class TickSignal;
+class SurfaceBase;
+
+class VGUIAPI App
+{
+public:
+	App() {}
+	App(bool externalMain) {}
+public:
+	static App* getInstance() {return 0;}
+	//TODO: the public and public bullshit are all messed up, need to organize
+	//TODO: actually all of the access needs to be properly thought out while you are at it
+public:
+	virtual void    start() {}
+	virtual void    stop() {}
+	virtual void    externalTick() {}
+	virtual bool    wasMousePressed(MouseCode code,Panel* panel) {return false;}
+	virtual bool    wasMouseDoublePressed(MouseCode code,Panel* panel) {return false;}
+	virtual bool    isMouseDown(MouseCode code,Panel* panel) {return false;}
+	virtual bool    wasMouseReleased(MouseCode code,Panel* panel) {return false;}
+	virtual bool    wasKeyPressed(KeyCode code,Panel* panel) {return false;}
+	virtual bool    isKeyDown(KeyCode code,Panel* panel) {return false;}
+	virtual bool    wasKeyTyped(KeyCode code,Panel* panel) {return false;}
+	virtual bool    wasKeyReleased(KeyCode code,Panel* panel) {return false;}
+	virtual void    addTickSignal(TickSignal* s) {}
+	virtual void    setCursorPos(int x,int y) {}
+	virtual void    getCursorPos(int& x,int& y) {}
+	virtual void    setMouseCapture(Panel* panel) {}
+	virtual void    setMouseArena(int x0,int y0,int x1,int y1,bool enabled) {}
+	virtual void    setMouseArena(Panel* panel) {}
+	virtual void    requestFocus(Panel* panel) {}
+	virtual Panel*  getFocus() {return 0;}
+	virtual void    repaintAll() {}
+	virtual void    setScheme(Scheme* scheme) {}
+	virtual Scheme* getScheme() {return 0;}
+	virtual void    enableBuildMode() {}
+	virtual long    getTimeMillis() {return 0;}
+	virtual char    getKeyCodeChar(KeyCode code,bool shifted) {return '\0';}
+	virtual void    getKeyCodeText(KeyCode code,char* buf,int buflen) {}
+	virtual int     getClipboardTextCount() {return 0;}
+	virtual void    setClipboardText(const char* text,int textLen) {}
+	virtual int     getClipboardText(int offset,char* buf,int bufLen) {return 0;}
+	virtual void    reset() {}
+	virtual void    internalSetMouseArena(int x0,int y0,int x1,int y1,bool enabled) {}
+	virtual bool    setRegistryString(const char* key,const char* value) {return false;}
+	virtual bool    getRegistryString(const char* key,char* value,int valueLen) {return false;}
+	virtual bool    setRegistryInteger(const char* key,int value) {return false;}
+	virtual bool    getRegistryInteger(const char* key,int& value) {return false;}
+	virtual void    setCursorOveride(Cursor* cursor) {}
+	virtual Cursor* getCursorOveride() {return 0;}
+	virtual void    setMinimumTickMillisInterval(int interval) {}
+public: //bullshit public stuff
+	virtual void main(int argc,char* argv[])=0;
+	virtual void run() {}
+	virtual void internalCursorMoved(int x,int y,SurfaceBase* surfaceBase) {} //expects input in surface space
+	virtual void internalMousePressed(MouseCode code,SurfaceBase* surfaceBase) {}
+	virtual void internalMouseDoublePressed(MouseCode code,SurfaceBase* surfaceBase) {}
+	virtual void internalMouseReleased(MouseCode code,SurfaceBase* surfaceBase) {}
+	virtual void internalMouseWheeled(int delta,SurfaceBase* surfaceBase) {}
+	virtual void internalKeyPressed(KeyCode code,SurfaceBase* surfaceBase) {}
+	virtual void internalKeyTyped(KeyCode code,SurfaceBase* surfaceBase) {}
+	virtual void internalKeyReleased(KeyCode code,SurfaceBase* surfaceBase) {}
+private:
+	virtual void init() {}
+	virtual void updateMouseFocus(int x,int y,SurfaceBase* surfaceBase) {}
+	virtual void setMouseFocus(Panel* newMouseFocus) {}
+protected: 
+	virtual void surfaceBaseCreated(SurfaceBase* surfaceBase) {}
+	virtual void surfaceBaseDeleted(SurfaceBase* surfaceBase) {}
+	virtual void platTick() {}
+	virtual void internalTick() {}
+protected:
+	static App* _instance;
+protected:
+	bool              _running;
+	bool              _externalMain;
+	Dar<SurfaceBase*> _surfaceBaseDar;
+	Panel*            _keyFocus;
+	Panel*            _oldMouseFocus;
+	Panel*            _mouseFocus;
+	Panel*            _mouseCapture;
+	Panel*            _wantedKeyFocus;
+	bool              _mousePressed[MOUSE_LAST];
+	bool              _mouseDoublePressed[MOUSE_LAST];
+	bool              _mouseDown[MOUSE_LAST];
+	bool              _mouseReleased[MOUSE_LAST];
+	bool              _keyPressed[KEY_LAST];
+	bool              _keyTyped[KEY_LAST];
+	bool              _keyDown[KEY_LAST];
+	bool              _keyReleased[KEY_LAST];
+	Dar<TickSignal*>  _tickSignalDar;
+	Scheme*           _scheme;
+	bool              _buildMode;
+	bool              _wantedBuildMode;
+	Panel*            _mouseArenaPanel;
+	Cursor*           _cursor[Cursor::dc_last];
+	Cursor*           _cursorOveride;
+private:
+	long              _nextTickMillis;
+	long              _minimumTickMillisInterval;
+	friend class SurfaceBase;
+};
+}
+
+#endif
+
+
+
diff --git a/utils/false_vgui/include/VGUI_Color.h b/utils/false_vgui/include/VGUI_Color.h
new file mode 100644
index 00000000..f3fec5c6
--- /dev/null
+++ b/utils/false_vgui/include/VGUI_Color.h
@@ -0,0 +1,44 @@
+//========= Copyright � 1996-2002, Valve LLC, All rights reserved. ============
+//
+// Purpose: 
+//
+// $NoKeywords: $
+//=============================================================================
+
+#ifndef VGUI_COLOR_H
+#define VGUI_COLOR_H
+
+#include<VGUI.h>
+#include<VGUI_Scheme.h>
+
+//TODO: rename getColor(r,g,b,a) to getRGBA(r,g,b,a)
+//TODO: rename setColor(r,g,b,a) to setRGBA(r,g,b,a)
+//TODO: rename getColor(sc) to getSchemeColor(sc)
+//TODO: rename setColor(sc) to setSchemeColor(sc)
+
+namespace vgui
+{
+
+class VGUIAPI Color
+{
+private:
+	uchar               _color[4];
+	Scheme::SchemeColor _schemeColor;
+public:
+	Color() {}
+	Color(int r,int g,int b,int a) {}
+	Color(Scheme::SchemeColor sc) {}
+private:
+	virtual void init() {}
+public:
+	virtual void setColor(int r,int g,int b,int a) {}
+	virtual void setColor(Scheme::SchemeColor sc) {}
+	virtual void getColor(int& r,int& g,int& b,int& a) {}
+	virtual void getColor(Scheme::SchemeColor& sc) {}
+	virtual int  operator[](int index) {return 0;}
+};
+
+}
+
+
+#endif
diff --git a/utils/false_vgui/include/VGUI_Cursor.h b/utils/false_vgui/include/VGUI_Cursor.h
new file mode 100644
index 00000000..8419e2dd
--- /dev/null
+++ b/utils/false_vgui/include/VGUI_Cursor.h
@@ -0,0 +1,57 @@
+//========= Copyright � 1996-2002, Valve LLC, All rights reserved. ============
+//
+// Purpose: 
+//
+// $NoKeywords: $
+//=============================================================================
+
+#ifndef VGUI_CURSOR_H
+#define VGUI_CURSOR_H
+
+#include<VGUI.h>
+
+namespace vgui
+{
+
+class Bitmap;
+
+class VGUIAPI Cursor
+{
+public:
+	enum DefaultCursor
+	{
+		dc_user,
+		dc_none,
+		dc_arrow,
+		dc_ibeam,
+		dc_hourglass,
+		dc_crosshair,
+		dc_up,
+		dc_sizenwse,
+		dc_sizenesw,
+		dc_sizewe,
+		dc_sizens,
+		dc_sizeall,
+		dc_no,
+		dc_hand,
+		dc_last
+	};
+private:
+	int           _hotspot[2];
+	Bitmap*       _bitmap;
+	DefaultCursor _dc;
+public:
+	Cursor(DefaultCursor dc) {}
+	Cursor(Bitmap* bitmap,int hotspotX,int hotspotY) {}
+public:
+	virtual void getHotspot(int& x,int& y) {}
+private:
+	virtual void privateInit(Bitmap* bitmap,int hotspotX,int hotspotY) {}
+public:
+	virtual Bitmap*       getBitmap() {return 0;}
+	virtual DefaultCursor getDefaultCursor() {return dc_none;}
+};
+
+}
+
+#endif
diff --git a/utils/false_vgui/include/VGUI_Dar.h b/utils/false_vgui/include/VGUI_Dar.h
new file mode 100644
index 00000000..6f8eb513
--- /dev/null
+++ b/utils/false_vgui/include/VGUI_Dar.h
@@ -0,0 +1,194 @@
+//========= Copyright � 1996-2002, Valve LLC, All rights reserved. ============
+//
+// Purpose: 
+//
+// $NoKeywords: $
+//=============================================================================
+
+#ifndef VGUI_DAR_H
+#define VGUI_DAR_H
+
+#include<stdlib.h>
+#include<string.h>
+#include<VGUI.h>
+
+
+
+namespace vgui
+{
+
+//Simple lightweight dynamic array implementation
+template<class ELEMTYPE> class VGUIAPI Dar
+{
+public:
+	Dar()
+	{
+		_count=0;
+		_capacity=0;
+		_data=null;
+		ensureCapacity(4);
+	}
+	Dar(int initialCapacity)
+	{
+		_count=0;
+		_capacity=0;
+		_data=null;
+		ensureCapacity(initialCapacity);
+	}
+public:
+	void ensureCapacity(int wantedCapacity)
+	{
+		if(wantedCapacity<=_capacity){return;}
+
+		//double capacity until it is >= wantedCapacity
+		//this could be done with math, but iterative is just so much more fun
+		int newCapacity=_capacity;
+		if(newCapacity==0){newCapacity=1;}
+		while(newCapacity<wantedCapacity){newCapacity*=2;}
+
+		//allocate and zero newData
+		ELEMTYPE* newData=new ELEMTYPE[newCapacity]; 
+		if(newData==null){exit(0);return;}
+		memset(newData,0,sizeof(ELEMTYPE)*newCapacity);
+		_capacity=newCapacity;
+   
+		//copy data into newData
+		for(int i=0;i<_count;i++){newData[i]=_data[i];}
+
+		delete[] _data;
+		_data=newData;
+	}
+	void setCount(int count)
+	{
+		if((count<0)||(count>_capacity))
+		{
+			return;
+		}
+		_count=count;
+	}
+	int getCount()
+	{
+		return _count;
+	}
+	void addElement(ELEMTYPE elem)
+	{
+		ensureCapacity(_count+1);
+		_data[_count]=elem;
+		_count++;
+	}
+	bool hasElement(ELEMTYPE elem)
+	{
+		for(int i=0;i<_count;i++)
+		{
+			if(_data[i]==elem)
+			{
+				return true;
+			}
+		}
+	return false;
+	}
+	void putElement(ELEMTYPE elem)
+	{
+		if(hasElement(elem))
+		{
+			return;
+		}
+		addElement(elem);
+	}
+	void insertElementAt(ELEMTYPE elem,int index)
+	{
+		if((index<0)||(index>_count))
+		{
+			return;
+		}
+		if((index==_count)||(_count==0))
+		{
+			addElement(elem);
+		}
+		else
+		{
+			addElement(elem); //just to make sure it is big enough
+			for(int i=_count-1;i>index;i--)
+			{
+				_data[i]=_data[i-1];
+			}
+			_data[index]=elem;
+		}
+	}
+	void setElementAt(ELEMTYPE elem,int index)
+	{
+		if((index<0)||(index>=_count))
+		{
+			return;
+		}
+		_data[index]=elem;
+	}
+	void removeElementAt(int index)
+	{
+		if((index<0)||(index>=_count))
+		{
+			return;
+		}
+   
+		//slide everything to the right of index, left one.
+		for(int i=index;i<(_count-1);i++)
+		{
+			_data[i]=_data[i+1];
+		}
+		_count--;
+	} 
+	void removeElement(ELEMTYPE elem)
+	{
+		for(int i=0;i<_count;i++)
+		{
+			if(_data[i]==elem)
+			{
+				removeElementAt(i);
+				break;
+			}
+		}
+	}
+	void removeAll()
+	{
+		_count=0;
+	}
+	ELEMTYPE operator[](int index)
+	{
+		if((index<0)||(index>=_count))
+		{
+			return null;
+		}
+		return _data[index];
+	}
+protected:
+	int       _count;
+	int       _capacity;
+	ELEMTYPE* _data;
+};
+
+#ifdef _WIN32
+//forward referencing all the template types used so they get exported
+template class VGUIAPI Dar<char>;
+template class VGUIAPI Dar<char*>;
+template class VGUIAPI Dar<int>;
+template class VGUIAPI Dar<class Button*>;
+template class VGUIAPI Dar<class SurfaceBase*>;
+template class VGUIAPI Dar<class InputSignal*>;
+template class VGUIAPI Dar<class FocusChangeSignal*>;
+template class VGUIAPI Dar<class FrameSignal*>;
+template class VGUIAPI Dar<class ActionSignal*>;
+template class VGUIAPI Dar<class IntChangeSignal*>;
+template class VGUIAPI Dar<class TickSignal*>;
+template class VGUIAPI Dar<class Dar<char>*>;
+template class VGUIAPI Dar<class Frame*>;
+template class VGUIAPI Dar<class DesktopIcon*>;
+template class VGUIAPI Dar<class ChangeSignal*>;
+template class VGUIAPI Dar<class Panel*>;
+template class VGUIAPI Dar<class Label*>;
+template class VGUIAPI Dar<class RepaintSignal*>;
+#endif
+
+}
+
+
+#endif
\ No newline at end of file
diff --git a/utils/false_vgui/include/VGUI_KeyCode.h b/utils/false_vgui/include/VGUI_KeyCode.h
new file mode 100644
index 00000000..b6aea363
--- /dev/null
+++ b/utils/false_vgui/include/VGUI_KeyCode.h
@@ -0,0 +1,126 @@
+//========= Copyright � 1996-2002, Valve LLC, All rights reserved. ============
+//
+// Purpose: 
+//
+// $NoKeywords: $
+//=============================================================================
+
+#ifndef VGUI_KEYCODE_H
+#define VGUI_KEYCODE_H
+
+#include<VGUI.h>
+
+namespace vgui
+{
+enum VGUIAPI KeyCode
+{
+	KEY_0=0,
+	KEY_1,
+	KEY_2,
+	KEY_3,
+	KEY_4,
+	KEY_5,
+	KEY_6,
+	KEY_7,
+	KEY_8,
+	KEY_9,
+	KEY_A,
+	KEY_B,
+	KEY_C,
+	KEY_D,
+	KEY_E,
+	KEY_F,
+	KEY_G,
+	KEY_H,
+	KEY_I,
+	KEY_J,
+	KEY_K,
+	KEY_L,
+	KEY_M,
+	KEY_N,
+	KEY_O,
+	KEY_P,
+	KEY_Q,
+	KEY_R,
+	KEY_S,
+	KEY_T,
+	KEY_U,
+	KEY_V,
+	KEY_W,
+	KEY_X,
+	KEY_Y,
+	KEY_Z,
+	KEY_PAD_0,
+	KEY_PAD_1,
+	KEY_PAD_2,
+	KEY_PAD_3,
+	KEY_PAD_4,
+	KEY_PAD_5,
+	KEY_PAD_6,
+	KEY_PAD_7,
+	KEY_PAD_8,
+	KEY_PAD_9,
+	KEY_PAD_DIVIDE,
+	KEY_PAD_MULTIPLY,
+	KEY_PAD_MINUS,
+	KEY_PAD_PLUS,
+	KEY_PAD_ENTER,
+	KEY_PAD_DECIMAL,
+	KEY_LBRACKET,
+	KEY_RBRACKET,
+	KEY_SEMICOLON,
+	KEY_APOSTROPHE,
+	KEY_BACKQUOTE,
+	KEY_COMMA,
+	KEY_PERIOD,
+	KEY_SLASH,
+	KEY_BACKSLASH,
+	KEY_MINUS,
+	KEY_EQUAL,
+	KEY_ENTER,
+	KEY_SPACE,
+	KEY_BACKSPACE,
+	KEY_TAB,
+	KEY_CAPSLOCK,
+	KEY_NUMLOCK,
+	KEY_ESCAPE,
+	KEY_SCROLLLOCK,
+	KEY_INSERT,
+	KEY_DELETE,
+	KEY_HOME,
+	KEY_END,
+	KEY_PAGEUP,
+	KEY_PAGEDOWN,
+	KEY_BREAK,
+	KEY_LSHIFT,
+	KEY_RSHIFT,
+	KEY_LALT,
+	KEY_RALT,
+	KEY_LCONTROL,
+	KEY_RCONTROL,
+	KEY_LWIN,
+	KEY_RWIN,
+	KEY_APP,
+	KEY_UP,
+	KEY_LEFT,
+	KEY_DOWN,
+	KEY_RIGHT,
+	KEY_F1,
+	KEY_F2,
+	KEY_F3,
+	KEY_F4,
+	KEY_F5,
+	KEY_F6,
+	KEY_F7,
+	KEY_F8,
+	KEY_F9,
+	KEY_F10,
+	KEY_F11,
+	KEY_F12,
+	KEY_LAST
+};
+}
+
+
+#endif
+
diff --git a/utils/false_vgui/include/VGUI_MouseCode.h b/utils/false_vgui/include/VGUI_MouseCode.h
new file mode 100644
index 00000000..2de259db
--- /dev/null
+++ b/utils/false_vgui/include/VGUI_MouseCode.h
@@ -0,0 +1,24 @@
+//========= Copyright � 1996-2002, Valve LLC, All rights reserved. ============
+//
+// Purpose: 
+//
+// $NoKeywords: $
+//=============================================================================
+
+#ifndef VGUI_MOUSECODE_H
+#define VGUI_MOUSECODE_H
+
+#include<VGUI.h>
+
+namespace vgui
+{
+enum VGUIAPI MouseCode
+{
+	MOUSE_LEFT=0,
+	MOUSE_RIGHT,
+	MOUSE_MIDDLE,
+	MOUSE_LAST
+};
+}
+
+#endif
diff --git a/utils/false_vgui/include/VGUI_Panel.h b/utils/false_vgui/include/VGUI_Panel.h
new file mode 100644
index 00000000..bec7ac25
--- /dev/null
+++ b/utils/false_vgui/include/VGUI_Panel.h
@@ -0,0 +1,229 @@
+//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
+//
+// Purpose: 
+//
+// $NoKeywords: $
+//=============================================================================
+
+#ifndef VGUI_PANEL_H
+#define VGUI_PANEL_H
+
+
+/*
+
+TODO:
+
+Maybe have the border know who they are added to.
+A border can only be added to 1 thing, and will be
+removed from the other. That way they can actually
+be memory managed. Also do Layout's this way too.
+
+TODO:
+	outlinedRect should have a thickness arg
+
+*/
+
+					 
+#include<VGUI.h>
+#include<VGUI_Dar.h>
+#include<VGUI_Scheme.h>
+#include<VGUI_Color.h>
+#include<VGUI_Cursor.h>
+#include <VGUI_MouseCode.h>
+#include <VGUI_KeyCode.h>
+//#include <VGUI_RepaintSignal.h>
+
+namespace vgui
+{
+
+enum  KeyCode;
+enum  MouseCode;
+class SurfaceBase;
+class FocusChangeSignal;
+class InputSignal;
+class Cursor;
+class Layout;
+class FocusNavGroup;
+class Border;
+class Font;
+class BuildGroup;
+class App;
+class LayoutInfo;
+class RepaintSignal;
+
+class VGUIAPI Panel
+{
+public:
+	Panel() {}
+	Panel(int x,int y,int wide,int tall) {setPos(x, y); setSize(wide, tall);}
+private:
+	void init(int x,int y,int wide,int tall) {}
+public:
+	virtual void   setPos(int x,int y) {_pos[0] = x; _pos[1] = y;}
+	virtual void   getPos(int& x,int& y) {x = _pos[0]; y = _pos[1];}
+	virtual void   setSize(int wide,int tall) {_size[0] = wide, _size[1] = tall;}
+	virtual void   getSize(int& wide,int& tall) {wide = _size[0], tall = _size[1];}
+	virtual void   setBounds(int x,int y,int wide,int tall) {}
+	virtual void   getBounds(int& x,int& y,int& wide,int& tall) {}
+	virtual int    getWide() {return _size[0];}
+	virtual int    getTall() {return _size[1];}
+	virtual Panel* getParent() {return _parent;}
+	virtual void   setVisible(bool state) {_visible = state;}
+	virtual bool   isVisible() {return _visible;}
+	virtual bool   isVisibleUp() {return false;}
+	virtual void   repaint() {}
+	virtual void   repaintAll() {}
+	virtual void   getAbsExtents(int& x0,int& y0,int& x1,int& y1) {}
+	virtual void   getClipRect(int& x0,int& y0,int& x1,int& y1) {}
+	virtual void   setParent(Panel* newParent) {_parent = newParent; newParent->addChild(this);}
+	virtual void   addChild(Panel* child) {}
+	virtual void   insertChildAt(Panel* child,int index) {}
+	virtual void   removeChild(Panel* child) {}
+	virtual bool   wasMousePressed(MouseCode code) {return false;}
+	virtual bool   wasMouseDoublePressed(MouseCode code) {return false;}
+	virtual bool   isMouseDown(MouseCode code) {return false;}
+	virtual bool   wasMouseReleased(MouseCode code) {return false;}
+	virtual bool   wasKeyPressed(KeyCode code) {return false;}
+	virtual bool   isKeyDown(KeyCode code) {return false;}
+	virtual bool   wasKeyTyped(KeyCode code) {return false;}
+	virtual bool   wasKeyReleased(KeyCode code) {return false;}
+	virtual void   addInputSignal(InputSignal* s) {}
+	virtual void   removeInputSignal(InputSignal* s) {}
+	virtual void   addRepaintSignal(RepaintSignal* s) {}
+	virtual void   removeRepaintSignal(RepaintSignal* s) {}
+	virtual bool   isWithin(int x,int y) {return false;} //in screen space
+	virtual Panel* isWithinTraverse(int x,int y) {return 0;}
+	virtual void   localToScreen(int& x,int& y) {}
+	virtual void   screenToLocal(int& x,int& y) {}
+	virtual void   setCursor(Cursor* cursor) {}
+	virtual void   setCursor(Scheme::SchemeCursor scu) {}
+	virtual Cursor* getCursor() {return 0;}
+	virtual void   setMinimumSize(int wide,int tall) {}
+	virtual void   getMinimumSize(int& wide,int& tall) {}
+	virtual void   requestFocus() {}
+	virtual bool   hasFocus() {return false;}
+	virtual int    getChildCount() {return 0;}
+	virtual Panel* getChild(int index) {return 0;}
+	virtual void   setLayout(Layout* layout) {}
+	virtual void   invalidateLayout(bool layoutNow) {}
+	virtual void   setFocusNavGroup(FocusNavGroup* focusNavGroup) {}
+	virtual void   requestFocusPrev() {}
+	virtual void   requestFocusNext() {}
+	virtual void   addFocusChangeSignal(FocusChangeSignal* s) {}
+	virtual bool   isAutoFocusNavEnabled() {return false;}
+	virtual void   setAutoFocusNavEnabled(bool state) {}
+	virtual void   setBorder(Border* border) {}
+	virtual void   setPaintBorderEnabled(bool state) {}
+	virtual void   setPaintBackgroundEnabled(bool state) {}
+	virtual void   setPaintEnabled(bool state) {}
+	virtual void   getInset(int& left,int& top,int& right,int& bottom) {}
+	virtual void   getPaintSize(int& wide,int& tall) {}
+	virtual void   setPreferredSize(int wide,int tall) {}
+	virtual void   getPreferredSize(int& wide,int& tall) {}
+	virtual SurfaceBase* getSurfaceBase() {return 0;}
+	virtual bool   isEnabled() {return _enabled = false;}
+	virtual void   setEnabled(bool state) {_enabled = true;}
+	virtual void   setBuildGroup(BuildGroup* buildGroup,const char* panelPersistanceName) {}
+	virtual bool   isBuildGroupEnabled() {return false;}
+	virtual void   removeAllChildren() {}
+	virtual void   repaintParent() {}
+	virtual Panel* createPropertyPanel() {return 0;}
+	virtual void   getPersistanceText(char* buf,int bufLen) {}
+	virtual void   applyPersistanceText(const char* buf) {}
+	virtual void   setFgColor(Scheme::SchemeColor sc) {}
+	virtual void   setBgColor(Scheme::SchemeColor sc) {}
+	virtual void   setFgColor(int r,int g,int b,int a) {}
+	virtual void   setBgColor(int r,int g,int b,int a) {}
+	virtual void   getFgColor(int& r,int& g,int& b,int& a) {}
+	virtual void   getBgColor(int& r,int& g,int& b,int& a) {}
+	virtual void   setBgColor(Color color) {}
+	virtual void   setFgColor(Color color) {}
+	virtual void   getBgColor(Color& color) {}
+	virtual void   getFgColor(Color& color) {}
+	virtual void   setAsMouseCapture(bool state) {}
+	virtual void   setAsMouseArena(bool state) {}
+	virtual App*   getApp() {return 0;}
+	virtual void   getVirtualSize(int& wide,int& tall) {}
+	virtual void   setLayoutInfo(LayoutInfo* layoutInfo) {}
+	virtual LayoutInfo* getLayoutInfo() {return 0;}
+	virtual bool   isCursorNone() {return false;}
+public: //bullshit public
+	virtual void solveTraverse() {}
+	virtual void paintTraverse() {}
+	virtual void setSurfaceBaseTraverse(SurfaceBase* surfaceBase) {}
+protected:
+	virtual void performLayout() {}
+	virtual void internalPerformLayout() {}
+	virtual void drawSetColor(Scheme::SchemeColor sc) {}
+	virtual void drawSetColor(int r,int g,int b,int a) {}
+	virtual void drawFilledRect(int x0,int y0,int x1,int y1) {}
+	virtual void drawOutlinedRect(int x0,int y0,int x1,int y1) {}
+	virtual void drawSetTextFont(Scheme::SchemeFont sf) {}
+	virtual void drawSetTextFont(Font* font) {}
+	virtual void drawSetTextColor(Scheme::SchemeColor sc) {}
+	virtual void drawSetTextColor(int r,int g,int b,int a) {}
+	virtual void drawSetTextPos(int x,int y) {}
+	virtual void drawPrintText(const char* str,int strlen) {}
+	virtual void drawPrintText(int x,int y,const char* str,int strlen) {}
+	virtual void drawPrintChar(char ch) {}
+	virtual void drawPrintChar(int x,int y,char ch) {}
+	virtual void drawSetTextureRGBA(int id,const char* rgba,int wide,int tall) {}
+	virtual void drawSetTexture(int id) {}
+	virtual void drawTexturedRect(int x0,int y0,int x1,int y1) {}
+	virtual void solve() {}
+	virtual void paintTraverse(bool repaint) {if(repaint) paintBackground();}
+	virtual void paintBackground() {}
+	virtual void paint() {}
+	virtual void paintBuildOverlay() {}
+	virtual void internalCursorMoved(int x,int y) {}
+	virtual void internalCursorEntered() {}
+	virtual void internalCursorExited() {}
+	virtual void internalMousePressed(MouseCode code) {}
+	virtual void internalMouseDoublePressed(MouseCode code) {}
+	virtual void internalMouseReleased(MouseCode code) {}
+	virtual void internalMouseWheeled(int delta) {}
+	virtual void internalKeyPressed(KeyCode code) {}
+	virtual void internalKeyTyped(KeyCode code) {}
+	virtual void internalKeyReleased(KeyCode code) {}
+	virtual void internalKeyFocusTicked() {}
+	virtual void internalFocusChanged(bool lost) {}
+	virtual void internalSetCursor() {}
+protected:
+	int               _pos[2];
+	int               _size[2];
+	int               _loc[2];
+	int               _minimumSize[2];
+	int               _preferredSize[2];
+	Dar<Panel*>       _childDar;
+	Panel*            _parent;
+	SurfaceBase*      _surfaceBase;
+	Dar<InputSignal*> _inputSignalDar;
+	Dar<RepaintSignal*> _repaintSignalDar;
+	int               _clipRect[4];
+	Cursor*           _cursor;
+	Scheme::SchemeCursor _schemeCursor;
+	bool              _visible;
+	Layout*           _layout;
+	bool              _needsLayout;
+	FocusNavGroup*    _focusNavGroup;
+	Dar<FocusChangeSignal*> _focusChangeSignalDar;
+	bool              _autoFocusNavEnabled;
+	Border*           _border;
+private:
+	bool                _needsRepaint;
+	bool                _enabled;
+	BuildGroup*         _buildGroup;
+	Color               _fgColor;
+	Color               _bgColor;
+	LayoutInfo*         _layoutInfo;
+	bool                _paintBorderEnabled;
+	bool                _paintBackgroundEnabled;
+	bool                _paintEnabled;
+friend class Panel;
+friend class App;
+friend class SurfaceBase;
+friend class Image;
+};
+}
+
+#endif
diff --git a/utils/false_vgui/include/VGUI_Scheme.h b/utils/false_vgui/include/VGUI_Scheme.h
new file mode 100644
index 00000000..e32d7976
--- /dev/null
+++ b/utils/false_vgui/include/VGUI_Scheme.h
@@ -0,0 +1,82 @@
+//========= Copyright � 1996-2002, Valve LLC, All rights reserved. ============
+//
+// Purpose: 
+//
+// $NoKeywords: $
+//=============================================================================
+
+#ifndef VGUI_SCHEME_H
+#define VGUI_SCHEME_H
+
+#include<VGUI.h>
+
+
+namespace vgui
+{
+
+class Font;
+class Cursor;
+
+class VGUIAPI Scheme
+{
+public:
+	enum SchemeColor
+	{
+		sc_user=0,
+		sc_black,
+		sc_white,
+		sc_primary1,
+		sc_primary2,
+		sc_primary3,
+		sc_secondary1,
+		sc_secondary2,
+		sc_secondary3,
+		sc_last
+	};
+	enum SchemeFont
+	{
+		sf_user=0,
+		sf_primary1,
+		sf_primary2,
+		sf_primary3,
+		sf_secondary1,
+		sf_last
+	};
+	enum SchemeCursor
+	{
+		scu_user=0,
+		scu_none,
+		scu_arrow,
+		scu_ibeam,
+		scu_hourglass,
+		scu_crosshair,
+		scu_up,
+		scu_sizenwse,
+		scu_sizenesw,
+		scu_sizewe,
+		scu_sizens,
+		scu_sizeall,
+		scu_no,
+		scu_hand,
+		scu_last
+	};
+public:
+	Scheme() {}
+public:
+	virtual void    setColor(SchemeColor sc,int r,int g,int b,int a) {}
+	virtual void    getColor(SchemeColor sc,int& r,int& g,int& b,int& a) {}
+	virtual void    setFont(SchemeFont sf,Font* font) {}
+	virtual Font*   getFont(SchemeFont sf) {return 0;}
+	virtual void    setCursor(SchemeCursor sc,Cursor* cursor) {}
+	virtual Cursor* getCursor(SchemeCursor sc) {return 0;}
+protected:
+	int     _color[sc_last][4];
+    Font*   _font[sf_last];
+	Cursor* _cursor[scu_last];
+    friend class Panel;
+    friend class Canvas;
+};
+
+}
+
+#endif
diff --git a/xash.dsw b/xash.dsw
deleted file mode 100644
index 3be1a44d..00000000
--- a/xash.dsw
+++ /dev/null
@@ -1,65 +0,0 @@
-Microsoft Developer Studio Workspace File, Format Version 6.00
-# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
-
-###############################################################################
-
-Project: "hl"=".\dlls\hl.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Project: "client"=".\cl_dll\cl_dll.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Project: "mainui"=".\mainui\mainui.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Project: "engine"=".\engine\engine.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Global:
-
-Package=<5>
-{{{
-}}}
-
-Package=<3>
-{{{
-}}}
-
-###############################################################################
-
diff --git a/xash_sdk.dsw b/xash_sdk.dsw
deleted file mode 100644
index ad911ba0..00000000
--- a/xash_sdk.dsw
+++ /dev/null
@@ -1,65 +0,0 @@
-Microsoft Developer Studio Workspace File, Format Version 6.00
-# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
-
-###############################################################################
-
-Project: "hl"=".\dlls\hl.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Project: "client"=".\cl_dll\cl_dll.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Project: "mainui"=".\mainui\mainui.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Project: "game"=".\game_launch\game.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Global:
-
-Package=<5>
-{{{
-}}}
-
-Package=<3>
-{{{
-}}}
-
-###############################################################################
-
diff --git a/xash_sdk.lst b/xash_sdk.lst
deleted file mode 100644
index a211c3b4..00000000
--- a/xash_sdk.lst
+++ /dev/null
@@ -1,22 +0,0 @@
-//=======================================================================
-//			Copyright XashXT Group 2011 �
-//			list with SDK directories
-//=======================================================================
-
-// global stuff
-xash_sdk\xash_sdk.dsw
-xash_sdk\cl_dll\
-xash_sdk\cl_dll\hl\
-xash_sdk\common\
-xash_sdk\dlls\
-xash_sdk\game_shared\
-xash_sdk\game_launch\
-xash_sdk\engine\
-xash_sdk\pm_shared\
-xash_sdk\mainui\
-xash_dsk\mainui\legacy
-xash_sdk\utils\
-xash_sdk\makefont\
-xash_sdk\utils\vgui\
-xash_sdk\utils\vgui\include\
-xash_sdk\utils\vgui\lib\win32_vc6\
\ No newline at end of file