internal static ResourceNode TryParse(DataSource source) { CEHeader *header = (CEHeader *)source.Address; if (header->_numEntries <= 0 || header->_numEntries > 0x100 || header->_unk1 != 0 || header->_unk2 != 0x1000000 || header->_unk3 != 0) { return(null); } return(new CENode()); }
public override void OnRebuild(VoidPtr address, int length, bool force) { CEHeader *header = (CEHeader *)address; header->_unk1 = unk1; header->_unk2 = unk2; header->_unk3 = unk3; header->_numEntries = Children[0].Children.Count; Children[0].Rebuild(address, 0x0, true); //rebuild CEEntries int EntrySize = Children[0].CalculateSize(true); //Caluculate CEEntry's size int offset = EntrySize + header->entryOffsets[0]; //set first CEString offset for (int i = 0; i < Children[1].Children.Count; i++) { header->entryOffsets[Children[0].Children.Count + i] = offset; offset += Children[1].Children[i].CalculateSize(true); } Children[1].Rebuild(address + header->entryOffsets[0] + EntrySize, 0x0, true); }
//when use this you must send first address or string address public override void OnRebuild(VoidPtr address, int length, bool force) { CEHeader *header = (CEHeader *)address; VoidPtr entry = null; int offset = 0x10 + Children.Count * 0x4 + Parent.Children[1].Children.Count * 0x4; if (offset % 0x10 != 0) { entry = address + offset + 0x10 - offset % 0x10; } else { entry = address + offset; } int count = 0; header->entryOffsets[count] = entry - address; //write offset of first entry if (_name == "Events") { foreach (CEEntryNode n in Children) { int entrySize = n.CalculateSize(true); n.Rebuild(entry, entrySize, true); entry += entrySize; count++; header->entryOffsets[count] = entry - address; //write each offset of entries } } if (_name == "Strings") { foreach (CEStringNode n in Children) //"address" is first address of CEString { int entrySize = n.CalculateSize(true); n.Rebuild(address, entrySize, true); address += entrySize; } } }