/// <summary> /// Patches the server with every default working patch /// </summary> /// <param name="args">Arguments.</param> public static void DefaultProcess(string[] args) { Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine(Console.Title = String.Format("Open Terraria API patcher build {0}", Build)); Console.ForegroundColor = ConsoleColor.White; var isMono = Type.GetType("Mono.Runtime") != null; var inFile = InputFileName; var fileName = OutputName; var output = fileName + ".exe"; var patchFile = "OTA.dll"; // if (!File.Exists(inFile)) // { // var bin = Path.Combine(Environment.CurrentDirectory, "bin", "x86", "Debug", inFile); // if (File.Exists(bin)) // inFile = bin; // } // if (!File.Exists(patchFile)) // { // var bin = Path.Combine(Environment.CurrentDirectory, "bin", "x86", "Debug", patchFile); // if (File.Exists(bin)) // patchFile = bin; // } DirectoryInfo root = null; if (!String.IsNullOrEmpty(SolutionDirectory)) { root = new DirectoryInfo(SolutionDirectory); } if (null == root) { root = new DirectoryInfo(Environment.CurrentDirectory); while (root.GetDirectories().Where(x => x.Name == "Patcher").Count() == 0) { if (root.Parent == null) { if (String.IsNullOrEmpty(OTAProjectDirectory)) { Console.WriteLine("Failed to find root project directory"); Environment.Exit(1); return; } break; } root = root.Parent; } if (!String.IsNullOrEmpty(OTAProjectDirectory)) { root = new DirectoryInfo(Environment.CurrentDirectory); while (root.GetDirectories().Where(x => x.Name == OTAProjectDirectory).Count() == 0) { if (root.Parent == null) { Console.WriteLine("Failed to find root project directory using hint: " + OTAProjectDirectory); Environment.Exit(1); return; } root = root.Parent; } } } Console.WriteLine("Root directory: " + root.FullName); if (PatchMode == PatchMode.Server) { if (CopyProjectFiles) { if (CopyAPI) { Copy(root, "API", Environment.CurrentDirectory, "OTA", true); Copy(root, "API", Path.Combine(Environment.CurrentDirectory, LibrariesFolder), "Microsoft.Owin.Diagnostics", true); Copy(root, "API", Path.Combine(Environment.CurrentDirectory, LibrariesFolder), "Microsoft.Owin", true); Copy(root, "API", Path.Combine(Environment.CurrentDirectory, LibrariesFolder), "Microsoft.Owin.FileSystems", true); Copy(root, "API", Path.Combine(Environment.CurrentDirectory, LibrariesFolder), "Microsoft.Owin.Host.HttpListener", true); Copy(root, "API", Path.Combine(Environment.CurrentDirectory, LibrariesFolder), "Microsoft.Owin.Hosting", true); Copy(root, "API", Path.Combine(Environment.CurrentDirectory, LibrariesFolder), "Microsoft.Owin.Security", true); Copy(root, "API", Path.Combine(Environment.CurrentDirectory, LibrariesFolder), "Microsoft.Owin.Security.OAuth", true); Copy(root, "API", Path.Combine(Environment.CurrentDirectory, LibrariesFolder), "Microsoft.Owin.StaticFiles", true); Copy(root, "API", Path.Combine(Environment.CurrentDirectory, LibrariesFolder), "Newtonsoft.Json", true); Copy(root, "API", Path.Combine(Environment.CurrentDirectory, LibrariesFolder), "Owin", true); Copy(root, "API", Path.Combine(Environment.CurrentDirectory, LibrariesFolder), "System.Net.Http.Formatting", true); Copy(root, "API", Path.Combine(Environment.CurrentDirectory, LibrariesFolder), "System.Web.Http", true); Copy(root, "API", Path.Combine(Environment.CurrentDirectory, LibrariesFolder), "System.Web.Http.Owin", true); Copy(root, "API", Path.Combine(Environment.CurrentDirectory, LibrariesFolder), "EntityFramework", true); Copy(root, "API", Path.Combine(Environment.CurrentDirectory, LibrariesFolder), "EntityFramework.SqlServer", true); Copy(root, "API", Path.Combine(Environment.CurrentDirectory, LibrariesFolder), "Microsoft.AspNet.Identity.Core", true); Copy(root, "API", Path.Combine(Environment.CurrentDirectory, LibrariesFolder), "Microsoft.AspNet.Identity.EntityFramework", true); // Copy(root, "API", Path.Combine(Environment.CurrentDirectory, LibrariesFolder), "System.Data.SQLite", true); // Copy(root, "API", Path.Combine(Environment.CurrentDirectory, LibrariesFolder), "System.Data.SQLite.EF6", true); if (!String.IsNullOrEmpty(OTAProjectDirectory)) { Copy(new DirectoryInfo(Path.Combine(root.FullName, OTAProjectDirectory)), "API", Environment.CurrentDirectory, "OTA", true); } } // Copy(root, "TDSM-Core", Path.Combine(Environment.CurrentDirectory, "Plugins")); // Copy(root, "Binaries", Path.Combine(Environment.CurrentDirectory), "TDSM.API"); //Copy (root, "Restrict", Path.Combine (Environment.CurrentDirectory, "Plugins"), "RestrictPlugin"); Copy(root, "External", Path.Combine(Environment.CurrentDirectory, LibrariesFolder), "KopiLua", false); Copy(root, "External", Path.Combine(Environment.CurrentDirectory, LibrariesFolder), "NLua", false); Copy(root, "External", Path.Combine(Environment.CurrentDirectory, LibrariesFolder), "ICSharpCode.SharpZipLib", false); Copy(root, "Official", Environment.CurrentDirectory, "TerrariaServer", false); // Copy(root, "tdsm-core", Path.Combine(Environment.CurrentDirectory, LibrariesFolder), "Newtonsoft.Json", true); // Copy(root, "tdsm-web", Path.Combine(Environment.CurrentDirectory, "Plugins"), "tdsm-web", true); // Copy(root, "tdsm-mysql-connector", Path.Combine(Environment.CurrentDirectory, "Plugins"), "tdsm-mysql-connector", true); // Copy(root, "tdsm-sqlite-connector", Path.Combine(Environment.CurrentDirectory, "Plugins"), "tdsm-sqlite-connector", true); if (CopyDependencies != null) CopyDependencies.Invoke(null, new CopyDependenciesEventArgs() { RootDirectory = root }); } if (!File.Exists(inFile)) { //Download the supported vanilla software from our GitHub repo Console.WriteLine("The original Re-Logic TerrariaServer.exe is missing, download? [Y/n]"); if (Console.ReadKey(true).Key == ConsoleKey.Y) { //TODO add throbber Console.WriteLine("Download started..."); const String Url = "https://github.com/DeathCradle/Open-Terraria-API/raw/master/Official/TerrariaServer.exe"; using (var wc = new System.Net.WebClient()) { var started = DateTime.Now; try { wc.DownloadFile(Url, inFile); } catch (Exception e) { Console.WriteLine(e); Console.WriteLine("Press any key to exit..."); Console.ReadKey(true); return; } var duration = DateTime.Now - started; Console.WriteLine("Download completed in {0:c}", duration); } } else return; } } else if (PatchMode == PatchMode.Client) { if (CopyProjectFiles) { if (CopyAPI) { Copy(root, "API", Environment.CurrentDirectory, "OTA", true); if (!String.IsNullOrEmpty(OTAProjectDirectory)) { Copy(new DirectoryInfo(Path.Combine(root.FullName, OTAProjectDirectory)), "API", Environment.CurrentDirectory, "OTA", true); } } if (CopyDependencies != null) CopyDependencies.Invoke(null, new CopyDependenciesEventArgs() { RootDirectory = root }); } } var patcher = new Injector(inFile, patchFile); if (PatchMode == PatchMode.Server) { var noVersionCheck = args != null && args.Where(x => x.ToLower() == "-nover").Count() > 0; if (noVersionCheck != true) { var vers = patcher.GetAssemblyVersion(); if (vers != APIWrapper.TerrariaVersion) { Console.WriteLine("This patcher only supports Terraria {0}, but we have detected something else {1}.", APIWrapper.TerrariaVersion, vers); Console.Write("There's a high chance this will fail, continue? (y/n)"); if (Console.ReadKey(true).Key != ConsoleKey.Y) return; Console.WriteLine(); } } Console.Write("Opening up classes for API usage..."); patcher.MakeTypesPublic(true); patcher.MakeEverythingAccessible(); Console.Write("Ok\nHooking command line..."); patcher.PatchCommandLine(); Console.Write("Ok\nHooking senders..."); patcher.HookSenders(); Console.Write("Ok\nRemoving console handlers..."); patcher.RemoveConsoleHandler(); Console.Write("Ok\nRemoving mono incompatible code..."); patcher.SwapProcessPriority(); Console.Write("Ok\nSkipping sysmenus functions..."); patcher.SkipMenu(PatchMode); Console.Write("Ok\nPatching save paths..."); patcher.FixSavePath(); Console.Write("Ok\nHooking receive buffer..."); patcher.HookMessageBuffer(); Console.Write("Ok\nPatching XNA..."); patcher.PatchXNA(true); Console.Write("Ok\nPatching Steam..."); patcher.PatchSteam(); Console.Write("Ok\nHooking start..."); patcher.HookProgramStart(PatchMode); Console.Write("Ok\nHooking initialise..."); patcher.HookInitialise(); patcher.HookNetplayInitialise(); Console.Write("Ok\nHooking into world events..."); patcher.HookWorldEvents(); Console.Write("Ok\nHooking statusText..."); patcher.HookStatusText(); Console.Write("Ok\nHooking NetMessage..."); patcher.HookNetMessage(); Console.Write("Ok\nHooking Server events..."); patcher.HookUpdateServer(); patcher.HookDedServEnd(); Console.Write("Ok\nHooking NPC Spawning..."); patcher.HookNPCSpawning(); Console.Write("Ok\nHooking config..."); patcher.HookConfig(); Console.Write("Ok\nFixing statusText..."); patcher.FixStatusTexts(); Console.Write("Ok\nHooking invasions..."); patcher.HookInvasions(); patcher.HookInvasionWarning(); // Console.Write("Ok\nEnabling rain..."); // patcher.EnableRaining(); Console.Write("Ok\nFixing world removal..."); patcher.PathFileIO(); Console.Write("Ok\nRouting network message validity..."); patcher.HookValidPacketState(); Console.Write("Ok\nRemoving port forwarding functionality..."); patcher.FixNetplay(); Console.Write("Ok\nFixing NPC AI crashes..."); patcher.FixRandomErrors(); // patcher.DetectMissingXNA(); // patcher.HookWorldFile_DEBUG(); Console.Write("Ok\n"); patcher.InjectHooks<ServerHookAttribute>(); Console.Write("Ok\nUpdating to .NET v4.5.1..."); patcher.SwitchFramework("4.5.1"); Console.Write("Ok\nPatching Newtonsoft.Json..."); patcher.PatchJSON(); Console.Write("Ok\nPutting Terraria on a diet..."); patcher.SwapToVanillaTile(); //Holy shit batman! it works patcher.InjectTileSet(); Console.Write("Ok\n"); if (PerformPatch != null) PerformPatch.Invoke(null, new InjectorEventArgs() { Injector = patcher }); //TODO repace Terraria's Console.SetTitles } else if (PatchMode == PatchMode.Client) { Console.Write("Hooking start..."); patcher.HookProgramStart(PatchMode); Console.Write("Opening up classes for API usage..."); patcher.MakeTypesPublic(true); patcher.MakeEverythingAccessible(); Console.Write("Ok\nHooking senders..."); patcher.HookSenders(); // Console.Write("Ok\nPutting Terraria on a diet..."); // patcher.SwapToVanillaTile(); //Holy shit batman! it works // patcher.InjectTileSet(); Console.Write("Ok\nInjecting hooks"); patcher.InjectHooks<ClientHookAttribute>(); Console.Write("Ok\n"); if (PerformPatch != null) PerformPatch.Invoke(null, new InjectorEventArgs() { Injector = patcher }); } Console.ForegroundColor = ConsoleColor.DarkGreen; Console.Write("Saving to {0}...", output); patcher.Save(PatchMode, output, Build, OTAGuid, fileName, SwapOTAReferences); patcher.Dispose(); Console.WriteLine("Ok"); // #if SERVER //#if DEBUG && SERVER if (CopyProjectFiles) { Console.Write("Updating Binaries folder..."); UpdateBinaries(); Console.WriteLine("Ok"); } //#endif Console.ForegroundColor = ConsoleColor.DarkGreen; Console.WriteLine("You may now run {0} as you would normally.", output); if (PromptToRun) { var noRun = args != null && args.Where(x => x.ToLower() == "-norun").Count() > 0; if (!noRun) { PromptUserToRun(output, isMono); } } }