public static MetaPOINTER[] GetPointerArray(MetaFile meta, Array_StructurePointer array) { uint count = array.Count1; if (count == 0) { return(null); } MetaPOINTER[] ptrs = new MetaPOINTER[count]; int ptrsize = Marshal.SizeOf(typeof(MetaPOINTER)); int ptroffset = (int)array.PointerDataOffset; var ptrblock = meta.GetBlock((int)array.PointerDataId); if ((ptrblock == null) || (ptrblock.Data == null) || ((MetaName)ptrblock.StructureNameHash != MetaName.POINTER)) { return(null); } for (int i = 0; i < count; i++) { int offset = ptroffset + (i * ptrsize); if (offset >= ptrblock.Data.Count) { break; } ptrs[i] = ConvertData <MetaPOINTER>(ptrblock.Data, offset); } return(ptrs); }
public Array_StructurePointer AddPointerArray(MetaPOINTER[] arr) { if ((arr == null) || (arr.Length == 0)) { return(new Array_StructurePointer()); } var ptr = AddItemArray(MetaName.POINTER, arr); Array_StructurePointer sp = new Array_StructurePointer(); sp.Count1 = (ushort)arr.Length; sp.Count2 = sp.Count1; sp.Pointer = ptr.Pointer; return(sp); }
public static T[] ConvertDataArray <T>(MetaFile meta, Array_StructurePointer array) where T : struct { uint count = array.Count1; if (count == 0) { return(null); } MetaPOINTER[] ptrs = GetPointerArray(meta, array); if (ptrs == null) { return(null); } T[] items = new T[count]; int itemsize = Marshal.SizeOf(typeof(T)); int itemsleft = (int)count; //large arrays get split into chunks... //MetaName blocktype = 0; for (int i = 0; i < count; i++) { var ptr = ptrs[i]; var offset = ptr.Offset; var block = meta.GetBlock(ptr.BlockID); if (block == null) { continue; } if ((offset < 0) || (block.Data == null) || (offset >= block.Data.Count)) { continue; } items[i] = ConvertData <T>(block.Data, offset); } return(items); }