diff --git a/MinecraftUSkinEditor/Classes/FileTypes/PCKFile.cs b/MinecraftUSkinEditor/Classes/FileTypes/PCKFile.cs index 3269c5ca..0def1f02 100644 --- a/MinecraftUSkinEditor/Classes/FileTypes/PCKFile.cs +++ b/MinecraftUSkinEditor/Classes/FileTypes/PCKFile.cs @@ -7,8 +7,7 @@ namespace PckStudio.Classes.FileTypes public class PCKFile { public int type { get; } - public List meta_data { get; } = new List(); - public List file_entries { get; } = new List(); + public List Files { get; } = new List(); public class FileData { @@ -20,12 +19,12 @@ namespace PckStudio.Classes.FileTypes DLCTextureFile = 2, // *.png DLCUIDataFile = 3, // *.fui ???? // DLCInfoFile = 4, // "0" file - // DLCTexturePackInfoFile = 5, // x16Info.pck + // DLCTexturePackInfoFile = 5, // (x16|x32|...)Info.pck DLCLocalisationFile = 6, // languages.loc/localisation.loc - DLCGameRulesFile = 7, // *.grf + DLCGameRulesFile = 7, // GameRiles.grf DLCAudioFile = 8, // audio.pck DLCColourTableFile = 9, // colours.col - DLCGameRulesHeader = 10, // *.grh + DLCGameRulesHeader = 10, // GameRiles.grh DLCSkinDataFile = 11, // *.pck made up name -Miku DLCModelsFile = 12, // models.bin DLCBehavioursFile = 13, // behaviours.bin @@ -74,16 +73,16 @@ namespace PckStudio.Classes.FileTypes this.type = type; } - public void ValidateMeta() + public List GatherMetaTags() { - file_entries.ForEach(file => - { - file.properties.ForEach(pair => + var LUT = new List(); + Files.ForEach(file => file.properties.ForEach(pair => { - if (!meta_data.Contains(pair.Item1)) - meta_data.Add(pair.Item1); - }); - }); + if (!LUT.Contains(pair.Item1)) + LUT.Add(pair.Item1); + }) + ); + return LUT; } public bool HasFile(string name, int type) @@ -93,7 +92,7 @@ namespace PckStudio.Classes.FileTypes public FileData GetFile(string name, int type) { - foreach (var file in file_entries) + foreach (var file in Files) { if (file.name == name && file.type == type) return file; diff --git a/MinecraftUSkinEditor/Classes/IO/PCK/PCKFileReader.cs b/MinecraftUSkinEditor/Classes/IO/PCK/PCKFileReader.cs index 3f1cc441..f1cb4a9b 100644 --- a/MinecraftUSkinEditor/Classes/IO/PCK/PCKFileReader.cs +++ b/MinecraftUSkinEditor/Classes/IO/PCK/PCKFileReader.cs @@ -11,6 +11,7 @@ namespace PckStudio.Classes.IO internal class PCKFileReader : StreamDataReader { internal PCKFile _file; + internal List LUT; public static PCKFile Read(Stream stream, bool isLittleEndian) { @@ -24,22 +25,23 @@ namespace PckStudio.Classes.IO private PCKFile ReadFileFromStream(Stream stream) { _file = new PCKFile(ReadInt(stream)); - ReadMetaData(stream); + ReadLookUpTabel(stream); ReadFileEntries(stream); + ReadFileContents(stream); return _file; } - internal void ReadMetaData(Stream stream) + internal void ReadLookUpTabel(Stream stream) { - int meta_entry_count = ReadInt(stream); - _file.meta_data.Capacity = meta_entry_count; - for (; 0 < meta_entry_count; meta_entry_count--) + int count = ReadInt(stream); + LUT = new List(count); + for (int i = 0; i < count; i++) { int index = ReadInt(stream); string value = ReadString(stream); - _file.meta_data.Insert(index, value); + LUT.Insert(index, value); } - if (_file.meta_data.Contains("XMLVERSION")) + if (LUT.Contains("XMLVERSION")) Console.WriteLine(ReadInt(stream)); // xml version num ?? } @@ -52,21 +54,21 @@ namespace PckStudio.Classes.IO int file_type = ReadInt(stream); string name = ReadString(stream); var entry = new PCKFile.FileData(name, file_type, file_size); - _file.file_entries.Add(entry); + _file.Files.Add(entry); } - foreach (var file_entry in _file.file_entries) - { + } + internal void ReadFileContents(Stream stream) + { + _file.Files.ForEach( file => { int property_count = ReadInt(stream); for (; 0 < property_count; property_count--) { - int index = ReadInt(stream); - string key = _file.meta_data[index]; + string key = LUT[ReadInt(stream)]; string value = ReadString(stream); - file_entry.properties.Add(new ValueTuple(key, value)); + file.properties.Add((key, value)); } - // file data buffer is only allocated when FileData is constructed with `dataSize` - stream.Read(file_entry.data, 0, file_entry.size); - } + stream.Read(file.data, 0, file.size); + }); } internal string ReadString(Stream stream) { diff --git a/MinecraftUSkinEditor/Classes/IO/PCK/PCKFileWriter.cs b/MinecraftUSkinEditor/Classes/IO/PCK/PCKFileWriter.cs index 8e21ea33..a00ee7d3 100644 --- a/MinecraftUSkinEditor/Classes/IO/PCK/PCKFileWriter.cs +++ b/MinecraftUSkinEditor/Classes/IO/PCK/PCKFileWriter.cs @@ -11,7 +11,8 @@ namespace PckStudio.Classes.IO { internal class PCKFileWriter : StreamDataWriter { - internal PCKFile _file; + internal PCKFile _pckfile; + internal List LUT = new List(); public static void Write(Stream stream, PCKFile file, bool isLittleEndian) { @@ -20,14 +21,16 @@ namespace PckStudio.Classes.IO private PCKFileWriter(PCKFile file, bool isLittleEndian) : base(isLittleEndian) { - _file = file; + _pckfile = file; + LUT = _pckfile.GatherMetaTags(); } private void WriteToStream(Stream stream) { - WriteInt(stream, _file.type); - WriteMetaEntries(stream); + WriteInt(stream, _pckfile.type); + WriteLookUpTable(stream); WriteFileEntries(stream); + WriteFileContents(stream); } internal void WriteString(Stream stream, string s) @@ -37,40 +40,43 @@ namespace PckStudio.Classes.IO WriteInt(stream, 0); // padding } - internal void WriteMetaEntries(Stream stream) + internal void WriteLookUpTable(Stream stream) { - WriteInt(stream, _file.meta_data.Count); - _file.meta_data.ForEach(entry => + WriteInt(stream, LUT.Count); + LUT.ForEach(entry => { - WriteInt(stream, _file.meta_data.IndexOf(entry)); + WriteInt(stream, LUT.IndexOf(entry)); WriteString(stream, entry); }); - if (_file.meta_data.Contains("XMLVERSION")) + if (LUT.Contains("XMLVERSION")) WriteInt(stream, 0x1337); // :^) } internal void WriteFileEntries(Stream stream) { - WriteInt(stream, _file.file_entries.Count); - foreach (var entry in _file.file_entries) + WriteInt(stream, _pckfile.Files.Count); + foreach (var file in _pckfile.Files) { - WriteInt(stream, entry.size); - WriteInt(stream, entry.type); - WriteString(stream, entry.name); - } - foreach (var entry in _file.file_entries) - { - WriteInt(stream, entry.properties.Count); - foreach (var property in entry.properties) - { - if (!_file.meta_data.Contains(property.Item1)) - throw new Exception("Tag not in Meta: " + property.Item1); - WriteInt(stream, _file.meta_data.IndexOf(property.Item1)); - WriteString(stream, property.Item2); - } - stream.Write(entry.data, 0, entry.size); + WriteInt(stream, file.size); + WriteInt(stream, file.type); + WriteString(stream, file.name); + } + } + + internal void WriteFileContents(Stream stream) + { + foreach (var file in _pckfile.Files) + { + WriteInt(stream, file.properties.Count); + foreach (var property in file.properties) + { + if (!LUT.Contains(property.Item1)) + throw new Exception("Tag not in Look Up Table: " + property.Item1); + WriteInt(stream, LUT.IndexOf(property.Item1)); + WriteString(stream, property.Item2); + } + WriteBytes(stream, file.data, file.size); } } - } } diff --git a/MinecraftUSkinEditor/Forms/Editor/LOCEditor.cs b/MinecraftUSkinEditor/Forms/Editor/LOCEditor.cs index 021a22cf..cd2b2800 100644 --- a/MinecraftUSkinEditor/Forms/Editor/LOCEditor.cs +++ b/MinecraftUSkinEditor/Forms/Editor/LOCEditor.cs @@ -35,7 +35,7 @@ namespace PckStudio.Forms.Editor private void LOCEditor_Load(object sender, EventArgs e) { RPC.SetPresence("LOC Editor", "Editing loc File."); - foreach(string locKey in currentLoc.keys.Keys) + foreach(string locKey in currentLoc.LocKeys.Keys) treeViewLocKeys.Nodes.Add(locKey); } @@ -48,14 +48,14 @@ namespace PckStudio.Forms.Editor { var node = e.Node; if (node == null || - !currentLoc.keys.ContainsKey(node.Text)) + !currentLoc.LocKeys.ContainsKey(node.Text)) { MessageBox.Show("Selected Node does not seem to be in the loc file"); return; } tbl.Rows.Clear(); buttonReplaceAll.Enabled = true; - foreach (var l in currentLoc.keys[node.Text]) + foreach (var l in currentLoc.LocKeys[node.Text]) tbl.Rows.Add(l.Key, l.Value); } @@ -76,7 +76,7 @@ namespace PckStudio.Forms.Editor private void addDisplayIDToolStripMenuItem_Click(object sender, EventArgs e) { if (treeViewLocKeys.SelectedNode != null && - !currentLoc.keys.ContainsKey(treeViewLocKeys.SelectedNode.Text)) + !currentLoc.LocKeys.ContainsKey(treeViewLocKeys.SelectedNode.Text)) using (RenamePrompt prompt = new RenamePrompt("")) { prompt.OKButton.Text = "Add"; @@ -91,8 +91,8 @@ namespace PckStudio.Forms.Editor private void deleteDisplayIDToolStripMenuItem_Click(object sender, EventArgs e) { if(treeViewLocKeys.SelectedNode != null && - currentLoc.keys.ContainsKey(treeViewLocKeys.SelectedNode.Text) && - currentLoc.keys.Remove(treeViewLocKeys.SelectedNode.Text)) + currentLoc.LocKeys.ContainsKey(treeViewLocKeys.SelectedNode.Text) && + currentLoc.LocKeys.Remove(treeViewLocKeys.SelectedNode.Text)) { treeViewLocKeys.SelectedNode.Remove(); wasModified = true; diff --git a/MinecraftUSkinEditor/Forms/Skins-And-Textures/AdvancedOptions.cs b/MinecraftUSkinEditor/Forms/Skins-And-Textures/AdvancedOptions.cs index d2ed1050..efa0fb73 100644 --- a/MinecraftUSkinEditor/Forms/Skins-And-Textures/AdvancedOptions.cs +++ b/MinecraftUSkinEditor/Forms/Skins-And-Textures/AdvancedOptions.cs @@ -20,13 +20,6 @@ namespace PckStudio { InitializeComponent(); currentPCK = currentPCKIn; - - FormBorderStyle = FormBorderStyle.None; - } - - private void AdvancedOptions_Load(object sender, EventArgs e) - { - } private void addEntryToolStripMenuItem_Click(object sender, EventArgs e) @@ -52,9 +45,9 @@ namespace PckStudio { foreach (TreeNode node in treeMeta.Nodes) { - foreach (PCKFile.FileData mf in currentPCK.file_entries) + foreach (PCKFile.FileData file in currentPCK.Files) { - mf.properties.Add(new ValueTuple(node.Text, node.Tag.ToString())); + file.properties.Add((node.Text, node.Tag.ToString())); } } MessageBox.Show("Data Added to All Entries"); @@ -65,7 +58,7 @@ namespace PckStudio int i = 0; do { - foreach (PCKFile.FileData mf in currentPCK.file_entries) + foreach (PCKFile.FileData mf in currentPCK.Files) { MemoryStream png = new MemoryStream(mf.data); if (Path.GetExtension(mf.name) == ".png") @@ -88,7 +81,7 @@ namespace PckStudio do { - foreach (PCKFile.FileData mf in currentPCK.file_entries) + foreach (PCKFile.FileData mf in currentPCK.Files) { MemoryStream png = new MemoryStream(mf.data); if (Path.GetExtension(mf.name) == ".png") @@ -111,7 +104,7 @@ namespace PckStudio do { - foreach (PCKFile.FileData mf in currentPCK.file_entries) + foreach (PCKFile.FileData mf in currentPCK.Files) { if (Path.GetExtension(mf.name) == ".png") { diff --git a/MinecraftUSkinEditor/Forms/Utilities/TextureConverterUtility.cs b/MinecraftUSkinEditor/Forms/Utilities/TextureConverterUtility.cs index 8050a482..0e7d47d6 100644 --- a/MinecraftUSkinEditor/Forms/Utilities/TextureConverterUtility.cs +++ b/MinecraftUSkinEditor/Forms/Utilities/TextureConverterUtility.cs @@ -449,7 +449,7 @@ namespace PckStudio.Forms.Utilities string Outpath = "assets\\minecraft\\textures\\"; - foreach (PCKFile.FileData mf in Pck.file_entries) + foreach (PCKFile.FileData mf in Pck.Files) { System.IO.FileInfo file = new System.IO.FileInfo(Environment.CurrentDirectory + "\\Temp\\" + @"\" + mf.name); file.Directory.Create(); // If the directory already exists, this method does nothing. @@ -474,7 +474,7 @@ namespace PckStudio.Forms.Utilities string Outpath = "assets\\minecraft\\textures\\"; - foreach (PCKFile.FileData mf in Pck.file_entries) + foreach (PCKFile.FileData mf in Pck.Files) { System.IO.FileInfo file = new System.IO.FileInfo(Environment.CurrentDirectory + "\\Temp\\" + @"\" + mf.name); file.Directory.Create(); // If the directory already exists, this method does nothing. @@ -499,9 +499,9 @@ namespace PckStudio.Forms.Utilities string Outpath = "assets\\minecraft\\textures\\"; - foreach (PCKFile.FileData mf in Pck.file_entries) + foreach (PCKFile.FileData mf in Pck.Files) { - System.IO.FileInfo file = new System.IO.FileInfo(Environment.CurrentDirectory + "\\Temp\\" + @"\" + mf.name); + FileInfo file = new FileInfo(Environment.CurrentDirectory + "\\Temp\\" + @"\" + mf.name); file.Directory.Create(); // If the directory already exists, this method does nothing. File.WriteAllBytes(Environment.CurrentDirectory + "\\Temp\\" + @"\" + mf.name, mf.data); //writes minefile to file } diff --git a/MinecraftUSkinEditor/Forms/Utilities/pckCenterOpen.cs b/MinecraftUSkinEditor/Forms/Utilities/pckCenterOpen.cs index 578c77f5..0e6a4f03 100644 --- a/MinecraftUSkinEditor/Forms/Utilities/pckCenterOpen.cs +++ b/MinecraftUSkinEditor/Forms/Utilities/pckCenterOpen.cs @@ -67,12 +67,8 @@ namespace PckStudio.Forms buttonDirect.Font = new Font("Segoe UI", 8, FontStyle.Bold); buttonDirect.ForeColor = Color.White; } - buttonBedrock.Visible = false; - buttonDelete.Visible = false; - buttonExport.Visible = false; - buttonInstallPs3.Visible = false; - buttonInstallXbox.Visible = false; - buttonInstallWiiU.Visible = false; + buttonBedrock.Visible = buttonDelete.Visible = buttonExport.Visible = false; + buttonInstallPs3.Visible = buttonInstallXbox.Visible = buttonInstallWiiU.Visible = false; } else if (mode==1)//My Collection Mode { @@ -143,7 +139,7 @@ namespace PckStudio.Forms pck = PCKFileReader.Read(stream, false); //sets opened pck } PCKFile currentPCK = pck; //sets opened pck - foreach (PCKFile.FileData skin in currentPCK.file_entries) + foreach (PCKFile.FileData skin in currentPCK.Files) { if (skin.name.Count() == 19) { diff --git a/MinecraftUSkinEditor/MainForm.cs b/MinecraftUSkinEditor/MainForm.cs index 7d045e00..ec87884b 100644 --- a/MinecraftUSkinEditor/MainForm.cs +++ b/MinecraftUSkinEditor/MainForm.cs @@ -54,7 +54,7 @@ namespace PckStudio currentPCK = openPck(ofd.FileName); if (checkForPassword()) { - fileEntryCountLabel.Text = "Files:" + currentPCK.file_entries.Count; + fileEntryCountLabel.Text = "Files:" + currentPCK.Files.Count; treeViewMain.Enabled = true; treeMeta.Enabled = true; closeToolStripMenuItem.Visible = true; @@ -81,13 +81,13 @@ namespace PckStudio saveLocation = filePath; pck = PCKFileReader.Read(fileStream, LittleEndianCheckBox.Checked); } - if (pck.type < 3) throw new Exception("Can't open pck file of type: " + pck.type.ToString()); + //if (pck.type < 3) throw new Exception("Can't open pck file of type: " + pck.type.ToString()); return pck; } private bool checkForPassword() { - foreach (var file_entry in currentPCK.file_entries) + foreach (var file_entry in currentPCK.Files) { if (file_entry.name != "0") continue; foreach (var pair in file_entry.properties) @@ -134,7 +134,7 @@ namespace PckStudio private void BuildPckTreeView(TreeNodeCollection root, PCKFile pckFile) { - foreach (var file_entry in pckFile.file_entries) + foreach (var file_entry in pckFile.Files) { TreeNode node = BuildNodeTreeBySeperator(root, file_entry.name, '/'); node.Tag = file_entry; @@ -310,7 +310,6 @@ namespace PckStudio private void Save(string FilePath) { - currentPCK.ValidateMeta(); using (var fs = File.OpenWrite(FilePath)) { PCKFileWriter.Write(fs, currentPCK, LittleEndianCheckBox.Checked); @@ -358,7 +357,7 @@ namespace PckStudio TrySetLocFile(locFile); } } - currentPCK.file_entries.Remove(file); + currentPCK.Files.Remove(file); node.Remove(); saved = false; } @@ -376,7 +375,7 @@ namespace PckStudio { //removes minefile from minefile list PCKFile.FileData file = (PCKFile.FileData)item.Tag; - currentPCK.file_entries.Remove(file); + currentPCK.Files.Remove(file); item.Remove(); } } @@ -411,10 +410,10 @@ namespace PckStudio if (add.ShowDialog() == DialogResult.OK) { if (add.useCape) - currentPCK.file_entries.Add(add.Cape); + currentPCK.Files.Add(add.Cape); if (!(treeViewMain.SelectedNode.Tag is PCKFile.FileData)) add.Skin.name = $"{treeViewMain.SelectedNode.FullPath}/{add.Skin.name}"; - currentPCK.file_entries.Add(add.Skin); + currentPCK.Files.Add(add.Skin); TrySetLocFile(locFile); saved = false; BuildMainTreeView(); @@ -616,7 +615,7 @@ namespace PckStudio if (node.Parent == null) treeViewMain.Nodes.Insert(node.Index + 1, newNode); //adds generated minefile node else node.Parent.Nodes.Insert(node.Index + 1, newNode);//adds generated minefile node to selected folder - currentPCK.file_entries.Insert(node.Index + 1, newNode.Tag as PCKFile.FileData); + currentPCK.Files.Insert(node.Index + 1, newNode.Tag as PCKFile.FileData); } private void deleteEntryToolStripMenuItem_Click(object sender, EventArgs e) @@ -670,8 +669,8 @@ namespace PckStudio //if (treeViewMain.SelectedNode.Tag is PCKFile.FileData) //{ // PCKFile.FileData file = treeViewMain.SelectedNode.Tag as PCKFile.FileData; - // int file_index = currentPCK.file_entries.IndexOf(file); - // currentPCK.file_entries.Swap(file_index, file_index - 1); + // int file_index = currentPCK.Files.IndexOf(file); + // currentPCK.Files.Swap(file_index, file_index - 1); // saved = false; //} //return; @@ -702,8 +701,8 @@ namespace PckStudio //if (treeViewMain.SelectedNode.Tag is PCKFile.FileData) //{ // PCKFile.FileData file = treeViewMain.SelectedNode.Tag as PCKFile.FileData; - // int file_index = currentPCK.file_entries.IndexOf(file); - // currentPCK.file_entries.Swap(file_index, file_index + 1); + // int file_index = currentPCK.Files.IndexOf(file); + // currentPCK.Files.Swap(file_index, file_index + 1); // saved = false; //} //return; @@ -803,8 +802,6 @@ namespace PckStudio private void InitializeSkinPack(int packId, int packVersion, string packName) { currentPCK = new PCKFile(3); - currentPCK.meta_data.Add("PACKID"); - currentPCK.meta_data.Add("PACKVERSION"); var zeroFile = new PCKFile.FileData("0", 4); zeroFile.properties.Add(("PACKID", packId.ToString())); zeroFile.properties.Add(("PACKVERSION", packVersion.ToString())); @@ -816,18 +813,17 @@ namespace PckStudio LOCFileWriter.Write(stream, locFile); loc.SetData(stream.ToArray()); } - currentPCK.file_entries.Add(zeroFile); - currentPCK.file_entries.Add(loc); + currentPCK.Files.Add(zeroFile); + currentPCK.Files.Add(loc); } private void InitializeTexturePack(int packId, int packVersion, string packName) { InitializeSkinPack(packId, packVersion, packName); - currentPCK.meta_data.Add("DATAPATH"); var texturepackInfo = new PCKFile.FileData("x16/x16Info.pck", 5); texturepackInfo.properties.Add(("PACKID", "0")); texturepackInfo.properties.Add(("DATAPATH", "x16Data.pck")); - currentPCK.file_entries.Add(texturepackInfo); + currentPCK.Files.Add(texturepackInfo); } private void skinPackToolStripMenuItem_Click(object sender, EventArgs e) @@ -944,7 +940,7 @@ namespace PckStudio { pckfile = PCKFileReader.Read(fs, LittleEndianCheckBox.Checked); } - foreach (PCKFile.FileData mf in pckfile.file_entries) + foreach (PCKFile.FileData mf in pckfile.Files) { foreach (var entry in mf.properties) { @@ -1034,7 +1030,7 @@ namespace PckStudio TreeNode skin = new TreeNode(); //create template treenode for minefile - currentPCK.file_entries.Add(mfNew);//adds new minefile to minefile list for skin + currentPCK.Files.Add(mfNew);//adds new minefile to minefile list for skin //Sets minefile directory based on pcks structure/type if (mashupStructure == true) @@ -1337,7 +1333,7 @@ namespace PckStudio // //add all skins to a list // List skinsList = new List(); // List capesList = new List(); - // foreach (PCKFile.FileData skin in currentPCK.file_entries) + // foreach (PCKFile.FileData skin in currentPCK.Files) // { // if (skin.name.Count() == 19) // { @@ -2829,8 +2825,7 @@ namespace PckStudio TreeNode node = treeViewMain.SelectedNode; if (node == null || node.Tag == null || !(node.Tag is PCKFile.FileData)) return; var file = node.Tag as PCKFile.FileData; - Console.WriteLine("Old type:" + file.type); - Console.WriteLine("New type:" + type); + Console.WriteLine("Setting {file.type} to {type}"); file.type = type; } }