예제 #1
0
        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));
            }
        }
예제 #2
0
 public virtual void Close()
 {
     Reader.Close();
     Reader.Dispose();
     LocaleTables.Clear();
     Strings.Clear();
     IndexItems.Clear();
     Header      = null;
     IndexHeader = null;
 }
예제 #3
0
 public virtual void Close()
 {
     Reader.Close();
     Reader.Dispose();
     LocaleTables.Clear();
     Strings.Clear();
     IndexItems.Clear();
     ResourceLayoutTable = null;
     ResourceGestalt     = null;
     Header      = null;
     IndexHeader = null;
 }
예제 #4
0
        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>();
        }
예제 #5
0
        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));
            }
        }