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

Subnautica · handler “Subnautica Nitrox”

Version 2

Release notes

updated modified nitrox build to 1.6.0.0

Released
Size
7.4 MB
Downloads
3,751
Check
Verified
SHA-256
21fa97edc557baf9878843730be6cade8536cd03d1bb7756d6590afa461e93be
Download v2 (.nc)All versions

Files 75

PathSize
handler.js11 KB
SubnauticaNitrox/Nitrox/AssetBundles/chatkeyhint55 KB
SubnauticaNitrox/Nitrox/AssetBundles/chatlog23 KB
SubnauticaNitrox/Nitrox/AssetBundles/discordjoinrequest9.3 KB
SubnauticaNitrox/Nitrox/AssetBundles/sharedassets154 KB
SubnauticaNitrox/Nitrox/LanguageFiles/Croatian.json2.1 KB
SubnauticaNitrox/Nitrox/LanguageFiles/Czech.json2.2 KB
SubnauticaNitrox/Nitrox/LanguageFiles/Danish.json2.1 KB
SubnauticaNitrox/Nitrox/LanguageFiles/Dutch.json2.1 KB
SubnauticaNitrox/Nitrox/LanguageFiles/English.json2.3 KB
SubnauticaNitrox/Nitrox/LanguageFiles/Finnish.json2.2 KB
SubnauticaNitrox/Nitrox/LanguageFiles/French.json2.3 KB
SubnauticaNitrox/Nitrox/LanguageFiles/German.json2.5 KB
SubnauticaNitrox/Nitrox/LanguageFiles/Hungarian.json2.3 KB
SubnauticaNitrox/Nitrox/LanguageFiles/Italian.json2.3 KB
SubnauticaNitrox/Nitrox/LanguageFiles/Polish.json2.2 KB
SubnauticaNitrox/Nitrox/LanguageFiles/Portuguese.json2.3 KB
SubnauticaNitrox/Nitrox/LanguageFiles/Romanian.json2.3 KB
SubnauticaNitrox/Nitrox/LanguageFiles/Russian.json2.7 KB
SubnauticaNitrox/Nitrox/LanguageFiles/Slovak.json2.1 KB
SubnauticaNitrox/Nitrox/LanguageFiles/Spanish.json2.2 KB
SubnauticaNitrox/Nitrox/LanguageFiles/Turkish.json2.1 KB
SubnauticaNitrox/Nitrox/lib/0Harmony.dll186 KB
SubnauticaNitrox/Nitrox/lib/AssetsTools.NET.dll164 KB
SubnauticaNitrox/Nitrox/lib/Autofac.dll227 KB
SubnauticaNitrox/Nitrox/lib/DiscordGameSDKWrapper.dll90 KB
SubnauticaNitrox/Nitrox/lib/discord_game_sdk.dll3.7 MB
SubnauticaNitrox/Nitrox/lib/dnlib.dll1.1 MB
SubnauticaNitrox/Nitrox/lib/LiteNetLib.dll92 KB
SubnauticaNitrox/Nitrox/lib/LitJSON.dll60 KB
SubnauticaNitrox/Nitrox/lib/LZ4.dll44 KB
SubnauticaNitrox/Nitrox/lib/Microsoft.Win32.Registry.dll26 KB
SubnauticaNitrox/Nitrox/lib/Microsoft.WindowsAPICodePack.dll103 KB
SubnauticaNitrox/Nitrox/lib/Microsoft.WindowsAPICodePack.Shell.dll530 KB
SubnauticaNitrox/Nitrox/lib/Mono.Cecil.dll350 KB
SubnauticaNitrox/Nitrox/lib/Mono.Cecil.Mdb.dll42 KB
SubnauticaNitrox/Nitrox/lib/Mono.Cecil.Pdb.dll88 KB
SubnauticaNitrox/Nitrox/lib/Mono.Cecil.Rocks.dll27 KB
SubnauticaNitrox/Nitrox/lib/Mono.Nat.dll67 KB
SubnauticaNitrox/Nitrox/lib/MonoMod.RuntimeDetour.dll106 KB
SubnauticaNitrox/Nitrox/lib/MonoMod.Utils.dll191 KB
SubnauticaNitrox/Nitrox/lib/Newtonsoft.Json.dll684 KB
SubnauticaNitrox/Nitrox/lib/NitroxClient.dll431 KB
SubnauticaNitrox/Nitrox/lib/NitroxClient.pdb154 KB
SubnauticaNitrox/Nitrox/lib/NitroxModel-Subnautica.dll37 KB
SubnauticaNitrox/Nitrox/lib/NitroxModel-Subnautica.pdb19 KB
SubnauticaNitrox/Nitrox/lib/NitroxModel.dll217 KB
SubnauticaNitrox/Nitrox/lib/NitroxModel.pdb78 KB
SubnauticaNitrox/Nitrox/lib/NitroxPatcher.dll166 KB
SubnauticaNitrox/Nitrox/lib/NitroxPatcher.dll.config541 B
SubnauticaNitrox/Nitrox/lib/NitroxPatcher.pdb64 KB
SubnauticaNitrox/Nitrox/lib/NitroxServer.dll173 KB
SubnauticaNitrox/Nitrox/lib/NitroxServer.dll.config1.2 KB
SubnauticaNitrox/Nitrox/lib/NitroxServer.pdb65 KB
SubnauticaNitrox/Nitrox/lib/protobuf-net.dll179 KB
SubnauticaNitrox/Nitrox/lib/Serilog.dll124 KB
SubnauticaNitrox/Nitrox/lib/Serilog.Sinks.Async.dll9.0 KB
SubnauticaNitrox/Nitrox/lib/Serilog.Sinks.File.dll33 KB
SubnauticaNitrox/Nitrox/lib/Serilog.Sinks.Map.dll12 KB
SubnauticaNitrox/Nitrox/lib/System.Drawing.Common.dll52 KB
SubnauticaNitrox/Nitrox/lib/System.IO.FileSystem.AccessControl.dll28 KB
SubnauticaNitrox/Nitrox/lib/System.Numerics.Vectors.dll113 KB
SubnauticaNitrox/Nitrox/lib/System.Security.AccessControl.dll33 KB
SubnauticaNitrox/Nitrox/lib/System.Security.Principal.Windows.dll18 KB
SubnauticaNitrox/Nitrox/lib/ToastNotifications.dll107 KB
SubnauticaNitrox/Nitrox/lib/ToastNotifications.Messages.dll88 KB
SubnauticaNitrox/Nitrox/Nitrox Logs/game-20220316.log4.3 KB
SubnauticaNitrox/Nitrox/Nitrox Logs/launcher-20220316.log1.3 KB
SubnauticaNitrox/Nitrox/NitroxLauncher.exe3.4 MB
SubnauticaNitrox/Nitrox/NitroxLauncher.exe.config1.7 KB
SubnauticaNitrox/Nitrox/NitroxLauncher.pdb26 KB
SubnauticaNitrox/Nitrox/NitroxServer-Subnautica.exe50 KB
SubnauticaNitrox/Nitrox/NitroxServer-Subnautica.exe.config661 B
SubnauticaNitrox/Nitrox/NitroxServer-Subnautica.pdb23 KB
SubnauticaNitrox/Nitrox/servers29 B

