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

Postal 2 · handler “Postal 2”

Version 1

Release notes

first release

Released
Size
3.9 MB
Downloads
78
Check
Verified
SHA-256
d38c3218de01ee712a3706bf4ef28fc7e7bab0616b5adc6418fa3aae057e588f
Download v1 (.nc)All versions

Files 16

PathSize
handler.js26 KB
Postal 2/checknucleus.bat831 B
Postal 2/custom_gen_values.txt16 B
Postal 2/d3d8.dll122 KB
Postal 2/NicksCoop Files/credits.txt458 B
Postal 2/NicksCoop Files/Maps/NicksCoopMapLoader.fuk170 KB
Postal 2/NicksCoop Files/System/NicksCoop.int317 B
Postal 2/NicksCoop Files/System/NicksCoop.u7.2 MB
Postal 2/NicksCoop Files/System/NicksCoopCustomMods.ini878 B
Postal 2/NicksCoop Files/System/NicksCoopInvReplace.ini812 B
Postal 2/NicksCoop Files/System/NicksCoopSave.ini2.0 KB
Postal 2/NicksCoop Files/System/NicksCoop_RunServer.bat1.4 KB
Postal 2/NicksCoop Files/System/Postal2CoOp.ini50 KB
Postal 2/NicksCoop Files/System/UCC.exe124 KB
Postal 2/NicksCoop Files/System/User.ini6.9 KB
Postal 2/Postal2Splash.bmp1.3 MB

handler.js

Plain text
Hub.Handler.Version = 1; // Released at https://hub.splitscreen.me/ on Mon Apr 21 2025 17:28:26 GMT+0000 (Coordinated Universal Time).
Hub.Handler.Id = "PM4brTCbhT3EQsXYc";
Hub.Maintainer.Name = "Vlxst";
Hub.Maintainer.Id = "wZTsDsXZnJhD4fwfz";

Game.FileSymlinkExclusions = ["NicksCoopSave.ini", "User.ini"];
Game.DirSymlinkCopyInstead = ["System"];
Game.BackupFiles = ["System\\NicksCoopSave.ini", "System\\User.ini"];

Game.GameName = "Postal 2 (NicksCoop)";
Game.HandlerInterval = 100;
Game.SymlinkExe = false;
Game.KeepSymLinkOnExit = false;
Game.SymlinkGame = true;
Game.SymlinkFolders = false;
Game.SupportsKeyboard = false;
Game.ExecutableName = "Postal2.exe";
Game.ChangeExe = true;
Game.SteamID = "223470";
Game.GUID = "Postal 2";
Game.MaxPlayers = 8;
Game.MaxPlayersOneMonitor = 4;
Game.WorkingFolder = "";
Game.BinariesFolder = "System";
Game.Hook.ForceFocus = true;
Game.Hook.ForceFocusWindowName = "Postal 2";
Game.HasDynamicWindowTitle = true;
Game.ForceWindowTitle = true;
// Game.ResetWindows = true;
Game.RefreshWindowAfterStart = true;
// Game.SetForegroundWindowElsewhere = true;
Game.SetWindowHook = true;
Game.Hook.DInputEnabled = false;
Game.Hook.DInputForceDisable = true;
Game.Hook.XInputEnabled = false;
Game.Hook.CustomDllEnabled = false;
Game.BlockRawInput = false;
// Game.PreventGameFocus = true;
Game.PauseBetweenContextAndLaunch = 5;
Game.PauseBetweenProcessGrab = 5;
Game.PauseBetweenStarts = 30;

Game.KillProcessesOnClose = ["cmd", "UCC"];

