mirror of
https://git.huckle.dev/Huckles-Minecraft-Archive/PCK-Studio.git
synced 2026-05-23 08:35:30 +00:00
90 lines
2.7 KiB
C#
90 lines
2.7 KiB
C#
using PckStudio.Classes.FileTypes;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Text;
|
|
|
|
namespace PckStudio.Classes.IO.LOC
|
|
{
|
|
internal class LOCFileWriter
|
|
{
|
|
internal LOCFile _locfile;
|
|
public static void Write(Stream stream, LOCFile file, int type = 2)
|
|
{
|
|
new LOCFileWriter(file).WriteToStream(stream, type);
|
|
}
|
|
|
|
private LOCFileWriter(LOCFile file)
|
|
{
|
|
_locfile = file;
|
|
}
|
|
|
|
private void WriteToStream(Stream stream, int type)
|
|
{
|
|
if (_locfile == null) throw new ArgumentNullException("Loc File is null");
|
|
WriteInt(stream, type);
|
|
WriteInt(stream, _locfile.languages.Count);
|
|
if (type == 2) WriteLocKeys(stream);
|
|
WriteLanguages(stream);
|
|
WriteLanguageEntries(stream, type);
|
|
}
|
|
|
|
|
|
private void WriteLocKeys(Stream stream)
|
|
{
|
|
stream.WriteByte(0);
|
|
WriteInt(stream, _locfile.keys.Count);
|
|
foreach (var key in _locfile.keys.Keys)
|
|
WriteString(stream, key);
|
|
}
|
|
|
|
private void WriteLanguages(Stream stream)
|
|
{
|
|
foreach (var language in _locfile.languages)
|
|
{
|
|
WriteString(stream, language);
|
|
WriteInt(stream, 0);
|
|
}
|
|
}
|
|
|
|
private void WriteLanguageEntries(Stream stream, int type)
|
|
{
|
|
foreach (var language in _locfile.languages)
|
|
{
|
|
WriteInt(stream, 0x1337);
|
|
stream.WriteByte(0);
|
|
WriteString(stream, language);
|
|
WriteInt(stream, _locfile.keys.Keys.Count);
|
|
foreach(var locKey in _locfile.keys.Keys)
|
|
{
|
|
if (type == 0) WriteString(stream, locKey);
|
|
WriteString(stream, _locfile.keys[locKey][language]);
|
|
}
|
|
}
|
|
}
|
|
|
|
internal void WriteShort(Stream stream, short value)
|
|
{
|
|
byte[] bytes = BitConverter.GetBytes(value);
|
|
if (BitConverter.IsLittleEndian)
|
|
Array.Reverse(bytes);
|
|
stream.Write(bytes, 0, 2);
|
|
}
|
|
internal void WriteInt(Stream stream, int value)
|
|
{
|
|
byte[] bytes = BitConverter.GetBytes(value);
|
|
if (BitConverter.IsLittleEndian)
|
|
Array.Reverse(bytes);
|
|
stream.Write(bytes, 0, 4);
|
|
}
|
|
|
|
internal void WriteString(Stream stream, string s)
|
|
{
|
|
WriteShort(stream, (short)s.Length);
|
|
byte[] buffer = Encoding.UTF8.GetBytes(s);
|
|
stream.Write(buffer, 0, s.Length);
|
|
}
|
|
}
|
|
}
|