public void Deserialize(BinaryReader reader) { uint itemCount = reader.ReadUInt32(); if (itemCount > reader.StreamRemainder()) { throw new Exception("Array item count is out of bounds"); } if (typeof(T) == typeof(byte)) { // Avoid wasting time on large arrays if (itemCount > 0) { (this as List <byte>).AddRange(reader.ReadBytes(itemCount)); } } else { for (uint i = 0; i < itemCount; i++) { var newObj = RTTI.DeserializeType <T>(reader); Add(newObj); } } }
public void Serialize(BinaryWriter writer) { writer.Write((uint)Count); foreach (var element in this) { RTTI.SerializeType(writer, element); } }
public static T Clone <T>(T obj) { if (obj == null) { return(default(T)); } using var ms = new MemoryStream(); using var bw = new BinaryWriter(ms); using var br = new BinaryReader(ms); RTTI.SerializeType(bw, obj); ms.Position = 0; return(RTTI.DeserializeType <T>(br)); }
public void ReadSave(SaveState state) { int count = state.ReadVariableLengthInt(); for (int i = 0; i < count; i++) { string objectType = state.ReadIndexedString(); var guid = state.ReadIndexedGUID(); // See comments in StreamingStrategyInstance var obj = RTTI.CreateObjectInstance(RTTI.GetTypeByName(objectType)) as StreamingStrategyInstance; obj.ReadSave(state); } }
static void Main(string[] args) { Application.SetHighDpiMode(HighDpiMode.SystemAware); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); RTTI.SetGameMode(GameType.HZD); var cmds = new CmdOptions(); var parser = new Parser(with => with.HelpWriter = Console.Error); parser.ParseArguments <CmdOptions>(args) .WithParsed(o => cmds = o) .WithNotParsed(errs => MessageBox.Show("Unable to parse command line: {0}", String.Join(" ", args))); Application.Run(new UI.FormCoreView(cmds)); }
public void Deserialize(BinaryReader reader) { uint itemCount = reader.ReadUInt32(); if (itemCount > reader.StreamRemainder()) { throw new Exception("HashSet item count is out of bounds"); } for (uint i = 0; i < itemCount; i++) { uint entryHash = reader.ReadUInt32(); var newObj = RTTI.DeserializeType <T>(reader); // TODO: is entryHash actually a hash? Add(entryHash, newObj); } }
static void Main(string[] args) { var cmds = new CmdOptions(); var parser = new Parser(with => with.HelpWriter = Console.Error); parser.ParseArguments <CmdOptions>(args) .WithParsed(o => cmds = o) .WithNotParsed(errs => Console.WriteLine("Unable to parse command line: {0}", String.Join(" ", args))); RTTI.SetGameMode(GameType.HZD); var ex = new Extractor() { OutputDir = cmds.OutputFolder }; ex.Extract(cmds); }
public static bool EqualsIgnoreId(RTTIRefObject a, RTTIRefObject b) { if (ReferenceEquals(a, b)) { return(true); } if (((object)a == null) || ((object)b == null)) { return(false); } var oldIdA = a.ObjectUUID; var oldIdB = b.ObjectUUID; try { a.ObjectUUID = Guid.Empty; b.ObjectUUID = Guid.Empty; using var msA = new MemoryStream(); using var bwA = new BinaryWriter(msA); RTTI.SerializeType(bwA, a); using var msB = new MemoryStream(); using var bwB = new BinaryWriter(msB); RTTI.SerializeType(bwB, b); msA.TryGetBuffer(out var bytesA); msB.TryGetBuffer(out var bytesB); return(((ReadOnlySpan <byte>)bytesA).SequenceEqual((ReadOnlySpan <byte>)bytesB)); } finally { a.ObjectUUID = oldIdA; b.ObjectUUID = oldIdB; } }
public void ReadSaveSystem(SaveGameSystem system) { SaveState state = system.State; system.GlobalGameSettings = RTTI.CreateObjectInstance <GameSettings>(); system.GlobalWorldState = RTTI.CreateObjectInstance <WorldState>(); system.GlobalMapZoneManager = RTTI.CreateObjectInstance <MapZoneManager>(); system.GlobalPickUpDatabaseGame = RTTI.CreateObjectInstance <PickUpDatabaseGame>(); system.GlobalQuestSystem = RTTI.CreateObjectInstance <QuestSystem>(); system.GlobalCountdownTimerManager = RTTI.CreateObjectInstance <CountdownTimerManager>(); system.GlobalWorldEncounterManager = RTTI.CreateObjectInstance <WorldEncounterManager>(); system.GlobalEntityManagerGame = RTTI.CreateObjectInstance <EntityManagerGame>(); system.GlobalMenuBadgeManager = RTTI.CreateObjectInstance <MenuBadgeManager>(); system.GlobalCollectableManager = RTTI.CreateObjectInstance <CollectableManager>(); system.GlobalPlayerGame = RTTI.CreateObjectInstance <PlayerGame>(); system.GlobalLocationMarkerManager = RTTI.CreateObjectInstance <LocationMarkerManager>(); system.GlobalExplorationSystem = RTTI.CreateObjectInstance <ExplorationSystem>(); system.GlobalBuddyManager = RTTI.CreateObjectInstance <BuddyManager>(); system.GlobalWeatherSystem = RTTI.CreateObjectInstance <WeatherSystem>(); // GMNB string unknownGUID = state.ReadIndexedString();// Possibly session GUID if (state.SaveVersion < 28) { _ = state.Reader.ReadBytesStrict(8); _ = state.Reader.ReadBytesStrict(4); } // Version check due to slow motion bug that was patched? if (state.SaveVersion < 28) { ulong oldGameTickCounter = state.Reader.ReadUInt64(); } else { ulong gameTickCounter = state.Reader.ReadUInt64(); } uint unknown1 = state.Reader.ReadUInt32(); uint unknown2 = state.Reader.ReadUInt32(); if (state.SaveVersion < 28) { ulong unknownOldTickCounter = state.Reader.ReadUInt64(); } else { ulong unknownTickCounter = state.Reader.ReadUInt64(); } system.GlobalGameSettings.ReadSave(state); if (state.SaveVersion >= 22) { int difficulty = state.ReadVariableLengthInt(); // NOTE: difficulty is adjusted (+/- 1) if version is greater than 23 // NOTE: -1 = skipped, otherwise applied to gPlayerProfile->PlayerParams[0].Difficulty } system.GlobalWorldState.ReadSave(state); system.GlobalMapZoneManager.ReadSave(state); system.GlobalPickUpDatabaseGame.ReadSave(state); system.GlobalQuestSystem.DeserializeStateObject(state); system.GlobalCountdownTimerManager.DeserializeStateObject(state); system.GlobalWorldEncounterManager.DeserializeStateObject(state); system.GlobalEntityManagerGame.ReadSave(state); system.GlobalMenuBadgeManager.DeserializeStateObject(state); system.GlobalCollectableManager.ReadSave(state); system.GlobalPlayerGame.ReadSave(state); system.GlobalLocationMarkerManager.ReadSave(state); system.GlobalExplorationSystem.ReadSave(state); system.GlobalBuddyManager.ReadSave(state); system.GlobalWeatherSystem.ReadSave(state); // Unknown structure if (state.SaveVersion >= 25) { int count = state.Reader.ReadInt32(); for (int i = 0; i < count; i++) { var guid = state.ReadIndexedGUID(); int unknown = state.Reader.ReadInt32(); } } }