Beispiel #1
0
        /// <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 == SupportType.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, Path.Combine("Binaries", "Libraries"), Path.Combine(Environment.CurrentDirectory, LibrariesFolder), "System.Data.SQLite", false);
                        Copy(root, Path.Combine("Binaries", "Libraries"), Path.Combine(Environment.CurrentDirectory, LibrariesFolder), "System.Data.SQLite.EF6", false);

                        if (!String.IsNullOrEmpty(OTAProjectDirectory))
                        {
                            Copy(new DirectoryInfo(Path.Combine(root.FullName, OTAProjectDirectory)), "API", Environment.CurrentDirectory, "OTA", true);
                        }

                        var binaries = Path.Combine(root.FullName, "Binaries");
                        foreach (var item in new string[] { "sqlite3.dll", "sqlite3.def" })
                        {
                            var ipath = Path.Combine(binaries, item);
                            var tpath = Path.Combine(Environment.CurrentDirectory, item);
                            if (!File.Exists(tpath)) File.Copy(ipath, tpath);
                        }
                    }

                    //            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 == SupportType.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 == SupportType.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();
                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");
                Console.WriteLine("Running the patches...");
                patcher.InjectHooks(SupportType.Server);
                Console.WriteLine("All patches ran.");

                Console.Write("Updating 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 == SupportType.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");
                Console.WriteLine("Running the patches...");
                patcher.InjectHooks(SupportType.Client);
                Console.WriteLine("All patches ran.");

                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);
                }
            }
        }
 public static void ExampleExtension(this OTA.Patcher.Injector injector)
 {
     //Modify IL or whatever
 }