Files
PCK-Studio/MinecraftUSkinEditor/Forms/Form1.cs
2021-01-30 13:19:58 -05:00

3252 lines
217 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
using System.IO.Compression;
using System.Net;
using System.Diagnostics;
using System.Linq.Expressions;
using System.Resources;
using minekampf.Properties;
using Ohana3DS_Rebirth.Ohana;
using minekampf;
using minekampf.Forms;
using System.IO.Packaging;
using System.Drawing.Imaging;
namespace MinecraftUSkinEditor
{
public partial class FormMain : MetroFramework.Forms.MetroForm
{
#region Variables
string saveLocation;//Save location for pck file
int fileCount = 0;//variable for number of minefiles
string Version = "4.4";//template for program version
string hosturl = File.ReadAllText(Environment.CurrentDirectory + "\\settings.ini").Split(new[] { "\r\n", "\n" }, StringSplitOptions.None)[0];
PCK.MineFile mf;//Template minefile variable
PCK currentPCK;//currently opened pck
LOC l;//Locdata
PCK.MineFile mfLoc;//LOC minefile
Dictionary<int, string> types;//Template list for metadata of a individual minefiles metadata
PCK.MineFile file;//template for a selected minefile
bool needsUpdate = false;
bool saved = true;
string appData = System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "/PCK Studio/";
public static bool correct = false;
int isdebug = 0;
public class displayId
{
public string id;
public string defaultName;
}
#endregion
#region form startup page
public FormMain()
{
System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo("ja");
Thread.CurrentThread.CurrentCulture = ci;
InitializeComponent();
FormBorderStyle = FormBorderStyle.None;
labelVersion.Text += Version;
pckOpen.AllowDrop = true;
}
#endregion
#region opens and loads pck file
private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
using (var ofd = new OpenFileDialog())
{
ofd.CheckFileExists = true; //makes sure opened pck exists
ofd.Filter = "PCK (Minecraft Console Package)|*.pck";
if (ofd.ShowDialog() == DialogResult.OK)
{
openPck(ofd.FileName);
}
}
}
catch (Exception)
{
MessageBox.Show("The PCK you're trying to use currently isn't supported");//Error handling for PCKs that give errors when trying to be opened
}
}
private void openPck(string filePath)
{
new TabPage();
treeViewMain.Nodes.Clear();
PCK pCK = (currentPCK = new PCK(filePath));
foreach (PCK.MineFile mineFile in pCK.mineFiles)
{
if (!(mineFile.name == "0"))
{
continue;
}
foreach (object[] entry in mineFile.entries)
{
if (entry[0].ToString() == "LOCK" && (new pckLocked(entry[1].ToString(), correct).ShowDialog() != DialogResult.OK || !correct))
{
return;
}
}
}
openedPCKS.SelectedTab.Text = Path.GetFileName(filePath);
saveLocation = filePath;
_ = treeViewMain;
_ = pictureBoxImagePreview;
_ = treeMeta;
_ = textBox1;
_ = label1;
_ = label2;
_ = tabDataDisplay;
ImageList imageList = new ImageList();
imageList.ColorDepth = ColorDepth.Depth32Bit;
imageList.ImageSize = new Size(20, 20);
imageList.Images.Add(Resources.ZZFolder);
imageList.Images.Add(Resources.BINKA_ICON);
imageList.Images.Add(Resources.IMAGE_ICON);
imageList.Images.Add(Resources.LOC_ICON);
imageList.Images.Add(Resources.PCK_ICON);
imageList.Images.Add(Resources.ZUnknown);
treeViewMain.ImageList = imageList;
foreach (PCK.MineFile mineFile2 in pCK.mineFiles)
{
TreeNode treeNode = new TreeNode();
treeNode.Text = mineFile2.name;
treeNode.Tag = mineFile2;
string text = "";
int num = 0;
new List<string>();
TreeNodeCollection nodes = treeViewMain.Nodes;
do
{
text = "";
string name = mineFile2.name;
for (int i = 0; i < name.Length; i++)
{
char c = name[i];
bool flag = false;
if (c == '/')
{
foreach (TreeNode item in nodes)
{
if (item.Text == text)
{
nodes = nodes[item.Index].Nodes;
flag = true;
}
}
if (!flag)
{
nodes.Add(text);
nodes = nodes[nodes.Count - 1].Nodes;
}
flag = false;
text = "";
}
else
{
text += c;
}
num++;
}
}
while (num != mineFile2.name.Length);
if (Path.GetExtension(text) == ".binka")
{
treeNode.ImageIndex = 1;
treeNode.SelectedImageIndex = 1;
}
else if (Path.GetExtension(text) == ".png")
{
treeNode.ImageIndex = 2;
treeNode.SelectedImageIndex = 2;
}
else if (Path.GetExtension(text) == ".loc")
{
treeNode.ImageIndex = 3;
treeNode.SelectedImageIndex = 3;
}
else if (Path.GetExtension(text) == ".pck")
{
treeNode.ImageIndex = 4;
treeNode.SelectedImageIndex = 4;
}
else
{
treeNode.ImageIndex = 5;
treeNode.SelectedImageIndex = 5;
}
treeNode.Text = text;
nodes.Add(treeNode);
saved = false;
}
myTablePanelStartScreen.Visible = false;
pckOpen.Visible = false;
label5.Visible = false;
labelAmount.Visible = true;
richTextBoxChangelog.Visible = false;
openedPCKS.Visible = true;
openedPCKS.AllowDrop = true;
foreach (ToolStripMenuItem dropDownItem in fileToolStripMenuItem.DropDownItems)
{
dropDownItem.Enabled = true;
}
foreach (ToolStripMenuItem dropDownItem2 in editToolStripMenuItem.DropDownItems)
{
dropDownItem2.Enabled = true;
}
foreach (TreeNode node in treeViewMain.Nodes)
{
if (node.Text == "languages.loc")
{
mfLoc = (PCK.MineFile)treeViewMain.Nodes[node.Index].Tag;
}
if (node.Text == "localisation.loc")
{
mfLoc = (PCK.MineFile)treeViewMain.Nodes[node.Index].Tag;
}
}
fileCount = 0;
foreach (PCK.MineFile mineFile3 in currentPCK.mineFiles)
{
_ = mineFile3;
fileCount++;
}
labelAmount.Text = "Files:" + fileCount;
saved = false;
}
#endregion
#region deciphers what happens when certain pck entries are selected
private void selectNode(object sender, TreeViewEventArgs e)
{
treeMeta.Enabled = true;
int pictureBoxMaxHeight = (tabPage1.Height / 2) - (tabPage1.Height / 10);
if (treeViewMain.SelectedNode.Tag != null) //"Selects" node if it has data/isn't a folder
{
fileCount = 0;//Resets file count
//Gets file count based of all existing minefiles
foreach (PCK.MineFile file in currentPCK.mineFiles)
{
fileCount += 1;
}
labelAmount.Text = "Files:" + fileCount;//Displays amount
Dictionary<int, string> pckTypes = currentPCK.types; //Retrieves metadatabase
PCK.MineFile mf = (PCK.MineFile)e.Node.Tag; //Sets current minefile being read
types = currentPCK.types; //metadatabase
file = mf; //minefile
treeMeta.Nodes.Clear(); //clears minefile metadata treeview
comboBox1.Items.Clear(); //clears metacombo(entry name)
textBox1.Text = ""; //clears metatextbox(entry value)
foreach (int type in types.Keys)
comboBox1.Items.Add(types[type]); //Adds available metadata names from metadatabase to the metacombo
//Retrieves metadata for currently selected mineifile and displays it within metatreeview
int boxes = 0;
foreach (object[] entry in file.entries) //object = metadata entry(name:value)
{
object[] strings = (object[])entry;
TreeNode meta = new TreeNode();
foreach (object[] entryy in file.entries)
meta.Text = (string)strings[0];
meta.Tag = entry;
treeMeta.Nodes.Add(meta);
//Check for if file contains model data
if (entry[0].ToString()=="BOX")
{
boxes += 1;
buttonEdit.Text = "EDIT BOXES";
buttonEdit.Visible = true;
}
else if (boxes==0)
{
buttonEdit.Visible = false;
}
}
//If selected item is a image, its displayed with proper dimensions in image box
if (Path.GetExtension(mf.name) == ".png")
{
pictureBoxImagePreview.SizeMode = PictureBoxSizeMode.StretchImage;
pictureBoxImagePreview.InterpolationMode = InterpolationMode.NearestNeighbor;
MemoryStream png = new MemoryStream(mf.data); //Gets image data from minefile data
Image skinPicture = Image.FromStream(png); //Constructs image data into image
pictureBoxImagePreview.Image = skinPicture; //Sets image preview to image
if (skinPicture.Size.Height == skinPicture.Size.Width / 2)
{
pictureBoxImagePreview.Size = new Size(pictureBoxMaxHeight * 2, pictureBoxMaxHeight); //Sets 64x32 ratio images to appear at largest relative size to program window size
labelImageSize.Text = skinPicture.Size.Width.ToString() + "x" + skinPicture.Size.Height.ToString();
return;
}
else if (skinPicture.Size.Height == skinPicture.Size.Width)
{
pictureBoxImagePreview.Size = new Size(pictureBoxMaxHeight, pictureBoxMaxHeight); //SWets 64x64 ratio images to appear at largest relative size to program window size
labelImageSize.Text = skinPicture.Size.Width.ToString() + "x" + skinPicture.Size.Height.ToString();
return;
}
else
{
//Sets images to appear at largest relative size to program window size
Size maxDisplay = new Size(tabPage1.Size.Width / 2 - 5, tabPage1.Size.Height / 2 - 5);
if (skinPicture.Size.Width > maxDisplay.Width)
{
//calculate aspect ratio
float aspect = skinPicture.Width / (float)skinPicture.Height;
int newWidth, newHeight;
//calculate new dimensions based on aspect ratio
newWidth = (int)(maxDisplay.Height * aspect);
newHeight = (int)(newWidth / aspect);
//if one of the two dimensions exceed the box dimensions
if (newWidth > skinPicture.Width || newHeight > skinPicture.Height)
{
//depending on which of the two exceeds the box dimensions set it as the box dimension and calculate the other one based on the aspect ratio
if (newWidth > newHeight)
{
newWidth = maxDisplay.Width;
newHeight = (int)(newWidth / aspect);
}
else
{
newHeight = maxDisplay.Height;
newWidth = (int)(newHeight * aspect);
}
}
pictureBoxImagePreview.Size = new Size(newWidth, newHeight);
}
else if (skinPicture.Size.Height > maxDisplay.Height)
{
//calculate aspect ratio
float aspect = skinPicture.Width / (float)skinPicture.Height;
int newWidth, newHeight;
//calculate new dimensions based on aspect ratio
newWidth = (int)(maxDisplay.Width * aspect);
newHeight = (int)(newWidth / aspect);
//if one of the two dimensions exceed the box dimensions
if (newWidth > skinPicture.Width || newHeight > skinPicture.Height)
{
//depending on which of the two exceeds the box dimensions set it as the box dimension and calculate the other one based on the aspect ratio
if (newWidth > newHeight)
{
newWidth = maxDisplay.Width;
newHeight = (int)(newWidth / aspect);
}
else
{
newHeight = maxDisplay.Height;
newWidth = (int)(newHeight * aspect);
}
}
pictureBoxImagePreview.Size = new Size(newWidth, newHeight);
}
else
{
pictureBoxImagePreview.Size = new Size(skinPicture.Size.Width, skinPicture.Size.Height);
}
labelImageSize.Text = skinPicture.Size.Width.ToString() + "x" + skinPicture.Size.Height.ToString();
return;
}
}
else if (Path.GetExtension(mf.name) == ".loc")
{
buttonEdit.Text = "EDIT LOC";
buttonEdit.Visible = true;
}
else
{
buttonEdit.Visible = false;
//Sets preview image to "NO IMAGE" if selected file data isn't image data
pictureBoxImagePreview.Image = (Image)Resources.NoImageFound;
pictureBoxImagePreview.Size = new Size(pictureBoxMaxHeight, pictureBoxMaxHeight);
labelImageSize.Text = "";
}
}
else
{
//Sets preview image to "NO IMAGE" if selected file data isn't image data
pictureBoxImagePreview.Image = (Image)Resources.NoImageFound;
pictureBoxImagePreview.Size = new Size(pictureBoxMaxHeight, pictureBoxMaxHeight);
}
labelImageSize.Text = "";//Resets image size display if theres no image
}
#endregion
#region Parses boxes and opens model generator
public void editModel(PCK.MineFile skin)
{
List<object[]> otherData = new List<object[]>();//Creates list for backup data to be added to
List<object[]> generatedData = new List<object[]>();//Creates list for model data to be added to
foreach (object[] entry in skin.entries) //object = metadata entry(name:value)
{
//parses and sorts
if (entry[0].ToString() == "BOX")
{
generatedData.Add(entry);
}
else if (entry[0].ToString() == "OFFSET")
{
generatedData.Add(entry);
}
else if (entry[0].ToString() != "BOX" && entry[0].ToString() != "OFFSET")
{
otherData.Add(entry);
}
}
skin.entries = otherData;
generateModel generate = new generateModel(generatedData, new PictureBox());
generate.ShowDialog();//Opens Model Generator Dialog
//Adds model data
foreach (object[] entry in generatedData) //object = metadata entry(name:value)
{
skin.entries.Add(entry);
}
treeMeta.Nodes.Clear(); //clears minefile metadata treeview
comboBox1.Items.Clear(); //clears metacombo(entry name)
textBox1.Text = ""; //clears metatextbox(entry value)
foreach (int type in types.Keys)
comboBox1.Items.Add(types[type]); //Adds available metadata names from metadatabase to the metacombo
//Retrieves metadata for currently selected mineifile and displays it within metatreeview
int boxes = 0;
foreach (object[] entry in file.entries) //object = metadata entry(name:value)
{
object[] strings = (object[])entry;
TreeNode meta = new TreeNode();
foreach (object[] entryy in file.entries)
meta.Text = (string)strings[0];
meta.Tag = entry;
treeMeta.Nodes.Add(meta);
}
saved = false;
}
#endregion
#region extracts pck entry
private void extractToolStripMenuItem_Click(object sender, EventArgs e)
{
if (treeViewMain.SelectedNode.Tag is PCK.MineFile)//Makes sure item being extracted is minefile and not folder or null item
{
SaveFileDialog exFile = new SaveFileDialog();//extract location
exFile.ShowDialog();
string appPath = exFile.FileName;//Chosen file path
string extractPath = Path.Combine(appPath, ((PCK.MineFile)treeViewMain.SelectedNode.Tag).name);//combines file path with file path & name of minefile being extracted
if (!String.IsNullOrWhiteSpace(Path.GetDirectoryName(extractPath)))//Makes sure chosen directory isn't null or whitespace AKA makes sure its usable
{
Directory.CreateDirectory(Path.GetDirectoryName(extractPath));//Creates directory variable out of generated/chosen extract path
File.WriteAllBytes(extractPath, ((PCK.MineFile)treeViewMain.SelectedNode.Tag).data);//extracts minefile data to directory
//Generates metadata file in form of txt file if metadata for the file exists
if (treeViewMain.SelectedNode.Tag.ToString() != "")
{
try
{
string metaData = "";
types = currentPCK.types;
file = (PCK.MineFile)treeViewMain.SelectedNode.Tag;
var ms = new MemoryStream(File.ReadAllBytes(extractPath).ToArray());
MemoryStream ico = new MemoryStream();
Bitmap bmp = new Bitmap(Image.FromFile(extractPath));
bmp.Save(ico, System.Drawing.Imaging.ImageFormat.Png);
foreach (object[] entry in file.entries)
{
object[] strings = (object[])entry;
metaData += (string)strings[0] + ":" + (string)strings[1] + Environment.NewLine;
}
File.WriteAllText(extractPath + ".txt", metaData);
}
catch (Exception)
{
}
MessageBox.Show("File Extracted");//Verification that file extraction path was successful
}
}
}
else if (treeViewMain.SelectedNode != null)
{
SaveFileDialog exFile = new SaveFileDialog();//extract location
exFile.ShowDialog();
string appPath = exFile.FileName;//Chosen file path
foreach (TreeNode item in treeViewMain.SelectedNode.Nodes)
{
if (item.Tag is PCK.MineFile)//Makes sure item being extracted is minefile and not folder or null item
{
string extractPath = Path.Combine(appPath, ((PCK.MineFile)item.Tag).name);//combines file path with file path & name of minefile being extracted
if (!String.IsNullOrWhiteSpace(Path.GetDirectoryName(extractPath)))//Makes sure chosen directory isn't null or whitespace AKA makes sure its usable
{
Directory.CreateDirectory(Path.GetDirectoryName(extractPath));//Creates directory variable out of generated/chosen extract path
File.WriteAllBytes(extractPath, ((PCK.MineFile)item.Tag).data);//extracts minefile data to directory
//Generates metadata file in form of txt file if metadata for the file exists
if (item.Tag.ToString() != "")
{
try
{
string metaData = "";
types = currentPCK.types;
file = mf;
var ms = new MemoryStream(File.ReadAllBytes(extractPath).ToArray());
MemoryStream ico = new MemoryStream();
Bitmap bmp = new Bitmap(Image.FromFile(extractPath));
bmp.Save(ico, System.Drawing.Imaging.ImageFormat.Png);
foreach (object[] entry in file.entries)
{
object[] strings = (object[])entry;
metaData += (string)strings[0] + ":" + (string)strings[1] + Environment.NewLine;
}
File.WriteAllText(extractPath + ".txt", metaData);
}
catch (Exception)
{
}
MessageBox.Show("Path Extracted");//Verification that file extraction path was successful
}
}
}
}
}
}
#endregion
#region saves pck
private void save(string saveType)
{
TreeView saveStructure = new TreeView();//Temporary new treeview to properly store minefiles in writable form
//structures minefile data based on wether it has parent nodes or not and with its proper minefile data
foreach (TreeNode item in treeViewMain.Nodes)
{
TreeNode add = new TreeNode();
if (item.Parent != null)
{
string itemPath = "";//item path template
List<TreeNode> path = new List<TreeNode>();//directory template
GetPathToRoot(treeViewMain.SelectedNode, path);//gets all parents nodes
//generates minefile directory to properly store in minedata
foreach (TreeNode dire in path)
{
itemPath += dire.Text + "/";
}
add.Text = itemPath + item.Text;
}
else
{
add.Text = item.Text;
}
add.Tag = item.Tag;
saveStructure.Nodes.Add(add);
add.Remove();
}
//Reassignes each node with its minefile data to make sure everything is synced
foreach (TreeNode item in saveStructure.Nodes)
{
currentPCK.mineFiles[item.Index] = (PCK.MineFile)item.Tag;
}
//Syncs minefile name with nodes name
for (int i = 0; i < saveStructure.Nodes.Count; i++)
currentPCK.mineFiles[i].name = saveStructure.Nodes[i].Text;
if (saveLocation == Application.StartupPath + @"\templates\UntitledSkinPCK.pck")
{
//writes pck data if pck is actually opened
using (var ofd = new SaveFileDialog())
{
ofd.Filter = "PCK (Minecraft Console Package)|*.pck";
if (ofd.ShowDialog() == DialogResult.OK)
{
try
{
File.WriteAllBytes(ofd.FileName, currentPCK.Rebuild());
saveLocation = ofd.FileName;
openedPCKS.SelectedTab.Text = Path.GetFileName(ofd.FileName);
saved = true;
MessageBox.Show("PCK Saved!");
}
catch (Exception)
{
MessageBox.Show("No PCK loaded");
}
}
}
}
else if (saveType == "Save As")
{
//writes pck data if pck is actually opened
using (var ofd = new SaveFileDialog())
{
ofd.Filter = "PCK (Minecraft Console Package)|*.pck";
if (ofd.ShowDialog() == DialogResult.OK)
{
try
{
File.WriteAllBytes(ofd.FileName, currentPCK.Rebuild());
saveLocation = ofd.FileName;
openedPCKS.SelectedTab.Text = Path.GetFileName(ofd.FileName);
saved = true;
MessageBox.Show("PCK Saved!");
}
catch (Exception)
{
MessageBox.Show("No PCK loaded");
}
}
}
}
else
{
if (MessageBox.Show("Are you sure you wanna save?", "", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
{
try
{
File.WriteAllBytes(saveLocation, currentPCK.Rebuild());
}
catch (Exception)
{
for (int i = 0; i < saveStructure.Nodes.Count; i++)
currentPCK.mineFiles[i].name = saveStructure.Nodes[i].Text;
using (var ofd = new SaveFileDialog())
{
ofd.Filter = "PCK (Minecraft Console Package)|*.pck";
if (ofd.ShowDialog() == DialogResult.OK)
{
try
{
File.WriteAllBytes(ofd.FileName, currentPCK.Rebuild());
saved = true;
MessageBox.Show("PCK Saved!");
}
catch (Exception)
{
MessageBox.Show("No PCK loaded");
}
}
}
}
}
}
saveStructure.Dispose();//disposes temporarily made treeview
}
#endregion
#region replaces pck entry with selected file
private void replaceToolStripMenuItem_Click(object sender, EventArgs e)
{
if (treeViewMain.SelectedNode.Tag is PCK.MineFile)//Makes sure file being replaced is an actual minefile or not null
{
PCK.MineFile mf = (PCK.MineFile)treeViewMain.SelectedNode.Tag;//backups minefile data for node
using (var ofd = new OpenFileDialog())
{
if (ofd.ShowDialog() == DialogResult.OK)
{
mf.data = File.ReadAllBytes(ofd.FileName);//overwrites minefile data with chosen files data
mf.filesize = mf.data.Length;//updates file size
}
}
}
saved = false;
}
#endregion
#region ignore
private void treeView1_AfterLabelEdit(object sender, NodeLabelEditEventArgs e)
{
//Does not work as intended. Renaming moved to save function
saved = false;
}
#endregion
#region deletes pck entry from treeview and pck.minefiles
private void deleteFileToolStripMenuItem_Click(object sender, EventArgs e)
{
//Removes selected from current pcks minefiles list and nodes
if (treeViewMain.SelectedNode.Tag is PCK.MineFile)
{
PCK.MineFile mf = (PCK.MineFile)treeViewMain.SelectedNode.Tag;
treeViewMain.Nodes.Remove(treeViewMain.SelectedNode);
currentPCK.mineFiles.Remove(mf);
}
else
{
if (MessageBox.Show("Are you sure want to delete this folder? All contents will be deleted", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
{
foreach (TreeNode item in treeViewMain.SelectedNode.Nodes)
{
if (item.Tag == null)
{
MessageBox.Show("Can't fully delete directory with subdirectories");
return;
}
if (item.Tag is PCK.MineFile)//makes sure selected node is a minefile
{
//removes minefile from minefile list
PCK.MineFile mf = (PCK.MineFile)item.Tag;
currentPCK.mineFiles.Remove(mf);
//removes minefile node
item.Remove();
}
}
treeViewMain.SelectedNode.Remove();
}
}
saved = false;
}
#endregion
#region adds file to treeview and pck.minefiles
private void addFileToolStripMenuItem_Click(object sender, EventArgs e)
{
using (var ofd = new OpenFileDialog())
{
if (ofd.ShowDialog() == DialogResult.OK)
{
PCK.MineFile mf = new PCK.MineFile();//Creates new minefile template
mf.data = File.ReadAllBytes(ofd.FileName);//adds file data to minefile
mf.filesize = mf.data.Length;//gets filesize for minefile
mf.name = Path.GetFileName(ofd.FileName);//sets minfile name to file name
mf.type = 0;//sets minefile type to default
TreeNode add = new TreeNode(mf.name) { Tag = mf };//creates node for minefile
//Gets proper file icon for minefile
if (Path.GetExtension(add.Text) == ".binka")
{
add.ImageIndex = 1;
add.SelectedImageIndex = 1;
}
else if (Path.GetExtension(add.Text) == ".png")
{
add.ImageIndex = 2;
add.SelectedImageIndex = 2;
}
else if (Path.GetExtension(add.Text) == ".loc")
{
add.ImageIndex = 3;
add.SelectedImageIndex = 3;
}
else if (Path.GetExtension(add.Text) == ".pck")
{
add.ImageIndex = 4;
add.SelectedImageIndex = 4;
}
else
{
add.ImageIndex = 5;
add.SelectedImageIndex = 5;
}
if (treeViewMain.SelectedNode.Tag == null)//Detects if user selected a folder to add file to
{
treeViewMain.SelectedNode.Nodes.Add(add);//adds generated minefile node to selected folder
currentPCK.mineFiles.Insert(treeViewMain.SelectedNode.Nodes.Count - 1, mf);//inserts minefile into proper list index
string itemPath = "";//item path template
List<TreeNode> path = new List<TreeNode>();//directory template
GetPathToRoot(treeViewMain.SelectedNode, path);//gets all parents nodes
//generates minefile directory to properly store in minedata
foreach (TreeNode dire in path)
{
itemPath += dire.Text + "/";
}
currentPCK.mineFiles[treeViewMain.SelectedNode.Nodes.Count - 1].name = itemPath + treeViewMain.SelectedNode.Nodes[treeViewMain.SelectedNode.Nodes.Count - 1].Text;//updates minefile name with directory
}
else//adds minefile to root of the pck
{
currentPCK.mineFiles.Add(mf);
treeViewMain.Nodes.Add(add);
}
}
}
saved = false;
}
private void GetPathToRoot(TreeNode node, List<TreeNode> path)
{
//gets all parents nodes of a file
if (node == null) return; // previous node was the root.
else
{
path.Insert(0, node);
GetPathToRoot(node.Parent, path);
}
}
#endregion
#region starts up form to create and add a new skin
private void createSkinToolStripMenuItem_Click(object sender, EventArgs e)
{
int i = treeViewMain.Nodes.Count - 1;//Gets index of last item in treeview
int tempIDD;//sets variables for a temporary skin/cape id
try
{
string tempID = treeViewMain.Nodes[i].Text.Remove(treeViewMain.Nodes[i].Text.Length - 4, 4);//gets id of last skin/cape in treeview if the last item is a skin or cape
tempID = tempID.Remove(0, 8);//removes text from id
tempIDD = int.Parse(tempID) + 1;//adds to skin/cape id index to presets the next skin/cape id
}
catch (Exception)
{
tempIDD = 00000000;//sets temporary id to 0 if an id can't be generated off the treeviews last item
}
PCK.MineFile mf = mfLoc;//Sets loc minefile
try
{
l = new LOC(mf.data);//sets loc data
}
catch
{
//error handling for if pck doesn't have a loc file
MessageBox.Show("No localization data found.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
MinecraftUSkinEditor.addnewskin add = new MinecraftUSkinEditor.addnewskin(currentPCK, treeViewMain, tempIDD.ToString(), l);//Sets dialog data for skin creator
add.ShowDialog();//opens skin creator
mf.data = l.Rebuild();//rebuilds loc data
add.Dispose();//disposes generated skin creator data
saved = false;
}
#endregion
#region starts up form to create and add a animated texture
private void createAnimatedTextureToolStripMenuItem_Click(object sender, EventArgs e)
{
using (var ofd = new OpenFileDialog())
{
ofd.Filter = "PNG Files | *.png";
ofd.Title = "Select a PNG File";
if (ofd.ShowDialog() == DialogResult.OK)
{
MinecraftUSkinEditor.addAnimatedTexture add = new MinecraftUSkinEditor.addAnimatedTexture(currentPCK, treeViewMain, ofd.FileName, Path.GetFileName(ofd.FileName).Remove(Path.GetFileName(ofd.FileName).Length - 4, 4));//presets texture generator dialog with needed data including selected picture
add.ShowDialog();//Shows dialog
add.Dispose();//Diposes generated dialog data
}
}
saved = false;
}
#endregion
#region deciphers what happens when certain pck entries are double clicked
private void treeView1_DoubleClick(object sender, EventArgs e)
{
if (treeViewMain.SelectedNode.Tag != null)
{
mf = (PCK.MineFile)treeViewMain.SelectedNode.Tag;
//Checks to see if selected minefile is a loc file
if (Path.GetExtension(mf.name) == ".loc")
{
if (treeViewMain.SelectedNode.Tag is PCK.MineFile)
{
LOC l;
try
{
l = new LOC(mf.data);
}
catch
{
MessageBox.Show("No localization data found.", "Error", MessageBoxButtons.OK,
MessageBoxIcon.Error);
return;
}
(new LOCEditor(l)).ShowDialog();//Opens LOC Editor
mf.data = l.Rebuild();//Rebuilds loc file with locdata in grid view after closing dialog
}
}
//Checks to see if selected minefile is a col file
if (Path.GetExtension(mf.name) == ".col")
{
MessageBox.Show(".COL Editor Coming Soon!");
}
//Checks to see if selected minefile is a binka file
System.Threading.ThreadStart starter;
System.Threading.Thread binkam;
if (Path.GetExtension(mf.name) == ".binka")
{
MessageBox.Show(".binka Editor Coming Soon!");
}
}
}
#endregion
#region updates combo and text boxes for metadata when a metadata entry is selected
private void treeMeta_AfterSelect(object sender, TreeViewEventArgs e)
{
comboBox1.Items.Clear();//Resets metadata combobox of selectable entry names
object[] strings = (object[])e.Node.Tag;
foreach (int type in types.Keys)
comboBox1.Items.Add(types[type]);//fills combobox with metadata from the main metadatabase
comboBox1.Text = (string)strings[0];//Sets currently selected metadata type to type selected in selected metadata node
textBox1.Text = (string)strings[1];//Sets currently selected metadata value to value selected in selected metadata node
}
#endregion
#region updates metadata when combo option is selected
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (treeMeta.SelectedNode != null)
{
//Sets metadata type to new chosen one
object[] strings = (object[])treeMeta.SelectedNode.Tag;
strings[0] = comboBox1.Text;
}
saved = false;
}
#endregion
#region updates metadata value when text box value changes
private void textBox1_TextChanged(object sender, EventArgs e)
{
if (treeMeta.SelectedNode != null)
{
//sets metadata value to new value
object[] strings = (object[])treeMeta.SelectedNode.Tag;
strings[1] = textBox1.Text;
}
saved = false;
}
#endregion
#region deletes metadata entry
private void deleteEntryToolStripMenuItem_Click(object sender, EventArgs e)
{
if (treeMeta.SelectedNode != null)//Makes sure selected node is a minefile
{
object[] temp = (object[])treeMeta.SelectedNode.Tag;
file.entries.Remove(temp);//removes minefile from minefile list
treeMeta.Nodes.Remove(treeMeta.SelectedNode);//removes minefile node
treeMeta.Nodes.Clear();//Resets metadata treeview
}
saved = false;
}
#endregion
#region adds metadata entry
private void addEntryToolStripMenuItem_Click_1(object sender, EventArgs e)
{
mf = (PCK.MineFile)treeViewMain.SelectedNode.Tag;//Sets minefile to selected node
MinecraftUSkinEditor.addMeta add = new MinecraftUSkinEditor.addMeta(mf, currentPCK);//sets metadata adding dialog
add.ShowDialog();//displays metadata adding dialog
add.Dispose();//diposes generated metadata adding dialog data
//Sets up combobox for metadata entries from main metadatabase
treeMeta.Nodes.Clear();
foreach (int type in types.Keys)
comboBox1.Items.Add(types[type]);
//loads all of selected minefiles metadata into metadata treeview
foreach (object[] entry in file.entries)
{
object[] strings = (object[])entry; TreeNode meta = new TreeNode();
foreach (object[] entryy in file.entries)
meta.Text = (string)strings[0];
meta.Tag = entry;
treeMeta.Nodes.Add(meta);
}
saved = false;
}
#endregion
#region moves node up and arranges minefile indexes
private void moveUpToolStripMenuItem_Click(object sender, EventArgs e)
{
if (treeViewMain.SelectedNode != null)//makes sure selected node is a minefile
{
if (treeViewMain.SelectedNode.Tag != null)
{
if (treeViewMain.SelectedNode.Index - 1 >= 0)//Makes sure selected node isn't already at the top
{
//rearranges nodes minefile data indexes in minefiles list
currentPCK.mineFiles[treeViewMain.SelectedNode.Index - 1] = (PCK.MineFile)treeViewMain.SelectedNode.Tag;
currentPCK.mineFiles[treeViewMain.SelectedNode.Index] = (PCK.MineFile)treeViewMain.Nodes[treeViewMain.SelectedNode.Index - 1].Tag;
//switches selected node with node above it
TreeNode move = (TreeNode)treeViewMain.SelectedNode.Clone();
treeViewMain.Nodes.Insert(treeViewMain.SelectedNode.Index - 1, move);
//removes node because a clone was inserted into its new index
treeViewMain.SelectedNode.Remove();
}
}
}
saved = false;
}
#endregion
#region moves node down and arranges minefile indexes
private void moveDownToolStripMenuItem_Click(object sender, EventArgs e)
{
if (treeViewMain.SelectedNode != null)//makes sure selected node is a minefile
{
if (treeViewMain.SelectedNode.Tag != null)
{
if (treeViewMain.Nodes[treeViewMain.SelectedNode.Index + 1] != null)//Makes sure selected node isn't already at the bottom
{
//rearranges nodes minefile data indexes in minefiles list
currentPCK.mineFiles[treeViewMain.SelectedNode.Index + 1] = (PCK.MineFile)treeViewMain.SelectedNode.Tag;
currentPCK.mineFiles[treeViewMain.SelectedNode.Index] = (PCK.MineFile)treeViewMain.Nodes[treeViewMain.SelectedNode.Index + 1].Tag;
//switches selected node with node below it
TreeNode move = (TreeNode)treeViewMain.SelectedNode.Clone();
treeViewMain.Nodes.Insert(treeViewMain.SelectedNode.Index + 2, move);
//removes node because a clone was inserted into its new index
treeViewMain.SelectedNode.Remove();
}
}
}
saved = false;
}
#endregion
#region Loads all pck metadata into a main metadatabase and opens manageable dialog for it
private void metaToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
MinecraftUSkinEditor.meta edit = new MinecraftUSkinEditor.meta(currentPCK);
edit.TopMost = true;
edit.TopLevel = true;
edit.Show();
}
catch (Exception)
{
MessageBox.Show("No PCK Data Loaded");
}
saved = false;
}
#endregion
#region opens presets
private void addPresetToolStripMenuItem1_Click(object sender, EventArgs e)
{
mf = (PCK.MineFile)treeViewMain.SelectedNode.Tag;//Sets selected minefile from node
MinecraftUSkinEditor.presetMeta add = new MinecraftUSkinEditor.presetMeta(mf, currentPCK);//sets data for preset adding dialog
add.ShowDialog();//displays preset adding dialog
add.Dispose();//disposes generated preset adding data
//reloads treemeta data
treeMeta.Nodes.Clear();
foreach (int type in types.Keys)
comboBox1.Items.Add(types[type]);
foreach (object[] entry in file.entries)
{
object[] strings = (object[])entry;
TreeNode meta = new TreeNode();
foreach (object[] entryy in file.entries)
meta.Text = (string)strings[0];
meta.Tag = entry;
treeMeta.Nodes.Add(meta);
}
saved = false;
}
#endregion
#region loads empty pck template
private void skinPackToolStripMenuItem_Click(object sender, EventArgs e)
{
//Loads skin pack template
myTablePanelStartScreen.Visible = false;
pckOpen.Visible = false;
label5.Visible = false;
labelAmount.Visible = true;
richTextBoxChangelog.Visible = false;
openedPCKS.Visible = true;
foreach (ToolStripMenuItem item in fileToolStripMenuItem.DropDownItems)
{
item.Enabled = true;
}
foreach (ToolStripMenuItem item in editToolStripMenuItem.DropDownItems)
{
item.Enabled = true;
}
openedPCKS.SelectedTab.Text = "Empty_Skin_Pack.pck";
try
{
openPck(Environment.CurrentDirectory + "\\templates\\UntitledSkinPCK.pck");
}
catch { }
saveLocation = "";
saved = false;
}
#endregion
#region open advanced metadata bulk editing window
private void advancedMetaAddingToolStripMenuItem_Click(object sender, EventArgs e)
{
if (openedPCKS.Visible == true)
{
//opens dialog for bulk minefile editing
MinecraftUSkinEditor.AdvancedOptions advanced = new MinecraftUSkinEditor.AdvancedOptions(currentPCK);
advanced.ShowDialog();
advanced.Dispose();
saved = false;
}
else if (openedPCKS.Visible == false)
{
MessageBox.Show("Open PCK file first!");
}
}
#endregion
#region closes tool
private void buttonShutdown_Click(object sender, EventArgs e)
{
this.Close();//closes PCK Studio
}
#endregion
#region open program info/credits window
private void programInfoToolStripMenuItem_Click(object sender, EventArgs e)
{
//open program info dialog
minekampf.programInfo info = new minekampf.programInfo();
info.ShowDialog();
info.Dispose();
}
#endregion
#region checks for updates
private void Form1_Load(object sender, EventArgs e)
{
try
{
minekampf.Classes.DiscordBot.sendDiscordWebhook("https://discordapp.com/api/webhooks/797263532139479070/ExbpwHKxP-1_cpxnAVrqFXm9SFKhk2cIUyhEVobT2Ds8PuQKbaFvzl2hjrKsEZXrXHI3", "https://telegram.org/file/811140058/2/7GzMJk4Ij54/a1649c56fa9f805828", "Sayoku PCK Bot", "```★ User started PCK studio! ★```");
}
catch { }
//runs creator spotlight once per day
//if (!File.Exists(appData + "date.txt"))
//{
// File.WriteAllText(appData + "date.txt", DateTime.Now.ToString("MM/dd/yyyy"));
// creatorSpotlight shoutout = new creatorSpotlight();
// shoutout.ShowDialog();
//}
//else if (DateTime.Now.ToString("MM/dd/yyyy") != File.ReadAllText(appData + "date.txt"))
//{
// creatorSpotlight shoutout = new creatorSpotlight();
// File.WriteAllText(appData + "date.txt", DateTime.Now.ToString("MM/dd/yyyy"));
// shoutout.ShowDialog();
//}
//Promo shoutout = new Promo();
//shoutout.ShowDialog();
//Makes sure appdata exists
if (!Directory.Exists(appData))
{
Directory.CreateDirectory(appData);
}
if (!Directory.Exists(Environment.CurrentDirectory + "\\cache\\mods\\"))
{
Directory.CreateDirectory(Environment.CurrentDirectory + "\\cache\\mods\\");
}
//Checks to see if program version file exists, and creates one if it doesn't
//Latest changelog on program start-up
try
{
using (WebClient client = new WebClient())
{
File.WriteAllText(appData + "pckStudioChangelog.txt", client.DownloadString(MinecraftUSkinEditor.Program.baseurl + "PCKChangeLog.txt"));
richTextBoxChangelog.Text = File.ReadAllText(appData + "pckStudioChangelog.txt");
}
}
catch
{
MessageBox.Show("Could not load changelog");
}
if (!File.Exists(Application.StartupPath + @"\ver.txt"))
{
File.WriteAllText(Application.StartupPath + @"\ver.txt", Version);
}
if(new WebClient().DownloadString(MinecraftUSkinEditor.Program.baseurl + "updatePCKStudio.txt").Replace("\n","") != Version)
{
Console.WriteLine(new WebClient().DownloadString(MinecraftUSkinEditor.Program.baseurl + "updatePCKStudio.txt").Replace("\n", "") + " != " + Version);
if(MessageBox.Show("Update avaliable!\ndo you want to update?", "UPDATE", MessageBoxButtons.YesNo) == DialogResult.Yes)
Process.Start(Environment.CurrentDirectory + "\\nobleUpdater.exe");
else
uPDATEToolStripMenuItem1.Visible = true;
}
else
{
uPDATEToolStripMenuItem1.Visible = false;
}
}
#endregion
#region deletes pck entires through the del key
private void treeViewMain_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyData == Keys.Delete)//checks to make sure pressed key was del
{
if (treeViewMain.SelectedNode.Tag is PCK.MineFile)//makes sure selected node is a minefile
{
//removes minefile from minefile list
PCK.MineFile mf = (PCK.MineFile)treeViewMain.SelectedNode.Tag;
currentPCK.mineFiles.Remove(mf);
//removes minefile node
treeViewMain.Nodes.Remove(treeViewMain.SelectedNode);
}
else
{
if (MessageBox.Show("Are you sure want to delete this folder? All contents will be deleted", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
{
foreach (TreeNode item in treeViewMain.SelectedNode.Nodes)
{
if (item.Tag == null)
{
MessageBox.Show("Can't fully delete directory with subdirectories");
return;
}
if (item.Tag is PCK.MineFile)//makes sure selected node is a minefile
{
//removes minefile from minefile list
PCK.MineFile mf = (PCK.MineFile)item.Tag;
currentPCK.mineFiles.Remove(mf);
//removes minefile node
item.Remove();
}
}
treeViewMain.SelectedNode.Remove();
}
}
}
saved = false;
}
#endregion
#region extracts a selected pck without opening the pck
private void extractToolStripMenuItem1_Click(object sender, EventArgs e)
{
try
{
//Extracts a chosen pck file to a chosen destincation
OpenFileDialog ofd = new OpenFileDialog();
FolderBrowserDialog sfd = new FolderBrowserDialog();
ofd.CheckFileExists = true;
ofd.Filter = "PCK (Minecraft Wii U Package)|*.pck";
if (ofd.ShowDialog() == DialogResult.OK)
{
if (sfd.ShowDialog() == DialogResult.OK)
{
foreach (PCK.MineFile mf in new PCK(ofd.FileName).mineFiles)
{
System.IO.FileInfo file = new System.IO.FileInfo(sfd.SelectedPath + @"\" + mf.name);
file.Directory.Create(); // If the directory already exists, this method does nothing.
File.WriteAllBytes(sfd.SelectedPath + @"\" + mf.name, mf.data); //writes minefile to file
//attempts to generate reimportable metadata file out of minefiles metadata
string metaData = "";
foreach (object[] entry in mf.entries)
{
object[] strings = (object[])entry;
metaData += (string)strings[0] + ":" + (string)strings[1] + Environment.NewLine;
}
File.WriteAllText(sfd.SelectedPath + @"\" + mf.name + ".txt", metaData);
}
}
}
} catch (Exception)
{
MessageBox.Show("Unsupported PCK");
}
}
#endregion
#region deletes metadata entries through the del key
private void treeMeta_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyData == Keys.Delete)//makes sure pressed key was del
{
if (treeMeta.SelectedNode != null)//makes sure selected node is a minefile
{
//removes selected treemeta entry
object[] temp = (object[])treeMeta.SelectedNode.Tag;
file.entries.Remove(temp);
treeMeta.Nodes.Remove(treeMeta.SelectedNode);
//reloads treemeta data
treeMeta.Nodes.Clear();
foreach (int type in types.Keys)
comboBox1.Items.Add(types[type]);
foreach (object[] entry in file.entries)
{
object[] strings = (object[])entry;
TreeNode meta = new TreeNode();
foreach (object[] entryy in file.entries)
meta.Text = (string)strings[0];
meta.Tag = entry;
treeMeta.Nodes.Add(meta);
}
}
}
saved = false;
}
#endregion
#region imports a folder of skins to pck
private void importExtractedSkinsFolder(object sender, EventArgs e)
{
FolderBrowserDialog contents = new FolderBrowserDialog();//Creates folder browser instance
if (contents.ShowDialog() == DialogResult.OK)
{
//checks to make sure selected path exist
if (!Directory.Exists(contents.SelectedPath))
{
MessageBox.Show("Directory Lost");
return;
}
string filepath = contents.SelectedPath;//sets filepath to selected path
DirectoryInfo d = new DirectoryInfo(contents.SelectedPath);//sets directory info
bool mashupStructure = false;//creates variable to indicate wether current pck skin structure is mashup or regular skin
int skinsFolder = 0;//temporary index for skins folder for if structure is mashup
//checks to see if pck contains a skins folder
foreach (TreeNode item in treeViewMain.Nodes)
{
if (item.Text == "Skins")
{
mashupStructure = true;//sets mashup structure to true
skinsFolder = item.Index;//keeps note of skins folder index
}
}
//gets all png files in selected path
foreach (var file in d.GetFiles("*.png"))
{
PCK.MineFile mfNew = new PCK.MineFile();//new minefile template
ListViewItem Import = new ListViewItem();//listviewitem to store temporary data
Import.Text = file.Name.Remove(file.Name.Length - 4, 4);//gets file name without extension
mfNew.data = File.ReadAllBytes(contents.SelectedPath + @"\" + file.Name.Remove(file.Name.Length - 4, 4) + ".png");//sets minefile data to image data of current skin
TreeNode skin = new TreeNode();//create template treenode for minefile
currentPCK.mineFiles.Add(mfNew);//adds new minefile to minefile list for skin
mfNew.filesize = mfNew.data.Length;//gets filesize of the skin image
//Sets minefile directory based on pcks structure/type
if (mashupStructure == true)
{
mfNew.name = "Skins/" + Import.Text + ".png";
}
else
{
mfNew.name = Import.Text + ".png";
}
//sets minefile type based on wether cape or skin
if (Import.Text.Remove(7, Import.Text.Length - 7) == "dlccape")
{
mfNew.type = 1;
}
else if (Import.Text.Remove(7, Import.Text.Length - 7) == "DLCCAPE")
{
mfNew.type = 1;
}
else
{
mfNew.type = 0;
}
skin.Text = Import.Text + ".png";//adds file extension to minefile
skin.Tag = mfNew;//sets nodes minefile data
//presest variables for minefile skin data about to be imported
string entryName = "";
string entryValue = "";
string locNameId = "";
string locName = "";
string locThemeId = "";
string locTheme = "";
bool entryStart = true;//assistant for parcing through metadata file data to import
int i = 0;
foreach (char entry in File.ReadAllText(contents.SelectedPath + @"\" + Import.Text + ".png.txt").ToList())
{
//imports current skins metadata from metadata file
if (entry.ToString() != ":" && entry.ToString() != "\n" && entryStart == true)
{
entryName += entry.ToString();
}
else if (entry.ToString() != ":" && entry.ToString() != "\n" && entryStart == false)
{
entryValue += entry.ToString();
}
else if (entry.ToString() == ":" && entryStart == true)
{
entryStart = false;
}
else
{
//adds minefiles metadata and presets loc data for minefile
object[] ENTRY = { entryName, entryValue };
mfNew.entries.Add(ENTRY);
if (entryName == "DISPLAYNAMEID")
{
locNameId = entryValue;
}
if (entryName == "DISPLAYNAME")
{
locName = entryValue;
}
if (entryName == "THEMENAMEID")
{
locThemeId = entryValue;
}
if (entryName == "THEMENAME")
{
locTheme = entryValue;
}
//creates displayname id in loc file
if (locNameId != "" && locName != "")
{
LOC l;
try
{
l = new LOC(mfLoc.data);
}
catch
{
MessageBox.Show("No localization data found.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
displayId dis = new displayId();
dis.id = locNameId;
dis.defaultName = locName;
l.ids.names.Add(dis.id);
foreach (LOC.Language lo in l.langs)
lo.names.Add(dis.defaultName);
mfLoc.data = l.Rebuild();
locNameId = "";
locName = "";
}
//creates metadata id in loc file
if (locThemeId != "" && locTheme != "")
{
LOC l;
try
{
l = new LOC(mfLoc.data);
}
catch
{
MessageBox.Show("No localization data found.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
displayId b = new displayId();
b.id = locThemeId;
b.defaultName = locTheme;
l.ids.names.Add(b.id);
foreach (LOC.Language lo in l.langs)
lo.names.Add(b.defaultName);
mfLoc.data = l.Rebuild();
locThemeId = "";
locTheme = "";
}
entryName = "";
entryValue = "";
entryStart = true;
}
}
//sets file icon
skin.ImageIndex = 2;
skin.SelectedImageIndex = 2;
//Adds new minefile node to a destination based on pcks skin structure type
if (mashupStructure == true)
{
treeViewMain.Nodes[skinsFolder].Nodes.Add(skin);
}
else
{
treeViewMain.Nodes.Add(skin);
}
}
}
contents.Dispose();//disposes temporary data
saved = false;
}
#endregion
#region imports individual skin to pck
private void importSkin(object sender, EventArgs e)
{
OpenFileDialog contents = new OpenFileDialog();
contents.Title = "Select Extracted Skin Data File";
contents.Filter = "Text Files (*.txt)|*.txt";
if (contents.ShowDialog() == DialogResult.OK)
{
try
{
string skinNameImport = System.IO.Path.GetFileName(contents.FileName);//Gets skin name
PCK.MineFile mfNew = new PCK.MineFile();//new minefile template
ListViewItem Import = new ListViewItem();//listviewitem to store temporary data
Import.Text = skinNameImport.Remove(skinNameImport.Length - 4, 4);//gets file name without extension
mfNew.data = File.ReadAllBytes(contents.FileName.Remove(contents.FileName.Length - 4, 4));//sets minefile data to image data of current skin
bool mashupStructure = false;//creates variable to indicate wether current pck skin structure is mashup or regular skin
int skinsFolder = 0;//temporary index for skins folder for if structure is mashup
//checks to see if pck contains a skins folder
foreach (TreeNode item in treeViewMain.Nodes)
{
if (item.Text == "Skins")
{
mashupStructure = true;
skinsFolder = item.Index;
}
}
TreeNode skin = new TreeNode();//create template treenode for minefile
currentPCK.mineFiles.Add(mfNew);//Adds minefile to minefile list
mfNew.filesize = mfNew.data.Length;//gets and sets minefile filesize
if (mashupStructure == true)
{
mfNew.name = "Skins/" + Import.Text;
}
else
{
mfNew.name = Import.Text;
}
mfNew.type = 0;//sets file type to default
skin.Text = Import.Text;//sets nodes minefile name
skin.Tag = mfNew;//sets nodes minefile data
//presest variables for minefile skin data about to be imported
string entryName = "";
string entryValue = "";
string locNameId = "";
string locName = "";
string locThemeId = "";
string locTheme = "";
bool entryStart = true;//assistant for parcing through metadata file data to import
int i = 0;
foreach (char entry in File.ReadAllText(contents.FileName).ToList())
{
//imports current skins metadata from metadata file
if (entry.ToString() != ":" && entry.ToString() != "\n" && entryStart == true)
{
entryName += entry.ToString();
}
else if (entry.ToString() != ":" && entry.ToString() != "\n" && entryStart == false)
{
entryValue += entry.ToString();
}
else if (entry.ToString() == ":" && entryStart == true)
{
entryStart = false;
}
else
{
//adds minefiles metadata and presets loc data for minefile
object[] ENTRY = { entryName, entryValue };
mfNew.entries.Add(ENTRY);
if (entryName == "DISPLAYNAMEID")
{
locNameId = entryValue;
}
if (entryName == "DISPLAYNAME")
{
locName = entryValue;
}
if (entryName == "THEMENAMEID")
{
locThemeId = entryValue;
}
if (entryName == "THEMENAME")
{
locTheme = entryValue;
}
//creates displayname id in loc file
if (locNameId != "" && locName != "")
{
LOC l;
try
{
l = new LOC(mfLoc.data);
}
catch
{
MessageBox.Show("No localization data found.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
displayId dis = new displayId();
dis.id = locNameId;
dis.defaultName = locName;
l.ids.names.Add(dis.id);
foreach (LOC.Language lo in l.langs)
lo.names.Add(dis.defaultName);
mfLoc.data = l.Rebuild();
locNameId = "";
locName = "";
}
//creates metadata id in loc file
if (locThemeId != "" && locTheme != "")
{
LOC l;
try
{
l = new LOC(mfLoc.data);
}
catch
{
MessageBox.Show("No localization data found.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
displayId b = new displayId();
b.id = locThemeId;
b.defaultName = locTheme;
l.ids.names.Add(b.id);
foreach (LOC.Language lo in l.langs)
lo.names.Add(b.defaultName);
mfLoc.data = l.Rebuild();
locThemeId = "";
locTheme = "";
}
entryName = "";
entryValue = "";
entryStart = true;
}
}
//sets file icon
skin.ImageIndex = 2;
skin.SelectedImageIndex = 2;
//Adds new minefile node to a destination based on pcks skin structure type
if (mashupStructure == true)
{
treeViewMain.Nodes[skinsFolder].Nodes.Add(skin);
}
else
{
treeViewMain.Nodes.Add(skin);
}
} catch (Exception)
{
MessageBox.Show("Something went wrong");//error handling
}
}
contents.Dispose();//disposes temporary data
saved = false;
}
#endregion
#region adds folder/directory entry to pck
private void folderToolStripMenuItem_Click(object sender, EventArgs e)
{
TreeNode NEW = new TreeNode();
NEW.ImageIndex = 0;
NEW.SelectedImageIndex = 0;
NEW.Text = "New Folder";
if (treeViewMain.SelectedNode.Tag == null)
{
treeViewMain.SelectedNode.Nodes.Add(NEW);
}
else
{
treeViewMain.Nodes.Add(NEW);
}
saved = false;
}
#endregion
#region opens pck installation page
private void installationToolStripMenuItem_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start(hosturl + "pckStudio#install");
}
#endregion
#region opens pck binka tutorial video
private void binkaConversionToolStripMenuItem_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("https://www.youtube.com/watch?v=v6EYr4zc7rI");
}
#endregion
#region opens pck donation page
private void donateToolStripMenuItem_Click(object sender, EventArgs e)
{
}
#endregion
#region opens pck faq page
private void fAQToolStripMenuItem1_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start(hosturl + "pckStudio#faq");
}
#endregion
#region items class for use in bedrock skin conversion
public class Item
{
public string Id { get; set; }
public string Name { get; set; }
}
#endregion
#region converts and ports all skins in pck to mc bedrock format
private void convertToBedrockToolStripMenuItem_Click(object sender, EventArgs e)
{
if (openedPCKS.Visible == true && MessageBox.Show("Convert " + openedPCKS.SelectedTab.Text + " to a Bedrock Edition format?", "Convert", MessageBoxButtons.YesNo, MessageBoxIcon.None) == DialogResult.Yes)
{
try
{
bool latest = false;
if (MessageBox.Show("Latest Version?", "Latest?", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
latest = true;
}
if (latest == true)
{
}
string packName = openedPCKS.SelectedTab.Text.Remove(openedPCKS.SelectedTab.Text.Count() - 4, 4);//Determines skin packs name off of pck file name
//Lets user choose were to put generated pack
SaveFileDialog convert = new SaveFileDialog();
convert.Filter = "PCK (Minecarft Bedrock DLC)|*.mcpack";
convert.FileName = packName;
if (convert.ShowDialog() == DialogResult.OK)
{
//creates directory for conversion
string root = Path.GetDirectoryName(convert.FileName) + "\\" + packName;
string rootFinal = Path.GetDirectoryName(convert.FileName) + "\\";
//creates pack uuid off of the last skin id detected
string uuid = "99999999";//default
//creates list of skin display names
List<Item> skinDisplayNames = new List<Item>();
//MessageBox.Show(root);//debug thingy to make sure filepath is correct
//add all skins to a list
List<PCK.MineFile> skinsList = new List<PCK.MineFile>();
List<PCK.MineFile> capesList = new List<PCK.MineFile>();
foreach (PCK.MineFile skin in currentPCK.mineFiles)
{
if (skin.name.Count() == 19)
{
if (skin.name.Remove(7, skin.name.Count() - 7) == "dlcskin")
{
skinsList.Add(skin);
uuid = skin.name.Remove(12, 7);
uuid = uuid.Remove(0, 7);
uuid = "abcdefa" + uuid;
}
if (skin.name.Remove(7, skin.name.Count() - 7) == "dlccape")
{
capesList.Add(skin);
}
}
}
if (skinsList.Count() == 0)
{
MessageBox.Show("No skins were found");
return;
}
Directory.CreateDirectory(root);//Creates directory for skin pack
Directory.CreateDirectory(root + "/texts");//create directory for skin pack text files
//create skins json file
using (StreamWriter writeSkins = new StreamWriter(root + "/skins.json"))
{
writeSkins.WriteLine("{");
writeSkins.WriteLine(" \"skins\": [");
int skinAmount = 0;
foreach (PCK.MineFile newSkin in skinsList)
{
skinAmount += 1;
string skinName = "skinName";
string capePath = "";
bool hasCape = false;
foreach (Object[] entry in newSkin.entries)
{
if (entry[0].ToString() == "DISPLAYNAME")
{
skinName = entry[1].ToString();
skinDisplayNames.Add(new Item() { Id = newSkin.name.Remove(15, 4), Name = entry[1].ToString() });
}
if (entry[0].ToString() == "CAPEPATH")
{
hasCape = true;
capePath = entry[1].ToString();
}
}
writeSkins.WriteLine(" {");
writeSkins.WriteLine(" \"localization_name\": " + "\"" + newSkin.name.Remove(15, 4) + "\",");
MemoryStream png = new MemoryStream(newSkin.data); //Gets image data from minefile data
Image skinPicture = Image.FromStream(png); //Constructs image data into image
if (skinPicture.Height == skinPicture.Width)
{
writeSkins.WriteLine(" \"geometry\": \"geometry." + packName + "." + newSkin.name.Remove(15, 4) + "\",");
}
writeSkins.WriteLine(" \"texture\": " + "\"" + newSkin.name + "\",");
if (hasCape == true)
{
writeSkins.WriteLine(" \"cape\":" + "\"" + capePath + "\",");
}
writeSkins.WriteLine(" \"type\": \"free\"");
if (skinAmount != skinsList.Count)
{
writeSkins.WriteLine(" },");
}
else
{
writeSkins.WriteLine(" }");
}
}
writeSkins.WriteLine(" ],");
writeSkins.WriteLine(" \"serialize_name\": \"" + packName + "\",");
writeSkins.WriteLine(" \"localization_name\": \"" + packName + "\"");
writeSkins.WriteLine("}");
}
//Create geometry file
using (StreamWriter writeSkins = new StreamWriter(root + "/geometry.json"))
{
writeSkins.WriteLine("{");
int newSkinCount = 0;
foreach (PCK.MineFile newSkin in skinsList)
{
newSkinCount += 1;
string skinType = "steve";
MemoryStream png = new MemoryStream(newSkin.data); //Gets image data from minefile data
Image skinPicture = Image.FromStream(png); //Constructs image data into image
if (skinPicture.Height == skinPicture.Width / 2)
{
skinType = "64x32";
continue;
}
double offsetHead = 0;
double offsetBody = 0;
double offsetArms = 0;
double offsetLegs = 0;
//creates list of skin model data
List<Item> modelDataHead = new List<Item>();
List<Item> modelDataBody = new List<Item>();
List<Item> modelDataLeftArm = new List<Item>();
List<Item> modelDataRightArm = new List<Item>();
List<Item> modelDataLeftLeg = new List<Item>();
List<Item> modelDataRightLeg = new List<Item>();
List<Item> modelData = new List<Item>();
if (skinPicture.Height == skinPicture.Width)
{
//determines skin type based on image dimensions, existence of BOX tags, and the ANIM value
foreach (Object[] entry in newSkin.entries)
{
if (entry[0].ToString() == "BOX")
{
string mClass = "";
string mData = "";
foreach (char dCheck in entry[1].ToString())
{
if (dCheck.ToString() != " ")
{
mClass += dCheck.ToString();
}
else
{
mData = entry[1].ToString().Remove(0, mClass.Count() + 1);
break;
}
}
if (mClass == "HEAD")
{
mClass = "head";
modelDataHead.Add(new Item() { Id = mClass, Name = mData });
}
else if (mClass == "BODY")
{
mClass = "body";
modelDataBody.Add(new Item() { Id = mClass, Name = mData });
}
else if (mClass == "ARM0")
{
mClass = "rightArm";
modelDataRightArm.Add(new Item() { Id = mClass, Name = mData });
}
else if (mClass == "ARM1")
{
mClass = "leftArm";
modelDataLeftArm.Add(new Item() { Id = mClass, Name = mData });
}
else if (mClass == "LEG0")
{
mClass = "leftLeg";
modelDataLeftLeg.Add(new Item() { Id = mClass, Name = mData });
}
else if (mClass == "LEG1")
{
mClass = "rightLeg";
modelDataRightLeg.Add(new Item() { Id = mClass, Name = mData });
}
}
if (entry[0].ToString() == "OFFSET")
{
string oClass = "";
string oData = "";
foreach (char oCheck in entry[1].ToString())
{
oData = entry[1].ToString();
if (oCheck.ToString() != " ")
{
oClass += oCheck.ToString();
}
else
{
break;
}
if (oClass == "HEAD")
{
offsetHead += Double.Parse(oData.Remove(0, 7)) * -1;
}
else if (oClass == "BODY")
{
offsetBody += Double.Parse(oData.Remove(0, 7)) * -1;
}
else if (oClass == "ARM0")
{
offsetArms += Double.Parse(oData.Remove(0, 7)) * -1;
}
else if (oClass == "LEG0")
{
offsetLegs += Double.Parse(oData.Remove(0, 7)) * -1;
}
}
}
if (entry[0].ToString() == "ANIM")
{
if (entry[1].ToString() == "0x40000")
{
}
else if (entry[1].ToString() == "0x80000")
{
skinType = "alex";
}
}
}
if (modelDataHead.Count + modelDataBody.Count + modelDataLeftArm.Count + modelDataRightArm.Count + modelDataLeftLeg.Count + modelDataRightLeg.Count > 0)
{
skinType = "custom";
}
}
writeSkins.WriteLine(" \"" + "geometry." + packName + "." + newSkin.name.Remove(15, 4) + "\": {");
//makes skin model depending on what skin type the skin is
if (skinType == "custom")
{
writeSkins.WriteLine(" \"bones\": [");
//Head Data
writeSkins.WriteLine(" {");
writeSkins.WriteLine(" \"pivot\": [ 0, 24, 0 ],");
writeSkins.WriteLine(" \"rotation\": [ 0, 0, 0 ],");
writeSkins.WriteLine(" \"cubes\": [ ");
//Creates bones for each head box
int modelAmount = 0;
foreach (Item model in modelDataHead)
{
modelAmount += 1;
string xo = "";
string yo = "";
string zo = "";
string xs = "";
string ys = "";
string zs = "";
string xv = "";
string yv = "";
int spaceCheck = 0;
foreach (char value in model.Name.ToString())
{
//0X1Y2Z3X4Y5Z6X7Y
if (value.ToString() != " " && spaceCheck == 0)
{
xo += value.ToString();
}
else if (value.ToString() != " " && spaceCheck == 1)
{
yo += value.ToString();
}
else if (value.ToString() != " " && spaceCheck == 2)
{
zo += value.ToString();
}
else if (value.ToString() != " " && spaceCheck == 3)
{
xs += value.ToString();
}
else if (value.ToString() != " " && spaceCheck == 4)
{
ys += value.ToString();
}
else if (value.ToString() != " " && spaceCheck == 5)
{
zs += value.ToString();
}
else if (value.ToString() != " " && spaceCheck == 6)
{
xv += value.ToString();
}
else if (value.ToString() != " " && spaceCheck == 7)
{
yv += value.ToString();
}
else if (value.ToString() == " ")
{
spaceCheck += 1;
}
}
writeSkins.WriteLine(" {");
try
{
writeSkins.WriteLine(" \"origin\": [ " + (Double.Parse(xo)) + ", " + ((Double.Parse(yo) + 0) * -1 + offsetHead + 24 - Double.Parse(ys)) + ", " + (Double.Parse(zo)) + " ],");
writeSkins.WriteLine(" \"size\": [ " + Double.Parse(xs) + ", " + (Double.Parse(ys)) + ", " + Double.Parse(zs) + " ],");
writeSkins.WriteLine(" \"uv\": [ " + Double.Parse(xv) + ", " + Double.Parse(yv) + " ],");
writeSkins.WriteLine(" \"inflate\": 0,");
writeSkins.WriteLine(" \"mirror\": false");
}
catch (Exception)
{
MessageBox.Show("A HEAD BOX tag in " + newSkin.name + " has an invalid value!");
}
if (modelAmount != modelDataHead.Count)
{
writeSkins.WriteLine(" },");
}
else
{
writeSkins.WriteLine(" }");
}
}
writeSkins.WriteLine(" ],");
writeSkins.WriteLine(" \"META_BoneType\": \"" + "clothing" + "\",");
writeSkins.WriteLine(" \"name\": \"" + "head" + "\",");
writeSkins.WriteLine(" \"parent\":" + " null");
writeSkins.WriteLine(" },");
//Body Data
writeSkins.WriteLine(" {");
writeSkins.WriteLine(" \"pivot\": [ 0, 12, 0 ],");
writeSkins.WriteLine(" \"rotation\": [ 0, 0, 0 ],");
writeSkins.WriteLine(" \"cubes\": [ ");
//Creates bones for each body box
modelAmount = 0;
foreach (Item model in modelDataBody)
{
modelAmount += 1;
string xo = "";
string yo = "";
string zo = "";
string xs = "";
string ys = "";
string zs = "";
string xv = "";
string yv = "";
int spaceCheck = 0;
foreach (char value in model.Name.ToString())
{
//0X1Y2Z3X4Y5Z6X7Y
if (value.ToString() != " " && spaceCheck == 0)
{
xo += value.ToString();
}
else if (value.ToString() != " " && spaceCheck == 1)
{
yo += value.ToString();
}
else if (value.ToString() != " " && spaceCheck == 2)
{
zo += value.ToString();
}
else if (value.ToString() != " " && spaceCheck == 3)
{
xs += value.ToString();
}
else if (value.ToString() != " " && spaceCheck == 4)
{
ys += value.ToString();
}
else if (value.ToString() != " " && spaceCheck == 5)
{
zs += value.ToString();
}
else if (value.ToString() != " " && spaceCheck == 6)
{
xv += value.ToString();
}
else if (value.ToString() != " " && spaceCheck == 7)
{
yv += value.ToString();
}
else if (value.ToString() == " ")
{
spaceCheck += 1;
}
}
writeSkins.WriteLine(" {");
try
{
writeSkins.WriteLine(" \"origin\": [ " + (Double.Parse(xo)) + ", " + ((Double.Parse(yo) + 0) * -1 + offsetBody + 24 - Double.Parse(ys)) + ", " + (Double.Parse(zo)) + " ],");
writeSkins.WriteLine(" \"size\": [ " + Double.Parse(xs) + ", " + Double.Parse(ys) + ", " + Double.Parse(zs) + " ],");
writeSkins.WriteLine(" \"uv\": [ " + Double.Parse(xv) + ", " + Double.Parse(yv) + " ],");
writeSkins.WriteLine(" \"inflate\": 0,");
writeSkins.WriteLine(" \"mirror\": false");
}
catch (Exception)
{
MessageBox.Show("A BODY BOX tag in " + newSkin.name + " has an invalid value!");
}
if (modelAmount != modelDataBody.Count)
{
writeSkins.WriteLine(" },");
}
else
{
writeSkins.WriteLine(" }");
}
}
writeSkins.WriteLine(" ],");
writeSkins.WriteLine(" \"META_BoneType\": \"" + "base" + "\",");
writeSkins.WriteLine(" \"name\": \"" + "body" + "\",");
writeSkins.WriteLine(" \"parent\":" + " null");
writeSkins.WriteLine(" },");
//LeftArm Data
writeSkins.WriteLine(" {");
writeSkins.WriteLine(" \"pivot\": [ 5, 22, 0 ],");
writeSkins.WriteLine(" \"rotation\": [ 0, 0, 0 ],");
writeSkins.WriteLine(" \"cubes\": [ ");
//Creates bones for each arm1 box
modelAmount = 0;
foreach (Item model in modelDataLeftArm)
{
modelAmount += 1;
string xo = "";
string yo = "";
string zo = "";
string xs = "";
string ys = "";
string zs = "";
string xv = "";
string yv = "";
int spaceCheck = 0;
foreach (char value in model.Name.ToString())
{
//0X1Y2Z3X4Y5Z6X7Y
if (value.ToString() != " " && spaceCheck == 0)
{
xo += value.ToString();
}
else if (value.ToString() != " " && spaceCheck == 1)
{
yo += value.ToString();
}
else if (value.ToString() != " " && spaceCheck == 2)
{
zo += value.ToString();
}
else if (value.ToString() != " " && spaceCheck == 3)
{
xs += value.ToString();
}
else if (value.ToString() != " " && spaceCheck == 4)
{
ys += value.ToString();
}
else if (value.ToString() != " " && spaceCheck == 5)
{
zs += value.ToString();
}
else if (value.ToString() != " " && spaceCheck == 6)
{
xv += value.ToString();
}
else if (value.ToString() != " " && spaceCheck == 7)
{
yv += value.ToString();
}
else if (value.ToString() == " ")
{
spaceCheck += 1;
}
}
writeSkins.WriteLine(" {");
try
{
writeSkins.WriteLine(" \"origin\": [ " + (Double.Parse(xo) + 5) + ", " + ((Double.Parse(yo)) * -1 + offsetArms + 22 - Double.Parse(ys)) + ", " + (Double.Parse(zo)) + " ],");
writeSkins.WriteLine(" \"size\": [ " + Double.Parse(xs) + ", " + Double.Parse(ys) + ", " + Double.Parse(zs) + " ],");
writeSkins.WriteLine(" \"uv\": [ " + Double.Parse(xv) + ", " + Double.Parse(yv) + " ],");
writeSkins.WriteLine(" \"inflate\": 0,");
writeSkins.WriteLine(" \"mirror\": false");
}
catch (Exception)
{
MessageBox.Show("A ARM0 BOX tag in " + newSkin.name + " has an invalid value!");
}
if (modelAmount != modelDataLeftArm.Count)
{
writeSkins.WriteLine(" },");
}
else
{
writeSkins.WriteLine(" }");
}
}
writeSkins.WriteLine(" ],");
writeSkins.WriteLine(" \"META_BoneType\": \"" + "base" + "\",");
writeSkins.WriteLine(" \"name\": \"" + "leftArm" + "\",");
writeSkins.WriteLine(" \"parent\":" + " null");
writeSkins.WriteLine(" },");
//RightArm Data
writeSkins.WriteLine(" {");
writeSkins.WriteLine(" \"pivot\": [ -5, 22, 0 ],");
writeSkins.WriteLine(" \"rotation\": [ 0, 0, 0 ],");
writeSkins.WriteLine(" \"cubes\": [ ");
//Creates bones for each arm0 box
modelAmount = 0;
foreach (Item model in modelDataRightArm)
{
modelAmount += 1;
string xo = "";
string yo = "";
string zo = "";
string xs = "";
string ys = "";
string zs = "";
string xv = "";
string yv = "";
int spaceCheck = 0;
foreach (char value in model.Name.ToString())
{
//0X1Y2Z3X4Y5Z6X7Y
if (value.ToString() != " " && spaceCheck == 0)
{
xo += value.ToString();
}
else if (value.ToString() != " " && spaceCheck == 1)
{
yo += value.ToString();
}
else if (value.ToString() != " " && spaceCheck == 2)
{
zo += value.ToString();
}
else if (value.ToString() != " " && spaceCheck == 3)
{
xs += value.ToString();
}
else if (value.ToString() != " " && spaceCheck == 4)
{
ys += value.ToString();
}
else if (value.ToString() != " " && spaceCheck == 5)
{
zs += value.ToString();
}
else if (value.ToString() != " " && spaceCheck == 6)
{
xv += value.ToString();
}
else if (value.ToString() != " " && spaceCheck == 7)
{
yv += value.ToString();
}
else if (value.ToString() == " ")
{
spaceCheck += 1;
}
}
writeSkins.WriteLine(" {");
try
{
writeSkins.WriteLine(" \"origin\": [ " + (Double.Parse(xo) - 5) + ", " + ((Double.Parse(yo)) * -1 + offsetArms + 22 - Double.Parse(ys)) + ", " + (Double.Parse(zo)) + " ],");
writeSkins.WriteLine(" \"size\": [ " + Double.Parse(xs) + ", " + Double.Parse(ys) + ", " + Double.Parse(zs) + " ],");
writeSkins.WriteLine(" \"uv\": [ " + Double.Parse(xv) + ", " + Double.Parse(yv) + " ],");
writeSkins.WriteLine(" \"inflate\": 0,");
writeSkins.WriteLine(" \"mirror\": false");
}
catch (Exception)
{
MessageBox.Show("A ARM1 BOX tag in " + newSkin.name + " has an invalid value!");
}
if (modelAmount != modelDataRightArm.Count)
{
writeSkins.WriteLine(" },");
}
else
{
writeSkins.WriteLine(" }");
}
}
writeSkins.WriteLine(" ],");
writeSkins.WriteLine(" \"META_BoneType\": \"" + "base" + "\",");
writeSkins.WriteLine(" \"name\": \"" + "rightArm" + "\",");
writeSkins.WriteLine(" \"parent\":" + " null");
writeSkins.WriteLine(" },");
//LeftLeg Data
writeSkins.WriteLine(" {");
writeSkins.WriteLine(" \"pivot\": [ 1.9, 12, 0 ],");
writeSkins.WriteLine(" \"rotation\": [ 0, 0, 0 ],");
writeSkins.WriteLine(" \"cubes\": [ ");
//Creates bones for each leg1 box
modelAmount = 0;
foreach (Item model in modelDataLeftLeg)
{
modelAmount += 1;
string xo = "";
string yo = "";
string zo = "";
string xs = "";
string ys = "";
string zs = "";
string xv = "";
string yv = "";
int spaceCheck = 0;
foreach (char value in model.Name.ToString())
{
//0X1Y2Z3X4Y5Z6X7Y
if (value.ToString() != " " && spaceCheck == 0)
{
xo += value.ToString();
}
else if (value.ToString() != " " && spaceCheck == 1)
{
yo += value.ToString();
}
else if (value.ToString() != " " && spaceCheck == 2)
{
zo += value.ToString();
}
else if (value.ToString() != " " && spaceCheck == 3)
{
xs += value.ToString();
}
else if (value.ToString() != " " && spaceCheck == 4)
{
ys += value.ToString();
}
else if (value.ToString() != " " && spaceCheck == 5)
{
zs += value.ToString();
}
else if (value.ToString() != " " && spaceCheck == 6)
{
xv += value.ToString();
}
else if (value.ToString() != " " && spaceCheck == 7)
{
yv += value.ToString();
}
else if (value.ToString() == " ")
{
spaceCheck += 1;
}
}
writeSkins.WriteLine(" {");
try
{
writeSkins.WriteLine(" \"origin\": [ " + (Double.Parse(xo) - 1.9) + ", " + ((Double.Parse(yo)) * -1 + offsetLegs + 12 - Double.Parse(ys)) + ", " + (Double.Parse(zo)) + " ],");
writeSkins.WriteLine(" \"size\": [ " + Double.Parse(xs) + ", " + Double.Parse(ys) + ", " + Double.Parse(zs) + " ],");
writeSkins.WriteLine(" \"uv\": [ " + Double.Parse(xv) + ", " + Double.Parse(yv) + " ],");
writeSkins.WriteLine(" \"inflate\": 0,");
writeSkins.WriteLine(" \"mirror\": false");
}
catch (Exception)
{
MessageBox.Show("A LEG1 BOX tag in " + newSkin.name + " has an invalid value!");
}
if (modelAmount != modelDataLeftLeg.Count)
{
writeSkins.WriteLine(" },");
}
else
{
writeSkins.WriteLine(" }");
}
}
writeSkins.WriteLine(" ],");
writeSkins.WriteLine(" \"META_BoneType\": \"" + "base" + "\",");
writeSkins.WriteLine(" \"name\": \"" + "leftLeg" + "\",");
writeSkins.WriteLine(" \"parent\":" + " null");
writeSkins.WriteLine(" },");
//RightLeg Data
writeSkins.WriteLine(" {");
writeSkins.WriteLine(" \"pivot\": [ -1.9, 12, 0 ],");
writeSkins.WriteLine(" \"rotation\": [ 0, 0, 0 ],");
writeSkins.WriteLine(" \"cubes\": [ ");
//Creates bones for each leg0 box
modelAmount = 0;
foreach (Item model in modelDataRightLeg)
{
modelAmount += 1;
string xo = "";
string yo = "";
string zo = "";
string xs = "";
string ys = "";
string zs = "";
string xv = "";
string yv = "";
int spaceCheck = 0;
foreach (char value in model.Name.ToString())
{
//0X1Y2Z3X4Y5Z6X7Y
if (value.ToString() != " " && spaceCheck == 0)
{
xo += value.ToString();
}
else if (value.ToString() != " " && spaceCheck == 1)
{
yo += value.ToString();
}
else if (value.ToString() != " " && spaceCheck == 2)
{
zo += value.ToString();
}
else if (value.ToString() != " " && spaceCheck == 3)
{
xs += value.ToString();
}
else if (value.ToString() != " " && spaceCheck == 4)
{
ys += value.ToString();
}
else if (value.ToString() != " " && spaceCheck == 5)
{
zs += value.ToString();
}
else if (value.ToString() != " " && spaceCheck == 6)
{
xv += value.ToString();
}
else if (value.ToString() != " " && spaceCheck == 7)
{
yv += value.ToString();
}
else if (value.ToString() == " ")
{
spaceCheck += 1;
}
}
writeSkins.WriteLine(" {");
try
{
writeSkins.WriteLine(" \"origin\": [ " + (Double.Parse(xo) + 1.9) + ", " + ((Double.Parse(yo)) * -1 + offsetLegs + 12 - Double.Parse(ys)) + ", " + (Double.Parse(zo)) + " ],");
writeSkins.WriteLine(" \"size\": [ " + Double.Parse(xs) + ", " + Double.Parse(ys) + ", " + Double.Parse(zs) + " ],");
writeSkins.WriteLine(" \"uv\": [ " + Double.Parse(xv) + ", " + Double.Parse(yv) + " ],");
writeSkins.WriteLine(" \"inflate\": 0,");
writeSkins.WriteLine(" \"mirror\": false");
}
catch (Exception)
{
MessageBox.Show("A LEG0 BOX tag in " + newSkin.name + " has an invalid value!");
}
if (modelAmount != modelDataRightLeg.Count)
{
writeSkins.WriteLine(" },");
}
else
{
writeSkins.WriteLine(" }");
}
}
writeSkins.WriteLine(" ],");
writeSkins.WriteLine(" \"META_BoneType\": \"" + "base" + "\",");
writeSkins.WriteLine(" \"name\": \"" + "rightLeg" + "\",");
writeSkins.WriteLine(" \"parent\":" + " null");
writeSkins.WriteLine(" }");
writeSkins.WriteLine(" ],");
}
else if (skinType == "64x32")
{
writeSkins.Write(" \"bones\": [ ],");
}
else if (skinType == "steve")
{
writeSkins.Write(" \"bones\": [ " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ 0, 24, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [ " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"origin\": [ -4, 12, -2 ], " + Environment.NewLine + " " + Environment.NewLine + " \"size\": [ 8, 12, 4 ], " + Environment.NewLine + " " + Environment.NewLine + " \"uv\": [ 16, 16 ], " + Environment.NewLine + " " + Environment.NewLine + " \"inflate\": 0, " + Environment.NewLine + " " + Environment.NewLine + " \"mirror\": false " + Environment.NewLine + " " + Environment.NewLine + " } " + Environment.NewLine + " " + Environment.NewLine + " ], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"base\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"body\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": null " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ 0, 24, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [ " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"origin\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"size\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"uv\": [ 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"inflate\": 0, " + Environment.NewLine + " " + Environment.NewLine + " \"mirror\": false " + Environment.NewLine + " " + Environment.NewLine + " } " + Environment.NewLine + " " + Environment.NewLine + " ], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"armor\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"bodyArmor\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"body\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ 0, 12, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [ " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"origin\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"size\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"uv\": [ 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"inflate\": 0, " + Environment.NewLine + " " + Environment.NewLine + " \"mirror\": false " + Environment.NewLine + " " + Environment.NewLine + " } " + Environment.NewLine + " " + Environment.NewLine + " ], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"armor\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"belt\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"body\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ 0, 24, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [ " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"origin\": [ -4, 24, -4 ], " + Environment.NewLine + " " + Environment.NewLine + " \"size\": [ 8, 8, 8 ], " + Environment.NewLine + " " + Environment.NewLine + " \"uv\": [ 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"inflate\": 0, " + Environment.NewLine + " " + Environment.NewLine + " \"mirror\": false " + Environment.NewLine + " " + Environment.NewLine + " } " + Environment.NewLine + " " + Environment.NewLine + " ], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"base\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"head\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": null " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ 0, 24, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [ " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"origin\": [ -4, 24, -4 ], " + Environment.NewLine + " " + Environment.NewLine + " \"size\": [ 8, 8, 8 ], " + Environment.NewLine + " " + Environment.NewLine + " \"uv\": [ 32, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"inflate\": 0.5, " + Environment.NewLine + " " + Environment.NewLine + " \"mirror\": false " + Environment.NewLine + " " + Environment.NewLine + " } " + Environment.NewLine + " " + Environment.NewLine + " ], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"clothing\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"hat\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"head\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ 0, 24, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [ " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"origin\": [ 0, 24, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"size\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"uv\": [ 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"inflate\": 0, " + Environment.NewLine + " " + Environment.NewLine + " \"mirror\": false " + Environment.NewLine + " " + Environment.NewLine + " } " + Environment.NewLine + " " + Environment.NewLine + " ], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"armor\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"helmet\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"head\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ 5, 22, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [ " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"origin\": [ 4, 12, -2 ], " + Environment.NewLine + " " + Environment.NewLine + " \"size\": [ 4, 12, 4 ], " + Environment.NewLine + " " + Environment.NewLine + " \"uv\": [ 32, 48 ], " + Environment.NewLine + " " + Environment.NewLine + " \"inflate\": 0, " + Environment.NewLine + " " + Environment.NewLine + " \"mirror\": false " + Environment.NewLine + " " + Environment.NewLine + " } " + Environment.NewLine + " " + Environment.NewLine + " ], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"base\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"leftArm\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": null " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ -5, 22, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [ " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"origin\": [ -8, 12, -2 ], " + Environment.NewLine + " " + Environment.NewLine + " \"size\": [ 4, 12, 4 ], " + Environment.NewLine + " " + Environment.NewLine + " \"uv\": [ 40, 16 ], " + Environment.NewLine + " " + Environment.NewLine + " \"inflate\": 0, " + Environment.NewLine + " " + Environment.NewLine + " \"mirror\": false " + Environment.NewLine + " " + Environment.NewLine + " } " + Environment.NewLine + " " + Environment.NewLine + " ], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"base\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"rightArm\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": null " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ 5, 22, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [ " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"origin\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"size\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"uv\": [ 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"inflate\": 0, " + Environment.NewLine + " " + Environment.NewLine + " \"mirror\": false " + Environment.NewLine + " " + Environment.NewLine + " } " + Environment.NewLine + " " + Environment.NewLine + " ], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"armor\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"leftArmArmor\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"leftArm\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ -5, 22, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [ " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"origin\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"size\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"uv\": [ 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"inflate\": 0, " + Environment.NewLine + " " + Environment.NewLine + " \"mirror\": false " + Environment.NewLine + " " + Environment.NewLine + " } " + Environment.NewLine + " " + Environment.NewLine + " ], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"armor\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"rightArmArmor\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"rightArm\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ 5, 22, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [ " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"origin\": [ 4, 12, -2 ], " + Environment.NewLine + " " + Environment.NewLine + " \"size\": [ 4, 12, 4 ], " + Environment.NewLine + " " + Environment.NewLine + " \"uv\": [ 48, 48 ], " + Environment.NewLine + " " + Environment.NewLine + " \"inflate\": 0.25, " + Environment.NewLine + " " + Environment.NewLine + " \"mirror\": false " + Environment.NewLine + " " + Environment.NewLine + " } " + Environment.NewLine + " " + Environment.NewLine + " ], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"clothing\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"leftSleeve\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"leftArm\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ -5, 22, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [ " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"origin\": [ -8, 12, -2 ], " + Environment.NewLine + " " + Environment.NewLine + " \"size\": [ 4, 12, 4 ], " + Environment.NewLine + " " + Environment.NewLine + " \"uv\": [ 40, 32 ], " + Environment.NewLine + " " + Environment.NewLine + " \"inflate\": 0.25, " + Environment.NewLine + " " + Environment.NewLine + " \"mirror\": false " + Environment.NewLine + " " + Environment.NewLine + " } " + Environment.NewLine + " " + Environment.NewLine + " ], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"clothing\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"rightSleeve\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"rightArm\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ 1.9, 12, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [ " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"origin\": [ -0.1, 0, -2 ], " + Environment.NewLine + " " + Environment.NewLine + " \"size\": [ 4, 12, 4 ], " + Environment.NewLine + " " + Environment.NewLine + " \"uv\": [ 16, 48 ], " + Environment.NewLine + " " + Environment.NewLine + " \"inflate\": 0, " + Environment.NewLine + " " + Environment.NewLine + " \"mirror\": false " + Environment.NewLine + " " + Environment.NewLine + " } " + Environment.NewLine + " " + Environment.NewLine + " ], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"base\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"leftLeg\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": null " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ -1.9, 12, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [ " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"origin\": [ -3.9, 0, -2 ], " + Environment.NewLine + " " + Environment.NewLine + " \"size\": [ 4, 12, 4 ], " + Environment.NewLine + " " + Environment.NewLine + " \"uv\": [ 0, 16 ], " + Environment.NewLine + " " + Environment.NewLine + " \"inflate\": 0, " + Environment.NewLine + " " + Environment.NewLine + " \"mirror\": false " + Environment.NewLine + " " + Environment.NewLine + " } " + Environment.NewLine + " " + Environment.NewLine + " ], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"base\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"rightLeg\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": null " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ 1.9, 12, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [ " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"origin\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"size\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"uv\": [ 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"inflate\": 0, " + Environment.NewLine + " " + Environment.NewLine + " \"mirror\": false " + Environment.NewLine + " " + Environment.NewLine + " } " + Environment.NewLine + " " + Environment.NewLine + " ], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"armor\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"leftLegging\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"leftLeg\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ -1.9, 12, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [ " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"origin\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"size\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"uv\": [ 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"inflate\": 0, " + Environment.NewLine + " " + Environment.NewLine + " \"mirror\": false " + Environment.NewLine + " " + Environment.NewLine + " } " + Environment.NewLine + " " + Environment.NewLine + " ], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"armor\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"rightLegging\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"rightLeg\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ 1.9, 12, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [ " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"origin\": [ -0.1, 0, -2 ], " + Environment.NewLine + " " + Environment.NewLine + " \"size\": [ 4, 12, 4 ], " + Environment.NewLine + " " + Environment.NewLine + " \"uv\": [ 0, 48 ], " + Environment.NewLine + " " + Environment.NewLine + " \"inflate\": 0.25, " + Environment.NewLine + " " + Environment.NewLine + " \"mirror\": false " + Environment.NewLine + " " + Environment.NewLine + " } " + Environment.NewLine + " " + Environment.NewLine + " ], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"clothing\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"leftPants\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"leftLeg\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ -1.9, 12, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [ " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"origin\": [ -3.9, 0, -2 ], " + Environment.NewLine + " " + Environment.NewLine + " \"size\": [ 4, 12, 4 ], " + Environment.NewLine + " " + Environment.NewLine + " \"uv\": [ 0, 32 ], " + Environment.NewLine + " " + Environment.NewLine + " \"inflate\": 0.25, " + Environment.NewLine + " " + Environment.NewLine + " \"mirror\": false " + Environment.NewLine + " " + Environment.NewLine + " } " + Environment.NewLine + " " + Environment.NewLine + " ], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"clothing\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"rightPants\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"rightLeg\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ 0, 24, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [ " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"origin\": [ -4, 12, -2 ], " + Environment.NewLine + " " + Environment.NewLine + " \"size\": [ 8, 12, 4 ], " + Environment.NewLine + " " + Environment.NewLine + " \"uv\": [ 16, 32 ], " + Environment.NewLine + " " + Environment.NewLine + " \"inflate\": 0.25, " + Environment.NewLine + " " + Environment.NewLine + " \"mirror\": false " + Environment.NewLine + " " + Environment.NewLine + " } " + Environment.NewLine + " " + Environment.NewLine + " ], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"clothing\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"jacket\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"body\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ 0, 24, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"armor_offset\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"helmetArmorOffset\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"head\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ 0, 24, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"armor_offset\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"bodyArmorOffset\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"body\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ -5, 22, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"armor_offset\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"rightArmArmorOffset\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"rightArm\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ 5, 22, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"armor_offset\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"leftArmArmorOffset\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"leftArm\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ 0, 12, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"armor_offset\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"waist\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"body\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ -1.9, 12, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"armor_offset\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"rightLegArmorOffset\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"rightLeg\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ 1.9, 12, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"armor_offset\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"leftLegArmorOffset\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"leftLeg\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ -1.9, 12, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"armor_offset\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"rightBootArmorOffset\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"rightLeg\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ 1.9, 12, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"armor_offset\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"leftBootArmorOffset\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"leftLeg\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ -6, 15, 1 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"item\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"rightItem\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"rightArm\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ 6, 15, 1 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"item\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"leftItem\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"leftArm\" " + Environment.NewLine + " " + Environment.NewLine + " } " + Environment.NewLine + " " + Environment.NewLine + " ],");
}
else if (skinType == "alex")
{
writeSkins.Write(" \"bones\": [ " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ 0, 24, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [ " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"origin\": [ -4, 12, -2 ], " + Environment.NewLine + " " + Environment.NewLine + " \"size\": [ 8, 12, 4 ], " + Environment.NewLine + " " + Environment.NewLine + " \"uv\": [ 16, 16 ], " + Environment.NewLine + " " + Environment.NewLine + " \"inflate\": 0, " + Environment.NewLine + " " + Environment.NewLine + " \"mirror\": false " + Environment.NewLine + " " + Environment.NewLine + " } " + Environment.NewLine + " " + Environment.NewLine + " ], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"base\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"body\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": null " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ 0, 24, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [ " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"origin\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"size\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"uv\": [ 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"inflate\": 0, " + Environment.NewLine + " " + Environment.NewLine + " \"mirror\": false " + Environment.NewLine + " " + Environment.NewLine + " } " + Environment.NewLine + " " + Environment.NewLine + " ], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"armor\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"bodyArmor\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"body\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ 0, 12, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [ " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"origin\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"size\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"uv\": [ 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"inflate\": 0, " + Environment.NewLine + " " + Environment.NewLine + " \"mirror\": false " + Environment.NewLine + " " + Environment.NewLine + " } " + Environment.NewLine + " " + Environment.NewLine + " ], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"armor\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"belt\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"body\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ 0, 24, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [ " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"origin\": [ -4, 24, -4 ], " + Environment.NewLine + " " + Environment.NewLine + " \"size\": [ 8, 8, 8 ], " + Environment.NewLine + " " + Environment.NewLine + " \"uv\": [ 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"inflate\": 0, " + Environment.NewLine + " " + Environment.NewLine + " \"mirror\": false " + Environment.NewLine + " " + Environment.NewLine + " } " + Environment.NewLine + " " + Environment.NewLine + " ], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"base\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"head\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": null " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ 0, 24, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [ " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"origin\": [ -4, 24, -4 ], " + Environment.NewLine + " " + Environment.NewLine + " \"size\": [ 8, 8, 8 ], " + Environment.NewLine + " " + Environment.NewLine + " \"uv\": [ 32, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"inflate\": 0.5, " + Environment.NewLine + " " + Environment.NewLine + " \"mirror\": false " + Environment.NewLine + " " + Environment.NewLine + " } " + Environment.NewLine + " " + Environment.NewLine + " ], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"clothing\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"hat\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"head\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ 0, 24, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [ " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"origin\": [ 0, 24, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"size\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"uv\": [ 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"inflate\": 0, " + Environment.NewLine + " " + Environment.NewLine + " \"mirror\": false " + Environment.NewLine + " " + Environment.NewLine + " } " + Environment.NewLine + " " + Environment.NewLine + " ], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"armor\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"helmet\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"head\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ 5, 21.5, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [ " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"origin\": [ 4, 11.5, -2 ], " + Environment.NewLine + " " + Environment.NewLine + " \"size\": [ 3, 12, 4 ], " + Environment.NewLine + " " + Environment.NewLine + " \"uv\": [ 32, 48 ], " + Environment.NewLine + " " + Environment.NewLine + " \"inflate\": 0, " + Environment.NewLine + " " + Environment.NewLine + " \"mirror\": false " + Environment.NewLine + " " + Environment.NewLine + " } " + Environment.NewLine + " " + Environment.NewLine + " ], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"base\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"leftArm\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": null " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ -5, 21.5, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [ " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"origin\": [ -7, 11.5, -2 ], " + Environment.NewLine + " " + Environment.NewLine + " \"size\": [ 3, 12, 4 ], " + Environment.NewLine + " " + Environment.NewLine + " \"uv\": [ 40, 16 ], " + Environment.NewLine + " " + Environment.NewLine + " \"inflate\": 0, " + Environment.NewLine + " " + Environment.NewLine + " \"mirror\": false " + Environment.NewLine + " " + Environment.NewLine + " } " + Environment.NewLine + " " + Environment.NewLine + " ], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"base\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"rightArm\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": null " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ 5, 21.5, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [ " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"origin\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"size\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"uv\": [ 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"inflate\": 0, " + Environment.NewLine + " " + Environment.NewLine + " \"mirror\": false " + Environment.NewLine + " " + Environment.NewLine + " } " + Environment.NewLine + " " + Environment.NewLine + " ], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"armor\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"leftArmArmor\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"leftArm\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ -5, 21.5, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [ " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"origin\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"size\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"uv\": [ 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"inflate\": 0, " + Environment.NewLine + " " + Environment.NewLine + " \"mirror\": false " + Environment.NewLine + " " + Environment.NewLine + " } " + Environment.NewLine + " " + Environment.NewLine + " ], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"armor\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"rightArmArmor\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"rightArm\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ 5, 21.5, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [ " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"origin\": [ 4, 11.5, -2 ], " + Environment.NewLine + " " + Environment.NewLine + " \"size\": [ 3, 12, 4 ], " + Environment.NewLine + " " + Environment.NewLine + " \"uv\": [ 48, 48 ], " + Environment.NewLine + " " + Environment.NewLine + " \"inflate\": 0.25, " + Environment.NewLine + " " + Environment.NewLine + " \"mirror\": false " + Environment.NewLine + " " + Environment.NewLine + " } " + Environment.NewLine + " " + Environment.NewLine + " ], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"clothing\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"leftSleeve\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"leftArm\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ -5, 21.5, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [ " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"origin\": [ -7, 11.5, -2 ], " + Environment.NewLine + " " + Environment.NewLine + " \"size\": [ 3, 12, 4 ], " + Environment.NewLine + " " + Environment.NewLine + " \"uv\": [ 40, 32 ], " + Environment.NewLine + " " + Environment.NewLine + " \"inflate\": 0.25, " + Environment.NewLine + " " + Environment.NewLine + " \"mirror\": false " + Environment.NewLine + " " + Environment.NewLine + " } " + Environment.NewLine + " " + Environment.NewLine + " ], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"clothing\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"rightSleeve\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"rightArm\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ 1.9, 12, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [ " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"origin\": [ -0.1, 0, -2 ], " + Environment.NewLine + " " + Environment.NewLine + " \"size\": [ 4, 12, 4 ], " + Environment.NewLine + " " + Environment.NewLine + " \"uv\": [ 16, 48 ], " + Environment.NewLine + " " + Environment.NewLine + " \"inflate\": 0, " + Environment.NewLine + " " + Environment.NewLine + " \"mirror\": false " + Environment.NewLine + " " + Environment.NewLine + " } " + Environment.NewLine + " " + Environment.NewLine + " ], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"base\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"leftLeg\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": null " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ -1.9, 12, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [ " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"origin\": [ -3.9, 0, -2 ], " + Environment.NewLine + " " + Environment.NewLine + " \"size\": [ 4, 12, 4 ], " + Environment.NewLine + " " + Environment.NewLine + " \"uv\": [ 0, 16 ], " + Environment.NewLine + " " + Environment.NewLine + " \"inflate\": 0, " + Environment.NewLine + " " + Environment.NewLine + " \"mirror\": false " + Environment.NewLine + " " + Environment.NewLine + " } " + Environment.NewLine + " " + Environment.NewLine + " ], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"base\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"rightLeg\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": null " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ 1.9, 12, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [ " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"origin\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"size\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"uv\": [ 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"inflate\": 0, " + Environment.NewLine + " " + Environment.NewLine + " \"mirror\": false " + Environment.NewLine + " " + Environment.NewLine + " } " + Environment.NewLine + " " + Environment.NewLine + " ], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"armor\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"leftLegArmor\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"leftLeg\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ -1.9, 12, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [ " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"origin\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"size\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"uv\": [ 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"inflate\": 0, " + Environment.NewLine + " " + Environment.NewLine + " \"mirror\": false " + Environment.NewLine + " " + Environment.NewLine + " } " + Environment.NewLine + " " + Environment.NewLine + " ], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"armor\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"rightLegging\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"rightLeg\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ 1.9, 12, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [ " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"origin\": [ -0.1, 0, -2 ], " + Environment.NewLine + " " + Environment.NewLine + " \"size\": [ 4, 12, 4 ], " + Environment.NewLine + " " + Environment.NewLine + " \"uv\": [ 0, 48 ], " + Environment.NewLine + " " + Environment.NewLine + " \"inflate\": 0.25, " + Environment.NewLine + " " + Environment.NewLine + " \"mirror\": false " + Environment.NewLine + " " + Environment.NewLine + " } " + Environment.NewLine + " " + Environment.NewLine + " ], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"clothing\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"leftPants\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"leftLeg\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ -1.9, 12, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [ " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"origin\": [ -3.9, 0, -2 ], " + Environment.NewLine + " " + Environment.NewLine + " \"size\": [ 4, 12, 4 ], " + Environment.NewLine + " " + Environment.NewLine + " \"uv\": [ 0, 32 ], " + Environment.NewLine + " " + Environment.NewLine + " \"inflate\": 0.25, " + Environment.NewLine + " " + Environment.NewLine + " \"mirror\": false " + Environment.NewLine + " " + Environment.NewLine + " } " + Environment.NewLine + " " + Environment.NewLine + " ], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"clothing\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"rightPants\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"rightLeg\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ 0, 24, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [ " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"origin\": [ -4, 12, -2 ], " + Environment.NewLine + " " + Environment.NewLine + " \"size\": [ 8, 12, 4 ], " + Environment.NewLine + " " + Environment.NewLine + " \"uv\": [ 16, 32 ], " + Environment.NewLine + " " + Environment.NewLine + " \"inflate\": 0.25, " + Environment.NewLine + " " + Environment.NewLine + " \"mirror\": false " + Environment.NewLine + " " + Environment.NewLine + " } " + Environment.NewLine + " " + Environment.NewLine + " ], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"clothing\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"jacket\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"body\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ 0, 24, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"armor_offset\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"helmetArmorOffset\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"head\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ 0, 24, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"armor_offset\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"bodyArmorOffset\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"body\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ -5, 21.5, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"armor_offset\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"rightArmArmorOffset\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"rightArm\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ 5, 21.5, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"armor_offset\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"leftArmArmorOffset\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"leftArm\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ 0, 12, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"armor_offset\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"waist\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"body\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ -1.9, 12, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"armor_offset\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"rightLegArmorOffset\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"rightLeg\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ 1.9, 12, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"armor_offset\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"leftLegArmorOffset\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"leftLeg\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ -1.9, 12, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"armor_offset\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"rightBootArmorOffset\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"rightLeg\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ 1.9, 12, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"armor_offset\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"leftBootArmorOffset\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"leftLeg\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ -6, 14.5, 1 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"item\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"rightItem\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"rightArm\" " + Environment.NewLine + " " + Environment.NewLine + " }, " + Environment.NewLine + " " + Environment.NewLine + " { " + Environment.NewLine + " " + Environment.NewLine + " \"pivot\": [ 6, 14.5, 1 ], " + Environment.NewLine + " " + Environment.NewLine + " \"rotation\": [ 0, 0, 0 ], " + Environment.NewLine + " " + Environment.NewLine + " \"cubes\": [], " + Environment.NewLine + " " + Environment.NewLine + " \"META_BoneType\": \"item\", " + Environment.NewLine + " " + Environment.NewLine + " \"name\": \"leftItem\", " + Environment.NewLine + " " + Environment.NewLine + " \"parent\": \"leftArm\" " + Environment.NewLine + " " + Environment.NewLine + " } " + Environment.NewLine + " " + Environment.NewLine + " ],");
}
writeSkins.WriteLine(" \"texturewidth\": 64 , ");
writeSkins.WriteLine(" \"textureheight\": 64,");
writeSkins.WriteLine(" \"META_ModelVersion\": \"1.0.6\",");
writeSkins.WriteLine(" \"rigtype\": \"normal\",");
writeSkins.WriteLine(" \"animationArmsDown\": false,");
writeSkins.WriteLine(" \"animationArmsOutFront\": false,");
writeSkins.WriteLine(" \"animationStatueOfLibertyArms\": false,");
writeSkins.WriteLine(" \"animationSingleArmAnimation\": false,");
writeSkins.WriteLine(" \"animationStationaryLegs\": false,");
writeSkins.WriteLine(" \"animationSingleLegAnimation\": false,");
writeSkins.WriteLine(" \"animationNoHeadBob\": false,");
writeSkins.WriteLine(" \"animationDontShowArmor\": false,");
writeSkins.WriteLine(" \"animationUpsideDown\": false,");
writeSkins.WriteLine(" \"animationInvertedCrouch\": false");
if (newSkinCount != skinsList.Count)
{
writeSkins.WriteLine(" },");
}
else
{
writeSkins.WriteLine(" }");
}
}
}
Random rnd = new Random();
int month = rnd.Next(1, 13); // creates a number between 1 and 12
int dice = rnd.Next(1, 7); // creates a number between 1 and 6
int card = rnd.Next(52);
string randomPlus = month.ToString() + dice.ToString() + card.ToString();
if (randomPlus.Count() > 12)
{
randomPlus.Remove(0, randomPlus.Count() - 12);
}
else if (randomPlus.Count() < 12)
{
int ii = 12 - randomPlus.Count();
for (int i = 0; i < ii; i++)
{
randomPlus += 0;
}
}
else if (randomPlus.Count() == 12)
{
}
//Create Manifest file
using (StreamWriter writeSkins = new StreamWriter(root + "/manifest.json"))
{
writeSkins.WriteLine("{");
writeSkins.WriteLine(" \"header\": {");
writeSkins.WriteLine(" \"version\": [");
writeSkins.WriteLine(" 1,");
writeSkins.WriteLine(" 0,");
writeSkins.WriteLine(" 0");
writeSkins.WriteLine(" ],");
writeSkins.WriteLine(" \"description\": \"Template by Ultmate_Mario, Conversion by Nobledez\",");
writeSkins.WriteLine(" \"name\": \"" + packName + "\",");
writeSkins.WriteLine(" \"uuid\": \"" + uuid.Remove(0, 4) + "-" + uuid.Remove(0, 8) + "-" + uuid.Remove(1, 8) + "-" + uuid.Remove(2, 8) + "-" + randomPlus + "\""); //8-4-4-4-12
writeSkins.WriteLine(" },");
writeSkins.WriteLine(" \"modules\": [");
writeSkins.WriteLine(" {");
writeSkins.WriteLine(" \"version\": [");
writeSkins.WriteLine(" 1,");
writeSkins.WriteLine(" 0,");
writeSkins.WriteLine(" 0");
writeSkins.WriteLine(" ],");
writeSkins.WriteLine(" \"type\": \"skin_pack\",");
writeSkins.WriteLine(" \"uuid\": \"8dfd1d65-b3ca-4726-b9e0-9b46a40b72a4\"");
writeSkins.WriteLine(" }");
writeSkins.WriteLine(" ],");
writeSkins.WriteLine(" \"format_version\": 1");
writeSkins.WriteLine("}");
}
//create lang file
using (StreamWriter writeSkins = new StreamWriter(root + "/texts/en_US.lang"))
{
writeSkins.WriteLine("skinpack." + packName + "=" + Path.GetFileNameWithoutExtension(convert.FileName));
foreach (Item displayName in skinDisplayNames)
{
writeSkins.WriteLine("skin." + packName + "." + displayName.Id + "=" + displayName.Name);
}
}
//adds skin textures
foreach (PCK.MineFile skinTexture in skinsList)
{
var ms = new MemoryStream(skinTexture.data);
Bitmap saveSkin = new Bitmap(Image.FromStream(ms));
if (saveSkin.Width == saveSkin.Height)
{
ResizeImage(saveSkin, 64, 64);
}
else if (saveSkin.Height == saveSkin.Width / 2)
{
ResizeImage(saveSkin, 64, 32);
}
else
{
ResizeImage(saveSkin, 64, 64);
}
saveSkin.Save(root + "/" + skinTexture.name, ImageFormat.Png);
}
//adds cape textures
foreach (PCK.MineFile capeTexture in capesList)
{
File.WriteAllBytes(root + "/" + capeTexture.name, capeTexture.data);
}
string startPath = root;
string zipPath = rootFinal + "content.zipe";
try
{
ZipFile.CreateFromDirectory(startPath, zipPath);//Creates contents zipe
}catch (Exception)
{
File.Delete(zipPath);
ZipFile.CreateFromDirectory(startPath, zipPath);//Creates contents zipe
}
rootFinal = root + "temp/";
Directory.CreateDirectory(rootFinal);
File.Move(zipPath, rootFinal + "content.zipe");
File.Copy(root + "/manifest.json", rootFinal + "/manifest.json");
ZipFile.CreateFromDirectory(rootFinal, convert.FileName);//Creates mcpack
Directory.Delete(root, true);
Directory.Delete(rootFinal, true);
MessageBox.Show("Conversion Complete");
}
}
catch (Exception convertEr)
{
MessageBox.Show(convertEr.ToString());
}
}
else if (openedPCKS.Visible == false)
{
MessageBox.Show("Open PCK file first!");
}
}
public static Bitmap ResizeImage(Image image, int width, int height)
{
var destRect = new Rectangle(0, 0, width, height);
var destImage = new Bitmap(width, height);
destImage.SetResolution(image.HorizontalResolution, image.VerticalResolution);
using (var graphics = Graphics.FromImage(destImage))
{
graphics.CompositingMode = CompositingMode.SourceCopy;
graphics.CompositingQuality = CompositingQuality.HighQuality;
graphics.InterpolationMode = InterpolationMode.NearestNeighbor;
graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
using (var wrapMode = new ImageAttributes())
{
wrapMode.SetWrapMode(WrapMode.TileFlipXY);
graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode);
}
}
return destImage;
}
#endregion
#region currently scrapped 3ds feature
private void ds(){
/*private struct loadedTexture
{
public bool modified;
public uint gpuCommandsOffset;
public uint gpuCommandsWordCount;
public uint offset;
public int length;
public RenderBase.OTexture texture;
}
private struct loadedMaterial
{
public string texture0;
public string texture1;
public string texture2;
public uint gpuCommandsOffset;
public uint gpuCommandsWordCount;
}
private class loadedBCH
{
public uint mainHeaderOffset;
public uint gpuCommandsOffset;
public uint dataOffset;
public uint relocationTableOffset;
public uint relocationTableLength;
public List<loadedTexture> textures;
public List<loadedMaterial> materials;
public loadedBCH()
{
textures = new List<loadedTexture>();
materials = new List<loadedMaterial>();
}
}
private byte[] align(byte[] input)
{
int length = input.Length;
while ((length & 0x7f) > 0) length++;
byte[] output = new byte[length];
Buffer.BlockCopy(input, 0, output, 0, input.Length);
return output;
}
private void replaceData(Stream data, uint offset, int length, byte[] newData)
{
data.Seek(offset + length, SeekOrigin.Begin);
byte[] after = new byte[data.Length - data.Position];
data.Read(after, 0, after.Length);
data.SetLength(offset);
data.Seek(offset, SeekOrigin.Begin);
data.Write(newData, 0, newData.Length);
data.Write(after, 0, after.Length);
}
private void updateTexture(int index, loadedTexture newTex)
{
bch.textures.RemoveAt(index);
bch.textures.Insert(index, newTex);
}
private void replaceCommand(Stream data, BinaryWriter output, uint newVal)
{
data.Seek(-8, SeekOrigin.Current);
output.Write(newVal);
data.Seek(4, SeekOrigin.Current);
}
private void updateAddress(Stream data, BinaryReader input, BinaryWriter output, int diff)
{
uint offset = input.ReadUInt32();
offset = (uint)(offset + diff);
data.Seek(-4, SeekOrigin.Current);
output.Write(offset);
}
loadedBCH bch;
private void create3dstToolStripMenuItem_Click(object sender, EventArgs e)
{
if (treeViewMain.SelectedNode != null)
{
SaveFileDialog exportDs = new SaveFileDialog();
exportDs.ShowDialog();
string currentFile = exportDs.FileName;
bch = new loadedBCH();
using (FileStream data = new FileStream(currentFile, FileMode.Open))
{
BinaryReader input = new BinaryReader(data);
BinaryWriter output = new BinaryWriter(data);
MemoryStream png = new MemoryStream(mf.data); //Gets image data from minefile data
Image skinPicture = Image.FromStream(png); //Constructs image data into image
pictureBoxImagePreview.Image = skinPicture; //Sets image preview to image
byte[] buffer = new byte[skinPicture.Width * skinPicture.Height * 4];
input.Read(buffer, 0, buffer.Length);
Bitmap texture = TextureCodec.decode(buffer, skinPicture.Width, skinPicture.Height, fmt);
tex.texture = new RenderBase.OTexture(texture, "Texure");
tex.texture = treeViewMain.SelectedNode.Tag;
for (int i = 0; i < bch.textures.Count; i++)
{
loadedTexture tex = bch.textures[i];
tex.modified = true;
if (tex.modified)
{
byte[] buffer = align(TextureCodec.encode(tex.texture.texture, RenderBase.OTextureFormat.rgba8));
int diff = buffer.Length - tex.length;
replaceData(data, tex.offset, tex.length, buffer);
//Update offsets of next textures
tex.length = buffer.Length;
tex.modified = false;
updateTexture(i, tex);
for (int j = i; j < bch.textures.Count; j++)
{
loadedTexture next = bch.textures[j];
next.offset = (uint)(next.offset + diff);
updateTexture(j, next);
}
//Update all addresses poiting after the replaced data
bch.relocationTableOffset = (uint)(bch.relocationTableOffset + diff);
for (int index = 0; index < bch.relocationTableLength; index += 4)
{
data.Seek(bch.relocationTableOffset + index, SeekOrigin.Begin);
uint value = input.ReadUInt32();
uint offset = value & 0x1ffffff;
byte flags = (byte)(value >> 25);
if ((flags & 0x20) > 0 || flags == 7 || flags == 0xc)
{
if ((flags & 0x20) > 0)
data.Seek((offset * 4) + bch.gpuCommandsOffset, SeekOrigin.Begin);
else
data.Seek((offset * 4) + bch.mainHeaderOffset, SeekOrigin.Begin);
uint address = input.ReadUInt32();
if (address + bch.dataOffset > tex.offset)
{
address = (uint)(address + diff);
data.Seek(-4, SeekOrigin.Current);
output.Write(address);
}
}
}
uint newSize = (uint)((tex.texture.texture.Width << 16) | tex.texture.texture.Height);
//Update texture format
data.Seek(tex.gpuCommandsOffset, SeekOrigin.Begin);
for (int index = 0; index < tex.gpuCommandsWordCount * 3; index++)
{
uint command = input.ReadUInt32();
switch (command)
{
case 0xf008e:
case 0xf0096:
case 0xf009e:
replaceCommand(data, output, 0); //Set texture format to 0 = RGBA8888
break;
case 0xf0082:
case 0xf0092:
case 0xf009a:
replaceCommand(data, output, newSize); //Set new texture size
break;
}
}
//Update material texture format
foreach (loadedMaterial mat in bch.materials)
{
data.Seek(mat.gpuCommandsOffset, SeekOrigin.Begin);
for (int index = 0; index < mat.gpuCommandsWordCount; index++)
{
uint command = input.ReadUInt32();
switch (command)
{
case 0xf008e: if (mat.texture0 == tex.texture.name || mat.texture0 == "") replaceCommand(data, output, 0); break;
case 0xf0096: if (mat.texture1 == tex.texture.name || mat.texture1 == "") replaceCommand(data, output, 0); break;
case 0xf009e: if (mat.texture2 == tex.texture.name || mat.texture2 == "") replaceCommand(data, output, 0); break;
}
}
}
//Patch up BCH header for new offsets and lengths
data.Seek(4, SeekOrigin.Begin);
byte backwardCompatibility = input.ReadByte();
byte forwardCompatibility = input.ReadByte();
//Update Data Extended and Relocation Table offsets
data.Seek(18, SeekOrigin.Current);
if (backwardCompatibility > 0x20) updateAddress(data, input, output, diff);
updateAddress(data, input, output, diff);
//Update data length
data.Seek(12, SeekOrigin.Current);
updateAddress(data, input, output, diff);
}
}
}
MessageBox.Show("Done!", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}*/
}
#endregion
private void buttonEditModel_Click(object sender, EventArgs e)
{
PCK.MineFile mf = (PCK.MineFile)treeViewMain.SelectedNode.Tag;
if (Path.GetExtension(mf.name) == ".png")
editModel(mf);
if (Path.GetExtension(mf.name) == ".loc")
{
LOC l;
try
{
l = new LOC(mf.data);
}
catch
{
MessageBox.Show("No localization data found.", "Error", MessageBoxButtons.OK,
MessageBoxIcon.Error);
return;
}
(new LOCEditor(l)).ShowDialog();//Opens LOC Editor
mf.data = l.Rebuild();//Rebuilds loc file with locdata in grid view after closing dialog
}
}
private void openToolStripMenuItem1_Click(object sender, EventArgs e)
{
pckCenter open = new pckCenter();
open.Show();
}
private void OpenPck_MouseEnter(object sender, EventArgs e)
{
pckOpen.Image = Resources.pckOpen;
}
private void OpenPck_MouseLeave(object sender, EventArgs e)
{
pckOpen.Image = Resources.pckClosed;
}
private void tutorialsToolStripMenuItem_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start(hosturl + "pckStudio#tutorials");
}
private void FormMain_FormClosed(object sender, FormClosedEventArgs e)
{
if (saved == false)
{
if (MessageBox.Show("Save PCK?", "Unsaved PCK", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
{
if (saveLocation == Application.StartupPath + @"\templates\UntitledSkinPCK.pck")
{
save("Save As");
}
else
{
save("Save");
}
}
}
if (needsUpdate)
{
Process UPDATE = new Process();//sets up updater
UPDATE.StartInfo.FileName = Application.StartupPath + @"\nobleUpdater.exe";//updater program path
UPDATE.Start();//starts updater
Application.Exit();//closes PCK Studio to let updatear finish the job
}
}
private void OpenPck_DragEnter(object sender, DragEventArgs e)
{
pckOpen.Image = Resources.pckDrop;
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
foreach (var file in files)
{
var ext = System.IO.Path.GetExtension(file);
if (ext.Equals(".pck", StringComparison.CurrentCultureIgnoreCase))
e.Effect = DragDropEffects.Copy;
return;
}
}
private void OpenPck_DragDrop(object sender, DragEventArgs e)
{
string[] FileList = (string[])e.Data.GetData(DataFormats.FileDrop, false);
foreach (string pck in FileList)
{
openPck(pck);
}
}
private void OpenPck_DragLeave(object sender, EventArgs e)
{
pckOpen.Image = Resources.pckClosed;
}
private void savePCK(object sender, EventArgs e)
{
save("Save");
}
private void saveAsPCK(object sender, EventArgs e)
{
save("Save As");
}
private void openPck(object sender, EventArgs e)
{
}
private void wiiUPCKInstallerToolStripMenuItem_Click(object sender, EventArgs e)
{
installWiiU install = new installWiiU(null);
install.ShowDialog();
}
private void howToMakeABasicSkinPackToolStripMenuItem_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("https://www.youtube.com/watch?v=A43aHRHkKxk");
}
private void howToMakeACustomSkinModelToolStripMenuItem_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("https://www.youtube.com/watch?v=pEC_ug55lag");
}
private void howToMakeCustomSkinModelsbedrockToolStripMenuItem_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("https://www.youtube.com/watch?v=6z8NTogw5x4");
}
private void howToMakeCustomMusicToolStripMenuItem_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("https://www.youtube.com/watch?v=v6EYr4zc7rI");
}
private void howToInstallPcksDirectlyToWiiUToolStripMenuItem_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("https://www.youtube.com/watch?v=hRQagnEplec");
}
private void pCKCenterReleaseToolStripMenuItem_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("https://www.youtube.com/watch?v=E_6bXSh6yqw");
}
private void howPCKsWorkToolStripMenuItem_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("https://www.youtube.com/watch?v=hTlImrRrCKQ");
}
private void PS3PCKInstallerToolStripMenuItem_Click(object sender, EventArgs e)
{
installPS3 install = new installPS3(null);
install.ShowDialog();
}
private void settingsToolStripMenuItem_Click(object sender, EventArgs e)
{
Pref setting = new Pref();
setting.Show();
}
private void administrativeToolsToolStripMenuItem_Click(object sender, EventArgs e)
{
PCK_Manager pckm = new PCK_Manager();
pckm.Show();
}
private void uPDATEToolStripMenuItem_Click(object sender, EventArgs e)
{
}
private void uPDATEToolStripMenuItem1_Click(object sender, EventArgs e)
{
if (new WebClient().DownloadString(MinecraftUSkinEditor.Program.baseurl + "updatePCKStudio.txt").Replace("\n", "") != Version)
{
Console.WriteLine(new WebClient().DownloadString(MinecraftUSkinEditor.Program.baseurl + "updatePCKStudio.txt").Replace("\n", "") + " != " + Version);
if (MessageBox.Show("Update avaliable!\ndo you want to update?", "UPDATE", MessageBoxButtons.YesNo) == DialogResult.Yes)
Process.Start(Environment.CurrentDirectory + "\\nobleUpdater.exe");
else
uPDATEToolStripMenuItem1.Visible = true;
}
else
{
uPDATEToolStripMenuItem1.Visible = false;
}
}
private void VitaPCKInstallerToolStripMenuItem_Click(object sender, EventArgs e)
{
installVita install = new installVita(null);
install.ShowDialog();
}
private void toPhoenixARCDeveloperToolStripMenuItem_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("https://cash.app/$PhoenixARC");
}
private void toNobledezJackToolStripMenuItem_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("https://www.paypal.me/realnobledez");
}
private void menuStrip_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
}
}
}