From c0db2049a35bb8df7954ecd161caf0228416b059 Mon Sep 17 00:00:00 2001
From: miku-666 <74728189+NessieHax@users.noreply.github.com>
Date: Sat, 25 Jun 2022 23:38:40 +0200
Subject: [PATCH] Move and Rename Form1 ro MainForm
---
MinecraftUSkinEditor/Forms/Form1.cs | 2936 -----------------
.../Forms/Utilities/pckCenterOpen.cs | 2 +-
...Form1.Designer.cs => MainForm.Designer.cs} | 61 +-
MinecraftUSkinEditor/MainForm.cs | 2834 ++++++++++++++++
.../{Forms/Form1.ja.resx => MainForm.ja.resx} | 0
.../{Forms/Form1.resx => MainForm.resx} | 172 +-
MinecraftUSkinEditor/PckStudio.csproj | 16 +-
MinecraftUSkinEditor/Program.cs | 19 +
8 files changed, 2891 insertions(+), 3149 deletions(-)
delete mode 100644 MinecraftUSkinEditor/Forms/Form1.cs
rename MinecraftUSkinEditor/{Forms/Form1.Designer.cs => MainForm.Designer.cs} (95%)
create mode 100644 MinecraftUSkinEditor/MainForm.cs
rename MinecraftUSkinEditor/{Forms/Form1.ja.resx => MainForm.ja.resx} (100%)
rename MinecraftUSkinEditor/{Forms/Form1.resx => MainForm.resx} (99%)
create mode 100644 MinecraftUSkinEditor/Program.cs
diff --git a/MinecraftUSkinEditor/Forms/Form1.cs b/MinecraftUSkinEditor/Forms/Form1.cs
deleted file mode 100644
index 39e97aec..00000000
--- a/MinecraftUSkinEditor/Forms/Form1.cs
+++ /dev/null
@@ -1,2936 +0,0 @@
-
-using System;
-using System.Collections.Generic;
-using System.Drawing;
-using System.IO;
-using System.Linq;
-using System.Windows.Forms;
-using System.Drawing.Drawing2D;
-using System.IO.Compression;
-using System.Net;
-using System.Diagnostics;
-using PckStudio.Properties;
-using Ohana3DS_Rebirth.Ohana;
-using PckStudio.Forms;
-using System.Drawing.Imaging;
-using RichPresenceClient;
-using PckStudio.Classes.FileTypes;
-using PckStudio.Classes.IO;
-using PckStudio.Classes.IO.LOC;
-
-namespace PckStudio
-{
- public partial class FormMain : MetroFramework.Forms.MetroForm
- {
- string saveLocation = string.Empty;
- //string PCKFileBCKUP = "x";
- PCKFile currentPCK = null;
- bool needsUpdate = false;
- bool saved = true;
- bool isTemplateFile = false;
- public FormMain()
- {
- InitializeComponent();
- 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);
- pckOpen.AllowDrop = true;
- tabControl.SelectTab(0);
- RPC.Initialize("825875166574673940");
- labelVersion.Text = Application.ProductVersion;
- }
-
- private void openToolStripMenuItem_Click(object sender, EventArgs e)
- {
- using (var ofd = new OpenFileDialog())
- {
- ofd.CheckFileExists = true;
- ofd.Filter = "PCK (Minecraft Console Package)|*.pck";
- if (ofd.ShowDialog() == DialogResult.OK)
- {
- saveLocation = ofd.FileName;
- currentPCK = openPck(ofd.FileName);
- if (checkForPassword())
- {
- fileEntryCountLabel.Text = "Files:" + currentPCK.file_entries.Count;
- BuildMainTreeView();
- treeViewMain.Enabled = true;
- treeMeta.Enabled = true;
- closeToolStripMenuItem.Visible = true;
-
- saveToolStripMenuItem.Enabled = true;
- saveToolStripMenuItem1.Enabled = true;
- metaToolStripMenuItem.Enabled = true;
- addPasswordToolStripMenuItem.Enabled = true;
- advancedMetaAddingToolStripMenuItem.Enabled = true;
- convertToBedrockToolStripMenuItem.Enabled = true;
-
- tabControl.SelectTab(1);
- }
- }
- }
- }
-
- private PCKFile openPck(string filePath)
- {
- PCKFile pck = null;
- using (var fileStream = File.OpenRead(filePath))
- {
- isTemplateFile = false;
- saveLocation = filePath;
- pck = PCKFileReader.Read(fileStream, LittleEndianCheckBox.Checked);
- }
- if (pck.type < 3) throw new Exception("Can't open pck file of type: " + pck.type.ToString());
- return pck;
- }
-
- private bool checkForPassword()
- {
- foreach (var file_entry in currentPCK.file_entries)
- {
- if (file_entry.name != "0") continue;
- foreach (var pair in file_entry.properties)
- {
- addPasswordToolStripMenuItem.Enabled = !(pair.Item1 == "LOCK");
- if (pair.Item1 == "LOCK")
- return new pckLocked(pair.Item2).ShowDialog() == DialogResult.OK;
- }
- }
- addPasswordToolStripMenuItem.Enabled = true;
- return true;
- }
-
- ///
- /// wrapper that allows the use of in TreeNode.Nodes.Find(name, ...) and TreeNode.Nodes.ContainsKey(name)
- ///
- ///
- ///
- /// new Created TreeNode
- public static TreeNode CreateNode(string name, object tag = null)
- {
- TreeNode node = new TreeNode(name);
- node.Name = name;
- node.Tag = tag;
- return node;
- }
-
- private TreeNode BuildNodeTreeBySeperator(TreeNodeCollection root, string path, char seperator)
- {
- if (root == null) throw new ArgumentNullException("Root Collection is null");
- if (!path.Contains(seperator))
- {
- var finalNode = CreateNode(path);
- root.Add(finalNode);
- return finalNode;
- }
- string nodeText = path.Substring(0, path.IndexOf(seperator));
- string subPath = path.Substring(path.IndexOf(seperator) + 1);
- bool alreadyExists = root.ContainsKey(nodeText);
- TreeNode subNode = alreadyExists ? root[nodeText] : CreateNode(nodeText);
- if (!alreadyExists) root.Add(subNode);
- return BuildNodeTreeBySeperator(subNode.Nodes, subPath, seperator);
- }
-
- private void BuildPckTreeView(TreeNodeCollection root, PCKFile pckFile)
- {
- foreach (var file_entry in pckFile.file_entries)
- {
- TreeNode node = BuildNodeTreeBySeperator(root, file_entry.name, '/');
- node.Tag = file_entry;
- if (file_entry.type == 0 || file_entry.type == 1 || file_entry.type == 2) // skins, capes, textures
- {
- node.ImageIndex = 2;
- node.SelectedImageIndex = 2;
- }
- else if (file_entry.type == 6) // .loc
- {
- node.ImageIndex = 3;
- node.SelectedImageIndex = 3;
- }
- else if (file_entry.type == 8) // audio / binka
- {
- node.ImageIndex = 1;
- node.SelectedImageIndex = 1;
- }
- else if (file_entry.type == 11 || file_entry.type == 5) // Skins.pck, x16info.pck
- {
- node.ImageIndex = 4;
- node.SelectedImageIndex = 4;
- // TODO: load sub pck into tree and make it editable with ease
- // works but not currently included...
- using (var stream = new MemoryStream(file_entry.data))
- {
- PCKFile subPCKfile = PCKFileReader.Read(stream, LittleEndianCheckBox.Checked);
- BuildPckTreeView(node.Nodes, subPCKfile);
- }
- }
- else
- {
- node.ImageIndex = 5;
- node.SelectedImageIndex = 5;
- }
- }
- }
-
- private void BuildMainTreeView()
- {
- treeViewMain.Nodes.Clear();
- BuildPckTreeView(treeViewMain.Nodes, currentPCK);
- }
-
- private void selectNode(object sender, TreeViewEventArgs e)
- {
- treeMeta.Nodes.Clear();
- entryTypeTextBox.Text = "";
- entryDataTextBox.Text = "";
- buttonEdit.Visible = false;
- pictureBoxImagePreview.Image = Resources.NoImageFound;
- pictureBoxImagePreview.Show();
- labelImageSize.Text = "";
- var node = e.Node;
- if (node.Tag == null || !(node.Tag is PCKFile.FileData)) return;
- PCKFile.FileData file = node.Tag as PCKFile.FileData;
-
- // Retrieves metadata for currently selected mineifile and displays it within metatreeview
- foreach (var entry in file.properties)
- {
- TreeNode meta = new TreeNode(entry.Item1);
- meta.Tag = entry;
- treeMeta.Nodes.Add(meta);
- //Check for if file contains model data
- if (entry.Item1 == "BOX")
- {
- buttonEdit.Text = "EDIT BOXES";
- buttonEdit.Visible = true;
- }
- else if (entry.Item1 == "ANIM")
- {
- if ((entry.Item2 == "0x40000") || (entry.Item2 == "0x80000"))
- {
- buttonEdit.Text = "View Skin";
- buttonEdit.Visible = true;
- }
- }
- }
-
- // Check for Animated Texture
- if ((file.name.StartsWith("res/textures/blocks/") || file.name.StartsWith("res/textures/items/")) &&
- (!file.name.EndsWith("clock.png") && (!file.name.EndsWith("compass.png"))))
- {
- buttonEdit.Text = "EDIT TEXTURE ANIMATION";
- buttonEdit.Visible = true;
- }
-
- // If selected item is a image, its displayed with proper dimensions in image box
- if (Path.GetExtension(file.name) == ".png" || file.type == 0 || file.type == 1 || file.type == 2)
- {
- MemoryStream png = new MemoryStream(file.data);
- Image skinPicture = Image.FromStream(png);
- pictureBoxImagePreview.Image = skinPicture;
- labelImageSize.Text = skinPicture.Size.Width.ToString() + "x" + skinPicture.Size.Height.ToString();
- // TODO: eigther optimize or strip out
- 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
- 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
- return;
- }
- else
- {
- //Sets images to appear at largest relative size to program window size
- Size maxDisplay = new Size((tabPage1.Size.Width / 2 - 5) / 3, (tabPage1.Size.Height / 2 - 5) / 3);
- 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);
- }
- return;
- }
- }
- else if (file.type == 6) // .loc
- {
- buttonEdit.Text = "EDIT LOC";
- buttonEdit.Visible = true;
- }
- else if (file.name == "colours.col" || file.type == 9)
- {
- buttonEdit.Text = "EDIT COLORS";
- buttonEdit.Visible = true;
- }
- else if (Path.GetFileName(file.name) == "audio.pck" && file.type == 8)
- {
- buttonEdit.Text = "EDIT MUSIC CUES";
- buttonEdit.Visible = true;
- }
- }
-
- public void editModel(PCKFile.FileData skin)
- {
- generateModel generate = new generateModel(skin.properties, new PictureBox());
- //Opens Model Generator Dialog
- if (generate.ShowDialog() == DialogResult.OK)
- {
- entryTypeTextBox.Text = "";
- entryDataTextBox.Text = "";
- reloadMetaTreeView();
- saved = false;
- }
- }
-
- private void extractToolStripMenuItem_Click(object sender, EventArgs e)
- {
- if(treeViewMain.SelectedNode.Nodes.Count > 0)
- {
- MessageBox.Show("Cannot extract emtpy folder!");
- return;
- }
- if (!(treeViewMain.SelectedNode.Tag is PCKFile.FileData))
- {
- // TODO: add folder extract support
- return;
- }
- var file = treeViewMain.SelectedNode.Tag as PCKFile.FileData;
- SaveFileDialog exFile = new SaveFileDialog(); //extract location
- exFile.FileName = file.name;
- exFile.Filter = Path.GetExtension(file.name).Replace(".", "") + " File|*" + Path.GetExtension(file.name);
- if (exFile.ShowDialog() != DialogResult.OK) return;
- string extractFilePath = exFile.FileName;
- // Makes sure chosen directory isn't null or whitespace AKA makes sure its usable
- if (!string.IsNullOrWhiteSpace(Path.GetDirectoryName(extractFilePath)))
- {
- File.WriteAllBytes(extractFilePath, file.data);
- if (file.properties.Count > 0)
- {
- using (var fs = File.CreateText($"{extractFilePath}.txt"))
- {
- foreach (var entry in file.properties)
- {
- fs.WriteLine($"{entry.Item1}: {entry.Item2}");
- }
- }
- }
- MessageBox.Show("File Extracted"); // Verification that file extraction path was successful
- }
- }
-
- private void SaveTemplate()
- {
- SaveFileDialog saveFileDialog = new SaveFileDialog();
- saveFileDialog.Filter = "PCK (Minecraft Console Package)|*.pck";
- saveFileDialog.DefaultExt = ".pck";
- if (saveFileDialog.ShowDialog() == DialogResult.OK)
- {
- Save(saveFileDialog.FileName);
- }
- }
-
- private void Save(string FilePath)
- {
- currentPCK.ValidateMeta();
- using (var fs = File.OpenWrite(FilePath))
- {
- PCKFileWriter.Write(fs, currentPCK, LittleEndianCheckBox.Checked);
- }
- saved = true;
- MessageBox.Show("Saved Pck file", "File Saved");
- }
-
- private void replaceToolStripMenuItem_Click(object sender, EventArgs e)
- {
- if (!(treeViewMain.SelectedNode.Tag is PCKFile.FileData))
- {
- // should never happen unless its a folder
- MessageBox.Show("Can't replace a folder.");
- return;
- }
- PCKFile.FileData file = treeViewMain.SelectedNode.Tag as PCKFile.FileData;
- using (var ofd = new OpenFileDialog())
- {
- if (ofd.ShowDialog() == DialogResult.OK)
- {
- file.SetData(File.ReadAllBytes(ofd.FileName));
- saved = false;
- }
- }
- }
-
- private void deleteFileToolStripMenuItem_Click(object sender, EventArgs e)
- {
- if (treeViewMain.SelectedNode.Tag is PCKFile.FileData)
- {
- PCKFile.FileData file = treeViewMain.SelectedNode.Tag as PCKFile.FileData;
- // remove loc key if its a skin/cape
- if (file.type == 0 || file.type == 1)
- {
- LOCFile locFile = null;
- if (TryGetLocFile(out locFile))
- {
- foreach (var property in file.properties)
- {
- if (property.Item1 == "THEMENAMEID" || property.Item1 == "DISPLAYNAMEID")
- locFile.RemoveEntry(property.Item2);
- }
- TrySetLocFile(locFile);
- }
- }
- currentPCK.file_entries.Remove(file);
- treeViewMain.SelectedNode.Remove();
- saved = false;
- }
- 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 || item.Nodes.Count > 0)
- {
- MessageBox.Show("Can't fully delete directory with subdirectories");
- return;
- }
- if (item.Tag is PCKFile.FileData) // makes sure selected node is a minefile
- {
- //removes minefile from minefile list
- PCKFile.FileData file = (PCKFile.FileData)item.Tag;
- currentPCK.file_entries.Remove(file);
- item.Remove();
- }
- }
- treeViewMain.SelectedNode.Remove();
- saved = false;
- }
- }
-
- private void renameFileToolStripMenuItem_Click(object sender, EventArgs e)
- {
- TreeNode node = treeViewMain.SelectedNode;
- if (node == null || node.Tag == null || !(node.Tag is PCKFile.FileData)) return;
- var file = node.Tag as PCKFile.FileData;
- RenamePrompt diag = new RenamePrompt(file.name);
- if (diag.ShowDialog(this) == DialogResult.OK)
- {
- file.name = diag.NewText;
- saved = false;
- }
- diag.Dispose();
- BuildMainTreeView();
- }
-
- // deprecated ??
- #region adds file to treeview and PCKFile.FileData
- private void importFileToolStripMenuItem_Click(object sender, EventArgs e)
- {
- using (var ofd = new OpenFileDialog())
- {
- if (ofd.ShowDialog() == DialogResult.OK)
- {
- PCKFile.FileData newFile = new PCKFile.FileData(ofd.SafeFileName, 0);
- newFile.SetData(File.ReadAllBytes(ofd.FileName));
-
- if (treeViewMain.SelectedNode.Tag == null) // Detects if user selected a folder to add file to
- {
- currentPCK.file_entries.Insert(treeViewMain.SelectedNode.Nodes.Count - 1, newFile);//inserts minefile into proper list index
- string itemPath = "";//item path template
- List path = new List();//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 + "/";
- }
-
- // updates minefile name with directory
- currentPCK.file_entries[treeViewMain.SelectedNode.Nodes.Count - 1].name = itemPath + treeViewMain.SelectedNode.Nodes[treeViewMain.SelectedNode.Nodes.Count - 1].Text;
- }
- else //adds minefile to root of the pck
- {
- currentPCK.file_entries.Add(newFile);
- }
- saved = false;
- }
- }
- }
-
-
- private void GetPathToRoot(TreeNode node, List 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
-
- private void createSkinToolStripMenuItem_Click(object sender, EventArgs e)
- {
- if (!TryGetLocFile(out LOCFile locFile))
- {
- MessageBox.Show("No .loc file found", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
- return;
- }
- addnewskin add = new addnewskin(locFile);
- if (add.ShowDialog() == DialogResult.OK)
- {
- if (add.useCape)
- currentPCK.file_entries.Add(add.cape);
- currentPCK.file_entries.Add(add.skin);
- TrySetLocFile(locFile);
- saved = false;
- BuildMainTreeView();
- }
- add.Dispose();
- }
-
- PCKFile.FileData CreateAudioPCK(bool isLittle)
- {
- // create actual valid pck file structure
- PCKFile audioPck = new PCKFile(1); // 1 = audio.pck
- audioPck.meta_data.Add("CUENAME");
- audioPck.meta_data.Add("CREDIT");
- audioPck.meta_data.Add("CREDITID");
- audioPck.file_entries.Add(new PCKFile.FileData("", 0));
- audioPck.file_entries.Add(new PCKFile.FileData("", 1));
- audioPck.file_entries.Add(new PCKFile.FileData("", 2));
-
- // create a file data entry for current open pck file
- PCKFile.FileData audioFileData = new PCKFile.FileData("audio.pck", 8);
- using(var stream = new MemoryStream())
- {
- PCKFileWriter.Write(stream, audioPck, isLittle);
- audioFileData.SetData(stream.ToArray());
- }
- return audioFileData;
- }
-
- private void audiopckToolStripMenuItem_Click(object sender, EventArgs e)
- {
- List filenames = new List();
- foreach (TreeNode tNode in treeViewMain.Nodes)
- {
- filenames.Add(tNode.Text);
- }
-
- if (filenames.Contains("audio.pck"))
- {
- MessageBox.Show("There is already an audio.pck present in this file!", "Can't create audio.pck");
- return;
- }
- PCKFile.FileData audioMF = CreateAudioPCK(LittleEndianCheckBox.Checked);
- //TreeNode node = new TreeNode("audio.pck");
- //node.Tag = audioMF;
- //node.ImageIndex = 4;
- //node.SelectedImageIndex = 4;
- if (!TryGetLocFile(out LOCFile locFile))
- throw new Exception("No .loc file found.");
- Forms.Utilities.AudioEditor diag = new Forms.Utilities.AudioEditor(audioMF, locFile, LittleEndianCheckBox.Checked);
- diag.ShowDialog(this);
- //if (diag.saved) treeViewMain.Nodes.Add(node);
- diag.Dispose();
- }
-
-
- 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)
- {
- try
- {
- var animation_file = new PCKFile.FileData("", 2);
- AnimationEditor diag = new AnimationEditor(animation_file, ofd.FileName);
- diag.ShowDialog(this);
- diag.Dispose();
- treeMeta.Nodes.Clear();
- saved = false;
- }
- catch
- {
- MessageBox.Show("Invalid animation data.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
- return;
- }
- }
- }
- }
-
- private void treeViewMain_DoubleClick(object sender, EventArgs e)
- {
- if (treeViewMain.SelectedNode == null ||
- treeViewMain.SelectedNode.Tag == null ||
- !(treeViewMain.SelectedNode.Tag is PCKFile.FileData))
- return;
- PCKFile.FileData file = treeViewMain.SelectedNode.Tag as PCKFile.FileData;
- if (file.type == 6) // .loc
- {
- LOCFile l = null;
- using (var stream = new MemoryStream(file.data))
- {
- l = LOCFileReader.Read(stream);
- }
- var locedit = new LOCEditor(l);
- locedit.ShowDialog(this);
- if (locedit.WasModified)
- {
- using (var stream = new MemoryStream())
- {
- LOCFileWriter.Write(stream, l);
- file.SetData(stream.ToArray());
- }
- }
- }
-
- if (Path.GetFileName(file.name) == "audio.pck" && file.type == 8)
- {
- try
- {
- if (!TryGetLocFile(out LOCFile locFile))
- throw new Exception("No .loc File found.");
- Forms.Utilities.AudioEditor diag = new Forms.Utilities.AudioEditor(file, locFile, LittleEndianCheckBox.Checked);
- if (LittleEndianCheckBox.Checked) diag.Text += " (PS4/Vita)";
- diag.ShowDialog(this);
- diag.Dispose();
- }
- catch(Exception ex)
- {
- MessageBox.Show("Error", ex.Message, MessageBoxButtons.OK,
- MessageBoxIcon.Error);
- return;
- }
- }
-
- //Checks to see if selected minefile is a col file
- if (Path.GetExtension(file.name) == ".col" && file.type == 9)
- {
- if (file.size == 0)
- {
- MessageBox.Show("No Color data found.", "Error", MessageBoxButtons.OK,
- MessageBoxIcon.Error);
- return;
- }
- COLFile colFile = new COLFile();
- using (var stream = new MemoryStream(file.data))
- {
- colFile.Open(stream);
- }
- Forms.Utilities.COLEditor diag = new Forms.Utilities.COLEditor(colFile);
- if (diag.ShowDialog(this) == DialogResult.OK && diag.data.Length > 0)
- file.SetData(diag.data);
- diag.Dispose();
- }
-
- //Checks to see if selected minefile is a binka file
- //System.Threading.ThreadStart starter;
-
- //System.Threading.Thread binkam;
- if (Path.GetExtension(file.name) == ".binka")
- {
- MessageBox.Show(".binka Editor Coming Soon!");
- }
- }
-
- private void treeMeta_AfterSelect(object sender, TreeViewEventArgs e)
- {
- var node = e.Node;
- if (node == null || !(node.Tag is ValueTuple)) return;
- var property = (ValueTuple)node.Tag;;
- entryTypeTextBox.Text = property.Item1;
- entryDataTextBox.Text = property.Item2;
- }
-
- private void treeMeta_DoubleClick(object sender, EventArgs e)
- {
- if (treeMeta.SelectedNode == null || !(treeMeta.SelectedNode.Tag is ValueTuple) ||
- treeViewMain.SelectedNode == null || !(treeViewMain.SelectedNode.Tag is PCKFile.FileData))
- return;
- PCKFile.FileData file = (PCKFile.FileData)treeViewMain.SelectedNode.Tag;
- var property = (ValueTuple)treeMeta.SelectedNode.Tag;
- int i = file.properties.IndexOf(property);
- addMeta add = new addMeta(property.Item1, property.Item2);
- if (add.ShowDialog() == DialogResult.OK && i != -1)
- {
- file.properties[i] = new ValueTuple(add.PropertyName, add.PropertyValue);
- reloadMetaTreeView();
- saved = false;
- }
- add.Dispose();
- }
-
-
- private void deleteEntryToolStripMenuItem_Click(object sender, EventArgs e)
- {
- if (treeMeta.SelectedNode == null || !(treeMeta.SelectedNode.Tag is ValueTuple) ||
- !(treeViewMain.SelectedNode.Tag is PCKFile.FileData))
- return;
- var file = treeViewMain.SelectedNode.Tag as PCKFile.FileData;
- if (file.properties.Remove((ValueTuple)treeMeta.SelectedNode.Tag))
- {
- treeMeta.SelectedNode.Remove();
- saved = false;
- }
- }
-
- private void reloadMetaTreeView()
- {
- treeMeta.Nodes.Clear();
- if (treeViewMain.SelectedNode == null ||
- !(treeViewMain.SelectedNode.Tag is PCKFile.FileData)) return;
- var file = treeViewMain.SelectedNode.Tag as PCKFile.FileData;
- foreach (var property in file.properties)
- {
- TreeNode node = new TreeNode(property.Item1);
- node.Tag = property;
- treeMeta.Nodes.Add(node);
- }
- }
-
- private void addEntryToolStripMenuItem_Click_1(object sender, EventArgs e)
- {
- if (treeViewMain.SelectedNode.Tag == null ||
- !(treeViewMain.SelectedNode.Tag is PCKFile.FileData))
- return;
- PCKFile.FileData file = (PCKFile.FileData)treeViewMain.SelectedNode.Tag;
- addMeta add = new addMeta();
- if (add.ShowDialog() == DialogResult.OK)
- {
- var property = new ValueTuple(add.PropertyName, add.PropertyValue);
- file.properties.Add(property);
- reloadMetaTreeView();
- saved = false;
- }
- add.Dispose();
- }
-
- private void moveUpToolStripMenuItem_Click(object sender, EventArgs e)
- {
- TreeNode move = (TreeNode)treeViewMain.SelectedNode.Clone();
-
- if (treeViewMain.SelectedNode.Parent == null)
- {
- if (treeViewMain.SelectedNode.PrevNode == null) return;
- treeViewMain.Nodes.Insert(treeViewMain.SelectedNode.PrevNode.Index, move);
- treeViewMain.SelectedNode.Remove();
- }
- else
- {
- if (treeViewMain.SelectedNode.PrevNode == null) return;
- treeViewMain.SelectedNode.Parent.Nodes.Insert(treeViewMain.SelectedNode.PrevNode.Index, move);
- //removes node because a clone was inserted into its new index
- treeViewMain.SelectedNode.Remove();
- }
- treeViewMain.SelectedNode = move;
- saved = false;
- }
-
- private void moveDownToolStripMenuItem_Click(object sender, EventArgs e)
- {
- TreeNode move = (TreeNode)treeViewMain.SelectedNode.Clone();
- if (treeViewMain.SelectedNode.Parent == null)
- {
- if (treeViewMain.SelectedNode.NextNode == null) return;
- treeViewMain.Nodes.Insert(treeViewMain.SelectedNode.NextNode.Index + 1, move);
- //removes node because a clone was inserted into its new index
- treeViewMain.SelectedNode.Remove();
- }
- else
- {
- if (treeViewMain.SelectedNode.NextNode == null) return;
- treeViewMain.SelectedNode.Parent.Nodes.Insert(treeViewMain.SelectedNode.NextNode.Index + 1, move);
- //removes node because a clone was inserted into its new index
- treeViewMain.SelectedNode.Remove();
- }
- treeViewMain.SelectedNode = move;
- saved = false;
- }
-
- #region drag and drop for main tree node
-
- public static void getChildren(List Nodes, TreeNode Node)
- {
- foreach (TreeNode thisNode in Node.Nodes)
- {
- Nodes.Add(thisNode);
- getChildren(Nodes, thisNode);
- }
- }
-
- // Most of the code below is modified code from this link: https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.treeview.itemdrag?view=windowsdesktop-6.0
- // - MattNL
-
- private void treeViewMain_ItemDrag(object sender, ItemDragEventArgs e)
- {
-
- }
-
- // Set the target drop effect to the effect
- // specified in the ItemDrag event handler.
- private void treeViewMain_DragEnter(object sender, DragEventArgs e)
- {
- e.Effect = e.AllowedEffect;
- }
-
- // Select the node under the mouse pointer to indicate the
- // expected drop location.
- private void treeViewMain_DragOver(object sender, DragEventArgs e)
- {
-
- }
-
- private void treeViewMain_DragDrop(object sender, DragEventArgs e)
- {
-
- }
-
- // Determine whether one node is a parent
- // or ancestor of a second node.
- private bool ContainsNode(TreeNode node1, TreeNode node2)
- {
- // Check the parent node of the second node.
- if (node2.Parent == null) return false;
- if (node2.Parent.Equals(node1)) return true;
- // If the parent node is not null or equal to the first node,
- // call the ContainsNode method recursively using the parent of
- // the second node.
- return ContainsNode(node1, node2.Parent);
- }
-
- #endregion
-
- private void metaToolStripMenuItem_Click(object sender, EventArgs e)
- {
- meta edit = new meta(currentPCK);
- edit.TopMost = true;
- edit.TopLevel = true;
- edit.Show();
- //saved = false;
- }
-
- private void addPresetToolStripMenuItem1_Click(object sender, EventArgs e)
- {
- PCKFile.FileData file = (PCKFile.FileData)treeViewMain.SelectedNode.Tag;
- presetMeta add = new presetMeta(file);
- if (add.ShowDialog() == DialogResult.OK)
- {
- reloadMetaTreeView();
- saved = false;
- }
- add.Dispose();
- }
-
- private void InitializeSkinPack(int packId, int packVersion, string packName)
- {
- currentPCK = new PCKFile(3);
- currentPCK.meta_data.Add("PACKID");
- currentPCK.meta_data.Add("PACKVERSION");
- var zeroFile = new PCKFile.FileData("0", 4);
- zeroFile.properties.Add(("PACKID", packId.ToString()));
- zeroFile.properties.Add(("PACKVERSION", packVersion.ToString()));
- var loc = new PCKFile.FileData("localisation.loc", 6);
- var locFile = new LOCFile();
- locFile.InitializeDefault(packName);
- using (var stream = new MemoryStream())
- {
- LOCFileWriter.Write(stream, locFile);
- loc.SetData(stream.ToArray());
- }
- currentPCK.file_entries.Add(zeroFile);
- currentPCK.file_entries.Add(loc);
- }
-
- private void InitializeTexturePack(int packId, int packVersion, string packName)
- {
- InitializeSkinPack(packId, packVersion, packName);
- currentPCK.meta_data.Add("DATAPATH");
- var texturepackInfo = new PCKFile.FileData("x16/x16Info.pck", 5);
- texturepackInfo.properties.Add(("PACKID", "0"));
- texturepackInfo.properties.Add(("DATAPATH", "x16Data.pck"));
- currentPCK.file_entries.Add(texturepackInfo);
- }
-
- private void skinPackToolStripMenuItem_Click(object sender, EventArgs e)
- {
- // make skin pack template
- RenamePrompt namePrompt = new RenamePrompt("");
- namePrompt.OKButton.Text = "Ok";
- if (namePrompt.ShowDialog() == DialogResult.OK)
- {
- InitializeSkinPack(new Random().Next(8000, int.MaxValue), 0, namePrompt.NewText);
- isTemplateFile = true;
- BuildMainTreeView();
- }
- }
- private void texturePackToolStripMenuItem_Click(object sender, EventArgs e)
- {
- // make texture pack template
- RenamePrompt namePrompt = new RenamePrompt("");
- namePrompt.OKButton.Text = "Ok";
- if (namePrompt.ShowDialog() == DialogResult.OK)
- {
- InitializeTexturePack(new Random().Next(8000, int.MaxValue), 0, namePrompt.NewText);
- isTemplateFile = true;
- BuildMainTreeView();
- }
- }
-
- private void advancedMetaAddingToolStripMenuItem_Click(object sender, EventArgs e)
- {
- //opens dialog for bulk minefile editing
- AdvancedOptions advanced = new AdvancedOptions(currentPCK);
- if (advanced.ShowDialog() == DialogResult.OK)
- saved = false;
- advanced.Dispose();
- }
-
- private void closeToolStripMenuItem_Click(object sender, EventArgs e)
- {
- if (!saved)
- SaveTemplate();
- pictureBoxImagePreview.Hide();
- treeViewMain.Nodes.Clear();
- treeMeta.Nodes.Clear();
- currentPCK = null;
- treeViewMain.Enabled = false;
- treeMeta.Enabled = false;
- saveToolStripMenuItem.Enabled = false;
- saveToolStripMenuItem1.Enabled = false;
- metaToolStripMenuItem.Enabled = false;
- addPasswordToolStripMenuItem.Enabled = false;
- advancedMetaAddingToolStripMenuItem.Enabled = false;
- convertToBedrockToolStripMenuItem.Enabled = false;
- closeToolStripMenuItem.Visible = false;
- fileEntryCountLabel.Text = "";
- tabControl.SelectTab(0);
- }
-
- private void programInfoToolStripMenuItem_Click(object sender, EventArgs e)
- {
- programInfo info = new programInfo();
- info.ShowDialog();
- info.Dispose();
- }
-
- private void Form1_Load(object sender, EventArgs e)
- {
- try
- {
- RPC.SetRPC("Sitting alone", "Program by PhoenixARC", "pcklgo", "PCK Studio", "pcklgo");
- timer1.Start();
- timer1.Enabled = true;
- }
- catch(Exception ex)
- {
- Console.WriteLine("ERROR WITH RPC");
- Console.WriteLine(ex.Message);
- }
-#if DEBUG
- DBGLabel.Visible = true;
-#else
- DBGLabel.Visible = false;
-#endif
- //Makes sure appdata exists
- if (!Directory.Exists(Program.Appdata))
- {
- Directory.CreateDirectory(Program.Appdata);
- }
-
- if (!Directory.Exists(Program.Appdata + "\\cache\\mods\\"))
- {
- Directory.CreateDirectory(Program.Appdata + "\\cache\\mods\\");
- }
- }
-
- private void treeViewMain_KeyDown(object sender, KeyEventArgs e)
- {
- if (e.KeyCode == Keys.Delete)
- deleteFileToolStripMenuItem_Click(sender, e);
- }
-
- 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 Console Package)|*.pck";
-
- if (ofd.ShowDialog() == DialogResult.OK && sfd.ShowDialog() == DialogResult.OK)
- {
- PCKFile pckfile = null;
- using (var fs = File.OpenRead(ofd.FileName))
- {
- pckfile = PCKFileReader.Read(fs, LittleEndianCheckBox.Checked);
- }
- foreach (PCKFile.FileData mf in pckfile.file_entries)
- {
- foreach (var entry in mf.properties)
- {
- // Check for lock on PCK File
- if (entry.Item1 == "LOCK" &&
- new pckLocked(entry.Item2).ShowDialog() != DialogResult.OK)
- return; // cancel extraction if password not provided
- }
- FileInfo file = new 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 (var entry in mf.properties)
- {
- metaData += $"{entry.Item1}: {entry.Item2}{Environment.NewLine}";
- }
-
- File.WriteAllText(sfd.SelectedPath + @"\" + mf.name + ".txt", metaData);
- }
- }
- } catch (Exception)
- {
- MessageBox.Show("An Error occured while extracting data");
- }
- }
-
-
- private void treeMeta_KeyDown(object sender, KeyEventArgs e)
- {
- if (e.KeyData == Keys.Delete && treeMeta.SelectedNode != null && treeViewMain.SelectedNode.Tag is PCKFile.FileData)
- {
- //removes selected treemeta entry
- var file = treeViewMain.SelectedNode.Tag as PCKFile.FileData;
- if (file.properties.Remove((ValueTuple)treeMeta.SelectedNode.Tag))
- treeMeta.Nodes.Remove(treeMeta.SelectedNode);
- saved = false;
- }
- }
-
-#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"))
- {
- ListViewItem Import = new ListViewItem();//listviewitem to store temporary data
- Import.Text = file.Name.Remove(file.Name.Length - 4, 4);//gets file name without extension
-
- //sets minefile type based on wether cape or skin
- int type = 0;
- if (Import.Text.Remove(7, Import.Text.Length - 7) == "dlccape" || Import.Text.Remove(7, Import.Text.Length - 7) == "DLCCAPE")
- {
- type = 1;
- }
- PCKFile.FileData mfNew = new PCKFile.FileData("", type); //new minefile template
- mfNew.SetData(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.file_entries.Add(mfNew);//adds new minefile to minefile list for skin
-
- //Sets minefile directory based on pcks structure/type
- if (mashupStructure == true)
- {
- mfNew.name = "Skins/" + Import.Text + ".png";
- }
- else
- {
- mfNew.name = Import.Text + ".png";
- }
-
- 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
-
- 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
- mfNew.properties.Add(new ValueTuple(entryName, entryValue));
-
- if (entryName == "DISPLAYNAMEID")
- {
- locNameId = entryValue;
- }
-
- if (entryName == "DISPLAYNAME")
- {
- locName = entryValue;
- }
-
- if (entryName == "THEMENAMEID")
- {
- locThemeId = entryValue;
- }
-
- if (entryName == "THEMENAME")
- {
- locTheme = entryValue;
- }
-
- //creates metadata id in loc file
- if (locThemeId != "" && locTheme != "")
- {
- PCKFile.FileData locfile = currentPCK.GetFile("localisation.loc", 6);
- if (locfile == null)
- locfile = currentPCK.GetFile("languages.loc", 6);
- if (locfile == null)
- throw new Exception("counld not find .loc file");
- LOCFile l = null;
- try
- {
- using (var stream = new MemoryStream(locfile.data))
- {
- l = LOCFileReader.Read(stream);//sets loc data
- }
- }
- catch
- {
- MessageBox.Show("No localization data found.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
- return;
- }
-
- l.AddLocKey(locThemeId, locTheme);
- using (var stream = new MemoryStream())
- {
- LOCFileWriter.Write(stream, l);
- locfile.SetData(stream.ToArray());
- }
- 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
-
- private bool TryGetLocFile(out LOCFile locFile)
- {
- PCKFile.FileData locdata = null;
- if (currentPCK.HasFile("localisation.loc", 6))
- locdata = currentPCK.GetFile("localisation.loc", 6);
- else if (currentPCK.HasFile("languages.loc", 6))
- locdata = currentPCK.GetFile("languages.loc", 6);
- else {
- locFile = null;
- return false;
- }
-
- try
- {
- using (var stream = new MemoryStream(locdata.data))
- {
- locFile = LOCFileReader.Read(stream);
- }
- return true;
- }
- catch (Exception ex)
- {
- Console.WriteLine(ex.Message);
- }
- locFile = null;
- return false;
- }
-
- private bool TrySetLocFile(in LOCFile locFile)
- {
- PCKFile.FileData locdata = null;
- if (currentPCK.HasFile("localisation.loc", 6))
- locdata = currentPCK.GetFile("localisation.loc", 6);
- else if (currentPCK.HasFile("languages.loc", 6))
- locdata = currentPCK.GetFile("languages.loc", 6);
- else {
- return false;
- }
-
- try
- {
- using (var stream = new MemoryStream())
- {
- LOCFileWriter.Write(stream, locFile);
- locdata.SetData(stream.ToArray());
- }
- return true;
- }
- catch (Exception ex)
- {
- Console.WriteLine(ex.Message);
- }
- return false;
- }
-
-
- private void importSkin(object sender, EventArgs e)
- {
- using (OpenFileDialog contents = new OpenFileDialog())
- {
- contents.Title = "Select Extracted Skin Data File";
- contents.Filter = "Text Files (*.txt)|*.txt";
-
- if (contents.ShowDialog() == DialogResult.OK)
- {
- string skinNameImport = Path.GetFileName(contents.FileName); //Gets skin file name
- string dataFilePath = contents.FileName.Remove(contents.FileName.Length - 4, 4);
- if (!File.Exists(dataFilePath)) return;
- byte[] data = File.ReadAllBytes(dataFilePath);
- PCKFile.FileData mfNew = new PCKFile.FileData(skinNameImport, 0);
- mfNew.SetData(data);
- string[] txtProperties = File.ReadAllText(contents.FileName).Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
- LOCFile locFile = null;
- if ((txtProperties.Contains("DISPLAYNAMEID") && txtProperties.Contains("DISPLAYNAME")) ||
- (txtProperties.Contains("THEMENAMEID") && txtProperties.Contains("THEMENAME")) &&
- TryGetLocFile(out locFile))
- {
- // do stuff
- //l.AddLocKey(locThemeId, locTheme);
- //using (var stream = new MemoryStream())
- //{
- // LOCFileWriter.Write(stream, locFile);
- // locdata.SetData(stream.ToArray());
- //}
- }
-
- try
- {
- foreach (string prop in txtProperties)
- {
- string[] arg = prop.Split(':');
- if (arg.Length < 2) continue;
- string key = arg[0];
- string value = arg[1];
- if (key == "DISPLNAMEID" || key == "THEMENAMEID")
- {
-
- }
- mfNew.properties.Add(new ValueTuple(key, value));
- }
- saved = false;
- }
- catch (Exception ex)
- {
- MessageBox.Show(ex.Message);
- }
- }
- }
- }
-
- private void folderToolStripMenuItem_Click(object sender, EventArgs e)
- {
- RenamePrompt folderNamePrompt = new RenamePrompt("");
- folderNamePrompt.OKButton.Text = "Add";
- if (folderNamePrompt.ShowDialog() == DialogResult.OK)
- {
- TreeNode folerNode = CreateNode(folderNamePrompt.NewText);
- folerNode.ImageIndex = 0;
- folerNode.SelectedImageIndex = 0;
- TreeNodeCollection nodeCollection = treeViewMain.SelectedNode != null &&
- !(treeViewMain.SelectedNode.Tag is PCKFile.FileData)
- ? treeViewMain.SelectedNode.Nodes : treeViewMain.Nodes;
- nodeCollection.Add(folerNode);
- }
- }
-
- private void installationToolStripMenuItem_Click(object sender, EventArgs e)
- {
- //System.Diagnostics.Process.Start(hosturl + "pckStudio#install");
- }
-
- private void binkaConversionToolStripMenuItem_Click(object sender, EventArgs e)
- {
- Process.Start("https://www.youtube.com/watch?v=v6EYr4zc7rI");
- }
-
- private void fAQToolStripMenuItem1_Click(object sender, EventArgs e)
- {
- //System.Diagnostics.Process.Start(hosturl + "pckStudio#faq");
- }
-// BIG TODO
-#region converts and ports all skins in pck to mc bedrock format
- // items class for use in bedrock skin conversion
- public class Item
- {
- public string Id { get; set; }
- public string Name { get; set; }
- }
-
- 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
- {
- 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- skinDisplayNames = new List
- ();
-
- //MessageBox.Show(root);//debug thingy to make sure filepath is correct
-
- //add all skins to a list
- List skinsList = new List();
- List capesList = new List();
- foreach (PCKFile.FileData skin in currentPCK.file_entries)
- {
- 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 (PCKFile.FileData newSkin in skinsList)
- {
- skinAmount += 1;
- string skinName = "skinName";
- string capePath = "";
- bool hasCape = false;
-
- foreach (var entry in newSkin.properties)
- {
- if (entry.Item1 == "DISPLAYNAME")
- {
- skinName = entry.Item2;
- skinDisplayNames.Add(new Item() { Id = newSkin.name.Remove(15, 4), Name = skinName });
- }
- if (entry.Item1 == "CAPEPATH")
- {
- hasCape = true;
- capePath = entry.Item2.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 (PCKFile.FileData 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
- modelDataHead = new List
- ();
- List
- modelDataBody = new List
- ();
- List
- modelDataLeftArm = new List
- ();
- List
- modelDataRightArm = new List
- ();
- List
- modelDataLeftLeg = new List
- ();
- List
- modelDataRightLeg = new List
- ();
- List
- modelData = new List
- ();
-
-
- if (skinPicture.Height == skinPicture.Width)
- {
- //determines skin type based on image dimensions, existence of BOX tags, and the ANIM value
- foreach (var entry in newSkin.properties)
- {
- if (entry.Item1 == "BOX")
- {
- string mClass = "";
- string mData = "";
- foreach (char dCheck in entry.Item2)
- {
- if (dCheck.ToString() != " ")
- {
- mClass += dCheck.ToString();
- }
- else
- {
- mData = entry.Item2.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.Item1 == "OFFSET")
- {
- string oClass = "";
- string oData = "";
- foreach (char oCheck in entry.Item2.ToString())
- {
- oData = entry.Item2.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.Item1 == "ANIM")
- {
- if (entry.Item2 == "0x40000")
- {
-
- }
- else if (entry.Item2 == "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(" }");
- }
- }
- Console.WriteLine(writeSkins);
- }
- 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 (PCKFile.FileData 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 (PCKFile.FileData 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 3ds feature in testing
-
- 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 textures;
- public List materials;
-
- public loadedBCH()
- {
- textures = new List();
- materials = new List();
- }
- }
-
- 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)
- {
- loadedTexture tex = new loadedTexture();
-
- 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(((PCKFile.FileData)(treeViewMain.SelectedNode.Tag)).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, RenderBase.OTextureFormat.rgba8);
- tex.texture = new RenderBase.OTexture(texture, "Texure");
-
- //tex.texture = treeViewMain.SelectedNode.Tag;
-
- for (int i = 0; i < bch.textures.Count; i++)
- {
- tex = bch.textures[i];
- tex.modified = true;
-
- if (tex.modified)
- {
- byte[] bufferx = align(TextureCodec.encode(tex.texture.texture, RenderBase.OTextureFormat.rgba8));
- int diff = bufferx.Length - tex.length;
-
- replaceData(data, tex.offset, tex.length, bufferx);
-
- //Update offsets of next textures
- tex.length = bufferx.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);
- }
- }
- using (Stream file = File.Create(currentFile + ".tmp"))
- {
- CopyStream(output.BaseStream, file);
- }
-
- }
-
- MessageBox.Show("Done!", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
- }
-
- }
-
-
- public static void CopyStream(Stream input, Stream output)
- {
- byte[] buffer = new byte[8 * 1024];
- int len;
- while ((len = input.Read(buffer, 0, buffer.Length)) > 0)
- {
- output.Write(buffer, 0, len);
- }
- }
-
-#endregion
-
- private void openToolStripMenuItem1_Click(object sender, EventArgs e)
- {
- DateTime Begin = DateTime.Now;
- //pckCenter open = new pckCenter();
- Forms.Utilities.PckCenterBeta open = new Forms.Utilities.PckCenterBeta();
- open.Show();
- TimeSpan duration = new TimeSpan(DateTime.Now.Ticks - Begin.Ticks);
-
- Console.WriteLine("Completed in: " + duration);
- }
-
- private void wiiUPCKInstallerToolStripMenuItem_Click(object sender, EventArgs e)
- {
- installWiiU install = new installWiiU(null);
- install.ShowDialog();
- }
-
- private void howToMakeABasicSkinPackToolStripMenuItem_Click(object sender, EventArgs e)
- {
- Process.Start("https://www.youtube.com/watch?v=A43aHRHkKxk");
- }
-
- private void howToMakeACustomSkinModelToolStripMenuItem_Click(object sender, EventArgs e)
- {
- Process.Start("https://www.youtube.com/watch?v=pEC_ug55lag");
- }
-
- private void howToMakeCustomSkinModelsbedrockToolStripMenuItem_Click(object sender, EventArgs e)
- {
- Process.Start("https://www.youtube.com/watch?v=6z8NTogw5x4");
- }
-
- private void howToMakeCustomMusicToolStripMenuItem_Click(object sender, EventArgs e)
- {
- Process.Start("https://www.youtube.com/watch?v=v6EYr4zc7rI");
- }
-
- private void howToInstallPcksDirectlyToWiiUToolStripMenuItem_Click(object sender, EventArgs e)
- {
- Process.Start("https://www.youtube.com/watch?v=hRQagnEplec");
- }
-
- private void pCKCenterReleaseToolStripMenuItem_Click(object sender, EventArgs e)
- {
- Process.Start("https://www.youtube.com/watch?v=E_6bXSh6yqw");
- }
-
- private void howPCKsWorkToolStripMenuItem_Click(object sender, EventArgs e)
- {
- 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 VitaPCKInstallerToolStripMenuItem_Click(object sender, EventArgs e)
- {
-
- installVita install = new installVita(null);
- install.ShowDialog();
- }
-
- private void toPhoenixARCDeveloperToolStripMenuItem_Click(object sender, EventArgs e)
- {
- Process.Start("https://cash.app/$PhoenixARC");
- }
-
- private void toNobledezJackToolStripMenuItem_Click(object sender, EventArgs e)
- {
- Process.Start("https://www.paypal.me/realnobledez");
- }
-
- private void addPasswordToolStripMenuItem_Click(object sender, EventArgs e)
- {
- if (!currentPCK.HasFile("0", 4)) throw new Exception("0 file not found");
- PCKFile.FileData file = currentPCK.GetFile("0", 4); // Sets minefile to selected node
- if (checkForPassword())
- {
- AddPCKPassword add = new AddPCKPassword(); //sets metadata adding dialog
- if (add.ShowDialog() == DialogResult.OK)
- file.properties.Add(("LOCK", add.Password));
- add.Dispose();
- reloadMetaTreeView();
- saved = false;
- }
- }
-
- private void joinDevelopmentDiscordToolStripMenuItem_Click(object sender, EventArgs e)
- {
- Process.Start("https://discord.gg/aJtZNFVQTv");
- }
-
- private void convertPCTextrurePackToolStripMenuItem_Click(object sender, EventArgs e)
- {
- Forms.Utilities.TextureConverterUtility tex = new Forms.Utilities.TextureConverterUtility(treeViewMain, currentPCK);
- tex.ShowDialog();
- }
-
-
- private void buttonEditModel_Click(object sender, EventArgs e)
- {
- if (treeViewMain.SelectedNode == null ||
- treeViewMain.SelectedNode.Tag == null ||
- !(treeViewMain.SelectedNode.Tag is PCKFile.FileData))
- return;
- PCKFile.FileData file = treeViewMain.SelectedNode.Tag as PCKFile.FileData;
- if (file.type == 0 || file.type == 1 || file.type == 2)
- {
- if (buttonEdit.Text == "EDIT BOXES")
- editModel(file);
- else if (buttonEdit.Text == "View Skin")
- {
- using (var ms = new MemoryStream(file.data))
- {
- SkinPreview frm = new SkinPreview(Image.FromStream(ms));
- frm.ShowDialog(this);
- frm.Dispose();
- }
- }
- }
-
- //Check for Animated Texture
- if (file.name.StartsWith("res/textures/blocks/") || file.name.StartsWith("res/textures/items/"))
- {
- try
- {
- AnimationEditor diag = new AnimationEditor(file);
- diag.ShowDialog(this);
- diag.Dispose();
- reloadMetaTreeView();
- }
- catch
- {
- MessageBox.Show("Invalid animation data.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
- return;
- }
- }
-
- if (Path.GetFileName(file.name) == "audio.pck")
- {
- try
- {
- if (!TryGetLocFile(out LOCFile locFile))
- throw new Exception("No .loc File found.");
- Forms.Utilities.AudioEditor diag = new Forms.Utilities.AudioEditor(file, locFile, LittleEndianCheckBox.Checked);
- diag.ShowDialog(this);
- diag.Dispose();
- }
- catch (Exception ex)
- {
- MessageBox.Show("Error", ex.Message, MessageBoxButtons.OK,
- MessageBoxIcon.Error);
- return;
- }
- }
-
- if (file.type == 6 && (file.name == "languages.loc" || file.name == "localisation.loc"))
- {
- LOCFile locFile = null;
- using (var stream = new MemoryStream(file.data))
- {
- locFile = LOCFileReader.Read(stream);
- }
- var locEditor = new LOCEditor(locFile);
- locEditor.ShowDialog();
- using (var stream = new MemoryStream())
- {
- LOCFileWriter.Write(stream, locFile);
- file.SetData(stream.ToArray());
- }
- }
-
- // Checks to see if selected minefile is a col file
- if (file.type == 9 && file.name == "colours.col") // .col file
- {
- COLFile colFile = new COLFile();
- using (var stream = new MemoryStream(file.data))
- {
- colFile.Open(stream);
- }
- Forms.Utilities.COLEditor diag = new Forms.Utilities.COLEditor(colFile);
- if (diag.ShowDialog(this) == DialogResult.OK && diag.data.Length > 0)
- file.SetData(diag.data);
- diag.Dispose();
- }
- }
-
-
- 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 FormMain_FormClosed(object sender, FormClosedEventArgs e)
- {
- if (needsUpdate && File.Exists(Program.Appdata + @"\nobleUpdater.exe"))
- {
- Process.Start(Program.Appdata + @"\nobleUpdater.exe"); // starts updater
- Application.Exit(); // closes PCK Studio to let updatear finish the job
- }
- }
-
- private void checkSaveState()
- {
- if (!saved || isTemplateFile &&
- MessageBox.Show("Save PCK?", "Unsaved PCK", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
- {
- if (isTemplateFile || string.IsNullOrEmpty(saveLocation))
- {
- SaveTemplate();
- return;
- }
- Save(saveLocation);
- }
- }
-
- 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 = 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);
- if (FileList.Length > 1)
- MessageBox.Show("Only one pck file at a time is currently supported");
- currentPCK = openPck(FileList[0]);
- BuildMainTreeView();
- }
-
- private void OpenPck_DragLeave(object sender, EventArgs e)
- {
- pckOpen.Image = Resources.pckClosed;
- }
-
- private void savePCK(object sender, EventArgs e)
- {
- checkSaveState();
- }
-
- private void saveAsPCK(object sender, EventArgs e)
- {
- SaveTemplate();
- }
-
- private void timer1_Tick(object sender, EventArgs e)
- {
- //! TODO
- //try
- //{
- // RPC.SetRPC("Developing " + Path.GetFileName(PCKFilePath), "Program by PhoenixARC", "pcklgo", "PCK Studio", "pcklgo");
- //}
- //catch (Exception ex)
- //{
- // Console.WriteLine(ex.Message);
- //}
- }
-
- private void FormMain_FormClosing(object sender, FormClosingEventArgs e)
- {
- checkSaveState();
- RPC.CloseRPC();
- }
-
- private void FormMain_Deactivate(object sender, EventArgs e)
- {
- RPC.CloseRPC();
- }
-
- private void FormMain_Activated(object sender, EventArgs e)
- {
- try
- {
- RPC.Initialize("825875166574673940");
- RPC.SetRPC("Sitting alone", "Program by PhoenixARC", "pcklgo", "PCK Studio", "pcklgo");
- timer1.Start();
- timer1.Enabled = true;
- }
- catch (Exception ex)
- {
- Console.WriteLine(ex.Message);
- }
- }
-
- private void forMattNLContributorToolStripMenuItem_Click(object sender, EventArgs e)
- {
- Process.Start("https://ko-fi.com/mattnl");
- }
- }
-}
\ No newline at end of file
diff --git a/MinecraftUSkinEditor/Forms/Utilities/pckCenterOpen.cs b/MinecraftUSkinEditor/Forms/Utilities/pckCenterOpen.cs
index caeb50e4..578c77f5 100644
--- a/MinecraftUSkinEditor/Forms/Utilities/pckCenterOpen.cs
+++ b/MinecraftUSkinEditor/Forms/Utilities/pckCenterOpen.cs
@@ -15,7 +15,7 @@ using System.Windows.Media.Imaging;
using System.IO.Packaging;
using PckStudio;
using System.IO.Compression;
-using static PckStudio.FormMain;
+using static PckStudio.MainForm;
using PckStudio.Classes.FileTypes;
using PckStudio.Classes.IO;
diff --git a/MinecraftUSkinEditor/Forms/Form1.Designer.cs b/MinecraftUSkinEditor/MainForm.Designer.cs
similarity index 95%
rename from MinecraftUSkinEditor/Forms/Form1.Designer.cs
rename to MinecraftUSkinEditor/MainForm.Designer.cs
index 2494e064..7ad87187 100644
--- a/MinecraftUSkinEditor/Forms/Form1.Designer.cs
+++ b/MinecraftUSkinEditor/MainForm.Designer.cs
@@ -1,6 +1,6 @@
namespace PckStudio
{
- partial class FormMain
+ partial class MainForm
{
///
/// Required designer variable.
@@ -29,7 +29,7 @@
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
- System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormMain));
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
this.contextMenuPCKEntries = new System.Windows.Forms.ContextMenuStrip(this.components);
this.createToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.folderToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
@@ -39,7 +39,6 @@
this.importSkinsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.importSkinToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.importExtractedSkinsFolderToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.importFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.extractToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.renameFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.replaceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
@@ -88,14 +87,11 @@
this.PS3PCKInstallerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.VitaPCKInstallerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.joinDevelopmentDiscordToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.label1 = new MetroFramework.Controls.MetroLabel();
this.contextMenuMetaTree = new System.Windows.Forms.ContextMenuStrip(this.components);
this.addPresetToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
this.addEntryToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.deleteEntryToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.labelVersion = new MetroFramework.Controls.MetroLabel();
- this.openedPCKS = new MetroFramework.Controls.MetroTabControl();
- this.tabPage1 = new MetroFramework.Controls.MetroTabPage();
this.pictureBox2 = new System.Windows.Forms.PictureBox();
this.DBGLabel = new MetroFramework.Controls.MetroLabel();
this.tabControl = new MetroFramework.Controls.MetroTabControl();
@@ -124,8 +120,6 @@
this.contextMenuPCKEntries.SuspendLayout();
this.menuStrip.SuspendLayout();
this.contextMenuMetaTree.SuspendLayout();
- this.openedPCKS.SuspendLayout();
- this.tabPage1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit();
this.tabControl.SuspendLayout();
this.openTab.SuspendLayout();
@@ -189,8 +183,7 @@
//
this.importSkinsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.importSkinToolStripMenuItem,
- this.importExtractedSkinsFolderToolStripMenuItem,
- this.importFileToolStripMenuItem});
+ this.importExtractedSkinsFolderToolStripMenuItem});
resources.ApplyResources(this.importSkinsToolStripMenuItem, "importSkinsToolStripMenuItem");
this.importSkinsToolStripMenuItem.Name = "importSkinsToolStripMenuItem";
//
@@ -206,11 +199,6 @@
this.importExtractedSkinsFolderToolStripMenuItem.Name = "importExtractedSkinsFolderToolStripMenuItem";
this.importExtractedSkinsFolderToolStripMenuItem.Click += new System.EventHandler(this.importExtractedSkinsFolder);
//
- // importFileToolStripMenuItem
- //
- resources.ApplyResources(this.importFileToolStripMenuItem, "importFileToolStripMenuItem");
- this.importFileToolStripMenuItem.Name = "importFileToolStripMenuItem";
- //
// extractToolStripMenuItem
//
resources.ApplyResources(this.extractToolStripMenuItem, "extractToolStripMenuItem");
@@ -545,11 +533,6 @@
this.joinDevelopmentDiscordToolStripMenuItem.Name = "joinDevelopmentDiscordToolStripMenuItem";
this.joinDevelopmentDiscordToolStripMenuItem.Click += new System.EventHandler(this.joinDevelopmentDiscordToolStripMenuItem_Click);
//
- // label1
- //
- resources.ApplyResources(this.label1, "label1");
- this.label1.Name = "label1";
- //
// contextMenuMetaTree
//
this.contextMenuMetaTree.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
@@ -584,32 +567,6 @@
this.labelVersion.Name = "labelVersion";
this.labelVersion.Theme = MetroFramework.MetroThemeStyle.Dark;
//
- // openedPCKS
- //
- this.openedPCKS.Controls.Add(this.tabPage1);
- resources.ApplyResources(this.openedPCKS, "openedPCKS");
- this.openedPCKS.Name = "openedPCKS";
- this.openedPCKS.SelectedIndex = 0;
- this.openedPCKS.SizeMode = System.Windows.Forms.TabSizeMode.Fixed;
- this.openedPCKS.Style = MetroFramework.MetroColorStyle.White;
- this.openedPCKS.Theme = MetroFramework.MetroThemeStyle.Dark;
- this.openedPCKS.UseSelectable = true;
- //
- // tabPage1
- //
- this.tabPage1.BackColor = System.Drawing.Color.Transparent;
- this.tabPage1.Controls.Add(this.label1);
- this.tabPage1.HorizontalScrollbarBarColor = true;
- this.tabPage1.HorizontalScrollbarHighlightOnWheel = false;
- this.tabPage1.HorizontalScrollbarSize = 0;
- resources.ApplyResources(this.tabPage1, "tabPage1");
- this.tabPage1.Name = "tabPage1";
- this.tabPage1.Style = MetroFramework.MetroColorStyle.White;
- this.tabPage1.Theme = MetroFramework.MetroThemeStyle.Dark;
- this.tabPage1.VerticalScrollbarBarColor = true;
- this.tabPage1.VerticalScrollbarHighlightOnWheel = false;
- this.tabPage1.VerticalScrollbarSize = 0;
- //
// pictureBox2
//
resources.ApplyResources(this.pictureBox2, "pictureBox2");
@@ -824,9 +781,9 @@
//
// treeMeta
//
- resources.ApplyResources(this.treeMeta, "treeMeta");
this.treeMeta.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
this.treeMeta.ContextMenuStrip = this.contextMenuMetaTree;
+ resources.ApplyResources(this.treeMeta, "treeMeta");
this.treeMeta.Name = "treeMeta";
this.treeMeta.PathSeparator = "/";
this.treeMeta.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeMeta_AfterSelect);
@@ -876,13 +833,12 @@
this.ApplyImageInvert = true;
resources.ApplyResources(this, "$this");
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.menuStrip);
this.Controls.Add(this.LittleEndianCheckBox);
this.Controls.Add(this.tabControl);
this.Controls.Add(this.DBGLabel);
- this.Controls.Add(this.openedPCKS);
this.Controls.Add(this.pictureBox2);
this.Controls.Add(this.labelVersion);
- this.Controls.Add(this.menuStrip);
this.MainMenuStrip = this.menuStrip;
this.Name = "FormMain";
this.ShadowType = MetroFramework.Forms.MetroFormShadowType.DropShadow;
@@ -897,9 +853,6 @@
this.menuStrip.ResumeLayout(false);
this.menuStrip.PerformLayout();
this.contextMenuMetaTree.ResumeLayout(false);
- this.openedPCKS.ResumeLayout(false);
- this.tabPage1.ResumeLayout(false);
- this.tabPage1.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit();
this.tabControl.ResumeLayout(false);
this.openTab.ResumeLayout(false);
@@ -944,7 +897,6 @@
private System.Windows.Forms.ToolStripMenuItem importSkinToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem importExtractedSkinsFolderToolStripMenuItem;
private System.Windows.Forms.PictureBox pictureBox2;
- private System.Windows.Forms.ToolStripMenuItem importFileToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem createToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem folderToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem skinToolStripMenuItem;
@@ -956,12 +908,9 @@
private System.Windows.Forms.ToolStripMenuItem convertToBedrockToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem storeToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem openToolStripMenuItem1;
- private MetroFramework.Controls.MetroTabControl openedPCKS;
- private MetroFramework.Controls.MetroTabPage tabPage1;
private MetroFramework.Controls.MetroTabControl tabControl;
private MetroFramework.Controls.MetroTabPage editorTab;
private MetroFramework.Controls.MetroCheckBox LittleEndianCheckBox;
- private MetroFramework.Controls.MetroLabel label1;
private MetroFramework.Controls.MetroLabel labelVersion;
private MetroFramework.Controls.MetroLabel DBGLabel;
private MetroFramework.Controls.MetroLabel label11;
diff --git a/MinecraftUSkinEditor/MainForm.cs b/MinecraftUSkinEditor/MainForm.cs
new file mode 100644
index 00000000..47892261
--- /dev/null
+++ b/MinecraftUSkinEditor/MainForm.cs
@@ -0,0 +1,2834 @@
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using System.Windows.Forms;
+using System.Drawing.Drawing2D;
+using System.IO.Compression;
+using System.Net;
+using System.Diagnostics;
+using PckStudio.Properties;
+using Ohana3DS_Rebirth.Ohana;
+using PckStudio.Forms;
+using System.Drawing.Imaging;
+using RichPresenceClient;
+using PckStudio.Classes.FileTypes;
+using PckStudio.Classes.IO;
+using PckStudio.Classes.IO.LOC;
+using PckStudio.Forms.Utilities;
+
+namespace PckStudio
+{
+ public partial class MainForm : MetroFramework.Forms.MetroForm
+ {
+ string saveLocation = string.Empty;
+ PCKFile currentPCK = null;
+ bool needsUpdate = false;
+ bool saved = true;
+ bool isTemplateFile = false;
+ public MainForm()
+ {
+ InitializeComponent();
+ 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);
+ pckOpen.AllowDrop = true;
+ tabControl.SelectTab(0);
+ RPC.Initialize("825875166574673940");
+ labelVersion.Text = Application.ProductVersion;
+ }
+
+ private void openToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ using (var ofd = new OpenFileDialog())
+ {
+ ofd.CheckFileExists = true;
+ ofd.Filter = "PCK (Minecraft Console Package)|*.pck";
+ if (ofd.ShowDialog() == DialogResult.OK)
+ {
+ saveLocation = ofd.FileName;
+ currentPCK = openPck(ofd.FileName);
+ if (checkForPassword())
+ {
+ fileEntryCountLabel.Text = "Files:" + currentPCK.file_entries.Count;
+ treeViewMain.Enabled = true;
+ treeMeta.Enabled = true;
+ closeToolStripMenuItem.Visible = true;
+
+ saveToolStripMenuItem.Enabled = true;
+ saveToolStripMenuItem1.Enabled = true;
+ metaToolStripMenuItem.Enabled = true;
+ advancedMetaAddingToolStripMenuItem.Enabled = true;
+ convertToBedrockToolStripMenuItem.Enabled = true;
+
+ BuildMainTreeView();
+ tabControl.SelectTab(1);
+ }
+ }
+ }
+ }
+
+ private PCKFile openPck(string filePath)
+ {
+ PCKFile pck = null;
+ using (var fileStream = File.OpenRead(filePath))
+ {
+ isTemplateFile = false;
+ saveLocation = filePath;
+ pck = PCKFileReader.Read(fileStream, LittleEndianCheckBox.Checked);
+ }
+ if (pck.type < 3) throw new Exception("Can't open pck file of type: " + pck.type.ToString());
+ return pck;
+ }
+
+ private bool checkForPassword()
+ {
+ foreach (var file_entry in currentPCK.file_entries)
+ {
+ if (file_entry.name != "0") continue;
+ foreach (var pair in file_entry.properties)
+ {
+ addPasswordToolStripMenuItem.Enabled = !(pair.Item1 == "LOCK");
+ if (pair.Item1 == "LOCK")
+ return new pckLocked(pair.Item2).ShowDialog() == DialogResult.OK;
+ }
+ }
+ addPasswordToolStripMenuItem.Enabled = true;
+ return true;
+ }
+
+ ///
+ /// wrapper that allows the use of in
TreeNode.Nodes.Find(name, ...) and TreeNode.Nodes.ContainsKey(name)
+ ///
+ ///
+ ///
+ /// new Created TreeNode
+ public static TreeNode CreateNode(string name, object tag = null)
+ {
+ TreeNode node = new TreeNode(name);
+ node.Name = name;
+ node.Tag = tag;
+ return node;
+ }
+
+ private TreeNode BuildNodeTreeBySeperator(TreeNodeCollection root, string path, char seperator)
+ {
+ if (root == null) throw new ArgumentNullException("Root Collection is null");
+ if (!path.Contains(seperator))
+ {
+ var finalNode = CreateNode(path);
+ root.Add(finalNode);
+ return finalNode;
+ }
+ string nodeText = path.Substring(0, path.IndexOf(seperator));
+ string subPath = path.Substring(path.IndexOf(seperator) + 1);
+ bool alreadyExists = root.ContainsKey(nodeText);
+ TreeNode subNode = alreadyExists ? root[nodeText] : CreateNode(nodeText);
+ if (!alreadyExists) root.Add(subNode);
+ return BuildNodeTreeBySeperator(subNode.Nodes, subPath, seperator);
+ }
+
+ private void BuildPckTreeView(TreeNodeCollection root, PCKFile pckFile)
+ {
+ foreach (var file_entry in pckFile.file_entries)
+ {
+ TreeNode node = BuildNodeTreeBySeperator(root, file_entry.name, '/');
+ node.Tag = file_entry;
+ if (file_entry.type == 0 || file_entry.type == 1 || file_entry.type == 2) // skins, capes, textures
+ {
+ node.ImageIndex = 2;
+ node.SelectedImageIndex = 2;
+ }
+ else if (file_entry.type == 6) // .loc
+ {
+ node.ImageIndex = 3;
+ node.SelectedImageIndex = 3;
+ }
+ else if (file_entry.type == 8) // audio / binka
+ {
+ node.ImageIndex = 1;
+ node.SelectedImageIndex = 1;
+ }
+ else if (file_entry.type == 11 || file_entry.type == 5) // Skins.pck, x16info.pck
+ {
+ node.ImageIndex = 4;
+ node.SelectedImageIndex = 4;
+ // TODO: load sub pck into tree and make it editable with ease
+ // works but not currently included...
+ using (var stream = new MemoryStream(file_entry.data))
+ {
+ PCKFile subPCKfile = PCKFileReader.Read(stream, LittleEndianCheckBox.Checked);
+ BuildPckTreeView(node.Nodes, subPCKfile);
+ }
+ }
+ else
+ {
+ node.ImageIndex = 5;
+ node.SelectedImageIndex = 5;
+ }
+ }
+ }
+
+ private void BuildMainTreeView()
+ {
+ treeViewMain.Nodes.Clear();
+ BuildPckTreeView(treeViewMain.Nodes, currentPCK);
+ }
+
+ private void selectNode(object sender, TreeViewEventArgs e)
+ {
+ treeMeta.Nodes.Clear();
+ entryTypeTextBox.Text = "";
+ entryDataTextBox.Text = "";
+ buttonEdit.Visible = false;
+ pictureBoxImagePreview.Image = Resources.NoImageFound;
+ pictureBoxImagePreview.Show();
+ labelImageSize.Text = "";
+ var node = e.Node;
+ if (node.Tag == null || !(node.Tag is PCKFile.FileData)) return;
+ PCKFile.FileData file = node.Tag as PCKFile.FileData;
+
+ // Retrieves metadata for currently selected mineifile and displays it within metatreeview
+ foreach (var entry in file.properties)
+ {
+ TreeNode meta = new TreeNode(entry.Item1);
+ meta.Tag = entry;
+ treeMeta.Nodes.Add(meta);
+ //Check for if file contains model data
+ if (entry.Item1 == "BOX")
+ {
+ buttonEdit.Text = "EDIT BOXES";
+ buttonEdit.Visible = true;
+ }
+ else if (entry.Item1 == "ANIM")
+ {
+ if ((entry.Item2 == "0x40000") || (entry.Item2 == "0x80000"))
+ {
+ buttonEdit.Text = "View Skin";
+ buttonEdit.Visible = true;
+ }
+ }
+ }
+
+ // Check for Animated Texture
+ if ((file.name.StartsWith("res/textures/blocks/") || file.name.StartsWith("res/textures/items/")) &&
+ (!file.name.EndsWith("clock.png") && (!file.name.EndsWith("compass.png"))))
+ {
+ buttonEdit.Text = "EDIT TEXTURE ANIMATION";
+ buttonEdit.Visible = true;
+ }
+
+ // If selected item is a image, its displayed with proper dimensions in image box
+ if (Path.GetExtension(file.name) == ".png" || file.type == 0 || file.type == 1 || file.type == 2)
+ {
+ MemoryStream png = new MemoryStream(file.data);
+ Image skinPicture = Image.FromStream(png);
+ pictureBoxImagePreview.Image = skinPicture;
+ labelImageSize.Text = skinPicture.Size.Width.ToString() + "x" + skinPicture.Size.Height.ToString();
+ }
+ else if (file.type == 6) // .loc
+ {
+ buttonEdit.Text = "EDIT LOC";
+ buttonEdit.Visible = true;
+ }
+ else if (file.name == "colours.col" || file.type == 9)
+ {
+ buttonEdit.Text = "EDIT COLORS";
+ buttonEdit.Visible = true;
+ }
+ else if (Path.GetFileName(file.name) == "audio.pck" && file.type == 8)
+ {
+ buttonEdit.Text = "EDIT MUSIC CUES";
+ buttonEdit.Visible = true;
+ }
+ }
+
+ public void editModel(PCKFile.FileData skin)
+ {
+ generateModel generate = new generateModel(skin.properties, new PictureBox());
+ //Opens Model Generator Dialog
+ if (generate.ShowDialog() == DialogResult.OK)
+ {
+ entryTypeTextBox.Text = "";
+ entryDataTextBox.Text = "";
+ reloadMetaTreeView();
+ saved = false;
+ }
+ }
+
+ private void extractToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ if(treeViewMain.SelectedNode.Nodes.Count > 0)
+ {
+ MessageBox.Show("Cannot extract emtpy folder!");
+ return;
+ }
+ if (!(treeViewMain.SelectedNode.Tag is PCKFile.FileData))
+ {
+ // TODO: add folder extract support
+ return;
+ }
+ var file = treeViewMain.SelectedNode.Tag as PCKFile.FileData;
+ SaveFileDialog exFile = new SaveFileDialog(); //extract location
+ exFile.FileName = file.name;
+ exFile.Filter = Path.GetExtension(file.name).Replace(".", "") + " File|*" + Path.GetExtension(file.name);
+ if (exFile.ShowDialog() != DialogResult.OK) return;
+ string extractFilePath = exFile.FileName;
+ // Makes sure chosen directory isn't null or whitespace AKA makes sure its usable
+ if (!string.IsNullOrWhiteSpace(Path.GetDirectoryName(extractFilePath)))
+ {
+ File.WriteAllBytes(extractFilePath, file.data);
+ if (file.properties.Count > 0)
+ {
+ using (var fs = File.CreateText($"{extractFilePath}.txt"))
+ {
+ foreach (var entry in file.properties)
+ {
+ fs.WriteLine($"{entry.Item1}: {entry.Item2}");
+ }
+ }
+ }
+ MessageBox.Show("File Extracted"); // Verification that file extraction path was successful
+ }
+ }
+
+ private void SaveTemplate()
+ {
+ SaveFileDialog saveFileDialog = new SaveFileDialog();
+ saveFileDialog.Filter = "PCK (Minecraft Console Package)|*.pck";
+ saveFileDialog.DefaultExt = ".pck";
+ if (saveFileDialog.ShowDialog() == DialogResult.OK)
+ {
+ Save(saveFileDialog.FileName);
+ }
+ }
+
+ private void Save(string FilePath)
+ {
+ currentPCK.ValidateMeta();
+ using (var fs = File.OpenWrite(FilePath))
+ {
+ PCKFileWriter.Write(fs, currentPCK, LittleEndianCheckBox.Checked);
+ }
+ saved = true;
+ MessageBox.Show("Saved Pck file", "File Saved");
+ }
+
+ private void replaceToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ if (!(treeViewMain.SelectedNode.Tag is PCKFile.FileData))
+ {
+ // should never happen unless its a folder
+ MessageBox.Show("Can't replace a folder.");
+ return;
+ }
+ PCKFile.FileData file = treeViewMain.SelectedNode.Tag as PCKFile.FileData;
+ using (var ofd = new OpenFileDialog())
+ {
+ if (ofd.ShowDialog() == DialogResult.OK)
+ {
+ file.SetData(File.ReadAllBytes(ofd.FileName));
+ saved = false;
+ }
+ }
+ }
+
+ private void deleteFileToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ if (treeViewMain.SelectedNode.Tag is PCKFile.FileData)
+ {
+ PCKFile.FileData file = treeViewMain.SelectedNode.Tag as PCKFile.FileData;
+ // remove loc key if its a skin/cape
+ if (file.type == 0 || file.type == 1)
+ {
+ LOCFile locFile = null;
+ if (TryGetLocFile(out locFile))
+ {
+ foreach (var property in file.properties)
+ {
+ if (property.Item1 == "THEMENAMEID" || property.Item1 == "DISPLAYNAMEID")
+ locFile.RemoveEntry(property.Item2);
+ }
+ TrySetLocFile(locFile);
+ }
+ }
+ currentPCK.file_entries.Remove(file);
+ treeViewMain.SelectedNode.Remove();
+ saved = false;
+ }
+ 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 || item.Nodes.Count > 0)
+ {
+ MessageBox.Show("Can't fully delete directory with subdirectories");
+ return;
+ }
+ if (item.Tag is PCKFile.FileData) // makes sure selected node is a minefile
+ {
+ //removes minefile from minefile list
+ PCKFile.FileData file = (PCKFile.FileData)item.Tag;
+ currentPCK.file_entries.Remove(file);
+ item.Remove();
+ }
+ }
+ treeViewMain.SelectedNode.Remove();
+ saved = false;
+ }
+ }
+
+ private void renameFileToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ TreeNode node = treeViewMain.SelectedNode;
+ if (node == null || node.Tag == null || !(node.Tag is PCKFile.FileData)) return;
+ var file = node.Tag as PCKFile.FileData;
+ RenamePrompt diag = new RenamePrompt(file.name);
+ if (diag.ShowDialog(this) == DialogResult.OK)
+ {
+ file.name = diag.NewText;
+ saved = false;
+ }
+ diag.Dispose();
+ BuildMainTreeView();
+ }
+
+ private void createSkinToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ if (!TryGetLocFile(out LOCFile locFile))
+ {
+ MessageBox.Show("No .loc file found", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
+ }
+ addnewskin add = new addnewskin(locFile);
+ if (add.ShowDialog() == DialogResult.OK)
+ {
+ if (add.useCape)
+ currentPCK.file_entries.Add(add.cape);
+ if (!(treeViewMain.SelectedNode.Tag is PCKFile.FileData))
+ add.skin.name = $"{treeViewMain.SelectedNode.FullPath}/{add.skin.name}";
+ currentPCK.file_entries.Add(add.skin);
+
+ TrySetLocFile(locFile);
+ saved = false;
+ BuildMainTreeView();
+ }
+ add.Dispose();
+ }
+
+ PCKFile.FileData CreateAudioPCK(bool isLittle)
+ {
+ // create actual valid pck file structure
+ PCKFile audioPck = new PCKFile(1); // 1 = audio.pck
+ audioPck.meta_data.Add("CUENAME");
+ audioPck.meta_data.Add("CREDIT");
+ audioPck.meta_data.Add("CREDITID");
+ audioPck.file_entries.Add(new PCKFile.FileData("", 0));
+ audioPck.file_entries.Add(new PCKFile.FileData("", 1));
+ audioPck.file_entries.Add(new PCKFile.FileData("", 2));
+
+ // create a file data entry for current open pck file
+ PCKFile.FileData audioFileData = new PCKFile.FileData("audio.pck", 8);
+ using(var stream = new MemoryStream())
+ {
+ PCKFileWriter.Write(stream, audioPck, isLittle);
+ audioFileData.SetData(stream.ToArray());
+ }
+ return audioFileData;
+ }
+
+ private void audiopckToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ List filenames = new List();
+ foreach (TreeNode tNode in treeViewMain.Nodes)
+ {
+ filenames.Add(tNode.Text);
+ }
+
+ if (filenames.Contains("audio.pck"))
+ {
+ MessageBox.Show("There is already an audio.pck present in this file!", "Can't create audio.pck");
+ return;
+ }
+ PCKFile.FileData audioMF = CreateAudioPCK(LittleEndianCheckBox.Checked);
+ if (!TryGetLocFile(out LOCFile locFile))
+ throw new Exception("No .loc file found.");
+ AudioEditor diag = new AudioEditor(audioMF, locFile, LittleEndianCheckBox.Checked);
+ diag.ShowDialog(this);
+ //if (diag.saved) treeViewMain.Nodes.Add(node);
+ diag.Dispose();
+ }
+
+
+ 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)
+ {
+ try
+ {
+ var animation_file = new PCKFile.FileData("", 2);
+ AnimationEditor diag = new AnimationEditor(animation_file, ofd.FileName);
+ diag.ShowDialog(this);
+ diag.Dispose();
+ treeMeta.Nodes.Clear();
+ saved = false;
+ }
+ catch
+ {
+ MessageBox.Show("Invalid animation data.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
+ }
+ }
+ }
+ }
+
+ private void treeViewMain_DoubleClick(object sender, EventArgs e)
+ {
+ if (treeViewMain.SelectedNode == null ||
+ treeViewMain.SelectedNode.Tag == null ||
+ !(treeViewMain.SelectedNode.Tag is PCKFile.FileData))
+ return;
+ PCKFile.FileData file = treeViewMain.SelectedNode.Tag as PCKFile.FileData;
+ if (file.type == 6) // .loc
+ {
+ LOCFile l = null;
+ using (var stream = new MemoryStream(file.data))
+ {
+ l = LOCFileReader.Read(stream);
+ }
+ var locedit = new LOCEditor(l);
+ locedit.ShowDialog(this);
+ if (locedit.WasModified)
+ {
+ using (var stream = new MemoryStream())
+ {
+ LOCFileWriter.Write(stream, l);
+ file.SetData(stream.ToArray());
+ }
+ }
+ }
+
+ if (Path.GetFileName(file.name) == "audio.pck" && file.type == 8)
+ {
+ try
+ {
+ if (!TryGetLocFile(out LOCFile locFile))
+ throw new Exception("No .loc File found.");
+ Forms.Utilities.AudioEditor diag = new Forms.Utilities.AudioEditor(file, locFile, LittleEndianCheckBox.Checked);
+ if (LittleEndianCheckBox.Checked) diag.Text += " (PS4/Vita)";
+ diag.ShowDialog(this);
+ diag.Dispose();
+ }
+ catch(Exception ex)
+ {
+ MessageBox.Show("Error", ex.Message, MessageBoxButtons.OK,
+ MessageBoxIcon.Error);
+ return;
+ }
+ }
+
+ //Checks to see if selected minefile is a col file
+ if (Path.GetExtension(file.name) == ".col" && file.type == 9)
+ {
+ if (file.size == 0)
+ {
+ MessageBox.Show("No Color data found.", "Error", MessageBoxButtons.OK,
+ MessageBoxIcon.Error);
+ return;
+ }
+ COLFile colFile = new COLFile();
+ using (var stream = new MemoryStream(file.data))
+ {
+ colFile.Open(stream);
+ }
+ Forms.Utilities.COLEditor diag = new Forms.Utilities.COLEditor(colFile);
+ if (diag.ShowDialog(this) == DialogResult.OK && diag.data.Length > 0)
+ file.SetData(diag.data);
+ diag.Dispose();
+ }
+
+ //Checks to see if selected minefile is a binka file
+ //System.Threading.ThreadStart starter;
+
+ //System.Threading.Thread binkam;
+ if (Path.GetExtension(file.name) == ".binka")
+ {
+ MessageBox.Show(".binka Editor Coming Soon!");
+ }
+ }
+
+ private void treeMeta_AfterSelect(object sender, TreeViewEventArgs e)
+ {
+ var node = e.Node;
+ if (node == null || !(node.Tag is ValueTuple)) return;
+ var property = (ValueTuple)node.Tag;;
+ entryTypeTextBox.Text = property.Item1;
+ entryDataTextBox.Text = property.Item2;
+ }
+
+ private void treeMeta_DoubleClick(object sender, EventArgs e)
+ {
+ if (treeMeta.SelectedNode == null || !(treeMeta.SelectedNode.Tag is ValueTuple) ||
+ treeViewMain.SelectedNode == null || !(treeViewMain.SelectedNode.Tag is PCKFile.FileData))
+ return;
+ PCKFile.FileData file = (PCKFile.FileData)treeViewMain.SelectedNode.Tag;
+ var property = (ValueTuple)treeMeta.SelectedNode.Tag;
+ int i = file.properties.IndexOf(property);
+ addMeta add = new addMeta(property.Item1, property.Item2);
+ if (add.ShowDialog() == DialogResult.OK && i != -1)
+ {
+ file.properties[i] = new ValueTuple(add.PropertyName, add.PropertyValue);
+ reloadMetaTreeView();
+ saved = false;
+ }
+ add.Dispose();
+ }
+
+
+ private void deleteEntryToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ if (treeMeta.SelectedNode == null || !(treeMeta.SelectedNode.Tag is ValueTuple) ||
+ !(treeViewMain.SelectedNode.Tag is PCKFile.FileData))
+ return;
+ var file = treeViewMain.SelectedNode.Tag as PCKFile.FileData;
+ if (file.properties.Remove((ValueTuple)treeMeta.SelectedNode.Tag))
+ {
+ treeMeta.SelectedNode.Remove();
+ saved = false;
+ }
+ }
+
+ private void reloadMetaTreeView()
+ {
+ treeMeta.Nodes.Clear();
+ if (treeViewMain.SelectedNode == null ||
+ !(treeViewMain.SelectedNode.Tag is PCKFile.FileData)) return;
+ var file = treeViewMain.SelectedNode.Tag as PCKFile.FileData;
+ foreach (var property in file.properties)
+ {
+ TreeNode node = new TreeNode(property.Item1);
+ node.Tag = property;
+ treeMeta.Nodes.Add(node);
+ }
+ }
+
+ private void addEntryToolStripMenuItem_Click_1(object sender, EventArgs e)
+ {
+ if (treeViewMain.SelectedNode.Tag == null ||
+ !(treeViewMain.SelectedNode.Tag is PCKFile.FileData))
+ return;
+ PCKFile.FileData file = (PCKFile.FileData)treeViewMain.SelectedNode.Tag;
+ addMeta add = new addMeta();
+ if (add.ShowDialog() == DialogResult.OK)
+ {
+ var property = new ValueTuple(add.PropertyName, add.PropertyValue);
+ file.properties.Add(property);
+ reloadMetaTreeView();
+ saved = false;
+ }
+ add.Dispose();
+ }
+
+ private void moveUpToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ if (treeViewMain.SelectedNode == null) return;
+
+ if (treeViewMain.SelectedNode.Tag is PCKFile.FileData)
+ {
+ PCKFile.FileData file = treeViewMain.SelectedNode.Tag as PCKFile.FileData;
+ int file_index = currentPCK.file_entries.IndexOf(file);
+ currentPCK.file_entries.Swap(file_index, file_index - 1);
+ BuildMainTreeView();
+ saved = false;
+ }
+ return;
+
+ TreeNode move = (TreeNode)treeViewMain.SelectedNode.Clone();
+
+ if (treeViewMain.SelectedNode.Parent == null)
+ {
+ if (treeViewMain.SelectedNode.PrevNode == null) return;
+ treeViewMain.Nodes.Insert(treeViewMain.SelectedNode.PrevNode.Index, move);
+ treeViewMain.SelectedNode.Remove();
+ }
+ else
+ {
+ if (treeViewMain.SelectedNode.PrevNode == null) return;
+ treeViewMain.SelectedNode.Parent.Nodes.Insert(treeViewMain.SelectedNode.PrevNode.Index, move);
+ //removes node because a clone was inserted into its new index
+ treeViewMain.SelectedNode.Remove();
+ }
+ treeViewMain.SelectedNode = move;
+ saved = false;
+ }
+
+ private void moveDownToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ if (treeViewMain.SelectedNode == null) return;
+
+ if (treeViewMain.SelectedNode.Tag is PCKFile.FileData)
+ {
+ PCKFile.FileData file = treeViewMain.SelectedNode.Tag as PCKFile.FileData;
+ int file_index = currentPCK.file_entries.IndexOf(file);
+ currentPCK.file_entries.Swap(file_index, file_index + 1);
+ BuildMainTreeView();
+ saved = false;
+ }
+ return;
+
+
+ TreeNode move = (TreeNode)treeViewMain.SelectedNode.Clone();
+ if (treeViewMain.SelectedNode.Parent == null)
+ {
+ if (treeViewMain.SelectedNode.NextNode == null) return;
+ treeViewMain.Nodes.Insert(treeViewMain.SelectedNode.NextNode.Index + 1, move);
+ //removes node because a clone was inserted into its new index
+ treeViewMain.SelectedNode.Remove();
+ }
+ else
+ {
+ if (treeViewMain.SelectedNode.NextNode == null) return;
+ treeViewMain.SelectedNode.Parent.Nodes.Insert(treeViewMain.SelectedNode.NextNode.Index + 1, move);
+ //removes node because a clone was inserted into its new index
+ treeViewMain.SelectedNode.Remove();
+ }
+ treeViewMain.SelectedNode = move;
+ }
+
+ #region drag and drop for main tree node
+
+ public static void getChildren(List Nodes, TreeNode Node)
+ {
+ foreach (TreeNode thisNode in Node.Nodes)
+ {
+ Nodes.Add(thisNode);
+ getChildren(Nodes, thisNode);
+ }
+ }
+
+ // Most of the code below is modified code from this link: https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.treeview.itemdrag?view=windowsdesktop-6.0
+ // - MattNL
+
+ private void treeViewMain_ItemDrag(object sender, ItemDragEventArgs e)
+ {
+
+ }
+
+ // Set the target drop effect to the effect
+ // specified in the ItemDrag event handler.
+ private void treeViewMain_DragEnter(object sender, DragEventArgs e)
+ {
+ e.Effect = e.AllowedEffect;
+ }
+
+ // Select the node under the mouse pointer to indicate the
+ // expected drop location.
+ private void treeViewMain_DragOver(object sender, DragEventArgs e)
+ {
+
+ }
+
+ private void treeViewMain_DragDrop(object sender, DragEventArgs e)
+ {
+
+ }
+
+ // Determine whether one node is a parent
+ // or ancestor of a second node.
+ private bool ContainsNode(TreeNode node1, TreeNode node2)
+ {
+ // Check the parent node of the second node.
+ if (node2.Parent == null) return false;
+ if (node2.Parent.Equals(node1)) return true;
+ // If the parent node is not null or equal to the first node,
+ // call the ContainsNode method recursively using the parent of
+ // the second node.
+ return ContainsNode(node1, node2.Parent);
+ }
+
+ #endregion
+
+ private void metaToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ meta edit = new meta(currentPCK);
+ edit.TopMost = true;
+ edit.TopLevel = true;
+ edit.Show();
+ //saved = false;
+ }
+
+ private void addPresetToolStripMenuItem1_Click(object sender, EventArgs e)
+ {
+ PCKFile.FileData file = (PCKFile.FileData)treeViewMain.SelectedNode.Tag;
+ presetMeta add = new presetMeta(file);
+ if (add.ShowDialog() == DialogResult.OK)
+ {
+ reloadMetaTreeView();
+ saved = false;
+ }
+ add.Dispose();
+ }
+
+ private void InitializeSkinPack(int packId, int packVersion, string packName)
+ {
+ currentPCK = new PCKFile(3);
+ currentPCK.meta_data.Add("PACKID");
+ currentPCK.meta_data.Add("PACKVERSION");
+ var zeroFile = new PCKFile.FileData("0", 4);
+ zeroFile.properties.Add(("PACKID", packId.ToString()));
+ zeroFile.properties.Add(("PACKVERSION", packVersion.ToString()));
+ var loc = new PCKFile.FileData("localisation.loc", 6);
+ var locFile = new LOCFile();
+ locFile.InitializeDefault(packName);
+ using (var stream = new MemoryStream())
+ {
+ LOCFileWriter.Write(stream, locFile);
+ loc.SetData(stream.ToArray());
+ }
+ currentPCK.file_entries.Add(zeroFile);
+ currentPCK.file_entries.Add(loc);
+ }
+
+ private void InitializeTexturePack(int packId, int packVersion, string packName)
+ {
+ InitializeSkinPack(packId, packVersion, packName);
+ currentPCK.meta_data.Add("DATAPATH");
+ var texturepackInfo = new PCKFile.FileData("x16/x16Info.pck", 5);
+ texturepackInfo.properties.Add(("PACKID", "0"));
+ texturepackInfo.properties.Add(("DATAPATH", "x16Data.pck"));
+ currentPCK.file_entries.Add(texturepackInfo);
+ }
+
+ private void skinPackToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ // make skin pack template
+ RenamePrompt namePrompt = new RenamePrompt("");
+ namePrompt.OKButton.Text = "Ok";
+ if (namePrompt.ShowDialog() == DialogResult.OK)
+ {
+ InitializeSkinPack(new Random().Next(8000, int.MaxValue), 0, namePrompt.NewText);
+ isTemplateFile = true;
+ BuildMainTreeView();
+ }
+ }
+ private void texturePackToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ // make texture pack template
+ RenamePrompt namePrompt = new RenamePrompt("");
+ namePrompt.OKButton.Text = "Ok";
+ if (namePrompt.ShowDialog() == DialogResult.OK)
+ {
+ InitializeTexturePack(new Random().Next(8000, int.MaxValue), 0, namePrompt.NewText);
+ isTemplateFile = true;
+ BuildMainTreeView();
+ }
+ }
+
+ private void advancedMetaAddingToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ //opens dialog for bulk minefile editing
+ AdvancedOptions advanced = new AdvancedOptions(currentPCK);
+ if (advanced.ShowDialog() == DialogResult.OK)
+ saved = false;
+ advanced.Dispose();
+ }
+
+ private void closeToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ if (!saved)
+ SaveTemplate();
+ pictureBoxImagePreview.Hide();
+ treeViewMain.Nodes.Clear();
+ treeMeta.Nodes.Clear();
+ currentPCK = null;
+ treeViewMain.Enabled = false;
+ treeMeta.Enabled = false;
+ saveToolStripMenuItem.Enabled = false;
+ saveToolStripMenuItem1.Enabled = false;
+ metaToolStripMenuItem.Enabled = false;
+ addPasswordToolStripMenuItem.Enabled = false;
+ advancedMetaAddingToolStripMenuItem.Enabled = false;
+ convertToBedrockToolStripMenuItem.Enabled = false;
+ closeToolStripMenuItem.Visible = false;
+ fileEntryCountLabel.Text = "";
+ tabControl.SelectTab(0);
+ }
+
+ private void programInfoToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ programInfo info = new programInfo();
+ info.ShowDialog();
+ info.Dispose();
+ }
+
+ private void Form1_Load(object sender, EventArgs e)
+ {
+ try
+ {
+ RPC.SetRPC("Sitting alone", "Program by PhoenixARC", "pcklgo", "PCK Studio", "pcklgo");
+ timer1.Start();
+ timer1.Enabled = true;
+ }
+ catch(Exception ex)
+ {
+ Console.WriteLine("ERROR WITH RPC");
+ Console.WriteLine(ex.Message);
+ }
+#if DEBUG
+ DBGLabel.Visible = true;
+#else
+ DBGLabel.Visible = false;
+#endif
+ //Makes sure appdata exists
+ if (!Directory.Exists(Program.Appdata))
+ {
+ Directory.CreateDirectory(Program.Appdata);
+ }
+
+ if (!Directory.Exists(Program.Appdata + "\\cache\\mods\\"))
+ {
+ Directory.CreateDirectory(Program.Appdata + "\\cache\\mods\\");
+ }
+ }
+
+ private void treeViewMain_KeyDown(object sender, KeyEventArgs e)
+ {
+ if (e.KeyCode == Keys.Delete)
+ deleteFileToolStripMenuItem_Click(sender, e);
+ }
+
+ 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 Console Package)|*.pck";
+
+ if (ofd.ShowDialog() == DialogResult.OK && sfd.ShowDialog() == DialogResult.OK)
+ {
+ PCKFile pckfile = null;
+ using (var fs = File.OpenRead(ofd.FileName))
+ {
+ pckfile = PCKFileReader.Read(fs, LittleEndianCheckBox.Checked);
+ }
+ foreach (PCKFile.FileData mf in pckfile.file_entries)
+ {
+ foreach (var entry in mf.properties)
+ {
+ // Check for lock on PCK File
+ if (entry.Item1 == "LOCK" &&
+ new pckLocked(entry.Item2).ShowDialog() != DialogResult.OK)
+ return; // cancel extraction if password not provided
+ }
+ FileInfo file = new 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 (var entry in mf.properties)
+ {
+ metaData += $"{entry.Item1}: {entry.Item2}{Environment.NewLine}";
+ }
+
+ File.WriteAllText(sfd.SelectedPath + @"\" + mf.name + ".txt", metaData);
+ }
+ }
+ } catch (Exception)
+ {
+ MessageBox.Show("An Error occured while extracting data");
+ }
+ }
+
+
+ private void treeMeta_KeyDown(object sender, KeyEventArgs e)
+ {
+ if (e.KeyData == Keys.Delete && treeMeta.SelectedNode != null && treeViewMain.SelectedNode.Tag is PCKFile.FileData)
+ {
+ //removes selected treemeta entry
+ var file = treeViewMain.SelectedNode.Tag as PCKFile.FileData;
+ if (file.properties.Remove((ValueTuple)treeMeta.SelectedNode.Tag))
+ treeMeta.Nodes.Remove(treeMeta.SelectedNode);
+ saved = false;
+ }
+ }
+
+#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"))
+ {
+ ListViewItem Import = new ListViewItem();//listviewitem to store temporary data
+ Import.Text = file.Name.Remove(file.Name.Length - 4, 4);//gets file name without extension
+
+ //sets minefile type based on wether cape or skin
+ int type = 0;
+ if (Import.Text.Remove(7, Import.Text.Length - 7) == "dlccape" || Import.Text.Remove(7, Import.Text.Length - 7) == "DLCCAPE")
+ {
+ type = 1;
+ }
+ PCKFile.FileData mfNew = new PCKFile.FileData("", type); //new minefile template
+ mfNew.SetData(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.file_entries.Add(mfNew);//adds new minefile to minefile list for skin
+
+ //Sets minefile directory based on pcks structure/type
+ if (mashupStructure == true)
+ {
+ mfNew.name = "Skins/" + Import.Text + ".png";
+ }
+ else
+ {
+ mfNew.name = Import.Text + ".png";
+ }
+
+ 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
+
+ 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
+ mfNew.properties.Add(new ValueTuple(entryName, entryValue));
+
+ if (entryName == "DISPLAYNAMEID")
+ {
+ locNameId = entryValue;
+ }
+
+ if (entryName == "DISPLAYNAME")
+ {
+ locName = entryValue;
+ }
+
+ if (entryName == "THEMENAMEID")
+ {
+ locThemeId = entryValue;
+ }
+
+ if (entryName == "THEMENAME")
+ {
+ locTheme = entryValue;
+ }
+
+ //creates metadata id in loc file
+ if (locThemeId != "" && locTheme != "")
+ {
+ PCKFile.FileData locfile = currentPCK.GetFile("localisation.loc", 6);
+ if (locfile == null)
+ locfile = currentPCK.GetFile("languages.loc", 6);
+ if (locfile == null)
+ throw new Exception("counld not find .loc file");
+ LOCFile l = null;
+ try
+ {
+ using (var stream = new MemoryStream(locfile.data))
+ {
+ l = LOCFileReader.Read(stream);//sets loc data
+ }
+ }
+ catch
+ {
+ MessageBox.Show("No localization data found.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
+ }
+
+ l.AddLocKey(locThemeId, locTheme);
+ using (var stream = new MemoryStream())
+ {
+ LOCFileWriter.Write(stream, l);
+ locfile.SetData(stream.ToArray());
+ }
+ 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
+
+ private bool TryGetLocFile(out LOCFile locFile)
+ {
+ PCKFile.FileData locdata = null;
+ if (currentPCK.HasFile("localisation.loc", 6))
+ locdata = currentPCK.GetFile("localisation.loc", 6);
+ else if (currentPCK.HasFile("languages.loc", 6))
+ locdata = currentPCK.GetFile("languages.loc", 6);
+ else {
+ locFile = null;
+ return false;
+ }
+
+ try
+ {
+ using (var stream = new MemoryStream(locdata.data))
+ {
+ locFile = LOCFileReader.Read(stream);
+ }
+ return true;
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine(ex.Message);
+ }
+ locFile = null;
+ return false;
+ }
+
+ private bool TrySetLocFile(in LOCFile locFile)
+ {
+ PCKFile.FileData locdata = null;
+ if (currentPCK.HasFile("localisation.loc", 6))
+ locdata = currentPCK.GetFile("localisation.loc", 6);
+ else if (currentPCK.HasFile("languages.loc", 6))
+ locdata = currentPCK.GetFile("languages.loc", 6);
+ else {
+ return false;
+ }
+
+ try
+ {
+ using (var stream = new MemoryStream())
+ {
+ LOCFileWriter.Write(stream, locFile);
+ locdata.SetData(stream.ToArray());
+ }
+ return true;
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine(ex.Message);
+ }
+ return false;
+ }
+
+
+ private void importSkin(object sender, EventArgs e)
+ {
+ using (OpenFileDialog contents = new OpenFileDialog())
+ {
+ contents.Title = "Select Extracted Skin Data File";
+ contents.Filter = "Text Files (*.txt)|*.txt";
+
+ if (contents.ShowDialog() == DialogResult.OK)
+ {
+ string skinNameImport = Path.GetFileName(contents.FileName); //Gets skin file name
+ string dataFilePath = contents.FileName.Remove(contents.FileName.Length - 4, 4);
+ if (!File.Exists(dataFilePath)) return;
+ byte[] data = File.ReadAllBytes(dataFilePath);
+ PCKFile.FileData mfNew = new PCKFile.FileData(skinNameImport, 0);
+ mfNew.SetData(data);
+ string[] txtProperties = File.ReadAllText(contents.FileName).Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
+ LOCFile locFile = null;
+ if ((txtProperties.Contains("DISPLAYNAMEID") && txtProperties.Contains("DISPLAYNAME")) ||
+ (txtProperties.Contains("THEMENAMEID") && txtProperties.Contains("THEMENAME")) &&
+ TryGetLocFile(out locFile))
+ {
+ // do stuff
+ //l.AddLocKey(locThemeId, locTheme);
+ //using (var stream = new MemoryStream())
+ //{
+ // LOCFileWriter.Write(stream, locFile);
+ // locdata.SetData(stream.ToArray());
+ //}
+ }
+
+ try
+ {
+ foreach (string prop in txtProperties)
+ {
+ string[] arg = prop.Split(':');
+ if (arg.Length < 2) continue;
+ string key = arg[0];
+ string value = arg[1];
+ if (key == "DISPLNAMEID" || key == "THEMENAMEID")
+ {
+
+ }
+ mfNew.properties.Add(new ValueTuple(key, value));
+ }
+ saved = false;
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message);
+ }
+ }
+ }
+ }
+
+ private void folderToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ RenamePrompt folderNamePrompt = new RenamePrompt("");
+ folderNamePrompt.OKButton.Text = "Add";
+ if (folderNamePrompt.ShowDialog() == DialogResult.OK)
+ {
+ TreeNode folerNode = CreateNode(folderNamePrompt.NewText);
+ folerNode.ImageIndex = 0;
+ folerNode.SelectedImageIndex = 0;
+ TreeNodeCollection nodeCollection = treeViewMain.SelectedNode != null &&
+ !(treeViewMain.SelectedNode.Tag is PCKFile.FileData)
+ ? treeViewMain.SelectedNode.Nodes : treeViewMain.Nodes;
+ nodeCollection.Add(folerNode);
+ }
+ }
+
+ private void installationToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ //System.Diagnostics.Process.Start(hosturl + "pckStudio#install");
+ }
+
+ private void binkaConversionToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ Process.Start("https://www.youtube.com/watch?v=v6EYr4zc7rI");
+ }
+
+ private void fAQToolStripMenuItem1_Click(object sender, EventArgs e)
+ {
+ //System.Diagnostics.Process.Start(hosturl + "pckStudio#faq");
+ }
+// BIG TODO
+#region converts and ports all skins in pck to mc bedrock format
+ // items class for use in bedrock skin conversion
+ public class Item
+ {
+ public string Id { get; set; }
+ public string Name { get; set; }
+ }
+
+ 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
+ // {
+ // 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- skinDisplayNames = new List
- ();
+
+ // //MessageBox.Show(root);//debug thingy to make sure filepath is correct
+
+ // //add all skins to a list
+ // List skinsList = new List();
+ // List capesList = new List();
+ // foreach (PCKFile.FileData skin in currentPCK.file_entries)
+ // {
+ // 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 (PCKFile.FileData newSkin in skinsList)
+ // {
+ // skinAmount += 1;
+ // string skinName = "skinName";
+ // string capePath = "";
+ // bool hasCape = false;
+
+ // foreach (var entry in newSkin.properties)
+ // {
+ // if (entry.Item1 == "DISPLAYNAME")
+ // {
+ // skinName = entry.Item2;
+ // skinDisplayNames.Add(new Item() { Id = newSkin.name.Remove(15, 4), Name = skinName });
+ // }
+ // if (entry.Item1 == "CAPEPATH")
+ // {
+ // hasCape = true;
+ // capePath = entry.Item2.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 (PCKFile.FileData 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
- modelDataHead = new List
- ();
+ // List
- modelDataBody = new List
- ();
+ // List
- modelDataLeftArm = new List
- ();
+ // List
- modelDataRightArm = new List
- ();
+ // List
- modelDataLeftLeg = new List
- ();
+ // List
- modelDataRightLeg = new List
- ();
+ // List
- modelData = new List
- ();
+
+
+ // if (skinPicture.Height == skinPicture.Width)
+ // {
+ // //determines skin type based on image dimensions, existence of BOX tags, and the ANIM value
+ // foreach (var entry in newSkin.properties)
+ // {
+ // if (entry.Item1 == "BOX")
+ // {
+ // string mClass = "";
+ // string mData = "";
+ // foreach (char dCheck in entry.Item2)
+ // {
+ // if (dCheck.ToString() != " ")
+ // {
+ // mClass += dCheck.ToString();
+ // }
+ // else
+ // {
+ // mData = entry.Item2.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.Item1 == "OFFSET")
+ // {
+ // string oClass = "";
+ // string oData = "";
+ // foreach (char oCheck in entry.Item2.ToString())
+ // {
+ // oData = entry.Item2.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.Item1 == "ANIM")
+ // {
+ // if (entry.Item2 == "0x40000")
+ // {
+
+ // }
+ // else if (entry.Item2 == "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(" }");
+ // }
+ // }
+ // Console.WriteLine(writeSkins);
+ // }
+ // 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 (PCKFile.FileData 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 (PCKFile.FileData 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 3ds feature in testing
+
+ 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 textures;
+ public List materials;
+
+ public loadedBCH()
+ {
+ textures = new List();
+ materials = new List();
+ }
+ }
+
+ 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)
+ {
+ loadedTexture tex = new loadedTexture();
+
+ 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(((PCKFile.FileData)(treeViewMain.SelectedNode.Tag)).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, RenderBase.OTextureFormat.rgba8);
+ tex.texture = new RenderBase.OTexture(texture, "Texure");
+
+ //tex.texture = treeViewMain.SelectedNode.Tag;
+
+ for (int i = 0; i < bch.textures.Count; i++)
+ {
+ tex = bch.textures[i];
+ tex.modified = true;
+
+ if (tex.modified)
+ {
+ byte[] bufferx = align(TextureCodec.encode(tex.texture.texture, RenderBase.OTextureFormat.rgba8));
+ int diff = bufferx.Length - tex.length;
+
+ replaceData(data, tex.offset, tex.length, bufferx);
+
+ //Update offsets of next textures
+ tex.length = bufferx.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);
+ }
+ }
+ using (Stream file = File.Create(currentFile + ".tmp"))
+ {
+ CopyStream(output.BaseStream, file);
+ }
+
+ }
+
+ MessageBox.Show("Done!", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+
+ }
+
+
+ public static void CopyStream(Stream input, Stream output)
+ {
+ byte[] buffer = new byte[8 * 1024];
+ int len;
+ while ((len = input.Read(buffer, 0, buffer.Length)) > 0)
+ {
+ output.Write(buffer, 0, len);
+ }
+ }
+
+#endregion
+
+ private void openToolStripMenuItem1_Click(object sender, EventArgs e)
+ {
+ DateTime Begin = DateTime.Now;
+ //pckCenter open = new pckCenter();
+ Forms.Utilities.PckCenterBeta open = new Forms.Utilities.PckCenterBeta();
+ open.Show();
+ TimeSpan duration = new TimeSpan(DateTime.Now.Ticks - Begin.Ticks);
+
+ Console.WriteLine("Completed in: " + duration);
+ }
+
+ private void wiiUPCKInstallerToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ installWiiU install = new installWiiU(null);
+ install.ShowDialog();
+ }
+
+ private void howToMakeABasicSkinPackToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ Process.Start("https://www.youtube.com/watch?v=A43aHRHkKxk");
+ }
+
+ private void howToMakeACustomSkinModelToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ Process.Start("https://www.youtube.com/watch?v=pEC_ug55lag");
+ }
+
+ private void howToMakeCustomSkinModelsbedrockToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ Process.Start("https://www.youtube.com/watch?v=6z8NTogw5x4");
+ }
+
+ private void howToMakeCustomMusicToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ Process.Start("https://www.youtube.com/watch?v=v6EYr4zc7rI");
+ }
+
+ private void howToInstallPcksDirectlyToWiiUToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ Process.Start("https://www.youtube.com/watch?v=hRQagnEplec");
+ }
+
+ private void pCKCenterReleaseToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ Process.Start("https://www.youtube.com/watch?v=E_6bXSh6yqw");
+ }
+
+ private void howPCKsWorkToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ 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 VitaPCKInstallerToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+
+ installVita install = new installVita(null);
+ install.ShowDialog();
+ }
+
+ private void toPhoenixARCDeveloperToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ Process.Start("https://cash.app/$PhoenixARC");
+ }
+
+ private void toNobledezJackToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ Process.Start("https://www.paypal.me/realnobledez");
+ }
+
+ private void addPasswordToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ if (!currentPCK.HasFile("0", 4)) throw new Exception("0 file not found");
+ PCKFile.FileData file = currentPCK.GetFile("0", 4); // Sets minefile to selected node
+ if (checkForPassword())
+ {
+ AddPCKPassword add = new AddPCKPassword(); //sets metadata adding dialog
+ if (add.ShowDialog() == DialogResult.OK)
+ file.properties.Add(("LOCK", add.Password));
+ add.Dispose();
+ reloadMetaTreeView();
+ saved = false;
+ }
+ }
+
+ private void joinDevelopmentDiscordToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ Process.Start("https://discord.gg/aJtZNFVQTv");
+ }
+
+ private void convertPCTextrurePackToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ Forms.Utilities.TextureConverterUtility tex = new Forms.Utilities.TextureConverterUtility(treeViewMain, currentPCK);
+ tex.ShowDialog();
+ }
+
+
+ private void buttonEditModel_Click(object sender, EventArgs e)
+ {
+ if (treeViewMain.SelectedNode == null ||
+ treeViewMain.SelectedNode.Tag == null ||
+ !(treeViewMain.SelectedNode.Tag is PCKFile.FileData))
+ return;
+ PCKFile.FileData file = treeViewMain.SelectedNode.Tag as PCKFile.FileData;
+ if (file.type == 0 || file.type == 1 || file.type == 2)
+ {
+ if (buttonEdit.Text == "EDIT BOXES")
+ editModel(file);
+ else if (buttonEdit.Text == "View Skin")
+ {
+ using (var ms = new MemoryStream(file.data))
+ {
+ SkinPreview frm = new SkinPreview(Image.FromStream(ms));
+ frm.ShowDialog(this);
+ frm.Dispose();
+ }
+ }
+ }
+
+ //Check for Animated Texture
+ if (file.name.StartsWith("res/textures/blocks/") || file.name.StartsWith("res/textures/items/"))
+ {
+ try
+ {
+ AnimationEditor diag = new AnimationEditor(file);
+ diag.ShowDialog(this);
+ diag.Dispose();
+ reloadMetaTreeView();
+ }
+ catch
+ {
+ MessageBox.Show("Invalid animation data.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
+ }
+ }
+
+ if (Path.GetFileName(file.name) == "audio.pck")
+ {
+ try
+ {
+ if (!TryGetLocFile(out LOCFile locFile))
+ throw new Exception("No .loc File found.");
+ Forms.Utilities.AudioEditor diag = new Forms.Utilities.AudioEditor(file, locFile, LittleEndianCheckBox.Checked);
+ diag.ShowDialog(this);
+ diag.Dispose();
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show("Error", ex.Message, MessageBoxButtons.OK,
+ MessageBoxIcon.Error);
+ return;
+ }
+ }
+
+ if (file.type == 6 && (file.name == "languages.loc" || file.name == "localisation.loc"))
+ {
+ LOCFile locFile = null;
+ using (var stream = new MemoryStream(file.data))
+ {
+ locFile = LOCFileReader.Read(stream);
+ }
+ var locEditor = new LOCEditor(locFile);
+ locEditor.ShowDialog();
+ using (var stream = new MemoryStream())
+ {
+ LOCFileWriter.Write(stream, locFile);
+ file.SetData(stream.ToArray());
+ }
+ }
+
+ // Checks to see if selected minefile is a col file
+ if (file.type == 9 && file.name == "colours.col") // .col file
+ {
+ COLFile colFile = new COLFile();
+ using (var stream = new MemoryStream(file.data))
+ {
+ colFile.Open(stream);
+ }
+ Forms.Utilities.COLEditor diag = new Forms.Utilities.COLEditor(colFile);
+ if (diag.ShowDialog(this) == DialogResult.OK && diag.data.Length > 0)
+ file.SetData(diag.data);
+ diag.Dispose();
+ }
+ }
+
+
+ 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 FormMain_FormClosed(object sender, FormClosedEventArgs e)
+ {
+ if (needsUpdate && File.Exists(Program.Appdata + @"\nobleUpdater.exe"))
+ {
+ Process.Start(Program.Appdata + @"\nobleUpdater.exe"); // starts updater
+ Application.Exit(); // closes PCK Studio to let updatear finish the job
+ }
+ }
+
+ private void checkSaveState()
+ {
+ if (!saved || isTemplateFile &&
+ MessageBox.Show("Save PCK?", "Unsaved PCK", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
+ {
+ if (isTemplateFile || string.IsNullOrEmpty(saveLocation))
+ {
+ SaveTemplate();
+ return;
+ }
+ Save(saveLocation);
+ }
+ }
+
+ 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 = 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);
+ if (FileList.Length > 1)
+ MessageBox.Show("Only one pck file at a time is currently supported");
+ currentPCK = openPck(FileList[0]);
+ BuildMainTreeView();
+ }
+
+ private void OpenPck_DragLeave(object sender, EventArgs e)
+ {
+ pckOpen.Image = Resources.pckClosed;
+ }
+
+ private void savePCK(object sender, EventArgs e)
+ {
+ checkSaveState();
+ }
+
+ private void saveAsPCK(object sender, EventArgs e)
+ {
+ SaveTemplate();
+ }
+
+ private void timer1_Tick(object sender, EventArgs e)
+ {
+ //! TODO
+ //try
+ //{
+ // RPC.SetRPC("Developing " + Path.GetFileName(PCKFilePath), "Program by PhoenixARC", "pcklgo", "PCK Studio", "pcklgo");
+ //}
+ //catch (Exception ex)
+ //{
+ // Console.WriteLine(ex.Message);
+ //}
+ }
+
+ private void FormMain_FormClosing(object sender, FormClosingEventArgs e)
+ {
+ checkSaveState();
+ RPC.CloseRPC();
+ }
+
+ private void FormMain_Deactivate(object sender, EventArgs e)
+ {
+ RPC.CloseRPC();
+ }
+
+ private void FormMain_Activated(object sender, EventArgs e)
+ {
+ try
+ {
+ RPC.Initialize("825875166574673940");
+ RPC.SetRPC("Sitting alone", "Program by PhoenixARC", "pcklgo", "PCK Studio", "pcklgo");
+ timer1.Start();
+ timer1.Enabled = true;
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine(ex.Message);
+ }
+ }
+
+ private void forMattNLContributorToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ Process.Start("https://ko-fi.com/mattnl");
+ }
+ }
+}
\ No newline at end of file
diff --git a/MinecraftUSkinEditor/Forms/Form1.ja.resx b/MinecraftUSkinEditor/MainForm.ja.resx
similarity index 100%
rename from MinecraftUSkinEditor/Forms/Form1.ja.resx
rename to MinecraftUSkinEditor/MainForm.ja.resx
diff --git a/MinecraftUSkinEditor/Forms/Form1.resx b/MinecraftUSkinEditor/MainForm.resx
similarity index 99%
rename from MinecraftUSkinEditor/Forms/Form1.resx
rename to MinecraftUSkinEditor/MainForm.resx
index a2e934a6..26943a2a 100644
--- a/MinecraftUSkinEditor/Forms/Form1.resx
+++ b/MinecraftUSkinEditor/MainForm.resx
@@ -271,21 +271,6 @@
Import Extracted Skins Folder
-
-
- iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
- vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xOdTWsmQAAABzSURBVDhPpYzB
- DQAhCARp4hr3Txu254WTjYRb9cEmk/BgRjBVHTv85Twmgt77PcJEYIFrhIkAgWOEiSAGthEmgtbaD9fW
- mBgpB4xywCgFxiMf5YDdrq3l5wjEjKtzTARMNlydY2IGot2ureVnRjkQmZbICyCi7XU5cfqKAAAAAElF
- TkSuQmCC
-
-
-
- 228, 22
-
-
- Import File
-
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
@@ -378,9 +363,6 @@
17, 17
-
- True
-
False
@@ -407,7 +389,7 @@
$this
- 8
+ 2
37, 20
@@ -28447,33 +28429,6 @@
Join Development Discord
-
- True
-
-
- True
-
-
- 428, 21
-
-
- 0, 0
-
-
- 3
-
-
- label1
-
-
- MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a
-
-
- tabPage1
-
-
- 2
-
298, 17
@@ -28563,81 +28518,6 @@
7
-
- True
-
-
- True
-
-
- tabPage1
-
-
- MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a
-
-
- openedPCKS
-
-
- 0
-
-
- Fill
-
-
- 20, 84
-
-
- 0, 0, 0, 0
-
-
- 803, 554
-
-
- 0
-
-
- False
-
-
- openedPCKS
-
-
- MetroFramework.Controls.MetroTabControl, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a
-
-
- $this
-
-
- 5
-
-
- True
-
-
- 4, 38
-
-
- 795, 512
-
-
- 0
-
-
-
-
-
- tabPage1
-
-
- MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a
-
-
- openedPCKS
-
-
- 0
-
True
@@ -29361,11 +29241,8 @@
$this
- 4
+ 5
-
- True
-
True
@@ -29391,7 +29268,7 @@
4, 38
- 795, 512
+ 795, 536
1
@@ -29460,10 +29337,10 @@
Bottom, Right
- 472, 457
+ 472, 473
- 324, 56
+ 324, 60
20
@@ -29516,6 +29393,9 @@
4
+
+ Top, Right
+
None
@@ -29526,7 +29406,7 @@
236, 3
- 474, 200
+ 200, 200
Zoom
@@ -29700,7 +29580,7 @@
237, 209
- 233, 304
+ 230, 323
11
@@ -29742,7 +29622,7 @@
0
- 233, 512
+ 233, 533
10
@@ -29790,7 +29670,7 @@
4, 38
- 795, 512
+ 795, 536
0
@@ -29811,13 +29691,13 @@
Fill
- 20, 84
+ 20, 60
0, 0, 0, 0
- 803, 554
+ 803, 578
0
@@ -29832,7 +29712,7 @@
$this
- 3
+ 4
True
@@ -29901,7 +29781,7 @@
2
- 795, 512
+ 795, 536
20
@@ -29937,7 +29817,7 @@
0, 0, 30, 30
- 305, 412
+ 305, 436
15
@@ -30206,7 +30086,7 @@
3, 3
- 454, 506
+ 454, 530
Zoom
@@ -30245,7 +30125,7 @@
3, 3, 3, 3
- 225, 278
+ 222, 297
0
@@ -30265,8 +30145,8 @@
0
-
- Top, Bottom, Left, Right
+
+ Fill
False
@@ -30275,7 +30155,7 @@
3, 3
- 219, 272
+ 216, 291
0
@@ -30323,7 +30203,7 @@
$this
- 2
+ 3
True
@@ -32903,12 +32783,6 @@
System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
- importFileToolStripMenuItem
-
-
- System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
extractToolStripMenuItem
diff --git a/MinecraftUSkinEditor/PckStudio.csproj b/MinecraftUSkinEditor/PckStudio.csproj
index b7d537fe..edbe16cf 100644
--- a/MinecraftUSkinEditor/PckStudio.csproj
+++ b/MinecraftUSkinEditor/PckStudio.csproj
@@ -253,11 +253,11 @@
EntryEditor.cs
-
+
Form
-
- Form1.cs
+
+ MainForm.cs
Form
@@ -325,6 +325,7 @@
Job.cs
+
Form
@@ -408,6 +409,7 @@
programInfo.cs
+
@@ -466,12 +468,12 @@
EntryEditor.cs
Designer
-
- Form1.cs
+
+ MainForm.cs
Designer
-
- Form1.cs
+
+ MainForm.cs
Designer
diff --git a/MinecraftUSkinEditor/Program.cs b/MinecraftUSkinEditor/Program.cs
new file mode 100644
index 00000000..e87fe573
--- /dev/null
+++ b/MinecraftUSkinEditor/Program.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Windows.Forms;
+
+namespace FUI_Studio
+{
+ static class Program
+ {
+ ///
+ /// The main entry point for the application.
+ ///
+ [STAThread]
+ static void Main(string[] args)
+ {
+ Application.EnableVisualStyles();
+ Application.SetCompatibleTextRenderingDefault(false);
+ Application.Run(new Forms.MainForm(args));
+ }
+ }
+}