refactoring

This commit is contained in:
Bitl 2022-09-12 14:06:54 -07:00
parent ce5e9e1593
commit 87823a1578
18 changed files with 4919 additions and 4964 deletions

View File

@ -1,69 +0,0 @@
#region Usings
using System.IO;
using System.Linq;
using System.Xml;
using System.Xml.Serialization;
#endregion
#region Content Provider Options
public class Provider
{
public string Name;
public string URL;
public string Icon;
}
[XmlRoot("ContentProviders")]
public class ContentProviders
{
[XmlArray("Providers")]
public Provider[] Providers;
}
public class OnlineClothing
{
public static Provider[] GetContentProviders()
{
if (File.Exists(GlobalPaths.ConfigDir + "\\" + GlobalPaths.ContentProviderXMLName))
{
XmlSerializer serializer = new XmlSerializer(typeof(ContentProviders));
ContentProviders providers;
using (FileStream fs = new FileStream(GlobalPaths.ConfigDir + "\\" + GlobalPaths.ContentProviderXMLName, FileMode.Open))
{
providers = (ContentProviders)serializer.Deserialize(fs);
}
return providers.Providers;
}
else
{
return null;
}
}
public static Provider FindContentProviderByName(Provider[] providers, string query)
{
if (File.Exists(GlobalPaths.ConfigDir + "\\" + GlobalPaths.ContentProviderXMLName))
{
return providers.SingleOrDefault(item => query.Contains(item.Name));
}
else
{
return null;
}
}
public static Provider FindContentProviderByURL(Provider[] providers, string query)
{
if (File.Exists(GlobalPaths.ConfigDir + "\\" + GlobalPaths.ContentProviderXMLName))
{
return providers.SingleOrDefault(item => query.Contains(item.URL));
}
else
{
return null;
}
}
}
#endregion

View File

@ -1,66 +0,0 @@
#region Usings
using System;
using System.IO;
using System.Windows.Forms;
#endregion
#region Icon Loader
public class IconLoader
{
private OpenFileDialog openFileDialog1;
private string installOutcome = "";
public bool CopyToItemDir = false;
public string ItemDir = "";
public string ItemName = "";
public string ItemPath = "";
public IconLoader()
{
openFileDialog1 = new OpenFileDialog()
{
FileName = "Select an icon .png file",
Filter = "Portable Network Graphics image (*.png)|*.png",
Title = "Open icon .png"
};
}
public void setInstallOutcome(string text)
{
installOutcome = text;
}
public string getInstallOutcome()
{
return installOutcome;
}
public void LoadImage()
{
string ItemNameFixed = ItemName.Replace(" ", "");
string dir = CopyToItemDir ? ItemDir + "\\" + ItemNameFixed : GlobalPaths.extradir + "\\icons\\" + GlobalVars.UserConfiguration.PlayerName;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
try
{
GlobalFuncs.FixedFileCopy(openFileDialog1.FileName, dir + ".png", true);
if (CopyToItemDir)
{
ItemPath = ItemDir + "\\" + ItemNameFixed + ".png";
}
installOutcome = "Icon " + openFileDialog1.SafeFileName + " installed!";
}
catch (Exception ex)
{
installOutcome = "Error when installing icon: " + ex.Message;
#if URI || LAUNCHER || CMD
GlobalFuncs.LogExceptions(ex);
#endif
}
}
}
}
#endregion

View File

@ -1,199 +0,0 @@
#region File Formats
using System.Diagnostics;
public class FileFormat
{
#region Client Information
public class ClientInfo
{
public ClientInfo()
{
UsesPlayerName = true;
UsesID = true;
Description = "";
Warning = "";
LegacyMode = false;
ClientMD5 = "";
ScriptMD5 = "";
Fix2007 = false;
AlreadyHasSecurity = false;
ClientLoadOptions = Settings.ClientLoadOptions.Client_2008AndUp;
SeperateFolders = false;
UsesCustomClientEXEName = false;
CustomClientEXEName = "";
CommandLineArgs = "%args%";
}
public bool UsesPlayerName { get; set; }
public bool UsesID { get; set; }
public string Description { get; set; }
public string Warning { get; set; }
public bool LegacyMode { get; set; }
public string ClientMD5 { get; set; }
public string ScriptMD5 { get; set; }
public bool Fix2007 { get; set; }
public bool AlreadyHasSecurity { get; set; }
public bool SeperateFolders { get; set; }
public bool UsesCustomClientEXEName { get; set; }
public string CustomClientEXEName { get; set; }
public Settings.ClientLoadOptions ClientLoadOptions { get; set; }
public string CommandLineArgs { get; set; }
}
#endregion
#region Configuration
public class Config
{
public Config()
{
SelectedClient = "";
Map = "";
CloseOnLaunch = false;
UserID = 0;
PlayerName = "Player";
RobloxPort = 53640;
PlayerLimit = 12;
UPnP = false;
DisabledAssetSDKHelp = false;
DiscordPresence = true;
MapPath = "";
MapPathSnip = "";
GraphicsMode = Settings.Mode.Automatic;
ReShade = false;
QualityLevel = Settings.Level.Automatic;
LauncherStyle = Settings.Style.Stylish;
ReShadeFPSDisplay = false;
ReShadePerformanceMode = false;
AssetSDKFixerSaveBackups = true;
AlternateServerIP = "";
DisableReshadeDelete = false;
ShowServerNotifications = false;
ServerBrowserServerName = "Novetus";
ServerBrowserServerAddress = "localhost";
Priority = ProcessPriorityClass.RealTime;
FirstServerLaunch = true;
NewGUI = false;
URIQuickConfigure = true;
BootstrapperShowUI = true;
}
public string SelectedClient { get; set; }
public string Map { get; set; }
public bool CloseOnLaunch { get; set; }
public int UserID { get; set; }
public string PlayerName { get; set; }
public int RobloxPort { get; set; }
public int PlayerLimit { get; set; }
public bool UPnP { get; set; }
public bool DisabledAssetSDKHelp { get; set; }
public bool DiscordPresence { get; set; }
public string MapPath { get; set; }
public string MapPathSnip { get; set; }
public Settings.Mode GraphicsMode { get; set; }
public bool ReShade { get; set; }
public Settings.Level QualityLevel { get; set; }
public Settings.Style LauncherStyle { get; set; }
public bool ReShadeFPSDisplay { get; set; }
public bool ReShadePerformanceMode { get; set; }
public bool AssetSDKFixerSaveBackups { get; set; }
public string AlternateServerIP { get; set; }
public bool DisableReshadeDelete { get; set; }
public bool ShowServerNotifications { get; set; }
public string ServerBrowserServerName { get; set; }
public string ServerBrowserServerAddress { get; set; }
public ProcessPriorityClass Priority { get; set; }
public bool FirstServerLaunch { get; set; }
public bool NewGUI { get; set; }
public bool URIQuickConfigure { get; set; }
public bool BootstrapperShowUI { get; set; }
}
#endregion
#region Customization Configuration
public class CustomizationConfig
{
public CustomizationConfig()
{
Hat1 = "NoHat.rbxm";
Hat2 = "NoHat.rbxm";
Hat3 = "NoHat.rbxm";
Face = "DefaultFace.rbxm";
Head = "DefaultHead.rbxm";
TShirt = "NoTShirt.rbxm";
Shirt = "NoShirt.rbxm";
Pants = "NoPants.rbxm";
Icon = "NBC";
Extra = "NoExtra.rbxm";
HeadColorID = 24;
TorsoColorID = 23;
LeftArmColorID = 24;
RightArmColorID = 24;
LeftLegColorID = 119;
RightLegColorID = 119;
HeadColorString = "Color [A=255, R=245, G=205, B=47]";
TorsoColorString = "Color [A=255, R=13, G=105, B=172]";
LeftArmColorString = "Color [A=255, R=245, G=205, B=47]";
RightArmColorString = "Color [A=255, R=245, G=205, B=47]";
LeftLegColorString = "Color [A=255, R=164, G=189, B=71]";
RightLegColorString = "Color [A=255, R=164, G=189, B=71]";
ExtraSelectionIsHat = false;
ShowHatsInExtra = false;
CharacterID = "";
}
public string Hat1 { get; set; }
public string Hat2 { get; set; }
public string Hat3 { get; set; }
public string Face { get; set; }
public string Head { get; set; }
public string TShirt { get; set; }
public string Shirt { get; set; }
public string Pants { get; set; }
public string Icon { get; set; }
public string Extra { get; set; }
public int HeadColorID { get; set; }
public int TorsoColorID { get; set; }
public int LeftArmColorID { get; set; }
public int RightArmColorID { get; set; }
public int LeftLegColorID { get; set; }
public int RightLegColorID { get; set; }
public string HeadColorString { get; set; }
public string TorsoColorString { get; set; }
public string LeftArmColorString { get; set; }
public string RightArmColorString { get; set; }
public string LeftLegColorString { get; set; }
public string RightLegColorString { get; set; }
public bool ExtraSelectionIsHat { get; set; }
public bool ShowHatsInExtra { get; set; }
public string CharacterID { get; set; }
}
#endregion
#region Program Information
public class ProgramInfo
{
public ProgramInfo()
{
Version = "";
Branch = "";
DefaultClient = "";
RegisterClient1 = "";
RegisterClient2 = "";
DefaultMap = "";
IsLite = false;
InitialBootup = true;
}
public string Version { get; set; }
public string Branch { get; set; }
public string DefaultClient { get; set; }
public string RegisterClient1 { get; set; }
public string RegisterClient2 { get; set; }
public string DefaultMap { get; set; }
public bool IsLite { get; set; }
public bool InitialBootup { get; set; }
}
#endregion
}
#endregion

View File

