Example #1
0
        public override void Load()
        {
            Logger.LogInstance = Log;
            var useDevMsg   = Config.Bind(new ConfigDefinition("Logging", "UseLog"), false, new ConfigDescription("Using Log Message for Debug?"));
            var useLiveEdit = Config.Bind(new ConfigDefinition("Developer", "UseLiveEdit"), false, new ConfigDescription("Using Live Edit?"));

            Logger.UsingLog = useDevMsg.Value;
            PartialDataManager.CanLiveEdit = useLiveEdit.Value;

            if (!DataBlockTypeManager.Initialize())
            {
                Logger.Error("Unable to Initialize DataBlockTypeCache");
                return;
            }
            if (!PartialDataManager.Initialize())
            {
                Logger.Error("Unable to Initialize PartialData");
                return;
            }

            PersistentIDManager.DumpToFile(Path.Combine(PartialDataManager.PartialDataPath, "_persistentID.json"));
            AssetShardManager.add_OnStartupAssetsLoaded((Il2CppSystem.Action)OnAssetLoaded);

            var harmony = new Harmony("MTFO.pBlock.Harmony");

            harmony.PatchAll();
        }
        private static void Read(JsonElement objNode, bool assignID, string debugName)
        {
            if (!objNode.TryGetProperty("persistentID", out var idNode))
            {
                Logger.Error($"persistentID field is missing: {debugName}");
                return;
            }

            if (!objNode.TryGetProperty("datablock", out var dbNode))
            {
                Logger.Error($"datablock field is missing: {debugName}");
                return;
            }

            if (assignID)
            {
                if (idNode.ValueKind == JsonValueKind.String)
                {
                    if (!DataBlockTypeManager.TryGetNextID(dbNode.GetString(), out var id))
                    {
                        Logger.Error($"datablock field is not valid: {debugName} {objNode}");
                        return;
                    }
                    PersistentIDManager.TryAssignId(idNode.GetString(), id);
                }
            }

            var datablockName = DataBlockTypeManager.GetBlockName(dbNode.GetString());

            if (!DataBlockTypeManager.TryFindCache(datablockName, out var cache))
            {
                Logger.Error($"datablock field is not valid: {debugName} {objNode}");
                return;
            }

            PartialDataCache partialDataCache = _DataCache.FirstOrDefault(x => x.Name.Equals(datablockName));

            if (partialDataCache == null)
            {
                partialDataCache = new PartialDataCache(cache);
                _DataCache.Add(partialDataCache);
            }

            partialDataCache.JsonsToRead.Enqueue(objNode.ToString());
        }
        private static void ReadAndAssignIDs()
        {
            foreach (var def in _Config)
            {
                DataBlockTypeManager.SetIDBuffer(def.TypeName, def.StartFromID, def.IncrementMode);
            }

            var files = Directory.GetFiles(PartialDataPath, "*.json", SearchOption.AllDirectories).OrderBy(f => f);

            foreach (var file in files)
            {
                if (Path.GetFileName(file).StartsWith("_"))
                {
                    Logger.Log($"{file} have discard prefix (_) excluding from loader!");
                    continue;
                }

                if (!File.Exists(file))
                {
                    Logger.Error($"File ({file}) is not exist somehow?");
                    continue;
                }

                if (_AddedFileList.Contains(file))
                {
                    Logger.Error($"File ({file}) has loaded multiple times!");
                    continue;
                }

                _AddedFileList.Add(file);

                AssignPersistentID(file);

                Logger.Log($" - {file}");
            }
        }