protected override void OnParse(VoidPtr address) { _unks = new List <float>(); _hops = new List <float>(); sMultiJump *hdr = (sMultiJump *)address; _unk1 = hdr->_unk1; _unk2 = hdr->_unk2; _unk3 = hdr->_unk3; _horizontalBoost = hdr->_horizontalBoost; if (hdr->hopFixed) { _hops.Add(*(bfloat *)hdr->_hopListOffset.Address); } else { bfloat *addr = (bfloat *)(BaseAddress + hdr->_hopListOffset); for (int i = 0; i < (_offset - hdr->_hopListOffset) / 4; i++) { _hops.Add(*addr++); } } if (hdr->unkFixed) { _unks.Add(*(bfloat *)hdr->_unkListOffset.Address); } else { bfloat *addr = (bfloat *)(BaseAddress + hdr->_unkListOffset); for (int i = 0; i < ((hdr->hopFixed ? _offset : (int)hdr->_hopListOffset) - hdr->_unkListOffset) / 4; i++) { _unks.Add(*addr++); } } if (hdr->turnFixed) { _turnFrames = *(bfloat *)hdr->_turnFrameOffset.Address; } else { _turnFrames = hdr->_turnFrameOffset; } }
protected override void OnWrite(VoidPtr address) { int off = 0; if (_hops.Count > 1) { off += _hops.Count * 4; } if (_unks.Count > 1) { off += _unks.Count * 4; } sMultiJump *header = (sMultiJump *)(address + off); RebuildAddress = header; bfloat *addr = (bfloat *)address; if (_unks.Count > 1) { header->_unkListOffset = Offset(addr); if (header->_unkListOffset > 0) { Lookup(&header->_unkListOffset); } foreach (float f in _unks) { *addr++ = f; } } else if (_unks.Count == 1) { *((bfloat *)&header->_unkListOffset) = _unks[0]; } else { *((bfloat *)&header->_unkListOffset) = 0; } if (_hops.Count > 1) { header->_hopListOffset = Offset(addr); if (header->_hopListOffset > 0) { Lookup(&header->_hopListOffset); } foreach (float f in _hops) { *addr++ = f; } } else if (_hops.Count == 1) { *((bfloat *)&header->_hopListOffset) = _hops[0]; } else { *((bfloat *)&header->_hopListOffset) = 0; } header->_unk1 = _unk1; header->_unk2 = _unk2; header->_unk3 = _unk3; header->_horizontalBoost = _horizontalBoost; if (header->turnFixed) { *(bfloat *)&header->_turnFrameOffset = _turnFrames; } else { header->_turnFrameOffset = (int)_turnFrames; } }