@ -1,185 +0,0 @@
#region Usings
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using System.Xml.Serialization;
#endregion
#region Part Color Options
public class PartColor
{
public string ColorName;
public int ColorID;
public string ColorRGB;
[XmlIgnore]
public Color ColorObject;
[XmlIgnore]
public string ColorGroup;
[XmlIgnore]
public string ColorRawName;
[XmlIgnore]
public Bitmap ColorImage;
}
[XmlRoot("PartColors")]
public class PartColors
{
[XmlArray("ColorList")]
public PartColor[] ColorList;
}
public class PartColorLoader
{
public static PartColor[] GetPartColors()
{
if (File.Exists(GlobalPaths.ConfigDir + "\\" + GlobalPaths.PartColorXMLName))
{
XmlSerializer serializer = new XmlSerializer(typeof(PartColors));
PartColors colors;
using (FileStream fs = new FileStream(GlobalPaths.ConfigDir + "\\" + GlobalPaths.PartColorXMLName, FileMode.Open))
{
colors = (PartColors)serializer.Deserialize(fs);
}
foreach (var item in colors.ColorList)
{
string colorFixed = Regex.Replace(item.ColorRGB, @"[\[\]\{\}\(\)\<\> ]", "");
string[] rgbValues = colorFixed.Split(',');
item.ColorObject = Color.FromArgb(Convert.ToInt32(rgbValues[0]), Convert.ToInt32(rgbValues[1]), Convert.ToInt32(rgbValues[2]));
if (!(item.ColorName.Contains("[") && item.ColorName.Contains("]")))
{
item.ColorRawName = item.ColorName;
item.ColorName = "[Uncategorized]" + item.ColorName;
}
else
{
item.ColorRawName = item.ColorName;
}
int pFrom = item.ColorName.IndexOf("[");
int pTo = item.ColorName.IndexOf("]");
item.ColorGroup = item.ColorName.Substring(pFrom + 1, pTo - pFrom - 1);
item.ColorName = item.ColorName.Replace(item.ColorGroup, "").Replace("[", "").Replace("]", "");
item.ColorImage = GeneratePartColorIcon(item, 128);
}
return colors.ColorList;
}
else
{
return null;
}
}
//make faster
public static void AddPartColorsToListView(PartColor[] PartColorList, ListView ColorView, int imgsize, bool showIDs = false)
{
try
{
ImageList ColorImageList = new ImageList();
ColorImageList.ImageSize = new Size(imgsize, imgsize);
ColorImageList.ColorDepth = ColorDepth.Depth32Bit;
ColorView.LargeImageList = ColorImageList;
ColorView.SmallImageList = ColorImageList;
foreach (var item in PartColorList)
{
var lvi = new ListViewItem(item.ColorName);
lvi.Tag = item.ColorID;
if (showIDs)
{
lvi.Text = lvi.Text + " (" + item.ColorID + ")";
}
var group = ColorView.Groups.Cast<ListViewGroup>().FirstOrDefault(g => g.Header == item.ColorGroup);
if (group == null)
{
group = new ListViewGroup(item.ColorGroup);
ColorView.Groups.Add(group);
}
lvi.Group = group;
if (item.ColorImage != null)
{
ColorImageList.Images.Add(item.ColorName, item.ColorImage);
lvi.ImageIndex = ColorImageList.Images.IndexOfKey(item.ColorName);
}
ColorView.Items.Add(lvi);
}
/*foreach (var group in ColorView.Groups.Cast<ListViewGroup>())
{
group.Header = group.Header + " (" + group.Items.Count + ")";
}*/
}
#if URI || LAUNCHER || CMD || BASICLAUNCHER
catch (Exception ex)
{
GlobalFuncs.LogExceptions(ex);
#else
catch (Exception)
{
#endif
}
}
public static Bitmap GeneratePartColorIcon(PartColor color, int imgsize)
{
try
{
Bitmap Bmp = new Bitmap(imgsize, imgsize, PixelFormat.Format32bppArgb);
using (Graphics gfx = Graphics.FromImage(Bmp))
using (SolidBrush brush = new SolidBrush(color.ColorObject))
{
gfx.FillRectangle(brush, 0, 0, imgsize, imgsize);
}
return Bmp;
}
#if URI || LAUNCHER || CMD || BASICLAUNCHER
catch (Exception ex)
{
GlobalFuncs.LogExceptions(ex);
#else
catch (Exception)
{
#endif
return null;
}
}
public static PartColor FindPartColorByName(PartColor[] colors, string query)
{
if (File.Exists(GlobalPaths.ConfigDir + "\\" + GlobalPaths.PartColorXMLName))
{
return colors.SingleOrDefault(item => query.Contains(item.ColorName));
}
else
{
return null;
}
}
public static PartColor FindPartColorByID(PartColor[] colors, string query)
{
if (File.Exists(GlobalPaths.ConfigDir + "\\" + GlobalPaths.PartColorXMLName))
{
return colors.SingleOrDefault(item => query.Contains(item.ColorID.ToString()));
}
else
{
return null;
}
}
}
#endregion

View File

@ -1,332 +0,0 @@
#region Vector3
public class Vector3
{
public double X;
public double Y;
public double Z;
public Vector3(double aX, double aY, double aZ)
{
X = aX;
Y = aY;
Z = aZ;
}
}
#endregion
#region Roblox File Types
public enum RobloxFileType
{
//RBXL and RBXM
RBXL,
RBXM,
//Items
Hat,
Head,
Face,
TShirt,
Shirt,
Pants,
Script,
HeadNoCustomMesh
}
#endregion
#region Asset Cache Definition
public class AssetCacheDefBasic
{
public AssetCacheDefBasic(string clas, string[] id)
{
Class = clas;
Id = id;
}
public string Class { get; set; }
public string[] Id { get; set; }
}
public class AssetCacheDef : AssetCacheDefBasic
{
public AssetCacheDef(string clas, string[] id, string[] ext,
string[] dir, string[] gamedir) : base(clas, id)
{
Ext = ext;
Dir = dir;
GameDir = gamedir;
}
public string[] Ext { get; set; }
public string[] Dir { get; set; }
public string[] GameDir { get; set; }
}
#endregion
#region Roblox Type Definitions
public struct RobloxDefs
{
public static AssetCacheDef Fonts
{
get
{
return new AssetCacheDef("SpecialMesh",
new string[] { "MeshId", "TextureId" },
new string[] { ".mesh", ".png" },
new string[] { GlobalPaths.AssetCacheDirFonts, GlobalPaths.AssetCacheDirTextures },
new string[] { GlobalPaths.AssetCacheFontsGameDir, GlobalPaths.AssetCacheTexturesGameDir });
}
}
public static AssetCacheDef Sky
{
get
{
return new AssetCacheDef("Sky",
new string[] { "SkyboxBk", "SkyboxDn", "SkyboxFt", "SkyboxLf", "SkyboxRt", "SkyboxUp" },
new string[] { ".png" },
new string[] { GlobalPaths.AssetCacheDirSky },
new string[] { GlobalPaths.AssetCacheSkyGameDir });
}
}
public static AssetCacheDef Decal
{
get
{
return new AssetCacheDef("Decal",
new string[] { "Texture" },
new string[] { ".png" },
new string[] { GlobalPaths.AssetCacheDirTextures },
new string[] { GlobalPaths.AssetCacheTexturesGameDir });
}
}
public static AssetCacheDef Texture
{
get
{
return new AssetCacheDef("Texture",
new string[] { "Texture" },
new string[] { ".png" },
new string[] { GlobalPaths.AssetCacheDirTextures },
new string[] { GlobalPaths.AssetCacheTexturesGameDir });
}
}
public static AssetCacheDef HopperBin
{
get
{
return new AssetCacheDef("HopperBin",
new string[] { "TextureId" },
new string[] { ".png" },
new string[] { GlobalPaths.AssetCacheDirTextures },
new string[] { GlobalPaths.AssetCacheTexturesGameDir });
}
}
public static AssetCacheDef Tool
{
get
{
return new AssetCacheDef("Tool",
new string[] { "TextureId" },
new string[] { ".png" },
new string[] { GlobalPaths.AssetCacheDirTextures },
new string[] { GlobalPaths.AssetCacheTexturesGameDir });
}
}
public static AssetCacheDef Sound
{
get
{
return new AssetCacheDef("Sound",
new string[] { "SoundId" },
new string[] { ".wav" },
new string[] { GlobalPaths.AssetCacheDirSounds },
new string[] { GlobalPaths.AssetCacheSoundsGameDir });
}
}
public static AssetCacheDef ImageLabel
{
get
{
return new AssetCacheDef("ImageLabel",
new string[] { "Image" },
new string[] { ".png" },
new string[] { GlobalPaths.AssetCacheDirTextures },
new string[] { GlobalPaths.AssetCacheTexturesGameDir });
}
}
public static AssetCacheDef Shirt
{
get
{
return new AssetCacheDef("Shirt",
new string[] { "ShirtTemplate" },
new string[] { ".png" },
new string[] { GlobalPaths.AssetCacheDirTextures },
new string[] { GlobalPaths.AssetCacheTexturesGameDir });
}
}
public static AssetCacheDef ShirtGraphic
{
get
{
return new AssetCacheDef("ShirtGraphic",
new string[] { "Graphic" },
new string[] { ".png" },
new string[] { GlobalPaths.AssetCacheDirTextures },
new string[] { GlobalPaths.AssetCacheTexturesGameDir });
}
}
public static AssetCacheDef Pants
{
get
{
return new AssetCacheDef("Pants",
new string[] { "PantsTemplate" },
new string[] { ".png" },
new string[] { GlobalPaths.AssetCacheDirTextures },
new string[] { GlobalPaths.AssetCacheTexturesGameDir });
}
}
public static AssetCacheDef Script
{
get
{
return new AssetCacheDef("Script",
new string[] { "LinkedSource" },
new string[] { ".lua" },
new string[] { GlobalPaths.AssetCacheDirScripts },
new string[] { GlobalPaths.AssetCacheScriptsGameDir });
}
}
public static AssetCacheDef LocalScript
{
get
{
return new AssetCacheDef("LocalScript",
new string[] { "LinkedSource" },
new string[] { ".lua" },
new string[] { GlobalPaths.AssetCacheDirScripts },
new string[] { GlobalPaths.AssetCacheScriptsGameDir });
}
}
//item defs below
public static AssetCacheDef ItemHatFonts
{
get
{
return new AssetCacheDef("SpecialMesh",
new string[] { "MeshId", "TextureId" },
new string[] { ".mesh", ".png" },
new string[] { GlobalPaths.hatdirFonts, GlobalPaths.hatdirTextures },
new string[] { GlobalPaths.hatGameDirFonts, GlobalPaths.hatGameDirTextures });
}
}
public static AssetCacheDef ItemHatSound
{
get
{
return new AssetCacheDef("Sound",
new string[] { "SoundId" },
new string[] { ".wav" },
new string[] { GlobalPaths.hatdirSounds },
new string[] { GlobalPaths.hatGameDirSounds });
}
}
public static AssetCacheDef ItemHatScript
{
get
{
return new AssetCacheDef("Script",
new string[] { "LinkedSource" },
new string[] { ".lua" },
new string[] { GlobalPaths.hatdirScripts },
new string[] { GlobalPaths.hatGameDirScripts });
}
}
public static AssetCacheDef ItemHatLocalScript
{
get
{
return new AssetCacheDef("LocalScript",
new string[] { "LinkedSource" },
new string[] { ".lua" },
new string[] { GlobalPaths.hatdirScripts },
new string[] { GlobalPaths.hatGameDirScripts });
}
}
public static AssetCacheDef ItemHeadFonts
{
get
{
return new AssetCacheDef("SpecialMesh",
new string[] { "MeshId", "TextureId" },
new string[] { ".mesh", ".png" },
new string[] { GlobalPaths.headdirFonts, GlobalPaths.headdirTextures },
new string[] { GlobalPaths.headGameDirFonts, GlobalPaths.headGameDirTextures });
}
}
public static AssetCacheDef ItemFaceTexture
{
get
{
return new AssetCacheDef("Decal",
new string[] { "Texture" },
new string[] { ".png" },
new string[] { GlobalPaths.facedirTextures },
new string[] { GlobalPaths.faceGameDirTextures });
}
}
public static AssetCacheDef ItemShirtTexture
{
get
{
return new AssetCacheDef("Shirt",
new string[] { "ShirtTemplate" },
new string[] { ".png" },
new string[] { GlobalPaths.shirtdirTextures },
new string[] { GlobalPaths.shirtGameDirTextures });
}
}
public static AssetCacheDef ItemTShirtTexture
{
get
{
return new AssetCacheDef("ShirtGraphic",
new string[] { "Graphic" },
new string[] { ".png" },
new string[] { GlobalPaths.tshirtdirTextures },
new string[] { GlobalPaths.tshirtGameDirTextures });
}
}
public static AssetCacheDef ItemPantsTexture
{
get
{
return new AssetCacheDef("Pants",
new string[] { "PantsTemplate" },
new string[] { ".png" },
new string[] { GlobalPaths.pantsdirTextures },
new string[] { GlobalPaths.pantsGameDirTextures });
}
}
}
#endregion

View File

@ -1,217 +0,0 @@
#region Usings
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using System.Xml;
using System.Xml.Linq;
#endregion
#region XML Types
public enum XMLTypes
{
Token,
Bool,
Float,
String,
Vector2Int16,
Int
}
#endregion
#region Roblox XML Parser
public static class RobloxXML
{
public static void EditRenderSettings(XDocument doc, string setting, string value, XMLTypes type)
{
var v = from nodes in doc.Descendants("Item")
where nodes.Attribute("class").Value == "RenderSettings"
select nodes;
foreach (var item in v)
{
var v2 = from nodes in item.Descendants((type != XMLTypes.Vector2Int16 ? type.ToString().ToLower() : "Vector2int16"))
where nodes.Attribute("name").Value == setting
select nodes;
foreach (var item2 in v2)
{
if (type != XMLTypes.Vector2Int16)
{
item2.Value = value;
}
else
{
string[] vals = value.Split('x');
var v3 = from nodes in item2.Descendants("X")
select nodes;
foreach (var item3 in v3)
{
item3.Value = vals[0];
}
var v4 = from nodes in item2.Descendants("Y")
select nodes;
foreach (var item4 in v4)
{
item4.Value = vals[1];
}
}
}
}
}
public static bool IsRenderSettingStringValid(XDocument doc, string setting, XMLTypes type)
{
if (type != XMLTypes.String)
return false;
var v = from nodes in doc.Descendants("Item")
where nodes.Attribute("class").Value == "RenderSettings"
select nodes;
foreach (var item in v)
{
var v2 = from nodes in item.Descendants(type.ToString().ToLower())
where nodes.Attribute("name").Value == setting
select nodes;
foreach (var item2 in v2)
{
return true;
}
}
return false;
}
public static string GetRenderSettings(XDocument doc, string setting, XMLTypes type)
{
var v = from nodes in doc.Descendants("Item")
where nodes.Attribute("class").Value == "RenderSettings"
select nodes;
foreach (var item in v)
{
var v2 = from nodes in item.Descendants((type != XMLTypes.Vector2Int16 ? type.ToString().ToLower() : "Vector2int16"))
where nodes.Attribute("name").Value == setting
select nodes;
foreach (var item2 in v2)
{
if (type != XMLTypes.Vector2Int16)
{
return item2.Value;
}
else
{
string ValX = "";
string ValY = "";
var v3 = from nodes in item2.Descendants("X")
select nodes;
foreach (var item3 in v3)
{
ValX = item3.Value;
}
var v4 = from nodes in item2.Descendants("Y")
select nodes;
foreach (var item4 in v4)
{
ValY = item4.Value;
}
return ValX + "x" + ValY;
}
}
}
return "";
}
public static void DownloadFilesFromNode(string url, string path, string fileext, string id)
{
if (!string.IsNullOrWhiteSpace(id))
{
Downloader download = new Downloader(url, id);
download.InitDownload(path, fileext, "", true, false);
if (download.getDownloadOutcome().Contains("Error"))
{
throw new IOException(download.getDownloadOutcome());
}
}
}
public static string GetURLInNodes(XDocument doc, string itemClassValue, string itemIdValue, string url)
{
var v = from nodes in doc.Descendants("Item")
where nodes.Attribute("class").Value == itemClassValue
select nodes;
foreach (var item in v)
{
var v2 = from nodes in item.Descendants("Content")
where nodes.Attribute("name").Value == itemIdValue
select nodes;
foreach (var item2 in v2)
{
var v3 = from nodes in item2.Descendants("url")
select nodes;
foreach (var item3 in v3)
{
if (!item3.Value.Contains("rbxassetid"))
{
if (!item3.Value.Contains("rbxasset"))
{
string oldurl = item3.Value;
string urlFixed = GlobalFuncs.FixURLString(oldurl, url);
string peram = "id=";
if (urlFixed.Contains(peram))
{
return urlFixed;
}
}
}
else
{
string oldurl = item3.Value;
string rbxassetid = "rbxassetid://";
string urlFixed = url + oldurl.After(rbxassetid);
string peram = "id=";
if (urlFixed.Contains(peram))
{
return urlFixed;
}
}
}
}
}
return "";
}
public static string RemoveInvalidXmlChars(string content)
{
return new string(content.Where(ch => XmlConvert.IsXmlChar(ch)).ToArray());
}
public static string ReplaceHexadecimalSymbols(string txt)
{
string r = "[\x00-\x08\x0B\x0C\x0E-\x1F]";
return Regex.Replace(txt, r, "", RegexOptions.Compiled);
}
}
#endregion

View File

@ -1,91 +0,0 @@
#region Usings
using System;
using System.Diagnostics;
using System.IO;
#endregion
#region Settings
public class Settings
{
public enum Mode
{
Automatic = 0,
OpenGLStable = 1,
OpenGLExperimental = 2,
DirectX = 3
}
public enum Level
{
Automatic = 0,
VeryLow = 1,
Low = 2,
Medium = 3,
High = 4,
Ultra = 5,
Custom = 6
}
public enum Style
{
None = 0,
Extended = 1,
Compact = 2,
Stylish = 3
}
public enum ClientLoadOptions
{
Client_2007_NoGraphicsOptions = 0,
Client_2007 = 1,
Client_2008AndUp = 2,
Client_2008AndUp_LegacyOpenGL = 3,
Client_2008AndUp_QualityLevel21 = 4,
Client_2008AndUp_NoGraphicsOptions = 5,
Client_2008AndUp_ForceAutomatic = 6,
Client_2008AndUp_ForceAutomaticQL21 = 7,
Client_2008AndUp_HasCharacterOnlyShadowsLegacyOpenGL = 8
}
public static ClientLoadOptions GetClientLoadOptionsForBool(bool level)
{
switch (level)
{
case false:
return ClientLoadOptions.Client_2008AndUp;
default:
return ClientLoadOptions.Client_2007_NoGraphicsOptions;
}
}
public static string GetPathForClientLoadOptions(ClientLoadOptions level)
{
string localAppdataRobloxPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + @"\Roblox";
string appdataRobloxPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\Roblox";
if (!Directory.Exists(localAppdataRobloxPath))
{
Directory.CreateDirectory(localAppdataRobloxPath);
}
if (!Directory.Exists(appdataRobloxPath))
{
Directory.CreateDirectory(appdataRobloxPath);
}
switch (level)
{
case ClientLoadOptions.Client_2008AndUp_QualityLevel21:
case ClientLoadOptions.Client_2008AndUp_LegacyOpenGL:
case ClientLoadOptions.Client_2008AndUp_NoGraphicsOptions:
case ClientLoadOptions.Client_2008AndUp_ForceAutomatic:
case ClientLoadOptions.Client_2008AndUp_ForceAutomaticQL21:
case ClientLoadOptions.Client_2008AndUp_HasCharacterOnlyShadowsLegacyOpenGL:
case ClientLoadOptions.Client_2008AndUp:
return localAppdataRobloxPath;
default:
return appdataRobloxPath;
}
}
}
#endregion

View File

@ -9,30 +9,20 @@
<Import_RootNamespace>NovetusCore</Import_RootNamespace>
</PropertyGroup>
<ItemGroup>
<Compile Include="$(MSBuildThisFileDirectory)StorageAndFunctions\ClientManagement.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Classes\Downloader.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Classes\PartColors.cs" />
<Compile Include="$(MSBuildThisFileDirectory)CharCustom\ContentProviders.cs" />
<Compile Include="$(MSBuildThisFileDirectory)CharCustom\IconLoader.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Classes\CommandLineArguments.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Classes\CryptoRandom.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Classes\FileFormat.cs" />
<Compile Include="$(MSBuildThisFileDirectory)StorageAndFunctions\FileManagement.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Classes\IDiscordRPC.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Classes\INIFile.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Classes\RobloxHelpers.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Classes\RobloxXML.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Classes\Settings.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Classes\TextLineRemover.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Imported\UHWIDEngine.cs" />
<Compile Include="$(MSBuildThisFileDirectory)StorageAndFunctions\GlobalFuncs.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Classes\UHWIDEngine.cs" />
<Compile Include="$(MSBuildThisFileDirectory)StorageAndFunctions\NovetusFuncs.cs" />
<Compile Include="$(MSBuildThisFileDirectory)StorageAndFunctions\GlobalPaths.cs" />
<Compile Include="$(MSBuildThisFileDirectory)StorageAndFunctions\GlobalVars.cs" />
<Compile Include="$(MSBuildThisFileDirectory)StorageAndFunctions\NETExt.cs" />
<Compile Include="$(MSBuildThisFileDirectory)StorageAndFunctions\Util.cs" />
<Compile Include="$(MSBuildThisFileDirectory)StorageAndFunctions\NetFuncs.cs" />
<Compile Include="$(MSBuildThisFileDirectory)StorageAndFunctions\ScriptFuncs.cs" />
<Compile Include="$(MSBuildThisFileDirectory)StorageAndFunctions\SecurityFuncs.cs" />
<Compile Include="$(MSBuildThisFileDirectory)WinForms\FormExt.cs" />
<Compile Include="$(MSBuildThisFileDirectory)WinForms\CustomFormControls.cs">
<SubType>Component</SubType>
</Compile>
</ItemGroup>
</Project>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,213 +0,0 @@
#region Usings
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Diagnostics;
using System.Security.Cryptography;
using System.Text;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Net;
#endregion
#region .NET Extentions
//This code was brought to you by:
//https://stackoverflow.com/questions/1926264/color-different-parts-of-a-richtextbox-string
//https://stackoverflow.com/questions/262280/how-can-i-know-if-a-process-is-running
//https://stackoverflow.com/questions/444798/case-insensitive-containsstring
//https://stackoverflow.com/questions/6084940/how-do-i-search-a-multi-dimensional-array
//https://www.dotnetperls.com/between-before-after
//https://stackoverflow.com/questions/12422619/can-i-disable-the-close-button-of-a-form-using-c
//https://stackoverflow.com/questions/9031537/really-simple-encryption-with-c-sharp-and-symmetricalgorithm
public static class NETExt
{
#region Rich Text Box Extensions
public static void AppendText(this RichTextBox box, string text, Color color)
{
box.SelectionStart = box.TextLength;
box.SelectionLength = 0;
box.SelectionColor = color;
box.AppendText(text);
box.SelectionColor = box.ForeColor;
}
#endregion
#region Process Extensions
public static bool IsRunning(this Process process)
{
try
{
Process.GetProcessById(process.Id);
}
catch (InvalidOperationException)
{
return false;
}
catch (ArgumentException)
{
return false;
}
return true;
}
#endregion
#region String Extensions
public static bool Contains(this string source, string toCheck, StringComparison comp)
{
if (source == null)
return false;
return source.IndexOf(toCheck, comp) >= 0;
}
#endregion
#region Substring Extensions
/// <summary>
/// Get string value between [first] a and [last] b.
/// </summary>
public static string Between(this string value, string a, string b)
{
int posA = value.IndexOf(a);
int posB = value.LastIndexOf(b);
if (posA == -1)
{
return "";
}
if (posB == -1)
{
return "";
}
int adjustedPosA = posA + a.Length;
if (adjustedPosA >= posB)
{
return "";
}
return value.Substring(adjustedPosA, posB - adjustedPosA);
}
/// <summary>
/// Get string value after [first] a.
/// </summary>
public static string Before(this string value, string a)
{
int posA = value.IndexOf(a);
if (posA == -1)
{
return "";
}
return value.Substring(0, posA);
}
/// <summary>
/// Get string value after [last] a.
/// </summary>
public static string After(this string value, string a)
{
int posA = value.LastIndexOf(a);
if (posA == -1)
{
return "";
}
int adjustedPosA = posA + a.Length;
if (adjustedPosA >= value.Length)
{
return "";
}
return value.Substring(adjustedPosA);
}
#endregion
#region String Utilities
private static byte[] key = new byte[8] { 1, 2, 3, 4, 5, 6, 7, 8 };
private static byte[] iv = new byte[8] { 1, 2, 3, 4, 5, 6, 7, 8 };
public static string Crypt(this string text)
{
SymmetricAlgorithm algorithm = DES.Create();
ICryptoTransform transform = algorithm.CreateEncryptor(key, iv);
byte[] inputbuffer = Encoding.Unicode.GetBytes(text);
byte[] outputBuffer = transform.TransformFinalBlock(inputbuffer, 0, inputbuffer.Length);
return Convert.ToBase64String(outputBuffer);
}
public static string Decrypt(this string text)
{
SymmetricAlgorithm algorithm = DES.Create();
ICryptoTransform transform = algorithm.CreateDecryptor(key, iv);
byte[] inputbuffer = Convert.FromBase64String(text);
byte[] outputBuffer = transform.TransformFinalBlock(inputbuffer, 0, inputbuffer.Length);
return Encoding.Unicode.GetString(outputBuffer);
}
#endregion
#region Exception Helpers
//https://github.com/AlexMelw/EasySharp/blob/master/NHelpers/ExceptionsDealing/Extensions/ExceptionExtensions.cs
/// <summary>
/// Gets the entire stack trace consisting of exception's footprints (File, Method, LineNumber)
/// </summary>
/// <param name="exception">Source <see cref="Exception" /></param>
/// <returns>
/// <see cref="string" /> that represents the entire stack trace consisting of exception's footprints (File,
/// Method, LineNumber)
/// </returns>
public static string GetExceptionFootprints(this Exception exception)
{
StackTrace stackTrace = new StackTrace(exception, true);
StackFrame[] frames = stackTrace.GetFrames();
if (ReferenceEquals(frames, null))
{
return string.Empty;
}
var traceStringBuilder = new StringBuilder();
for (var i = 0; i < frames.Length; i++)
{
StackFrame frame = frames[i];
if (frame.GetFileLineNumber() < 1)
continue;
traceStringBuilder.AppendLine($"File: {frame.GetFileName()}");
traceStringBuilder.AppendLine($"Method: {frame.GetMethod().Name}");
traceStringBuilder.AppendLine($"LineNumber: {frame.GetFileLineNumber()}");
if (i == frames.Length - 1)
break;
traceStringBuilder.AppendLine(" ---> ");
}
string stackTraceFootprints = traceStringBuilder.ToString();
if (string.IsNullOrWhiteSpace(stackTraceFootprints))
return "NO DETECTED FOOTPRINTS";
return stackTraceFootprints;
}
#endregion
#region DirectoryInfo Extensions
public static IEnumerable<FileInfo> GetFilesByExtensions(this DirectoryInfo dir, params string[] extensions)
{
if (extensions == null)
throw new ArgumentNullException("extensions");
IEnumerable<FileInfo> files = dir.EnumerateFiles();
return files.Where(f => extensions.Contains(f.Extension));
}
#endregion
#region DateTime Extensions
//https://stackoverflow.com/questions/5672862/check-if-datetime-instance-falls-in-between-other-two-datetime-objects
public static bool IsBetweenTwoDates(this DateTime dt, DateTime start, DateTime end)
{
return dt >= start && dt <= end;
}
#endregion
}
#endregion

View File

@ -0,0 +1,852 @@
#region Usings
using System;
using System.IO;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Linq;
using System.Linq;
#endregion
#region Novetus Functions
public class NovetusFuncs
{
public static string CopyMapToRBXAsset()
{
string clientcontentpath = GlobalPaths.ClientDir + @"\\" + GlobalVars.UserConfiguration.SelectedClient + @"\\content\\temp.rbxl";
Util.FixedFileCopy(GlobalVars.UserConfiguration.MapPath, clientcontentpath, true);
return GlobalPaths.AltBaseGameDir + "temp.rbxl";
}
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)
{
Util.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("&#9;", "\t").Replace("#9;", "\t");
XDocument doc = null;
XmlReaderSettings xmlReaderSettings = new XmlReaderSettings { CheckCharacters = false };
Stream filestream = Util.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)
{
Util.LogExceptions(ex);
#else
catch (Exception)
{
#endif
}
}
return "";
}
public static void GeneratePlayerID()
{
int randomID = SecurityFuncs.GenerateRandomNumber();
//2147483647 is max id.
GlobalVars.UserConfiguration.UserID = randomID;
}
public static string GenerateAndReturnTripcode()
{
//Powered by https://github.com/davcs86/csharp-uhwid
return UHWID.UHWIDEngine.AdvancedUid;
}
#if LAUNCHER
public static void PingMasterServer(bool online, string reason, RichTextBox box)
#else
public static void PingMasterServer(bool online, string reason)
#endif
{
if (online)
{
GlobalVars.ServerID = SecurityFuncs.RandomString(30) + SecurityFuncs.GenerateRandomNumber();
GlobalVars.PingURL = "http://" + GlobalVars.UserConfiguration.ServerBrowserServerAddress +
"/list.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 +
"&id=" + GlobalVars.ServerID;
}
else
{
GlobalVars.PingURL = "http://" + GlobalVars.UserConfiguration.ServerBrowserServerAddress +
"/delist.php?id=" + GlobalVars.ServerID;
GlobalVars.ServerID = "N/A";
}
#if LAUNCHER
ConsolePrint("Pinging master server. " + reason, 4, box);
#elif CMD
ConsolePrint("Pinging master server. " + reason, 4);
#endif
#if LAUNCHER
Task.Factory.StartNew(() => TryPing(box));
#else
Task.Factory.StartNew(() => TryPing());
#endif
}
#if LAUNCHER
public static void TryPing(RichTextBox box)
#else
private static void TryPing()
#endif
{
string response = Util.HttpGet(GlobalVars.PingURL);
if (!string.IsNullOrWhiteSpace(response))
{
#if LAUNCHER
ConsolePrint(response, response.Contains("ERROR:") ? 2 : 4, box);
#elif CMD
ConsolePrint(response, response.Contains("ERROR:") ? 2 : 4);
#endif
if (response.Contains("ERROR:"))
{
GlobalVars.ServerID = "N/A";
}
}
if (!GlobalVars.ServerID.Equals("N/A"))
{
#if LAUNCHER
ConsolePrint("Your server's ID is " + GlobalVars.ServerID, 4, box);
#elif CMD
ConsolePrint("Your server's ID is " + GlobalVars.ServerID, 4);
#endif
}
GlobalVars.PingURL = "";
}
#if CMD
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
#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
public static string FixURLString(string str, string str2)
{
string fixedStr = str.ToLower().Replace("?version=1&amp;id=", "?id=")
.Replace("?version=1&id=", "?id=")
.Replace("&amp;", "&")
.Replace("amp;", "&");
string baseurl = fixedStr.Before("/asset/?id=");
if (baseurl == "")
{
baseurl = fixedStr.Before("/asset?id=");
if (baseurl == "")
{
baseurl = fixedStr.Before("/item.aspx?id=");
}
}
string fixedUrl = fixedStr.Replace(baseurl + "/asset/?id=", str2)
.Replace(baseurl + "/asset?id=", str2)
.Replace(baseurl + "/item.aspx?id=", str2);
//...because scripts mess it up.
string id = fixedUrl.After("id=");
string fixedID = Regex.Replace(id, "[^0-9]", "");
//really fucking hacky.
string finalUrl = fixedUrl.Before("id=") + "id=" + fixedID;
return finalUrl;
}
}
#endregion
#region Roblox Helpers
#region Vector3
public class Vector3
{
public double X;
public double Y;
public double Z;
public Vector3(double aX, double aY, double aZ)
{
X = aX;
Y = aY;
Z = aZ;
}
}
#endregion
#region Roblox File Types
public enum RobloxFileType
{
//RBXL and RBXM
RBXL,
RBXM,
//Items
Hat,
Head,
Face,
TShirt,
Shirt,
Pants,
Script,
HeadNoCustomMesh
}
#endregion
#region Asset Cache Definition
public class AssetCacheDefBasic
{
public AssetCacheDefBasic(string clas, string[] id)
{
Class = clas;
Id = id;
}
public string Class { get; set; }
public string[] Id { get; set; }
}
public class AssetCacheDef : AssetCacheDefBasic
{
public AssetCacheDef(string clas, string[] id, string[] ext,
string[] dir, string[] gamedir) : base(clas, id)
{
Ext = ext;
Dir = dir;
GameDir = gamedir;
}
public string[] Ext { get; set; }
public string[] Dir { get; set; }
public string[] GameDir { get; set; }
}
#endregion
#region Roblox Type Definitions
public struct RobloxDefs
{
public static AssetCacheDef Fonts
{
get
{
return new AssetCacheDef("SpecialMesh",
new string[] { "MeshId", "TextureId" },
new string[] { ".mesh", ".png" },
new string[] { GlobalPaths.AssetCacheDirFonts, GlobalPaths.AssetCacheDirTextures },
new string[] { GlobalPaths.AssetCacheFontsGameDir, GlobalPaths.AssetCacheTexturesGameDir });
}
}
public static AssetCacheDef Sky
{
get
{
return new AssetCacheDef("Sky",
new string[] { "SkyboxBk", "SkyboxDn", "SkyboxFt", "SkyboxLf", "SkyboxRt", "SkyboxUp" },
new string[] { ".png" },
new string[] { GlobalPaths.AssetCacheDirSky },
new string[] { GlobalPaths.AssetCacheSkyGameDir });
}
}
public static AssetCacheDef Decal
{
get
{
return new AssetCacheDef("Decal",
new string[] { "Texture" },
new string[] { ".png" },
new string[] { GlobalPaths.AssetCacheDirTextures },
new string[] { GlobalPaths.AssetCacheTexturesGameDir });
}
}
public static AssetCacheDef Texture
{
get
{
return new AssetCacheDef("Texture",
new string[] { "Texture" },
new string[] { ".png" },
new string[] { GlobalPaths.AssetCacheDirTextures },
new string[] { GlobalPaths.AssetCacheTexturesGameDir });
}
}
public static AssetCacheDef HopperBin
{
get
{
return new AssetCacheDef("HopperBin",
new string[] { "TextureId" },
new string[] { ".png" },
new string[] { GlobalPaths.AssetCacheDirTextures },
new string[] { GlobalPaths.AssetCacheTexturesGameDir });
}
}
public static AssetCacheDef Tool
{
get
{
return new AssetCacheDef("Tool",
new string[] { "TextureId" },
new string[] { ".png" },
new string[] { GlobalPaths.AssetCacheDirTextures },
new string[] { GlobalPaths.AssetCacheTexturesGameDir });
}
}
public static AssetCacheDef Sound
{
get
{
return new AssetCacheDef("Sound",
new string[] { "SoundId" },
new string[] { ".wav" },
new string[] { GlobalPaths.AssetCacheDirSounds },
new string[] { GlobalPaths.AssetCacheSoundsGameDir });
}
}
public static AssetCacheDef ImageLabel
{
get
{
return new AssetCacheDef("ImageLabel",
new string[] { "Image" },
new string[] { ".png" },
new string[] { GlobalPaths.AssetCacheDirTextures },
new string[] { GlobalPaths.AssetCacheTexturesGameDir });
}
}
public static AssetCacheDef Shirt
{
get
{
return new AssetCacheDef("Shirt",
new string[] { "ShirtTemplate" },
new string[] { ".png" },
new string[] { GlobalPaths.AssetCacheDirTextures },
new string[] { GlobalPaths.AssetCacheTexturesGameDir });
}
}
public static AssetCacheDef ShirtGraphic
{
get
{
return new AssetCacheDef("ShirtGraphic",
new string[] { "Graphic" },
new string[] { ".png" },
new string[] { GlobalPaths.AssetCacheDirTextures },
new string[] { GlobalPaths.AssetCacheTexturesGameDir });
}
}
public static AssetCacheDef Pants
{
get
{
return new AssetCacheDef("Pants",
new string[] { "PantsTemplate" },
new string[] { ".png" },
new string[] { GlobalPaths.AssetCacheDirTextures },
new string[] { GlobalPaths.AssetCacheTexturesGameDir });
}
}
public static AssetCacheDef Script
{
get
{
return new AssetCacheDef("Script",
new string[] { "LinkedSource" },
new string[] { ".lua" },
new string[] { GlobalPaths.AssetCacheDirScripts },
new string[] { GlobalPaths.AssetCacheScriptsGameDir });
}
}
public static AssetCacheDef LocalScript
{
get
{
return new AssetCacheDef("LocalScript",
new string[] { "LinkedSource" },
new string[] { ".lua" },
new string[] { GlobalPaths.AssetCacheDirScripts },
new string[] { GlobalPaths.AssetCacheScriptsGameDir });
}
}
//item defs below
public static AssetCacheDef ItemHatFonts
{
get
{
return new AssetCacheDef("SpecialMesh",
new string[] { "MeshId", "TextureId" },
new string[] { ".mesh", ".png" },
new string[] { GlobalPaths.hatdirFonts, GlobalPaths.hatdirTextures },
new string[] { GlobalPaths.hatGameDirFonts, GlobalPaths.hatGameDirTextures });
}
}
public static AssetCacheDef ItemHatSound
{
get
{
return new AssetCacheDef("Sound",
new string[] { "SoundId" },
new string[] { ".wav" },
new string[] { GlobalPaths.hatdirSounds },
new string[] { GlobalPaths.hatGameDirSounds });
}
}
public static AssetCacheDef ItemHatScript
{
get
{
return new AssetCacheDef("Script",
new string[] { "LinkedSource" },
new string[] { ".lua" },
new string[] { GlobalPaths.hatdirScripts },
new string[] { GlobalPaths.hatGameDirScripts });
}
}
public static AssetCacheDef ItemHatLocalScript
{
get
{
return new AssetCacheDef("LocalScript",
new string[] { "LinkedSource" },
new string[] { ".lua" },
new string[] { GlobalPaths.hatdirScripts },
new string[] { GlobalPaths.hatGameDirScripts });
}
}
public static AssetCacheDef ItemHeadFonts
{
get
{
return new AssetCacheDef("SpecialMesh",
new string[] { "MeshId", "TextureId" },
new string[] { ".mesh", ".png" },
new string[] { GlobalPaths.headdirFonts, GlobalPaths.headdirTextures },
new string[] { GlobalPaths.headGameDirFonts, GlobalPaths.headGameDirTextures });
}
}
public static AssetCacheDef ItemFaceTexture
{
get
{
return new AssetCacheDef("Decal",
new string[] { "Texture" },
new string[] { ".png" },
new string[] { GlobalPaths.facedirTextures },
new string[] { GlobalPaths.faceGameDirTextures });
}
}
public static AssetCacheDef ItemShirtTexture
{
get
{
return new AssetCacheDef("Shirt",
new string[] { "ShirtTemplate" },
new string[] { ".png" },
new string[] { GlobalPaths.shirtdirTextures },
new string[] { GlobalPaths.shirtGameDirTextures });
}
}
public static AssetCacheDef ItemTShirtTexture
{
get
{
return new AssetCacheDef("ShirtGraphic",
new string[] { "Graphic" },
new string[] { ".png" },
new string[] { GlobalPaths.tshirtdirTextures },
new string[] { GlobalPaths.tshirtGameDirTextures });
}
}
public static AssetCacheDef ItemPantsTexture
{
get
{
return new AssetCacheDef("Pants",
new string[] { "PantsTemplate" },
new string[] { ".png" },
new string[] { GlobalPaths.pantsdirTextures },
new string[] { GlobalPaths.pantsGameDirTextures });
}
}
}
#endregion
#region XML Types
public enum XMLTypes
{
Token,
Bool,
Float,
String,
Vector2Int16,
Int
}
#endregion
#region Roblox XML Parser
public static class RobloxXML
{
public static void EditRenderSettings(XDocument doc, string setting, string value, XMLTypes type)
{
var v = from nodes in doc.Descendants("Item")
where nodes.Attribute("class").Value == "RenderSettings"
select nodes;
foreach (var item in v)
{
var v2 = from nodes in item.Descendants((type != XMLTypes.Vector2Int16 ? type.ToString().ToLower() : "Vector2int16"))
where nodes.Attribute("name").Value == setting
select nodes;
foreach (var item2 in v2)
{
if (type != XMLTypes.Vector2Int16)
{
item2.Value = value;
}
else
{
string[] vals = value.Split('x');
var v3 = from nodes in item2.Descendants("X")
select nodes;
foreach (var item3 in v3)
{
item3.Value = vals[0];
}
var v4 = from nodes in item2.Descendants("Y")
select nodes;
foreach (var item4 in v4)
{
item4.Value = vals[1];
}
}
}
}
}
public static bool IsRenderSettingStringValid(XDocument doc, string setting, XMLTypes type)
{
if (type != XMLTypes.String)
return false;
var v = from nodes in doc.Descendants("Item")
where nodes.Attribute("class").Value == "RenderSettings"
select nodes;
foreach (var item in v)
{
var v2 = from nodes in item.Descendants(type.ToString().ToLower())
where nodes.Attribute("name").Value == setting
select nodes;
foreach (var item2 in v2)
{
return true;
}
}
return false;
}
public static string GetRenderSettings(XDocument doc, string setting, XMLTypes type)
{
var v = from nodes in doc.Descendants("Item")
where nodes.Attribute("class").Value == "RenderSettings"
select nodes;
foreach (var item in v)
{
var v2 = from nodes in item.Descendants((type != XMLTypes.Vector2Int16 ? type.ToString().ToLower() : "Vector2int16"))
where nodes.Attribute("name").Value == setting
select nodes;
foreach (var item2 in v2)
{
if (type != XMLTypes.Vector2Int16)
{
return item2.Value;
}
else
{
string ValX = "";
string ValY = "";
var v3 = from nodes in item2.Descendants("X")
select nodes;
foreach (var item3 in v3)
{
ValX = item3.Value;
}
var v4 = from nodes in item2.Descendants("Y")
select nodes;
foreach (var item4 in v4)
{
ValY = item4.Value;
}
return ValX + "x" + ValY;
}
}
}
return "";
}
public static void DownloadFilesFromNode(string url, string path, string fileext, string id)
{
if (!string.IsNullOrWhiteSpace(id))
{
Downloader download = new Downloader(url, id);
download.InitDownload(path, fileext, "", true, false);
if (download.getDownloadOutcome().Contains("Error"))
{
throw new IOException(download.getDownloadOutcome());
}
}
}
public static string GetURLInNodes(XDocument doc, string itemClassValue, string itemIdValue, string url)
{
var v = from nodes in doc.Descendants("Item")
where nodes.Attribute("class").Value == itemClassValue
select nodes;
foreach (var item in v)
{
var v2 = from nodes in item.Descendants("Content")
where nodes.Attribute("name").Value == itemIdValue
select nodes;
foreach (var item2 in v2)
{
var v3 = from nodes in item2.Descendants("url")
select nodes;
foreach (var item3 in v3)
{
if (!item3.Value.Contains("rbxassetid"))
{
if (!item3.Value.Contains("rbxasset"))
{
string oldurl = item3.Value;
string urlFixed = NovetusFuncs.FixURLString(oldurl, url);
string peram = "id=";
if (urlFixed.Contains(peram))
{
return urlFixed;
}
}
}
else
{
string oldurl = item3.Value;
string rbxassetid = "rbxassetid://";
string urlFixed = url + oldurl.After(rbxassetid);
string peram = "id=";
if (urlFixed.Contains(peram))
{
return urlFixed;
}
}
}
}
}
return "";
}
public static string RemoveInvalidXmlChars(string content)
{
return new string(content.Where(ch => XmlConvert.IsXmlChar(ch)).ToArray());
}
public static string ReplaceHexadecimalSymbols(string txt)
{
string r = "[\x00-\x08\x0B\x0C\x0E-\x1F]";
return Regex.Replace(txt, r, "", RegexOptions.Compiled);
}
}
#endregion
#endregion

