add clientscript stuff, t-shirts in 2007e

This commit is contained in:
Bitl 2021-11-15 13:50:52 -07:00
parent 5fd6a93cd4
commit 594ed98384
18 changed files with 831 additions and 413 deletions

View File

@ -10,10 +10,10 @@ using System.Windows.Forms;
class Downloader
{
private readonly string fileURL;
private readonly string fileName;
private readonly string fileFilter;
private readonly string filePath;
public readonly string fileURL;
public readonly string fileName;
public readonly string fileFilter;
public readonly string filePath;
private string downloadOutcome;
private static string downloadOutcomeException;
@ -96,16 +96,21 @@ class Downloader
{
read = DownloadFile(fileURL, name);
}
#if URI || LAUNCHER || CMD || BASICLAUNCHER
catch (Exception ex)
{
GlobalFuncs.LogExceptions(ex);
#else
catch (Exception)
{
#endif
downloadOutcome = "Error when downloading file: " + ex.Message;
}
finally
{
//wait a few seconds for the download to finish
Thread.Sleep(2000);
if (File.Exists(name))
//Thread.Sleep(2000);
if (/*File.Exists(name)*/ read > 0)
{
downloadOutcome = "File " + Path.GetFileName(name) + " downloaded! " + GlobalFuncs.SizeSuffix(Convert.ToInt64(read), 2) + " written (" + read + " bytes)! " + additionalText;
}
@ -195,7 +200,9 @@ class Downloader
}
catch (Exception e)
{
#if URI || LAUNCHER || CMD || BASICLAUNCHER
GlobalFuncs.LogExceptions(e);
#endif
if (e is WebException && bytesProcessed == 0)
{
WebException ex = (WebException)e;

View File

@ -34,20 +34,28 @@ public enum RobloxFileType
#endregion
#region Asset Cache Definition
public class AssetCacheDef
public class AssetCacheDefBasic
{
public AssetCacheDef(string clas, string[] id, string[] ext,
string[] dir, string[] gamedir)
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 Class { get; set; }
public string[] Id { get; set; }
public string[] Ext { get; set; }
public string[] Dir { get; set; }
public string[] GameDir { get; set; }

View File

@ -1,4 +1,5 @@
#region Usings
using System;
using System.Linq;
using System.Text.RegularExpressions;
using System.Windows.Forms;
@ -134,6 +135,351 @@ public static class RobloxXML
return "";
}
private static void DownloadFilesFromNode(string url, string path, string fileext, string id)
{
if (!string.IsNullOrWhiteSpace(id))
{
Downloader download = new Downloader(url, id);
try
{
download.InitDownload(path, fileext, "", true);
}
#if URI || LAUNCHER || CMD || BASICLAUNCHER
catch (Exception ex)
{
GlobalFuncs.LogExceptions(ex);
#else
catch (Exception)
{
#endif
MessageBox.Show("The download has experienced an error: " + ex.Message, "Novetus Asset SDK - Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
public static void DownloadOrFixURLS(XDocument doc, bool remote, string url, AssetCacheDef assetdef, string name = "", string meshname = "")
{
DownloadOrFixURLS(doc, remote, url, assetdef, 0, 0, 0, 0, name, meshname);
}
public static void DownloadOrFixURLS(XDocument doc, bool remote, string url, AssetCacheDef assetdef, int idIndex, int extIndex, int outputPathIndex, int inGameDirIndex, string name = "", string meshname = "")
{
DownloadOrFixURLS(doc, remote, url, assetdef.Class, assetdef.Id[idIndex], assetdef.Ext[extIndex], assetdef.Dir[outputPathIndex], assetdef.GameDir[inGameDirIndex], name, meshname);
}
public static void DownloadOrFixURLS(XDocument doc, bool remote, string url, string itemClassValue, string itemIdValue, string fileext, string outputPath, string inGameDir, string name = "", string meshname = "")
{
if (remote)
{
FixURLInNodes(doc, itemClassValue, itemIdValue, url);
}
else
{
DownloadFromNodes(doc, itemClassValue, itemIdValue, fileext, outputPath, inGameDir, name, meshname);
}
}
public static void DownloadFromNodes(XDocument doc, string itemClassValue, string itemIdValue, string fileext, string outputPath, string inGameDir, string name = "", string meshname = "")
{
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"))
{
if (string.IsNullOrWhiteSpace(meshname))
{
string url = item3.Value;
string newurl = "assetdelivery.roblox.com/v1/asset/?id=";
string urlFixed = url.Replace("http://", "https://")
.Replace("?version=1&id=", "?id=")
.Replace("www.roblox.com/asset/?id=", newurl)
.Replace("www.roblox.com/asset?id=", newurl)
.Replace("assetgame.roblox.com/asset/?id=", newurl)
.Replace("assetgame.roblox.com/asset?id=", newurl)
.Replace("roblox.com/asset/?id=", newurl)
.Replace("roblox.com/asset?id=", newurl)
.Replace("&", "&")
.Replace("amp;", "&");
string peram = "id=";
if (string.IsNullOrWhiteSpace(name))
{
if (urlFixed.Contains(peram))
{
string IDVal = urlFixed.After(peram);
DownloadFilesFromNode(urlFixed, outputPath, fileext, IDVal);
item3.Value = (inGameDir + IDVal + fileext).Replace(" ", "");
}
}
else
{
DownloadFilesFromNode(urlFixed, outputPath, fileext, name);
item3.Value = inGameDir + name + fileext;
}
}
else
{
item3.Value = inGameDir + meshname;
}
}
}
else
{
if (string.IsNullOrWhiteSpace(meshname))
{
string url = item3.Value;
string rbxassetid = "rbxassetid://";
string urlFixed = "https://assetdelivery.roblox.com/v1/asset/?id=" + url.After(rbxassetid);
string peram = "id=";
if (string.IsNullOrWhiteSpace(name))
{
if (urlFixed.Contains(peram))
{
string IDVal = urlFixed.After(peram);
DownloadFilesFromNode(urlFixed, outputPath, fileext, IDVal);
item3.Value = inGameDir + IDVal + fileext;
}
}
else
{
DownloadFilesFromNode(urlFixed, outputPath, fileext, name);
item3.Value = inGameDir + name + fileext;
}
}
else
{
item3.Value = inGameDir + meshname;
}
}
}
}
}
}
public static void FixURLInNodes(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 = oldurl.Replace("http://", "")
.Replace("https://", "")
.Replace("?version=1&id=", "?id=")
.Replace("www.roblox.com/asset/?id=", url)
.Replace("www.roblox.com/asset?id=", url)
.Replace("assetgame.roblox.com/asset/?id=", url)
.Replace("assetgame.roblox.com/asset?id=", url)
.Replace("roblox.com/asset/?id=", url)
.Replace("roblox.com/asset?id=", url)
.Replace("&", "&")
.Replace("amp;", "&");
string peram = "id=";
if (urlFixed.Contains(peram))
{
item3.Value = urlFixed;
}
}
}
else
{
string oldurl = item3.Value;
string rbxassetid = "rbxassetid://";
string urlFixed = url + oldurl.After(rbxassetid);
string peram = "id=";
if (urlFixed.Contains(peram))
{
item3.Value = urlFixed;
}
}
}
}
}
}
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 = oldurl.Replace("http://", "")
.Replace("https://", "")
.Replace("?version=1&id=", "?id=")
.Replace("www.roblox.com/asset/?id=", url)
.Replace("www.roblox.com/asset?id=", url)
.Replace("assetgame.roblox.com/asset/?id=", url)
.Replace("assetgame.roblox.com/asset?id=", url)
.Replace("roblox.com/asset/?id=", url)
.Replace("roblox.com/asset?id=", url)
.Replace("&", "&")
.Replace("amp;", "&");
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 "";
}
//TODO: actually download the script assets instead of fixing the scripts lol. fixing the scripts won't work anyways because we don't support https natively.
/*
public static void DownloadScriptFromNodes(string filepath, string itemClassValue)
{
string oldfile = File.ReadAllText(filepath);
string fixedfile = RemoveInvalidXmlChars(ReplaceHexadecimalSymbols(oldfile));
XDocument doc = XDocument.Parse(fixedfile);
try
{
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("Properties")
select nodes;
foreach (var item2 in v2)
{
var v3 = from nodes in doc.Descendants("ProtectedString")
where nodes.Attribute("name").Value == "Source"
select nodes;
foreach (var item3 in v3)
{
string newurl = "assetdelivery.roblox.com/v1/asset/?id=";
item3.Value.Replace("http://", "https://")
.Replace("?version=1&id=", "?id=")
.Replace("www.roblox.com/asset/?id=", newurl)
.Replace("www.roblox.com/asset?id=", newurl)
.Replace("assetgame.roblox.com/asset/?id=", newurl)
.Replace("assetgame.roblox.com/asset?id=", newurl)
.Replace("roblox.com/asset/?id=", newurl)
.Replace("roblox.com/asset?id=", newurl);
}
}
}
}
catch (Exception ex)
{
GlobalFuncs.LogExceptions(ex);
MessageBox.Show("The download has experienced an error: " + ex.Message, "Novetus Asset SDK - Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
doc.Save(filepath);
}
}
public static void DownloadFromScript(string filepath)
{
string[] file = File.ReadAllLines(filepath);
try
{
foreach (var line in file)
{
if (line.Contains("www.roblox.com/asset/?id=") || line.Contains("assetgame.roblox.com/asset/?id="))
{
string newurl = "assetdelivery.roblox.com/v1/asset/?id=";
line.Replace("http://", "https://")
.Replace("?version=1&id=", "?id=")
.Replace("www.roblox.com/asset/?id=", newurl)
.Replace("www.roblox.com/asset?id=", newurl)
.Replace("assetgame.roblox.com/asset/?id=", newurl)
.Replace("assetgame.roblox.com/asset?id=", newurl)
.Replace("roblox.com/asset/?id=", newurl)
.Replace("roblox.com/asset?id=", newurl);
}
}
}
catch (Exception ex)
{
GlobalFuncs.LogExceptions(ex);
MessageBox.Show("The download has experienced an error: " + ex.Message, "Novetus Asset SDK - Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
File.WriteAllLines(filepath, file);
}
}*/
public static string RemoveInvalidXmlChars(string content)
{
return new string(content.Where(ch => XmlConvert.IsXmlChar(ch)).ToArray());

View File

@ -9,6 +9,7 @@
<Import_RootNamespace>NovetusCore</Import_RootNamespace>
</PropertyGroup>
<ItemGroup>
<Compile Include="$(MSBuildThisFileDirectory)Classes\Downloader.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Classes\PartColors.cs" />
<Compile Include="$(MSBuildThisFileDirectory)CharCustom\ContentProviders.cs" />
<Compile Include="$(MSBuildThisFileDirectory)CharCustom\IconLoader.cs" />
@ -17,6 +18,7 @@
<Compile Include="$(MSBuildThisFileDirectory)Classes\FileFormat.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" />

View File

@ -16,6 +16,7 @@ using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml;
using System.Xml.Linq;
#endregion
@ -1094,7 +1095,7 @@ public class GlobalFuncs
ReloadLoadoutValue();
}
public static void ReloadLoadoutValue()
public static void ReloadLoadoutValue(bool localizeOnlineClothing = false)
{
string hat1 = (!GlobalVars.UserCustomization.Hat1.EndsWith("-Solo.rbxm")) ? GlobalVars.UserCustomization.Hat1 : "NoHat.rbxm";
string hat2 = (!GlobalVars.UserCustomization.Hat2.EndsWith("-Solo.rbxm")) ? GlobalVars.UserCustomization.Hat2 : "NoHat.rbxm";
@ -1134,9 +1135,105 @@ public class GlobalFuncs
GlobalVars.UserCustomization.Head + "','" +
GlobalVars.UserCustomization.Icon + "','" +
GlobalVars.UserCustomization.Extra + "'";
if (localizeOnlineClothing)
{
GlobalVars.TShirtTextureID = GetItemTextureID(GlobalVars.UserCustomization.TShirt, "TShirt", new AssetCacheDefBasic("ShirtGraphic", new string[] { "Graphic" }));
GlobalVars.ShirtTextureID = GetItemTextureID(GlobalVars.UserCustomization.Shirt, "Shirt", new AssetCacheDefBasic("Shirt", new string[] { "ShirtTemplate" }));
GlobalVars.PantsTextureID = GetItemTextureID(GlobalVars.UserCustomization.Pants, "Pants", new AssetCacheDefBasic("Pants", new string[] { "PantsTemplate" }));
GlobalVars.FaceTextureID = GetItemTextureID(GlobalVars.UserCustomization.Face, "Face", new AssetCacheDefBasic("Decal", new string[] { "Texture" }));
GlobalVars.TShirtTextureLocal = GetItemTextureLocalPath(GlobalVars.TShirtTextureID);
GlobalVars.ShirtTextureLocal = GetItemTextureLocalPath(GlobalVars.ShirtTextureID);
GlobalVars.PantsTextureLocal = GetItemTextureLocalPath(GlobalVars.PantsTextureID);
GlobalVars.FaceTextureLocal = GetItemTextureLocalPath(GlobalVars.FaceTextureID);
}
}
public static void GeneratePlayerID()
public static string GetItemTextureLocalPath(string item)
{
//don't bother, we're offline.
if (GlobalVars.ExternalIP.Equals("localhost"))
return "";
if (!GlobalVars.SelectedClientInfo.CommandLineArgs.Contains("%localizeonlineclothing%"))
return "";
string peram = "id=";
string id = item.After(peram);
if (item.Contains(peram))
{
Downloader download = new Downloader(item, id + ".png", "", GlobalPaths.AssetCacheDirTextures);
try
{
string path = download.GetFullDLPath();
download.InitDownloadNoDialog(path);
return GlobalPaths.AssetCacheTexturesGameDir + download.fileName;
}
#if URI || LAUNCHER || CMD || BASICLAUNCHER
catch (Exception ex)
{
LogExceptions(ex);
#else
catch (Exception)
{
#endif
}
}
return "";
}
public static string GetItemTextureID(string item, string name, AssetCacheDefBasic assetCacheDef)
{
//don't bother, we're offline.
if (GlobalVars.ExternalIP.Equals("localhost"))
return "";
if (!GlobalVars.SelectedClientInfo.CommandLineArgs.Contains("%localizeonlineclothing%"))
return "";
string peram = "id=";
if (item.Contains(peram))
{
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 = GenerateStreamFromString(fixedfile);
using (XmlReader xmlReader = XmlReader.Create(filestream, xmlReaderSettings))
{
xmlReader.MoveToContent();
doc = XDocument.Load(xmlReader);
}
string id = item.After(peram);
string baseURL = item.Before(id);
return RobloxXML.GetURLInNodes(doc, assetCacheDef.Class, assetCacheDef.Id[0], baseURL);
}
#if URI || LAUNCHER || CMD || BASICLAUNCHER
catch (Exception ex)
{
LogExceptions(ex);
#else
catch (Exception)
{
#endif
}
}
return "";
}
public static void GeneratePlayerID()
{
CryptoRandom random = new CryptoRandom();
int randomID = 0;
@ -1833,6 +1930,7 @@ public class GlobalFuncs
switch (type)
{
case ScriptType.Client:
ReloadLoadoutValue(true);
if (!GlobalVars.LocalPlayMode && GlobalVars.GameOpened != ScriptType.Server)
{
goto default;
@ -1857,10 +1955,13 @@ public class GlobalFuncs
}
else if (GlobalVars.UserConfiguration.FirstServerLaunch)
{
string hostingTips = "For your first time hosting a server, make sure your server's port forwarded (set up in your router), going through a tunnel server, or running from UPnP.\n" +
"If your port is forwarded or you are going through a tunnel server, make sure your port is set up as UDP, not TCP.\n" +
"Roblox does NOT use TCP, only UDP. However, if your server doesn't work with just UDP, feel free to set up TCP too as that might help the issue in some cases.";
#if LAUNCHER
MessageBox.Show("For your first time hosting a server, make sure your server's port forwarded (set up in your router), going through a tunnel server, or running from UPnP.\nIf your port is forwarded or you are going through a tunnel server, make sure your port is set up as UDP, not TCP.\nRoblox does NOT use TCP, only UDP.", "Novetus - Hosting Tips", MessageBoxButtons.OK, MessageBoxIcon.Information);
MessageBox.Show(hostingTips, "Novetus - Hosting Tips", MessageBoxButtons.OK, MessageBoxIcon.Information);
#elif CMD
ConsolePrint("For your first time hosting a server, make sure your server's port forwarded (set up in your router), going through a tunnel server, or running from UPnP.\nIf your port is forwarded or you are going through a tunnel server, make sure your port is set up as UDP, not TCP.\nRoblox does NOT use TCP, only UDP.\nPress any key to continue...", 4);
ConsolePrint(hostingTips + "\nPress any key to continue...", 4);
Console.ReadKey();
#endif
GlobalVars.UserConfiguration.FirstServerLaunch = false;
@ -1871,6 +1972,7 @@ public class GlobalFuncs
}
break;
case ScriptType.Solo:
ReloadLoadoutValue(true);
if (GlobalVars.GameOpened != ScriptType.Studio)
{
goto default;

View File

@ -67,6 +67,14 @@ public static class GlobalVars
#region Customization
public static string Loadout = "";
public static string soloLoadout = "";
public static string TShirtTextureID = "";
public static string ShirtTextureID = "";
public static string PantsTextureID = "";
public static string FaceTextureID = "";
public static string TShirtTextureLocal = "";
public static string ShirtTextureLocal = "";
public static string PantsTextureLocal = "";
public static string FaceTextureLocal = "";
#endregion
#region Discord Variables

View File

@ -2,9 +2,11 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using System.Xml.Linq;
#endregion
#region Script Functions
@ -56,14 +58,14 @@ public class ScriptFuncs
+ GlobalVars.Loadout + ","
+ md5s + ",'"
+ GlobalVars.UserConfiguration.PlayerTripcode
+ ((GlobalVars.ValidatedExtraFiles > 0) ? "'," + GlobalVars.ValidatedExtraFiles.ToString() + ");" : "');");
+ ((GlobalVars.ValidatedExtraFiles > 0) ? "'," + GlobalVars.ValidatedExtraFiles.ToString() + ",);" : "',0);");
case ScriptType.Server:
return "_G.CSServer("
+ GlobalVars.UserConfiguration.RobloxPort + ","
+ GlobalVars.UserConfiguration.PlayerLimit + ","
+ md5s + ","
+ GlobalVars.UserConfiguration.ShowServerNotifications.ToString().ToLower()
+ ((GlobalVars.ValidatedExtraFiles > 0) ? "," + GlobalVars.ValidatedExtraFiles.ToString() : "") + ");";
+ ((GlobalVars.ValidatedExtraFiles > 0) ? "," + GlobalVars.ValidatedExtraFiles.ToString() : ");") + ",0);";
case ScriptType.Solo:
case ScriptType.EasterEgg:
return "_G.CSSolo("
@ -359,7 +361,15 @@ public class ScriptFuncs
.Replace("%loadout%", code.Contains("<solo>") ? GlobalVars.soloLoadout : GlobalVars.Loadout)
.Replace("%doublequote%", "\"")
.Replace("%validatedextrafiles%", GlobalVars.ValidatedExtraFiles.ToString())
.Replace("%argstring%", GetRawArgsForType(type, ClientName, luafile));
.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);
if (compiled.Contains("%disabled%"))
{

View File

@ -817,6 +817,15 @@ namespace NovetusLauncher
if (LocalVars.launcherInitState)
return;
if (GlobalVars.AdminMode)
{
DialogResult closeNovetus = MessageBox.Show("You are in Admin Mode.\nAre you sure you want to switch styles?", "Novetus - Admin Mode Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
if (closeNovetus == DialogResult.No)
{
return;
}
}
if (GlobalVars.GameOpened != ScriptType.None)
{
MessageBox.Show("You must close the currently open client before changing styles.", "Novetus - Client is Open Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
@ -1103,6 +1112,15 @@ namespace NovetusLauncher
public void RestartLauncherAfterSetting(bool check, string title, string subText)
{
if (GlobalVars.AdminMode)
{
DialogResult closeNovetus = MessageBox.Show("You are in Admin Mode.\nAre you sure you want to apply this setting?", "Novetus - Admin Mode Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
if (closeNovetus == DialogResult.No)
{
return;
}
}
if (GlobalVars.GameOpened != ScriptType.None)
{
MessageBox.Show("You must close the currently open client before this setting can be applied.", "Novetus - Client is Open Error", MessageBoxButtons.OK, MessageBoxIcon.Error);

View File

@ -457,6 +457,15 @@ namespace NovetusLauncher
if (LocalVars.launcherInitState)
return;
if (GlobalVars.AdminMode)
{
DialogResult closeNovetus = System.Windows.Forms.MessageBox.Show("You are in Admin Mode.\nAre you sure you want to switch styles?", "Novetus - Admin Mode Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
if (closeNovetus == DialogResult.No)
{
return;
}
}
if (GlobalVars.GameOpened != ScriptType.None)
{
System.Windows.Forms.MessageBox.Show("You must close the currently open client before changing styles.", "Novetus - Client is Open Error", MessageBoxButtons.OK, MessageBoxIcon.Error);

View File

@ -347,283 +347,6 @@ public partial class AssetSDK : Form
#endregion
#region Asset Fixer
private static void DownloadFilesFromNode(string url, string path, string fileext, string id)
{
if (!string.IsNullOrWhiteSpace(id))
{
Downloader download = new Downloader(url, id);
try
{
download.InitDownload(path, fileext, "", true);
}
catch (Exception ex)
{
GlobalFuncs.LogExceptions(ex);
MessageBox.Show("The download has experienced an error: " + ex.Message, "Novetus Asset SDK - Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
public static void DownloadOrFixURLS(XDocument doc, bool remote, string url, AssetCacheDef assetdef, string name = "", string meshname = "")
{
DownloadOrFixURLS(doc, remote, url, assetdef, 0, 0, 0, 0, name, meshname);
}
public static void DownloadOrFixURLS(XDocument doc, bool remote, string url, AssetCacheDef assetdef, int idIndex, int extIndex, int outputPathIndex, int inGameDirIndex, string name = "", string meshname = "")
{
DownloadOrFixURLS(doc, remote, url, assetdef.Class, assetdef.Id[idIndex], assetdef.Ext[extIndex], assetdef.Dir[outputPathIndex], assetdef.GameDir[inGameDirIndex], name, meshname);
}
public static void DownloadOrFixURLS(XDocument doc, bool remote, string url, string itemClassValue, string itemIdValue, string fileext, string outputPath, string inGameDir, string name = "", string meshname = "")
{
if (remote)
{
FixURLInNodes(doc, itemClassValue, itemIdValue, url);
}
else
{
DownloadFromNodes(doc, itemClassValue, itemIdValue, fileext, outputPath, inGameDir, name, meshname);
}
}
public static void DownloadFromNodes(XDocument doc, string itemClassValue, string itemIdValue, string fileext, string outputPath, string inGameDir, string name = "", string meshname = "")
{
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"))
{
if (string.IsNullOrWhiteSpace(meshname))
{
string url = item3.Value;
string newurl = "assetdelivery.roblox.com/v1/asset/?id=";
string urlFixed = url.Replace("http://", "https://")
.Replace("?version=1&amp;id=", "?id=")
.Replace("www.roblox.com/asset/?id=", newurl)
.Replace("www.roblox.com/asset?id=", newurl)
.Replace("assetgame.roblox.com/asset/?id=", newurl)
.Replace("assetgame.roblox.com/asset?id=", newurl)
.Replace("roblox.com/asset/?id=", newurl)
.Replace("roblox.com/asset?id=", newurl)
.Replace("&amp;", "&")
.Replace("amp;", "&");
string peram = "id=";
if (string.IsNullOrWhiteSpace(name))
{
if (urlFixed.Contains(peram))
{
string IDVal = urlFixed.After(peram);
DownloadFilesFromNode(urlFixed, outputPath, fileext, IDVal);
item3.Value = (inGameDir + IDVal + fileext).Replace(" ", "");
}
}
else
{
DownloadFilesFromNode(urlFixed, outputPath, fileext, name);
item3.Value = inGameDir + name + fileext;
}
}
else
{
item3.Value = inGameDir + meshname;
}
}
}
else
{
if (string.IsNullOrWhiteSpace(meshname))
{
string url = item3.Value;
string rbxassetid = "rbxassetid://";
string urlFixed = "https://assetdelivery.roblox.com/v1/asset/?id=" + url.After(rbxassetid);
string peram = "id=";
if (string.IsNullOrWhiteSpace(name))
{
if (urlFixed.Contains(peram))
{
string IDVal = urlFixed.After(peram);
DownloadFilesFromNode(urlFixed, outputPath, fileext, IDVal);
item3.Value = inGameDir + IDVal + fileext;
}
}
else
{
DownloadFilesFromNode(urlFixed, outputPath, fileext, name);
item3.Value = inGameDir + name + fileext;
}
}
else
{
item3.Value = inGameDir + meshname;
}
}
}
}
}
}
public static void FixURLInNodes(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 = oldurl.Replace("http://", "")
.Replace("https://", "")
.Replace("?version=1&amp;id=", "?id=")
.Replace("www.roblox.com/asset/?id=", url)
.Replace("www.roblox.com/asset?id=", url)
.Replace("assetgame.roblox.com/asset/?id=", url)
.Replace("assetgame.roblox.com/asset?id=", url)
.Replace("roblox.com/asset/?id=", url)
.Replace("roblox.com/asset?id=", url)
.Replace("&amp;", "&")
.Replace("amp;", "&");
string peram = "id=";
if (urlFixed.Contains(peram))
{
item3.Value = urlFixed;
}
}
}
else
{
string oldurl = item3.Value;
string rbxassetid = "rbxassetid://";
string urlFixed = url + oldurl.After(rbxassetid);
string peram = "id=";
if (urlFixed.Contains(peram))
{
item3.Value = urlFixed;
}
}
}
}
}
}
//TODO: actually download the script assets instead of fixing the scripts lol. fixing the scripts won't work anyways because we don't support https natively.
/*
public static void DownloadScriptFromNodes(string filepath, string itemClassValue)
{
string oldfile = File.ReadAllText(filepath);
string fixedfile = RemoveInvalidXmlChars(ReplaceHexadecimalSymbols(oldfile));
XDocument doc = XDocument.Parse(fixedfile);
try
{
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("Properties")
select nodes;
foreach (var item2 in v2)
{
var v3 = from nodes in doc.Descendants("ProtectedString")
where nodes.Attribute("name").Value == "Source"
select nodes;
foreach (var item3 in v3)
{
string newurl = "assetdelivery.roblox.com/v1/asset/?id=";
item3.Value.Replace("http://", "https://")
.Replace("?version=1&id=", "?id=")
.Replace("www.roblox.com/asset/?id=", newurl)
.Replace("www.roblox.com/asset?id=", newurl)
.Replace("assetgame.roblox.com/asset/?id=", newurl)
.Replace("assetgame.roblox.com/asset?id=", newurl)
.Replace("roblox.com/asset/?id=", newurl)
.Replace("roblox.com/asset?id=", newurl);
}
}
}
}
catch (Exception ex)
{
GlobalFuncs.LogExceptions(ex);
MessageBox.Show("The download has experienced an error: " + ex.Message, "Novetus Asset SDK - Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
doc.Save(filepath);
}
}
public static void DownloadFromScript(string filepath)
{
string[] file = File.ReadAllLines(filepath);
try
{
foreach (var line in file)
{
if (line.Contains("www.roblox.com/asset/?id=") || line.Contains("assetgame.roblox.com/asset/?id="))
{
string newurl = "assetdelivery.roblox.com/v1/asset/?id=";
line.Replace("http://", "https://")
.Replace("?version=1&id=", "?id=")
.Replace("www.roblox.com/asset/?id=", newurl)
.Replace("www.roblox.com/asset?id=", newurl)
.Replace("assetgame.roblox.com/asset/?id=", newurl)
.Replace("assetgame.roblox.com/asset?id=", newurl)
.Replace("roblox.com/asset/?id=", newurl)
.Replace("roblox.com/asset?id=", newurl);
}
}
}
catch (Exception ex)
{
GlobalFuncs.LogExceptions(ex);
MessageBox.Show("The download has experienced an error: " + ex.Message, "Novetus Asset SDK - Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
File.WriteAllLines(filepath, file);
}
}*/
public static OpenFileDialog LoadROBLOXFileDialog(RobloxFileType type)
{
@ -876,44 +599,44 @@ public partial class AssetSDK : Form
}
//meshes
worker.ReportProgress(5);
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Fonts);
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Fonts, 1, 1, 1, 1);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Fonts);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Fonts, 1, 1, 1, 1);
//skybox
worker.ReportProgress(10);
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Sky);
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Sky, 1, 0, 0, 0);
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Sky, 2, 0, 0, 0);
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Sky, 3, 0, 0, 0);
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Sky, 4, 0, 0, 0);
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Sky, 5, 0, 0, 0);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Sky);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Sky, 1, 0, 0, 0);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Sky, 2, 0, 0, 0);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Sky, 3, 0, 0, 0);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Sky, 4, 0, 0, 0);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Sky, 5, 0, 0, 0);
//decal
worker.ReportProgress(15);
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Decal);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Decal);
//texture
worker.ReportProgress(20);
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Texture);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Texture);
//tools and hopperbin
worker.ReportProgress(25);
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Tool);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Tool);
worker.ReportProgress(30);
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.HopperBin);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.HopperBin);
//sound
worker.ReportProgress(40);
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Sound);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Sound);
worker.ReportProgress(50);
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.ImageLabel);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.ImageLabel);
//clothing
worker.ReportProgress(60);
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Shirt);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Shirt);
worker.ReportProgress(65);
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.ShirtGraphic);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.ShirtGraphic);
worker.ReportProgress(70);
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Pants);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Pants);
//scripts
worker.ReportProgress(80);
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Script);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Script);
worker.ReportProgress(90);
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.LocalScript);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.LocalScript);
//localize any scripts that are not handled
/*
worker.ReportProgress(95);
@ -941,44 +664,44 @@ public partial class AssetSDK : Form
worker.ReportProgress(0);
}
//meshes
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Fonts);
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Fonts, 1, 1, 1, 1);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Fonts);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Fonts, 1, 1, 1, 1);
//skybox
worker.ReportProgress(10);
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Sky);
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Sky, 1, 0, 0, 0);
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Sky, 2, 0, 0, 0);
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Sky, 3, 0, 0, 0);
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Sky, 4, 0, 0, 0);
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Sky, 5, 0, 0, 0);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Sky);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Sky, 1, 0, 0, 0);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Sky, 2, 0, 0, 0);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Sky, 3, 0, 0, 0);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Sky, 4, 0, 0, 0);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Sky, 5, 0, 0, 0);
//decal
worker.ReportProgress(15);
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Decal);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Decal);
//texture
worker.ReportProgress(20);
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Texture);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Texture);
//tools and hopperbin
worker.ReportProgress(25);
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Tool);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Tool);
worker.ReportProgress(30);
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.HopperBin);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.HopperBin);
//sound
worker.ReportProgress(40);
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Sound);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Sound);
worker.ReportProgress(50);
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.ImageLabel);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.ImageLabel);
//clothing
worker.ReportProgress(60);
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Shirt);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Shirt);
worker.ReportProgress(65);
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.ShirtGraphic);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.ShirtGraphic);
worker.ReportProgress(70);
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Pants);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Pants);
//scripts
worker.ReportProgress(80);
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Script);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.Script);
worker.ReportProgress(90);
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.LocalScript);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.LocalScript);
//localize any scripts that are not handled
/*
worker.ReportProgress(95);
@ -1006,15 +729,15 @@ public partial class AssetSDK : Form
worker.ReportProgress(0);
}
//meshes
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.ItemHatFonts, itemname, meshname);
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.ItemHatFonts, 1, 1, 1, 1, itemname);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.ItemHatFonts, itemname, meshname);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.ItemHatFonts, 1, 1, 1, 1, itemname);
worker.ReportProgress(25);
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.ItemHatSound);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.ItemHatSound);
//scripts
worker.ReportProgress(50);
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.ItemHatScript);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.ItemHatScript);
worker.ReportProgress(75);
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.ItemHatLocalScript);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.ItemHatLocalScript);
worker.ReportProgress(100);
break;
case RobloxFileType.Head:
@ -1036,8 +759,8 @@ public partial class AssetSDK : Form
worker.ReportProgress(0);
}
//meshes
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.ItemHeadFonts, itemname);
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.ItemHeadFonts, 1, 1, 1, 1, itemname);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.ItemHeadFonts, itemname);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.ItemHeadFonts, 1, 1, 1, 1, itemname);
worker.ReportProgress(100);
break;
case RobloxFileType.Face:
@ -1059,7 +782,7 @@ public partial class AssetSDK : Form
worker.ReportProgress(0);
}
//decal
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.ItemFaceTexture, itemname);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.ItemFaceTexture, itemname);
worker.ReportProgress(100);
break;
case RobloxFileType.TShirt:
@ -1081,7 +804,7 @@ public partial class AssetSDK : Form
worker.ReportProgress(0);
}
//texture
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.ItemTShirtTexture, itemname);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.ItemTShirtTexture, itemname);
worker.ReportProgress(100);
break;
case RobloxFileType.Shirt:
@ -1103,7 +826,7 @@ public partial class AssetSDK : Form
worker.ReportProgress(0);
}
//texture
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.ItemShirtTexture, itemname);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.ItemShirtTexture, itemname);
worker.ReportProgress(100);
break;
case RobloxFileType.Pants:
@ -1125,7 +848,7 @@ public partial class AssetSDK : Form
worker.ReportProgress(0);
}
//texture
DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.ItemPantsTexture, itemname);
RobloxXML.DownloadOrFixURLS(doc, useURLs, remoteurl, RobloxDefs.ItemPantsTexture, itemname);
worker.ReportProgress(100);
break;
/*case RobloxFileType.Script:

View File

@ -81,6 +81,7 @@ partial class ClientinfoEditor
this.serverToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
this.limitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.notificationsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.portToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.securityToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.md5launcherToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.md5scriptToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
@ -108,18 +109,22 @@ partial class ClientinfoEditor
this.facesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.faceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.facedToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.facetexidToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.headsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.headToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.headdToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.tShirtsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.tshirtToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.tshirtdToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.tshirttexidToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.shirtsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.shirtToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.shirtdToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.shirttexidToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.pantsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.pantsToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
this.pantsdToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.pantstexidToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.extraToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.extraToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
this.extradToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
@ -147,7 +152,11 @@ partial class ClientinfoEditor
this.comboBox1 = new System.Windows.Forms.ComboBox();
this.label10 = new System.Windows.Forms.Label();
this.checkBox5 = new System.Windows.Forms.CheckBox();
this.portToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.facetexlocalToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.tshirttexidlocalToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.shirttexidlocalToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.pantstexidlocalToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.localizeonlineclothingToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.menuStrip1.SuspendLayout();
this.SuspendLayout();
//
@ -523,17 +532,24 @@ partial class ClientinfoEditor
// limitToolStripMenuItem
//
this.limitToolStripMenuItem.Name = "limitToolStripMenuItem";
this.limitToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.limitToolStripMenuItem.Size = new System.Drawing.Size(160, 22);
this.limitToolStripMenuItem.Text = "%limit%";
this.limitToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// notificationsToolStripMenuItem
//
this.notificationsToolStripMenuItem.Name = "notificationsToolStripMenuItem";
this.notificationsToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.notificationsToolStripMenuItem.Size = new System.Drawing.Size(160, 22);
this.notificationsToolStripMenuItem.Text = "%notifications%";
this.notificationsToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// portToolStripMenuItem
//
this.portToolStripMenuItem.Name = "portToolStripMenuItem";
this.portToolStripMenuItem.Size = new System.Drawing.Size(160, 22);
this.portToolStripMenuItem.Text = "%port%";
this.portToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// securityToolStripMenuItem
//
this.securityToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
@ -551,49 +567,49 @@ partial class ClientinfoEditor
// md5launcherToolStripMenuItem
//
this.md5launcherToolStripMenuItem.Name = "md5launcherToolStripMenuItem";
this.md5launcherToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.md5launcherToolStripMenuItem.Size = new System.Drawing.Size(164, 22);
this.md5launcherToolStripMenuItem.Text = "%md5launcher%";
this.md5launcherToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// md5scriptToolStripMenuItem
//
this.md5scriptToolStripMenuItem.Name = "md5scriptToolStripMenuItem";
this.md5scriptToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.md5scriptToolStripMenuItem.Size = new System.Drawing.Size(164, 22);
this.md5scriptToolStripMenuItem.Text = "%md5script%";
this.md5scriptToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// md5exeToolStripMenuItem
//
this.md5exeToolStripMenuItem.Name = "md5exeToolStripMenuItem";
this.md5exeToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.md5exeToolStripMenuItem.Size = new System.Drawing.Size(164, 22);
this.md5exeToolStripMenuItem.Text = "%md5exe%";
this.md5exeToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// md5scriptdToolStripMenuItem
//
this.md5scriptdToolStripMenuItem.Name = "md5scriptdToolStripMenuItem";
this.md5scriptdToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.md5scriptdToolStripMenuItem.Size = new System.Drawing.Size(164, 22);
this.md5scriptdToolStripMenuItem.Text = "%md5scriptd%";
this.md5scriptdToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// md5exedToolStripMenuItem
//
this.md5exedToolStripMenuItem.Name = "md5exedToolStripMenuItem";
this.md5exedToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.md5exedToolStripMenuItem.Size = new System.Drawing.Size(164, 22);
this.md5exedToolStripMenuItem.Text = "%md5exed%";
this.md5exedToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// md5sToolStripMenuItem
//
this.md5sToolStripMenuItem.Name = "md5sToolStripMenuItem";
this.md5sToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.md5sToolStripMenuItem.Size = new System.Drawing.Size(164, 22);
this.md5sToolStripMenuItem.Text = "%md5s%";
this.md5sToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// md5sdToolStripMenuItem
//
this.md5sdToolStripMenuItem.Name = "md5sdToolStripMenuItem";
this.md5sdToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.md5sdToolStripMenuItem.Size = new System.Drawing.Size(164, 22);
this.md5sdToolStripMenuItem.Text = "%md5sd%";
this.md5sdToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
@ -620,9 +636,10 @@ partial class ClientinfoEditor
this.pantsToolStripMenuItem,
this.extraToolStripMenuItem,
this.charappToolStripMenuItem,
this.loadoutToolStripMenuItem});
this.loadoutToolStripMenuItem,
this.localizeonlineclothingToolStripMenuItem});
this.customizationToolStripMenuItem.Name = "customizationToolStripMenuItem";
this.customizationToolStripMenuItem.Size = new System.Drawing.Size(151, 22);
this.customizationToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.customizationToolStripMenuItem.Text = "Customization";
//
// bodyColorsToolStripMenuItem
@ -635,7 +652,7 @@ partial class ClientinfoEditor
this.rarmcolorToolStripMenuItem,
this.rlegcolorToolStripMenuItem});
this.bodyColorsToolStripMenuItem.Name = "bodyColorsToolStripMenuItem";
this.bodyColorsToolStripMenuItem.Size = new System.Drawing.Size(138, 22);
this.bodyColorsToolStripMenuItem.Size = new System.Drawing.Size(210, 22);
this.bodyColorsToolStripMenuItem.Text = "Body Colors";
//
// headcolorToolStripMenuItem
@ -690,7 +707,7 @@ partial class ClientinfoEditor
this.hat2dToolStripMenuItem,
this.hat3dToolStripMenuItem});
this.hatsToolStripMenuItem.Name = "hatsToolStripMenuItem";
this.hatsToolStripMenuItem.Size = new System.Drawing.Size(138, 22);
this.hatsToolStripMenuItem.Size = new System.Drawing.Size(210, 22);
this.hatsToolStripMenuItem.Text = "Hats";
//
// hat1ToolStripMenuItem
@ -739,45 +756,54 @@ partial class ClientinfoEditor
//
this.facesToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.faceToolStripMenuItem,
this.facedToolStripMenuItem});
this.facedToolStripMenuItem,
this.facetexidToolStripMenuItem,
this.facetexlocalToolStripMenuItem});
this.facesToolStripMenuItem.Name = "facesToolStripMenuItem";
this.facesToolStripMenuItem.Size = new System.Drawing.Size(138, 22);
this.facesToolStripMenuItem.Size = new System.Drawing.Size(210, 22);
this.facesToolStripMenuItem.Text = "Faces";
//
// faceToolStripMenuItem
//
this.faceToolStripMenuItem.Name = "faceToolStripMenuItem";
this.faceToolStripMenuItem.Size = new System.Drawing.Size(123, 22);
this.faceToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.faceToolStripMenuItem.Text = "%face%";
this.faceToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// facedToolStripMenuItem
//
this.facedToolStripMenuItem.Name = "facedToolStripMenuItem";
this.facedToolStripMenuItem.Size = new System.Drawing.Size(123, 22);
this.facedToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.facedToolStripMenuItem.Text = "%faced%";
this.facedToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// facetexidToolStripMenuItem
//
this.facetexidToolStripMenuItem.Name = "facetexidToolStripMenuItem";
this.facetexidToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.facetexidToolStripMenuItem.Text = "%facetexid%";
this.facetexidToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// headsToolStripMenuItem
//
this.headsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.headToolStripMenuItem,
this.headdToolStripMenuItem});
this.headsToolStripMenuItem.Name = "headsToolStripMenuItem";
this.headsToolStripMenuItem.Size = new System.Drawing.Size(138, 22);
this.headsToolStripMenuItem.Size = new System.Drawing.Size(210, 22);
this.headsToolStripMenuItem.Text = "Heads";
//
// headToolStripMenuItem
//
this.headToolStripMenuItem.Name = "headToolStripMenuItem";
this.headToolStripMenuItem.Size = new System.Drawing.Size(127, 22);
this.headToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.headToolStripMenuItem.Text = "%head%";
this.headToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// headdToolStripMenuItem
//
this.headdToolStripMenuItem.Name = "headdToolStripMenuItem";
this.headdToolStripMenuItem.Size = new System.Drawing.Size(127, 22);
this.headdToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.headdToolStripMenuItem.Text = "%headd%";
this.headdToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
@ -785,71 +811,98 @@ partial class ClientinfoEditor
//
this.tShirtsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.tshirtToolStripMenuItem,
this.tshirtdToolStripMenuItem});
this.tshirtdToolStripMenuItem,
this.tshirttexidToolStripMenuItem,
this.tshirttexidlocalToolStripMenuItem});
this.tShirtsToolStripMenuItem.Name = "tShirtsToolStripMenuItem";
this.tShirtsToolStripMenuItem.Size = new System.Drawing.Size(138, 22);
this.tShirtsToolStripMenuItem.Size = new System.Drawing.Size(210, 22);
this.tShirtsToolStripMenuItem.Text = "T-Shirts";
//
// tshirtToolStripMenuItem
//
this.tshirtToolStripMenuItem.Name = "tshirtToolStripMenuItem";
this.tshirtToolStripMenuItem.Size = new System.Drawing.Size(128, 22);
this.tshirtToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.tshirtToolStripMenuItem.Text = "%tshirt%";
this.tshirtToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// tshirtdToolStripMenuItem
//
this.tshirtdToolStripMenuItem.Name = "tshirtdToolStripMenuItem";
this.tshirtdToolStripMenuItem.Size = new System.Drawing.Size(128, 22);
this.tshirtdToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.tshirtdToolStripMenuItem.Text = "%tshirtd%";
this.tshirtdToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// tshirttexidToolStripMenuItem
//
this.tshirttexidToolStripMenuItem.Name = "tshirttexidToolStripMenuItem";
this.tshirttexidToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.tshirttexidToolStripMenuItem.Text = "%tshirttexid%";
this.tshirttexidToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// shirtsToolStripMenuItem
//
this.shirtsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.shirtToolStripMenuItem,
this.shirtdToolStripMenuItem});
this.shirtdToolStripMenuItem,
this.shirttexidToolStripMenuItem,
this.shirttexidlocalToolStripMenuItem});
this.shirtsToolStripMenuItem.Name = "shirtsToolStripMenuItem";
this.shirtsToolStripMenuItem.Size = new System.Drawing.Size(138, 22);
this.shirtsToolStripMenuItem.Size = new System.Drawing.Size(210, 22);
this.shirtsToolStripMenuItem.Text = "Shirts";
//
// shirtToolStripMenuItem
//
this.shirtToolStripMenuItem.Name = "shirtToolStripMenuItem";
this.shirtToolStripMenuItem.Size = new System.Drawing.Size(124, 22);
this.shirtToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.shirtToolStripMenuItem.Text = "%shirt%";
this.shirtToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// shirtdToolStripMenuItem
//
this.shirtdToolStripMenuItem.Name = "shirtdToolStripMenuItem";
this.shirtdToolStripMenuItem.Size = new System.Drawing.Size(124, 22);
this.shirtdToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.shirtdToolStripMenuItem.Text = "%shirtd%";
this.shirtdToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// shirttexidToolStripMenuItem
//
this.shirttexidToolStripMenuItem.Name = "shirttexidToolStripMenuItem";
this.shirttexidToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.shirttexidToolStripMenuItem.Text = "%shirttexid%";
this.shirttexidToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// pantsToolStripMenuItem
//
this.pantsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.pantsToolStripMenuItem1,
this.pantsdToolStripMenuItem});
this.pantsdToolStripMenuItem,
this.pantstexidToolStripMenuItem,
this.pantstexidlocalToolStripMenuItem});
this.pantsToolStripMenuItem.Name = "pantsToolStripMenuItem";
this.pantsToolStripMenuItem.Size = new System.Drawing.Size(138, 22);
this.pantsToolStripMenuItem.Size = new System.Drawing.Size(210, 22);
this.pantsToolStripMenuItem.Text = "Pants";
//
// pantsToolStripMenuItem1
//
this.pantsToolStripMenuItem1.Name = "pantsToolStripMenuItem1";
this.pantsToolStripMenuItem1.Size = new System.Drawing.Size(130, 22);
this.pantsToolStripMenuItem1.Size = new System.Drawing.Size(180, 22);
this.pantsToolStripMenuItem1.Text = "%pants%";
this.pantsToolStripMenuItem1.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// pantsdToolStripMenuItem
//
this.pantsdToolStripMenuItem.Name = "pantsdToolStripMenuItem";
this.pantsdToolStripMenuItem.Size = new System.Drawing.Size(130, 22);
this.pantsdToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.pantsdToolStripMenuItem.Text = "%pantsd%";
this.pantsdToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// pantstexidToolStripMenuItem
//
this.pantstexidToolStripMenuItem.Name = "pantstexidToolStripMenuItem";
this.pantstexidToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.pantstexidToolStripMenuItem.Text = "%pantstexid%";
this.pantstexidToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// extraToolStripMenuItem
//
this.extraToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
@ -860,83 +913,83 @@ partial class ClientinfoEditor
this.iconeToolStripMenuItem,
this.iconToolStripMenuItem});
this.extraToolStripMenuItem.Name = "extraToolStripMenuItem";
this.extraToolStripMenuItem.Size = new System.Drawing.Size(138, 22);
this.extraToolStripMenuItem.Size = new System.Drawing.Size(210, 22);
this.extraToolStripMenuItem.Text = "Extra";
//
// extraToolStripMenuItem1
//
this.extraToolStripMenuItem1.Name = "extraToolStripMenuItem1";
this.extraToolStripMenuItem1.Size = new System.Drawing.Size(127, 22);
this.extraToolStripMenuItem1.Size = new System.Drawing.Size(180, 22);
this.extraToolStripMenuItem1.Text = "%extra%";
this.extraToolStripMenuItem1.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// extradToolStripMenuItem
//
this.extradToolStripMenuItem.Name = "extradToolStripMenuItem";
this.extradToolStripMenuItem.Size = new System.Drawing.Size(127, 22);
this.extradToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.extradToolStripMenuItem.Text = "%extrad%";
this.extradToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// hat4ToolStripMenuItem
//
this.hat4ToolStripMenuItem.Name = "hat4ToolStripMenuItem";
this.hat4ToolStripMenuItem.Size = new System.Drawing.Size(127, 22);
this.hat4ToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.hat4ToolStripMenuItem.Text = "%hat4%";
this.hat4ToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// hat4dToolStripMenuItem
//
this.hat4dToolStripMenuItem.Name = "hat4dToolStripMenuItem";
this.hat4dToolStripMenuItem.Size = new System.Drawing.Size(127, 22);
this.hat4dToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.hat4dToolStripMenuItem.Text = "%hat4d%";
this.hat4dToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// iconeToolStripMenuItem
//
this.iconeToolStripMenuItem.Name = "iconeToolStripMenuItem";
this.iconeToolStripMenuItem.Size = new System.Drawing.Size(127, 22);
this.iconeToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.iconeToolStripMenuItem.Text = "%icone%";
this.iconeToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// iconToolStripMenuItem
//
this.iconToolStripMenuItem.Name = "iconToolStripMenuItem";
this.iconToolStripMenuItem.Size = new System.Drawing.Size(127, 22);
this.iconToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.iconToolStripMenuItem.Text = "%icon%";
this.iconToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// charappToolStripMenuItem
//
this.charappToolStripMenuItem.Name = "charappToolStripMenuItem";
this.charappToolStripMenuItem.Size = new System.Drawing.Size(138, 22);
this.charappToolStripMenuItem.Size = new System.Drawing.Size(210, 22);
this.charappToolStripMenuItem.Text = "%charapp%";
this.charappToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// loadoutToolStripMenuItem
//
this.loadoutToolStripMenuItem.Name = "loadoutToolStripMenuItem";
this.loadoutToolStripMenuItem.Size = new System.Drawing.Size(138, 22);
this.loadoutToolStripMenuItem.Size = new System.Drawing.Size(210, 22);
this.loadoutToolStripMenuItem.Text = "%loadout%";
this.loadoutToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// nameToolStripMenuItem
//
this.nameToolStripMenuItem.Name = "nameToolStripMenuItem";
this.nameToolStripMenuItem.Size = new System.Drawing.Size(151, 22);
this.nameToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.nameToolStripMenuItem.Text = "%name%";
this.nameToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// idToolStripMenuItem
//
this.idToolStripMenuItem.Name = "idToolStripMenuItem";
this.idToolStripMenuItem.Size = new System.Drawing.Size(151, 22);
this.idToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.idToolStripMenuItem.Text = "%id%";
this.idToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// tripcodeToolStripMenuItem
//
this.tripcodeToolStripMenuItem.Name = "tripcodeToolStripMenuItem";
this.tripcodeToolStripMenuItem.Size = new System.Drawing.Size(151, 22);
this.tripcodeToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.tripcodeToolStripMenuItem.Text = "%tripcode%";
this.tripcodeToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
@ -952,14 +1005,14 @@ partial class ClientinfoEditor
// donothingToolStripMenuItem
//
this.donothingToolStripMenuItem.Name = "donothingToolStripMenuItem";
this.donothingToolStripMenuItem.Size = new System.Drawing.Size(150, 22);
this.donothingToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.donothingToolStripMenuItem.Text = "%donothing%";
this.donothingToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// disabledToolStripMenuItem
//
this.disabledToolStripMenuItem.Name = "disabledToolStripMenuItem";
this.disabledToolStripMenuItem.Size = new System.Drawing.Size(150, 22);
this.disabledToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.disabledToolStripMenuItem.Text = "%disabled%";
this.disabledToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
@ -1100,12 +1153,40 @@ partial class ClientinfoEditor
this.checkBox5.UseVisualStyleBackColor = true;
this.checkBox5.CheckedChanged += new System.EventHandler(this.checkBox5_CheckedChanged);
//
// portToolStripMenuItem
// facetexlocalToolStripMenuItem
//
this.portToolStripMenuItem.Name = "portToolStripMenuItem";
this.portToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.portToolStripMenuItem.Text = "%port%";
this.portToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
this.facetexlocalToolStripMenuItem.Name = "facetexlocalToolStripMenuItem";
this.facetexlocalToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.facetexlocalToolStripMenuItem.Text = "%facetexlocal%";
this.facetexlocalToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// tshirttexidlocalToolStripMenuItem
//
this.tshirttexidlocalToolStripMenuItem.Name = "tshirttexidlocalToolStripMenuItem";
this.tshirttexidlocalToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.tshirttexidlocalToolStripMenuItem.Text = "%tshirttexidlocal%";
this.tshirttexidlocalToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// shirttexidlocalToolStripMenuItem
//
this.shirttexidlocalToolStripMenuItem.Name = "shirttexidlocalToolStripMenuItem";
this.shirttexidlocalToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.shirttexidlocalToolStripMenuItem.Text = "%shirttexidlocal%";
this.shirttexidlocalToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// pantstexidlocalToolStripMenuItem
//
this.pantstexidlocalToolStripMenuItem.Name = "pantstexidlocalToolStripMenuItem";
this.pantstexidlocalToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.pantstexidlocalToolStripMenuItem.Text = "%pantstexidlocal%";
this.pantstexidlocalToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// localizeonlineclothingToolStripMenuItem
//
this.localizeonlineclothingToolStripMenuItem.Name = "localizeonlineclothingToolStripMenuItem";
this.localizeonlineclothingToolStripMenuItem.Size = new System.Drawing.Size(210, 22);
this.localizeonlineclothingToolStripMenuItem.Text = "%localizeonlineclothing%";
this.localizeonlineclothingToolStripMenuItem.Click += new System.EventHandler(this.variableToolStripMenuItem_Click);
//
// ClientinfoEditor
//
@ -1257,4 +1338,13 @@ partial class ClientinfoEditor
private System.Windows.Forms.ToolStripMenuItem argstringToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem addValidateTagsForRelativePathToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem portToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem facetexidToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem tshirttexidToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem shirttexidToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem pantstexidToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem facetexlocalToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem tshirttexidlocalToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem shirttexidlocalToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem pantstexidlocalToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem localizeonlineclothingToolStripMenuItem;
}

View File

@ -163,8 +163,6 @@
<Compile Include="Classes\Launcher\SplashLoader.cs" />
<Compile Include="Classes\Launcher\TreeNodeHelper.cs" />
<Compile Include="Classes\LocalVars.cs" />
<Compile Include="Classes\SDK\Downloader.cs" />
<Compile Include="Classes\SDK\ROBLOXHelpers.cs" />
<Compile Include="Forms\Decoder.cs">
<SubType>Form</SubType>
</Compile>

View File

@ -3,6 +3,9 @@ Changes from v11.2021.1:
New Features:
- The Asset SDK Asset Localizer is now known as the Asset Fixer!
- Added the ability to "fix" all asset URLs by changing them to a URL of your choice!
- Added T-Shirt support to 2007E/2007E-Shaders.
- T-Shirts loaded with Roblox Asset URLs/Redirects are not supported due to 2 issues with 2007e: Roblox Asset URLs/Redirects do not work properly in 2007E if it's a texture and using anything to get the current texture value for a ShirtGraphic or Decal returns a "bad cast" error.
- As a result, T-Shirts loaded with Roblox Asset URLs/Redirects will not load in 2007e.
Enhancements:
- Added an additional warning about certain GUI elements being disabled in later clients when No3D is selected.
@ -11,6 +14,10 @@ Enhancements:
- The server browser no longer requires a server to be the same exact version as the current running version of Novetus.
- The server browser now displays versions in red if they're not the same exact version.
- The master server security warning will now show up once for every Novetus session.
- Added ClientScript Variables:
- %tshirttexid%, %shirttexid%, %pantstexid%, %facetexid% - Returns the texture URL for the respective online clothing type. Returns nothing if the URL is invalid, the item isn't using Online Clothing, or %localizeonlineclothing% is not defined in the script.
- %tshirttexidlocal%, %shirttexidlocal%, %pantstexidlocal%, %facetexlocal%" - Returns the texture rbxasset URL for the respective online clothing type. Returns nothing if the URL is invalid, the item isn't using Online Clothing, or %localizeonlineclothing% is not defined in the script. Only the client who downloads the clothing would be able to see it.
- %localizeonlineclothing% - Grabs texture IDS for the %texid% variables and localizes the texture for the %texidlocal% variables. This WILL increase load times of your client depending on how many items are being downloaded.
Fixes:
- Fixed the URL Override box in the Asset SDK not being functional.
@ -21,6 +28,7 @@ Fixes:
- Fixed small decoding issues with the splash system.
- Fixed the Stylish interface not showing a warning when hosting a seperate master server.
- Fixed the Stylish interface not pinging the master server.
- Fixed some clients not functioning properly with Wine (Credits to man-of-eel in pull request #27).
----------------------------------------------------------------------------
1.3 v11.2021.1
Changes from Pre-Release 5:

View File

@ -51,6 +51,9 @@ Player:
%faced%, %headd%, %tshirtd%, %shirtd%, %pantsd%, %hat1d%, %hat2d%, %hat3d%, %extrad%, %hat4d% - Returns the rbxasset:// file paths of each individual item. May return as a URL for the item if it is a URL. Use single quotation marks (').
%headcolor%, %torsocolor%, %larmcolor%, %llegcolor%, %rarmcolor%, %rlegcolor% - Returns the BrickColor IDs for individual body part colors.
%loadout% - Returns the player's complete current appearance, seperated by commas. Used for loading the loadout with scripts like CSConnect.
%tshirttexid%, %shirttexid%, %pantstexid%, %facetexid% - Returns the texture URL for the respective online clothing type. Returns nothing if the URL is invalid, the item isn't using Online Clothing, or %localizeonlineclothing% is not defined in the script.
%tshirttexidlocal%, %shirttexidlocal%, %pantstexidlocal%, %facetexlocal%" - Returns the texture rbxasset URL for the respective online clothing type. Returns nothing if the URL is invalid, the item isn't using Online Clothing, or %localizeonlineclothing% is not defined in the script.
%localizeonlineclothing% - Grabs texture IDS for the %texid% variables and localizes the texture for the %texidlocal% variables. This WILL increase load times of your client depending on how many items are being downloaded.
Debugging/Misc:
%donothing% - Does exactly as it implies. Useful for debugging tags, but doesn't need to be used as it is called automatically if there is an exception when reading tags. Used internally to suppress errors.

View File

@ -78,6 +78,34 @@ function LoadCharacterNew(playerApp,newChar)
pcall(function()
charparts[newVal.ColorIndex.Value].BrickColor = newVal.Value
end)
elseif (newVal.Name == "T-Shirt") then
pcall(function()
local newTShirt = "";
if (string.match(newVal.Value, "http") == "http") then
if (string.match(newVal.Value, "?id=") ~= "?id=") then
newWaitForChild(charparts[2],"roblox"):remove()
newDecal = Instance.new("Decal")
newDecal.Name = "novetus"
newDecal.Texture = newVal.Value
newDecal.Face = 5
newDecal.Parent = charparts[2]
end
else
newTShirt = game.Workspace:insertContent(path.."tshirts/"..newVal.Value)
if newTShirt[1] then
if newTShirt[1].className == "ShirtGraphic" then
newWaitForChild(charparts[2],"roblox"):remove()
newDecal = Instance.new("Decal")
newDecal.Name = "novetus"
newDecal.Face = 5
newDecal.Parent = charparts[2]
newTShirt[1].Parent = newChar
else
newTShirt[1]:remove()
end
end
end
end)
elseif (newVal.Name == "Extra") then
pcall(function()
local newItem = game.Workspace:insertContent(path.."custom/"..newVal.Value)
@ -85,7 +113,7 @@ function LoadCharacterNew(playerApp,newChar)
if newItem[1].className == "Decal" then
newWaitForChild(charparts[1],"face"):remove()
newItem[1].Parent = charparts[1]
newItem[1].Face = "Front"
newItem[1].Face = 5
elseif newPart[1].className == "SpecialMesh" or newPart[1].className == "CylinderMesh" or newPart[1].className == "BlockMesh" then
newWaitForChild(charparts[1],"Mesh"):remove()
newItem[1].Parent = charparts[1]
@ -98,7 +126,7 @@ function LoadCharacterNew(playerApp,newChar)
end
end
function InitalizeClientAppearance(Player,Hat1ID,Hat2ID,Hat3ID,HeadColorID,TorsoColorID,LeftArmColorID,RightArmColorID,LeftLegColorID,RightLegColorID,TShirtID,ShirtID,PantsID,FaceID,HeadID,ItemID)
function InitalizeClientAppearance(Player,Hat1ID,Hat2ID,Hat3ID,HeadColorID,TorsoColorID,LeftArmColorID,RightArmColorID,LeftLegColorID,RightLegColorID,TShirtID,ShirtID,PantsID,FaceID,HeadID,ItemID,TShirtTexID)
local newCharApp = Instance.new("IntValue",Player)
newCharApp.Name = "Appearance"
--BODY COLORS
@ -147,6 +175,21 @@ function InitalizeClientAppearance(Player,Hat1ID,Hat2ID,Hat3ID,HeadColorID,Torso
indexValue.Parent = BodyColor
indexValue.Value = i
end
--T-SHIRT
local newTShirt = Instance.new("StringValue",newCharApp)
if (TShirtID ~= nil) then
newTShirt.Value = TShirtID
else
newTShirt.Value = "NoTShirt.rbxm"
end
newTShirt.Name = "T-Shirt"
local newTShirtTexID = Instance.new("StringValue",newTShirt)
if (TShirtTexID ~= nil) then
newTShirtTexID.Value = TShirtTexID
else
newTShirtTexID.Value = ""
end
newTShirtTexID.Name = "Texture"
--EXTRA
local newItem = Instance.new("StringValue",newCharApp)
if (ItemID ~= nil) then
@ -328,7 +371,7 @@ function CSServer(Port,PlayerLimit,ClientEXEMD5,LauncherMD5,ClientScriptMD5,Noti
pcall(function() game.Close:connect(function() Server:stop() end) end)
end
function CSConnect(UserID,ServerIP,ServerPort,PlayerName,Hat1ID,Hat2ID,Hat3ID,HeadColorID,TorsoColorID,LeftArmColorID,RightArmColorID,LeftLegColorID,RightLegColorID,TShirtID,ShirtID,PantsID,FaceID,HeadID,IconType,ItemID,ClientEXEMD5,LauncherMD5,ClientScriptMD5,Tripcode,Ticket)
function CSConnect(UserID,ServerIP,ServerPort,PlayerName,Hat1ID,Hat2ID,Hat3ID,HeadColorID,TorsoColorID,LeftArmColorID,RightArmColorID,LeftLegColorID,RightLegColorID,TShirtID,ShirtID,PantsID,FaceID,HeadID,IconType,ItemID,ClientEXEMD5,LauncherMD5,ClientScriptMD5,Tripcode,VerifiedScripts,TShirtTexID,Ticket)
local suc, err = pcall(function()
client = game:service("NetworkClient")
player = game:service("Players"):createLocalPlayer(UserID)
@ -340,7 +383,7 @@ function CSConnect(UserID,ServerIP,ServerPort,PlayerName,Hat1ID,Hat2ID,Hat3ID,He
player:SetAdminMode(true)
pcall(function() player.Name=PlayerName or "" end)
game:service("Visit"):setUploadUrl("")
InitalizeClientAppearance(player,Hat1ID,Hat2ID,Hat3ID,HeadColorID,TorsoColorID,LeftArmColorID,RightArmColorID,LeftLegColorID,RightLegColorID,TShirtID,ShirtID,PantsID,FaceID,HeadID,ItemID)
InitalizeClientAppearance(player,Hat1ID,Hat2ID,Hat3ID,HeadColorID,TorsoColorID,LeftArmColorID,RightArmColorID,LeftLegColorID,RightLegColorID,TShirtID,ShirtID,PantsID,FaceID,HeadID,ItemID,TShirtTexID)
end)
local function dieerror(errmsg)
@ -400,14 +443,14 @@ function CSConnect(UserID,ServerIP,ServerPort,PlayerName,Hat1ID,Hat2ID,Hat3ID,He
end
end
function CSSolo(UserID,PlayerName,Hat1ID,Hat2ID,Hat3ID,HeadColorID,TorsoColorID,LeftArmColorID,RightArmColorID,LeftLegColorID,RightLegColorID,TShirtID,ShirtID,PantsID,FaceID,HeadID,IconType,ItemID)
function CSSolo(UserID,PlayerName,Hat1ID,Hat2ID,Hat3ID,HeadColorID,TorsoColorID,LeftArmColorID,RightArmColorID,LeftLegColorID,RightLegColorID,TShirtID,ShirtID,PantsID,FaceID,HeadID,IconType,ItemID,TShirtTexID)
game:service("RunService"):run()
local plr = game.Players:createLocalPlayer(UserID)
game.Workspace:insertContent("rbxasset://Fonts//libraries.rbxm")
plr.Name = PlayerName
plr:SetAdminMode(true)
plr:LoadCharacter()
InitalizeClientAppearance(plr,Hat1ID,Hat2ID,Hat3ID,HeadColorID,TorsoColorID,LeftArmColorID,RightArmColorID,LeftLegColorID,RightLegColorID,TShirtID,ShirtID,PantsID,FaceID,HeadID,ItemID)
InitalizeClientAppearance(plr,Hat1ID,Hat2ID,Hat3ID,HeadColorID,TorsoColorID,LeftArmColorID,RightArmColorID,LeftLegColorID,RightLegColorID,TShirtID,ShirtID,PantsID,FaceID,HeadID,ItemID,TShirtTexID)
LoadCharacterNew(newWaitForChild(plr,"Appearance"),plr.Character,false)
game:service("Visit"):setUploadUrl("")
while true do

View File

@ -78,6 +78,34 @@ function LoadCharacterNew(playerApp,newChar)
pcall(function()
charparts[newVal.ColorIndex.Value].BrickColor = newVal.Value
end)
elseif (newVal.Name == "T-Shirt") then
pcall(function()
local newTShirt = "";
if (string.match(newVal.Value, "http") == "http") then
if (string.match(newVal.Value, "?id=") ~= "?id=") then
newWaitForChild(charparts[2],"roblox"):remove()
newDecal = Instance.new("Decal")
newDecal.Name = "novetus"
newDecal.Texture = newVal.Value
newDecal.Face = 5
newDecal.Parent = charparts[2]
end
else
newTShirt = game.Workspace:insertContent(path.."tshirts/"..newVal.Value)
if newTShirt[1] then
if newTShirt[1].className == "ShirtGraphic" then
newWaitForChild(charparts[2],"roblox"):remove()
newDecal = Instance.new("Decal")
newDecal.Name = "novetus"
newDecal.Face = 5
newDecal.Parent = charparts[2]
newTShirt[1].Parent = newChar
else
newTShirt[1]:remove()
end
end
end
end)
elseif (newVal.Name == "Extra") then
pcall(function()
local newItem = game.Workspace:insertContent(path.."custom/"..newVal.Value)
@ -85,7 +113,7 @@ function LoadCharacterNew(playerApp,newChar)
if newItem[1].className == "Decal" then
newWaitForChild(charparts[1],"face"):remove()
newItem[1].Parent = charparts[1]
newItem[1].Face = "Front"
newItem[1].Face = 5
elseif newPart[1].className == "SpecialMesh" or newPart[1].className == "CylinderMesh" or newPart[1].className == "BlockMesh" then
newWaitForChild(charparts[1],"Mesh"):remove()
newItem[1].Parent = charparts[1]
@ -98,7 +126,7 @@ function LoadCharacterNew(playerApp,newChar)
end
end
function InitalizeClientAppearance(Player,Hat1ID,Hat2ID,Hat3ID,HeadColorID,TorsoColorID,LeftArmColorID,RightArmColorID,LeftLegColorID,RightLegColorID,TShirtID,ShirtID,PantsID,FaceID,HeadID,ItemID)
function InitalizeClientAppearance(Player,Hat1ID,Hat2ID,Hat3ID,HeadColorID,TorsoColorID,LeftArmColorID,RightArmColorID,LeftLegColorID,RightLegColorID,TShirtID,ShirtID,PantsID,FaceID,HeadID,ItemID,TShirtTexID)
local newCharApp = Instance.new("IntValue",Player)
newCharApp.Name = "Appearance"
--BODY COLORS
@ -147,6 +175,21 @@ function InitalizeClientAppearance(Player,Hat1ID,Hat2ID,Hat3ID,HeadColorID,Torso
indexValue.Parent = BodyColor
indexValue.Value = i
end
--T-SHIRT
local newTShirt = Instance.new("StringValue",newCharApp)
if (TShirtID ~= nil) then
newTShirt.Value = TShirtID
else
newTShirt.Value = "NoTShirt.rbxm"
end
newTShirt.Name = "T-Shirt"
local newTShirtTexID = Instance.new("StringValue",newTShirt)
if (TShirtTexID ~= nil) then
newTShirtTexID.Value = TShirtTexID
else
newTShirtTexID.Value = ""
end
newTShirtTexID.Name = "Texture"
--EXTRA
local newItem = Instance.new("StringValue",newCharApp)
if (ItemID ~= nil) then
@ -328,7 +371,7 @@ function CSServer(Port,PlayerLimit,ClientEXEMD5,LauncherMD5,ClientScriptMD5,Noti
pcall(function() game.Close:connect(function() Server:stop() end) end)
end
function CSConnect(UserID,ServerIP,ServerPort,PlayerName,Hat1ID,Hat2ID,Hat3ID,HeadColorID,TorsoColorID,LeftArmColorID,RightArmColorID,LeftLegColorID,RightLegColorID,TShirtID,ShirtID,PantsID,FaceID,HeadID,IconType,ItemID,ClientEXEMD5,LauncherMD5,ClientScriptMD5,Tripcode,Ticket)
function CSConnect(UserID,ServerIP,ServerPort,PlayerName,Hat1ID,Hat2ID,Hat3ID,HeadColorID,TorsoColorID,LeftArmColorID,RightArmColorID,LeftLegColorID,RightLegColorID,TShirtID,ShirtID,PantsID,FaceID,HeadID,IconType,ItemID,ClientEXEMD5,LauncherMD5,ClientScriptMD5,Tripcode,VerifiedScripts,TShirtTexID,Ticket)
local suc, err = pcall(function()
client = game:service("NetworkClient")
player = game:service("Players"):createLocalPlayer(UserID)
@ -340,7 +383,7 @@ function CSConnect(UserID,ServerIP,ServerPort,PlayerName,Hat1ID,Hat2ID,Hat3ID,He
player:SetAdminMode(true)
pcall(function() player.Name=PlayerName or "" end)
game:service("Visit"):setUploadUrl("")
InitalizeClientAppearance(player,Hat1ID,Hat2ID,Hat3ID,HeadColorID,TorsoColorID,LeftArmColorID,RightArmColorID,LeftLegColorID,RightLegColorID,TShirtID,ShirtID,PantsID,FaceID,HeadID,ItemID)
InitalizeClientAppearance(player,Hat1ID,Hat2ID,Hat3ID,HeadColorID,TorsoColorID,LeftArmColorID,RightArmColorID,LeftLegColorID,RightLegColorID,TShirtID,ShirtID,PantsID,FaceID,HeadID,ItemID,TShirtTexID)
end)
local function dieerror(errmsg)
@ -400,14 +443,14 @@ function CSConnect(UserID,ServerIP,ServerPort,PlayerName,Hat1ID,Hat2ID,Hat3ID,He
end
end
function CSSolo(UserID,PlayerName,Hat1ID,Hat2ID,Hat3ID,HeadColorID,TorsoColorID,LeftArmColorID,RightArmColorID,LeftLegColorID,RightLegColorID,TShirtID,ShirtID,PantsID,FaceID,HeadID,IconType,ItemID)
function CSSolo(UserID,PlayerName,Hat1ID,Hat2ID,Hat3ID,HeadColorID,TorsoColorID,LeftArmColorID,RightArmColorID,LeftLegColorID,RightLegColorID,TShirtID,ShirtID,PantsID,FaceID,HeadID,IconType,ItemID,TShirtTexID)
game:service("RunService"):run()
local plr = game.Players:createLocalPlayer(UserID)
game.Workspace:insertContent("rbxasset://Fonts//libraries.rbxm")
plr.Name = PlayerName
plr:SetAdminMode(true)
plr:LoadCharacter()
InitalizeClientAppearance(plr,Hat1ID,Hat2ID,Hat3ID,HeadColorID,TorsoColorID,LeftArmColorID,RightArmColorID,LeftLegColorID,RightLegColorID,TShirtID,ShirtID,PantsID,FaceID,HeadID,ItemID)
InitalizeClientAppearance(plr,Hat1ID,Hat2ID,Hat3ID,HeadColorID,TorsoColorID,LeftArmColorID,RightArmColorID,LeftLegColorID,RightLegColorID,TShirtID,ShirtID,PantsID,FaceID,HeadID,ItemID,TShirtTexID)
LoadCharacterNew(newWaitForChild(plr,"Appearance"),plr.Character,false)
game:service("Visit"):setUploadUrl("")
while true do

View File

@ -144,7 +144,7 @@ function LoadCharacterNew(playerApp,newChar)
if newItem[1].className == "Decal" then
newWaitForChild(charparts[1],"face"):remove()
newItem[1].Parent = charparts[1]
newItem[1].Face = "Front"
newItem[1].Face = 5
elseif newPart[1].className == "SpecialMesh" or newPart[1].className == "CylinderMesh" or newPart[1].className == "BlockMesh" then
newWaitForChild(charparts[1],"Mesh"):remove()
newItem[1].Parent = charparts[1]

View File

@ -144,7 +144,7 @@ function LoadCharacterNew(playerApp,newChar)
if newItem[1].className == "Decal" then
newWaitForChild(charparts[1],"face"):remove()
newItem[1].Parent = charparts[1]
newItem[1].Face = "Front"
newItem[1].Face = 5
elseif newPart[1].className == "SpecialMesh" or newPart[1].className == "CylinderMesh" or newPart[1].className == "BlockMesh" then
newWaitForChild(charparts[1],"Mesh"):remove()
newItem[1].Parent = charparts[1]