#region Usings #if LAUNCHER || CMD || URI || BASICLAUNCHER using NLog; #endif using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.Drawing.Imaging; using System.Globalization; using System.IO; using System.Linq; using System.Management; using System.Net; using System.Reflection; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Windows.Forms; using System.Xml; using System.Xml.Linq; #endregion #region Global Functions public class GlobalFuncs { public static void ReadInfoFile(string infopath, bool other = false, string exepath = "") { //READ string versionbranch, defaultclient, defaultmap, regclient1, regclient2, extendedversionnumber, extendedversiontemplate, extendedversionrevision, extendedversioneditchangelog, isLite, initialBootup; INIFile ini = new INIFile(infopath); string section = "ProgramInfo"; //not using the GlobalVars definitions as those are empty until we fill them in. versionbranch = ini.IniReadValue(section, "Branch", "0.0"); defaultclient = ini.IniReadValue(section, "DefaultClient", "2009E"); defaultmap = ini.IniReadValue(section, "DefaultMap", "Dev - Baseplate2048.rbxl"); regclient1 = ini.IniReadValue(section, "UserAgentRegisterClient1", "2007M"); regclient2 = ini.IniReadValue(section, "UserAgentRegisterClient2", "2009L"); extendedversionnumber = ini.IniReadValue(section, "ExtendedVersionNumber", "False"); extendedversioneditchangelog = ini.IniReadValue(section, "ExtendedVersionEditChangelog", "False"); extendedversiontemplate = ini.IniReadValue(section, "ExtendedVersionTemplate", "%version%"); extendedversionrevision = ini.IniReadValue(section, "ExtendedVersionRevision", "-1"); isLite = ini.IniReadValue(section, "IsLite", "False"); initialBootup = ini.IniReadValue(section, "InitialBootup", "True"); GlobalVars.ProgramInformation.IsLite = Convert.ToBoolean(isLite); try { GlobalVars.ExtendedVersionNumber = Convert.ToBoolean(extendedversionnumber); if (GlobalVars.ExtendedVersionNumber) { if (other) { if (!string.IsNullOrWhiteSpace(exepath)) { var versionInfo = FileVersionInfo.GetVersionInfo(exepath); GlobalVars.ProgramInformation.Version = extendedversiontemplate.Replace("%version%", versionbranch) .Replace("%build%", versionInfo.ProductBuildPart.ToString()) .Replace("%revision%", versionInfo.FilePrivatePart.ToString()) .Replace("%extended-revision%", (!extendedversionrevision.Equals("-1") ? extendedversionrevision : "")) .Replace("%lite%", (GlobalVars.ProgramInformation.IsLite ? " (Lite)" : "")); } else { return; } } else { GlobalVars.ProgramInformation.Version = extendedversiontemplate.Replace("%version%", versionbranch) .Replace("%build%", Assembly.GetExecutingAssembly().GetName().Version.Build.ToString()) .Replace("%revision%", Assembly.GetExecutingAssembly().GetName().Version.Revision.ToString()) .Replace("%extended-revision%", (!extendedversionrevision.Equals("-1") ? extendedversionrevision : "")) .Replace("%lite%", (GlobalVars.ProgramInformation.IsLite ? " (Lite)" : "")); } bool changelogedit = Convert.ToBoolean(extendedversioneditchangelog); if (changelogedit) { string changelog = GlobalPaths.BasePath + "\\changelog.txt"; if (File.Exists(changelog)) { string[] changeloglines = File.ReadAllLines(changelog); if (!changeloglines[0].Equals(GlobalVars.ProgramInformation.Version)) { changeloglines[0] = GlobalVars.ProgramInformation.Version; File.WriteAllLines(changelog, changeloglines); } } } } else { GlobalVars.ProgramInformation.Version = versionbranch; } GlobalVars.ProgramInformation.Branch = versionbranch; GlobalVars.ProgramInformation.DefaultClient = defaultclient; GlobalVars.ProgramInformation.DefaultMap = defaultmap; GlobalVars.ProgramInformation.RegisterClient1 = regclient1; GlobalVars.ProgramInformation.RegisterClient2 = regclient2; GlobalVars.ProgramInformation.InitialBootup = Convert.ToBoolean(initialBootup); GlobalVars.UserConfiguration.SelectedClient = GlobalVars.ProgramInformation.DefaultClient; GlobalVars.UserConfiguration.Map = GlobalVars.ProgramInformation.DefaultMap; GlobalVars.UserConfiguration.MapPath = GlobalPaths.MapsDir + @"\\" + GlobalVars.ProgramInformation.DefaultMap; GlobalVars.UserConfiguration.MapPathSnip = GlobalPaths.MapsDirBase + @"\\" + GlobalVars.ProgramInformation.DefaultMap; } #if URI || LAUNCHER || CMD || BASICLAUNCHER catch (Exception ex) { LogExceptions(ex); #else catch (Exception) { #endif ReadInfoFile(infopath, other); } } public static void TurnOffInitialSequence() { //READ INIFile ini = new INIFile(GlobalPaths.ConfigDir + "\\" + GlobalPaths.InfoName); string section = "ProgramInfo"; string initialBootup = ini.IniReadValue(section, "InitialBootup", "True"); if (Convert.ToBoolean(initialBootup) == true) { ini.IniWriteValue(section, "InitialBootup", "False"); } } public static string ConfigUseOldValIfExists(INIFile ini, string section, string oldKey, string newKey, string val, bool write) { if (write) { if (!ini.IniValueExists(newKey)) { if (GlobalVars.ProgramInformation.InitialBootup) { if (ini.IniValueExists(oldKey)) { ini.IniWriteValue(section, oldKey, val); } else { ini.IniWriteValue(section, newKey, val); } } else { ini.IniWriteValue(section, oldKey, val); } } else { ini.IniWriteValue(section, newKey, val); } return ""; } else { if (ini.IniValueExists(newKey)) { return ini.IniReadValue(section, newKey, val); } else { return ini.IniReadValue(section, oldKey, val); } } } private static int ValueInt(string val, int defaultVal) { int res; if (int.TryParse(val, out res)) { return Convert.ToInt32(val); } else { return defaultVal; } } private static bool ValueBool(string val, bool defaultVal) { bool res; if (bool.TryParse(val, out res)) { return Convert.ToBoolean(val); } else { return defaultVal; } } public static void Config(string cfgpath, bool write, bool doubleCheck = false) { if (write) { //WRITE INIFile ini = new INIFile(cfgpath); string section = "Config"; ini.IniWriteValue(section, "CloseOnLaunch", GlobalVars.UserConfiguration.CloseOnLaunch.ToString()); ini.IniWriteValue(section, "UserID", GlobalVars.UserConfiguration.UserID.ToString()); ini.IniWriteValue(section, "PlayerName", GlobalVars.UserConfiguration.PlayerName.ToString()); ini.IniWriteValue(section, "SelectedClient", GlobalVars.UserConfiguration.SelectedClient.ToString()); ini.IniWriteValue(section, "Map", GlobalVars.UserConfiguration.Map.ToString()); ini.IniWriteValue(section, "RobloxPort", GlobalVars.UserConfiguration.RobloxPort.ToString()); ini.IniWriteValue(section, "PlayerLimit", GlobalVars.UserConfiguration.PlayerLimit.ToString()); ini.IniWriteValue(section, "UPnP", GlobalVars.UserConfiguration.UPnP.ToString()); ini.IniWriteValue(section, "DiscordRichPresence", GlobalVars.UserConfiguration.DiscordPresence.ToString()); ini.IniWriteValue(section, "MapPath", GlobalVars.UserConfiguration.MapPath.ToString()); ini.IniWriteValue(section, "MapPathSnip", GlobalVars.UserConfiguration.MapPathSnip.ToString()); ini.IniWriteValue(section, "GraphicsMode", ((int)GlobalVars.UserConfiguration.GraphicsMode).ToString()); ini.IniWriteValue(section, "ReShade", GlobalVars.UserConfiguration.ReShade.ToString()); ini.IniWriteValue(section, "QualityLevel", ((int)GlobalVars.UserConfiguration.QualityLevel).ToString()); ini.IniWriteValue(section, "Style", ((int)GlobalVars.UserConfiguration.LauncherStyle).ToString()); ini.IniWriteValue(section, "AlternateServerIP", GlobalVars.UserConfiguration.AlternateServerIP.ToString()); ini.IniWriteValue(section, "DisableReshadeDelete", GlobalVars.UserConfiguration.DisableReshadeDelete.ToString()); ini.IniWriteValue(section, "ShowServerNotifications", GlobalVars.UserConfiguration.ShowServerNotifications.ToString()); ini.IniWriteValue(section, "ServerBrowserServerName", GlobalVars.UserConfiguration.ServerBrowserServerName.ToString()); ini.IniWriteValue(section, "ServerBrowserServerAddress", GlobalVars.UserConfiguration.ServerBrowserServerAddress.ToString()); ini.IniWriteValue(section, "ClientLaunchPriority", ((int)GlobalVars.UserConfiguration.Priority).ToString()); ini.IniWriteValue(section, "FirstServerLaunch", GlobalVars.UserConfiguration.FirstServerLaunch.ToString()); ini.IniWriteValue(section, "NewGUI", GlobalVars.UserConfiguration.NewGUI.ToString()); ConfigUseOldValIfExists(ini, section, "ItemMakerDisableHelpMessage", "AssetSDKDisableHelpMessage", GlobalVars.UserConfiguration.DisabledAssetSDKHelp.ToString(), write); ConfigUseOldValIfExists(ini, section, "AssetLocalizerSaveBackups", "AssetSDKFixerSaveBackups", GlobalVars.UserConfiguration.AssetSDKFixerSaveBackups.ToString(), write); } else { try { //READ string closeonlaunch, userid, name, selectedclient, map, port, limit, upnp, disablehelpmessage, discord, mappath, mapsnip, graphics, reshade, qualitylevel, style, savebackups, altIP, disReshadeDel, showNotifs, SB_Name, SB_Address, priority, firstServerLaunch, newgui; INIFile ini = new INIFile(cfgpath); string section = "Config"; closeonlaunch = ini.IniReadValue(section, "CloseOnLaunch", GlobalVars.UserConfiguration.CloseOnLaunch.ToString()); userid = ini.IniReadValue(section, "UserID", GlobalVars.UserConfiguration.UserID.ToString()); name = ini.IniReadValue(section, "PlayerName", GlobalVars.UserConfiguration.PlayerName.ToString()); selectedclient = ini.IniReadValue(section, "SelectedClient", GlobalVars.UserConfiguration.SelectedClient.ToString()); map = ini.IniReadValue(section, "Map", GlobalVars.UserConfiguration.Map.ToString()); port = ini.IniReadValue(section, "RobloxPort", GlobalVars.UserConfiguration.RobloxPort.ToString()); limit = ini.IniReadValue(section, "PlayerLimit", GlobalVars.UserConfiguration.PlayerLimit.ToString()); upnp = ini.IniReadValue(section, "UPnP", GlobalVars.UserConfiguration.UPnP.ToString()); discord = ini.IniReadValue(section, "DiscordRichPresence", GlobalVars.UserConfiguration.DiscordPresence.ToString()); mappath = ini.IniReadValue(section, "MapPath", GlobalVars.UserConfiguration.MapPath.ToString()); mapsnip = ini.IniReadValue(section, "MapPathSnip", GlobalVars.UserConfiguration.MapPathSnip.ToString()); graphics = ini.IniReadValue(section, "GraphicsMode", ((int)GlobalVars.UserConfiguration.GraphicsMode).ToString()); reshade = ini.IniReadValue(section, "ReShade", GlobalVars.UserConfiguration.ReShade.ToString()); qualitylevel = ini.IniReadValue(section, "QualityLevel", ((int)GlobalVars.UserConfiguration.QualityLevel).ToString()); style = ini.IniReadValue(section, "Style", ((int)GlobalVars.UserConfiguration.LauncherStyle).ToString()); altIP = ini.IniReadValue(section, "AlternateServerIP", GlobalVars.UserConfiguration.AlternateServerIP.ToString()); disReshadeDel = ini.IniReadValue(section, "DisableReshadeDelete", GlobalVars.UserConfiguration.DisableReshadeDelete.ToString()); showNotifs = ini.IniReadValue(section, "ShowServerNotifications", GlobalVars.UserConfiguration.ShowServerNotifications.ToString()); SB_Name = ini.IniReadValue(section, "ServerBrowserServerName", GlobalVars.UserConfiguration.ServerBrowserServerName.ToString()); SB_Address = ini.IniReadValue(section, "ServerBrowserServerAddress", GlobalVars.UserConfiguration.ServerBrowserServerAddress.ToString()); priority = ini.IniReadValue(section, "ClientLaunchPriority", ((int)GlobalVars.UserConfiguration.Priority).ToString()); firstServerLaunch = ini.IniReadValue(section, "FirstServerLaunch", GlobalVars.UserConfiguration.FirstServerLaunch.ToString()); newgui = ini.IniReadValue(section, "NewGUI", GlobalVars.UserConfiguration.NewGUI.ToString()); disablehelpmessage = ConfigUseOldValIfExists(ini, section, "ItemMakerDisableHelpMessage", "AssetSDKDisableHelpMessage", GlobalVars.UserConfiguration.DisabledAssetSDKHelp.ToString(), write); savebackups = ConfigUseOldValIfExists(ini, section, "AssetLocalizerSaveBackups", "AssetSDKFixerSaveBackups", GlobalVars.UserConfiguration.AssetSDKFixerSaveBackups.ToString(), write); FileFormat.Config DefaultConfiguration = new FileFormat.Config(); DefaultConfiguration.SelectedClient = GlobalVars.ProgramInformation.DefaultClient; DefaultConfiguration.Map = GlobalVars.ProgramInformation.DefaultMap; DefaultConfiguration.MapPath = GlobalPaths.MapsDir + @"\\" + GlobalVars.ProgramInformation.DefaultMap; DefaultConfiguration.MapPathSnip = GlobalPaths.MapsDirBase + @"\\" + GlobalVars.ProgramInformation.DefaultMap; GlobalVars.UserConfiguration.CloseOnLaunch = ValueBool(closeonlaunch, DefaultConfiguration.CloseOnLaunch); if (userid.Equals("0")) { GeneratePlayerID(); Config(cfgpath, true); } else { GlobalVars.UserConfiguration.UserID = ValueInt(userid, DefaultConfiguration.UserID); } GlobalVars.UserConfiguration.PlayerName = name; GlobalVars.UserConfiguration.SelectedClient = selectedclient; GlobalVars.UserConfiguration.Map = map; GlobalVars.UserConfiguration.RobloxPort = ValueInt(port, DefaultConfiguration.RobloxPort); GlobalVars.UserConfiguration.PlayerLimit = ValueInt(limit, DefaultConfiguration.PlayerLimit); GlobalVars.UserConfiguration.UPnP = ValueBool(upnp, DefaultConfiguration.UPnP); GlobalVars.UserConfiguration.DisabledAssetSDKHelp = ValueBool(disablehelpmessage, DefaultConfiguration.DisabledAssetSDKHelp); GlobalVars.UserConfiguration.DiscordPresence = ValueBool(discord, DefaultConfiguration.DiscordPresence); GlobalVars.UserConfiguration.MapPathSnip = mapsnip; GlobalVars.UserConfiguration.GraphicsMode = (Settings.Mode)ValueInt(graphics, Convert.ToInt32(DefaultConfiguration.GraphicsMode)); GlobalVars.UserConfiguration.ReShade = ValueBool(reshade, DefaultConfiguration.ReShade); GlobalVars.UserConfiguration.QualityLevel = (Settings.Level)ValueInt(qualitylevel, Convert.ToInt32(DefaultConfiguration.QualityLevel)); GlobalVars.UserConfiguration.LauncherStyle = (Settings.Style)ValueInt(style, Convert.ToInt32(DefaultConfiguration.LauncherStyle)); GlobalVars.UserConfiguration.AssetSDKFixerSaveBackups = ValueBool(savebackups, DefaultConfiguration.AssetSDKFixerSaveBackups); GlobalVars.UserConfiguration.AlternateServerIP = altIP; GlobalVars.UserConfiguration.DisableReshadeDelete = ValueBool(disReshadeDel, DefaultConfiguration.DisableReshadeDelete); GlobalVars.UserConfiguration.ShowServerNotifications = ValueBool(showNotifs, DefaultConfiguration.ShowServerNotifications); GlobalVars.UserConfiguration.ServerBrowserServerName = SB_Name; GlobalVars.UserConfiguration.ServerBrowserServerAddress = SB_Address; GlobalVars.UserConfiguration.Priority = (ProcessPriorityClass)ValueInt(priority, Convert.ToInt32(DefaultConfiguration.Priority)); GlobalVars.UserConfiguration.FirstServerLaunch = ValueBool(firstServerLaunch, DefaultConfiguration.FirstServerLaunch); GlobalVars.UserConfiguration.NewGUI = ValueBool(newgui, DefaultConfiguration.NewGUI); string oldMapath = Path.GetDirectoryName(GlobalVars.UserConfiguration.MapPath); //update the map path if the file doesn't exist and write to config. if (oldMapath.Equals(GlobalPaths.MapsDir.Replace(@"\\", @"\")) && File.Exists(mappath)) { GlobalVars.UserConfiguration.MapPath = mappath; } else { GlobalVars.UserConfiguration.MapPath = GlobalPaths.BasePath + @"\\" + GlobalVars.UserConfiguration.MapPathSnip; Config(cfgpath, true); } if (ResetMapIfNecessary()) { Config(cfgpath, true); } } #if URI || LAUNCHER || CMD || BASICLAUNCHER catch (Exception ex) { LogExceptions(ex); #else catch (Exception) { #endif Config(cfgpath, true); } } string curval = GenerateAndReturnTripcode(); if (!GlobalVars.PlayerTripcode.Equals(curval)) { GlobalVars.PlayerTripcode = curval; } if (!File.Exists(GlobalPaths.ConfigDir + "\\" + GlobalPaths.ConfigNameCustomization)) { Customization(GlobalPaths.ConfigDir + "\\" + GlobalPaths.ConfigNameCustomization, true); } else { Customization(GlobalPaths.ConfigDir + "\\" + GlobalPaths.ConfigNameCustomization, write); } ReShade(GlobalPaths.ConfigDir, "ReShade.ini", write); } public static bool ResetMapIfNecessary() { if (!File.Exists(GlobalVars.UserConfiguration.MapPath)) { GlobalVars.UserConfiguration.Map = GlobalVars.ProgramInformation.DefaultMap; GlobalVars.UserConfiguration.MapPath = GlobalPaths.MapsDir + @"\\" + GlobalVars.ProgramInformation.DefaultMap; GlobalVars.UserConfiguration.MapPathSnip = GlobalPaths.MapsDirBase + @"\\" + GlobalVars.ProgramInformation.DefaultMap; return true; } return false; } public static void Customization(string cfgpath, bool write) { if (write) { //WRITE INIFile ini = new INIFile(cfgpath); string section = "Items"; ini.IniWriteValue(section, "Hat1", GlobalVars.UserCustomization.Hat1.ToString()); ini.IniWriteValue(section, "Hat2", GlobalVars.UserCustomization.Hat2.ToString()); ini.IniWriteValue(section, "Hat3", GlobalVars.UserCustomization.Hat3.ToString()); ini.IniWriteValue(section, "Face", GlobalVars.UserCustomization.Face.ToString()); ini.IniWriteValue(section, "Head", GlobalVars.UserCustomization.Head.ToString()); ini.IniWriteValue(section, "TShirt", GlobalVars.UserCustomization.TShirt.ToString()); ini.IniWriteValue(section, "Shirt", GlobalVars.UserCustomization.Shirt.ToString()); ini.IniWriteValue(section, "Pants", GlobalVars.UserCustomization.Pants.ToString()); ini.IniWriteValue(section, "Icon", GlobalVars.UserCustomization.Icon.ToString()); ini.IniWriteValue(section, "Extra", GlobalVars.UserCustomization.Extra.ToString()); string section2 = "Colors"; ini.IniWriteValue(section2, "HeadColorID", GlobalVars.UserCustomization.HeadColorID.ToString()); ini.IniWriteValue(section2, "HeadColorString", GlobalVars.UserCustomization.HeadColorString.ToString()); ini.IniWriteValue(section2, "TorsoColorID", GlobalVars.UserCustomization.TorsoColorID.ToString()); ini.IniWriteValue(section2, "TorsoColorString", GlobalVars.UserCustomization.TorsoColorString.ToString()); ini.IniWriteValue(section2, "LeftArmColorID", GlobalVars.UserCustomization.LeftArmColorID.ToString()); ini.IniWriteValue(section2, "LeftArmColorString", GlobalVars.UserCustomization.LeftArmColorString.ToString()); ini.IniWriteValue(section2, "RightArmColorID", GlobalVars.UserCustomization.RightArmColorID.ToString()); ini.IniWriteValue(section2, "RightArmColorString", GlobalVars.UserCustomization.RightArmColorString.ToString()); ini.IniWriteValue(section2, "LeftLegColorID", GlobalVars.UserCustomization.LeftLegColorID.ToString()); ini.IniWriteValue(section2, "LeftLegColorString", GlobalVars.UserCustomization.LeftLegColorString.ToString()); ini.IniWriteValue(section2, "RightLegColorID", GlobalVars.UserCustomization.RightLegColorID.ToString()); ini.IniWriteValue(section2, "RightLegColorString", GlobalVars.UserCustomization.RightLegColorString.ToString()); string section3 = "Other"; ini.IniWriteValue(section3, "CharacterID", GlobalVars.UserCustomization.CharacterID.ToString()); ini.IniWriteValue(section3, "ExtraSelectionIsHat", GlobalVars.UserCustomization.ExtraSelectionIsHat.ToString()); ini.IniWriteValue(section3, "ShowHatsOnExtra", GlobalVars.UserCustomization.ShowHatsInExtra.ToString()); } else { //READ try { string hat1, hat2, hat3, face, head, tshirt, shirt, pants, icon, extra, headcolorid, headcolorstring, torsocolorid, torsocolorstring, larmid, larmstring, rarmid, rarmstring, llegid, llegstring, rlegid, rlegstring, characterid, extraishat, showhatsonextra; INIFile ini = new INIFile(cfgpath); string section = "Items"; hat1 = ini.IniReadValue(section, "Hat1", GlobalVars.UserCustomization.Hat1.ToString()); hat2 = ini.IniReadValue(section, "Hat2", GlobalVars.UserCustomization.Hat2.ToString()); hat3 = ini.IniReadValue(section, "Hat3", GlobalVars.UserCustomization.Hat3.ToString()); face = ini.IniReadValue(section, "Face", GlobalVars.UserCustomization.Face.ToString()); head = ini.IniReadValue(section, "Head", GlobalVars.UserCustomization.Head.ToString()); tshirt = ini.IniReadValue(section, "TShirt", GlobalVars.UserCustomization.TShirt.ToString()); shirt = ini.IniReadValue(section, "Shirt", GlobalVars.UserCustomization.Shirt.ToString()); pants = ini.IniReadValue(section, "Pants", GlobalVars.UserCustomization.Pants.ToString()); icon = ini.IniReadValue(section, "Icon", GlobalVars.UserCustomization.Icon.ToString()); extra = ini.IniReadValue(section, "Extra", GlobalVars.UserCustomization.Extra.ToString()); string section2 = "Colors"; headcolorid = ini.IniReadValue(section2, "HeadColorID", GlobalVars.UserCustomization.HeadColorID.ToString()); headcolorstring = ini.IniReadValue(section2, "HeadColorString", GlobalVars.UserCustomization.HeadColorString.ToString()); torsocolorid = ini.IniReadValue(section2, "TorsoColorID", GlobalVars.UserCustomization.TorsoColorID.ToString()); torsocolorstring = ini.IniReadValue(section2, "TorsoColorString", GlobalVars.UserCustomization.TorsoColorString.ToString()); larmid = ini.IniReadValue(section2, "LeftArmColorID", GlobalVars.UserCustomization.LeftArmColorID.ToString()); larmstring = ini.IniReadValue(section2, "LeftArmColorString", GlobalVars.UserCustomization.LeftArmColorString.ToString()); rarmid = ini.IniReadValue(section2, "RightArmColorID", GlobalVars.UserCustomization.RightArmColorID.ToString()); rarmstring = ini.IniReadValue(section2, "RightArmColorString", GlobalVars.UserCustomization.RightArmColorString.ToString()); llegid = ini.IniReadValue(section2, "LeftLegColorID", GlobalVars.UserCustomization.LeftLegColorID.ToString()); llegstring = ini.IniReadValue(section2, "LeftLegColorString", GlobalVars.UserCustomization.LeftLegColorString.ToString()); rlegid = ini.IniReadValue(section2, "RightLegColorID", GlobalVars.UserCustomization.RightLegColorID.ToString()); rlegstring = ini.IniReadValue(section2, "RightLegColorString", GlobalVars.UserCustomization.RightLegColorString.ToString()); string section3 = "Other"; characterid = ini.IniReadValue(section3, "CharacterID", GlobalVars.UserCustomization.CharacterID.ToString()); extraishat = ini.IniReadValue(section3, "ExtraSelectionIsHat", GlobalVars.UserCustomization.ExtraSelectionIsHat.ToString()); showhatsonextra = ini.IniReadValue(section3, "ShowHatsOnExtra", GlobalVars.UserCustomization.ShowHatsInExtra.ToString()); FileFormat.CustomizationConfig DefaultCustomization = new FileFormat.CustomizationConfig(); GlobalVars.UserCustomization.Hat1 = hat1; GlobalVars.UserCustomization.Hat2 = hat2; GlobalVars.UserCustomization.Hat3 = hat3; GlobalVars.UserCustomization.HeadColorID = ValueInt(headcolorid, DefaultCustomization.HeadColorID); GlobalVars.UserCustomization.TorsoColorID = ValueInt(torsocolorid, DefaultCustomization.TorsoColorID); GlobalVars.UserCustomization.LeftArmColorID = ValueInt(larmid, DefaultCustomization.LeftArmColorID); GlobalVars.UserCustomization.RightArmColorID = ValueInt(rarmid, DefaultCustomization.RightArmColorID); GlobalVars.UserCustomization.LeftLegColorID = ValueInt(llegid, DefaultCustomization.LeftLegColorID); GlobalVars.UserCustomization.RightLegColorID = ValueInt(rlegid, DefaultCustomization.RightArmColorID); GlobalVars.UserCustomization.HeadColorString = headcolorstring; GlobalVars.UserCustomization.TorsoColorString = torsocolorstring; GlobalVars.UserCustomization.LeftArmColorString = larmstring; GlobalVars.UserCustomization.RightArmColorString = rarmstring; GlobalVars.UserCustomization.LeftLegColorString = llegstring; GlobalVars.UserCustomization.RightLegColorString = rlegstring; GlobalVars.UserCustomization.Face = face; GlobalVars.UserCustomization.Head = head; GlobalVars.UserCustomization.TShirt = tshirt; GlobalVars.UserCustomization.Shirt = shirt; GlobalVars.UserCustomization.Pants = pants; GlobalVars.UserCustomization.Icon = icon; GlobalVars.UserCustomization.CharacterID = characterid; GlobalVars.UserCustomization.Extra = extra; GlobalVars.UserCustomization.ExtraSelectionIsHat = ValueBool(extraishat, DefaultCustomization.ExtraSelectionIsHat); GlobalVars.UserCustomization.ShowHatsInExtra = ValueBool(showhatsonextra, DefaultCustomization.ShowHatsInExtra); } #if URI || LAUNCHER || CMD || BASICLAUNCHER catch (Exception ex) { LogExceptions(ex); #else catch (Exception) { #endif Customization(cfgpath, true); } } ReloadLoadoutValue(); } public static void ReShade(string cfgpath, string cfgname, bool write) { string fullpath = cfgpath + "\\" + cfgname; if (!File.Exists(fullpath)) { FixedFileCopy(GlobalPaths.ConfigDir + "\\ReShade_default.ini", fullpath, false); ReShadeValues(fullpath, write, true); } else { ReShadeValues(fullpath, write, true); } string clientdir = GlobalPaths.ClientDir; DirectoryInfo dinfo = new DirectoryInfo(clientdir); DirectoryInfo[] Dirs = dinfo.GetDirectories(); foreach (DirectoryInfo dir in Dirs) { string fulldirpath = dir.FullName + @"\" + cfgname; string dllfilename = "opengl32.dll"; string fulldllpath = dir.FullName + @"\" + dllfilename; if (GlobalVars.UserConfiguration.ReShade) { if (!File.Exists(fulldirpath)) { FixedFileCopy(fullpath, fulldirpath, false); ReShadeValues(fulldirpath, write, false); } else { ReShadeValues(fulldirpath, write, false); } if (!File.Exists(fulldllpath)) { FixedFileCopy(GlobalPaths.DataDir + "\\" + dllfilename, fulldllpath, false); } } else { FixedFileDelete(fulldirpath); if (!GlobalVars.UserConfiguration.DisableReshadeDelete) { FixedFileDelete(fulldllpath); } } } } public static void ReShadeValues(string cfgpath, bool write, bool setglobals) { if (write) { //WRITE INIFile ini = new INIFile(cfgpath); string section = "GENERAL"; string section2 = "OVERLAY"; int FPS = GlobalVars.UserConfiguration.ReShadeFPSDisplay ? 1 : 0; ini.IniWriteValue(section2, "ShowFPS", FPS.ToString()); ini.IniWriteValue(section2, "ShowFrameTime", FPS.ToString()); int PerformanceMode = GlobalVars.UserConfiguration.ReShadePerformanceMode ? 1 : 0; ini.IniWriteValue(section, "PerformanceMode", PerformanceMode.ToString()); } else { //READ string framerate, frametime, performance; INIFile ini = new INIFile(cfgpath); string section = "GENERAL"; string section2 = "OVERLAY"; int FPS = GlobalVars.UserConfiguration.ReShadeFPSDisplay ? 1 : 0; framerate = ini.IniReadValue(section2, "ShowFPS", FPS.ToString()); frametime = ini.IniReadValue(section2, "ShowFrameTime", FPS.ToString()); int PerformanceMode = GlobalVars.UserConfiguration.ReShadePerformanceMode ? 1 : 0; performance = ini.IniReadValue(section, "PerformanceMode", PerformanceMode.ToString()); if (setglobals) { try { switch(ValueInt(framerate, 0)) { case int showFPSLine when showFPSLine == 1 && Convert.ToInt32(frametime) == 1: GlobalVars.UserConfiguration.ReShadeFPSDisplay = true; break; default: GlobalVars.UserConfiguration.ReShadeFPSDisplay = false; break; } switch (ValueInt(performance, 0)) { case 1: GlobalVars.UserConfiguration.ReShadePerformanceMode = true; break; default: GlobalVars.UserConfiguration.ReShadePerformanceMode = false; break; } } #if URI || LAUNCHER || CMD || BASICLAUNCHER catch (Exception ex) { LogExceptions(ex); #else catch (Exception) { #endif ReShadeValues(cfgpath, true, setglobals); } } } } public static bool InitColors() { try { if (File.Exists(GlobalPaths.ConfigDir + "\\" + GlobalPaths.PartColorXMLName)) { GlobalVars.PartColorList = PartColorLoader.GetPartColors(); GlobalVars.PartColorListConv = new List(); GlobalVars.PartColorListConv.AddRange(GlobalVars.PartColorList); return true; } else { goto Failure; } } #if URI || LAUNCHER || CMD || BASICLAUNCHER catch (Exception ex) { LogExceptions(ex); #else catch (Exception) { #endif goto Failure; } Failure: return false; } public static bool HasColorsChanged() { try { PartColor[] tempList; if (File.Exists(GlobalPaths.ConfigDir + "\\" + GlobalPaths.PartColorXMLName)) { tempList = PartColorLoader.GetPartColors(); if (tempList.Length != GlobalVars.PartColorList.Length) { return true; } else { return false; } } else { goto Failure; } } #if URI || LAUNCHER || CMD || BASICLAUNCHER catch (Exception ex) { LogExceptions(ex); #else catch (Exception) { #endif goto Failure; } Failure: return false; } #if LAUNCHER public static void ReadClientValues(RichTextBox box, bool initial = false) #else public static void ReadClientValues(bool initial = false) #endif { #if LAUNCHER ReadClientValues(GlobalVars.UserConfiguration.SelectedClient, box, initial); #else ReadClientValues(GlobalVars.UserConfiguration.SelectedClient, initial); #endif } #if LAUNCHER public static void ReadClientValues(string ClientName, RichTextBox box, bool initial = false) #else public static void ReadClientValues(string ClientName, bool initial = false) #endif { string name = ClientName; if (string.IsNullOrWhiteSpace(name)) { if (!string.IsNullOrWhiteSpace(GlobalVars.ProgramInformation.DefaultClient)) { name = GlobalVars.ProgramInformation.DefaultClient; } else { return; } } string clientpath = GlobalPaths.ClientDir + @"\\" + name + @"\\clientinfo.nov"; if (!File.Exists(clientpath)) { try { #if LAUNCHER ConsolePrint("ERROR - No clientinfo.nov detected with the client you chose. The client either cannot be loaded, or it is not available. Novetus will attempt to generate one.", 2, box); #elif CMD ConsolePrint("ERROR - No clientinfo.nov detected with the client you chose. The client either cannot be loaded, or it is not available. Novetus will attempt to generate one.", 2); #endif GenerateDefaultClientInfo(Path.GetDirectoryName(clientpath)); #if LAUNCHER ReadClientValues(name, box, initial); #else ReadClientValues(name, initial); #endif } #if URI || LAUNCHER || CMD || BASICLAUNCHER catch (Exception ex) { LogExceptions(ex); #else catch (Exception) { #endif #if LAUNCHER ConsolePrint("ERROR - Failed to generate default clientinfo.nov. Info: " + ex.Message, 2, box); ConsolePrint("Loading default client '" + GlobalVars.ProgramInformation.DefaultClient + "'", 4, box); #elif CMD ConsolePrint("ERROR - Failed to generate default clientinfo.nov. Info: " + ex.Message, 2); ConsolePrint("Loading default client '" + GlobalVars.ProgramInformation.DefaultClient + "'", 4); #endif name = GlobalVars.ProgramInformation.DefaultClient; #if LAUNCHER ReadClientValues(name, box, initial); #else ReadClientValues(name, initial); #endif } } else { LoadClientValues(clientpath); if (initial) { #if LAUNCHER ConsolePrint("Client '" + name + "' successfully loaded.", 3, box); #elif CMD ConsolePrint("Client '" + name + "' successfully loaded.", 3); #endif } } string terms = "_" + ClientName + "_default"; string[] dirs = Directory.GetFiles(GlobalPaths.ConfigDirClients); foreach (string dir in dirs) { if (dir.Contains(terms) && dir.EndsWith(".xml")) { string fullpath = dir.Replace("_default", ""); if (!File.Exists(fullpath)) { FixedFileCopy(dir, fullpath, false); } } } ChangeGameSettings(ClientName); } //Modified from https://stackoverflow.com/questions/4286487/is-there-any-lorem-ipsum-generator-in-c public static string LoremIpsum(int minWords, int maxWords, int minSentences, int maxSentences, int numParagraphs) { var words = new[]{"lorem", "ipsum", "dolor", "sit", "amet", "consectetuer", "adipiscing", "elit", "sed", "diam", "nonummy", "nibh", "euismod", "tincidunt", "ut", "laoreet", "dolore", "magna", "aliquam", "erat"}; var rand = new Random(); int numSentences = rand.Next(maxSentences - minSentences) + minSentences + 1; int numWords = rand.Next(maxWords - minWords) + minWords + 1; StringBuilder result = new StringBuilder(); for (int p = 0; p < numParagraphs; p++) { result.Append("lorem ipsum "); for (int s = 0; s < numSentences; s++) { for (int w = 0; w < numWords; w++) { if (w > 0) { result.Append(" "); } result.Append(words[rand.Next(words.Length)]); } result.Append(". "); } } return result.ToString(); } //https://stackoverflow.com/questions/63879676/open-all-exe-files-in-a-directory-c-sharp public static List GetAllExecutables(string path) { return Directory.Exists(path) ? Directory.GetFiles(path, "*.exe").ToList() : new List(); // or null } public static void GenerateDefaultClientInfo(string path) { FileFormat.ClientInfo DefaultClientInfo = new FileFormat.ClientInfo(); bool placeholder = false; string ClientName = ""; List exeList = GetAllExecutables(path); if (File.Exists(path + "\\RobloxApp_client.exe")) { ClientName = "\\RobloxApp_client.exe"; } else if (File.Exists(path + "\\client\\RobloxApp_client.exe")) { ClientName = "\\client\\RobloxApp_client.exe"; DefaultClientInfo.SeperateFolders = true; } else if (File.Exists(path + "\\RobloxApp.exe")) { ClientName = "\\RobloxApp.exe"; DefaultClientInfo.LegacyMode = true; } else if (exeList.Count > 0) { string FirstEXE = exeList[0].Replace(path, "").Replace(@"\", ""); ClientName = @"\\" + FirstEXE; DefaultClientInfo.CustomClientEXEName = ClientName; DefaultClientInfo.UsesCustomClientEXEName = true; } else { IOException clientNotFoundEX = new IOException("Could not find client exe file. Your client must have a .exe file to function."); throw clientNotFoundEX; } string ClientMD5 = File.Exists(path + ClientName) ? SecurityFuncs.GenerateMD5(path + ClientName) : ""; if (!string.IsNullOrWhiteSpace(ClientMD5)) { DefaultClientInfo.ClientMD5 = ClientMD5.ToUpper(CultureInfo.InvariantCulture); } else { IOException clientNotFoundEX = new IOException("Could not find client exe for MD5 generation. It must be named either RobloxApp.exe or RobloxApp_client.exe in order to function."); throw clientNotFoundEX; } string ClientScriptMD5 = File.Exists(path + "\\content\\scripts\\" + GlobalPaths.ScriptName + ".lua") ? SecurityFuncs.GenerateMD5(path + "\\content\\scripts\\" + GlobalPaths.ScriptName + ".lua") : ""; if (!string.IsNullOrWhiteSpace(ClientScriptMD5)) { DefaultClientInfo.ScriptMD5 = ClientScriptMD5.ToUpper(CultureInfo.InvariantCulture); } /*else { IOException clientNotFoundEX = new IOException("Could not find script file for MD5 generation. You must have a CSMPFunctions.lua script in your client's content/scripts folder."); throw clientNotFoundEX; }*/ string desc = "This client information file for '" + GlobalVars.UserConfiguration.SelectedClient + "' was pre-generated by Novetus for your convienence. You will need to load this clientinfo.nov file into the Client SDK for additional options. " + LoremIpsum(1, 128, 1, 6, 1); DefaultClientInfo.Description = desc; string[] lines = { SecurityFuncs.Base64Encode(DefaultClientInfo.UsesPlayerName.ToString()), SecurityFuncs.Base64Encode(DefaultClientInfo.UsesID.ToString()), SecurityFuncs.Base64Encode(DefaultClientInfo.Warning.ToString()), SecurityFuncs.Base64Encode(DefaultClientInfo.LegacyMode.ToString()), SecurityFuncs.Base64Encode(DefaultClientInfo.ClientMD5.ToString()), SecurityFuncs.Base64Encode(DefaultClientInfo.ScriptMD5.ToString()), SecurityFuncs.Base64Encode(DefaultClientInfo.Description.ToString()), SecurityFuncs.Base64Encode(placeholder.ToString()), SecurityFuncs.Base64Encode(DefaultClientInfo.Fix2007.ToString()), SecurityFuncs.Base64Encode(DefaultClientInfo.AlreadyHasSecurity.ToString()), SecurityFuncs.Base64Encode(((int)DefaultClientInfo.ClientLoadOptions).ToString()), SecurityFuncs.Base64Encode(DefaultClientInfo.SeperateFolders.ToString()), SecurityFuncs.Base64Encode(DefaultClientInfo.UsesCustomClientEXEName.ToString()), SecurityFuncs.Base64Encode(DefaultClientInfo.CustomClientEXEName.ToString().Replace("\\", "")), SecurityFuncs.Base64Encode(DefaultClientInfo.CommandLineArgs.ToString()) }; File.WriteAllText(path + "\\clientinfo.nov", SecurityFuncs.Base64Encode(string.Join("|", lines))); } public static void FixedFileCopy(string src, string dest, bool overwrite, bool overwritewarning = false) { if (File.Exists(dest)) { if (overwrite && overwritewarning) { if (ShowOverrideWarning(dest) == DialogResult.No) { return; } } File.SetAttributes(dest, FileAttributes.Normal); } File.Copy(src, dest, overwrite); File.SetAttributes(dest, FileAttributes.Normal); } public static void FixedFileDelete(string src) { if (File.Exists(src)) { File.SetAttributes(src, FileAttributes.Normal); File.Delete(src); } } public static void FixedFileMove(string src, string dest, bool overwrite, bool overwritewarning = false) { if (src.Equals(dest)) return; if (!File.Exists(dest)) { File.SetAttributes(src, FileAttributes.Normal); File.Move(src, dest); } else { if (overwrite) { if (overwritewarning) { if (ShowOverrideWarning(dest) == DialogResult.No) { return; } } FixedFileDelete(dest); File.SetAttributes(src, FileAttributes.Normal); File.Move(src, dest); } else { throw new IOException("Cannot create a file when that file already exists. FixedFileMove cannot override files with overwrite disabled."); } } } private static DialogResult ShowOverrideWarning(string dest) { DialogResult box = MessageBox.Show("A file with a similar name was detected in the directory as '" + dest + "'.\n\nWould you like to override it?", "Novetus - Override Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); return box; } //modified from the following: //https://stackoverflow.com/questions/28887314/performance-of-image-loading //https://stackoverflow.com/questions/2479771/c-why-am-i-getting-the-process-cannot-access-the-file-because-it-is-being-u public static Image LoadImage(string fileFullName, string fallbackFileFullName = "") { if (string.IsNullOrWhiteSpace(fileFullName)) return null; Image image = null; try { using (MemoryStream ms = new MemoryStream(File.ReadAllBytes(fileFullName))) { image = Image.FromStream(ms); } // PropertyItems seem to get lost when fileStream is closed to quickly (?); perhaps // this is the reason Microsoft didn't want to close it in the first place. PropertyItem[] items = image.PropertyItems; foreach (PropertyItem item in items) { image.SetPropertyItem(item); } } #if URI || LAUNCHER || CMD || BASICLAUNCHER catch (Exception ex) { LogExceptions(ex); #else catch (Exception) { #endif if (!string.IsNullOrWhiteSpace(fallbackFileFullName)) image = LoadImage(fallbackFileFullName); } return image; } public static string CopyMapToRBXAsset() { string clientcontentpath = GlobalPaths.ClientDir + @"\\" + GlobalVars.UserConfiguration.SelectedClient + @"\\content\\temp.rbxl"; FixedFileCopy(GlobalVars.UserConfiguration.MapPath, clientcontentpath, true); return GlobalPaths.AltBaseGameDir + "temp.rbxl"; } //NOT FOR SDK. public static FileFormat.ClientInfo GetClientInfoValues(string ClientName) { string name = ClientName; try { FileFormat.ClientInfo info = new FileFormat.ClientInfo(); string clientpath = GlobalPaths.ClientDir + @"\\" + name + @"\\clientinfo.nov"; LoadClientValues(info, clientpath); return info; } #if URI || LAUNCHER || CMD || BASICLAUNCHER catch (Exception ex) { LogExceptions(ex); #else catch (Exception) { #endif return null; } } //https://social.msdn.microsoft.com/Forums/vstudio/en-US/b0c31115-f6f0-4de5-a62d-d766a855d4d1/directorygetfiles-with-searchpattern-to-get-all-dll-and-exe-files-in-one-call?forum=netfxbcl public static string[] GetFiles(string path, string searchPattern, SearchOption searchOption) { string[] searchPatterns = searchPattern.Split('|'); List files = new List(); foreach (string sp in searchPatterns) files.AddRange(System.IO.Directory.GetFiles(path, sp, searchOption)); files.Sort(); return files.ToArray(); } public static void LoadClientValues(string clientpath) { LoadClientValues(GlobalVars.SelectedClientInfo, clientpath); } public static void LoadClientValues(FileFormat.ClientInfo info, string clientpath) { string file, usesplayername, usesid, warning, legacymode, clientmd5, scriptmd5, desc, fix2007, alreadyhassecurity, clientloadoptions, commandlineargs, folders, usescustomname, customname; using (StreamReader reader = new StreamReader(clientpath)) { file = reader.ReadLine(); } string ConvertedLine = SecurityFuncs.Base64Decode(file); string[] result = ConvertedLine.Split('|'); usesplayername = SecurityFuncs.Base64Decode(result[0]); usesid = SecurityFuncs.Base64Decode(result[1]); warning = SecurityFuncs.Base64Decode(result[2]); legacymode = SecurityFuncs.Base64Decode(result[3]); clientmd5 = SecurityFuncs.Base64Decode(result[4]); scriptmd5 = SecurityFuncs.Base64Decode(result[5]); desc = SecurityFuncs.Base64Decode(result[6]); fix2007 = SecurityFuncs.Base64Decode(result[8]); alreadyhassecurity = SecurityFuncs.Base64Decode(result[9]); clientloadoptions = SecurityFuncs.Base64Decode(result[10]); folders = "False"; usescustomname = "False"; customname = ""; try { commandlineargs = SecurityFuncs.Base64Decode(result[11]); bool parsedValue; if (bool.TryParse(commandlineargs, out parsedValue)) { folders = SecurityFuncs.Base64Decode(result[11]); commandlineargs = SecurityFuncs.Base64Decode(result[12]); bool parsedValue2; if (bool.TryParse(commandlineargs, out parsedValue2)) { usescustomname = SecurityFuncs.Base64Decode(result[12]); customname = SecurityFuncs.Base64Decode(result[13]); commandlineargs = SecurityFuncs.Base64Decode(result[14]); } } } catch (Exception) { //fake this option until we properly apply it. clientloadoptions = "2"; commandlineargs = SecurityFuncs.Base64Decode(result[10]); } info.UsesPlayerName = Convert.ToBoolean(usesplayername); info.UsesID = Convert.ToBoolean(usesid); info.Warning = warning; info.LegacyMode = Convert.ToBoolean(legacymode); info.ClientMD5 = clientmd5; info.ScriptMD5 = scriptmd5; info.Description = desc; info.Fix2007 = Convert.ToBoolean(fix2007); info.AlreadyHasSecurity = Convert.ToBoolean(alreadyhassecurity); if (clientloadoptions.Equals("True") || clientloadoptions.Equals("False")) { info.ClientLoadOptions = Settings.GetClientLoadOptionsForBool(Convert.ToBoolean(clientloadoptions)); } else { info.ClientLoadOptions = (Settings.ClientLoadOptions)Convert.ToInt32(clientloadoptions); } info.SeperateFolders = Convert.ToBoolean(folders); info.UsesCustomClientEXEName = Convert.ToBoolean(usescustomname); info.CustomClientEXEName = customname; info.CommandLineArgs = commandlineargs; } #if LAUNCHER public static void ResetConfigValues(Settings.Style style) #else public static void ResetConfigValues() #endif { GlobalVars.UserConfiguration = new FileFormat.Config(); GlobalVars.UserConfiguration.SelectedClient = GlobalVars.ProgramInformation.DefaultClient; GlobalVars.UserConfiguration.Map = GlobalVars.ProgramInformation.DefaultMap; GlobalVars.UserConfiguration.MapPath = GlobalPaths.MapsDir + @"\\" + GlobalVars.ProgramInformation.DefaultMap; GlobalVars.UserConfiguration.MapPathSnip = GlobalPaths.MapsDirBase + @"\\" + GlobalVars.ProgramInformation.DefaultMap; #if LAUNCHER GlobalVars.UserConfiguration.LauncherStyle = style; #endif GeneratePlayerID(); ResetCustomizationValues(); } public static void ResetCustomizationValues() { GlobalVars.UserCustomization = new FileFormat.CustomizationConfig(); ReloadLoadoutValue(); } public static void ReloadLoadoutValue(bool localizeOnlineClothing = false) { string hat1 = (!GlobalVars.UserCustomization.Hat1.EndsWith("-Solo.rbxm")) ? GlobalVars.UserCustomization.Hat1 : "NoHat.rbxm"; string hat2 = (!GlobalVars.UserCustomization.Hat2.EndsWith("-Solo.rbxm")) ? GlobalVars.UserCustomization.Hat2 : "NoHat.rbxm"; string hat3 = (!GlobalVars.UserCustomization.Hat3.EndsWith("-Solo.rbxm")) ? GlobalVars.UserCustomization.Hat3 : "NoHat.rbxm"; string extra = (!GlobalVars.UserCustomization.Extra.EndsWith("-Solo.rbxm")) ? GlobalVars.UserCustomization.Extra : "NoExtra.rbxm"; GlobalVars.Loadout = "'" + hat1 + "','" + hat2 + "','" + hat3 + "'," + GlobalVars.UserCustomization.HeadColorID + "," + GlobalVars.UserCustomization.TorsoColorID + "," + GlobalVars.UserCustomization.LeftArmColorID + "," + GlobalVars.UserCustomization.RightArmColorID + "," + GlobalVars.UserCustomization.LeftLegColorID + "," + GlobalVars.UserCustomization.RightLegColorID + ",'" + GlobalVars.UserCustomization.TShirt + "','" + GlobalVars.UserCustomization.Shirt + "','" + GlobalVars.UserCustomization.Pants + "','" + GlobalVars.UserCustomization.Face + "','" + GlobalVars.UserCustomization.Head + "','" + GlobalVars.UserCustomization.Icon + "','" + extra + "'"; GlobalVars.soloLoadout = "'" + GlobalVars.UserCustomization.Hat1 + "','" + GlobalVars.UserCustomization.Hat2 + "','" + GlobalVars.UserCustomization.Hat3 + "'," + GlobalVars.UserCustomization.HeadColorID + "," + GlobalVars.UserCustomization.TorsoColorID + "," + GlobalVars.UserCustomization.LeftArmColorID + "," + GlobalVars.UserCustomization.RightArmColorID + "," + GlobalVars.UserCustomization.LeftLegColorID + "," + GlobalVars.UserCustomization.RightLegColorID + ",'" + GlobalVars.UserCustomization.TShirt + "','" + GlobalVars.UserCustomization.Shirt + "','" + GlobalVars.UserCustomization.Pants + "','" + GlobalVars.UserCustomization.Face + "','" + GlobalVars.UserCustomization.Head + "','" + GlobalVars.UserCustomization.Icon + "','" + GlobalVars.UserCustomization.Extra + "'"; if (localizeOnlineClothing) { GlobalVars.TShirtTextureID = GetItemTextureID(GlobalVars.UserCustomization.TShirt, "TShirt", new AssetCacheDefBasic("ShirtGraphic", new string[] { "Graphic" })); GlobalVars.ShirtTextureID = GetItemTextureID(GlobalVars.UserCustomization.Shirt, "Shirt", new AssetCacheDefBasic("Shirt", new string[] { "ShirtTemplate" })); GlobalVars.PantsTextureID = GetItemTextureID(GlobalVars.UserCustomization.Pants, "Pants", new AssetCacheDefBasic("Pants", new string[] { "PantsTemplate" })); GlobalVars.FaceTextureID = GetItemTextureID(GlobalVars.UserCustomization.Face, "Face", new AssetCacheDefBasic("Decal", new string[] { "Texture" })); GlobalVars.TShirtTextureLocal = GetItemTextureLocalPath(GlobalVars.TShirtTextureID, "TShirt"); GlobalVars.ShirtTextureLocal = GetItemTextureLocalPath(GlobalVars.ShirtTextureID, "Shirt"); GlobalVars.PantsTextureLocal = GetItemTextureLocalPath(GlobalVars.PantsTextureID, "Pants"); GlobalVars.FaceTextureLocal = GetItemTextureLocalPath(GlobalVars.FaceTextureID, "Face"); } } public static string GetItemTextureLocalPath(string item, string nameprefix) { //don't bother, we're offline. if (GlobalVars.ExternalIP.Equals("localhost")) return ""; if (!GlobalVars.SelectedClientInfo.CommandLineArgs.Contains("%localizeonlineclothing%")) return ""; if (item.Contains("http://") || item.Contains("https://")) { string peram = "id="; string fullname = nameprefix + "Temp.png"; if (item.Contains(peram)) { string id = item.After(peram); fullname = id + ".png"; } else { return item; } Downloader download = new Downloader(item, fullname, "", GlobalPaths.AssetCacheDirTextures); try { string path = download.GetFullDLPath(); download.InitDownloadNoDialog(path); return GlobalPaths.AssetCacheTexturesGameDir + download.fileName; } #if URI || LAUNCHER || CMD || BASICLAUNCHER catch (Exception ex) { LogExceptions(ex); #else catch (Exception) { #endif } } return ""; } public static string GetItemTextureID(string item, string name, AssetCacheDefBasic assetCacheDef) { //don't bother, we're offline. if (GlobalVars.ExternalIP.Equals("localhost")) return ""; if (!GlobalVars.SelectedClientInfo.CommandLineArgs.Contains("%localizeonlineclothing%")) return ""; if (item.Contains("http://") || item.Contains("https://")) { string peram = "id="; if (!item.Contains(peram)) { return item; } Downloader download = new Downloader(item, name + "Temp.rbxm", "", GlobalPaths.AssetCacheDirFonts); try { string path = download.GetFullDLPath(); download.InitDownloadNoDialog(path); string oldfile = File.ReadAllText(path); string fixedfile = RobloxXML.RemoveInvalidXmlChars(RobloxXML.ReplaceHexadecimalSymbols(oldfile)).Replace(" ", "\t").Replace("#9;", "\t"); XDocument doc = null; XmlReaderSettings xmlReaderSettings = new XmlReaderSettings { CheckCharacters = false }; Stream filestream = GenerateStreamFromString(fixedfile); using (XmlReader xmlReader = XmlReader.Create(filestream, xmlReaderSettings)) { xmlReader.MoveToContent(); doc = XDocument.Load(xmlReader); } return RobloxXML.GetURLInNodes(doc, assetCacheDef.Class, assetCacheDef.Id[0], item); } #if URI || LAUNCHER || CMD || BASICLAUNCHER catch (Exception ex) { LogExceptions(ex); #else catch (Exception) { #endif } } return ""; } public static void GeneratePlayerID() { CryptoRandom random = new CryptoRandom(); int randomID = 0; int randIDmode = random.Next(0, 8); int idlimit = 0; switch (randIDmode) { case 0: idlimit = 9; break; case 1: idlimit = 99; break; case 2: idlimit = 999; break; case 3: idlimit = 9999; break; case 4: idlimit = 99999; break; case 5: idlimit = 999999; break; case 6: idlimit = 9999999; break; case 7: idlimit = 99999999; break; case 8: default: break; } if (idlimit > 0) { randomID = random.Next(0, idlimit); } else { randomID = random.Next(); } //2147483647 is max id. GlobalVars.UserConfiguration.UserID = randomID; } public static string GenerateAndReturnTripcode() { //Powered by https://github.com/davcs86/csharp-uhwid return UHWID.UHWIDEngine.AdvancedUid; } public static GlobalVars.LauncherState GetStateForType(ScriptType type) { switch (type) { case ScriptType.Client: return GlobalVars.LauncherState.InMPGame; case ScriptType.Solo: return GlobalVars.LauncherState.InSoloGame; case ScriptType.Studio: return GlobalVars.LauncherState.InStudio; case ScriptType.EasterEgg: return GlobalVars.LauncherState.InEasterEggGame; default: return GlobalVars.LauncherState.InLauncher; } } public static void UpdateRichPresence(GlobalVars.LauncherState state, bool initial = false) { string mapname = ""; if (GlobalVars.GameOpened != ScriptType.Client) { mapname = GlobalVars.UserConfiguration.Map; } UpdateRichPresence(state, GlobalVars.UserConfiguration.SelectedClient, mapname, initial); } public static void UpdateRichPresence(GlobalVars.LauncherState state, string mapname, bool initial = false) { UpdateRichPresence(state, GlobalVars.UserConfiguration.SelectedClient, mapname, initial); } public static void UpdateRichPresence(GlobalVars.LauncherState state, string clientname, string mapname, bool initial = false) { if (GlobalVars.UserConfiguration.DiscordPresence) { if (initial) { GlobalVars.presence.largeImageKey = GlobalVars.imagekey_large; GlobalVars.presence.startTimestamp = SecurityFuncs.UnixTimeNow(); } string ValidMapname = (string.IsNullOrWhiteSpace(mapname) ? "Place1" : mapname); switch (state) { case GlobalVars.LauncherState.InLauncher: GlobalVars.presence.smallImageKey = GlobalVars.image_inlauncher; GlobalVars.presence.state = "In Launcher"; GlobalVars.presence.details = "Selected " + clientname; GlobalVars.presence.largeImageText = GlobalVars.UserConfiguration.PlayerName + " | Novetus " + GlobalVars.ProgramInformation.Version; GlobalVars.presence.smallImageText = "In Launcher"; break; case GlobalVars.LauncherState.InMPGame: GlobalVars.presence.smallImageKey = GlobalVars.image_ingame; GlobalVars.presence.details = ValidMapname; GlobalVars.presence.state = "In " + clientname + " Multiplayer Game"; GlobalVars.presence.largeImageText = GlobalVars.UserConfiguration.PlayerName + " | Novetus " + GlobalVars.ProgramInformation.Version; GlobalVars.presence.smallImageText = "In " + clientname + " Multiplayer Game"; break; case GlobalVars.LauncherState.InSoloGame: GlobalVars.presence.smallImageKey = GlobalVars.image_ingame; GlobalVars.presence.details = ValidMapname; GlobalVars.presence.state = "In " + clientname + " Solo Game"; GlobalVars.presence.largeImageText = GlobalVars.UserConfiguration.PlayerName + " | Novetus " + GlobalVars.ProgramInformation.Version; GlobalVars.presence.smallImageText = "In " + clientname + " Solo Game"; break; case GlobalVars.LauncherState.InStudio: GlobalVars.presence.smallImageKey = GlobalVars.image_instudio; GlobalVars.presence.details = ValidMapname; GlobalVars.presence.state = "In " + clientname + " Studio"; GlobalVars.presence.largeImageText = GlobalVars.UserConfiguration.PlayerName + " | Novetus " + GlobalVars.ProgramInformation.Version; GlobalVars.presence.smallImageText = "In " + clientname + " Studio"; break; case GlobalVars.LauncherState.InCustomization: GlobalVars.presence.smallImageKey = GlobalVars.image_incustomization; GlobalVars.presence.details = "Customizing " + GlobalVars.UserConfiguration.PlayerName; GlobalVars.presence.state = "In Character Customization"; GlobalVars.presence.largeImageText = GlobalVars.UserConfiguration.PlayerName + " | Novetus " + GlobalVars.ProgramInformation.Version; GlobalVars.presence.smallImageText = "In Character Customization"; break; case GlobalVars.LauncherState.InEasterEggGame: GlobalVars.presence.smallImageKey = GlobalVars.image_ingame; GlobalVars.presence.details = ValidMapname; GlobalVars.presence.state = "Reading a message."; GlobalVars.presence.largeImageText = GlobalVars.UserConfiguration.PlayerName + " | Novetus " + GlobalVars.ProgramInformation.Version; GlobalVars.presence.smallImageText = "Reading a message."; break; case GlobalVars.LauncherState.LoadingURI: GlobalVars.presence.smallImageKey = GlobalVars.image_ingame; GlobalVars.presence.details = ValidMapname; GlobalVars.presence.state = "Joining a " + clientname + " Multiplayer Game"; GlobalVars.presence.largeImageText = GlobalVars.UserConfiguration.PlayerName + " | Novetus " + GlobalVars.ProgramInformation.Version; GlobalVars.presence.smallImageText = "Joining a " + clientname + " Multiplayer Game"; break; default: break; } DiscordRPC.UpdatePresence(ref GlobalVars.presence); } } public static void ChangeGameSettings(string ClientName) { try { FileFormat.ClientInfo info = GetClientInfoValues(ClientName); string filterPath = GlobalPaths.ConfigDir + @"\\" + GlobalPaths.FileDeleteFilterName; string[] fileListToDelete = File.ReadAllLines(filterPath); foreach (string file in fileListToDelete) { string fullFilePath = Settings.GetPathForClientLoadOptions(info.ClientLoadOptions) + @"\" + file; FixedFileDelete(fullFilePath); } if (GlobalVars.UserConfiguration.QualityLevel != Settings.Level.Custom) { int GraphicsMode = 0; if (info.ClientLoadOptions == Settings.ClientLoadOptions.Client_2008AndUp_ForceAutomaticQL21 || info.ClientLoadOptions == Settings.ClientLoadOptions.Client_2008AndUp_ForceAutomatic) { GraphicsMode = 1; } else { if (info.ClientLoadOptions != Settings.ClientLoadOptions.Client_2007_NoGraphicsOptions || info.ClientLoadOptions != Settings.ClientLoadOptions.Client_2008AndUp_NoGraphicsOptions) { switch (GlobalVars.UserConfiguration.GraphicsMode) { case Settings.Mode.OpenGLStable: switch (info.ClientLoadOptions) { case Settings.ClientLoadOptions.Client_2007: case Settings.ClientLoadOptions.Client_2008AndUp_LegacyOpenGL: case Settings.ClientLoadOptions.Client_2008AndUp_HasCharacterOnlyShadowsLegacyOpenGL: GraphicsMode = 2; break; case Settings.ClientLoadOptions.Client_2008AndUp: case Settings.ClientLoadOptions.Client_2008AndUp_QualityLevel21: GraphicsMode = 4; break; default: break; } break; case Settings.Mode.OpenGLExperimental: GraphicsMode = 4; break; case Settings.Mode.DirectX: GraphicsMode = 3; break; default: GraphicsMode = 1; break; } } } //default values are ultra settings int MeshDetail = 100; int ShadingQuality = 100; int GFXQualityLevel = 19; if (info.ClientLoadOptions == Settings.ClientLoadOptions.Client_2008AndUp_ForceAutomaticQL21 || info.ClientLoadOptions == Settings.ClientLoadOptions.Client_2008AndUp_QualityLevel21) { GFXQualityLevel = 21; } int MaterialQuality = 3; int AASamples = 8; int Bevels = 1; int Shadows_2008 = 1; int AA = 1; bool Shadows_2007 = true; switch (GlobalVars.UserConfiguration.QualityLevel) { case Settings.Level.Automatic: //set everything to automatic. Some ultra settings will still be enabled. AA = 0; Bevels = 0; Shadows_2008 = 0; GFXQualityLevel = 0; MaterialQuality = 0; Shadows_2007 = false; break; case Settings.Level.VeryLow: AA = 2; MeshDetail = 50; ShadingQuality = 50; GFXQualityLevel = 1; MaterialQuality = 1; AASamples = 1; Bevels = 2; Shadows_2008 = 2; Shadows_2007 = false; break; case Settings.Level.Low: AA = 2; MeshDetail = 50; ShadingQuality = 50; GFXQualityLevel = 5; MaterialQuality = 1; AASamples = 1; Bevels = 2; Shadows_2008 = 2; Shadows_2007 = false; break; case Settings.Level.Medium: MeshDetail = 75; ShadingQuality = 75; GFXQualityLevel = 10; MaterialQuality = 2; AASamples = 4; Bevels = 2; if (info.ClientLoadOptions == Settings.ClientLoadOptions.Client_2008AndUp_ForceAutomatic || info.ClientLoadOptions == Settings.ClientLoadOptions.Client_2008AndUp_ForceAutomaticQL21 || info.ClientLoadOptions == Settings.ClientLoadOptions.Client_2008AndUp_QualityLevel21 || info.ClientLoadOptions == Settings.ClientLoadOptions.Client_2008AndUp_HasCharacterOnlyShadowsLegacyOpenGL) { Shadows_2008 = 3; } Shadows_2007 = false; break; case Settings.Level.High: MeshDetail = 75; ShadingQuality = 75; GFXQualityLevel = 15; AASamples = 4; break; case Settings.Level.Ultra: default: break; } ApplyClientSettings(info, ClientName, GraphicsMode, MeshDetail, ShadingQuality, MaterialQuality, AA, AASamples, Bevels, Shadows_2008, Shadows_2007, "", GFXQualityLevel, "800x600", "1024x768", 0); } else { //save graphics mode. int GraphicsMode = 0; if (info.ClientLoadOptions == Settings.ClientLoadOptions.Client_2008AndUp_ForceAutomaticQL21 || info.ClientLoadOptions == Settings.ClientLoadOptions.Client_2008AndUp_ForceAutomatic) { GraphicsMode = 1; } else { if (info.ClientLoadOptions != Settings.ClientLoadOptions.Client_2007_NoGraphicsOptions || info.ClientLoadOptions != Settings.ClientLoadOptions.Client_2008AndUp_NoGraphicsOptions) { switch (GlobalVars.UserConfiguration.GraphicsMode) { case Settings.Mode.OpenGLStable: switch (info.ClientLoadOptions) { case Settings.ClientLoadOptions.Client_2007: case Settings.ClientLoadOptions.Client_2008AndUp_LegacyOpenGL: case Settings.ClientLoadOptions.Client_2008AndUp_HasCharacterOnlyShadowsLegacyOpenGL: GraphicsMode = 2; break; case Settings.ClientLoadOptions.Client_2008AndUp: case Settings.ClientLoadOptions.Client_2008AndUp_QualityLevel21: GraphicsMode = 4; break; default: break; } break; case Settings.Mode.OpenGLExperimental: GraphicsMode = 4; break; case Settings.Mode.DirectX: GraphicsMode = 3; break; default: GraphicsMode = 1; break; } } } ApplyClientSettings(info, ClientName, GraphicsMode, 0, 0, 0, 0, 0, 0, 0, false, "", 0, "800x600", "1024x768", 0, true); //just copy the file. string terms = "_" + ClientName; string[] dirs = Directory.GetFiles(GlobalPaths.ConfigDirClients); foreach (string dir in dirs) { if (dir.Contains(terms) && !dir.Contains("_default")) { FixedFileCopy(dir, Settings.GetPathForClientLoadOptions(info.ClientLoadOptions) + @"\" + Path.GetFileName(dir).Replace(terms, "") .Replace(dir.Substring(dir.LastIndexOf('-') + 1), "") .Replace("-", ".xml"), true); } } } } #if URI || LAUNCHER || CMD || BASICLAUNCHER catch (Exception ex) { LogExceptions(ex); #else catch (Exception) { #endif return; } } //oh god.... //we're using this one for custom graphics quality. Better than the latter. public static void ApplyClientSettings_custom(FileFormat.ClientInfo info, string ClientName, int MeshDetail, int ShadingQuality, int MaterialQuality, int AA, int AASamples, int Bevels, int Shadows_2008, bool Shadows_2007, string Style_2007, int GFXQualityLevel, string WindowResolution, string FullscreenResolution, int ModernResolution) { try { int GraphicsMode = 0; if (info.ClientLoadOptions == Settings.ClientLoadOptions.Client_2008AndUp_ForceAutomaticQL21 || info.ClientLoadOptions == Settings.ClientLoadOptions.Client_2008AndUp_ForceAutomatic) { GraphicsMode = 1; } else { if (info.ClientLoadOptions != Settings.ClientLoadOptions.Client_2007_NoGraphicsOptions || info.ClientLoadOptions != Settings.ClientLoadOptions.Client_2008AndUp_NoGraphicsOptions) { switch (GlobalVars.UserConfiguration.GraphicsMode) { case Settings.Mode.OpenGLStable: switch (info.ClientLoadOptions) { case Settings.ClientLoadOptions.Client_2007: case Settings.ClientLoadOptions.Client_2008AndUp_LegacyOpenGL: case Settings.ClientLoadOptions.Client_2008AndUp_HasCharacterOnlyShadowsLegacyOpenGL: GraphicsMode = 2; break; case Settings.ClientLoadOptions.Client_2008AndUp: case Settings.ClientLoadOptions.Client_2008AndUp_QualityLevel21: GraphicsMode = 4; break; default: break; } break; case Settings.Mode.OpenGLExperimental: GraphicsMode = 4; break; case Settings.Mode.DirectX: GraphicsMode = 3; break; default: GraphicsMode = 1; break; } } } ApplyClientSettings(info, ClientName, GraphicsMode, MeshDetail, ShadingQuality, MaterialQuality, AA, AASamples, Bevels, Shadows_2008, Shadows_2007, Style_2007, GFXQualityLevel, WindowResolution, FullscreenResolution, ModernResolution); } #if URI || LAUNCHER || CMD || BASICLAUNCHER catch (Exception ex) { LogExceptions(ex); #else catch (Exception) { #endif return; } } //it's worse. public static void ApplyClientSettings(FileFormat.ClientInfo info, string ClientName, int GraphicsMode, int MeshDetail, int ShadingQuality, int MaterialQuality, int AA, int AASamples, int Bevels, int Shadows_2008, bool Shadows_2007, string Style_2007, int GFXQualityLevel, string WindowResolution, string FullscreenResolution, int ModernResolution, bool onlyGraphicsMode = false) { try { string winRes = WindowResolution; string fullRes = FullscreenResolution; string terms = "_" + ClientName; string[] dirs = Directory.GetFiles(GlobalPaths.ConfigDirClients); foreach (string dir in dirs) { if (dir.Contains(terms) && !dir.Contains("_default")) { string oldfile = ""; string fixedfile = ""; XDocument doc = null; try { oldfile = File.ReadAllText(dir); fixedfile = RobloxXML.RemoveInvalidXmlChars(RobloxXML.ReplaceHexadecimalSymbols(oldfile)); doc = XDocument.Parse(fixedfile); } #if URI || LAUNCHER || CMD || BASICLAUNCHER catch (Exception ex) { LogExceptions(ex); #else catch (Exception) { #endif return; } try { if (GraphicsMode != 0) { RobloxXML.EditRenderSettings(doc, "graphicsMode", GraphicsMode.ToString(), XMLTypes.Token); } if (!onlyGraphicsMode) { RobloxXML.EditRenderSettings(doc, "maxMeshDetail", MeshDetail.ToString(), XMLTypes.Float); RobloxXML.EditRenderSettings(doc, "maxShadingQuality", ShadingQuality.ToString(), XMLTypes.Float); RobloxXML.EditRenderSettings(doc, "minMeshDetail", MeshDetail.ToString(), XMLTypes.Float); RobloxXML.EditRenderSettings(doc, "minShadingQuality", ShadingQuality.ToString(), XMLTypes.Float); RobloxXML.EditRenderSettings(doc, "AluminumQuality", MaterialQuality.ToString(), XMLTypes.Token); RobloxXML.EditRenderSettings(doc, "CompoundMaterialQuality", MaterialQuality.ToString(), XMLTypes.Token); RobloxXML.EditRenderSettings(doc, "CorrodedMetalQuality", MaterialQuality.ToString(), XMLTypes.Token); RobloxXML.EditRenderSettings(doc, "DiamondPlateQuality", MaterialQuality.ToString(), XMLTypes.Token); RobloxXML.EditRenderSettings(doc, "GrassQuality", MaterialQuality.ToString(), XMLTypes.Token); RobloxXML.EditRenderSettings(doc, "IceQuality", MaterialQuality.ToString(), XMLTypes.Token); RobloxXML.EditRenderSettings(doc, "PlasticQuality", MaterialQuality.ToString(), XMLTypes.Token); RobloxXML.EditRenderSettings(doc, "SlateQuality", MaterialQuality.ToString(), XMLTypes.Token); // fix truss detail. We're keeping it at 0. RobloxXML.EditRenderSettings(doc, "TrussDetail", "0", XMLTypes.Token); RobloxXML.EditRenderSettings(doc, "WoodQuality", MaterialQuality.ToString(), XMLTypes.Token); RobloxXML.EditRenderSettings(doc, "Antialiasing", AA.ToString(), XMLTypes.Token); RobloxXML.EditRenderSettings(doc, "AASamples", AASamples.ToString(), XMLTypes.Token); RobloxXML.EditRenderSettings(doc, "Bevels", Bevels.ToString(), XMLTypes.Token); RobloxXML.EditRenderSettings(doc, "Shadow", Shadows_2008.ToString(), XMLTypes.Token); RobloxXML.EditRenderSettings(doc, "Shadows", Shadows_2007.ToString().ToLower(), XMLTypes.Bool); RobloxXML.EditRenderSettings(doc, "shadows", Shadows_2007.ToString().ToLower(), XMLTypes.Bool); RobloxXML.EditRenderSettings(doc, "_skinFile", !string.IsNullOrWhiteSpace(Style_2007) ? @"Styles\" + Style_2007 : "", XMLTypes.String); RobloxXML.EditRenderSettings(doc, "QualityLevel", GFXQualityLevel.ToString(), XMLTypes.Token); RobloxXML.EditRenderSettings(doc, "FullscreenSizePreference", fullRes.ToString(), XMLTypes.Vector2Int16); RobloxXML.EditRenderSettings(doc, "FullscreenSize", fullRes.ToString(), XMLTypes.Vector2Int16); RobloxXML.EditRenderSettings(doc, "WindowSizePreference", winRes.ToString(), XMLTypes.Vector2Int16); RobloxXML.EditRenderSettings(doc, "WindowSize", winRes.ToString(), XMLTypes.Vector2Int16); RobloxXML.EditRenderSettings(doc, "Resolution", ModernResolution.ToString(), XMLTypes.Token); } } #if URI || LAUNCHER || CMD || BASICLAUNCHER catch (Exception ex) { LogExceptions(ex); #else catch (Exception) { #endif return; } finally { doc.Save(dir); FixedFileCopy(dir, Settings.GetPathForClientLoadOptions(info.ClientLoadOptions) + @"\" + Path.GetFileName(dir).Replace(terms, "") .Replace(dir.Substring(dir.LastIndexOf('-') + 1), "") .Replace("-", ".xml"), true); } } } } #if URI || LAUNCHER || CMD || BASICLAUNCHER catch (Exception ex) { LogExceptions(ex); #else catch (Exception) { #endif return; } } public static string GetLuaFileName(ScriptType type) { return GetLuaFileName(GlobalVars.UserConfiguration.SelectedClient, type); } public static string GetLuaFileName(string ClientName, ScriptType type) { string luafile = ""; if (!GlobalVars.SelectedClientInfo.Fix2007) { luafile = "rbxasset://scripts\\\\" + GlobalPaths.ScriptName + ".lua"; } else { if (GlobalVars.SelectedClientInfo.SeperateFolders) { luafile = GlobalPaths.ClientDir + @"\\" + ClientName + @"\\" + GetClientSeperateFolderName(type) + @"\\content\\scripts\\" + GlobalPaths.ScriptGenName + ".lua"; } else { luafile = GlobalPaths.ClientDir + @"\\" + ClientName + @"\\content\\scripts\\" + GlobalPaths.ScriptGenName + ".lua"; } } return luafile; } public static string GetClientSeperateFolderName(ScriptType type) { string rbxfolder = ""; switch (type) { case ScriptType.Client: case ScriptType.Solo: case ScriptType.EasterEgg: rbxfolder = "client"; break; case ScriptType.Server: rbxfolder = "server"; break; case ScriptType.Studio: rbxfolder = "studio"; break; case ScriptType.None: default: rbxfolder = ""; break; } return rbxfolder; } public static string GetClientEXEDir(ScriptType type) { return GetClientEXEDir(GlobalVars.UserConfiguration.SelectedClient, type); } public static string GetClientEXEDir(string ClientName, ScriptType type) { string rbxexe = ""; string BasePath = GlobalPaths.ClientDir + @"\\" + ClientName; if (GlobalVars.SelectedClientInfo.LegacyMode) { rbxexe = BasePath + @"\\RobloxApp.exe"; } else if (GlobalVars.SelectedClientInfo.UsesCustomClientEXEName) { rbxexe = BasePath + @"\\" + GlobalVars.SelectedClientInfo.CustomClientEXEName; } else if (GlobalVars.SelectedClientInfo.SeperateFolders) { switch (type) { case ScriptType.Client: case ScriptType.Solo: case ScriptType.EasterEgg: rbxexe = BasePath + @"\\" + GetClientSeperateFolderName(type) + @"\\RobloxApp_client.exe"; break; case ScriptType.Server: rbxexe = BasePath + @"\\" + GetClientSeperateFolderName(type) + @"\\RobloxApp_server.exe"; break; case ScriptType.Studio: rbxexe = BasePath + @"\\" + GetClientSeperateFolderName(type) + @"\\RobloxApp_studio.exe"; break; case ScriptType.None: default: rbxexe = BasePath + @"\\RobloxApp.exe"; break; } } else { switch (type) { case ScriptType.Client: rbxexe = BasePath + @"\\RobloxApp_client.exe"; break; case ScriptType.Server: rbxexe = BasePath + @"\\RobloxApp_server.exe"; break; case ScriptType.Studio: rbxexe = BasePath + @"\\RobloxApp_studio.exe"; break; case ScriptType.Solo: case ScriptType.EasterEgg: rbxexe = BasePath + @"\\RobloxApp_solo.exe"; break; case ScriptType.None: default: rbxexe = BasePath + @"\\RobloxApp.exe"; break; } } return rbxexe; } #if URI public static void LaunchRBXClient(ScriptType type, bool no3d, bool nomap, EventHandler e, Label label) #elif LAUNCHER public static void LaunchRBXClient(ScriptType type, bool no3d, bool nomap, EventHandler e, RichTextBox box) #else public static void LaunchRBXClient(ScriptType type, bool no3d, bool nomap, EventHandler e) #endif { #if URI LaunchRBXClient(GlobalVars.UserConfiguration.SelectedClient, type, no3d, nomap, e, label); #elif LAUNCHER LaunchRBXClient(GlobalVars.UserConfiguration.SelectedClient, type, no3d, nomap, e, box); #else LaunchRBXClient(GlobalVars.UserConfiguration.SelectedClient, type, no3d, nomap, e); #endif } #if URI public static void LaunchRBXClient(string ClientName, ScriptType type, bool no3d, bool nomap, EventHandler e, Label label) #elif LAUNCHER public static void LaunchRBXClient(string ClientName, ScriptType type, bool no3d, bool nomap, EventHandler e, RichTextBox box) #else public static void LaunchRBXClient(string ClientName, ScriptType type, bool no3d, bool nomap, EventHandler e) #endif { switch (type) { case ScriptType.Client: ReloadLoadoutValue(true); if (!GlobalVars.LocalPlayMode && GlobalVars.GameOpened != ScriptType.Server) { goto default; } break; case ScriptType.Server: if (GlobalVars.GameOpened == ScriptType.Server) { #if LAUNCHER if (box != null) { ConsolePrint("ERROR - Failed to launch Novetus. (A server is already running.)", 2, box); } #elif CMD ConsolePrint("ERROR - Failed to launch Novetus. (A server is already running.)", 2); #endif #if LAUNCHER MessageBox.Show("Failed to launch Novetus. (Error: A server is already running.)", "Novetus - Error", MessageBoxButtons.OK, MessageBoxIcon.Error); #endif return; } else if (GlobalVars.UserConfiguration.FirstServerLaunch) { string hostingTips = "For your first time hosting a server, make sure your server's port forwarded (set up in your router), going through a tunnel server, or running from UPnP.\n" + "If your port is forwarded or you are going through a tunnel server, make sure your port is set up as UDP, not TCP.\n" + "Roblox does NOT use TCP, only UDP. However, if your server doesn't work with just UDP, feel free to set up TCP too as that might help the issue in some cases."; #if LAUNCHER MessageBox.Show(hostingTips, "Novetus - Hosting Tips", MessageBoxButtons.OK, MessageBoxIcon.Information); #elif CMD ConsolePrint(hostingTips + "\nPress any key to continue...", 4); Console.ReadKey(); #endif GlobalVars.UserConfiguration.FirstServerLaunch = false; } else { goto default; } break; case ScriptType.Solo: ReloadLoadoutValue(true); goto default; default: if (GlobalVars.GameOpened != ScriptType.None) { #if LAUNCHER if (box != null) { ConsolePrint("ERROR - Failed to launch Novetus. (A game is already running.)", 2, box); } #elif CMD ConsolePrint("ERROR - Failed to launch Novetus. (A game is already running.)", 2); #endif #if LAUNCHER MessageBox.Show("Failed to launch Novetus. (Error: A game is already running.)", "Novetus - Error", MessageBoxButtons.OK, MessageBoxIcon.Error); #endif return; } break; } #if LAUNCHER ReadClientValues(ClientName, box); #else ReadClientValues(ClientName); #endif string luafile = GetLuaFileName(ClientName, type); string rbxexe = GetClientEXEDir(ClientName, type); string mapfile = type.Equals(ScriptType.EasterEgg) ? GlobalPaths.DataDir + "\\Appreciation.rbxl" : (nomap ? "" : GlobalVars.UserConfiguration.MapPath); string mapname = type.Equals(ScriptType.EasterEgg) ? "" : (nomap ? "" : GlobalVars.UserConfiguration.Map); FileFormat.ClientInfo info = GetClientInfoValues(ClientName); string quote = "\""; string args = ""; GlobalVars.ValidatedExtraFiles = 0; if (!GlobalVars.AdminMode && !info.AlreadyHasSecurity) { string validstart = ""; string validend = ""; foreach (string line in info.CommandLineArgs.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries)) { if (line.Contains(validstart) && line.Contains(validend)) { string extractedFile = ScriptFuncs.ClientScript.GetArgsFromTag(line, validstart, validend); if (!string.IsNullOrWhiteSpace(extractedFile)) { try { string[] parsedFileParams = extractedFile.Split('|'); string filePath = parsedFileParams[0]; string fileMD5 = parsedFileParams[1]; string fullFilePath = GlobalPaths.ClientDir + @"\\" + GlobalVars.UserConfiguration.SelectedClient + @"\\" + filePath; if (!SecurityFuncs.CheckMD5(fileMD5, fullFilePath)) { #if URI if (label != null) { label.Text = "The client has been detected as modified."; } #elif LAUNCHER if (box != null) { ConsolePrint("ERROR - Failed to launch Novetus. (The client has been detected as modified.)", 2, box); } #elif CMD ConsolePrint("ERROR - Failed to launch Novetus. (The client has been detected as modified.)", 2); #endif #if URI || LAUNCHER MessageBox.Show("Failed to launch Novetus. (Error: The client has been detected as modified.)", "Novetus - Error", MessageBoxButtons.OK, MessageBoxIcon.Error); #endif return; } else { GlobalVars.ValidatedExtraFiles += 1; } } #if URI || LAUNCHER || CMD || BASICLAUNCHER catch (Exception ex) { LogExceptions(ex); #else catch (Exception) { #endif continue; } } } } } if (info.CommandLineArgs.Contains("%args%")) { if (!info.Fix2007) { args = quote + mapfile + "\" -script \" dofile('" + luafile + "'); " + ScriptFuncs.Generator.GetScriptFuncForType(ClientName, type) + (!string.IsNullOrWhiteSpace(GlobalPaths.AddonScriptPath) ? " dofile('" + GlobalPaths.AddonScriptPath + "');" : "") + quote + (no3d ? " -no3d" : ""); } else { ScriptFuncs.Generator.GenerateScriptForClient(ClientName, type); args = "-script " + quote + luafile + quote + (no3d ? " -no3d" : "") + " " + quote + mapfile + quote; } } else { args = ScriptFuncs.ClientScript.CompileScript(ClientName, info.CommandLineArgs, ScriptFuncs.ClientScript.GetTagFromType(type, false, no3d), ScriptFuncs.ClientScript.GetTagFromType(type, true, no3d), mapfile, luafile, rbxexe); } if (args == "") return; try { #if LAUNCHER ConsolePrint("Client Loaded.", 4, box); #elif CMD ConsolePrint("Client Loaded.", 4); #elif URI #endif if (type.Equals(ScriptType.Client)) { if (!GlobalVars.AdminMode) { if (info.AlreadyHasSecurity != true) { if (SecurityFuncs.checkClientMD5(ClientName) && SecurityFuncs.checkScriptMD5(ClientName)) { OpenClient(type, rbxexe, args, ClientName, mapname, e); } else { #if URI if (label != null) { label.Text = "The client has been detected as modified."; } #elif LAUNCHER if (box != null) { ConsolePrint("ERROR - Failed to launch Novetus. (The client has been detected as modified.)", 2, box); } #elif CMD ConsolePrint("ERROR - Failed to launch Novetus. (The client has been detected as modified.)", 2); #endif #if URI || LAUNCHER MessageBox.Show("Failed to launch Novetus. (Error: The client has been detected as modified.)", "Novetus - Error", MessageBoxButtons.OK, MessageBoxIcon.Error); #endif return; } } else { OpenClient(type, rbxexe, args, ClientName, mapname, e); } } else { OpenClient(type, rbxexe, args, ClientName, mapname, e); } } else { OpenClient(type, rbxexe, args, ClientName, mapname, e); } switch (type) { case ScriptType.Client: if (!GlobalVars.LocalPlayMode && GlobalVars.GameOpened != ScriptType.Server) { goto default; } break; case ScriptType.Studio: break; case ScriptType.Server: #if LAUNCHER PingMasterServer(1, "Server will now display on the defined master server.", box); #elif CMD PingMasterServer(1, "Server will now display on the defined master server."); #endif goto default; default: GlobalVars.GameOpened = type; break; } GlobalVars.ValidatedExtraFiles = 0; } #if URI || LAUNCHER || CMD || BASICLAUNCHER catch (Exception ex) #else catch (Exception) #endif { #if URI if (label != null) { label.Text = "Error: " + ex.Message; } #elif LAUNCHER if (box != null) { ConsolePrint("ERROR - Failed to launch Novetus. (Error: " + ex.Message + ")", 2, box); } #elif CMD ConsolePrint("ERROR - Failed to launch Novetus. (Error: " + ex.Message + ")", 2); #endif #if URI || LAUNCHER MessageBox.Show("Failed to launch Novetus. (Error: " + ex.Message + ")", "Novetus - Error", MessageBoxButtons.OK, MessageBoxIcon.Error); #endif #if URI || LAUNCHER || CMD || BASICLAUNCHER LogExceptions(ex); #endif } } #if LAUNCHER public static void PingMasterServer(int online, string reason, RichTextBox box) #else public static void PingMasterServer(int online, string reason) #endif { string pingURL = "http://" + GlobalVars.UserConfiguration.ServerBrowserServerAddress + "/query.php?name=" + GlobalVars.UserConfiguration.ServerBrowserServerName + "&ip=" + (!string.IsNullOrWhiteSpace(GlobalVars.UserConfiguration.AlternateServerIP) ? GlobalVars.UserConfiguration.AlternateServerIP : GlobalVars.ExternalIP) + "&port=" + GlobalVars.UserConfiguration.RobloxPort + "&client=" + GlobalVars.UserConfiguration.SelectedClient + "&version=" + GlobalVars.ProgramInformation.Version + "&online=" + online; #if LAUNCHER ConsolePrint("Pinging master server. " + reason, 4, box); #elif CMD ConsolePrint("Pinging master server. " + reason, 4); #endif string response = HttpGet(pingURL); #if LAUNCHER ConsolePrint(!response.Contains("ERROR:") ? "Pinging was successful." : "Unable to connect to the master server. " + response, response.Contains("ERROR:") ? 2 : 4, box); #elif CMD ConsolePrint(!response.Contains("ERROR:") ? "Pinging was successful." : "Unable to connect to the master server. " + response, response.Contains("ERROR:") ? 2 : 4); #endif } public static void OpenClient(ScriptType type, string rbxexe, string args, string clientname, string mapname, EventHandler e, bool customization = false) { Process client = new Process(); client.StartInfo.FileName = rbxexe; client.StartInfo.WorkingDirectory = Path.GetDirectoryName(rbxexe); client.StartInfo.Arguments = args; if (e != null) { client.EnableRaisingEvents = true; client.Exited += e; } client.Start(); client.PriorityClass = GlobalVars.UserConfiguration.Priority; if (!customization) { SecurityFuncs.RenameWindow(client, type, clientname, mapname); if (e != null) { UpdateRichPresence(GetStateForType(type), clientname, mapname); } } #if CMD GlobalVars.ProcessID = client.Id; CreateTXT(); #endif } #if LAUNCHER public static void ConsolePrint(string text, int type, RichTextBox box, bool noLog = false, bool noTime = false) { if (box == null) return; if (!noTime) { box.AppendText("[" + DateTime.Now.ToShortTimeString() + "] - ", Color.White); } switch (type) { case 1: box.AppendText(text, Color.White); if (!noLog) LogPrint(text); break; case 2: box.AppendText(text, Color.Red); if (!noLog) LogPrint(text, 2); break; case 3: box.AppendText(text, Color.Lime); if (!noLog) LogPrint(text); break; case 4: box.AppendText(text, Color.Aqua); if (!noLog) LogPrint(text); break; case 5: box.AppendText(text, Color.Yellow); if (!noLog) LogPrint(text, 3); break; case 6: box.AppendText(text, Color.LightSalmon); if (!noLog) LogPrint(text); break; case 0: default: box.AppendText(text, Color.Black); if (!noLog) LogPrint(text); break; } box.AppendText(Environment.NewLine, Color.White); } #elif CMD public static void ConsolePrint(string text, int type, bool notime = false, bool noLog = false) { if (!notime) { ConsoleText("[" + DateTime.Now.ToShortTimeString() + "] - ", ConsoleColor.White); } switch (type) { case 2: ConsoleText(text, ConsoleColor.Red); if (!noLog) LogPrint(text, 2); break; case 3: ConsoleText(text, ConsoleColor.Green); if (!noLog) LogPrint(text); break; case 4: ConsoleText(text, ConsoleColor.Cyan); if (!noLog) LogPrint(text); break; case 5: ConsoleText(text, ConsoleColor.Yellow); if (!noLog) LogPrint(text, 3); break; case 1: default: ConsoleText(text, ConsoleColor.White); if (!noLog) LogPrint(text); break; } ConsoleText(Environment.NewLine, ConsoleColor.White); } public static void ConsoleText(string text, ConsoleColor color) { Console.ForegroundColor = color; Console.Write(text); } public static void CreateTXT() { if (GlobalVars.RequestToOutputInfo) { string[] lines1 = { SecurityFuncs.Base64Encode(!string.IsNullOrWhiteSpace(GlobalVars.UserConfiguration.AlternateServerIP) ? GlobalVars.UserConfiguration.AlternateServerIP : GlobalVars.ExternalIP), SecurityFuncs.Base64Encode(GlobalVars.UserConfiguration.RobloxPort.ToString()), SecurityFuncs.Base64Encode(GlobalVars.UserConfiguration.SelectedClient) }; string URI = "novetus://" + SecurityFuncs.Base64Encode(string.Join("|", lines1), true); string[] lines2 = { SecurityFuncs.Base64Encode("localhost"), SecurityFuncs.Base64Encode(GlobalVars.UserConfiguration.RobloxPort.ToString()), SecurityFuncs.Base64Encode(GlobalVars.UserConfiguration.SelectedClient) }; string URI2 = "novetus://" + SecurityFuncs.Base64Encode(string.Join("|", lines2), true); string[] text = { "Process ID: " + (GlobalVars.ProcessID == 0 ? "N/A" : GlobalVars.ProcessID.ToString()), "Don't copy the Process ID when sharing the server.", "--------------------", "Server Info:", "Client: " + GlobalVars.UserConfiguration.SelectedClient, "IP: " + (!string.IsNullOrWhiteSpace(GlobalVars.UserConfiguration.AlternateServerIP) ? GlobalVars.UserConfiguration.AlternateServerIP : GlobalVars.ExternalIP), "Port: " + GlobalVars.UserConfiguration.RobloxPort.ToString(), "Map: " + GlobalVars.UserConfiguration.Map, "Players: " + GlobalVars.UserConfiguration.PlayerLimit, "Version: Novetus " + GlobalVars.ProgramInformation.Version, "Online URI Link:", URI, "Local URI Link:", URI2 }; string txt = GlobalPaths.BasePath + "\\" + GlobalVars.ServerInfoFileName; File.WriteAllLines(txt, text); ConsolePrint("Server Information sent to file " + txt, 4); } } #endif public static void LogPrint(string text, int type = 1) { Logger log = LogManager.GetCurrentClassLogger(); switch (type) { case 2: log.Error(text); break; case 3: log.Warn(text); break; default: log.Info(text); break; } } public static void CreateAssetCacheDirectories() { if (!Directory.Exists(GlobalPaths.AssetCacheDirFonts)) { Directory.CreateDirectory(GlobalPaths.AssetCacheDirFonts); } if (!Directory.Exists(GlobalPaths.AssetCacheDirSky)) { Directory.CreateDirectory(GlobalPaths.AssetCacheDirSky); } if (!Directory.Exists(GlobalPaths.AssetCacheDirSounds)) { Directory.CreateDirectory(GlobalPaths.AssetCacheDirSounds); } if (!Directory.Exists(GlobalPaths.AssetCacheDirTextures)) { Directory.CreateDirectory(GlobalPaths.AssetCacheDirTextures); } if (!Directory.Exists(GlobalPaths.AssetCacheDirTexturesGUI)) { Directory.CreateDirectory(GlobalPaths.AssetCacheDirTexturesGUI); } if (!Directory.Exists(GlobalPaths.AssetCacheDirScripts)) { Directory.CreateDirectory(GlobalPaths.AssetCacheDirScripts); } if (!Directory.Exists(GlobalPaths.AssetCacheDirAssets)) { Directory.CreateDirectory(GlobalPaths.AssetCacheDirAssets); } } // Credit to Carrot for the original code. Rewote it to be smaller. public static string CryptStringWithByte(string word) { byte[] bytes = Encoding.ASCII.GetBytes(word); string result = ""; for (int i = 0; i < bytes.Length; i++) { result += Convert.ToChar(0x55 ^ bytes[i]); } return result; } //https://stackoverflow.com/questions/1879395/how-do-i-generate-a-stream-from-a-string public static Stream GenerateStreamFromString(string s) { var stream = new MemoryStream(); var writer = new StreamWriter(stream); writer.Write(s); writer.Flush(); stream.Position = 0; return stream; } //https://stackoverflow.com/questions/14488796/does-net-provide-an-easy-way-convert-bytes-to-kb-mb-gb-etc private static readonly string[] SizeSuffixes = { "bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB" }; public static string SizeSuffix(Int64 value, int decimalPlaces = 1) { if (decimalPlaces < 0) { throw new ArgumentOutOfRangeException("decimalPlaces"); } if (value < 0) { return "-" + SizeSuffix(-value, decimalPlaces); } if (value == 0) { return string.Format("{0:n" + decimalPlaces + "} bytes", 0); } // mag is 0 for bytes, 1 for KB, 2, for MB, etc. int mag = (int)Math.Log(value, 1024); // 1L << (mag * 10) == 2 ^ (10 * mag) // [i.e. the number of bytes in the unit corresponding to mag] decimal adjustedSize = (decimal)value / (1L << (mag * 10)); // make adjustment when the value is large enough that // it would round up to 1000 or more if (Math.Round(adjustedSize, decimalPlaces) >= 1000) { mag += 1; adjustedSize /= 1024; } return string.Format("{0:n" + decimalPlaces + "} {1}", adjustedSize, SizeSuffixes[mag]); } //https://stackoverflow.com/questions/11927116/getting-files-recursively-skip-files-directories-that-cannot-be-read public static string[] FindAllFiles(string rootDir) { var pathsToSearch = new Queue(); var foundFiles = new List(); pathsToSearch.Enqueue(rootDir); while (pathsToSearch.Count > 0) { var dir = pathsToSearch.Dequeue(); try { var files = Directory.GetFiles(dir); foreach (var file in Directory.GetFiles(dir)) { foundFiles.Add(file); } foreach (var subDir in Directory.GetDirectories(dir)) { pathsToSearch.Enqueue(subDir); } } #if URI || LAUNCHER || CMD || BASICLAUNCHER catch (Exception ex) { LogExceptions(ex); #else catch (Exception) { #endif } } return foundFiles.ToArray(); } //https://stackoverflow.com/questions/66667263/i-want-to-remove-special-characters-from-file-name-without-affecting-extension-i //https://stackoverflow.com/questions/3218910/rename-a-file-in-c-sharp public static bool FileHasInvalidChars(string path) { string fileName = Path.GetFileName(path); if (Regex.Match(fileName, @"[^\w-.'_!()& ]") != Match.Empty) { return true; } return false; } public static void RenameFileWithInvalidChars(string path) { try { if (!FileHasInvalidChars(path)) return; string pathWithoutFilename = Path.GetDirectoryName(path); string fileName = Path.GetFileName(path); fileName = Regex.Replace(fileName, @"[^\w-.'_!()& ]", ""); string finalPath = pathWithoutFilename + "\\" + fileName; FixedFileMove(path, finalPath, File.Exists(finalPath)); } #if URI || LAUNCHER || CMD || BASICLAUNCHER catch (Exception ex) { LogExceptions(ex); #else catch (Exception) { #endif } } #if LAUNCHER || CMD || URI || BASICLAUNCHER public static void LogExceptions(Exception ex) { LogPrint("EXCEPTION|MESSAGE: " + (ex.Message != null ? ex.Message.ToString() : "N/A"), 2); LogPrint("EXCEPTION|STACK TRACE: " + (!string.IsNullOrWhiteSpace(ex.StackTrace) ? ex.StackTrace : "N/A"), 2); LogPrint("EXCEPTION|ADDITIONAL INFO: " + (ex != null ? ex.ToString() : "N/A"), 2); } #endif //http://stevenhollidge.blogspot.com/2012/06/async-taskdelay.html public static Task Delay(int milliseconds) { var tcs = new TaskCompletionSource(); new System.Threading.Timer(_ => tcs.SetResult(null)).Change(milliseconds, -1); return tcs.Task; } #if LAUNCHER || URI public static void LaunchCharacterCustomization() { //https://stackoverflow.com/questions/9029351/close-all-open-forms-except-the-main-menu-in-c-sharp FormCollection fc = Application.OpenForms; foreach (Form frm in fc) { //iterate through if (frm.Name == "CharacterCustomizationExtended" || frm.Name == "CharacterCustomizationCompact") { frm.Close(); break; } } switch (GlobalVars.UserConfiguration.LauncherStyle) { case Settings.Style.Extended: CharacterCustomizationExtended ccustom = new CharacterCustomizationExtended(); ccustom.Show(); break; case Settings.Style.Compact: CharacterCustomizationCompact ccustom2 = new CharacterCustomizationCompact(); ccustom2.Show(); break; case Settings.Style.Stylish: default: CharacterCustomizationExtended ccustom3 = new CharacterCustomizationExtended(); ccustom3.Show(); break; } } #endif //https://stackoverflow.com/questions/27108264/how-to-properly-make-a-http-web-get-request public static string HttpGet(string uri) { try { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) using (Stream stream = response.GetResponseStream()) using (StreamReader reader = new StreamReader(stream)) { return reader.ReadToEnd(); } } catch (Exception ex) { #if URI || LAUNCHER || CMD || BASICLAUNCHER LogExceptions(ex); #endif return "ERROR: " + ex.Message; } } public static void DrawBorderSimple(Graphics graphics, Rectangle bounds, Color color, ButtonBorderStyle style, int width) { //AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ControlPaint.DrawBorder(graphics, bounds, color, width, style, color, width, style, color, width, style, color, width, style); } public static bool IsClientValid(string client) { string clientdir = GlobalPaths.ClientDir; DirectoryInfo dinfo = new DirectoryInfo(clientdir); DirectoryInfo[] Dirs = dinfo.GetDirectories(); foreach (DirectoryInfo dir in Dirs) { if (dir.Name == client) { return true; } } return false; } public static bool IsIPValid(string IP) { IPAddress address; if (IPAddress.TryParse(IP, out address)) { switch (address.AddressFamily) { case System.Net.Sockets.AddressFamily.InterNetwork: return true; case System.Net.Sockets.AddressFamily.InterNetworkV6: default: break; } } return false; } } #endregion