Skip to content
Beta: this is a preview of the new SplitScreen.Me. Data may be reset before launch.

Necesse · handler “Necesse”

Version 2

Release notes

goldberg sdk update

Released
Size
3.4 MB
Downloads
26
Check
Verified
SHA-256
2720668a0863ddd8bda5e0fc328abc97553c97edc565af12e8b94e149091de24
Download v2 (.nc)All versions

Files 5

PathSize
handler.js22 KB
Necesse/7z.dll1.8 MB
Necesse/7z.exe544 KB
Necesse/steam_api.dll2.8 MB
Necesse/steam_api64.dll3.3 MB

handler.js

Plain text
Hub.Handler.Version = 2; // Released at https://hub.splitscreen.me/ on Tue Dec 12 2023 13:34:01 GMT+0000 (Coordinated Universal Time).
Hub.Handler.Id = "d6rWqasXNJ3KcmDPp";
Hub.Maintainer.Name = "Talos91";
Hub.Maintainer.Id = "eeL7HAz8zJovChWw4";

Game.ExecutableContext = ["natives"];
Game.DirSymlinkExclusions = ["jre\\bin", "lib", "natives"];
Game.DirSymlinkCopyInstead = ["lib"];
Game.FileSymlinkExclusions = ["steam_appid.txt", "local_save.txt", "xinput1_4.dll"];
Game.FileSymlinkCopyInstead = [
  //"Necesse.exe",
  "javaw.exe",
  "Necesse.jar",
  "res.data",
  "Server.jar",
  "StartServer.bat",
  "StartServer-nogui.bat",
  "java.exe",
  "javacpl.exe",
  "javaws.exe",
  "zip.dll",
  "verify.dll",
  "steamworks4j64.dll"
];
Game.GameName = "Necesse";
Game.HandlerInterval = 100;
Game.SymlinkExe = false;
Game.SymlinkGame = true;
Game.SymlinkFolders = true;
Game.ExecutableName = "Necesse.exe";
Game.SteamID = "1169040";
Game.GUID = "Necesse";
Game.MaxPlayers = 5;
Game.MaxPlayersOneMonitor = 5;
Game.UseNucleusEnvironment = true;
Game.UseGoldberg = true;
Game.GoldbergNoLocalSave = true;
//Game.BinariesFolder = "jre\\bin";
Game.LauncherTitle = "";
Game.LauncherExe = "Necesse.exe";
Game.SetTopMostAtEnd = true;
Game.Hook.ForceFocus = false;
Game.Hook.ForceFocusWindowName = "Necesse v. 0.22.1";
Game.HasDynamicWindowTitle = true;
Game.FakeFocus = true;
Game.FakeFocusInterval = 8000;
Game.SendFakeFocusMsg = true;
Game.ResetWindows = true;
Game.RefreshWindowAfterStart = true;
Game.Hook.DInputEnabled = false;
Game.Hook.XInputEnabled = true;
Game.Hook.XInputReroute = false;
Game.XInputPlusDll = ["xinput1_4.dll"];
Game.Hook.CustomDllEnabled = false;
Game.UserProfileSavePath = "AppData\\Roaming\\Goldberg SteamEmu Saves\\1169040";
Game.UserProfileConfigPath = "AppData\\Roaming\\Necesse\\cfg";
Game.UserProfileSavePathNoCopy = true;
Game.UserProfileConfigPathNoCopy = false;
Game.Description =
  "Run your main game, change some graphics settings and close it before launching this. Host a multiplayer game in one instance and join in the others. If you use keyboards and mice after all the instances have launched, resized and positioned correctly, press the END key once to lock the input for all instances to have their own working cursor. You need to left click each mouse to make the emulated cursors appear after locking the input. Press the END key again to unlock the input when you finish playing. You can also use CTRL+Q to close Nucleus and all its instances when the input is unlocked.";
