diff -uwrN sourceold/AntiSpawnKill/AntiSpawnKill.vcxproj source/AntiSpawnKill/AntiSpawnKill.vcxproj
--- sourceold/AntiSpawnKill/AntiSpawnKill.vcxproj	2016-10-31 07:17:10.947013500 +1000
+++ source/AntiSpawnKill/AntiSpawnKill.vcxproj	2017-01-18 19:57:04.580444800 +1000
@@ -18,14 +18,12 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug SSGM|Win32'" Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
     <WholeProgramOptimization>false</WholeProgramOptimization>
     <PlatformToolset>v110_xp</PlatformToolset>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release SSGM|Win32'" Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
     <WholeProgramOptimization>true</WholeProgramOptimization>
     <PlatformToolset>v110_xp</PlatformToolset>
@@ -89,7 +87,7 @@
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <MultiProcessorCompilation>true</MultiProcessorCompilation>
       <MinimalRebuild>false</MinimalRebuild>
-      <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -102,7 +100,6 @@
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateMapFile>true</GenerateMapFile>
       <MapFileName>$(TargetDir)$(TargetName).map</MapFileName>
-      <MapExports>false</MapExports>
       <SubSystem>Windows</SubSystem>
       <OptimizeReferences>true</OptimizeReferences>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
@@ -149,7 +146,6 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <IntrinsicFunctions>true</IntrinsicFunctions>
-      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
       <AdditionalIncludeDirectories>.;..\MemoryManager;..\scripts;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>D3D_DEBUG_INFO;DEBUG;MEMORY_MANAGER;ANTISPAWNKILL_EXPORTS;WIN32;_CRT_SECURE_NO_DEPRECATE;_HAS_EXCEPTIONS=0;_WINDOWS;SSGMPLUGIN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
@@ -159,7 +155,7 @@
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <BufferSecurityCheck>false</BufferSecurityCheck>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
       <FloatingPointModel>Precise</FloatingPointModel>
       <RuntimeTypeInfo>true</RuntimeTypeInfo>
       <PrecompiledHeader>Use</PrecompiledHeader>
diff -uwrN sourceold/CTF/ctf.vcxproj source/CTF/ctf.vcxproj
--- sourceold/CTF/ctf.vcxproj	2016-10-31 07:17:10.953013500 +1000
+++ source/CTF/ctf.vcxproj	2017-01-18 19:57:04.664244800 +1000
@@ -18,14 +18,12 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug SSGM|Win32'" Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
     <WholeProgramOptimization>false</WholeProgramOptimization>
     <PlatformToolset>v110_xp</PlatformToolset>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release SSGM|Win32'" Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
     <WholeProgramOptimization>true</WholeProgramOptimization>
     <PlatformToolset>v110_xp</PlatformToolset>
@@ -89,7 +87,7 @@
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <MultiProcessorCompilation>true</MultiProcessorCompilation>
       <MinimalRebuild>false</MinimalRebuild>
-      <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -102,7 +100,6 @@
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateMapFile>true</GenerateMapFile>
       <MapFileName>$(TargetDir)$(TargetName).map</MapFileName>
-      <MapExports>false</MapExports>
       <SubSystem>Windows</SubSystem>
       <OptimizeReferences>true</OptimizeReferences>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
@@ -149,7 +146,6 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <IntrinsicFunctions>true</IntrinsicFunctions>
-      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
       <AdditionalIncludeDirectories>.;..\MemoryManager;..\scripts;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>D3D_DEBUG_INFO;DEBUG;MEMORY_MANAGER;CTF_EXPORTS;WIN32;_CRT_SECURE_NO_DEPRECATE;_HAS_EXCEPTIONS=0;_WINDOWS;SSGMPLUGIN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
@@ -159,7 +155,7 @@
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <BufferSecurityCheck>false</BufferSecurityCheck>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
       <FloatingPointModel>Precise</FloatingPointModel>
       <RuntimeTypeInfo>true</RuntimeTypeInfo>
       <PrecompiledHeader>Use</PrecompiledHeader>
diff -uwrN sourceold/CharacterRefund/CharacterRefund.vcxproj source/CharacterRefund/CharacterRefund.vcxproj
--- sourceold/CharacterRefund/CharacterRefund.vcxproj	2016-10-31 07:17:10.956013500 +1000
+++ source/CharacterRefund/CharacterRefund.vcxproj	2017-01-18 19:57:04.564844800 +1000
@@ -18,14 +18,12 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug SSGM|Win32'" Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
     <WholeProgramOptimization>false</WholeProgramOptimization>
     <PlatformToolset>v110_xp</PlatformToolset>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release SSGM|Win32'" Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
     <WholeProgramOptimization>true</WholeProgramOptimization>
     <PlatformToolset>v110_xp</PlatformToolset>
@@ -89,7 +87,7 @@
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <MultiProcessorCompilation>true</MultiProcessorCompilation>
       <MinimalRebuild>false</MinimalRebuild>
-      <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -102,7 +100,6 @@
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateMapFile>true</GenerateMapFile>
       <MapFileName>$(TargetDir)$(TargetName).map</MapFileName>
-      <MapExports>false</MapExports>
       <SubSystem>Windows</SubSystem>
       <OptimizeReferences>true</OptimizeReferences>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
@@ -149,7 +146,6 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <IntrinsicFunctions>true</IntrinsicFunctions>
-      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
       <AdditionalIncludeDirectories>.;..\MemoryManager;..\scripts;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>D3D_DEBUG_INFO;DEBUG;MEMORY_MANAGER;CHARACTERREFUND_EXPORTS;WIN32;_CRT_SECURE_NO_DEPRECATE;_HAS_EXCEPTIONS=0;_WINDOWS;SSGMPLUGIN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
@@ -159,7 +155,7 @@
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <BufferSecurityCheck>false</BufferSecurityCheck>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
       <FloatingPointModel>Precise</FloatingPointModel>
       <RuntimeTypeInfo>true</RuntimeTypeInfo>
       <PrecompiledHeader>Use</PrecompiledHeader>
diff -uwrN sourceold/ExtraConsoleCommands/ExtraConsoleCommands.vcxproj source/ExtraConsoleCommands/ExtraConsoleCommands.vcxproj
--- sourceold/ExtraConsoleCommands/ExtraConsoleCommands.vcxproj	2016-10-31 07:17:10.960013500 +1000
+++ source/ExtraConsoleCommands/ExtraConsoleCommands.vcxproj	2017-01-18 19:57:04.596044800 +1000
@@ -18,14 +18,12 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug SSGM|Win32'" Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
     <WholeProgramOptimization>false</WholeProgramOptimization>
     <PlatformToolset>v110_xp</PlatformToolset>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release SSGM|Win32'" Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
     <WholeProgramOptimization>true</WholeProgramOptimization>
     <PlatformToolset>v110_xp</PlatformToolset>
@@ -89,7 +87,7 @@
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <MultiProcessorCompilation>true</MultiProcessorCompilation>
       <MinimalRebuild>false</MinimalRebuild>
-      <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -102,7 +100,6 @@
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateMapFile>true</GenerateMapFile>
       <MapFileName>$(TargetDir)$(TargetName).map</MapFileName>
-      <MapExports>false</MapExports>
       <SubSystem>Windows</SubSystem>
       <OptimizeReferences>true</OptimizeReferences>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
@@ -149,7 +146,6 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <IntrinsicFunctions>true</IntrinsicFunctions>
-      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
       <AdditionalIncludeDirectories>.;..\MemoryManager;..\scripts;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>D3D_DEBUG_INFO;DEBUG;MEMORY_MANAGER;EXTRACONSOLECOMMANDS_EXPORTS;WIN32;_CRT_SECURE_NO_DEPRECATE;_HAS_EXCEPTIONS=0;_WINDOWS;SSGMPLUGIN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
@@ -159,7 +155,7 @@
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <BufferSecurityCheck>false</BufferSecurityCheck>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
       <FloatingPointModel>Precise</FloatingPointModel>
       <RuntimeTypeInfo>true</RuntimeTypeInfo>
       <PrecompiledHeader>Use</PrecompiledHeader>
diff -uwrN sourceold/FirstBlood/FirstBlood.vcxproj source/FirstBlood/FirstBlood.vcxproj
--- sourceold/FirstBlood/FirstBlood.vcxproj	2016-10-31 07:17:10.964013500 +1000
+++ source/FirstBlood/FirstBlood.vcxproj	2017-01-18 19:57:04.611644800 +1000
@@ -18,14 +18,12 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug SSGM|Win32'" Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
     <WholeProgramOptimization>false</WholeProgramOptimization>
     <PlatformToolset>v110_xp</PlatformToolset>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release SSGM|Win32'" Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
     <WholeProgramOptimization>true</WholeProgramOptimization>
     <PlatformToolset>v110_xp</PlatformToolset>
@@ -89,7 +87,7 @@
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <MultiProcessorCompilation>true</MultiProcessorCompilation>
       <MinimalRebuild>false</MinimalRebuild>
-      <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -102,7 +100,6 @@
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateMapFile>true</GenerateMapFile>
       <MapFileName>$(TargetDir)$(TargetName).map</MapFileName>
-      <MapExports>false</MapExports>
       <SubSystem>Windows</SubSystem>
       <OptimizeReferences>true</OptimizeReferences>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
@@ -149,7 +146,6 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <IntrinsicFunctions>true</IntrinsicFunctions>
-      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
       <AdditionalIncludeDirectories>.;..\MemoryManager;..\scripts;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>D3D_DEBUG_INFO;DEBUG;MEMORY_MANAGER;FIRSTBLOOD_EXPORTS;WIN32;_CRT_SECURE_NO_DEPRECATE;_HAS_EXCEPTIONS=0;_WINDOWS;SSGMPLUGIN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
@@ -159,7 +155,7 @@
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <BufferSecurityCheck>false</BufferSecurityCheck>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
       <FloatingPointModel>Precise</FloatingPointModel>
       <RuntimeTypeInfo>true</RuntimeTypeInfo>
       <PrecompiledHeader>Use</PrecompiledHeader>
diff -uwrN sourceold/MemoryManager/MemoryManager.vcxproj source/MemoryManager/MemoryManager.vcxproj
--- sourceold/MemoryManager/MemoryManager.vcxproj	2016-10-31 07:17:11.069013500 +1000
+++ source/MemoryManager/MemoryManager.vcxproj	2017-01-18 19:49:56.849042600 +1000
@@ -95,6 +95,9 @@
     <OutDir>$(SolutionDir)bin\$(Platform)\$(Configuration)\</OutDir>
     <IntDir>$(SolutionDir)temp\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>
   </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <LinkIncremental>false</LinkIncremental>
+  </PropertyGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <ClCompile>
       <Optimization>MaxSpeed</Optimization>
@@ -114,6 +117,10 @@
       <MultiProcessorCompilation>true</MultiProcessorCompilation>
       <MinimalRebuild>false</MinimalRebuild>
       <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
+      <TreatWarningAsError>true</TreatWarningAsError>
+      <OmitFramePointers>true</OmitFramePointers>
+      <BufferSecurityCheck>false</BufferSecurityCheck>
+      <FloatingPointModel>Precise</FloatingPointModel>
     </ClCompile>
     <Link>
       <ModuleDefinitionFile>MemoryManager_win32.def</ModuleDefinitionFile>
@@ -125,6 +132,8 @@
       <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
       <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
+      <OptimizeReferences>true</OptimizeReferences>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
     </Link>
     <PostBuildEvent>
       <Command>if defined RenPath (
@@ -198,6 +207,11 @@
       <MultiProcessorCompilation>true</MultiProcessorCompilation>
       <MinimalRebuild>false</MinimalRebuild>
       <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
+      <TreatWarningAsError>true</TreatWarningAsError>
+      <OmitFramePointers>true</OmitFramePointers>
+      <BufferSecurityCheck>false</BufferSecurityCheck>
+      <FloatingPointModel>Precise</FloatingPointModel>
+      <RuntimeTypeInfo>false</RuntimeTypeInfo>
     </ClCompile>
     <Link>
       <ModuleDefinitionFile>MemoryManager_win32.def</ModuleDefinitionFile>
@@ -209,6 +223,8 @@
       <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
       <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
+      <GenerateMapFile>true</GenerateMapFile>
+      <MapFileName>$(TargetDir)$(TargetName).map</MapFileName>
     </Link>
     <PostBuildEvent>
       <Command>if defined RenPath (
diff -uwrN sourceold/Mute/Mute.vcxproj source/Mute/Mute.vcxproj
--- sourceold/Mute/Mute.vcxproj	2016-10-31 07:17:11.079013500 +1000
+++ source/Mute/Mute.vcxproj	2017-01-18 19:57:04.653244800 +1000
@@ -18,14 +18,12 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug SSGM|Win32'" Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
     <WholeProgramOptimization>false</WholeProgramOptimization>
     <PlatformToolset>v110_xp</PlatformToolset>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release SSGM|Win32'" Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
     <WholeProgramOptimization>true</WholeProgramOptimization>
     <PlatformToolset>v110_xp</PlatformToolset>
@@ -89,7 +87,7 @@
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <MultiProcessorCompilation>true</MultiProcessorCompilation>
       <MinimalRebuild>false</MinimalRebuild>
-      <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -102,7 +100,6 @@
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateMapFile>true</GenerateMapFile>
       <MapFileName>$(TargetDir)$(TargetName).map</MapFileName>
-      <MapExports>false</MapExports>
       <SubSystem>Windows</SubSystem>
       <OptimizeReferences>true</OptimizeReferences>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
@@ -149,7 +146,6 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <IntrinsicFunctions>true</IntrinsicFunctions>
-      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
       <AdditionalIncludeDirectories>.;..\MemoryManager;..\scripts;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>D3D_DEBUG_INFO;DEBUG;MEMORY_MANAGER;MUTE_EXPORTS;WIN32;_CRT_SECURE_NO_DEPRECATE;_HAS_EXCEPTIONS=0;_WINDOWS;SSGMPLUGIN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
@@ -159,7 +155,7 @@
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <BufferSecurityCheck>false</BufferSecurityCheck>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
       <FloatingPointModel>Precise</FloatingPointModel>
       <RuntimeTypeInfo>true</RuntimeTypeInfo>
       <PrecompiledHeader>Use</PrecompiledHeader>
diff -uwrN sourceold/NoPoints/NoPoints.vcxproj source/NoPoints/NoPoints.vcxproj
--- sourceold/NoPoints/NoPoints.vcxproj	2016-10-31 07:17:11.082013500 +1000
+++ source/NoPoints/NoPoints.vcxproj	2017-01-18 19:57:04.580444800 +1000
@@ -18,14 +18,12 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug SSGM|Win32'" Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
     <WholeProgramOptimization>false</WholeProgramOptimization>
     <PlatformToolset>v110_xp</PlatformToolset>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release SSGM|Win32'" Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
     <WholeProgramOptimization>true</WholeProgramOptimization>
     <PlatformToolset>v110_xp</PlatformToolset>
@@ -89,7 +87,7 @@
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <MultiProcessorCompilation>true</MultiProcessorCompilation>
       <MinimalRebuild>false</MinimalRebuild>
-      <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -102,7 +100,6 @@
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateMapFile>true</GenerateMapFile>
       <MapFileName>$(TargetDir)$(TargetName).map</MapFileName>
-      <MapExports>false</MapExports>
       <SubSystem>Windows</SubSystem>
       <OptimizeReferences>true</OptimizeReferences>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
@@ -149,7 +146,6 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <IntrinsicFunctions>true</IntrinsicFunctions>
-      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
       <AdditionalIncludeDirectories>.;..\MemoryManager;..\scripts;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>D3D_DEBUG_INFO;DEBUG;MEMORY_MANAGER;NOPOINTS_EXPORTS;WIN32;_CRT_SECURE_NO_DEPRECATE;_HAS_EXCEPTIONS=0;_WINDOWS;SSGMPLUGIN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
@@ -159,7 +155,7 @@
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <BufferSecurityCheck>false</BufferSecurityCheck>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
       <FloatingPointModel>Precise</FloatingPointModel>
       <RuntimeTypeInfo>true</RuntimeTypeInfo>
       <PrecompiledHeader>Use</PrecompiledHeader>
diff -uwrN sourceold/PointsDistribution/PointsDistribution.vcxproj source/PointsDistribution/PointsDistribution.vcxproj
--- sourceold/PointsDistribution/PointsDistribution.vcxproj	2016-10-31 07:17:11.089013500 +1000
+++ source/PointsDistribution/PointsDistribution.vcxproj	2017-01-18 19:57:04.596044800 +1000
@@ -18,14 +18,12 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug SSGM|Win32'" Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
     <WholeProgramOptimization>false</WholeProgramOptimization>
     <PlatformToolset>v110_xp</PlatformToolset>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release SSGM|Win32'" Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
     <WholeProgramOptimization>true</WholeProgramOptimization>
     <PlatformToolset>v110_xp</PlatformToolset>
@@ -89,7 +87,7 @@
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <MultiProcessorCompilation>true</MultiProcessorCompilation>
       <MinimalRebuild>false</MinimalRebuild>
-      <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -102,7 +100,6 @@
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateMapFile>true</GenerateMapFile>
       <MapFileName>$(TargetDir)$(TargetName).map</MapFileName>
-      <MapExports>false</MapExports>
       <SubSystem>Windows</SubSystem>
       <OptimizeReferences>true</OptimizeReferences>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
@@ -149,7 +146,6 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <IntrinsicFunctions>true</IntrinsicFunctions>
-      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
       <AdditionalIncludeDirectories>.;..\MemoryManager;..\scripts;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>D3D_DEBUG_INFO;DEBUG;MEMORY_MANAGER;POINTSDISTRIBUTION_EXPORTS;WIN32;_CRT_SECURE_NO_DEPRECATE;_HAS_EXCEPTIONS=0;_WINDOWS;SSGMPLUGIN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
@@ -159,7 +155,7 @@
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <BufferSecurityCheck>false</BufferSecurityCheck>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
       <FloatingPointModel>Precise</FloatingPointModel>
       <RuntimeTypeInfo>true</RuntimeTypeInfo>
       <PrecompiledHeader>Use</PrecompiledHeader>
diff -uwrN sourceold/Spectate/Spectate.vcxproj source/Spectate/Spectate.vcxproj
--- sourceold/Spectate/Spectate.vcxproj	2016-10-31 07:17:11.093013500 +1000
+++ source/Spectate/Spectate.vcxproj	2017-01-18 19:57:04.611644800 +1000
@@ -18,14 +18,12 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug SSGM|Win32'" Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
     <WholeProgramOptimization>false</WholeProgramOptimization>
     <PlatformToolset>v110_xp</PlatformToolset>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release SSGM|Win32'" Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
     <WholeProgramOptimization>true</WholeProgramOptimization>
     <PlatformToolset>v110_xp</PlatformToolset>
@@ -89,7 +87,7 @@
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <MultiProcessorCompilation>true</MultiProcessorCompilation>
       <MinimalRebuild>false</MinimalRebuild>
-      <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -102,7 +100,6 @@
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateMapFile>true</GenerateMapFile>
       <MapFileName>$(TargetDir)$(TargetName).map</MapFileName>
-      <MapExports>false</MapExports>
       <SubSystem>Windows</SubSystem>
       <OptimizeReferences>true</OptimizeReferences>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
@@ -149,7 +146,6 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <IntrinsicFunctions>true</IntrinsicFunctions>
-      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
       <AdditionalIncludeDirectories>.;..\MemoryManager;..\scripts;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>D3D_DEBUG_INFO;DEBUG;MEMORY_MANAGER;SPECTATE_EXPORTS;WIN32;_CRT_SECURE_NO_DEPRECATE;_HAS_EXCEPTIONS=0;_WINDOWS;SSGMPLUGIN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
@@ -159,7 +155,7 @@
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <BufferSecurityCheck>false</BufferSecurityCheck>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
       <FloatingPointModel>Precise</FloatingPointModel>
       <RuntimeTypeInfo>true</RuntimeTypeInfo>
       <PrecompiledHeader>Use</PrecompiledHeader>
diff -uwrN sourceold/SuddenDeath/SuddenDeath.vcxproj source/SuddenDeath/SuddenDeath.vcxproj
--- sourceold/SuddenDeath/SuddenDeath.vcxproj	2016-10-31 07:17:11.096013500 +1000
+++ source/SuddenDeath/SuddenDeath.vcxproj	2017-01-18 19:57:04.564844800 +1000
@@ -18,14 +18,12 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug SSGM|Win32'" Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
     <WholeProgramOptimization>false</WholeProgramOptimization>
     <PlatformToolset>v110_xp</PlatformToolset>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release SSGM|Win32'" Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
     <WholeProgramOptimization>true</WholeProgramOptimization>
     <PlatformToolset>v110_xp</PlatformToolset>
@@ -89,7 +87,7 @@
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <MultiProcessorCompilation>true</MultiProcessorCompilation>
       <MinimalRebuild>false</MinimalRebuild>
-      <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -102,7 +100,6 @@
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateMapFile>true</GenerateMapFile>
       <MapFileName>$(TargetDir)$(TargetName).map</MapFileName>
-      <MapExports>false</MapExports>
       <SubSystem>Windows</SubSystem>
       <OptimizeReferences>true</OptimizeReferences>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
@@ -149,7 +146,6 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <IntrinsicFunctions>true</IntrinsicFunctions>
-      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
       <AdditionalIncludeDirectories>.;..\MemoryManager;..\scripts;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>D3D_DEBUG_INFO;DEBUG;MEMORY_MANAGER;SUDDENDEATH_EXPORTS;WIN32;_CRT_SECURE_NO_DEPRECATE;_HAS_EXCEPTIONS=0;_WINDOWS;SSGMPLUGIN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
@@ -159,7 +155,7 @@
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <BufferSecurityCheck>false</BufferSecurityCheck>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
       <FloatingPointModel>Precise</FloatingPointModel>
       <RuntimeTypeInfo>true</RuntimeTypeInfo>
       <PrecompiledHeader>Use</PrecompiledHeader>
diff -uwrN sourceold/bansystem/bansystem.vcxproj source/bansystem/bansystem.vcxproj
--- sourceold/bansystem/bansystem.vcxproj	2016-10-31 07:17:11.162013500 +1000
+++ source/bansystem/bansystem.vcxproj	2017-01-18 19:57:04.564844800 +1000
@@ -18,14 +18,12 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug SSGM|Win32'" Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
     <WholeProgramOptimization>false</WholeProgramOptimization>
     <PlatformToolset>v110_xp</PlatformToolset>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release SSGM|Win32'" Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
     <WholeProgramOptimization>true</WholeProgramOptimization>
     <PlatformToolset>v110_xp</PlatformToolset>
@@ -89,7 +87,7 @@
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <MultiProcessorCompilation>true</MultiProcessorCompilation>
       <MinimalRebuild>false</MinimalRebuild>
-      <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -102,7 +100,6 @@
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateMapFile>true</GenerateMapFile>
       <MapFileName>$(TargetDir)$(TargetName).map</MapFileName>
-      <MapExports>false</MapExports>
       <SubSystem>Windows</SubSystem>
       <OptimizeReferences>true</OptimizeReferences>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
@@ -149,7 +146,6 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <IntrinsicFunctions>true</IntrinsicFunctions>
-      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
       <AdditionalIncludeDirectories>.;..\MemoryManager;..\scripts;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>D3D_DEBUG_INFO;DEBUG;MEMORY_MANAGER;BANSYSTEM_EXPORTS;WIN32;_CRT_SECURE_NO_DEPRECATE;_HAS_EXCEPTIONS=0;_WINDOWS;SSGMPLUGIN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
@@ -159,7 +155,7 @@
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <BufferSecurityCheck>false</BufferSecurityCheck>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
       <FloatingPointModel>Precise</FloatingPointModel>
       <RuntimeTypeInfo>true</RuntimeTypeInfo>
       <PrecompiledHeader>Use</PrecompiledHeader>
diff -uwrN sourceold/crates/crates.vcxproj source/crates/crates.vcxproj
--- sourceold/crates/crates.vcxproj	2016-10-31 07:17:11.182013500 +1000
+++ source/crates/crates.vcxproj	2017-01-18 19:57:04.668244800 +1000
@@ -18,14 +18,12 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug SSGM|Win32'" Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
     <WholeProgramOptimization>false</WholeProgramOptimization>
     <PlatformToolset>v110_xp</PlatformToolset>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release SSGM|Win32'" Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
     <WholeProgramOptimization>true</WholeProgramOptimization>
     <PlatformToolset>v110_xp</PlatformToolset>
@@ -89,7 +87,7 @@
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <MultiProcessorCompilation>true</MultiProcessorCompilation>
       <MinimalRebuild>false</MinimalRebuild>
-      <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -102,7 +100,6 @@
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateMapFile>true</GenerateMapFile>
       <MapFileName>$(TargetDir)$(TargetName).map</MapFileName>
-      <MapExports>false</MapExports>
       <SubSystem>Windows</SubSystem>
       <OptimizeReferences>true</OptimizeReferences>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
@@ -149,7 +146,6 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <IntrinsicFunctions>true</IntrinsicFunctions>
-      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
       <AdditionalIncludeDirectories>.;..\MemoryManager;..\scripts;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>D3D_DEBUG_INFO;DEBUG;MEMORY_MANAGER;CRATES_EXPORTS;WIN32;_CRT_SECURE_NO_DEPRECATE;_HAS_EXCEPTIONS=0;_WINDOWS;SSGMPLUGIN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
@@ -159,7 +155,7 @@
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <BufferSecurityCheck>false</BufferSecurityCheck>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
       <FloatingPointModel>Precise</FloatingPointModel>
       <RuntimeTypeInfo>true</RuntimeTypeInfo>
       <PrecompiledHeader>Use</PrecompiledHeader>
diff -uwrN sourceold/example-plugin/example-plugin.vcxproj source/example-plugin/example-plugin.vcxproj
--- sourceold/example-plugin/example-plugin.vcxproj	2016-10-31 07:17:12.270013500 +1000
+++ source/example-plugin/example-plugin.vcxproj	2017-01-18 19:57:04.629244800 +1000
@@ -18,14 +18,12 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug SSGM|Win32'" Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
     <WholeProgramOptimization>false</WholeProgramOptimization>
     <PlatformToolset>v110_xp</PlatformToolset>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release SSGM|Win32'" Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
     <WholeProgramOptimization>true</WholeProgramOptimization>
     <PlatformToolset>v110_xp</PlatformToolset>
@@ -60,7 +58,6 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <IntrinsicFunctions>true</IntrinsicFunctions>
-      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
       <AdditionalIncludeDirectories>.;..\MemoryManager;..\scripts;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>SSGMPLUGIN;_CRT_SECURE_NO_DEPRECATE;WIN32;_DEBUG;_WINDOWS;_USRDLL;EXAMPLEPLUGIN_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
@@ -70,7 +67,7 @@
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <BufferSecurityCheck>false</BufferSecurityCheck>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
       <FloatingPointModel>Precise</FloatingPointModel>
       <RuntimeTypeInfo>true</RuntimeTypeInfo>
       <PrecompiledHeader>Use</PrecompiledHeader>
@@ -145,7 +142,7 @@
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <MultiProcessorCompilation>true</MultiProcessorCompilation>
       <MinimalRebuild>false</MinimalRebuild>
-      <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
     </ClCompile>
     <Link>
       <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
@@ -154,7 +151,6 @@
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateMapFile>true</GenerateMapFile>
       <MapFileName>$(TargetDir)$(TargetName).map</MapFileName>
-      <MapExports>false</MapExports>
       <SubSystem>Windows</SubSystem>
       <OptimizeReferences>true</OptimizeReferences>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
diff -uwrN sourceold/randomstartingcredits/RandomStartingCredits.vcxproj source/randomstartingcredits/RandomStartingCredits.vcxproj
--- sourceold/randomstartingcredits/RandomStartingCredits.vcxproj	2016-10-31 07:17:12.294013500 +1000
+++ source/randomstartingcredits/RandomStartingCredits.vcxproj	2017-01-18 19:57:04.611644800 +1000
@@ -18,7 +18,6 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug SSGM|Win32'" Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
     <WholeProgramOptimization>false</WholeProgramOptimization>
     <PlatformToolset>v110_xp</PlatformToolset>
@@ -89,7 +88,7 @@
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <MultiProcessorCompilation>true</MultiProcessorCompilation>
       <MinimalRebuild>false</MinimalRebuild>
-      <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -102,7 +101,6 @@
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateMapFile>true</GenerateMapFile>
       <MapFileName>$(TargetDir)$(TargetName).map</MapFileName>
-      <MapExports>false</MapExports>
       <SubSystem>Windows</SubSystem>
       <OptimizeReferences>true</OptimizeReferences>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
@@ -149,7 +147,6 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <IntrinsicFunctions>true</IntrinsicFunctions>
-      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
       <AdditionalIncludeDirectories>.;..\MemoryManager;..\scripts;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>D3D_DEBUG_INFO;DEBUG;MEMORY_MANAGER;RANDOMSTARTINGCREDITS_EXPORTS;WIN32;_CRT_SECURE_NO_DEPRECATE;_HAS_EXCEPTIONS=0;_WINDOWS;SSGMPLUGIN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
@@ -159,7 +156,7 @@
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <BufferSecurityCheck>false</BufferSecurityCheck>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
       <FloatingPointModel>Precise</FloatingPointModel>
       <RuntimeTypeInfo>true</RuntimeTypeInfo>
       <PrecompiledHeader>Use</PrecompiledHeader>
diff -uwrN sourceold/scripts/DBIKScripts.cpp source/scripts/DBIKScripts.cpp
--- sourceold/scripts/DBIKScripts.cpp	2016-11-19 11:05:09.562453500 +1000
+++ source/scripts/DBIKScripts.cpp	2017-01-15 08:11:46.738802600 +1000
@@ -8,6 +8,7 @@
 #include "VehicleGameObj.h"
 #include "PurchaseSettingsDefClass.h"
 #include "GameObjManager.h"
+#include "DB_General.h"
 
 #define PI 3.14159265
 
@@ -29,7 +30,7 @@
 		{
 			PilotID = Commands->Get_ID(sender);
 			char params[50];
-			sprintf(params,"Deploy,%d,923572385",Commands->Get_ID(obj));
+			sprintf(params,"IKDeploy,%d,923572385",Commands->Get_ID(obj));
 			Commands->Attach_Script(sender,"Reborn_Deployable_Vehicle_Player",params);
 		}
 	}
@@ -167,8 +168,25 @@
 {
 	if(number==87)
 	{
+		if(obj->As_SoldierGameObj()->Is_On_Ladder())
+		{
+			if(OnLadder)
+			{
+				Commands->Set_Animation(obj,"s_a_human.H_A_a0a0_L23",false,0,0.0f,0.0f,false);
+				OnLadder=false;
+			}
+			else
+			{
+				OnLadder=true;
+			}
+		}
+		else
+		{
+			OnLadder=false;
+		}
 		if(obj->As_SoldierGameObj()->Get_State()==SoldierAIState::AI_STATE_IDLE && Commands->Get_Distance(Commands->Get_Position(obj),HomePosition)>5)
 		{
+			
 			ActionParamsStruct HomeAction;
 			HomeAction.Set_Basic(this,70,1);
 			HomeAction.Set_Movement(HomePosition,0.25,2,false);
@@ -367,7 +385,7 @@
 	MaxRange = Get_Float_Parameter("MaxRange");
 	ChargeTime = Get_Float_Parameter("ChargeTime");
 	GroundOnly = Get_Int_Parameter("GroundOnly");
-	/*dblaney_Nod_Obelisk_Weapon
+	/*
 	GameObject* WeaponObj = Commands->Create_Object(Preset, WeaponPos);
 	if (WeaponObj) {
 		WeaponID = Commands->Get_ID(WeaponObj);
@@ -1057,3 +1075,201 @@
 }
 
 ScriptRegistrant<DB_Infantry_Place_Buildable_Object> DB_Infantry_Place_Buildable_Object_Registrant("DB_Infantry_Place_Buildable_Object","WeaponPreset=null:string,DeployPreset=null:string,RepairedPreset=null:string,PlaceablePreview=null:string,UnPlaceablePreview=null:string,EnableCustom:int,DisableCustom:int,DeployCustom:int,RegainTimer:int,Cost:float,DeploymentBlockedMessage=Cannot deploy when near buildings.:string,PlacementMessage=You can now place another.:string,GrantWeapon=1:int,RegenStartsAfterRepair=1:int,MatchTeam=0:int,DestroyedRegenTime=1:int");
\ No newline at end of file
+
+void DB_Stationary_Stealth::Created(GameObject *obj)
+{
+	xpos = 0;
+	ypos = 0;
+	zpos = 0;
+	isHidden=false;
+	Commands->Start_Timer(obj,this,1.0f,572384);
+}
+
+void DB_Stationary_Stealth::Register_Auto_Save_Variables()
+{
+	Auto_Save_Variable(&xpos,4,2);
+	Auto_Save_Variable(&ypos,4,3);
+	Auto_Save_Variable(&zpos,4,4);
+}
+
+void DB_Stationary_Stealth::Timer_Expired(GameObject *obj,int number)
+{
+	if(number == 572384)
+	{
+		Vector3 position = Commands->Get_Position(obj);
+		if ((!xpos) && (!ypos) && (!zpos))
+		{
+			xpos = position.X;
+			ypos = position.Y;
+			zpos = position.Z;
+		}
+		if ((fabs(position.X-xpos) <= .5) && (fabs(position.Y-ypos) <= .5) && (fabs(position.Z-zpos) <= .5))
+		{
+			if(!isHidden && !Is_Script_Attached(obj,"Stealth_Powerup"))
+			{
+				isHidden=true;
+				Attach_Script_Once(obj,"Stealth_Stationary","");
+				Commands->Enable_Stealth(obj,true);
+			}
+		}
+		else if(isHidden)
+		{
+			/*
+			if(!Is_Script_Attached(obj,"Stealth_Powerup"))
+			{
+				Commands->Enable_Stealth(obj,false);
+			}
+			*/
+			Remove_Script(obj,"Stealth_Stationary");
+			isHidden=false;
+		}
+		xpos = position.X;
+		ypos = position.Y;
+		zpos = position.Z;
+		Commands->Start_Timer(obj,this,1.0f,572384);
+	}
+}
+
+ScriptRegistrant<DB_Stationary_Stealth> DB_Stationary_Stealth_Registrant("DB_Stationary_Stealth","");
+
+
+void DB_Turret_Sound::Created ( GameObject* obj )
+{
+  if ( VehicleGameObj* vObj = obj->As_VehicleGameObj() )
+  {
+    minRotate = Get_Float_Parameter("Min_Rotate_Amount");
+    lastFacing = Get_Turret_Facing(vObj->Peek_Model());
+    emitterID = -1;
+    Commands->Start_Timer(obj, this, 0.1f, 1 );
+  }
+  else
+  {
+    Destroy_Script();
+  }
+}
+
+void DB_Turret_Sound::Timer_Expired ( GameObject* obj, int number )
+{
+  if ( number == 1 )
+  {
+    if ( VehicleGameObj* vObj = obj->As_VehicleGameObj() )
+    {
+      float newFacing = Get_Turret_Facing(vObj->Peek_Model());
+
+      // Check if we are rotating - ignore tiny rotation amounts
+      bool rotating = ( abs(newFacing-lastFacing) > minRotate );
+
+      if ( emitterID == -1 && rotating)
+        Play_Sound(obj);
+
+      else if ( emitterID != -1 && !rotating )
+        Stop_Sound(obj);
+
+      lastFacing = newFacing;
+    }
+
+    // Restart timer to check for rotation
+    Commands->Start_Timer(obj, this, 0.1f, 1 );
+  }
+}
+
+float DB_Turret_Sound::Get_Turret_Facing ( RenderObjClass* RenderObj )
+{
+  if ( RenderObj )
+  {
+    Matrix3D vehicleTransform = RenderObj->Get_Transform();
+    Matrix3D transform = RenderObj->Get_Bone_Transform("turret");
+    return abs(vehicleTransform.Get_Z_Rotation()-transform.Get_Z_Rotation());
+  }
+
+  return 0.0f;
+}
+
+void DB_Turret_Sound::Play_Sound ( GameObject* obj )
+{
+	GameObject *soundemitter = Commands->Create_Object_At_Bone(obj, "Invisible_Object", "turret");
+	if(soundemitter)
+	{
+		Commands->Attach_To_Object_Bone(soundemitter,obj,"turret");
+		Commands->Set_Model(soundemitter,Get_Parameter("Sound_Emitter"));
+		emitterID=soundemitter->Get_ID();
+	}
+}
+
+void DB_Turret_Sound::Stop_Sound ( GameObject* obj )
+{
+	GameObject *soundemitter = Commands->Find_Object(emitterID);
+	if(soundemitter)
+	{
+		Commands->Destroy_Object(soundemitter);
+		emitterID = -1;
+	}
+}
+
+ScriptRegistrant<DB_Turret_Sound> DB_Turret_Sound_Registrant("DB_Turret_Sound","Sound_Emitter:string,Min_Rotate_Amount=0.05:float");
+
+void DB_Turret_Spawn::Created(GameObject *obj)
+{
+	GameObject *turret = Commands->Create_Object(Get_Parameter("Turret_Preset"),Vector3());
+	if(!turret)
+	{
+		Destroy_Script();
+		return;
+	}
+	Commands->Attach_To_Object_Bone(turret,obj,Get_Parameter("Bone_Name"));
+	turretId = Commands->Get_ID(turret);
+	if (turret->As_VehicleGameObj())
+		turret->As_VehicleGameObj()->Set_Is_Scripts_Visible(false);
+	hasDriver = false;
+}
+void DB_Turret_Spawn::Custom(GameObject *obj,int message,int param,GameObject *sender)
+{
+	if (message == CUSTOM_EVENT_VEHICLE_ENTERED)
+	{
+		if (!hasDriver)
+		{
+			hasDriver = true;
+			GameObject *turret = Commands->Find_Object(turretId);
+			if (turret)
+			{
+				Commands->Set_Player_Type(turret,Commands->Get_Player_Type(sender));
+				Commands->Action_Reset(turret,100);
+			}
+		}
+	}
+	if (message == CUSTOM_EVENT_VEHICLE_EXITED)
+	{
+		if (hasDriver && obj->As_VehicleGameObj() && !Get_Vehicle_Occupant_Count(obj))
+		{
+			hasDriver = false;
+			GameObject *turret = Commands->Find_Object(turretId);
+			if (turret)
+			{
+				Commands->Set_Player_Type(turret,Commands->Get_Player_Type(obj));
+				Commands->Action_Reset(turret,100);
+			}
+		}
+	}
+	if (message == REATTACH_BONES_CUSTOM)
+	{
+		GameObject *turret = Commands->Find_Object(turretId);
+		if (turret)
+		{
+			Commands->Attach_To_Object_Bone(turret,obj,Get_Parameter("Bone_Name"));
+		}
+	}
+}
+void DB_Turret_Spawn::Killed(GameObject *obj,GameObject *killer)
+{
+	GameObject *turret = Commands->Find_Object(turretId);
+	if (turret)
+		Commands->Destroy_Object(turret);
+}
+void DB_Turret_Spawn::Destroyed(GameObject *obj)
+{
+	GameObject *turret = Commands->Find_Object(turretId);
+	if (turret)
+		Commands->Destroy_Object(turret);
+}
+
+ScriptRegistrant<DB_Turret_Spawn> DB_Turret_Spawn_Registrant("DB_Turret_Spawn","Turret_Preset:string,Bone_Name=Tur_Mount:string");
\ No newline at end of file
diff -uwrN sourceold/scripts/DBIKScripts.h source/scripts/DBIKScripts.h
--- sourceold/scripts/DBIKScripts.h	2016-11-19 11:05:09.562453500 +1000
+++ source/scripts/DBIKScripts.h	2017-01-15 08:11:46.740802600 +1000
@@ -22,6 +22,7 @@
 
 class DB_Guard_Bot : public ScriptImpClass {
 	Vector3 HomePosition;
+	bool OnLadder;
 	void Created(GameObject *obj);
 	void Damaged(GameObject *obj,GameObject *damager,float amount);
 	void Custom(GameObject *obj,int type,int param,GameObject *sender);
@@ -145,3 +146,38 @@
 		placementBlocked = 0;
 	}
 };
