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

Halo: The Master Chief Collection · handler “Halo: The Master Chef Collection”

Version 23

Release notes

update to nucleus 2.0

Released
Size
248 KB
Downloads
244
Check
Verified
SHA-256
db772ce1022a872fe49838502b7025204956ef4b23e370d9f701641515750606
Download v23 (.nc)All versions

Files 3

PathSize
HaloMCC/unlockdb.xml281 KB
HaloMCC/xlive64.dll531 KB
handler.js18 KB

handler.js

Plain text
Hub.Handler.Version = 23; // Released at https://hub.splitscreen.me/ on Sun Feb 27 2022 20:25:52 GMT+0000 (Coordinated Universal Time).
Hub.Handler.Id = "xjBSwFNj3ndRntsZh";
Hub.Maintainer.Name = "Talos91";
Hub.Maintainer.Id = "eeL7HAz8zJovChWw4";

var status = "Disabled";
var answers1 = ["Yes", "No"];
var answers2 = ["Status", "Enable", "Disable"];
Game.AddOption("Unlock all?", "Unlocks all armors, skins, emblems and nameplates.", "Unlock", answers1);
Game.AddOption("Enable Online mode? Status: " + status, "Read the handler notes carefully before using this option.", "Online", answers2);

Game.KillMutex = ["Chelankenstein"];
Game.DirSymlinkExclusions = ["data\\ui", "halo1\\shaders", "mcc\\binaries\\win64", "mcc\\binaries\\win64\\steam_settings\\load_dlls", "mcc\\Content\\Movies"];
Game.FileSymlinkExclusions = ["steam_api64.dll", "steam_api.dll", "steam_appid.txt", "local_save.txt", "xlive64.dll", "xinput1_3.dll", "FMS_logo_microsoft_7_1_.bk2"];
Game.FileSymlinkCopyInstead = [
  "gametiplist.xml",
  "playercustomization.xml",
  "scoredb.xml",
  "texturepacks.xml",
  "unlockdb.xml",
  "fmod_event_net64.dll",
  "fmodex64.dll",
  "game.cfg",
  "halo1.dll",
  "user.cfg",
  "fx.bin",
  "psh.bin",
  "vsh.bin",
  "app.config",
  "d3dcompiler_47.dll",
  "SC_DLL.dll",
  "SwitchSandbox.cmd",
  "bink2w64.dll",
  "cell_release_x64_4_0.dll",
  "halonetworklayer_ship.dll",
  "liblz4.dll",
  "PartyWin.dll",
  "PartyWin7.dll",
  "simplenetworklibrary-x64-release.dll",
  "xaudio2_9redist.dll",
  "xforgelibrary_release.dll"
];
Game.CopyEnvFoldersToNucleusAccounts = ["AppData\\LocalLow\\MCC\\LocalFiles"];
Game.UseNucleusEnvironment = true;
Game.UseGoldberg = true;
Game.GoldbergExperimental = true;
Game.GoldbergNoLocalSave = true;
Game.LaunchAsDifferentUsers = false;
Game.TransferNucleusUserAccountProfiles = true;
Game.UseCurrentUserEnvironment = false;
Game.HandlerInterval = 100;
Game.SymlinkExe = false;
Game.SymlinkGame = true;
Game.SymlinkFolders = true;
Game.HardlinkGame = false;
Game.ExecutableName = "MCC-Win64-Shipping.exe";
Game.SteamID = "976730";
Game.GUID = "Halo MCC";
Game.GameName = "Halo: The Master Chief Collection";
Game.BinariesFolder = "mcc\\binaries\\win64";
Game.MaxPlayers = 16;
Game.MaxPlayersOneMonitor = 16;
Game.LauncherTitle = "";
Game.Hook.ForceFocus = false;
Game.Hook.ForceFocusWindowName = "Halo: The Master Chief Collection";
Game.SendFakeFocusMsg = true;
Game.ResetWindows = true;
Game.RefreshWindowAfterStart = true;
Game.Hook.DInputEnabled = false;
Game.UseDInputBlocker = false;
Game.Hook.XInputEnabled = false;
Game.Hook.XInputReroute = false;
Game.Hook.CustomDllEnabled = false;
Game.UseForceBindIP = true;
Game.UserProfileSavePath = "AppData\\Roaming\\Goldberg SteamEmu Saves\\976730\\remote";
Game.UserProfileConfigPath = "AppData\\LocalLow\\MCC";
Game.UserProfileSavePathNoCopy = true;
Game.UserProfileConfigPathNoCopy = true;
Game.Description =
  "IMPORTANT: Do not place Nucleus inside the game files. Change network type to LAN in the game settings for all instances, then press X on your gamepad or click the roster icon to join the other players. If you are using keyboards/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 whe you finish playing. You can also use CTRL+Q to close Nucleus and all its instances when the input is unlocked. If you get stretching in Halo 4 try locking the input until you are in-game. The new offline LAN option is the default now and the recommended one being a lot easier to use but if you still want to use the old Online connection method you have to select the Online mode UI option, if you select to enable this option Nucleus will launch an instance then close, open Nucleus again and the UI option will be enabled, using the Online mode Nucleus will launch all instances under different temporary windows users so each instance can log-in using different accounts and can connect to each other, you need to launch Nucleus as admin for this, easy anticheat modes not supported. Log in using different microsoft accounts in each instance. To connect the instances open the roster and invite the other players. For this handler to work Nucleus needs to be in the root of your drive outside any users folders, C: is recommended, for example C:\\NucleusCoop, you can also try giving full permissions to the game and Nucleus folders to all users. You need internet connection if you are using the online option cause the instances connect via the xbox live servers.";
