public override void OnRebuild(VoidPtr address, int length, bool force) { curDataOffset = (uint)(Header->_headerSize + Children.Count * PathingMiscDataEntry.Size); uint headerSize = Header->_headerSize; PathingMiscData *header = (PathingMiscData *)address; *header = new PathingMiscData(); header->_count = (uint)Children.Count; header->_headerSize = headerSize; header->_minX = MinX; header->_minY = MinY; header->_minZ = MinZ; header->_maxX = MaxX; header->_maxY = MaxY; header->_maxZ = MaxZ; uint offset = headerSize; ResourceNode[] validChildren = Children.Where(n => n.HasChildren).ToArray(); foreach (ResourceNode n in validChildren) { int size = n.CalculateSize(true); n.Rebuild(address + offset, size, true); offset += (uint)size; } foreach (ResourceNode n in validChildren) { foreach (ResourceNode c in n.Children) { int size = c.CalculateSize(true); c.Rebuild(address + offset, size, true); offset += (uint)size; } } }
internal static ResourceNode TryParse(DataSource source, ResourceNode parent) { PathingMiscData *p = (PathingMiscData *)source.Address; uint sizeCheck = PathingMiscData.HeaderSize + PathingMiscDataEntry.Size * p->_count; if (p->_headerSize == PathingMiscData.HeaderSize && source.Length > sizeCheck) { for (int i = 0; i < p->_count; i++) { PathingMiscDataEntry *pe = (PathingMiscDataEntry *)(*p)[i]; sizeCheck += PathingMiscDataSubEntry.Size * pe->_count; if (sizeCheck > source.Length) { return(null); } } return(sizeCheck == source.Length ? new PathingMiscDataNode() : null); } return(null); }