using HarmonyLib; using Steamworks; using System; using System.Threading; namespace SteamTransportTest; /// /// entry point for testing. /// should probably make this a separate project since it copies over steam api. idc rn /// public static class Program { public static void Main(string[] args) { Console.WriteLine("This is the test mode for the steam transport"); try { // copied from qsbcore and steamworks.net docs { if (!Packsize.Test()) { Console.Error.WriteLine("[Steamworks.NET] Packsize Test returned false, the wrong version of Steamworks.NET is being run in this platform."); } if (!DllCheck.Test()) { Console.Error.WriteLine("[Steamworks.NET] DllCheck Test returned false, One or more of the Steamworks binaries seems to be the wrong version."); } // yes, these have to be the same. even for connecting to ip address Environment.SetEnvironmentVariable("SteamAppId", "480"); Environment.SetEnvironmentVariable("SteamGameId", "480"); var m_bInitialized = SteamAPI.Init(); if (!m_bInitialized) { Console.Error.WriteLine("[Steamworks.NET] SteamAPI_Init() failed. Refer to Valve's documentation or the comment above this line for more information."); return; } SteamClient.SetWarningMessageHook((severity, text) => Console.WriteLine(text)); } Console.WriteLine("press 1 for server, 2 for client"); switch (Console.ReadKey(true).KeyChar) { case '1': Console.WriteLine("server"); DoServer(); break; case '2': Console.WriteLine("client"); DoClient(); break; } } finally { SteamAPI.Shutdown(); Console.WriteLine("Done. Press any key to exit"); Console.ReadKey(); } } private static void DoServer() { var transport = new SteamTransport.SteamTransport(); transport.Log = Console.WriteLine; transport.TestIpAddress = "127.0.0.1:1234"; // make timeout for client detecting server drop different than timeout for server detecting client drop transport.Timeout = 5000; transport.DoFakeNetworkErrors = false; transport.OnServerError = (conn, error, s) => Console.Error.WriteLine($"ERROR {conn} {error} {s}"); var theConn = -1; transport.OnServerConnected = conn => theConn = conn; transport.OnServerDataSent = (conn, bytes, i) => Console.WriteLine($"SEND {conn} {i} {bytes.Join()}"); transport.OnServerDataReceived = (conn, bytes, i) => Console.WriteLine($"RECV {conn} {i} {bytes.Join()}"); transport.ServerStart(); try { Console.WriteLine("press c to close, s to send, d to disconnect"); var running = true; while (running) { transport.ServerEarlyUpdate(); if (Console.KeyAvailable) { switch (Console.ReadKey(true).KeyChar) { case 'c': // running = false; transport.ServerDisconnect(theConn); // mirror does this for us transport.ServerStop(); break; case 's': transport.ServerSend(theConn, new ArraySegment(new byte[] { 1, 2, (byte)DateTime.Now.Millisecond, 4, 5 }, 1, 5 - 1)); break; case 'd': transport.ServerDisconnect(theConn); break; } } SteamAPI.RunCallbacks(); transport.ServerLateUpdate(); Thread.Sleep(10); } } finally { transport.ServerDisconnect(theConn); // mirror does this for us transport.ServerStop(); } } private static void DoClient() { var transport = new SteamTransport.SteamTransport(); transport.Log = Console.WriteLine; transport.TestIpAddress = "127.0.0.1:1234"; transport.Timeout = 20000; transport.DoFakeNetworkErrors = true; transport.OnClientError = (error, s) => Console.Error.WriteLine($"ERROR {error} {s}"); transport.OnClientDataSent = (bytes, i) => Console.WriteLine($"SEND {i} {bytes.Join()}"); transport.OnClientDataReceived = (bytes, i) => Console.WriteLine($"RECV {i} {bytes.Join()}"); transport.ClientConnect("76561198150564286"); try { Console.WriteLine("press c to close, s to send"); var running = true; // transport.OnClientDisconnected = () => running = false; // mirror normally does this while (running) { transport.ClientEarlyUpdate(); if (Console.KeyAvailable) { switch (Console.ReadKey(true).KeyChar) { case 'c': // running = false; transport.ClientDisconnect(); break; case 's': transport.ClientSend(new ArraySegment(new byte[] { 1, 2, (byte)DateTime.Now.Millisecond, 4, 5 }, 1, 5 - 1), 1); break; } } SteamAPI.RunCallbacks(); transport.ClientLateUpdate(); Thread.Sleep(10); } } finally { transport.ClientDisconnect(); } } }