tModLoader · handler “tModLoader”
Version 10
Release notes
gamepad and mkb combo fix attempt.
- Released
- Size
- 3.3 KB
- Downloads
- 2,290
- Check
- Verified
- SHA-256
- 905032a355b5203db1a51a47f43f7536c1de45f845f2844ce136a9d6efc4bd4d
Files 1
| Path | Size |
|---|---|
| handler.js | 13 KB |
handler.js
Plain textHub.Handler.Version = 10; // Released at https://hub.splitscreen.me/ on Thu Feb 29 2024 07:22:54 GMT+0000 (Coordinated Universal Time).
Hub.Handler.Id = "8GbK8CraioYmevXAH";
Hub.Maintainer.Name = "Talos91";
Hub.Maintainer.Id = "eeL7HAz8zJovChWw4";
var answers1 = ["No", "Yes"];
Game.AddOption(
"Gamepads and multiple keyboards/mice fix?",
"ONLY use if you are launching instances with gamepads and keyboard/mouse icons, so they work correctly in their respective instances, could cause crashes.",
"Fix",
answers1
);
Game.ExecutableContext = ["host"];
Game.DirSymlinkExclusions = ["dotnet\\6.0.0", "dotnet\\6.0.14"];
Game.DirSymlinkCopyInstead = [
"dotnet\\6.0.14\\host",
"dotnet\\6.0.14\\shared\\Microsoft.NETCore.App\\6.0.14",
"Content",
"DedicatedServerUtils",
"LaunchUtils",
"Libraries",
"tModLoader-Logs",
"tModPorter"
];
Game.FileSymlinkExclusions = ["steam_appid.txt", "client.log", "Launch.log", "Natives.log"];
Game.FileSymlinkCopyInstead = [
"steam_api.dll",
"serverconfig.txt",
"start-tModLoader.bat",
"start-tModLoader.sh",
"start-tModLoaderServer.bat",
"start-tModLoaderServer.sh",
"tMLMod.targets",
"tModLoader.deps.json",
"tModLoader.dll",
"tModLoader.runtimeconfig.dev.json",
"tModLoader.runtimeconfig.json",
"tModLoader.xml"
];
Game.DirSymlinkCopyInsteadIncludeSubFolders = true;
Game.NeedsSteamEmulation = false;
Game.CreateSteamAppIdByExe = true;
Game.HandlerInterval = 100;
Game.SymlinkExe = false;
Game.SymlinkGame = true;
Game.SymlinkFolders = false;
Game.ExecutableName = "dotnet.exe";
Game.SteamID = "1281930";
Game.GUID = "tModLoader";
Game.GameName = "Terraria tModLoader";
Game.MaxPlayers = 8;
Game.MaxPlayersOneMonitor = 8;
Game.BinariesFolder = "dotnet\\6.0.14";
Game.LauncherTitle = "";
Game.LauncherExe = "start-tModLoader.bat";
Game.HideTaskbar = false;
Game.SetTopMostAtEnd = true;
Game.Hook.ForceFocus = true;
Game.Hook.ForceFocusWindowName = "Terraria";
Game.HasDynamicWindowTitle = true;
Game.FakeFocus = false;
Game.ResetWindows = true;
Game.SetForegroundWindowElsewhere = true;
Game.Hook.DInputEnabled = false;
Game.Hook.XInputEnabled = true;
Game.Hook.XInputReroute = false;
Game.Hook.CustomDllEnabled = false;
Game.DocumentsConfigPath = "My Games\\Terraria\\tModLoader";
Game.DocumentsSavePath = "My Games\\Terraria\\tModLoader\\Players";
Game.Description =
"IMPORTANT: Handler for tModLoader downloaded from Steam for Terraria 1.4+, add the dotnet.exe in tModLoader files to Nucleus. Install all your mods in the regular game first, disable Steam input in Steam for this game. To restrict controllers to each instance correctly you have to do this: tModLoader will only respond to the gamepads that were connected when the game opened and to the last connected gamepad, so for the first instance turn off all connected gamepads but the first one after clicking play in Nucleus and before the first instance opens, for the second instance just turn on the second connected gamepad before opening the second instance and so on. 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 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. To join each other host a world in one instance with Steam multiplayer disabled then the others can join using join via IP, type localhost and accept. If you want the instances to resize correctly and avoid stretching you need to create custom resolutions in your AMD/Nvidia/Intel panel (for example if you have a 1920x1080 monitor add resolutions like: 960x1080, 960x540, 1920x540 etc.) so the game can see and use them.";
Game.KeepSymLinkOnExit = false;
Game.PromptBetweenInstances = true;
Game.PauseBetweenContextAndLaunch = 7;
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.InjectHookXinput = 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 = true;
Game.ProtoInput.InjectRuntime_EasyHookMethod = false;
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 = false;
Game.ProtoInput.FocusHooks = false;
Game.ProtoInput.DrawFakeCursor = false;
Game.ProtoInput.SetWindowPosHook = true;
Game.ProtoInput.SetWindowStyleHook = 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.MultipleProtoControllers = false;
Game.ProtoInput.EnableFocusMessageLoop = true;
Game.ProtoInput.FocusLoopIntervalMilliseconds = 5000;
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() {
var txtPath = Context.GetFolder(Nucleus.Folder.Documents) + "\\My Games\\Terraria\\tModLoader\\config.json";
var dict = [
Context.FindLineNumberInTextFile(txtPath, ' "Fullscreen":', Nucleus.SearchType.StartsWith) + '| "Fullscreen": false, ',
Context.FindLineNumberInTextFile(txtPath, ' "WindowMaximized":', Nucleus.SearchType.StartsWith) + '| "WindowMaximized": false,',
Context.FindLineNumberInTextFile(txtPath, ' "WindowBorderless":', Nucleus.SearchType.StartsWith) + '| "WindowBorderless": false,',
Context.FindLineNumberInTextFile(txtPath, ' "DisplayWidth":', Nucleus.SearchType.StartsWith) + '| "DisplayWidth": ' + Context.Width + ",",
Context.FindLineNumberInTextFile(txtPath, ' "DisplayHeight":', Nucleus.SearchType.StartsWith) + '| "DisplayHeight": ' + Context.Height + ",",
Context.FindLineNumberInTextFile(txtPath, ' "AllowUnfocusedInputOnGamepad":', Nucleus.SearchType.StartsWith) + '| "AllowUnfocusedInputOnGamepad": true,'
];
Context.ReplaceLinesInTextFile(txtPath, dict);
var fix = Context.Options["Fix"];
if (fix == "Yes") {
if (Context.IsKeyboardPlayer) {
Game.ProtoInput.RegisterRawInputHook = true;
Game.ProtoInput.XinputHook = true;
} else {
Game.ProtoInput.RegisterRawInputHook = false;
Game.ProtoInput.XinputHook = false;
}
}
if (fix == "No") {
if (Context.HasKeyboardPlayer == true) {
} else {
Game.ProtoInput.RegisterRawInputHook = 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);
//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, false);
}
};
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);
}
};
};