CodeWalker/CodeWalker.Core/GameFiles/FileTypes/PedsFile.cs

348 lines
16 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SharpDX;
using System.IO;
using System.Xml;
using TC = System.ComponentModel.TypeConverterAttribute;
using EXP = System.ComponentModel.ExpandableObjectConverter;
namespace CodeWalker.GameFiles
{
[TC(typeof(EXP))] public class PedsFile : GameFile, PackedFile
{
public PsoFile Pso { get; set; }
public string Xml { get; set; }
public CPedModelInfo__InitDataList InitDataList { get; set; }
public PedsFile() : base(null, GameFileType.Peds)
{ }
public PedsFile(RpfFileEntry entry) : base(entry, GameFileType.Peds)
{ }
public void Load(byte[] data, RpfFileEntry entry)
{
RpfFileEntry = entry;
Name = entry.Name;
FilePath = Name;
//can be PSO .ymt or XML .meta
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
}
else
{
Xml = TextUtil.GetUTF8Text(data);
}
XmlDocument xdoc = new XmlDocument();
if (!string.IsNullOrEmpty(Xml))
{
try
{
xdoc.LoadXml(Xml);
}
catch (Exception ex)
{
var msg = ex.Message;
}
}
else
{ }
if (xdoc.DocumentElement != null)
{
InitDataList = new CPedModelInfo__InitDataList(xdoc.DocumentElement);
}
Loaded = true;
}
}
[TC(typeof(EXP))] public class CPedModelInfo__InitDataList
{
public string residentTxd { get; set; }
public string[] residentAnims { get; set; }
public CPedModelInfo__InitData[] InitDatas { get; set; }
public CTxdRelationship[] txdRelationships { get; set; }
public CMultiTxdRelationship[] multiTxdRelationships { get; set; }
public CPedModelInfo__InitDataList(XmlNode node)
{
XmlNodeList items;
residentTxd = Xml.GetChildInnerText(node, "residentTxd");
items = node.SelectSingleNode("residentAnims")?.SelectNodes("Item");
if (items?.Count > 0)
{
residentAnims = new string[items.Count];
for (int i = 0; i < items.Count; i++)
{
residentAnims[i] = items[i].InnerText;
}
}
items = node.SelectSingleNode("InitDatas")?.SelectNodes("Item");
if (items?.Count > 0)
{
InitDatas = new CPedModelInfo__InitData[items.Count];
for (int i = 0; i < items.Count; i++)
{
InitDatas[i] = new CPedModelInfo__InitData(items[i]);
}
}
items = node.SelectSingleNode("txdRelationships")?.SelectNodes("Item");
if (items?.Count > 0)
{
txdRelationships = new CTxdRelationship[items.Count];
for (int i = 0; i < items.Count; i++)
{
txdRelationships[i] = new CTxdRelationship(items[i]);
}
}
items = node.SelectSingleNode("multiTxdRelationships")?.SelectNodes("Item");
if (items?.Count > 0)
{
multiTxdRelationships = new CMultiTxdRelationship[items.Count];
for (int i = 0; i < items.Count; i++)
{
multiTxdRelationships[i] = new CMultiTxdRelationship(items[i]);
}
}
}
}
[TC(typeof(EXP))] public class CPedModelInfo__InitData
{
public string Name { get; set; }
public string PropsName { get; set; }
public string ClipDictionaryName { get; set; }
public string BlendShapeFileName { get; set; }
public string ExpressionSetName { get; set; }
public string ExpressionDictionaryName { get; set; }
public string ExpressionName { get; set; }
public string Pedtype { get; set; }
public string MovementClipSet { get; set; }
public string[] MovementClipSets { get; set; }
public string StrafeClipSet { get; set; }
public string MovementToStrafeClipSet { get; set; }
public string InjuredStrafeClipSet { get; set; }
public string FullBodyDamageClipSet { get; set; }
public string AdditiveDamageClipSet { get; set; }
public string DefaultGestureClipSet { get; set; }
public string FacialClipsetGroupName { get; set; }
public string DefaultVisemeClipSet { get; set; }
public string SidestepClipSet { get; set; }
public string PoseMatcherName { get; set; }
public string PoseMatcherProneName { get; set; }
public string GetupSetHash { get; set; }
public string CreatureMetadataName { get; set; }
public string DecisionMakerName { get; set; }
public string MotionTaskDataSetName { get; set; }
public string DefaultTaskDataSetName { get; set; }
public string PedCapsuleName { get; set; }
public string PedLayoutName { get; set; }
public string PedComponentSetName { get; set; }
public string PedComponentClothName { get; set; }
public string PedIKSettingsName { get; set; }
public string TaskDataName { get; set; }
public bool IsStreamedGfx { get; set; }
public bool AmbulanceShouldRespondTo { get; set; }
public bool CanRideBikeWithNoHelmet { get; set; }
public bool CanSpawnInCar { get; set; }
public bool IsHeadBlendPed { get; set; }
public bool bOnlyBulkyItemVariations { get; set; }
public string RelationshipGroup { get; set; }
public string NavCapabilitiesName { get; set; }
public string PerceptionInfo { get; set; }
public string DefaultBrawlingStyle { get; set; }
public string DefaultUnarmedWeapon { get; set; }
public string Personality { get; set; }
public string CombatInfo { get; set; }
public string VfxInfoName { get; set; }
public string AmbientClipsForFlee { get; set; }
public string Radio1 { get; set; } // MetaName.ePedRadioGenre
public string Radio2 { get; set; } // MetaName.ePedRadioGenre
public float FUpOffset { get; set; }
public float RUpOffset { get; set; }
public float FFrontOffset { get; set; }
public float RFrontOffset { get; set; }
public float MinActivationImpulse { get; set; }
public float Stubble { get; set; }
public float HDDist { get; set; }
public float TargetingThreatModifier { get; set; }
public float KilledPerceptionRangeModifer { get; set; }
public string Sexiness { get; set; } // MetaTypeName.ARRAYINFO MetaName.eSexinessFlags
public byte Age { get; set; }
public byte MaxPassengersInCar { get; set; }
public string ExternallyDrivenDOFs { get; set; } // MetaTypeName.ARRAYINFO MetaName.eExternallyDrivenDOFs
public string PedVoiceGroup { get; set; }
public string AnimalAudioObject { get; set; }
public string AbilityType { get; set; } // MetaName.SpecialAbilityType
public string ThermalBehaviour { get; set; } // MetaName.ThermalBehaviour
public string SuperlodType { get; set; } // MetaName.eSuperlodType
public string ScenarioPopStreamingSlot { get; set; } // MetaName.eScenarioPopStreamingSlot
public string DefaultSpawningPreference { get; set; } // MetaName.DefaultSpawnPreference
public float DefaultRemoveRangeMultiplier { get; set; }
public bool AllowCloseSpawning { get; set; }
public CPedModelInfo__InitData(XmlNode node)
{
Name = Xml.GetChildInnerText(node, "Name");
PropsName = Xml.GetChildInnerText(node, "PropsName");
ClipDictionaryName = Xml.GetChildInnerText(node, "ClipDictionaryName");
BlendShapeFileName = Xml.GetChildInnerText(node, "BlendShapeFileName");
ExpressionSetName = Xml.GetChildInnerText(node, "ExpressionSetName");
ExpressionDictionaryName = Xml.GetChildInnerText(node, "ExpressionDictionaryName");
ExpressionName = Xml.GetChildInnerText(node, "ExpressionName");
Pedtype = Xml.GetChildInnerText(node, "Pedtype");
MovementClipSet = Xml.GetChildInnerText(node, "MovementClipSet");
var items = node.SelectSingleNode("MovementClipSets")?.SelectNodes("Item");
if (items?.Count > 0)
{
MovementClipSets = new string[items.Count];
for (int i = 0; i < items.Count; i++)
{
MovementClipSets[i] = items[i].InnerText;
}
}
StrafeClipSet = Xml.GetChildInnerText(node, "StrafeClipSet");
MovementToStrafeClipSet = Xml.GetChildInnerText(node, "MovementToStrafeClipSet");
InjuredStrafeClipSet = Xml.GetChildInnerText(node, "InjuredStrafeClipSet");
FullBodyDamageClipSet = Xml.GetChildInnerText(node, "FullBodyDamageClipSet");
AdditiveDamageClipSet = Xml.GetChildInnerText(node, "AdditiveDamageClipSet");
DefaultGestureClipSet = Xml.GetChildInnerText(node, "DefaultGestureClipSet");
FacialClipsetGroupName = Xml.GetChildInnerText(node, "FacialClipsetGroupName");
DefaultVisemeClipSet = Xml.GetChildInnerText(node, "DefaultVisemeClipSet");
SidestepClipSet = Xml.GetChildInnerText(node, "SidestepClipSet");
PoseMatcherName = Xml.GetChildInnerText(node, "PoseMatcherName");
PoseMatcherProneName = Xml.GetChildInnerText(node, "PoseMatcherProneName");
GetupSetHash = Xml.GetChildInnerText(node, "GetupSetHash");
CreatureMetadataName = Xml.GetChildInnerText(node, "CreatureMetadataName");
DecisionMakerName = Xml.GetChildInnerText(node, "DecisionMakerName");
MotionTaskDataSetName = Xml.GetChildInnerText(node, "MotionTaskDataSetName");
DefaultTaskDataSetName = Xml.GetChildInnerText(node, "DefaultTaskDataSetName");
PedCapsuleName = Xml.GetChildInnerText(node, "PedCapsuleName");
PedLayoutName = Xml.GetChildInnerText(node, "PedLayoutName");
PedComponentSetName = Xml.GetChildInnerText(node, "PedComponentSetName");
PedComponentClothName = Xml.GetChildInnerText(node, "PedComponentClothName");
PedIKSettingsName = Xml.GetChildInnerText(node, "PedIKSettingsName");
TaskDataName = Xml.GetChildInnerText(node, "TaskDataName");
IsStreamedGfx = Xml.GetChildBoolAttribute(node, "IsStreamedGfx", "value");
AmbulanceShouldRespondTo = Xml.GetChildBoolAttribute(node, "AmbulanceShouldRespondTo", "value");
CanRideBikeWithNoHelmet = Xml.GetChildBoolAttribute(node, "CanRideBikeWithNoHelmet", "value");
CanSpawnInCar = Xml.GetChildBoolAttribute(node, "CanSpawnInCar", "value");
IsHeadBlendPed = Xml.GetChildBoolAttribute(node, "IsHeadBlendPed", "value");
bOnlyBulkyItemVariations = Xml.GetChildBoolAttribute(node, "bOnlyBulkyItemVariations", "value");
RelationshipGroup = Xml.GetChildInnerText(node, "RelationshipGroup");
NavCapabilitiesName = Xml.GetChildInnerText(node, "NavCapabilitiesName");
PerceptionInfo = Xml.GetChildInnerText(node, "PerceptionInfo");
DefaultBrawlingStyle = Xml.GetChildInnerText(node, "DefaultBrawlingStyle");
DefaultUnarmedWeapon = Xml.GetChildInnerText(node, "DefaultUnarmedWeapon");
Personality = Xml.GetChildInnerText(node, "Personality");
CombatInfo = Xml.GetChildInnerText(node, "CombatInfo");
VfxInfoName = Xml.GetChildInnerText(node, "VfxInfoName");
AmbientClipsForFlee = Xml.GetChildInnerText(node, "AmbientClipsForFlee");
Radio1 = Xml.GetChildInnerText(node, "Radio1"); // MetaName.ePedRadioGenre
Radio2 = Xml.GetChildInnerText(node, "Radio2"); // MetaName.ePedRadioGenre
FUpOffset = Xml.GetChildFloatAttribute(node, "FUpOffset", "value");
RUpOffset = Xml.GetChildFloatAttribute(node, "RUpOffset", "value");
FFrontOffset = Xml.GetChildFloatAttribute(node, "FFrontOffset", "value");
RFrontOffset = Xml.GetChildFloatAttribute(node, "RFrontOffset", "value");
MinActivationImpulse = Xml.GetChildFloatAttribute(node, "MinActivationImpulse", "value");
Stubble = Xml.GetChildFloatAttribute(node, "Stubble", "value");
HDDist = Xml.GetChildFloatAttribute(node, "HDDist", "value");
TargetingThreatModifier = Xml.GetChildFloatAttribute(node, "TargetingThreatModifier", "value");
KilledPerceptionRangeModifer = Xml.GetChildFloatAttribute(node, "KilledPerceptionRangeModifer", "value");
Sexiness = Xml.GetChildInnerText(node, "Sexiness"); // MetaTypeName.ARRAYINFO MetaName.eSexinessFlags
Age = (byte)Xml.GetChildUIntAttribute(node, "Age", "value");
MaxPassengersInCar = (byte)Xml.GetChildUIntAttribute(node, "MaxPassengersInCar", "value");
ExternallyDrivenDOFs = Xml.GetChildInnerText(node, "ExternallyDrivenDOFs"); // MetaTypeName.ARRAYINFO MetaName.eExternallyDrivenDOFs
PedVoiceGroup = Xml.GetChildInnerText(node, "PedVoiceGroup");
AnimalAudioObject = Xml.GetChildInnerText(node, "AnimalAudioObject");
AbilityType = Xml.GetChildInnerText(node, "AbilityType"); // MetaName.SpecialAbilityType
ThermalBehaviour = Xml.GetChildInnerText(node, "ThermalBehaviour"); // MetaName.ThermalBehaviour
SuperlodType = Xml.GetChildInnerText(node, "SuperlodType"); // MetaName.eSuperlodType
ScenarioPopStreamingSlot = Xml.GetChildInnerText(node, "ScenarioPopStreamingSlot"); // MetaName.eScenarioPopStreamingSlot
DefaultSpawningPreference = Xml.GetChildInnerText(node, "DefaultSpawningPreference"); // MetaName.DefaultSpawnPreference
DefaultRemoveRangeMultiplier = Xml.GetChildFloatAttribute(node, "DefaultRemoveRangeMultiplier", "value");
AllowCloseSpawning = Xml.GetChildBoolAttribute(node, "AllowCloseSpawning", "value");
}
public override string ToString()
{
return Name;
}
}
[TC(typeof(EXP))] public class CTxdRelationship
{
public string parent { get; set; }
public string child { get; set; }
public CTxdRelationship(XmlNode node)
{
parent = Xml.GetChildInnerText(node, "parent");
child = Xml.GetChildInnerText(node, "child");
}
public override string ToString()
{
return parent + ": " + child;
}
}
[TC(typeof(EXP))] public class CMultiTxdRelationship
{
public string parent { get; set; }
public string[] children { get; set; }
public CMultiTxdRelationship(XmlNode node)
{
parent = Xml.GetChildInnerText(node, "parent");
var items = node.SelectSingleNode("children")?.SelectNodes("Item");
if (items?.Count > 0)
{
children = new string[items.Count];
for (int i = 0; i < items.Count; i++)
{
children[i] = items[i].InnerText;
}
}
}
public override string ToString()
{
return parent + ": " + (children?.Length ?? 0).ToString() + " children";
}
}
}