diff --git a/MinecraftUSkinEditor/Forms/Additional-Popups/programInfo.Designer.cs b/MinecraftUSkinEditor/Forms/Additional-Popups/programInfo.Designer.cs
index 637a707d..be047fa6 100644
--- a/MinecraftUSkinEditor/Forms/Additional-Popups/programInfo.Designer.cs
+++ b/MinecraftUSkinEditor/Forms/Additional-Popups/programInfo.Designer.cs
@@ -34,6 +34,7 @@
this.metroLabel2 = new MetroFramework.Controls.MetroLabel();
this.metroLabel3 = new MetroFramework.Controls.MetroLabel();
this.metroLabel4 = new MetroFramework.Controls.MetroLabel();
+ this.metroLabel5 = new MetroFramework.Controls.MetroLabel();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
this.SuspendLayout();
//
@@ -53,9 +54,9 @@
this.metroLabel1.AutoSize = true;
this.metroLabel1.Location = new System.Drawing.Point(6, 333);
this.metroLabel1.Name = "metroLabel1";
- this.metroLabel1.Size = new System.Drawing.Size(323, 19);
+ this.metroLabel1.Size = new System.Drawing.Size(250, 19);
this.metroLabel1.TabIndex = 1;
- this.metroLabel1.Text = "Restored and maintained By PhoenixARC and MattNL";
+ this.metroLabel1.Text = "Restored and maintained by PhoenixARC";
this.metroLabel1.Theme = MetroFramework.MetroThemeStyle.Dark;
this.metroLabel1.Click += new System.EventHandler(this.metroLabel1_Click);
//
@@ -72,7 +73,7 @@
// metroLabel3
//
this.metroLabel3.AutoSize = true;
- this.metroLabel3.Location = new System.Drawing.Point(4, 363);
+ this.metroLabel3.Location = new System.Drawing.Point(4, 367);
this.metroLabel3.Name = "metroLabel3";
this.metroLabel3.Size = new System.Drawing.Size(212, 19);
this.metroLabel3.TabIndex = 3;
@@ -82,23 +83,34 @@
// metroLabel4
//
this.metroLabel4.AutoSize = true;
- this.metroLabel4.Location = new System.Drawing.Point(331, 363);
+ this.metroLabel4.Location = new System.Drawing.Point(331, 367);
this.metroLabel4.Name = "metroLabel4";
this.metroLabel4.Size = new System.Drawing.Size(199, 19);
this.metroLabel4.TabIndex = 4;
this.metroLabel4.Text = "3D renderer found by Newagent";
this.metroLabel4.Theme = MetroFramework.MetroThemeStyle.Dark;
//
+ // metroLabel5
+ //
+ this.metroLabel5.AutoSize = true;
+ this.metroLabel5.Location = new System.Drawing.Point(4, 350);
+ this.metroLabel5.Name = "metroLabel5";
+ this.metroLabel5.Size = new System.Drawing.Size(236, 19);
+ this.metroLabel5.TabIndex = 5;
+ this.metroLabel5.Text = "Additional code and utilities by MattNL";
+ this.metroLabel5.Theme = MetroFramework.MetroThemeStyle.Dark;
+ //
// programInfo
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BorderStyle = MetroFramework.Forms.MetroFormBorderStyle.FixedSingle;
this.ClientSize = new System.Drawing.Size(602, 392);
+ this.Controls.Add(this.metroLabel1);
+ this.Controls.Add(this.metroLabel5);
this.Controls.Add(this.metroLabel4);
this.Controls.Add(this.metroLabel3);
this.Controls.Add(this.metroLabel2);
- this.Controls.Add(this.metroLabel1);
this.Controls.Add(this.pictureBox1);
this.DisplayHeader = false;
this.MaximizeBox = false;
@@ -125,5 +137,6 @@
private MetroFramework.Controls.MetroLabel metroLabel2;
private MetroFramework.Controls.MetroLabel metroLabel3;
private MetroFramework.Controls.MetroLabel metroLabel4;
- }
+ private MetroFramework.Controls.MetroLabel metroLabel5;
+ }
}
\ No newline at end of file
diff --git a/MinecraftUSkinEditor/Forms/Form1.Designer.cs b/MinecraftUSkinEditor/Forms/Form1.Designer.cs
index 8bea4db9..ec37788a 100644
--- a/MinecraftUSkinEditor/Forms/Form1.Designer.cs
+++ b/MinecraftUSkinEditor/Forms/Form1.Designer.cs
@@ -907,7 +907,7 @@
this.treeViewMain.Name = "treeViewMain";
this.myTablePanelPckEdit.SetRowSpan(this.treeViewMain, 6);
this.treeViewMain.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.selectNode);
- this.treeViewMain.DoubleClick += new System.EventHandler(this.treeView1_DoubleClick);
+ this.treeViewMain.NodeMouseDoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeView1_DoubleClick);
this.treeViewMain.KeyDown += new System.Windows.Forms.KeyEventHandler(this.treeViewMain_KeyDown);
this.treeViewMain.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.treeViewMain_ItemDrag);
this.treeViewMain.DragEnter += new System.Windows.Forms.DragEventHandler(this.treeViewMain_DragEnter);
diff --git a/MinecraftUSkinEditor/Forms/Form1.cs b/MinecraftUSkinEditor/Forms/Form1.cs
index fc8d7a36..18984c5c 100644
--- a/MinecraftUSkinEditor/Forms/Form1.cs
+++ b/MinecraftUSkinEditor/Forms/Form1.cs
@@ -292,6 +292,17 @@ namespace PckStudio
meta.Tag = entry;
treeMeta.Nodes.Add(meta);
+ //Check for Animated Texture
+ if ((mf.name.StartsWith("res/textures/blocks/") || mf.name.StartsWith("res/textures/items/")) && (!mf.name.EndsWith("clock.png") && (!mf.name.EndsWith("compass.png"))))
+ {
+ buttonEdit.Text = "EDIT TEXTURE ANIMATION";
+ buttonEdit.Visible = true;
+ }
+ else
+ {
+ buttonEdit.Visible = false;
+ }
+
//Check for if file contains model data
if (entry[0].ToString()=="BOX")
{
@@ -344,7 +355,7 @@ namespace PckStudio
else
{
//Sets images to appear at largest relative size to program window size
- Size maxDisplay = new Size(tabPage1.Size.Width / 2 - 5, tabPage1.Size.Height / 2 - 5);
+ 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
@@ -419,7 +430,7 @@ namespace PckStudio
}
else if (Path.GetFileName(mf.name) == "audio.pck")
{
- buttonEdit.Text = "EDIT AUDIO";
+ buttonEdit.Text = "EDIT MUSIC CUES";
buttonEdit.Visible = true;
}
else
@@ -1027,7 +1038,6 @@ namespace PckStudio
#region deciphers what happens when certain pck entries are double clicked
private void treeView1_DoubleClick(object sender, EventArgs e)
{
- if (treeViewMain.SelectedNode.ImageIndex < 0) return;
if (treeViewMain.SelectedNode.Tag != null)
{
mf = (PCK.MineFile)treeViewMain.SelectedNode.Tag;
@@ -1062,6 +1072,7 @@ namespace PckStudio
{
PckStudio.Forms.Utilities.AudioEditor diag = new PckStudio.Forms.Utilities.AudioEditor(mf.data, mf);
diag.ShowDialog(this);
+ diag.Dispose();
}
catch(Exception ex)
{
@@ -1082,7 +1093,8 @@ namespace PckStudio
try
{
PckStudio.Forms.Utilities.COLEditor diag = new PckStudio.Forms.Utilities.COLEditor(mf.data, mf);
- diag.Show();
+ diag.ShowDialog(this);
+ diag.Dispose();
}
catch
{
@@ -1309,12 +1321,6 @@ namespace PckStudio
{
DoDragDrop(e.Item, DragDropEffects.Move);
}
-
- // Copy the dragged node when the right mouse button is used.
- else if (e.Button == MouseButtons.Right)
- {
- DoDragDrop(e.Item, DragDropEffects.Copy);
- }
}
// Set the target drop effect to the effect
@@ -1370,27 +1376,13 @@ namespace PckStudio
}
else // Move file aside
{
- if(targetNode.Parent != null)
+ if (targetNode.Parent != null)
{
- if (draggedNode.Index < targetNode.Index)
- {
- targetNode.Parent.Nodes.Insert(targetIndex - 1, draggedNode);
- }
- else
- {
- targetNode.Parent.Nodes.Insert(targetIndex, draggedNode);
- }
+ targetNode.Parent.Nodes.Insert(targetIndex, draggedNode);
}
else
{
- if (draggedNode.Index < targetNode.Index)
- {
- treeViewMain.Nodes.Insert(targetIndex - 1, draggedNode);
- }
- else
- {
- treeViewMain.Nodes.Insert(targetIndex, draggedNode);
- }
+ treeView1.Nodes.Insert(targetIndex, draggedNode);
}
}
}
@@ -3627,24 +3619,56 @@ namespace PckStudio
using (var ms = new MemoryStream(mf.data))
{
SkinPreview frm = new SkinPreview(Image.FromStream(ms));
- frm.Show();
+ frm.ShowDialog(this);
+ frm.Dispose();
}
}
}
+ //Check for Animated Texture
+ if (mf.name.StartsWith("res/textures/blocks/") || mf.name.StartsWith("res/textures/items/"))
+ {
+ try
+ {
+ PckStudio.AnimationEditor diag = new PckStudio.AnimationEditor(mf);
+ diag.ShowDialog(this);
+ diag.Dispose();
+
+ treeMeta.Nodes.Clear();
+ foreach (int type in types.Keys)
+ comboBox1.Items.Add(types[type]);
+
+ //loads all of selected minefiles metadata into metadata treeview
+ foreach (object[] entry in file.entries)
+ {
+ object[] strings = (object[])entry; TreeNode meta = new TreeNode();
+
+ foreach (object[] entryy in file.entries)
+ meta.Text = (string)strings[0];
+ meta.Tag = entry;
+ treeMeta.Nodes.Add(meta);
+ }
+ }
+ catch
+ {
+ MessageBox.Show("Invalid animation data.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
+ }
+ }
+
if (Path.GetFileName(mf.name) == "audio.pck")
{
- try
- {
- PckStudio.Forms.Utilities.AudioEditor diag = new PckStudio.Forms.Utilities.AudioEditor(mf.data, mf);
- diag.Show();
- }
- catch
- {
- MessageBox.Show("Invalid data", "Error", MessageBoxButtons.OK,
- MessageBoxIcon.Error);
- return;
- }
+ try
+ {
+ PckStudio.Forms.Utilities.AudioEditor diag = new PckStudio.Forms.Utilities.AudioEditor(mf.data, mf);
+ diag.ShowDialog(this);
+ diag.Dispose();
+ }
+ catch
+ {
+ MessageBox.Show("Invalid data", "Error", MessageBoxButtons.OK,MessageBoxIcon.Error);
+ return;
+ }
}
if (Path.GetExtension(mf.name) == ".loc")
@@ -3674,7 +3698,8 @@ namespace PckStudio
try
{
PckStudio.Forms.Utilities.COLEditor diag = new PckStudio.Forms.Utilities.COLEditor(mf.data, mf);
- diag.Show();
+ diag.ShowDialog(this);
+ diag.Dispose();
}
catch
{
diff --git a/MinecraftUSkinEditor/Forms/Utilities/Animation/FrameEditor.Designer.cs b/MinecraftUSkinEditor/Forms/Utilities/Animation/FrameEditor.Designer.cs
new file mode 100644
index 00000000..64da13f0
--- /dev/null
+++ b/MinecraftUSkinEditor/Forms/Utilities/Animation/FrameEditor.Designer.cs
@@ -0,0 +1,198 @@
+
+namespace PckStudio.Forms.Utilities.AnimationEditor
+{
+ partial class FrameEditor
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.button1 = new System.Windows.Forms.Button();
+ this.label2 = new System.Windows.Forms.Label();
+ this.metroTextBox1 = new MetroFramework.Controls.MetroTextBox();
+ this.label1 = new System.Windows.Forms.Label();
+ this.metroTextBox2 = new MetroFramework.Controls.MetroTextBox();
+ this.label3 = new System.Windows.Forms.Label();
+ this.button2 = new System.Windows.Forms.Button();
+ this.SuspendLayout();
+ //
+ // button1
+ //
+ this.button1.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.button1.ForeColor = System.Drawing.Color.White;
+ this.button1.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.button1.Location = new System.Drawing.Point(55, 111);
+ this.button1.Name = "button1";
+ this.button1.Size = new System.Drawing.Size(75, 23);
+ this.button1.TabIndex = 7;
+ this.button1.Text = "Save";
+ this.button1.UseVisualStyleBackColor = true;
+ this.button1.Click += new System.EventHandler(this.button1_Click);
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.ForeColor = System.Drawing.Color.White;
+ this.label2.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.label2.Location = new System.Drawing.Point(9, 54);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(36, 13);
+ this.label2.TabIndex = 6;
+ this.label2.Text = "Frame";
+ //
+ // metroTextBox1
+ //
+ //
+ //
+ //
+ this.metroTextBox1.CustomButton.Image = null;
+ this.metroTextBox1.CustomButton.Location = new System.Drawing.Point(157, 1);
+ this.metroTextBox1.CustomButton.Name = "";
+ this.metroTextBox1.CustomButton.Size = new System.Drawing.Size(21, 21);
+ this.metroTextBox1.CustomButton.Style = MetroFramework.MetroColorStyle.Blue;
+ this.metroTextBox1.CustomButton.TabIndex = 1;
+ this.metroTextBox1.CustomButton.Theme = MetroFramework.MetroThemeStyle.Light;
+ this.metroTextBox1.CustomButton.UseSelectable = true;
+ this.metroTextBox1.CustomButton.Visible = false;
+ this.metroTextBox1.Lines = new string[0];
+ this.metroTextBox1.Location = new System.Drawing.Point(77, 51);
+ this.metroTextBox1.MaxLength = 4;
+ this.metroTextBox1.Name = "metroTextBox1";
+ this.metroTextBox1.PasswordChar = '\0';
+ this.metroTextBox1.ScrollBars = System.Windows.Forms.ScrollBars.None;
+ this.metroTextBox1.SelectedText = "";
+ this.metroTextBox1.SelectionLength = 0;
+ this.metroTextBox1.SelectionStart = 0;
+ this.metroTextBox1.ShortcutsEnabled = true;
+ this.metroTextBox1.Size = new System.Drawing.Size(179, 23);
+ this.metroTextBox1.TabIndex = 9;
+ this.metroTextBox1.Theme = MetroFramework.MetroThemeStyle.Dark;
+ this.metroTextBox1.UseSelectable = true;
+ this.metroTextBox1.WaterMarkColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(109)))));
+ this.metroTextBox1.WaterMarkFont = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Pixel);
+ this.metroTextBox1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.textBox1_KeyPress);
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.ForeColor = System.Drawing.Color.White;
+ this.label1.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.label1.Location = new System.Drawing.Point(9, 83);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(62, 13);
+ this.label1.TabIndex = 10;
+ this.label1.Text = "Frame Time";
+ //
+ // metroTextBox2
+ //
+ //
+ //
+ //
+ this.metroTextBox2.CustomButton.Image = null;
+ this.metroTextBox2.CustomButton.Location = new System.Drawing.Point(157, 1);
+ this.metroTextBox2.CustomButton.Name = "";
+ this.metroTextBox2.CustomButton.Size = new System.Drawing.Size(21, 21);
+ this.metroTextBox2.CustomButton.Style = MetroFramework.MetroColorStyle.Blue;
+ this.metroTextBox2.CustomButton.TabIndex = 1;
+ this.metroTextBox2.CustomButton.Theme = MetroFramework.MetroThemeStyle.Light;
+ this.metroTextBox2.CustomButton.UseSelectable = true;
+ this.metroTextBox2.CustomButton.Visible = false;
+ this.metroTextBox2.Lines = new string[0];
+ this.metroTextBox2.Location = new System.Drawing.Point(77, 80);
+ this.metroTextBox2.MaxLength = 4;
+ this.metroTextBox2.Name = "metroTextBox2";
+ this.metroTextBox2.PasswordChar = '\0';
+ this.metroTextBox2.ScrollBars = System.Windows.Forms.ScrollBars.None;
+ this.metroTextBox2.SelectedText = "";
+ this.metroTextBox2.SelectionLength = 0;
+ this.metroTextBox2.SelectionStart = 0;
+ this.metroTextBox2.ShortcutsEnabled = true;
+ this.metroTextBox2.Size = new System.Drawing.Size(179, 23);
+ this.metroTextBox2.TabIndex = 11;
+ this.metroTextBox2.Theme = MetroFramework.MetroThemeStyle.Dark;
+ this.metroTextBox2.UseSelectable = true;
+ this.metroTextBox2.WaterMarkColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(109)))));
+ this.metroTextBox2.WaterMarkFont = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Pixel);
+ this.metroTextBox2.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.textBox1_KeyPress);
+ //
+ // label3
+ //
+ this.label3.AutoSize = true;
+ this.label3.ForeColor = System.Drawing.Color.White;
+ this.label3.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.label3.Location = new System.Drawing.Point(47, 13);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(109, 13);
+ this.label3.TabIndex = 12;
+ this.label3.Text = "may/matt was here :3";
+ //
+ // button2
+ //
+ this.button2.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.button2.ForeColor = System.Drawing.Color.White;
+ this.button2.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.button2.Location = new System.Drawing.Point(135, 111);
+ this.button2.Name = "button2";
+ this.button2.Size = new System.Drawing.Size(75, 23);
+ this.button2.TabIndex = 13;
+ this.button2.Text = "Cancel";
+ this.button2.UseVisualStyleBackColor = true;
+ this.button2.Click += new System.EventHandler(this.button2_Click);
+ //
+ // FrameEditor
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(264, 140);
+ this.ControlBox = false;
+ this.Controls.Add(this.button2);
+ this.Controls.Add(this.label3);
+ this.Controls.Add(this.label1);
+ this.Controls.Add(this.metroTextBox2);
+ this.Controls.Add(this.button1);
+ this.Controls.Add(this.label2);
+ this.Controls.Add(this.metroTextBox1);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "FrameEditor";
+ this.Resizable = false;
+ this.Style = MetroFramework.MetroColorStyle.Silver;
+ this.Theme = MetroFramework.MetroThemeStyle.Dark;
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+ private System.Windows.Forms.Button button1;
+ private System.Windows.Forms.Label label2;
+ private MetroFramework.Controls.MetroTextBox metroTextBox1;
+ private System.Windows.Forms.Label label1;
+ private MetroFramework.Controls.MetroTextBox metroTextBox2;
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.Button button2;
+ }
+}
\ No newline at end of file
diff --git a/MinecraftUSkinEditor/Forms/Utilities/Animation/FrameEditor.cs b/MinecraftUSkinEditor/Forms/Utilities/Animation/FrameEditor.cs
new file mode 100644
index 00000000..370aa2de
--- /dev/null
+++ b/MinecraftUSkinEditor/Forms/Utilities/Animation/FrameEditor.cs
@@ -0,0 +1,71 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using MetroFramework.Forms;
+using System.Windows.Forms;
+
+namespace PckStudio.Forms.Utilities.AnimationEditor
+{
+ public partial class FrameEditor : MetroForm
+ {
+ bool newF;
+ TreeView tv;
+ TreeNode node;
+ int limit;
+ Tuple data = new Tuple("","");
+ public FrameEditor(TreeView treeView, Tuple frameData, int frameLimit, bool newFrame, TreeNode nodeToEdit)
+ {
+ limit = frameLimit;
+ node = nodeToEdit;
+ data = frameData;
+ tv = treeView;
+ newF = newFrame;
+ InitializeComponent();
+ label3.Text = "Frame must be within 0 and " + frameLimit + ".\nFrame Time must be greater than 0.";
+ metroTextBox1.Text = data.Item1;
+ metroTextBox2.Text = data.Item2;
+ }
+
+ private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
+ {
+ if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar))
+ {
+ e.Handled = true;
+ }
+ }
+
+ private void button1_Click(object sender, EventArgs e)
+ {
+ if(metroTextBox1.Text == "" || metroTextBox2.Text == "") {}
+ else if(Int16.Parse(metroTextBox1.Text) > limit || Int16.Parse(metroTextBox1.Text) < 0 || Int16.Parse(metroTextBox2.Text) < 0) {}
+ else
+ {
+ if(newF)
+ {
+ TreeNode frameNode = new TreeNode();
+ Tuple finalFrameData = new Tuple(metroTextBox1.Text, metroTextBox2.Text);
+ frameNode.Tag = finalFrameData;
+ frameNode.Text = "Frame: " + metroTextBox1.Text + ", Frame Time: " + metroTextBox2.Text;
+ tv.Nodes.Add(frameNode);
+ }
+ else if(!String.IsNullOrEmpty(data.Item1))
+ {
+ Tuple finalFrameData = new Tuple(metroTextBox1.Text, metroTextBox2.Text);
+ node.Tag = finalFrameData;
+ node.Text = "Frame: " + metroTextBox1.Text + ", Frame Time: " + metroTextBox2.Text;
+ }
+ this.Close();
+ }
+ }
+
+ private void button2_Click(object sender, EventArgs e)
+ {
+ this.Close();
+ }
+ }
+}
diff --git a/MinecraftUSkinEditor/Forms/Utilities/Animation/FrameEditor.resx b/MinecraftUSkinEditor/Forms/Utilities/Animation/FrameEditor.resx
new file mode 100644
index 00000000..1af7de15
--- /dev/null
+++ b/MinecraftUSkinEditor/Forms/Utilities/Animation/FrameEditor.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/MinecraftUSkinEditor/Forms/Utilities/Animation/SetBulkSpeed.Designer.cs b/MinecraftUSkinEditor/Forms/Utilities/Animation/SetBulkSpeed.Designer.cs
new file mode 100644
index 00000000..fea0419c
--- /dev/null
+++ b/MinecraftUSkinEditor/Forms/Utilities/Animation/SetBulkSpeed.Designer.cs
@@ -0,0 +1,149 @@
+
+namespace PckStudio.Forms.Utilities.AnimationEditor
+{
+ partial class SetBulkSpeed
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.button1 = new System.Windows.Forms.Button();
+ this.label1 = new System.Windows.Forms.Label();
+ this.metroTextBox2 = new MetroFramework.Controls.MetroTextBox();
+ this.label3 = new System.Windows.Forms.Label();
+ this.button2 = new System.Windows.Forms.Button();
+ this.SuspendLayout();
+ //
+ // button1
+ //
+ this.button1.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.button1.ForeColor = System.Drawing.Color.White;
+ this.button1.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.button1.Location = new System.Drawing.Point(55, 63);
+ this.button1.Name = "button1";
+ this.button1.Size = new System.Drawing.Size(75, 23);
+ this.button1.TabIndex = 7;
+ this.button1.Text = "Save";
+ this.button1.UseVisualStyleBackColor = true;
+ this.button1.Click += new System.EventHandler(this.button1_Click);
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.ForeColor = System.Drawing.Color.White;
+ this.label1.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.label1.Location = new System.Drawing.Point(9, 35);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(79, 13);
+ this.label1.TabIndex = 10;
+ this.label1.Text = "Animation Time";
+ //
+ // metroTextBox2
+ //
+ //
+ //
+ //
+ this.metroTextBox2.CustomButton.Image = null;
+ this.metroTextBox2.CustomButton.Location = new System.Drawing.Point(140, 1);
+ this.metroTextBox2.CustomButton.Name = "";
+ this.metroTextBox2.CustomButton.Size = new System.Drawing.Size(21, 21);
+ this.metroTextBox2.CustomButton.Style = MetroFramework.MetroColorStyle.Blue;
+ this.metroTextBox2.CustomButton.TabIndex = 1;
+ this.metroTextBox2.CustomButton.Theme = MetroFramework.MetroThemeStyle.Light;
+ this.metroTextBox2.CustomButton.UseSelectable = true;
+ this.metroTextBox2.CustomButton.Visible = false;
+ this.metroTextBox2.Lines = new string[0];
+ this.metroTextBox2.Location = new System.Drawing.Point(94, 32);
+ this.metroTextBox2.MaxLength = 4;
+ this.metroTextBox2.Name = "metroTextBox2";
+ this.metroTextBox2.PasswordChar = '\0';
+ this.metroTextBox2.ScrollBars = System.Windows.Forms.ScrollBars.None;
+ this.metroTextBox2.SelectedText = "";
+ this.metroTextBox2.SelectionLength = 0;
+ this.metroTextBox2.SelectionStart = 0;
+ this.metroTextBox2.ShortcutsEnabled = true;
+ this.metroTextBox2.Size = new System.Drawing.Size(162, 23);
+ this.metroTextBox2.TabIndex = 11;
+ this.metroTextBox2.Theme = MetroFramework.MetroThemeStyle.Dark;
+ this.metroTextBox2.UseSelectable = true;
+ this.metroTextBox2.WaterMarkColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(109)))));
+ this.metroTextBox2.WaterMarkFont = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Pixel);
+ this.metroTextBox2.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.textBox1_KeyPress);
+ //
+ // label3
+ //
+ this.label3.AutoSize = true;
+ this.label3.ForeColor = System.Drawing.Color.White;
+ this.label3.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.label3.Location = new System.Drawing.Point(47, 13);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(109, 13);
+ this.label3.TabIndex = 12;
+ this.label3.Text = "may/matt was here :3";
+ //
+ // button2
+ //
+ this.button2.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.button2.ForeColor = System.Drawing.Color.White;
+ this.button2.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.button2.Location = new System.Drawing.Point(135, 63);
+ this.button2.Name = "button2";
+ this.button2.Size = new System.Drawing.Size(75, 23);
+ this.button2.TabIndex = 13;
+ this.button2.Text = "Cancel";
+ this.button2.UseVisualStyleBackColor = true;
+ this.button2.Click += new System.EventHandler(this.button2_Click);
+ //
+ // SetBulkSpeed
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(264, 94);
+ this.ControlBox = false;
+ this.Controls.Add(this.button2);
+ this.Controls.Add(this.label3);
+ this.Controls.Add(this.label1);
+ this.Controls.Add(this.metroTextBox2);
+ this.Controls.Add(this.button1);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "SetBulkSpeed";
+ this.Resizable = false;
+ this.Style = MetroFramework.MetroColorStyle.Silver;
+ this.Theme = MetroFramework.MetroThemeStyle.Dark;
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+ private System.Windows.Forms.Button button1;
+ private System.Windows.Forms.Label label1;
+ private MetroFramework.Controls.MetroTextBox metroTextBox2;
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.Button button2;
+ }
+}
\ No newline at end of file
diff --git a/MinecraftUSkinEditor/Forms/Utilities/Animation/SetBulkSpeed.cs b/MinecraftUSkinEditor/Forms/Utilities/Animation/SetBulkSpeed.cs
new file mode 100644
index 00000000..fb60ea23
--- /dev/null
+++ b/MinecraftUSkinEditor/Forms/Utilities/Animation/SetBulkSpeed.cs
@@ -0,0 +1,60 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using MetroFramework.Forms;
+using System.Windows.Forms;
+
+namespace PckStudio.Forms.Utilities.AnimationEditor
+{
+ public partial class SetBulkSpeed : MetroForm
+ {
+ TreeView tv;
+ public SetBulkSpeed(TreeView treeView)
+ {
+ tv = treeView;
+ InitializeComponent();
+ label3.Text = "Frame Time must be greater than 0.";
+ }
+
+ private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
+ {
+ if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar))
+ {
+ e.Handled = true;
+ }
+ }
+
+ private void button1_Click(object sender, EventArgs e)
+ {
+ if(metroTextBox2.Text == "") {}
+ else if(Int16.Parse(metroTextBox2.Text) < 0) {}
+ else
+ {
+ int i = 0;
+ foreach (TreeNode nodes in tv.Nodes)
+ {
+ Tuple frameData = nodes.Tag as Tuple;
+ tv.Nodes.RemoveAt(i);
+ TreeNode frameNode = new TreeNode();
+ Tuple finalFrameData = new Tuple(frameData.Item1, metroTextBox2.Text);
+ frameNode.Tag = finalFrameData;
+ frameNode.Text = "Frame: " + frameData.Item1 + ", Frame Time: " + metroTextBox2.Text;
+ tv.Nodes.Insert(i, frameNode);
+ i++;
+ }
+
+ this.Close();
+ }
+ }
+
+ private void button2_Click(object sender, EventArgs e)
+ {
+ this.Close();
+ }
+ }
+}
diff --git a/MinecraftUSkinEditor/Forms/Utilities/Animation/SetBulkSpeed.resx b/MinecraftUSkinEditor/Forms/Utilities/Animation/SetBulkSpeed.resx
new file mode 100644
index 00000000..1af7de15
--- /dev/null
+++ b/MinecraftUSkinEditor/Forms/Utilities/Animation/SetBulkSpeed.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/MinecraftUSkinEditor/Forms/Utilities/AnimationEditor.Designer.cs b/MinecraftUSkinEditor/Forms/Utilities/AnimationEditor.Designer.cs
new file mode 100644
index 00000000..05e82b4b
--- /dev/null
+++ b/MinecraftUSkinEditor/Forms/Utilities/AnimationEditor.Designer.cs
@@ -0,0 +1,233 @@
+namespace PckStudio
+{
+ partial class AnimationEditor
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AnimationEditor));
+ this.treeView1 = new System.Windows.Forms.TreeView();
+ this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
+ this.addFrameToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.removeFrameToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.menuStrip = new System.Windows.Forms.MenuStrip();
+ this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.saveToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
+ this.editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.bulkAnimationSpeedToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.metroCheckBox1 = new MetroFramework.Controls.MetroCheckBox();
+ this.metroButton1 = new MetroFramework.Controls.MetroButton();
+ this.pictureBoxWithInterpolationMode1 = new PckStudio.PictureBoxWithInterpolationMode();
+ this.timer1 = new System.Windows.Forms.Timer(this.components);
+ this.metroButton2 = new MetroFramework.Controls.MetroButton();
+ this.contextMenuStrip1.SuspendLayout();
+ this.menuStrip.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBoxWithInterpolationMode1)).BeginInit();
+ this.SuspendLayout();
+ //
+ // treeView1
+ //
+ this.treeView1.AllowDrop = true;
+ this.treeView1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
+ this.treeView1.ContextMenuStrip = this.contextMenuStrip1;
+ this.treeView1.ForeColor = System.Drawing.Color.White;
+ this.treeView1.Location = new System.Drawing.Point(20, 84);
+ this.treeView1.Margin = new System.Windows.Forms.Padding(0);
+ this.treeView1.MaximumSize = new System.Drawing.Size(205, 350);
+ this.treeView1.Name = "treeView1";
+ this.treeView1.Size = new System.Drawing.Size(165, 264);
+ this.treeView1.TabIndex = 15;
+ this.treeView1.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.treeView1_ItemDrag);
+ this.treeView1.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterSelect);
+ this.treeView1.NodeMouseDoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeView1_doubleClick);
+ this.treeView1.DragDrop += new System.Windows.Forms.DragEventHandler(this.treeView1_DragDrop);
+ this.treeView1.DragEnter += new System.Windows.Forms.DragEventHandler(this.treeView1_DragEnter);
+ this.treeView1.DragOver += new System.Windows.Forms.DragEventHandler(this.treeView1_DragOver);
+ //
+ // contextMenuStrip1
+ //
+ this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.addFrameToolStripMenuItem,
+ this.removeFrameToolStripMenuItem});
+ this.contextMenuStrip1.Name = "contextMenuStrip1";
+ this.contextMenuStrip1.Size = new System.Drawing.Size(181, 70);
+ //
+ // addFrameToolStripMenuItem
+ //
+ this.addFrameToolStripMenuItem.Image = global::PckStudio.Properties.Resources.ExportFile;
+ this.addFrameToolStripMenuItem.Name = "addFrameToolStripMenuItem";
+ this.addFrameToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
+ this.addFrameToolStripMenuItem.Text = "Add Frame";
+ this.addFrameToolStripMenuItem.Click += new System.EventHandler(this.addFrameToolStripMenuItem_Click);
+ //
+ // removeFrameToolStripMenuItem
+ //
+ this.removeFrameToolStripMenuItem.Image = global::PckStudio.Properties.Resources.Del;
+ this.removeFrameToolStripMenuItem.Name = "removeFrameToolStripMenuItem";
+ this.removeFrameToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
+ this.removeFrameToolStripMenuItem.Text = "Remove Frame";
+ this.removeFrameToolStripMenuItem.Click += new System.EventHandler(this.removeFrameToolStripMenuItem_Click);
+ //
+ // menuStrip
+ //
+ this.menuStrip.AutoSize = false;
+ this.menuStrip.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
+ this.menuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.fileToolStripMenuItem,
+ this.editToolStripMenuItem});
+ this.menuStrip.Location = new System.Drawing.Point(20, 60);
+ this.menuStrip.Name = "menuStrip";
+ this.menuStrip.Size = new System.Drawing.Size(360, 24);
+ this.menuStrip.TabIndex = 14;
+ this.menuStrip.Text = "menuStrip1";
+ //
+ // fileToolStripMenuItem
+ //
+ this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.saveToolStripMenuItem1});
+ this.fileToolStripMenuItem.ForeColor = System.Drawing.Color.White;
+ this.fileToolStripMenuItem.Name = "fileToolStripMenuItem";
+ this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20);
+ this.fileToolStripMenuItem.Text = "File";
+ //
+ // saveToolStripMenuItem1
+ //
+ this.saveToolStripMenuItem1.Image = ((System.Drawing.Image)(resources.GetObject("saveToolStripMenuItem1.Image")));
+ this.saveToolStripMenuItem1.Name = "saveToolStripMenuItem1";
+ this.saveToolStripMenuItem1.Size = new System.Drawing.Size(180, 22);
+ this.saveToolStripMenuItem1.Text = "Save";
+ this.saveToolStripMenuItem1.Click += new System.EventHandler(this.saveToolStripMenuItem1_Click);
+ //
+ // editToolStripMenuItem
+ //
+ this.editToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.bulkAnimationSpeedToolStripMenuItem});
+ this.editToolStripMenuItem.ForeColor = System.Drawing.Color.White;
+ this.editToolStripMenuItem.Name = "editToolStripMenuItem";
+ this.editToolStripMenuItem.Size = new System.Drawing.Size(39, 20);
+ this.editToolStripMenuItem.Text = "Edit";
+ //
+ // bulkAnimationSpeedToolStripMenuItem
+ //
+ this.bulkAnimationSpeedToolStripMenuItem.Image = global::PckStudio.Properties.Resources.Replace;
+ this.bulkAnimationSpeedToolStripMenuItem.Name = "bulkAnimationSpeedToolStripMenuItem";
+ this.bulkAnimationSpeedToolStripMenuItem.Size = new System.Drawing.Size(210, 22);
+ this.bulkAnimationSpeedToolStripMenuItem.Text = "Set Bulk Animation Speed";
+ this.bulkAnimationSpeedToolStripMenuItem.Click += new System.EventHandler(this.bulkAnimationSpeedToolStripMenuItem_Click);
+ //
+ // metroCheckBox1
+ //
+ this.metroCheckBox1.AutoSize = true;
+ this.metroCheckBox1.Location = new System.Drawing.Point(188, 285);
+ this.metroCheckBox1.Name = "metroCheckBox1";
+ this.metroCheckBox1.Size = new System.Drawing.Size(85, 15);
+ this.metroCheckBox1.TabIndex = 17;
+ this.metroCheckBox1.Text = "Interpolates";
+ this.metroCheckBox1.Theme = MetroFramework.MetroThemeStyle.Dark;
+ this.metroCheckBox1.UseSelectable = true;
+ this.metroCheckBox1.CheckedChanged += new System.EventHandler(this.metroCheckBox1_CheckedChanged);
+ //
+ // metroButton1
+ //
+ this.metroButton1.Location = new System.Drawing.Point(188, 306);
+ this.metroButton1.Name = "metroButton1";
+ this.metroButton1.Size = new System.Drawing.Size(103, 24);
+ this.metroButton1.TabIndex = 18;
+ this.metroButton1.Text = "Play Animation";
+ this.metroButton1.Theme = MetroFramework.MetroThemeStyle.Dark;
+ this.metroButton1.UseSelectable = true;
+ this.metroButton1.Click += new System.EventHandler(this.metroButton1_Click);
+ //
+ // pictureBoxWithInterpolationMode1
+ //
+ this.pictureBoxWithInterpolationMode1.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
+ this.pictureBoxWithInterpolationMode1.Location = new System.Drawing.Point(188, 88);
+ this.pictureBoxWithInterpolationMode1.Name = "pictureBoxWithInterpolationMode1";
+ this.pictureBoxWithInterpolationMode1.Size = new System.Drawing.Size(192, 192);
+ this.pictureBoxWithInterpolationMode1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
+ this.pictureBoxWithInterpolationMode1.TabIndex = 16;
+ this.pictureBoxWithInterpolationMode1.TabStop = false;
+ //
+ // timer1
+ //
+ this.timer1.Interval = 25;
+ this.timer1.Tick += new System.EventHandler(this.animate);
+ //
+ // metroButton2
+ //
+ this.metroButton2.Enabled = false;
+ this.metroButton2.Location = new System.Drawing.Point(293, 306);
+ this.metroButton2.Name = "metroButton2";
+ this.metroButton2.Size = new System.Drawing.Size(103, 24);
+ this.metroButton2.TabIndex = 19;
+ this.metroButton2.Text = "Stop Animation";
+ this.metroButton2.Theme = MetroFramework.MetroThemeStyle.Dark;
+ this.metroButton2.UseSelectable = true;
+ this.metroButton2.Click += new System.EventHandler(this.metroButton2_Click);
+ //
+ // AnimationEditor
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(400, 356);
+ this.Controls.Add(this.metroButton2);
+ this.Controls.Add(this.metroButton1);
+ this.Controls.Add(this.metroCheckBox1);
+ this.Controls.Add(this.pictureBoxWithInterpolationMode1);
+ this.Controls.Add(this.treeView1);
+ this.Controls.Add(this.menuStrip);
+ this.Name = "AnimationEditor";
+ this.Style = MetroFramework.MetroColorStyle.Silver;
+ this.Text = "Animation Editor";
+ this.Theme = MetroFramework.MetroThemeStyle.Dark;
+ this.contextMenuStrip1.ResumeLayout(false);
+ this.menuStrip.ResumeLayout(false);
+ this.menuStrip.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBoxWithInterpolationMode1)).EndInit();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.TreeView treeView1;
+ private System.Windows.Forms.MenuStrip menuStrip;
+ private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem saveToolStripMenuItem1;
+ private PictureBoxWithInterpolationMode pictureBoxWithInterpolationMode1;
+ private MetroFramework.Controls.MetroCheckBox metroCheckBox1;
+ private MetroFramework.Controls.MetroButton metroButton1;
+ private System.Windows.Forms.ContextMenuStrip contextMenuStrip1;
+ private System.Windows.Forms.ToolStripMenuItem addFrameToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem removeFrameToolStripMenuItem;
+ private System.Windows.Forms.Timer timer1;
+ private MetroFramework.Controls.MetroButton metroButton2;
+ private System.Windows.Forms.ToolStripMenuItem editToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem bulkAnimationSpeedToolStripMenuItem;
+ }
+}
\ No newline at end of file
diff --git a/MinecraftUSkinEditor/Forms/Utilities/AnimationEditor.cs b/MinecraftUSkinEditor/Forms/Utilities/AnimationEditor.cs
new file mode 100644
index 00000000..47d7d25a
--- /dev/null
+++ b/MinecraftUSkinEditor/Forms/Utilities/AnimationEditor.cs
@@ -0,0 +1,451 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using MetroFramework.Forms;
+using PckStudio;
+
+namespace PckStudio
+{
+ public partial class AnimationEditor : MetroForm
+ {
+ PCK.MineFile mf = new PCK.MineFile();
+ List frames = new List();
+ Image texture;
+ int frameCount;
+ string lastFrameTime = "1";
+
+ private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
+ {
+ Tuple< string, string > frameData = e.Node.Tag as Tuple;
+ Console.WriteLine(frameData.Item1 + " --- " + frameData.Item2);
+ if (metroButton1.Enabled)
+ {
+ pictureBoxWithInterpolationMode1.Image = frames[Int16.Parse(frameData.Item1)];
+ }
+ }
+
+ public AnimationEditor(PCK.MineFile MineFile)
+ {
+ mf = MineFile;
+ List strEntries = new List();
+ List strEntryData = new List();
+
+ foreach (object[] entry in mf.entries) //object = metadata entry(name:value)
+ {
+ object[] strings = (object[])entry;
+ TreeNode meta = new TreeNode();
+
+ foreach (object[] entryy in mf.entries)
+ strEntries.Add((string)strings[0]);
+ strEntryData.Add((string)strings[1]);
+ }
+
+ //if (strEntries.Find(entry => entry == "ANIM") == null) throw new System.Exception("ANIM tag is missing. No animation code is present.");
+
+ InitializeComponent();
+ MemoryStream textureMem = new MemoryStream(mf.data);
+ texture = Image.FromStream(textureMem);
+ createFrameList();
+
+ string anim = "";
+ if (strEntries.Find(entry => entry == "ANIM") == null) anim = "";
+ else anim = strEntryData[strEntries.FindIndex(entry => entry == "ANIM")];
+ Console.WriteLine("ANIMATION DATA: " + anim);
+ if (anim.StartsWith("#"))
+ {
+ Console.WriteLine("Interpolate: true");
+ metroCheckBox1.Checked = true;
+ anim = anim.Remove(0, 1);
+ }
+ else
+ {
+ Console.WriteLine("Interpolate: false");
+ metroCheckBox1.Checked = false;
+ }
+
+ frameCount = texture.Height / texture.Width;
+
+ if (!String.IsNullOrEmpty(anim))
+ {
+ string[] animData = anim.Split(new char[] { ',' });
+ if (String.IsNullOrEmpty(animData.Last())) animData = animData.Take(animData.Length - 1).ToArray();
+ foreach (string frame in animData)
+ {
+ string[] frameData = frame.Split(new char[] { '*' });
+ string outFrame = "";
+ int i = 0;
+ string currentFrame = "";
+ string currentFrameTime = "";
+ foreach (string data in frameData)
+ {
+ string label;
+ string outData;
+ if (i == 0)
+ {
+ outData = data;
+ if (String.IsNullOrEmpty(data)) throw new System.Exception("Invalid animation data");
+ label = "Frame: ";
+ currentFrame = outData;
+ }
+ else
+ {
+ outData = data;
+ // Some textures like the Halloween 2015's Lava texture don't have a
+ // frame time parameter for certain frames. This will detect that and place the last frame time in its place.
+ // This is accurate to console edition behavior.
+ // - MattNL
+ if (String.IsNullOrEmpty(data)) outData = lastFrameTime;
+ label = ", Frame Time: ";
+ currentFrameTime = outData;
+ }
+ outFrame += label + outData;
+ i++;
+ }
+ Console.WriteLine(outFrame);
+
+ TreeNode frameNode = new TreeNode();
+ Tuple finalFrameData = new Tuple(currentFrame, currentFrameTime);
+ lastFrameTime = currentFrameTime;
+ frameNode.Text = outFrame;
+ frameNode.Tag = finalFrameData;
+ treeView1.Nodes.Add(frameNode);
+ }
+ }
+ else
+ {
+ for(int i = 0; i < frameCount; i++)
+ {
+ TreeNode frameNode = new TreeNode();
+ Tuple finalFrameData = new Tuple(i.ToString(), "1");
+ frameNode.Text = "Frame: " + i.ToString() + ", Frame Time: 1";
+ frameNode.Tag = finalFrameData;
+ treeView1.Nodes.Add(frameNode);
+ }
+ }
+
+ pictureBoxWithInterpolationMode1.Image = frames[0]; //Sets image preview to the first frame of animation (0 for now)
+ Console.WriteLine("Animation Frame Count: " + frameCount);
+ }
+
+ void createFrameList()
+ {
+ int width = texture.Width;
+ int height = texture.Height;
+ int totalFrames = height / width;
+ for (int frameI = 0; frameI < totalFrames; frameI++)
+ {
+ Rectangle frameArea = new Rectangle(new Point(0, frameI * width), new Size(width, width));
+
+ Bitmap frameImage = new Bitmap(width, width);
+ using (Graphics gfx = Graphics.FromImage(frameImage))
+ {
+ gfx.SmoothingMode = SmoothingMode.None;
+ gfx.InterpolationMode = InterpolationMode.NearestNeighbor;
+ gfx.PixelOffsetMode = PixelOffsetMode.HighQuality;
+
+ gfx.DrawImage(texture, new Rectangle(0, 0, frameImage.Width, frameImage.Height), frameArea, GraphicsUnit.Pixel);
+ }
+
+ frames.Add(new Bitmap(frameImage, new Size(width, width)));
+ }
+
+ }
+
+ private int mix(double ratio, int val1, int val2) // Ported from Java Edition code
+ {
+ return (int)(ratio * (double)val1 + (1.0D - ratio) * (double)val2);
+ }
+
+ int animCurrentFrame = 0;
+ int animCurrentFrameTime = 0;
+ int animCurrentTotalFrameTime = -1;
+ Tuple currentFrameData = new Tuple("","");
+ Image img = null;
+ int nextFrame;
+ int frameCounter = 0; // ported directly from Java Edition code -MattNL
+ Image imgB = null;
+ void animate(object sender, EventArgs e)
+ {
+ if (animCurrentFrameTime > animCurrentTotalFrameTime)
+ {
+ Console.WriteLine(frameCounter + " $$$ " + frameCount);
+ frameCounter = (frameCounter + 1) % frameCount;
+ animCurrentTotalFrameTime = 0;
+ animCurrentFrameTime = 0;
+ if (animCurrentFrame > (treeView1.Nodes.Count - 1)) animCurrentFrame = 0;
+ currentFrameData = treeView1.Nodes[animCurrentFrame].Tag as Tuple;
+ pictureBoxWithInterpolationMode1.Image = frames[Int16.Parse(currentFrameData.Item1)];
+ animCurrentTotalFrameTime = Int16.Parse(currentFrameData.Item2);
+ animCurrentFrame++;
+
+ if(metroCheckBox1.Checked)
+ {
+ img = frames[Int16.Parse(currentFrameData.Item1)];
+ nextFrame = animCurrentFrame + 1;
+ if (nextFrame > frameCount - 1) nextFrame = 0;
+ Console.WriteLine(nextFrame);
+ imgB = frames[nextFrame];
+ }
+ }
+
+ // Interpolation Code (Very slow, messy, and resource heavy depending on the resolution!!!)
+
+ /*else if(metroCheckBox1.Checked && (img != null && imgB != null))
+ {
+ double d0 = 1.0D - animCurrentFrame / animCurrentTotalFrameTime;
+ int i = animCurrentFrame;
+ int j = frameCount;
+ int k = (frameCounter + 1) % j;
+
+ for (int l = 0; l < (frames.Count() - 1); ++l)
+ {
+ int i1 = img.Width;
+ int j1 = img.Width;
+
+ Bitmap finalInterpolation = new Bitmap(pictureBoxWithInterpolationMode1.Image);
+// pictureBoxWithInterpolationMode1.Image.Dispose();
+// pictureBoxWithInterpolationMode1.Image = null;
+
+ for (int k1 = 0; k1 < j1; ++k1)
+ {
+ for (int l1 = 0; l1 < i1; ++l1)
+ {
+ //Get Both Colours at the pixel point
+ Bitmap imgC = new Bitmap(img);
+ Bitmap imgBC = new Bitmap(imgB);
+ Color col1 = imgC.GetPixel(l1, k1);
+ Color col2 = imgBC.GetPixel(l1, k1);
+ imgC.Dispose();
+ imgC = null;
+ imgBC.Dispose();
+ imgBC = null;
+
+ int i2 = 0;
+ i2 |= col1.A << 24;
+ i2 |= col1.R << 16;
+ i2 |= col1.G << 8;
+ i2 |= col1.B;
+
+ int j2 = 0;
+ j2 |= col2.A << 24;
+ j2 |= col2.R << 16;
+ j2 |= col2.G << 8;
+ j2 |= col2.B;
+
+ int k2 = this.mix(d0, i2 >> 16 & 255, j2 >> 16 & 255);
+ int l2 = this.mix(d0, i2 >> 8 & 255, j2 >> 8 & 255);
+ int i3 = this.mix(d0, i2 & 255, j2 & 255);
+
+ // Create new grayscale RGB colour
+ uint finalColor = (uint)(i2 & -16777216 | k2 << 16 | l2 << 8 | i3);
+
+ byte[] values = BitConverter.GetBytes(finalColor);
+
+ int a = values[3];
+ int b = values[0];
+ int g = values[1];
+ int r = values[2];
+
+ Color newcol = Color.FromArgb(a, r, g, b);
+
+ finalInterpolation.SetPixel(l1, k1, newcol);
+ }
+ }
+
+ pictureBoxWithInterpolationMode1.Image = finalInterpolation;
+ //finalInterpolation.Dispose();
+ finalInterpolation = null;
+ }
+ }
+ */
+ Console.WriteLine(animCurrentFrame + " - " + animCurrentFrameTime + " - " + animCurrentTotalFrameTime + " - " + (treeView1.Nodes.Count - 1));
+ animCurrentFrameTime++;
+ }
+
+ private void metroButton1_Click(object sender, EventArgs e)
+ {
+ animCurrentFrame = 0;
+ animCurrentFrameTime = 0;
+ animCurrentTotalFrameTime = -1;
+ frameCounter = 0;
+ metroButton1.Enabled = false;
+ metroButton2.Enabled = true;
+ timer1.Start();
+ }
+
+ private void metroButton2_Click(object sender, EventArgs e)
+ {
+ metroButton1.Enabled = true;
+ metroButton2.Enabled = false;
+ timer1.Stop();
+ }
+
+ private void treeView1_KeyDown(object sender, KeyEventArgs e)
+ {
+ if (e.KeyData == Keys.Delete) treeView1.Nodes.Remove(treeView1.SelectedNode);
+ }
+
+ private void saveToolStripMenuItem1_Click(object sender, EventArgs e)
+ {
+ int animIndex = mf.entries.FindIndex(entry => (string)entry[0] == "ANIM");
+ string animationData = "";
+ if(metroCheckBox1.Checked) animationData += "#"; // does the animation interpolate?
+ foreach (TreeNode node in treeView1.Nodes)
+ {
+ Tuple frameData = node.Tag as Tuple;
+ animationData += frameData.Item1 + "*" + frameData.Item2 + ",";
+ }
+ animationData.TrimEnd(',');
+ object[] newEntry = new object[]
+ {
+ "ANIM",
+ animationData
+ };
+ if (animIndex != -1) mf.entries[animIndex] = newEntry;
+ else mf.entries.Add(newEntry);
+ }
+
+ // 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 treeView1_ItemDrag(object sender, ItemDragEventArgs e)
+ {
+ // Move the dragged node when the left mouse button is used.
+ if (e.Button == MouseButtons.Left)
+ {
+ DoDragDrop(e.Item, DragDropEffects.Move);
+ }
+ }
+
+ // Set the target drop effect to the effect
+ // specified in the ItemDrag event handler.
+ private void treeView1_DragEnter(object sender, DragEventArgs e)
+ {
+ e.Effect = e.AllowedEffect;
+ }
+
+ // Select the node under the mouse pointer to indicate the
+ // expected drop location.
+ private void treeView1_DragOver(object sender, DragEventArgs e)
+ {
+ // Retrieve the client coordinates of the mouse position.
+ Point targetPoint = treeView1.PointToClient(new Point(e.X, e.Y));
+
+ // Select the node at the mouse position.
+ treeView1.SelectedNode = treeView1.GetNodeAt(targetPoint);
+ }
+
+ private void treeView1_DragDrop(object sender, DragEventArgs e)
+ {
+ // Retrieve the client coordinates of the drop location.
+ Point targetPoint = treeView1.PointToClient(new Point(e.X, e.Y));
+
+ // Retrieve the node at the drop location.
+ TreeNode targetNode = treeView1.GetNodeAt(targetPoint);
+
+ // Retrieve the node that was dragged.
+ TreeNode draggedNode = (TreeNode)e.Data.GetData(typeof(TreeNode));
+
+ // Confirm that the node at the drop location is not
+ // the dragged node or a descendant of the dragged node.
+ if (targetNode == null)
+ {
+ draggedNode.Remove();
+ treeView1.Nodes.Add(draggedNode);
+ }
+ else if (!draggedNode.Equals(targetNode) && !ContainsNode(draggedNode, targetNode))
+ {
+ // If it is a move operation, remove the node from its current
+ // location and add it to the node at the drop location.
+
+ if (e.Effect == DragDropEffects.Move)
+ {
+ int draggedIndex = draggedNode.Index;
+ int targetIndex = targetNode.Index;
+ draggedNode.Remove();
+
+ if (targetNode.Tag == null) // Add to folder
+ {
+ targetNode.Nodes.Add(draggedNode);
+ }
+ else // Move file aside
+ {
+ if (targetNode.Parent != null)
+ {
+ targetNode.Parent.Nodes.Insert(targetIndex, draggedNode);
+ }
+ else
+ {
+ treeView1.Nodes.Insert(targetIndex, draggedNode);
+ }
+ }
+ }
+
+ // Expand the node at the location
+ // to show the dropped node.
+ targetNode.Expand();
+ }
+ }
+
+ // 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);
+ }
+
+ private void addFrameToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ PckStudio.Forms.Utilities.AnimationEditor.FrameEditor diag = new PckStudio.Forms.Utilities.AnimationEditor.FrameEditor(
+ treeView1,
+ new Tuple("",""),
+ frameCount - 1,
+ true,
+ new TreeNode());
+ diag.ShowDialog(this);
+ diag.Dispose();
+ }
+
+ private void treeView1_doubleClick(object sender, EventArgs e)
+ {
+ PckStudio.Forms.Utilities.AnimationEditor.FrameEditor diag = new PckStudio.Forms.Utilities.AnimationEditor.FrameEditor(
+ treeView1,
+ treeView1.SelectedNode.Tag as Tuple,
+ frameCount - 1,
+ false,
+ treeView1.SelectedNode
+ );
+ diag.ShowDialog(this);
+ diag.Dispose();
+ }
+
+ private void removeFrameToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ treeView1.SelectedNode.Remove();
+ }
+
+ private void metroCheckBox1_CheckedChanged(object sender, EventArgs e) {}
+
+ private void bulkAnimationSpeedToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ PckStudio.Forms.Utilities.AnimationEditor.SetBulkSpeed diag = new PckStudio.Forms.Utilities.AnimationEditor.SetBulkSpeed(treeView1);
+ diag.ShowDialog(this);
+ diag.Dispose();
+ }
+ }
+}
diff --git a/MinecraftUSkinEditor/Forms/Utilities/AnimationEditor.resx b/MinecraftUSkinEditor/Forms/Utilities/AnimationEditor.resx
new file mode 100644
index 00000000..cc7da445
--- /dev/null
+++ b/MinecraftUSkinEditor/Forms/Utilities/AnimationEditor.resx
@@ -0,0 +1,140 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 125, 17
+
+
+ 17, 17
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
+ wwAADsMBx2+oZAAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAADfSURBVDhPYxg8
+ QLt++3yTGbf/Fm599P/Nh49wfPXxq/+rTt37f+Dak/8gOSBgAGEMANIMxGBFyAasPf/0v8GE8//z1t8C
+ y4HU4DIALIluwLpLL+HiMANAGKoNAWASCavv/n/57gPcgOvP3oENOXj7NViOoAFGU6791+k4ghWD5Aga
+ QCyGakMAkODcU89R/I8Ng9TgNADk14dPn/8/c+kqVgySgwUqVBsCwAx49urN/zsPHmPFIDmaGvAXJInN
+ 38gYasBfqDYE0K7dOn/Wvut/sfkdGYPUgJI9VNuAAwYGAGn6yvdevWgPAAAAAElFTkSuQmCC
+
+
+
+ 280, 17
+
+
\ No newline at end of file
diff --git a/MinecraftUSkinEditor/Forms/Skins-And-Textures/addCategory.Designer.cs b/MinecraftUSkinEditor/Forms/Utilities/Audio/addCategory.Designer.cs
similarity index 100%
rename from MinecraftUSkinEditor/Forms/Skins-And-Textures/addCategory.Designer.cs
rename to MinecraftUSkinEditor/Forms/Utilities/Audio/addCategory.Designer.cs
diff --git a/MinecraftUSkinEditor/Forms/Skins-And-Textures/addCategory.cs b/MinecraftUSkinEditor/Forms/Utilities/Audio/addCategory.cs
similarity index 100%
rename from MinecraftUSkinEditor/Forms/Skins-And-Textures/addCategory.cs
rename to MinecraftUSkinEditor/Forms/Utilities/Audio/addCategory.cs
diff --git a/MinecraftUSkinEditor/Forms/Skins-And-Textures/addCategory.resx b/MinecraftUSkinEditor/Forms/Utilities/Audio/addCategory.resx
similarity index 100%
rename from MinecraftUSkinEditor/Forms/Skins-And-Textures/addCategory.resx
rename to MinecraftUSkinEditor/Forms/Utilities/Audio/addCategory.resx
diff --git a/MinecraftUSkinEditor/Forms/Utilities/AudioEditor.resx b/MinecraftUSkinEditor/Forms/Utilities/AudioEditor.resx
index aff4c22b..d5ed156b 100644
--- a/MinecraftUSkinEditor/Forms/Utilities/AudioEditor.resx
+++ b/MinecraftUSkinEditor/Forms/Utilities/AudioEditor.resx
@@ -121,6 +121,26 @@
127, 8
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
+ vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAABSSURBVDhP5c0x
+ DsAgDENRxt7/wmkNSpRGf0CCCZAegxNMM7MlGMp3dIU6dxhKf/QMNxRogeQC8ivw5Vn7C0heJlFA+kL5
+ jWAohxRkde4wnGftBS90axNmphIGAAAAAElFTkSuQmCC
+
+
+
+ 168, 22
+
+
+ Add Category
+
+
+ 168, 22
+
+
+ Remove Category
+
169, 48
@@ -159,37 +179,39 @@
4
-
-
- iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
- vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAABSSURBVDhP5c0x
- DsAgDENRxt7/wmkNSpRGf0CCCZAegxNMM7MlGMp3dIU6dxhKf/QMNxRogeQC8ivw5Vn7C0heJlFA+kL5
- jWAohxRkde4wnGftBS90axNmphIGAAAAAElFTkSuQmCC
-
-
-
- 168, 22
-
-
- Add Category
-
-
- 168, 22
-
-
- Remove Category
-
19, 8
False
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
+ wwAADsMBx2+oZAAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAADfSURBVDhPYxg8
+ QLt++3yTGbf/Fm599P/Nh49wfPXxq/+rTt37f+Dak/8gOSBgAGEMANIMxGBFyAasPf/0v8GE8//z1t8C
+ y4HU4DIALIluwLpLL+HiMANAGKoNAWASCavv/n/57gPcgOvP3oENOXj7NViOoAFGU6791+k4ghWD5Aga
+ QCyGakMAkODcU89R/I8Ng9TgNADk14dPn/8/c+kqVgySgwUqVBsCwAx49urN/zsPHmPFIDmaGvAXJInN
+ 38gYasBfqDYE0K7dOn/Wvut/sfkdGYPUgJI9VNuAAwYGAGn6yvdevWgPAAAAAElFTkSuQmCC
+
+
+
+ 98, 22
+
+
+ Save
+
+
+ 37, 20
+
+
+ File
+
20, 60
- 411, 24
+ 410, 24
11
@@ -209,31 +231,29 @@
8
-
- 37, 20
-
-
- File
-
-
-
- iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
- wwAADsMBx2+oZAAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAADfSURBVDhPYxg8
- QLt++3yTGbf/Fm599P/Nh49wfPXxq/+rTt37f+Dak/8gOSBgAGEMANIMxGBFyAasPf/0v8GE8//z1t8C
- y4HU4DIALIluwLpLL+HiMANAGKoNAWASCavv/n/57gPcgOvP3oENOXj7NViOoAFGU6791+k4ghWD5Aga
- QCyGakMAkODcU89R/I8Ng9TgNADk14dPn/8/c+kqVgySgwUqVBsCwAx49urN/zsPHmPFIDmaGvAXJInN
- 38gYasBfqDYE0K7dOn/Wvut/sfkdGYPUgJI9VNuAAwYGAGn6yvdevWgPAAAAAElFTkSuQmCC
-
-
-
- 98, 22
-
-
- Save
-
282, 8
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
+ vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAABSSURBVDhP5c0x
+ DsAgDENRxt7/wmkNSpRGf0CCCZAegxNMM7MlGMp3dIU6dxhKf/QMNxRogeQC8ivw5Vn7C0heJlFA+kL5
+ jWAohxRkde4wnGftBS90axNmphIGAAAAAElFTkSuQmCC
+
+
+
+ 147, 22
+
+
+ Add Entry
+
+
+ 147, 22
+
+
+ Remove Entry
+
148, 48
@@ -264,26 +284,6 @@
7
-
-
- iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
- vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAABSSURBVDhP5c0x
- DsAgDENRxt7/wmkNSpRGf0CCCZAegxNMM7MlGMp3dIU6dxhKf/QMNxRogeQC8ivw5Vn7C0heJlFA+kL5
- jWAohxRkde4wnGftBS90axNmphIGAAAAAElFTkSuQmCC
-
-
-
- 147, 22
-
-
- Add Entry
-
-
- 147, 22
-
-
- Remove Entry
-
290, 155
@@ -351,7 +351,7 @@
$this
- 1
+ 3
True
@@ -378,7 +378,7 @@
$this
- 0
+ 2
True
@@ -390,7 +390,7 @@
6, 13
- 451, 334
+ 450, 330
Audio Editor
diff --git a/MinecraftUSkinEditor/PckStudio.csproj b/MinecraftUSkinEditor/PckStudio.csproj
index eb2d0711..56417929 100644
--- a/MinecraftUSkinEditor/PckStudio.csproj
+++ b/MinecraftUSkinEditor/PckStudio.csproj
@@ -372,10 +372,16 @@
rename.cs
-
+
Form
-
+
+ SetBulkSpeed.cs
+
+
+ Form
+
+
addCategory.cs
@@ -453,6 +459,18 @@
Testx-12.cs
+
+ Form
+
+
+ AnimationEditor.cs
+
+
+ Form
+
+
+ FrameEditor.cs
+
Form
@@ -595,7 +613,10 @@
rename.cs
-
+
+ SetBulkSpeed.cs
+
+
addCategory.cs
@@ -663,6 +684,12 @@
Testx-12.cs
+
+ AnimationEditor.cs
+
+
+ FrameEditor.cs
+
AudioEditor.cs