public CacheFileGen3(HaloOnlineCacheContext cacheContext, FileInfo file, CacheVersion version, bool memory) : base(cacheContext, file, version, memory) { if (Header.Interop.ResourceBaseAddress == 0) { Magic = (int)(Header.Interop.RuntimeBaseAddress - Header.MemoryBufferSize); } else { Header.Magic = Header.StringIDsIndicesOffset - (int)TagStructure.GetTagStructureInfo(typeof(CacheFileHeader), version).TotalSize; Header.TagNamesBufferOffset -= Header.Magic; Header.TagNamesIndicesOffset -= Header.Magic; Header.StringIDsIndicesOffset -= Header.Magic; Header.StringIDsBufferOffset -= Header.Magic; var resourcePartition = Header.Partitions[(int)CacheFilePartitionType.Resources]; var resourceSection = Header.Interop.Sections[(int)CacheFileSectionType.Resource]; Magic = BitConverter.ToInt32(BitConverter.GetBytes(resourcePartition.BaseAddress), 0) - (Header.Interop.DebugSectionSize + resourceSection.Size); } if (Header.TagIndexAddress == 0) { return; } Header.TagIndexAddress = BitConverter.ToUInt32(BitConverter.GetBytes(Header.TagIndexAddress - Magic), 0); IndexHeader = new CacheIndexHeader(this); IndexItems = new IndexTable(this); Strings = new StringTable(this); LocaleTables = new List <LocaleTable>(); switch (version) { case CacheVersion.Halo3Retail: Resolver = new StringIdResolverHalo3(); break; case CacheVersion.Halo3ODST: Resolver = new StringIdResolverHalo3ODST(); break; case CacheVersion.HaloReach: Resolver = new StringIdResolverHaloReach(); break; default: throw new NotSupportedException(CacheVersionDetection.GetBuildName(version)); } foreach (var language in Enum.GetValues(typeof(GameLanguage))) { LocaleTables.Add(new LocaleTable(this, (GameLanguage)language)); } }
public virtual void Close() { Reader.Close(); Reader.Dispose(); LocaleTables.Clear(); Strings.Clear(); IndexItems.Clear(); Header = null; IndexHeader = null; }
public virtual void Close() { Reader.Close(); Reader.Dispose(); LocaleTables.Clear(); Strings.Clear(); IndexItems.Clear(); ResourceLayoutTable = null; ResourceGestalt = null; Header = null; IndexHeader = null; }
public CacheFileGen2(HaloOnlineCacheContext cacheContext, FileInfo file, CacheVersion version, bool memory) : base(cacheContext, file, version, memory) { if (file.Name == "mainmenu.map" && MainMenuCache?.File.FullName != file.FullName) { MainMenuCache = this; } else if (file.Name == "shared.map" && SharedCache?.File.FullName != file.FullName) { SharedCache = this; } else if (file.Name == "single_player_shared.map" && SharedCache?.File.FullName != file.FullName) { SinglePlayerSharedCache = this; } IndexHeader = new CacheIndexHeader(this); IndexItems = new IndexTable(this); Strings = new StringTable(this); LocaleTables = new List <LocaleTable>(); }
public GameCacheContextGen3(MapFile mapFile, EndianReader reader) { BaseMapFile = mapFile; Version = BaseMapFile.Version; Deserializer = new TagDeserializer(Version); LocalesKey = SetLocalesKey(); StringsKey = SetStringsKey(); TagsKey = SetTagsKey(); NetworkKey = SetNetworkKey(); StringMods = SetStringMods(); LocaleGlobalsSize = SetLocaleGlobalsSize(); LocaleGlobalsOffset = SetLocaleGlobalsOffset(); var interop = mapFile.Header.GetInterop(); if (interop != null && interop.ResourceBaseAddress == 0) { Magic = (int)(interop.RuntimeBaseAddress - mapFile.Header.GetMemoryBufferSize()); } else { mapFile.Header.ApplyMagic(mapFile.Header.GetStringIDsIndicesOffset() - mapFile.Header.GetHeaderSize(mapFile.Version)); var resourcePartition = mapFile.Header.GetPartitions()[(int)CacheFilePartitionType.Resources]; var resourceSection = interop.Sections[(int)CacheFileSectionType.Resource]; Magic = BitConverter.ToInt32(BitConverter.GetBytes(resourcePartition.BaseAddress), 0) - (interop.DebugSectionSize + resourceSection.Size); } if (mapFile.Header.GetTagIndexAddress() == 0) { return; } mapFile.Header.SetTagIndexAddress(BitConverter.ToUInt32(BitConverter.GetBytes(mapFile.Header.GetTagIndexAddress() - Magic), 0)); IndexHeader = mapFile.GetIndexHeader(reader, Magic); Strings = CreateStringTable(reader); IndexItems = CreateCacheIndexTable(reader); LocaleTables = new List <CacheLocaleTable>(); switch (mapFile.Version) { case CacheVersion.Halo3Retail: Resolver = new StringIdResolverHalo3(); break; case CacheVersion.Halo3ODST: Resolver = new StringIdResolverHalo3ODST(); break; case CacheVersion.HaloReach: Resolver = new StringIdResolverHaloReach(); break; default: throw new NotSupportedException(CacheVersionDetection.GetBuildName(mapFile.Version)); } foreach (var language in Enum.GetValues(typeof(GameLanguage))) { LocaleTables.Add(CreateLocaleTable(reader, (GameLanguage)language)); } }