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);
        }
示例#3
0
        //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;
                }
            }
        }