using System; using System.Text; using IWshRuntimeLibrary; using System.Diagnostics; using System.Windows.Forms; using System.Net; using System.IO; using DiscordRPC; namespace ARCHBLOXLauncherGUI { public partial class Form1 : Form { private void CreateShortcut() { // create shortcut on user's desktop object shDesktop = (object)"Desktop"; WshShell shell = new WshShell(); string shortcutAddress = (string)shell.SpecialFolders.Item(ref shDesktop) + @"\ARCHBLOX Launcher.lnk"; IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(shortcutAddress); shortcut.Description = "ARCHBLOX Player"; shortcut.TargetPath = ARCHBLOXLauncherGUI.Extensions.GetExecutablePath(); shortcut.Save(); } // variables bool exitafterarg = false; bool rbxl = false; private DiscordRpcClient client; bool ingame = false; bool hosting = false; private static WebClient wc = new WebClient(); static byte[] raw = wc.DownloadData("http://archblox.com/client/version.txt"); static string webData = Encoding.UTF8.GetString(raw); static string version_string = webData; static string folderPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), @"Archblx\", @"Versions\"); static string clientPath = Path.Combine(folderPath, version_string + @"\"); static string filePath = Path.Combine(clientPath, "ArchbloxPlayerBeta.exe"); delegate void UnhandledExceptionEventHandler(object sender, UnhandledExceptionEventArgs e); public Form1() { InitializeComponent(); // Check for a internet connection try { wc.DownloadData("http://archblox.com/client/version.txt"); } catch { MessageBox.Show("An error occoured while starting ARCHBLOX\n\nDetails: HttpOpenRequest failed for GET http://archblox.com/client/version.txt, Error ID: 6", "ARCHBLOX", MessageBoxButtons.OK, MessageBoxIcon.Error); Environment.Exit(0); } ARCHBLOXProtocol.ARCHBLOXURIProtocol.Register(); CreateShortcut(); var lastword = ""; var info1 = ""; var info2 = ""; string[] args = ARCHBLOXProtocol.SharedVariables.Arguments.Split('/'); // check to see if uri/arguments were used foreach (var word in args) { if (lastword == "host") { if (!System.IO.File.Exists(filePath)) { DialogResult res = MessageBox.Show("An error occoured while starting ARCHBLOX\n\nDetails: Out of date client! To update the client select Yes.", "ARCHBLOX", MessageBoxButtons.YesNo, MessageBoxIcon.Error); if (res == DialogResult.Yes) { ARCHBLOXLauncherGUI.Form2 form2 = new ARCHBLOXLauncherGUI.Form2(); form2.Show(); } else { Environment.Exit(0); } } exitafterarg = true; lastword = "stop"; string[] info = word.Split(':'); foreach (var word2 in info) { if (info1 == "") { info1 = word2; } else { info2 = word2; } } if (info1 == "" || info2 == "") { MessageBox.Show("An error occoured while starting ARCHBLOX\n\nDetails: Invalid Arguments, Error ID: 500", "ARCHBLOX", MessageBoxButtons.OK, MessageBoxIcon.Error); Environment.Exit(0); } var pProcess = new Process(); hosting = true; pProcess.StartInfo.FileName = filePath; pProcess.StartInfo.Arguments = "-a \"http://www.morblox.us/\" -j \"http://www.morblox.us/game/gameserver.php?port=" + info1 + "&rbxl=" + info2 + "\" -t \"1\""; pProcess.StartInfo.UseShellExecute = false; pProcess.StartInfo.RedirectStandardOutput = true; pProcess.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal; pProcess.StartInfo.CreateNoWindow = false; pProcess.Start(); MessageBox.Show("Starting game server on port " + info1 + " using " + info2, "ARCHBLOX", MessageBoxButtons.OK, MessageBoxIcon.Information); } if (lastword == "join") { if (!System.IO.File.Exists(filePath)) { DialogResult res = MessageBox.Show("An error occoured while starting ARCHBLOX\n\nDetails: Out of date client! To update the client, select Yes.", "ARCHBLOX", MessageBoxButtons.YesNo, MessageBoxIcon.Error); if (res == DialogResult.Yes) { ARCHBLOXLauncherGUI.Form2 form2 = new ARCHBLOXLauncherGUI.Form2(); form2.Show(); } else { Environment.Exit(0); } } exitafterarg = true; lastword = "stop"; string[] info = word.Split(':'); foreach (var word2 in info) { if (info1 == "") { info1 = word2; } else { info2 = word2; } } if (info1 == "" || info2 == "") { MessageBox.Show("An error occoured while starting ARCHBLOX\n\nDetails: Invalid Arguments, Error ID: 500", "ARCHBLOX", MessageBoxButtons.OK, MessageBoxIcon.Error); Environment.Exit(0); } var pProcess = new Process(); hosting = true; pProcess.StartInfo.FileName = filePath; pProcess.StartInfo.Arguments = "-a \"http://www.morblox.us/\" -j \"http://www.morblox.us/game/join.ashx?port=" + info1 + "&ip=" + info2 + "\" -t \"1\""; pProcess.StartInfo.UseShellExecute = false; pProcess.StartInfo.RedirectStandardOutput = true; pProcess.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal; pProcess.StartInfo.CreateNoWindow = false; pProcess.Start(); MessageBox.Show("Joining " + info2 + ":" + info1, "ARCHBLOX", MessageBoxButtons.OK, MessageBoxIcon.Information); } if (word == "install") { ARCHBLOXLauncherGUI.Form2 form2 = new ARCHBLOXLauncherGUI.Form2(); form2.Show(); } if (word == "") { } else { lastword = word; } } if (exitafterarg == true) { // close program Environment.Exit(0); } client = new DiscordRpcClient("996030605106090006"); client.Initialize(); client.SetPresence(new RichPresence() { Details = "Launcher", State = "Browsing through the menus...", Timestamps = Timestamps.Now, Assets = new Assets() { LargeImageKey = "launcher", SmallImageKey = "archblox", } }); } private void button1_Click(object sender, EventArgs e) { // hosting string phrase = textBox2.Text; string[] words = phrase.Split('.'); string sWord = ""; foreach (var word in words) { sWord = word.ToLower(); if (sWord == "rbxl") { rbxl = true; } else { rbxl = false; } } if (!System.IO.File.Exists(filePath)) { DialogResult res = MessageBox.Show("An error occoured while starting ARCHBLOX\n\nDetails: Out of date client! To update the client, select Yes or select the Install button on the main menu.", "ARCHBLOX", MessageBoxButtons.YesNo, MessageBoxIcon.Error); if (res == DialogResult.Yes) { ARCHBLOXLauncherGUI.Form2 form2 = new ARCHBLOXLauncherGUI.Form2(); form2.Show(); } } else if (textBox1.Text == "" || textBox2.Text == "") { MessageBox.Show("Please fill in all of the text boxes.", "ARCHBLOX", MessageBoxButtons.OK, MessageBoxIcon.Information); } else if (rbxl == false) { MessageBox.Show("An error occoured while starting ARCHBLOX\n\nDetails: Invalid .RBXL, " + sWord + " is not a supported file format.", "ARCHBLOX", MessageBoxButtons.OK, MessageBoxIcon.Error); } else { // Check if RADMIN VPN ip address to protect port forwarders from exposing their ip address and potentionally causing the server hoster to be doxxed/ddossed string phrase2 = serverip.Text; string[] words2 = phrase2.Split('.'); string sWord2 = ""; bool radmin = false; foreach (var word in words2) { sWord2 = word.ToLower(); if (sWord2 == "26" || sWord2 == "localhost" || sWord2 == "192" || sWord2 == "10" || sWord2 == "127") { radmin = true; } else { radmin = false; } break; } if (radmin == false) { phrase2 = "[IP HIDDEN]"; // HAHAHA DUDE THESE DOXXERS AND DDOSSERS ARE SO FUCKING FUNNY THEY MAKE ME WANT TO MERGE WITHOUT LOOKING!!!! } void ProcessExitHandler(object sender, EventArgs args) { hosting = false; if (ingame == true) { client.SetPresence(new DiscordRPC.RichPresence() { Details = "Playing a Game", State = "on " + phrase2 + ":" + serverport.Text, Timestamps = Timestamps.Now, Assets = new Assets() { LargeImageKey = "ingame", SmallImageKey = "archblox", } }); } else { client.SetPresence(new DiscordRPC.RichPresence() { Details = "Launcher", State = "Browsing through the menus...", Timestamps = Timestamps.Now, Assets = new Assets() { LargeImageKey = "launcher", SmallImageKey = "archblox", } }); } } var pProcess = new Process(); hosting = true; pProcess.StartInfo.FileName = filePath; pProcess.StartInfo.Arguments = "-a \"http://www.morblox.us/\" -j \"http://www.morblox.us/game/gameserver.php?port=" + textBox1.Text + "&rbxl=" + textBox2.Text + "\" -t \"1\""; pProcess.StartInfo.UseShellExecute = false; pProcess.StartInfo.RedirectStandardOutput = true; pProcess.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal; pProcess.StartInfo.CreateNoWindow = false; pProcess.Start(); pProcess.EnableRaisingEvents = true; pProcess.Exited += new EventHandler(ProcessExitHandler); var random = new Random(); client.SetPresence(new DiscordRPC.RichPresence() { Details = "Hosting", State = textBox2.Text, Timestamps = Timestamps.Now, Assets = new Assets() { LargeImageKey = "host", SmallImageKey = "archblox", } }); MessageBox.Show("Starting game server on port " + textBox1.Text + " using " + textBox2.Text, "ARCHBLOX", MessageBoxButtons.OK, MessageBoxIcon.Information); } } private void button2_Click(object sender, EventArgs e) { // joining if (!System.IO.File.Exists(filePath)) { DialogResult res = MessageBox.Show("An error occoured while starting ARCHBLOX\n\nDetails: Out of date client! To update the client, select Yes or select the Install button on the main menu.", "ARCHBLOX", MessageBoxButtons.YesNo, MessageBoxIcon.Error); if (res == DialogResult.Yes) { ARCHBLOXLauncherGUI.Form2 form2 = new ARCHBLOXLauncherGUI.Form2(); form2.Show(); } } else if (serverip.Text == "" || serverport.Text == "") { MessageBox.Show("Please fill in all of the text boxes.", "ARCHBLOX", MessageBoxButtons.OK, MessageBoxIcon.Error); } else { void ProcessExitHandler(object sender, EventArgs args) { ingame = false; if (hosting == true) { client.SetPresence(new DiscordRPC.RichPresence() { Details = "Hosting", State = textBox2.Text, Timestamps = Timestamps.Now, Assets = new Assets() { LargeImageKey = "host", SmallImageKey = "archblox", } }); } else { client.SetPresence(new DiscordRPC.RichPresence() { Details = "Launcher", State = "Browsing through the menus...", Timestamps = Timestamps.Now, Assets = new Assets() { LargeImageKey = "launcher", SmallImageKey = "archblox", } }); } } var pProcess = new Process(); ingame = true; pProcess.StartInfo.FileName = filePath; pProcess.StartInfo.Arguments = "-a \"http://www.morblox.us/\" -j \"http://www.morblox.us/game/join.ashx?port=" + serverport.Text + "&ip=" + serverip.Text + "\" -t \"1\""; pProcess.StartInfo.UseShellExecute = false; pProcess.StartInfo.RedirectStandardOutput = true; pProcess.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal; pProcess.StartInfo.CreateNoWindow = false; pProcess.Start(); pProcess.EnableRaisingEvents = true; pProcess.Exited += new EventHandler(ProcessExitHandler); // Check if RADMIN VPN ip address to protect port forwarders from exposing their ip address and potentionally causing the server hoster to be doxxed/ddossed string phrase2 = serverip.Text; string[] words2 = phrase2.Split('.'); string sWord2 = ""; bool radmin = false; foreach (var word in words2) { sWord2 = word.ToLower(); if (sWord2 == "26" || sWord2 == "localhost" || sWord2 == "192" || sWord2 == "10" || sWord2 == "127") { radmin = true; } else { radmin = false; } break; } if (radmin == false) { phrase2 = "[IP HIDDEN]"; // HAHAHA DUDE THESE DOXXERS AND DDOSSERS ARE SO FUCKING FUNNY THEY MAKE ME WANT TO MERGE WITHOUT LOOKING!!!! } client.SetPresence(new DiscordRPC.RichPresence() { Details = "Playing a Game", State = "on " + phrase2 + ":" + serverport.Text, Timestamps = Timestamps.Now, Assets = new Assets() { LargeImageKey = "ingame", SmallImageKey = "archblox", } }); ; MessageBox.Show("Joining " + serverip.Text + ":" + serverport.Text, "ARCHBLOX", MessageBoxButtons.OK, MessageBoxIcon.Information); } } private void button3_Click(object sender, EventArgs e) { // ask user to open dialog OpenFileDialog dialog = new OpenFileDialog(); dialog.Title = "Choose a RBXL..."; dialog.AddExtension = true; dialog.Filter = "ROBLOX Place File (*.rbxl)| *.rbxl"; if (DialogResult.OK == dialog.ShowDialog()) { // check if it is a rbxl string word = Path.GetExtension(dialog.FileName); word = word.ToLower(); if (word == ".rbxl") { // Thanks to ROBLOX LEGACY PLACE CONVERTER by BakonBot for the binary rbxl format detection. string[] file = System.IO.File.ReadAllLines(dialog.FileName); foreach (var line in file) { if (line.Contains("