Game.Description =
  "SUPPORTS GAMEPADS ONLY!!!\n\n" +
  "REQUIRED: This Handler use Nicks Coop mod to enable campaign coop: (https://steamcommunity.com/sharedfiles/filedetails/?id=737631813)\n" +
  "without it, it wouldn't be possible!.\n\n" +
  "Have your game totally CLEAN!\n" +
  "!!Not necessary to download any mod manually!!\n\n" +
  "You will need to use *game build: 5025*\n" +
  "If you don't know how to change betas: https://www.moddb.com/mods/nickscoop-postal-2-coop/news/compatibility-fix-v1-4-3\n\n" +
  "IMPORTANT: Always before exiting the game, use the *SAVE GAME* option in the instances pause menu.\n" +
  "FOV: Can be adjusted in-game. Press the ~ (tilde) key during gameplay to type in the game console, example: FOV 101.\n\n" +
  "ONLINE: You can play LAN and online, just access the website: (https://master.333networks.com/s/postal2)\n" +
  "Choose the server and copy the IP:PORT and paste it when the nucleus starts the instances.\n" +
  "!!Remember to only select servers that host games created with the NicksCoop mod!!\n\n" +
  "NOT is necessary to press the END key as usual, just wait for the instances to open and reposition correctly." +
  "\n" +
  "Avoid closing the game in any way, use the nucleus hotkeys to close instances (Default: Ctrl+E)" +
  "\n" +
  "Sometimes the mouse cursor may be persistent when exiting the pause menu, this is due to the game using gamepad emulating mouse in the menu, so just enter and exit the pause menu in any instance for the cursor to disappear." +
  "\n\n" +
  "CREDITS: My sincere thanks to Evil (creator of the mod) for supporting this handler and helping me fix a problem in the game engine. THANKS";

Game.CustomUserGeneralPrompts = [
  "-Enter IP and Port of Server-\n" + "Default: 127.0.0.1:7777 (LAN)\n \n" + "-You can find servers online at-\n" + "https://master.333networks.com/s/postal2\n \n" + "last IP used:"
];
Game.SaveCustomUserGeneralValues = true;
Game.SaveAndEditCustomUserGeneralValues = true;

Game.RenameAndOrMoveFiles = [
  "1|System\\Postal2.int|System\\Postal2 - Player 1.int",
  "2|System\\Postal2.int|System\\Postal2 - Player 2.int",
  "3|System\\Postal2.int|System\\Postal2 - Player 3.int",
  "4|System\\Postal2.int|System\\Postal2 - Player 4.int",
  "5|System\\Postal2.int|System\\Postal2 - Player 5.int",
  "6|System\\Postal2.int|System\\Postal2 - Player 6.int",
  "7|System\\Postal2.int|System\\Postal2 - Player 7.int",
  "8|System\\Postal2.int|System\\Postal2 - Player 8.int"
];

//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;
Game.UpdateFakeMouseWithInternalInput = false;

//ProtoInput:

// Game.SupportsMultipleKeyboardsAndMice = false;

//// for work gamepads
Game.ProtoInput.XinputHook = true;
Game.ProtoInput.UseOpenXinput = true;
Game.ProtoInput.UseDinputRedirection = false;
Game.ProtoInput.DinputDeviceHook = false;
Game.ProtoInput.DinputHookAlsoHooksGetDeviceState = false;
Game.ProtoInput.MultipleProtoControllers = true;