handler.js

Plain text
Hub.Handler.Version = 2; // Released at https://hub.splitscreen.me/ on Thu Mar 17 2022 00:57:06 GMT+0000 (Coordinated Universal Time).
Hub.Handler.Id = "SXxys76eLF6BC36PF";
Hub.Maintainer.Name = "Talos91";
Hub.Maintainer.Id = "eeL7HAz8zJovChWw4";

Game.ExecutableContext = ["Subnautica_Data"];
Game.RequiresAdmin = true;
Game.HandlerInterval = 100;
Game.SymlinkExe = false;
Game.SymlinkGame = false;
Game.ExecutableName = "Subnautica.exe";
Game.SteamID = "264710";
Game.GUID = "Subnautica";
Game.GameName = "Subnautica Nitrox";
Game.MaxPlayers = 5;
Game.MaxPlayersOneMonitor = 5;
Game.LauncherTitle = "";
Game.UseGoldberg = false;
Game.NotTopMost = true;
Game.Hook.ForceFocus = false;
Game.Hook.ForceFocusWindowName = "Subnautica";
Game.FakeFocus = true;
Game.FakeFocusInterval = 10000;
Game.SendFakeFocusMsg = true;
Game.ResetWindows = true;
Game.SetForegroundWindowElsewhere = true;
Game.Hook.DInputEnabled = false;
Game.Hook.XInputEnabled = true;
Game.Hook.XInputReroute = false;
Game.Hook.CustomDllEnabled = false;
Game.Description =
  "IMPORTANT: This uses a Nucleus forked Subnautica Nitrox build to allow for multiple instances. After running via Nucleus select multiplayer in the Nitrox launcher window that will open, once the game instance has launched set the game to windowed if it is in exclusive fullscreen, join the local server using the game multiplayer menu, write a name and select a color using your main mouse\\kb, once you are in-game select the Subnautica process in Nucleus process picker window, click refresh if you do not see it, wait for the instance to reposition then open the next Subnautica instance via the Nitrox Launcher too, repeat the same steps as in the previous instance. Enable the controller in the game options for the gamepad instances. If you use keyboards and mice after all the instances have launched, resized and positioned correctly, press the END key to lock the input for all instances to have their own 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. Reduce in-game graphics settings to improve performance.";
