public void Init(VltClassRecord classRecord, TableEndBlock teb, BinaryReader br) { var vc = new VltClass(); vc.Init(classRecord, teb, br); Classes.Add(vc.Hash, vc); }
private VltBlockContainer ReadBlock(BinaryReader reader) { if (reader.BaseStream.Position == reader.BaseStream.Length) { return(null); } var block = new VltBlock { Position = reader.BaseStream.Position, Type = (VltMarker)reader.ReadInt32(), BlockLength = reader.ReadInt32(), }; if (!block.IsBlank()) { var vltType = block.Type; VltBlockContainer bc; switch (vltType) { case VltMarker.VltMagic: bc = new HeaderBlock(); break; case VltMarker.TableStart: bc = new TableStartBlock(); break; case VltMarker.TableEnd: bc = new TableEndBlock(); break; default: bc = new PlaceholderBlock(); break; } bc.Block = block; bc.Read(reader); block.SeekToNextBlock(reader.BaseStream); return(bc); } return(null); }
public void Init(VltRootRecord rootRecord, TableEndBlock teb, BinaryReader br) { var position = teb.InfoDictionary[rootRecord.Position].Address2; br.BaseStream.Seek(position, SeekOrigin.Begin); _managedClasses = new Dictionary <uint, ManagedClass>(rootRecord.NumEntries); for (var i = 0; i < rootRecord.NumEntries; ++i) { var mc = new ManagedClass { Value = BinaryUtil.ReadNullTerminatedString(br), Unknown = rootRecord.Hashes[i] }; mc.Hash = JenkinsHash.getHash32(mc.Value); _managedClasses.Add(mc.Hash, mc); } }
public void Init(VltRowRecord rowRecord, TableEndBlock block, BinaryReader vltReader, BinaryReader binReader) { var info = new VltInfo(_vltClass.ClassRecord.NumFields); DebugUtil.EnsureCondition( block.InfoDictionary.ContainsKey(rowRecord.Position), () => "Uh oh."); var basePosition = block.InfoDictionary[rowRecord.Position].Address2; info.BlockContainer = block; info.Class = _vltClass; info.RowRecord = rowRecord; for (var i = 0; i < _vltClass.ClassRecord.NumFields; ++i) { var field = _vltClass.Fields[i]; BinaryReader br; if (!field.IsOptional()) { br = binReader; br.BaseStream.Seek(basePosition + field.Offset, SeekOrigin.Begin); } else { br = null; foreach (var row in rowRecord.Rows) { if (row.Hash == field.Hash) { if (row.IsInVlt()) { br = vltReader; br.BaseStream.Seek(row.Position, SeekOrigin.Begin); } else { br = binReader; br.BaseStream.Seek(block.InfoDictionary[row.Position].Address2, SeekOrigin.Begin); } } } if (br == null) { continue; } } var type = VltTypeMap.Instance.GetTypeForKey(field.TypeHash); if (type == null) { type = typeof(RawType); } VltType vltType; if (field.IsArray()) { vltType = new ArrayType(field, type); } else { vltType = VltType.Create(type); vltType.Size = field.Length; if (vltType is RawType rt) { rt.Length = field.Length; } } vltType.Address = (uint)br.BaseStream.Position; vltType.IsVlt = br == vltReader; vltType.TypeHash = field.TypeHash; vltType.Hash = field.Hash; vltType.Info = info; vltType.Read(br); if (vltType is ArrayType va) { Console.WriteLine($"Class: 0x{_vltClass.Hash:X8} | Field: 0x{field.Hash:X8} | Array of {va.Type} (original: 0x{field.TypeHash:X8}) with {va.Entries}/{va.MaxEntries} entries"); foreach (var av in va.Types) { Console.WriteLine($"\tValue: {av}"); } } else { if (!(vltType is RawType)) { Console.WriteLine( $"Class: 0x{_vltClass.Hash:X8} | Field: 0x{field.Hash:X8} | {vltType.GetType()} -> {vltType}"); } } info.Set(i, vltType); } _infoList.Add(info); }