Game.KeepSymLinkOnExit = false;
Game.PauseBetweenContextAndLaunch = 5;
Game.PauseBetweenProcessGrab = 15;
Game.PauseBetweenStarts = 30;

//USS deprecated options:

Game.HookSetCursorPos = false;
Game.HookGetCursorPos = false;
Game.HookGetKeyState = false;
Game.HookGetAsyncKeyState = false;
Game.HookGetKeyboardState = false;
Game.HookFilterRawInput = false;
Game.HookFilterMouseMessages = false;
Game.HookUseLegacyInput = false;
Game.HookDontUpdateLegacyInMouseMsg = false;
Game.HookMouseVisibility = false;

Game.SendNormalMouseInput = false;
Game.SendNormalKeyboardInput = false;
Game.SendScrollWheel = false;
Game.ForwardRawKeyboardInput = false;
Game.ForwardRawMouseInput = false;
Game.HookReRegisterRawInput = false;
Game.HookReRegisterRawInputMouse = false;
Game.HookReRegisterRawInputKeyboard = false;
Game.DrawFakeMouseCursor = false;

//ProtoInput:

Game.SupportsMultipleKeyboardsAndMice = true;

Game.ProtoInput.InjectStartup = false;
Game.ProtoInput.InjectRuntime_RemoteLoadMethod = false;
Game.ProtoInput.InjectRuntime_EasyHookMethod = true;
Game.ProtoInput.InjectRuntime_EasyHookStealthMethod = false;

Game.LockInputAtStart = false;
Game.LockInputSuspendsExplorer = true;
Game.ProtoInput.FreezeExternalInputWhenInputNotLocked = false;
Game.LockInputToggleKey = 0x23;

Game.ProtoInput.RenameHandlesHook = false;
Game.ProtoInput.RenameHandles = [];
Game.ProtoInput.RenameNamedPipes = [];

Game.ProtoInput.RegisterRawInputHook = false;
Game.ProtoInput.GetRawInputDataHook = false;
Game.ProtoInput.MessageFilterHook = true;
Game.ProtoInput.GetCursorPosHook = false;
Game.ProtoInput.SetCursorPosHook = false;
Game.ProtoInput.GetKeyStateHook = false;
Game.ProtoInput.GetAsyncKeyStateHook = false;
Game.ProtoInput.GetKeyboardStateHook = false;
Game.ProtoInput.CursorVisibilityHook = false;
Game.ProtoInput.ClipCursorHook = true;
Game.ProtoInput.FocusHooks = false;
Game.ProtoInput.DrawFakeCursor = false;
Game.ProtoInput.FindWindowHook = false;

Game.ProtoInput.RawInputFilter = false;
Game.ProtoInput.MouseMoveFilter = false;
Game.ProtoInput.MouseActivateFilter = false;
Game.ProtoInput.WindowActivateFilter = false;
Game.ProtoInput.WindowActvateAppFilter = false;
Game.ProtoInput.MouseWheelFilter = false;
Game.ProtoInput.MouseButtonFilter = false;
Game.ProtoInput.KeyboardButtonFilter = false;

Game.ProtoInput.SendMouseWheelMessages = true;
Game.ProtoInput.SendMouseButtonMessages = true;
Game.ProtoInput.SendMouseMovementMessages = true;
Game.ProtoInput.SendKeyboardButtonMessages = true;
Game.ProtoInput.XinputHook = false;
Game.ProtoInput.UseOpenXinput = false;
Game.ProtoInput.UseDinputRedirection = false;
Game.ProtoInput.DinputDeviceHook = false;
Game.ProtoInput.DinputHookAlsoHooksGetDeviceState = false;

Game.ProtoInput.EnableFocusMessageLoop = false;
//Game.ProtoInput.FocusLoopIntervalMilliseconds = 5;
//Game.ProtoInput.FocusLoop_WM_ACTIVATE = true;
//Game.ProtoInput.FocusLoop_WM_ACTIVATEAPP = true;
//Game.ProtoInput.FocusLoop_WM_NCACTIVATE = true;
//Game.ProtoInput.FocusLoop_WM_SETFOCUS = true;
//Game.ProtoInput.FocusLoop_WM_MOUSEACTIVATE = true;
Game.ProtoInput.BlockedMessages = [0x0008]; // Blocks WM_KILLFOCUS
Game.KillProcessesOnClose = ["javaw.exe"];

