#region Usings using Nini.Config; using System; using System.Diagnostics; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Linq; using System.Reflection; using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Windows.Forms; #endregion #region Global Functions public class GlobalFuncs { public static void ReadInfoFile(string infopath, bool cmd = false) { //READ string versionbranch, defaultclient, defaultmap, regclient1, regclient2, issnapshot, snapshottemplate, snapshotrevision; IniConfigSource ini = new IniConfigSource(infopath); string section = "ProgramInfo"; //not using the GlobalVars definitions as those are empty until we fill them in. versionbranch = ini.Configs[section].Get("Branch", "0.0"); defaultclient = ini.Configs[section].Get("DefaultClient", "2009E"); defaultmap = ini.Configs[section].Get("DefaultMap", "Dev - Baseplate2048.rbxl"); regclient1 = ini.Configs[section].Get("UserAgentRegisterClient1", "2007M"); regclient2 = ini.Configs[section].Get("UserAgentRegisterClient2", "2009L"); issnapshot = ini.Configs[section].Get("IsSnapshot", "False"); snapshottemplate = ini.Configs[section].Get("SnapshotTemplate", "%version% Snapshot (%build%.%revision%.%snapshot-revision%)"); snapshotrevision = ini.Configs[section].Get("SnapshotRevision", "1"); try { GlobalVars.IsSnapshot = Convert.ToBoolean(issnapshot); if (GlobalVars.IsSnapshot) { if (cmd) { var versionInfo = FileVersionInfo.GetVersionInfo(GlobalPaths.RootPathLauncher + "\\Novetus.exe"); GlobalVars.ProgramInformation.Version = snapshottemplate.Replace("%version%", versionbranch) .Replace("%build%", versionInfo.ProductBuildPart.ToString()) .Replace("%revision%", versionInfo.FilePrivatePart.ToString()) .Replace("%snapshot-revision%", snapshotrevision); } else { GlobalVars.ProgramInformation.Version = snapshottemplate.Replace("%version%", versionbranch) .Replace("%build%", Assembly.GetExecutingAssembly().GetName().Version.Build.ToString()) .Replace("%revision%", Assembly.GetExecutingAssembly().GetName().Version.Revision.ToString()) .Replace("%snapshot-revision%", snapshotrevision); } string changelog = GlobalPaths.BasePath + "\\changelog.txt"; if (File.Exists(changelog)) { string[] changelogedit = File.ReadAllLines(changelog); if (!changelogedit[0].Equals(GlobalVars.ProgramInformation.Version)) { changelogedit[0] = GlobalVars.ProgramInformation.Version; File.WriteAllLines(changelog, changelogedit); } } } 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.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; } catch (Exception) { ReadInfoFile(infopath, cmd); } } public static void Config(string cfgpath, bool write) { if (write) { if (!File.Exists(cfgpath)) { IniConfigSource createINI = new IniConfigSource(); createINI.AddConfig("Config"); createINI.Save(cfgpath); Config(cfgpath, true); } //WRITE IniConfigSource ini = new IniConfigSource(cfgpath); string section = "Config"; ini.Configs[section].Set("CloseOnLaunch", GlobalVars.UserConfiguration.CloseOnLaunch.ToString()); ini.Configs[section].Set("UserID", GlobalVars.UserConfiguration.UserID.ToString()); ini.Configs[section].Set("PlayerName", GlobalVars.UserConfiguration.PlayerName.ToString()); ini.Configs[section].Set("SelectedClient", GlobalVars.UserConfiguration.SelectedClient.ToString()); ini.Configs[section].Set("Map", GlobalVars.UserConfiguration.Map.ToString()); ini.Configs[section].Set("RobloxPort", GlobalVars.UserConfiguration.RobloxPort.ToString()); ini.Configs[section].Set("PlayerLimit", GlobalVars.UserConfiguration.PlayerLimit.ToString()); ini.Configs[section].Set("UPnP", GlobalVars.UserConfiguration.UPnP.ToString()); ini.Configs[section].Set("ItemMakerDisableHelpMessage", GlobalVars.UserConfiguration.DisabledItemMakerHelp.ToString()); ini.Configs[section].Set("PlayerTripcode", SecurityFuncs.Base64Encode(GlobalVars.UserConfiguration.PlayerTripcode.ToString())); ini.Configs[section].Set("DiscordRichPresence", GlobalVars.UserConfiguration.DiscordPresence.ToString()); ini.Configs[section].Set("MapPath", GlobalVars.UserConfiguration.MapPath.ToString()); ini.Configs[section].Set("MapPathSnip", GlobalVars.UserConfiguration.MapPathSnip.ToString()); ini.Configs[section].Set("GraphicsMode", Settings.GraphicsOptions.GetIntForMode(GlobalVars.UserConfiguration.GraphicsMode).ToString()); ini.Configs[section].Set("ReShade", GlobalVars.UserConfiguration.ReShade.ToString()); ini.Configs[section].Set("QualityLevel", Settings.GraphicsOptions.GetIntForLevel(GlobalVars.UserConfiguration.QualityLevel).ToString()); ini.Configs[section].Set("Style", Settings.UIOptions.GetIntForStyle(GlobalVars.UserConfiguration.LauncherStyle).ToString()); ini.Configs[section].Set("AssetLocalizerSaveBackups", GlobalVars.UserConfiguration.AssetLocalizerSaveBackups.ToString()); ini.Save(); } else { try { //READ string closeonlaunch, userid, name, selectedclient, map, port, limit, upnp, disablehelpmessage, tripcode, discord, mappath, mapsnip, graphics, reshade, qualitylevel, style, savebackups; IniConfigSource ini = new IniConfigSource(cfgpath); string section = "Config"; closeonlaunch = ini.Configs[section].Get("CloseOnLaunch", GlobalVars.UserConfiguration.CloseOnLaunch.ToString()); userid = ini.Configs[section].Get("UserID", GlobalVars.UserConfiguration.UserID.ToString()); name = ini.Configs[section].Get("PlayerName", GlobalVars.UserConfiguration.PlayerName.ToString()); selectedclient = ini.Configs[section].Get("SelectedClient", GlobalVars.UserConfiguration.SelectedClient.ToString()); map = ini.Configs[section].Get("Map", GlobalVars.UserConfiguration.Map.ToString()); port = ini.Configs[section].Get("RobloxPort", GlobalVars.UserConfiguration.RobloxPort.ToString()); limit = ini.Configs[section].Get("PlayerLimit", GlobalVars.UserConfiguration.PlayerLimit.ToString()); upnp = ini.Configs[section].Get("UPnP", GlobalVars.UserConfiguration.UPnP.ToString()); disablehelpmessage = ini.Configs[section].Get("ItemMakerDisableHelpMessage", GlobalVars.UserConfiguration.DisabledItemMakerHelp.ToString()); tripcode = ini.Configs[section].Get("PlayerTripcode", GenerateAndReturnTripcode()); discord = ini.Configs[section].Get("DiscordRichPresence", GlobalVars.UserConfiguration.DiscordPresence.ToString()); mappath = ini.Configs[section].Get("MapPath", GlobalVars.UserConfiguration.MapPath.ToString()); mapsnip = ini.Configs[section].Get("MapPathSnip", GlobalVars.UserConfiguration.MapPathSnip.ToString()); graphics = ini.Configs[section].Get("GraphicsMode", Settings.GraphicsOptions.GetIntForMode(GlobalVars.UserConfiguration.GraphicsMode).ToString()); reshade = ini.Configs[section].Get("ReShade", GlobalVars.UserConfiguration.ReShade.ToString()); qualitylevel = ini.Configs[section].Get("QualityLevel", Settings.GraphicsOptions.GetIntForLevel(GlobalVars.UserConfiguration.QualityLevel).ToString()); style = ini.Configs[section].Get("Style", Settings.UIOptions.GetIntForStyle(GlobalVars.UserConfiguration.LauncherStyle).ToString()); savebackups = ini.Configs[section].Get("AssetLocalizerSaveBackups", GlobalVars.UserConfiguration.AssetLocalizerSaveBackups.ToString()); GlobalVars.UserConfiguration.CloseOnLaunch = Convert.ToBoolean(closeonlaunch); if (userid.Equals("0")) { GeneratePlayerID(); Config(GlobalPaths.ConfigDir + "\\" + GlobalPaths.ConfigName, true); } else { GlobalVars.UserConfiguration.UserID = Convert.ToInt32(userid); } GlobalVars.UserConfiguration.PlayerName = name; GlobalVars.UserConfiguration.SelectedClient = selectedclient; GlobalVars.UserConfiguration.Map = map; GlobalVars.UserConfiguration.RobloxPort = Convert.ToInt32(port); GlobalVars.UserConfiguration.PlayerLimit = Convert.ToInt32(limit); GlobalVars.UserConfiguration.UPnP = Convert.ToBoolean(upnp); GlobalVars.UserConfiguration.DisabledItemMakerHelp = Convert.ToBoolean(disablehelpmessage); if (string.IsNullOrWhiteSpace(SecurityFuncs.Base64Decode(tripcode))) { GenerateTripcode(); Config(GlobalPaths.ConfigDir + "\\" + GlobalPaths.ConfigName, true); } else { GlobalVars.UserConfiguration.PlayerTripcode = SecurityFuncs.Base64Decode(tripcode); } GlobalVars.UserConfiguration.DiscordPresence = Convert.ToBoolean(discord); GlobalVars.UserConfiguration.MapPath = mappath; GlobalVars.UserConfiguration.MapPathSnip = mapsnip; GlobalVars.UserConfiguration.GraphicsMode = Settings.GraphicsOptions.GetModeForInt(Convert.ToInt32(graphics)); GlobalVars.UserConfiguration.ReShade = Convert.ToBoolean(reshade); GlobalVars.UserConfiguration.QualityLevel = Settings.GraphicsOptions.GetLevelForInt(Convert.ToInt32(qualitylevel)); GlobalVars.UserConfiguration.LauncherStyle = Settings.UIOptions.GetStyleForInt(Convert.ToInt32(style)); GlobalVars.UserConfiguration.AssetLocalizerSaveBackups = Convert.ToBoolean(savebackups); } catch (Exception) { Config(cfgpath, true); } } 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 void Customization(string cfgpath, bool write) { if (write) { if (!File.Exists(cfgpath)) { IniConfigSource createINI = new IniConfigSource(); createINI.AddConfig("Items"); createINI.AddConfig("Colors"); createINI.AddConfig("Other"); createINI.Save(cfgpath); Customization(cfgpath, true); } //WRITE IniConfigSource ini = new IniConfigSource(cfgpath); string section = "Items"; ini.Configs[section].Set("Hat1", GlobalVars.UserCustomization.Hat1.ToString()); ini.Configs[section].Set("Hat2", GlobalVars.UserCustomization.Hat2.ToString()); ini.Configs[section].Set("Hat3", GlobalVars.UserCustomization.Hat3.ToString()); ini.Configs[section].Set("Face", GlobalVars.UserCustomization.Face.ToString()); ini.Configs[section].Set("Head", GlobalVars.UserCustomization.Head.ToString()); ini.Configs[section].Set("TShirt", GlobalVars.UserCustomization.TShirt.ToString()); ini.Configs[section].Set("Shirt", GlobalVars.UserCustomization.Shirt.ToString()); ini.Configs[section].Set("Pants", GlobalVars.UserCustomization.Pants.ToString()); ini.Configs[section].Set("Icon", GlobalVars.UserCustomization.Icon.ToString()); ini.Configs[section].Set("Extra", GlobalVars.UserCustomization.Extra.ToString()); string section2 = "Colors"; ini.Configs[section2].Set("HeadColorID", GlobalVars.UserCustomization.HeadColorID.ToString()); ini.Configs[section2].Set("HeadColorString", GlobalVars.UserCustomization.HeadColorString.ToString()); ini.Configs[section2].Set("TorsoColorID", GlobalVars.UserCustomization.TorsoColorID.ToString()); ini.Configs[section2].Set("TorsoColorString", GlobalVars.UserCustomization.TorsoColorString.ToString()); ini.Configs[section2].Set("LeftArmColorID", GlobalVars.UserCustomization.LeftArmColorID.ToString()); ini.Configs[section2].Set("LeftArmColorString", GlobalVars.UserCustomization.LeftArmColorString.ToString()); ini.Configs[section2].Set("RightArmColorID", GlobalVars.UserCustomization.RightArmColorID.ToString()); ini.Configs[section2].Set("RightArmColorString", GlobalVars.UserCustomization.RightArmColorString.ToString()); ini.Configs[section2].Set("LeftLegColorID", GlobalVars.UserCustomization.LeftLegColorID.ToString()); ini.Configs[section2].Set("LeftLegColorString", GlobalVars.UserCustomization.LeftLegColorString.ToString()); ini.Configs[section2].Set("RightLegColorID", GlobalVars.UserCustomization.RightLegColorID.ToString()); ini.Configs[section2].Set("RightLegColorString", GlobalVars.UserCustomization.RightLegColorString.ToString()); string section3 = "Other"; ini.Configs[section3].Set("CharacterID", GlobalVars.UserCustomization.CharacterID.ToString()); ini.Configs[section3].Set("ExtraSelectionIsHat", GlobalVars.UserCustomization.ExtraSelectionIsHat.ToString()); ini.Configs[section3].Set("ShowHatsOnExtra", GlobalVars.UserCustomization.ShowHatsInExtra.ToString()); ini.Save(); } 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; IniConfigSource ini = new IniConfigSource(cfgpath); string section = "Items"; hat1 = ini.Configs[section].Get("Hat1", GlobalVars.UserCustomization.Hat1.ToString()); hat2 = ini.Configs[section].Get("Hat2", GlobalVars.UserCustomization.Hat2.ToString()); hat3 = ini.Configs[section].Get("Hat3", GlobalVars.UserCustomization.Hat3.ToString()); face = ini.Configs[section].Get("Face", GlobalVars.UserCustomization.Face.ToString()); head = ini.Configs[section].Get("Head", GlobalVars.UserCustomization.Head.ToString()); tshirt = ini.Configs[section].Get("TShirt", GlobalVars.UserCustomization.TShirt.ToString()); shirt = ini.Configs[section].Get("Shirt", GlobalVars.UserCustomization.Shirt.ToString()); pants = ini.Configs[section].Get("Pants", GlobalVars.UserCustomization.Pants.ToString()); icon = ini.Configs[section].Get("Icon", GlobalVars.UserCustomization.Icon.ToString()); extra = ini.Configs[section].Get("Extra", GlobalVars.UserCustomization.Extra.ToString()); string section2 = "Colors"; headcolorid = ini.Configs[section2].Get("HeadColorID", GlobalVars.UserCustomization.HeadColorID.ToString()); headcolorstring = ini.Configs[section2].Get("HeadColorString", GlobalVars.UserCustomization.HeadColorString.ToString()); torsocolorid = ini.Configs[section2].Get("TorsoColorID", GlobalVars.UserCustomization.TorsoColorID.ToString()); torsocolorstring = ini.Configs[section2].Get("TorsoColorString", GlobalVars.UserCustomization.TorsoColorString.ToString()); larmid = ini.Configs[section2].Get("LeftArmColorID", GlobalVars.UserCustomization.LeftArmColorID.ToString()); larmstring = ini.Configs[section2].Get("LeftArmColorString", GlobalVars.UserCustomization.LeftArmColorString.ToString()); rarmid = ini.Configs[section2].Get("RightArmColorID", GlobalVars.UserCustomization.RightArmColorID.ToString()); rarmstring = ini.Configs[section2].Get("RightArmColorString", GlobalVars.UserCustomization.RightArmColorString.ToString()); llegid = ini.Configs[section2].Get("LeftLegColorID", GlobalVars.UserCustomization.LeftLegColorID.ToString()); llegstring = ini.Configs[section2].Get("LeftLegColorString", GlobalVars.UserCustomization.LeftLegColorString.ToString()); rlegid = ini.Configs[section2].Get("RightLegColorID", GlobalVars.UserCustomization.RightLegColorID.ToString()); rlegstring = ini.Configs[section2].Get("RightLegColorString", GlobalVars.UserCustomization.RightLegColorString.ToString()); string section3 = "Other"; characterid = ini.Configs[section3].Get("CharacterID", GlobalVars.UserCustomization.CharacterID.ToString()); extraishat = ini.Configs[section3].Get("ExtraSelectionIsHat", GlobalVars.UserCustomization.ExtraSelectionIsHat.ToString()); showhatsonextra = ini.Configs[section3].Get("ShowHatsOnExtra", GlobalVars.UserCustomization.ShowHatsInExtra.ToString()); GlobalVars.UserCustomization.Hat1 = hat1; GlobalVars.UserCustomization.Hat2 = hat2; GlobalVars.UserCustomization.Hat3 = hat3; GlobalVars.UserCustomization.HeadColorID = Convert.ToInt32(headcolorid); GlobalVars.UserCustomization.TorsoColorID = Convert.ToInt32(torsocolorid); GlobalVars.UserCustomization.LeftArmColorID = Convert.ToInt32(larmid); GlobalVars.UserCustomization.RightArmColorID = Convert.ToInt32(rarmid); GlobalVars.UserCustomization.LeftLegColorID = Convert.ToInt32(llegid); GlobalVars.UserCustomization.RightLegColorID = Convert.ToInt32(rlegid); 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 = Convert.ToBoolean(extraishat); GlobalVars.UserCustomization.ShowHatsInExtra = Convert.ToBoolean(showhatsonextra); } catch (Exception) { Customization(cfgpath, true); } } ReloadLoadoutValue(); } public static void ReShadeValues(string cfgpath, bool write, bool setglobals) { if (write) { //WRITE IniConfigSource ini = new IniConfigSource(cfgpath); string section = "GENERAL"; int FPS = GlobalVars.UserConfiguration.ReShadeFPSDisplay ? 1 : 0; ini.Configs[section].Set("ShowFPS", FPS.ToString()); ini.Configs[section].Set("ShowFrameTime", FPS.ToString()); int PerformanceMode = GlobalVars.UserConfiguration.ReShadePerformanceMode ? 1 : 0; ini.Configs[section].Set("PerformanceMode", PerformanceMode.ToString()); ini.Save(); } else { //READ string framerate, frametime, performance; IniConfigSource ini = new IniConfigSource(cfgpath); string section = "GENERAL"; int FPS = GlobalVars.UserConfiguration.ReShadeFPSDisplay ? 1 : 0; framerate = ini.Configs[section].Get("ShowFPS", FPS.ToString()); frametime = ini.Configs[section].Get("ShowFrameTime", FPS.ToString()); int PerformanceMode = GlobalVars.UserConfiguration.ReShadePerformanceMode ? 1 : 0; performance = ini.Configs[section].Get("PerformanceMode", PerformanceMode.ToString()); if (setglobals) { try { switch(Convert.ToInt32(framerate)) { case int showFPSLine when showFPSLine == 1 && Convert.ToInt32(frametime) == 1: GlobalVars.UserConfiguration.ReShadeFPSDisplay = true; break; default: GlobalVars.UserConfiguration.ReShadeFPSDisplay = false; break; } switch (Convert.ToInt32(performance)) { case 1: GlobalVars.UserConfiguration.ReShadePerformanceMode = true; break; default: GlobalVars.UserConfiguration.ReShadePerformanceMode = false; break; } } catch (Exception) { ReShadeValues(cfgpath, true, setglobals); } } } } #if LAUNCHER public static void ReadClientValues(RichTextBox box) #else public static void ReadClientValues() #endif { string clientpath = GlobalPaths.ClientDir + @"\\" + GlobalVars.UserConfiguration.SelectedClient + @"\\clientinfo.nov"; if (!File.Exists(clientpath)) { #if LAUNCHER ConsolePrint("ERROR - No clientinfo.nov detected with the client you chose. The client either cannot be loaded, or it is not available.", 2, box); #elif CMD GlobalFuncs.ConsolePrint("ERROR - No clientinfo.nov detected with the client you chose. The client either cannot be loaded, or it is not available.", 2); #elif URI #endif GlobalVars.UserConfiguration.SelectedClient = GlobalVars.ProgramInformation.DefaultClient; #if LAUNCHER ReadClientValues(box); #else ReadClientValues(); #endif } else { LoadClientValues(clientpath); #if LAUNCHER ConsolePrint("Client '" + GlobalVars.UserConfiguration.SelectedClient + "' successfully loaded.", 3, box); #elif CMD GlobalFuncs.ConsolePrint("Client '" + GlobalVars.UserConfiguration.SelectedClient + "' successfully loaded.", 3); #elif URI #endif } } public static bool CopyMapToRBXAsset() { bool success; string clientcontentpath = GlobalPaths.ClientDir + @"\\" + GlobalVars.UserConfiguration.SelectedClient + @"\\content\\temp.rbxl"; try { File.Copy(GlobalVars.UserConfiguration.MapPath, clientcontentpath, true); success = true; } catch (Exception) { success = false; } return success; } public static void LoadClientValues(string clientpath) { string file, usesplayername, usesid, warning, legacymode, clientmd5, scriptmd5, desc, fix2007, alreadyhassecurity, nographicsoptions, commandlineargs; 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]); nographicsoptions = SecurityFuncs.Base64Decode(result[10]); try { commandlineargs = SecurityFuncs.Base64Decode(result[11]); } catch { //fake this option until we properly apply it. nographicsoptions = "False"; commandlineargs = SecurityFuncs.Base64Decode(result[10]); } GlobalVars.SelectedClientInfo.UsesPlayerName = Convert.ToBoolean(usesplayername); GlobalVars.SelectedClientInfo.UsesID = Convert.ToBoolean(usesid); GlobalVars.SelectedClientInfo.Warning = warning; GlobalVars.SelectedClientInfo.LegacyMode = Convert.ToBoolean(legacymode); GlobalVars.SelectedClientInfo.ClientMD5 = clientmd5; GlobalVars.SelectedClientInfo.ScriptMD5 = scriptmd5; GlobalVars.SelectedClientInfo.Description = desc; GlobalVars.SelectedClientInfo.Fix2007 = Convert.ToBoolean(fix2007); GlobalVars.SelectedClientInfo.AlreadyHasSecurity = Convert.ToBoolean(alreadyhassecurity); GlobalVars.SelectedClientInfo.NoGraphicsOptions = Convert.ToBoolean(nographicsoptions); GlobalVars.SelectedClientInfo.CommandLineArgs = commandlineargs; } public static void ReShade(string cfgpath, string cfgname, bool write) { string fullpath = cfgpath + "\\" + cfgname; if (!File.Exists(fullpath)) { File.Copy(GlobalPaths.ConfigDir + "\\ReShade_default.ini", fullpath, true); 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; if (!File.Exists(fulldirpath)) { File.Copy(fullpath, fulldirpath, true); ReShadeValues(fulldirpath, write, false); } else { ReShadeValues(fulldirpath, write, false); } string fulldllpath = dir.FullName + @"\opengl32.dll"; if (GlobalVars.UserConfiguration.ReShade) { if (!File.Exists(fulldllpath)) { File.Copy(GlobalPaths.ConfigDirData + "\\opengl32.dll", fulldllpath, true); } } else { if (File.Exists(fulldllpath)) { File.Delete(fulldllpath); } } } } public static void ResetConfigValues() { GlobalVars.UserConfiguration.SelectedClient = GlobalVars.ProgramInformation.DefaultClient; GlobalVars.UserConfiguration.Map = GlobalVars.ProgramInformation.DefaultMap; GlobalVars.UserConfiguration.CloseOnLaunch = false; GeneratePlayerID(); GlobalVars.UserConfiguration.PlayerName = "Player"; GlobalVars.UserConfiguration.RobloxPort = 53640; GlobalVars.UserConfiguration.PlayerLimit = 12; GlobalVars.UserConfiguration.UPnP = false; GlobalVars.UserConfiguration.DisabledItemMakerHelp = false; GlobalVars.UserConfiguration.DiscordPresence = true; GlobalVars.UserConfiguration.MapPath = GlobalPaths.MapsDir + @"\\" + GlobalVars.ProgramInformation.DefaultMap; GlobalVars.UserConfiguration.MapPathSnip = GlobalPaths.MapsDirBase + @"\\" + GlobalVars.ProgramInformation.DefaultMap; GlobalVars.UserConfiguration.GraphicsMode = Settings.GraphicsOptions.Mode.OpenGL; GlobalVars.UserConfiguration.ReShade = false; GlobalVars.UserConfiguration.QualityLevel = Settings.GraphicsOptions.Level.Ultra; GlobalVars.UserConfiguration.LauncherStyle = Settings.UIOptions.Style.Extended; ResetCustomizationValues(); } public static void ResetCustomizationValues() { GlobalVars.UserCustomization.Hat1 = "NoHat.rbxm"; GlobalVars.UserCustomization.Hat2 = "NoHat.rbxm"; GlobalVars.UserCustomization.Hat3 = "NoHat.rbxm"; GlobalVars.UserCustomization.Face = "DefaultFace.rbxm"; GlobalVars.UserCustomization.Head = "DefaultHead.rbxm"; GlobalVars.UserCustomization.TShirt = "NoTShirt.rbxm"; GlobalVars.UserCustomization.Shirt = "NoShirt.rbxm"; GlobalVars.UserCustomization.Pants = "NoPants.rbxm"; GlobalVars.UserCustomization.Icon = "NBC"; GlobalVars.UserCustomization.Extra = "NoExtra.rbxm"; GlobalVars.UserCustomization.HeadColorID = 24; GlobalVars.UserCustomization.TorsoColorID = 23; GlobalVars.UserCustomization.LeftArmColorID = 24; GlobalVars.UserCustomization.RightArmColorID = 24; GlobalVars.UserCustomization.LeftLegColorID = 119; GlobalVars.UserCustomization.RightLegColorID = 119; GlobalVars.UserCustomization.CharacterID = ""; GlobalVars.UserCustomization.HeadColorString = "Color [A=255, R=245, G=205, B=47]"; GlobalVars.UserCustomization.TorsoColorString = "Color [A=255, R=13, G=105, B=172]"; GlobalVars.UserCustomization.LeftArmColorString = "Color [A=255, R=245, G=205, B=47]"; GlobalVars.UserCustomization.RightArmColorString = "Color [A=255, R=245, G=205, B=47]"; GlobalVars.UserCustomization.LeftLegColorString = "Color [A=255, R=164, G=189, B=71]"; GlobalVars.UserCustomization.RightLegColorString = "Color [A=255, R=164, G=189, B=71]"; GlobalVars.UserCustomization.ExtraSelectionIsHat = false; GlobalVars.UserCustomization.ShowHatsInExtra = false; ReloadLoadoutValue(); } public static void ReloadLoadoutValue() { 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 + "'"; } 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 void GenerateTripcode() { GlobalVars.UserConfiguration.PlayerTripcode = SecurityFuncs.RandomString(); } public static string GenerateAndReturnTripcode() { GenerateTripcode(); return GlobalVars.UserConfiguration.PlayerTripcode; } 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, 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 " + GlobalVars.UserConfiguration.SelectedClient; 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 " + GlobalVars.UserConfiguration.SelectedClient + " Multiplayer Game"; GlobalVars.presence.largeImageText = GlobalVars.UserConfiguration.PlayerName + " | Novetus " + GlobalVars.ProgramInformation.Version; GlobalVars.presence.smallImageText = "In " + GlobalVars.UserConfiguration.SelectedClient + " Multiplayer Game"; break; case GlobalVars.LauncherState.InSoloGame: GlobalVars.presence.smallImageKey = GlobalVars.image_ingame; GlobalVars.presence.details = ValidMapname; GlobalVars.presence.state = "In " + GlobalVars.UserConfiguration.SelectedClient + " Solo Game"; GlobalVars.presence.largeImageText = GlobalVars.UserConfiguration.PlayerName + " | Novetus " + GlobalVars.ProgramInformation.Version; GlobalVars.presence.smallImageText = "In " + GlobalVars.UserConfiguration.SelectedClient + " Solo Game"; break; case GlobalVars.LauncherState.InStudio: GlobalVars.presence.smallImageKey = GlobalVars.image_instudio; GlobalVars.presence.details = ValidMapname; GlobalVars.presence.state = "In " + GlobalVars.UserConfiguration.SelectedClient + " Studio"; GlobalVars.presence.largeImageText = GlobalVars.UserConfiguration.PlayerName + " | Novetus " + GlobalVars.ProgramInformation.Version; GlobalVars.presence.smallImageText = "In " + GlobalVars.UserConfiguration.SelectedClient + " 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 " + GlobalVars.UserConfiguration.SelectedClient + " Multiplayer Game"; GlobalVars.presence.largeImageText = GlobalVars.UserConfiguration.PlayerName + " | Novetus " + GlobalVars.ProgramInformation.Version; GlobalVars.presence.smallImageText = "Joining a " + GlobalVars.UserConfiguration.SelectedClient + " Multiplayer Game"; break; default: break; } DiscordRPC.UpdatePresence(ref GlobalVars.presence); } } public static string ChangeGameSettings() { string result = ""; if (!GlobalVars.SelectedClientInfo.NoGraphicsOptions) { switch (GlobalVars.UserConfiguration.GraphicsMode) { case Settings.GraphicsOptions.Mode.OpenGL: result += "xpcall( function() settings().Rendering.graphicsMode = 2 end, function( err ) settings().Rendering.graphicsMode = 4 end );"; break; case Settings.GraphicsOptions.Mode.DirectX: result += "pcall(function() settings().Rendering.graphicsMode = 3 end);"; break; default: break; } } //default values are ultra settings int MeshDetail = 100; int ShadingQuality = 100; int GFXQualityLevel = 19; int MaterialQuality = 3; int AASamples = 8; int Bevels = 1; int Shadows_2008 = 1; bool Shadows_2007 = true; switch (GlobalVars.UserConfiguration.QualityLevel) { case Settings.GraphicsOptions.Level.VeryLow: MeshDetail = 50; ShadingQuality = 50; GFXQualityLevel = 1; MaterialQuality = 1; AASamples = 1; Bevels = 2; Shadows_2008 = 2; Shadows_2007 = false; break; case Settings.GraphicsOptions.Level.Low: MeshDetail = 50; ShadingQuality = 50; GFXQualityLevel = 5; MaterialQuality = 1; AASamples = 1; Bevels = 2; Shadows_2008 = 2; Shadows_2007 = false; break; case Settings.GraphicsOptions.Level.Medium: MeshDetail = 50; ShadingQuality = 50; GFXQualityLevel = 10; MaterialQuality = 2; AASamples = 4; Bevels = 2; Shadows_2007 = false; break; case Settings.GraphicsOptions.Level.High: MeshDetail = 75; ShadingQuality = 75; GFXQualityLevel = 15; AASamples = 4; break; case Settings.GraphicsOptions.Level.Ultra: default: break; } result += " pcall(function() settings().Rendering.maxMeshDetail = " + MeshDetail.ToString() + " end);" + " pcall(function() settings().Rendering.maxShadingQuality = " + ShadingQuality.ToString() + " end);" + " pcall(function() settings().Rendering.minMeshDetail = " + MeshDetail.ToString() + " end);" + " pcall(function() settings().Rendering.minShadingQuality = " + ShadingQuality.ToString() + " end);" + " pcall(function() settings().Rendering.AluminumQuality = " + MaterialQuality.ToString() + " end);" + " pcall(function() settings().Rendering.CompoundMaterialQuality = " + MaterialQuality.ToString() + " end);" + " pcall(function() settings().Rendering.CorrodedMetalQuality = " + MaterialQuality.ToString() + " end);" + " pcall(function() settings().Rendering.DiamondPlateQuality = " + MaterialQuality.ToString() + " end);" + " pcall(function() settings().Rendering.GrassQuality = " + MaterialQuality.ToString() + " end);" + " pcall(function() settings().Rendering.IceQuality = " + MaterialQuality.ToString() + " end);" + " pcall(function() settings().Rendering.PlasticQuality = " + MaterialQuality.ToString() + " end);" + " pcall(function() settings().Rendering.SlateQuality = " + MaterialQuality.ToString() + " end);" + " pcall(function() settings().Rendering.TrussDetail = " + MaterialQuality.ToString() + " end);" + " pcall(function() settings().Rendering.WoodQuality = " + MaterialQuality.ToString() + " end);" + " pcall(function() settings().Rendering.Antialiasing = 1 end);" + " pcall(function() settings().Rendering.AASamples = " + AASamples.ToString() + " end);" + " pcall(function() settings().Rendering.Bevels = " + Bevels.ToString() + " end);" + " pcall(function() settings().Rendering.Shadow = " + Shadows_2008.ToString() + " end);" + " pcall(function() settings().Rendering.Shadows = " + Shadows_2007.ToString().ToLower() + " end);" + " pcall(function() settings().Rendering.QualityLevel = " + GFXQualityLevel.ToString() + " end);"; return result; } public static string GetLuaFileName() { string luafile = ""; if (!GlobalVars.SelectedClientInfo.Fix2007) { luafile = "rbxasset://scripts\\\\" + GlobalPaths.ScriptName + ".lua"; } else { luafile = GlobalPaths.ClientDir + @"\\" + GlobalVars.UserConfiguration.SelectedClient + @"\\content\\scripts\\" + GlobalPaths.ScriptGenName + ".lua"; } return luafile; } public static string GetClientEXEDir(ScriptType type) { string rbxexe = ""; if (GlobalVars.SelectedClientInfo.LegacyMode) { rbxexe = GlobalPaths.ClientDir + @"\\" + GlobalVars.UserConfiguration.SelectedClient + @"\\RobloxApp.exe"; } else { switch (type) { case ScriptType.Client: rbxexe = GlobalPaths.ClientDir + @"\\" + GlobalVars.UserConfiguration.SelectedClient + @"\\RobloxApp_client.exe"; break; case ScriptType.Server: rbxexe = GlobalPaths.ClientDir + @"\\" + GlobalVars.UserConfiguration.SelectedClient + @"\\RobloxApp_server.exe"; break; case ScriptType.Studio: rbxexe = GlobalPaths.ClientDir + @"\\" + GlobalVars.UserConfiguration.SelectedClient + @"\\RobloxApp_studio.exe"; break; case ScriptType.Solo: case ScriptType.EasterEgg: rbxexe = GlobalPaths.ClientDir + @"\\" + GlobalVars.UserConfiguration.SelectedClient + @"\\RobloxApp_solo.exe"; break; case ScriptType.None: default: rbxexe = GlobalPaths.ClientDir + @"\\" + GlobalVars.UserConfiguration.SelectedClient + @"\\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) #elif CMD public static void LaunchRBXClient(ScriptType type, bool no3d, bool nomap, EventHandler e) #endif { string luafile = GetLuaFileName(); string rbxexe = GetClientEXEDir(type); string mapfile = type.Equals(ScriptType.EasterEgg) ? GlobalPaths.ConfigDirData + "\\Appreciation.rbxl" : (nomap ? "" : GlobalVars.UserConfiguration.MapPath); string mapname = type.Equals(ScriptType.EasterEgg) ? "" : (nomap ? "" : GlobalVars.UserConfiguration.Map); string quote = "\""; string args = ""; if (GlobalVars.SelectedClientInfo.CommandLineArgs.Equals("%args%")) { if (!GlobalVars.SelectedClientInfo.Fix2007) { args = quote + mapfile + "\" -script \"" + ChangeGameSettings() + " dofile('" + luafile + "'); " + ScriptFuncs.Generator.GetScriptFuncForType(type) + "; " + (!string.IsNullOrWhiteSpace(GlobalPaths.AddonScriptPath) ? " dofile('" + GlobalPaths.AddonScriptPath + "');" : "") + quote + (no3d ? " -no3d" : ""); } else { ScriptFuncs.Generator.GenerateScriptForClient(type); args = "-script " + quote + luafile + quote + (no3d ? " -no3d" : "") + " " + quote + mapfile + quote; } } else { args = ScriptFuncs.ClientScript.CompileScript(GlobalVars.SelectedClientInfo.CommandLineArgs, ScriptFuncs.ClientScript.GetTagFromType(type, false, no3d), ScriptFuncs.ClientScript.GetTagFromType(type, true, no3d), mapfile, luafile, rbxexe); } 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 (GlobalVars.SelectedClientInfo.AlreadyHasSecurity != true) { if (SecurityFuncs.checkClientMD5(GlobalVars.UserConfiguration.SelectedClient) && SecurityFuncs.checkScriptMD5(GlobalVars.UserConfiguration.SelectedClient)) { #if LAUNCHER OpenClient(type, rbxexe, args, mapname, e, box); #else OpenClient(type, rbxexe, args, mapname, e); #endif } else { #if URI label.Text = "The client has been detected as modified."; #elif LAUNCHER ConsolePrint("ERROR - Failed to launch Novetus. (The client has been detected as modified.)", 2, box); MessageBox.Show("Failed to launch Novetus. (Error: The client has been detected as modified.)", "Novetus - Error", MessageBoxButtons.OK, MessageBoxIcon.Error); #elif CMD ConsolePrint("ERROR - Failed to launch Novetus. (The client has been detected as modified.)", 2); #endif } } else { #if LAUNCHER OpenClient(type, rbxexe, args, mapname, e, box); #else OpenClient(type, rbxexe, args, mapname, e); #endif } } else { #if LAUNCHER OpenClient(type, rbxexe, args, mapname, e, box); #else OpenClient(type, rbxexe, args, mapname, e); #endif } } else { #if LAUNCHER OpenClient(type, rbxexe, args, mapname, e, box); #else OpenClient(type, rbxexe, args, mapname, e); #endif } } catch (Exception ex) { #if URI label.Text = "Error: " + ex.Message; #elif LAUNCHER ConsolePrint("ERROR - Failed to launch Novetus. (Error: " + ex.Message + ")", 2, box); MessageBox.Show("Failed to launch Novetus. (Error: " + ex.Message + ")", "Novetus - Error", MessageBoxButtons.OK, MessageBoxIcon.Error); #elif CMD ConsolePrint("ERROR - Failed to launch Novetus. (Error: " + ex.Message + ")", 2); #endif } } #if LAUNCHER private static void OpenClient(ScriptType type, string rbxexe, string args, string mapname, EventHandler e, RichTextBox box) #else private static void OpenClient(ScriptType type, string rbxexe, string args, string mapname, EventHandler e) #endif { Process client = new Process(); client.StartInfo.FileName = rbxexe; client.StartInfo.Arguments = args; client.EnableRaisingEvents = true; #if LAUNCHER ReadClientValues(box); #else ReadClientValues(); #endif client.Exited += e; client.Start(); client.PriorityClass = ProcessPriorityClass.RealTime; SecurityFuncs.RenameWindow(client, type, mapname); UpdateRichPresence(GetStateForType(type), mapname); #if CMD GlobalVars.ProcessID = client.Id; CreateTXT(); #endif } #if LAUNCHER public static void ConsolePrint(string text, int type, RichTextBox box) { box.AppendText("[" + DateTime.Now.ToShortTimeString() + "] - ", Color.White); switch (type) { case 2: box.AppendText(text, Color.Red); break; case 3: box.AppendText(text, Color.Lime); break; case 4: box.AppendText(text, Color.Aqua); break; case 5: box.AppendText(text, Color.Yellow); break; case 6: box.AppendText(text, Color.LightSalmon); break; case 1: default: box.AppendText(text, Color.White); break; } box.AppendText(Environment.NewLine); } #elif CMD public static void ConsolePrint(string text, int type, bool notime = false) { if (!notime) { ConsoleText("[" + DateTime.Now.ToShortTimeString() + "] - ", ConsoleColor.White); } switch (type) { case 2: ConsoleText(text, ConsoleColor.Red); break; case 3: ConsoleText(text, ConsoleColor.Green); break; case 4: ConsoleText(text, ConsoleColor.Cyan); break; case 5: ConsoleText(text, ConsoleColor.Yellow); break; case 1: default: ConsoleText(text, ConsoleColor.White); break; } ConsoleText(Environment.NewLine, ConsoleColor.White); } public static void ConsoleText(string text, ConsoleColor color) { Console.ForegroundColor = color; Console.Write(text); } public static async void CreateTXT() { if (GlobalVars.RequestToOutputInfo) { string IP = await SecurityFuncs.GetExternalIPAddressAsync(); string[] lines1 = { SecurityFuncs.Base64Encode(IP), 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 = GlobalFuncs.MultiLine( "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: " + IP, "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, GlobalVars.IsWebServerOn ? "Web Server URL:" : "", GlobalVars.IsWebServerOn ? "http://" + IP + ":" + GlobalVars.WebServer.Port.ToString() : "", GlobalVars.IsWebServerOn ? "Local Web Server URL:" : "", GlobalVars.IsWebServerOn ? GlobalVars.LocalWebServerURI : "" ); File.WriteAllText(GlobalPaths.BasePath + "\\" + GlobalVars.ServerInfoFileName, GlobalFuncs.RemoveEmptyLines(text)); GlobalFuncs.ConsolePrint("Server Information sent to file " + GlobalPaths.BasePath + "\\" + GlobalVars.ServerInfoFileName, 4); } } #endif 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.AssetCacheDirTexturesGUI)) { Directory.CreateDirectory(GlobalPaths.AssetCacheDirTexturesGUI); } if (!Directory.Exists(GlobalPaths.AssetCacheDirScripts)) { Directory.CreateDirectory(GlobalPaths.AssetCacheDirScripts); } } public static string MultiLine(params string[] args) { return string.Join(Environment.NewLine, args); } public static string RemoveEmptyLines(string lines) { return Regex.Replace(lines, @"^\s*$\n|\r", string.Empty, RegexOptions.Multiline).TrimEnd(); } //task.delay is only available on net 4.5....... public static async void Delay(int miliseconds) { await TaskEx.Delay(miliseconds); } } #endregion