\ No newline at end of file
+
+class DB_Stationary_Stealth : public ScriptImpClass {
+	float xpos;
+	float ypos;
+	float zpos;
+	bool isHidden;
+	void Created(GameObject *obj);
+	public: void Register_Auto_Save_Variables();
+	void Timer_Expired(GameObject *obj,int number);
+};
+
+class DB_Turret_Sound : public ScriptImpClass
+{
+protected:
+  void Created ( GameObject* obj );
+  void Timer_Expired ( GameObject* obj, int number );
+  float Get_Turret_Facing ( class RenderObjClass* obj );
+  void Play_Sound ( GameObject* obj );
+  void Stop_Sound ( GameObject* obj );
+
+  float lastFacing;
+  int emitterID;
+
+  float minRotate;
+};
+
+class DB_Turret_Spawn : public ScriptImpClass
+{
+  int turretId;
+  bool hasDriver;
+  void Created(GameObject *obj);
+  void Custom(GameObject *obj,int message,int param,GameObject *sender);
+  void Killed(GameObject *obj,GameObject *killer);
+  void Destroyed(GameObject *obj);
+};
\ No newline at end of file
diff -uwrN sourceold/scripts/DBScripts.cpp source/scripts/DBScripts.cpp
--- sourceold/scripts/DBScripts.cpp	2016-11-25 15:02:11.915641100 +1000
+++ source/scripts/DBScripts.cpp	2017-01-22 19:56:58.286626000 +1000
@@ -5,7 +5,6 @@
 #include "BeaconGameObjDef.h"
 #include "gmplugin.h"
 #include "gmgame.h"
-#include "gmlog.h"
 #include "TeamPurchaseSettingsDefClass.h"
 #include "PurchaseSettingsDefClass.h"
 #include "PowerupGameObj.h"
@@ -728,8 +727,8 @@
 				{
 					weapon->Set_Clip_Rounds(weapon->Get_Definition()->ClipSize);
 				}
-				Commands->Send_Custom_Event(obj,Commands->Find_Object(Get_Int_Parameter("BuildingID")),826455,Get_Object_Type(Aircraft),0);
 				*/
+				Commands->Send_Custom_Event(obj,Commands->Find_Object(Get_Int_Parameter("BuildingID")),826455,Get_Object_Type(Aircraft),0);
 			}
 
 		Commands->Start_Timer(obj, this, 2, number);
diff -uwrN sourceold/scripts/DB_General.h source/scripts/DB_General.h
--- sourceold/scripts/DB_General.h	2016-11-19 11:50:02.490453700 +1000
+++ source/scripts/DB_General.h	2016-12-31 09:28:56.289000000 +1000
@@ -22,3 +22,5 @@
 	UPGRADE_INFANTRY_ARMOR_AMOUNT = 10,
 	UPGRADE_INFANTRY_ARMOR_CUSTOM = 70008001,
 };
+
+#define REATTACH_BONES_CUSTOM 9320943
\ No newline at end of file
diff -uwrN sourceold/scripts/DB_Research_Terminals.cpp source/scripts/DB_Research_Terminals.cpp
--- sourceold/scripts/DB_Research_Terminals.cpp	2016-11-25 15:02:11.925641100 +1000
+++ source/scripts/DB_Research_Terminals.cpp	2017-01-22 19:56:58.293626000 +1000
@@ -23,7 +23,15 @@
 #include "SoldierGameObjDef.h"
 #include "PowerupGameObjDef.h"
 #include "BuildingGameObj.h"
-#include "gmlog.h"
+
+void Set_Model_Custom(GameObject *obj,const char *Model_Name)
+{
+	if(obj)
+	{
+		Commands->Set_Model(obj,Model_Name);
+		Commands->Send_Custom_Event(obj,obj,REATTACH_BONES_CUSTOM,0,0);
+	}
+}
 
 void DB_Research_Listener::Created(GameObject *obj)
 {
@@ -524,7 +532,7 @@
 		Set_Max_Shield_Strength(obj, NewMaxAP);
 		Commands->Set_Shield_Strength(obj, NewAP);
 		if(strcmp(model,"") != 0)
-			Commands->Set_Model(obj,model);
+			Set_Model_Custom(obj,model);
 	}
 }
 void DB_Research_Infantry_Hitpoints_Ability::Custom(GameObject *obj, int message, int param, GameObject *sender)
@@ -546,7 +554,7 @@
 		Set_Max_Shield_Strength(obj, NewMaxAP);
 		Commands->Set_Shield_Strength(obj, NewAP);
 		if(strcmp(model,"") != 0)
-			Commands->Set_Model(obj,model);
+			Set_Model_Custom(obj,model);
 		Create_2D_Wave_Sound_Dialog_Player(obj, Get_Parameter("Unit_Upgraded_Sound"));
 		Send_Message_Player(obj,255,255,255,"Unit Upgraded!");
 	}
@@ -603,7 +611,7 @@
 			}
 			//Remove_Weapon(obj,Get_Weapon(obj,0));
 			if(strcmp(model,"") != 0)
-				Commands->Set_Model(obj,model);
+				Set_Model_Custom(obj,model);
 		}
 		else
 		{
@@ -665,7 +673,7 @@
 		}
 		
 		if(strcmp(model,"") != 0)
-			Commands->Set_Model(obj,model);
+			Set_Model_Custom(obj,model);
 		Create_2D_Wave_Sound_Dialog_Player(obj, Get_Parameter("Unit_Upgraded_Sound"));
 		Send_Message_Player(obj,255,255,255,"Unit Upgraded!");
 	}
@@ -700,7 +708,7 @@
 		Commands->Set_Health(obj, NewHP);
 
 		if(strcmp(model,"") != 0)
-			Commands->Set_Model(obj,model);
+			Set_Model_Custom(obj,model);
 	
 	}
 }
@@ -729,7 +737,7 @@
 
 
 		if(strcmp(model,"") != 0)
-			Commands->Set_Model(obj,model);
+			Set_Model_Custom(obj,model);
 		Create_2D_Wave_Sound_Dialog_Player(obj, Get_Parameter("Unit_Upgraded_Sound"));
 		Send_Message_Player(obj,255,255,255,"Unit Upgraded!");
 	}
@@ -749,7 +757,7 @@
 		const char *model = Get_Parameter("Model");
 		Attach_Script_V(obj,"dp88_buildingScripts_functionMoneyTrickle","%f",TickRate);
 		if(strcmp(model,"") != 0)
-			Commands->Set_Model(obj,model);
+			Set_Model_Custom(obj,model);
 	}
 }
 void DB_Research_Credit_Tick::Custom(GameObject *obj, int message, int param, GameObject *sender)
@@ -761,7 +769,7 @@
 		const char *model = Get_Parameter("Model");
 		Attach_Script_V(obj,"dp88_buildingScripts_functionMoneyTrickle","%f",TickRate);
 		if(strcmp(model,"") != 0)
-			Commands->Set_Model(obj,model);
+			Set_Model_Custom(obj,model);
 		Create_2D_Wave_Sound_Dialog_Player(obj, Get_Parameter("Unit_Upgraded_Sound"));
 		Send_Message_Player(obj,255,255,255,"Unit Upgraded!");
 
