Added more extensions for PckFile/PckFileData

This commit is contained in:
miku-666
2023-08-14 15:43:46 +02:00
parent 268468b0a7
commit 57c82393e5
11 changed files with 148 additions and 172 deletions

View File

@@ -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;
}
}
}

View File

@@ -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;
}
}
}

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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!");
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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<string, string>("seed", "0"),
@@ -1290,14 +1246,11 @@ namespace PckStudio
new KeyValuePair<string, string>("spawnY", "0"),
new KeyValuePair<string, string>("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();

View File

@@ -132,6 +132,7 @@
<Reference Include="WindowsFormsIntegration" />
</ItemGroup>
<ItemGroup>
<Compile Include="Extensions\PckFileDataExtensions.cs" />
<Compile Include="ToolboxItems\BlendPictureBox.cs">
<SubType>Component</SubType>
</Compile>