View File

@ -1,454 +0,0 @@
#region Usings
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using System.Xml.Linq;
#endregion
#region Script Functions
public class ScriptFuncs
{
#region Script Generator/Signer
public class Generator
{
public static void SignGeneratedScript(string scriptFileName, bool newSigFormat = false, bool encodeInBase64 = true)
{
string privateKeyPath = Path.GetDirectoryName(scriptFileName) + "//privatekey.txt";
if (File.Exists(privateKeyPath))
{
//init vars
string format = (newSigFormat ? "--rbxsig" : "") + "%{0}%{1}";
byte[] blob = Encoding.Default.GetBytes(File.ReadAllText(privateKeyPath));
if (encodeInBase64)
{
blob = Convert.FromBase64String(Encoding.Default.GetString(blob));
}
//create cryptography providers
var shaCSP = new SHA1CryptoServiceProvider();
var rsaCSP = new RSACryptoServiceProvider();
rsaCSP.ImportCspBlob(blob);
// sign script
string script = "\r\n" + File.ReadAllText(scriptFileName);
byte[] signature = rsaCSP.SignData(Encoding.Default.GetBytes(script), shaCSP);
// override file.
GlobalFuncs.FixedFileDelete(scriptFileName);
File.WriteAllText(scriptFileName, string.Format(format, Convert.ToBase64String(signature), script));
}
else
{
//create the signature file if it doesn't exist
var signingRSACSP = new RSACryptoServiceProvider(1024);
byte[] privateKeyBlob = signingRSACSP.ExportCspBlob(true);
signingRSACSP.Dispose();
// save our text file in the script's directory
File.WriteAllText(privateKeyPath, encodeInBase64 ? Convert.ToBase64String(privateKeyBlob) : Encoding.Default.GetString(privateKeyBlob));
// try signing again.
SignGeneratedScript(scriptFileName, encodeInBase64);
}
}
public static string GetScriptFuncForType(ScriptType type)
{
return GetScriptFuncForType(GlobalVars.UserConfiguration.SelectedClient, type);
}
public static string GetScriptFuncForType(string ClientName, ScriptType type)
{
FileFormat.ClientInfo info = GlobalFuncs.GetClientInfoValues(ClientName);
string rbxexe = "";
if (info.LegacyMode)
{
rbxexe = GlobalPaths.ClientDir + @"\\" + ClientName + @"\\RobloxApp.exe";
}
else if (info.SeperateFolders)
{
rbxexe = GlobalPaths.ClientDir + @"\\" + ClientName + @"\\client\\RobloxApp_client.exe";
}
else if (info.UsesCustomClientEXEName)
{
rbxexe = GlobalPaths.ClientDir + @"\\" + ClientName + @"\\" + info.CustomClientEXEName;
}
else
{
rbxexe = GlobalPaths.ClientDir + @"\\" + ClientName + @"\\RobloxApp_client.exe";
}
#if LAUNCHER
string md5dir = !info.AlreadyHasSecurity ? SecurityFuncs.GenerateMD5(Assembly.GetExecutingAssembly().Location) : "";
#else
string md5dir = !info.AlreadyHasSecurity ? SecurityFuncs.GenerateMD5(GlobalPaths.RootPathLauncher + "\\Novetus.exe") : "";
#endif
string md5script = !info.AlreadyHasSecurity ? SecurityFuncs.GenerateMD5(GlobalPaths.ClientDir + @"\\" + ClientName + @"\\content\\scripts\\" + GlobalPaths.ScriptName + ".lua") : "";
string md5exe = !info.AlreadyHasSecurity ? SecurityFuncs.GenerateMD5(rbxexe) : "";
string md5s = "'" + md5exe + "','" + md5dir + "','" + md5script + "'";
switch (type)
{
case ScriptType.Client:
return "_G.CSConnect("
+ (info.UsesID ? GlobalVars.UserConfiguration.UserID : 0) + ",'"
+ GlobalVars.IP + "',"
+ GlobalVars.JoinPort + ",'"
+ (info.UsesPlayerName ? GlobalVars.UserConfiguration.PlayerName : "Player") + "',"
+ GlobalVars.Loadout + ","
+ md5s + ",'"
+ GlobalVars.PlayerTripcode
+ ((GlobalVars.ValidatedExtraFiles > 0) ? "'," + GlobalVars.ValidatedExtraFiles.ToString() + "," : "',0,")
+ GlobalVars.UserConfiguration.NewGUI.ToString().ToLower() + ");";
case ScriptType.Server:
return "_G.CSServer("
+ GlobalVars.UserConfiguration.RobloxPort + ","
+ GlobalVars.UserConfiguration.PlayerLimit + ","
+ md5s + ","
+ GlobalVars.UserConfiguration.ShowServerNotifications.ToString().ToLower()
+ ((GlobalVars.ValidatedExtraFiles > 0) ? "," + GlobalVars.ValidatedExtraFiles.ToString() + "," : ",0,")
+ GlobalVars.UserConfiguration.NewGUI.ToString().ToLower() + ");";
case ScriptType.Solo:
case ScriptType.EasterEgg:
return "_G.CSSolo("
+ (info.UsesID ? GlobalVars.UserConfiguration.UserID : 0) + ",'"
+ (info.UsesPlayerName ? GlobalVars.UserConfiguration.PlayerName : "Player") + "',"
+ GlobalVars.soloLoadout + ","
+ GlobalVars.UserConfiguration.NewGUI.ToString().ToLower() + ");";
case ScriptType.Studio:
return "_G.CSStudio("
+ GlobalVars.UserConfiguration.NewGUI.ToString().ToLower() + ");";
default:
return "";
}
}
public static string GetNameForType(ScriptType type)
{
switch (type)
{
case ScriptType.Client:
return "Client";
case ScriptType.Server:
return "Server";
case ScriptType.Solo:
return "Play Solo";
case ScriptType.Studio:
return "Studio";
case ScriptType.EasterEgg:
return "A message from Bitl";
default:
return "N/A";
}
}
public static void GenerateScriptForClient(ScriptType type)
{
GenerateScriptForClient(GlobalVars.UserConfiguration.SelectedClient, type);
}
public static void GenerateScriptForClient(string ClientName, ScriptType type)
{
bool shouldUseLoadFile = GlobalVars.SelectedClientInfo.CommandLineArgs.Contains("%useloadfile%");
string execScriptMethod = shouldUseLoadFile ? "loadfile" : "dofile";
string[] code = {
"--Load Script",
//scriptcontents,
(GlobalVars.SelectedClientInfo.SeperateFolders ? "" +
execScriptMethod + "('rbxasset://../../content/scripts/" + GlobalPaths.ScriptName + ".lua')" + (shouldUseLoadFile ? "()" : "") :
execScriptMethod + "('rbxasset://scripts/" + GlobalPaths.ScriptName + ".lua')" + (shouldUseLoadFile ? "()" : "")),
GetScriptFuncForType(type),
};
if (GlobalVars.SelectedClientInfo.SeperateFolders)
{
string scriptsFolder = GlobalPaths.ClientDir + @"\\" + ClientName + @"\\" + GlobalFuncs.GetClientSeperateFolderName(type) + @"\\content\\scripts";
if (!Directory.Exists(scriptsFolder))
{
Directory.CreateDirectory(scriptsFolder);
}
}
string outputPath = (GlobalVars.SelectedClientInfo.SeperateFolders ?
GlobalPaths.ClientDir + @"\\" + ClientName + @"\\" + GlobalFuncs.GetClientSeperateFolderName(type) + @"\\content\\scripts\\" + GlobalPaths.ScriptGenName + ".lua" :
GlobalPaths.ClientDir + @"\\" + ClientName + @"\\content\\scripts\\" + GlobalPaths.ScriptGenName + ".lua");
File.WriteAllLines(outputPath, code);
bool shouldSign = GlobalVars.SelectedClientInfo.CommandLineArgs.Contains("%signgeneratedjoinscript%");
bool shouldUseNewSigFormat = GlobalVars.SelectedClientInfo.CommandLineArgs.Contains("%usenewsignformat%");
if (shouldSign)
{
SignGeneratedScript(outputPath, shouldUseNewSigFormat);
}
}
public static string GetGeneratedScriptName(string ClientName, ScriptType type)
{
GenerateScriptForClient(ClientName, type);
return GlobalFuncs.GetGenLuaFileName(ClientName, type);
}
}
#endregion
#region ClientScript Parser
public class ClientScript
{
public static string GetArgsFromTag(string code, string tag, string endtag)
{
try
{
int pFrom = code.IndexOf(tag) + tag.Length;
int pTo = code.LastIndexOf(endtag);
string result = code.Substring(pFrom, pTo - pFrom);
return result;
}
#if URI || LAUNCHER || CMD || BASICLAUNCHER
catch (Exception ex)
{
GlobalFuncs.LogExceptions(ex);
#else
catch (Exception)
{
#endif
return "%donothing%";
}
}
public static ScriptType GetTypeFromTag(string tag)
{
switch (tag)
{
case string client when client.Contains("client"):
return ScriptType.Client;
case string server when server.Contains("server"):
case string no3d when no3d.Contains("no3d"):
return ScriptType.Server;
case string solo when solo.Contains("solo"):
return ScriptType.Solo;
case string studio when studio.Contains("studio"):
return ScriptType.Studio;
default:
return ScriptType.None;
}
}
public static string GetTagFromType(ScriptType type, bool endtag, bool no3d)
{
switch (type)
{
case ScriptType.Client:
return endtag ? "</client>" : "<client>";
case ScriptType.Server:
return no3d ? (endtag ? "</no3d>" : "<no3d>") : (endtag ? "</server>" : "<server>");
case ScriptType.Solo:
return endtag ? "</solo>" : "<solo>";
case ScriptType.Studio:
return endtag ? "</studio>" : "<studio>";
default:
return "";
}
}
public static int ConvertIconStringToInt()
{
switch (GlobalVars.UserCustomization.Icon)
{
case "BC":
return 1;
case "TBC":
return 2;
case "OBC":
return 3;
case "NBC":
default:
return 0;
}
}
public static string GetFolderAndMapName(string source, string seperator)
{
try
{
string result = source.Substring(0, source.IndexOf(seperator));
if (File.Exists(GlobalPaths.MapsDir + @"\\" + result + @"\\" + source))
{
return result + @"\\" + source;
}
else
{
return source;
}
}
#if URI || LAUNCHER || CMD || BASICLAUNCHER
catch (Exception ex)
{
GlobalFuncs.LogExceptions(ex);
#else
catch (Exception)
{
#endif
return source;
}
}
public static string GetFolderAndMapName(string source)
{
return GetFolderAndMapName(source, " -");
}
public static string GetRawArgsForType(ScriptType type, string ClientName, string luafile)
{
FileFormat.ClientInfo info = GlobalFuncs.GetClientInfoValues(ClientName);
if (!info.Fix2007)
{
return Generator.GetScriptFuncForType(ClientName, type);
}
else
{
return luafile;
}
}
public static string CompileScript(string code, string tag, string endtag, string mapfile, string luafile, string rbxexe, bool usesharedtags = true)
{
return CompileScript(GlobalVars.UserConfiguration.SelectedClient, code, tag, endtag, mapfile, luafile, rbxexe, usesharedtags);
}
public static string CompileScript(string ClientName, string code, string tag, string endtag, string mapfile, string luafile, string rbxexe, bool usesharedtags = true)
{
string start = tag;
string end = endtag;
FileFormat.ClientInfo info = GlobalFuncs.GetClientInfoValues(ClientName);
ScriptType type = GetTypeFromTag(start);
//we must have the ending tag before we continue.
if (string.IsNullOrWhiteSpace(end))
{
return "";
}
if (usesharedtags)
{
string sharedstart = "<shared>";
string sharedend = "</shared>";
if (code.Contains(sharedstart) && code.Contains(sharedend))
{
start = sharedstart;
end = sharedend;
}
}
if (info.Fix2007)
{
Generator.GenerateScriptForClient(type);
}
string extractedCode = GetArgsFromTag(code, start, end);
if (extractedCode.Contains("%donothing%"))
{
return "";
}
#if LAUNCHER
string md5dir = !info.AlreadyHasSecurity ? SecurityFuncs.GenerateMD5(Assembly.GetExecutingAssembly().Location) : "";
#else
string md5dir = !info.AlreadyHasSecurity ? SecurityFuncs.GenerateMD5(GlobalPaths.RootPathLauncher + "\\Novetus.exe") : "";
#endif
string md5script = !info.AlreadyHasSecurity ? SecurityFuncs.GenerateMD5(GlobalPaths.ClientDir + @"\\" + GlobalVars.UserConfiguration.SelectedClient + @"\\content\\scripts\\" + GlobalPaths.ScriptName + ".lua") : "";
string md5exe = !info.AlreadyHasSecurity ? SecurityFuncs.GenerateMD5(rbxexe) : "";
string md5sd = "'" + md5exe + "','" + md5dir + "','" + md5script + "'";
string md5s = "'" + info.ClientMD5 + "','" + md5dir + "','" + info.ScriptMD5 + "'";
string compiled = extractedCode.Replace("%version%", GlobalVars.ProgramInformation.Version)
.Replace("%mapfile%", mapfile)
.Replace("%luafile%", luafile)
.Replace("%charapp%", GlobalVars.UserCustomization.CharacterID)
.Replace("%ip%", GlobalVars.IP)
.Replace("%port%", GlobalVars.UserConfiguration.RobloxPort.ToString())
.Replace("%joinport%", GlobalVars.JoinPort.ToString())
.Replace("%name%", GlobalVars.UserConfiguration.PlayerName)
.Replace("%icone%", ConvertIconStringToInt().ToString())
.Replace("%icon%", GlobalVars.UserCustomization.Icon)
.Replace("%id%", GlobalVars.UserConfiguration.UserID.ToString())
.Replace("%face%", GlobalVars.UserCustomization.Face)
.Replace("%head%", GlobalVars.UserCustomization.Head)
.Replace("%tshirt%", GlobalVars.UserCustomization.TShirt)
.Replace("%shirt%", GlobalVars.UserCustomization.Shirt)
.Replace("%pants%", GlobalVars.UserCustomization.Pants)
.Replace("%hat1%", GlobalVars.UserCustomization.Hat1)
.Replace("%hat2%", GlobalVars.UserCustomization.Hat2)
.Replace("%hat3%", GlobalVars.UserCustomization.Hat3)
.Replace("%faced%", GlobalVars.UserCustomization.Face.Contains("http://") ? GlobalVars.UserCustomization.Face : GlobalPaths.faceGameDir + GlobalVars.UserCustomization.Face)
.Replace("%headd%", GlobalPaths.headGameDir + GlobalVars.UserCustomization.Head)
.Replace("%tshirtd%", GlobalVars.UserCustomization.TShirt.Contains("http://") ? GlobalVars.UserCustomization.TShirt : GlobalPaths.tshirtGameDir + GlobalVars.UserCustomization.TShirt)
.Replace("%shirtd%", GlobalVars.UserCustomization.Shirt.Contains("http://") ? GlobalVars.UserCustomization.Shirt : GlobalPaths.shirtGameDir + GlobalVars.UserCustomization.Shirt)
.Replace("%pantsd%", GlobalVars.UserCustomization.Pants.Contains("http://") ? GlobalVars.UserCustomization.Pants : GlobalPaths.pantsGameDir + GlobalVars.UserCustomization.Pants)
.Replace("%hat1d%", GlobalPaths.hatGameDir + GlobalVars.UserCustomization.Hat1)
.Replace("%hat2d%", GlobalPaths.hatGameDir + GlobalVars.UserCustomization.Hat2)
.Replace("%hat3d%", GlobalPaths.hatGameDir + GlobalVars.UserCustomization.Hat3)
.Replace("%headcolor%", GlobalVars.UserCustomization.HeadColorID.ToString())
.Replace("%torsocolor%", GlobalVars.UserCustomization.TorsoColorID.ToString())
.Replace("%larmcolor%", GlobalVars.UserCustomization.LeftArmColorID.ToString())
.Replace("%llegcolor%", GlobalVars.UserCustomization.LeftLegColorID.ToString())
.Replace("%rarmcolor%", GlobalVars.UserCustomization.RightArmColorID.ToString())
.Replace("%rlegcolor%", GlobalVars.UserCustomization.RightLegColorID.ToString())
.Replace("%md5launcher%", md5dir)
.Replace("%md5script%", info.ScriptMD5)
.Replace("%md5exe%", info.ClientMD5)
.Replace("%md5scriptd%", md5script)
.Replace("%md5exed%", md5exe)
.Replace("%md5s%", md5s)
.Replace("%md5sd%", md5sd)
.Replace("%limit%", GlobalVars.UserConfiguration.PlayerLimit.ToString())
.Replace("%extra%", GlobalVars.UserCustomization.Extra)
.Replace("%hat4%", GlobalVars.UserCustomization.Extra)
.Replace("%extrad%", GlobalPaths.extraGameDir + GlobalVars.UserCustomization.Extra)
.Replace("%hat4d%", GlobalPaths.hatGameDir + GlobalVars.UserCustomization.Extra)
.Replace("%mapfiled%", GlobalPaths.BaseGameDir + GlobalVars.UserConfiguration.MapPathSnip.Replace(@"\\", @"\").Replace(@"/", @"\"))
.Replace("%mapfilec%", extractedCode.Contains("%mapfilec%") ? GlobalFuncs.CopyMapToRBXAsset() : "")
.Replace("%tripcode%", GlobalVars.PlayerTripcode)
.Replace("%scripttype%", Generator.GetNameForType(type))
.Replace("%notifications%", GlobalVars.UserConfiguration.ShowServerNotifications.ToString().ToLower())
.Replace("%loadout%", code.Contains("<solo>") ? GlobalVars.soloLoadout : GlobalVars.Loadout)
.Replace("%doublequote%", "\"")
.Replace("%validatedextrafiles%", GlobalVars.ValidatedExtraFiles.ToString())
.Replace("%argstring%", GetRawArgsForType(type, ClientName, luafile))
.Replace("%tshirttexid%", GlobalVars.TShirtTextureID)
.Replace("%shirttexid%", GlobalVars.ShirtTextureID)
.Replace("%pantstexid%", GlobalVars.PantsTextureID)
.Replace("%facetexid%", GlobalVars.FaceTextureID)
.Replace("%tshirttexidlocal%", GlobalVars.TShirtTextureLocal)
.Replace("%shirttexidlocal%", GlobalVars.ShirtTextureLocal)
.Replace("%pantstexidlocal%", GlobalVars.PantsTextureLocal)
.Replace("%facetexlocal%", GlobalVars.FaceTextureLocal)
.Replace("%newgui%", GlobalVars.UserConfiguration.NewGUI.ToString().ToLower());
if (compiled.Contains("%disabled%"))
{
MessageBox.Show("This option has been disabled for this client.", "Novetus - Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return "";
}
return compiled;
}
}
#endregion
}
#endregion

View File

@ -0,0 +1,725 @@
#region Usings
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Diagnostics;
using System.Security.Cryptography;
using System.Text;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Net;
using NLog;
using System.Text.RegularExpressions;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
#endregion
#region Utils
//This code was brought to you by:
//https://stackoverflow.com/questions/1926264/color-different-parts-of-a-richtextbox-string
//https://stackoverflow.com/questions/262280/how-can-i-know-if-a-process-is-running
//https://stackoverflow.com/questions/444798/case-insensitive-containsstring
//https://stackoverflow.com/questions/6084940/how-do-i-search-a-multi-dimensional-array
//https://www.dotnetperls.com/between-before-after
//https://stackoverflow.com/questions/12422619/can-i-disable-the-close-button-of-a-form-using-c
//https://stackoverflow.com/questions/9031537/really-simple-encryption-with-c-sharp-and-symmetricalgorithm
public static class Util
{
#region Rich Text Box Extensions
public static void AppendText(this RichTextBox box, string text, Color color)
{
box.SelectionStart = box.TextLength;
box.SelectionLength = 0;
box.SelectionColor = color;
box.AppendText(text);
box.SelectionColor = box.ForeColor;
}
#endregion
#region Process Extensions
public static bool IsRunning(this Process process)
{
try
{
Process.GetProcessById(process.Id);
}
catch (InvalidOperationException)
{
return false;
}
catch (ArgumentException)
{
return false;
}
return true;
}
#endregion
#region String Extensions
public static bool Contains(this string source, string toCheck, StringComparison comp)
{
if (source == null)
return false;
return source.IndexOf(toCheck, comp) >= 0;
}
#endregion
#region Substring Extensions
/// <summary>
/// Get string value between [first] a and [last] b.
/// </summary>
public static string Between(this string value, string a, string b)
{
int posA = value.IndexOf(a);
int posB = value.LastIndexOf(b);
if (posA == -1)
{
return "";
}
if (posB == -1)
{
return "";
}
int adjustedPosA = posA + a.Length;
if (adjustedPosA >= posB)
{
return "";
}
return value.Substring(adjustedPosA, posB - adjustedPosA);
}
/// <summary>
/// Get string value after [first] a.
/// </summary>
public static string Before(this string value, string a)
{
int posA = value.IndexOf(a);
if (posA == -1)
{
return "";
}
return value.Substring(0, posA);
}
/// <summary>
/// Get string value after [last] a.
/// </summary>
public static string After(this string value, string a)
{
int posA = value.LastIndexOf(a);
if (posA == -1)
{
return "";
}
int adjustedPosA = posA + a.Length;
if (adjustedPosA >= value.Length)
{
return "";
}
return value.Substring(adjustedPosA);
}
#endregion
#region String Utilities
private static byte[] key = new byte[8] { 1, 2, 3, 4, 5, 6, 7, 8 };
private static byte[] iv = new byte[8] { 1, 2, 3, 4, 5, 6, 7, 8 };
public static string Crypt(this string text)
{
SymmetricAlgorithm algorithm = DES.Create();
ICryptoTransform transform = algorithm.CreateEncryptor(key, iv);
byte[] inputbuffer = Encoding.Unicode.GetBytes(text);
byte[] outputBuffer = transform.TransformFinalBlock(inputbuffer, 0, inputbuffer.Length);
return Convert.ToBase64String(outputBuffer);
}
public static string Decrypt(this string text)
{
SymmetricAlgorithm algorithm = DES.Create();
ICryptoTransform transform = algorithm.CreateDecryptor(key, iv);
byte[] inputbuffer = Convert.FromBase64String(text);
byte[] outputBuffer = transform.TransformFinalBlock(inputbuffer, 0, inputbuffer.Length);
return Encoding.Unicode.GetString(outputBuffer);
}
#endregion
#region Exception Helpers
//https://github.com/AlexMelw/EasySharp/blob/master/NHelpers/ExceptionsDealing/Extensions/ExceptionExtensions.cs
/// <summary>
/// Gets the entire stack trace consisting of exception's footprints (File, Method, LineNumber)
/// </summary>
/// <param name="exception">Source <see cref="Exception" /></param>
/// <returns>
/// <see cref="string" /> that represents the entire stack trace consisting of exception's footprints (File,
/// Method, LineNumber)
/// </returns>
public static string GetExceptionFootprints(this Exception exception)
{
StackTrace stackTrace = new StackTrace(exception, true);
StackFrame[] frames = stackTrace.GetFrames();
if (ReferenceEquals(frames, null))
{
return string.Empty;
}
var traceStringBuilder = new StringBuilder();
for (var i = 0; i < frames.Length; i++)
{
StackFrame frame = frames[i];
if (frame.GetFileLineNumber() < 1)
continue;
traceStringBuilder.AppendLine($"File: {frame.GetFileName()}");
traceStringBuilder.AppendLine($"Method: {frame.GetMethod().Name}");
traceStringBuilder.AppendLine($"LineNumber: {frame.GetFileLineNumber()}");
if (i == frames.Length - 1)
break;
traceStringBuilder.AppendLine(" ---> ");
}
string stackTraceFootprints = traceStringBuilder.ToString();
if (string.IsNullOrWhiteSpace(stackTraceFootprints))
return "NO DETECTED FOOTPRINTS";
return stackTraceFootprints;
}
#endregion
#region DirectoryInfo Extensions
public static IEnumerable<FileInfo> GetFilesByExtensions(this DirectoryInfo dir, params string[] extensions)
{
if (extensions == null)
throw new ArgumentNullException("extensions");
IEnumerable<FileInfo> files = dir.EnumerateFiles();
return files.Where(f => extensions.Contains(f.Extension));
}
#endregion
#region DateTime Extensions
//https://stackoverflow.com/questions/5672862/check-if-datetime-instance-falls-in-between-other-two-datetime-objects
public static bool IsBetweenTwoDates(this DateTime dt, DateTime start, DateTime end)
{
return dt >= start && dt <= end;
}
#endregion
#region Form Extensions
[DllImport("user32")]
public static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);
[DllImport("user32")]
public static extern bool EnableMenuItem(IntPtr hMenu, uint itemId, uint uEnable);
public static void DisableCloseButton(this Form form)
{
// The 1 parameter means to gray out. 0xF060 is SC_CLOSE.
EnableMenuItem(GetSystemMenu(form.Handle, false), 0xF060, 1);
}
public static void EnableCloseButton(this Form form)
{
// The zero parameter means to enable. 0xF060 is SC_CLOSE.
EnableMenuItem(GetSystemMenu(form.Handle, false), 0xF060, 0);
}
#endregion
#region Utility Functions
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;
}
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.");
}
}
}
//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;
}
//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<string> files = new List<string>();
foreach (string sp in searchPatterns)
files.AddRange(System.IO.Directory.GetFiles(path, sp, searchOption));
files.Sort();
return files.ToArray();
}
// 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<string>();
var foundFiles = new List<string>();
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
}
}
//http://stevenhollidge.blogspot.com/2012/06/async-taskdelay.html
public static Task Delay(int milliseconds)
{
var tcs = new TaskCompletionSource<object>();
new System.Threading.Timer(_ => tcs.SetResult(null)).Change(milliseconds, -1);
return tcs.Task;
}
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;
}
}
#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
//https://stackoverflow.com/questions/27108264/how-to-properly-make-a-http-web-get-request
private static string HttpGetInternal(string uri)
{
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();
}
}
}
}
public static string HttpGet(string uri)
{
int tries = 0;
int triesMax = 5;
string exceptionMessage = "";
while (tries < triesMax)
{
tries++;
try
{
return HttpGetInternal(uri);
}
catch (Exception ex)
{
#if URI || LAUNCHER || CMD || BASICLAUNCHER
LogExceptions(ex);
#endif
exceptionMessage = ex.Message;
continue;
}
}
return "ERROR: " + exceptionMessage;
}
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 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;
}
//converted from https://facreationz.wordpress.com/2014/12/11/c-know-if-running-under-wine/
public static bool IsWineRunning()
{
string processName = "winlogon";
var p = Process.GetProcessesByName(processName).Count();
return (p <= 0);
}
#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);
}
#endif
#endregion
}
#endregion
#region Tab Control without Header
//https://stackoverflow.com/questions/23247941/c-sharp-how-to-remove-tabcontrol-border
public partial class TabControlWithoutHeader : TabControl
{
public TabControlWithoutHeader()
{
if (!DesignMode) Multiline = true;
}
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x1328 && !DesignMode)
m.Result = new IntPtr(1);
else
base.WndProc(ref m);
}
}
#endregion

View File

@ -1,27 +0,0 @@
#region Usings
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
#endregion
#region Tab Control without Header
//https://stackoverflow.com/questions/23247941/c-sharp-how-to-remove-tabcontrol-border
public partial class TabControlWithoutHeader : TabControl
{
public TabControlWithoutHeader()
{
if (!DesignMode) Multiline = true;
}
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x1328 && !DesignMode)
m.Result = new IntPtr(1);
else
base.WndProc(ref m);
}
}
#endregion

View File

@ -1,28 +0,0 @@
#region Usings
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
#endregion
#region Form Extensions
public static class FormExt
{
[DllImport("user32")]
public static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);
[DllImport("user32")]
public static extern bool EnableMenuItem(IntPtr hMenu, uint itemId, uint uEnable);
public static void DisableCloseButton(this Form form)
{
// The 1 parameter means to gray out. 0xF060 is SC_CLOSE.
EnableMenuItem(GetSystemMenu(form.Handle, false), 0xF060, 1);
}
public static void EnableCloseButton(this Form form)
{
// The zero parameter means to enable. 0xF060 is SC_CLOSE.
EnableMenuItem(GetSystemMenu(form.Handle, false), 0xF060, 0);
}
}
#endregion