From b9dbc25b385a6a398b03a8876134b69cc067d7a5 Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Mon, 13 Mar 2023 16:07:02 +0100 Subject: [PATCH] Move PckFile processing to OMI lib --- PCK-Studio/Classes/FileTypes/PCKFile.cs | 171 ------- PCK-Studio/Classes/FileTypes/PCKProperties.cs | 57 --- PCK-Studio/Classes/IO/PCK/PCKFileReader.cs | 86 ---- PCK-Studio/Classes/IO/PCK/PCKFileWriter.cs | 81 ---- PCK-Studio/Forms/Editor/AnimationEditor.cs | 5 +- PCK-Studio/Forms/Editor/AudioEditor.cs | 5 +- PCK-Studio/Forms/Editor/BehaviourEditor.cs | 6 +- PCK-Studio/Forms/Editor/COLEditor.cs | 6 +- PCK-Studio/Forms/Editor/GameRuleFileEditor.cs | 5 +- PCK-Studio/Forms/Editor/LOCEditor.cs | 6 +- PCK-Studio/Forms/Editor/MaterialsEditor.cs | 6 +- .../Skins-And-Textures/AdvancedOptions.cs | 14 +- .../Forms/Skins-And-Textures/addnewskin.cs | 13 +- .../Forms/Skins-And-Textures/generateModel.cs | 5 +- PCK-Studio/Forms/Utilities/AnimationUtil.cs | 6 +- PCK-Studio/Forms/Utilities/BehaviourUtil.cs | 6 +- PCK-Studio/Forms/Utilities/MaterialUtil.cs | 5 +- .../Utilities/TextureConverterUtility.cs | 17 +- PCK-Studio/Forms/Utilities/installWiiU.cs | 16 +- PCK-Studio/Forms/Utilities/pckCenterOpen.cs | 26 +- PCK-Studio/MainForm.cs | 440 ++++++++++-------- PCK-Studio/PckStudio.csproj | 4 - Vendor/OMI-Lib | 2 +- 23 files changed, 314 insertions(+), 674 deletions(-) delete mode 100644 PCK-Studio/Classes/FileTypes/PCKFile.cs delete mode 100644 PCK-Studio/Classes/FileTypes/PCKProperties.cs delete mode 100644 PCK-Studio/Classes/IO/PCK/PCKFileReader.cs delete mode 100644 PCK-Studio/Classes/IO/PCK/PCKFileWriter.cs diff --git a/PCK-Studio/Classes/FileTypes/PCKFile.cs b/PCK-Studio/Classes/FileTypes/PCKFile.cs deleted file mode 100644 index 1b03dadc..00000000 --- a/PCK-Studio/Classes/FileTypes/PCKFile.cs +++ /dev/null @@ -1,171 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; - -namespace PckStudio.Classes.FileTypes -{ - public class PCKFile - { - public int type { get; } - public List Files { get; } = new List(); - - public const string XMLVersionString = "XMLVERSION"; - - public class FileData - { - public enum FileType : int - { - SkinFile = 0, // *.png - CapeFile = 1, // *.png - TextureFile = 2, // *.png - UIDataFile = 3, // *.fui ???? - /// - /// "0" file - /// - InfoFile = 4, - /// - /// (x16|x32|x64)Info.pck - /// - TexturePackInfoFile = 5, - /// - /// languages.loc/localisation.loc - /// - LocalisationFile = 6, - /// - /// GameRules.grf - /// - GameRulesFile = 7, - /// - /// audio.pck - /// - AudioFile = 8, - /// - /// colours.col - /// - ColourTableFile = 9, - /// - /// GameRules.grh - /// - GameRulesHeader = 10, - /// - /// Skins.pck - /// - SkinDataFile = 11, - /// - /// models.bin - /// - ModelsFile = 12, - /// - /// behaviours.bin - /// - BehavioursFile = 13, - /// - /// entityMaterials.bin - /// - MaterialFile = 14, - } - - public string Filename { - get => filename; - set => filename = value.Replace('\\', '/'); - } - - public FileType Filetype { get; set; } - public byte[] Data => _data; - public int Size => _data is null ? 0 : _data.Length; - public PCKProperties Properties { get; } = new PCKProperties(); - - private string filename; - private byte[] _data = new byte[0]; - - public FileData(string name, FileType type) - { - Filetype = type; - Filename = name; - } - - public FileData(string name, FileType type, int dataSize) : this(name, type) - { - _data = new byte[dataSize]; - } - - public FileData(FileData file) : this(file.Filename, file.Filetype) - { - Properties = file.Properties; - SetData(file.Data); - } - - public void SetData(byte[] data) - { - _data = data; - } - - } - - public PCKFile(int type) - { - this.type = type; - } - - public List GetPropertyList() - { - var LUT = new List(); - Files.ForEach(file => file.Properties.ForEach(pair => - { - if (!LUT.Contains(pair.property)) - LUT.Add(pair.property); - }) - ); - return LUT; - } - - /// - /// Creates and adds new object. - /// - /// Filename - /// Filetype - /// Added object - public FileData CreateNew(string name, FileData.FileType type) - { - var file = new FileData(name, type); - Files.Add(file); - return file; - } - - /// - /// Checks wether a file with and exists - /// - /// Path to the file in the pck - /// Type of the file - /// True when file exists, otherwise false - public bool HasFile(string filepath, FileData.FileType type) - { - return GetFile(filepath, type) is FileData; - } - - /// - /// Gets the first file that Equals and - /// - /// Path to the file in the pck - /// Type of the file - /// FileData if found, otherwise null - public FileData GetFile(string filepath, FileData.FileType type) - { - return Files.FirstOrDefault(file => file.Filename.Equals(filepath) && file.Filetype.Equals(type)); - } - - /// - /// Tries to get a file with and . - /// - /// Path to the file in the pck - /// Type of the file - /// If succeeded will be non-null, otherwise null - /// True if succeeded, otherwise false - public bool TryGetFile(string filepath, FileData.FileType type, out FileData file) - { - file = GetFile(filepath, type); - return file is FileData; - } - } -} \ No newline at end of file diff --git a/PCK-Studio/Classes/FileTypes/PCKProperties.cs b/PCK-Studio/Classes/FileTypes/PCKProperties.cs deleted file mode 100644 index c8d10493..00000000 --- a/PCK-Studio/Classes/FileTypes/PCKProperties.cs +++ /dev/null @@ -1,57 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace PckStudio.Classes.FileTypes -{ - public class PCKProperties : List<(string property, string value)> - { - public bool Contains(string property) - { - return HasProperty(property); - } - - public bool HasProperty(string property) - { - return GetProperty(property) != default; - } - - public (string, string) GetProperty(string property) - { - return this.FirstOrDefault(p => p.property.Equals(property)); - } - - public T GetPropertyValue(string property, Func func) - { - return func(GetPropertyValue(property)); - } - - public string GetPropertyValue(string property) - { - return GetProperty(property).Item2; - } - - public (string, string)[] GetProperties(string property) - { - return FindAll(p => p.property == property).ToArray(); - } - - public bool HasMoreThanOneOf(string property) - { - return GetProperties(property).Length > 1; - } - - public void SetProperty(string property, string value) - { - if (HasProperty(property)) - { - this[IndexOf(GetProperty(property))] = (property, value); - return; - } - Add((property, value)); - } - - } -} diff --git a/PCK-Studio/Classes/IO/PCK/PCKFileReader.cs b/PCK-Studio/Classes/IO/PCK/PCKFileReader.cs deleted file mode 100644 index 1e96255c..00000000 --- a/PCK-Studio/Classes/IO/PCK/PCKFileReader.cs +++ /dev/null @@ -1,86 +0,0 @@ -using PckStudio.Classes.FileTypes; -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; - -namespace PckStudio.Classes.IO.PCK -{ - internal class PCKFileReader : StreamDataReader - { - private PCKFile _file; - private IList _propertyList; - - public static PCKFile Read(Stream stream, bool isLittleEndian) - { - return new PCKFileReader(isLittleEndian).ReadFromStream(stream); - } - - private PCKFileReader(bool isLittleEndian) : base(isLittleEndian) - { - } - - protected override PCKFile ReadFromStream(Stream stream) - { - int pck_type = ReadInt(stream); - if (pck_type > 0xf0_00_00) // 03 00 00 00 == true - throw new OverflowException(nameof(pck_type)); - else if (pck_type < 3) throw new Exception(pck_type.ToString()); - _file = new PCKFile(pck_type); - ReadLookUpTable(stream); - ReadFileEntries(stream); - ReadFileContents(stream); - return _file; - } - - private void ReadLookUpTable(Stream stream) - { - int count = ReadInt(stream); - _propertyList = new List(count); - for (int i = 0; i < count; i++) - { - int index = ReadInt(stream); - string value = ReadString(stream); - _propertyList.Insert(index, value); - } - if (_propertyList.Contains(PCKFile.XMLVersionString)) - Console.WriteLine(ReadInt(stream)); // xml version num ?? - } - - private void ReadFileEntries(Stream stream) - { - int file_entry_count = ReadInt(stream); - for (; 0 < file_entry_count; file_entry_count--) - { - int file_size = ReadInt(stream); - var file_type = (PCKFile.FileData.FileType)ReadInt(stream); - string file_name = ReadString(stream).Replace('\\', '/'); - var entry = new PCKFile.FileData(file_name, file_type, file_size); - _file.Files.Add(entry); - } - } - - private void ReadFileContents(Stream stream) - { - foreach (var file in _file.Files) - { - int property_count = ReadInt(stream); - for (; 0 < property_count; property_count--) - { - string key = _propertyList[ReadInt(stream)]; - string value = ReadString(stream); - file.Properties.Add((key, value)); - } - stream.Read(file.Data, 0, file.Size); - }; - } - - private string ReadString(Stream stream) - { - int len = ReadInt(stream); - string s = ReadString(stream, len, IsUsingLittleEndian ? Encoding.Unicode : Encoding.BigEndianUnicode); - ReadInt(stream); // padding - return s; - } - } -} diff --git a/PCK-Studio/Classes/IO/PCK/PCKFileWriter.cs b/PCK-Studio/Classes/IO/PCK/PCKFileWriter.cs deleted file mode 100644 index 7957fc31..00000000 --- a/PCK-Studio/Classes/IO/PCK/PCKFileWriter.cs +++ /dev/null @@ -1,81 +0,0 @@ -using PckStudio.Classes.FileTypes; -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; - -namespace PckStudio.Classes.IO.PCK -{ - internal class PCKFileWriter : StreamDataWriter - { - private PCKFile _pckfile; - private IList _propertyList; - - public static void Write(Stream stream, PCKFile file, bool isLittleEndian, bool isSkinsPCK = false) - { - new PCKFileWriter(file, isLittleEndian, isSkinsPCK).WriteToStream(stream); - } - - private PCKFileWriter(PCKFile file, bool isLittleEndian, bool isSkinsPCK) : base(isLittleEndian) - { - _pckfile = file; - _propertyList = _pckfile.GetPropertyList(); - if (!_propertyList.Contains(PCKFile.XMLVersionString) && isSkinsPCK) - _propertyList.Insert(0, PCKFile.XMLVersionString); - } - - protected override void WriteToStream(Stream stream) - { - WriteInt(stream, _pckfile.type); - WriteLookUpTable(stream); - WriteFileEntries(stream); - WriteFileContents(stream); - } - - private void WriteString(Stream stream, string s) - { - WriteInt(stream, s.Length); - WriteString(stream, s, IsUsingLittleEndian ? Encoding.Unicode : Encoding.BigEndianUnicode); - WriteInt(stream, 0); // padding - } - - private void WriteLookUpTable(Stream stream) - { - WriteInt(stream, _propertyList.Count); - foreach (var entry in _propertyList) - { - WriteInt(stream, _propertyList.IndexOf(entry)); - WriteString(stream, entry); - }; - if (_propertyList.Contains(PCKFile.XMLVersionString)) - WriteInt(stream, 0x1337); // :^) - } - - private void WriteFileEntries(Stream stream) - { - WriteInt(stream, _pckfile.Files.Count); - foreach (var file in _pckfile.Files) - { - WriteInt(stream, file.Size); - WriteInt(stream, (int)file.Filetype); - WriteString(stream, file.Filename); - } - } - - private void WriteFileContents(Stream stream) - { - foreach (var file in _pckfile.Files) - { - WriteInt(stream, file.Properties.Count); - foreach (var property in file.Properties) - { - if (!_propertyList.Contains(property.Item1)) - throw new Exception("Tag not in Look Up Table: " + property.Item1); - WriteInt(stream, _propertyList.IndexOf(property.Item1)); - WriteString(stream, property.Item2); - } - WriteBytes(stream, file.Data, file.Size); - } - } - } -} \ No newline at end of file diff --git a/PCK-Studio/Forms/Editor/AnimationEditor.cs b/PCK-Studio/Forms/Editor/AnimationEditor.cs index 2a5beb54..cadbd94a 100644 --- a/PCK-Studio/Forms/Editor/AnimationEditor.cs +++ b/PCK-Studio/Forms/Editor/AnimationEditor.cs @@ -17,12 +17,13 @@ using PckStudio.Forms.Utilities; using PckStudio.Classes.Extentions; using System.Runtime.CompilerServices; using System.Diagnostics; +using OMI.Formats.Pck; namespace PckStudio.Forms.Editor { public partial class AnimationEditor : MetroForm { - PCKFile.FileData animationFile; + PckFile.FileData animationFile; Animation currentAnimation; AnimationPlayer player; @@ -237,7 +238,7 @@ namespace PckStudio.Forms.Editor } } - public AnimationEditor(PCKFile.FileData file) + public AnimationEditor(PckFile.FileData file) { InitializeComponent(); diff --git a/PCK-Studio/Forms/Editor/AudioEditor.cs b/PCK-Studio/Forms/Editor/AudioEditor.cs index b2aef3bc..fa199fdb 100644 --- a/PCK-Studio/Forms/Editor/AudioEditor.cs +++ b/PCK-Studio/Forms/Editor/AudioEditor.cs @@ -12,6 +12,7 @@ using PckStudio.Classes.FileTypes; using PckStudio.Classes.IO.PCK; using PckStudio.Forms.Additional_Popups.Audio; using OMI.Formats.Languages; +using OMI.Formats.Pck; // Audio Editor by MattNL // additional work and optimization by Miku-666 @@ -22,7 +23,7 @@ namespace PckStudio.Forms.Editor { public string defaultType = "yes"; PCKAudioFile audioFile = null; - PCKFile.FileData audioPCK; + PckFile.FileData audioPCK; LOCFile loc; bool _isLittleEndian = false; MainForm parent = null; @@ -51,7 +52,7 @@ namespace PckStudio.Forms.Editor return (PCKAudioFile.AudioCategory.EAudioType)Categories.IndexOf(category); } - public AudioEditor(PCKFile.FileData file, LOCFile locFile, bool isLittleEndian) + public AudioEditor(PckFile.FileData file, LOCFile locFile, bool isLittleEndian) { InitializeComponent(); loc = locFile; diff --git a/PCK-Studio/Forms/Editor/BehaviourEditor.cs b/PCK-Studio/Forms/Editor/BehaviourEditor.cs index 6bb4d8f8..102f5800 100644 --- a/PCK-Studio/Forms/Editor/BehaviourEditor.cs +++ b/PCK-Studio/Forms/Editor/BehaviourEditor.cs @@ -6,18 +6,18 @@ using System.IO; using System.Linq; using System.Windows.Forms; using MetroFramework.Forms; -using PckStudio.Classes.FileTypes; using PckStudio.Forms.Additional_Popups.EntityForms; using Newtonsoft.Json.Linq; using OMI.Formats.Behaviour; using OMI.Workers.Behaviour; +using OMI.Formats.Pck; namespace PckStudio.Forms.Editor { public partial class BehaviourEditor : MetroForm { // Behaviours File Format research by Miku and MattNL - private readonly PCKFile.FileData _file; + private readonly PckFile.FileData _file; BehaviourFile behaviourFile; void SetUpTree() @@ -56,7 +56,7 @@ namespace PckStudio.Forms.Editor treeView1.EndUpdate(); } - public BehaviourEditor(PCKFile.FileData file) + public BehaviourEditor(PckFile.FileData file) { InitializeComponent(); _file = file; diff --git a/PCK-Studio/Forms/Editor/COLEditor.cs b/PCK-Studio/Forms/Editor/COLEditor.cs index 33df7fba..353d7421 100644 --- a/PCK-Studio/Forms/Editor/COLEditor.cs +++ b/PCK-Studio/Forms/Editor/COLEditor.cs @@ -6,8 +6,8 @@ using System.Linq; using System.Windows.Forms; using MetroFramework.Forms; using OMI.Formats.Color; +using OMI.Formats.Pck; using OMI.Workers.Color; -using PckStudio.Classes.FileTypes; namespace PckStudio.Forms.Editor { @@ -17,14 +17,14 @@ namespace PckStudio.Forms.Editor ColorContainer colourfile; ColorContainer.Color clipboard_color; - private readonly PCKFile.FileData _file; + 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) + public COLEditor(PckFile.FileData file) { InitializeComponent(); _file = file; diff --git a/PCK-Studio/Forms/Editor/GameRuleFileEditor.cs b/PCK-Studio/Forms/Editor/GameRuleFileEditor.cs index fedfd8a3..c3df5f95 100644 --- a/PCK-Studio/Forms/Editor/GameRuleFileEditor.cs +++ b/PCK-Studio/Forms/Editor/GameRuleFileEditor.cs @@ -11,12 +11,13 @@ using OMI.Formats.GameRule; using OMI.Workers.GameRule; using System.Diagnostics; using PckStudio.Forms.Additional_Popups.Audio; +using OMI.Formats.Pck; namespace PckStudio.Forms.Editor { public partial class GameRuleFileEditor : MetroFramework.Forms.MetroForm { - private PCKFile.FileData _pckfile; + private PckFile.FileData _pckfile; private GameRuleFile _file; public GameRuleFileEditor() @@ -34,7 +35,7 @@ namespace PckStudio.Forms.Editor compressionTypeComboBox.SelectedIndex = compressionTypeComboBox.Items.IndexOf(dialog.Category); } - public GameRuleFileEditor(PCKFile.FileData file) : this() + public GameRuleFileEditor(PckFile.FileData file) : this() { _pckfile = file; using (var stream = new MemoryStream(file.Data)) diff --git a/PCK-Studio/Forms/Editor/LOCEditor.cs b/PCK-Studio/Forms/Editor/LOCEditor.cs index b52db4a6..82b317e3 100644 --- a/PCK-Studio/Forms/Editor/LOCEditor.cs +++ b/PCK-Studio/Forms/Editor/LOCEditor.cs @@ -6,10 +6,10 @@ using System.Collections.Generic; using System.Windows.Forms; using MetroFramework.Forms; using PckStudio.Classes.Misc; -using PckStudio.Classes.FileTypes; using PckStudio.Forms.Additional_Popups.Loc; using OMI.Formats.Languages; using OMI.Workers.Language; +using OMI.Formats.Pck; namespace PckStudio.Forms.Editor { @@ -17,9 +17,9 @@ namespace PckStudio.Forms.Editor { DataTable tbl; LOCFile currentLoc; - PCKFile.FileData _file; + PckFile.FileData _file; - public LOCEditor(PCKFile.FileData file) + public LOCEditor(PckFile.FileData file) { InitializeComponent(); _file = file; diff --git a/PCK-Studio/Forms/Editor/MaterialsEditor.cs b/PCK-Studio/Forms/Editor/MaterialsEditor.cs index 7c81f5af..5ff1e84c 100644 --- a/PCK-Studio/Forms/Editor/MaterialsEditor.cs +++ b/PCK-Studio/Forms/Editor/MaterialsEditor.cs @@ -8,15 +8,15 @@ using System.Windows.Forms; using MetroFramework.Forms; using PckStudio.Classes.FileTypes; using PckStudio.Classes.IO.Materials; -using Newtonsoft.Json; using Newtonsoft.Json.Linq; +using OMI.Formats.Pck; namespace PckStudio.Forms.Editor { public partial class MaterialsEditor : MetroForm { // Behaviours File Format research by Miku and MattNL - private readonly PCKFile.FileData _file; + private readonly PckFile.FileData _file; MaterialsFile materialFile; void SetUpTree() @@ -46,7 +46,7 @@ namespace PckStudio.Forms.Editor treeView1.EndUpdate(); } - public MaterialsEditor(PCKFile.FileData file) + public MaterialsEditor(PckFile.FileData file) { InitializeComponent(); _file = file; diff --git a/PCK-Studio/Forms/Skins-And-Textures/AdvancedOptions.cs b/PCK-Studio/Forms/Skins-And-Textures/AdvancedOptions.cs index d11b335d..6af62511 100644 --- a/PCK-Studio/Forms/Skins-And-Textures/AdvancedOptions.cs +++ b/PCK-Studio/Forms/Skins-And-Textures/AdvancedOptions.cs @@ -1,4 +1,4 @@ -using PckStudio.Classes.FileTypes; +using OMI.Formats.Pck; using System; using System.Data; using System.Drawing; @@ -10,9 +10,9 @@ namespace PckStudio { public partial class AdvancedOptions : MetroFramework.Forms.MetroForm { - PCKFile currentPCK; + PckFile currentPCK; - public AdvancedOptions(PCKFile currentPCKIn) + public AdvancedOptions(PckFile currentPCKIn) { InitializeComponent(); currentPCK = currentPCKIn; @@ -26,7 +26,7 @@ namespace PckStudio { case "All": { - foreach (PCKFile.FileData file in currentPCK.Files) + foreach (PckFile.FileData file in currentPCK.Files) { file.Properties.Add((entryTypeTextBox.Text, entryDataTextBox.Text)); } @@ -35,7 +35,7 @@ namespace PckStudio break; case "64x64": { - foreach (PCKFile.FileData file in currentPCK.Files) + foreach (PckFile.FileData file in currentPCK.Files) { MemoryStream png = new MemoryStream(file.Data); if (Path.GetExtension(file.Filename) == ".png" && @@ -49,7 +49,7 @@ namespace PckStudio break; case "64x32": { - foreach (PCKFile.FileData file in currentPCK.Files) + foreach (PckFile.FileData file in currentPCK.Files) { MemoryStream png = new MemoryStream(file.Data); if (Path.GetExtension(file.Filename) == ".png" && @@ -63,7 +63,7 @@ namespace PckStudio break; case "PNG Files": { - foreach (PCKFile.FileData file in currentPCK.Files) + foreach (PckFile.FileData file in currentPCK.Files) { MemoryStream png = new MemoryStream(file.Data); if (Path.GetExtension(file.Filename) == ".png") diff --git a/PCK-Studio/Forms/Skins-And-Textures/addnewskin.cs b/PCK-Studio/Forms/Skins-And-Textures/addnewskin.cs index afe5c441..f66a67e1 100644 --- a/PCK-Studio/Forms/Skins-And-Textures/addnewskin.cs +++ b/PCK-Studio/Forms/Skins-And-Textures/addnewskin.cs @@ -3,28 +3,27 @@ using System.Drawing; using System.IO; using System.Windows.Forms; using System.Drawing.Drawing2D; -using PckStudio.Classes.FileTypes; using System.Drawing.Imaging; using PckStudio.Classes.Utils; using PckStudio.Classes._3ds.Utils; using OMI.Formats.Languages; +using OMI.Formats.Pck; namespace PckStudio { public partial class addNewSkin : MetroFramework.Forms.MetroForm { - - public PCKFile.FileData SkinFile => skin; - public PCKFile.FileData CapeFile => cape; + public PckFile.FileData SkinFile => skin; + public PckFile.FileData CapeFile => cape; public bool HasCape = false; LOCFile currentLoc; - PCKFile.FileData skin = new PCKFile.FileData("dlcskinXYXYXYXY", PCKFile.FileData.FileType.SkinFile); - PCKFile.FileData cape = new PCKFile.FileData("dlccapeXYXYXYXY", PCKFile.FileData.FileType.CapeFile); + PckFile.FileData skin = new PckFile.FileData("dlcskinXYXYXYXY", PckFile.FileData.FileType.SkinFile); + PckFile.FileData cape = new PckFile.FileData("dlccapeXYXYXYXY", PckFile.FileData.FileType.CapeFile); SkinANIM anim = new SkinANIM(); eSkinType skinType; - PCKProperties generatedModel = new PCKProperties(); + PckFile.PCKProperties generatedModel = new PckFile.PCKProperties(); enum eSkinType : int { diff --git a/PCK-Studio/Forms/Skins-And-Textures/generateModel.cs b/PCK-Studio/Forms/Skins-And-Textures/generateModel.cs index cb4b1456..2a87eeba 100644 --- a/PCK-Studio/Forms/Skins-And-Textures/generateModel.cs +++ b/PCK-Studio/Forms/Skins-And-Textures/generateModel.cs @@ -11,6 +11,7 @@ using Newtonsoft.Json; using MetroFramework.Forms; using PckStudio.Classes.FileTypes; using System.Text.RegularExpressions; +using OMI.Formats.Pck; namespace PckStudio { @@ -28,7 +29,7 @@ namespace PckStudio right } - PCKProperties boxes; + PckFile.PCKProperties boxes; Color backgroundColor = Color.FromArgb(0xff, 0x50, 0x50, 0x50); @@ -127,7 +128,7 @@ namespace PckStudio } - public generateModel(PCKProperties skinProperties, PictureBox preview) + public generateModel(PckFile.PCKProperties skinProperties, PictureBox preview) { InitializeComponent(); boxes = skinProperties; diff --git a/PCK-Studio/Forms/Utilities/AnimationUtil.cs b/PCK-Studio/Forms/Utilities/AnimationUtil.cs index 55e38a4b..c728be49 100644 --- a/PCK-Studio/Forms/Utilities/AnimationUtil.cs +++ b/PCK-Studio/Forms/Utilities/AnimationUtil.cs @@ -4,9 +4,9 @@ using System.Linq; using System.IO; using PckStudio.Properties; -using PckStudio.Classes.FileTypes; using System.Drawing.Imaging; using PckStudio.Classes.Extentions; +using OMI.Formats.Pck; namespace PckStudio.Forms.Utilities { @@ -19,9 +19,9 @@ namespace PckStudio.Forms.Utilities public static Image[] tileImages => _tileImages ??= Resources.terrain_sheet.CreateImageList(16).Concat(Resources.items_sheet.CreateImageList(16)).ToArray(); - public static PCKFile.FileData CreateNewAnimationFile(Image source, string tileName, bool isItem) + public static PckFile.FileData CreateNewAnimationFile(Image source, string tileName, bool isItem) { - PCKFile.FileData file = new PCKFile.FileData($"res/textures/{GetAnimationSection(isItem)}/{tileName}.png", PCKFile.FileData.FileType.TextureFile); + PckFile.FileData file = new PckFile.FileData($"res/textures/{GetAnimationSection(isItem)}/{tileName}.png", PckFile.FileData.FileType.TextureFile); file.Properties.Add(("ANIM", string.Empty)); using (var stream = new MemoryStream()) { diff --git a/PCK-Studio/Forms/Utilities/BehaviourUtil.cs b/PCK-Studio/Forms/Utilities/BehaviourUtil.cs index 64c0dd92..cce040f8 100644 --- a/PCK-Studio/Forms/Utilities/BehaviourUtil.cs +++ b/PCK-Studio/Forms/Utilities/BehaviourUtil.cs @@ -4,10 +4,10 @@ using System.Linq; using System.IO; using PckStudio.Properties; -using PckStudio.Classes.FileTypes; using PckStudio.Classes.Extentions; using OMI.Formats.Behaviour; using OMI.Workers.Behaviour; +using OMI.Formats.Pck; namespace PckStudio.Forms.Utilities { @@ -18,9 +18,9 @@ namespace PckStudio.Forms.Utilities public static Image[] entityImages => _entityImages ??= Resources.entities_sheet.CreateImageList(32).ToArray(); - public static PCKFile.FileData CreateNewBehaviourFile() + public static PckFile.FileData CreateNewBehaviourFile() { - PCKFile.FileData file = new PCKFile.FileData($"behaviours.bin", PCKFile.FileData.FileType.BehavioursFile); + PckFile.FileData file = new PckFile.FileData($"behaviours.bin", PckFile.FileData.FileType.BehavioursFile); using (var stream = new MemoryStream()) { diff --git a/PCK-Studio/Forms/Utilities/MaterialUtil.cs b/PCK-Studio/Forms/Utilities/MaterialUtil.cs index 3a3908bf..9e6310cf 100644 --- a/PCK-Studio/Forms/Utilities/MaterialUtil.cs +++ b/PCK-Studio/Forms/Utilities/MaterialUtil.cs @@ -7,6 +7,7 @@ using PckStudio.Properties; using PckStudio.Classes.FileTypes; using PckStudio.Classes.IO.Materials; using PckStudio.Classes.Extentions; +using OMI.Formats.Pck; namespace PckStudio.Forms.Utilities { @@ -16,9 +17,9 @@ namespace PckStudio.Forms.Utilities private static Image[] _entityImages; public static Image[] entityImages => _entityImages ??= Resources.entities_sheet.CreateImageList(32).ToArray(); - public static PCKFile.FileData CreateNewMaterialsFile() + public static PckFile.FileData CreateNewMaterialsFile() { - PCKFile.FileData file = new PCKFile.FileData($"entityMaterials.bin", PCKFile.FileData.FileType.MaterialFile); + PckFile.FileData file = new PckFile.FileData($"entityMaterials.bin", PckFile.FileData.FileType.MaterialFile); using (var stream = new MemoryStream()) { diff --git a/PCK-Studio/Forms/Utilities/TextureConverterUtility.cs b/PCK-Studio/Forms/Utilities/TextureConverterUtility.cs index baecc456..0fc5cedc 100644 --- a/PCK-Studio/Forms/Utilities/TextureConverterUtility.cs +++ b/PCK-Studio/Forms/Utilities/TextureConverterUtility.cs @@ -6,12 +6,13 @@ using System.Windows.Forms; using MetroFramework.Forms; using PckStudio.Properties; using PckStudio.Classes.FileTypes; +using OMI.Formats.Pck; namespace PckStudio.Forms.Utilities { public partial class TextureConverterUtility : MetroForm { - public TextureConverterUtility(TreeView tv0, PCKFile pck) + public TextureConverterUtility(TreeView tv0, PckFile pck) { InitializeComponent(); TView = tv0; @@ -23,7 +24,7 @@ namespace PckStudio.Forms.Utilities bool ToPC = true; - PCKFile Pck; + PckFile Pck; TreeView TView; @@ -313,13 +314,13 @@ namespace PckStudio.Forms.Utilities switch (tn.Text) { case ("terrain.png"): - Terrain = Image.FromStream(new MemoryStream(((PCKFile.FileData)(tn.Tag)).Data)); + Terrain = Image.FromStream(new MemoryStream(((PckFile.FileData)(tn.Tag)).Data)); break; case ("items.png"): - Items = Image.FromStream(new MemoryStream(((PCKFile.FileData)(tn.Tag)).Data)); + Items = Image.FromStream(new MemoryStream(((PckFile.FileData)(tn.Tag)).Data)); break; case ("art"): - painting = Image.FromStream(new MemoryStream(((PCKFile.FileData)(tn.Nodes[0].Tag)).Data)); + painting = Image.FromStream(new MemoryStream(((PckFile.FileData)(tn.Nodes[0].Tag)).Data)); break; case ("mob"): EntityNode = tn; @@ -429,7 +430,7 @@ namespace PckStudio.Forms.Utilities string Outpath = "assets\\minecraft\\textures\\"; - foreach (PCKFile.FileData mf in Pck.Files) + foreach (PckFile.FileData mf in Pck.Files) { FileInfo file = new FileInfo(Environment.CurrentDirectory + "\\Temp\\" + @"\" + mf.Filename); file.Directory.Create(); // If the directory already exists, this method does nothing. @@ -454,7 +455,7 @@ namespace PckStudio.Forms.Utilities string Outpath = "assets\\minecraft\\textures\\"; - foreach (PCKFile.FileData mf in Pck.Files) + foreach (PckFile.FileData mf in Pck.Files) { FileInfo file = new FileInfo(Environment.CurrentDirectory + "\\Temp\\" + @"\" + mf.Filename); file.Directory.Create(); // If the directory already exists, this method does nothing. @@ -479,7 +480,7 @@ namespace PckStudio.Forms.Utilities string Outpath = "assets\\minecraft\\textures\\"; - foreach (PCKFile.FileData mf in Pck.Files) + foreach (PckFile.FileData mf in Pck.Files) { FileInfo file = new FileInfo(Environment.CurrentDirectory + "\\Temp\\" + @"\" + mf.Filename); file.Directory.Create(); // If the directory already exists, this method does nothing. diff --git a/PCK-Studio/Forms/Utilities/installWiiU.cs b/PCK-Studio/Forms/Utilities/installWiiU.cs index 557708be..34dfcf78 100644 --- a/PCK-Studio/Forms/Utilities/installWiiU.cs +++ b/PCK-Studio/Forms/Utilities/installWiiU.cs @@ -13,6 +13,8 @@ using PckStudio.Classes.IO.PCK; using PckStudio.Classes.Misc; using OMI.Formats.Archive; using OMI.Workers.Archive; +using OMI.Workers.Pck; +using OMI.Formats.Pck; namespace PckStudio.Forms { @@ -106,7 +108,7 @@ namespace PckStudio.Forms } } List pcks = new List(); - PCKFile currentPCK = null; + PckFile currentPCK = null; private void updateDatabase() { @@ -430,10 +432,14 @@ namespace PckStudio.Forms private string GetPackID(string filename) { - var fs = File.OpenRead(filename); - currentPCK = PCKFileReader.Read(fs, false); - fs.Close(); - return currentPCK.GetFile("0", PCKFile.FileData.FileType.InfoFile).Properties.GetProperty("PACKID").Item2; + var reader = new PckFileReader(); + currentPCK = reader.FromFile(filename); + if (currentPCK.TryGetFile("0", PckFile.FileData.FileType.InfoFile, out var file) && + file.Properties.HasProperty("PACKID")) + { + file.Properties.GetProperty("PACKID"); + } + throw new KeyNotFoundException(); } private void GetARCFromConsole() diff --git a/PCK-Studio/Forms/Utilities/pckCenterOpen.cs b/PCK-Studio/Forms/Utilities/pckCenterOpen.cs index b1f150d0..6aebcb5c 100644 --- a/PCK-Studio/Forms/Utilities/pckCenterOpen.cs +++ b/PCK-Studio/Forms/Utilities/pckCenterOpen.cs @@ -17,6 +17,8 @@ using PckStudio; using System.IO.Compression; using PckStudio.Classes.FileTypes; using PckStudio.Classes.IO.PCK; +using OMI.Formats.Pck; +using OMI.Workers.Pck; namespace PckStudio.Forms { @@ -134,16 +136,14 @@ namespace PckStudio.Forms //MessageBox.Show(root);//debug thingy to make sure filepath is correct //add all skins to a list - List skinsList = new List(); - List capesList = new List(); + List skinsList = new List(); + List capesList = new List(); - PCKFile pck = null; - using (var stream = File.OpenRead(Program.AppData + "/PCK-Center/myPcks/" + mod + ".pck")) - { - pck = PCKFileReader.Read(stream, false); // sets opened pck - } - PCKFile currentPCK = pck; //sets opened pck - foreach (PCKFile.FileData skin in currentPCK.Files) + PckFile pck = null; + + var reader = new PckFileReader(); + PckFile currentPCK = reader.FromFile(Program.AppData + "/PCK-Center/myPcks/" + mod + ".pck"); + foreach (PckFile.FileData skin in currentPCK.Files) { if (skin.Filename.Count() == 19) { @@ -177,7 +177,7 @@ namespace PckStudio.Forms writeSkins.WriteLine(" \"skins\": ["); int skinAmount = 0; - foreach (PCKFile.FileData newSkin in skinsList) + foreach (PckFile.FileData newSkin in skinsList) { skinAmount += 1; string skinName = "skinName"; @@ -234,7 +234,7 @@ namespace PckStudio.Forms { writeSkins.WriteLine("{"); int newSkinCount = 0; - foreach (PCKFile.FileData newSkin in skinsList) + foreach (PckFile.FileData newSkin in skinsList) { newSkinCount += 1; @@ -1022,7 +1022,7 @@ namespace PckStudio.Forms } //adds skin textures - foreach (PCKFile.FileData skinTexture in skinsList) + foreach (PckFile.FileData skinTexture in skinsList) { var ms = new MemoryStream(skinTexture.Data); Bitmap saveSkin = new Bitmap(Image.FromStream(ms)); @@ -1042,7 +1042,7 @@ namespace PckStudio.Forms } //adds cape textures - foreach (PCKFile.FileData capeTexture in capesList) + foreach (PckFile.FileData capeTexture in capesList) { File.WriteAllBytes(root + "/" + capeTexture.Filename, capeTexture.Data); } diff --git a/PCK-Studio/MainForm.cs b/PCK-Studio/MainForm.cs index c65263a4..030b2bd9 100644 --- a/PCK-Studio/MainForm.cs +++ b/PCK-Studio/MainForm.cs @@ -10,12 +10,12 @@ using System.Drawing.Imaging; using OMI.Formats.GameRule; using OMI.Workers.GameRule; +using OMI.Workers.Pck; using OMI.Formats.Languages; using OMI.Workers.Language; using PckStudio.Properties; using PckStudio.Classes.FileTypes; -using PckStudio.Classes.IO.PCK; using PckStudio.Classes.Utils; using PckStudio.Classes.Utils.ARC; using PckStudio.Classes._3ds.Utils; @@ -26,20 +26,22 @@ using PckStudio.Forms.Editor; using PckStudio.Forms.Additional_Popups.Animation; using PckStudio.Forms.Additional_Popups; using PckStudio.Classes.Misc; +using OMI.Formats.Pck; +using PckStudio.Classes.IO.PCK; namespace PckStudio { public partial class MainForm : MetroFramework.Forms.MetroForm { string saveLocation = string.Empty; - PCKFile currentPCK = null; + PckFile currentPCK = null; bool wasModified = false; bool isTemplateFile = false; bool needsUpdate = false; bool isSelectingTab = false; - readonly Dictionary> pckFileTypeHandler; + readonly Dictionary> pckFileTypeHandler; public MainForm() { @@ -74,23 +76,23 @@ namespace PckStudio labelVersion.Text += Program.Info.BuildVersion + " " + Program.Info.LastCommitHash; #endif - pckFileTypeHandler = new Dictionary>(15) + pckFileTypeHandler = new Dictionary>(15) { - [PCKFile.FileData.FileType.SkinFile] = HandleSkinFile, - [PCKFile.FileData.FileType.CapeFile] = null, - [PCKFile.FileData.FileType.TextureFile] = HandleTextureFile, - [PCKFile.FileData.FileType.UIDataFile] = _ => throw new NotSupportedException("unused in-game"), - [PCKFile.FileData.FileType.InfoFile] = null, - [PCKFile.FileData.FileType.TexturePackInfoFile] = null, - [PCKFile.FileData.FileType.LocalisationFile] = HandleLocalisationFile, - [PCKFile.FileData.FileType.GameRulesFile] = HandleGameRuleFile, - [PCKFile.FileData.FileType.AudioFile] = HandleAudioFile, - [PCKFile.FileData.FileType.ColourTableFile] = HandleColourFile, - [PCKFile.FileData.FileType.GameRulesHeader] = HandleGameRuleFile, - [PCKFile.FileData.FileType.SkinDataFile] = null, - [PCKFile.FileData.FileType.ModelsFile] = HandleModelsFile, - [PCKFile.FileData.FileType.BehavioursFile] = HandleBehavioursFile, - [PCKFile.FileData.FileType.MaterialFile] = HandleMaterialFile, + [PckFile.FileData.FileType.SkinFile] = HandleSkinFile, + [PckFile.FileData.FileType.CapeFile] = null, + [PckFile.FileData.FileType.TextureFile] = HandleTextureFile, + [PckFile.FileData.FileType.UIDataFile] = _ => throw new NotSupportedException("unused in-game"), + [PckFile.FileData.FileType.InfoFile] = null, + [PckFile.FileData.FileType.TexturePackInfoFile] = null, + [PckFile.FileData.FileType.LocalisationFile] = HandleLocalisationFile, + [PckFile.FileData.FileType.GameRulesFile] = HandleGameRuleFile, + [PckFile.FileData.FileType.AudioFile] = HandleAudioFile, + [PckFile.FileData.FileType.ColourTableFile] = HandleColourFile, + [PckFile.FileData.FileType.GameRulesHeader] = HandleGameRuleFile, + [PckFile.FileData.FileType.SkinDataFile] = null, + [PckFile.FileData.FileType.ModelsFile] = HandleModelsFile, + [PckFile.FileData.FileType.BehavioursFile] = HandleBehavioursFile, + [PckFile.FileData.FileType.MaterialFile] = HandleMaterialFile, }; } @@ -115,18 +117,18 @@ namespace PckStudio if (currentPCK == null) RPC.SetPresence("An Open Source .PCK File Editor", "Program by PhoenixARC"); - skinToolStripMenuItem1.Click += (sender, e) => setFileType_Click(sender, e, PCKFile.FileData.FileType.SkinFile); - capeToolStripMenuItem.Click += (sender, e) => setFileType_Click(sender, e, PCKFile.FileData.FileType.CapeFile); - textureToolStripMenuItem.Click += (sender, e) => setFileType_Click(sender, e, PCKFile.FileData.FileType.TextureFile); - languagesFileLOCToolStripMenuItem.Click += (sender, e) => setFileType_Click(sender, e, PCKFile.FileData.FileType.LocalisationFile); - gameRulesFileGRFToolStripMenuItem.Click += (sender, e) => setFileType_Click(sender, e, PCKFile.FileData.FileType.GameRulesFile); - audioPCKFileToolStripMenuItem.Click += (sender, e) => setFileType_Click(sender, e, PCKFile.FileData.FileType.AudioFile); - coloursCOLFileToolStripMenuItem.Click += (sender, e) => setFileType_Click(sender, e, PCKFile.FileData.FileType.ColourTableFile); - gameRulesHeaderGRHToolStripMenuItem.Click += (sender, e) => setFileType_Click(sender, e, PCKFile.FileData.FileType.GameRulesHeader); - skinsPCKToolStripMenuItem.Click += (sender, e) => setFileType_Click(sender, e, PCKFile.FileData.FileType.SkinDataFile); - modelsFileBINToolStripMenuItem.Click += (sender, e) => setFileType_Click(sender, e, PCKFile.FileData.FileType.ModelsFile); - behavioursFileBINToolStripMenuItem.Click += (sender, e) => setFileType_Click(sender, e, PCKFile.FileData.FileType.BehavioursFile); - entityMaterialsFileBINToolStripMenuItem.Click += (sender, e) => setFileType_Click(sender, e, PCKFile.FileData.FileType.MaterialFile); + skinToolStripMenuItem1.Click += (sender, e) => setFileType_Click(sender, e, PckFile.FileData.FileType.SkinFile); + capeToolStripMenuItem.Click += (sender, e) => setFileType_Click(sender, e, PckFile.FileData.FileType.CapeFile); + textureToolStripMenuItem.Click += (sender, e) => setFileType_Click(sender, e, PckFile.FileData.FileType.TextureFile); + languagesFileLOCToolStripMenuItem.Click += (sender, e) => setFileType_Click(sender, e, PckFile.FileData.FileType.LocalisationFile); + gameRulesFileGRFToolStripMenuItem.Click += (sender, e) => setFileType_Click(sender, e, PckFile.FileData.FileType.GameRulesFile); + audioPCKFileToolStripMenuItem.Click += (sender, e) => setFileType_Click(sender, e, PckFile.FileData.FileType.AudioFile); + coloursCOLFileToolStripMenuItem.Click += (sender, e) => setFileType_Click(sender, e, PckFile.FileData.FileType.ColourTableFile); + gameRulesHeaderGRHToolStripMenuItem.Click += (sender, e) => setFileType_Click(sender, e, PckFile.FileData.FileType.GameRulesHeader); + skinsPCKToolStripMenuItem.Click += (sender, e) => setFileType_Click(sender, e, PckFile.FileData.FileType.SkinDataFile); + modelsFileBINToolStripMenuItem.Click += (sender, e) => setFileType_Click(sender, e, PckFile.FileData.FileType.ModelsFile); + behavioursFileBINToolStripMenuItem.Click += (sender, e) => setFileType_Click(sender, e, PckFile.FileData.FileType.BehavioursFile); + entityMaterialsFileBINToolStripMenuItem.Click += (sender, e) => setFileType_Click(sender, e, PckFile.FileData.FileType.MaterialFile); try { @@ -158,39 +160,40 @@ namespace PckStudio } } - private PCKFile openPck(string filePath) + private PckFile openPck(string filePath) { - PCKFile pck = null; - using (var fileStream = File.OpenRead(filePath)) - { - isTemplateFile = false; - saveLocation = filePath; - try - { - pck = PCKFileReader.Read(fileStream, LittleEndianCheckBox.Checked); - metroLabel3.Text = "Current PCK File: " + Path.GetFileName(filePath); - } - catch (OverflowException ex) - { - MessageBox.Show("Failed to open pck\n" + - $"Try {(LittleEndianCheckBox.Checked ? "unchecking" : "checking")} the 'Open/Save as Vita/PS4 pck' check box in the upper right corner.", - "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - Debug.WriteLine(ex.Message); - } - catch (Exception ex) - { - MessageBox.Show("Failed to open pck\n" + - "If this is an Audio/Music Cues pck, please use the specialized editor while inside of the parent pck.", - "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - Debug.WriteLine("Can't open pck file of type: " + pck?.type.ToString()); - } - } + isTemplateFile = false; + saveLocation = filePath; + var reader = new PckFileReader(); + PckFile pck = reader.FromFile(filePath); + + metroLabel3.Text = "Current PCK File: " + Path.GetFileName(filePath); + // using (var fileStream = File.OpenRead(filePath)) + //{ + // try + // { + // } + // catch (OverflowException ex) + // { + // MessageBox.Show("Failed to open pck\n" + + // $"Try {(LittleEndianCheckBox.Checked ? "unchecking" : "checking")} the 'Open/Save as Vita/PS4 pck' check box in the upper right corner.", + // "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + // Debug.WriteLine(ex.Message); + // } + // catch (Exception ex) + // { + // MessageBox.Show("Failed to open pck\n" + + // "If this is an Audio/Music Cues pck, please use the specialized editor while inside of the parent pck.", + // "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + // Debug.WriteLine("Can't open pck file of type: " + pck?.type.ToString()); + // } + //} return pck; } private void CheckForPasswordAndRemove() { - if (currentPCK.TryGetFile("0", PCKFile.FileData.FileType.InfoFile, out PCKFile.FileData file)) + if (currentPCK.TryGetFile("0", PckFile.FileData.FileType.InfoFile, out PckFile.FileData file)) { file.Properties.RemoveAll(t => t.property.Equals("LOCK")); } @@ -271,7 +274,7 @@ namespace PckStudio return BuildNodeTreeBySeperator(subNode.Nodes, subPath, seperator); } - private void BuildPckTreeView(TreeNodeCollection root, PCKFile pckFile, string parentPath = "") + private void BuildPckTreeView(TreeNodeCollection root, PckFile pckFile, string parentPath = "") { foreach (var file in pckFile.Files) { @@ -282,13 +285,14 @@ namespace PckStudio node.Tag = file; switch (file.Filetype) { - case PCKFile.FileData.FileType.SkinDataFile: - case PCKFile.FileData.FileType.TexturePackInfoFile: + case PckFile.FileData.FileType.SkinDataFile: + case PckFile.FileData.FileType.TexturePackInfoFile: using (var stream = new MemoryStream(file.Data)) { try { - PCKFile subPCKfile = PCKFileReader.Read(stream, LittleEndianCheckBox.Checked); + var writer = new PckFileReader(LittleEndianCheckBox.Checked ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian); + PckFile subPCKfile = writer.FromStream(stream); // passes parent path to remove from sub pck filepaths BuildPckTreeView(node.Nodes, subPCKfile, file.Filename + "/"); } @@ -313,12 +317,12 @@ namespace PckStudio { // In case the Rename function was just used and the selected node name no longer matches the file name string filepath = string.Empty; - if(treeViewMain.SelectedNode is TreeNode node && node.Tag is PCKFile.FileData file) + if(treeViewMain.SelectedNode is TreeNode node && node.Tag is PckFile.FileData file) filepath = file.Filename; treeViewMain.Nodes.Clear(); BuildPckTreeView(treeViewMain.Nodes, currentPCK); - if (isTemplateFile && currentPCK.HasFile("Skins.pck", PCKFile.FileData.FileType.SkinDataFile)) + if (isTemplateFile && currentPCK.HasFile("Skins.pck", PckFile.FileData.FileType.SkinDataFile)) { TreeNode skinsNode = treeViewMain.Nodes.Find("Skins.pck", false).FirstOrDefault(); TreeNode folderNode = CreateNode("Skins"); @@ -333,7 +337,7 @@ namespace PckStudio // Looks kinda nuts but this line of code is responsible for finding the correct node that was originally selected treeViewMain.SelectedNode = treeViewMain.Nodes.Find(Path.GetFileName(filepath), true).ToList() - .Find(t => (t.Tag as PCKFile.FileData).Filename == filepath); + .Find(t => (t.Tag as PckFile.FileData).Filename == filepath); } } @@ -348,7 +352,7 @@ namespace PckStudio return true; } - private void HandleTextureFile(PCKFile.FileData file) + private void HandleTextureFile(PckFile.FileData file) { if (IsFilePathMipMapped(file.Filename) && currentPCK.Files.Find(pckfile => @@ -356,7 +360,7 @@ namespace PckStudio pckfile.Filename.Equals( file.Filename.Remove(file.Filename.Length - 12 - Path.GetExtension(file.Filename).Length) + Path.GetExtension(file.Filename))) - is PCKFile.FileData originalAnimationFile) + is PckFile.FileData originalAnimationFile) { file = originalAnimationFile; } @@ -373,7 +377,7 @@ namespace PckStudio } } - private void HandleGameRuleFile(PCKFile.FileData file) + private void HandleGameRuleFile(PckFile.FileData file) { using GameRuleFileEditor grfEditor = new GameRuleFileEditor(file); wasModified = grfEditor.ShowDialog(this) == DialogResult.OK; @@ -399,7 +403,7 @@ namespace PckStudio RPC.SetPresence("An Open Source .PCK File Editor", "Program by PhoenixARC"); } - private void HandleAudioFile(PCKFile.FileData file) + private void HandleAudioFile(PckFile.FileData file) { if (!TryGetLocFile(out LOCFile locFile)) throw new Exception("No .loc File found."); @@ -411,14 +415,14 @@ namespace PckStudio } } - private void HandleLocalisationFile(PCKFile.FileData file) + private void HandleLocalisationFile(PckFile.FileData file) { using LOCEditor locedit = new LOCEditor(file); wasModified = locedit.ShowDialog(this) == DialogResult.OK; UpdateRPC(); } - private void HandleColourFile(PCKFile.FileData file) + private void HandleColourFile(PckFile.FileData file) { if (file.Size == 0) { @@ -430,7 +434,7 @@ namespace PckStudio wasModified = diag.ShowDialog(this) == DialogResult.OK; } - public void HandleSkinFile(PCKFile.FileData file) + public void HandleSkinFile(PckFile.FileData file) { if (file.Properties.HasProperty("BOX")) { @@ -453,16 +457,16 @@ namespace PckStudio } } } - public void HandleModelsFile(PCKFile.FileData file) + public void HandleModelsFile(PckFile.FileData file) { MessageBox.Show("Models.bin support has not been implemented. You can use the Spark Editor for the time being to edit these files.", "Not implemented yet."); } - public void HandleBehavioursFile(PCKFile.FileData file) + public void HandleBehavioursFile(PckFile.FileData file) { using BehaviourEditor edit = new BehaviourEditor(file); wasModified = edit.ShowDialog(this) == DialogResult.OK; } - public void HandleMaterialFile(PCKFile.FileData file) + public void HandleMaterialFile(PckFile.FileData file) { using MaterialsEditor edit = new MaterialsEditor(file); wasModified = edit.ShowDialog(this) == DialogResult.OK; @@ -475,7 +479,7 @@ namespace PckStudio pictureBoxImagePreview.Image = Resources.NoImageFound; var node = e.Node; viewFileInfoToolStripMenuItem.Visible = false; - if (node is TreeNode t && t.Tag is PCKFile.FileData file) + if (node is TreeNode t && t.Tag is PckFile.FileData file) { viewFileInfoToolStripMenuItem.Visible = true; if (file.Properties.HasProperty("BOX")) @@ -492,9 +496,9 @@ namespace PckStudio switch (file.Filetype) { - case PCKFile.FileData.FileType.SkinFile: - case PCKFile.FileData.FileType.CapeFile: - case PCKFile.FileData.FileType.TextureFile: + case PckFile.FileData.FileType.SkinFile: + case PckFile.FileData.FileType.CapeFile: + case PckFile.FileData.FileType.TextureFile: // TODO: Add tga support if (Path.GetExtension(file.Filename) == ".tga") break; using (MemoryStream stream = new MemoryStream(file.Data)) @@ -515,7 +519,7 @@ namespace PckStudio if ((file.Filename.StartsWith("res/textures/blocks/") || file.Filename.StartsWith("res/textures/items/")) && !file.Filename.EndsWith("clock.png") && !file.Filename.EndsWith("compass.png") && - file.Filetype == PCKFile.FileData.FileType.TextureFile + file.Filetype == PckFile.FileData.FileType.TextureFile && !IsFilePathMipMapped(file.Filename)) { buttonEdit.Text = "EDIT TEXTURE ANIMATION"; @@ -523,22 +527,22 @@ namespace PckStudio } break; - case PCKFile.FileData.FileType.LocalisationFile: + case PckFile.FileData.FileType.LocalisationFile: buttonEdit.Text = "EDIT LOC"; buttonEdit.Visible = true; break; - case PCKFile.FileData.FileType.AudioFile: + case PckFile.FileData.FileType.AudioFile: buttonEdit.Text = "EDIT MUSIC CUES"; buttonEdit.Visible = true; break; - case PCKFile.FileData.FileType.ColourTableFile when file.Filename == "colours.col": + case PckFile.FileData.FileType.ColourTableFile when file.Filename == "colours.col": buttonEdit.Text = "EDIT COLORS"; buttonEdit.Visible = true; break; - case PCKFile.FileData.FileType.BehavioursFile when file.Filename == "behaviours.bin": + case PckFile.FileData.FileType.BehavioursFile when file.Filename == "behaviours.bin": buttonEdit.Text = "EDIT BEHAVIOURS"; buttonEdit.Visible = true; break; @@ -553,7 +557,7 @@ namespace PckStudio { var node = treeViewMain.SelectedNode; if (node == null) return; - if (node.Tag is PCKFile.FileData file) + if (node.Tag is PckFile.FileData file) { using SaveFileDialog exFile = new SaveFileDialog(); exFile.FileName = Path.GetFileName(file.Filename); @@ -584,7 +588,7 @@ namespace PckStudio { GetAllChildNodes(node.Nodes).ForEach(fileNode => { - if(fileNode.Tag is PCKFile.FileData file) + if(fileNode.Tag is PckFile.FileData file) { Directory.CreateDirectory($"{dialog.SelectedPath}/{Path.GetDirectoryName(file.Filename)}"); File.WriteAllBytes($"{dialog.SelectedPath}/{file.Filename}", file.Data); @@ -634,7 +638,7 @@ namespace PckStudio private void Save(string filePath) { bool isSkinsPCK = false; - if (!currentPCK.TryGetFile("0", PCKFile.FileData.FileType.InfoFile, out PCKFile.FileData _)) + if (!currentPCK.TryGetFile("0", PckFile.FileData.FileType.InfoFile, out PckFile.FileData _)) { switch(MessageBox.Show(this, "The info file, \"0\", was not detected. Would you like to save as a Skins.pck archive?", "Save as Skins archive?", MessageBoxButtons.YesNoCancel)) { @@ -649,17 +653,17 @@ namespace PckStudio return; // Cancel operation } } - using (var fs = File.OpenWrite(filePath)) - { - PCKFileWriter.Write(fs, currentPCK, LittleEndianCheckBox.Checked, isSkinsPCK); - } + currentPCK.HasVerionString = isSkinsPCK; + + var writer = new PckFileWriter(currentPCK, LittleEndianCheckBox.Checked ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian); + writer.WriteToFile(filePath); wasModified = false; MessageBox.Show("Saved Pck file", "File Saved"); } private void replaceToolStripMenuItem_Click(object sender, EventArgs e) { - if (treeViewMain.SelectedNode.Tag is PCKFile.FileData file) + if (treeViewMain.SelectedNode.Tag is PckFile.FileData file) { using var ofd = new OpenFileDialog(); // Suddenly, and randomly, this started throwing an exception because it wasn't formatted correctly? So now it's formatted correctly and now displays the file type name in the dialog. @@ -668,7 +672,7 @@ namespace PckStudio switch (file.Filetype) { - case PCKFile.FileData.FileType.TextureFile: + case PckFile.FileData.FileType.TextureFile: if (Path.GetExtension(file.Filename) == ".png") extra_extensions = ";*.tga"; else if (Path.GetExtension(file.Filename) == ".tga") extra_extensions = ";*.png"; break; @@ -698,11 +702,11 @@ namespace PckStudio string path = node.FullPath; - if (node.Tag is PCKFile.FileData) + if (node.Tag is PckFile.FileData) { - PCKFile.FileData file = node.Tag as PCKFile.FileData; + PckFile.FileData file = node.Tag as PckFile.FileData; // remove loc key if its a skin/cape - if (file.Filetype == PCKFile.FileData.FileType.SkinFile || file.Filetype == PCKFile.FileData.FileType.CapeFile) + if (file.Filetype == PckFile.FileData.FileType.SkinFile || file.Filetype == PckFile.FileData.FileType.CapeFile) { if (TryGetLocFile(out LOCFile locFile)) { @@ -737,9 +741,9 @@ namespace PckStudio using RenamePrompt diag = new RenamePrompt(node.FullPath); if (diag.ShowDialog(this) == DialogResult.OK) { - if (node.Tag is PCKFile.FileData file - && file.Filetype is not PCKFile.FileData.FileType.TexturePackInfoFile - && file.Filetype is not PCKFile.FileData.FileType.SkinDataFile) + if (node.Tag is PckFile.FileData file + && file.Filetype is not PckFile.FileData.FileType.TexturePackInfoFile + && file.Filetype is not PckFile.FileData.FileType.SkinDataFile) { file.Filename = diag.NewText; } @@ -747,7 +751,7 @@ namespace PckStudio { foreach (var childNode in GetAllChildNodes(node.Nodes)) { - if (childNode.Tag is PCKFile.FileData folderFile && + if (childNode.Tag is PckFile.FileData folderFile && childNode.FullPath.StartsWith(childNode.FullPath)) { folderFile.Filename = diag.NewText + childNode.FullPath.Substring(childNode.FullPath.Length); @@ -779,14 +783,14 @@ namespace PckStudio if (add.ShowDialog() == DialogResult.OK) { - if (currentPCK.HasFile("Skins.pck", PCKFile.FileData.FileType.SkinDataFile)) // Prioritize Skins.pck + if (currentPCK.HasFile("Skins.pck", PckFile.FileData.FileType.SkinDataFile)) // Prioritize Skins.pck { TreeNode subPCK = treeViewMain.Nodes.Find("Skins.pck", false).FirstOrDefault(); if (subPCK.Nodes.ContainsKey("Skins")) add.SkinFile.Filename = add.SkinFile.Filename.Insert(0, "Skins/"); add.SkinFile.Filename = add.SkinFile.Filename.Insert(0, "Skins.pck/"); TreeNode newNode = new TreeNode(Path.GetFileName(add.SkinFile.Filename)); newNode.Tag = add.SkinFile; - SetPckFileIcon(newNode, PCKFile.FileData.FileType.SkinFile); + SetPckFileIcon(newNode, PckFile.FileData.FileType.SkinFile); subPCK.Nodes.Add(newNode); RebuildSubPCK(newNode); } @@ -797,14 +801,14 @@ namespace PckStudio } if (add.HasCape) { - if (currentPCK.HasFile("Skins.pck", PCKFile.FileData.FileType.SkinDataFile)) // Prioritize Skins.pck + if (currentPCK.HasFile("Skins.pck", PckFile.FileData.FileType.SkinDataFile)) // Prioritize Skins.pck { TreeNode subPCK = treeViewMain.Nodes.Find("Skins.pck", false).FirstOrDefault(); if (subPCK.Nodes.ContainsKey("Skins")) add.CapeFile.Filename = add.CapeFile.Filename.Insert(0, "Skins/"); add.CapeFile.Filename = add.CapeFile.Filename.Insert(0, "Skins.pck/"); TreeNode newNode = new TreeNode(Path.GetFileName(add.CapeFile.Filename)); newNode.Tag = add.CapeFile; - SetPckFileIcon(newNode, PCKFile.FileData.FileType.SkinFile); + SetPckFileIcon(newNode, PckFile.FileData.FileType.SkinFile); subPCK.Nodes.Add(newNode); RebuildSubPCK(newNode); } @@ -821,14 +825,14 @@ namespace PckStudio } } - private PCKFile.FileData CreateNewAudioFile(bool isLittle) + private PckFile.FileData CreateNewAudioFile(bool isLittle) { // create actual valid pck file structure PCKAudioFile audioPck = new PCKAudioFile(); audioPck.AddCategory(PCKAudioFile.AudioCategory.EAudioType.Overworld); audioPck.AddCategory(PCKAudioFile.AudioCategory.EAudioType.Nether); audioPck.AddCategory(PCKAudioFile.AudioCategory.EAudioType.End); - PCKFile.FileData pckFileData = currentPCK.CreateNew("audio.pck", PCKFile.FileData.FileType.AudioFile); + PckFile.FileData pckFileData = currentPCK.CreateNew("audio.pck", PckFile.FileData.FileType.AudioFile); using (var stream = new MemoryStream()) { PCKAudioFileWriter.Write(stream, audioPck, isLittle); @@ -916,9 +920,9 @@ namespace PckStudio { parent = parent.Parent; Console.WriteLine(parent.Text); - if (parent.Tag is PCKFile.FileData f && - (f.Filetype is PCKFile.FileData.FileType.TexturePackInfoFile || - f.Filetype is PCKFile.FileData.FileType.SkinDataFile)) + if (parent.Tag is PckFile.FileData f && + (f.Filetype is PckFile.FileData.FileType.TexturePackInfoFile || + f.Filetype is PckFile.FileData.FileType.SkinDataFile)) return parent; } return null; @@ -931,30 +935,31 @@ namespace PckStudio TreeNode parent = GetSubPCK(childNode); if (parent == null) return; - PCKFile.FileData parent_file = parent.Tag as PCKFile.FileData; - if (parent_file.Filetype is PCKFile.FileData.FileType.TexturePackInfoFile || parent_file.Filetype is PCKFile.FileData.FileType.SkinDataFile) + PckFile.FileData parent_file = parent.Tag as PckFile.FileData; + if (parent_file.Filetype is PckFile.FileData.FileType.TexturePackInfoFile || parent_file.Filetype is PckFile.FileData.FileType.SkinDataFile) { Console.WriteLine("Rebuilding " + parent_file.Filename); - PCKFile newPCKFile = new PCKFile(3); + PckFile newPCKFile = new PckFile(3); foreach (TreeNode node in GetAllChildNodes(parent.Nodes)) { - if (node.Tag is PCKFile.FileData node_file) + if (node.Tag is PckFile.FileData node_file) { - PCKFile.FileData new_file = newPCKFile.CreateNew(node_file.Filename, node_file.Filetype); + PckFile.FileData new_file = newPCKFile.CreateNew(node_file.Filename, node_file.Filetype); foreach (var prop in node_file.Properties) new_file.Properties.Add(prop); new_file.SetData(node_file.Data); } } // Bool to add the XMLVersion property - bool isSkinsPCK = parent_file.Filetype is PCKFile.FileData.FileType.SkinDataFile; + bool isSkinsPCK = parent_file.Filetype is PckFile.FileData.FileType.SkinDataFile; using (MemoryStream ms = new MemoryStream()) { - PCKFileWriter.Write(ms, newPCKFile, LittleEndianCheckBox.Checked, isSkinsPCK); - parent_file.SetData(ms.ToArray()); - parent.Tag = parent_file; + var writer = new PckFileWriter(newPCKFile, LittleEndianCheckBox.Checked ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian); + writer.WriteToStream(ms); + parent_file.SetData(ms.ToArray()); + parent.Tag = parent_file; } BuildMainTreeView(); @@ -963,7 +968,7 @@ namespace PckStudio private void treeViewMain_DoubleClick(object sender, EventArgs e) { - if (treeViewMain.SelectedNode is TreeNode t && t.Tag is PCKFile.FileData file) + if (treeViewMain.SelectedNode is TreeNode t && t.Tag is PckFile.FileData file) { pckFileTypeHandler[file.Filetype]?.Invoke(file); } @@ -981,14 +986,14 @@ namespace PckStudio private void treeMeta_DoubleClick(object sender, EventArgs e) { if (treeMeta.SelectedNode is TreeNode subnode && subnode.Tag is ValueTuple property && - treeViewMain.SelectedNode is TreeNode node && node.Tag is PCKFile.FileData file) + treeViewMain.SelectedNode is TreeNode node && node.Tag is PckFile.FileData file) { int i = file.Properties.IndexOf(property); if (i != -1) { switch (property.Item1) { - case "ANIM" when file.Filetype == PCKFile.FileData.FileType.SkinFile: + case "ANIM" when file.Filetype == PckFile.FileData.FileType.SkinFile: try { using ANIMEditor diag = new ANIMEditor(property.Item2); @@ -1009,7 +1014,7 @@ namespace PckStudio } break; - case "BOX" when file.Filetype == PCKFile.FileData.FileType.SkinFile: + case "BOX" when file.Filetype == PckFile.FileData.FileType.SkinFile: try { using BoxEditor diag = new BoxEditor(property.Item2, IsSubPCKNode(treeViewMain.SelectedNode.FullPath)); @@ -1053,10 +1058,10 @@ namespace PckStudio private void cloneFileToolStripMenuItem_Click(object sender, EventArgs e) { TreeNode node = treeViewMain.SelectedNode; - PCKFile.FileData mfO = node.Tag as PCKFile.FileData; + PckFile.FileData mfO = node.Tag as PckFile.FileData; // Creates new empty file entry - PCKFile.FileData mf = new PCKFile.FileData(string.Empty, mfO.Filetype); + PckFile.FileData mf = new PckFile.FileData(string.Empty, mfO.Filetype); mf.SetData(mfO.Data); // adds file data to minefile string dirName = Path.GetDirectoryName(mfO.Filename); @@ -1098,7 +1103,7 @@ namespace PckStudio private void deleteEntryToolStripMenuItem_Click(object sender, EventArgs e) { if (treeMeta.SelectedNode is TreeNode t && t.Tag is ValueTuple property && - treeViewMain.SelectedNode is TreeNode main && main.Tag is PCKFile.FileData file && + treeViewMain.SelectedNode is TreeNode main && main.Tag is PckFile.FileData file && file.Properties.Remove(property)) { treeMeta.SelectedNode.Remove(); @@ -1111,7 +1116,7 @@ namespace PckStudio { treeMeta.Nodes.Clear(); if (treeViewMain.SelectedNode is TreeNode node && - node.Tag is PCKFile.FileData file) + node.Tag is PckFile.FileData file) { foreach (var property in file.Properties) { @@ -1123,7 +1128,7 @@ namespace PckStudio private void addEntryToolStripMenuItem_Click_1(object sender, EventArgs e) { if (treeViewMain.SelectedNode is TreeNode t && - t.Tag is PCKFile.FileData file) + t.Tag is PckFile.FileData file) { using addMeta add = new addMeta(); if (add.ShowDialog() == DialogResult.OK) @@ -1197,13 +1202,13 @@ namespace PckStudio edit.Show(); } - private PCKFile InitializePack(int packId, int packVersion, string packName, bool createSkinsPCK) + private PckFile InitializePack(int packId, int packVersion, string packName, bool createSkinsPCK) { - var newPck = new PCKFile(3); - var zeroFile = newPck.CreateNew("0", PCKFile.FileData.FileType.InfoFile); + var newPck = new PckFile(3); + var zeroFile = newPck.CreateNew("0", PckFile.FileData.FileType.InfoFile); zeroFile.Properties.Add(("PACKID", packId.ToString())); zeroFile.Properties.Add(("PACKVERSION", packVersion.ToString())); - var loc = newPck.CreateNew("localisation.loc", PCKFile.FileData.FileType.LocalisationFile); + var loc = newPck.CreateNew("localisation.loc", PckFile.FileData.FileType.LocalisationFile); var locFile = new LOCFile(); locFile.InitializeDefault(packName); using (var stream = new MemoryStream()) @@ -1214,51 +1219,62 @@ namespace PckStudio if (createSkinsPCK) { - PCKFile.FileData skinsPCKFile = newPck.CreateNew("Skins.pck", PCKFile.FileData.FileType.SkinDataFile); + PckFile.FileData skinsPCKFile = newPck.CreateNew("Skins.pck", PckFile.FileData.FileType.SkinDataFile); using (var stream = new MemoryStream()) { - PCKFileWriter.Write(stream, new PCKFile(3), LittleEndianCheckBox.Checked, true); + var writer = new PckFileWriter(new PckFile(3) + { + HasVerionString = true + }, + LittleEndianCheckBox.Checked + ? OMI.Endianness.LittleEndian + : OMI.Endianness.BigEndian); + writer.WriteToStream(stream); skinsPCKFile.SetData(stream.ToArray()); } } return newPck; } - private PCKFile InitializeTexturePack(int packId, int packVersion, string packName, string res, bool createSkinsPCK = false) + private PckFile InitializeTexturePack(int packId, int packVersion, string packName, string res, bool createSkinsPCK = false) { var newPck = InitializePack(packId, packVersion, packName, createSkinsPCK); - var texturepackInfo = newPck.CreateNew($"{res}/{res}Info.pck", PCKFile.FileData.FileType.TexturePackInfoFile); + var texturepackInfo = newPck.CreateNew($"{res}/{res}Info.pck", PckFile.FileData.FileType.TexturePackInfoFile); texturepackInfo.Properties.Add(("PACKID", "0")); texturepackInfo.Properties.Add(("DATAPATH", $"{res}Data.pck")); - PCKFile infoPCK = new PCKFile(3); + PckFile infoPCK = new PckFile(3); using (var ms = new MemoryStream()) { - var icon = infoPCK.CreateNew("icon.png", PCKFile.FileData.FileType.TextureFile); + var icon = infoPCK.CreateNew("icon.png", PckFile.FileData.FileType.TextureFile); Resources.TexturePackIcon.Save(ms, ImageFormat.Png); icon.SetData(ms.ToArray()); } using (var ms = new MemoryStream()) { - var comparison = infoPCK.CreateNew("comparison.png", PCKFile.FileData.FileType.TextureFile); + var comparison = infoPCK.CreateNew("comparison.png", PckFile.FileData.FileType.TextureFile); Resources.Comparison.Save(ms, ImageFormat.Png); comparison.SetData(ms.ToArray()); } using (var ms = new MemoryStream()) { - PCKFileWriter.Write(ms, infoPCK, LittleEndianCheckBox.Checked); - texturepackInfo.SetData(ms.ToArray()); + var writer = new PckFileWriter(new PckFile(3), + LittleEndianCheckBox.Checked + ? OMI.Endianness.LittleEndian + : OMI.Endianness.BigEndian); + writer.WriteToStream(ms); + texturepackInfo.SetData(ms.ToArray()); } return newPck; } - private PCKFile InitializeMashUpPack(int packId, int packVersion, string packName, string res) + private PckFile InitializeMashUpPack(int packId, int packVersion, string packName, string res) { var newPck = InitializeTexturePack(packId, packVersion, packName, res, true); - var gameRuleFile = newPck.CreateNew("GameRules.grf", PCKFile.FileData.FileType.GameRulesFile); + var gameRuleFile = newPck.CreateNew("GameRules.grf", PckFile.FileData.FileType.GameRulesFile); var grfFile = new GameRuleFile(); grfFile.AddRule("MapOptions", new KeyValuePair("seed", "0"), @@ -1275,7 +1291,7 @@ namespace PckStudio new KeyValuePair("spawnZ", "0") ); using (var stream = new MemoryStream()) - { + { var writer = new GameRuleFileWriter(grfFile); writer.WriteToStream(stream); gameRuleFile.SetData(stream.ToArray()); @@ -1360,7 +1376,7 @@ namespace PckStudio { // for now name edits are done through the 'rename' context menu item // TODO: add folder renaming - //e.CancelEdit = e.Node.Tag is PCKFile.FileData; + //e.CancelEdit = e.Node.Tag is PckFile.FileData; e.CancelEdit = true; } @@ -1376,12 +1392,15 @@ namespace PckStudio if (ofd.ShowDialog() == DialogResult.OK && sfd.ShowDialog() == DialogResult.OK) { - PCKFile pckfile = null; + PckFile pckfile = null; using (var fs = File.OpenRead(ofd.FileName)) { try { - pckfile = PCKFileReader.Read(fs, LittleEndianCheckBox.Checked); + var reader = new PckFileReader(LittleEndianCheckBox.Checked + ? OMI.Endianness.LittleEndian + : OMI.Endianness.BigEndian); + pckfile = reader.FromStream(fs); } catch (OverflowException ex) { @@ -1390,7 +1409,7 @@ namespace PckStudio Debug.WriteLine(ex.Message); } } - foreach (PCKFile.FileData file in pckfile.Files) + foreach (PckFile.FileData file in pckfile.Files) { string filepath = $"{sfd.SelectedPath}/{file.Filename}"; FileInfo fileinfo = new FileInfo(filepath); @@ -1454,19 +1473,19 @@ namespace PckStudio return; } // creates variable to indicate wether current pck skin structure is mashup or regular skin - bool hasSkinsPck = currentPCK.HasFile("Skins.pck", PCKFile.FileData.FileType.SkinDataFile); + bool hasSkinsPck = currentPCK.HasFile("Skins.pck", PckFile.FileData.FileType.SkinDataFile); foreach (var fullfilename in Directory.GetFiles(contents.SelectedPath, "*.png")) { string filename = Path.GetFileNameWithoutExtension(fullfilename); // sets file type based on wether its a cape or skin - PCKFile.FileData.FileType pckfiletype = filename.StartsWith("dlccape", StringComparison.OrdinalIgnoreCase) - ? PCKFile.FileData.FileType.CapeFile - : PCKFile.FileData.FileType.SkinFile; + PckFile.FileData.FileType pckfiletype = filename.StartsWith("dlccape", StringComparison.OrdinalIgnoreCase) + ? PckFile.FileData.FileType.CapeFile + : PckFile.FileData.FileType.SkinFile; string pckfilepath = (hasSkinsPck ? "Skins/" : string.Empty) + filename + ".png"; - PCKFile.FileData newFile = new PCKFile.FileData(pckfilepath, pckfiletype); + PckFile.FileData newFile = new PckFile.FileData(pckfilepath, pckfiletype); byte[] filedata = File.ReadAllBytes(fullfilename); newFile.SetData(filedata); @@ -1500,13 +1519,15 @@ namespace PckStudio } if (hasSkinsPck) { - var skinsfile = currentPCK.GetFile("Skins.pck", PCKFile.FileData.FileType.SkinDataFile); + var skinsfile = currentPCK.GetFile("Skins.pck", PckFile.FileData.FileType.SkinDataFile); using (var ms = new MemoryStream(skinsfile.Data)) { - var skinspck = PCKFileReader.Read(ms, LittleEndianCheckBox.Checked); + var reader = new PckFileReader(LittleEndianCheckBox.Checked ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian); + var skinspck = reader.FromStream(ms); skinspck.Files.Add(newFile); ms.Position = 0; - PCKFileWriter.Write(ms, skinspck, LittleEndianCheckBox.Checked); + var writer = new PckFileWriter(skinspck, LittleEndianCheckBox.Checked ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian); + writer.WriteToStream(ms); skinsfile.SetData(ms.ToArray()); } continue; @@ -1521,8 +1542,8 @@ namespace PckStudio private bool TryGetLocFile(out LOCFile locFile) { - if (!currentPCK.TryGetFile("localisation.loc", PCKFile.FileData.FileType.LocalisationFile, out PCKFile.FileData locdata) && - !currentPCK.TryGetFile("languages.loc", PCKFile.FileData.FileType.LocalisationFile, out locdata)) + if (!currentPCK.TryGetFile("localisation.loc", PckFile.FileData.FileType.LocalisationFile, out PckFile.FileData locdata) && + !currentPCK.TryGetFile("languages.loc", PckFile.FileData.FileType.LocalisationFile, out locdata)) { locFile = null; return false; @@ -1547,8 +1568,8 @@ namespace PckStudio private bool TrySetLocFile(in LOCFile locFile) { - if (!currentPCK.TryGetFile("localisation.loc", PCKFile.FileData.FileType.LocalisationFile, out PCKFile.FileData locdata) && - !currentPCK.TryGetFile("languages.loc", PCKFile.FileData.FileType.LocalisationFile, out locdata)) + if (!currentPCK.TryGetFile("localisation.loc", PckFile.FileData.FileType.LocalisationFile, out PckFile.FileData locdata) && + !currentPCK.TryGetFile("languages.loc", PckFile.FileData.FileType.LocalisationFile, out locdata)) { return false; } @@ -1581,7 +1602,7 @@ namespace PckStudio { string skinNameImport = Path.GetFileName(contents.FileName); byte[] data = File.ReadAllBytes(contents.FileName); - PCKFile.FileData mfNew = currentPCK.CreateNew(skinNameImport, PCKFile.FileData.FileType.SkinFile); + PckFile.FileData mfNew = currentPCK.CreateNew(skinNameImport, PckFile.FileData.FileType.SkinFile); mfNew.SetData(data); string propertyFile = Path.GetFileNameWithoutExtension(contents.FileName) + ".txt"; if (File.Exists(propertyFile)) @@ -1638,7 +1659,7 @@ namespace PckStudio TreeNodeCollection nodeCollection = treeViewMain.Nodes; if (treeViewMain.SelectedNode is TreeNode node) { - if (node.Tag is PCKFile.FileData) + if (node.Tag is PckFile.FileData) { if (node.Parent is TreeNode parentNode) { @@ -1871,63 +1892,63 @@ namespace PckStudio Process.Start("https://ko-fi.com/mattnl"); } - private void SetPckFileIcon(TreeNode node, PCKFile.FileData.FileType type) + private void SetPckFileIcon(TreeNode node, PckFile.FileData.FileType type) { switch (type) { - case PCKFile.FileData.FileType.AudioFile: + case PckFile.FileData.FileType.AudioFile: node.ImageIndex = 1; node.SelectedImageIndex = 1; break; - case PCKFile.FileData.FileType.LocalisationFile: + case PckFile.FileData.FileType.LocalisationFile: node.ImageIndex = 3; node.SelectedImageIndex = 3; break; - case PCKFile.FileData.FileType.TexturePackInfoFile: + case PckFile.FileData.FileType.TexturePackInfoFile: node.ImageIndex = 4; node.SelectedImageIndex = 4; break; - case PCKFile.FileData.FileType.ColourTableFile: + case PckFile.FileData.FileType.ColourTableFile: node.ImageIndex = 6; node.SelectedImageIndex = 6; break; - case PCKFile.FileData.FileType.ModelsFile: + case PckFile.FileData.FileType.ModelsFile: node.ImageIndex = 8; node.SelectedImageIndex = 8; break; - case PCKFile.FileData.FileType.SkinDataFile: + case PckFile.FileData.FileType.SkinDataFile: node.ImageIndex = 7; node.SelectedImageIndex = 7; break; - case PCKFile.FileData.FileType.GameRulesFile: + case PckFile.FileData.FileType.GameRulesFile: node.ImageIndex = 9; node.SelectedImageIndex = 9; break; - case PCKFile.FileData.FileType.GameRulesHeader: + case PckFile.FileData.FileType.GameRulesHeader: node.ImageIndex = 10; node.SelectedImageIndex = 10; break; - case PCKFile.FileData.FileType.InfoFile: + case PckFile.FileData.FileType.InfoFile: node.ImageIndex = 11; node.SelectedImageIndex = 11; break; - case PCKFile.FileData.FileType.SkinFile: + case PckFile.FileData.FileType.SkinFile: node.ImageIndex = 12; node.SelectedImageIndex = 12; break; - case PCKFile.FileData.FileType.CapeFile: + case PckFile.FileData.FileType.CapeFile: node.ImageIndex = 13; node.SelectedImageIndex = 13; break; - case PCKFile.FileData.FileType.TextureFile: + case PckFile.FileData.FileType.TextureFile: node.ImageIndex = 14; node.SelectedImageIndex = 14; break; - case PCKFile.FileData.FileType.BehavioursFile: + case PckFile.FileData.FileType.BehavioursFile: node.ImageIndex = 15; node.SelectedImageIndex = 15; break; - case PCKFile.FileData.FileType.MaterialFile: + case PckFile.FileData.FileType.MaterialFile: node.ImageIndex = 16; node.SelectedImageIndex = 16; break; @@ -1938,9 +1959,9 @@ namespace PckStudio } } - private void setFileType_Click(object sender, EventArgs e, PCKFile.FileData.FileType type) + private void setFileType_Click(object sender, EventArgs e, PckFile.FileData.FileType type) { - if (treeViewMain.SelectedNode is TreeNode t && t.Tag is PCKFile.FileData file) + if (treeViewMain.SelectedNode is TreeNode t && t.Tag is PckFile.FileData file) { Debug.WriteLine($"Setting {file.Filetype} to {type}"); file.Filetype = type; @@ -1959,7 +1980,7 @@ namespace PckStudio renamePrompt.TextLabel.Text = "Path"; if (renamePrompt.ShowDialog() == DialogResult.OK && !string.IsNullOrEmpty(renamePrompt.NewText)) { - var file = currentPCK.CreateNew(renamePrompt.NewText, PCKFile.FileData.FileType.TextureFile); + var file = currentPCK.CreateNew(renamePrompt.NewText, PckFile.FileData.FileType.TextureFile); file.SetData(File.ReadAllBytes(fileDialog.FileName)); BuildMainTreeView(); wasModified = true; @@ -1969,7 +1990,7 @@ namespace PckStudio private void viewFileInfoToolStripMenuItem_Click(object sender, EventArgs e) { - if (treeViewMain.SelectedNode.Tag is PCKFile.FileData file) + if (treeViewMain.SelectedNode.Tag is PckFile.FileData file) { MessageBox.Show( "File path: " + file.Filename + @@ -1982,7 +2003,7 @@ namespace PckStudio private void generateMipMapTextureToolStripMenuItem_Click(object sender, EventArgs e) { - if (treeViewMain.SelectedNode.Tag is PCKFile.FileData file && file.Filetype == PCKFile.FileData.FileType.TextureFile) + if (treeViewMain.SelectedNode.Tag is PckFile.FileData file && file.Filetype == PckFile.FileData.FileType.TextureFile) { string textureDirectory = Path.GetDirectoryName(file.Filename); string textureName = Path.GetFileNameWithoutExtension(file.Filename); @@ -2001,9 +2022,9 @@ namespace PckStudio { string mippedPath = textureDirectory + "/" + textureName + "MipMapLevel" + i + textureExtension; Debug.WriteLine(mippedPath); - if (currentPCK.HasFile(mippedPath, PCKFile.FileData.FileType.TextureFile)) - currentPCK.Files.Remove(currentPCK.GetFile(mippedPath, PCKFile.FileData.FileType.TextureFile)); - PCKFile.FileData MipMappedFile = new PCKFile.FileData(mippedPath, PCKFile.FileData.FileType.TextureFile); + if (currentPCK.HasFile(mippedPath, PckFile.FileData.FileType.TextureFile)) + currentPCK.Files.Remove(currentPCK.GetFile(mippedPath, PckFile.FileData.FileType.TextureFile)); + PckFile.FileData MipMappedFile = new PckFile.FileData(mippedPath, PckFile.FileData.FileType.TextureFile); Image originalTexture = Image.FromStream(new MemoryStream(file.Data)); int NewWidth = originalTexture.Width / (int)Math.Pow(2,i - 1); @@ -2032,13 +2053,13 @@ namespace PckStudio private void colourscolToolStripMenuItem_Click(object sender, EventArgs e) { - PCKFile.FileData NewColorFile; - if (currentPCK.TryGetFile("colours.col", PCKFile.FileData.FileType.ColourTableFile, out NewColorFile)) + PckFile.FileData NewColorFile; + if (currentPCK.TryGetFile("colours.col", PckFile.FileData.FileType.ColourTableFile, out NewColorFile)) { MessageBox.Show("A color table file already exists in this PCK and a new one cannot be created.", "Operation aborted"); return; } - NewColorFile = currentPCK.CreateNew("colours.col", PCKFile.FileData.FileType.ColourTableFile); + NewColorFile = currentPCK.CreateNew("colours.col", PckFile.FileData.FileType.ColourTableFile); NewColorFile.SetData(Resources.tu69colours); BuildMainTreeView(); } @@ -2051,8 +2072,8 @@ namespace PckStudio private void as3DSTextureFileToolStripMenuItem_Click(object sender, EventArgs e) { if (treeViewMain.SelectedNode is TreeNode node && - node.Tag is PCKFile.FileData file && - file.Filetype == PCKFile.FileData.FileType.SkinFile) + node.Tag is PckFile.FileData file && + file.Filetype == PckFile.FileData.FileType.SkinFile) { SaveFileDialog saveFileDialog = new SaveFileDialog(); saveFileDialog.Filter = "3DS Texture | *.3dst"; @@ -2072,7 +2093,7 @@ namespace PckStudio private void addMultipleEntriesToolStripMenuItem1_Click(object sender, EventArgs e) { if (treeViewMain.SelectedNode is TreeNode node && - node.Tag is PCKFile.FileData file) + node.Tag is PckFile.FileData file) { using (var input = new TextPrompt()) { @@ -2095,7 +2116,7 @@ namespace PckStudio private void correctSkinDecimalsToolStripMenuItem_Click(object sender, EventArgs e) { - if (treeViewMain.SelectedNode is TreeNode node && node.Tag is PCKFile.FileData file && file.Filetype == PCKFile.FileData.FileType.SkinFile) + if (treeViewMain.SelectedNode is TreeNode node && node.Tag is PckFile.FileData file && file.Filetype == PckFile.FileData.FileType.SkinFile) { foreach(var p in file.Properties.FindAll(s => s.property == "BOX" || s.property == "OFFSET")) { @@ -2109,7 +2130,7 @@ namespace PckStudio private void addCustomPackIconToolStripMenuItem_Click(object sender, EventArgs e) { - if (!currentPCK.TryGetFile("0", PCKFile.FileData.FileType.InfoFile, out PCKFile.FileData file) || + if (!currentPCK.TryGetFile("0", PckFile.FileData.FileType.InfoFile, out PckFile.FileData file) || string.IsNullOrEmpty(file.Properties.GetPropertyValue("PACKID")) ) { @@ -2139,16 +2160,23 @@ namespace PckStudio private void CreateSkinsPCKToolStripMenuItem1_Click(object sender, EventArgs e) { - if (currentPCK.TryGetFile("Skins.pck", PCKFile.FileData.FileType.SkinDataFile, out _)) + if (currentPCK.TryGetFile("Skins.pck", PckFile.FileData.FileType.SkinDataFile, out _)) { MessageBox.Show("A Skins.pck file already exists in this PCK and a new one cannot be created.", "Operation aborted"); return; } - PCKFile.FileData newSkinsPCKFile = currentPCK.CreateNew("Skins.pck", PCKFile.FileData.FileType.SkinDataFile); + PckFile.FileData newSkinsPCKFile = currentPCK.CreateNew("Skins.pck", PckFile.FileData.FileType.SkinDataFile); using (var stream = new MemoryStream()) { - PCKFileWriter.Write(stream, new PCKFile(3), LittleEndianCheckBox.Checked, true); + var writer = new PckFileWriter(new PckFile(3) + { + HasVerionString = true + }, + LittleEndianCheckBox.Checked + ? OMI.Endianness.LittleEndian + : OMI.Endianness.BigEndian); + writer.WriteToStream(stream); newSkinsPCKFile.SetData(stream.ToArray()); } @@ -2164,7 +2192,7 @@ namespace PckStudio private void editAllEntriesToolStripMenuItem_Click(object sender, EventArgs e) { if (treeViewMain.SelectedNode is TreeNode node && - node.Tag is PCKFile.FileData file) + node.Tag is PckFile.FileData file) { var props = file.Properties.Select(l => l.property + " " + l.value); using (var input = new TextPrompt(props.ToArray())) @@ -2199,7 +2227,7 @@ namespace PckStudio using AddFilePrompt diag = new AddFilePrompt("res/" + Path.GetFileName(ofd.FileName)); if (diag.ShowDialog(this) == DialogResult.OK) { - PCKFile.FileData file = currentPCK.CreateNew(diag.filepath, (PCKFile.FileData.FileType)diag.filetype); + PckFile.FileData file = currentPCK.CreateNew(diag.filepath, (PckFile.FileData.FileType)diag.filetype); file.SetData(File.ReadAllBytes(ofd.FileName)); if (IsSubPCKNode(treeViewMain.SelectedNode.FullPath)) RebuildSubPCK(treeViewMain.SelectedNode); @@ -2214,8 +2242,8 @@ namespace PckStudio private void behavioursbinToolStripMenuItem_Click(object sender, EventArgs e) { - PCKFile.FileData NewBehaviourFile; - if (currentPCK.TryGetFile("behaviours.bin", PCKFile.FileData.FileType.BehavioursFile, out NewBehaviourFile)) + PckFile.FileData NewBehaviourFile; + if (currentPCK.TryGetFile("behaviours.bin", PckFile.FileData.FileType.BehavioursFile, out NewBehaviourFile)) { MessageBox.Show("A behaviours file already exists in this PCK and a new one cannot be created.", "Operation aborted"); return; @@ -2227,8 +2255,8 @@ namespace PckStudio private void entityMaterialsbinToolStripMenuItem_Click(object sender, EventArgs e) { - PCKFile.FileData NewMaterialsFile; - if (currentPCK.TryGetFile("entityMaterials.bin", PCKFile.FileData.FileType.MaterialFile, out NewMaterialsFile)) + PckFile.FileData NewMaterialsFile; + if (currentPCK.TryGetFile("entityMaterials.bin", PckFile.FileData.FileType.MaterialFile, out NewMaterialsFile)) { MessageBox.Show("A behaviours file already exists in this PCK and a new one cannot be created.", "Operation aborted"); return; @@ -2237,16 +2265,16 @@ namespace PckStudio currentPCK.Files.Add(NewMaterialsFile); BuildMainTreeView(); } - } + } - public class PckNodeSorter : System.Collections.IComparer, IComparer + public class PckNodeSorter : System.Collections.IComparer, IComparer { private bool CheckForSkinAndCapeFiles(TreeNode node) { - if (node.Tag is PCKFile.FileData file) + if (node.Tag is PckFile.FileData file) { - return file.Filetype == PCKFile.FileData.FileType.SkinFile || - file.Filetype == PCKFile.FileData.FileType.CapeFile; + return file.Filetype == PckFile.FileData.FileType.SkinFile || + file.Filetype == PckFile.FileData.FileType.CapeFile; } return false; } diff --git a/PCK-Studio/PckStudio.csproj b/PCK-Studio/PckStudio.csproj index 7dbf2e63..cd70f98a 100644 --- a/PCK-Studio/PckStudio.csproj +++ b/PCK-Studio/PckStudio.csproj @@ -192,10 +192,6 @@ - - - - diff --git a/Vendor/OMI-Lib b/Vendor/OMI-Lib index 16280e2f..f9460502 160000 --- a/Vendor/OMI-Lib +++ b/Vendor/OMI-Lib @@ -1 +1 @@ -Subproject commit 16280e2f0a738bbbebc233151fe382047ab3da2d +Subproject commit f94605028c0af00ffbe2989f286b8c9b6a87bcaf