private void RecursiveTreeLoad(AssetTypeValueField atvf, TreeNode node, int depth) { if (atvf.childrenCount == 0) { return; } foreach (AssetTypeValueField atvfc in atvf.children) //todo, if over certain amount of children, load later { if (atvfc == null) { return; //derp check, usually doesn't break anything } string value = ""; if (atvfc.GetValue() != null) { EnumValueTypes evt = atvfc.GetValue().GetValueType(); string str = ""; if (evt == EnumValueTypes.ValueType_String) { str = "\""; } if (1 <= (int)evt && (int)evt <= 12) { value = " = " + str + atvfc.GetValue().AsString() + str; } if (evt == EnumValueTypes.ValueType_Array || evt == EnumValueTypes.ValueType_ByteArray) { value = $" (size {atvfc.childrenCount})"; } } node.Nodes.Add(atvfc.GetFieldType() + " " + atvfc.GetName() + value); RecursiveTreeLoad(atvfc, node.LastNode, depth + 1); } }
private uint GetFieldSize(EnumValueTypes valueType) { switch (valueType) { case EnumValueTypes.ValueType_Bool: case EnumValueTypes.ValueType_Int8: case EnumValueTypes.ValueType_UInt8: return(1); case EnumValueTypes.ValueType_Int16: case EnumValueTypes.ValueType_UInt16: return(2); case EnumValueTypes.ValueType_Int32: case EnumValueTypes.ValueType_UInt32: case EnumValueTypes.ValueType_Float: return(4); case EnumValueTypes.ValueType_Int64: case EnumValueTypes.ValueType_UInt64: case EnumValueTypes.ValueType_Double: return(8); default: return(0xFFFFFFFF); } }
//Creates an AssetTypeValue. //type : the value type which valueContainer stores //valueContainer : the buffer for the value type //freeIfPointer : should the value get freed if value type is Array/String public AssetTypeValue(EnumValueTypes type, object valueContainer) { this.type = type; if (valueContainer != null) { Set(valueContainer); } }
private void RecurseTextDump(AssetTypeValueField field, int depth) { AssetTypeTemplateField template = field.GetTemplateField(); string align = template.align ? "1" : "0"; string typeName = template.type; string fieldName = template.name; bool isArray = template.isArray; //string's field isn't aligned but its array is if (template.valueType == EnumValueTypes.String) { align = "1"; } if (isArray) { AssetTypeTemplateField sizeTemplate = template.children[0]; string sizeAlign = sizeTemplate.align ? "1" : "0"; string sizeTypeName = sizeTemplate.type; string sizeFieldName = sizeTemplate.name; int size = field.GetValue().AsArray().size; sw.WriteLine($"{new string(' ', depth)}{align} {typeName} {fieldName} ({size} items)"); sw.WriteLine($"{new string(' ', depth+1)}{sizeAlign} {sizeTypeName} {sizeFieldName} = {size}"); for (int i = 0; i < field.childrenCount; i++) { sw.WriteLine($"{new string(' ', depth+1)}[{i}]"); RecurseTextDump(field.children[i], depth + 2); } } else { string value = ""; if (field.GetValue() != null) { EnumValueTypes evt = field.GetValue().GetValueType(); if (evt == EnumValueTypes.String) { //only replace \ with \\ but not " with \" lol //you just have to find the last " string fixedStr = field.GetValue().AsString() .Replace("\\", "\\\\") .Replace("\r", "\\r") .Replace("\n", "\\n"); value = $" = \"{fixedStr}\""; } else if (1 <= (int)evt && (int)evt <= 12) { value = $" = {field.GetValue().AsString()}"; } } sw.WriteLine($"{new string(' ', depth)}{align} {typeName} {fieldName}{value}"); for (int i = 0; i < field.childrenCount; i++) { RecurseTextDump(field.children[i], depth + 1); } } }
private bool TypeAligns(EnumValueTypes valueType) { if (valueType.Equals(EnumValueTypes.Bool) || valueType.Equals(EnumValueTypes.Int8) || valueType.Equals(EnumValueTypes.UInt8) || valueType.Equals(EnumValueTypes.Int16) || valueType.Equals(EnumValueTypes.UInt16)) { return(true); } return(false); }
private bool IsAlignable(EnumValueTypes valueType) { if (valueType.Equals(EnumValueTypes.ValueType_Bool) || valueType.Equals(EnumValueTypes.ValueType_Int8) || valueType.Equals(EnumValueTypes.ValueType_UInt8) || valueType.Equals(EnumValueTypes.ValueType_Int16) || valueType.Equals(EnumValueTypes.ValueType_UInt16)) { return(true); } return(false); }
private AssetTypeTemplateField CreateTemplateField(string name, string type, EnumValueTypes valueType, bool isArray, bool align, int childrenCount, AssetTypeTemplateField[] children) { AssetTypeTemplateField field = new AssetTypeTemplateField(); field.name = name; field.type = type; field.valueType = valueType; field.isArray = isArray; field.align = align; field.hasValue = valueType != EnumValueTypes.None; field.childrenCount = childrenCount; field.children = children; return(field); }
public AssetTypeTemplateField CreateTemplateField(string name, string type, EnumValueTypes valueType, bool isArray, bool align, uint childrenCount, AssetTypeTemplateField[] children) { AssetTypeTemplateField field = new AssetTypeTemplateField(); field.name = name; field.type = type; field.valueType = valueType; field.isArray = isArray; field.align = align; field.hasValue = (valueType == EnumValueTypes.ValueType_None) ? false : true; field.childrenCount = childrenCount; field.children = children; return(field); }
public bool FromClassDatabase(ClassDatabaseFile pFile, ClassDatabaseType pType, uint fieldIndex) { ClassDatabaseTypeField field = pType.fields[(int)fieldIndex]; name = field.fieldName.GetString(pFile); type = field.typeName.GetString(pFile); valueType = AssetTypeValueField.GetValueTypeByTypeName(type); isArray = field.isArray == 1 ? true : false; align = (field.flags2 & 0x4000) != 0x00 ? true : false; hasValue = (valueType == EnumValueTypes.ValueType_None) ? false : true; List <int> childrenIndexes = new List <int>(); int thisDepth = pType.fields[(int)fieldIndex].depth; for (int i = (int)fieldIndex + 1; i < pType.fields.Count; i++) { if (pType.fields[i].depth == thisDepth + 1) { childrenCount++; childrenIndexes.Add(i); } if (pType.fields[i].depth <= thisDepth) { break; } } children = new AssetTypeTemplateField[childrenCount]; int child = 0; for (int i = (int)fieldIndex + 1; i < pType.fields.Count; i++) { if (pType.fields[i].depth == thisDepth + 1) { children[child] = new AssetTypeTemplateField(); children[child].FromClassDatabase(pFile, pType, (uint)childrenIndexes[child]); child++; } if (pType.fields[i].depth <= thisDepth) { break; } } return(true); }
///public AssetTypeTemplateField() ///public void Clear() public bool From0D(Type_0D u5Type, int fieldIndex) { TypeField_0D field = u5Type.typeFieldsEx[fieldIndex]; name = field.GetNameString(u5Type.stringTable); type = field.GetTypeString(u5Type.stringTable); valueType = AssetTypeValueField.GetValueTypeByTypeName(type); isArray = field.isArray == 1 ? true : false; align = (field.flags & 0x4000) != 0x00 ? true : false; hasValue = (valueType == EnumValueTypes.ValueType_None) ? false : true; List <int> childrenIndexes = new List <int>(); int thisDepth = u5Type.typeFieldsEx[fieldIndex].depth; for (int i = fieldIndex + 1; i < u5Type.typeFieldsExCount; i++) { if (u5Type.typeFieldsEx[i].depth == thisDepth + 1) { childrenCount++; childrenIndexes.Add(i); } if (u5Type.typeFieldsEx[i].depth <= thisDepth) { break; } } children = new AssetTypeTemplateField[childrenCount]; int child = 0; for (int i = fieldIndex + 1; i < u5Type.typeFieldsExCount; i++) { if (u5Type.typeFieldsEx[i].depth == thisDepth + 1) { children[child] = new AssetTypeTemplateField(); children[child].From0D(u5Type, childrenIndexes[child]); child++; } if (u5Type.typeFieldsEx[i].depth <= thisDepth) { break; } } return(true); }
private string CorrectTypeName(EnumValueTypes valueTypes) { switch (valueTypes) { case EnumValueTypes.Bool: return("bool"); case EnumValueTypes.UInt8: return("UInt8"); case EnumValueTypes.Int8: return("SInt8"); case EnumValueTypes.UInt16: return("UInt16"); case EnumValueTypes.Int16: return("Int16"); case EnumValueTypes.UInt32: return("unsigned int"); case EnumValueTypes.Int32: return("int"); case EnumValueTypes.UInt64: return("UInt64"); case EnumValueTypes.Int64: return("SInt64"); case EnumValueTypes.Float: return("float"); case EnumValueTypes.Double: return("double"); case EnumValueTypes.String: return("string"); } return("UnknownBaseType"); }
private void TreeLoad(AssetsFileInstance fromFile, AssetTypeValueField assetField, TreeViewItem treeItem) { if (assetField.childrenCount == 0) { return; } int arrayIdx = 0; List <TreeViewItem> items = new List <TreeViewItem>(assetField.childrenCount + 1); AssetTypeTemplateField assetFieldTemplate = assetField.GetTemplateField(); bool isArray = assetFieldTemplate.isArray; if (isArray) { int size = assetField.GetValue().AsArray().size; AssetTypeTemplateField sizeTemplate = assetFieldTemplate.children[0]; TreeViewItem arrayIndexTreeItem = CreateTreeItem($"{sizeTemplate.type} {sizeTemplate.name} = {size}"); items.Add(arrayIndexTreeItem); } foreach (AssetTypeValueField childField in assetField.children) { if (childField == null) { return; } string value = ""; if (childField.GetValue() != null) { EnumValueTypes evt = childField.GetValue().GetValueType(); string quote = ""; if (evt == EnumValueTypes.String) { quote = "\""; } if (1 <= (int)evt && (int)evt <= 12) { value = $" = {quote}{childField.GetValue().AsString()}{quote}"; } if (evt == EnumValueTypes.Array || evt == EnumValueTypes.ByteArray) { value = $" (size {childField.childrenCount})"; } } if (isArray) { TreeViewItem arrayIndexTreeItem = CreateTreeItem($"{arrayIdx}"); items.Add(arrayIndexTreeItem); TreeViewItem childTreeItem = CreateTreeItem($"{childField.GetFieldType()} {childField.GetName()}{value}"); arrayIndexTreeItem.Items = new List <TreeViewItem>() { childTreeItem }; if (childField.childrenCount > 0) { TreeViewItem dummyItem = CreateTreeItem("Loading..."); childTreeItem.Items = new List <TreeViewItem>() { dummyItem }; SetTreeItemEvents(childTreeItem, fromFile, childField); } arrayIdx++; } else { TreeViewItem childTreeItem = CreateTreeItem($"{childField.GetFieldType()} {childField.GetName()}{value}"); items.Add(childTreeItem); if (childField.childrenCount > 0) { TreeViewItem dummyItem = CreateTreeItem("Loading..."); childTreeItem.Items = new List <TreeViewItem>() { dummyItem }; SetTreeItemEvents(childTreeItem, fromFile, childField); } } } string templateFieldType = assetField.templateField.type; if (templateFieldType.StartsWith("PPtr<") && templateFieldType.EndsWith(">")) { var fileIdField = assetField.Get("m_FileID"); var pathIdField = assetField.Get("m_PathID"); bool pptrValid = !fileIdField.IsDummy() && !pathIdField.IsDummy(); if (pptrValid) { int fileId = fileIdField.GetValue().AsInt(); long pathId = pathIdField.GetValue().AsInt64(); AssetContainer cont = workspace.GetAssetContainer(fromFile, fileId, pathId, false); TreeViewItem childTreeItem = CreateTreeItem($"[view asset]"); items.Add(childTreeItem); TreeViewItem dummyItem = CreateTreeItem("Loading..."); childTreeItem.Items = new List <TreeViewItem>() { dummyItem }; SetPPtrEvents(childTreeItem, fromFile, cont); } } treeItem.Items = items; }
public AssetTypeValueField ReadType(AssetsFileReader reader, ulong filePos, AssetTypeValueField valueField, bool bigEndian) { if (valueField.templateField.isArray) { if (valueField.templateField.childrenCount == 2) { EnumValueTypes sizeType = valueField.templateField.children[0].valueType; if (sizeType == EnumValueTypes.ValueType_Int32 || sizeType == EnumValueTypes.ValueType_UInt32) { valueField.childrenCount = reader.ReadUInt32(); valueField.pChildren = new AssetTypeValueField[valueField.childrenCount]; for (int i = 0; i < valueField.childrenCount; i++) { valueField.pChildren[i] = new AssetTypeValueField(); valueField.pChildren[i].templateField = valueField.templateField.children[1]; valueField.pChildren[i] = ReadType(reader, reader.Position, valueField.pChildren[i], bigEndian); } if (valueField.templateField.align) { reader.Align(); } AssetTypeArray ata = new AssetTypeArray(); ata.size = valueField.childrenCount; valueField.value = new AssetTypeValue(EnumValueTypes.ValueType_Array, 0); valueField.value.Set(ata); } else { Debug.WriteLine("Invalid array value type! Found an unexpected " + sizeType.ToString() + " type instead!"); } } else { Debug.WriteLine("Invalid array!"); } } else { EnumValueTypes type = valueField.templateField.valueType; if (type != 0) { valueField.value = new AssetTypeValue(type, 0); } if (type == EnumValueTypes.ValueType_String) { valueField.value.Set(reader.ReadCountStringInt32()); reader.Align(); } else { valueField.childrenCount = valueField.templateField.childrenCount; if (valueField.childrenCount == 0) { valueField.pChildren = new AssetTypeValueField[0]; switch (valueField.templateField.valueType) { case EnumValueTypes.ValueType_Int8: valueField.value.Set(reader.ReadSByte()); if (valueField.templateField.align) { reader.Align(); } break; case EnumValueTypes.ValueType_UInt8: case EnumValueTypes.ValueType_Bool: valueField.value.Set(reader.ReadByte()); if (valueField.templateField.align) { reader.Align(); } break; case EnumValueTypes.ValueType_Int16: valueField.value.Set(reader.ReadInt16()); if (valueField.templateField.align) { reader.Align(); } break; case EnumValueTypes.ValueType_UInt16: valueField.value.Set(reader.ReadUInt16()); if (valueField.templateField.align) { reader.Align(); } break; case EnumValueTypes.ValueType_Int32: valueField.value.Set(reader.ReadInt32()); break; case EnumValueTypes.ValueType_UInt32: valueField.value.Set(reader.ReadUInt32()); break; case EnumValueTypes.ValueType_Int64: valueField.value.Set(reader.ReadInt64()); break; case EnumValueTypes.ValueType_UInt64: valueField.value.Set(reader.ReadUInt64()); break; case EnumValueTypes.ValueType_Float: valueField.value.Set(reader.ReadSingle()); break; case EnumValueTypes.ValueType_Double: valueField.value.Set(reader.ReadDouble()); break; } } else { valueField.pChildren = new AssetTypeValueField[valueField.childrenCount]; for (int i = 0; i < valueField.childrenCount; i++) { valueField.pChildren[i] = new AssetTypeValueField(); valueField.pChildren[i].templateField = valueField.templateField.children[i]; valueField.pChildren[i] = ReadType(reader, reader.Position, valueField.pChildren[i], bigEndian); } if (valueField.templateField.align) { reader.Align(); } } } } return(valueField); }
//Creates an AssetTypeValue. //type : the value type which valueContainer stores //valueContainer : the buffer for the value type //freeIfPointer : should the value get freed if value type is Array/String public AssetTypeValue(EnumValueTypes type, object valueContainer) { this.type = type; }
private AssetTypeTemplateField CreateTemplateField(string name, string type, EnumValueTypes valueType, int childrenCount, AssetTypeTemplateField[] children) { return(CreateTemplateField(name, type, valueType, false, false, childrenCount, children)); }
private AssetTypeTemplateField CreateTemplateField(string name, string type, EnumValueTypes valueType, bool isArray, bool align) { return(CreateTemplateField(name, type, valueType, isArray, align, 0, null)); }
private AssetTypeTemplateField CreateTemplateField(string name, string type, EnumValueTypes valueType) { return(CreateTemplateField(name, type, valueType, false, false, 0, null)); }
private void TreeLoad(AssetTypeValueField assetField, TreeViewItem treeItem) { if (assetField.childrenCount == 0) { return; } int arrayIdx = 0; List <TreeViewItem> items = new List <TreeViewItem>(assetField.childrenCount + 1); AssetTypeTemplateField assetFieldTemplate = assetField.GetTemplateField(); bool isArray = assetFieldTemplate.isArray; if (isArray) { int size = assetField.GetValue().AsArray().size; AssetTypeTemplateField sizeTemplate = assetFieldTemplate.children[0]; TreeViewItem arrayIndexTreeItem = CreateTreeItem($"{sizeTemplate.type} {sizeTemplate.name} = {size}"); items.Add(arrayIndexTreeItem); } foreach (AssetTypeValueField childField in assetField.children) { if (childField == null) { return; } string value = ""; if (childField.GetValue() != null) { EnumValueTypes evt = childField.GetValue().GetValueType(); string quote = ""; if (evt == EnumValueTypes.String) { quote = "\""; } if (1 <= (int)evt && (int)evt <= 12) { value = $" = {quote}{childField.GetValue().AsString()}{quote}"; } if (evt == EnumValueTypes.Array || evt == EnumValueTypes.ByteArray) { value = $" (size {childField.childrenCount})"; } } if (isArray) { TreeViewItem arrayIndexTreeItem = CreateTreeItem($"{arrayIdx}"); items.Add(arrayIndexTreeItem); TreeViewItem childTreeItem = CreateTreeItem($"{childField.GetFieldType()} {childField.GetName()}{value}"); arrayIndexTreeItem.Items = new List <TreeViewItem>() { childTreeItem }; if (childField.childrenCount > 0) { TreeViewItem dummyItem = CreateTreeItem("Loading..."); childTreeItem.Items = new List <TreeViewItem>() { dummyItem }; SetTreeItemEvents(childTreeItem, childField); } arrayIdx++; } else { TreeViewItem childTreeItem = CreateTreeItem($"{childField.GetFieldType()} {childField.GetName()}{value}"); items.Add(childTreeItem); if (childField.childrenCount > 0) { TreeViewItem dummyItem = CreateTreeItem("Loading..."); childTreeItem.Items = new List <TreeViewItem>() { dummyItem }; SetTreeItemEvents(childTreeItem, childField); } } } treeItem.Items = items; }
public AssetTypeValueField ReadType(AssetsFileReader reader, AssetTypeValueField valueField) { if (valueField.templateField.isArray) { if (valueField.templateField.childrenCount == 2) { EnumValueTypes sizeType = valueField.templateField.children[0].valueType; if (sizeType == EnumValueTypes.Int32 || sizeType == EnumValueTypes.UInt32) { if (valueField.templateField.valueType == EnumValueTypes.ByteArray) { valueField.childrenCount = 0; valueField.children = new AssetTypeValueField[0]; int size = reader.ReadInt32(); byte[] data = reader.ReadBytes(size); if (valueField.templateField.align) { reader.Align(); } AssetTypeByteArray atba = new AssetTypeByteArray(); atba.size = (uint)size; atba.data = data; valueField.value = new AssetTypeValue(EnumValueTypes.ByteArray, atba); } else { valueField.childrenCount = reader.ReadInt32(); valueField.children = new AssetTypeValueField[valueField.childrenCount]; for (int i = 0; i < valueField.childrenCount; i++) { valueField.children[i] = new AssetTypeValueField(); valueField.children[i].templateField = valueField.templateField.children[1]; valueField.children[i] = ReadType(reader, valueField.children[i]); } if (valueField.templateField.align) { reader.Align(); } AssetTypeArray ata = new AssetTypeArray(); ata.size = valueField.childrenCount; valueField.value = new AssetTypeValue(EnumValueTypes.Array, ata); } } else { throw new Exception("Invalid array value type! Found an unexpected " + sizeType.ToString() + " type instead!"); } } else { throw new Exception("Invalid array!"); } } else { EnumValueTypes type = valueField.templateField.valueType; if (type != 0) { valueField.value = new AssetTypeValue(type, null); } if (type == EnumValueTypes.String) { int length = reader.ReadInt32(); valueField.value.Set(reader.ReadBytes(length)); reader.Align(); } else { valueField.childrenCount = valueField.templateField.childrenCount; if (valueField.childrenCount == 0) { valueField.children = new AssetTypeValueField[0]; switch (valueField.templateField.valueType) { case EnumValueTypes.Int8: valueField.value.Set(reader.ReadSByte()); if (valueField.templateField.align) { reader.Align(); } break; case EnumValueTypes.UInt8: case EnumValueTypes.Bool: valueField.value.Set(reader.ReadByte()); if (valueField.templateField.align) { reader.Align(); } break; case EnumValueTypes.Int16: valueField.value.Set(reader.ReadInt16()); if (valueField.templateField.align) { reader.Align(); } break; case EnumValueTypes.UInt16: valueField.value.Set(reader.ReadUInt16()); if (valueField.templateField.align) { reader.Align(); } break; case EnumValueTypes.Int32: valueField.value.Set(reader.ReadInt32()); break; case EnumValueTypes.UInt32: valueField.value.Set(reader.ReadUInt32()); break; case EnumValueTypes.Int64: valueField.value.Set(reader.ReadInt64()); break; case EnumValueTypes.UInt64: valueField.value.Set(reader.ReadUInt64()); break; case EnumValueTypes.Float: valueField.value.Set(reader.ReadSingle()); break; case EnumValueTypes.Double: valueField.value.Set(reader.ReadDouble()); break; } } else { valueField.children = new AssetTypeValueField[valueField.childrenCount]; for (int i = 0; i < valueField.childrenCount; i++) { valueField.children[i] = new AssetTypeValueField(); valueField.children[i].templateField = valueField.templateField.children[i]; valueField.children[i] = ReadType(reader, valueField.children[i]); } if (valueField.templateField.align) { reader.Align(); } } } } return(valueField); }