2019-01-11 11:24:50 +08:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.ComponentModel;
|
2019-01-11 15:56:56 +08:00
|
|
|
|
using System.IO;
|
2019-01-11 11:24:50 +08:00
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using System.Threading.Tasks;
|
2019-01-11 15:56:56 +08:00
|
|
|
|
using System.Xml;
|
|
|
|
|
|
|
|
|
|
using TC = System.ComponentModel.TypeConverterAttribute;
|
|
|
|
|
using EXP = System.ComponentModel.ExpandableObjectConverter;
|
2019-01-11 11:24:50 +08:00
|
|
|
|
|
|
|
|
|
namespace CodeWalker.GameFiles
|
|
|
|
|
{
|
2019-01-11 15:56:56 +08:00
|
|
|
|
[TC(typeof(EXP))] public class CarModColsFile : GameFile, PackedFile
|
2019-01-11 11:24:50 +08:00
|
|
|
|
{
|
2019-01-11 15:56:56 +08:00
|
|
|
|
public PsoFile Pso { get; set; }
|
|
|
|
|
public string Xml { get; set; }
|
|
|
|
|
|
|
|
|
|
public CVehicleModColours VehicleModColours { get; set; }
|
|
|
|
|
|
2019-01-11 11:24:50 +08:00
|
|
|
|
public CarModColsFile() : base(null, GameFileType.CarModCols)
|
|
|
|
|
{ }
|
|
|
|
|
public CarModColsFile(RpfFileEntry entry) : base(entry, GameFileType.CarModCols)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void Load(byte[] data, RpfFileEntry entry)
|
|
|
|
|
{
|
|
|
|
|
RpfFileEntry = entry;
|
|
|
|
|
Name = entry.Name;
|
|
|
|
|
FilePath = Name;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//always PSO .ymt
|
2019-01-11 15:56:56 +08:00
|
|
|
|
MemoryStream ms = new MemoryStream(data);
|
|
|
|
|
if (PsoFile.IsPSO(ms))
|
|
|
|
|
{
|
|
|
|
|
Pso = new PsoFile();
|
|
|
|
|
Pso.Load(data);
|
|
|
|
|
Xml = PsoXml.GetXml(Pso); //yep let's just convert that to XML :P
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
XmlDocument xdoc = new XmlDocument();
|
|
|
|
|
if (!string.IsNullOrEmpty(Xml))
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
xdoc.LoadXml(Xml);
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
var msg = ex.Message;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{ }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (xdoc.DocumentElement != null)
|
|
|
|
|
{
|
|
|
|
|
VehicleModColours = new CVehicleModColours(xdoc.DocumentElement);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2019-01-11 11:24:50 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Loaded = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
2019-01-11 15:56:56 +08:00
|
|
|
|
|
|
|
|
|
[TC(typeof(EXP))] public class CVehicleModColours
|
|
|
|
|
{
|
|
|
|
|
public CVehicleModColor[] metallic { get; set; }
|
|
|
|
|
public CVehicleModColor[] classic { get; set; }
|
|
|
|
|
public CVehicleModColor[] matte { get; set; }
|
|
|
|
|
public CVehicleModColor[] metals { get; set; }
|
|
|
|
|
public CVehicleModColor[] chrome { get; set; }
|
|
|
|
|
public CVehicleModPearlescentColors pearlescent { get; set; }
|
|
|
|
|
|
|
|
|
|
public CVehicleModColours(XmlNode node)
|
|
|
|
|
{
|
|
|
|
|
XmlNode cnode;
|
|
|
|
|
cnode = node.SelectSingleNode("metallic");
|
|
|
|
|
if (cnode != null)
|
|
|
|
|
{
|
|
|
|
|
var items = cnode.SelectNodes("Item");
|
|
|
|
|
if (items.Count > 0)
|
|
|
|
|
{
|
|
|
|
|
metallic = new CVehicleModColor[items.Count];
|
|
|
|
|
for (int i = 0; i < items.Count; i++)
|
|
|
|
|
{
|
|
|
|
|
metallic[i] = new CVehicleModColor(items[i]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
cnode = node.SelectSingleNode("classic");
|
|
|
|
|
if (cnode != null)
|
|
|
|
|
{
|
|
|
|
|
var items = cnode.SelectNodes("Item");
|
|
|
|
|
if (items.Count > 0)
|
|
|
|
|
{
|
|
|
|
|
classic = new CVehicleModColor[items.Count];
|
|
|
|
|
for (int i = 0; i < items.Count; i++)
|
|
|
|
|
{
|
|
|
|
|
classic[i] = new CVehicleModColor(items[i]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
cnode = node.SelectSingleNode("matte");
|
|
|
|
|
if (cnode != null)
|
|
|
|
|
{
|
|
|
|
|
var items = cnode.SelectNodes("Item");
|
|
|
|
|
if (items.Count > 0)
|
|
|
|
|
{
|
|
|
|
|
matte = new CVehicleModColor[items.Count];
|
|
|
|
|
for (int i = 0; i < items.Count; i++)
|
|
|
|
|
{
|
|
|
|
|
matte[i] = new CVehicleModColor(items[i]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
cnode = node.SelectSingleNode("metals");
|
|
|
|
|
if (cnode != null)
|
|
|
|
|
{
|
|
|
|
|
var items = cnode.SelectNodes("Item");
|
|
|
|
|
if (items.Count > 0)
|
|
|
|
|
{
|
|
|
|
|
metals = new CVehicleModColor[items.Count];
|
|
|
|
|
for (int i = 0; i < items.Count; i++)
|
|
|
|
|
{
|
|
|
|
|
metals[i] = new CVehicleModColor(items[i]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
cnode = node.SelectSingleNode("chrome");
|
|
|
|
|
if (cnode != null)
|
|
|
|
|
{
|
|
|
|
|
var items = cnode.SelectNodes("Item");
|
|
|
|
|
if (items.Count > 0)
|
|
|
|
|
{
|
|
|
|
|
chrome = new CVehicleModColor[items.Count];
|
|
|
|
|
for (int i = 0; i < items.Count; i++)
|
|
|
|
|
{
|
|
|
|
|
chrome[i] = new CVehicleModColor(items[i]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
cnode = node.SelectSingleNode("pearlescent");
|
|
|
|
|
if (cnode != null)
|
|
|
|
|
{
|
|
|
|
|
pearlescent = new CVehicleModPearlescentColors(cnode);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
[TC(typeof(EXP))] public class CVehicleModColor
|
|
|
|
|
{
|
|
|
|
|
public string name { get; set; }
|
|
|
|
|
public byte col { get; set; }
|
|
|
|
|
public byte spec { get; set; }
|
|
|
|
|
|
|
|
|
|
public CVehicleModColor(XmlNode node)
|
|
|
|
|
{
|
|
|
|
|
name = Xml.GetChildInnerText(node, "name");
|
|
|
|
|
col = (byte)Xml.GetChildIntAttribute(node, "col", "value");
|
|
|
|
|
spec = (byte)Xml.GetChildIntAttribute(node, "spec", "value");
|
|
|
|
|
}
|
|
|
|
|
public override string ToString()
|
|
|
|
|
{
|
|
|
|
|
return name;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
[TC(typeof(EXP))] public class CVehicleModPearlescentColors
|
|
|
|
|
{
|
|
|
|
|
public CVehicleModColor[] baseCols { get; set; }
|
|
|
|
|
public CVehicleModColor[] specCols { get; set; }
|
|
|
|
|
|
|
|
|
|
public CVehicleModPearlescentColors(XmlNode node)
|
|
|
|
|
{
|
|
|
|
|
XmlNode cnode;
|
|
|
|
|
cnode = node.SelectSingleNode("baseCols");
|
|
|
|
|
if (cnode != null)
|
|
|
|
|
{
|
|
|
|
|
var items = cnode.SelectNodes("Item");
|
|
|
|
|
if (items.Count > 0)
|
|
|
|
|
{
|
|
|
|
|
baseCols = new CVehicleModColor[items.Count];
|
|
|
|
|
for (int i = 0; i < items.Count; i++)
|
|
|
|
|
{
|
|
|
|
|
baseCols[i] = new CVehicleModColor(items[i]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
cnode = node.SelectSingleNode("specCols");
|
|
|
|
|
if (cnode != null)
|
|
|
|
|
{
|
|
|
|
|
var items = cnode.SelectNodes("Item");
|
|
|
|
|
if (items.Count > 0)
|
|
|
|
|
{
|
|
|
|
|
specCols = new CVehicleModColor[items.Count];
|
|
|
|
|
for (int i = 0; i < items.Count; i++)
|
|
|
|
|
{
|
|
|
|
|
specCols[i] = new CVehicleModColor(items[i]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2019-01-11 11:24:50 +08:00
|
|
|
|
}
|