Game.Play = function() {
  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 = true;
  Game.ProtoInput.ClipCursorHookCreatesFakeClip = true;
  Game.ProtoInput.EnableToggleFakeCursorVisibilityShortcut = false;
  Game.ProtoInput.DontShowCursorWhenImageUpdated = true;

  Game.ProtoInput.AllowFakeCursorOutOfBounds = false;
  Game.ProtoInput.ExtendFakeCursorBounds = 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 = false;

  Game.ProtoInput.SendMouseWheelMessages = true;
  Game.ProtoInput.SendMouseButtonMessages = true;
  Game.ProtoInput.SendMouseMovementMessages = true;
  Game.ProtoInput.SendKeyboardButtonMessages = 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.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);

      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.Valuesaaaaaa.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.RegisterRawInputHookID);
      //ProtoInput.UninstallHook(player.ProtoInputInstanceHandle, ProtoInput.Values.MessageFilterHookID);

      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);
    }
  };

  //start arguments
  var Args = (Context.Args = Context.CustomUserGeneralValues + " -INI=Postal2CoOp.ini");
  Context.StartArguments = Args;

  //copy files of NicksCoop mod
  var savePath = (Context.SavePath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\Maps\\NicksCoopMapLoader.fuk");
  var savePkgOrigin = System.IO.Path.Combine(Game.Folder, "NicksCoop Files\\Maps\\NicksCoopMapLoader.fuk");
  System.IO.File.Copy(savePkgOrigin, savePath, true);

  var savePath = (Context.SavePath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\System\\NicksCoop.int");
  var savePkgOrigin = System.IO.Path.Combine(Game.Folder, "NicksCoop Files\\System\\NicksCoop.int");
  System.IO.File.Copy(savePkgOrigin, savePath, true);

  var savePath = (Context.SavePath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\System\\NicksCoop.u");
  var savePkgOrigin = System.IO.Path.Combine(Game.Folder, "NicksCoop Files\\System\\NicksCoop.u");
  System.IO.File.Copy(savePkgOrigin, savePath, true);

  var savePath = (Context.SavePath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\System\\NicksCoopCustomMods.ini");
  var savePkgOrigin = System.IO.Path.Combine(Game.Folder, "NicksCoop Files\\System\\NicksCoopCustomMods.ini");
  System.IO.File.Copy(savePkgOrigin, savePath, true);

  var savePath = (Context.SavePath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\System\\NicksCoopInvReplace.ini");
  var savePkgOrigin = System.IO.Path.Combine(Game.Folder, "NicksCoop Files\\System\\NicksCoopInvReplace.ini");
  System.IO.File.Copy(savePkgOrigin, savePath, true);

  var savePath = (Context.SavePath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\System\\NicksCoopSave.ini");
  var savePkgOrigin = System.IO.Path.Combine(Game.Folder, "NicksCoop Files\\System\\NicksCoopSave.ini");
  System.IO.File.Copy(savePkgOrigin, savePath, true);

  var savePath = (Context.SavePath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\System\\Postal2CoOp.ini");
  var savePkgOrigin = System.IO.Path.Combine(Game.Folder, "NicksCoop Files\\System\\Postal2CoOp.ini");
  System.IO.File.Copy(savePkgOrigin, savePath, true);

  var savePath = (Context.SavePath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\System\\UCC.exe");
  var savePkgOrigin = System.IO.Path.Combine(Game.Folder, "NicksCoop Files\\System\\UCC.exe");
  System.IO.File.Copy(savePkgOrigin, savePath, true);

  var savePath = (Context.SavePath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\System\\NicksCoop_RunServer.bat");
  var savePkgOrigin = System.IO.Path.Combine(Game.Folder, "NicksCoop Files\\System\\NicksCoop_RunServer.bat");
  System.IO.File.Copy(savePkgOrigin, savePath, true);

  var savePath = (Context.SavePath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\System\\User.ini");
  var savePkgOrigin = System.IO.Path.Combine(Game.Folder, "NicksCoop Files\\System\\User.ini");
  System.IO.File.Copy(savePkgOrigin, savePath, true);

  //d3d8tod3d9
  var savePath = (Context.SavePath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\System\\d3d8.dll");
  var savePkgOrigin = System.IO.Path.Combine(Game.Folder, "d3d8.dll");
  System.IO.File.Copy(savePkgOrigin, savePath, true);

  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  //editing ini files
  var savePath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\System\\Postal2CoOp.ini";
  Context.ModifySaveFile(savePath, savePath, Nucleus.SaveType.INI, [
    new Nucleus.IniSaveInfo("WinDrv.WindowsClient", "StartupFullscreen", "False"),
    new Nucleus.IniSaveInfo("WinDrv.WindowsClient", "FullscreenWindowed", "False"),
    new Nucleus.IniSaveInfo("WinDrv.WindowsClient", "FullscreenViewportY", Context.Height),
    new Nucleus.IniSaveInfo("WinDrv.WindowsClient", "FullscreenViewportX", Context.Width),
    new Nucleus.IniSaveInfo("WinDrv.WindowsClient", "MenuViewportX", Context.Width),
    new Nucleus.IniSaveInfo("WinDrv.WindowsClient", "MenuViewportY", Context.Height),
    new Nucleus.IniSaveInfo("WinDrv.WindowsClient", "WindowedViewportY", Context.Height),
    new Nucleus.IniSaveInfo("WinDrv.WindowsClient", "WindowedViewportX", Context.Width),
    new Nucleus.IniSaveInfo("SDLDrv.SDLClient", "WindowedViewportX", Context.Width),
    new Nucleus.IniSaveInfo("SDLDrv.SDLClient", "WindowedViewporty", Context.Height),
    new Nucleus.IniSaveInfo("SDLDrv.SDLClient", "MenuViewportX", Context.Width),
    new Nucleus.IniSaveInfo("SDLDrv.SDLClient", "MenuViewportY", Context.Height),
    new Nucleus.IniSaveInfo("SDLDrv.SDLClient", "FullscreenViewportY", Context.Height),
    new Nucleus.IniSaveInfo("SDLDrv.SDLClient", "FullscreenViewportX", Context.Width),
    new Nucleus.IniSaveInfo("NicksCoop.CoopMenu", "MultiPlayerName", Context.Nickname),
    new Nucleus.IniSaveInfo("NicksCoop.CoopMenu", "MultiPlayerHostName", Context.Nickname),
    new Nucleus.IniSaveInfo("Postal2Game.P2GameInfo", "bWidescreenStretch", "True"),
    new Nucleus.IniSaveInfo("D3DDrv.D3DRenderDevice", "UseVSync", "True"),
    new Nucleus.IniSaveInfo("D3DDrv.D3DRenderDevice", "ReduceMouseLag", "False"), //no edit
    new Nucleus.IniSaveInfo("OpenGLDrv.OpenGLRenderDevice", "ReduceMouseLag", "False"), //no edit

    //Server Settings
    new Nucleus.IniSaveInfo("NicksCoop.CoopGameInfo", "CoopSaveServerID", "AAAA-AAAA-AAAA-AAAA"), //DO NOT TOUCH
    new Nucleus.IniSaveInfo("NicksCoop.CoopGameInfo", "CoopHostNameID", "AAAA_AAAA"), //DO NOT TOUCH
    new Nucleus.IniSaveInfo("NicksCoop.CoopGameInfo", "CoopTravelPortalName", ""), //DO NOT TOUCH
    new Nucleus.IniSaveInfo("NicksCoop.CoopGameInfo", "bCoopRagdollSync", "True"), //DO NOT TOUCH
    new Nucleus.IniSaveInfo("NicksCoop.CoopGameInfo", "ReportLogFileType", "ReportLog_D%D_M%M_Y%Y"), //DO NOT TOUCH
    new Nucleus.IniSaveInfo("NicksCoop.CoopGameInfo", "bNonDedicatedAutoSave", "True"), //DO NOT TOUCH
    new Nucleus.IniSaveInfo("NicksCoop.CoopGameInfo", "bAutoSave_FirstRun", "False"), //DO NOT TOUCH
    new Nucleus.IniSaveInfo("NicksCoop.CoopGameInfo", "xResetVoteTimeStamp", "0.000000"), //DO NOT TOUCH

    new Nucleus.IniSaveInfo("NicksCoop.CoopGameInfo", "CoopFriendlyFireScale", "0.000000"), //FriendlyFire Max 1.000000
    new Nucleus.IniSaveInfo("NicksCoop.CoopGameInfo", "CoopStoryModeType", "2"), // Story Mode: 0 = POSTAL 2 , 1 = Apocalypse Weekend , 2 = A Week in Paradise
    new Nucleus.IniSaveInfo("NicksCoop.CoopGameInfo", "CoopTravelAccessPercent", "0.500000"), //How many Players you need to travel between levels (more tha value). Max value 1.000000.
    new Nucleus.IniSaveInfo("Engine.GameInfo", "GameDifficulty", "5.000000"), //Difficulty 0.000000 at 10.000000. Default Normal = 5.000000
    new Nucleus.IniSaveInfo("Engine.GameInfo", "MaxSpectators", "5"), //Max 10
    new Nucleus.IniSaveInfo("Engine.GameInfo", "MaxPlayers", "16"), // Max 16
    new Nucleus.IniSaveInfo("UTBrowser.UMenuBotmatchClientWindow", "AdminPassword", "Nick"), //Admin Password
    new Nucleus.IniSaveInfo("Engine.GameReplicationInfo", "ServerName", "(NucleusCoop)NicksCoop Local Server"), //server name
    new Nucleus.IniSaveInfo("Engine.GameReplicationInfo", "ShortName", "(NucleusCoop)NicksCoop Local Server"), //server name
    new Nucleus.IniSaveInfo("Postal2Game.P2GameInfoSingle", "bNoHolidays", "False") // No Holidays Events (True or False)
  ]);

  //sum of aspect
  if (Context.AspectRatioDecimal < 1.2) {
    //vertical below 4:3
  } else {
    //fix Map on horizontal
    var savePath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\System\\Postal2CoOp.ini";
    Context.ModifySaveFile(savePath, savePath, Nucleus.SaveType.INI, [new Nucleus.IniSaveInfo("Postal2Game.P2GameInfo", "bWidescreenStretch", "False")]);
  }

  //skins players and others  //////////////////////////

  if (Context.PlayerID == 0) {
    //this is what Nucleus will do for the player 1
    var savePath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\System\\User.ini";
    Context.ModifySaveFile(savePath, savePath, Nucleus.SaveType.INI, [new Nucleus.IniSaveInfo("DefaultPlayer", "Skin", "NicksCoop.ExtraStuff.Punisher_Skin")]);

    var savePath = (Context.SavePath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\System\\Postal2 - Player 1Splash.bmp");
    var savePkgOrigin = System.IO.Path.Combine(Game.Folder, "Postal2Splash.bmp");
    System.IO.File.Copy(savePkgOrigin, savePath, true);
  }

  if (Context.PlayerID == 1) {
    // this is what Nucleus will do for the player 2
    var savePath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\System\\User.ini";
    Context.ModifySaveFile(savePath, savePath, Nucleus.SaveType.INI, [new Nucleus.IniSaveInfo("DefaultPlayer", "Skin", "NicksCoop.ExtraStuff.HNDudeSanta_Skin")]);

    var savePath = (Context.SavePath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\System\\Postal2 - Player 2Splash.bmp");
    var savePkgOrigin = System.IO.Path.Combine(Game.Folder, "Postal2Splash.bmp");
    System.IO.File.Copy(savePkgOrigin, savePath, true);
  }

  if (Context.PlayerID == 2) {
    // this is what Nucleus will do for the player 3
    var savePath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\System\\User.ini";
    Context.ModifySaveFile(savePath, savePath, Nucleus.SaveType.INI, [new Nucleus.IniSaveInfo("DefaultPlayer", "Skin", "ChameleonSkins.Scientists.MW__164__Avg_Dude")]);

    var savePath = (Context.SavePath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\System\\Postal2 - Player 3Splash.bmp");
    var savePkgOrigin = System.IO.Path.Combine(Game.Folder, "Postal2Splash.bmp");
    System.IO.File.Copy(savePkgOrigin, savePath, true);
  }

  if (Context.PlayerID == 3) {
    // this is what Nucleus will do for the player 4
    var savePath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\System\\User.ini";
    Context.ModifySaveFile(savePath, savePath, Nucleus.SaveType.INI, [new Nucleus.IniSaveInfo("DefaultPlayer", "Skin", "NicksCoop.ExtraStuff.SJDudeShtopor_Skin00")]);

    var savePath = (Context.SavePath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\System\\Postal2 - Player 4Splash.bmp");
    var savePkgOrigin = System.IO.Path.Combine(Game.Folder, "Postal2Splash.bmp");
    System.IO.File.Copy(savePkgOrigin, savePath, true);
  }

  if (Context.PlayerID == 4) {
    // this is what Nucleus will do for the player 5
    var savePath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\System\\User.ini";
    Context.ModifySaveFile(savePath, savePath, Nucleus.SaveType.INI, [new Nucleus.IniSaveInfo("DefaultPlayer", "Skin", "NicksCoop.ExtraStuff.P1Dude_Skin")]);

    var savePath = (Context.SavePath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\System\\Postal2 - Player 5Splash.bmp");
    var savePkgOrigin = System.IO.Path.Combine(Game.Folder, "Postal2Splash.bmp");
    System.IO.File.Copy(savePkgOrigin, savePath, true);
  }

  if (Context.PlayerID == 5) {
    // this is what Nucleus will do for the player 6
    var savePath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\System\\User.ini";
    Context.ModifySaveFile(savePath, savePath, Nucleus.SaveType.INI, [new Nucleus.IniSaveInfo("DefaultPlayer", "Skin", "NicksCoop.ExtraStuff.PRDude_Skin")]);

    var savePath = (Context.SavePath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\System\\Postal2 - Player 6Splash.bmp");
    var savePkgOrigin = System.IO.Path.Combine(Game.Folder, "Postal2Splash.bmp");
    System.IO.File.Copy(savePkgOrigin, savePath, true);
  }

  if (Context.PlayerID == 6) {
    // this is what Nucleus will do for the player 7
    var savePath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\System\\User.ini";
    Context.ModifySaveFile(savePath, savePath, Nucleus.SaveType.INI, [new Nucleus.IniSaveInfo("DefaultPlayer", "Skin", "NicksCoop.ExtraStuff.TalibDude_Skin")]);

    var savePath = (Context.SavePath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\System\\Postal2 - Player 7Splash.bmp");
    var savePkgOrigin = System.IO.Path.Combine(Game.Folder, "Postal2Splash.bmp");
    System.IO.File.Copy(savePkgOrigin, savePath, true);
  }

  if (Context.PlayerID == 7) {
    // this is what Nucleus will do for the player 8
    var savePath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\System\\User.ini";
    Context.ModifySaveFile(savePath, savePath, Nucleus.SaveType.INI, [new Nucleus.IniSaveInfo("DefaultPlayer", "Skin", "NicksCoop.ExtraStuff.BetaNiceDude_Skin")]);

    var savePath = (Context.SavePath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\System\\Postal2 - Player 8Splash.bmp");
    var savePkgOrigin = System.IO.Path.Combine(Game.Folder, "Postal2Splash.bmp");
    System.IO.File.Copy(savePkgOrigin, savePath, true);
  }

  /////////////////////////////////////////////////////////////////////////

  //// for xinput work
  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;
  }

  ///// Restore Save backup

  if (System.IO.File.Exists(Context.PlayerGameFilesBackupFolder + "\\System\\NicksCoopSave.ini")) {
    var savePath = (Context.SavePath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\System\\NicksCoopSave.ini");
    var savePkgOrigin = System.IO.Path.Combine(Context.PlayerGameFilesBackupFolder + "\\System\\NicksCoopSave.ini");
    System.IO.File.Copy(savePkgOrigin, savePath, true);
  }

  if (System.IO.File.Exists(Context.PlayerGameFilesBackupFolder + "\\System\\User.ini")) {
    var savePath = (Context.SavePath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\System\\User.ini");
    var savePkgOrigin = System.IO.Path.Combine(Context.PlayerGameFilesBackupFolder + "\\System\\User.ini");
    System.IO.File.Copy(savePkgOrigin, savePath, true);
  }

  var savePath = Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\System\\User.ini";
  Context.ModifySaveFile(savePath, savePath, Nucleus.SaveType.INI, [
    new Nucleus.IniSaveInfo("DefaultPlayer", "Name", Context.Nickname)
    // new Nucleus.IniSaveInfo("Engine.PlayerController", "DesiredFOV", "101.4"),
    // new Nucleus.IniSaveInfo("Engine.PlayerController", "DefaultFOV", "101.4"),
  ]);

  /////////////////////////

  //SERVER
  Context.RunAdditionalFiles(["1|" + Context.GetFolder(Nucleus.Folder.InstancedGameFolder) + "\\System\\NicksCoop_RunServer.bat"], false, 0, false, false);
  Context.RunAdditionalFiles(["1|" + Game.Folder + "\\checknucleus.bat"], false, 1, true, false);
};