@@ -817,7 +825,7 @@
 	if(UpgradeComplete.Get(UpgradeID,0))
 	{
 		model = Get_Parameter("Upgraded_Model_Name");
-		Commands->Set_Model(obj,model);
+		Set_Model_Custom(obj,model);
 		float MaxHP = Commands->Get_Max_Health(obj);
 		float NewMaxHP = MaxHP + Get_Float_Parameter("Extra_Health_Amount");
 		float CurHP = Commands->Get_Health(obj);
@@ -841,7 +849,7 @@
 		model = Get_Parameter("Upgraded_Model_Name");
 		if(mode == 0)
 		{
-			Commands->Set_Model(obj,model);
+			Set_Model_Custom(obj,model);
 		}
 		else if(mode == 1)
 		{
@@ -849,7 +857,7 @@
 			sprintf(deployedmodel,"%s_d",model);
 			float frame = Get_Animation_Frame(obj);
 			char deployanim[512];
-			Commands->Set_Model(obj,deployedmodel);
+			Set_Model_Custom(obj,deployedmodel);
 			sprintf(deployanim,"%s_d.%s_d",model,model);
 			Commands->Set_Animation(obj,deployanim,false,0,frame,-1,0);
 		}
@@ -857,7 +865,7 @@
 		{
 			char deployedmodel[512];
 			sprintf(deployedmodel,"%s_dd",model);
-			Commands->Set_Model(obj,deployedmodel);
+			Set_Model_Custom(obj,deployedmodel);
 		}
 		else if(mode == 3)
 		{
@@ -865,7 +873,7 @@
 			sprintf(deployedmodel,"%s_d",model);
 			float frame = Get_Animation_Frame(obj);
 			char deployanim[512];
-			Commands->Set_Model(obj,deployedmodel);
+			Set_Model_Custom(obj,deployedmodel);
 			sprintf(deployanim,"%s_d.%s_d",model,model);
 			Commands->Set_Animation(obj,deployanim,false,0,frame,0,0);
 		}
@@ -919,7 +927,7 @@
 			{
 				obj->As_VehicleGameObj()->Set_Immovable(true);
 				mode = 1;
-				Commands->Set_Model(obj,dmodel);
+				Set_Model_Custom(obj,dmodel);
 				Commands->Set_Shield_Type(obj,Get_Parameter("Armor"));
 				Commands->Set_Animation(obj,deployanim,false,0,0,-1,0);
 				Commands->Clear_Weapons(obj);
@@ -935,7 +943,7 @@
 		else if (mode == 2)
 		{
 			mode = 3;
-			Commands->Set_Model(obj,dmodel);
+			Set_Model_Custom(obj,dmodel);
 			Commands->Set_Animation(obj,deployanim,false,0,Get_Float_Parameter("Last_Deploy_Frame"),0,0);
 			Commands->Clear_Weapons(obj);
 			Commands->Give_PowerUp(obj,Get_Parameter("Weapon_Powerup_Name2"),false);
@@ -959,7 +967,7 @@
 	if (!_stricmp(animation_name,deployanim) && (mode == 1))
 	{
 		mode = 2;
-		Commands->Set_Model(obj,deployedmodel);
+		Set_Model_Custom(obj,deployedmodel);
 		obj->As_PhysicalGameObj()->Clear_Animation();
 		Commands->Control_Enable(Commands->Find_Object(PilotID),true);
 		obj->As_VehicleGameObj()->Set_Scripts_Can_Fire(true);
@@ -974,7 +982,7 @@
 	{
 		obj->As_VehicleGameObj()->Set_Immovable(false);
 		mode = 0;
-		Commands->Set_Model(obj,model);
+		Set_Model_Custom(obj,model);
 		obj->As_PhysicalGameObj()->Clear_Animation();
 		Commands->Set_Shield_Type(obj,Get_Parameter("Armor2"));
 		Commands->Control_Enable(Commands->Find_Object(PilotID),true);
diff -uwrN sourceold/scripts/RawFileClass.h source/scripts/RawFileClass.h
--- sourceold/scripts/RawFileClass.h	2016-10-31 07:17:12.391013500 +1000
+++ source/scripts/RawFileClass.h	2017-01-22 20:28:02.575035500 +1000
@@ -412,10 +412,10 @@
 			{
 				for (int i = 0;i < sz;i++)
 				{
-					if (buf[i] == 0xA)
+					if (buf[i] == '\n')
 					{
 						buf[i + 1] = 0;
-						Seek(1 - sz - i,1);
+						Seek(i - sz + 1,1);
 						b = false;
 					}
 				}
diff -uwrN sourceold/scripts/SoldierGameObj.h source/scripts/SoldierGameObj.h
--- sourceold/scripts/SoldierGameObj.h	2016-12-09 10:52:52.622021900 +1000
+++ source/scripts/SoldierGameObj.h	2017-01-05 11:59:07.160605800 +1000
@@ -272,6 +272,8 @@
 	bool						movementLoitersAllowed;
 	bool						useStockGhostBehavior;
 	bool						OverrideMuzzleDirection;
+	bool						UpdatedTarget;
+	bool						DoTilt;
 	TT_DEPRECATED("Do not use") int						Check(void);
 }; // size: 3404
 
diff -uwrN sourceold/scripts/cPlayerKill.h source/scripts/cPlayerKill.h
--- sourceold/scripts/cPlayerKill.h	1970-01-01 10:00:00.000000000 +1000
+++ source/scripts/cPlayerKill.h	2017-01-22 19:51:12.959825900 +1000
@@ -0,0 +1,17 @@
+#ifndef TT_INCLUDE_CPLAYERKILL_H
+#define TT_INCLUDE_CPLAYERKILL_H
+#include "cNetEvent.h"
+
+class cPlayerKill : public cNetEvent {
+public:
+	int id1;
+	int id2;
+	cPlayerKill();
+	void Init(int player1, int player2);
+	virtual uint Get_Network_Class_ID() const;
+	virtual void Import_Creation(BitStreamClass& stream);
+	virtual void Export_Creation(BitStreamClass& stream);
+	virtual void Act();
+};
+
+#endif
\ No newline at end of file
diff -uwrN sourceold/scripts/cPurchaseResponseEvent.h source/scripts/cPurchaseResponseEvent.h
--- sourceold/scripts/cPurchaseResponseEvent.h	1970-01-01 10:00:00.000000000 +1000
+++ source/scripts/cPurchaseResponseEvent.h	2017-01-18 23:14:30.134112700 +1000
@@ -0,0 +1,41 @@
+/*	Renegade Scripts.dll
+Copyright 2013 Tiberian Technologies
+
+This file is part of the Renegade scripts.dll
+The Renegade scripts.dll is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 2, or (at your option) any later
+version. See the file COPYING for more details.
+In addition, an exemption is given to allow Run Time Dynamic Linking of this code with any closed source module that does not contain code covered by this licence.
+Only the source code to the module(s) containing the licenced code has to be released.
+*/
+#ifndef TT_INCLUDE__CPURCHASERESPONSEEVENT_H
+#define TT_INCLUDE__CPURCHASERESPONSEEVENT_H
+
+#include "cNetEvent.h"
+
+
+class cPurchaseResponseEvent : public cNetEvent
+{
+
+private:
+
+   sint32 clientId;        // 1716
+   sint32 reply;           // 1720
+
+
+public:
+
+   cPurchaseResponseEvent();
+
+   virtual unsigned int Get_Network_Class_ID () const;
+   virtual void   Import_Creation      (BitStreamClass& oStream);
+   virtual void   Export_Creation      (BitStreamClass& oStream);
+   virtual void   Act                  ();
+
+   void Init (sint32 reply, sint32 clientId);
+
+};
+
+
+#endif
diff -uwrN sourceold/scripts/dllmain.cpp source/scripts/dllmain.cpp
--- sourceold/scripts/dllmain.cpp	2016-11-24 12:15:26.070870700 +1000
+++ source/scripts/dllmain.cpp	2017-01-18 23:09:21.418112700 +1000
@@ -273,6 +273,8 @@
 	Update_Network_Object_Player = (unop)Address(tt,"Update_Network_Object_Player");
 	Send_Client_Text = (sct)Address(tt,"Send_Client_Text");
 	Send_Client_Announcement = (sca)Address(tt,"Send_Client_Announcement");
+	Send_Player_Kill_Message = (spkm)Address(tt, "Send_Player_Kill_Message");
+	Send_Purchase_Response = (spr)Address(tt, "Send_Purchase_Response");
 	AddShaderNotify = (asn)Address(tt,"AddShaderNotify");
 	RemoveShaderNotify = (rsn)Address(tt,"RemoveShaderNotify");
 	Do_Objectives_Dlg = (dod)Address(tt,"Do_Objectives_Dlg");
@@ -363,6 +365,7 @@
 	Set_Background_Music_Player_Offset = (sbgmo)Address(tt,"Set_Background_Music_Player_Offset");
 	Set_Camera_Player = (setcam)Address(tt,"Set_Camera_Player");
 	Set_Definition_TranslationID_Player = (settran)Address(tt,"Set_Definition_TranslationID_Player");
+	Set_Net_Update_Rate_Player = (setnur)Address(tt,"Set_Net_Update_Rate_Player");
 
 #ifdef SSGM
 	SSGMGameManager::Init();
diff -uwrN sourceold/scripts/engine_tt.cpp source/scripts/engine_tt.cpp
--- sourceold/scripts/engine_tt.cpp	2016-11-24 12:15:26.071870700 +1000
+++ source/scripts/engine_tt.cpp	2017-01-18 23:09:21.413112700 +1000
@@ -132,6 +132,8 @@
 SCRIPTS_API unop Update_Network_Object_Player;
 SCRIPTS_API sct Send_Client_Text;
 SCRIPTS_API sca Send_Client_Announcement;
+SCRIPTS_API spkm Send_Player_Kill_Message;
+SCRIPTS_API spr Send_Purchase_Response;
 SCRIPTS_API dod Do_Objectives_Dlg;
 SCRIPTS_API sl Set_Player_Limit;
 SCRIPTS_API gl Get_Player_Limit;
@@ -213,6 +215,7 @@
 SCRIPTS_API sbgmo Set_Background_Music_Player_Offset;
 SCRIPTS_API setcam Set_Camera_Player;
 SCRIPTS_API settran Set_Definition_TranslationID_Player;
+SCRIPTS_API setnur Set_Net_Update_Rate_Player;
 
 SCRIPTS_API bool Can_Team_Build_Vehicle(int Team)
 {
diff -uwrN sourceold/scripts/engine_tt.h source/scripts/engine_tt.h
--- sourceold/scripts/engine_tt.h	2016-11-24 12:15:26.071870700 +1000
+++ source/scripts/engine_tt.h	2017-01-18 23:09:21.407112700 +1000
@@ -23,6 +23,8 @@
 class WideStringClass;
 class cScTextObj;
 class SCAnnouncement;
+class cPlayerKill;
+class cPurchaseResponseEvent;
 //start per-player script commands stuff
 typedef void (*_Enable_Stealth_Player) (GameObject *obj,GameObject *obj2,bool enable);
 typedef void (*_Set_Fog_Enable_Player) (GameObject *obj,bool enable);
@@ -139,6 +141,8 @@
 typedef void (*unop) (NetworkObjectClass *Object,int ID);
 typedef cScTextObj *(*sct) (const WideStringClass& message, TextMessageEnum type, bool popup, int senderId, int receiverId, bool dodirtybit, bool doact);
 typedef SCAnnouncement *(*sca) (int _receiptientId, int _senderId, int _translationId, AnnouncementEnum _type, int _emoticonId, bool dodirtybit, bool doact);
+typedef cPlayerKill *(*spkm) (int Killer, int Victim);
+typedef cPurchaseResponseEvent *(*spr) (int ID, int Type);
 typedef bool (*iwu) (wchar_t *WideName);
 typedef void (*cee) (const char *Explosion, Vector3 &Pos, GameObject *Creator);
 typedef void (*rwpa) (DynamicVectorClass<int> &WaypathIDs);
@@ -168,6 +172,7 @@
 typedef void (*sbgmo) (GameObject *obj,const char *music,float startoffset);
 typedef void (*setcam) (GameObject *obj,const char *camera);
 typedef void (*settran) (GameObject *obj,int defid,int stringid);
+typedef void (*setnur) (GameObject *obj,int rate);
 SCRIPTS_API extern gpl Get_Player_List;
 SCRIPTS_API extern gcmi Get_Current_Map_Index;
 SCRIPTS_API extern gm Get_Map;
@@ -272,6 +277,8 @@
 SCRIPTS_API extern unop Update_Network_Object_Player;
 SCRIPTS_API extern sct Send_Client_Text;
 SCRIPTS_API extern sca Send_Client_Announcement;
+SCRIPTS_API extern spkm Send_Player_Kill_Message;
+SCRIPTS_API extern spr Send_Purchase_Response;
 SCRIPTS_API extern dod Do_Objectives_Dlg;
 SCRIPTS_API extern sl Set_Player_Limit;
 SCRIPTS_API extern gl Get_Player_Limit;
@@ -339,6 +346,7 @@
 SCRIPTS_API extern sbgmo Set_Background_Music_Player_Offset;
 SCRIPTS_API extern setcam Set_Camera_Player;
 SCRIPTS_API extern settran Set_Definition_TranslationID_Player;
+SCRIPTS_API extern setnur Set_Net_Update_Rate_Player;
 
 class SCRIPTS_API JFW_Key_Hook_Base : public ScriptImpClass {
 public:
diff -uwrN sourceold/scripts/jfwweap.cpp source/scripts/jfwweap.cpp
--- sourceold/scripts/jfwweap.cpp	2016-10-31 07:17:12.525013500 +1000
+++ source/scripts/jfwweap.cpp	2017-01-18 17:52:28.777213800 +1000
@@ -1,4 +1,4 @@
-Renegade Scripts.dll
+/*  Renegade Scripts.dll
 	Copyright 2013 Tiberian Technologies
 
 	This file is part of the Renegade scripts.dll
diff -uwrN sourceold/scripts/jmgBearHunter.cpp source/scripts/jmgBearHunter.cpp
--- sourceold/scripts/jmgBearHunter.cpp	2016-12-14 05:47:13.345801000 +1000
+++ source/scripts/jmgBearHunter.cpp	2016-12-31 09:28:56.292000000 +1000
@@ -6683,6 +6683,18 @@
 	JMG_Wandering_AI_Controller::wanderPoints += node;
 	Commands->Destroy_Object(obj);
 }
+void JMG_Wandering_AI_Wander_Point_Dont_Remove::Created(GameObject *obj)
+{
+	if (!JMG_Wandering_AI_Controller::setup)
+	{
+		Console_Input("msg JMG_Wandering_AI_Wander_Point_Dont_Remove ERROR:: Make sure you have the script JMG_Wandering_AI_Controller placed on the map!");
+		Commands->Destroy_Object(obj);
+		return;
+	}
+	Rp2SimplePositionSystem::SimplePositionNode *node = new Rp2SimplePositionSystem::SimplePositionNode(obj);
+	node->value = Get_Int_Parameter("GroupId");
+	JMG_Wandering_AI_Controller::wanderPoints += node;
+}
 void JMG_Utility_Custom_Spawn_System_Controller::Destroyed(GameObject *obj)
 {
 	JMG_Utility_Custom_Spawn_System_Controller::setup = false;
@@ -7435,6 +7447,19 @@
 	*position = node->position;
 	return true;
 }
+bool JMG_Utility_AI_Guardian_Generic::Get_A_Defense_Point(Vector3 *position)
+{
+	Rp2SimplePositionSystem::SimplePositionNode *node = NULL;
+	if (Get_Int_Parameter("WanderingAIGroupID") != -1)
+		node = JMG_Wandering_AI_Controller::wanderPoints.GetRandomFromGroup(Get_Int_Parameter("WanderingAIGroupID"));
+	if (!node)
+	{
+		Console_Input("msg JMG_Utility_AI_Guardian_Generic ERROR: No wander points could be found for that group!");
+		return false;
+	}
+	*position = node->position;
+	return true;
+}
 bool JMG_Utility_Zone_Teleport_To_Random_Wander_Point::Get_A_Defense_Point(Vector3 *position,float *facing)
 {
 	Rp2SimplePositionSystem::SimplePositionNode *node = NULL;
@@ -7706,6 +7731,7 @@
 ScriptRegistrant<JMG_Wandering_AI> JMG_Wandering_AI_Registrant("JMG_Wandering_AI","GroupID=-1:int,Wander_Speed=1.0:float,Normal_Range=3.0:float,Vehicle_Range=12.5:float,Attack_Move_Range=1.4:float");
 ScriptRegistrant<JMG_Wandering_AI_Controller> JMG_Wandering_AI_Controller_Registrant("JMG_Wandering_AI_Controller","");
 ScriptRegistrant<JMG_Wandering_AI_Wander_Point> JMG_Wandering_AI_Wander_Point_Registrant("JMG_Wandering_AI_Wander_Point","GroupId:int");
+ScriptRegistrant<JMG_Wandering_AI_Wander_Point_Dont_Remove> JMG_Wandering_AI_Wander_Point_Dont_Remove_Registrant("JMG_Wandering_AI_Wander_Point_Dont_Remove","GroupId:int");
 ScriptRegistrant<JMG_Utility_Custom_Spawn_System_Controller> JMG_Utility_Custom_Spawn_System_Controller_Registrant("JMG_Utility_Custom_Spawn_System_Controller","");
 ScriptRegistrant<JMG_Utility_Custom_Spawn_System_Point> JMG_Utility_Custom_Spawn_System_Point_Registrant("JMG_Utility_Custom_Spawn_System_Point","GroupId:int");
 ScriptRegistrant<JMG_Utility_Custom_Spawn_System> JMG_Utility_Custom_Spawn_System_Registrant("JMG_Utility_Custom_Spawn_System","Spawn_Point_Group=-1:int,Max_Spawned_At_Once=1:int,Spawn_Limit=-1:int,Respawn_Delay=10.0:float,Random_Delay=0.0:float,Delay_First_Spawn=0:int,Starts_Enabled=1:int,Enable_Message=403401,Disable_Message=403400,Preset0=null:string,Preset1=null:string,Preset2=null:string,Preset3=null:String,Preset4=null:string,Preset5=null:string,Preset6=null:string,Preset7=null:string,Preset8=null:string,Preset9=null:string,Chance0=0:int,Chance1=0:int,Chance2=0:int,Chance3=0:int,Chance4=0:int,Chance5=0:int,Chance6=0:int,Chance7=0:int,Chance8=0:int,Chance9=0:int");
diff -uwrN sourceold/scripts/jmgBearHunter.h source/scripts/jmgBearHunter.h
--- sourceold/scripts/jmgBearHunter.h	2016-10-31 07:17:12.533013500 +1000
+++ source/scripts/jmgBearHunter.h	2016-12-31 09:28:56.294000000 +1000
@@ -3146,6 +3146,9 @@
 class JMG_Wandering_AI_Wander_Point : public ScriptImpClass {
 	void Created(GameObject *obj);
 };
+class JMG_Wandering_AI_Wander_Point_Dont_Remove : public ScriptImpClass {
+	void Created(GameObject *obj);
+};
 class JMG_Utility_Custom_Spawn_System_Controller : public ScriptImpClass {
 	void Destroyed(GameObject *obj);
 public:
diff -uwrN sourceold/scripts/jmgUtility.cpp source/scripts/jmgUtility.cpp
--- sourceold/scripts/jmgUtility.cpp	2016-12-17 21:07:23.265015700 +1000
+++ source/scripts/jmgUtility.cpp	2017-01-22 19:51:59.210626000 +1000
@@ -458,7 +458,7 @@
 }
 void JMG_Utility_Basic_Spawner::Custom(GameObject *obj,int message,int param,GameObject *sender)
 {
-	if (Get_Int_Parameter("EnableCustom") && message == Get_Int_Parameter("EnableCustom"))
+	if (Get_Int_Parameter("EnableOrDisableCustom") && message == Get_Int_Parameter("EnableOrDisableCustom"))
 	{
 		if (param == 1)
 		{
@@ -876,7 +876,14 @@
 		Commands->Enable_Hibernation(obj,false);
 	}
 	Commands->Start_Timer(obj,this,1.0,1);
+	grabNextPointDistance = Get_Float_Parameter("NextWanderPointWhenLastReached")*Get_Float_Parameter("NextWanderPointWhenLastReached");
 	if (Get_Int_Parameter("WanderingAIGroupID") != -1)
+		if (grabNextPointDistance)
+		{
+			lastWanderPointSpot = Commands->Get_Position(obj);
+			Commands->Start_Timer(obj,this,0.1f,9);
+		}
+		else
 		Commands->Start_Timer(obj,this,Get_Float_Parameter("MinRandWander") == Get_Float_Parameter("MaxRandWander") ? Get_Float_Parameter("MaxRandWander") : Commands->Get_Random(Get_Float_Parameter("MinRandWander"),Get_Float_Parameter("MaxRandWander")),2);
 	Commands->Start_Timer(obj,this,5.0,3);
 	Commands->Start_Timer(obj,this,0.1f,8);
@@ -923,6 +930,8 @@
 {
 	if (damage <= 0 || Commands->Get_Player_Type(damager) == Commands->Get_Player_Type(obj))
 		return;
+	if (Is_Script_Attached(damager,"JMG_Utility_AI_Vehicle_Ignored"))
+		return;
 	if (!_stricmp(Get_Skin(damager),"Blamo") || !_stricmp(Get_Shield_Type(damager),"Blamo"))
 		return;
 	if(!attacking)
@@ -933,6 +942,8 @@
 }
 void JMG_Utility_AI_Vehicle::Enemy_Seen(GameObject *obj,GameObject *seen)
 {
+	if (Is_Script_Attached(seen,"JMG_Utility_AI_Vehicle_Ignored"))
+		return;
 	Vector3 enemyPos = Commands->Get_Position(seen);
 	float dist = JmgUtility::SimpleDistance(Commands->Get_Position(obj),enemyPos);
 	if (!_stricmp(Get_Skin(seen),"Blamo") || !_stricmp(Get_Shield_Type(seen),"Blamo"))
@@ -1060,6 +1071,19 @@
 		}
 		Commands->Start_Timer(obj,this,0.1f,8);
 	}
+	if (number == 9)
+	{
+		if (!Get_Int_Parameter("FollowTarget") || !currentAction.targetId)
+		{
+			if (JmgUtility::SimpleDistance(Commands->Get_Position(obj),lastWanderPointSpot) <= grabNextPointDistance)
+			{
+				GetRandomPosition(&lastWanderPointSpot);
+				moving = true;
+			}
+			AttackMove(obj,Commands->Find_Object(currentAction.targetId),false,lastWanderPointSpot,currentAction.useAmmo,0.0f,false,2.5f);
+		}
+		Commands->Start_Timer(obj,this,1.0f,9);
+	}
 }
 void JMG_Utility_AI_Vehicle::ReturnHome(GameObject * obj)
 {
@@ -1219,11 +1243,6 @@
 }
 void JMG_Utility_AI_Vehicle::StuckCheck(GameObject *obj)
 {
-	if (!moving)
-	{
-		drivingBackward= false;
-		return;
-	}
 	Vector3 current = Commands->Get_Position(obj);
 	if (reverseTime)
 	{
@@ -1231,14 +1250,19 @@
 		stuckCount = 0;
 		mypos = current;
 		drivingBackward = false;
-		AttackMove(obj,Commands->Find_Object(lastAction.targetId),lastAction.following,lastAction.position,lastAction.useAmmo,0.0f,true,currentAction.arriveDistance);
+		AttackMove(obj,Commands->Find_Object(lastAction.targetId),lastAction.following,lastAction.position,lastAction.useAmmo,0.0f,true,0.0f);
+		return;
+	}
+	if (!moving)
+	{
+		drivingBackward = false;
 		return;
 	}
 	if(JmgUtility::SimpleDistance(mypos,current) < 1.0f)
 	{
 		if(stuckCount > 2)
 		{
-			reverseTime = Commands->Get_Random_Int(1,6);
+			reverseTime = Commands->Get_Random_Int(2,6);
 			stuckCount = 0;
 			drivingBackward = true;
 			AttackMove(obj,Commands->Find_Object(lastAction.targetId),lastAction.following,lastAction.position,lastAction.useAmmo,0.0f,true,currentAction.arriveDistance);
@@ -1260,9 +1284,9 @@
 			dist = JmgUtility::SimpleDistance(Commands->Get_Position(target),mypos);
 		else
 			dist = JmgUtility::SimpleDistance(currentAction.position,mypos);
-	if (dist > minDistanceSquared+1089.0f)
+	if (minDistanceSquared && dist > minDistanceSquared+1089.0f)
 		retreatPos = mypos;
-	if (dist < minDistanceSquared && !(Get_Int_Parameter("SquishInfantry") && target->As_SoldierGameObj()))
+	if (minDistanceSquared && dist < minDistanceSquared && !(Get_Int_Parameter("SquishInfantry") && target->As_SoldierGameObj()))
 	{
 		if (retreatTime)
 			return;
@@ -1285,7 +1309,6 @@
 	Commands->Action_Reset(obj,10.0f);
 	moving = isMoving;
 	ActionParamsStruct params;
-	params.Set_Basic(this,10,10);
 	if (target)
 	{
 		JMGVehicleAmmo ammo = (fireMode ? primary : secondary);
@@ -1302,7 +1325,6 @@
 		}
 		if (Get_Int_Parameter("SquishInfantry") && target->As_SoldierGameObj() && !Is_Unsquishable(target))
 			canSquish = true;
-		Commands->Action_Attack(obj,params);
 	}
 	if (followTarget)
 		if (Is_VTOL(obj) && Get_Float_Parameter("VTOLHover") && !canSquish)
@@ -1333,10 +1355,15 @@
 			params.ShutdownEngineOnArrival = true;
 		params.MovePathfind = !doNotUsePathfind && Get_Int_Parameter("UsePathfind") ? true : false;
 	}
+	if (!target)
+		params.Set_Basic(this,10,10);
 	Commands->Action_Goto(obj,params);
 	if (target)
+	{
+		params.Set_Basic(this,10,10);
 		Commands->Action_Attack(obj,params);
 }
+}
 JMG_Utility_AI_Vehicle::JMGVehicleAmmo JMG_Utility_AI_Vehicle::DefineAmmo(const AmmoDefinitionClass *ammo)
 {
 	JMGVehicleAmmo theammo;
@@ -1756,10 +1783,12 @@
 void JMG_Utility_Display_Text_Message_To_All_Players_On_Custom::Custom(GameObject *obj,int message,int param,GameObject *sender)
 {
 	if (message == Get_Int_Parameter("Custom"))
+	{
 		JmgUtility::MessageAllPlayers((int)Get_Vector3_Parameter("ColorRGB").X,(int)Get_Vector3_Parameter("ColorRGB").Y,(int)Get_Vector3_Parameter("ColorRGB").Z,Get_Parameter("Message"));
 	if (!Get_Int_Parameter("Repeatable"))
 		Destroy_Script();
 }
+}
 void JMG_Utility_Set_Team_On_Create::Created(GameObject *obj)
 {
 	if (!Get_Float_Parameter("Delay"))
@@ -2444,6 +2473,8 @@
 }
 void JMG_Utility_AI_Guardian_Aircraft::Enemy_Seen(GameObject *obj,GameObject *seen)
 {
+	if (Is_Script_Attached(seen,"JMG_Utility_AI_Guardian_Ignored"))
+		return;
 	if (!EnemyID || !EnemyTimeOutTime)
 	{
 		EnemyID = Commands->Get_ID(seen);
@@ -2966,6 +2997,8 @@
 		if (objectId)
 		{
 			GameObject *point = Commands->Find_Object(objectId);
+			if (!point)
+				Console_Input("msg JMG_Utility_AI_Aggressive_Attack_Spot_Point2 ERROR: Could not find the ObjectID specified!");
 			attackSpot = Commands->Get_Position(point);
 			Commands->Destroy_Object(point);
 		}
@@ -2989,7 +3022,8 @@
 	lastSeenTime = 0;
 	stuckTime = 0;
 	reverseTime = 0;
-	const AmmoDefinitionClass *ammo = Get_Weapon_Ammo_Definition(Get_Current_Weapon(obj),true);
+	usePrimaryFire = Get_Int_Parameter("UseSecondaryFire") ? false : true;
+	const AmmoDefinitionClass *ammo = Get_Weapon_Ammo_Definition(Get_Current_Weapon(obj),usePrimaryFire);
 	if (ammo)
 	{
 		weaponRange = ammo->Range;
@@ -3149,14 +3183,14 @@
 		location.X += attackNode->attackOffset.X;
 		location.Y += attackNode->attackOffset.Y;
 		location.Z += attackNode->attackOffset.Z;
-		params.Set_Attack(location,weaponRange,0.0f,true);
+		params.Set_Attack(location,weaponRange,0.0f,usePrimaryFire);
 		params.AttackLocation = location;
 		params.AttackCheckBlocked = false;
 		Commands->Action_Attack(obj,params);
 	}
 	else if (target && attack)
 	{
-		params.Set_Attack(target,weaponRange,0.0f,true);
+		params.Set_Attack(target,weaponRange,0.0f,usePrimaryFire);
 		Commands->Action_Attack(obj,params);
 	}
 }
@@ -3441,7 +3475,7 @@
 	controllerPlaced = true;
 	for (int x = 0;x < 128;x++)
 		playerNames[x][0] = '\0';
-	BasicObjectiveSystem = NewObjectiveSystem(2,Get_Int_Parameter("ShowMarkersOnRadar") ? true : false,Get_Parameter("PrimaryObjectiveModel"),Get_Parameter("SecondaryObjectiveModel"),Get_Parameter("TertiaryObjectiveModel"));
+	BasicObjectiveSystem = NewObjectiveSystem(Get_Int_Parameter("Team"),Get_Int_Parameter("ShowMarkersOnRadar") ? true : false,Get_Parameter("PrimaryObjectiveModel"),Get_Parameter("SecondaryObjectiveModel"),Get_Parameter("TertiaryObjectiveModel"));
 	Commands->Start_Timer(obj,this,1.0f,1);
 }
 void JMG_Utility_Objective_System_Controller::Timer_Expired(GameObject *obj,int number)
@@ -3882,6 +3916,8 @@
 }
 void JMG_Utility_AI_Guardian_Infantry::Enemy_Seen(GameObject *obj,GameObject *seen)
 {
+	if (Is_Script_Attached(seen,"JMG_Utility_AI_Guardian_Ignored"))
+		return;
 	if (!EnemyID || !EnemyTimeOutTime)
 	{
 		EnemyID = Commands->Get_ID(seen);
@@ -4265,6 +4301,8 @@
 	GameObject *object = id ? (id == -1 ? enter : Commands->Find_Object(id)) : obj;
 	if (object)
 		Commands->Send_Custom_Event(obj,object,Get_Int_Parameter("Custom"),Get_Int_Parameter("Param"),Get_Float_Parameter("Delay"));
+	if (Get_Int_Parameter("RemoveWeapon"))
+		Remove_Weapon(enter,Get_Parameter("WeaponName"));
 	if (Get_Int_Parameter("TriggerOnce"))
 		Destroy_Script();
 }
@@ -4615,6 +4653,7 @@
 }
 void JMG_Utility_Custom_Display_Briefing_Message::Created(GameObject *obj)
 {
+	triggered = false;
 	BriefingText = NULL;
 	CurrentNode = NULL;
 	int File = Commands->Text_File_Open(Get_Parameter("FileName"));
@@ -4638,7 +4677,7 @@
 			int Count = 0;
 			for (int x = 0;x < 16384;x++)
 			{
-				if ((Count > 150 && TextString[x] == ' ') || Count == 220)
+				if ((Count > 150 && TextString[x] == ' ') || Count == 210)
 				{// String getting too long, start a new one.
 					CurrentNode->Text[Count] = '\0';
 					AddNewTextNode();
@@ -4699,6 +4738,9 @@
 {
 	if (message == Get_Int_Parameter("Custom"))
 	{
+		if (triggered)
+			return;
+		triggered = true;
 		Commands->Start_Timer(obj,this,0.0f,56345344);
 		Commands->Create_2D_Sound(Get_Parameter("UISound"));
 	}
@@ -5181,6 +5223,8 @@
 }
 GameObject *JMG_Utility_AI_Goto_Enemy::findClosestStar(GameObject *obj)
 {
+	if (Commands->Get_Player_Type(obj) == -2)
+		return NULL;
 	GameObject *nearest = NULL;
 	float nearDist = -1.0f;
 	Vector3 pos = Commands->Get_Position(obj);
@@ -5504,6 +5548,8 @@
 }
 GameObject *JMG_Utility_AI_Goto_Enemy_Not_Star::findClosestStar(GameObject *obj)
 {
+	if (Commands->Get_Player_Type(obj) == -2)
+		return NULL;
 	GameObject *nearest = NULL;
 	float nearDist = -1.0f;
 	Vector3 pos = Commands->Get_Position(obj);
@@ -5771,6 +5817,8 @@
 }
 void JMG_Utility_AI_Guardian_Vehicle::Enemy_Seen(GameObject *obj,GameObject *seen)
 {
+	if (Is_Script_Attached(seen,"JMG_Utility_AI_Guardian_Ignored"))
+		return;
 	if (!EnemyID || !EnemyTimeOutTime)
 	{
 		EnemyID = Commands->Get_ID(seen);
@@ -5867,8 +5915,14 @@
 char JMG_Utility_Send_Custom_On_Deaths_Controller::remainingPlural[220] = "";
 int JMG_Utility_Send_Custom_On_Deaths_Controller::reminderMessageOrder = 0;
 int JMG_Utility_Send_Custom_On_Deaths_Controller::myId = 0;
+bool JMG_Utility_Send_Custom_On_Deaths_Controller::controllerPlaced = false;
 void JMG_Utility_Send_Custom_On_Deaths_Controller::Created(GameObject *obj)
 {
+	if (controllerPlaced)
+	{
+		Console_Input("msg JMG_Utility_Send_Custom_On_Deaths_Controller ERROR: Only place one controller on the map at a time!");
+		return;
+	}
 	deathCount = 0;
 	maxDeaths = Get_Int_Parameter("MaxDeaths");
 	deathReminder = Get_Int_Parameter("DeathReminder");
@@ -5887,8 +5941,13 @@
 	sprintf(deathPlural,"%s",Get_Parameter("DeathPlural"));
 	sprintf(remainingSingular,"%s",Get_Parameter("RemainingSingular"));
 	sprintf(remainingPlural,"%s",Get_Parameter("RemainingPlural"));
+	controllerPlaced = true;
 	myId = Commands->Get_ID(obj);
 }
+void JMG_Utility_Send_Custom_On_Deaths_Controller::Destroyed(GameObject *obj)
+{
+	controllerPlaced = false;
+}
 void JMG_Utility_Send_Custom_On_Deaths_Controller::Custom(GameObject *obj,int message,int param,GameObject *sender)
 {
 	if (message == 8765432 && param == 8765432)
@@ -5908,6 +5967,8 @@
 }
 void JMG_Utility_Send_Custom_On_Deaths_Reporter::Killed(GameObject *obj,GameObject *killer)
 {
+	if (!JMG_Utility_Send_Custom_On_Deaths_Controller::controllerPlaced)
+		return;
 	JMG_Utility_Send_Custom_On_Deaths_Controller::deathCount++;
 	int deathCount = JMG_Utility_Send_Custom_On_Deaths_Controller::deathCount;
 	int remainingLives = JMG_Utility_Send_Custom_On_Deaths_Controller::maxDeaths-JMG_Utility_Send_Custom_On_Deaths_Controller::deathCount;
@@ -6476,7 +6537,7 @@
 void JMG_Utility_Player_Count_Enable_Spawners::Created(GameObject *obj)
 {
 	enabled = Get_Int_Parameter("StartsEnabled") ? true : false;
-	enableCustom = Get_Int_Parameter("EnableCustom");
+	enableCustom = Get_Int_Parameter("EnableOrDisableCustom");
 	playerCount = Get_Vector3_Parameter("PlayerCount[eq|<|>]");
 	playerCount2 = Get_Vector3_Parameter("PlayerCount[neq|between(|)]");
 	conditionMatching = false;
@@ -6533,7 +6594,7 @@
 		location = Commands->Get_Position(obj);
 	range = Get_Float_Parameter("Range");
 	range *= range;
-	enableCustom = Get_Int_Parameter("EnableCustom");
+	enableCustom = Get_Int_Parameter("EnableOrDisableCustom");
 	enabled = Get_Int_Parameter("StartsEnabled") ? true : false;
 	selectWeapon = Get_Int_Parameter("SelectWeapon") ? true : false;
 	weaponAmmo = Get_Int_Parameter("WeaponAmmo");
@@ -6655,6 +6716,9 @@
 	messageFollowerLostId = Get_Int_Parameter("MessageFollowerLostID");
 	messageFollowerInjuredId = Get_Int_Parameter("MessageFollowerInjuredID");
 	messageFollowerKilledId = Get_Int_Parameter("MessageFollowerKilledID");
+	lastPos = Commands->Get_Position(obj);
+	maxFollowTime = Get_Int_Parameter("MaxFollowTime");
+	maxIdleTime = Get_Int_Parameter("MaxIdleTime");
 	Commands->Start_Timer(obj,this,0.1f,1);
 	Commands->Enable_Enemy_Seen(obj,true);
 	Commands->Enable_HUD_Pokable_Indicator(obj,true);
@@ -6677,7 +6741,7 @@
 {
 	if (number == 1)
 	{
-		float speed = followNearSpeed;
+		float speed = runHomeSpeed;
 		float distance = followDistance;
 		Vector3 myPos = Commands->Get_Position(obj);
 		if (enemySeen)
@@ -6694,12 +6758,38 @@
 		else if (enemyId)
 			ForgetEnemy(obj);
 		GameObject *player = Commands->Find_Object(playerObjectId);
+		if (player)
+		{
+			bool quitFollowing = false;
+			if (maxFollowTime)
+			{
+				currentFollowTime++;
+				if (currentFollowTime == maxFollowTime)
+					quitFollowing = true;
+			}
+			if (maxIdleTime && JmgUtility::SimpleDistance(myPos,lastPos) <= 0.0f)
+			{
+				currentIdleTime++;
+				if (currentIdleTime == maxIdleTime)
+					quitFollowing = true;
+			}
+			else
+				currentIdleTime = 0;
+			if (quitFollowing)
+			{
+				ShowPlayerMessage(player,messageFollowerLostId,messageColor);
+				SendCustom(obj,lostCustom);
+				GiveUpOnPlayer(obj,true);
+				player = NULL;
+			}
+			lastPos = myPos;
+		}
 		if (pokerPlayerId && !player)
 		{
 			SendCustom(obj,lostCustom);
 			GiveUpOnPlayer(obj,true);
 		}
-		else
+		else if (player)
 		{
 			float tempDist = JmgUtility::SimpleDistance(Commands->Get_Position(player),myPos);
 			if (tempDist >= followVeryFarDistance)
@@ -6709,15 +6799,15 @@
 			else
 				speed = followNearSpeed;
 		}
-		if (hurt)
+		if (hurt || !player)
 		{
 			distance = 1.0f;
 			speed = runHomeSpeed;
 		}
-		if (hurt && healWhileAtHomeLocation && Commands->Get_Shield_Strength(obj) < Commands->Get_Max_Shield_Strength(obj) && JmgUtility::SimpleDistance(myPos,homeLocation) <= 2.0f)
+		if (healWhileAtHomeLocation && Commands->Get_Shield_Strength(obj) < Commands->Get_Max_Shield_Strength(obj) && JmgUtility::SimpleDistance(myPos,homeLocation) <= 2.0f)
 		{
 			Commands->Apply_Damage(obj,-healWhileAtHomeLocation,"None",0);
-			if (!pokerPlayerId && fallbackWithoutArmor && Commands->Get_Shield_Strength(obj) >= Commands->Get_Max_Shield_Strength(obj))
+			if (hurt && !pokerPlayerId && fallbackWithoutArmor && Commands->Get_Shield_Strength(obj) >= Commands->Get_Max_Shield_Strength(obj))
 			{
 				Commands->Enable_HUD_Pokable_Indicator(obj,true);
 				SendCustom(obj,healedCustom);
@@ -6788,6 +6878,8 @@
 		ShowPlayerMessage(poker,messageHealingRequiredId,messageColor);
 		return;
 	}
+	currentFollowTime = 0;
+	currentIdleTime = 0;
 	SendCustom(obj,pokedCustom);
 	pokerPlayerId = playerId;
 	playerObjectId = Commands->Get_ID(poker);
@@ -6834,7 +6926,7 @@
 {
 	if (!custom)
 		return;
-	GameObject *controller = Commands->Find_Object(sendCustomId);
+	GameObject *controller = sendCustomId ? Commands->Find_Object(sendCustomId) : obj;
 	if (controller)
 		Commands->Send_Custom_Event(obj,controller,custom,0,0);
 }
@@ -6934,13 +7026,13 @@
 	leavingFieldStringId = Get_Int_Parameter("Warning_StringID");
 	errorMessageColor = Get_Vector3_Parameter("Warning_Color");
 	screenFadeColor = Get_Vector3_Parameter("Screen_Fade_Color");
-	myPos = Commands->Get_Position(obj);
 	Commands->Start_Timer(obj,this,0.1f,1);
 }
 void JMG_Utility_Damage_When_Outside_Of_Range::Timer_Expired(GameObject *obj, int number)
 {
 	if (number == 1)
 	{
+		Vector3 myPos = Commands->Get_Position(obj);
 		for (int x = 1;x < 128;x++)
 		{
 			if (warnTime[x])
@@ -6956,14 +7048,15 @@
 				{
 					screenEffectOn[x] = true;
 					float TempDistCalc = 1-(dist-maxSurviveDistance)/(warnDistance-maxSurviveDistance);
-					Set_Screen_Fade_Color_Player(player,screenFadeColor.X,screenFadeColor.Y,screenFadeColor.Z,0.1f);
-					Set_Screen_Fade_Opacity_Player(player,TempDistCalc,0.1f);
+					float inverted = 1-TempDistCalc;
+					Set_Screen_Fade_Color_Player(player,JMG_Utility_Set_Screen_Color_Fade_Controller::color[x].X*inverted+screenFadeColor.X,JMG_Utility_Set_Screen_Color_Fade_Controller::color[x].Y*inverted+screenFadeColor.Y,JMG_Utility_Set_Screen_Color_Fade_Controller::color[x].Z*inverted+screenFadeColor.Z,0.1f);
+					Set_Screen_Fade_Opacity_Player(player,JMG_Utility_Set_Screen_Color_Fade_Controller::opacity[x]*inverted+TempDistCalc,0.1f);
 				}
 				else if (screenEffectOn[x])
 				{
 					screenEffectOn[x] = false;
-					Set_Screen_Fade_Color_Player(player,0.0f,0.0f,0.0f,0.1f);
-					Set_Screen_Fade_Opacity_Player(player,0.0f,0.1f);
+					Set_Screen_Fade_Color_Player(player,JMG_Utility_Set_Screen_Color_Fade_Controller::color[x].X,JMG_Utility_Set_Screen_Color_Fade_Controller::color[x].Y,JMG_Utility_Set_Screen_Color_Fade_Controller::color[x].Z,0.1f);
+					Set_Screen_Fade_Opacity_Player(player,JMG_Utility_Set_Screen_Color_Fade_Controller::opacity[x],0.1f);
 				}
 				if (dist >= warnDistance && !warnTime[x])
 				{
@@ -6981,14 +7074,15 @@
 					{
 						screenEffectOn[x] = true;
 						float TempDistCalc = 1-(dist-maxSurviveDistance)/(aircraftWarnDistance-maxSurviveDistance);
-						Set_Screen_Fade_Color_Player(player,screenFadeColor.X,screenFadeColor.Y,screenFadeColor.Z,0.1f);
-						Set_Screen_Fade_Opacity_Player(player,TempDistCalc,0.1f);
+						float inverted = 1-TempDistCalc;
+						Set_Screen_Fade_Color_Player(player,JMG_Utility_Set_Screen_Color_Fade_Controller::color[x].X*inverted+screenFadeColor.X,JMG_Utility_Set_Screen_Color_Fade_Controller::color[x].Y*inverted+screenFadeColor.Y,JMG_Utility_Set_Screen_Color_Fade_Controller::color[x].Z*inverted+screenFadeColor.Z,0.1f);
+						Set_Screen_Fade_Opacity_Player(player,JMG_Utility_Set_Screen_Color_Fade_Controller::opacity[x]*inverted+TempDistCalc,0.1f);
 					}
 					else if (screenEffectOn[x])
 					{
 						screenEffectOn[x] = false;
-						Set_Screen_Fade_Color_Player(player,0.0f,0.0f,0.0f,0.1f);
-						Set_Screen_Fade_Opacity_Player(player,0.0f,0.1f);
+						Set_Screen_Fade_Color_Player(player,JMG_Utility_Set_Screen_Color_Fade_Controller::color[x].X,JMG_Utility_Set_Screen_Color_Fade_Controller::color[x].Y,JMG_Utility_Set_Screen_Color_Fade_Controller::color[x].Z,0.1f);
+						Set_Screen_Fade_Opacity_Player(player,JMG_Utility_Set_Screen_Color_Fade_Controller::opacity[x],0.1f);
 					}
 					if (dist >= aircraftWarnDistance && !warnTime[x])
 					{
@@ -7002,14 +7096,15 @@
 					{
 						screenEffectOn[x] = true;
 						float TempDistCalc = 1-(dist-maxSurviveDistance)/(vehicleWarnDistance-maxSurviveDistance);
-						Set_Screen_Fade_Color_Player(player,screenFadeColor.X,screenFadeColor.Y,screenFadeColor.Z,0.1f);
-						Set_Screen_Fade_Opacity_Player(player,TempDistCalc,0.1f);
+						float inverted = 1-TempDistCalc;
+						Set_Screen_Fade_Color_Player(player,JMG_Utility_Set_Screen_Color_Fade_Controller::color[x].X*inverted+screenFadeColor.X,JMG_Utility_Set_Screen_Color_Fade_Controller::color[x].Y*inverted+screenFadeColor.Y,JMG_Utility_Set_Screen_Color_Fade_Controller::color[x].Z*inverted+screenFadeColor.Z,0.1f);
+						Set_Screen_Fade_Opacity_Player(player,JMG_Utility_Set_Screen_Color_Fade_Controller::opacity[x]*inverted+TempDistCalc,0.1f);
 					}
 					else if (screenEffectOn[x])
 					{
 						screenEffectOn[x] = false;
-						Set_Screen_Fade_Color_Player(player,0.0f,0.0f,0.0f,0.1f);
-						Set_Screen_Fade_Opacity_Player(player,0.0f,0.1f);
+						Set_Screen_Fade_Color_Player(player,JMG_Utility_Set_Screen_Color_Fade_Controller::color[x].X,JMG_Utility_Set_Screen_Color_Fade_Controller::color[x].Y,JMG_Utility_Set_Screen_Color_Fade_Controller::color[x].Z,0.1f);
+						Set_Screen_Fade_Opacity_Player(player,JMG_Utility_Set_Screen_Color_Fade_Controller::opacity[x],0.1f);
 					}
 					if (dist >= vehicleWarnDistance && !warnTime[x])
 					{
@@ -7034,7 +7129,722 @@
 		Commands->Start_Timer(obj,this,0.1f,1);
 	}
 }
-
+void JMG_Utility_Send_Custom_When_No_More_Presets_Of_Type_Exist::Created(GameObject *obj)
+{
+	sprintf(presetName,"%s",Get_Parameter("PresetName"));
+	enableCustom = Get_Int_Parameter("EnableOrDisableCustom");
+	enabled = Get_Int_Parameter("StartsEnabled") ? true : false;
+	Commands->Start_Timer(obj,this,0.1f,1);
+}
+void JMG_Utility_Send_Custom_When_No_More_Presets_Of_Type_Exist::Custom(GameObject *obj,int message,int param,GameObject *sender)
+{
+	if (message == enableCustom)
+	{
+		enabled = param ? true : false;
+	}
+}
+void JMG_Utility_Send_Custom_When_No_More_Presets_Of_Type_Exist::Timer_Expired(GameObject *obj,int number)
+{
+	if (number == 1)
+	{
+		if (enabled)
+		{
+			bool found = false;
+			for (SLNode<BaseGameObj> *current = GameObjManager::GameObjList.Head();current;current = current->Next())
+			{
+				GameObject* o = current->Data()->As_ScriptableGameObj();
+				if (!_stricmp(Commands->Get_Preset_Name(o),presetName))
+					found = true;
+			}
+			if (!found)
+			{
+				int id = Get_Int_Parameter("ID");
+				GameObject *object = id ? Commands->Find_Object(id) : obj;
+				if (object)
+					Commands->Send_Custom_Event(obj,object,Get_Int_Parameter("Custom"),Get_Int_Parameter("Param"),Get_Float_Parameter("Delay"));
+				this->Destroy_Script();
+				return;
+			}
+		}
+		Commands->Start_Timer(obj,this,0.1f,1);
+	}
+}
+void JMG_Utility_Send_Custom_When_Player_Outside_Of_Range::Created(GameObject *obj)
+{
+	sleeping = 0;
+	distance = Get_Float_Parameter("Distance");
+	id = Get_Int_Parameter("ID");
+	custom = Get_Int_Parameter("Custom");
+	param = Get_Int_Parameter("Param");
+	delay = Get_Float_Parameter("Delay");
+	distance *= distance;
+	triggerOnce = Get_Int_Parameter("TriggerOnce") ? true : false;
+	sleepTime = Get_Int_Parameter("SleepTime");
+	Commands->Start_Timer(obj,this,0.1f,1);
+}
+void JMG_Utility_Send_Custom_When_Player_Outside_Of_Range::Timer_Expired(GameObject *obj, int number)
+{
+	if (number == 1)
+	{
+		if (sleeping)
+			sleeping--;
+		else
+			for (int x = 1;x < 128;x++)
+			{
+				GameObject *player = Get_GameObj(x);
+				if (!player)
+					continue;
+				if (JmgUtility::SimpleDistance(Commands->Get_Position(player),Commands->Get_Position(obj)) > distance)
+				{
+					GameObject *object = id ? Commands->Find_Object(id) : obj;
+					if (object)
+						Commands->Send_Custom_Event(obj,object,custom,param,delay);
+					if (triggerOnce)
+					{
+						this->Destroy_Script();
+						return;
+					}
+				}
+			}
+		Commands->Start_Timer(obj,this,0.1f,1);
+	}
+}
+void JMG_Utility_Set_Team_To_Neutral_When_No_Armor::Created(GameObject *obj)
+{
+	hurt = false;
+	originalPlayerType = Commands->Get_Player_Type(obj);
+	Commands->Start_Timer(obj,this,0.1f,1);
+}
+void JMG_Utility_Set_Team_To_Neutral_When_No_Armor::Timer_Expired(GameObject *obj,int number)
+{
+	if (number == 1)
+	{
+		if (hurt && Commands->Get_Shield_Strength(obj) >= Commands->Get_Max_Shield_Strength(obj))
+		{
+			hurt = false;
+			Commands->Set_Player_Type(obj,originalPlayerType);
+		}
+		if (!hurt && !Commands->Get_Shield_Strength(obj))
+		{
+			hurt = true;
+			Commands->Set_Player_Type(obj,-2);
+		}
+		Commands->Start_Timer(obj,this,0.1f,1);
+	}
+}
+void JMG_Utility_Send_Custom_When_No_More_Units_On_Team_Exist::Created(GameObject *obj)
+{
+	team = Get_Int_Parameter("Team");
+	enableCustom = Get_Int_Parameter("EnableOrDisableCustom");
+	enabled = Get_Int_Parameter("StartsEnabled") ? true : false;
+	Commands->Start_Timer(obj,this,0.1f,1);
+}
+void JMG_Utility_Send_Custom_When_No_More_Units_On_Team_Exist::Custom(GameObject *obj,int message,int param,GameObject *sender)
+{
+	if (message == enableCustom)
+	{
+		enabled = param ? true : false;
+	}
+}
+void JMG_Utility_Send_Custom_When_No_More_Units_On_Team_Exist::Timer_Expired(GameObject *obj,int number)
+{
+	if (number == 1)
+	{
+		if (enabled)
+		{
+			bool found = false;
+			for (SLNode<SmartGameObj> *current = GameObjManager::SmartGameObjList.Head();current;current = current->Next())
+			{
+				GameObject* o = current->Data()->As_ScriptableGameObj();
+				if (Commands->Get_Player_Type(o) == team && !Is_Script_Attached(o,"JMG_Utility_Send_Custom_When_No_More_Units_On_Team_Exist_Ignore"))
+					found = true;
+			}
+			if (!found)
+			{
+				int id = Get_Int_Parameter("ID");
+				GameObject *object = id ? Commands->Find_Object(id) : obj;
+				if (object)
+					Commands->Send_Custom_Event(obj,object,Get_Int_Parameter("Custom"),Get_Int_Parameter("Param"),Get_Float_Parameter("Delay"));
+				this->Destroy_Script();
+				return;
+			}
+		}
+		Commands->Start_Timer(obj,this,0.1f,1);
+	}
+}
+void JMG_Utility_Custom_Create_Sound_At_Object_Bone::Created(GameObject *obj)
+{
+	sprintf(sound,"%s",Get_Parameter("Sound"));
+	sprintf(bone,"%s",Get_Parameter("Bone"));
+	custom = Get_Int_Parameter("Custom");
+	Commands->Start_Timer(obj,this,0.1f,1);
+}
+void JMG_Utility_Custom_Create_Sound_At_Object_Bone::Custom(GameObject *obj,int message,int param,GameObject *sender)
+{
+	if (message == custom)
+	{
+		Commands->Create_3D_Sound_At_Bone(sound,obj,bone);
+	}
+}
+void JMG_Utility_Custom_Send_Custom_On_Player_Count::Created(GameObject *obj)
+{
+	runningCount = 0;
+	custom = Get_Int_Parameter("Custom");
+	resetCustom = Get_Int_Parameter("ResetCustom");
+	baseCount = Get_Int_Parameter("BaseCount");
+	playerCount = Get_Int_Parameter("PlayerCount");
+}
+void JMG_Utility_Custom_Send_Custom_On_Player_Count::Custom(GameObject *obj,int message,int param,GameObject *sender)
+{
+	if (message == resetCustom)
+	{
+		runningCount = 0;
+	}
+	if (message == custom)
+	{
+		runningCount++;
+		if (runningCount < baseCount+playerCount*Get_Player_Count())
+			return;
+		int id = Get_Int_Parameter("ID");
+		GameObject *object = id ? (id == -1 ? sender : Commands->Find_Object(id)) : obj;
+		if (object)
+			Commands->Send_Custom_Event(obj,object,Get_Int_Parameter("SendCustom"),Get_Int_Parameter("Param"),Get_Float_Parameter("Delay"));
+		this->Destroy_Script();
+	}
+}
+void JMG_Utility_Killed_By_Player_Send_Custom::Killed(GameObject *obj,GameObject *killer)
+{
+	if (!Commands->Is_A_Star(killer))
+		return;
+	int id = Get_Int_Parameter("ID");
+	GameObject *object = id ? (id == -1 ? killer : Commands->Find_Object(id)) : obj;
+	Commands->Send_Custom_Event(obj,object,Get_Int_Parameter("Custom"),Get_Int_Parameter("Param"),Get_Float_Parameter("Delay"));
+	Destroy_Script();
+}
+void JMG_Utility_AI_Guardian_Ignored::Created(GameObject *obj)
+{
+}
+void JMG_Utility_AI_Vehicle_Ignored::Created(GameObject *obj)
+{
+}
+void JMG_Utility_Killed_By_PresetID_Send_Custom::Killed(GameObject *obj,GameObject *killer)
+{
+	if (Commands->Get_Preset_ID(killer) != Get_Int_Parameter("PresetID"))
+		return;
+	int id = Get_Int_Parameter("ID");
+	GameObject *object = id ? (id == -1 ? killer : Commands->Find_Object(id)) : obj;
+	Commands->Send_Custom_Event(obj,object,Get_Int_Parameter("Custom"),Get_Int_Parameter("Param"),Get_Float_Parameter("Delay"));
+	Destroy_Script();
+}
+void JMG_Utility_Created_Override_AI_Soldier_Muzzle_Direction::Created(GameObject *obj)
+{
+	if (obj->As_SoldierGameObj())
+		obj->As_SoldierGameObj()->Set_Override_Muzzle_Direction(true);
+	this->Destroy_Script();
+}
+void JMG_Utility_Custom_Send_Custom_On_Player_Count_HUD::Created(GameObject *obj)
+{
+	hudStringId = Get_Int_Parameter("HudStringId");
+	sprintf(hudMessage,"%s",Get_Translated_String(hudStringId));
+	hudStringColor = Get_Vector3_Parameter("HudStringColor");
+	runningCount = 0;
+	custom = Get_Int_Parameter("Custom");
+	resetCustom = Get_Int_Parameter("ResetCustom");
+	baseCount = Get_Int_Parameter("BaseCount");
+	playerCount = Get_Int_Parameter("PlayerCount");
+}
+void JMG_Utility_Custom_Send_Custom_On_Player_Count_HUD::Custom(GameObject *obj,int message,int param,GameObject *sender)
+{
+	if (message == resetCustom)
+	{
+		runningCount = 0;
+	}
+	if (message == custom)
+	{
+		runningCount++;
+		int requiredCount = baseCount+playerCount*Get_Player_Count();
+		JmgUtility::SetHUDHelpText(hudStringId,formatHUDMessage(hudMessage,runningCount,requiredCount),hudStringColor);
+		if (runningCount < requiredCount)
+			return;
+		int id = Get_Int_Parameter("ID");
+		GameObject *object = id ? (id == -1 ? sender : Commands->Find_Object(id)) : obj;
+		if (object)
+			Commands->Send_Custom_Event(obj,object,Get_Int_Parameter("SendCustom"),Get_Int_Parameter("Param"),Get_Float_Parameter("Delay"));
+		this->Destroy_Script();
+	}
+}
+char *JMG_Utility_Custom_Send_Custom_On_Player_Count_HUD::formatHUDMessage(const char *format,...)
+{
+	static char displayMsg[256];
+	va_list args;
+	va_start(args,format);
+	vsprintf(displayMsg,format,args);
+	va_end(args);
+	return displayMsg;
+}
+void JMG_Utility_Zone_Send_Custom_If_Has_Weapon_Ammo::Entered(GameObject *obj,GameObject *enter)
+{
+	if (CheckPlayerType(enter,Get_Int_Parameter("PlayerType")) || Commands->Get_Player_Type(enter) == -4)
+		return;
+	char weaponName[256];
+	sprintf(weaponName,"%s",Get_Parameter("WeaponName"));
+	if (!Has_Weapon(enter,weaponName))
+		return;
+	int totalBullets = Get_Total_Bullets(enter,weaponName);
+	int id = Get_Int_Parameter("ID");
+	GameObject *object = id ? (id == -1 ? enter : Commands->Find_Object(id)) : obj;
+	if (object && totalBullets)
+		for (int x = 0;x < totalBullets;x++)
+			Commands->Send_Custom_Event(obj,object,Get_Int_Parameter("Custom"),Get_Int_Parameter("Param"),Get_Float_Parameter("Delay"));
+	if (Get_Int_Parameter("RemoveWeapon"))
+		Remove_Weapon(enter,weaponName);
+	if (Get_Int_Parameter("TriggerOnce"))
+		Destroy_Script();
+}
+void JMG_Utility_Custom_Remove_Weapon_From_All_Players::Created(GameObject *obj)
+{
+	custom = Get_Int_Parameter("Custom");
+	sprintf(weaponName,"%s",Get_Parameter("WeaponName"));
+}
+void JMG_Utility_Custom_Remove_Weapon_From_All_Players::Custom(GameObject *obj,int message,int param,GameObject *sender)
+{
+	if (message == custom)
+	{
+		for (int x = 1;x < 128;x++)
+		{
+			GameObject *player = Get_GameObj(x);
+			if (!player || !Has_Weapon(player,weaponName))
+				continue;
+			Remove_Weapon(player,weaponName);
+		}
+	}
+}
+void JMG_Utility_Custom_Destroy_All_Presets_By_Name::Created(GameObject *obj)
+{
+	sprintf(presetName,"%s",Get_Parameter("PresetName"));
+	custom = Get_Int_Parameter("Custom");
+}
+void JMG_Utility_Custom_Destroy_All_Presets_By_Name::Custom(GameObject *obj,int message,int param,GameObject *sender)
+{
+	if (message == custom)
+	{
+		for (SLNode<BaseGameObj> *current = GameObjManager::GameObjList.Head();current;current = current->Next())
+		{
+			GameObject* o = current->Data()->As_ScriptableGameObj();
+			if (!_stricmp(presetName,Commands->Get_Preset_Name(o)))
+				Commands->Destroy_Object(o);
+		}
+	}
+}
+void JMG_Utility_Send_Custom_When_Damage_Exceedes_Threshold::Created(GameObject *obj)
+{
+	id = Get_Int_Parameter("ID");
+	custom = Get_Int_Parameter("Custom");
+	param = Get_Int_Parameter("Param");
+	delay = Get_Float_Parameter("Delay");
+	damageThreshold = Get_Float_Parameter("DamageThreshold");
+	lockoutTime = Get_Float_Parameter("LockoutTime");
+	Commands->Start_Timer(obj,this,0.1f,1);
+}
+void JMG_Utility_Send_Custom_When_Damage_Exceedes_Threshold::Timer_Expired(GameObject *obj,int number)
+{
+	if (number == 1)
+	{
+		if (timeRemaining)
+		{
+			timeRemaining -= 0.1f;
+			if (timeRemaining < 0)
+				timeRemaining = 0.0f;
+		}
+		Commands->Start_Timer(obj,this,0.1f,1);
+	}
+}
+void JMG_Utility_Send_Custom_When_Damage_Exceedes_Threshold::Damaged(GameObject *obj,GameObject *damager,float damage)
+{
+	if (damage < damageThreshold)
+		return;
+	if (timeRemaining)
+		return;
+	timeRemaining = lockoutTime;
+	GameObject *object = id ? (id == -1 ? damager : Commands->Find_Object(id)) : obj;
+	if (object)
+		Commands->Send_Custom_Event(obj,object,custom,param,delay);
+}
+void JMG_Utility_Custom_Send_Translated_String_To_All_Players::Created(GameObject *obj)
+{
+	custom = Get_Int_Parameter("Custom");
+	stringId = Get_Int_Parameter("StringID");
+	color = Get_Vector3_Parameter("ColorRGB");
+	repeatable = Get_Int_Parameter("Repeatable") ? true : false;
+}
+void JMG_Utility_Custom_Send_Translated_String_To_All_Players::Custom(GameObject *obj,int message,int param,GameObject *sender)
+{
+	if (message == custom)
+	{
+		JmgUtility::MessageAllPlayers((int)color.X,(int)color.Y,(int)color.Z,Get_Translated_String(stringId));
+		if (!repeatable)
+			Destroy_Script();
+	}
+}
+void JMG_Utility_Destroyed_Drop_Powerup::Destroyed(GameObject *obj)
+{
+	if (!Has_Weapon(obj,Get_Parameter("WeaponPreset")))
+		return;
+	Vector3 pos = Commands->Get_Position(obj);
+	pos.Z += Get_Float_Parameter("HeightAdjust");
+	GameObject *powerup = Commands->Create_Object(Get_Parameter("PowerupName"),pos);
+	Commands->Set_Facing(powerup,Commands->Get_Facing(obj));
+}
+void JMG_Utility_Pickup_Attach_Script::Custom(GameObject *obj,int message,int param,GameObject *sender)
+{
+	if (message == CUSTOM_EVENT_POWERUP_GRANTED)
+	{
+		const char *parameters = Get_Parameter("Params");
+		char *params = newstr(parameters);
+		char delim = Get_Parameter("Delim")[0];
+		unsigned int length = strlen(parameters);
+		for (unsigned int x = 0;x < length;x++)
+			if (params[x] == delim)
+				params[x] = ',';
+		Commands->Attach_Script(sender,Get_Parameter("Script"),params);
+	}
+}
+void JMG_Utility_Objective_System_Objective_Status_Update_Custom::Custom(GameObject *obj,int message,int param,GameObject *sender)
+{
+	if (message == Get_Int_Parameter("Custom"))
+	{
+		if (!JMG_Utility_Objective_System_Controller::controllerPlaced)
+		{
+			Console_Input("msg JMG_Utility_Objective_System_Objective_Update_Custom ERROR: Make sure you have a JMG_Utility_Objective_System_Controller placed on the map!");
+			return;
+		}
+		int objectiveId = Get_Int_Parameter("ObjectiveID");
+		int objectiveMarkerId = Get_Int_Parameter("NewObjectiveMarkerObjectID");
+		GameObject *ObjectiveMarker = objectiveMarkerId == -1 ? sender : Commands->Find_Object(objectiveMarkerId);
+		if (!ObjectiveMarker && objectiveMarkerId)
+		{
+			Console_Input("msg JMG_Utility_Objective_System_Objective_Update_Enter ERROR: Could not find objective marker object!");
+			return;
+		}
+		int stringId = Get_Int_Parameter("NewObjectiveStringID");
+		BasicObjectiveSystem.Add_Objective(objectiveId,NewObjectiveSystem::Primary,NewObjectiveSystem::Hidden,0,"",0);
+		BasicObjectiveSystem.Set_Objective_Mission(objectiveId,stringId,stringId);
+		if (ObjectiveMarker)
+			BasicObjectiveSystem.Set_Radar_Blip(objectiveId,ObjectiveMarker,NULL);
+		JmgUtility::SetHUDHelpText(stringId,BasicObjectiveSystem.Get_Hud_Help_Text_Color((NewObjectiveSystem::Priority)BasicObjectiveSystem.Get_Objective_Priority(objectiveId)));
+	}
+}
+void JMG_Utility_Objective_System_Objective_Failed_Custom::Created(GameObject *obj)
+{
+	custom = Get_Int_Parameter("Custom");
+}
+void JMG_Utility_Objective_System_Objective_Failed_Custom::Custom(GameObject *obj,int message,int param,GameObject *sender)
+{
+	if (message == custom)
+	{
+		BasicObjectiveSystem.Add_Objective(Get_Int_Parameter("ObjectiveID"),NewObjectiveSystem::Primary,NewObjectiveSystem::Hidden,0,"",0);
+		BasicObjectiveSystem.Set_Objective_Status(Get_Int_Parameter("ObjectiveID"),NewObjectiveSystem::Failed);
+	}
+}
+void JMG_Utility_Force_Player_Team_At_Gameover::Created(GameObject *obj)
+{
+	team = Get_Int_Parameter("Team");
+	Commands->Start_Timer(obj,this,1.0,1);
+}
+void JMG_Utility_Force_Player_Team_At_Gameover::Timer_Expired(GameObject *obj,int number)
+{
+	if (number == 1)
+	{
+		if (The_Game()->Is_Game_Over())
+			for (int x = 1;x < 128;x++)
+			{
+				cPlayer *cplayer = Find_Player(x);
+				if (!cplayer)
+					continue;
+				cplayer->Set_Player_Type(team);
+			}
+	}
+	Commands->Start_Timer(obj,this,1.0,1);
+}
+void JMG_Utility_AI_Guardian_Generic::Created(GameObject *obj)
+{
+	flightHeight = Get_Float_Parameter("FlightHeight");
+	primaryFire = Get_Int_Parameter("UseSecondaryAttack") ? false : true;
+	arriveDistance = Get_Float_Parameter("ArriveDistance");
+	arriveDistanceSq = (arriveDistance+1.0f)*(arriveDistance+1.0f);
+	dpPosition = Commands->Get_Position(obj);
+	EnemyID = 0;
+	EnemyTimeOutTime = 0;
+	LastPos = Commands->Get_Position(obj);
+	Commands->Enable_Enemy_Seen(obj,true);
+	Commands->Enable_Engine(obj,true);
+	Commands->Start_Timer(obj,this,1.0f,1);
+}
+void JMG_Utility_AI_Guardian_Generic::Timer_Expired(GameObject *obj,int number)
+{
+	if (number == 1)
+	{
+		if (EnemyTimeOutTime)
+		{
+			EnemyTimeOutTime--;
+			if (!EnemyTimeOutTime)
+			{
+				EnemyID = 0;
+				Goto_Location(obj);
+			}
+		}
+		if (EnemyID)
+		{
+			GameObject *Target = Commands->Find_Object(EnemyID);
+			if (!Target || !Commands->Get_Health(Target) || Commands->Get_Player_Type(Target) == Commands->Get_Player_Type(obj))
+			{
+				EnemyID = 0;
+				Goto_Location(obj);
+			}
+		}
+		Vector3 Pos = Commands->Get_Position(obj);
+		Pos.Z -= flightHeight;
+		if (JmgUtility::SimpleDistance(Pos,LastPos) < arriveDistanceSq)
+		{
+			if (Get_A_Defense_Point(&dpPosition))
+				Goto_Location(obj);
+		}
+		LastPos = Pos;
+		Commands->Start_Timer(obj,this,1.0f,1);
+	}
+}
+void JMG_Utility_AI_Guardian_Generic::Enemy_Seen(GameObject *obj,GameObject *seen)
+{
+	if (Is_Script_Attached(seen,"JMG_Utility_AI_Guardian_Ignored"))
+		return;
+	if (!EnemyID || !EnemyTimeOutTime)
+	{
+		EnemyID = Commands->Get_ID(seen);
+		EnemyTimeOutTime = Commands->Get_Random_Int(2,5);
+		Goto_Location(obj);
+	}
+	else if (EnemyID == Commands->Get_ID(seen))
+		EnemyTimeOutTime = Commands->Get_Random_Int(2,5);
+}
+void JMG_Utility_AI_Guardian_Generic::Damaged(GameObject *obj,GameObject *damager,float damage)
+{
+	if (damage <= 0 || (EnemyID && EnemyTimeOutTime) || Commands->Get_Player_Type(damager) == Commands->Get_Player_Type(obj))
+		return;
+	EnemyID = Commands->Get_ID(damager);
+	EnemyTimeOutTime = Commands->Get_Random_Int(2,5);
+	Goto_Location(obj);
+}
+void JMG_Utility_AI_Guardian_Generic::Goto_Location(GameObject *obj)
+{
+	ActionParamsStruct params;
+	Commands->Action_Reset(obj,100);
+	Vector3 GoToPos = dpPosition;
+	if (flightHeight)
+		GoToPos.Z += flightHeight;
+	params.MovePathfind = flightHeight ? false : true;
+	params.Set_Movement(GoToPos,Get_Float_Parameter("WanderSpeed"),arriveDistance,false);
+	params.ShutdownEngineOnArrival = Get_Int_Parameter("TurnOffEngineOnArrival") ? true : false;
+	params.Set_Basic(this,100,10);
+	GameObject *Target = Commands->Find_Object(EnemyID);
+	if (Target)
+	{
+		if (Get_Int_Parameter("FaceTarget"))
+			params.Set_Face_Location(Commands->Get_Position(Target),5.0f);
+		else
+			params.AttackFaceTarget = false;
+		params.Set_Attack(Target,Get_Float_Parameter("FireRange"),0,primaryFire);
+		params.AttackCheckBlocked = Get_Int_Parameter("CheckBlocked") ? true : false;
+		Commands->Action_Attack(obj,params);
+	}
+	else
+	{
+		if (Get_Int_Parameter("FaceTarget"))
+			params.Set_Face_Location(GoToPos,5.0f);
+		else
+			params.AttackFaceTarget = false;
+		Commands->Action_Goto(obj,params);
+	}
+}
+void JMG_Utility_Custom_Create_Object_In_Front_Of_Self::Created(GameObject *obj)
+{
+	sprintf(presetName,"%s",Get_Parameter("PresetName"));
+	custom = Get_Int_Parameter("Custom");
+	distance = Get_Float_Parameter("Distance");
+	height = Get_Float_Parameter("Height");
+	rotation = Get_Float_Parameter("Rotation");
+}
+void JMG_Utility_Custom_Create_Object_In_Front_Of_Self::Custom(GameObject *obj,int message,int param,GameObject *sender)
+{
+	if (message == custom)
+	{
+		Vector3 pos = Commands->Get_Position(obj);
+		float facing = Commands->Get_Facing(obj);
+		pos.X += cos(facing*PI180)*distance;
+		pos.Y += sin(facing*PI180)*distance;
+		facing += rotation;
+		pos.Z += height;
+		GameObject *object = Commands->Create_Object(presetName,pos);
+		Commands->Set_Facing(object,facing);
+	}
+}
+void JMG_Utility_Send_Custom_When_No_More_Units_On_Team_Exist_Ignore::Created(GameObject *obj)
+{
+}
+void JMG_Utility_Custom_Damage_All_Vehicles_On_Team::Created(GameObject *obj)
+{
+	custom = Get_Int_Parameter("Custom");
+	team = Get_Int_Parameter("Team");
+	damage = Get_Float_Parameter("Damage");
+	sprintf(warhead,"%s",Get_Parameter("Warhead"));
+}
+void JMG_Utility_Custom_Damage_All_Vehicles_On_Team::Custom(GameObject *obj,int message,int param,GameObject *sender)
+{
+	if (message == custom)
+	{
+		for (SLNode<SmartGameObj> *current = GameObjManager::SmartGameObjList.Head();current;current = current->Next())
+		{
+			SmartGameObj* o = current->Data();
+			if (o->As_VehicleGameObj() && !CheckPlayerType(o,team))
+				Commands->Apply_Damage(o,damage,warhead,o);
+		}
+	}
+}
+void JMG_Utility_Kill_Unit_If_Not_Moving_Enough::Created(GameObject *obj)
+{
+	resetTime = time = (int)(Get_Float_Parameter("Time")*10);
+	distance = Get_Float_Parameter("Distance");
+	distance *= distance;
+	lastPos = Commands->Get_Position(obj);
+	Commands->Start_Timer(obj,this,0.1f,1);
+}
+void JMG_Utility_Kill_Unit_If_Not_Moving_Enough::Timer_Expired(GameObject *obj,int number)
+{
+	if (number == 1)
+	{
+		if (JmgUtility::SimpleDistance(Commands->Get_Position(obj),lastPos) < distance)
+		{
+			time--;
+			if (!time)
+				Commands->Apply_Damage(obj,999999.9f,"BlamoKiller",obj);
+		}
+		else
+		{
+			lastPos = Commands->Get_Position(obj);
+			time = resetTime;
+		}
+		Commands->Start_Timer(obj,this,0.1f,1);
+	}
+}
+void JMG_Utility_Custom_Display_Briefing_Message_StringID::Created(GameObject *obj)
+{
+	triggered = false;
+	BriefingText = NULL;
+	CurrentNode = NULL;
+	AddNewTextNode();
+	char TextString[16384];
+	sprintf(TextString,"%s",Get_Translated_String(Get_Int_Parameter("StringID")));
+	int Count = 0;
+	for (int x = 0;x < 16384;x++)
+	{
+		if ((Count > 150 && TextString[x] == ' ') || Count == 210)
+		{// String getting too long, start a new one.
+			CurrentNode->Text[Count] = '\0';
+			AddNewTextNode();
+			Count = 0;
+		}
+		else if (TextString[x] == '\n' || TextString[x] == '\0')
+		{
+			CurrentNode->Text[Count] = '\0';
+			break;// end of line your done
+		}
+		else if (TextString[x] == '\f')
+		{
+			CurrentNode->Text[Count] = '\0';
+			AddNewTextNode();
+			Count = 0;
+		}
+		else
+		{
+			CurrentNode->Text[Count] = TextString[x];
+			Count++;
+		}
+	}
+	CurrentNode = BriefingText;
+	Commands->Start_Timer(obj,this,0.1f,1);
+}
+void JMG_Utility_Custom_Display_Briefing_Message_StringID::Timer_Expired(GameObject *obj,int number)
+{
+	if (number == 1)
+	{
+		if (!CurrentNode)
+		{
+			RemoveTextNodes();
+			Destroy_Script();
+			return;
+		}
+		if (CurrentNode->Text[0] != '\0')
+			for (int x = 1;x < 128;x++)
+			{
+				GameObject *Player = Get_GameObj(x);
+				if (Player)
+					JmgUtility::DisplayChatMessage(Player,(int)Get_Vector3_Parameter("MessageColor").X,(int)Get_Vector3_Parameter("MessageColor").Y,(int)Get_Vector3_Parameter("MessageColor").Z,CurrentNode->Text);
+			}
+		CurrentNode = CurrentNode->next;
+		Commands->Start_Timer(obj,this,Get_Float_Parameter("LineDelayTime"),1);
+	}
+}
+void JMG_Utility_Custom_Display_Briefing_Message_StringID::Custom(GameObject *obj,int message,int param,GameObject *sender)
+{
+	if (message == Get_Int_Parameter("Custom"))
+	{
+		if (triggered)
+			return;
+		triggered = true;
+		Commands->Start_Timer(obj,this,0.0f,56345344);
+		Commands->Create_2D_Sound(Get_Parameter("UISound"));
+	}
+}
+void JMG_Utility_Custom_Display_Briefing_Message_StringID::Destroyed(GameObject *obj)
+{
+	RemoveTextNodes();
+}
+void JMG_Utility_Custom_Display_Briefing_Message_StringID::AddNewTextNode()
+{
+	if (!BriefingText)
+	{
+		BriefingText = new BriefingTextNode;
+		sprintf(BriefingText->Text,"\0");
+		BriefingText->next = NULL;
+		CurrentNode = BriefingText;
+		return;
+	}
+	BriefingTextNode *Current = BriefingText;
+	while (Current)
+	{
+		if (!Current->next)
+		{
+			Current->next = new BriefingTextNode;
+			Current = Current->next;
+			sprintf(Current->Text,"\0");
+			Current->next = NULL;
+			CurrentNode = Current;
+			return;
+		}
+		Current = Current->next;
+	}
+}
+void JMG_Utility_Custom_Display_Briefing_Message_StringID::RemoveTextNodes()
+{
+	BriefingTextNode *Current = BriefingText,*Temp;
+	while (Current)
+	{
+		Temp = Current;
+		Current = Current->next;
+		delete Temp;
+	}
+	BriefingText = NULL;
+	CurrentNode = NULL;
+}
 ScriptRegistrant<JMG_Utility_Check_If_Script_Is_In_Library> JMG_Utility_Check_If_Script_Is_In_Library_Registrant("JMG_Utility_Check_If_Script_Is_In_Library","ScriptName:string,CppName:string");
 ScriptRegistrant<JMG_Send_Custom_When_Custom_Sequence_Matched> JMG_Send_Custom_When_Custom_Sequence_Matched_Registrant("JMG_Send_Custom_When_Custom_Sequence_Matched","Success_Custom=0:int,Correct_Step_Custom=0:int,Partial_Failure_Custom=0:int,Failure_Custom=0:int,Send_To_ID=0:int,Custom_0=0:int,Custom_1=0:int,Custom_2=0:int,Custom_3=0:int,Custom_4=0:int,Custom_5=0:int,Custom_6=0:int,Custom_7=0:int,Custom_8=0:int,Custom_9=0:int,Disable_On_Success=1:int,Disable_On_Failure=0:int,Starts_Enabled=1:int,Enable_Custom=0:int,Correct_Step_Saftey=0:int,Failure_Saftey=1:int,Max_Failures=1:int");
 ScriptRegistrant<JMG_Utility_Change_Model_On_Timer> JMG_Utility_Change_Model_On_Timer_Registrant("JMG_Utility_Change_Model_On_Timer","Model=null:string,Time=0:float");
@@ -7047,11 +7857,11 @@
 ScriptRegistrant<JMG_Utility_Sync_System_Object> JMG_Utility_Sync_System_Object_Registrant("JMG_Utility_Sync_System_Object","");
 ScriptRegistrant<JMG_Utility_Sync_System_Controller> JMG_Utility_Sync_System_Controller_Registrant("JMG_Utility_Sync_System_Controller","Sync_Rate=1.0:float");
 ScriptRegistrant<JMG_Utility_Sync_Object_Periodically> JMG_Utility_Sync_Object_Periodically_Registrant("JMG_Utility_Sync_Object_Periodically","Sync_Rate=1.0:float");
-ScriptRegistrant<JMG_Utility_Basic_Spawner> JMG_Utility_Basic_Spawner_Registrant("JMG_Utility_Basic_Spawner","SpawnPreset:string,RespawnTime=0.0:float,RespawnTimeRandom=0:float,StartsEnabled=1:int,EnableCustom=0:int,SpawnLimit=-1:int,DelayOnStartup=0:int");
+ScriptRegistrant<JMG_Utility_Basic_Spawner> JMG_Utility_Basic_Spawner_Registrant("JMG_Utility_Basic_Spawner","SpawnPreset:string,RespawnTime=0.0:float,RespawnTimeRandom=0:float,StartsEnabled=1:int,EnableOrDisableCustom=0:int,SpawnLimit=-1:int,DelayOnStartup=0:int");
 ScriptRegistrant<JMG_Utility_Basic_Spawner_Spawned_Object> JMG_Utility_Basic_Spawner_Spawned_Object_Registrant("JMG_Utility_Basic_Spawner_Spawned_Object","ControllerId:int");
 ScriptRegistrant<JMG_Utility_AI_Engineer> JMG_Utility_AI_Engineer_Registrant("JMG_Utility_AI_Engineer","RepaiarGun_Preset=Weapon_RepairGun_Player:string,Weapon_Preset=Weapon_Pistol_Player:string,PatrolRange=50.0:float,BaseCenterPoint=0.0 0.0 0.0:vector3,MinHP[Soldiers|Vehicles|Turrets]=0.5 0.75 0.9:vector3,MinHP[EngineerTarget|C4|Beacon]=0.25 0.0 0.0:vector3,Priority[RepairTargets|C4|Beacons]=1.0 1.0 1.0:vector3,WanderGroupID=-1:int");
 ScriptRegistrant<JMG_Utility_Set_Object_Visibility_For_Player_On_Custom> JMG_Utility_Set_Object_Visibility_For_Player_On_Custom_Registrant("JMG_Utility_Set_Object_Visibility_For_Player_On_Custom","Custom:int,PlayerID:int,Visible:int");
-ScriptRegistrant<JMG_Utility_AI_Vehicle> JMG_Utility_AI_Vehicle_Registrant("JMG_Utility_AI_Vehicle","MaxRange=25.0:float,MinAttackRange=0.0:float,FollowTarget=1:int,ReturnHome=1:int,ForceFire=0:int,VTOLHover=0.0:float,vsSoldier=1:int,vsVehicle=1:int,vsAircraft=1:int,WanderingAIGroupID=-1:int,MinRandWander=60.0:float,MaxRandWander=90.0:float,SquishInfantry=1:int,EnableTransitions=0:int,UsePathfind=1:int,DisableEngineOnArrival=1:int,WeaponError=-1.0:float,MaxHuntRange=0.0:float");
+ScriptRegistrant<JMG_Utility_AI_Vehicle> JMG_Utility_AI_Vehicle_Registrant("JMG_Utility_AI_Vehicle","MaxRange=25.0:float,MinAttackRange=0.0:float,FollowTarget=1:int,ReturnHome=1:int,ForceFire=0:int,VTOLHover=0.0:float,vsSoldier=1:int,vsVehicle=1:int,vsAircraft=1:int,WanderingAIGroupID=-1:int,MinRandWander=60.0:float,MaxRandWander=90.0:float,SquishInfantry=1:int,EnableTransitions=0:int,UsePathfind=1:int,DisableEngineOnArrival=1:int,WeaponError=-1.0:float,MaxHuntRange=0.0:float,NextWanderPointWhenLastReached=0.0:float");
 ScriptRegistrant<JMG_Utility_Dynamic_Clock_Control> JMG_Utility_Dynamic_Clock_Control_Registrant("JMG_Utility_Dynamic_Clock_Control","");
 ScriptRegistrant<JMG_Utility_Dynamic_Clock_Object> JMG_Utility_Dynamic_Clock_Object_Registrant("JMG_Utility_Dynamic_Clock_Object","");
 ScriptRegistrant<JMG_Utility_Change_Screen_Color_While_In_Zone> JMG_Utility_Change_Screen_Color_While_In_Zone_Registrant("JMG_Utility_Change_Screen_Color_While_In_Zone","Color[Red|Green|Blue]:vector3,Opacity:float,EnterFadeInTime:float,ExitFadeOutTime:float");
@@ -7087,7 +7897,7 @@
 ScriptRegistrant<JMG_Utility_AI_Aggressive_Attack_Spot_Control> JMG_Utility_AI_Aggressive_Attack_Spot_Control_Registrant("JMG_Utility_AI_Aggressive_Attack_Spot_Control","");
 ScriptRegistrant<JMG_Utility_AI_Aggressive_Attack_Spot_Point> JMG_Utility_AI_Aggressive_Attack_Spot_Point_Registrant("JMG_Utility_AI_Aggressive_Attack_Spot_Point","GroupId=0:int,AttackOffset=0.0 0.0 0.0:Vector3");
 ScriptRegistrant<JMG_Utility_AI_Aggressive_Attack_Spot_Point2> JMG_Utility_AI_Aggressive_Attack_Spot_Point2_Registrant("JMG_Utility_AI_Aggressive_Attack_Spot_Point2","GroupId=0:int,AbsolutePosition=0.0 0.0 0.0:Vector3,ObjectID=0:int");
-ScriptRegistrant<JMG_Utility_AI_Aggressive_Attack_Spot> JMG_Utility_AI_Aggressive_Attack_Spot_Registrant("JMG_Utility_AI_Aggressive_Attack_Spot","GroupId=-1:int,SecondaryGroupId=-1:int,AttackPointSpeed=1.0:float,AttackPointDistance=-1.0:float,RandomAttackPointDistance=0.0:float,AttackSpeed=1.0:float,AttackDistance=-1.0:float,RandomAttackDistance=0.0:float,ReturnHome=0:int,ReturnHomeSpeed=1.0:float,ReactToAttackChance=0.5:float,ReactToAttackRate=10.0:float,ShutdownEngineOnArrival=0:int,EnableDebug=0:int");
+ScriptRegistrant<JMG_Utility_AI_Aggressive_Attack_Spot> JMG_Utility_AI_Aggressive_Attack_Spot_Registrant("JMG_Utility_AI_Aggressive_Attack_Spot","GroupId=-1:int,SecondaryGroupId=-1:int,AttackPointSpeed=1.0:float,AttackPointDistance=-1.0:float,RandomAttackPointDistance=0.0:float,AttackSpeed=1.0:float,AttackDistance=-1.0:float,RandomAttackDistance=0.0:float,ReturnHome=0:int,ReturnHomeSpeed=1.0:float,ReactToAttackChance=0.5:float,ReactToAttackRate=10.0:float,ShutdownEngineOnArrival=0:int,EnableDebug=0:int,UseSecondaryFire=0:int");
 ScriptRegistrant<JMG_Utility_Destroy_Objects_In_ID_Range_On_Death> JMG_Utility_Destroy_Objects_In_ID_Range_On_Death_Registrant("JMG_Utility_Destroy_Objects_In_ID_Range_On_Death","StartID:int,EndID:int");
 ScriptRegistrant<JMG_Utility_Custom_Enable_Spawners_In_Range> JMG_Utility_Custom_Enable_Spawners_In_Range_Registrant("JMG_Utility_Custom_Enable_Spawners_In_Range","StartID:int,EndID:int,Custom:int,Enable=1:int");
 ScriptRegistrant<JMG_Utility_Send_Custom_On_Player_Count> JMG_Utility_Send_Custom_On_Player_Count_Registrant("JMG_Utility_Send_Custom_On_Player_Count","PlayerCount=0:int,ID=0:int,Custom:int,Param:int,Delay:float,TriggerOn[eq|<|>]=1.0 0.0 0.0:vector3,SupressMatchSpam=1:int,DestroyAfterTrigger=0:int");
@@ -7102,7 +7912,7 @@
 ScriptRegistrant<JMG_Utility_Set_Soldier_Damage_Animations> JMG_Utility_Set_Soldier_Damage_Animations_Registrant("JMG_Utility_Set_Soldier_Damage_Animations","Enable=1:int");
 ScriptRegistrant<JMG_Utility_Play_Music_On_Join_Enter_Change_Music> JMG_Utility_Play_Music_On_Join_Enter_Change_Music_Registrant("JMG_Utility_Play_Music_On_Join_Enter_Change_Music","Music=null:string,FadeOut:int,FadeIn:int,PlayerType=2:int,TriggerOnce=1:int");
 ScriptRegistrant<JMG_Utility_Play_Music_On_Join_Killed_Change_Music> JMG_Utility_Play_Music_On_Join_Killed_Change_Music_Registrant("JMG_Utility_Play_Music_On_Join_Killed_Change_Music","Music=null:string,FadeOut:int,FadeIn:int");
-ScriptRegistrant<JMG_Utility_Objective_System_Controller> JMG_Utility_Objective_System_Controller_Registrant("JMG_Utility_Objective_System_Controller","ShowMarkersOnRadar=1:int,PrimaryObjectiveModel=null:string,SecondaryObjectiveModel=null:string,TertiaryObjectiveModel=null:string");
+ScriptRegistrant<JMG_Utility_Objective_System_Controller> JMG_Utility_Objective_System_Controller_Registrant("JMG_Utility_Objective_System_Controller","ShowMarkersOnRadar=1:int,PrimaryObjectiveModel=null:string,SecondaryObjectiveModel=null:string,TertiaryObjectiveModel=null:string,Team=2:int");
 ScriptRegistrant<JMG_Utility_Objective_System_Objective_Update_Enter> JMG_Utility_Objective_System_Objective_Update_Enter_Registrant("JMG_Utility_Objective_System_Objective_Update_Enter","NewObjectiveID:int,NewObjectiveStringID:int,ObjectiveMarkerObjectID:int,CompleteObjectiveID:int,Delay:float,NewObjectivePriority=1:int");
 ScriptRegistrant<JMG_Utility_Objective_System_Objective_Update_Pickup> JMG_Utility_Objective_System_Objective_Update_Pickup_Registrant("JMG_Utility_Objective_System_Objective_Update_Pickup","NewObjectiveID:int,NewObjectiveStringID:int,ObjectiveMarkerObjectID:int,CompleteObjectiveID:int,Delay:float,NewObjectivePriority=1:int");
 ScriptRegistrant<JMG_Utility_Objective_System_Objective_Update_Killed> JMG_Utility_Objective_System_Objective_Update_Killed_Registrant("JMG_Utility_Objective_System_Objective_Update_Killed","NewObjectiveID:int,NewObjectiveStringID:int,ObjectiveMarkerObjectID:int,CompleteObjectiveID:int,Delay:float,NewObjectivePriority=1:int");
@@ -7131,7 +7941,7 @@
 ScriptRegistrant<JMG_Utility_Custom_Set_Weather_War_Blitz> JMG_Utility_Custom_Set_Weather_War_Blitz_Registrant("JMG_Utility_Custom_Set_Weather_War_Blitz","Custom:int,Intensity=0.0:float,StartDistance=0.0:float,EndDistance=0.0:float,Heading=0.0:float,Distribution=0.0:float,TransitionTime=0.0:float");
 ScriptRegistrant<JMG_Utility_Custom_Set_Weather_Clouds> JMG_Utility_Custom_Set_Weather_Clouds_Registrant("JMG_Utility_Custom_Set_Weather_Clouds","Custom:int,Cover=0.0:float,Gloominess=0.0:float,TransitionTime=0.0:float");
 ScriptRegistrant<JMG_Utility_Play_Music_On_Join_Custom_Change_Music> JMG_Utility_Play_Music_On_Join_Custom_Change_Music_Registrant("JMG_Utility_Play_Music_On_Join_Custom_Change_Music","Custom:int,Music=null:string,FadeOut:int,FadeIn:int,Repeat=1:int");
-ScriptRegistrant<JMG_Utility_Zone_Send_Custom_If_Has_Weapon> JMG_Utility_Zone_Send_Custom_If_Has_Weapon_Registrant("JMG_Utility_Zone_Send_Custom_If_Has_Weapon","WeaponName:string,ID=0:int,Custom=0:int,Param=0:int,Delay=0.0:float,PlayerType=2:int,TriggerOnce=1:int");
+ScriptRegistrant<JMG_Utility_Zone_Send_Custom_If_Has_Weapon> JMG_Utility_Zone_Send_Custom_If_Has_Weapon_Registrant("JMG_Utility_Zone_Send_Custom_If_Has_Weapon","WeaponName:string,ID=0:int,Custom=0:int,Param=0:int,Delay=0.0:float,PlayerType=2:int,TriggerOnce=1:int,RemoveWeapon=0:int");
 ScriptRegistrant<JMG_Utility_Receive_All_Customs_To_Send_Custom> JMG_Utility_Receive_All_Customs_To_Send_Custom_Registrant("JMG_Utility_Receive_All_Customs_To_Send_Custom","Custom0=0:int,Custom1=0:int,Custom2=0:int,Custom3=0:int,Custom4=0:int,Custom5=0:int,Custom6=0:int,Custom7=0:int,Custom8=0:int,Custom9=0:int,ID=0:int,Custom=0:int,Param=0:int,Delay=0.0:float,TriggerOnce=1:int,ResetCustom=0:int");
 ScriptRegistrant<JMG_Utility_Zone_Teleport_To_Random_Wander_Point> JMG_Utility_Zone_Teleport_To_Random_Wander_Point_Registrant("JMG_Utility_Zone_Teleport_To_Random_Wander_Point","WanderingAIGroupID=-1:int,SafeTeleportDistance=1.5:float,ChangeGroupIDCustom=0:int,PlayerType=2:int,RetryOnFailure=0:int");
 ScriptRegistrant<JMG_Utility_Zone_Teleport_To_Random_Wander_Point_Attach> JMG_Utility_Zone_Teleport_To_Random_Wander_Point_Attach_Registrant("JMG_Utility_Zone_Teleport_To_Random_Wander_Point_Attach","WanderingAIGroupID=-1:int,SafeTeleportDistance=1.5:float");
@@ -7145,7 +7955,7 @@
 ScriptRegistrant<JMG_Utility_Custom_Teleport_Players_Outside_Range_To_Wanderpoints> JMG_Utility_Custom_Teleport_Players_Outside_Range_To_Wanderpoints_Registrant("JMG_Utility_Custom_Teleport_Players_Outside_Range_To_Wanderpoints","Custom:int,ScanTeleportSpot:vector3,TeleportIgnoreDistance:float,WanderingAIGroupID:int,SafeTeleportDistance=1.5:float");
 ScriptRegistrant<JMG_Utility_Custom_Set_Tile_Frame> JMG_Utility_Custom_Set_Tile_Frame_Registrant("JMG_Utility_Custom_Set_Tile_Frame","Custom:int,ID:int,Animation:string,Frame:Float");
 ScriptRegistrant<JMG_Utility_Zone_Send_Custom_No_Weapon> JMG_Utility_Zone_Send_Custom_No_Weapon_Registrant("JMG_Utility_Zone_Send_Custom_No_Weapon","WeaponName:string,ID=0:int,Custom=0:int,Param=0:int,Delay=0.0:float,PlayerType=2:int,TriggerOnce=1:int");
-ScriptRegistrant<JMG_Utility_Custom_Display_Briefing_Message> JMG_Utility_Custom_Display_Briefing_Message_Registrant("JMG_Utility_Custom_Display_Briefing_Message","Custom=0:int,FileName=null:string,TextTag=[]:string,MessageColor=239.0 228.0 176.0:Vector3,LineDelayTime=6.0:float,UISound=null:string");
+ScriptRegistrant<JMG_Utility_Custom_Display_Briefing_Message> JMG_Utility_Custom_Display_Briefing_Message_Registrant("JMG_Utility_Custom_Display_Briefing_Message","Custom=0:int,FileName=null:string,TextTag=[]:string,MessageColor=239.0 228.0 176.0:Vector3,LineDelayTime=10.0:float,UISound=null:string");
 ScriptRegistrant<JMG_Utility_Zone_Set_Player_Team> JMG_Utility_Zone_Set_Player_Team_Registrant("JMG_Utility_Zone_Set_Player_Team","SetPlayerTeam=0:int,RequiredPlayerTeam=2:int");
 ScriptRegistrant<JMG_Utility_Objective_System_Objective_Update_Create> JMG_Utility_Objective_System_Objective_Update_Create_Registrant("JMG_Utility_Objective_System_Objective_Update_Create","NewObjectiveID:int,NewObjectiveStringID:int,ObjectiveMarkerObjectID:int,CompleteObjectiveID:int,Delay:float,NewObjectivePriority=1:int");
 ScriptRegistrant<JMG_Utility_Objective_System_Objective_Remove_Custom> JMG_Utility_Objective_System_Objective_Remove_Custom_Registrant("JMG_Utility_Objective_System_Objective_Remove_Custom","Custom:int,ObjectiveID:int");
@@ -7167,7 +7977,7 @@
 ScriptRegistrant<JMG_Utility_Custom_Damage_All_Soldiers_On_Team> JMG_Utility_Custom_Damage_All_Soldiers_On_Team_Registrant("JMG_Utility_Custom_Damage_All_Soldiers_On_Team","Custom:int,Team:int,Damage:float,Warhead=None:string");
 ScriptRegistrant<JMG_Utility_AI_Guardian_Vehicle> JMG_Utility_AI_Guardian_Vehicle_Registrant("JMG_Utility_AI_Guardian_Vehicle","WanderingAIGroupID:int,WanderSpeed=1.0:float,FireRange=100.0:float,FaceTarget=1:int,CheckBlocked=1:int,AimAtFeet=1:int,TurnOffEngineOnArrival=1:int");
 ScriptRegistrant<JMG_Utility_Custom_Destroy_Closest_Model_To_Position> JMG_Utility_Custom_Destroy_Closest_Model_To_Position_Registrant("JMG_Utility_Custom_Destroy_Closest_Model_To_Position","Custom:int,Model:string,Position:Vector3,MaxDistance=0.0:float");
-ScriptRegistrant<JMG_Utility_Send_Custom_On_Deaths_Controller> JMG_Utility_Send_Custom_On_Deaths_Controller_Registrant("JMG_Utility_Send_Custom_On_Deaths_Controller","MaxDeaths=100:int,DeathReminder=25:int,UrgentDeathReminder=10:int,StringID=12628:int,ReminderMessage=%d %s^ only %d more %s allowed!:string,Delim=^:string,ReminderMessageOrder=0:int,DeathSingular=causality:string,DeathPlural=causalities:string,RemainingSingular=death:string,RemainingPlural=deaths:string,ReminderColor=1.0 0.0 0.0:Vector3,ID=0:int,Custom=0:int,Param=0:int,Delay=0:int,ReminderCustom=0:int");
+ScriptRegistrant<JMG_Utility_Send_Custom_On_Deaths_Controller> JMG_Utility_Send_Custom_On_Deaths_Controller_Registrant("JMG_Utility_Send_Custom_On_Deaths_Controller","MaxDeaths=100:int,DeathReminder=25:int,UrgentDeathReminder=10:int,StringID=12628:int,ReminderMessage=%d %s^ only %d more %s allowed!:string,Delim=^:string,ReminderMessageOrder=0:int,DeathSingular=casualty:string,DeathPlural=casualties:string,RemainingSingular=death:string,RemainingPlural=deaths:string,ReminderColor=1.0 0.0 0.0:Vector3,ID=0:int,Custom=0:int,Param=0:int,Delay=0:int,ReminderCustom=0:int");
 ScriptRegistrant<JMG_Utility_Send_Custom_On_Deaths_Reporter> JMG_Utility_Send_Custom_On_Deaths_Reporter_Registrant("JMG_Utility_Send_Custom_On_Deaths_Reporter","");
 ScriptRegistrant<JMG_Utility_AI_Goto_Player_Ignore_Object> JMG_Utility_AI_Goto_Player_Ignore_Object_Registrant("JMG_Utility_AI_Goto_Player_Ignore_Object","");
 ScriptRegistrant<JMG_Utility_AI_Goto_Enemy_Ignore_Object> JMG_Utility_AI_Goto_Enemy_Ignore_Object_Registrant("JMG_Utility_AI_Goto_Enemy_Ignore_Object","");
@@ -7190,11 +8000,39 @@
 ScriptRegistrant<JMG_Utility_Zone_Screen_Fade> JMG_Utility_Zone_Screen_Fade_Registrant("JMG_Utility_Zone_Screen_Fade","Color:vector3,Opacity:float,Transition:float,PlayerType=2:int");
 ScriptRegistrant<JMG_Utility_Custom_Triggers_Enemy_Seen> JMG_Utility_Custom_Triggers_Enemy_Seen_Registrant("JMG_Utility_Custom_Triggers_Enemy_Seen","Custom:int,Visible:int");
 ScriptRegistrant<JMG_Utility_Screen_Fade_Red_On_Damage> JMG_Utility_Screen_Fade_Red_On_Damage_Registrant("JMG_Utility_Screen_Fade_Red_On_Damage","FadeColor=0.75 0.0 0.0:vector3,FadeOpacity=0.85:float");
-ScriptRegistrant<JMG_Utility_Player_Count_Enable_Spawners> JMG_Utility_Player_Count_Enable_Spawners_Registrant("JMG_Utility_Player_Count_Enable_Spawners","StartID:int,EndID:int,PlayerCount[eq|<|>]=-1.0 -1.0 -1.0:vector3,PlayerCount[neq|between(|)]=-1.0 -1.0 -1.0:vector3,EnableCustom=0:int,StartsEnabled=1:int");
+ScriptRegistrant<JMG_Utility_Player_Count_Enable_Spawners> JMG_Utility_Player_Count_Enable_Spawners_Registrant("JMG_Utility_Player_Count_Enable_Spawners","StartID:int,EndID:int,PlayerCount[eq|<|>]=-1.0 -1.0 -1.0:vector3,PlayerCount[neq|between(|)]=-1.0 -1.0 -1.0:vector3,EnableOrDisableCustom=0:int,StartsEnabled=1:int");
 ScriptRegistrant<JMG_Utility_AI_Engineer_Ignore_Target> JMG_Utility_AI_Engineer_Ignore_Target_Registrant("JMG_Utility_AI_Engineer_Ignore_Target","");
-ScriptRegistrant<JMG_Utility_Give_Weapon_In_Range> JMG_Utility_Give_Weapon_In_Range_Registrant("JMG_Utility_Give_Weapon_In_Range","WeaponName:string,Location:vector3,Range:float,EnableCustom:int,StartsEnabled=1:int,Rate=0.1:float,SelectWeapon=0:int,WeaponAmmo=1000:int,RefillRate=0.0:float,RefillAmount=0:int");
+ScriptRegistrant<JMG_Utility_Give_Weapon_In_Range> JMG_Utility_Give_Weapon_In_Range_Registrant("JMG_Utility_Give_Weapon_In_Range","WeaponName:string,Location:vector3,Range:float,EnableOrDisableCustom:int,StartsEnabled=1:int,Rate=0.1:float,SelectWeapon=0:int,WeaponAmmo=1000:int,RefillRate=0.0:float,RefillAmount=0:int");
 ScriptRegistrant<JMG_Utility_AI_Follow_Player_On_Poke_Controller> JMG_Utility_AI_Follow_Player_On_Poke_Controller_Registrant("JMG_Utility_AI_Follow_Player_On_Poke_Controller","MaxFollowers=-1:int");
-ScriptRegistrant<JMG_Utility_AI_Follow_Player_On_Poke> JMG_Utility_AI_Follow_Player_On_Poke_Registrant("JMG_Utility_AI_Follow_Player_On_Poke","FollowDistance=1.0:float,FollowNearSpeed=0.25:float,FollowFarDistance=10.0:float,FollowFarSpeed=1.0:float,FollowVeryFarDistance=100.0:float,FollowVeryFarSpeed=10.0:float,FallBackWhenOutOfArmor=1:int,RunHomeSpeed=1.0:float,HealWhileAtHomeLocation=0.0:float,HUDMessagesColor=1.0 0.0 0.0:vector3,MessagePokeFollowerID:int,MessageFollowingYouID:int,MessageFollowingPlayerID:int,MessageMaxFollowersID:int,MessageHealingRequiredID:int,MessageFollowerLostID:int,MessageFollowerInjuredID:int,MessageFollowerKilledID:int,SendCustomID:int,PokedCustom:int,LostCustom:int,InjuredCustom:int,KilledCustom:int,HealedCustom:int");
+ScriptRegistrant<JMG_Utility_AI_Follow_Player_On_Poke> JMG_Utility_AI_Follow_Player_On_Poke_Registrant("JMG_Utility_AI_Follow_Player_On_Poke","FollowDistance=1.0:float,FollowNearSpeed=0.25:float,FollowFarDistance=10.0:float,FollowFarSpeed=1.0:float,FollowVeryFarDistance=100.0:float,FollowVeryFarSpeed=10.0:float,FallBackWhenOutOfArmor=1:int,RunHomeSpeed=1.0:float,HealWhileAtHomeLocation=0.0:float,HUDMessagesColor=1.0 0.0 0.0:vector3,MessagePokeFollowerID:int,MessageFollowingYouID:int,MessageFollowingPlayerID:int,MessageMaxFollowersID:int,MessageHealingRequiredID:int,MessageFollowerLostID:int,MessageFollowerInjuredID:int,MessageFollowerKilledID:int,SendCustomID:int,PokedCustom:int,LostCustom:int,InjuredCustom:int,KilledCustom:int,HealedCustom:int,MaxFollowTime=3000:int,MaxIdleTime=300:int");
 ScriptRegistrant<JMG_Utility_Timer_Damage_And_Teleport> JMG_Utility_Timer_Damage_And_Teleport_Registrant("JMG_Utility_Timer_Damage_And_Teleport","Delay:float,TeleportToObjectID:int,Location:vector3,DamageAmount:float,DamageWarhead=None:string,DamageSelf=1:int");
 ScriptRegistrant<JMG_Utility_Zone_Send_Custom_If_Has_Script> JMG_Utility_Zone_Send_Custom_If_Has_Script_Registrant("JMG_Utility_Zone_Send_Custom_If_Has_Script","ScriptName:string,ID=0:int,Custom=0:int,Param=0:int,Delay=0.0:float,PlayerType=2:int,TriggerOnce=1:int");
 ScriptRegistrant<JMG_Utility_Damage_When_Outside_Of_Range> JMG_Utility_Damage_When_Outside_Of_Range_Registrant("JMG_Utility_Damage_When_Outside_Of_Range","Warn_Distance=0.0:float,Damage_Distance=0.0:float,Vehicle_Warn_Distance=0.0:float,Vehicle_Damage_Distance=0.0:float,Aircraft_Warn_Distance=0.0:float,Aircraft_Damage_Distance=0.0:float,Max_Survive_Distance=0.0:float,Warning_StringID:int,Warning_Color=1.0 0.0 0.0:vector3,Screen_Fade_Color=0.25 0.0 0.0:vector3");
+ScriptRegistrant<JMG_Utility_Send_Custom_When_No_More_Presets_Of_Type_Exist> JMG_Utility_Send_Custom_When_No_More_Presets_Of_Type_Exist_Registrant("JMG_Utility_Send_Custom_When_No_More_Presets_Of_Type_Exist","PresetName:string,StartsEnabled=0:int,EnableOrDisableCustom:int,ID:int,Custom:int,Param:int,Delay:float");
+ScriptRegistrant<JMG_Utility_Send_Custom_When_Player_Outside_Of_Range> JMG_Utility_Send_Custom_When_Player_Outside_Of_Range_Registrant("JMG_Utility_Send_Custom_When_Player_Outside_Of_Range","Distance:float,ID:int,Custom:int,Param:int,Delay:float,TriggerOnce=1:int,SleepTime=10:int");
+ScriptRegistrant<JMG_Utility_Set_Team_To_Neutral_When_No_Armor> JMG_Utility_Set_Team_To_Neutral_When_No_Armor_Registrant("JMG_Utility_Set_Team_To_Neutral_When_No_Armor","");
+ScriptRegistrant<JMG_Utility_Send_Custom_When_No_More_Units_On_Team_Exist> JMG_Utility_Send_Custom_When_No_More_Units_On_Team_Exist_Registrant("JMG_Utility_Send_Custom_When_No_More_Units_On_Team_Exist","Team:string,StartsEnabled=0:int,EnableOrDisableCustom:int,ID:int,Custom:int,Param:int,Delay:float");
+ScriptRegistrant<JMG_Utility_Custom_Create_Sound_At_Object_Bone> JMG_Utility_Custom_Create_Sound_At_Object_Bone_Registrant("JMG_Utility_Custom_Create_Sound_At_Object_Bone","Sound:string,Bone:string,Custom:int");
+ScriptRegistrant<JMG_Utility_Custom_Send_Custom_On_Player_Count> JMG_Utility_Custom_Send_Custom_On_Player_Count_Registrant("JMG_Utility_Custom_Send_Custom_On_Player_Count","Custom:int,BaseCount:int,PlayerCount:int,ID=0:int,SendCustom:int,Param:int,Delay:float,ResetCustom:int");
+ScriptRegistrant<JMG_Utility_Killed_By_Player_Send_Custom> JMG_Utility_Killed_By_Player_Send_Custom_Registrant("JMG_Utility_Killed_By_Player_Send_Custom","ID:int,Custom:int,Param:int,Delay:float");
+ScriptRegistrant<JMG_Utility_AI_Guardian_Ignored> JMG_Utility_AI_Guardian_Ignored_Registrant("JMG_Utility_AI_Guardian_Ignored","");
+ScriptRegistrant<JMG_Utility_AI_Vehicle_Ignored> JMG_Utility_AI_Vehicle_Ignored_Registrant("JMG_Utility_AI_Vehicle_Ignored","");
+ScriptRegistrant<JMG_Utility_Killed_By_PresetID_Send_Custom> JMG_Utility_Killed_By_PresetID_Send_Custom_Registrant("JMG_Utility_Killed_By_PresetID_Send_Custom","PresetID:int,ID:int,Custom:int,Param:int,Delay:float");
+ScriptRegistrant<JMG_Utility_Created_Override_AI_Soldier_Muzzle_Direction> JMG_Utility_Created_Override_AI_Soldier_Muzzle_Direction_Registrant("JMG_Utility_Created_Override_AI_Soldier_Muzzle_Direction","");
+ScriptRegistrant<JMG_Utility_Custom_Send_Custom_On_Player_Count_HUD> JMG_Utility_Custom_Send_Custom_On_Player_Count_HUD_Registrant("JMG_Utility_Custom_Send_Custom_On_Player_Count_HUD","Custom:int,BaseCount:int,PlayerCount:int,ID=0:int,SendCustom:int,Param:int,Delay:float,ResetCustom:int,HudStringId:int,HudStringColor:Vector3");
+ScriptRegistrant<JMG_Utility_Zone_Send_Custom_If_Has_Weapon_Ammo> JMG_Utility_Zone_Send_Custom_If_Has_Weapon_Ammo_Registrant("JMG_Utility_Zone_Send_Custom_If_Has_Weapon_Ammo","WeaponName:string,ID=0:int,Custom=0:int,Param=0:int,Delay=0.0:float,PlayerType=2:int,RemoveWeapon=0:int,TriggerOnce=1:int");
+ScriptRegistrant<JMG_Utility_Custom_Remove_Weapon_From_All_Players> JMG_Utility_Custom_Remove_Weapon_From_All_Players_Registrant("JMG_Utility_Custom_Remove_Weapon_From_All_Players","Custom:int,WeaponName:string");
+ScriptRegistrant<JMG_Utility_Custom_Destroy_All_Presets_By_Name> JMG_Utility_Custom_Destroy_All_Presets_By_Name_Registrant("JMG_Utility_Custom_Destroy_All_Presets_By_Name","Custom:int,PresetName:string");
+ScriptRegistrant<JMG_Utility_Send_Custom_When_Damage_Exceedes_Threshold> JMG_Utility_Send_Custom_When_Damage_Exceedes_Threshold_Registrant("JMG_Utility_Send_Custom_When_Damage_Exceedes_Threshold","DamageThreshold:float,LockoutTime:float,ID:int,Custom:int,Param:int,Delay:float");
+ScriptRegistrant<JMG_Utility_Custom_Send_Translated_String_To_All_Players> JMG_Utility_Custom_Send_Translated_String_To_All_Players_Registrant("JMG_Utility_Custom_Send_Translated_String_To_All_Players","Custom:int,StringID:string,ColorRGB:Vector3,Repeatable=1:int");
+ScriptRegistrant<JMG_Utility_Destroyed_Drop_Powerup> JMG_Utility_Destroyed_Drop_Powerup_Registrant("JMG_Utility_Destroyed_Drop_Powerup","WeaponPreset:string,PowerupName:string,HeightAdjust=0.0:float");
+ScriptRegistrant<JMG_Utility_Pickup_Attach_Script> JMG_Utility_Pickup_Attach_Script_Registrant("JMG_Utility_Pickup_Attach_Script","Script:string,Params:string,Delim=@:string");
+ScriptRegistrant<JMG_Utility_Objective_System_Objective_Status_Update_Custom> JMG_Utility_Objective_System_Objective_Status_Update_Custom_Registrant("JMG_Utility_Objective_System_Objective_Status_Update_Custom","Custom:int,ObjectiveID:int,NewObjectiveStringID:int,NewObjectiveMarkerObjectID:int");
+ScriptRegistrant<JMG_Utility_Objective_System_Objective_Failed_Custom> JMG_Utility_Objective_System_Objective_Failed_Custom_Registrant("JMG_Utility_Objective_System_Objective_Failed_Custom","Custom:int,ObjectiveID:int");
+ScriptRegistrant<JMG_Utility_Force_Player_Team_At_Gameover> JMG_Utility_Force_Player_Team_At_Gameover_Registrant("JMG_Utility_Force_Player_Team_At_Gameover","Team:int");
+ScriptRegistrant<JMG_Utility_AI_Guardian_Generic> JMG_Utility_AI_Guardian_Generic_Registrant("JMG_Utility_AI_Guardian_Generic","WanderingAIGroupID:int,WanderSpeed=1.0:float,FireRange=100.0:float,FaceTarget=1:int,CheckBlocked=1:int,ArriveDistance=1.0:float,FlightHeight=0.0:float,TurnOffEngineOnArrival=1:int,UseSecondaryAttack=0:int");
+ScriptRegistrant<JMG_Utility_Custom_Create_Object_In_Front_Of_Self> JMG_Utility_Custom_Create_Object_In_Front_Of_Self_Registrant("JMG_Utility_Custom_Create_Object_In_Front_Of_Self","Custom:int,PresetName:string,Distance:float,Height:float,Rotation:float");
+ScriptRegistrant<JMG_Utility_Send_Custom_When_No_More_Units_On_Team_Exist_Ignore> JMG_Utility_Send_Custom_When_No_More_Units_On_Team_Exist_Ignore_Registrant("JMG_Utility_Send_Custom_When_No_More_Units_On_Team_Exist_Ignore","Ignore:int");
+ScriptRegistrant<JMG_Utility_Custom_Damage_All_Vehicles_On_Team> JMG_Utility_Custom_Damage_All_Vehicles_On_Team_Registrant("JMG_Utility_Custom_Damage_All_Vehicles_On_Team","Custom:int,Team:int,Damage:float,Warhead=None:string");
+ScriptRegistrant<JMG_Utility_Kill_Unit_If_Not_Moving_Enough> JMG_Utility_Kill_Unit_If_Not_Moving_Enough_Registrant("JMG_Utility_Kill_Unit_If_Not_Moving_Enough","Time=60.0:float,Distance=1.0:float");
+ScriptRegistrant<JMG_Utility_Custom_Display_Briefing_Message_StringID> JMG_Utility_Custom_Display_Briefing_Message_StringID_Registrant("JMG_Utility_Custom_Display_Briefing_Message_StringID","Custom=0:int,StringID:int,MessageColor=239.0 228.0 176.0:Vector3,LineDelayTime=10.0:float,UISound=null:string");
diff -uwrN sourceold/scripts/jmgUtility.h source/scripts/jmgUtility.h
--- sourceold/scripts/jmgUtility.h	2016-12-17 21:07:23.267015700 +1000
+++ source/scripts/jmgUtility.h	2017-01-22 19:51:59.213626000 +1000
@@ -1098,6 +1098,17 @@
 		}
 		return NotDefined;
 	}
+	Priority Get_Objective_Priority(int objectiveId)
+	{
+		ObjectiveNode *current = objectiveNodeList;
+		while (current)
+		{
+			if (current->id == objectiveId)
+				return current->priority;
+			current = current->next;
+		}
+		return Undefined;
+	}
 	int Get_Objective_Status_Count(Status status,Priority requiredPriority = Undefined)
 	{
 		int count = 0;
@@ -1361,7 +1372,7 @@
 * \RespawnTime - Time it takes between spawns after last object was killed
 * \RespawnTimeRandom - Random time to add or subtract from the spawn time
 * \StartsEnabled - Can the object spawn on script create
-* \EnableCustom - Message used to enable the spawner, the parameter sent with it tell whether to enable or disable (1 for enable, 0 for disable, -1 disables and kills the spawned object, -2 disables and destroys the spawned object)
+* \EnableOrDisableCustom - Message used to enable the spawner, the parameter sent with it tell whether to enable or disable (1 for enable, 0 for disable, -1 disables and kills the spawned object, -2 disables and destroys the spawned object)
 * \SpawnLimit - How many objects can this script spawn
 * \DelayOnStartup - Day to spawn the first object when enabled
 * \author jgray
@@ -1444,6 +1455,7 @@
 * \DisableEngineOnArrival - Tells the unit whether it should shutdown its engine when it finishes moving, useful for wheeled vehicles so they don't go rolling away.
 * \WeaponError - This tells the max weapon error the vehicle can use, if weapon error is -1 it dynamically determines a weapon error to use, this calculation has to do with bullet speed and enemy distance.
 * \MaxHuntRange - This variable makes it so the AI can't see anything that is further than x meters from the wander point (or home position) it is currently moving too, if 0 this setting is ignored.
+* \NextWanderPointWhenLastReached - When 0 MinRandWander and MaxRandWander are used, when greater than 0 this is the distance the Vehicle must get to a wander point before choosing its next one
 * \author jgray
 * \ingroup JmgUtility
 */
@@ -1483,6 +1495,7 @@
 	bool drivingBackward;
 	float maxHuntRangeSquared;
 	Vector3 lastWanderPointSpot;
+	float grabNextPointDistance;
 	void Created(GameObject *obj);
 	void Action_Complete(GameObject *obj,int action,ActionCompleteReason reason);
 	void Custom(GameObject *obj,int message,int param,GameObject *sender);
@@ -1800,6 +1813,7 @@
 class JMG_Utility_Display_HUD_Info_Text_All_Players_Custom_Replace_String : public ScriptImpClass {
 	void Custom(GameObject *obj,int message,int param,GameObject *sender);
 };
+
 /*!
 * \brief Displays a hud message to all players on custom, allows user to override string with custom string
 * \Custom - Custom message to trigger the script on
@@ -2380,6 +2394,7 @@
 * \ReactToAttackRate - Rate at which the AI will recalculate whether or not it'll acknowledge attack damage
 * \ShutdownEngineOnArrival - used for vehicles to shut off their engines when they arrive at the point
 * \EnableDebug - If true the bot will print out any points it cannot get to WARNING: this will print off both when the bot can't reach it due to the point being in a bad spot AND the bot being in a bad spot
+* \UseSecondaryFire - Should secondary fire be used when attacking
 * \author jgray
 * \ingroup JmgUtility
 */
@@ -2423,6 +2438,7 @@
 	bool reactToAttackChance;
 	Vector3 lastPosition;
 	bool moveBackward;
+	bool usePrimaryFire;
 	void Created(GameObject *obj);
 	void Enemy_Seen(GameObject *obj,GameObject *seen);
 	void Timer_Expired(GameObject *obj,int number);
@@ -2659,6 +2675,7 @@
 * \PrimaryObjectiveModel - Visible 3d model to show for Primary Objectives
 * \SecondaryObjectiveModel - Visible 3d model to show for Secondary Objectives
 * \TertiaryObjectiveModel - Visible 3d model to show for Tertiary Objectives
+* \Team - Team to show the objectives for
 * \author jgray
 * \ingroup JmgUtility
 */
@@ -3169,6 +3186,7 @@
 * \Param - Param to send
 * \Delay - Delay to add before sending custom
 * \TriggerOnce - Allows the script only to trigger the first time the zone is entered
+* \RemoveWeapon - Removes the weapon from the player if true
 * \author jgray
 * \ingroup JmgUtility
 */
@@ -3394,6 +3412,7 @@
 * \MessageColor - Color to display the chat message in
 * \LineDelayTime - Delay between each message displayed
 * \UISound - 2D sound to play when custom received
+* \Repeatable - Allows the script to trigger more than once
 * \File Format Example
 [Tag]
 Text typed here will be displayed for this tag when the custom is received, the line can be up to 16384 characters long.
@@ -3429,6 +3448,7 @@
 	};
 	BriefingTextNode *BriefingText;
 	BriefingTextNode *CurrentNode;
+	bool triggered;
 	void Created(GameObject *obj);
 	void Timer_Expired(GameObject *obj,int number);
 	void Custom(GameObject *obj,int message,int param,GameObject *sender);
@@ -3923,6 +3943,7 @@
 {
 	void Created(GameObject *obj);
 	void Custom(GameObject *obj,int message,int param,GameObject *sender);
+	void Destroyed(GameObject *obj);
 public:
 	static int deathCount;
 	static int maxDeaths;
@@ -3937,6 +3958,7 @@
 	static char remainingSingular[220];
 	static char remainingPlural[220];
 	static int reminderMessageOrder;
+	static bool controllerPlaced;
 };
 
 /*!
@@ -4359,7 +4381,7 @@
 * \EndID - ID to stop at
 * \PlayerCount[eq|<|>] - Set the player count for the conditions to enable the spawners, enter -1 ignores the condition (equal, less than, greater than)
 * \PlayerCount[neq|between(|)] - Set the player count for the conditions to enable the spawners, enter -1 ignores the condition (not equal, between)
-* \EnableCustom - Custom pauses the script or unpauses it, param enables/disables (spawner current state is left enabled/disabled)
+* \EnableOrDisableCustom - Custom pauses the script or unpauses it, param enables/disables (spawner current state is left enabled/disabled)
 * \StartsEnabled - Should this script be running on map load
 * \author jgray
 * \ingroup JmgUtility
@@ -4390,7 +4412,7 @@
 * \WeaponName - Name of the weapon to grant to the player
 * \Location - Location to grant the weapon at
 * \Range - Range from the location to grant the weapon
-* \EnableCustom - Custom to enable the scanning, parameter determines if its enabled or disabled 1 = enabled, 0 = disabled
+* \EnableOrDisableCustom - Custom to enable the scanning, parameter determines if its enabled or disabled 1 = enabled, 0 = disabled
 * \StartsEnabled - Should to script start running 1 = true, 0 = false
 * \Rate - Speed at which to scan, 0.0 will disable the repeated scanning and then only enable custom will trigger a scan
 * \SelectWeapon - Should the player pull out the weapon when its granted
@@ -4454,21 +4476,28 @@
 * \MessageFollowingPlayerID - Message to display to the player if they poke a bot that is following someone else
 * \MessageMaxFollowersID - Message to display if the player attempts to have more followers than allowed (message is formatted: You can only have %d creature%sfollowing you.)
 * \MessageHealingRequiredID - Message to display when the follower is hurt and has to heal before following again, only available when FallBackWhenOutOfArmor is on
-* \MessageFollowerLostID - Message to display when the player the follower is following wanders out of the pathfind zone
+* \MessageFollowerLostID - Message to display when the player the follower is following wanders out of the pathfind zone or if they follow the player for to long
 * \MessageFollowerInjuredID - Message to display when the follower runs out of armor, FallBackWhenOutOfArmor must be on
 * \MessageFollowerKilledID - Message to display when the follower dies following someone
 * \SendCustomID - ID of the object customs should be sent to
 * \PokedCustom - Custom to send when the follower is poked and starts following
-* \LostCustom - Message to send if the follower gets lost
+* \LostCustom - Message to send if the follower gets lost or if they follow the player for to long
 * \InjuredCustom - Message to send when the follower gets injured, requires FallBackWhenOutOfArmor be on
 * \KilledCustom - Message to send if the follower is killed 
 * \HealedCustom - Message to send when the follower gets to full health, requires FallBackWhenOutOfArmor be on
+* \MaxFollowTime - Amount of time the AI can follow the player before getting bored and running home (in 10ths of a second)
+* \MaxIdleTime - Max amount of time an AI can stand still while "following" a player before running home (in 10ths of a second)
 * \author jgray
 * \ingroup JmgUtility
 */
 class JMG_Utility_AI_Follow_Player_On_Poke : public ScriptImpClass {
 	GameObject *lastFollow;
 	GameObject *lastTarget;
+	Vector3 lastPos;
+	int maxFollowTime;
+	int maxIdleTime;
+	int currentFollowTime;
+	int currentIdleTime;
 	bool detached;
 	float followDistance;
 	float followNearSpeed;
@@ -4561,7 +4590,7 @@
 };
 
 /*!
-* \brief Fades the screen and applies damage as the player gets further from the spot on the map, kills player if they wander outside a max range
+* \brief Fades the screen and applies damage as the player gets further from the spot on the map, kills player if they wander outside a max range, uses JMG_Utility_Set_Screen_Color_Fade_Controller for default screen colors
 * \Warn_Distance - Distance at which the warning message appears on the HUD for infantry
 * \Damage_Distance - Distance at which the infantry starts taking damage
 * \Vehicle_Warn_Distance - Distance at which the warning message appears on the HUD for vehicle
@@ -4585,10 +4614,508 @@
 	float maxSurviveDistance;
 	Vector3 errorMessageColor;
 	Vector3 screenFadeColor;
-	Vector3 myPos;
 	int warnTime[128];
 	bool screenEffectOn[128];
 	int leavingFieldStringId;
 	void Created(GameObject *obj);
 	void Timer_Expired(GameObject *obj,int number);
 };
\ No newline at end of file
+
+/*!
+* \brief Sends a custom message when no more objects of the preset name exist on the map, then removes itself
+* \PresetName - preset name to search for 
+* \StartsEnabled - If 0 it doesn't start scanning until enabled, otherwise starts scanning on attach
+* \EnableOrDisableCustom - Custom used to enable the script, a param of 0 disables the script again, anything besides 0 enables
+* \ID - Id of the object to send the custom to, 0 sends to itself
+* \Message - Custom to send
+* \Param - parameter to send with the custom
+* \Delay - Time amount to wait before sending the custom
+* \author jgray
+* \ingroup JmgUtility
+*/
+class JMG_Utility_Send_Custom_When_No_More_Presets_Of_Type_Exist : public ScriptImpClass {
+	char presetName[128];
+	int enableCustom;
+	bool enabled;
+	void Created(GameObject *obj);
+	void Custom(GameObject *obj,int message,int param,GameObject *sender);
+	void Timer_Expired(GameObject *obj,int number);
+};
+
+/*!
+* \brief Sends a custom message when a player goes beyond a certain range of this object
+* \Distance - how far away can the plaeyrs go
+* \ID - Id of the object to send the custom to, 0 sends to itself
+* \Message - Custom to send
+* \Param - parameter to send with the custom
+* \Delay - Time amount to wait before sending the custom
+* \TriggerOnce - If true the script can only fire once
+* \sleepTime - Value in 10ths of a second the script must wait before sending the custom again
+* \author jgray
+* \ingroup JmgUtility
+*/
+class JMG_Utility_Send_Custom_When_Player_Outside_Of_Range : public ScriptImpClass {
+	int sleepTime;
+	int sleeping;
+	bool triggerOnce;
+	bool enabled;
+	float distance;
+	float delay;
+	int id;
+	int param;
+	int custom;
+	void Created(GameObject *obj);
+	void Timer_Expired(GameObject *obj,int number);
+};
+
+/*!
+* \brief Sets the player type to -2 when no armor, sets player type back to the original player type when armor is full
+* \author jgray
+* \ingroup JmgUtility
+*/
+class JMG_Utility_Set_Team_To_Neutral_When_No_Armor : public ScriptImpClass {
+	bool hurt;
+	int originalPlayerType;
+	void Created(GameObject *obj);
+	void Timer_Expired(GameObject *obj,int number);
+};
+
+/*!
+* \brief Sends a custom message when no more objects on the specified team exist 
+* \Team - team that should be scanned for
+* \StartsEnabled - If 0 it doesn't start scanning until enabled, otherwise starts scanning on attach
+* \EnableOrDisableCustom - Custom used to enable the script, a param of 0 disables the script again, anything besides 0 enables
+* \ID - Id of the object to send the custom to, 0 sends to itself
+* \Message - Custom to send
+* \Param - parameter to send with the custom
+* \Delay - Time amount to wait before sending the custom
+* \author jgray
+* \ingroup JmgUtility
+*/
+class JMG_Utility_Send_Custom_When_No_More_Units_On_Team_Exist : public ScriptImpClass {
+	int team;
+	int enableCustom;
+	bool enabled;
+	void Created(GameObject *obj);
+	void Custom(GameObject *obj,int message,int param,GameObject *sender);
+	void Timer_Expired(GameObject *obj,int number);
+};
+
+/*!
+* \brief Creates a 3D sound at the specified bone on custom
+* \Sound - Sound preset to play
+* \Bone - Bone to play the sound from
+* \Custom - Custom message to trigger the sound
+* \author jgray
+* \ingroup JmgUtility
+*/
+class JMG_Utility_Custom_Create_Sound_At_Object_Bone : public ScriptImpClass {
+	char sound[128];
+	char bone[32];
+	int custom;
+	bool enabled;
+	void Created(GameObject *obj);
+	void Custom(GameObject *obj,int message,int param,GameObject *sender);
+};
+
+/*!
+* \brief Sends a custom when a custom has been received x times with addition of a player count multiplier, script destroys itself after it triggers once
+* \Custom - Custom to count
+* \BaseCount - how many customs needed
+* \PlayerCount - added to the base count, multiplied by the number of players in game
+* \ID - ID to send to, 0 sends to self, -1 sends to sender
+* \SendCustom - custom to send
+* \Param - param to send
+* \Delay - delay to add
+* \ResetCustom - custom to reset the count
+* \author jgray
+* \ingroup JmgUtility
+*/
+class JMG_Utility_Custom_Send_Custom_On_Player_Count : public ScriptImpClass {
+	int custom;
+	int resetCustom;
+	int baseCount;
+	int playerCount;
+	int runningCount;
+	void Created(GameObject *obj);
+	void Custom(GameObject *obj,int message,int param,GameObject *sender);
+};
+
+/*!
+* \brief Sends a custom message when killed by a player
+* \ID - Id of the object to send the custom to, 0 sends to itself, -1 to killer
+* \Message - Custom to send
+* \Param - parameter to send with the custom
+* \Delay - Time amount to wait before sending the custom
+* \author jgray
+* \ingroup JmgUtility
+*/
+class JMG_Utility_Killed_By_Player_Send_Custom : public ScriptImpClass {
+	void Killed(GameObject *obj,GameObject *killer);
+};
+
+/*!
+* \brief Makes this unit ignored by all the Guardian AI scripts
+* \author jgray
+* \ingroup JmgUtility
+*/
+class JMG_Utility_AI_Guardian_Ignored : public ScriptImpClass {
+	void Created(GameObject *obj);
+};
+
+/*!
+* \brief Makes this unit ignored by all JMG_Utility_AI_Vehicle
+* \author jgray
+* \ingroup JmgUtility
+*/
+class JMG_Utility_AI_Vehicle_Ignored : public ScriptImpClass {
+	void Created(GameObject *obj);
+};
+
+/*!
+* \brief Sends a custom message when killed by a specific PresetID
+* \PresetID - Preset ID to detect
+* \ID - Id of the object to send the custom to, 0 sends to itself, -1 to killer
+* \Message - Custom to send
+* \Param - parameter to send with the custom
+* \Delay - Time amount to wait before sending the custom
+* \author jgray
+* \ingroup JmgUtility
+*/
+class JMG_Utility_Killed_By_PresetID_Send_Custom : public ScriptImpClass {
+	void Killed(GameObject *obj,GameObject *killer);
+};
+
+/*!
+* \brief Makes an AI able to shoot directions the gun isn't aiming
+* \author jgray
+* \ingroup JmgUtility
+*/
+class JMG_Utility_Created_Override_AI_Soldier_Muzzle_Direction : public ScriptImpClass {
+	void Created(GameObject *obj);
+};
+
+/*!
+* \brief Sends a custom when a custom has been received x times with addition of a player count multiplier, script destroys itself after it triggers once, also displays the current count on the HUD
+* \Custom - Custom to count
+* \BaseCount - how many customs needed
+* \PlayerCount - added to the base count, multiplied by the number of players in game
+* \ID - ID to send to, 0 sends to self, -1 sends to sender
+* \SendCustom - custom to send
+* \Param - param to send
+* \Delay - delay to add
+* \ResetCustom - custom to reset the count
+* \HudStringId - stringId for the string to be parsed and displayed on the HUD, formatting goes %d/%d (current count out of calculated total)
+* \HudStringColor - RGB value for the HUD message (0.0-1.0)
+* \author jgray
+* \ingroup JmgUtility
+*/
+class JMG_Utility_Custom_Send_Custom_On_Player_Count_HUD : public ScriptImpClass {
+	Vector3 hudStringColor;
+	char hudMessage[220];
+	int hudStringId;
+	int custom;
+	int resetCustom;
+	int baseCount;
+	int playerCount;
+	int runningCount;
+	void Created(GameObject *obj);
+	void Custom(GameObject *obj,int message,int param,GameObject *sender);
+	char *formatHUDMessage(const char *format,...);
+};
+
+/*!
+* \brief Sends a custom if the object entering the zone has a weapon, one custom is sent for each ammo count the weapon has
+* \PlayerType - Player type the zone triggers for
+* \WeaponName - Name of the weapon needed to trigger the zone
+* \ID - ID to send the custom to, 0 sends to self, -1 sends to enter
+* \Custom - Custom message to send
+* \Param - Param to send
+* \Delay - Delay to add before sending custom
+* \RemoveWeapon - Should the weapon be removed when entering the zone
+* \TriggerOnce - Allows the script only to trigger the first time the zone is entered
+* \author jgray
+* \ingroup JmgUtility
+*/
+class JMG_Utility_Zone_Send_Custom_If_Has_Weapon_Ammo : public ScriptImpClass {
+	void Entered(GameObject *obj,GameObject *enterer);
+};
+
+/*!
+* \brief Removes a weapon from all the players in game when a custom is received
+* \Custom - Custom to count
+* \WeaponName - name of the weapon preset to remove
+* \author jgray
+* \ingroup JmgUtility
+*/
+class JMG_Utility_Custom_Remove_Weapon_From_All_Players : public ScriptImpClass {
+	int custom;
+	char weaponName[128];
+	void Created(GameObject *obj);
+	void Custom(GameObject *obj,int message,int param,GameObject *sender);
+};
+
+/*!
+* \brief Destroys all the objects on the map with matching preset name
+* \Custom - Custom to trigger the script
+* \PresetName - Name of the preset to hunt down and destroy
+* \author jgray
+* \ingroup JmgUtility
+*/
+class JMG_Utility_Custom_Destroy_All_Presets_By_Name : public ScriptImpClass {
+	int custom;
+	char presetName[128];
+	void Created(GameObject *obj);
+	void Custom(GameObject *obj,int message,int param,GameObject *sender);
+};
+
+/*!
+* \brief Sends a custom when an object has been damaged over a specified amount, also can have a delay how often the custom can be sent again
+* \DamageThreshold - Amount of damage that must be done to trigger the script
+* \LockoutTime - Amount of time that must go by before the script can trigger again
+* \ID - ID to send the custom to, 0 sends to self, -1 sends to enter
+* \Custom - Custom message to send
+* \Param - Param to send
+* \Delay - Delay to add before sending custom
+* \author jgray
+* \ingroup JmgUtility
+*/
+class JMG_Utility_Send_Custom_When_Damage_Exceedes_Threshold : public ScriptImpClass {
+	int id;
+	int custom;
+	int param;
+	float delay;
+	float damageThreshold;
+	float lockoutTime;
+	float timeRemaining;
+	void Created(GameObject *obj);
+	void Timer_Expired(GameObject *obj,int number);
+	void Damaged(GameObject *obj,GameObject *damager,float damage);
+};
+
+/*!
+* \brief Sends a chat message to all players on custom
+* \Custom - Custom message to trigger the script on
+* \StringId - String ID to send through the chat console to all players
+* \ColorRGB - Color of the HUD message to display 0-255
+* \Repeatable - Can the script trigger more than once
+* \author jgray
+* \ingroup JmgUtility
+*/
+class JMG_Utility_Custom_Send_Translated_String_To_All_Players : public ScriptImpClass {
+	int custom;
+	Vector3 color;
+	int stringId;
+	bool repeatable;
+	void Created(GameObject *obj);
+	void Custom(GameObject *obj,int message,int param,GameObject *sender);
+};
+
+/*!
+* \brief Creates a powerup at the objects origin when it is destroyed if it has that weapon
+* \WeaponPreset - Weapon that is needed to do the drop
+* \PowerupName - Powerup to create
+* \HeightAdjust - Height to add to the object's origin to create the powerup at
+* \author jgray
+* \ingroup JmgUtility
+*/
+class JMG_Utility_Destroyed_Drop_Powerup : public ScriptImpClass
+{
+	void Destroyed(GameObject *obj);
+};
+
+/*!
+* \brief Attaches a script to the soldier that picked up the powerup
+* \Script - Script to attach
+* \Params - Params to use
+* \Delim - char to use in place of ,
+* \author jgray
+* \ingroup JmgUtility
+*/
+class JMG_Utility_Pickup_Attach_Script : public ScriptImpClass
+{
+	void Custom(GameObject *obj,int message,int param,GameObject *sender);
+};
+
+/*!
+* \brief Used to update the status of an objective
+* \Custom - Custom to trigger on
+* \ObjectiveID - ID of the new objective to update
+* \NewObjectiveStringID - Strings.tbl id for the objective message
+* \NewObjectiveMarkerObjectID - ID of the object where the marker should be displayed (-1 sets the sender as the marker)
+* \author jgray
+* \ingroup JmgUtility
+*/
+class JMG_Utility_Objective_System_Objective_Status_Update_Custom : public ScriptImpClass {
+	void Custom(GameObject *obj,int message,int param,GameObject *sender);
+};
+
+/*!
+* \brief Used to make an objective show up as failed
+* \Custom - Custom to trigger this script
+* \ObjectiveID - ID of the new objective to remove
+* \author jgray
+* \ingroup JmgUtility
+*/
+class JMG_Utility_Objective_System_Objective_Failed_Custom : public ScriptImpClass {
+	int custom;
+	void Created(GameObject *obj);
+	void Custom(GameObject *obj,int message,int param,GameObject *sender);
+};
+
+/*!
+* \brief Places all players on the same team at the end of the round
+* \Team - Team to force all players to
+* \author jgray
+* \ingroup JmgUtility
+*/
+class JMG_Utility_Force_Player_Team_At_Gameover : public ScriptImpClass {
+	int team;
+	void Created(GameObject *obj);
+	void Timer_Expired(GameObject *obj,int number);
+};
+
+/*!
+* \brief Makes a unit move between wander points, it'll strafe at the target while it has one, clone of JMG_Utility_AI_Guardian_Aircraft but with pathfind enabled
+* \WanderingAIGroupID - Group of points to wander between
+* \WanderSpeed - Speed the unit moves at 
+* \FireRange - Max range that it can use it's guns
+* \CheckBlocked - Whether to check if the target spot is blocked before firing
+* \ArriveDistance - Distance to get close to
+* \FlightHeight - How high should the aircraft fly (use 0 if not an aircraft)
+* \TurnOffEngineOnArrival - Should the vehicle kill its engine when it arrives
+* \UseSecondaryAttack - Should the unit attack with its secondary fire instead
+* \author jgray
+* \ingroup JmgUtility
+*/
+class JMG_Utility_AI_Guardian_Generic : public ScriptImpClass {
+	float flightHeight;
+	float arriveDistance;
+	float arriveDistanceSq;
+	Vector3 dpPosition;
+	int EnemyID;
+	int EnemyTimeOutTime;
+	Vector3 LastPos;
+	bool primaryFire;
+	void Created(GameObject *obj);
+	void Timer_Expired(GameObject *obj,int number);
+	void Enemy_Seen(GameObject *obj,GameObject *seen);
+	void Damaged(GameObject *obj,GameObject *damager,float damage);
+	void Goto_Location(GameObject *obj);
+	bool Get_A_Defense_Point(Vector3 *position);
+};
+
+/*!
+* \brief Creates an object in front of this object
+* \Custom - Custom to trigger the script
+* \PresetName - Name of the preset to create
+* \Distance - Distance in front of the object to place the new object
+* \Height - Height to add to the new object
+* \Rotation - Rotation to add to the new object (base rotation is the same as the old object)
+* \author jgray
+* \ingroup JmgUtility
+*/
+class JMG_Utility_Custom_Create_Object_In_Front_Of_Self : public ScriptImpClass {
+	int custom;
+	char presetName[128];
+	float distance;
+	float height;
+	float rotation;
+	void Created(GameObject *obj);
+	void Custom(GameObject *obj,int message,int param,GameObject *sender);
+};
+
+/*!
+* \brief Makes this unit ignored by JMG_Utility_Send_Custom_When_No_More_Units_On_Team_Exist
+* \Ignore - Does nothing, just here so you can tell which script this is beings the name is cut off
+* \author jgray
+* \ingroup JmgUtility
+*/
+class JMG_Utility_Send_Custom_When_No_More_Units_On_Team_Exist_Ignore : public ScriptImpClass {
+	void Created(GameObject *obj);
+};
+
+/*!
+* \brief Damages all vehicles on a team when a custom is received
+* \Custom - Custom to count
+* \Team - team to wipe out
+* \Damage - how much damage to apply
+* \Warhead - warhead to use
+* \author jgray
+* \ingroup JmgUtility
+*/
+class JMG_Utility_Custom_Damage_All_Vehicles_On_Team : public ScriptImpClass {
+	int custom;
+	int team;
+	float damage;
+	char warhead[128];
+	void Created(GameObject *obj);
+	void Custom(GameObject *obj,int message,int param,GameObject *sender);
+};
+
+/*!
+* \brief Kills a unit if it doesn't manage to move more than the specified distance in the specified time
+* \Time - amount of time the unit has to move
+* \Distance - the distance the unit has to move
+* \author jgray
+* \ingroup JmgUtility
+*/
+class JMG_Utility_Kill_Unit_If_Not_Moving_Enough : public ScriptImpClass {
+	int time;
+	int resetTime;
+	float distance;
+	Vector3 lastPos;
+	void Created(GameObject *obj);
+	void Timer_Expired(GameObject *obj,int number);
+};
+
+
+/*!
+* \brief Reads text from a file and displays it to the screen, 
+* \ the text in a file is broken every 150 characters (tries to end the current word) and then delayed by 6 seconds
+* \ Note: This will only work once because of how it works
+* \Custom - Custom to trigger this script on
+* \StringID - ID of the string from strings.tbl to parse and play out
+* \MessageColor - Color to display the chat message in
+* \LineDelayTime - Delay between each message displayed
+* \UISound - 2D sound to play when custom received
+* \Repeatable - Allows the script to trigger more than once
+* \Special Notes:
+-String max length is 16384 characters long
+-Line break/delay - Use this character ''(there is a character in there, you'll have to copy it out) to end the line, you can also use a bunch of them to add a delay to the message.
+* \author jgray
+* \ingroup JmgUtility
+*/
+class JMG_Utility_Custom_Display_Briefing_Message_StringID : public ScriptImpClass {
+	struct BriefingTextNode
+	{
+		char Text[256];
+		float Delay;
+		BriefingTextNode *next;
+		BriefingTextNode(const char *text)
+		{
+			Delay = 0.0f;
+			sprintf(Text,"%s",text); 
+			next = NULL;
+		}
+		BriefingTextNode(const char *text,float delay)
+		{
+			Delay = delay;
+			sprintf(Text,"%s",text); 
+			next = NULL;
+		}
+		BriefingTextNode()
+		{
+			next = NULL;
+		}
+	};
+	BriefingTextNode *BriefingText;
+	BriefingTextNode *CurrentNode;
+	bool triggered;
+	void Created(GameObject *obj);
+	void Timer_Expired(GameObject *obj,int number);
+	void Custom(GameObject *obj,int message,int param,GameObject *sender);
+	void Destroyed(GameObject *obj);
+	void AddNewTextNode();
+	void RemoveTextNodes();
+};
\ No newline at end of file
diff -uwrN sourceold/scripts/scripts.vcxproj source/scripts/scripts.vcxproj
--- sourceold/scripts/scripts.vcxproj	2016-11-19 11:41:30.859453700 +1000
+++ source/scripts/scripts.vcxproj	2017-01-22 19:51:27.964826000 +1000
@@ -25,28 +25,24 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
     <WholeProgramOptimization>false</WholeProgramOptimization>
     <PlatformToolset>v110_xp</PlatformToolset>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug SSGM|Win32'" Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
     <WholeProgramOptimization>false</WholeProgramOptimization>
     <PlatformToolset>v110_xp</PlatformToolset>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
     <WholeProgramOptimization>true</WholeProgramOptimization>
     <PlatformToolset>v110_xp</PlatformToolset>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release SSGM|Win32'" Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
     <WholeProgramOptimization>true</WholeProgramOptimization>
     <PlatformToolset>v110_xp</PlatformToolset>
@@ -137,12 +133,10 @@
     </ResourceCompile>
     <Link>
       <AdditionalDependencies>ws2_32.lib;winmm.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
       <IgnoreSpecificDefaultLibraries>%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateMapFile>true</GenerateMapFile>
       <MapFileName>$(TargetDir)$(TargetName).map</MapFileName>
-      <MapExports>false</MapExports>
       <SubSystem>Windows</SubSystem>
       <OptimizeReferences>true</OptimizeReferences>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
@@ -151,6 +145,7 @@
       <TargetMachine>MachineX86</TargetMachine>
       <AdditionalLibraryDirectories>..\bin\release</AdditionalLibraryDirectories>
       <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
+      <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
     </Link>
     <PostBuildEvent>
       <Command>if defined RenPath (
@@ -222,7 +217,6 @@
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateMapFile>true</GenerateMapFile>
       <MapFileName>$(TargetDir)$(TargetName).map</MapFileName>
-      <MapExports>false</MapExports>
       <SubSystem>Windows</SubSystem>
       <OptimizeReferences>true</OptimizeReferences>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
@@ -260,7 +254,6 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <IntrinsicFunctions>true</IntrinsicFunctions>
-      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
       <AdditionalIncludeDirectories>.;..\MemoryManager;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>D3D_DEBUG_INFO;DEBUG;MEMORY_MANAGER;SCRIPTS_EXPORTS;WIN32;_CRT_SECURE_NO_DEPRECATE;_HAS_EXCEPTIONS=0;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
@@ -272,7 +265,8 @@
       <FunctionLevelLinking>true</FunctionLevelLinking>
       <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
       <FloatingPointModel>Precise</FloatingPointModel>
-      <RuntimeTypeInfo>true</RuntimeTypeInfo>
+      <RuntimeTypeInfo>
+      </RuntimeTypeInfo>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>General.h</PrecompiledHeaderFile>
       <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).$(Configuration).pch</PrecompiledHeaderOutputFile>
@@ -288,7 +282,6 @@
     </ResourceCompile>
     <Link>
       <AdditionalDependencies>ws2_32.lib;winmm.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateMapFile>true</GenerateMapFile>
       <MapFileName>$(TargetDir)$(TargetName).map</MapFileName>
@@ -299,6 +292,7 @@
       <TargetMachine>MachineX86</TargetMachine>
       <AdditionalLibraryDirectories>..\bin\debug</AdditionalLibraryDirectories>
       <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
+      <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
     </Link>
     <PostBuildEvent>
       <Command>if defined RenPath (
@@ -337,7 +331,6 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <IntrinsicFunctions>true</IntrinsicFunctions>
-      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
       <AdditionalIncludeDirectories>.;..\MemoryManager;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>D3D_DEBUG_INFO;DEBUG;MEMORY_MANAGER;SCRIPTS_EXPORTS;WIN32;_CRT_SECURE_NO_DEPRECATE;_HAS_EXCEPTIONS=0;_WINDOWS;SSGM;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
@@ -349,7 +342,8 @@
       <FunctionLevelLinking>true</FunctionLevelLinking>
       <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
       <FloatingPointModel>Precise</FloatingPointModel>
-      <RuntimeTypeInfo>true</RuntimeTypeInfo>
+      <RuntimeTypeInfo>
+      </RuntimeTypeInfo>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>General.h</PrecompiledHeaderFile>
       <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).$(Configuration).pch</PrecompiledHeaderOutputFile>
@@ -365,7 +359,6 @@
     </ResourceCompile>
     <Link>
       <AdditionalDependencies>ws2_32.lib;winmm.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
       <IgnoreSpecificDefaultLibraries>%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateMapFile>true</GenerateMapFile>
@@ -377,6 +370,7 @@
       <TargetMachine>MachineX86</TargetMachine>
       <AdditionalLibraryDirectories>..\bin\debug</AdditionalLibraryDirectories>
       <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
+      <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
     </Link>
     <PostBuildEvent>
       <Command>if defined RenServerPath (
@@ -569,6 +563,8 @@
     <ClInclude Include="ConnectionRequest.h" />
     <ClInclude Include="ConversationClass.h" />
     <ClInclude Include="cPlayer.h" />
+    <ClInclude Include="cPlayerKill.h" />
+    <ClInclude Include="cPurchaseResponseEvent.h" />
     <ClInclude Include="Crc32.h" />
     <ClInclude Include="cScTextObj.h" />
     <ClInclude Include="cTeam.h" />
diff -uwrN sourceold/scripts/scripts.vcxproj.filters source/scripts/scripts.vcxproj.filters
--- sourceold/scripts/scripts.vcxproj.filters	2016-11-19 11:41:30.860453700 +1000
+++ source/scripts/scripts.vcxproj.filters	2017-01-22 19:51:27.964826000 +1000
@@ -1264,6 +1264,12 @@
     <ClInclude Include="DB_General.h">
       <Filter>01. Sources</Filter>
     </ClInclude>
+    <ClInclude Include="cPurchaseResponseEvent.h">
+      <Filter>02. Headers</Filter>
+    </ClInclude>
+    <ClInclude Include="cPlayerKill.h">
+      <Filter>02. Headers</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <None Include="documentation\cinematics.dox">
diff -uwrN sourceold/shared/shared.vcxproj source/shared/shared.vcxproj
--- sourceold/shared/shared.vcxproj	2016-10-31 07:17:12.651013500 +1000
+++ source/shared/shared.vcxproj	2017-01-18 19:49:56.837042600 +1000
@@ -20,6 +20,7 @@
     <ConfigurationType>DynamicLibrary</ConfigurationType>
     <CharacterSet>MultiByte</CharacterSet>
     <PlatformToolset>v110_xp</PlatformToolset>
+    <WholeProgramOptimization>false</WholeProgramOptimization>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
@@ -149,7 +150,6 @@
     <Link>
       <AdditionalDependencies>
       </AdditionalDependencies>
-      <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
       <AdditionalLibraryDirectories>
       </AdditionalLibraryDirectories>
       <DelayLoadDLLs>
@@ -163,6 +163,7 @@
       <BaseAddress>0x12800000</BaseAddress>
       <TargetMachine>MachineX86</TargetMachine>
       <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
+      <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
     </Link>
     <PostBuildEvent>
       <Command>if defined RenPath (
diff -uwrN sourceold/swap/Swap.vcxproj source/swap/Swap.vcxproj
--- sourceold/swap/Swap.vcxproj	2016-10-31 07:17:12.656013500 +1000
+++ source/swap/Swap.vcxproj	2017-01-18 19:57:04.635244800 +1000
@@ -18,14 +18,12 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug SSGM|Win32'" Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
     <WholeProgramOptimization>false</WholeProgramOptimization>
     <PlatformToolset>v110_xp</PlatformToolset>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release SSGM|Win32'" Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
     <WholeProgramOptimization>true</WholeProgramOptimization>
     <PlatformToolset>v110_xp</PlatformToolset>
@@ -89,7 +87,7 @@
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <MultiProcessorCompilation>true</MultiProcessorCompilation>
       <MinimalRebuild>false</MinimalRebuild>
-      <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -102,7 +100,6 @@
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateMapFile>true</GenerateMapFile>
       <MapFileName>$(TargetDir)$(TargetName).map</MapFileName>
-      <MapExports>false</MapExports>
       <SubSystem>Windows</SubSystem>
       <OptimizeReferences>true</OptimizeReferences>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
@@ -149,7 +146,6 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <IntrinsicFunctions>true</IntrinsicFunctions>
-      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
       <AdditionalIncludeDirectories>.;..\MemoryManager;..\scripts;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>D3D_DEBUG_INFO;DEBUG;MEMORY_MANAGER;SWAP_EXPORTS;WIN32;_CRT_SECURE_NO_DEPRECATE;_HAS_EXCEPTIONS=0;_WINDOWS;SSGMPLUGIN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
@@ -159,7 +155,7 @@
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <BufferSecurityCheck>false</BufferSecurityCheck>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
       <FloatingPointModel>Precise</FloatingPointModel>
       <RuntimeTypeInfo>true</RuntimeTypeInfo>
       <PrecompiledHeader>Use</PrecompiledHeader>
diff -uwrN sourceold/tdbedit/tdbedit.vcxproj source/tdbedit/tdbedit.vcxproj
--- sourceold/tdbedit/tdbedit.vcxproj	2016-10-31 07:17:12.663013500 +1000
+++ source/tdbedit/tdbedit.vcxproj	2017-01-18 19:49:56.807042600 +1000
@@ -19,7 +19,7 @@
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <CharacterSet>Unicode</CharacterSet>
-    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <WholeProgramOptimization>false</WholeProgramOptimization>
     <PlatformToolset>v110_xp</PlatformToolset>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
@@ -77,7 +77,8 @@
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <MultiProcessorCompilation>true</MultiProcessorCompilation>
       <MinimalRebuild>false</MinimalRebuild>
-      <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
     </ClCompile>
     <Link>
       <AdditionalDependencies>comctl32.lib;winmm.lib;%(AdditionalDependencies)</AdditionalDependencies>
@@ -86,8 +87,8 @@
       <GenerateMapFile>true</GenerateMapFile>
       <MapFileName>$(TargetDir)$(TargetName).map</MapFileName>
       <SubSystem>Windows</SubSystem>
-      <OptimizeReferences>false</OptimizeReferences>
-      <EnableCOMDATFolding>false</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <SetChecksum>true</SetChecksum>
       <TargetMachine>MachineX86</TargetMachine>
       <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
@@ -119,7 +120,6 @@
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <ClCompile>
       <Optimization>Disabled</Optimization>
-      <WholeProgramOptimization>false</WholeProgramOptimization>
       <AdditionalIncludeDirectories>.;..\scripts;..\MemoryManager;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;_DEBUG;_HAS_EXCEPTIONS=0;_WINDOWS;_CRT_SECURE_NO_DEPRECATE;TDBEDIT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
@@ -129,7 +129,7 @@
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <BufferSecurityCheck>false</BufferSecurityCheck>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
       <FloatingPointModel>Precise</FloatingPointModel>
       <PrecompiledHeader>Use</PrecompiledHeader>
       <PrecompiledHeaderFile>General.h</PrecompiledHeaderFile>
@@ -139,6 +139,7 @@
       <TreatWarningAsError>true</TreatWarningAsError>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <MultiProcessorCompilation>true</MultiProcessorCompilation>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
     </ClCompile>
     <Link>
       <AdditionalDependencies>comctl32.lib;winmm.lib;%(AdditionalDependencies)</AdditionalDependencies>
diff -uwrN sourceold/teamspeak/teamspeak.vcxproj source/teamspeak/teamspeak.vcxproj
--- sourceold/teamspeak/teamspeak.vcxproj	2016-10-31 07:17:12.667013500 +1000
+++ source/teamspeak/teamspeak.vcxproj	2017-01-18 19:57:04.658244800 +1000
@@ -18,14 +18,12 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug SSGM|Win32'" Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
     <WholeProgramOptimization>false</WholeProgramOptimization>
     <PlatformToolset>v110_xp</PlatformToolset>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release SSGM|Win32'" Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
     <WholeProgramOptimization>true</WholeProgramOptimization>
     <PlatformToolset>v110_xp</PlatformToolset>
@@ -89,7 +87,7 @@
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <MultiProcessorCompilation>true</MultiProcessorCompilation>
       <MinimalRebuild>false</MinimalRebuild>
-      <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -102,7 +100,6 @@
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateMapFile>true</GenerateMapFile>
       <MapFileName>$(TargetDir)$(TargetName).map</MapFileName>
-      <MapExports>false</MapExports>
       <SubSystem>Windows</SubSystem>
       <OptimizeReferences>true</OptimizeReferences>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
@@ -149,7 +146,6 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <IntrinsicFunctions>true</IntrinsicFunctions>
-      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
       <AdditionalIncludeDirectories>.;..\MemoryManager;..\scripts;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>D3D_DEBUG_INFO;DEBUG;MEMORY_MANAGER;TEAMSPEAK_EXPORTS;WIN32;_CRT_SECURE_NO_DEPRECATE;_HAS_EXCEPTIONS=0;_WINDOWS;SSGMPLUGIN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
@@ -159,7 +155,7 @@
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <BufferSecurityCheck>false</BufferSecurityCheck>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
       <FloatingPointModel>Precise</FloatingPointModel>
       <RuntimeTypeInfo>true</RuntimeTypeInfo>
       <PrecompiledHeader>Use</PrecompiledHeader>
