diff --git a/CHANGELOG.md b/CHANGELOG.md index 75d48d82..a8c02f52 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -176,6 +176,10 @@ Some features may be completely missing or incomplete at this point in time! -Fixed Model Generator crashing when minimized -Fixed more bugs +2.9c +==== +-Fixed some minor bugs + 2.8b ==== -Fixed a few bugs from 2.8 @@ -204,6 +208,10 @@ Some features may be completely missing or incomplete at this point in time! -Model Generator -Few UI Improvements +2.3(non-feature) +=== +-Rebranded Minekampf as PCK Studio + 2.3 === -Fully Fixed Cape Adding diff --git a/PCK-Studio/Classes/FileTypes/Bink.cs b/PCK-Studio/Classes/FileTypes/Bink.cs index 73861182..db79fafa 100644 --- a/PCK-Studio/Classes/FileTypes/Bink.cs +++ b/PCK-Studio/Classes/FileTypes/Bink.cs @@ -14,86 +14,80 @@ namespace PckStudio.Classes [DllImport("kernel32.dll")] public static extern IntPtr FreeLibrary(IntPtr library); - public unsafe static string Binka(string infile, string outDir = null, bool last = true, string working = null) + public int temp_error_code; + string binka_enc_loc; + string mss32_loc; + string binkawin_loc; + public string working = null; + + public async void WavToBinka(string infile, string outFile, int compression) { - bool flag = working == null; - string text; - string text2; - string path; - if (flag) + var process = Process.Start(new ProcessStartInfo { - working = Path.GetTempPath() + DateTime.Now.Second.ToString(); - text = PckStudio.Classes.Bink.ExtractResource("Resources.binka_encode.exe", working, "binka_encode.exe"); - text2 = PckStudio.Classes.Bink.ExtractResource("Resources.mss32.dll", working, "mss32.dll"); - path = PckStudio.Classes.Bink.ExtractResource("Resources.binkawin.asi", working, "binkawin.asi"); - PckStudio.Classes.Bink.library = PckStudio.Classes.Bink.LoadLibrary(text2); + FileName = binka_enc_loc, + Arguments = $"\"{infile}\" \"{outFile}\" -s -b{compression}", + UseShellExecute = true, + CreateNoWindow = true, + WindowStyle = ProcessWindowStyle.Hidden + }); + process.WaitForExit(); + temp_error_code = process.ExitCode; + } + + public unsafe void BinkaToWav(string infile, string outFile) + { + string[] array2 = createArg(infile, outFile); + byte[] array3 = File.ReadAllBytes(array2[0]); + Console.WriteLine(array3.Length); + uint num = 0U; + AIL_set_redist_directory("."); + AIL_startup(); + IntPtr intPtr; + // crash happens in AIL_decompress_ASI + if (AIL_decompress_ASI(array3, (uint)array3.Length, ".binka", &intPtr, &num, 0U) == 0) + throw new Exception("AIL ERROR"); + byte[] array4 = new byte[num]; + Marshal.Copy(intPtr, array4, 0, array4.Length); + AIL_mem_free_lock(intPtr); + AIL_shutdown(); + File.WriteAllBytes(array2[1], array4); + } + + public void SetUpBinka() + { + if (working == null) + { + working = (Path.GetTempPath() + "PCKStudio").Replace("\\","/"); + Directory.CreateDirectory(working); + binka_enc_loc = ExtractResource("binka_encode.exe", working); + mss32_loc = ExtractResource("mss32.dll", working); + binkawin_loc = ExtractResource("binkawin.asi", working); + library = LoadLibrary(mss32_loc); } else { - text = working + "\\binka_encode.exe"; - text2 = working + "\\mss32.dll"; - path = working + "\\binkawin.asi"; + binka_enc_loc = working + "\\binka_encode.exe"; + mss32_loc = working + "\\mss32.dll"; + binkawin_loc = working + "\\binkawin.asi"; } - bool flag2 = PckStudio.Classes.Bink.getType(infile) == "WAV"; - if (flag2) + } + + public void CleanUpBinka() + { + File.Delete(binka_enc_loc); + File.Delete(binkawin_loc); + while (File.Exists(mss32_loc)) { - string[] array = PckStudio.Classes.Bink.createArg(infile, outDir); - Process process = new Process(); - process.StartInfo.FileName = text; - process.StartInfo.Arguments = string.Concat(new string[] + try { - " \"", - array[0], - "\" \"", - array[1], - "\"" - }); - process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; - process.Start(); - process.WaitForExit(); - } - else - { - bool flag3 = PckStudio.Classes.Bink.getType(infile) == "BINKA"; - if (flag3) + File.Delete(mss32_loc); + } + catch { - string[] array2 = PckStudio.Classes.Bink.createArg(infile, outDir); - byte[] array3 = File.ReadAllBytes(array2[0]); - uint num = 0U; - PckStudio.Classes.Bink.AIL_set_redist_directory("."); - PckStudio.Classes.Bink.AIL_startup(); - IntPtr intPtr; - bool flag4 = PckStudio.Classes.Bink.AIL_decompress_ASI(array3, (uint)array3.Length, ".binka", &intPtr, &num, 0U) == 0; - if (flag4) - { - throw new Exception("AIL ERROR"); - } - byte[] array4 = new byte[num]; - Marshal.Copy(intPtr, array4, 0, array4.Length); - PckStudio.Classes.Bink.AIL_mem_free_lock(intPtr); - PckStudio.Classes.Bink.AIL_shutdown(); - File.WriteAllBytes(array2[1], array4); + FreeLibrary(library); } } - if (last) - { - PckStudio.Classes.Bink.FreeLibrary(PckStudio.Classes.Bink.library); - PckStudio.Classes.Bink.FreeLibrary(PckStudio.Classes.Bink.library); - File.Delete(text); - File.Delete(path); - while (File.Exists(text2)) - { - try - { - File.Delete(text2); - } - catch - { - PckStudio.Classes.Bink.FreeLibrary(PckStudio.Classes.Bink.library); - } - } - } - return working; + Directory.Delete(working); } private static string getType(string loc) @@ -110,7 +104,7 @@ namespace PckStudio.Classes bool flag2 = !(a == ".wav"); if (flag2) { - throw new Exception("File type not valid. To use MP3 or other audio formats, convert to wav format before using tool"); + throw new Exception("File type not valid. To use MP3 or other audio formats, convert to wav format before using this tool"); } result = "WAV"; } @@ -122,7 +116,7 @@ namespace PckStudio.Classes string[] array = new string[2]; array[0] = inFile; string[] array2 = array; - string type = PckStudio.Classes.Bink.getType(inFile); + string type = getType(inFile); bool flag = type == "BINKA"; if (flag) { @@ -144,20 +138,18 @@ namespace PckStudio.Classes return array2; } - internal static string ExtractResource(string resource, string path, string filename) + internal static string ExtractResource(string resource, string working) { - Stream manifestResourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resource); - byte[] array = new byte[(int)manifestResourceStream.Length]; - manifestResourceStream.Read(array, 0, array.Length); - manifestResourceStream.Close(); - bool flag = !Directory.Exists(path); - if (flag) + object ob = Properties.Resources.ResourceManager.GetObject(Path.GetFileNameWithoutExtension(resource)); + byte[] myResBytes = (byte[])ob; + if(File.Exists(Path.Combine(working, resource))) File.Delete(Path.Combine(working, resource)); + using (FileStream fsDst = new FileStream(Path.Combine(working, resource), FileMode.CreateNew, FileAccess.Write)) { - Directory.CreateDirectory(path); + fsDst.Write(myResBytes, 0, myResBytes.Length); + fsDst.Close(); + fsDst.Dispose(); } - path = path + "\\" + filename; - File.WriteAllBytes(path, array); - return path; + return "\"" + working + "/" + resource + "\""; } [DllImport("mss32.dll", EntryPoint = "_AIL_decompress_ASI@24")] diff --git a/PCK-Studio/Classes/FileTypes/CSMBFile.cs b/PCK-Studio/Classes/FileTypes/CSMBFile.cs new file mode 100644 index 00000000..e4db7b92 --- /dev/null +++ b/PCK-Studio/Classes/FileTypes/CSMBFile.cs @@ -0,0 +1,104 @@ +using System; +using System.Drawing; +using System.IO; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using PckStudio.Models; + +namespace PckStudio.Classes.FileTypes +{ + #region File Template + /* + Version - 4 bytes[int32] + NumberOfParts - 4 bytes[int32] + { + Part name length - 2 bytes[int16] + part name - x bytes + part parent - 4 bytes[int32] (HEAD=1, BODY=2, LEG0=3, LEG1=4, ARM0=5, ARM1=6) + Position-X - 4 bytes[float] + Position-Y - 4 bytes[float] + Position-Z - 4 bytes[float] + Size-X - 4 bytes[float] + Size-Y - 4 bytes[float] + Size-Z - 4 bytes[float] + UV-Y - 4 bytes[int32] + UV-X - 4 bytes[int32] + mirror texture - 1 byte[bool] + Hide with armour - 1 byte[bool] + inflation/scale value - 4 bytes[float] + } + NumberOfOffsets - 4 bytes[int32] + { + offset part - 4 bytes[int32] + vertical offset - 4 bytes[float] + } + */ + #endregion + class CSMBFile + { + public List Parts = new List(); + public List Offsets = new List(); + + } + + public class CSMBPart + { + public string Name = "Partname"; + public ParentPart Parent = 0; + public float posX, posY, posZ = 0.0f; + public float sizeX, sizeY, sizeZ = 0.0f; + public int uvX, uvY = 0; + public bool HideWArmour, MirrorTexture = false; + public float Inflation = 0.0f; + } + public class CSMBOffset + { + public OffsetPart offsetPart = 0; + public float VerticalOffset = 0.0f; + } + + public enum OffsetPart + { + HEAD = 0, + BODY = 1, + ARM0 = 2, + ARM1 = 3, + LEG0 = 4, + LEG1 = 5, + HEADWEAR = 6, + JACKET = 7, + SLEEVE0 = 8, + SLEEVE1 = 9, + PANTS0 = 10, + PANTS1 = 11, + WAIST = 12, + LEGGING0 = 13, + LEGGING1 = 14, + SOCK0 = 15, + SOCK1 = 16, + BOOT0 = 17, + BOOT1 = 18, + ARMARMOR1 = 19, + ARMARMOR0 = 20, + BODYARMOR = 21, + BELT = 22, + TOOL0 = 23, + TOOL1 = 24, + HELMET = 25, + SHOULDER0 = 26, + SHOULDER1 = 27, + CHEST = 28 + } + + public enum ParentPart + { + HEAD = 0, + BODY = 1, + ARM0 = 2, + ARM1 = 3, + LEG0 = 4, + LEG1 = 5, + } +} diff --git a/PCK-Studio/Classes/IO/CSMB/CSMBFileReader.cs b/PCK-Studio/Classes/IO/CSMB/CSMBFileReader.cs new file mode 100644 index 00000000..fc5a3758 --- /dev/null +++ b/PCK-Studio/Classes/IO/CSMB/CSMBFileReader.cs @@ -0,0 +1,56 @@ +using System.IO; +using System.Text; +using PckStudio.Classes.FileTypes; + +namespace PckStudio.Classes.IO.CSMB +{ + internal class CSMBFileReader : StreamDataReader + { + public CSMBFile Read(Stream stream) + { + return new CSMBFileReader().ReadFromStream(stream); + } + private CSMBFileReader() : base(false) + { } + + private CSMBFile ReadFromStream(Stream stream) + { + CSMBFile BinFile = new CSMBFile(); + ReadInt(stream); + int NumOfParts = ReadInt(stream); + for(int i = 0; i < NumOfParts; i++) + { + CSMBPart part = new CSMBPart(); + part.Name = ReadString(stream); + part.Parent = (ParentPart)ReadInt(stream); + part.posX = ReadFloat(stream); + part.posY = ReadFloat(stream); + part.posZ = ReadFloat(stream); + part.sizeX = ReadFloat(stream); + part.sizeY = ReadFloat(stream); + part.sizeZ = ReadFloat(stream); + part.uvX = ReadInt(stream); + part.uvY = ReadInt(stream); + part.MirrorTexture = ReadBool(stream); + part.HideWArmour = ReadBool(stream); + part.Inflation = ReadFloat(stream); + BinFile.Parts.Add(part); + } + int NumOfOffsets = ReadInt(stream); + for (int i = 0; i < NumOfOffsets; i++) + { + CSMBOffset offset = new CSMBOffset(); + offset.offsetPart = (OffsetPart)ReadInt(stream); + offset.VerticalOffset = ReadFloat(stream); + BinFile.Offsets.Add(offset); + } + return BinFile; + } + + private string ReadString(Stream stream) + { + short strlen = ReadShort(stream); + return ReadString(stream, strlen, Encoding.ASCII); + } + } +} diff --git a/PCK-Studio/Classes/IO/CSMB/CSMBFileWriter.cs b/PCK-Studio/Classes/IO/CSMB/CSMBFileWriter.cs new file mode 100644 index 00000000..2614c1d4 --- /dev/null +++ b/PCK-Studio/Classes/IO/CSMB/CSMBFileWriter.cs @@ -0,0 +1,50 @@ +using System.IO; +using System.Text; +using PckStudio.Classes.FileTypes; + +namespace PckStudio.Classes.IO.CSMB +{ + internal class CSMBFileWriter : StreamDataWriter + { + public static void Write(Stream stream, CSMBFile file) + { + new CSMBFileWriter().WriteToStream(stream, file); + } + private CSMBFileWriter() : base(false) + { } + + private void WriteToStream(Stream stream, CSMBFile CSMB) + { + WriteInt(stream, 0); + WriteInt(stream, CSMB.Parts.Count); + foreach(CSMBPart part in CSMB.Parts) + { + WriteString(stream, part.Name); + WriteInt(stream, (int)part.Parent); + WriteFloat(stream, part.posX); + WriteFloat(stream, part.posY); + WriteFloat(stream, part.posZ); + WriteFloat(stream, part.sizeX); + WriteFloat(stream, part.sizeY); + WriteFloat(stream, part.sizeZ); + WriteInt(stream, part.uvX); + WriteInt(stream, part.uvY); + WriteBool(stream, part.MirrorTexture); + WriteBool(stream, part.HideWArmour); + WriteFloat(stream, part.Inflation); + } + WriteInt(stream, CSMB.Offsets.Count); + foreach (CSMBOffset offset in CSMB.Offsets) + { + WriteInt(stream, (int)offset.offsetPart); + WriteFloat(stream, offset.VerticalOffset); + } + } + + private void WriteString(Stream stream, string s) + { + WriteShort(stream, (short)s.Length); + WriteString(stream, s, Encoding.ASCII); + } + } +} diff --git a/PCK-Studio/Forms/Additional-Popups/Animation/FrameEditor.Designer.cs b/PCK-Studio/Forms/Additional-Popups/Animation/FrameEditor.Designer.cs index 664d19b9..3c8a510f 100644 --- a/PCK-Studio/Forms/Additional-Popups/Animation/FrameEditor.Designer.cs +++ b/PCK-Studio/Forms/Additional-Popups/Animation/FrameEditor.Designer.cs @@ -29,147 +29,148 @@ namespace PckStudio.Forms.Additional_Popups.Animation /// private void InitializeComponent() { - this.SaveBtn = new System.Windows.Forms.Button(); - this.label2 = new System.Windows.Forms.Label(); - this.label1 = new System.Windows.Forms.Label(); - this.label3 = new System.Windows.Forms.Label(); - this.CancelBtn = new System.Windows.Forms.Button(); - this.FrameIndexUpDown = new System.Windows.Forms.NumericUpDown(); - this.FrameTimeUpDown = new System.Windows.Forms.NumericUpDown(); - ((System.ComponentModel.ISupportInitialize)(this.FrameIndexUpDown)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.FrameTimeUpDown)).BeginInit(); - this.SuspendLayout(); - // - // SaveBtn - // - this.SaveBtn.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.SaveBtn.ForeColor = System.Drawing.Color.White; - this.SaveBtn.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.SaveBtn.Location = new System.Drawing.Point(55, 111); - this.SaveBtn.Name = "SaveBtn"; - this.SaveBtn.Size = new System.Drawing.Size(75, 23); - this.SaveBtn.TabIndex = 7; - this.SaveBtn.Text = "Save"; - this.SaveBtn.UseVisualStyleBackColor = true; - this.SaveBtn.Click += new System.EventHandler(this.SaveBtn_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(65, 13); - this.label2.TabIndex = 6; - this.label2.Text = "Frame Index"; - // - // 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"; - // - // 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"; - // - // CancelBtn - // - 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, 111); - 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.CancelBtn_Click); - // - // FrameIndexUpDown - // - this.FrameIndexUpDown.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(17)))), ((int)(((byte)(17))))); - this.FrameIndexUpDown.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.FrameIndexUpDown.ForeColor = System.Drawing.SystemColors.Window; - this.FrameIndexUpDown.Location = new System.Drawing.Point(77, 54); - this.FrameIndexUpDown.Maximum = new decimal(new int[] { - 1, - 0, - 0, - 0}); - this.FrameIndexUpDown.Name = "FrameIndexUpDown"; - this.FrameIndexUpDown.Size = new System.Drawing.Size(179, 20); - this.FrameIndexUpDown.TabIndex = 14; - this.FrameIndexUpDown.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; - // - // FrameTimeUpDown - // - this.FrameTimeUpDown.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(17)))), ((int)(((byte)(17))))); - this.FrameTimeUpDown.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.FrameTimeUpDown.ForeColor = System.Drawing.SystemColors.Window; - this.FrameTimeUpDown.Location = new System.Drawing.Point(77, 81); - this.FrameTimeUpDown.Maximum = new decimal(new int[] { + this.components = new System.ComponentModel.Container(); + this.SaveBtn = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.CancelBtn = new System.Windows.Forms.Button(); + this.FrameTimeUpDown = new System.Windows.Forms.NumericUpDown(); + this.FrameList = new System.Windows.Forms.TreeView(); + this.TextureIcons = new System.Windows.Forms.ImageList(this.components); + ((System.ComponentModel.ISupportInitialize)(this.FrameTimeUpDown)).BeginInit(); + this.SuspendLayout(); + // + // SaveBtn + // + this.SaveBtn.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.SaveBtn.ForeColor = System.Drawing.Color.White; + this.SaveBtn.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.SaveBtn.Location = new System.Drawing.Point(12, 228); + this.SaveBtn.Name = "SaveBtn"; + this.SaveBtn.Size = new System.Drawing.Size(75, 23); + this.SaveBtn.TabIndex = 7; + this.SaveBtn.Text = "Save"; + this.SaveBtn.UseVisualStyleBackColor = true; + this.SaveBtn.Click += new System.EventHandler(this.SaveBtn_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(19, 204); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(62, 13); + this.label1.TabIndex = 10; + this.label1.Text = "Frame Time"; + // + // 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(14, 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"; + // + // CancelBtn + // + 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(92, 228); + 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.CancelBtn_Click); + // + // FrameTimeUpDown + // + this.FrameTimeUpDown.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(17)))), ((int)(((byte)(17))))); + this.FrameTimeUpDown.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.FrameTimeUpDown.ForeColor = System.Drawing.SystemColors.Window; + this.FrameTimeUpDown.Location = new System.Drawing.Point(87, 202); + this.FrameTimeUpDown.Maximum = new decimal(new int[] { 10000, 0, 0, 0}); - this.FrameTimeUpDown.Name = "FrameTimeUpDown"; - this.FrameTimeUpDown.Size = new System.Drawing.Size(179, 20); - this.FrameTimeUpDown.TabIndex = 15; - this.FrameTimeUpDown.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; - // - // FrameEditor - // - this.AcceptButton = this.SaveBtn; - 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, 140); - this.ControlBox = false; - this.Controls.Add(this.FrameTimeUpDown); - this.Controls.Add(this.FrameIndexUpDown); - this.Controls.Add(this.CancelBtn); - this.Controls.Add(this.label3); - this.Controls.Add(this.label1); - this.Controls.Add(this.SaveBtn); - this.Controls.Add(this.label2); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.MinimumSize = new System.Drawing.Size(266, 142); - this.Name = "FrameEditor"; - this.Resizable = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Style = MetroFramework.MetroColorStyle.Silver; - this.Theme = MetroFramework.MetroThemeStyle.Dark; - ((System.ComponentModel.ISupportInitialize)(this.FrameIndexUpDown)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.FrameTimeUpDown)).EndInit(); - this.ResumeLayout(false); - this.PerformLayout(); + this.FrameTimeUpDown.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.FrameTimeUpDown.Name = "FrameTimeUpDown"; + this.FrameTimeUpDown.Size = new System.Drawing.Size(73, 20); + this.FrameTimeUpDown.TabIndex = 15; + this.FrameTimeUpDown.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + this.FrameTimeUpDown.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + // + // FrameList + // + this.FrameList.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.FrameList.ForeColor = System.Drawing.SystemColors.Window; + this.FrameList.HideSelection = false; + this.FrameList.ImageIndex = 0; + this.FrameList.ImageList = this.TextureIcons; + this.FrameList.Location = new System.Drawing.Point(12, 37); + this.FrameList.Name = "FrameList"; + this.FrameList.SelectedImageIndex = 0; + this.FrameList.ShowLines = false; + this.FrameList.ShowRootLines = false; + this.FrameList.Size = new System.Drawing.Size(155, 159); + this.FrameList.TabIndex = 1; + // + // TextureIcons + // + this.TextureIcons.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit; + this.TextureIcons.ImageSize = new System.Drawing.Size(32, 32); + this.TextureIcons.TransparentColor = System.Drawing.Color.Transparent; + // + // FrameEditor + // + this.AcceptButton = this.SaveBtn; + 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(178, 264); + this.ControlBox = false; + this.Controls.Add(this.FrameList); + this.Controls.Add(this.FrameTimeUpDown); + this.Controls.Add(this.CancelBtn); + this.Controls.Add(this.label3); + this.Controls.Add(this.label1); + this.Controls.Add(this.SaveBtn); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "FrameEditor"; + this.Resizable = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Style = MetroFramework.MetroColorStyle.Silver; + this.Theme = MetroFramework.MetroThemeStyle.Dark; + ((System.ComponentModel.ISupportInitialize)(this.FrameTimeUpDown)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); } #endregion - private System.Windows.Forms.Button SaveBtn; - private System.Windows.Forms.Label label2; private System.Windows.Forms.Label label1; private System.Windows.Forms.Label label3; private System.Windows.Forms.Button CancelBtn; - private System.Windows.Forms.NumericUpDown FrameIndexUpDown; private System.Windows.Forms.NumericUpDown FrameTimeUpDown; - } + private System.Windows.Forms.TreeView FrameList; + public System.Windows.Forms.ImageList TextureIcons; + public System.Windows.Forms.Button SaveBtn; + } } \ No newline at end of file diff --git a/PCK-Studio/Forms/Additional-Popups/Animation/FrameEditor.cs b/PCK-Studio/Forms/Additional-Popups/Animation/FrameEditor.cs index c820c4c3..b994bad1 100644 --- a/PCK-Studio/Forms/Additional-Popups/Animation/FrameEditor.cs +++ b/PCK-Studio/Forms/Additional-Popups/Animation/FrameEditor.cs @@ -15,20 +15,30 @@ namespace PckStudio.Forms.Additional_Popups.Animation { public partial class FrameEditor : MetroForm { - public int FrameTextureIndex => (int)FrameIndexUpDown.Value; + public int FrameTextureIndex => FrameList.SelectedNode.Index; public int FrameTime => (int)FrameTimeUpDown.Value; - public FrameEditor(int indexLimit) + public FrameEditor(ImageList texList) { InitializeComponent(); - label3.Text = "Frame must be within 0 and " + indexLimit + "."; - FrameIndexUpDown.Maximum = indexLimit; - FrameTimeUpDown.Minimum = 1; + label3.Text = "Select a frame and frame time:"; + FrameList.ImageList = texList; + + int index = 0; + foreach (Image frameTex in texList.Images) + { + TreeNode frame = new TreeNode($"Frame {index}", index, index); + FrameList.Nodes.Add(frame); + Console.WriteLine(index); + index++; + } } - public FrameEditor(int frameTime, int frameTextureIndex, int indexLimit) : this(indexLimit) + + public FrameEditor(int frameTime, int frameTextureIndex, ImageList texList) : this(texList) { - FrameIndexUpDown.Value = frameTextureIndex; - FrameTimeUpDown.Value = frameTime; + FrameList.SelectedNode = FrameList.Nodes[frameTextureIndex]; + FrameList.SelectedNode.EnsureVisible(); + FrameTimeUpDown.Value = frameTime; } private void SaveBtn_Click(object sender, EventArgs e) diff --git a/PCK-Studio/Forms/Additional-Popups/Animation/FrameEditor.resx b/PCK-Studio/Forms/Additional-Popups/Animation/FrameEditor.resx index 1af7de15..4d46b116 100644 --- a/PCK-Studio/Forms/Additional-Popups/Animation/FrameEditor.resx +++ b/PCK-Studio/Forms/Additional-Popups/Animation/FrameEditor.resx @@ -117,4 +117,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 17, 17 + \ No newline at end of file diff --git a/PCK-Studio/Forms/Editor/AnimationEditor.Designer.cs b/PCK-Studio/Forms/Editor/AnimationEditor.Designer.cs index ddfb948a..4cb3f54f 100644 --- a/PCK-Studio/Forms/Editor/AnimationEditor.Designer.cs +++ b/PCK-Studio/Forms/Editor/AnimationEditor.Designer.cs @@ -34,6 +34,7 @@ this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); this.addFrameToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.removeFrameToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.TextureIcons = new System.Windows.Forms.ImageList(this.components); this.menuStrip = new System.Windows.Forms.MenuStrip(); this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.saveToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); @@ -51,9 +52,11 @@ this.AnimationPlayBtn = new MetroFramework.Controls.MetroButton(); this.AnimationStopBtn = new MetroFramework.Controls.MetroButton(); this.tileLabel = new MetroFramework.Controls.MetroLabel(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); this.pictureBoxWithInterpolationMode1 = new PckStudio.PictureBoxWithInterpolationMode(); this.contextMenuStrip1.SuspendLayout(); this.menuStrip.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBoxWithInterpolationMode1)).BeginInit(); this.SuspendLayout(); // @@ -65,10 +68,15 @@ this.frameTreeView.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); this.frameTreeView.ContextMenuStrip = this.contextMenuStrip1; this.frameTreeView.ForeColor = System.Drawing.Color.White; + this.frameTreeView.ImageIndex = 0; + this.frameTreeView.ImageList = this.TextureIcons; this.frameTreeView.Location = new System.Drawing.Point(20, 88); this.frameTreeView.Margin = new System.Windows.Forms.Padding(0); this.frameTreeView.Name = "frameTreeView"; - this.frameTreeView.Size = new System.Drawing.Size(165, 223); + this.frameTreeView.SelectedImageIndex = 0; + this.frameTreeView.ShowLines = false; + this.frameTreeView.ShowRootLines = false; + this.frameTreeView.Size = new System.Drawing.Size(134, 253); this.frameTreeView.TabIndex = 15; this.frameTreeView.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.frameTreeView_ItemDrag); this.frameTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.frameTreeView_AfterSelect); @@ -87,7 +95,6 @@ // // addFrameToolStripMenuItem // - this.addFrameToolStripMenuItem.Image = global::PckStudio.Properties.Resources.ExportFile; this.addFrameToolStripMenuItem.Name = "addFrameToolStripMenuItem"; this.addFrameToolStripMenuItem.Size = new System.Drawing.Size(153, 22); this.addFrameToolStripMenuItem.Text = "Add Frame"; @@ -95,12 +102,17 @@ // // removeFrameToolStripMenuItem // - this.removeFrameToolStripMenuItem.Image = global::PckStudio.Properties.Resources.Del; this.removeFrameToolStripMenuItem.Name = "removeFrameToolStripMenuItem"; this.removeFrameToolStripMenuItem.Size = new System.Drawing.Size(153, 22); this.removeFrameToolStripMenuItem.Text = "Remove Frame"; this.removeFrameToolStripMenuItem.Click += new System.EventHandler(this.removeFrameToolStripMenuItem_Click); // + // TextureIcons + // + this.TextureIcons.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit; + this.TextureIcons.ImageSize = new System.Drawing.Size(32, 32); + this.TextureIcons.TransparentColor = System.Drawing.Color.Transparent; + // // menuStrip // this.menuStrip.AutoSize = false; @@ -146,7 +158,6 @@ // // bulkAnimationSpeedToolStripMenuItem // - this.bulkAnimationSpeedToolStripMenuItem.Image = global::PckStudio.Properties.Resources.clock; this.bulkAnimationSpeedToolStripMenuItem.Name = "bulkAnimationSpeedToolStripMenuItem"; this.bulkAnimationSpeedToolStripMenuItem.Size = new System.Drawing.Size(210, 22); this.bulkAnimationSpeedToolStripMenuItem.Text = "Set Bulk Animation Speed"; @@ -154,7 +165,6 @@ // // importJavaAnimationToolStripMenuItem // - this.importJavaAnimationToolStripMenuItem.Image = global::PckStudio.Properties.Resources.Replace; this.importJavaAnimationToolStripMenuItem.Name = "importJavaAnimationToolStripMenuItem"; this.importJavaAnimationToolStripMenuItem.Size = new System.Drawing.Size(210, 22); this.importJavaAnimationToolStripMenuItem.Text = "Import Java Animation"; @@ -162,7 +172,6 @@ // // exportJavaAnimationToolStripMenuItem // - this.exportJavaAnimationToolStripMenuItem.Image = global::PckStudio.Properties.Resources.ExportFile; this.exportJavaAnimationToolStripMenuItem.Name = "exportJavaAnimationToolStripMenuItem"; this.exportJavaAnimationToolStripMenuItem.Size = new System.Drawing.Size(210, 22); this.exportJavaAnimationToolStripMenuItem.Text = "Export Java Animation"; @@ -170,7 +179,6 @@ // // changeTileToolStripMenuItem // - this.changeTileToolStripMenuItem.Image = global::PckStudio.Properties.Resources.changeTile; this.changeTileToolStripMenuItem.Name = "changeTileToolStripMenuItem"; this.changeTileToolStripMenuItem.Size = new System.Drawing.Size(210, 22); this.changeTileToolStripMenuItem.Text = "Change Tile"; @@ -220,11 +228,11 @@ // this.InterpolationCheckbox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.InterpolationCheckbox.AutoSize = true; - this.InterpolationCheckbox.Location = new System.Drawing.Point(188, 338); + this.InterpolationCheckbox.Location = new System.Drawing.Point(161, 63); this.InterpolationCheckbox.Name = "InterpolationCheckbox"; - this.InterpolationCheckbox.Size = new System.Drawing.Size(204, 15); + this.InterpolationCheckbox.Size = new System.Drawing.Size(231, 15); this.InterpolationCheckbox.TabIndex = 17; - this.InterpolationCheckbox.Text = "Interpolates (not simulated above)"; + this.InterpolationCheckbox.Text = "Enable Interpolation (not shown below)"; this.InterpolationCheckbox.Theme = MetroFramework.MetroThemeStyle.Dark; this.InterpolationCheckbox.UseSelectable = true; this.InterpolationCheckbox.CheckedChanged += new System.EventHandler(this.InterpolationCheckbox_CheckedChanged); @@ -232,9 +240,9 @@ // AnimationPlayBtn // this.AnimationPlayBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.AnimationPlayBtn.Location = new System.Drawing.Point(188, 312); + this.AnimationPlayBtn.Location = new System.Drawing.Point(157, 317); this.AnimationPlayBtn.Name = "AnimationPlayBtn"; - this.AnimationPlayBtn.Size = new System.Drawing.Size(99, 24); + this.AnimationPlayBtn.Size = new System.Drawing.Size(116, 24); this.AnimationPlayBtn.TabIndex = 18; this.AnimationPlayBtn.Text = "Play Animation"; this.AnimationPlayBtn.Theme = MetroFramework.MetroThemeStyle.Dark; @@ -245,9 +253,9 @@ // this.AnimationStopBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.AnimationStopBtn.Enabled = false; - this.AnimationStopBtn.Location = new System.Drawing.Point(293, 312); + this.AnimationStopBtn.Location = new System.Drawing.Point(276, 317); this.AnimationStopBtn.Name = "AnimationStopBtn"; - this.AnimationStopBtn.Size = new System.Drawing.Size(99, 24); + this.AnimationStopBtn.Size = new System.Drawing.Size(116, 24); this.AnimationStopBtn.TabIndex = 19; this.AnimationStopBtn.Text = "Stop Animation"; this.AnimationStopBtn.Theme = MetroFramework.MetroThemeStyle.Dark; @@ -258,7 +266,7 @@ // this.tileLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.tileLabel.AutoSize = true; - this.tileLabel.Location = new System.Drawing.Point(20, 311); + this.tileLabel.Location = new System.Drawing.Point(20, 341); this.tileLabel.MinimumSize = new System.Drawing.Size(170, 19); this.tileLabel.Name = "tileLabel"; this.tileLabel.Size = new System.Drawing.Size(57, 19); @@ -266,15 +274,23 @@ this.tileLabel.Text = "tileLabel"; this.tileLabel.Theme = MetroFramework.MetroThemeStyle.Dark; // + // pictureBox1 + // + this.pictureBox1.Location = new System.Drawing.Point(154, 60); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(244, 24); + this.pictureBox1.TabIndex = 21; + this.pictureBox1.TabStop = false; + // // pictureBoxWithInterpolationMode1 // this.pictureBoxWithInterpolationMode1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.pictureBoxWithInterpolationMode1.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; - this.pictureBoxWithInterpolationMode1.Location = new System.Drawing.Point(188, 88); + this.pictureBoxWithInterpolationMode1.Location = new System.Drawing.Point(157, 88); this.pictureBoxWithInterpolationMode1.Name = "pictureBoxWithInterpolationMode1"; - this.pictureBoxWithInterpolationMode1.Size = new System.Drawing.Size(204, 223); + this.pictureBoxWithInterpolationMode1.Size = new System.Drawing.Size(235, 223); this.pictureBoxWithInterpolationMode1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; this.pictureBoxWithInterpolationMode1.TabIndex = 16; this.pictureBoxWithInterpolationMode1.TabStop = false; @@ -284,10 +300,11 @@ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(412, 362); + this.Controls.Add(this.InterpolationCheckbox); + this.Controls.Add(this.pictureBox1); this.Controls.Add(this.AnimationStopBtn); this.Controls.Add(this.AnimationPlayBtn); this.Controls.Add(this.tileLabel); - this.Controls.Add(this.InterpolationCheckbox); this.Controls.Add(this.pictureBoxWithInterpolationMode1); this.Controls.Add(this.frameTreeView); this.Controls.Add(this.menuStrip); @@ -300,6 +317,7 @@ this.contextMenuStrip1.ResumeLayout(false); this.menuStrip.ResumeLayout(false); this.menuStrip.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBoxWithInterpolationMode1)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); @@ -330,5 +348,7 @@ private System.Windows.Forms.ToolStripMenuItem editorControlsToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem setBulkSpedToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem javaAnimationSupportToolStripMenuItem; + private System.Windows.Forms.ImageList TextureIcons; + private System.Windows.Forms.PictureBox pictureBox1; } } \ No newline at end of file diff --git a/PCK-Studio/Forms/Editor/AnimationEditor.cs b/PCK-Studio/Forms/Editor/AnimationEditor.cs index 3aba640b..095947d7 100644 --- a/PCK-Studio/Forms/Editor/AnimationEditor.cs +++ b/PCK-Studio/Forms/Editor/AnimationEditor.cs @@ -143,6 +143,11 @@ namespace PckStudio.Forms.Editor return frames; } + public List GetFrameTextures() + { + return frameTextures; + } + public int GetFrameIndex(Image frameTexture) { _ = frameTexture ?? throw new ArgumentNullException(nameof(frameTexture)); @@ -275,7 +280,9 @@ namespace PckStudio.Forms.Editor InterpolationCheckbox.Checked = currentAnimation.Interpolate; frameTreeView.Nodes.Clear(); // $"Frame: {i}, Frame Time: {Animation.MinimumFrameTime}" - currentAnimation.GetFrames().ForEach(f => frameTreeView.Nodes.Add($"Frame: {currentAnimation.GetFrameIndex(f.Texture)}, Frame Time: {f.Ticks}")); + TextureIcons.Images.Clear(); + TextureIcons.Images.AddRange(currentAnimation.GetFrameTextures().ToArray()); + currentAnimation.GetFrames().ForEach(f => frameTreeView.Nodes.Add("", $"for {f.Ticks} frame" + (f.Ticks > 1 ? "s" : "" ), currentAnimation.GetFrameIndex(f.Texture), currentAnimation.GetFrameIndex(f.Texture))); player.SelectFrame(currentAnimation, 0); } @@ -420,17 +427,22 @@ namespace PckStudio.Forms.Editor private void treeView1_doubleClick(object sender, EventArgs e) { var frame = currentAnimation.GetFrame(frameTreeView.SelectedNode.Index); - using FrameEditor diag = new FrameEditor(frame.Ticks, currentAnimation.GetFrameIndex(frame.Texture), currentAnimation.FrameTextureCount-1); - if (diag.ShowDialog(this) == DialogResult.OK) + using FrameEditor diag = new FrameEditor(frame.Ticks, currentAnimation.GetFrameIndex(frame.Texture), TextureIcons); + if (diag.ShowDialog(this) == DialogResult.OK) { - currentAnimation.SetFrame(frame, diag.FrameTextureIndex, diag.FrameTime); + /* Found a bug here. When passing the frame variable, it would replace the first instance of that frame and time + * rather than the actual frame that was clicked. I've just switched to passing the index to fix this for now. -Matt + */ + + currentAnimation.SetFrame(frameTreeView.SelectedNode.Index, diag.FrameTextureIndex, diag.FrameTime); LoadAnimationTreeView(); } } private void addFrameToolStripMenuItem_Click(object sender, EventArgs e) { - using FrameEditor diag = new FrameEditor(currentAnimation.FrameTextureCount-1); + using FrameEditor diag = new FrameEditor(TextureIcons); + diag.SaveBtn.Text = "Add"; if (diag.ShowDialog(this) == DialogResult.OK) { currentAnimation.AddFrame(diag.FrameTextureIndex, diag.FrameTime); diff --git a/PCK-Studio/Forms/Editor/AnimationEditor.resx b/PCK-Studio/Forms/Editor/AnimationEditor.resx index 31e8ec68..c3546ac8 100644 --- a/PCK-Studio/Forms/Editor/AnimationEditor.resx +++ b/PCK-Studio/Forms/Editor/AnimationEditor.resx @@ -120,6 +120,9 @@ 125, 17 + + 280, 17 + 17, 17 diff --git a/PCK-Studio/Forms/Editor/AudioEditor.Designer.cs b/PCK-Studio/Forms/Editor/AudioEditor.Designer.cs index e64db857..18fadace 100644 --- a/PCK-Studio/Forms/Editor/AudioEditor.Designer.cs +++ b/PCK-Studio/Forms/Editor/AudioEditor.Designer.cs @@ -43,6 +43,7 @@ namespace PckStudio.Forms.Editor this.creditsEditorToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.deleteUnusedBINKAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.openDataFolderToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.bulkReplaceExistingTracksToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.howToAddSongsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.whatIsEachCategoryToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -57,7 +58,6 @@ namespace PckStudio.Forms.Editor this.playOverworldInCreative = new MetroFramework.Controls.MetroCheckBox(); this.compressionUpDown = new System.Windows.Forms.NumericUpDown(); this.metroLabel1 = new MetroFramework.Controls.MetroLabel(); - this.bulkReplaceExistingTracksToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.contextMenuStrip1.SuspendLayout(); this.menuStrip.SuspendLayout(); this.contextMenuStrip2.SuspendLayout(); @@ -92,7 +92,6 @@ namespace PckStudio.Forms.Editor // // removeCategoryStripMenuItem // - this.removeCategoryStripMenuItem.Image = global::PckStudio.Properties.Resources.Del; this.removeCategoryStripMenuItem.Name = "removeCategoryStripMenuItem"; resources.ApplyResources(this.removeCategoryStripMenuItem, "removeCategoryStripMenuItem"); this.removeCategoryStripMenuItem.Click += new System.EventHandler(this.removeCategoryStripMenuItem_Click); @@ -148,25 +147,28 @@ namespace PckStudio.Forms.Editor // // creditsEditorToolStripMenuItem // - this.creditsEditorToolStripMenuItem.Image = global::PckStudio.Properties.Resources.ExportFile; this.creditsEditorToolStripMenuItem.Name = "creditsEditorToolStripMenuItem"; resources.ApplyResources(this.creditsEditorToolStripMenuItem, "creditsEditorToolStripMenuItem"); this.creditsEditorToolStripMenuItem.Click += new System.EventHandler(this.creditsEditorToolStripMenuItem_Click); // // deleteUnusedBINKAsToolStripMenuItem // - this.deleteUnusedBINKAsToolStripMenuItem.Image = global::PckStudio.Properties.Resources.Del; this.deleteUnusedBINKAsToolStripMenuItem.Name = "deleteUnusedBINKAsToolStripMenuItem"; resources.ApplyResources(this.deleteUnusedBINKAsToolStripMenuItem, "deleteUnusedBINKAsToolStripMenuItem"); this.deleteUnusedBINKAsToolStripMenuItem.Click += new System.EventHandler(this.deleteUnusedBINKAsToolStripMenuItem_Click); // // openDataFolderToolStripMenuItem // - this.openDataFolderToolStripMenuItem.Image = global::PckStudio.Properties.Resources.ZZFolder; this.openDataFolderToolStripMenuItem.Name = "openDataFolderToolStripMenuItem"; resources.ApplyResources(this.openDataFolderToolStripMenuItem, "openDataFolderToolStripMenuItem"); this.openDataFolderToolStripMenuItem.Click += new System.EventHandler(this.openDataFolderToolStripMenuItem_Click); // + // bulkReplaceExistingTracksToolStripMenuItem + // + this.bulkReplaceExistingTracksToolStripMenuItem.Name = "bulkReplaceExistingTracksToolStripMenuItem"; + resources.ApplyResources(this.bulkReplaceExistingTracksToolStripMenuItem, "bulkReplaceExistingTracksToolStripMenuItem"); + this.bulkReplaceExistingTracksToolStripMenuItem.Click += new System.EventHandler(this.bulkReplaceExistingFilesToolStripMenuItem_Click); + // // helpToolStripMenuItem // this.helpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -238,7 +240,6 @@ namespace PckStudio.Forms.Editor // // removeEntryMenuItem // - this.removeEntryMenuItem.Image = global::PckStudio.Properties.Resources.Del; this.removeEntryMenuItem.Name = "removeEntryMenuItem"; resources.ApplyResources(this.removeEntryMenuItem, "removeEntryMenuItem"); this.removeEntryMenuItem.Click += new System.EventHandler(this.removeEntryMenuItem_Click); @@ -288,12 +289,6 @@ namespace PckStudio.Forms.Editor this.metroLabel1.Name = "metroLabel1"; this.metroLabel1.Theme = MetroFramework.MetroThemeStyle.Dark; // - // bulkReplaceExistingTracksToolStripMenuItem - // - this.bulkReplaceExistingTracksToolStripMenuItem.Name = "bulkReplaceExistingTracksToolStripMenuItem"; - resources.ApplyResources(this.bulkReplaceExistingTracksToolStripMenuItem, "bulkReplaceExistingTracksToolStripMenuItem"); - this.bulkReplaceExistingTracksToolStripMenuItem.Click += new System.EventHandler(this.bulkReplaceExistingFilesToolStripMenuItem_Click); - // // AudioEditor // resources.ApplyResources(this, "$this"); diff --git a/PCK-Studio/Forms/Editor/AudioEditor.cs b/PCK-Studio/Forms/Editor/AudioEditor.cs index ad3c0bda..c8956766 100644 --- a/PCK-Studio/Forms/Editor/AudioEditor.cs +++ b/PCK-Studio/Forms/Editor/AudioEditor.cs @@ -21,6 +21,7 @@ namespace PckStudio.Forms.Editor { public string defaultType = "yes"; string tempDir = ""; + Classes.Bink BINK = new Classes.Bink(); PCKAudioFile audioFile = null; PCKFile.FileData audioPCK; LOCFile loc; @@ -54,21 +55,10 @@ namespace PckStudio.Forms.Editor public AudioEditor(PCKFile.FileData file, LOCFile locFile, bool isLittleEndian) { InitializeComponent(); - // so the Creative songs aren't combined until after the forms are closed. - // this will prevent potential problems with editing the categories after merging. loc = locFile; - tempDir = Path.Combine(Directory.GetCurrentDirectory(), "temp"); _isLittleEndian = isLittleEndian; - try - { - handleUtilFiles(); - //library = LoadLibrary(Path.Combine(tempDir, "mss32.dll")); - } - catch (IOException ex) - { - MessageBox.Show("Failed to get Binka conversion files", "Exception thrown"); - Close(); - } + + BINK.SetUpBinka(); audioPCK = file; using (var stream = new MemoryStream(file.data)) @@ -97,45 +87,10 @@ namespace PckStudio.Forms.Editor playOverworldInCreative.Enabled = audioFile.HasCategory(PCKAudioFile.AudioCategory.EAudioType.Creative); } - // https://stackoverflow.com/a/25064568 by Alik Khilazhev -MattNL - private void ExtractResource(string resName, string fName) - { - object ob = Properties.Resources.ResourceManager.GetObject(resName); - byte[] myResBytes = (byte[])ob; - using (FileStream fsDst = new FileStream(fName, FileMode.CreateNew, FileAccess.Write)) - { - byte[] bytes = myResBytes; - fsDst.Write(bytes, 0, bytes.Length); - fsDst.Close(); - fsDst.Dispose(); - } - } - - private void handleUtilFiles(bool extractFiles = true) - { - string asiPath = Path.Combine(tempDir, "binkawin.asi"); - string mssPath = Path.Combine(tempDir, "mss32.dll"); - string encoderPath = Path.Combine(tempDir, "binka_encode.exe"); - - // Deletes files so that System.IO exceptions are avoided - if (File.Exists(asiPath)) File.Delete(asiPath); - if (File.Exists(mssPath)) File.Delete(mssPath); - if (File.Exists(encoderPath)) File.Delete(encoderPath); - if (Directory.Exists(tempDir)) Directory.Delete(tempDir); - - if (extractFiles) - { - Directory.CreateDirectory(tempDir); - ExtractResource("binka_encode", encoderPath); - ExtractResource("mss32", mssPath); - ExtractResource("binkawin", asiPath); - } - } - private void AudioEditor_FormClosed(object sender, FormClosedEventArgs e) { - //FreeLibrary(library); - handleUtilFiles(false); + // Clean up is throwing an error of some kind? FreeLibrary maybe?? + //BINK.CleanUpBinka(); } private void verifyFileLocationToolStripMenuItem_Click(object sender, EventArgs e) @@ -253,33 +208,23 @@ namespace PckStudio.Forms.Editor else if (user_prompt == DialogResult.No) continue; } } - + if (Path.GetExtension(file) == ".wav") // Convert Wave to BINKA { Cursor.Current = Cursors.WaitCursor; pleaseWait waitDiag = new pleaseWait(); waitDiag.Show(this); - int error_code = 0; await Task.Run(() => { - var process = Process.Start(new ProcessStartInfo - { - FileName = Path.Combine(tempDir, "binka_encode.exe"), - Arguments = $"\"{file}\" \"{new_loc}\" -s -b" + compressionUpDown.Value.ToString(), - UseShellExecute = true, - CreateNoWindow = true, - WindowStyle = ProcessWindowStyle.Hidden - }); - process.Start(); - process.WaitForExit(); + BINK.WavToBinka(file, new_loc, (int)compressionUpDown.Value); }); waitDiag.Close(); waitDiag.Dispose(); Cursor.Current = Cursors.Default; - if (error_code != 0) continue; + if (BINK.temp_error_code != 0) continue; } else if (!duplicate_song) { @@ -418,7 +363,7 @@ namespace PckStudio.Forms.Editor private void whatIsEachCategoryToolStripMenuItem_Click(object sender, EventArgs e) { MessageBox.Show("Categories are pretty self explanatory. The game controls when each category should play.\n" + - "\nGAMEPLAY - Plays in the specified dimensions.\n" + + "\nGAMEPLAY - Plays in the specified dimensions and game modes.\n" + "-Overworld: Plays in survival mode and in Creative if no songs are set\n" + "-Nether: Nothing special to note.\n" + "-End: Prioritizes the final track when the dragon is alive.\n" + @@ -492,29 +437,27 @@ namespace PckStudio.Forms.Editor pleaseWait waitDiag = new pleaseWait(); waitDiag.Show(this); - int error_code = 0; await Task.Run(() => { - var process = Process.Start(new ProcessStartInfo - { - FileName = Path.Combine(tempDir, "binka_encode.exe"), - Arguments = $"\"{file}\" \"{new_loc}\" -s -b" + compressionUpDown.Value.ToString(), - UseShellExecute = true, - CreateNoWindow = true, - WindowStyle = ProcessWindowStyle.Hidden - }); - process.Start(); - process.WaitForExit(); + BINK.WavToBinka(file, new_loc, (int)compressionUpDown.Value); }); waitDiag.Close(); waitDiag.Dispose(); Cursor.Current = Cursors.Default; - if (error_code != 0) continue; + if (BINK.temp_error_code != 0) continue; } else if(file_ext == ".binka") File.Copy(file, Path.Combine(parent.GetDataPath(), Path.GetFileName(file))); } } + + private void convertToWAVToolStripMenuItem_Click(object sender, EventArgs e) + { + if (treeView2.SelectedNode != null && treeView1.SelectedNode.Tag is PCKAudioFile.AudioCategory) + { + BINK.BinkaToWav(Path.Combine(parent.GetDataPath(), treeView2.SelectedNode.Text + ".binka"), Path.Combine(parent.GetDataPath())); + } + } } } diff --git a/PCK-Studio/Forms/Editor/AudioEditor.resx b/PCK-Studio/Forms/Editor/AudioEditor.resx index 765e9368..909eb320 100644 --- a/PCK-Studio/Forms/Editor/AudioEditor.resx +++ b/PCK-Studio/Forms/Editor/AudioEditor.resx @@ -125,6 +125,26 @@ 127, 8 + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAABSSURBVDhP5c0x + DsAgDENRxt7/wmkNSpRGf0CCCZAegxNMM7MlGMp3dIU6dxhKf/QMNxRogeQC8ivw5Vn7C0heJlFA+kL5 + jWAohxRkde4wnGftBS90axNmphIGAAAAAElFTkSuQmCC + + + + 168, 22 + + + Add Category + + + 168, 22 + + + Remove Category + 169, 48 @@ -146,7 +166,7 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADk - MAAAAk1TRnQBSQFMAgEBCQEAAWABAAFgAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA + MAAAAk1TRnQBSQFMAgEBCQEAAXgBAAF4AQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA AwABMAMAAQEBAAEgBgABMBIAAzgB/wM1Af8DNQH/AzMB/wMwAf8DLwH/Ay0B/wMtAf8DJAH/AzsB/wM4 Af8DNQH/Ay0B/wMnAf8DNgH/AzIB/8AAAzgB/wN/Af8DeQH/A3kB/wN5Af8DcQH/A3EB/wN5Af8DeQH/ A3EB/wNxAf8DcQH/A3kB/wN5Af8DfwH/AzIB/8AAAzIB/wN2Af8DsAH/A7AB/wOvAf8DrwH/A68B/wOo @@ -384,38 +404,58 @@ 5 - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAABSSURBVDhP5c0x - DsAgDENRxt7/wmkNSpRGf0CCCZAegxNMM7MlGMp3dIU6dxhKf/QMNxRogeQC8ivw5Vn7C0heJlFA+kL5 - jWAohxRkde4wnGftBS90axNmphIGAAAAAElFTkSuQmCC - - - - 168, 22 - - - Add Category - - - 168, 22 - - - Remove Category - 19, 8 False + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAADfSURBVDhPYxg8 + 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 + + 220, 22 + + + Credits Editor + + + 220, 22 + + + Delete Unused BINKAs + + + 220, 22 + + + Open Data Folder + + + 220, 22 + + + Bulk Replace Existing Tracks + 46, 20 @@ -423,19 +463,19 @@ Tools - 245, 22 + 243, 22 How to add songs - 245, 22 + 243, 22 What is each category? - 245, 22 + 243, 22 How to edit credits @@ -447,7 +487,7 @@ How to optimize the Data folder - 245, 22 + 243, 22 BINKA Compression @@ -482,48 +522,40 @@ 7 - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAADfSURBVDhPYxg8 - QLt++3yTGbf/Fm599P/Nh49wfPXxq/+rTt37f+Dak/8gOSBgAGEMANIMxGBFyAasPf/0v8GE8//z1t8C - y4HU4DIALIluwLpLL+HiMANAGKoNAWASCavv/n/57gPcgOvP3oENOXj7NViOoAFGU6791+k4ghWD5Aga - QCyGakMAkODcU89R/I8Ng9TgNADk14dPn/8/c+kqVgySgwUqVBsCwAx49urN/zsPHmPFIDmaGvAXJInN - 38gYasBfqDYE0K7dOn/Wvut/sfkdGYPUgJI9VNuAAwYGAGn6yvdevWgPAAAAAElFTkSuQmCC - - - - 180, 22 - - - Save - - - 220, 22 - - - Credits Editor - - - 220, 22 - - - Delete Unused BINKAs - - - 220, 22 - - - Open Data Folder - Top, Bottom, Left, Right 282, 8 + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAABSSURBVDhP5c0x + DsAgDENRxt7/wmkNSpRGf0CCCZAegxNMM7MlGMp3dIU6dxhKf/QMNxRogeQC8ivw5Vn7C0heJlFA+kL5 + jWAohxRkde4wnGftBS90axNmphIGAAAAAElFTkSuQmCC + + + + 180, 22 + + + Add Entry + + + 180, 22 + + + Remove Entry + + + 180, 22 + + + Verify File Location + - 174, 70 + 181, 92 contextMenuStrip2 @@ -552,32 +584,6 @@ 6 - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAABSSURBVDhP5c0x - DsAgDENRxt7/wmkNSpRGf0CCCZAegxNMM7MlGMp3dIU6dxhKf/QMNxRogeQC8ivw5Vn7C0heJlFA+kL5 - jWAohxRkde4wnGftBS90axNmphIGAAAAAElFTkSuQmCC - - - - 173, 22 - - - Add Entry - - - 173, 22 - - - Remove Entry - - - 173, 22 - - - Verify File Location - True @@ -653,12 +659,6 @@ 2 - - 220, 22 - - - Bulk Replace Existing Tracks - True @@ -731,6 +731,12 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + bulkReplaceExistingTracksToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + helpToolStripMenuItem @@ -785,12 +791,6 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - bulkReplaceExistingTracksToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - AudioEditor diff --git a/PCK-Studio/Forms/Editor/COLEditor.Designer.cs b/PCK-Studio/Forms/Editor/COLEditor.Designer.cs index 2d7122f1..939580e3 100644 --- a/PCK-Studio/Forms/Editor/COLEditor.Designer.cs +++ b/PCK-Studio/Forms/Editor/COLEditor.Designer.cs @@ -51,6 +51,8 @@ namespace PckStudio.Forms.Editor this.saveToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); this.waterTab = new System.Windows.Forms.TabPage(); this.waterTreeView = new System.Windows.Forms.TreeView(); + this.ColorContextMenu = new MetroFramework.Controls.MetroContextMenu(this.components); + this.restoreOriginalColorToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.underwaterTreeView = new System.Windows.Forms.TreeView(); this.fogTreeView = new System.Windows.Forms.TreeView(); this.colorsTab = new System.Windows.Forms.TabPage(); @@ -58,8 +60,8 @@ namespace PckStudio.Forms.Editor this.tabControl = new MetroFramework.Controls.MetroTabControl(); this.underwaterTab = new System.Windows.Forms.TabPage(); this.fogTab = new System.Windows.Forms.TabPage(); - this.ColorContextMenu = new MetroFramework.Controls.MetroContextMenu(this.components); - this.restoreOriginalColorToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.metroTextBox1 = new MetroFramework.Controls.MetroTextBox(); + this.metroLabel2 = new MetroFramework.Controls.MetroLabel(); this.metroPanel1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.blueUpDown)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.greenUpDown)).BeginInit(); @@ -68,15 +70,17 @@ namespace PckStudio.Forms.Editor ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); this.menuStrip.SuspendLayout(); this.waterTab.SuspendLayout(); + this.ColorContextMenu.SuspendLayout(); this.colorsTab.SuspendLayout(); this.tabControl.SuspendLayout(); this.underwaterTab.SuspendLayout(); this.fogTab.SuspendLayout(); - this.ColorContextMenu.SuspendLayout(); this.SuspendLayout(); // // metroPanel1 // + this.metroPanel1.Controls.Add(this.metroTextBox1); + this.metroPanel1.Controls.Add(this.metroLabel2); this.metroPanel1.Controls.Add(this.setColorBtn); this.metroPanel1.Controls.Add(this.blueUpDown); this.metroPanel1.Controls.Add(this.greenUpDown); @@ -119,7 +123,6 @@ namespace PckStudio.Forms.Editor 0, 0}); this.blueUpDown.Name = "blueUpDown"; - this.blueUpDown.ValueChanged += new System.EventHandler(this.color_ValueChanged); // // greenUpDown // @@ -132,7 +135,6 @@ namespace PckStudio.Forms.Editor 0, 0}); this.greenUpDown.Name = "greenUpDown"; - this.greenUpDown.ValueChanged += new System.EventHandler(this.color_ValueChanged); // // redUpDown // @@ -145,7 +147,6 @@ namespace PckStudio.Forms.Editor 0, 0}); this.redUpDown.Name = "redUpDown"; - this.redUpDown.ValueChanged += new System.EventHandler(this.color_ValueChanged); // // alphaUpDown // @@ -189,16 +190,16 @@ namespace PckStudio.Forms.Editor // // // - this.colorTextbox.CustomButton.Image = ((System.Drawing.Image)(resources.GetObject("resource.Image"))); + this.colorTextbox.CustomButton.Image = ((System.Drawing.Image)(resources.GetObject("resource.Image1"))); this.colorTextbox.CustomButton.ImeMode = ((System.Windows.Forms.ImeMode)(resources.GetObject("resource.ImeMode"))); - this.colorTextbox.CustomButton.Location = ((System.Drawing.Point)(resources.GetObject("resource.Location"))); + this.colorTextbox.CustomButton.Location = ((System.Drawing.Point)(resources.GetObject("resource.Location1"))); this.colorTextbox.CustomButton.Name = ""; - this.colorTextbox.CustomButton.Size = ((System.Drawing.Size)(resources.GetObject("resource.Size"))); + this.colorTextbox.CustomButton.Size = ((System.Drawing.Size)(resources.GetObject("resource.Size1"))); this.colorTextbox.CustomButton.Style = MetroFramework.MetroColorStyle.Blue; - this.colorTextbox.CustomButton.TabIndex = ((int)(resources.GetObject("resource.TabIndex"))); + this.colorTextbox.CustomButton.TabIndex = ((int)(resources.GetObject("resource.TabIndex1"))); this.colorTextbox.CustomButton.Theme = MetroFramework.MetroThemeStyle.Light; this.colorTextbox.CustomButton.UseSelectable = true; - this.colorTextbox.CustomButton.Visible = ((bool)(resources.GetObject("resource.Visible"))); + this.colorTextbox.CustomButton.Visible = ((bool)(resources.GetObject("resource.Visible1"))); this.colorTextbox.Lines = new string[0]; resources.ApplyResources(this.colorTextbox, "colorTextbox"); this.colorTextbox.MaxLength = 32767; @@ -265,6 +266,19 @@ namespace PckStudio.Forms.Editor this.waterTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView2_AfterSelect); this.waterTreeView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.treeView2_KeyDown); // + // ColorContextMenu + // + this.ColorContextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.restoreOriginalColorToolStripMenuItem}); + this.ColorContextMenu.Name = "ColorContextMenu"; + resources.ApplyResources(this.ColorContextMenu, "ColorContextMenu"); + // + // restoreOriginalColorToolStripMenuItem + // + this.restoreOriginalColorToolStripMenuItem.Name = "restoreOriginalColorToolStripMenuItem"; + resources.ApplyResources(this.restoreOriginalColorToolStripMenuItem, "restoreOriginalColorToolStripMenuItem"); + this.restoreOriginalColorToolStripMenuItem.Click += new System.EventHandler(this.restoreOriginalColorToolStripMenuItem_Click); + // // underwaterTreeView // this.underwaterTreeView.ContextMenuStrip = this.ColorContextMenu; @@ -323,19 +337,41 @@ namespace PckStudio.Forms.Editor resources.ApplyResources(this.fogTab, "fogTab"); this.fogTab.Name = "fogTab"; // - // ColorContextMenu + // metroTextBox1 // - this.ColorContextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.restoreOriginalColorToolStripMenuItem}); - this.ColorContextMenu.Name = "ColorContextMenu"; - resources.ApplyResources(this.ColorContextMenu, "ColorContextMenu"); // - // restoreOriginalColorToolStripMenuItem // - this.restoreOriginalColorToolStripMenuItem.Image = global::PckStudio.Properties.Resources.ExportFile; - this.restoreOriginalColorToolStripMenuItem.Name = "restoreOriginalColorToolStripMenuItem"; - resources.ApplyResources(this.restoreOriginalColorToolStripMenuItem, "restoreOriginalColorToolStripMenuItem"); - this.restoreOriginalColorToolStripMenuItem.Click += new System.EventHandler(this.restoreOriginalColorToolStripMenuItem_Click); + // + this.metroTextBox1.CustomButton.Image = ((System.Drawing.Image)(resources.GetObject("resource.Image"))); + this.metroTextBox1.CustomButton.Location = ((System.Drawing.Point)(resources.GetObject("resource.Location"))); + this.metroTextBox1.CustomButton.Name = ""; + this.metroTextBox1.CustomButton.Size = ((System.Drawing.Size)(resources.GetObject("resource.Size"))); + this.metroTextBox1.CustomButton.Style = MetroFramework.MetroColorStyle.Blue; + this.metroTextBox1.CustomButton.TabIndex = ((int)(resources.GetObject("resource.TabIndex"))); + this.metroTextBox1.CustomButton.Theme = MetroFramework.MetroThemeStyle.Light; + this.metroTextBox1.CustomButton.UseSelectable = true; + this.metroTextBox1.CustomButton.Visible = ((bool)(resources.GetObject("resource.Visible"))); + this.metroTextBox1.Lines = new string[0]; + resources.ApplyResources(this.metroTextBox1, "metroTextBox1"); + this.metroTextBox1.MaxLength = 32767; + 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.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.TextChanged += new System.EventHandler(this.metroTextBox1_TextChanged); + // + // metroLabel2 + // + resources.ApplyResources(this.metroLabel2, "metroLabel2"); + this.metroLabel2.Name = "metroLabel2"; + this.metroLabel2.Theme = MetroFramework.MetroThemeStyle.Dark; // // COLEditor // @@ -358,11 +394,11 @@ namespace PckStudio.Forms.Editor this.menuStrip.ResumeLayout(false); this.menuStrip.PerformLayout(); this.waterTab.ResumeLayout(false); + this.ColorContextMenu.ResumeLayout(false); this.colorsTab.ResumeLayout(false); this.tabControl.ResumeLayout(false); this.underwaterTab.ResumeLayout(false); this.fogTab.ResumeLayout(false); - this.ColorContextMenu.ResumeLayout(false); this.ResumeLayout(false); } @@ -396,5 +432,7 @@ namespace PckStudio.Forms.Editor private MetroFramework.Controls.MetroLabel metroLabel1; private MetroFramework.Controls.MetroContextMenu ColorContextMenu; private ToolStripMenuItem restoreOriginalColorToolStripMenuItem; + private MetroFramework.Controls.MetroTextBox metroTextBox1; + private MetroFramework.Controls.MetroLabel metroLabel2; } } \ No newline at end of file diff --git a/PCK-Studio/Forms/Editor/COLEditor.cs b/PCK-Studio/Forms/Editor/COLEditor.cs index b6c943ff..d5244f3a 100644 --- a/PCK-Studio/Forms/Editor/COLEditor.cs +++ b/PCK-Studio/Forms/Editor/COLEditor.cs @@ -21,6 +21,11 @@ namespace PckStudio.Forms.Editor private readonly PCKFile.FileData _file; + List colorCache = new List(); + List waterCache = new List(); + List underwaterCache = new List(); + List fogCache = new List(); + public COLEditor(PCKFile.FileData file) { InitializeComponent(); @@ -42,6 +47,7 @@ namespace PckStudio.Forms.Editor TreeNode tn = new TreeNode(obj.name); tn.Tag = entry != null ? entry : obj; colorTreeView.Nodes.Add(tn); + colorCache.Add(tn); } foreach (var obj in colourfile.waterEntries) { @@ -49,12 +55,33 @@ namespace PckStudio.Forms.Editor TreeNode tn = new TreeNode(obj.name); tn.Tag = entry != null ? entry : obj; waterTreeView.Nodes.Add(tn); + waterCache.Add(tn); TreeNode tnB = new TreeNode(obj.name); tnB.Tag = entry != null ? entry : obj; underwaterTreeView.Nodes.Add(tnB); + underwaterCache.Add(tnB); TreeNode tnC = new TreeNode(obj.name); tnC.Tag = entry != null ? entry : obj; fogTreeView.Nodes.Add(tnC); + fogCache.Add(tnC); + } + } + + void SetUpValueChanged(bool add) + { + if(add) + { + //alphaUpDown.ValueChanged += color_ValueChanged; + redUpDown.ValueChanged += color_ValueChanged; + greenUpDown.ValueChanged += color_ValueChanged; + blueUpDown.ValueChanged += color_ValueChanged; + } + else + { + //alphaUpDown.ValueChanged -= color_ValueChanged; + redUpDown.ValueChanged -= color_ValueChanged; + greenUpDown.ValueChanged -= color_ValueChanged; + blueUpDown.ValueChanged -= color_ValueChanged; } } @@ -64,13 +91,14 @@ namespace PckStudio.Forms.Editor return; var colorEntry = (COLFile.ColorEntry)colorTreeView.SelectedNode.Tag; var color = colorEntry.color; + SetUpValueChanged(false); alphaUpDown.Visible = false; alphaLabel.Visible = false; redUpDown.Value = color >> 16 & 0xff; greenUpDown.Value = color >> 8 & 0xff; blueUpDown.Value = color & 0xff; pictureBox1.BackColor = Color.FromArgb(0xff << 24 | (int)color); - + SetUpValueChanged(true); } private void treeView2_AfterSelect(object sender, TreeViewEventArgs e) @@ -79,6 +107,7 @@ namespace PckStudio.Forms.Editor return; var colorEntry = (COLFile.ExtendedColorEntry)waterTreeView.SelectedNode.Tag; int color = (int)colorEntry.color; + SetUpValueChanged(false); alphaUpDown.Enabled = true; alphaUpDown.Visible = true; alphaLabel.Visible = true; @@ -87,6 +116,7 @@ namespace PckStudio.Forms.Editor greenUpDown.Value = color >> 8 & 0xff; blueUpDown.Value = color & 0xff; pictureBox1.BackColor = Color.FromArgb(color); + SetUpValueChanged(true); } private void treeView3_AfterSelect(object sender, TreeViewEventArgs e) @@ -95,12 +125,14 @@ namespace PckStudio.Forms.Editor return; var colorEntry = (COLFile.ExtendedColorEntry)underwaterTreeView.SelectedNode.Tag; int color = (int)colorEntry.color_b; + SetUpValueChanged(false); alphaUpDown.Visible = false; alphaLabel.Visible = false; redUpDown.Value = color >> 16 & 0xff; greenUpDown.Value = color >> 8 & 0xff; blueUpDown.Value = color & 0xff; pictureBox1.BackColor = Color.FromArgb(255, Color.FromArgb(0xff << 24 | color)); + SetUpValueChanged(true); } private void treeView4_AfterSelect(object sender, TreeViewEventArgs e) @@ -109,12 +141,14 @@ namespace PckStudio.Forms.Editor return; var colorEntry = (COLFile.ExtendedColorEntry)fogTreeView.SelectedNode.Tag; int color = (int)colorEntry.color_c; + SetUpValueChanged(false); alphaUpDown.Visible = false; alphaLabel.Visible = false; redUpDown.Value = color >> 16 & 0xff; greenUpDown.Value = color >> 8 & 0xff; blueUpDown.Value = color & 0xff; pictureBox1.BackColor = Color.FromArgb(255, Color.FromArgb(0xff << 24 | color)); + SetUpValueChanged(true); } private void saveToolStripMenuItem1_Click(object sender, EventArgs e) @@ -211,52 +245,28 @@ namespace PckStudio.Forms.Editor private void color_ValueChanged(object sender, EventArgs e) { - //TreeView tv = (TreeView)tabControl.SelectedTab.Controls[0]; - //if (tv.SelectedNode == null) return; - //byte[] origHex = StringToByteArrayFastest(tv.SelectedNode.Tag.ToString()); - //bool hasAlpha = tabControl.SelectedTab == waterTab; - //string hex = ""; - //if (((NumericUpDown)sender).Name == "numericUpDown2") - //{ - // hex += ((int)alphaUpDown.Value).ToString("X2"); - // hex += origHex[1].ToString("X2"); - // hex += origHex[2].ToString("X2"); - // hex += origHex[3].ToString("X2"); - //} - //else if (((NumericUpDown)sender).Name == "numericUpDown3") - //{ - // if (hasAlpha) hex += origHex[0].ToString("X2"); - // hex += ((int)redUpDown.Value).ToString("X2"); - // hex += origHex[hasAlpha ? 2 : 1].ToString("X2"); - // hex += origHex[hasAlpha ? 3 : 2].ToString("X2"); - //} - //else if (((NumericUpDown)sender).Name == "numericUpDown4") - //{ - // if (hasAlpha) hex += origHex[0].ToString("X2"); - // hex += origHex[hasAlpha ? 1 : 0].ToString("X2"); - // hex += ((int)greenUpDown.Value).ToString("X2"); - // hex += origHex[hasAlpha ? 3 : 2].ToString("X2"); - //} - //else if (((NumericUpDown)sender).Name == "numericUpDown5") - //{ - // if (hasAlpha) hex += origHex[0].ToString("X2"); - // hex += origHex[hasAlpha ? 1 : 0].ToString("X2"); - // hex += origHex[hasAlpha ? 2 : 1].ToString("X2"); - // hex += ((int)blueUpDown.Value).ToString("X2"); - //} - //else // just in case some weird thing happens i dunno - matt - //{ - // if (hasAlpha) hex += origHex[0].ToString("X2"); - // hex += origHex[hasAlpha ? 1 : 0].ToString("X2"); - // hex += origHex[hasAlpha ? 2 : 1].ToString("X2"); - // hex += origHex[hasAlpha ? 3 : 2].ToString("X2"); - //} + Color fixed_color = new Color(); + if (tabControl.SelectedTab == colorsTab) + { + var colorEntry = (COLFile.ColorEntry)colorTreeView.SelectedNode.Tag; + fixed_color = Color.FromArgb(255, (int)redUpDown.Value, (int)greenUpDown.Value, (int)blueUpDown.Value); + colorEntry.color = (uint)(((255 << 24) | (fixed_color.R << 16) | (fixed_color.G << 8) | fixed_color.B) & 0xffffffffL); + } + else if (tabControl.SelectedTab != null) // just in case + { + var colorEntry = (COLFile.ExtendedColorEntry)waterTreeView.SelectedNode.Tag; + fixed_color = Color.FromArgb(tabControl.SelectedTab == waterTab ? (int)alphaUpDown.Value : 255, (int)redUpDown.Value, (int)greenUpDown.Value, (int)blueUpDown.Value); + uint value = (uint)(((fixed_color.A << 24) | (fixed_color.R << 16) | (fixed_color.G << 8) | fixed_color.B) & 0xffffffffL); + if (tabControl.SelectedTab == waterTab) colorEntry.color = value; + else if (tabControl.SelectedTab == underwaterTab) colorEntry.color_b = value; + else colorEntry.color_c = value; + fixed_color = Color.FromArgb((int)value); + } - //Console.WriteLine(hex); - //colorTextbox.Text = hex; + pictureBox1.BackColor = fixed_color; } - private void setColorBtn_Click(object sender, EventArgs e) + private void setColorBtn_Click(object sender, EventArgs e) { ColorDialog colorPick = new ColorDialog(); colorPick.AllowFullOpen = true; @@ -322,10 +332,10 @@ namespace PckStudio.Forms.Editor private void restoreOriginalColorToolStripMenuItem_Click(object sender, EventArgs e) { + SetUpValueChanged(false); if (tabControl.SelectedTab == colorsTab && colorTreeView.SelectedNode != null && colorTreeView.SelectedNode.Tag != null && colorTreeView.SelectedNode.Tag is COLFile.ColorEntry colorInfoD) { - MessageBox.Show("Color"); COLFile.ColorEntry entry = default_colourfile.entries.Find(color => color.name == colorTreeView.SelectedNode.Text); colorInfoD.color = entry.color; redUpDown.Value = colorInfoD.color >> 16 & 0xff; @@ -336,7 +346,6 @@ namespace PckStudio.Forms.Editor else if (tabControl.SelectedTab == waterTab && waterTreeView.SelectedNode != null && waterTreeView.SelectedNode.Tag != null && waterTreeView.SelectedNode.Tag is COLFile.ExtendedColorEntry colorInfo) { - MessageBox.Show("Water"); COLFile.ExtendedColorEntry entry = default_colourfile.waterEntries.Find(color => color.name == waterTreeView.SelectedNode.Text); colorInfo.color = entry.color; alphaUpDown.Value = colorInfo.color >> 24 & 0xff; @@ -348,7 +357,6 @@ namespace PckStudio.Forms.Editor else if (tabControl.SelectedTab == underwaterTab && underwaterTreeView.SelectedNode != null && underwaterTreeView.SelectedNode.Tag != null && underwaterTreeView.SelectedNode.Tag is COLFile.ExtendedColorEntry colorInfoB) { - MessageBox.Show("Underwater"); COLFile.ExtendedColorEntry entry = default_colourfile.waterEntries.Find(color => color.name == underwaterTreeView.SelectedNode.Text); colorInfoB.color_b = entry.color_b; alphaUpDown.Value = colorInfoB.color_b >> 24 & 0xff; @@ -360,7 +368,6 @@ namespace PckStudio.Forms.Editor else if (tabControl.SelectedTab == fogTab && fogTreeView.SelectedNode != null && fogTreeView.SelectedNode.Tag != null && fogTreeView.SelectedNode.Tag is COLFile.ExtendedColorEntry colorInfoC) { - MessageBox.Show("Fog"); COLFile.ExtendedColorEntry entry = default_colourfile.waterEntries.Find(color => color.name == fogTreeView.SelectedNode.Text); colorInfoC.color_c = entry.color_c; alphaUpDown.Value = colorInfoC.color_c >> 24 & 0xff; @@ -369,6 +376,78 @@ namespace PckStudio.Forms.Editor blueUpDown.Value = colorInfoC.color_c & 0xff; pictureBox1.BackColor = Color.FromArgb(0xff << 24 | (int)colorInfoC.color_c); } + SetUpValueChanged(true); + } + + private void metroTextBox1_TextChanged(object sender, EventArgs e) + { + // Some code in this function is modified code from this StackOverflow answer - MattNL + //https://stackoverflow.com/questions/8260322/filter-a-treeview-with-a-textbox-in-a-c-sharp-winforms-app + + //blocks repainting tree until all objects loaded + colorTreeView.BeginUpdate(); + colorTreeView.Nodes.Clear(); + waterTreeView.BeginUpdate(); + waterTreeView.Nodes.Clear(); + underwaterTreeView.BeginUpdate(); + underwaterTreeView.Nodes.Clear(); + fogTreeView.BeginUpdate(); + fogTreeView.Nodes.Clear(); + if (!string.IsNullOrEmpty(metroTextBox1.Text)) + { + foreach (TreeNode _node in colorCache) + { + if (_node.Text.ToLower().Contains(metroTextBox1.Text.ToLower())) + { + colorTreeView.Nodes.Add((TreeNode)_node.Clone()); + } + } + foreach (TreeNode _node in waterCache) + { + if (_node.Text.ToLower().Contains(metroTextBox1.Text.ToLower())) + { + waterTreeView.Nodes.Add((TreeNode)_node.Clone()); + } + } + foreach (TreeNode _node in underwaterCache) + { + if (_node.Text.ToLower().Contains(metroTextBox1.Text.ToLower())) + { + underwaterTreeView.Nodes.Add((TreeNode)_node.Clone()); + } + } + foreach (TreeNode _node in fogCache) + { + if (_node.Text.ToLower().Contains(metroTextBox1.Text.ToLower())) + { + fogTreeView.Nodes.Add((TreeNode)_node.Clone()); + } + } + } + else + { + foreach (TreeNode _node in colorCache) + { + colorTreeView.Nodes.Add((TreeNode)_node.Clone()); + } + foreach (TreeNode _node in waterCache) + { + waterTreeView.Nodes.Add((TreeNode)_node.Clone()); + } + foreach (TreeNode _node in underwaterCache) + { + underwaterTreeView.Nodes.Add((TreeNode)_node.Clone()); + } + foreach (TreeNode _node in fogCache) + { + fogTreeView.Nodes.Add((TreeNode)_node.Clone()); + } + } + //enables redrawing tree after all objects have been added + colorTreeView.EndUpdate(); + waterTreeView.EndUpdate(); + underwaterTreeView.EndUpdate(); + fogTreeView.EndUpdate(); } } } diff --git a/PCK-Studio/Forms/Editor/COLEditor.resx b/PCK-Studio/Forms/Editor/COLEditor.resx index f3ac1ff3..3ca373b8 100644 --- a/PCK-Studio/Forms/Editor/COLEditor.resx +++ b/PCK-Studio/Forms/Editor/COLEditor.resx @@ -117,175 +117,70 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - setColorBtn - - - MetroFramework.Controls.MetroButton, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - metroPanel1 - - - 2 - - - blueUpDown - - - System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - metroPanel1 - - - 3 - - - greenUpDown - - - System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - metroPanel1 - - - 4 - - - redUpDown - - - System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - metroPanel1 - - - 5 - - - alphaUpDown - - - System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - metroPanel1 - - - 6 - - - alphaLabel - - - MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - metroPanel1 - - - 7 - - - blueLabel - - - MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - metroPanel1 - - - 8 - - - greenLabel - - - MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - metroPanel1 - - - 9 - - - redLabel - - - MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - metroPanel1 - - - 10 - - - colorTextbox - - - MetroFramework.Controls.MetroTextBox, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - metroPanel1 - - - 11 - - - metroLabel1 - - - MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - metroPanel1 - - - 12 - - - pictureBox1 - - - System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - metroPanel1 - - - 13 - - - Fill + + - - 20, 60 + + 113, 1 - - 612, 523 + + 21, 21 - - 0 + + 1 - + + False + + + 101, 27 + + + 135, 23 + + + 24 + + + metroTextBox1 + + + MetroFramework.Controls.MetroTextBox, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + metroPanel1 - - MetroFramework.Controls.MetroPanel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + 2 - - $this + + True - + + 62, 27 + + + 46, 19 + + + 23 + + + Filter: + + + metroLabel2 + + + MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + metroPanel1 + + 3 @@ -310,7 +205,7 @@ metroPanel1 - 2 + 4 400, 397 @@ -331,7 +226,7 @@ metroPanel1 - 3 + 5 400, 371 @@ -352,7 +247,7 @@ metroPanel1 - 4 + 6 400, 345 @@ -373,7 +268,7 @@ metroPanel1 - 5 + 7 400, 319 @@ -397,7 +292,7 @@ metroPanel1 - 6 + 8 True @@ -427,7 +322,7 @@ metroPanel1 - 7 + 9 True @@ -454,7 +349,7 @@ metroPanel1 - 8 + 10 True @@ -481,7 +376,7 @@ metroPanel1 - 9 + 11 True @@ -508,24 +403,24 @@ metroPanel1 - 10 + 12 - + NoControl - + 103, 1 - + 21, 21 - + 1 - + False @@ -547,7 +442,7 @@ metroPanel1 - 11 + 13 True @@ -574,7 +469,7 @@ metroPanel1 - 12 + 14 378, 92 @@ -595,7 +490,31 @@ metroPanel1 - 13 + 15 + + + Fill + + + 20, 60 + + + 612, 523 + + + 0 + + + metroPanel1 + + + MetroFramework.Controls.MetroPanel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + $this + + + 3 17, 17 @@ -603,6 +522,28 @@ False + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAADfSURBVDhPYxg8 + 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 @@ -627,28 +568,6 @@ 1 - - 37, 20 - - - File - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAADfSURBVDhPYxg8 - 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 - 125, 17 @@ -659,7 +578,7 @@ Restore original color - 187, 48 + 187, 26 ColorContextMenu @@ -677,7 +596,7 @@ No - 320, 458 + 320, 381 0 @@ -698,7 +617,7 @@ 4, 38 - 320, 458 + 320, 381 1 @@ -767,7 +686,7 @@ 0, 0 - 320, 458 + 320, 381 0 @@ -788,7 +707,7 @@ 4, 38 - 320, 458 + 320, 381 0 @@ -815,7 +734,7 @@ 4, 38 - 320, 458 + 320, 381 2 @@ -839,7 +758,7 @@ 4, 38 - 320, 458 + 320, 381 3 @@ -860,10 +779,10 @@ 3 - 20, 83 + 23, 114 - 328, 500 + 328, 423 22 diff --git a/PCK-Studio/Forms/Skins-And-Textures/addnewskin.cs b/PCK-Studio/Forms/Skins-And-Textures/addnewskin.cs index 880655cb..cb2e592d 100644 --- a/PCK-Studio/Forms/Skins-And-Textures/addnewskin.cs +++ b/PCK-Studio/Forms/Skins-And-Textures/addnewskin.cs @@ -308,6 +308,7 @@ namespace PckStudio skinPictureBoxTexture.Image = Image.FromStream(stream); stream.Close(); stream.Dispose(); + File.Delete(Application.StartupPath + "\\temp.png"); } skinPictureBoxTexture.Width = skinPictureBoxTexture.Height; buttonDone.Enabled = true; diff --git a/PCK-Studio/Forms/Skins-And-Textures/generateModel.cs b/PCK-Studio/Forms/Skins-And-Textures/generateModel.cs index 6dfb3289..e5033f4f 100644 --- a/PCK-Studio/Forms/Skins-And-Textures/generateModel.cs +++ b/PCK-Studio/Forms/Skins-And-Textures/generateModel.cs @@ -33,32 +33,32 @@ namespace PckStudio [Flags] enum eANIMFlags { - DisableArmSwinging = 1 << 0, - ZombieArms = 1 << 1, - LockFootAnimation = 1 << 2, - unk_BIT3 = 1 << 3, - unk_BIT4 = 1 << 4, - BothLegsSwingParallel = 1 << 5, - unk_BIT6 = 1 << 6, - MainArmUp = 1 << 7, - DisableArmor = 1 << 8, - unk_BIT9 = 1 << 9, - DisableHead = 1 << 10, - DisableLeftArm = 1 << 11, - DisableRightArm = 1 << 12, - DiableBody = 1 << 13, - DiableRightLeg = 1 << 14, - DiableLeftLeg = 1 << 15, - R2D2Sneak = 1 << 16, - DisableHeadOverlay = 1 << 17, - Is64x64 = 1 << 18, - HasSlimArms = 1 << 19, - DisableLeftArmOverlay = 1 << 20, - DisableRightArmOverlay = 1 << 21, - DisableLeftLegOverlay = 1 << 22, - DisableRightLegOverlay = 1 << 23, - DisableBodyOverlay = 1 << 24, - RenderUpSideDown = 1 << 31, + DisableArmSwinging = 1 << 0, + ZombieArms = 1 << 1, + LockFootAnimation = 1 << 2, + SitWhileIdle = 1 << 3, + unk_BIT4 = 1 << 4, + BothLegsSwingParallel = 1 << 5, + BothArmsSwingParallel = 1 << 6, + MainArmUp = 1 << 7, + DisableArmor = 1 << 8, + DisableBobbing = 1 << 9, + DisableHead = 1 << 10, + DisableLeftArm = 1 << 11, + DisableRightArm = 1 << 12, + DiableBody = 1 << 13, + DiableRightLeg = 1 << 14, + DiableLeftLeg = 1 << 15, + BackwardsSneak = 1 << 16, + DisableHeadOverlay = 1 << 17, + Is64x64 = 1 << 18, + HasSlimArms = 1 << 19, + DisableLeftArmOverlay = 1 << 20, + DisableRightArmOverlay = 1 << 21, + DisableLeftLegOverlay = 1 << 22, + DisableRightLegOverlay = 1 << 23, + DisableBodyOverlay = 1 << 24, + RenderUpSideDown = 1 << 31, } eANIMFlags ANIM = 0; @@ -74,7 +74,7 @@ namespace PckStudio ValueTuple ToProperty() { - return new ValueTuple("ANIM", "0x"+ANIM.ToString("x8")); + return new ValueTuple("ANIM", "0x" + ANIM.ToString("x8")); } @@ -182,8 +182,6 @@ namespace PckStudio InitializeComponent(); boxes = skinProperties; skinPreview = preview; - buttonIMPORT.Enabled = false; - buttonEXPORT.Enabled = false; if (texturePreview.Image == null) texturePreview.Image = new Bitmap(64, 64); loadData(); @@ -275,7 +273,7 @@ namespace PckStudio { ANIM = (eANIMFlags)int.Parse(property.Item2, System.Globalization.NumberStyles.HexNumber); } - catch(Exception ex) + catch (Exception ex) { Console.WriteLine(ex.Message); } @@ -307,8 +305,8 @@ namespace PckStudio // makes sure it reders/draws the full pixel in top left corner graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; int headbodyY = (displayBox.Height / 2) + 25; // 25 - int armY = (displayBox.Height / 2) + 35; // -60; - int legY = (displayBox.Height / 2) + 85; // -80; + int armY = (displayBox.Height / 2) + 35; // -60; + int legY = (displayBox.Height / 2) + 85; // -80; int groundLevel = (displayBox.Height / 2) + 145; graphics.DrawLine(Pens.White, 0, groundLevel, displayBox.Width, groundLevel); // Chooses Render settings based on current direction @@ -509,11 +507,11 @@ namespace PckStudio case "ARM1": y = armY + int.Parse(offsetArms.Text) * 5; break; - + case "LEG0": y = legY + int.Parse(offsetLegs.Text) * 5; break; - + case "LEG1": y = legY + int.Parse(offsetLegs.Text) * 5; break; @@ -753,76 +751,76 @@ namespace PckStudio } while (checkedItems < listViewBoxes.Items.Count); } else if (direction == eViewDirection.right) + { + int checkedItems = 0; + do { - int checkedItems = 0; - do + foreach (ListViewItem listViewItem1 in listViewBoxes.Items) { - foreach (ListViewItem listViewItem1 in listViewBoxes.Items) + if (listViewItem1.SubItems[listViewItem1.SubItems.Count - 1].Text == "unchecked") { - if (listViewItem1.SubItems[listViewItem1.SubItems.Count - 1].Text == "unchecked") + int x = 0; + if (listViewItem1.Tag.ToString() == "HEAD") + x = displayBox.Width / 2; + else if (listViewItem1.Tag.ToString() == "BODY") + x = displayBox.Width / 2; + else if (listViewItem1.Tag.ToString() == "ARM0") + x = 178; + else if (listViewItem1.Tag.ToString() == "ARM1") + x = 228; + else if (listViewItem1.Tag.ToString() == "LEG0") + x = 193; + else if (listViewItem1.Tag.ToString() == "LEG1") + x = 213; + bool flag = false; + int index = listViewItem1.Index; + foreach (ListViewItem listViewItem2 in listViewBoxes.Items) { - int x = 0; - if (listViewItem1.Tag.ToString() == "HEAD") - x = displayBox.Width / 2; - else if (listViewItem1.Tag.ToString() == "BODY") - x = displayBox.Width / 2; - else if (listViewItem1.Tag.ToString() == "ARM0") - x = 178; - else if (listViewItem1.Tag.ToString() == "ARM1") - x = 228; - else if (listViewItem1.Tag.ToString() == "LEG0") - x = 193; - else if (listViewItem1.Tag.ToString() == "LEG1") - x = 213; - bool flag = false; - int index = listViewItem1.Index; - foreach (ListViewItem listViewItem2 in listViewBoxes.Items) + if (listViewItem2.SubItems[9].Text == "unchecked") { - if (listViewItem2.SubItems[9].Text == "unchecked") + int y = 0; + if (listViewItem2.Tag.ToString() == "HEAD") + y = displayBox.Width / 2; + else if (listViewItem2.Tag.ToString() == "BODY") + y = displayBox.Width / 2; + else if (listViewItem2.Tag.ToString() == "ARM0") + y = 178; + else if (listViewItem2.Tag.ToString() == "ARM1") + y = 228; + else if (listViewItem2.Tag.ToString() == "LEG0") + y = 193; + else if (listViewItem2.Tag.ToString() == "LEG1") + y = 213; + if ((int)double.Parse(listViewItem1.SubItems[1].Text) + (int)double.Parse(listViewItem1.SubItems[4].Text) - x > (int)double.Parse(listViewItem2.SubItems[1].Text) + (int)double.Parse(listViewItem2.SubItems[4].Text) + y && listViewItem2.Index + 1 < this.listViewBoxes.Items.Count + 1) { - int y = 0; - if (listViewItem2.Tag.ToString() == "HEAD") - y = displayBox.Width / 2; - else if (listViewItem2.Tag.ToString() == "BODY") - y = displayBox.Width / 2; - else if (listViewItem2.Tag.ToString() == "ARM0") - y = 178; - else if (listViewItem2.Tag.ToString() == "ARM1") - y = 228; - else if (listViewItem2.Tag.ToString() == "LEG0") - y = 193; - else if (listViewItem2.Tag.ToString() == "LEG1") - y = 213; - if ((int)double.Parse(listViewItem1.SubItems[1].Text) + (int)double.Parse(listViewItem1.SubItems[4].Text) - x > (int)double.Parse(listViewItem2.SubItems[1].Text) + (int)double.Parse(listViewItem2.SubItems[4].Text) + y && listViewItem2.Index + 1 < this.listViewBoxes.Items.Count + 1) - { - index = listViewItem2.Index + 1; - flag = true; - } + index = listViewItem2.Index + 1; + flag = true; } } - listViewItem1.SubItems[9].Text = "checked"; - checkedItems += 1; - if (flag == true) - { - ListViewItem listViewItem2 = (ListViewItem)listViewItem1.Clone(); - listViewBoxes.Items.Insert(index, listViewItem2); - if (listViewBoxes.SelectedItems.Count != 0) - { - //if (selected.Index == listViewItem1.Index) - //{ - // selected = listViewItem2; - //} - } - listViewItem1.Remove(); - } } - else + listViewItem1.SubItems[9].Text = "checked"; + checkedItems += 1; + if (flag == true) { - checkedItems += 1; + ListViewItem listViewItem2 = (ListViewItem)listViewItem1.Clone(); + listViewBoxes.Items.Insert(index, listViewItem2); + if (listViewBoxes.SelectedItems.Count != 0) + { + //if (selected.Index == listViewItem1.Index) + //{ + // selected = listViewItem2; + //} + } + listViewItem1.Remove(); } } - } while (checkedItems < listViewBoxes.Items.Count); - } + else + { + checkedItems += 1; + } + } + } while (checkedItems < listViewBoxes.Items.Count); + } } private void DrawGuideLines(Graphics g) @@ -834,14 +832,14 @@ namespace PckStudio bool isSide = direction == eViewDirection.left || direction == eViewDirection.right; if (!isSide) { - g.DrawLine(Pens.Red, 0, headbodyY + float.Parse(offsetHead.Text) * 5, displayBox.Width, headbodyY + float.Parse(offsetHead.Text) * 5); - g.DrawLine(Pens.Green, 0, headbodyY + float.Parse(offsetBody.Text) * 5, displayBox.Width, headbodyY + float.Parse(offsetBody.Text) * 5); - g.DrawLine(Pens.Blue, 0, headbodyY + float.Parse(offsetArms.Text) * 5, displayBox.Width, headbodyY + float.Parse(offsetArms.Text) * 5); - g.DrawLine(Pens.Purple, 0, legY + float.Parse(offsetLegs.Text) * 5, displayBox.Width, legY + float.Parse(offsetLegs.Text) * 5); + g.DrawLine(Pens.Red, 0, headbodyY + float.Parse(offsetHead.Text) * 5, displayBox.Width, headbodyY + float.Parse(offsetHead.Text) * 5); + g.DrawLine(Pens.Green, 0, headbodyY + float.Parse(offsetBody.Text) * 5, displayBox.Width, headbodyY + float.Parse(offsetBody.Text) * 5); + g.DrawLine(Pens.Blue, 0, headbodyY + float.Parse(offsetArms.Text) * 5, displayBox.Width, headbodyY + float.Parse(offsetArms.Text) * 5); + g.DrawLine(Pens.Purple, 0, legY + float.Parse(offsetLegs.Text) * 5, displayBox.Width, legY + float.Parse(offsetLegs.Text) * 5); } - g.DrawLine(Pens.Red, centerWidthPoint, 0, centerWidthPoint, displayBox.Height); - g.DrawLine(Pens.Blue, centerWidthPoint + 30, 0, centerWidthPoint + 30, displayBox.Height); - g.DrawLine(Pens.Blue, centerWidthPoint - 30, 0, centerWidthPoint - 30, displayBox.Height); + g.DrawLine(Pens.Red, centerWidthPoint, 0, centerWidthPoint, displayBox.Height); + g.DrawLine(Pens.Blue, centerWidthPoint + 30, 0, centerWidthPoint + 30, displayBox.Height); + g.DrawLine(Pens.Blue, centerWidthPoint - 30, 0, centerWidthPoint - 30, displayBox.Height); g.DrawLine(Pens.Purple, centerWidthPoint - 10, 0, centerWidthPoint - 10, displayBox.Height); g.DrawLine(Pens.Purple, centerWidthPoint + 10, 0, centerWidthPoint + 10, displayBox.Height); } @@ -880,7 +878,7 @@ namespace PckStudio //Loads Columns private void generateModel_Load(object sender, EventArgs e) { - if (Screen.PrimaryScreen.Bounds.Height >= 780 && Screen.PrimaryScreen.Bounds.Width >= 1080){ + if (Screen.PrimaryScreen.Bounds.Height >= 780 && Screen.PrimaryScreen.Bounds.Width >= 1080) { return; } render(); @@ -956,7 +954,7 @@ namespace PckStudio private void SizeYUpDown_ValueChanged(object sender, EventArgs e) { - if (listViewBoxes.SelectedItems.Count != 0 && + if (listViewBoxes.SelectedItems.Count != 0 && listViewBoxes.SelectedItems[0].Tag is ModelPart) { var part = listViewBoxes.SelectedItems[0].Tag as ModelPart; @@ -980,7 +978,7 @@ namespace PckStudio private void PosXUpDown_ValueChanged(object sender, EventArgs e) { - if (listViewBoxes.SelectedItems.Count != 0 && + if (listViewBoxes.SelectedItems.Count != 0 && listViewBoxes.SelectedItems[0].Tag is ModelPart) { var part = listViewBoxes.SelectedItems[0].Tag as ModelPart; @@ -993,7 +991,7 @@ namespace PckStudio private void PosYUpDown_ValueChanged(object sender, EventArgs e) { - if (listViewBoxes.SelectedItems.Count != 0 && + if (listViewBoxes.SelectedItems.Count != 0 && listViewBoxes.SelectedItems[0].Tag is ModelPart) { var part = listViewBoxes.SelectedItems[0].Tag as ModelPart; @@ -1124,6 +1122,7 @@ namespace PckStudio graphics.InterpolationMode = InterpolationMode.NearestNeighbor; } skinPreview.Image = bitmap1; + texturePreview.Image.Save(Application.StartupPath + "\\temp.png"); Close(); } @@ -1223,71 +1222,36 @@ namespace PckStudio { listViewBoxes.Items.Clear(); string str1 = File.ReadAllText(openFileDialog.FileName); - int x = 0; - foreach (string str2 in str1.Split("\n\r".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)) - ++x; - int y = x / 11; - ListView listView = new ListView(); - int num3 = 0; - do + + modelParts.Clear(); + List lines = str1.Split(new[] { "\n\r", "\n" }, StringSplitOptions.None).ToList(); + if (string.IsNullOrEmpty(lines[lines.Count - 1])) + lines.RemoveAt(lines.Count - 1); + int currentLine = 0; + int passedlines = 0; + for (int i = 0; i < lines.Count;) { - listView.Items.Add("BOX"); - ++num3; - } - while (num3 < y); - IEnumerator enumerator = listView.Items.GetEnumerator(); - try - { - label_33: - if (enumerator.MoveNext()) - { - ListViewItem current = (ListViewItem)enumerator.Current; - ListViewItem listViewItem = new ListViewItem(); - int num4 = 0; - do - { - foreach (string text in str1.Split("\n\r".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)) - { - ++num4; - if (num4 == 1 + 11 * current.Index) - listViewItem.Text = text; - else if (num4 == 2 + 11 * current.Index) - listViewItem.Tag = text; - else if (num4 == 4 + 11 * current.Index) - listViewItem.SubItems.Add(text); - else if (num4 == 5 + 11 * current.Index) - listViewItem.SubItems.Add(text); - else if (num4 == 6 + 11 * current.Index) - listViewItem.SubItems.Add(text); - else if (num4 == 7 + 11 * current.Index) - listViewItem.SubItems.Add(text); - else if (num4 == 8 + 11 * current.Index) - listViewItem.SubItems.Add(text); - else if (num4 == 9 + 11 * current.Index) - listViewItem.SubItems.Add(text); - else if (num4 == 10 + 11 * current.Index) - listViewItem.SubItems.Add(text); - else if (num4 == 11 + 11 * current.Index) - { - listViewItem.SubItems.Add(text); - listViewBoxes.Items.Add(listViewItem); - } - } - } - while (num4 < x); - goto label_33; - } - } - finally - { - IDisposable disposable = enumerator as IDisposable; - if (disposable != null) - disposable.Dispose(); + string name = lines[0 + passedlines]; + string parent = lines[1 + passedlines]; + float PosX = float.Parse(lines[3 + passedlines]); + float PosY = float.Parse(lines[4 + passedlines]); + float PosZ = float.Parse(lines[5 + passedlines]); + float SizeX = float.Parse(lines[6 + passedlines]); + float SizeY = float.Parse(lines[7 + passedlines]); + float SizeZ = float.Parse(lines[8 + passedlines]); + int UvX = int.Parse(lines[9 + passedlines]); + int UvY = int.Parse(lines[10 + passedlines]); + passedlines += 11; + i += 11; + modelParts.Add(new ModelPart(parent, PosX, PosY, PosZ, SizeX, SizeY, SizeZ, UvX, UvY)); } } + comboParent.Enabled = true; + updateListView(); render(); } + //Clones Item private void cloneToolStripMenuItem_Click(object sender, EventArgs e) { diff --git a/PCK-Studio/Forms/Skins-And-Textures/generateModel.resx b/PCK-Studio/Forms/Skins-And-Textures/generateModel.resx index e07040e4..25d00a81 100644 --- a/PCK-Studio/Forms/Skins-And-Textures/generateModel.resx +++ b/PCK-Studio/Forms/Skins-And-Textures/generateModel.resx @@ -610,7 +610,7 @@ myTablePanel2 - PckStudio.Forms.MyTablePanel, PCK Studio, Version=5.3.0.0, Culture=neutral, PublicKeyToken=null + PckStudio.Forms.MyTablePanel, PCK-Studio, Version=7.0.0.0, Culture=neutral, PublicKeyToken=null tabPage1 @@ -825,9 +825,6 @@ 30 - - False - Flat @@ -888,9 +885,6 @@ 25 - - False - Flat diff --git a/PCK-Studio/MainForm.Designer.cs b/PCK-Studio/MainForm.Designer.cs index 9517da39..71bc9a74 100644 --- a/PCK-Studio/MainForm.Designer.cs +++ b/PCK-Studio/MainForm.Designer.cs @@ -36,6 +36,7 @@ this.skinToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.createAnimatedTextureToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.audiopckToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.colourscolToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.importSkinsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.importSkinToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.importExtractedSkinsFolderToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -129,9 +130,8 @@ this.label11 = new MetroFramework.Controls.MetroLabel(); this.treeViewMain = new System.Windows.Forms.TreeView(); this.imageList = new System.Windows.Forms.ImageList(this.components); - this.pictureBoxImagePreview = new PckStudio.PictureBoxWithInterpolationMode(); this.LittleEndianCheckBox = new MetroFramework.Controls.MetroCheckBox(); - this.colourscolToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.pictureBoxImagePreview = new PckStudio.PictureBoxWithInterpolationMode(); this.contextMenuPCKEntries.SuspendLayout(); this.menuStrip.SuspendLayout(); this.contextMenuMetaTree.SuspendLayout(); @@ -198,6 +198,12 @@ this.audiopckToolStripMenuItem.Name = "audiopckToolStripMenuItem"; this.audiopckToolStripMenuItem.Click += new System.EventHandler(this.audiopckToolStripMenuItem_Click); // + // colourscolToolStripMenuItem + // + this.colourscolToolStripMenuItem.Name = "colourscolToolStripMenuItem"; + resources.ApplyResources(this.colourscolToolStripMenuItem, "colourscolToolStripMenuItem"); + this.colourscolToolStripMenuItem.Click += new System.EventHandler(this.colourscolToolStripMenuItem_Click); + // // importSkinsToolStripMenuItem // this.importSkinsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -724,7 +730,6 @@ // this.pckOpen.BackColor = System.Drawing.Color.Transparent; resources.ApplyResources(this.pckOpen, "pckOpen"); - this.pckOpen.Image = global::PckStudio.Properties.Resources.pckClosed; this.pckOpen.Name = "pckOpen"; this.pckOpen.TabStop = false; this.pckOpen.Click += new System.EventHandler(this.OpenPck_Click); @@ -942,15 +947,6 @@ resources.ApplyResources(this.imageList, "imageList"); this.imageList.TransparentColor = System.Drawing.Color.Transparent; // - // pictureBoxImagePreview - // - resources.ApplyResources(this.pictureBoxImagePreview, "pictureBoxImagePreview"); - this.pictureBoxImagePreview.BackColor = System.Drawing.Color.Transparent; - this.pictureBoxImagePreview.Image = global::PckStudio.Properties.Resources.NoImageFound; - this.pictureBoxImagePreview.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; - this.pictureBoxImagePreview.Name = "pictureBoxImagePreview"; - this.pictureBoxImagePreview.TabStop = false; - // // LittleEndianCheckBox // resources.ApplyResources(this.LittleEndianCheckBox, "LittleEndianCheckBox"); @@ -960,12 +956,13 @@ this.LittleEndianCheckBox.Theme = MetroFramework.MetroThemeStyle.Dark; this.LittleEndianCheckBox.UseSelectable = true; // - // colourscolToolStripMenuItem + // pictureBoxImagePreview // - this.colourscolToolStripMenuItem.Image = global::PckStudio.Properties.Resources.COL_ICON; - this.colourscolToolStripMenuItem.Name = "colourscolToolStripMenuItem"; - resources.ApplyResources(this.colourscolToolStripMenuItem, "colourscolToolStripMenuItem"); - this.colourscolToolStripMenuItem.Click += new System.EventHandler(this.colourscolToolStripMenuItem_Click); + resources.ApplyResources(this.pictureBoxImagePreview, "pictureBoxImagePreview"); + this.pictureBoxImagePreview.BackColor = System.Drawing.Color.Transparent; + this.pictureBoxImagePreview.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; + this.pictureBoxImagePreview.Name = "pictureBoxImagePreview"; + this.pictureBoxImagePreview.TabStop = false; // // MainForm // diff --git a/PCK-Studio/MainForm.resx b/PCK-Studio/MainForm.resx index f1625313..11cd1115 100644 --- a/PCK-Studio/MainForm.resx +++ b/PCK-Studio/MainForm.resx @@ -130,7 +130,7 @@ - 180, 22 + 167, 22 Folder @@ -152,7 +152,7 @@ - 180, 22 + 167, 22 Skin @@ -174,7 +174,7 @@ - 180, 22 + 167, 22 Animated Texture @@ -188,13 +188,13 @@ - 180, 22 + 167, 22 Audio.pck - 180, 22 + 167, 22 Colours.col @@ -213,6 +213,52 @@ Create + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xOdTWsmQAAAIkSURBVDhPpdLf + T1JxGMfxc1n8qtzcyglCWhFS1PLGHAgisDmktZZtabRSEYhDZ8xpiSWVpaSxLpoXyWquLvzV+oGZq+iy + /6Stm7qsm+DT830YMJw3rbO9Djs7z/P+wob03xcAyWbUwqLXotWgha1pDzPr1axl/y52uEHFrAY1z4l5 + sVsK0IK1UVMbaKQAOXhgN2tuKLHQTKtBh6M0XwmIxe1OtexjXZa9pA6dlnomlgXx7WoCo/1eTF3pwfRQ + gM3HLmD+Wh8yIwE8CgcwFznLJs67cLPPgeMmXW1gKRXCZjqGfCbBvi6kWH6OnoXMKFsd68fa2CW0Haqr + BpYnh5G7F8PGtIyV2yG2NhXHeuo6nioD5CI+pRMsG+nFYqSHVQKrt0LYKAcmhyCeX6Vklk0MsI9phQIK + Bfy07OfPSkAs/v7xDcViEd6OZ/C2LyOXHMb75Agtlk72nF6hdy/FEgrFP3yI2OVA7r6MXz+/04siPB3P + aXgJ75JhbFIgP5PAZwr42lcp8IJnioUCBcLVQHbQizfjQTr1Kj7cTbBIpw1R54mK/GwMXwjqaYWkzrVV + A4uDPry+QYGJIN7eUVjMcQyyvWrrQRxbM/GdA4+Dbjy57MJC0AmnUQ2XUYPZXjse+qvKi9vRHZLisUJx + WyB3m0sBkwZuvYr56A8j7LQs0B2S7LMg2n0EUY8ZdpMaDgo4mlSsq1lXo7w4fuZk6Sf861U5mS9J+gsp + e+98+xbVEAAAAABJRU5ErkJggg== + + + + 228, 22 + + + Import Skin + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xOdTWsmQAAAEnSURBVDhPYxgc + 4P8Chv8YeKWUIFSaMPi/W+r//1MapOGTOixQ7UADkCS05Xjh2FhFEIydtIT+22uJAsX4wBimFqod04Bt + nTn/9/YV/T82rQGM93YXAfkl/1eVRYPl8RqwuTnn/5aW3P8r69L+r67P+7+mIf//rIKo/7s7i/7PyfT9 + PzvTC78BW6AGrKpN+7+2IReM5xTF/N/VWQA0wAdogA8BA4Ca//7799/VauH/TdUZ/7dVp//fA7Td3XLV + //+iwNgBYXwGbCiP+7+5Oun/9qai/5n2+v+zHAzAeG9HDnEGTIl3/D8tzuG/owLP/w5f2/9dPrYIjWgY + qh3VgAJnrf+5Lhr/HRV5/jvLcoExNs0gDNWOagBeDNMM5UO1Ew8wbB4EgIEBABiEccKRdcoAAAAAAElF + TkSuQmCC + + + + 228, 22 + + + Import Extracted Skins Folder + + + 228, 22 + + + Add Texture + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO @@ -228,6 +274,78 @@ Import + + 222, 22 + + + Skin (.PNG) + + + 222, 22 + + + Cape (.PNG) + + + 222, 22 + + + Texture (.PNG) + + + 222, 22 + + + Languages File (.LOC) + + + 222, 22 + + + Game Rules File (.GRF) + + + 222, 22 + + + Music Cues File (audio.PCK) + + + 222, 22 + + + Colour Table File (.COL) + + + 222, 22 + + + Game Rules Header (.GRH) + + + 222, 22 + + + Skins PCK (.PCK) + + + 222, 22 + + + Models File (.BIN) + + + 222, 22 + + + Behaviours File (.BIN) + + + 222, 22 + + + Entity Materials File (.BIN) + 210, 22 @@ -342,7 +460,7 @@ Generate MipMap Texture - 211, 290 + 211, 268 contextMenuPCKEntries @@ -350,124 +468,6 @@ System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xOdTWsmQAAAIkSURBVDhPpdLf - T1JxGMfxc1n8qtzcyglCWhFS1PLGHAgisDmktZZtabRSEYhDZ8xpiSWVpaSxLpoXyWquLvzV+oGZq+iy - /6Stm7qsm+DT830YMJw3rbO9Djs7z/P+wob03xcAyWbUwqLXotWgha1pDzPr1axl/y52uEHFrAY1z4l5 - sVsK0IK1UVMbaKQAOXhgN2tuKLHQTKtBh6M0XwmIxe1OtexjXZa9pA6dlnomlgXx7WoCo/1eTF3pwfRQ - gM3HLmD+Wh8yIwE8CgcwFznLJs67cLPPgeMmXW1gKRXCZjqGfCbBvi6kWH6OnoXMKFsd68fa2CW0Haqr - BpYnh5G7F8PGtIyV2yG2NhXHeuo6nioD5CI+pRMsG+nFYqSHVQKrt0LYKAcmhyCeX6Vklk0MsI9phQIK - Bfy07OfPSkAs/v7xDcViEd6OZ/C2LyOXHMb75Agtlk72nF6hdy/FEgrFP3yI2OVA7r6MXz+/04siPB3P - aXgJ75JhbFIgP5PAZwr42lcp8IJnioUCBcLVQHbQizfjQTr1Kj7cTbBIpw1R54mK/GwMXwjqaYWkzrVV - A4uDPry+QYGJIN7eUVjMcQyyvWrrQRxbM/GdA4+Dbjy57MJC0AmnUQ2XUYPZXjse+qvKi9vRHZLisUJx - WyB3m0sBkwZuvYr56A8j7LQs0B2S7LMg2n0EUY8ZdpMaDgo4mlSsq1lXo7w4fuZk6Sf861U5mS9J+gsp - e+98+xbVEAAAAABJRU5ErkJggg== - - - - 228, 22 - - - Import Skin - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xOdTWsmQAAAEnSURBVDhPYxgc - 4P8Chv8YeKWUIFSaMPi/W+r//1MapOGTOixQ7UADkCS05Xjh2FhFEIydtIT+22uJAsX4wBimFqod04Bt - nTn/9/YV/T82rQGM93YXAfkl/1eVRYPl8RqwuTnn/5aW3P8r69L+r67P+7+mIf//rIKo/7s7i/7PyfT9 - PzvTC78BW6AGrKpN+7+2IReM5xTF/N/VWQA0wAdogA8BA4Ca//7799/VauH/TdUZ/7dVp//fA7Td3XLV - //+iwNgBYXwGbCiP+7+5Oun/9qai/5n2+v+zHAzAeG9HDnEGTIl3/D8tzuG/owLP/w5f2/9dPrYIjWgY - qh3VgAJnrf+5Lhr/HRV5/jvLcoExNs0gDNWOagBeDNMM5UO1Ew8wbB4EgIEBABiEccKRdcoAAAAAAElF - TkSuQmCC - - - - 228, 22 - - - Import Extracted Skins Folder - - - 228, 22 - - - Add Texture - - - 222, 22 - - - Skin (.PNG) - - - 222, 22 - - - Cape (.PNG) - - - 222, 22 - - - Texture (.PNG) - - - 222, 22 - - - Languages File (.LOC) - - - 222, 22 - - - Game Rules File (.GRF) - - - 222, 22 - - - Music Cues File (audio.PCK) - - - 222, 22 - - - Colour Table File (.COL) - - - 222, 22 - - - Game Rules Header (.GRH) - - - 222, 22 - - - Skins PCK (.PCK) - - - 222, 22 - - - Models File (.BIN) - - - 222, 22 - - - Behaviours File (.BIN) - - - 222, 22 - - - Entity Materials File (.BIN) - 17, 17 @@ -482,53 +482,6 @@ None - - 24, 44 - - - 1016, 24 - - - 2 - - - menuStrip1 - - - menuStrip - - - System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 3 - - - 37, 20 - - - File - - - - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAADuSURBVFhH7ZbB - CsMgEERDbv5A/v83e2jNTmCKGdegJk0heHgUn7vrKBQyxRj/iivJPM9WMTWjc45wJeAwhAghVJEG1nkl - XNkziLCvtteXphFCfQ08nOi+4kvTeFL1NfBQ/BLuefjS9NkAADOwPnpNX14UADBEaV4mNnkygN34Y/1v - AgeWZXll9So2eTLAEVm9ik2a7g1Qgn9t9bvFV/4gAOZdHgB1RPeUEeAZAeBr0d4R4JIACuqI7ikjwDMD - tDACNAfo/Sou0fQ9wGKvoQfO8i61W6SkTXi+XtLLgOwcFSna3It3c+LKO3HlfcRpBa3JBjU5E8DiAAAA - AElFTkSuQmCC - - - - 217, 22 - - - New - 151, 22 @@ -547,6 +500,23 @@ Mash-Up Pack + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAADuSURBVFhH7ZbB + CsMgEERDbv5A/v83e2jNTmCKGdegJk0heHgUn7vrKBQyxRj/iivJPM9WMTWjc45wJeAwhAghVJEG1nkl + XNkziLCvtteXphFCfQ08nOi+4kvTeFL1NfBQ/BLuefjS9NkAADOwPnpNX14UADBEaV4mNnkygN34Y/1v + AgeWZXll9So2eTLAEVm9ik2a7g1Qgn9t9bvFV/4gAOZdHgB1RPeUEeAZAeBr0d4R4JIACuqI7ikjwDMD + tDACNAfo/Sou0fQ9wGKvoQfO8i61W6SkTXi+XtLLgOwcFSna3It3c+LKO3HlfcRpBa3JBjU5E8DiAAAA + AElFTkSuQmCC + + + + 217, 22 + + + New + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO @@ -665,11 +635,11 @@ False - - 39, 20 + + 37, 20 - - Edit + + File False @@ -715,11 +685,11 @@ Convert to Bedrock - - 44, 20 + + 39, 20 - - Help + + Edit @@ -1261,20 +1231,6 @@ Binka Conversion - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAKdJREFUOE+1 - jzEKwzAQBNUEXKQIBOwifcgTUvkDbt2p9qP0Ev1E31FYkVXOx2FLRRYWi7NnTnZ/z/MxZPY7aguhbZlq - myQafL+ubRINshCwnO0kFqi3HkpwWOf7DkC1RBfvx9slV4ElscqbxBiz9/4nwOBIQjCEUL7FswhwDYAp - JVMiN0oYs/ILiCXRIGHOwVQBoiXsKSgjJdzaBMpQ0g3KEOoG++PcBx9PFJGNjU4vAAAAAElFTkSuQmCC - - - - 181, 22 - - - Tutorials - iVBORw0KGgoAAAANSUhEUgAACOAAAAaoCAYAAAAgNTafAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m @@ -21960,6 +21916,20 @@ How PCKs work + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAKdJREFUOE+1 + jzEKwzAQBNUEXKQIBOwifcgTUvkDbt2p9qP0Ev1E31FYkVXOx2FLRRYWi7NnTnZ/z/MxZPY7aguhbZlq + myQafL+ubRINshCwnO0kFqi3HkpwWOf7DkC1RBfvx9slV4ElscqbxBiz9/4nwOBIQjCEUL7FswhwDYAp + JVMiN0oYs/ILiCXRIGHOwVQBoiXsKSgjJdzaBMpQ0g3KEOoG++PcBx9PFJGNjU4vAAAAAElFTkSuQmCC + + + + 181, 22 + + + Tutorials + iVBORw0KGgoAAAANSUhEUgAABkAAAAZACAYAAAAhDI6nAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO @@ -23963,12 +23933,6 @@ FAQ - - 181, 22 - - - Buy a coffee - 253, 22 @@ -23987,6 +23951,12 @@ For MattNL (Other Developer) + + 181, 22 + + + Buy a coffee + 181, 22 @@ -25834,18 +25804,11 @@ Administrative Tools - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAAAuSURBVDhPY/j/ - /z9FGMYgFwwbA8gFcANARpEJho0B5AK4ASCjyATDyQAy8X8GAKAaUNpxMP6IAAAAAElFTkSuQmCC - + + 44, 20 - - 63, 20 - - - More + + Help @@ -28544,18 +28507,46 @@ Join Development Discord + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAAAuSURBVDhPY/j/ + /z9FGMYgFwwbA8gFcANARpEJho0B5AK4ASCjyATDyQAy8X8GAKAaUNpxMP6IAAAAAElFTkSuQmCC + + + + 63, 20 + + + More + + + 24, 44 + + + 1016, 24 + + + 2 + + + menuStrip1 + + + menuStrip + + + System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + 298, 17 - - 138, 70 - - - contextMenuMetaTree - - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO @@ -28599,6 +28590,15 @@ Delete Entry + + 138, 70 + + + contextMenuMetaTree + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + iVBORw0KGgoAAAANSUhEUgAAAbYAAAB7CAYAAAAYCKWuAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO @@ -29285,330 +29285,993 @@ 7 - - pckOpen - - - System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - openTab - - - 2 - - - label5 - - - MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - openTab - - - 3 - - - labelVersion - - - MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - openTab - - - 4 - - - ChangelogRichTextBox - - - System.Windows.Forms.RichTextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - openTab - - - 5 - - - 4, 38 - - - 18, 30, 20, 5 - - - 1016, 558 - - - 1 - - - openTab - - - MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - tabControl - - - 0 - - - None - - - Top, Right - - - True - - - 935, 252 - - - 0, 0 - - - 19 - - - labelImageSize - - - MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - editorTab - - - 2 - - - Top, Right - - - True - - - 913, 53 - - - 0, 0 - - - 17 - - - fileEntryCountLabel - - - MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - editorTab - - - 3 - - - Top, Bottom, Right - - - MetaTab - - - MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - PropertiesTabControl - - - 0 - - - 413, 277 - - - 596, 282 - - - 11 - - - PropertiesTabControl - - - MetroFramework.Controls.MetroTabControl, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - editorTab - - - 4 - - - True - - - True - - - 433, 71 - - - 0, 0 - - - 3 - - - label11 - - - MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - editorTab - - - 5 - - - Top, Bottom, Left, Right - - - False - - - 0 - - - 467, 14 - - - 32, 32 - - - 5, 50 - - - 0, 0, 0, 0 - - - 0 - - - 405, 501 - - - 10 - - - treeViewMain - - - System.Windows.Forms.TreeView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - editorTab - - - 6 - - - Top, Right - - - None - - - NoControl - - - 413, 50 - - - 231, 218 - - - Zoom - - - 18 - - - pictureBoxImagePreview - - - PckStudio.PictureBoxWithInterpolationMode, PCK-Studio, Version=7.0.0.0, Culture=neutral, PublicKeyToken=null - - - editorTab - - - 8 - - - 4, 38 - - - 5, 50, 5, 7 - - - 1016, 558 - - - 0 - - - editorTab - - - MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - tabControl - - - 1 - - - Fill - - - 20, 30 - - - 0, 0, 0, 0 - - - 1024, 600 - - - 0 - - - tabControl - - - MetroFramework.Controls.MetroTabControl, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - $this - - - 4 - None Left + + + iVBORw0KGgoAAAANSUhEUgAAA+gAAAPoCAYAAABNo9TkAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + wAAADsABataJCQAA5JlJREFUeF7sfQeYFFX2Pf/9re6uuusaEFHXiJIUEAQkhyGnIecsMIDDkEGCIlHJ + AiKIRAExK6hEJaOgKDkniQYUMGDcZf7nvKrXU9NTPdPdMyDgOd93prqrX913333v1dxTMZMgCIIgCIIg + CIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIg + CIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIg + CIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIg + CIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIg + CIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIg + CIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIg + CIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIg + CIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIg + CIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIg + CIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIg + CIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIg + CIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIg + CIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIg + CIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIg + CIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIg + CIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIg + CIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIg + CIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIg + CIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIg + CIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIg + CIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIg + CIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIg + CIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIg + CIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIg + CIIgCIIgCIIgCIIgCIIgCIIgCIIgCIJwEeD//QG80PDzIRpGAz87qTE98LOXFv9o+PmUHkYLP1vni5HC + z0ZajBR+NtJiJPDb/nwzI+FnPzVmNPzqiJaCIAiCIAjCRQSbpP3F5f/9gbQ+kOlNIL3be+361Rst0/LV + uz7a+tOqw8L7e7R1kcH1ZTT8/IzW13AYbnuCffKzdb4Y7KPXT++69Pj2R9URzPTYzwja+oP9TA3ectH6 + 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 + dDGdfAIAAC6XV96cl96f/Vv0f96k/s24JEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmS + JEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmS + JEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmS + JEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmS + JEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmS + JEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmS + JEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmS + JEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmS + JEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmS + JEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmS + JEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmS + JEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmS + JEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmS + JEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmS + JEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmS + JEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmS + JEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEkaR1dd9d+KresQDLQgcAAAAABJRU5ErkJggg== + + NoControl @@ -29732,105 +30395,90 @@ 5 - - metroLabel2 - - - MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - MetaTab - - - 2 - - - treeMeta - - - System.Windows.Forms.TreeView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - MetaTab - - - 3 - - - entryTypeTextBox - - - MetroFramework.Controls.MetroTextBox, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - MetaTab - - - 4 - - - entryDataTextBox - - - MetroFramework.Controls.MetroTextBox, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - MetaTab - - - 5 - - - buttonEdit - - - MetroFramework.Controls.MetroButton, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - MetaTab - - - 6 - - - metroLabel1 - - - MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - MetaTab - - - 7 - - + 4, 38 - - 3, 3, 3, 3 + + 18, 30, 20, 5 - - 588, 240 + + 1016, 558 - - 0 + + 1 - - Properties + + openTab - - MetaTab - - + MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - PropertiesTabControl + + tabControl - + 0 + + None + + + Top, Right + + + True + + + 935, 252 + + + 0, 0 + + + 19 + + + labelImageSize + + + MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + editorTab + + + 2 + + + Top, Right + + + True + + + 913, 53 + + + 0, 0 + + + 17 + + + fileEntryCountLabel + + + MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + editorTab + + + 3 + + + Top, Bottom, Right + Top, Right @@ -30032,6 +30680,207 @@ 7 + + 4, 38 + + + 3, 3, 3, 3 + + + 588, 240 + + + 0 + + + Properties + + + MetaTab + + + MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + PropertiesTabControl + + + 0 + + + 413, 277 + + + 596, 282 + + + 11 + + + PropertiesTabControl + + + MetroFramework.Controls.MetroTabControl, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + editorTab + + + 4 + + + True + + + True + + + 433, 71 + + + 0, 0 + + + 3 + + + label11 + + + MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + editorTab + + + 5 + + + Top, Bottom, Left, Right + + + False + + + 0 + + + 467, 14 + + + 32, 32 + + + 5, 50 + + + 0, 0, 0, 0 + + + 0 + + + 405, 501 + + + 10 + + + treeViewMain + + + System.Windows.Forms.TreeView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + editorTab + + + 6 + + + Top, Right + + + None + + + NoControl + + + 413, 50 + + + 231, 218 + + + Zoom + + + 18 + + + pictureBoxImagePreview + + + PckStudio.PictureBoxWithInterpolationMode, PCK-Studio, Version=7.0.0.0, Culture=neutral, PublicKeyToken=null + + + editorTab + + + 8 + + + 4, 38 + + + 5, 50, 5, 7 + + + 1016, 558 + + + 0 + + + editorTab + + + MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + tabControl + + + 1 + + + Fill + + + 20, 30 + + + 0, 0, 0, 0 + + + 1024, 600 + + + 0 + + + tabControl + + + MetroFramework.Controls.MetroTabControl, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + $this + + + 4 + Top, Right @@ -32583,6 +33432,9 @@ AP//AAA= + + NoControl + 1064, 660 @@ -32622,6 +33474,12 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + colourscolToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + importSkinsToolStripMenuItem @@ -33048,12 +33906,6 @@ System.Windows.Forms.ImageList, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - colourscolToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - MainForm diff --git a/PCK-Studio/PckStudio.csproj b/PCK-Studio/PckStudio.csproj index 1b992442..a51cd73b 100644 --- a/PCK-Studio/PckStudio.csproj +++ b/PCK-Studio/PckStudio.csproj @@ -138,6 +138,7 @@ + @@ -145,6 +146,8 @@ + + diff --git a/PCK-Studio/Resources/tileData.json b/PCK-Studio/Resources/tileData.json index e183ac85..b8a278e3 100644 --- a/PCK-Studio/Resources/tileData.json +++ b/PCK-Studio/Resources/tileData.json @@ -22,17 +22,17 @@ { "bedrock": "Bedrock" }, { "sand": "Sand" }, { "gravel": "Gravel" }, - { "log_oak": "Oak Log (Side)" }, - { "log_oak_top": "Oak Log (Top)" }, - { "iron_block": "Iron Block" }, - { "gold_block": "Gold Block" }, - { "diamond_block": "Diamond Block" }, - { "emerald_block": "Emerald Block" }, - { "redstone_block": "Redstone Block" }, + { "log_oak": "Oak Wood (Side)" }, + { "log_oak_top": "Oak Wood (Top)" }, + { "iron_block": "Block of Iron" }, + { "gold_block": "Block of Gold" }, + { "diamond_block": "Block of Diamond" }, + { "emerald_block": "Block of Emerald" }, + { "redstone_block": "Block of Redstone" }, { "dropper_front_horizontal": "Dropper (Front)" }, - { "mushroom_red": "Red Mushroom" }, - { "mushroom_brown": "Brown Mushroom" }, - { "sapling_jungle": "Jungle Sapling" }, + { "mushroom_red": "Mushroom (Red)" }, + { "mushroom_brown": "Mushroom (Brown)" }, + { "sapling_jungle": "Jungle Tree Sapling" }, { "fire_0": "Fire (Layer 1)" }, { "gold_ore": "Gold Ore" }, { "iron_ore": "Iron Ore" }, @@ -47,7 +47,7 @@ { "dropper_front_vertical": "Dropper (Vertical) (Front)" }, { "workbench_top": "Crafting Table (Top)" }, { "furnace_front": "Furnace (Front)" }, - { "furnace_side": "Furnace (Side)" }, + { "furnace_side": "Furnace/Dispenser/Dropper (Side)" }, { "dispenser_front": "Dispenser (Front)" }, { "fire_1": "Fire (Layer 2)" }, { "sponge": "Sponge" }, @@ -57,20 +57,20 @@ { "leaves": "Oak Leaves" }, { "leaves_opaque": "Oak Leaves (Opaque)" }, { "stonebrick": "Stone Bricks" }, - { "deadbush": "Dead Bush" }, + { "deadbush": "Dead Bush/Shrub" }, { "fern": "Fern" }, { "daylight_detector_top": "Daylight Sensor (Top)" }, { "daylight_detector_side": "Daylight Sensor (Side)" }, { "workbench_side": "Crafting Table (Side)" }, { "workbench_front": "Crafting Table (Front)" }, { "furnace_front_lit": "Furnace (Lit) (Front)" }, - { "furnace_top": "Furnace (Top)" }, + { "furnace_top": "Furnace/Dispenser/Dropper (Top)" }, { "sapling_spruce": "Spruce Sapling" }, { "wool_colored_white": "White Wool" }, { "mob_spawner": "Monster Spawner" }, { "snow": "Snow" }, { "ice": "Ice" }, - { "snow_side": "Grass Block (Snow) (Side)" }, + { "snow_side": "Grass Block (Snowy) (Side)" }, { "cactus_top": "Cactus (Top)" }, { "cactus_side": "Cactus (Side)" }, { "cactus_bottom": "Cactus (Bottom)" }, @@ -108,7 +108,7 @@ { "netherrack": "Netherrack" }, { "soul_sand": "Soul Sand" }, { "glowstone": "Glowstone" }, - { "piston_top_sticky": "Stick Piston (Top)" }, + { "piston_top_sticky": "Sticky Piston (Top)" }, { "piston_top": "Piston (Top)" }, { "piston_side": "Piston (Side)" }, { "piston_bottom": "Piston (Bottom)" }, @@ -118,17 +118,17 @@ { "wool_colored_black": "Black Wool" }, { "wool_colored_gray": "Gray Wool" }, { "redstone_torch_off": "Redstone Torch (Off)" }, - { "log_spruce": "Spruce Log (Side)" }, - { "log_birch": "Birch Log (Side)" }, + { "log_spruce": "Spruce Wood (Side)" }, + { "log_birch": "Birch Wood (Side)" }, { "pumpkin_side": "Pumpkin (Side)" }, - { "pumpkin_face_off": "Carved Pumpkin (Front)" }, - { "pumpkin_face_on": "Jack o'Lantern (Front)" }, + { "pumpkin_face_off": "Carved Pumpkin" }, + { "pumpkin_face_on": "Jack-O-Lantern" }, { "cake_top": "Cake (Top)" }, { "cake_side": "Cake (Side)" }, { "cake_inner": "Cake (Inside)" }, { "cake_bottom": "Cake (Bottom)" }, - { "mushroom_block_skin_red": "Mushroom Block (Red)" }, - { "mushroom_block_skin_brown": "Mushroom Block (Brown)" }, + { "mushroom_block_skin_red": "Mushroom (Red Block)" }, + { "mushroom_block_skin_brown": "Mushroom (Brown Block)" }, { "stem_bent": "Stem (Attached)" }, { "rail_normal": "Rail" }, { "wool_colored_red": "Red Wool" }, @@ -137,15 +137,15 @@ { "leaves_spruce": "Spruce Leaves" }, { "leaves_spruce_opaque": "Spruce Leaves (Opaque)" }, { "conduit_top": "Conduit (Break Particles)" }, - { "turtle_egg_hatch_0": "Turtle Egg (Stage 1)" }, + { "turtle_egg_hatch_0": "Sea Turtle Egg (Stage 1)" }, { "melon_side": "Melon (Side)" }, { "melon_top": "Melon (Top)" }, { "cauldron_top": "Cauldron (Top)" }, { "cauldron_inner": "Cauldron (Inside)" }, - { "sponge_wet": "Sponge (Wet)" }, - { "mushroom_block_skin_stem": "Mushroom Block (Stem)" }, - { "mushroom_block_inside": "Mushroom Block (Inside)" }, - { "vine": "Vine" }, + { "sponge_wet": "Wet Sponge" }, + { "mushroom_block_skin_stem": "Mushroom (Stem Block)" }, + { "mushroom_block_inside": "Mushroom (Inside Block)" }, + { "vine": "Vines" }, { "lapis_block": "Lapis Lazuli Block" }, { "wool_colored_green": "Green Wool" }, { "wool_colored_lime": "Lime Wool" }, @@ -153,9 +153,9 @@ { "glass_pane_top": "Glass Pane (Top)" }, { "chest_top": "Chest (Break Particles)" }, { "ender_chest_top": "Ender Chest (Break Particles)" }, - { "turtle_egg_hatch_1": "Turtle Egg (Stage 2)" }, - { "turtle_egg_hatch_2": "Turtle Egg (Stage 3)" }, - { "log_jungle": "Jungle Log (Side)" }, + { "turtle_egg_hatch_1": "Sea Turtle Egg (Stage 2)" }, + { "turtle_egg_hatch_2": "Sea Turtle Egg (Stage 3)" }, + { "log_jungle": "Jungle Wood (Side)" }, { "cauldron_side": "Cauldron (Side)" }, { "cauldron_bottom": "Cauldron (Bottom)" }, { "brewing_stand_base": "Brewing Stand (Base)" }, @@ -193,7 +193,7 @@ { "comparator_on": "Redstone Comparator (On)" }, { "rail_activator": "Activator Rail" }, { "rail_activator_powered": "Activator Rail (On)" }, - { "quartz_ore": "Quartz Ore" }, + { "quartz_ore": "Nether Quartz Ore" }, { "sandstone_side": "Sandstone (Side)" }, { "wool_colored_purple": "Purple Wool" }, { "wool_colored_magenta": "Magenta Wool" }, @@ -221,7 +221,7 @@ { "anvil_top_damaged_1": "Anvil (Slightly Damaged) (Top)" }, { "quartz_block_chiseled_top": "Chiseled Quartz Block (Top)" }, { "quartz_block_lines_top": "Pillar Quartz Block (Top)" }, - { "quartz_block_top": "Quartz Block (Top)" }, + { "quartz_block_top": "Block of Quartz (Top)" }, { "hopper_outside": "Hopper (Side)" }, { "detectorRail_on": "Detector Rail (On)" }, { "": "" }, @@ -237,7 +237,7 @@ { "anvil_top_damaged_2": "Anvil (Very Damaged) (Top)" }, { "quartz_block_chiseled": "Chiseled Quartz Block (Side)" }, { "quartz_block_lines": "Pillar Quartz Block (Side)" }, - { "quartz_block_side": "Quartz Block (Side)" }, + { "quartz_block_side": "Block of Quartz (Side)" }, { "hopper_inside": "Hopper (Inside)" }, { "lava": "Lava" }, { "lava_flow": "Flowing Lava" }, @@ -252,28 +252,28 @@ { "destroy_7": "Destroy (Stage 8)" }, { "destroy_8": "Destroy (Stage 9)" }, { "destroy_9": "Destroy (Stage 10)" }, - { "hay_block_side": "Hay Block (Side)" }, + { "hay_block_side": "Hay Bale (Side)" }, { "quartz_block_bottom": "Quartz Block (Bottom)" }, { "hopper_top": "Hopper (Top)" }, - { "hay_block_top": "Hay Block (Top)" }, + { "hay_block_top": "Hay Bale (Top)" }, { "": "" }, { "": "" }, - { "coal_block": "Coal Block" }, + { "coal_block": "Block of Coal" }, { "hardened_clay": "Terracotta" }, { "noteblock": "Note Block" }, { "stone_andesite": "Andesite" }, - { "stone_andesite_smooth": "Smooth Andesite" }, + { "stone_andesite_smooth": "Polished Andesite" }, { "stone_diorite": "Diorite" }, - { "stone_diorite_smooth": "Smooth Diorite" }, + { "stone_diorite_smooth": "Polished Diorite" }, { "stone_granite": "Granite" }, - { "stone_granite_smooth": "Smooth Granite" }, + { "stone_granite_smooth": "Polished Granite" }, { "potatoes_stage_0": "Potatoes (Stage 1)" }, { "potatoes_stage_1": "Potatoes (Stage 2)" }, { "potatoes_stage_2": "Potatoes (Stage 3)" }, { "potatoes_stage_3": "Potatoes (Stage 4)" }, - { "log_spruce_top": "Spruce Log (Top)" }, - { "log_jungle_top": "Jungle Log (Top)" }, - { "log_birch_top": "Birch Log (Top)" }, + { "log_spruce_top": "Spruce Wood (Top)" }, + { "log_jungle_top": "Jungle Wood (Top)" }, + { "log_birch_top": "Birch Wood (Top)" }, { "hardened_clay_stained_black": "Black Terracotta" }, { "hardened_clay_stained_blue": "Blue Terracotta" }, { "hardened_clay_stained_brown": "Brown Terracotta" }, @@ -330,8 +330,8 @@ { "flower_tulip_orange": "Orange Tulip" }, { "double_plant_sunflower_top": "Sunflower (Top)" }, { "double_plant_sunflower_front": "Sunflower (Front)" }, - { "log_acacia": "Acacia Log (Side)" }, - { "log_acacia_top": "Acacia Log (Top)" }, + { "log_acacia": "Acacia Wood (Side)" }, + { "log_acacia_top": "Acacia Wood (Top)" }, { "planks_acacia": "Acacia Planks" }, { "leaves_acacia": "Acacia Leaves" }, { "leaves_acacia_fast": "Acacia Leaves (Opaque)" }, @@ -346,8 +346,8 @@ { "flower_tulip_pink": "Pink Tulip" }, { "double_plant_sunflower_bottom": "Sunflower (Bottom)" }, { "double_plant_sunflower_back": "Sunflower (Back)" }, - { "log_big_oak": "Dark Oak Log (Side)" }, - { "log_big_oak_top": "Dark Oak Log (Top)" }, + { "log_big_oak": "Dark Oak Wood (Side)" }, + { "log_big_oak_top": "Dark Oak Wood (Top)" }, { "planks_big_oak": "Dark Oak Planks" }, { "leaves_big_oak": "Dark Oak Leaves" }, { "leaves_big_oak_fast": "Dark Oak Leaves (Opaque)" }, @@ -378,7 +378,7 @@ { "chorus_flower": "Chorus Flower" }, { "chorus_flower_dead": "Chorus Flower (Dead)" }, { "chorus_flower_plant": "Chorus Plant" }, - { "end_bricks": "End Bricks" }, + { "end_bricks": "End Stone Bricks" }, { "grass_path_side": "Grass Path (Side)" }, { "grass_path_top": "Grass Path (Top)" }, { "barrier": "Barrier" }, @@ -388,7 +388,7 @@ { "iron_trapdoor": "Iron Trapdoor" }, { "door_acacia_lower": "Acacia Door (Lower)" }, { "door_birch_lower": "Birch Door (Lower)" }, - { "door_dark_oak_lower": "Dark Door (Lower)" }, + { "door_dark_oak_lower": "Dark Oak Door (Lower)" }, { "door_jungle_lower": "Jungle Door (Lower)" }, { "door_spruce_lower": "Spruce Door (Lower)" }, { "purpur_block": "Purpur Block" }, @@ -426,7 +426,7 @@ { "observer_side": "Observer (Side)" }, { "observer_back": "Observer (Back)" }, { "observer_back_lit": "Observer (On) (Back)" }, - { "observer_top": "Observer (Top)" }, + { "observer_top": "Observer (Top and Bottom)" }, { "goldRing": "Gold Score Ring" }, { "emeraldRing": "Emerald Score Ring" }, { "structure_block": "Structure Block" }, @@ -482,7 +482,7 @@ { "glazed_terracotta_silver": "Light Gray Glazed Terracotta" }, { "glazed_terracotta_white": "White Glazed Terracotta" }, { "glazed_terracotta_yellow": "Yellow Glazed Terracotta" }, - { "shulker_top": "Shulker (Break Particles)" }, + { "shulker_top": "Shulker Box (Break Particles)" }, { "": "" }, { "cauldron_water": "Cauldron Water" }, { "seagrass_doubletall_top": "Double Tall Seagrass (Top)" }, @@ -502,11 +502,11 @@ { "dried_kelp_side": "Dried Kelp Block (Side)" }, { "seagrass_carried": "Seagrass (Item)" }, { "seagrass_doubletall_bottom": "Double Tall Seagrass (Bottom)" }, - { "coral_blue_dead": "Tube Coral" }, - { "coral_purple_dead": "Bubble Coral" }, - { "coral_pink_dead": "Brain Coral" }, - { "coral_red_dead": "Fire Coral" }, - { "coral_yellow_dead": "Horn Coral" }, + { "coral_blue_dead": "Dead Tube Coral Block" }, + { "coral_purple_dead": "Dead Bubble Coral Block" }, + { "coral_pink_dead": "Dead Brain Coral Block" }, + { "coral_red_dead": "Dead Fire Coral Block" }, + { "coral_yellow_dead": "Dead Horn Coral Block" }, { "coral_fan_blue": "Tube Coral Fan" }, { "coral_fan_purple": "Bubble Coral Fan" }, { "coral_fan_pink": "Brain Coral Fan" }, @@ -514,7 +514,7 @@ { "coral_fan_yellow": "Horn Coral Fan" }, { "coral_layered_top_red": "Fire Coral (Overlay)" }, { "coral_layered_top_yellow": "Horn Coral (Overlay)" }, - { "kelp_a": "Kelp Plant (Bottom)" }, + { "kelp_a": "Kelp (Bottom)" }, { "": "" }, { "": "" }, { "": "" }, @@ -523,11 +523,11 @@ { "": "" }, { "": "" }, { "seagrass": "Seagrass" }, - { "coral_fan_blue_dead": "Tube Coral Fan (Dead)" }, - { "coral_fan_purple_dead": "Bubble Coral Fan (Dead)" }, - { "coral_fan_pink_dead": "Brain Coral Fan (Dead)" }, - { "coral_fan_red_dead": "Red Coral Fan (Dead)" }, - { "coral_fan_yellow_dead": "Horn Coral Fan (Dead)" }, + { "coral_fan_blue_dead": "Dead Tube Coral Fan" }, + { "coral_fan_purple_dead": "Dead Bubble Coral Fan" }, + { "coral_fan_pink_dead": "Dead Brain Coral Fan" }, + { "coral_fan_red_dead": "Dead Fire Coral Fan" }, + { "coral_fan_yellow_dead": "Dead Horn Coral Fan" }, { "": "" }, { "spruce_trapdoor": "Spruce Trapdoor" }, { "stripped_log_oak": "Stripped Oak Log (Side)" }, @@ -548,7 +548,7 @@ { "jungle_trapdoor": "Jungle Trapdoor" } ], "items": [ - { "helmetCloth": "Leather Helmet" }, + { "helmetCloth": "Leather Cap" }, { "helmetChain": "Chain Helmet" }, { "helmetIron": "Iron Helmet" }, { "helmetDiamond": "Diamond Helmet" }, @@ -564,7 +564,7 @@ { "sugar": "Sugar" }, { "snowball": "Snowball" }, { "elytra": "Elytra" }, - { "chestplateCloth": "Leather Chestplate" }, + { "chestplateCloth": "Leather Tunic" }, { "chestplateChain": "Chain Chestplate" }, { "chestplateIron": "Iron Chestplate" }, { "chestplateDiamond": "Diamond Chestplate" }, @@ -580,7 +580,7 @@ { "cake": "Cake" }, { "slimeball": "Slimeball" }, { "broken_elytra": "Elytra (Broken)" }, - { "leggingsCloth": "Leather Leggings" }, + { "leggingsCloth": "Leather Pants" }, { "leggingsChain": "Chain Leggings" }, { "leggingsIron": "Iron Leggings" }, { "leggingsDiamond": "Diamond Leggings" }, @@ -594,7 +594,7 @@ { "doorWood": "Oak Door" }, { "doorIron": "Iron Door" }, { "bed": "Bed" }, - { "fireball": "Fireball" }, + { "fireball": "Fire Charge" }, { "chorus_fruit": "Chorus Fruit" }, { "bootsCloth": "Leather Boots" }, { "bootsChain": "Chain Boots" }, @@ -611,7 +611,7 @@ { "map": "Map" }, { "seeds_pumpkin": "Pumpkin Seeds" }, { "seeds_melon": "Melon Seeds" }, - { "chorus_fruit_popped": "Chorus Fruit (Popped)" }, + { "chorus_fruit_popped": "Popped Chorus Fruit" }, { "swordWood": "Wooden Sword" }, { "swordStone": "Stone Sword" }, { "swordIron": "Iron Sword" }, @@ -625,7 +625,7 @@ { "bucket": "Bucket" }, { "bucketWater": "Water Bucket" }, { "bucketLava": "Lava Bucket" }, - { "milk": "Milk" }, + { "milk": "Milk Bucket" }, { "dyePowder_black": "Ink Sac" }, { "dyePowder_gray": "Gray Dye" }, { "shovelWood": "Wooden Shovel" }, @@ -654,10 +654,10 @@ { "leather": "Leather" }, { "saddle": "Saddle" }, { "beefRaw": "Raw Beef" }, - { "beefCooked": "Cooked Beef" }, + { "beefCooked": "Steak" }, { "enderPearl": "Ender Pearl" }, { "blazeRod": "Blaze Rod" }, - { "melon": "Melon" }, + { "melon": "Melon Slice" }, { "dyePowder_green": "Cactus Green" }, { "dyePowder_lime": "Lime Dye" }, { "hatchetWood": "Wooden Axe" }, @@ -674,8 +674,8 @@ { "ghastTear": "Ghast Tear" }, { "goldNugget": "Gold Nugget" }, { "netherStalkSeeds": "Nether Wart" }, - { "dyePowder_brown": "Brown Dye" }, - { "dyePowder_yellow": "Yellow Dye" }, + { "dyePowder_brown": "Cocoa Beans" }, + { "dyePowder_yellow": "Dandelion Yellow" }, { "hoeWood": "Wooden Hoe" }, { "hoeStone": "Stone Hoe" }, { "hoeIron": "Iron Hoe" }, @@ -684,15 +684,15 @@ { "bow_pull_2": "Bow (Pulling Stage 3)" }, { "potatoPoisonous": "Poisonous Potato" }, { "minecart": "Minecart" }, - { "boat": "Boat" }, - { "speckledMelon": "Speckled Melon" }, + { "boat": "Oak Boat" }, + { "speckledMelon": "Glistering Melon" }, { "fermentedSpiderEye": "Fermented Spider Eye" }, { "spiderEye": "Spider Eye" }, { "glassBottle": "Glass Bottle" }, { "potion_contents": "Potion (Overlay)" }, { "dyePowder_blue": "Lapis Lazuli" }, { "dyePowder_light_blue": "Light Blue Dye" }, - { "helmetCloth_overlay": "Leather Helmet (Overlay)" }, + { "helmetCloth_overlay": "Leather Cap (Overlay)" }, { "spectral_arrow": "Spectral Arrow" }, { "iron_horse_armor": "Iron Horse Armor" }, { "diamond_horse_armor": "Diamond Horse Armor" }, @@ -708,23 +708,23 @@ { "blazePowder": "Blaze Powder" }, { "dyePowder_purple": "Purple Dye" }, { "dyePowder_magenta": "Magenta Dye" }, - { "chestplateCloth_overlay": "Leather Chestplate (Overlay)" }, + { "chestplateCloth_overlay": "Leather Tunic (Overlay)" }, { "tipped_arrow_base": "Tipped Arrow" }, { "dragon_breath": "Dragon's Breath" }, { "name_tag": "Name Tag" }, { "lead": "Lead" }, { "netherbrick": "Nether Brick" }, - { "fish_clownfish_raw": "Clownfish" }, + { "fish_clownfish_raw": "Tropical Fish" }, { "minecart_furnace": "Minecart with Furnace" }, { "charcoal": "Charcoal" }, { "monsterPlacer_overlay": "Spawn Egg (Overlay)" }, { "bed_overlay": "Bed (Overlay)" }, - { "expBottle": "Experience Bottle" }, + { "expBottle": "Bottle o'Enchanting" }, { "brewingStand": "Brewing Stand" }, { "magmaCream": "Magma Cream" }, { "dyePowder_cyan": "Cyan Dye" }, { "dyePowder_orange": "Orange Dye" }, - { "leggingsCloth_overlay": "Leather Leggings (Overlay)" }, + { "leggingsCloth_overlay": "Leather Pants (Overlay)" }, { "tipped_arrow_head": "Tipped Arrow (Overlay)" }, { "potion_bottle_lingering": "Lingering Potion" }, { "": "" }, @@ -739,7 +739,7 @@ { "writtenBook": "Written Book" }, { "flowerPot": "Flower Pot" }, { "dyePowder_silver": "Light Gray Dye" }, - { "dyePowder_white": "White Dye" }, + { "dyePowder_white": "Bone Meal" }, { "bootsCloth_overlay": "Leather Boots (Overlay)" }, { "beetroot": "Beetroot" }, { "beetroot_seeds": "Beetroot Seeds" }, @@ -777,7 +777,7 @@ { "totem": "Totem of Undying" }, { "shulker_shell": "Shulker Shell" }, { "iron_nugget": "Iron Nugget" }, - { "rabbit_foot": "Rabbit Foot" }, + { "rabbit_foot": "Rabbit's Foot" }, { "rabbit_hide": "Rabbit Hide" }, { "compassP0": "" }, { "compassP1": "" }, @@ -816,7 +816,7 @@ { "sea_pickle": "Sea Pickle" }, { "nautilus": "Nautilus Shell" }, { "nautilus_core": "Heart of the Sea" }, - { "turtle_helmet": "Turtle Helmet" }, + { "turtle_helmet": "Turtle Shell" }, { "turtle_shell_piece": "Scute" }, { "trident": "Trident" }, { "phantom_membrane": "Phantom Membrane" } diff --git a/README.md b/README.md index 1ae87394..7818aaac 100644 --- a/README.md +++ b/README.md @@ -60,4 +60,4 @@ $ cd "-PCK-Studio" * [jam1garner](https://github.com/jam1garner) ### Other Credits -* [yaboiFoxx]() for Improved UI concept +* [yaboiFoxx](https://github.com/yaboiFoxx) for Improved UI concept