Game.ThirdPartyLaunch = true;
Game.IgnoreThirdPartyPrompt = true;
Game.ForceProcessPick = true;
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 = true;
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.ClipCursorHookCreatesFakeClip = true;
Game.ProtoInput.EnableToggleFakeCursorVisibilityShortcut = false;
Game.ProtoInput.DontShowCursorWhenImageUpdated = true;

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 = true;
Game.ProtoInput.AutoHideTaskbar = true;

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

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, 0x02a3, 0x02a1]; // Blocks WM_KILLFOCUS, WM_MOUSEHOVER and WM_MOUSELEAVE

Game.Play = function() {
  Context.EditRegKey("HKEY_CURRENT_USER", "SOFTWARE\\Unknown Worlds\\Subnautica", "Screenmanager Fullscreen mode_h3630240806", 3, Nucleus.RegType.DWord);
  Context.EditRegKey("HKEY_CURRENT_USER", "SOFTWARE\\Unknown Worlds\\Subnautica", "Screenmanager Is Fullscreen mode_h3981298716", 0, Nucleus.RegType.DWord);
  Context.EditRegKey("HKEY_CURRENT_USER", "SOFTWARE\\Unknown Worlds\\Subnautica", "Screenmanager Resolution Height_h2627697771", Context.Height, Nucleus.RegType.DWord);
  Context.EditRegKey("HKEY_CURRENT_USER", "SOFTWARE\\Unknown Worlds\\Subnautica", "Screenmanager Resolution Width_h182942802", Context.Width, Nucleus.RegType.DWord);
  Context.EditRegKey("HKEY_CURRENT_USER", "SOFTWARE\\Unknown Worlds\\Subnautica", "Screenmanager Resolution Use Native_h1405027254", 0, Nucleus.RegType.DWord);

  var appid = Context.RootInstallFolder + "\\steam_appid.txt";
  var lines = ["264710"];
  Context.WriteTextFile(appid, lines);

  var Gamefolder = System.IO.Path.Combine(Game.Folder);

  Context.RunAdditionalFiles(["1|" + Gamefolder + "\\Nitrox\\NitroxServer-Subnautica.exe"], false, 1);

  Context.RunAdditionalFiles(["1|" + Gamefolder + "\\Nitrox\\NitroxLauncher.exe"], false, 1);

  var path = Gamefolder + "\\Nitrox\\path.txt";
  var lines = ["" + Context.RootInstallFolder];
  Context.WriteTextFile(path, lines);

  Game.KillProcessesOnClose = ["NitroxLauncher", "NitroxServer-Subnautica"];

  if (Context.IsKeyboardPlayer) {
    Game.ProtoInput.KeyboardButtonFilter = true;
  } else {
    Game.ProtoInput.KeyboardButtonFilter = false;
  }

  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.FocusHooksHookID);

      //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.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.FocusHooksHookID);

      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.SetDrawFakeCursor(player.ProtoInputInstanceHandle, false);
    }
  };

  var numPlayers = 0;

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

    if (player.IsXInput && player.ScreenIndex !== -1) {
      numPlayers++;
    }
    player.ProtoController1 = Context.GamepadId;
    player.ProtoController2 = Context.GamepadId;
    player.ProtoController3 = Context.GamepadId;
    player.ProtoController4 = Context.GamepadId;
  }
};