mirror of
https://git.huckle.dev/Huckles-Minecraft-Archive/PCK-Studio.git
synced 2026-05-24 12:06:32 +00:00
79 lines
2.5 KiB
C#
79 lines
2.5 KiB
C#
using PckStudio.Classes.FileTypes;
|
|
using PckStudio.Classes.Utils;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace PckStudio.Classes.IO
|
|
{
|
|
internal class PCKFileWriter : StreamDataWriter
|
|
{
|
|
internal PCKFile _file;
|
|
|
|
public static void Write(Stream stream, PCKFile file, bool isLittleEndian)
|
|
{
|
|
new PCKFileWriter(file, isLittleEndian).WriteToStream(stream);
|
|
}
|
|
|
|
private PCKFileWriter(PCKFile file, bool isLittleEndian) : base(isLittleEndian)
|
|
{
|
|
_file = file;
|
|
}
|
|
|
|
private void WriteToStream(Stream stream)
|
|
{
|
|
WriteInt(stream, _file.type);
|
|
WriteMetaEntries(stream);
|
|
WriteFileEntries(stream);
|
|
}
|
|
|
|
internal void WriteString(Stream stream, string s)
|
|
{
|
|
WriteInt(stream, s.Length);
|
|
WriteString(stream, s, Encoding.BigEndianUnicode);
|
|
WriteInt(stream, 0); // padding
|
|
}
|
|
|
|
internal void WriteMetaEntries(Stream stream)
|
|
{
|
|
WriteInt(stream, _file.meta_data.Count);
|
|
bool has_xmlverion_tag = false;
|
|
foreach (var metaEntry in _file.meta_data)
|
|
{
|
|
if (metaEntry == "XMLVERSION") has_xmlverion_tag = true;
|
|
WriteInt(stream, _file.meta_data.IndexOf(metaEntry));
|
|
WriteString(stream, metaEntry);
|
|
}
|
|
if (has_xmlverion_tag)
|
|
WriteInt(stream, 0x1337); // :^)
|
|
}
|
|
|
|
internal void WriteFileEntries(Stream stream)
|
|
{
|
|
WriteInt(stream, _file.file_entries.Count);
|
|
foreach (var entry in _file.file_entries)
|
|
{
|
|
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);
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|