diff --git a/PCK-Studio/Extensions/PckFileDataExtensions.cs b/PCK-Studio/Extensions/PckFileDataExtensions.cs new file mode 100644 index 00000000..c45d5a5e --- /dev/null +++ b/PCK-Studio/Extensions/PckFileDataExtensions.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using OMI.Formats.Pck; +using OMI.Workers; + +namespace PckStudio.Extensions +{ + internal static class PckFileDataExtensions + { + private const string MipMap = "MipMapLevel"; + + internal static void SetData(this PckFile.FileData file, IDataFormatWriter writer) + { + using (var stream = new MemoryStream()) + { + writer.WriteToStream(stream); + file.SetData(stream.ToArray()); + } + } + + internal static void SetData(this PckFile.FileData file, Image image, ImageFormat imageFormat) + { + if (file.Filetype != PckFile.FileData.FileType.SkinFile && + file.Filetype != PckFile.FileData.FileType.CapeFile && + file.Filetype != PckFile.FileData.FileType.TextureFile) + { + Debug.WriteLine($"{file.Filename} is can't contain image data"); + return; + } + + using (var stream = new MemoryStream()) + { + image.Save(stream, imageFormat); + file.SetData(stream.ToArray()); + } + } + + internal static bool IsMipmappedFile(this PckFile.FileData file) + { + // We only want to test the file name itself. ex: "terrainMipMapLevel2" + string name = Path.GetFileNameWithoutExtension(file.Filename); + + // check if last character is a digit (0-9). If not return false + if (!char.IsDigit(name[name.Length - 1])) + return false; + + // If string does not end with MipMapLevel, then it's not MipMapped + if (!name.Remove(name.Length - 1, 1).EndsWith(MipMap)) + return false; + return true; + } + + internal static string GetNormalPath(this PckFile.FileData file) + { + if (!file.IsMipmappedFile()) + return file.Filename; + string ext = Path.GetExtension(file.Filename); + return file.Filename.Remove(file.Filename.Length - (MipMap.Length + 1) - ext.Length) + ext; + } + } +} diff --git a/PCK-Studio/Extensions/PckFileExtensions.cs b/PCK-Studio/Extensions/PckFileExtensions.cs index 12c2af21..f24df276 100644 --- a/PCK-Studio/Extensions/PckFileExtensions.cs +++ b/PCK-Studio/Extensions/PckFileExtensions.cs @@ -5,34 +5,26 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using OMI.Formats.Pck; +using OMI.Workers; namespace PckStudio.Extensions { internal static class PckFileExtensions { - private const string MipMap = "MipMapLevel"; - - internal static bool IsMipmappedFile(this PckFile.FileData file) + internal static PckFile.FileData CreateNewFileIf(this PckFile pck, bool condition, string filename, PckFile.FileData.FileType filetype, IDataFormatWriter writer) { - // We only want to test the file name itself. ex: "terrainMipMapLevel2" - string name = Path.GetFileNameWithoutExtension(file.Filename); - - // check if last character is a digit (0-9). If not return false - if (!char.IsDigit(name[name.Length - 1])) - return false; - - // If string does not end with MipMapLevel, then it's not MipMapped - if (!name.Remove(name.Length - 1, 1).EndsWith(MipMap)) - return false; - return true; + if (condition) + { + return pck.CreateNewFile(filename, filetype, writer); + } + return null; } - internal static string GetNormalPath(this PckFile.FileData file) + internal static PckFile.FileData CreateNewFile(this PckFile pck, string filename, PckFile.FileData.FileType filetype, IDataFormatWriter writer) { - if (!file.IsMipmappedFile()) - return file.Filename; - string ext = Path.GetExtension(file.Filename); - return file.Filename.Remove(file.Filename.Length - (MipMap.Length + 1) - ext.Length) + ext; + var file = pck.CreateNewFile(filename, filetype); + file.SetData(writer); + return file; } } } diff --git a/PCK-Studio/Forms/Editor/AnimationEditor.cs b/PCK-Studio/Forms/Editor/AnimationEditor.cs index 402763d9..ef48e0b2 100644 --- a/PCK-Studio/Forms/Editor/AnimationEditor.cs +++ b/PCK-Studio/Forms/Editor/AnimationEditor.cs @@ -163,12 +163,8 @@ namespace PckStudio.Forms.Editor { string anim = currentAnimation.BuildAnim(); animationFile.Properties.SetProperty("ANIM", anim); - using (var stream = new MemoryStream()) - { - var texture = currentAnimation.BuildTexture(); - texture.Save(stream, ImageFormat.Png); - animationFile.SetData(stream.ToArray()); - } + var texture = currentAnimation.BuildTexture(); + animationFile.SetData(texture, ImageFormat.Png); animationFile.Filename = $"res/textures/{currentAnimation.CategoryString}/{TileName}.png"; DialogResult = DialogResult.OK; return; diff --git a/PCK-Studio/Forms/Editor/AudioEditor.cs b/PCK-Studio/Forms/Editor/AudioEditor.cs index 766594e9..9ed7e8dd 100644 --- a/PCK-Studio/Forms/Editor/AudioEditor.cs +++ b/PCK-Studio/Forms/Editor/AudioEditor.cs @@ -19,6 +19,7 @@ using PckStudio.Forms.Additional_Popups; using PckStudio.Properties; using PckStudio.API.Miles; using PckStudio.Internal; +using PckStudio.Extensions; // Audio Editor by MattNL and Miku-666 @@ -409,12 +410,7 @@ namespace PckStudio.Forms.Editor return; } - using (var stream = new MemoryStream()) - { - var writer = new PckAudioFileWriter(audioFile, _isLittleEndian ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian); - writer.WriteToStream(stream); - audioPCK.SetData(stream.ToArray()); - } + audioPCK.SetData(new PckAudioFileWriter(audioFile, _isLittleEndian ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian)); DialogResult = DialogResult.OK; } diff --git a/PCK-Studio/Forms/Editor/BehaviourEditor.cs b/PCK-Studio/Forms/Editor/BehaviourEditor.cs index 7c290e4f..2342f4e5 100644 --- a/PCK-Studio/Forms/Editor/BehaviourEditor.cs +++ b/PCK-Studio/Forms/Editor/BehaviourEditor.cs @@ -13,6 +13,7 @@ using OMI.Workers.Behaviour; using OMI.Formats.Pck; using PckStudio.Properties; using PckStudio.Internal; +using PckStudio.Extensions; namespace PckStudio.Forms.Editor { @@ -254,32 +255,27 @@ namespace PckStudio.Forms.Editor private void saveToolStripMenuItem1_Click(object sender, EventArgs e) { - using (var stream = new MemoryStream()) + behaviourFile = new BehaviourFile(); + foreach (TreeNode node in treeView1.Nodes) { - behaviourFile = new BehaviourFile(); - - foreach (TreeNode node in treeView1.Nodes) + if(node.Tag is BehaviourFile.RiderPositionOverride entry) { - if(node.Tag is BehaviourFile.RiderPositionOverride entry) + entry.overrides.Clear(); + Console.WriteLine(); + foreach (TreeNode overrideNode in node.Nodes) { - entry.overrides.Clear(); - Console.WriteLine(); - foreach (TreeNode overrideNode in node.Nodes) + if(overrideNode.Tag is BehaviourFile.RiderPositionOverride.PositionOverride overrideEntry) { - if(overrideNode.Tag is BehaviourFile.RiderPositionOverride.PositionOverride overrideEntry) - { - entry.overrides.Add(overrideEntry); - } + entry.overrides.Add(overrideEntry); } - - behaviourFile.entries.Add(entry); } - } - var writer = new BehavioursWriter(behaviourFile); - writer.WriteToStream(stream); - _file.SetData(stream.ToArray()); + behaviourFile.entries.Add(entry); + } } + + _file.SetData(new BehavioursWriter(behaviourFile)); + DialogResult = DialogResult.OK; } diff --git a/PCK-Studio/Forms/Editor/COLEditor.cs b/PCK-Studio/Forms/Editor/COLEditor.cs index c05e4a89..f7f38fc1 100644 --- a/PCK-Studio/Forms/Editor/COLEditor.cs +++ b/PCK-Studio/Forms/Editor/COLEditor.cs @@ -8,6 +8,7 @@ using MetroFramework.Forms; using OMI.Formats.Color; using OMI.Formats.Pck; using OMI.Workers.Color; +using PckStudio.Extensions; using PckStudio.Properties; namespace PckStudio.Forms.Editor @@ -240,12 +241,9 @@ namespace PckStudio.Forms.Editor return; } } - using (var stream = new MemoryStream()) - { - var writer = new COLFileWriter(colourfile); - writer.WriteToStream(stream); - _file.SetData(stream.ToArray()); - } + + _file.SetData(new COLFileWriter(colourfile)); + DialogResult = DialogResult.OK; } diff --git a/PCK-Studio/Forms/Editor/GameRuleFileEditor.cs b/PCK-Studio/Forms/Editor/GameRuleFileEditor.cs index f69049c9..cdee39b6 100644 --- a/PCK-Studio/Forms/Editor/GameRuleFileEditor.cs +++ b/PCK-Studio/Forms/Editor/GameRuleFileEditor.cs @@ -30,6 +30,7 @@ using OMI.Formats.Pck; using PckStudio.Forms.Additional_Popups; using PckStudio.Properties; using PckStudio.ToolboxItems; +using PckStudio.Extensions; namespace PckStudio.Forms.Editor { @@ -266,12 +267,7 @@ namespace PckStudio.Forms.Editor { try { - var writer = new GameRuleFileWriter( - _file, - compressionLevel, - compressionType); - writer.WriteToStream(stream); - _pckfile?.SetData(stream.ToArray()); + _pckfile?.SetData(new GameRuleFileWriter(_file, compressionLevel, compressionType)); DialogResult = DialogResult.OK; MessageBox.Show("Saved!"); } diff --git a/PCK-Studio/Forms/Editor/LOCEditor.cs b/PCK-Studio/Forms/Editor/LOCEditor.cs index 70525e00..d830e9ea 100644 --- a/PCK-Studio/Forms/Editor/LOCEditor.cs +++ b/PCK-Studio/Forms/Editor/LOCEditor.cs @@ -11,6 +11,7 @@ using OMI.Formats.Languages; using OMI.Workers.Language; using OMI.Formats.Pck; using PckStudio.Properties; +using PckStudio.Extensions; namespace PckStudio.Forms.Editor { @@ -144,12 +145,7 @@ namespace PckStudio.Forms.Editor private void saveToolStripMenuItem_Click(object sender, EventArgs e) { - using (var ms = new MemoryStream()) - { - var writer = new LOCFileWriter(currentLoc, 2); - writer.WriteToStream(ms); - _file.SetData(ms.ToArray()); - } + _file.SetData(new LOCFileWriter(currentLoc, 2)); DialogResult = DialogResult.OK; } diff --git a/PCK-Studio/Forms/Editor/MaterialsEditor.cs b/PCK-Studio/Forms/Editor/MaterialsEditor.cs index abba215c..24623953 100644 --- a/PCK-Studio/Forms/Editor/MaterialsEditor.cs +++ b/PCK-Studio/Forms/Editor/MaterialsEditor.cs @@ -11,6 +11,7 @@ using OMI.Formats.Pck; using OMI.Formats.Material; using OMI.Workers.Material; using PckStudio.Internal; +using PckStudio.Extensions; namespace PckStudio.Forms.Editor { @@ -114,22 +115,18 @@ namespace PckStudio.Forms.Editor private void saveToolStripMenuItem1_Click(object sender, EventArgs e) { - using (var stream = new MemoryStream()) + materialFile = new MaterialContainer(); + + foreach (TreeNode node in treeView1.Nodes) { - materialFile = new MaterialContainer(); - - foreach (TreeNode node in treeView1.Nodes) + if(node.Tag is MaterialContainer.Material entry) { - if(node.Tag is MaterialContainer.Material entry) - { - materialFile.Add(entry); - } + materialFile.Add(entry); } - - var writer = new MaterialFileWriter(materialFile); - writer.WriteToStream(stream); - _file.SetData(stream.ToArray()); } + + _file.SetData(new MaterialFileWriter(materialFile)); + DialogResult = DialogResult.OK; } diff --git a/PCK-Studio/MainForm.cs b/PCK-Studio/MainForm.cs index c1197e4d..ee8fee4d 100644 --- a/PCK-Studio/MainForm.cs +++ b/PCK-Studio/MainForm.cs @@ -378,11 +378,7 @@ namespace PckStudio var viewer = new TextureAtlasEditor(currentPCK, file.Filename, img, size); if (viewer.ShowDialog() == DialogResult.OK) { - using (var result = new MemoryStream()) - { - viewer.FinalTexture.Save(result, ImageFormat.Png); - file.SetData(result.ToArray()); - } + file.SetData(viewer.FinalTexture, ImageFormat.Png); wasModified = true; BuildMainTreeView(); } @@ -826,15 +822,8 @@ namespace PckStudio audioPck.AddCategory(PckAudioFile.AudioCategory.EAudioType.Overworld); audioPck.AddCategory(PckAudioFile.AudioCategory.EAudioType.Nether); audioPck.AddCategory(PckAudioFile.AudioCategory.EAudioType.End); - PckFile.FileData pckFileData = currentPCK.CreateNewFile("audio.pck", PckFile.FileData.FileType.AudioFile, () => - { - using (var stream = new MemoryStream()) - { - var writer = new PckAudioFileWriter(audioPck, isLittle ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian); - writer.WriteToStream(stream); - return stream.ToArray(); - } - }); + PckFile.FileData pckFileData = currentPCK.CreateNewFile("audio.pck", PckFile.FileData.FileType.AudioFile, + new PckAudioFileWriter(audioPck, isLittle ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian)); return pckFileData; } @@ -959,13 +948,8 @@ namespace PckStudio } } - using (MemoryStream ms = new MemoryStream()) - { - var writer = new PckFileWriter(newPCKFile, LittleEndianCheckBox.Checked ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian); - writer.WriteToStream(ms); - parent_file.SetData(ms.ToArray()); + parent_file.SetData(new PckFileWriter(newPCKFile, LittleEndianCheckBox.Checked ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian)); parent.Tag = parent_file; - } BuildMainTreeView(); } @@ -1203,78 +1187,50 @@ namespace PckStudio private PckFile InitializePack(int packId, int packVersion, string packName, bool createSkinsPCK) { - var newPck = new PckFile(3); + var pack = new PckFile(3); - var zeroFile = newPck.CreateNewFile("0", PckFile.FileData.FileType.InfoFile); + var zeroFile = pack.CreateNewFile("0", PckFile.FileData.FileType.InfoFile); zeroFile.Properties.Add("PACKID", packId.ToString()); zeroFile.Properties.Add("PACKVERSION", packVersion.ToString()); - var loc = newPck.CreateNewFile("localisation.loc", PckFile.FileData.FileType.LocalisationFile, () => - { var locFile = new LOCFile(); locFile.InitializeDefault(packName); - using var stream = new MemoryStream(); - var writer = new LOCFileWriter(locFile, 2); - writer.WriteToStream(stream); - return stream.ToArray(); - }); + pack.CreateNewFile("localisation.loc", PckFile.FileData.FileType.LocalisationFile, new LOCFileWriter(locFile, 2)); - if (createSkinsPCK) - { - PckFile.FileData skinsPCKFile = newPck.CreateNewFile("Skins.pck", PckFile.FileData.FileType.SkinDataFile, () => - { - using var stream = new MemoryStream(); - var writer = new PckFileWriter(new PckFile(3, true), + pack.CreateNewFileIf(createSkinsPCK, "Skins.pck", PckFile.FileData.FileType.SkinDataFile, new PckFileWriter(new PckFile(3, true), LittleEndianCheckBox.Checked ? OMI.Endianness.LittleEndian - : OMI.Endianness.BigEndian); - writer.WriteToStream(stream); - return stream.ToArray(); - }); + : OMI.Endianness.BigEndian)); + + return pack; } - return newPck; - } private PckFile InitializeTexturePack(int packId, int packVersion, string packName, string res, bool createSkinsPCK = false) { - var newPck = InitializePack(packId, packVersion, packName, createSkinsPCK); - var texturepackInfo = newPck.CreateNewFile($"{res}/{res}Info.pck", PckFile.FileData.FileType.TexturePackInfoFile, - () => - { - using var ms = new MemoryStream(); - var writer = new PckFileWriter(new PckFile(3), - LittleEndianCheckBox.Checked - ? OMI.Endianness.LittleEndian - : OMI.Endianness.BigEndian); - writer.WriteToStream(ms); - return ms.ToArray(); - }); - texturepackInfo.Properties.Add("PACKID", "0"); - texturepackInfo.Properties.Add("DATAPATH", $"{res}Data.pck"); + var pack = InitializePack(packId, packVersion, packName, createSkinsPCK); PckFile infoPCK = new PckFile(3); - using (var ms = new MemoryStream()) - { var icon = infoPCK.CreateNewFile("icon.png", PckFile.FileData.FileType.TextureFile); - Resources.TexturePackIcon.Save(ms, ImageFormat.Png); - icon.SetData(ms.ToArray()); - } + icon.SetData(Resources.TexturePackIcon, ImageFormat.Png); - using (var ms = new MemoryStream()) - { var comparison = infoPCK.CreateNewFile("comparison.png", PckFile.FileData.FileType.TextureFile); - Resources.Comparison.Save(ms, ImageFormat.Png); - comparison.SetData(ms.ToArray()); - } + comparison.SetData(Resources.Comparison, ImageFormat.Png); - return newPck; + var texturepackInfo = pack.CreateNewFile($"{res}/{res}Info.pck", PckFile.FileData.FileType.TexturePackInfoFile); + + texturepackInfo.Properties.Add("PACKID", "0"); + texturepackInfo.Properties.Add("DATAPATH", $"{res}Data.pck"); + + texturepackInfo.SetData(new PckFileWriter(infoPCK, LittleEndianCheckBox.Checked ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian)); + + return pack; } private PckFile InitializeMashUpPack(int packId, int packVersion, string packName, string res) { - var newPck = InitializeTexturePack(packId, packVersion, packName, res, true); - var gameRuleFile = newPck.CreateNewFile("GameRules.grf", PckFile.FileData.FileType.GameRulesFile); + var pack = InitializeTexturePack(packId, packVersion, packName, res, true); + var gameRuleFile = pack.CreateNewFile("GameRules.grf", PckFile.FileData.FileType.GameRulesFile); var grfFile = new GameRuleFile(); grfFile.AddRule("MapOptions", new KeyValuePair("seed", "0"), @@ -1290,14 +1246,11 @@ namespace PckStudio new KeyValuePair("spawnY", "0"), new KeyValuePair("spawnZ", "0") ); - using (var stream = new MemoryStream()) - { - var writer = new GameRuleFileWriter(grfFile); - writer.WriteToStream(stream); - gameRuleFile.SetData(stream.ToArray()); + + gameRuleFile.SetData(new GameRuleFileWriter(grfFile)); + + return pack; } - return newPck; - } private void skinPackToolStripMenuItem_Click(object sender, EventArgs e) { @@ -1579,12 +1532,7 @@ namespace PckStudio try { - using (var stream = new MemoryStream()) - { - var writer = new LOCFileWriter(locFile, 2); - writer.WriteToStream(stream); - locdata.SetData(stream.ToArray()); - } + locdata.SetData(new LOCFileWriter(locFile, 2)); return true; } catch (Exception ex) @@ -1980,10 +1928,8 @@ namespace PckStudio gfx.PixelOffsetMode = PixelOffsetMode.HighQuality; gfx.DrawImage(originalTexture, tileArea); } - MemoryStream texStream = new MemoryStream(); - mippedTexture.Save(texStream, ImageFormat.Png); - MipMappedFile.SetData(texStream.ToArray()); - texStream.Dispose(); + + MipMappedFile.SetData(mippedTexture, ImageFormat.Png); currentPCK.Files.Insert(currentPCK.Files.IndexOf(file) + i - 1, MipMappedFile); } @@ -2161,14 +2107,8 @@ namespace PckStudio return; } - currentPCK.CreateNewFile("Skins.pck", PckFile.FileData.FileType.SkinDataFile, () => - { - using var stream = new MemoryStream(); - var writer = new PckFileWriter(new PckFile(3, true), - LittleEndianCheckBox.Checked ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian); - writer.WriteToStream(stream); - return stream.ToArray(); - }); + currentPCK.CreateNewFile("Skins.pck", PckFile.FileData.FileType.SkinDataFile, new PckFileWriter(new PckFile(3, true), + LittleEndianCheckBox.Checked ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian)); BuildMainTreeView(); diff --git a/PCK-Studio/PckStudio.csproj b/PCK-Studio/PckStudio.csproj index b7094a9d..305bda5d 100644 --- a/PCK-Studio/PckStudio.csproj +++ b/PCK-Studio/PckStudio.csproj @@ -132,6 +132,7 @@ + Component