Skip to content

Commit

Permalink
Merge pull request #88 from Kamzik123/master
Browse files Browse the repository at this point in the history
XML support improvements
  • Loading branch information
Greavesy1899 committed Nov 30, 2023
2 parents f84f626 + ecaa52d commit 84929a2
Show file tree
Hide file tree
Showing 5 changed files with 152 additions and 59 deletions.
23 changes: 22 additions & 1 deletion Mafia2Libs/Forms/TranslokatorEditor.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

43 changes: 38 additions & 5 deletions Mafia2Libs/Forms/TranslokatorEditor.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
using System;
using ResourceTypes.Translokator;
using System;
using System.IO;
using ResourceTypes.Translokator;
using System.Windows.Forms;
using Utils.Language;
using Utils.Helpers;

namespace Mafia2Tool.Forms
{
Expand Down Expand Up @@ -43,6 +42,12 @@ private void Localise()
private void LoadFile()
{
translokator = new TranslokatorLoader(file);

LoadData();
}

private void LoadData()
{
TranslokatorTree.Nodes.Clear();

TreeNode headerData = new TreeNode("Header Data");
Expand Down Expand Up @@ -108,7 +113,6 @@ private void SaveFile()
{
ResourceTypes.Translokator.Object obj = (TranslokatorTree.Nodes[2].Nodes[i].Nodes[y].Tag as ResourceTypes.Translokator.Object);
obj.Instances = new Instance[TranslokatorTree.Nodes[2].Nodes[i].Nodes[y].GetNodeCount(false)];
obj.NumInstances = obj.Instances.Length;
for (int z = 0; z < obj.Instances.Length; z++)
{
Instance instance = (TranslokatorTree.Nodes[2].Nodes[i].Nodes[y].Nodes[z].Tag as Instance);
Expand Down Expand Up @@ -402,6 +406,35 @@ private void ReloadButton_Click(object sender, EventArgs e)
private void CopyButton_Click(object sender, EventArgs e) => Copy();
private void PasteButton_Click(object sender, EventArgs e) => Paste();
private void SaveToolButton_Click(object sender, EventArgs e) => SaveFile();
private void ExitButton_Click(object sender, EventArgs e) => Close();
private void ExitButton_Click(object sender, EventArgs e) => Close();
private void Button_ExportXml_OnClick(object sender, System.EventArgs e)
{
SaveFileDialog saveFile = new SaveFileDialog();
saveFile.Filter = "XML|*.XML";

if (saveFile.ShowDialog() == DialogResult.OK)
{
translokator.ConvertToXML(saveFile.FileName);
}
}

private void Button_ImportXml_OnClick(object sender, EventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "XML|*.XML";
openFileDialog.Multiselect = false;
openFileDialog.CheckFileExists = true;

if (openFileDialog.ShowDialog() == DialogResult.OK)
{
string FileToOpen = openFileDialog.FileName;
if (File.Exists(FileToOpen))
{
translokator.ConvertFromXML(FileToOpen);

LoadData();
}
}
}
}
}
109 changes: 60 additions & 49 deletions Mafia2Libs/ResourceTypes/FileTypes/Translokator/Translokator.cs
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
using System;
using System.Numerics;
using ResourceTypes.Actors;
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using Vortice.Mathematics;
using System.Numerics;
using System.Xml.Linq;
using Utils.Extensions;
using Utils.VorticeUtils;
using Utils.Helpers.Reflection;
using Utils.Logging;
using Utils.StringHelpers;
using Utils.Types;
using Utils.Logging;
using ResourceTypes.Actors;
using Utils.VorticeUtils;
using Vortice.Mathematics;

namespace ResourceTypes.Translokator
{
Expand Down Expand Up @@ -130,20 +131,13 @@ public Instance(Instance other)

public class Object
{
short numInstance2;
short unk02;
HashName name;
byte[] unkBytes1;
float gridMax;
float gridMin;
int numInstances;
Instance[] instances;

[Browsable(false)]
public short NumInstance2 {
get { return numInstance2; }
set { numInstance2 = value; }
}
public short Unk02 {
get { return unk02; }
set { unk02 = value; }
Expand All @@ -166,11 +160,6 @@ public class Object
set { gridMin = value; }
}
[Browsable(false)]
public int NumInstances {
get { return numInstances; }
set { numInstances = value; }
}
[Browsable(false)]
public Instance[] Instances {
get { return instances; }
set { instances = value; }
Expand All @@ -184,8 +173,6 @@ public Object()

public Object(Object other)
{
numInstance2 = 0;
numInstances = 0;
instances = new Instance[0];
unk02 = other.unk02;
name = other.name;
Expand Down Expand Up @@ -216,8 +203,8 @@ public struct ObjectGroupMetaInfo

public class TranslokatorLoader
{
public Grid[] Grids;
public ObjectGroup[] ObjectGroups;
public Grid[] Grids { get; set; }
public ObjectGroup[] ObjectGroups { get; set; }

int version;
int unk1;
Expand All @@ -236,11 +223,17 @@ public class TranslokatorLoader
get { return unk2; }
set { unk2 = value; }
}
[PropertyIgnoreByReflector]
public BoundingBox Bounds {
get { return bounds; }
set { bounds = value; }
}

public TranslokatorLoader()
{

}

public TranslokatorLoader(FileInfo info)
{
using (BinaryReader reader = new BinaryReader(File.Open(info.FullName, FileMode.Open)))
Expand Down Expand Up @@ -437,41 +430,38 @@ private void CompileData()
{
Object obj = objectGroup.Objects[x];

obj.NumInstance2 = (short)obj.NumInstances;
obj.UnkBytes1 = new byte[31 - obj.Name.ToString().Length];

for (int y = 0; y != obj.NumInstances; y++)
foreach(Instance CurrentInstance in obj.Instances)
{

Instance instance = obj.Instances[y];
if (instance.Position.X < Min.X)
if (CurrentInstance.Position.X < Min.X)
{
Min.X = instance.Position.X;
Min.X = CurrentInstance.Position.X;
}

if (instance.Position.X > Max.X)
if (CurrentInstance.Position.X > Max.X)
{
Max.X = instance.Position.X;
Max.X = CurrentInstance.Position.X;
}

if (instance.Position.Y < Min.Y)
if (CurrentInstance.Position.Y < Min.Y)
{
Min.Y = instance.Position.Y;
Min.Y = CurrentInstance.Position.Y;
}

if (instance.Position.Y > Max.Y)
if (CurrentInstance.Position.Y > Max.Y)
{
Max.Y = instance.Position.Y;
Max.Y = CurrentInstance.Position.Y;
}

if (instance.Position.Z < Min.Z)
if (CurrentInstance.Position.Z < Min.Z)
{
Min.Z = instance.Position.Z;
Min.Z = CurrentInstance.Position.Z;
}

if (instance.Position.Z > Max.Z)
if (CurrentInstance.Position.Z > Max.Z)
{
Max.Z = instance.Position.Z;
Max.Z = CurrentInstance.Position.Z;
}

numInstance++;
Expand Down Expand Up @@ -501,7 +491,7 @@ private void CompileData()
{
Object obj = objectGroup.Objects[x];

for (int y = 0; y != obj.NumInstances; y++)
for (int y = 0; y < obj.Instances.Length; y++)
{
Instance instance = obj.Instances[y];
var other = new Instance(instance);
Expand Down Expand Up @@ -596,7 +586,7 @@ public void ReadFromFile(BinaryReader reader)
for (int x = 0; x < NumObjects; x++)
{
Object obj = new Object();
obj.NumInstance2 = reader.ReadInt16();
ushort NumInstances2 = reader.ReadUInt16();
obj.Unk02 = reader.ReadInt16();

obj.Name = new HashName();
Expand All @@ -608,10 +598,10 @@ public void ReadFromFile(BinaryReader reader)
obj.UnkBytes1 = reader.ReadBytes(31 - obj.Name.ToString().Length);
obj.GridMax = reader.ReadSingle();
obj.GridMin = reader.ReadSingle();
obj.NumInstances = reader.ReadInt32();
obj.Instances = new Instance[obj.NumInstances];
uint NumInstances = reader.ReadUInt32();
obj.Instances = new Instance[NumInstances];

for (int y = 0; y != obj.NumInstances; y++)
for (int y = 0; y < obj.Instances.Length; y++)
{
byte[] packed = reader.ReadBytes(14);
Instance instance = new Instance();
Expand All @@ -624,12 +614,13 @@ public void ReadFromFile(BinaryReader reader)
DecompressScale(instance);
DecompressRotation(instance);
instance.Position = DecompressPosition(packed, instance, bounds.Min, bounds.Max);
obj.Instances[y] = instance;


obj.Instances[y] = instance;
}

objectGroup.Objects[x] = obj;
}

ObjectGroups[i] = objectGroup;
}
}
Expand Down Expand Up @@ -686,16 +677,16 @@ private void InternalWriteToFile(BinaryWriter writer)
for (int x = 0; x < objectGroup.Objects.Length; x++)
{
Object obj = objectGroup.Objects[x];
writer.Write(obj.NumInstance2);
writer.Write((ushort)obj.Instances.Length);
writer.Write(obj.Unk02);
writer.Write(obj.Name.Hash);
StringHelpers.WriteString(writer, obj.Name.String);
writer.Write(obj.UnkBytes1);
writer.Write(obj.GridMax);
writer.Write(obj.GridMin);
writer.Write(obj.NumInstances);
writer.Write((uint)obj.Instances.Length);

for (int y = 0; y != obj.NumInstances; y++)
for (int y = 0; y < obj.Instances.Length; y++)
{
Instance instance = obj.Instances[y];
writer.Write(instance.W0);
Expand All @@ -711,5 +702,25 @@ private void InternalWriteToFile(BinaryWriter writer)
ObjectGroups[i] = objectGroup;
}
}

public void ConvertToXML(string Filename)
{
XElement Root = ReflectionHelpers.ConvertPropertyToXML(this);
Root.Save(Filename);
}

public void ConvertFromXML(string Filename)
{
XElement LoadedDoc = XElement.Load(Filename);
TranslokatorLoader FileContents = ReflectionHelpers.ConvertToPropertyFromXML<TranslokatorLoader>(LoadedDoc);

// Copy data taken from loaded XML
Grids = FileContents.Grids;
ObjectGroups = FileContents.ObjectGroups;
Version = FileContents.Version;
Unk1 = FileContents.Unk1;
Unk2 = FileContents.Unk2;
Bounds = FileContents.Bounds;
}
}
}
Loading

0 comments on commit 84929a2

Please sign in to comment.