Game.KeepSymLinkOnExit = false;
Game.PauseBetweenProcessGrab = 5;
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.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 = true;
Game.ProtoInput.UseOpenXinput = true;
Game.ProtoInput.UseDinputRedirection = false;
Game.ProtoInput.DinputDeviceHook = false;
Game.ProtoInput.DinputHookAlsoHooksGetDeviceState = false;

Game.ProtoInput.EnableFocusMessageLoop = false;
//Game.ProtoInput.FocusLoopIntervalMilliseconds = 40000;
//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.Play = function() {
  Context.StartArguments = " -windowed -AlwaysFocus -nosplash" + " -ResX=" + Context.Width + " -ResY=" + Context.Height;

  var filePath = (Context.filePath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\mcc\\binaries\\win64\\steam_settings\\load_dlls");
  System.IO.Directory.CreateDirectory(filePath);

  var dlc = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\mcc\\binaries\\win64\\steam_settings\\DLC.txt";
  var lines = [
    "1109621=MCC - Reach: Extended Language Pack",
    "1109620=MCC - H4: Extended Language Pack",
    "1108763=MCC - ODST: Extended Language Pack",
    "1108762=MCC - H3: Extended Language Pack",
    "1108761=MCC - H2: Extended Language Pack",
    "1108760=MCC - H1: Extended Language Pack",
    "1097224=MCC - Reach (Content Pack 2)",
    "1097223=MCC - H2: Multiplayer",
    "1097222=MCC - H3: Multiplayer",
    "1097220=MCC - H4: Multiplayer",
    "1080080=MCC - H1: Multiplayer",
    "1064273=Halo 4",
    "1064272=Halo 3: ODST",
    "1064271=Halo 3",
    "1064270=Halo 2: Anniversary",
    "1064221=Halo: Combat Evolved Anniversary",
    "1064220=Halo: Reach"
  ];
  Context.WriteTextFile(dlc, lines);

  var depots = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\mcc\\binaries\\win64\\steam_settings\\depots.txt";
  var lines = [
    "976731",
    "976732",
    "976733",
    "976734",
    "976735",
    "976736",
    "976737",
    "976738",
    "976739",
    "1064222",
    "1064223",
    "1064224",
    "1064225",
    "1064226",
    "1064227",
    "1064228",
    "1064229",
    "1064274",
    "1064275",
    "1064276"
  ];
  Context.WriteTextFile(depots, lines);

  var nolan = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\mcc\\binaries\\win64\\disable_lan_only.txt";
  var lines = [""];
  Context.WriteTextFile(nolan, lines);

  var appid = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\mcc\\binaries\\win64\\steam_settings\\steam_appid.txt";
  var lines = ["976730"];
  Context.WriteTextFile(appid, lines);

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

  //S

  var savePath = (Context.SavePath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\mcc\\binaries\\win64\\steam_settings\\load_dlls\\xlive64.dll");
  var savePkgOrigin = System.IO.Path.Combine(Game.Folder, "xlive64.dll");
  System.IO.File.Copy(savePkgOrigin, savePath, true);

  //E

  if (System.IO.File.Exists(Context.NucleusUserRoot + "\\AppData\\LocalLow\\MCC\\ClockSkew.json")) {
    Context.BackupFile(Context.NucleusUserRoot + "\\AppData\\LocalLow\\MCC\\ClockSkew.json", true);

    Context.BackupFile(Context.NucleusUserRoot + "\\AppData\\LocalLow\\MCC\\SystemSettingsData.bin", true);
  } else {
  }

  var unlock = Context.Options["Unlock"];
  var online = Context.Options["Online"];

  if (unlock == "Yes") {
    var savePath = (Context.SavePath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\data\\ui\\unlockdb.xml");
    var savePkgOrigin = System.IO.Path.Combine(Game.Folder, "unlockdb.xml");
    System.IO.File.Copy(savePkgOrigin, savePath, true);
  }

  if (unlock == "No") {
  }

  if (online == "Status") {
  }

  if (online == "Enable") {
    var txtPath = Context.NucleusFolder + "\\handlers\\Halo The Master Chief Collection.js";
    var dict = [
      Context.FindLineNumberInTextFile(txtPath, 'var status = "Disabled";', Nucleus.SearchType.StartsWith) + '|var status = "Enabled";',
      Context.FindLineNumberInTextFile(txtPath, "Game.LaunchAsDifferentUsers", Nucleus.SearchType.StartsWith) + "|Game.LaunchAsDifferentUsers = true;",
      Context.FindLineNumberInTextFile(txtPath, "Game.UseNucleusEnvironment", Nucleus.SearchType.StartsWith) + "|Game.UseNucleusEnvironment = false;",
      Context.FindLineNumberInTextFile(txtPath, "  //S", Nucleus.SearchType.StartsWith) + "|  /*S",
      Context.FindLineNumberInTextFile(txtPath, "  //E", Nucleus.SearchType.StartsWith) + "|  E*/"
    ];
    Context.ReplaceLinesInTextFile(txtPath, dict);

    var Bat = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\close.bat";
    var lines = ["timeout /t 5 /nobreak", 'taskkill -im "NucleusCoop.exe"'];
    Context.WriteTextFile(Bat, lines);

    Context.RunAdditionalFiles(["1|" + Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\close.bat"], false, 1);
  }
  if (online == "Disable") {
    var txtPath = Context.NucleusFolder + "\\handlers\\Halo The Master Chief Collection.js";
    var dict = [
      Context.FindLineNumberInTextFile(txtPath, 'var status = "Enabled";', Nucleus.SearchType.StartsWith) + '|var status = "Disabled";',
      Context.FindLineNumberInTextFile(txtPath, "Game.LaunchAsDifferentUsers", Nucleus.SearchType.StartsWith) + "|Game.LaunchAsDifferentUsers = false;",
      Context.FindLineNumberInTextFile(txtPath, "Game.UseNucleusEnvironment", Nucleus.SearchType.StartsWith) + "|Game.UseNucleusEnvironment = true;",
      Context.FindLineNumberInTextFile(txtPath, "  /*S", Nucleus.SearchType.StartsWith) + "|  //S",
      Context.FindLineNumberInTextFile(txtPath, "  E*/", Nucleus.SearchType.StartsWith) + "|  //E"
    ];
    Context.ReplaceLinesInTextFile(txtPath, dict);

    var Bat = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\close.bat";
    var lines = ["timeout /t 10 /nobreak", 'taskkill -im "NucleusCoop.exe"'];
    Context.WriteTextFile(Bat, lines);

    Context.RunAdditionalFiles(["1|" + Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\close.bat"], false, 1);
  }

  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.EnableMessageFilter(player.ProtoInputInstanceHandle, ProtoInput.Values.RawInputFilterID);

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

      ProtoInput.StopFocusMessageLoop(player.ProtoInputInstanceHandle);
    }
  };

  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.InstallHook(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.DisableMessageFilter(player.ProtoInputInstanceHandle, ProtoInput.Values.KeyboardButtonFilterID);

      ProtoInput.SetDrawFakeCursor(player.ProtoInputInstanceHandle, false);

      ProtoInput.StartFocusMessageLoop(player.ProtoInputInstanceHandle, 5000, true, true, false, false, false);
    }
  };
};