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);
                }
            }
        }
示例#2
0
        public void Serialize(BinaryWriter writer)
        {
            writer.Write((uint)Count);

            foreach (var element in this)
            {
                RTTI.SerializeType(writer, element);
            }
        }
示例#3
0
        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);
            }
        }
示例#5
0
        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);
            }
        }
示例#7
0
        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);
        }
示例#8
0
        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;
            }
        }
示例#9
0
        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();
                }
            }
        }