Remove meta_data from PCKFile and updated PCKFile reader/writer

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