diff --git a/SPTarkov.Server/Program.cs b/SPTarkov.Server/Program.cs index 78e9193c..923c7b30 100644 --- a/SPTarkov.Server/Program.cs +++ b/SPTarkov.Server/Program.cs @@ -1,4 +1,5 @@ using System.Runtime; +using System.Runtime.InteropServices; using SPTarkov.Common.Semver; using SPTarkov.Common.Semver.Implementations; using SPTarkov.DI; @@ -46,6 +47,8 @@ public static class Program try { + SetConsoleOutputMode(); + var watermark = serviceProvider.GetService(); // Initialize Watermark watermark?.Initialize(); @@ -132,4 +135,38 @@ public static class Program var modValidator = provider.GetRequiredService(); return modValidator.ValidateAndSort(mods); } + + private static void SetConsoleOutputMode() + { + if (!OperatingSystem.IsWindows()) + { + return; + } + + const int stdOutputHandle = -11; + const uint enableVirtualTerminalProcessing = 0x0004; + + var handle = GetStdHandle(stdOutputHandle); + + if (!GetConsoleMode(handle, out var consoleMode)) + { + throw new Exception("Unable to get console mode"); + } + + consoleMode |= enableVirtualTerminalProcessing; + + if (!SetConsoleMode(handle, consoleMode)) + { + throw new Exception("Unable to set console mode"); + } + } + + [DllImport("kernel32.dll", SetLastError = true)] + private static extern IntPtr GetStdHandle(int nStdHandle); + + [DllImport("kernel32.dll")] + private static extern bool GetConsoleMode(IntPtr hConsoleHandle, out uint lpMode); + + [DllImport("kernel32.dll")] + private static extern bool SetConsoleMode(IntPtr hConsoleHandle, uint dwMode); }