Game.Play = function() {
  Game.ExecutableName = "javaw.exe";

  //Context.StartArguments = ' -Xms512m -Xmx4G -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:G1NewSizePercent=20 -XX:G1ReservePercent=20 -XX:MaxGCPauseMillis=50 -XX:G1HeapRegionSize=32M -jar "' + Context.RootFolder + '\\Necesse.jar"';

  //var txtPath = Context.NucleusUserRoot + "\\AppData\\Roaming\\Necesse\\cfg\\settings.cfg";
  var txtPath = Context.EnvironmentPlayer + Context.UserProfileConfigPath + "\\settings.cfg";
  var dict = [
    Context.FindLineNumberInTextFile(txtPath, "		pauseOnFocusLoss =", Nucleus.SearchType.StartsWith) + "|		pauseOnFocusLoss = false,",
    Context.FindLineNumberInTextFile(txtPath, "		savePerformanceOnFocusLoss =", Nucleus.SearchType.StartsWith) + "|		savePerformanceOnFocusLoss = false,",
    Context.FindLineNumberInTextFile(txtPath, "		displayMode =", Nucleus.SearchType.StartsWith) + "|		displayMode = Windowed,",
    Context.FindLineNumberInTextFile(txtPath, "		displaySize =", Nucleus.SearchType.StartsWith) + "|		displaySize = [" + Context.Width + ", " + Context.Height + "],"
  ];
  Context.ReplaceLinesInTextFile(txtPath, dict);

  var filePath = (Context.filePath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\natives\\steam_settings\\controller\\glyphs");
  System.IO.Directory.CreateDirectory(filePath);

  var appid = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\natives\\steam_settings\\steam_appid.txt";
  var lines = ["1169040"];
  Context.WriteTextFile(appid, lines);

  var nolay = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\natives\\steam_settings\\disable_overlay.txt";
  var lines = [""];
  Context.WriteTextFile(nolay, lines);

  var gamepad = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\natives\\steam_settings\\controller\\GameControls.txt";
  var lines = [
    "placetorch=A",
    "healthpotion=B",
    "trinketability=X",
    "Inventory=Y",
    "interact=DLTRIGGER",
    "attack=DRTRIGGER",
    //"mainmenu=START",
    "showmap=BACK",
    "prevhotbar=LBUMPER",
    "nexthotbar=RBUMPER",
    "Move=LJOY=joystick_move",
    "aim=RJOY=joystick_move",
    "menuselect=A",
    "menuback=B",
    "menuitemactionsmenu=X",
    "toggleaim=RSTICK",
    "smartmining=LSTICK",
    "manapotion=DUP",
    "usemount=DDOWN",
    "setability=DRIGHT",
    "opensettlement=DLEFT",
    "menuinteractitem=START",
    "MenuUp=DUP,DLJOYUP",
    "MenuDown=DDOWN,DLJOYDOWN",
    "MenuRight=DRIGHT,DLJOYRIGHT",
    "MenuLeft=DLEFT,DLJOYLEFT"
  ];
  Context.WriteTextFile(gamepad, lines);

  var menu = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\natives\\steam_settings\\controller\\MenuControls.txt";
  var lines = [
    "placetorch=A",
    "healthpotion=B",
    "trinketability=X",
    "Inventory=Y",
    "interact=DLTRIGGER",
    "attack=DRTRIGGER",
    "showmap=BACK",
    "prevhotbar=LBUMPER",
    "nexthotbar=RBUMPER",
    "Move=LJOY=joystick_move",
    "aim=RJOY=joystick_move",
    "menuselect=A",
    "menuback=B",
    "menuitemactionsmenu=X",
    "toggleaim=RSTICK",
    "smartmining=LSTICK",
    "manapotion=DUP",
    "usemount=DDOWN",
    "setability=DRIGHT",
    "opensettlement=DLEFT",
    "menuinteractitem=START",
    "MenuUp=DUP,DLJOYUP",
    "MenuDown=DDOWN,DLJOYDOWN",
    "MenuRight=DRIGHT,DLJOYRIGHT",
    "MenuLeft=DLEFT,DLJOYLEFT",
    "menunext=RBUMPER",
    "menuprevious=LBUMPER"
  ];
  Context.WriteTextFile(menu, lines);

  var savePath = (Context.SavePath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\jre\\bin\\xinput9_1_0.dll");
  var savePkgOrigin = System.IO.Path.Combine(Context.NucleusFolder, "utils\\XInputPlus\\x64\\xinput1_3.dl_");
  System.IO.File.Copy(savePkgOrigin, savePath, true);

  var savePath = (Context.SavePath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\jre\\bin\\xinput1_4.dll");
  var savePkgOrigin = System.IO.Path.Combine(Context.NucleusFolder, "utils\\XInputPlus\\x64\\xinput1_3.dl_");
  System.IO.File.Copy(savePkgOrigin, savePath, true);

  System.IO.File.Copy(System.IO.Path.Combine(Context.RootFolder, "XInputPlus.ini"), System.IO.Path.Combine(Context.RootFolder, "jre\\bin\\XInputPlus.ini"), true);

  System.IO.File.Copy(
    Context.NucleusFolder + "\\utils\\GoldbergEmu\\steam_settings.EXAMPLE\\controller.EXAMPLE\\glyphs\\button_a.png",
    Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\natives\\steam_settings\\controller\\glyphs\\button_a.png",
    true
  );

  System.IO.File.Copy(
    Context.NucleusFolder + "\\utils\\GoldbergEmu\\steam_settings.EXAMPLE\\controller.EXAMPLE\\glyphs\\button_b.png",
    Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\natives\\steam_settings\\controller\\glyphs\\button_b.png",
    true
  );

  System.IO.File.Copy(
    Context.NucleusFolder + "\\utils\\GoldbergEmu\\steam_settings.EXAMPLE\\controller.EXAMPLE\\glyphs\\button_x.png",
    Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\natives\\steam_settings\\controller\\glyphs\\button_x.png",
    true
  );

  System.IO.File.Copy(
    Context.NucleusFolder + "\\utils\\GoldbergEmu\\steam_settings.EXAMPLE\\controller.EXAMPLE\\glyphs\\button_y.png",
    Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\natives\\steam_settings\\controller\\glyphs\\button_y.png",
    true
  );

  System.IO.File.Copy(
    Context.NucleusFolder + "\\utils\\GoldbergEmu\\steam_settings.EXAMPLE\\controller.EXAMPLE\\glyphs\\shoulder_l.png",
    Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\natives\\steam_settings\\controller\\glyphs\\shoulder_l.png",
    true
  );

  System.IO.File.Copy(
    Context.NucleusFolder + "\\utils\\GoldbergEmu\\steam_settings.EXAMPLE\\controller.EXAMPLE\\glyphs\\shoulder_r.png",
    Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\natives\\steam_settings\\controller\\glyphs\\shoulder_r.png",
    true
  );

  System.IO.File.Copy(
    Context.NucleusFolder + "\\utils\\GoldbergEmu\\steam_settings.EXAMPLE\\controller.EXAMPLE\\glyphs\\stick_dpad_e.png",
    Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\natives\\steam_settings\\controller\\glyphs\\stick_dpad_e.png",
    true
  );

  System.IO.File.Copy(
    Context.NucleusFolder + "\\utils\\GoldbergEmu\\steam_settings.EXAMPLE\\controller.EXAMPLE\\glyphs\\stick_dpad_n.png",
    Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\natives\\steam_settings\\controller\\glyphs\\stick_dpad_n.png",
    true
  );

  System.IO.File.Copy(
    Context.NucleusFolder + "\\utils\\GoldbergEmu\\steam_settings.EXAMPLE\\controller.EXAMPLE\\glyphs\\stick_dpad_s.png",
    Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\natives\\steam_settings\\controller\\glyphs\\stick_dpad_s.png",
    true
  );

  System.IO.File.Copy(
    Context.NucleusFolder + "\\utils\\GoldbergEmu\\steam_settings.EXAMPLE\\controller.EXAMPLE\\glyphs\\stick_dpad_w.png",
    Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\natives\\steam_settings\\controller\\glyphs\\stick_dpad_w.png",
    true
  );

  System.IO.File.Copy(
    Context.NucleusFolder + "\\utils\\GoldbergEmu\\steam_settings.EXAMPLE\\controller.EXAMPLE\\glyphs\\stick_l_click.png",
    Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\natives\\steam_settings\\controller\\glyphs\\stick_l_click.png",
    true
  );

  System.IO.File.Copy(
    Context.NucleusFolder + "\\utils\\GoldbergEmu\\steam_settings.EXAMPLE\\controller.EXAMPLE\\glyphs\\stick_l_move.png",
    Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\natives\\steam_settings\\controller\\glyphs\\stick_l_move.png",
    true
  );

  System.IO.File.Copy(
    Context.NucleusFolder + "\\utils\\GoldbergEmu\\steam_settings.EXAMPLE\\controller.EXAMPLE\\glyphs\\stick_r_click.png",
    Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\natives\\steam_settings\\controller\\glyphs\\stick_r_click.png",
    true
  );

  System.IO.File.Copy(
    Context.NucleusFolder + "\\utils\\GoldbergEmu\\steam_settings.EXAMPLE\\controller.EXAMPLE\\glyphs\\stick_r_move.png",
    Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\natives\\steam_settings\\controller\\glyphs\\stick_r_move.png",
    true
  );

  System.IO.File.Copy(
    Context.NucleusFolder + "\\utils\\GoldbergEmu\\steam_settings.EXAMPLE\\controller.EXAMPLE\\glyphs\\trigger_l_click.png",
    Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\natives\\steam_settings\\controller\\glyphs\\trigger_l_click.png",
    true
  );

  System.IO.File.Copy(
    Context.NucleusFolder + "\\utils\\GoldbergEmu\\steam_settings.EXAMPLE\\controller.EXAMPLE\\glyphs\\trigger_l_pull.png",
    Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\natives\\steam_settings\\controller\\glyphs\\trigger_l_pull.png",
    true
  );

  System.IO.File.Copy(
    Context.NucleusFolder + "\\utils\\GoldbergEmu\\steam_settings.EXAMPLE\\controller.EXAMPLE\\glyphs\\trigger_r_click.png",
    Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\natives\\steam_settings\\controller\\glyphs\\trigger_r_click.png",
    true
  );

  System.IO.File.Copy(
    Context.NucleusFolder + "\\utils\\GoldbergEmu\\steam_settings.EXAMPLE\\controller.EXAMPLE\\glyphs\\trigger_r_pull.png",
    Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\natives\\steam_settings\\controller\\glyphs\\trigger_r_pull.png",
    true
  );

  System.IO.File.Copy(
    Context.NucleusFolder + "\\utils\\GoldbergEmu\\steam_settings.EXAMPLE\\controller.EXAMPLE\\glyphs\\xbox_button_dpad_e.png",
    Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\natives\\steam_settings\\controller\\glyphs\\xbox_button_dpad_e.png",
    true
  );

  System.IO.File.Copy(
    Context.NucleusFolder + "\\utils\\GoldbergEmu\\steam_settings.EXAMPLE\\controller.EXAMPLE\\glyphs\\xbox_button_dpad_move.png",
    Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\natives\\steam_settings\\controller\\glyphs\\glyphsxbox_button_dpad_move.png",
    true
  );

  System.IO.File.Copy(
    Context.NucleusFolder + "\\utils\\GoldbergEmu\\steam_settings.EXAMPLE\\controller.EXAMPLE\\glyphs\\xbox_button_dpad_n.png",
    Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\natives\\steam_settings\\controller\\glyphs\\xbox_button_dpad_n.png",
    true
  );

  System.IO.File.Copy(
    Context.NucleusFolder + "\\utils\\GoldbergEmu\\steam_settings.EXAMPLE\\controller.EXAMPLE\\glyphs\\xbox_button_dpad_s.png",
    Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\natives\\steam_settings\\controller\\glyphs\\xbox_button_dpad_s.png",
    true
  );

  System.IO.File.Copy(
    Context.NucleusFolder + "\\utils\\GoldbergEmu\\steam_settings.EXAMPLE\\controller.EXAMPLE\\glyphs\\xbox_button_dpad_w.png",
    Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\natives\\steam_settings\\controller\\glyphs\\xbox_button_dpad_w.png",
    true
  );

  System.IO.File.Copy(
    Context.NucleusFolder + "\\utils\\GoldbergEmu\\steam_settings.EXAMPLE\\controller.EXAMPLE\\glyphs\\xbox_button_select.png",
    Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\natives\\steam_settings\\controller\\glyphs\\xbox_button_select.png",
    true
  );

  System.IO.File.Copy(
    Context.NucleusFolder + "\\utils\\GoldbergEmu\\steam_settings.EXAMPLE\\controller.EXAMPLE\\glyphs\\xbox_button_start.png",
    Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\natives\\steam_settings\\controller\\glyphs\\xbox_button_start.png",
    true
  );

  var Bat = Game.Folder + "\\patch-Jar.bat";
  var lines = [
    "@echo off",
    "setlocal enabledelayedexpansion",
    "TITLE Extracting and patching the necessary files...",
    'cd /D "%~dp0"',
    'set folder_lib="' + Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + '\\lib"',
    'for %%F in (%folder_lib%\\steamworks4j*.jar) do (set "FileName=%%~nxF")',
    "echo The Filename is:-- %FileName% --",
    "",
    '7z.exe a "' + Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + '\\lib\\%FileName%" "' + Game.Folder + '\\steam_api64.dll" "' + Game.Folder + '\\steam_api.dll"',
    "",
    "endlocal",
    "exit"
  ];
  Context.WriteTextFile(Bat, lines);

  Context.RunAdditionalFiles(["all|" + Game.Folder + "\\patch-Jar.bat"], false, 0);

  Game.ProtoInput.OnInputLocked = function() {
    for (var i = 0; i < PlayerList.Count; i++) {
      var player = PlayerList[i];

      ProtoInput.InstallHook(player.ProtoInputInstanceHandle, ProtoInput.Values.GetCursorPosHookID);
      ProtoInput.InstallHook(player.ProtoInputInstanceHandle, ProtoInput.Values.SetCursorPosHookID);
      ProtoInput.InstallHook(player.ProtoInputInstanceHandle, ProtoInput.Values.GetKeyStateHookID);
      ProtoInput.InstallHook(player.ProtoInputInstanceHandle, ProtoInput.Values.GetAsyncKeyStateHookID);
      ProtoInput.InstallHook(player.ProtoInputInstanceHandle, ProtoInput.Values.GetKeyboardStateHookID);
      ProtoInput.InstallHook(player.ProtoInputInstanceHandle, ProtoInput.Values.CursorVisibilityStateHookID);
      ProtoInput.InstallHook(player.ProtoInputInstanceHandle, ProtoInput.Values.GetRawInputDataHookID);
      ProtoInput.InstallHook(player.ProtoInputInstanceHandle, ProtoInput.Values.RegisterRawInputHookID);
      //ProtoInput.InstallHook(player.ProtoInputInstanceHandle, ProtoInput.Values.MessageFilterHookID);

      //Avoid the mouse move filter unless absolutely necessary as it can massively affect performance if the game gets primary input from mouse move messages
      //ProtoInput.EnableMessageFilter(player.ProtoInputInstanceHandle, ProtoInput.Values.MouseMoveFilterID);

      ProtoInput.EnableMessageFilter(player.ProtoInputInstanceHandle, ProtoInput.Values.RawInputFilterID);
      ProtoInput.EnableMessageFilter(player.ProtoInputInstanceHandle, ProtoInput.Values.MouseActivateFilterID);
      ProtoInput.EnableMessageFilter(player.ProtoInputInstanceHandle, ProtoInput.Values.WindowActivateFilterID);
      ProtoInput.EnableMessageFilter(player.ProtoInputInstanceHandle, ProtoInput.Values.WindowActivateAppFilterID);
      ProtoInput.EnableMessageFilter(player.ProtoInputInstanceHandle, ProtoInput.Values.MouseWheelFilterID);
      ProtoInput.EnableMessageFilter(player.ProtoInputInstanceHandle, ProtoInput.Values.MouseButtonFilterID);
      ProtoInput.EnableMessageFilter(player.ProtoInputInstanceHandle, ProtoInput.Values.KeyboardButtonFilterID);

      ProtoInput.SetDrawFakeCursor(player.ProtoInputInstanceHandle, true);
    }
  };

  Game.ProtoInput.OnInputUnlocked = function() {
    for (var i = 0; i < PlayerList.Count; i++) {
      var player = PlayerList[i];

      ProtoInput.UninstallHook(player.ProtoInputInstanceHandle, ProtoInput.Values.GetCursorPosHookID);
      ProtoInput.UninstallHook(player.ProtoInputInstanceHandle, ProtoInput.Values.SetCursorPosHookID);
      ProtoInput.UninstallHook(player.ProtoInputInstanceHandle, ProtoInput.Values.GetKeyStateHookID);
      ProtoInput.UninstallHook(player.ProtoInputInstanceHandle, ProtoInput.Values.GetAsyncKeyStateHookID);
      ProtoInput.UninstallHook(player.ProtoInputInstanceHandle, ProtoInput.Values.GetKeyboardStateHookID);
      ProtoInput.UninstallHook(player.ProtoInputInstanceHandle, ProtoInput.Values.CursorVisibilityStateHookID);
      ProtoInput.UninstallHook(player.ProtoInputInstanceHandle, ProtoInput.Values.GetRawInputDataHookID);
      ProtoInput.UninstallHook(player.ProtoInputInstanceHandle, ProtoInput.Values.RegisterRawInputHookID);
      //ProtoInput.UninstallHook(player.ProtoInputInstanceHandle, ProtoInput.Values.MessageFilterHookID);

      ProtoInput.DisableMessageFilter(player.ProtoInputInstanceHandle, ProtoInput.Values.RawInputFilterID);
      ProtoInput.DisableMessageFilter(player.ProtoInputInstanceHandle, ProtoInput.Values.MouseMoveFilterID);
      ProtoInput.DisableMessageFilter(player.ProtoInputInstanceHandle, ProtoInput.Values.MouseActivateFilterID);
      ProtoInput.DisableMessageFilter(player.ProtoInputInstanceHandle, ProtoInput.Values.WindowActivateFilterID);
      ProtoInput.DisableMessageFilter(player.ProtoInputInstanceHandle, ProtoInput.Values.WindowActivateAppFilterID);
      ProtoInput.DisableMessageFilter(player.ProtoInputInstanceHandle, ProtoInput.Values.MouseWheelFilterID);
      ProtoInput.DisableMessageFilter(player.ProtoInputInstanceHandle, ProtoInput.Values.MouseButtonFilterID);
      ProtoInput.DisableMessageFilter(player.ProtoInputInstanceHandle, ProtoInput.Values.KeyboardButtonFilterID);

      ProtoInput.SetDrawFakeCursor(player.ProtoInputInstanceHandle, false);
    }
  };
};