From 6ba76b6a3ffe1a083d2b9b91c0ddbf24b5910683 Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Sun, 31 Jul 2022 02:10:51 +0200 Subject: [PATCH] Rename `PCKFile.FileData.name` -> `PCKFile.FileData.filepath` --- .../Classes/FileTypes/PCKFile.cs | 91 ++- .../Classes/IO/PCK/PCKFileReader.cs | 2 +- .../Classes/IO/PCK/PCKFileWriter.cs | 4 +- .../Forms/Editor/LOCEditor.resx | 6 +- .../Skins-And-Textures/AdvancedOptions.cs | 6 +- .../Forms/Skins-And-Textures/addnewskin.cs | 9 +- .../Animation/AnimationEditor.Designer.cs | 7 +- .../Utilities/Animation/AnimationEditor.cs | 437 +++++++-------- .../Animation/ChangeTile.Designer.cs | 59 +- .../Forms/Utilities/Animation/ChangeTile.cs | 104 ++-- .../Forms/Utilities/Audio/AudioEditor.cs | 4 +- .../Utilities/TextureConverterUtility.cs | 12 +- .../Forms/Utilities/pckCenterOpen.cs | 49 +- MinecraftUSkinEditor/MainForm.Designer.cs | 1 - MinecraftUSkinEditor/MainForm.cs | 516 +++++++++--------- .../Properties/Resources.Designer.cs | 22 +- .../Properties/Resources.resx | 2 +- 17 files changed, 679 insertions(+), 652 deletions(-) diff --git a/MinecraftUSkinEditor/Classes/FileTypes/PCKFile.cs b/MinecraftUSkinEditor/Classes/FileTypes/PCKFile.cs index 0def1f02..b212c407 100644 --- a/MinecraftUSkinEditor/Classes/FileTypes/PCKFile.cs +++ b/MinecraftUSkinEditor/Classes/FileTypes/PCKFile.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Linq; namespace PckStudio.Classes.FileTypes { @@ -18,20 +19,54 @@ namespace PckStudio.Classes.FileTypes DLCCapeFile = 1, // *.png DLCTextureFile = 2, // *.png DLCUIDataFile = 3, // *.fui ???? - // DLCInfoFile = 4, // "0" file - // DLCTexturePackInfoFile = 5, // (x16|x32|...)Info.pck - DLCLocalisationFile = 6, // languages.loc/localisation.loc - DLCGameRulesFile = 7, // GameRiles.grf - DLCAudioFile = 8, // audio.pck - DLCColourTableFile = 9, // colours.col - DLCGameRulesHeader = 10, // GameRiles.grh - DLCSkinDataFile = 11, // *.pck made up name -Miku - DLCModelsFile = 12, // models.bin - DLCBehavioursFile = 13, // behaviours.bin - DLCMaterialFile = 14, // entityMaterials.bin + /// + /// "0" file + /// + DLCInfoFile = 4, + /// + /// (x16|x32|...)Info.pck + /// + DLCTexturePackInfoFile = 5, + /// + /// languages.loc/localisation.loc + /// + DLCLocalisationFile = 6, + /// + /// GameRules.grf + /// + DLCGameRulesFile = 7, + /// + /// audio.pck + /// + DLCAudioFile = 8, + /// + /// colours.col + /// + DLCColourTableFile = 9, + /// + /// GameRules.grh + /// + DLCGameRulesHeader = 10, + /// + /// Skins.pck + /// made up name - Miku + /// + DLCSkinDataFile = 11, + /// + /// models.bin + /// + DLCModelsFile = 12, + /// + /// behaviours.bin + /// + DLCBehavioursFile = 13, + /// + /// entityMaterials.bin + /// + DLCMaterialFile = 14, } - public string name { get; set; } + public string filepath { get; set; } public int type { get; set; } public byte[] data => _data; public int size => _size; @@ -40,21 +75,19 @@ namespace PckStudio.Classes.FileTypes private byte[] _data = new byte[0]; private int _size = 0; - public FileData(string name, int type) + public FileData(string path, int type) { this.type = type; - this.name = name; + filepath = path; } - public FileData(string name, int type, int dataSize) + public FileData(string path, int type, int dataSize) : this(path, type) { - this.type = type; - this.name = name; _size = dataSize; _data = new byte[dataSize]; } - public FileData(FileData file) : this(file.name, file.type) + public FileData(FileData file) : this(file.filepath, file.type) { properties = file.properties; SetData(file.data); @@ -73,7 +106,7 @@ namespace PckStudio.Classes.FileTypes this.type = type; } - public List GatherMetaTags() + public List GatherPropertiesList() { var LUT = new List(); Files.ForEach(file => file.properties.ForEach(pair => @@ -85,16 +118,28 @@ namespace PckStudio.Classes.FileTypes return LUT; } - public bool HasFile(string name, int type) + /// + /// Checks wether a file with and exists + /// + /// Path to the file in the pck + /// Type of the file to check + /// when file exists, otherwise false + public bool HasFile(string filepath, int type) { - return GetFile(name, type) != null; + return GetFile(filepath, type) != null; } - public FileData GetFile(string name, int type) + /// + /// Gets the first file that Equals and + /// + /// file path of the file + /// Type of the file + /// FileData if found, otherwise null + public FileData GetFile(string filepath, int type) { foreach (var file in Files) { - if (file.name == name && file.type == type) + if (file.filepath.Equals(filepath) && file.type.Equals(type)) return file; } return null; diff --git a/MinecraftUSkinEditor/Classes/IO/PCK/PCKFileReader.cs b/MinecraftUSkinEditor/Classes/IO/PCK/PCKFileReader.cs index 25071f9f..a966fadb 100644 --- a/MinecraftUSkinEditor/Classes/IO/PCK/PCKFileReader.cs +++ b/MinecraftUSkinEditor/Classes/IO/PCK/PCKFileReader.cs @@ -79,7 +79,7 @@ namespace PckStudio.Classes.IO private string ReadString(Stream stream) { int len = ReadInt(stream); - string s = ReadString(stream, len, IsUsingLittleEndian ? Encoding.Unicode : Encoding.BigEndianUnicode); + string s = ReadString(stream, len, IsUsingLittleEndian ? Encoding.Unicode : Encoding.BigEndianUnicode); ReadInt(stream); // padding return s; } diff --git a/MinecraftUSkinEditor/Classes/IO/PCK/PCKFileWriter.cs b/MinecraftUSkinEditor/Classes/IO/PCK/PCKFileWriter.cs index 38b02019..4ed91ce5 100644 --- a/MinecraftUSkinEditor/Classes/IO/PCK/PCKFileWriter.cs +++ b/MinecraftUSkinEditor/Classes/IO/PCK/PCKFileWriter.cs @@ -22,7 +22,7 @@ namespace PckStudio.Classes.IO private PCKFileWriter(PCKFile file, bool isLittleEndian) : base(isLittleEndian) { _pckfile = file; - LUT = _pckfile.GatherMetaTags(); + LUT = _pckfile.GatherPropertiesList(); } private void WriteToStream(Stream stream) @@ -59,7 +59,7 @@ namespace PckStudio.Classes.IO { WriteInt(stream, file.size); WriteInt(stream, file.type); - WriteString(stream, file.name); + WriteString(stream, file.filepath); } } diff --git a/MinecraftUSkinEditor/Forms/Editor/LOCEditor.resx b/MinecraftUSkinEditor/Forms/Editor/LOCEditor.resx index 91dde1ba..0cc39719 100644 --- a/MinecraftUSkinEditor/Forms/Editor/LOCEditor.resx +++ b/MinecraftUSkinEditor/Forms/Editor/LOCEditor.resx @@ -122,19 +122,19 @@ - 180, 22 + 162, 22 Add Display ID - 180, 22 + 162, 22 Delete Display ID - 181, 70 + 163, 48 contextMenuStrip1 diff --git a/MinecraftUSkinEditor/Forms/Skins-And-Textures/AdvancedOptions.cs b/MinecraftUSkinEditor/Forms/Skins-And-Textures/AdvancedOptions.cs index efa0fb73..12d50a6a 100644 --- a/MinecraftUSkinEditor/Forms/Skins-And-Textures/AdvancedOptions.cs +++ b/MinecraftUSkinEditor/Forms/Skins-And-Textures/AdvancedOptions.cs @@ -61,7 +61,7 @@ namespace PckStudio foreach (PCKFile.FileData mf in currentPCK.Files) { MemoryStream png = new MemoryStream(mf.data); - if (Path.GetExtension(mf.name) == ".png") + if (Path.GetExtension(mf.filepath) == ".png") { if (Image.FromStream(png).Size.Height == Image.FromStream(png).Size.Width) { @@ -84,7 +84,7 @@ namespace PckStudio foreach (PCKFile.FileData mf in currentPCK.Files) { MemoryStream png = new MemoryStream(mf.data); - if (Path.GetExtension(mf.name) == ".png") + if (Path.GetExtension(mf.filepath) == ".png") { if (Image.FromStream(png).Size.Height == Image.FromStream(png).Size.Width / 2) { @@ -106,7 +106,7 @@ namespace PckStudio { foreach (PCKFile.FileData mf in currentPCK.Files) { - if (Path.GetExtension(mf.name) == ".png") + if (Path.GetExtension(mf.filepath) == ".png") { mf.properties.Add(new ValueTuple(treeMeta.Nodes[i].Text, treeMeta.Nodes[i].Tag.ToString() )); } diff --git a/MinecraftUSkinEditor/Forms/Skins-And-Textures/addnewskin.cs b/MinecraftUSkinEditor/Forms/Skins-And-Textures/addnewskin.cs index cbbf425b..9978c781 100644 --- a/MinecraftUSkinEditor/Forms/Skins-And-Textures/addnewskin.cs +++ b/MinecraftUSkinEditor/Forms/Skins-And-Textures/addnewskin.cs @@ -107,9 +107,6 @@ namespace PckStudio { comboBoxSkinType.Items.RemoveAt(0); } - - skinPictureBoxTexture.SizeMode = PictureBoxSizeMode.StretchImage; - skinPictureBoxTexture.InterpolationMode = InterpolationMode.NearestNeighbor; skinPictureBoxTexture.Image = img; buttonDone.Enabled = true; @@ -200,8 +197,8 @@ namespace PckStudio { try { - cape.name = $"dlccape{skinId}.png"; - skin.properties.Add(new ValueTuple("CAPEPATH", cape.name)); + cape.filepath = $"dlccape{skinId}.png"; + skin.properties.Add(new ValueTuple("CAPEPATH", cape.filepath)); } catch (Exception) { @@ -247,7 +244,7 @@ namespace PckStudio skin.properties.Add(new ValueTuple("GAME_FLAGS", "0x18")); skin.properties.Add(new ValueTuple("FREE", "1")); - skin.name = "dlcskin" + skinId + ".png"; + skin.filepath = "dlcskin" + skinId + ".png"; DialogResult = DialogResult.OK; Close(); } diff --git a/MinecraftUSkinEditor/Forms/Utilities/Animation/AnimationEditor.Designer.cs b/MinecraftUSkinEditor/Forms/Utilities/Animation/AnimationEditor.Designer.cs index 6913cedd..cc595903 100644 --- a/MinecraftUSkinEditor/Forms/Utilities/Animation/AnimationEditor.Designer.cs +++ b/MinecraftUSkinEditor/Forms/Utilities/Animation/AnimationEditor.Designer.cs @@ -60,8 +60,6 @@ // treeView1 // this.treeView1.AllowDrop = true; - this.treeView1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left))); 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; @@ -198,7 +196,7 @@ this.AnimationPlayBtn.Text = "Play Animation"; this.AnimationPlayBtn.Theme = MetroFramework.MetroThemeStyle.Dark; this.AnimationPlayBtn.UseSelectable = true; - this.AnimationPlayBtn.Click += new System.EventHandler(this.metroButton1_Click); + this.AnimationPlayBtn.Click += new System.EventHandler(this.StartAnimationBtn_Click); // // timer1 // @@ -216,7 +214,7 @@ this.AnimationStopBtn.Text = "Stop Animation"; this.AnimationStopBtn.Theme = MetroFramework.MetroThemeStyle.Dark; this.AnimationStopBtn.UseSelectable = true; - this.AnimationStopBtn.Click += new System.EventHandler(this.metroButton2_Click); + this.AnimationStopBtn.Click += new System.EventHandler(this.StopAnimationBtn_Click); // // tileLabel // @@ -310,6 +308,7 @@ this.Controls.Add(this.treeView1); this.Controls.Add(this.menuStrip); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MinimumSize = new System.Drawing.Size(412, 362); this.Name = "AnimationEditor"; this.Style = MetroFramework.MetroColorStyle.Silver; this.Text = "Animation Editor"; diff --git a/MinecraftUSkinEditor/Forms/Utilities/Animation/AnimationEditor.cs b/MinecraftUSkinEditor/Forms/Utilities/Animation/AnimationEditor.cs index 077aa76b..09e2e4f6 100644 --- a/MinecraftUSkinEditor/Forms/Utilities/Animation/AnimationEditor.cs +++ b/MinecraftUSkinEditor/Forms/Utilities/Animation/AnimationEditor.cs @@ -2,153 +2,115 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; using PckStudio.Classes.FileTypes; +using PckStudio.Forms.Utilities.AnimationEditor; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D; +using System.Drawing.Imaging; using System.IO; using System.Linq; +using System.Text; using System.Windows.Forms; namespace PckStudio { public partial class AnimationEditor : MetroForm { - PCKFile.FileData mf = null; + PCKFile.FileData animationFile = null; List frames = new List(); - int frameCount; - Newtonsoft.Json.Linq.JObject tileData = Newtonsoft.Json.Linq.JObject.Parse(System.Text.Encoding.Default.GetString(Properties.Resources.tileData)); - Image texture; + int frameCount => frames.Count; + static JObject tileData = JObject.Parse(Properties.Resources.tileData); + Image texture = null; bool isItem = false; - string lastFrameTime = "1"; - string newTileName = ""; - bool create = false; + int minimumFrameTime = 1; + string TileName = ""; + int animCurrentFrame = 0; + Tuple currentFrameData = new Tuple(0, 1); + Image img = null; + Image imgB = null; + int nextFrame; + //int frameCounter = 0; // ported directly from Java Edition code -MattNL - private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) - { - Tuple frameData = e.Node.Tag as Tuple; - Console.WriteLine(frameData.Item1 + " --- " + frameData.Item2); - if (AnimationPlayBtn.Enabled) - { - pictureBoxWithInterpolationMode1.Image = frames[short.Parse(frameData.Item1)]; - } + public AnimationEditor(Image imgage, string tileName, bool isItem) + { + InitializeComponent(); + this.isItem = isItem; + TileName = tileName; + string filePath = $"res/textures/{(isItem ? "items" : "blocks")}/{tileName}.png"; + animationFile = CreateNewAnimationFile(imgage, filePath); + CreateFrameList(imgage); } - public AnimationEditor(PCKFile.FileData file_entry, string createdFileName = "") + public AnimationEditor(PCKFile.FileData file) { InitializeComponent(); - if (string.IsNullOrEmpty(createdFileName)) + isItem = file.filepath.Split('/').Contains("items"); + TileName = Path.GetFileNameWithoutExtension(file.filepath); + animationFile = file; + if (TileName.EndsWith("MipMapLevel2") || TileName.EndsWith("MipMapLevel3")) { - mf = file_entry; - newTileName = Path.GetFileNameWithoutExtension(file_entry.name); - if (file_entry.name.Split('/').Contains("items")) isItem = true; - if (newTileName.EndsWith("MipMapLevel2") || newTileName.EndsWith("MipMapLevel3")) - { - string mipMapLvl = newTileName.Last().ToString(); - newTileName = newTileName.Substring(0, newTileName.Length - 12); - MipMapCheckbox.Checked = true; - MipMapNumericUpDown.Value = short.Parse(mipMapLvl); - } + string mipMapLvl = TileName.Last().ToString(); + TileName = TileName.Substring(0, TileName.Length - 12); + MipMapCheckbox.Checked = true; + MipMapNumericUpDown.Value = short.Parse(mipMapLvl); } - else - { - create = true; - PCKFile.FileData newMf = new PCKFile.FileData("", 2); - newMf.properties.Add(new ValueTuple("ANIM", "")); - newMf.SetData(File.ReadAllBytes(createdFileName)); - mf = newMf; - Forms.Utilities.AnimationEditor.ChangeTile diag = new Forms.Utilities.AnimationEditor.ChangeTile(); - diag.ShowDialog(this); - Console.WriteLine(diag.SelectedTile); - newTileName = diag.SelectedTile; - if (newTileName == "") Close(); - isItem = diag.IsItem; - diag.Dispose(); - } - - List strEntries = new List(); string anim = string.Empty; - foreach (var entry in mf.properties) - { - if (entry.Item1 == "ANIM") anim = entry.Item2; - strEntries.Add(entry.Item2); - } + animationFile.properties.FirstOrDefault(x => x.Item1.Equals("ANIM")); - MemoryStream textureMem = new MemoryStream(mf.data); - texture = Image.FromStream(textureMem); - createFrameList(); + MemoryStream textureMem = new MemoryStream(animationFile.data); + texture = new Bitmap(textureMem); + CreateFrameList(texture); - Console.WriteLine(newTileName); + Console.WriteLine(TileName); - foreach (Newtonsoft.Json.Linq.JObject content in tileData[isItem ? "Items" : "Blocks"].Children()) + foreach (JObject content in tileData[isItem ? "Items" : "Blocks"].Children()) { foreach (JProperty prop in content.Properties()) { - if (prop.Name == newTileName) tileLabel.Text = (string)prop.Value; + if (prop.Name == TileName) tileLabel.Text = (string)prop.Value; } } - Console.WriteLine("ANIMATION DATA: " + anim); - if (InterpolationCheckbox.Checked = anim.StartsWith("#")) - { - anim = anim.Remove(0, 1); - } - - frameCount = texture.Height / texture.Width; - if (!string.IsNullOrEmpty(anim)) { string[] animData = anim.Split(','); if (string.IsNullOrEmpty(animData.Last())) animData = animData.Take(animData.Length - 1).ToArray(); + int lastFrameTime = 0; foreach (string frame in animData) { string[] frameData = frame.Split('*'); - string outFrame = ""; - int i = 0; - string currentFrame = ""; - string currentFrameTime = ""; - foreach (string data in frameData) - { - string label; - string outData; - outData = data; - if (i == 0) - { - if (string.IsNullOrEmpty(data)) throw new Exception("Invalid animation data"); - label = "Frame: "; - currentFrame = outData; - } - else - { - // 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); + if (frameData.Length < 2) + continue; // shouldn't happen + int currentFrame = 0; + int currentFrameTime = 1; - TreeNode frameNode = new TreeNode(); - Tuple finalFrameData = new Tuple(currentFrame, currentFrameTime); - lastFrameTime = currentFrameTime; - frameNode.Text = outFrame; + if (string.IsNullOrEmpty(frameData[0])) throw new Exception("Invalid animation data"); + currentFrame = int.Parse(frameData[0]); + + // 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 + currentFrameTime = string.IsNullOrEmpty(frameData[1]) ? lastFrameTime : int.Parse(frameData[1]); + string label = $"Frame: {currentFrame}, Frame Time: {currentFrameTime}"; + Console.WriteLine(label); + + TreeNode frameNode = new TreeNode(label); + var finalFrameData = new Tuple(currentFrame, currentFrameTime); frameNode.Tag = finalFrameData; treeView1.Nodes.Add(frameNode); + lastFrameTime = currentFrameTime; } } 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"; + TreeNode frameNode = new TreeNode($"Frame: {i}, Frame Time: {minimumFrameTime}"); + var finalFrameData = new Tuple(i, minimumFrameTime); frameNode.Tag = finalFrameData; treeView1.Nodes.Add(frameNode); } @@ -157,151 +119,166 @@ namespace PckStudio pictureBoxWithInterpolationMode1.Image = frames[0]; //Sets image preview to the first frame of animation (0 for now) Console.WriteLine("Animation Frame Count: " + frameCount); } + + private PCKFile.FileData CreateNewAnimationFile(Image imgageFile, string name = "") + { + PCKFile.FileData file = new PCKFile.FileData(name, 2); + file.properties.Add(("ANIM", "")); + using (var stream = new MemoryStream()) + { + imgageFile.Save(stream, ImageFormat.Png); + file.SetData(stream.ToArray()); + } + return file; + } + + private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) + { + var frameData = e.Node.Tag as Tuple; + Console.WriteLine(frameData.Item1 + " --- " + frameData.Item2); + if (AnimationPlayBtn.Enabled) + { + pictureBoxWithInterpolationMode1.Image = frames[frameData.Item1]; + } + } - void createFrameList() + void CreateFrameList(Image texture) { frames.Clear(); - int width = texture.Width; - int height = texture.Height; - int totalFrames = height / width; - for (int frameI = 0; frameI < totalFrames; frameI++) + frames.AddRange(SplitImageToFrames(texture)); + } + + private IEnumerable SplitImageToFrames(Image source) + { + for (int i = 0; i < source.Height / source.Width; i++) { - 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)) + Rectangle tileArea = new Rectangle(new Point(0, i * source.Width), new Size(source.Width, source.Width)); + Bitmap tileImage = new Bitmap(source.Width, source.Width); + using (Graphics gfx = Graphics.FromImage(tileImage)) { 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); + gfx.DrawImage(source, new Rectangle(0, 0, source.Width, source.Width), tileArea, GraphicsUnit.Pixel); } - frames.Add(new Bitmap(frameImage, new Size(width, width))); + yield return tileImage; } + yield break; } private int mix(double ratio, int val1, int val2) // Ported from Java Edition code { - return (int)(ratio * (double)val1 + (1.0D - ratio) * (double)val2); + return (int)(ratio * val1 + (1.0D - ratio) * val2); } - int animCurrentFrame = 0; - 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) { //Console.WriteLine(frameCounter + " $$$ " + frameCount); //frameCounter = (frameCounter + 1) % frameCount; if (animCurrentFrame > (treeView1.Nodes.Count - 1)) animCurrentFrame = 0; - currentFrameData = treeView1.Nodes[animCurrentFrame].Tag as Tuple; - pictureBoxWithInterpolationMode1.Image = frames[Int16.Parse(currentFrameData.Item1)]; + currentFrameData = treeView1.Nodes[animCurrentFrame].Tag as Tuple; + pictureBoxWithInterpolationMode1.Image = frames[currentFrameData.Item1]; //animCurrentTotalFrameTime = Int16.Parse(currentFrameData.Item2); - timer1.Interval = Int16.Parse(currentFrameData.Item2) * 50; + timer1.Interval = currentFrameData.Item2 * 50; animCurrentFrame++; if (InterpolationCheckbox.Checked) { - img = frames[short.Parse(currentFrameData.Item1)]; + img = frames[currentFrameData.Item1]; nextFrame = animCurrentFrame + 1; if (nextFrame > frameCount - 1) nextFrame = 0; Console.WriteLine(nextFrame); imgB = frames[nextFrame]; } - #region interpolation code (unoptimized and unused at the moment) - // Interpolation Code (Very slow, messy, and resource heavy depending on the resolution!!!) + #region interpolation code (unoptimized and unused at the moment) + // 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; + else if (InterpolationCheckbox.Checked && (img != null && imgB != null)) + { + double d0 = 1.0D - animCurrentFrame / frameCount; + int i = animCurrentFrame; + int j = frameCount; + int k = (frameCount + 1) % j; - for (int l = 0; l < (frames.Count() - 1); ++l) - { - int i1 = img.Width; - int j1 = img.Width; + for (int l = 0; l < (frameCount - 1); ++l) + { + int i1 = img.Width; + int j1 = img.Width; - Bitmap finalInterpolation = new Bitmap(pictureBoxWithInterpolationMode1.Image); -// pictureBoxWithInterpolationMode1.Image.Dispose(); -// pictureBoxWithInterpolationMode1.Image = null; + 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; + 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 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 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); + 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); + // Create new grayscale RGB colour + uint finalColor = (uint)(i2 & -16777216 | k2 << 16 | l2 << 8 | i3); - byte[] values = BitConverter.GetBytes(finalColor); + byte[] values = BitConverter.GetBytes(finalColor); - int a = values[3]; - int b = values[0]; - int g = values[1]; - int r = values[2]; + int a = values[3]; + int b = values[0]; + int g = values[1]; + int r = values[2]; - Color newcol = Color.FromArgb(a, r, g, b); + Color newcol = Color.FromArgb(a, r, g, b); - finalInterpolation.SetPixel(l1, k1, newcol); - } - } + finalInterpolation.SetPixel(l1, k1, newcol); + } + } - pictureBoxWithInterpolationMode1.Image = finalInterpolation; - //finalInterpolation.Dispose(); - finalInterpolation = null; - } - } - */ - #endregion + pictureBoxWithInterpolationMode1.Image = finalInterpolation; + //finalInterpolation.Dispose(); + } + } - //Console.WriteLine(animCurrentFrame + " - " + animCurrentFrameTime + " - " + animCurrentTotalFrameTime + " - " + (treeView1.Nodes.Count - 1)); - } + #endregion - private void metroButton1_Click(object sender, EventArgs e) + //Console.WriteLine(animCurrentFrame + " - " + animCurrentFrameTime + " - " + animCurrentTotalFrameTime + " - " + (treeView1.Nodes.Count - 1)); + } + + private void StartAnimationBtn_Click(object sender, EventArgs e) { animCurrentFrame = 0; //animCurrentFrameTime = 0; //animCurrentTotalFrameTime = -1; //frameCounter = 0; - AnimationPlayBtn.Enabled = false; - AnimationStopBtn.Enabled = true; + AnimationPlayBtn.Enabled = !(AnimationStopBtn.Enabled = !AnimationStopBtn.Enabled); timer1.Start(); } - private void metroButton2_Click(object sender, EventArgs e) + private void StopAnimationBtn_Click(object sender, EventArgs e) { - AnimationPlayBtn.Enabled = true; - AnimationStopBtn.Enabled = false; + AnimationPlayBtn.Enabled = !(AnimationStopBtn.Enabled = !AnimationStopBtn.Enabled); timer1.Stop(); } @@ -320,16 +297,6 @@ namespace PckStudio return null; } - private TreeNode FindNodeByName(TreeView treeView, string name) - { - foreach (TreeNode node in treeView.Nodes) - { - if (node.Text.ToLower() == name.ToLower()) return node; - return FindNodeByName(node, name); - } - return null; - } - private void addNodeToAnimationsFolder(TreeNode newNode) { //TreeNode parent = FindNodeByName(treeViewMain, isItem ? "items" : "blocks"); @@ -380,35 +347,29 @@ namespace PckStudio { using (var stream = new MemoryStream()) { - texture.Save(stream, texture.RawFormat); - mf.SetData(stream.ToArray()); + texture.Save(stream, ImageFormat.Png); + animationFile.SetData(stream.ToArray()); } - if (MipMapCheckbox.Checked) - { - newTileName += "MipMapLevel" + MipMapNumericUpDown.Value.ToString(); - } + animationFile.filepath = $"res/textures/{(isItem ? "items" : "blocks")}/{TileName}{(MipMapCheckbox.Checked ? $"MipMapLevel{MipMapNumericUpDown.Value}" : string.Empty)}.png"; - //if (!create && treeViewMain.SelectedNode.Tag != null) treeViewMain.SelectedNode.Text = newTileName + ".png"; - - string animationData = ""; - if (InterpolationCheckbox.Checked) animationData += "#"; // does the animation interpolate? + string animationData = InterpolationCheckbox.Checked ? "#" : ""; foreach (TreeNode node in treeView1.Nodes) { - Tuple frameData = node.Tag as Tuple; - animationData += frameData.Item1 + "*" + frameData.Item2 + ","; + var frameData = node.Tag as Tuple; + animationData += $"{frameData.Item1}*{frameData.Item2},"; } animationData.TrimEnd(','); - foreach (var pair in mf.properties) + foreach (var pair in animationFile.properties) { if (pair.Item1 == "ANIM") { - //pair.Item2 = animationData; // TODO - break; + animationFile.properties[animationFile.properties.IndexOf(pair)] = ("ANIM", animationData); + break; } else { - mf.properties.Add(new ValueTuple("ANIM", animationData)); + animationFile.properties.Add(("ANIM", animationData)); break; } }; @@ -442,7 +403,7 @@ namespace PckStudio // addNodeToAnimationsFolder(newNode); //} - if(MipMapCheckbox.Checked) newTileName = newTileName.Substring(0, newTileName.Length - 12); + if(MipMapCheckbox.Checked) TileName = TileName.Substring(0, TileName.Length - 12); } // 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 @@ -543,7 +504,7 @@ namespace PckStudio private void treeView1_doubleClick(object sender, EventArgs e) { - Forms.Utilities.AnimationEditor.FrameEditor diag = new Forms.Utilities.AnimationEditor.FrameEditor( + FrameEditor diag = new FrameEditor( treeView1, // animation editor tree treeView1.SelectedNode.Tag as Tuple, // the current selected frame data frameCount - 1, // frame limit @@ -556,7 +517,7 @@ namespace PckStudio private void addFrameToolStripMenuItem_Click(object sender, EventArgs e) { - Forms.Utilities.AnimationEditor.FrameEditor diag = new Forms.Utilities.AnimationEditor.FrameEditor( + FrameEditor diag = new FrameEditor( treeView1, new Tuple("", ""), frameCount - 1, @@ -573,7 +534,7 @@ namespace PckStudio private void bulkAnimationSpeedToolStripMenuItem_Click(object sender, EventArgs e) { - Forms.Utilities.AnimationEditor.SetBulkSpeed diag = new Forms.Utilities.AnimationEditor.SetBulkSpeed(treeView1); + SetBulkSpeed diag = new SetBulkSpeed(treeView1); diag.ShowDialog(this); diag.Dispose(); } @@ -604,12 +565,11 @@ namespace PckStudio MemoryStream textureMem = new MemoryStream(File.ReadAllBytes(Path.GetDirectoryName(diag.FileName) + "\\/" + Path.GetFileNameWithoutExtension(diag.FileName))); texture = Image.FromStream(textureMem); - frameCount = texture.Height / texture.Width; - createFrameList(); + CreateFrameList(texture); try { - Newtonsoft.Json.Linq.JObject mcmeta = Newtonsoft.Json.Linq.JObject.Parse(File.ReadAllText(diag.FileName)); + JObject mcmeta = JObject.Parse(File.ReadAllText(diag.FileName)); if (mcmeta["animation"] != null) { @@ -632,7 +592,7 @@ namespace PckStudio Console.WriteLine((int)frame["index"] + "*" + (int)frame["time"]); TreeNode frameNode = new TreeNode(); - Tuple finalFrameData = new Tuple(((int)frame["index"]).ToString(), ((int)frame["time"]).ToString()); + var finalFrameData = new Tuple(((int)frame["index"]), ((int)frame["time"])); frameNode.Text = "Frame: " + ((int)frame["index"]).ToString() + ", Frame Time: " + ((int)frame["time"]).ToString(); frameNode.Tag = finalFrameData; treeView1.Nodes.Add(frameNode); @@ -643,7 +603,7 @@ namespace PckStudio Console.WriteLine((int)frame + "*" + frameTime); TreeNode frameNode = new TreeNode(); - Tuple finalFrameData = new Tuple(((int)frame).ToString(), frameTime.ToString()); + var finalFrameData = new Tuple(((int)frame), frameTime); frameNode.Text = "Frame: " + ((int)frame).ToString() + ", Frame Time: " + frameTime.ToString(); frameNode.Tag = finalFrameData; treeView1.Nodes.Add(frameNode); @@ -655,7 +615,7 @@ namespace PckStudio for (int i = 0; i < frameCount; i++) { TreeNode frameNode = new TreeNode(); - Tuple finalFrameData = new Tuple(i.ToString(), frameTime.ToString()); + var finalFrameData = new Tuple(i, frameTime); frameNode.Text = "Frame: " + i.ToString() + ", Frame Time: " + frameTime.ToString(); frameNode.Tag = finalFrameData; treeView1.Nodes.Add(frameNode); @@ -667,7 +627,6 @@ namespace PckStudio { MessageBox.Show(j_ex.Message, "Invalid animation"); texture = oldImage; - frameCount = oldFrameCount; frames = oldFrames; foreach (TreeNode node in oldAnimData) { @@ -675,7 +634,7 @@ namespace PckStudio } return; } - pictureBoxWithInterpolationMode1.Image = frames[Int16.Parse((treeView1.Nodes[0].Tag as Tuple).Item1)]; + pictureBoxWithInterpolationMode1.Image = frames[(treeView1.Nodes[0].Tag as Tuple).Item1]; } private void helpToolStripMenuItem_Click(object sender, EventArgs e) @@ -689,25 +648,25 @@ namespace PckStudio private void changeTileToolStripMenuItem_Click(object sender, EventArgs e) { - PckStudio.Forms.Utilities.AnimationEditor.ChangeTile diag = new Forms.Utilities.AnimationEditor.ChangeTile(newTileName); - diag.ShowDialog(this); - Console.WriteLine(diag.SelectedTile); - if (newTileName != diag.SelectedTile) isItem = diag.IsItem; - newTileName = diag.SelectedTile; - diag.Dispose(); - foreach (Newtonsoft.Json.Linq.JObject content in tileData[isItem ? "Items" : "Blocks"].Children()) - { - foreach (Newtonsoft.Json.Linq.JProperty prop in content.Properties()) + using (ChangeTile diag = new ChangeTile(TileName)) + if (diag.ShowDialog(this) == DialogResult.OK) { - if (prop.Name == newTileName) tileLabel.Text = (string)prop.Value; + Console.WriteLine(diag.SelectedTile); + if (TileName != diag.SelectedTile) isItem = diag.IsItem; + TileName = diag.SelectedTile; + foreach (JObject content in tileData[isItem ? "Items" : "Blocks"].Children()) + { + foreach (JProperty prop in content.Properties()) + { + if (prop.Name == TileName) tileLabel.Text = (string)prop.Value; + } + } } - } } private void metroCheckBox2_CheckedChanged(object sender, EventArgs e) { - metroLabel1.Visible = MipMapCheckbox.Checked; - MipMapNumericUpDown.Visible = MipMapCheckbox.Checked; + MipMapNumericUpDown.Visible = metroLabel1.Visible = MipMapCheckbox.Checked; } } } diff --git a/MinecraftUSkinEditor/Forms/Utilities/Animation/ChangeTile.Designer.cs b/MinecraftUSkinEditor/Forms/Utilities/Animation/ChangeTile.Designer.cs index 591376d5..cb35f651 100644 --- a/MinecraftUSkinEditor/Forms/Utilities/Animation/ChangeTile.Designer.cs +++ b/MinecraftUSkinEditor/Forms/Utilities/Animation/ChangeTile.Designer.cs @@ -28,8 +28,8 @@ /// private void InitializeComponent() { - this.button1 = new System.Windows.Forms.Button(); - this.button2 = new System.Windows.Forms.Button(); + this.acceptBtn = new System.Windows.Forms.Button(); + this.CancelBtn = new System.Windows.Forms.Button(); this.treeView1 = new System.Windows.Forms.TreeView(); this.treeView2 = new System.Windows.Forms.TreeView(); this.metroLabel1 = new MetroFramework.Controls.MetroLabel(); @@ -43,31 +43,32 @@ this.Items.SuspendLayout(); this.SuspendLayout(); // - // button1 + // acceptBtn // - 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, 233); - 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); + this.acceptBtn.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.acceptBtn.ForeColor = System.Drawing.Color.White; + this.acceptBtn.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.acceptBtn.Location = new System.Drawing.Point(55, 233); + this.acceptBtn.Name = "acceptBtn"; + this.acceptBtn.Size = new System.Drawing.Size(75, 23); + this.acceptBtn.TabIndex = 7; + this.acceptBtn.Text = "Save"; + this.acceptBtn.UseVisualStyleBackColor = true; + this.acceptBtn.Click += new System.EventHandler(this.button1_Click); // - // button2 + // CancelBtn // - 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, 233); - 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); + this.CancelBtn.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.CancelBtn.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.CancelBtn.ForeColor = System.Drawing.Color.White; + this.CancelBtn.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.CancelBtn.Location = new System.Drawing.Point(135, 233); + this.CancelBtn.Name = "CancelBtn"; + this.CancelBtn.Size = new System.Drawing.Size(75, 23); + this.CancelBtn.TabIndex = 13; + this.CancelBtn.Text = "Cancel"; + this.CancelBtn.UseVisualStyleBackColor = true; + this.CancelBtn.Click += new System.EventHandler(this.button2_Click); // // treeView1 // @@ -177,16 +178,18 @@ // // ChangeTile // + this.AcceptButton = this.acceptBtn; this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.CancelBtn; this.ClientSize = new System.Drawing.Size(264, 264); this.ControlBox = false; this.Controls.Add(this.metroTabControl1); this.Controls.Add(this.metroTextBox1); this.Controls.Add(this.metroLabel2); this.Controls.Add(this.metroLabel1); - this.Controls.Add(this.button2); - this.Controls.Add(this.button1); + this.Controls.Add(this.CancelBtn); + this.Controls.Add(this.acceptBtn); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; this.MaximizeBox = false; this.MinimizeBox = false; @@ -208,8 +211,8 @@ } #endregion - private System.Windows.Forms.Button button1; - private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button acceptBtn; + private System.Windows.Forms.Button CancelBtn; private System.Windows.Forms.TreeView treeView1; private System.Windows.Forms.TreeView treeView2; private MetroFramework.Controls.MetroLabel metroLabel1; diff --git a/MinecraftUSkinEditor/Forms/Utilities/Animation/ChangeTile.cs b/MinecraftUSkinEditor/Forms/Utilities/Animation/ChangeTile.cs index 20e3382e..526d7abc 100644 --- a/MinecraftUSkinEditor/Forms/Utilities/Animation/ChangeTile.cs +++ b/MinecraftUSkinEditor/Forms/Utilities/Animation/ChangeTile.cs @@ -31,50 +31,56 @@ namespace PckStudio.Forms.Utilities.AnimationEditor oldTileName = oldName; InitializeComponent(); ImageList tiles = new ImageList(); + tiles.ColorDepth = ColorDepth.Depth32Bit; - for (int i = 1; i < 545; i++) - { - int row = (i - 1) / 16; - int column = (i - 1) % 16; + //for (int i = 0; i < 545; i++) + //{ + // int row = i / 16; + // int column = i % 16; - Rectangle tileArea = new Rectangle(new Point(column * 16, row * 16), new Size(16, 16)); + // Rectangle tileArea = new Rectangle(new Point(column * 16, row * 16), new Size(16, 16)); - Bitmap tileImage = new Bitmap(16, 16); - using (Graphics gfx = Graphics.FromImage(tileImage)) - { - gfx.SmoothingMode = SmoothingMode.None; - gfx.InterpolationMode = InterpolationMode.NearestNeighbor; - gfx.PixelOffsetMode = PixelOffsetMode.HighQuality; + // Bitmap tileImage = new Bitmap(16, 16); + // using (Graphics gfx = Graphics.FromImage(tileImage)) + // { + // gfx.SmoothingMode = SmoothingMode.None; + // gfx.InterpolationMode = InterpolationMode.NearestNeighbor; + // gfx.PixelOffsetMode = PixelOffsetMode.HighQuality; - gfx.DrawImage(Properties.Resources.terrain_sheet, new Rectangle(0, 0, 16, 16), tileArea, GraphicsUnit.Pixel); - } + // gfx.DrawImage(Resources.terrain_sheet, new Rectangle(0, 0, 16, 16), tileArea, GraphicsUnit.Pixel); + // } - tiles.Images.Add(tileImage); - } - for (int i = 1; i < 273; i++) - { - int row = (i - 1) / 16; - int column = (i - 1) % 16; + // tiles.Images.Add(tileImage); + //} + //for (int i = 0; i < 273; i++) + //{ + // int row = i / 16; + // int column = i % 16; - Rectangle tileArea = new Rectangle(new Point(column * 16, row * 16), new Size(16, 16)); + // Rectangle tileArea = new Rectangle(new Point(column * 16, row * 16), new Size(16, 16)); - Bitmap tileImage = new Bitmap(16, 16); - using (Graphics gfx = Graphics.FromImage(tileImage)) - { - gfx.SmoothingMode = SmoothingMode.None; - gfx.InterpolationMode = InterpolationMode.NearestNeighbor; - gfx.PixelOffsetMode = PixelOffsetMode.HighQuality; + // Bitmap tileImage = new Bitmap(16, 16); + // using (Graphics gfx = Graphics.FromImage(tileImage)) + // { + // gfx.SmoothingMode = SmoothingMode.None; + // gfx.InterpolationMode = InterpolationMode.NearestNeighbor; + // gfx.PixelOffsetMode = PixelOffsetMode.HighQuality; - gfx.DrawImage(Resources.items_sheet, new Rectangle(0, 0, 16, 16), tileArea, GraphicsUnit.Pixel); - } + // gfx.DrawImage(Resources.items_sheet, new Rectangle(0, 0, 16, 16), tileArea, GraphicsUnit.Pixel); + // } - tiles.Images.Add(tileImage); - } + // tiles.Images.Add(tileImage); + //} + + tiles.Images.AddRange(CreateImageList(Resources.terrain_sheet, 16, 16).ToArray()); + tiles.Images.AddRange(CreateImageList(Resources.items_sheet, 16, 16).ToArray()); + treeView1.ImageList = tiles; + treeView2.ImageList = tiles; try { - JObject tileData = JObject.Parse(Encoding.Default.GetString(Resources.tileData)); + JObject tileData = JObject.Parse(Resources.tileData); int i = 0; if (tileData["Blocks"] != null) @@ -120,10 +126,8 @@ namespace PckStudio.Forms.Utilities.AnimationEditor } } - treeView1.ImageList = tiles; - treeView2.ImageList = tiles; - Blocks.Controls.Add(treeView1); - Items.Controls.Add(treeView2); + //Blocks.Controls.Add(treeView1); + //Items.Controls.Add(treeView2); } catch (Newtonsoft.Json.JsonException j_ex) { @@ -132,15 +136,36 @@ namespace PckStudio.Forms.Utilities.AnimationEditor } } + private IEnumerable CreateImageList(Image source, int width, int height) + { + int img_row_count = source.Width / width; + int img_column_count = source.Height / height; + for (int i = 0; i < img_column_count * img_row_count; i++) + { + int row = i / width; + int column = i % height; + Rectangle tileArea = new Rectangle(new Point(column * width, row * height), new Size(16, 16)); + Bitmap tileImage = new Bitmap(width, height); + using (Graphics gfx = Graphics.FromImage(tileImage)) + { + gfx.SmoothingMode = SmoothingMode.None; + gfx.InterpolationMode = InterpolationMode.NearestNeighbor; + gfx.PixelOffsetMode = PixelOffsetMode.HighQuality; + + gfx.DrawImage(source, new Rectangle(0, 0, width, height), tileArea, GraphicsUnit.Pixel); + } + yield return tileImage; + } + yield break; + } + private void treeViews_AfterSelect(object sender, TreeViewEventArgs e) { Tuple tileData = e.Node.Tag as Tuple; Console.WriteLine(tileData.Item1 + " - " + tileData.Item2); selectedTile = tileData.Item1; Console.WriteLine(selectedTile); - - if (e.Node.TreeView == treeView1) isItem = false; - if (e.Node.TreeView == treeView2) isItem = true; + isItem = e.Node.TreeView == treeView2; } void filter_TextChanged(object sender, EventArgs e) @@ -194,7 +219,8 @@ namespace PckStudio.Forms.Utilities.AnimationEditor private void button1_Click(object sender, EventArgs e) { - if (String.IsNullOrEmpty(selectedTile)) return; + if (string.IsNullOrEmpty(selectedTile)) button2_Click(sender, e); + DialogResult = DialogResult.OK; Close(); } } diff --git a/MinecraftUSkinEditor/Forms/Utilities/Audio/AudioEditor.cs b/MinecraftUSkinEditor/Forms/Utilities/Audio/AudioEditor.cs index 06dea4db..8b07cceb 100644 --- a/MinecraftUSkinEditor/Forms/Utilities/Audio/AudioEditor.cs +++ b/MinecraftUSkinEditor/Forms/Utilities/Audio/AudioEditor.cs @@ -127,7 +127,7 @@ namespace PckStudio.Forms.Utilities { Console.WriteLine("Duplicate category found, " + CatString + ". Combining..."); audioPCK.Files.Remove(categoryFile); - audioPCK.Files.Find(category => category.name == GetCategoryFromId(categoryFile.type)).properties = categoryFile.properties; + audioPCK.Files.Find(category => category.filepath == GetCategoryFromId(categoryFile.type)).properties = categoryFile.properties; } else { @@ -208,7 +208,7 @@ namespace PckStudio.Forms.Utilities if (add.ShowDialog() == DialogResult.OK) cats.Add(add.Category); PCKFile.FileData file = new PCKFile.FileData(add.Category, GetCategoryId(add.Category)); - TreeNode addNode = new TreeNode(file.name) { Tag = file }; + TreeNode addNode = new TreeNode(file.filepath) { Tag = file }; audioPCK.Files.Add(file); treeView1.Nodes.Add(addNode); treeView1.Sort(); diff --git a/MinecraftUSkinEditor/Forms/Utilities/TextureConverterUtility.cs b/MinecraftUSkinEditor/Forms/Utilities/TextureConverterUtility.cs index 0e7d47d6..aba14602 100644 --- a/MinecraftUSkinEditor/Forms/Utilities/TextureConverterUtility.cs +++ b/MinecraftUSkinEditor/Forms/Utilities/TextureConverterUtility.cs @@ -451,9 +451,9 @@ namespace PckStudio.Forms.Utilities foreach (PCKFile.FileData mf in Pck.Files) { - System.IO.FileInfo file = new System.IO.FileInfo(Environment.CurrentDirectory + "\\Temp\\" + @"\" + mf.name); + System.IO.FileInfo file = new System.IO.FileInfo(Environment.CurrentDirectory + "\\Temp\\" + @"\" + mf.filepath); file.Directory.Create(); // If the directory already exists, this method does nothing. - File.WriteAllBytes(Environment.CurrentDirectory + "\\Temp\\" + @"\" + mf.name, mf.data); //writes minefile to file + File.WriteAllBytes(Environment.CurrentDirectory + "\\Temp\\" + @"\" + mf.filepath, mf.data); //writes minefile to file } while (i <= ix) { @@ -476,9 +476,9 @@ namespace PckStudio.Forms.Utilities foreach (PCKFile.FileData mf in Pck.Files) { - System.IO.FileInfo file = new System.IO.FileInfo(Environment.CurrentDirectory + "\\Temp\\" + @"\" + mf.name); + System.IO.FileInfo file = new System.IO.FileInfo(Environment.CurrentDirectory + "\\Temp\\" + @"\" + mf.filepath); file.Directory.Create(); // If the directory already exists, this method does nothing. - File.WriteAllBytes(Environment.CurrentDirectory + "\\Temp\\" + @"\" + mf.name, mf.data); //writes minefile to file + File.WriteAllBytes(Environment.CurrentDirectory + "\\Temp\\" + @"\" + mf.filepath, mf.data); //writes minefile to file } while (i <= ix) { @@ -501,9 +501,9 @@ namespace PckStudio.Forms.Utilities foreach (PCKFile.FileData mf in Pck.Files) { - FileInfo file = new FileInfo(Environment.CurrentDirectory + "\\Temp\\" + @"\" + mf.name); + FileInfo file = new FileInfo(Environment.CurrentDirectory + "\\Temp\\" + @"\" + mf.filepath); file.Directory.Create(); // If the directory already exists, this method does nothing. - File.WriteAllBytes(Environment.CurrentDirectory + "\\Temp\\" + @"\" + mf.name, mf.data); //writes minefile to file + File.WriteAllBytes(Environment.CurrentDirectory + "\\Temp\\" + @"\" + mf.filepath, mf.data); //writes minefile to file } while (i <= ix) { diff --git a/MinecraftUSkinEditor/Forms/Utilities/pckCenterOpen.cs b/MinecraftUSkinEditor/Forms/Utilities/pckCenterOpen.cs index 0e6a4f03..11622de8 100644 --- a/MinecraftUSkinEditor/Forms/Utilities/pckCenterOpen.cs +++ b/MinecraftUSkinEditor/Forms/Utilities/pckCenterOpen.cs @@ -30,7 +30,6 @@ namespace PckStudio.Forms string ad; int mode = 0; string mod; - string appData = System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "/PCK Studio/"; MethodInvoker reloader; bool IsVita; string Pack; @@ -134,23 +133,23 @@ namespace PckStudio.Forms List capesList = new List(); PCKFile pck = null; - using (var stream = File.OpenRead(appData + "/PCK Center/myPcks/" + mod + ".pck")) + using (var stream = File.OpenRead(Program.Appdata + "/PCK-Center/myPcks/" + mod + ".pck")) { - pck = PCKFileReader.Read(stream, false); //sets opened pck + pck = PCKFileReader.Read(stream, false); // sets opened pck } PCKFile currentPCK = pck; //sets opened pck foreach (PCKFile.FileData skin in currentPCK.Files) { - if (skin.name.Count() == 19) + if (skin.filepath.Count() == 19) { - if (skin.name.Remove(7, skin.name.Count() - 7) == "dlcskin") + if (skin.filepath.Remove(7, skin.filepath.Count() - 7) == "dlcskin") { skinsList.Add(skin); - uuid = skin.name.Remove(12, 7); + uuid = skin.filepath.Remove(12, 7); uuid = uuid.Remove(0, 7); uuid = "abcdefa" + uuid; } - if (skin.name.Remove(7, skin.name.Count() - 7) == "dlccape") + if (skin.filepath.Remove(7, skin.filepath.Count() - 7) == "dlccape") { capesList.Add(skin); } @@ -185,7 +184,7 @@ namespace PckStudio.Forms if (entry.Item1 == "DISPLAYNAME") { skinName = entry.Item2; - skinDisplayNames.Add(new Item() { Id = newSkin.name.Remove(15, 4), Name = entry.Item2 }); + skinDisplayNames.Add(new Item() { Id = newSkin.filepath.Remove(15, 4), Name = entry.Item2 }); } if (entry.Item1 == "CAPEPATH") { @@ -195,15 +194,15 @@ namespace PckStudio.Forms } writeSkins.WriteLine(" {"); - writeSkins.WriteLine(" \"localization_name\": " + "\"" + newSkin.name.Remove(15, 4) + "\","); + writeSkins.WriteLine(" \"localization_name\": " + "\"" + newSkin.filepath.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(" \"geometry\": \"geometry." + packName + "." + newSkin.filepath.Remove(15, 4) + "\","); } - writeSkins.WriteLine(" \"texture\": " + "\"" + newSkin.name + "\","); + writeSkins.WriteLine(" \"texture\": " + "\"" + newSkin.filepath + "\","); if (hasCape == true) { writeSkins.WriteLine(" \"cape\":" + "\"" + capePath + "\","); @@ -367,7 +366,7 @@ namespace PckStudio.Forms } } - writeSkins.WriteLine(" \"" + "geometry." + packName + "." + newSkin.name.Remove(15, 4) + "\": {"); + writeSkins.WriteLine(" \"" + "geometry." + packName + "." + newSkin.filepath.Remove(15, 4) + "\": {"); //makes skin model depending on what skin type the skin is if (skinType == "custom") @@ -448,7 +447,7 @@ namespace PckStudio.Forms } catch (Exception) { - MessageBox.Show("A HEAD BOX tag in " + newSkin.name + " has an invalid value!"); + MessageBox.Show("A HEAD BOX tag in " + newSkin.filepath + " has an invalid value!"); } if (modelAmount != modelDataHead.Count) { @@ -539,7 +538,7 @@ namespace PckStudio.Forms } catch (Exception) { - MessageBox.Show("A BODY BOX tag in " + newSkin.name + " has an invalid value!"); + MessageBox.Show("A BODY BOX tag in " + newSkin.filepath + " has an invalid value!"); } if (modelAmount != modelDataBody.Count) { @@ -630,7 +629,7 @@ namespace PckStudio.Forms } catch (Exception) { - MessageBox.Show("A ARM0 BOX tag in " + newSkin.name + " has an invalid value!"); + MessageBox.Show("A ARM0 BOX tag in " + newSkin.filepath + " has an invalid value!"); } if (modelAmount != modelDataLeftArm.Count) { @@ -720,7 +719,7 @@ namespace PckStudio.Forms } catch (Exception) { - MessageBox.Show("A ARM1 BOX tag in " + newSkin.name + " has an invalid value!"); + MessageBox.Show("A ARM1 BOX tag in " + newSkin.filepath + " has an invalid value!"); } if (modelAmount != modelDataRightArm.Count) { @@ -810,7 +809,7 @@ namespace PckStudio.Forms } catch (Exception) { - MessageBox.Show("A LEG1 BOX tag in " + newSkin.name + " has an invalid value!"); + MessageBox.Show("A LEG1 BOX tag in " + newSkin.filepath + " has an invalid value!"); } if (modelAmount != modelDataLeftLeg.Count) { @@ -900,7 +899,7 @@ namespace PckStudio.Forms } catch (Exception) { - MessageBox.Show("A LEG0 BOX tag in " + newSkin.name + " has an invalid value!"); + MessageBox.Show("A LEG0 BOX tag in " + newSkin.filepath + " has an invalid value!"); } if (modelAmount != modelDataRightLeg.Count) { @@ -1034,13 +1033,13 @@ namespace PckStudio.Forms { ResizeImage(saveSkin, 64, 64); } - saveSkin.Save(root + "/" + skinTexture.name, ImageFormat.Png); + saveSkin.Save(root + "/" + skinTexture.filepath, ImageFormat.Png); } //adds cape textures foreach (PCKFile.FileData capeTexture in capesList) { - File.WriteAllBytes(root + "/" + capeTexture.name, capeTexture.data); + File.WriteAllBytes(root + "/" + capeTexture.filepath, capeTexture.data); } string startPath = root; @@ -1103,9 +1102,9 @@ namespace PckStudio.Forms { try { - File.Delete(appData + "/PCK Center/myPcks/" + mod + ".pck"); - File.Delete(appData + "/PCK Center/myPcks/" + mod + ".png"); - File.Delete(appData + "/PCK Center/myPcks/" + mod + ".desc"); + File.Delete(Program.Appdata + "/PCK-Center/myPcks/" + mod + ".pck"); + File.Delete(Program.Appdata + "/PCK-Center/myPcks/" + mod + ".png"); + File.Delete(Program.Appdata + "/PCK-Center/myPcks/" + mod + ".desc"); reloader(); } catch (Exception) @@ -1125,7 +1124,7 @@ namespace PckStudio.Forms { try { - File.Copy(appData + "/PCK Center/myPcks/" + mod + ".pck", export.FileName); + File.Copy(Program.Appdata + "/PCK-Center/myPcks/" + mod + ".pck", export.FileName); MessageBox.Show("PCK Received from location!"); }catch (Exception) { @@ -1146,7 +1145,7 @@ namespace PckStudio.Forms private void buttonInstallWiiU_Click(object sender, EventArgs e) { - installWiiU install = new installWiiU(appData + "/PCK Center/myPcks/" + mod + ".pck"); + installWiiU install = new installWiiU(Program.Appdata + "/PCK Center/myPcks/" + mod + ".pck"); install.ShowDialog(); } } diff --git a/MinecraftUSkinEditor/MainForm.Designer.cs b/MinecraftUSkinEditor/MainForm.Designer.cs index 145700cd..c82670e6 100644 --- a/MinecraftUSkinEditor/MainForm.Designer.cs +++ b/MinecraftUSkinEditor/MainForm.Designer.cs @@ -543,7 +543,6 @@ // resources.ApplyResources(this.installationToolStripMenuItem, "installationToolStripMenuItem"); this.installationToolStripMenuItem.Name = "installationToolStripMenuItem"; - this.installationToolStripMenuItem.Click += new System.EventHandler(this.installationToolStripMenuItem_Click); // // fAQToolStripMenuItem1 // diff --git a/MinecraftUSkinEditor/MainForm.cs b/MinecraftUSkinEditor/MainForm.cs index 9f9be738..3b284626 100644 --- a/MinecraftUSkinEditor/MainForm.cs +++ b/MinecraftUSkinEditor/MainForm.cs @@ -88,9 +88,8 @@ namespace PckStudio ofd.Filter = "PCK (Minecraft Console Package)|*.pck"; if (ofd.ShowDialog() == DialogResult.OK) { - saveLocation = ofd.FileName; currentPCK = openPck(ofd.FileName); - if (checkForPassword()) + if (addPasswordToolStripMenuItem.Enabled = checkForPassword()) { LoadEditorTab(); } @@ -123,13 +122,11 @@ namespace PckStudio private bool checkForPassword() { if (currentPCK.HasFile("0", 4)) - foreach (var pair in currentPCK.GetFile("0", 4).properties) - { - addPasswordToolStripMenuItem.Enabled = pair.Item1 != "LOCK"; - if (pair.Item1 == "LOCK") - return new pckLocked(pair.Item2).ShowDialog() == DialogResult.OK; - } - addPasswordToolStripMenuItem.Enabled = true; + { + var file = currentPCK.GetFile("0", 4); + if (file.properties.HasProperty("LOCK")) + return new pckLocked(file.properties.GetProperty("LOCK").Item2).ShowDialog() == DialogResult.OK; + } return true; } @@ -201,7 +198,7 @@ namespace PckStudio { pckFile.Files.ForEach(file => { - TreeNode node = BuildNodeTreeBySeperator(root, file.name, '/'); + TreeNode node = BuildNodeTreeBySeperator(root, file.filepath, '/'); node.Tag = file; switch (file.type) { @@ -256,41 +253,33 @@ namespace PckStudio private void selectNode(object sender, TreeViewEventArgs e) { - treeMeta.Nodes.Clear(); + ReloadMetaTreeView(); entryTypeTextBox.Text = entryDataTextBox.Text = labelImageSize.Text = ""; buttonEdit.Visible = false; pictureBoxImagePreview.Image = Resources.NoImageFound; - pictureBoxImagePreview.Show(); 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) + if (file.properties.HasProperty("BOX")) { - 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; - } - } + buttonEdit.Text = "EDIT BOXES"; + buttonEdit.Visible = true; + } + else if (file.properties.HasProperty("ANIM") && + (file.properties.GetProperty("ANIM").Item2 == "0x40000" || + file.properties.GetProperty("ANIM").Item2 == "0x80000")) + { + buttonEdit.Text = "View Skin"; + buttonEdit.Visible = true; } switch (file.type) { - case 0: - case 1: + case 2 when (file.filepath.StartsWith("res/textures/blocks/") || file.filepath.StartsWith("res/textures/items/")) && + !file.filepath.EndsWith("clock.png") && (!file.filepath.EndsWith("compass.png")): + buttonEdit.Text = "EDIT TEXTURE ANIMATION"; + buttonEdit.Visible = true; using (MemoryStream png = new MemoryStream(file.data)) { Image skinPicture = Image.FromStream(png); @@ -298,10 +287,10 @@ namespace PckStudio labelImageSize.Text = $"{skinPicture.Size.Width}x{skinPicture.Size.Height}"; } break; - case 2 when (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; + + case 0: + case 1: + case 2: using (MemoryStream png = new MemoryStream(file.data)) { Image skinPicture = Image.FromStream(png); @@ -315,12 +304,12 @@ namespace PckStudio buttonEdit.Visible = true; break; - case 8 when file.name == "audio.pck": + case 8 when file.filepath == "audio.pck": buttonEdit.Text = "EDIT MUSIC CUES"; buttonEdit.Visible = true; break; - case 9 when file.name == "colours.col": + case 9 when file.filepath == "colours.col": buttonEdit.Text = "EDIT COLORS"; buttonEdit.Visible = true; break; @@ -351,8 +340,8 @@ namespace PckStudio { var file = treeViewMain.SelectedNode.Tag as PCKFile.FileData; using SaveFileDialog exFile = new SaveFileDialog(); - exFile.FileName = Path.GetFileName(file.name); - exFile.Filter = Path.GetExtension(file.name).Replace(".", "") + " File|*" + Path.GetExtension(file.name); + exFile.FileName = Path.GetFileName(file.filepath); + exFile.Filter = Path.GetExtension(file.filepath).Replace(".", "") + " File|*" + Path.GetExtension(file.filepath); if (exFile.ShowDialog() != DialogResult.OK || // Makes sure chosen directory isn't null or whitespace AKA makes sure its usable string.IsNullOrWhiteSpace(Path.GetDirectoryName(exFile.FileName))) return; @@ -377,10 +366,10 @@ namespace PckStudio { currentPCK.Files.ForEach(file => { - if (file.name.StartsWith(selectedFolder)) + if (file.filepath.StartsWith(selectedFolder)) { - Directory.CreateDirectory($"{dialog.SelectedPath}/{Path.GetDirectoryName(file.name)}"); - File.WriteAllBytes($"{dialog.SelectedPath}/{file.name}", file.data); + Directory.CreateDirectory($"{dialog.SelectedPath}/{Path.GetDirectoryName(file.filepath)}"); + File.WriteAllBytes($"{dialog.SelectedPath}/{file.filepath}", file.data); } }); MessageBox.Show("Folder Extracted"); @@ -413,21 +402,21 @@ namespace PckStudio private void replaceToolStripMenuItem_Click(object sender, EventArgs e) { - if (!(treeViewMain.SelectedNode.Tag is PCKFile.FileData)) + if (treeViewMain.SelectedNode.Tag is PCKFile.FileData) { - // should never happen unless its a folder - MessageBox.Show("Can't replace a folder."); + 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; + } + } 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; - } - } + // should never happen unless its a folder + MessageBox.Show("Can't replace a folder."); } private void deleteFileToolStripMenuItem_Click(object sender, EventArgs e) @@ -459,7 +448,7 @@ namespace PckStudio MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes) { string pckFolderDir = node.FullPath; - currentPCK.Files.RemoveAll(file => file.name.StartsWith(pckFolderDir)); + currentPCK.Files.RemoveAll(file => file.filepath.StartsWith(pckFolderDir)); node.Remove(); saved = false; } @@ -469,25 +458,25 @@ namespace PckStudio { TreeNode node = treeViewMain.SelectedNode; if (node == null) return; - using (RenamePrompt diag = new RenamePrompt(node.FullPath)) - if (diag.ShowDialog(this) == DialogResult.OK) + using RenamePrompt diag = new RenamePrompt(node.FullPath); + if (diag.ShowDialog(this) == DialogResult.OK) + { + if (node.Tag is PCKFile.FileData) { - if (node.Tag is PCKFile.FileData) - { - var file = node.Tag as PCKFile.FileData; - file.name = diag.NewText; - } - else // folder - { - currentPCK.Files.ForEach(file => - { - if (file.name.StartsWith(node.FullPath)) - file.name = diag.NewText + file.name.Substring(node.FullPath.Length); - }); - } - saved = false; - BuildMainTreeView(); + var file = node.Tag as PCKFile.FileData; + file.filepath = diag.NewText; } + else // folder + { + currentPCK.Files.ForEach(file => + { + if (file.filepath.StartsWith(node.FullPath)) + file.filepath = diag.NewText + file.filepath.Substring(node.FullPath.Length); + }); + } + saved = false; + BuildMainTreeView(); + } } private void createSkinToolStripMenuItem_Click(object sender, EventArgs e) @@ -497,19 +486,18 @@ namespace PckStudio 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.Files.Add(add.Cape); - if (!(treeViewMain.SelectedNode.Tag is PCKFile.FileData)) - add.Skin.name = $"{treeViewMain.SelectedNode.FullPath}/{add.Skin.name}"; - currentPCK.Files.Add(add.Skin); - TrySetLocFile(locFile); - saved = false; - BuildMainTreeView(); - } - add.Dispose(); + using (addNewSkin add = new addNewSkin(locFile)) + if (add.ShowDialog() == DialogResult.OK) + { + if (add.useCape) + currentPCK.Files.Add(add.Cape); + if (!(treeViewMain.SelectedNode.Tag is PCKFile.FileData)) + add.Skin.filepath = $"{treeViewMain.SelectedNode.FullPath}/{add.Skin.filepath}"; + currentPCK.Files.Add(add.Skin); + TrySetLocFile(locFile); + saved = false; + BuildMainTreeView(); + } } private void audiopckToolStripMenuItem_Click(object sender, EventArgs e) @@ -539,12 +527,20 @@ namespace PckStudio { 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; + using (Forms.Utilities.AnimationEditor.ChangeTile diag = new Forms.Utilities.AnimationEditor.ChangeTile()) + if (diag.ShowDialog(this) == DialogResult.OK) + { + Console.WriteLine(diag.SelectedTile); + using (Image img = new Bitmap(ofd.FileName)) + using (AnimationEditor animationEditor = new AnimationEditor(img, diag.SelectedTile, diag.IsItem)) + { + if (animationEditor.ShowDialog() == DialogResult.OK) + { + treeMeta.Nodes.Clear(); + saved = false; + } + } + } } catch { @@ -562,78 +558,75 @@ namespace PckStudio !(treeViewMain.SelectedNode.Tag is PCKFile.FileData)) return; PCKFile.FileData file = treeViewMain.SelectedNode.Tag as PCKFile.FileData; - if (file.type == 6) // .loc + + switch (file.type) { - 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()) + case 6: + LOCFile l = null; + using (var stream = new MemoryStream(file.data)) { - LOCFileWriter.Write(stream, l); - file.SetData(stream.ToArray()); + l = LOCFileReader.Read(stream); } - saved = false; - } - } + var locedit = new LOCEditor(l); + locedit.ShowDialog(this); + if (locedit.WasModified) + { + using (var stream = new MemoryStream()) + { + LOCFileWriter.Write(stream, l); + file.SetData(stream.ToArray()); + } + saved = false; + } + break; - if (Path.GetFileName(file.name) == "audio.pck" && file.type == 8) - { - try - { - if (!TryGetLocFile(out LOCFile locFile)) - throw new Exception("No .loc File found."); - AudioEditor diag = new AudioEditor(file, locFile, LittleEndianCheckBox.Checked); - if (LittleEndianCheckBox.Checked) diag.Text += " (PS4/Vita)"; - diag.ShowDialog(this); + case 7: + case 10 when (Path.GetExtension(file.filepath) == ".grf" && file.type == 7) || + (Path.GetExtension(file.filepath) == ".grh" && file.type == 10): + using (GRFEditor grfEditor = new GRFEditor(file)) + grfEditor.ShowDialog(); + break; + + case 8 when file.filepath == "audio.pck": + try + { + if (!TryGetLocFile(out LOCFile locFile)) + throw new Exception("No .loc File found."); + AudioEditor audioEditor = new AudioEditor(file, locFile, LittleEndianCheckBox.Checked); + audioEditor.ShowDialog(this); + audioEditor.Dispose(); + } + catch (Exception ex) + { + MessageBox.Show("Error", ex.Message, MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + break; + + case 9 when file.filepath == "colours.col": + 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); + } + COLEditor diag = new COLEditor(colFile); + if (diag.ShowDialog(this) == DialogResult.OK && diag.data.Length > 0) + file.SetData(diag.data); diag.Dispose(); - } - catch (Exception ex) - { - MessageBox.Show("Error", ex.Message, MessageBoxButtons.OK, - MessageBoxIcon.Error); - return; - } - } - - if ((Path.GetExtension(file.name) == ".grf" && file.type == 7) || - (Path.GetExtension(file.name) == ".grh" && file.type == 10)) - { - using GRFEditor diag = new GRFEditor(file); - diag.ShowDialog(); - } - - - //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); - } - COLEditor diag = new COLEditor(colFile); - if (diag.ShowDialog(this) == DialogResult.OK && diag.data.Length > 0) - file.SetData(diag.data); - diag.Dispose(); + break; } //System.Threading.ThreadStart starter; //System.Threading.Thread binkam; //Checks to see if selected minefile is a binka file - if (Path.GetExtension(file.name) == ".binka") + if (Path.GetExtension(file.filepath) == ".binka") { MessageBox.Show(".binka Editor Coming Soon!"); } @@ -670,26 +663,26 @@ namespace PckStudio TreeNode node = treeViewMain.SelectedNode; PCKFile.FileData mfO = node.Tag as PCKFile.FileData; - PCKFile.FileData mf = new PCKFile.FileData("", mfO.type);//Creates new minefile template - mf.SetData(mfO.data);//adds file data to minefile - String dirName = Path.GetDirectoryName(mfO.name).Replace("\\", "/"); + PCKFile.FileData mf = new PCKFile.FileData("", mfO.type); // Creates new minefile template + mf.SetData(mfO.data); // adds file data to minefile + string dirName = Path.GetDirectoryName(mfO.filepath).Replace("\\", "/"); int clone_number = 0; - string old_clone_str = "_clone1"; - String nameWithoutExt = Path.GetFileNameWithoutExtension(mfO.name); - String newFileName = mfO.name; + string prev_clone_str = "_clone1"; + string nameWithoutExt = Path.GetFileNameWithoutExtension(mfO.filepath); + string newFileName = mfO.filepath; do // Checks for existing clones and names it accordingly { clone_number++; string clone_str = "_clone" + clone_number.ToString(); bool isClone = nameWithoutExt.Contains("_clone"); - if(isClone) newFileName = nameWithoutExt.Remove(nameWithoutExt.Length - 7) + clone_str + Path.GetExtension(mfO.name); - else newFileName = nameWithoutExt + clone_str + Path.GetExtension(mfO.name); - old_clone_str = clone_str; + if(isClone) newFileName = nameWithoutExt.Remove(nameWithoutExt.Length - 7) + clone_str + Path.GetExtension(mfO.filepath); + else newFileName = nameWithoutExt + clone_str + Path.GetExtension(mfO.filepath); + prev_clone_str = clone_str; } - while (currentPCK.HasFile(dirName + (String.IsNullOrEmpty(dirName) ? "" : "/") + newFileName, mf.type)); + while (currentPCK.HasFile(dirName + (string.IsNullOrEmpty(dirName) ? "" : "/") + newFileName, mf.type)); - mf.name = dirName + (String.IsNullOrEmpty(dirName) ? "" : "/") + newFileName; //sets minfile name to file name + mf.filepath = dirName + (string.IsNullOrEmpty(dirName) ? "" : "/") + newFileName; //sets minfile name to file name foreach (var entry in mfO.properties) { var property = (ValueTuple)entry; @@ -704,7 +697,7 @@ namespace PckStudio if (node.Parent == null) treeViewMain.Nodes.Insert(node.Index + 1, newNode); //adds generated minefile node else node.Parent.Nodes.Insert(node.Index + 1, newNode);//adds generated minefile node to selected folder - currentPCK.Files.Insert(node.Index + 1, newNode.Tag as PCKFile.FileData); + currentPCK.Files.Insert(node.Index + 1, mf); } private void deleteEntryToolStripMenuItem_Click(object sender, EventArgs e) @@ -869,23 +862,22 @@ namespace PckStudio private void metaToolStripMenuItem_Click(object sender, EventArgs e) { - meta edit = new meta(currentPCK.GatherMetaTags()); + meta edit = new meta(currentPCK.GatherPropertiesList()); 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 (!(treeViewMain.SelectedNode.Tag is PCKFile.FileData)) return; + PCKFile.FileData file = treeViewMain.SelectedNode.Tag as PCKFile.FileData; + using presetMeta add = new presetMeta(file); if (add.ShowDialog() == DialogResult.OK) { ReloadMetaTreeView(); saved = false; } - add.Dispose(); } private void InitializeSkinPack(int packId, int packVersion, string packName) @@ -909,9 +901,10 @@ namespace PckStudio private void InitializeTexturePack(int packId, int packVersion, string packName) { InitializeSkinPack(packId, packVersion, packName); - var texturepackInfo = new PCKFile.FileData("x16/x16Info.pck", 5); + string res = "x16"; // TODO: add reselotions selection prompt + var texturepackInfo = new PCKFile.FileData($"{res}/{res}Info.pck", 5); texturepackInfo.properties.Add(("PACKID", "0")); - texturepackInfo.properties.Add(("DATAPATH", "x16Data.pck")); + texturepackInfo.properties.Add(("DATAPATH", $"{res}Data.pck")); currentPCK.Files.Add(texturepackInfo); } @@ -987,8 +980,7 @@ namespace PckStudio private void closeToolStripMenuItem_Click(object sender, EventArgs e) { - if (!saved) - SaveTemplate(); + checkSaveState(); CloseEditorTab(); } @@ -1017,8 +1009,8 @@ namespace PckStudio try { //Extracts a chosen pck file to a chosen destincation - OpenFileDialog ofd = new OpenFileDialog(); - FolderBrowserDialog sfd = new FolderBrowserDialog(); + using OpenFileDialog ofd = new OpenFileDialog(); + using FolderBrowserDialog sfd = new FolderBrowserDialog(); ofd.CheckFileExists = true; ofd.Filter = "PCK (Minecraft Console Package)|*.pck"; @@ -1027,21 +1019,28 @@ namespace PckStudio PCKFile pckfile = null; using (var fs = File.OpenRead(ofd.FileName)) { - pckfile = PCKFileReader.Read(fs, LittleEndianCheckBox.Checked); + try + { + pckfile = PCKFileReader.Read(fs, LittleEndianCheckBox.Checked); + } + catch (OverflowException ex) + { + MessageBox.Show("Error", "Failed to open pck\nTry checking the 'Open/Save as Vita/PS4 pck' check box in the upper right corner.", + MessageBoxButtons.OK, MessageBoxIcon.Error); + Console.WriteLine(ex.Message); + } } + if (pckfile.HasFile("0", 4) && + pckfile.GetFile("0", 4).properties.HasProperty("LOCK") && + new pckLocked(pckfile.GetFile("0", 4).properties.GetProperty("LOCK").Item2).ShowDialog() != DialogResult.OK) + return; // cancel extraction if password not provided foreach (PCKFile.FileData mf in pckfile.Files) { - 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 filepath = $"{sfd.SelectedPath}/{mf.filepath}"; + FileInfo file = new FileInfo(filepath); + file.Directory.Create(); + File.WriteAllBytes(filepath, mf.data); // writes data to file + //attempts to generate reimportable metadata file out of minefiles metadata string metaData = ""; foreach (var entry in mf.properties) @@ -1049,7 +1048,7 @@ namespace PckStudio metaData += $"{entry.Item1}: {entry.Item2}{Environment.NewLine}"; } - File.WriteAllText(sfd.SelectedPath + @"\" + mf.name + ".txt", metaData); + File.WriteAllText(sfd.SelectedPath + @"\" + Path.GetFileNameWithoutExtension(mf.filepath) + ".properties", metaData); } } } @@ -1059,17 +1058,10 @@ namespace PckStudio } } - 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; - } + if (e.KeyData == Keys.Delete) + deleteEntryToolStripMenuItem_Click(sender, e); } #region imports a folder of skins to pck @@ -1124,11 +1116,11 @@ namespace PckStudio //Sets minefile directory based on pcks structure/type if (mashupStructure == true) { - mfNew.name = "Skins/" + Import.Text + ".png"; + mfNew.filepath = "Skins/" + Import.Text + ".png"; } else { - mfNew.name = Import.Text + ".png"; + mfNew.filepath = Import.Text + ".png"; } skin.Text = Import.Text + ".png";//adds file extension to minefile @@ -1275,9 +1267,7 @@ namespace PckStudio else if (currentPCK.HasFile("languages.loc", 6)) locdata = currentPCK.GetFile("languages.loc", 6); else - { return false; - } try { @@ -1300,51 +1290,52 @@ namespace PckStudio { using (OpenFileDialog contents = new OpenFileDialog()) { - contents.Title = "Select Extracted Skin Data File"; - contents.Filter = "Text Files (*.txt)|*.txt"; + contents.Title = "Select Extracted Skin File"; + contents.Filter = "Skin File (*.png)|*.png"; 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); + string skinNameImport = Path.GetFileName(contents.FileName); + byte[] data = File.ReadAllBytes(contents.FileName); 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")) || + string propertyFile = Path.GetFileNameWithoutExtension(contents.FileName) + ".properties"; + if (File.Exists(propertyFile)) + { + string[] txtProperties = File.ReadAllLines(propertyFile); + 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) + TryGetLocFile(out LOCFile locFile)) { - 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)); + // 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); } - saved = false; - } - catch (Exception ex) - { - MessageBox.Show(ex.Message); } } } @@ -1369,9 +1360,19 @@ namespace PckStudio } } - private void installationToolStripMenuItem_Click(object sender, EventArgs e) + private void addPasswordToolStripMenuItem_Click(object sender, EventArgs e) { - //System.Diagnostics.Process.Start(hosturl + "pckStudio#install"); + if (!currentPCK.HasFile("0", 4)) throw new Exception("0 file not found"); + PCKFile.FileData file = currentPCK.GetFile("0", 4); + if (checkForPassword()) + { + AddPCKPassword add = new AddPCKPassword(); + if (add.ShowDialog() == DialogResult.OK) + file.properties.Add(("LOCK", add.Password)); + add.Dispose(); + ReloadMetaTreeView(); + saved = false; + } } private void binkaConversionToolStripMenuItem_Click(object sender, EventArgs e) @@ -2713,21 +2714,6 @@ namespace PckStudio 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"); @@ -2763,7 +2749,7 @@ namespace PckStudio } //Check for Animated Texture - if (file.name.StartsWith("res/textures/blocks/") || file.name.StartsWith("res/textures/items/")) + if (file.filepath.StartsWith("res/textures/blocks/") || file.filepath.StartsWith("res/textures/items/")) { try { @@ -2779,7 +2765,7 @@ namespace PckStudio } } - if (Path.GetFileName(file.name) == "audio.pck") + if (Path.GetFileName(file.filepath) == "audio.pck") { try { @@ -2797,7 +2783,7 @@ namespace PckStudio } } - if (file.type == 6 && (file.name == "languages.loc" || file.name == "localisation.loc")) + if (file.type == 6 && (file.filepath == "languages.loc" || file.filepath == "localisation.loc")) { LOCFile locFile = null; using (var stream = new MemoryStream(file.data)) @@ -2814,7 +2800,7 @@ namespace PckStudio } // Checks to see if selected minefile is a col file - if (file.type == 9 && file.name == "colours.col") // .col file + if (file.type == 9 && file.filepath == "colours.col") // .col file { COLFile colFile = new COLFile(); using (var stream = new MemoryStream(file.data)) @@ -2827,7 +2813,6 @@ namespace PckStudio } } - private void OpenPck_MouseEnter(object sender, EventArgs e) { pckOpen.Image = Resources.pckOpen; @@ -2880,7 +2865,7 @@ namespace PckStudio if (FileList.Length > 1) MessageBox.Show("Only one pck file at a time is currently supported"); currentPCK = openPck(FileList[0]); - if (checkForPassword()) + if (addPasswordToolStripMenuItem.Enabled = checkForPassword()) { LoadEditorTab(); } @@ -2893,7 +2878,8 @@ namespace PckStudio private void savePCK(object sender, EventArgs e) { - checkSaveState(); + if (!string.IsNullOrEmpty(saveLocation)) + Save(saveLocation); } private void saveAsPCK(object sender, EventArgs e) @@ -2911,7 +2897,7 @@ namespace PckStudio TreeNode node = treeViewMain.SelectedNode; if (node == null || node.Tag == null || !(node.Tag is PCKFile.FileData)) return; var file = node.Tag as PCKFile.FileData; - Console.WriteLine("Setting {file.type} to {type}"); + Console.WriteLine($"Setting {file.type} to {type}"); file.type = type; } } diff --git a/MinecraftUSkinEditor/Properties/Resources.Designer.cs b/MinecraftUSkinEditor/Properties/Resources.Designer.cs index 93625721..0f1f0bbd 100644 --- a/MinecraftUSkinEditor/Properties/Resources.Designer.cs +++ b/MinecraftUSkinEditor/Properties/Resources.Designer.cs @@ -381,12 +381,26 @@ namespace PckStudio.Properties { } /// - /// Looks up a localized resource of type System.Byte[]. + /// Looks up a localized string similar to { + /// "COMMENT_1": "Tile data research by MattNL", + /// "COMMENT_2": "JSON conversion by PhoenixARC", + /// "Blocks": [ + /// { "grass_top": "Grass Block (Top)" }, + /// { "stone": "Stone" }, + /// { "dirt": "Dirt" }, + /// { "grass_side": "Grass Block (Side)" }, + /// { "planks_oak": "Oak Planks" }, + /// { "stoneslab_side": "Stone Slab (Side)" }, + /// { "stoneslab_top": "Stone Slab (Top)" }, + /// { "brick": "Bricks" }, + /// { "tnt_side": "TNT (Side)" }, + /// { "tnt_top": "TNT (Top)" }, + /// { "tnt_bottom": "TNT (Bottom)" }, + /// { "web": "Cobw [rest of string was truncated]";. /// - public static byte[] tileData { + public static string tileData { get { - object obj = ResourceManager.GetObject("tileData", resourceCulture); - return ((byte[])(obj)); + return ResourceManager.GetString("tileData", resourceCulture); } } diff --git a/MinecraftUSkinEditor/Properties/Resources.resx b/MinecraftUSkinEditor/Properties/Resources.resx index d78f60a6..41487a40 100644 --- a/MinecraftUSkinEditor/Properties/Resources.resx +++ b/MinecraftUSkinEditor/Properties/Resources.resx @@ -140,7 +140,7 @@ ..\Resources\iconImageList\IMAGE ICON.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - ..\Resources\tileData.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + ..\Resources\tileData.json;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 ..\Resources\ExportFile.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a