fix more bugs, delete sdkfuncs because it's pointless now

This commit is contained in:
Bitl 2021-08-30 18:22:44 -07:00
parent 85d47a76b4
commit 28070e1aaa
7 changed files with 1191 additions and 1188 deletions

File diff suppressed because it is too large Load Diff

View File

@ -5,6 +5,8 @@ using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Windows.Forms;
using System.Xml;
using System.Xml.Linq;
#endregion
public partial class AssetSDK : Form
@ -85,6 +87,77 @@ public partial class AssetSDK : Form
#endregion
#region Asset Downloader
public static void StartItemDownload(string name, string url, string id, int ver, bool iswebsite)
{
try
{
string version = ((ver != 0) && (!iswebsite)) ? "&version=" + ver : "";
string fullURL = url + id + version;
if (!iswebsite)
{
if (!GlobalVars.UserConfiguration.DisabledItemMakerHelp)
{
string helptext = "If you're trying to create a offline item, please use these file extension names when saving your files:\n.rbxm - ROBLOX Model/Item\n.rbxl - ROBLOX Place\n.mesh - ROBLOX Mesh\n.png - Texture/Icon\n.wav - Sound";
MessageBox.Show(helptext, "Novetus Asset SDK", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
Downloader download = new Downloader(fullURL, name, "Roblox Model (*.rbxm)|*.rbxm|Roblox Place (*.rbxl) |*.rbxl|Roblox Mesh (*.mesh)|*.mesh|PNG Image (*.png)|*.png|WAV Sound (*.wav)|*.wav");
try
{
string helptext = "In order for the item to work in Novetus, you'll need to find an icon for your item (it must be a .png file), then name it the same name as your item.\n\nIf you want to create a local (offline) item, use the Asset Localizer in the Asset SDK.\n\nIf you get a corrupted file, change the URL using the drop down box.";
download.InitDownload((!GlobalVars.UserConfiguration.DisabledItemMakerHelp) ? helptext : "");
}
catch (Exception ex)
{
MessageBox.Show("Error: Unable to download the file. " + ex.Message, "Novetus Asset SDK - Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
if (!string.IsNullOrWhiteSpace(download.getDownloadOutcome()))
{
MessageBox.Show(download.getDownloadOutcome(), "Novetus Asset SDK - Download Completed", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
else
{
Process.Start(fullURL);
}
}
catch (Exception)
{
MessageBox.Show("Error: Unable to download the file. Try using a different file name or ID.", "Novetus Asset SDK - Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
public static void StartItemBatchDownload(string name, string url, string id, int ver, bool iswebsite, string path)
{
try
{
string version = ((ver != 0) && (!iswebsite)) ? "&version=" + ver : "";
string fullURL = url + id + version;
if (!iswebsite)
{
Downloader download = new Downloader(fullURL, name, "", path);
try
{
download.InitDownloadNoDialog(download.GetFullDLPath());
}
catch (Exception)
{
}
}
else
{
Process.Start(fullURL);
}
}
catch (Exception)
{
}
}
private void AssetDownloader_URLSelection_SelectedIndexChanged(object sender, EventArgs e)
{
switch (AssetDownloader_URLSelection.SelectedIndex)
@ -114,7 +187,7 @@ public partial class AssetSDK : Form
if (batchMode == false)
{
SDKFuncs.StartItemDownload(
StartItemDownload(
AssetDownloader_AssetNameBox.Text,
url,
AssetDownloader_AssetIDBox.Text,
@ -144,7 +217,7 @@ public partial class AssetSDK : Form
foreach (var line in lines)
{
string[] linesplit = line.Split('|');
SDKFuncs.StartItemBatchDownload(
StartItemBatchDownload(
linesplit[0] + extension,
url,
linesplit[1],
@ -196,6 +269,784 @@ public partial class AssetSDK : Form
#endregion
#region Asset Localizer
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)
{
MessageBox.Show("The download has experienced an error: " + ex.Message, "Novetus Asset SDK - Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
public static void DownloadFromNodes(XDocument doc, VarStorage.AssetCacheDef assetdef, string name = "", string meshname = "")
{
DownloadFromNodes(doc, assetdef.Class, assetdef.Id[0], assetdef.Ext[0], assetdef.Dir[0], assetdef.GameDir[0], name, meshname);
}
public static void DownloadFromNodes(XDocument doc, VarStorage.AssetCacheDef assetdef, int idIndex, int extIndex, int outputPathIndex, int inGameDirIndex, string name = "", string meshname = "")
{
DownloadFromNodes(doc, assetdef.Class, assetdef.Id[idIndex], assetdef.Ext[extIndex], assetdef.Dir[outputPathIndex], assetdef.GameDir[inGameDirIndex], 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;
}
}
}
}
}
}
//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)
{
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)
{
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)
{
string typeFilter = "";
switch (type)
{
case RobloxFileType.RBXL:
typeFilter = "ROBLOX Level (*.rbxl)|*.rbxl|ROBLOX Level (*.rbxlx)|*.rbxlx";
break;
/*case RobloxFileType.Script:
typeFilter = "Lua Script (*.lua)|*.lua";
break;*/
default:
typeFilter = "ROBLOX Model (*.rbxm)|*.rbxm";
break;
}
OpenFileDialog openFileDialog1 = new OpenFileDialog
{
Filter = typeFilter,
Title = "Open ROBLOX level or model",
};
return openFileDialog1;
}
public static RobloxFileType SelectROBLOXFileType(int index)
{
RobloxFileType type;
switch (index)
{
case 1:
type = RobloxFileType.RBXM;
break;
case 2:
type = RobloxFileType.Hat;
break;
case 3:
type = RobloxFileType.Head;
break;
case 4:
type = RobloxFileType.Face;
break;
case 5:
type = RobloxFileType.Shirt;
break;
case 6:
type = RobloxFileType.TShirt;
break;
case 7:
type = RobloxFileType.Pants;
break;
//case 8:
//type = RobloxFileType.Script;
//break;
default:
type = RobloxFileType.RBXL;
break;
}
return type;
}
public static string GetProgressString(RobloxFileType type, int percent)
{
string progressString = "";
switch (type)
{
case RobloxFileType.RBXL:
switch (percent)
{
case 0:
progressString = "Backing up RBXL...";
break;
case 5:
progressString = "Downloading RBXL Meshes and Textures...";
break;
case 10:
progressString = "Downloading RBXL Skybox Textures...";
break;
case 15:
progressString = "Downloading RBXL Decal Textures...";
break;
case 20:
progressString = "Downloading RBXL Textures...";
break;
case 25:
progressString = "Downloading RBXL Tool Textures...";
break;
case 30:
progressString = "Downloading RBXL HopperBin Textures...";
break;
case 40:
progressString = "Downloading RBXL Sounds...";
break;
case 50:
progressString = "Downloading RBXL GUI Textures...";
break;
case 60:
progressString = "Downloading RBXL Shirt Textures...";
break;
case 65:
progressString = "Downloading RBXL T-Shirt Textures...";
break;
case 70:
progressString = "Downloading RBXL Pants Textures...";
break;
case 80:
progressString = "Downloading RBXL Linked Scripts...";
break;
case 90:
progressString = "Downloading RBXL Linked LocalScripts...";
break;
//case 95:
//progressString = "Fixing RBXL Scripts...";
//break;
//case 97:
//progressString = "Fixing RBXL LocalScripts...";
//break;
}
break;
case RobloxFileType.RBXM:
switch (percent)
{
case 0:
progressString = "Downloading RBXM Meshes and Textures...";
break;
case 10:
progressString = "Downloading RBXM Skybox Textures...";
break;
case 15:
progressString = "Downloading RBXM Decal Textures...";
break;
case 20:
progressString = "Downloading RBXM Textures...";
break;
case 25:
progressString = "Downloading RBXM Tool Textures...";
break;
case 30:
progressString = "Downloading RBXM HopperBin Textures...";
break;
case 40:
progressString = "Downloading RBXM Sounds...";
break;
case 50:
progressString = "Downloading RBXM GUI Textures...";
break;
case 60:
progressString = "Downloading RBXM Shirt Textures...";
break;
case 65:
progressString = "Downloading RBXM T-Shirt Textures...";
break;
case 70:
progressString = "Downloading RBXM Pants Textures...";
break;
case 80:
progressString = "Downloading RBXM Linked Scripts...";
break;
case 90:
progressString = "Downloading RBXM Linked LocalScripts...";
break;
//case 95:
//progressString = "Fixing RBXM Scripts...";
//break;
//case 97:
//progressString = "Fixing RBXM LocalScripts...";
//break;
}
break;
case RobloxFileType.Hat:
switch (percent)
{
case 0:
progressString = "Downloading Hat Meshes and Textures...";
break;
case 25:
progressString = "Downloading Hat Sounds...";
break;
case 50:
progressString = "Downloading Hat Linked Scripts...";
break;
case 75:
progressString = "Downloading Hat Linked LocalScripts...";
break;
}
break;
case RobloxFileType.Head:
//meshes
switch (percent)
{
case 0:
progressString = "Downloading Head Meshes and Textures...";
break;
}
break;
case RobloxFileType.Face:
//decal
switch (percent)
{
case 0:
progressString = "Downloading Face Textures...";
break;
}
break;
case RobloxFileType.TShirt:
//texture
switch (percent)
{
case 0:
progressString = "Downloading T-Shirt Textures...";
break;
}
break;
case RobloxFileType.Shirt:
//texture
switch (percent)
{
case 0:
progressString = "Downloading Shirt Textures...";
break;
}
break;
case RobloxFileType.Pants:
//texture
switch (percent)
{
case 0:
progressString = "Downloading Pants Textures...";
break;
}
break;
/*
case RobloxFileType.Script:
//script
switch (percent)
{
case 0:
progressString = "Fixing Script...";
break;
}
break;*/
default:
progressString = "Idle";
break;
}
return progressString + " " + percent.ToString() + "%";
}
public static void LocalizeAsset(RobloxFileType type, BackgroundWorker worker, string path, string itemname, string meshname)
{
string oldfile = File.ReadAllText(path);
string fixedfile = RobloxXML.RemoveInvalidXmlChars(RobloxXML.ReplaceHexadecimalSymbols(oldfile)).Replace("	", "\t").Replace("#9;", "\t");
XDocument doc = null;
XmlReaderSettings xmlReaderSettings = new XmlReaderSettings { CheckCharacters = false };
Stream filestream = GlobalFuncs.GenerateStreamFromString(fixedfile);
using (XmlReader xmlReader = XmlReader.Create(filestream, xmlReaderSettings))
{
xmlReader.MoveToContent();
doc = XDocument.Load(xmlReader);
}
try
{
switch (type)
{
case RobloxFileType.RBXL:
//backup the original copy
if (GlobalVars.UserConfiguration.AssetLocalizerSaveBackups)
{
try
{
worker.ReportProgress(0);
GlobalFuncs.FixedFileCopy(path, path.Replace(".rbxl", " - BAK.rbxl"), false);
}
catch (Exception)
{
worker.ReportProgress(100);
}
}
else
{
worker.ReportProgress(0);
}
//meshes
worker.ReportProgress(5);
DownloadFromNodes(doc, RobloxDefs.Fonts);
DownloadFromNodes(doc, RobloxDefs.Fonts, 1, 1, 1, 1);
//skybox
worker.ReportProgress(10);
DownloadFromNodes(doc, RobloxDefs.Sky);
DownloadFromNodes(doc, RobloxDefs.Sky, 1, 0, 0, 0);
DownloadFromNodes(doc, RobloxDefs.Sky, 2, 0, 0, 0);
DownloadFromNodes(doc, RobloxDefs.Sky, 3, 0, 0, 0);
DownloadFromNodes(doc, RobloxDefs.Sky, 4, 0, 0, 0);
DownloadFromNodes(doc, RobloxDefs.Sky, 5, 0, 0, 0);
//decal
worker.ReportProgress(15);
DownloadFromNodes(doc, RobloxDefs.Decal);
//texture
worker.ReportProgress(20);
DownloadFromNodes(doc, RobloxDefs.Texture);
//tools and hopperbin
worker.ReportProgress(25);
DownloadFromNodes(doc, RobloxDefs.Tool);
worker.ReportProgress(30);
DownloadFromNodes(doc, RobloxDefs.HopperBin);
//sound
worker.ReportProgress(40);
DownloadFromNodes(doc, RobloxDefs.Sound);
worker.ReportProgress(50);
DownloadFromNodes(doc, RobloxDefs.ImageLabel);
//clothing
worker.ReportProgress(60);
DownloadFromNodes(doc, RobloxDefs.Shirt);
worker.ReportProgress(65);
DownloadFromNodes(doc, RobloxDefs.ShirtGraphic);
worker.ReportProgress(70);
DownloadFromNodes(doc, RobloxDefs.Pants);
//scripts
worker.ReportProgress(80);
DownloadFromNodes(doc, RobloxDefs.Script);
worker.ReportProgress(90);
DownloadFromNodes(doc, RobloxDefs.LocalScript);
//localize any scripts that are not handled
/*
worker.ReportProgress(95);
RobloxXML.DownloadScriptFromNodes(doc, "Script");
worker.ReportProgress(97);
RobloxXML.DownloadScriptFromNodes(doc, "LocalScript");*/
worker.ReportProgress(100);
break;
case RobloxFileType.RBXM:
if (GlobalVars.UserConfiguration.AssetLocalizerSaveBackups)
{
try
{
worker.ReportProgress(0);
GlobalFuncs.FixedFileCopy(path, path.Replace(".rbxm", " BAK.rbxm"), false);
}
catch (Exception)
{
worker.ReportProgress(100);
}
}
else
{
worker.ReportProgress(0);
}
//meshes
DownloadFromNodes(doc, RobloxDefs.Fonts);
DownloadFromNodes(doc, RobloxDefs.Fonts, 1, 1, 1, 1);
//skybox
worker.ReportProgress(10);
DownloadFromNodes(doc, RobloxDefs.Sky);
DownloadFromNodes(doc, RobloxDefs.Sky, 1, 0, 0, 0);
DownloadFromNodes(doc, RobloxDefs.Sky, 2, 0, 0, 0);
DownloadFromNodes(doc, RobloxDefs.Sky, 3, 0, 0, 0);
DownloadFromNodes(doc, RobloxDefs.Sky, 4, 0, 0, 0);
DownloadFromNodes(doc, RobloxDefs.Sky, 5, 0, 0, 0);
//decal
worker.ReportProgress(15);
DownloadFromNodes(doc, RobloxDefs.Decal);
//texture
worker.ReportProgress(20);
DownloadFromNodes(doc, RobloxDefs.Texture);
//tools and hopperbin
worker.ReportProgress(25);
DownloadFromNodes(doc, RobloxDefs.Tool);
worker.ReportProgress(30);
DownloadFromNodes(doc, RobloxDefs.HopperBin);
//sound
worker.ReportProgress(40);
DownloadFromNodes(doc, RobloxDefs.Sound);
worker.ReportProgress(50);
DownloadFromNodes(doc, RobloxDefs.ImageLabel);
//clothing
worker.ReportProgress(60);
DownloadFromNodes(doc, RobloxDefs.Shirt);
worker.ReportProgress(65);
DownloadFromNodes(doc, RobloxDefs.ShirtGraphic);
worker.ReportProgress(70);
DownloadFromNodes(doc, RobloxDefs.Pants);
//scripts
worker.ReportProgress(80);
DownloadFromNodes(doc, RobloxDefs.Script);
worker.ReportProgress(90);
DownloadFromNodes(doc, RobloxDefs.LocalScript);
//localize any scripts that are not handled
/*
worker.ReportProgress(95);
RobloxXML.DownloadScriptFromNodes(doc, "Script");
worker.ReportProgress(97);
RobloxXML.DownloadScriptFromNodes(doc, "LocalScript");*/
worker.ReportProgress(100);
break;
case RobloxFileType.Hat:
if (GlobalVars.UserConfiguration.AssetLocalizerSaveBackups)
{
try
{
worker.ReportProgress(0);
GlobalFuncs.FixedFileCopy(path, path.Replace(".rbxm", " BAK.rbxm"), false);
}
catch (Exception)
{
worker.ReportProgress(100);
}
}
else
{
worker.ReportProgress(0);
}
//meshes
DownloadFromNodes(doc, RobloxDefs.ItemHatFonts, itemname, meshname);
DownloadFromNodes(doc, RobloxDefs.ItemHatFonts, 1, 1, 1, 1, itemname);
worker.ReportProgress(25);
DownloadFromNodes(doc, RobloxDefs.ItemHatSound);
//scripts
worker.ReportProgress(50);
DownloadFromNodes(doc, RobloxDefs.ItemHatScript);
worker.ReportProgress(75);
DownloadFromNodes(doc, RobloxDefs.ItemHatLocalScript);
worker.ReportProgress(100);
break;
case RobloxFileType.Head:
if (GlobalVars.UserConfiguration.AssetLocalizerSaveBackups)
{
try
{
worker.ReportProgress(0);
GlobalFuncs.FixedFileCopy(path, path.Replace(".rbxm", " BAK.rbxm"), false);
}
catch (Exception)
{
worker.ReportProgress(100);
}
}
else
{
worker.ReportProgress(0);
}
//meshes
DownloadFromNodes(doc, RobloxDefs.ItemHeadFonts, itemname);
DownloadFromNodes(doc, RobloxDefs.ItemHeadFonts, 1, 1, 1, 1, itemname);
worker.ReportProgress(100);
break;
case RobloxFileType.Face:
if (GlobalVars.UserConfiguration.AssetLocalizerSaveBackups)
{
try
{
worker.ReportProgress(0);
GlobalFuncs.FixedFileCopy(path, path.Replace(".rbxm", " BAK.rbxm"), false);
}
catch (Exception)
{
worker.ReportProgress(100);
}
}
else
{
worker.ReportProgress(0);
}
//decal
DownloadFromNodes(doc, RobloxDefs.ItemFaceTexture, itemname);
worker.ReportProgress(100);
break;
case RobloxFileType.TShirt:
if (GlobalVars.UserConfiguration.AssetLocalizerSaveBackups)
{
try
{
worker.ReportProgress(0);
GlobalFuncs.FixedFileCopy(path, path.Replace(".rbxm", " BAK.rbxm"), false);
}
catch (Exception)
{
worker.ReportProgress(100);
}
}
else
{
worker.ReportProgress(0);
}
//texture
DownloadFromNodes(doc, RobloxDefs.ItemTShirtTexture, itemname);
worker.ReportProgress(100);
break;
case RobloxFileType.Shirt:
if (GlobalVars.UserConfiguration.AssetLocalizerSaveBackups)
{
try
{
worker.ReportProgress(0);
GlobalFuncs.FixedFileCopy(path, path.Replace(".rbxm", " BAK.rbxm"), false);
}
catch (Exception)
{
worker.ReportProgress(100);
}
}
else
{
worker.ReportProgress(0);
}
//texture
DownloadFromNodes(doc, RobloxDefs.ItemShirtTexture, itemname);
worker.ReportProgress(100);
break;
case RobloxFileType.Pants:
if (GlobalVars.UserConfiguration.AssetLocalizerSaveBackups)
{
try
{
worker.ReportProgress(0);
GlobalFuncs.FixedFileCopy(path, path.Replace(".rbxm", " BAK.rbxm"), false);
}
catch (Exception)
{
worker.ReportProgress(100);
}
}
else
{
worker.ReportProgress(0);
}
//texture
DownloadFromNodes(doc, RobloxDefs.ItemPantsTexture, itemname);
worker.ReportProgress(100);
break;
/*case RobloxFileType.Script:
if (GlobalVars.UserConfiguration.AssetLocalizerSaveBackups)
{
try
{
worker.ReportProgress(0);
GlobalFuncs.FixedFileCopy(path, path.Replace(".lua", " BAK.lua"), false);
}
catch (Exception)
{
worker.ReportProgress(100);
}
}
else
{
worker.ReportProgress(0);
}
RobloxXML.DownloadFromScript(path);
worker.ReportProgress(100);
break;*/
default:
worker.ReportProgress(100);
break;
}
}
catch (Exception ex)
{
MessageBox.Show("Error: Unable to localize the asset. " + ex.Message, "Novetus Asset SDK - Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
XmlWriterSettings xmlWriterSettings = new XmlWriterSettings { CheckCharacters = false, Indent = true };
using (XmlWriter xmlReader = XmlWriter.Create(path, xmlWriterSettings))
{
doc.WriteTo(xmlReader);
}
}
}
private void SetAssetCachePaths(bool perm = false)
{
if (perm)
@ -242,7 +1093,7 @@ public partial class AssetSDK : Form
private void AssetLocalization_AssetTypeBox_SelectedIndexChanged(object sender, EventArgs e)
{
currentType = SDKFuncs.SelectROBLOXFileType(AssetLocalization_AssetTypeBox.SelectedIndex);
currentType = SelectROBLOXFileType(AssetLocalization_AssetTypeBox.SelectedIndex);
}
private void AssetLocalization_ItemNameBox_TextChanged(object sender, EventArgs e)
@ -269,7 +1120,7 @@ public partial class AssetSDK : Form
private void AssetLocalization_LocalizeButton_Click(object sender, EventArgs e)
{
OpenFileDialog robloxFileDialog = SDKFuncs.LoadROBLOXFileDialog(currentType);
OpenFileDialog robloxFileDialog = LoadROBLOXFileDialog(currentType);
if (robloxFileDialog.ShowDialog() == DialogResult.OK)
{
@ -282,13 +1133,13 @@ public partial class AssetSDK : Form
private void AssetLocalization_BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
SDKFuncs.LocalizeAsset(currentType, worker, path, name, meshname);
LocalizeAsset(currentType, worker, path, name, meshname);
}
// This event handler updates the progress.
private void AssetLocalization_BackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
AssetLocalization_StatusText.Text = SDKFuncs.GetProgressString(currentType, e.ProgressPercentage);
AssetLocalization_StatusText.Text = GetProgressString(currentType, e.ProgressPercentage);
AssetLocalization_StatusBar.Value = e.ProgressPercentage;
}

View File

@ -1,8 +1,11 @@
#region Usings
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Windows.Forms;
using System.Xml.Linq;
#endregion
#region Item Creation SDK
@ -46,7 +49,7 @@ public partial class ItemCreationSDK : Form
}
else
{
string previconpath = SDKFuncs.GetPathForType(type) + "\\" + ItemNameBox.Text.Replace(" ", "") + ".png";
string previconpath = GetPathForType(type) + "\\" + ItemNameBox.Text.Replace(" ", "") + ".png";
if (File.Exists(previconpath))
{
@ -59,7 +62,7 @@ public partial class ItemCreationSDK : Form
IconLoader icon = new IconLoader();
icon.CopyToItemDir = true;
icon.ItemDir = SDKFuncs.GetPathForType(type);
icon.ItemDir = GetPathForType(type);
icon.ItemName = ItemNameBox.Text;
try
{
@ -88,11 +91,11 @@ public partial class ItemCreationSDK : Form
}
private void ItemTypeListBox_SelectedIndexChanged(object sender, EventArgs e)
{
string previconpath = SDKFuncs.GetPathForType(type) + "\\" + ItemNameBox.Text.Replace(" ", "") + ".png";
string previconpath = GetPathForType(type) + "\\" + ItemNameBox.Text.Replace(" ", "") + ".png";
GlobalFuncs.FixedFileDelete(previconpath);
type = SDKFuncs.GetTypeForInt(ItemTypeListBox.SelectedIndex);
type = GetTypeForInt(ItemTypeListBox.SelectedIndex);
switch (type)
{
@ -210,7 +213,7 @@ public partial class ItemCreationSDK : Form
return;
string ItemName = ItemNameBox.Text.Replace(" ", "");
if (SDKFuncs.CreateItem(Template,
if (CreateItem(Template,
type,
ItemName,
new string[] { Option1Path, Option2Path, Option1TextBox.Text, Option2TextBox.Text },
@ -288,6 +291,286 @@ public partial class ItemCreationSDK : Form
#endregion
#region Functions
public static void SetItemFontVals(XDocument doc, VarStorage.AssetCacheDef assetdef, int idIndex, int outputPathIndex, int inGameDirIndex, string assetpath, string assetfilename)
{
SetItemFontVals(doc, assetdef.Class, assetdef.Id[idIndex], assetdef.Dir[outputPathIndex], assetdef.GameDir[inGameDirIndex], assetpath, assetfilename);
}
public static void SetItemFontVals(XDocument doc, string itemClassValue, string itemIdValue, string outputPath, string inGameDir, string assetpath, string assetfilename)
{
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 (!string.IsNullOrWhiteSpace(assetpath))
{
GlobalFuncs.FixedFileCopy(assetpath, outputPath + "\\" + assetfilename, true);
}
item3.Value = inGameDir + assetfilename;
}
}
}
}
public static void SetItemCoordVals(XDocument doc, VarStorage.AssetCacheDef assetdef, double X, double Y, double Z, string CoordClass, string CoordName)
{
SetItemCoordVals(doc, assetdef.Class, X, Y, Z, CoordClass, CoordName);
}
public static void SetItemCoordVals(XDocument doc, string itemClassValue, double X, double Y, double Z, string CoordClass, string CoordName)
{
var v = from nodes in doc.Descendants("Item")
where nodes.Attribute("class").Value == itemClassValue
select nodes;
SetItemCoordXML(v, X, Y, Z, CoordClass, CoordName);
}
public static void SetItemCoordValsNoClassSearch(XDocument doc, double X, double Y, double Z, string CoordClass, string CoordName)
{
var v = from nodes in doc.Descendants("Item")
select nodes;
SetItemCoordXML(v, X, Y, Z, CoordClass, CoordName);
}
private static void SetItemCoordXML(IEnumerable<XElement> v, double X, double Y, double Z, string CoordClass, string CoordName)
{
foreach (var item in v)
{
var v2 = from nodes in item.Descendants(CoordClass)
where nodes.Attribute("name").Value == CoordName
select nodes;
foreach (var item2 in v2)
{
var v3 = from nodes in item2.Descendants("X")
select nodes;
foreach (var item3 in v3)
{
item3.Value = X.ToString();
}
var v4 = from nodes in item2.Descendants("Y")
select nodes;
foreach (var item4 in v4)
{
item4.Value = Y.ToString();
}
var v5 = from nodes in item2.Descendants("Z")
select nodes;
foreach (var item5 in v5)
{
item5.Value = Z.ToString();
}
}
}
}
public static void SetHeadBevel(XDocument doc, double bevel, double bevelRoundness, double bulge, int meshtype, string meshclass, int LODX, int LODY)
{
var v = from nodes in doc.Descendants("Item")
select nodes;
foreach (var item in v)
{
item.SetAttributeValue("class", meshclass);
var v2 = from nodes in item.Descendants(RobloxXML.GetStringForXMLType(XMLTypes.Float))
where nodes.Attribute("name").Value == "Bevel"
select nodes;
foreach (var item2 in v2)
{
item2.Value = bevel.ToString();
}
var v3 = from nodes in item.Descendants(RobloxXML.GetStringForXMLType(XMLTypes.Float))
where nodes.Attribute("name").Value == "Bevel Roundness"
select nodes;
foreach (var item3 in v3)
{
item3.Value = bevelRoundness.ToString();
}
var v4 = from nodes in item.Descendants(RobloxXML.GetStringForXMLType(XMLTypes.Float))
where nodes.Attribute("name").Value == "Bulge"
select nodes;
foreach (var item4 in v4)
{
item4.Value = bulge.ToString();
}
var vX = from nodes in item.Descendants(RobloxXML.GetStringForXMLType(XMLTypes.Token))
where nodes.Attribute("name").Value == "LODX"
select nodes;
foreach (var itemX in vX)
{
itemX.Value = LODX.ToString();
}
var vY = from nodes in item.Descendants(RobloxXML.GetStringForXMLType(XMLTypes.Token))
where nodes.Attribute("name").Value == "LODY"
select nodes;
foreach (var itemY in vY)
{
itemY.Value = LODY.ToString();
}
var v5 = from nodes in item.Descendants(RobloxXML.GetStringForXMLType(XMLTypes.Token))
where nodes.Attribute("name").Value == "MeshType"
select nodes;
foreach (var item5 in v5)
{
item5.Value = meshtype.ToString();
}
}
}
public static string GetPathForType(RobloxFileType type)
{
switch (type)
{
case RobloxFileType.Hat:
return GlobalPaths.hatdir;
case RobloxFileType.HeadNoCustomMesh:
case RobloxFileType.Head:
return GlobalPaths.headdir;
case RobloxFileType.Face:
return GlobalPaths.facedir;
case RobloxFileType.TShirt:
return GlobalPaths.tshirtdir;
case RobloxFileType.Shirt:
return GlobalPaths.shirtdir;
case RobloxFileType.Pants:
return GlobalPaths.pantsdir;
default:
return "";
}
}
public static RobloxFileType GetTypeForInt(int type)
{
switch (type)
{
case 0:
return RobloxFileType.Hat;
case 1:
return RobloxFileType.Head;
case 2:
return RobloxFileType.HeadNoCustomMesh;
case 3:
return RobloxFileType.Face;
case 4:
return RobloxFileType.TShirt;
case 5:
return RobloxFileType.Shirt;
case 6:
return RobloxFileType.Pants;
default:
return RobloxFileType.RBXM;
}
}
public static bool CreateItem(string filepath, RobloxFileType type, string itemname, string[] assetfilenames, double[] coordoptions, object[] headoptions, string desctext = "")
{
/*MessageBox.Show(assetfilenames[0] + "\n" +
assetfilenames[1] + "\n" +
assetfilenames[2] + "\n" +
assetfilenames[3] + "\n" +
coordoptions[0] + "\n" +
coordoptions[1] + "\n" +
coordoptions[2] + "\n" +
headoptions[0] + "\n" +
headoptions[1] + "\n" +
headoptions[2] + "\n");*/
string oldfile = File.ReadAllText(filepath);
string fixedfile = RobloxXML.RemoveInvalidXmlChars(RobloxXML.ReplaceHexadecimalSymbols(oldfile));
XDocument doc = XDocument.Parse(fixedfile);
string savDocPath = GetPathForType(type);
bool success = true;
try
{
switch (type)
{
case RobloxFileType.Hat:
SetItemFontVals(doc, RobloxDefs.ItemHatFonts, 0, 0, 0, assetfilenames[0], assetfilenames[2]);
SetItemFontVals(doc, RobloxDefs.ItemHatFonts, 1, 1, 1, assetfilenames[1], assetfilenames[3]);
SetItemCoordVals(doc, "Hat", coordoptions[0], coordoptions[1], coordoptions[2], "CoordinateFrame", "AttachmentPoint");
break;
case RobloxFileType.Head:
SetItemFontVals(doc, RobloxDefs.ItemHeadFonts, 0, 0, 0, assetfilenames[0], assetfilenames[2]);
SetItemFontVals(doc, RobloxDefs.ItemHeadFonts, 1, 1, 1, assetfilenames[1], assetfilenames[3]);
SetItemCoordVals(doc, RobloxDefs.ItemHeadFonts, coordoptions[0], coordoptions[1], coordoptions[2], "Vector3", "Scale");
break;
case RobloxFileType.Face:
SetItemFontVals(doc, RobloxDefs.ItemFaceTexture, 0, 0, 0, "", assetfilenames[2]);
break;
case RobloxFileType.TShirt:
SetItemFontVals(doc, RobloxDefs.ItemTShirtTexture, 0, 0, 0, "", assetfilenames[2]);
break;
case RobloxFileType.Shirt:
SetItemFontVals(doc, RobloxDefs.ItemShirtTexture, 0, 0, 0, assetfilenames[0], assetfilenames[2]);
savDocPath = GlobalPaths.shirtdir;
break;
case RobloxFileType.Pants:
SetItemFontVals(doc, RobloxDefs.ItemPantsTexture, 0, 0, 0, assetfilenames[0], assetfilenames[2]);
break;
case RobloxFileType.HeadNoCustomMesh:
SetHeadBevel(doc, Convert.ToDouble(headoptions[0]),
Convert.ToDouble(headoptions[1]),
Convert.ToDouble(headoptions[2]),
Convert.ToInt32(headoptions[3]),
headoptions[4].ToString(),
Convert.ToInt32(headoptions[5]),
Convert.ToInt32(headoptions[6]));
SetItemCoordValsNoClassSearch(doc, coordoptions[0], coordoptions[1], coordoptions[2], "Vector3", "Scale");
break;
default:
break;
}
}
catch (Exception ex)
{
MessageBox.Show("The Item Creation SDK has experienced an error: " + ex.Message, "Novetus Item Creation SDK - Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
success = false;
}
finally
{
doc.Save(savDocPath + "\\" + itemname + ".rbxm");
if (!string.IsNullOrWhiteSpace(desctext))
{
File.WriteAllText(savDocPath + "\\" + itemname + "_desc.txt", desctext);
}
}
return success;
}
private void ToggleOptionSet(Label label, TextBox textbox, Button button, string labelText, bool browseButton, bool enable = true)
{
label.Text = enable ? labelText : (string.IsNullOrWhiteSpace(labelText) ? "This option is disabled." : labelText);
@ -396,4 +679,4 @@ public partial class ItemCreationSDK : Form
}
#endregion
}
#endregion
#endregion

View File

@ -7,6 +7,22 @@ using System.Linq;
using System.Windows.Forms;
#endregion
#region SDKApps
enum SDKApps
{
ClientSDK,
AssetSDK,
ItemCreationSDK,
ClientScriptDoc,
SplashTester,
ScriptGenerator,
LegacyPlaceConverter,
DiogenesEditor,
ClientScriptTester,
XMLContentEditor
}
#endregion
#region Novetus SDK Launcher
public partial class NovetusSDK : Form
{

View File

@ -37,6 +37,7 @@
this.insetRowAtSelectedRowToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.deleteSelectedRowToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.XMLView = new System.Windows.Forms.DataGridView();
this.reloadCurrentFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.XMLStrip.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.XMLView)).BeginInit();
this.SuspendLayout();
@ -62,7 +63,8 @@
//
this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.loadToolStripMenuItem,
this.saveToolStripMenuItem});
this.saveToolStripMenuItem,
this.reloadCurrentFileToolStripMenuItem});
this.fileToolStripMenuItem.Name = "fileToolStripMenuItem";
this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 18);
this.fileToolStripMenuItem.Text = "File";
@ -73,7 +75,7 @@
this.contentProvidersToolStripMenuItem,
this.partColorsToolStripMenuItem});
this.loadToolStripMenuItem.Name = "loadToolStripMenuItem";
this.loadToolStripMenuItem.Size = new System.Drawing.Size(100, 22);
this.loadToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.loadToolStripMenuItem.Text = "Load";
//
// contentProvidersToolStripMenuItem
@ -93,7 +95,7 @@
// saveToolStripMenuItem
//
this.saveToolStripMenuItem.Name = "saveToolStripMenuItem";
this.saveToolStripMenuItem.Size = new System.Drawing.Size(100, 22);
this.saveToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.saveToolStripMenuItem.Text = "Save";
this.saveToolStripMenuItem.Click += new System.EventHandler(this.saveToolStripMenuItem_Click);
//
@ -137,6 +139,13 @@
this.XMLView.TabIndex = 30;
this.XMLView.MouseClick += new System.Windows.Forms.MouseEventHandler(this.XMLView_MouseClick);
//
// reloadCurrentFileToolStripMenuItem
//
this.reloadCurrentFileToolStripMenuItem.Name = "reloadCurrentFileToolStripMenuItem";
this.reloadCurrentFileToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.reloadCurrentFileToolStripMenuItem.Text = "Reload Current File";
this.reloadCurrentFileToolStripMenuItem.Click += new System.EventHandler(this.reloadCurrentFileToolStripMenuItem_Click);
//
// XMLContentEditor
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@ -168,4 +177,5 @@
private System.Windows.Forms.ToolStripMenuItem editToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem insetRowAtSelectedRowToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem deleteSelectedRowToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem reloadCurrentFileToolStripMenuItem;
}

View File

@ -53,6 +53,7 @@ public partial class XMLContentEditor : Form
{
if (XMLView.Rows.Count == 0)
{
MessageBox.Show("You cannot do this action because no file has been loaded.", "XML Content Editor - File Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
@ -66,6 +67,7 @@ public partial class XMLContentEditor : Form
{
if (XMLView.Rows.Count == 0)
{
MessageBox.Show("You cannot do this action because no file has been loaded.", "XML Content Editor - File Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
@ -75,6 +77,17 @@ public partial class XMLContentEditor : Form
}
}
private void reloadCurrentFileToolStripMenuItem_Click(object sender, EventArgs e)
{
if (XMLView.Rows.Count == 0)
{
MessageBox.Show("You cannot do this action because no file has been loaded.", "XML Content Editor - File Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
LoadXML(ListType);
}
//https://stackoverflow.com/questions/14431936/how-to-force-datagridviewcell-to-end-edit-when-row-header-is-clicked/14498870
private void XMLView_MouseClick(object sender, MouseEventArgs e)
{
@ -121,7 +134,7 @@ public partial class XMLContentEditor : Form
}
else
{
MessageBox.Show("Cannot load the Content Provider list because the Content Provider XML file does not exist", "XML Content Editor - Content Provider Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
MessageBox.Show("Cannot load the Content Provider list because the Content Provider XML file does not exist.", "XML Content Editor - Content Provider Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
loaderList.AddRange(contentProviders);
@ -133,7 +146,7 @@ public partial class XMLContentEditor : Form
}
else
{
MessageBox.Show("Cannot load the Part Color list because the Part Color XML file does not exist", "XML Content Editor - Part Color Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
MessageBox.Show("Cannot load the Part Color list because the Part Color XML file does not exist.", "XML Content Editor - Part Color Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
loaderList.AddRange(PartColorList);
@ -188,7 +201,7 @@ public partial class XMLContentEditor : Form
}
else
{
MessageBox.Show("Unable to load XML file information because no information exists in the XML file.", "XML Content Editor - Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
MessageBox.Show("Unable to load XML file information because no information exists in the XML file.", "XML Content Editor - File Read Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

View File

@ -157,7 +157,6 @@
<Compile Include="Classes\LocalVars.cs" />
<Compile Include="Classes\SDK\Downloader.cs" />
<Compile Include="Classes\SDK\ROBLOXFileTypes.cs" />
<Compile Include="Classes\SDK\SDKFuncs.cs" />
<Compile Include="Forms\CustomGraphicsOptions.cs">
<SubType>Form</SubType>
</Compile>