diff --git a/CHANGELOG.md b/CHANGELOG.md index bc284f15..48fe9667 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.1.0] - 2026-04-18 +### Added +- NuGet packaging baseline for `gregCore` with symbol package output (`.snupkg`). +- Local + GitHub Packages feed configuration and package source mapping. +- Downstream `build/gregCore.props` integration for reference-only package usage. + ## [v1.0.0.7] - 2026-04-12 ### Added - **gregUI**: Complete UI manipulation layer for UGUI (`src/UI/`). diff --git a/Releases/Acornima.dll b/Releases/Acornima.dll deleted file mode 100644 index 25dcd91e..00000000 Binary files a/Releases/Acornima.dll and /dev/null differ diff --git a/Releases/Jint.dll b/Releases/Jint.dll deleted file mode 100644 index 692ba5c6..00000000 Binary files a/Releases/Jint.dll and /dev/null differ diff --git a/Releases/Newtonsoft.Json.dll b/Releases/Newtonsoft.Json.dll deleted file mode 100644 index df5169b9..00000000 Binary files a/Releases/Newtonsoft.Json.dll and /dev/null differ diff --git a/Releases/gregCore-1.0.0.30-pre.dll b/Releases/gregCore-1.0.0.30-pre.dll deleted file mode 100644 index 580d6eb5..00000000 Binary files a/Releases/gregCore-1.0.0.30-pre.dll and /dev/null differ diff --git a/Releases/gregCore.dll b/Releases/gregCore.dll deleted file mode 100644 index 580d6eb5..00000000 Binary files a/Releases/gregCore.dll and /dev/null differ diff --git a/Templates/CustomContentPack/Content/Servers/sample-server.json b/Templates/CustomContentPack/Content/Servers/sample-server.json deleted file mode 100644 index 837848fb..00000000 --- a/Templates/CustomContentPack/Content/Servers/sample-server.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "id": "template.SampleServer", - "name": "Sample Template Server", - "rackUnits": 2, - "powerUsageWatts": 450, - "maxIOPS": 5000, - "price": 1200.0, - "tags": ["Standard", "GeneralPurpose"] -} - diff --git a/Templates/CustomContentPack/pack-manifest.json b/Templates/CustomContentPack/pack-manifest.json deleted file mode 100644 index 7b25b516..00000000 --- a/Templates/CustomContentPack/pack-manifest.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "id": "author.PackName", - "name": "Custom Content Pack Template", - "version": "1.0.0", - "author": "YourName", - "description": "Template for creating custom content packs for Data Center.", - "dependencies": ["greg.Core"] -} - diff --git a/bin/Release/net6.0/gregCore.dll b/bin/Release/net6.0/gregCore.dll index 580d6eb5..177b1d63 100644 Binary files a/bin/Release/net6.0/gregCore.dll and b/bin/Release/net6.0/gregCore.dll differ diff --git a/build/gregCore.props b/build/gregCore.props new file mode 100644 index 00000000..e1f28c0d --- /dev/null +++ b/build/gregCore.props @@ -0,0 +1,14 @@ + + + + C:\Program Files (x86)\Steam\steamapps\common\Data Center\MelonLoader + + + + + + runtime + none + + + \ No newline at end of file diff --git a/build/gregCore.targets b/build/gregCore.targets new file mode 100644 index 00000000..c1df2220 --- /dev/null +++ b/build/gregCore.targets @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/ci-stubs/create-stubs.sh b/ci-stubs/create-stubs.sh new file mode 100644 index 00000000..2a4f7c02 --- /dev/null +++ b/ci-stubs/create-stubs.sh @@ -0,0 +1,5 @@ +#!/bin/bash +# Erzeugt leere Stub-DLLs für CI-Build ohne echtes MelonLoader +# Diese enthalten nur die nötigen Type-Definitionen + +dotnet new classlib -n MelonLoaderStub -f net6.0 diff --git a/game_assembly_analysis.md b/game_assembly_analysis.md new file mode 100644 index 00000000..b3c84242 --- /dev/null +++ b/game_assembly_analysis.md @@ -0,0 +1,125 @@ +# 1) Globale Architektur & Singletons + +Analysebasis: `gregReferences/Assembly-CSharp/Il2Cpp/*.cs` (IL2CPP-Wrapper). Relevante Komponente liegt in der Schicht **Unity Spiel / IL2CPP Assembly** (nicht GregCore/Core-SDK selbst). + +- `Il2Cpp.MainGameManager` + - Singleton: `public static unsafe MainGameManager instance` + - Verantwortlich für Session-/Spielzustand, Kundenfluss, Autosave-Settings, zentrale Objekt-Referenzen. + - Wichtige Methoden: `public unsafe void SetAutoSaveInterval(float minutes)`, `public unsafe void SetAutoSaveEnabled(bool enabled)`, `public unsafe int GetFreeVlanId()`. +- `Il2Cpp.NetworkMap` + - Singleton: `public static unsafe NetworkMap instance` + - Zentrale Topologie-/Routing-Instanz für Geräte, Kabel, Verbindungen. +- `Il2Cpp.PlayerManager` + - Singleton: `public static unsafe PlayerManager instance` + - Input-/Movement-Gating und Interaktionszustand (Objekt in Hand, Interaktionsflags). +- `Il2Cpp.TimeController` + - Singleton-ähnliche globale Zeitinstanz mit statischem Callback `public static unsafe TimeController.OnEndOfTheDay onEndOfTheDayCallback`. +- `Il2Cpp.SaveData` + - Globaler Save-State: `public static unsafe SaveData instance` + `public static unsafe SaveData _current`. +- `Il2Cpp.SaveSystem` + - Statischer Save/Load-Orchestrator (kein klassischer Singleton, aber globaler Entry-Point über statische API). + +# 2) Spieler & Entities (Data Structures) + +Hauptobjekte mit C-ABI-relevanten Datentypen (für stabile Bridge-Übergabe bevorzugt: primitive numerische Typen + explizite Structs). + +- `Il2Cpp.Player` + - Ökonomie-/Progress-Felder: `money` (`float`), `xp` (`float`), `reputation` (`float`), `previousCoins` (`float`). + - Choke-Methoden: `public unsafe bool UpdateCoin(float _coinChhangeAmount, bool withoutSound = false)`, `public unsafe bool UpdateXP(float amount)`, `public unsafe void UpdateReputation(float amount)`. +- `Il2Cpp.PlayerData` (`[Serializable]`) + - Felder: `List activeObjectives`, `float coins`, `float xp`, `float reputation`, `Il2CppStructArray position`. + - Für C-ABI gut geeignet: `float`, `int`; bei `position` sauber als 3er-Array (`x,y,z`) flatten. +- `Il2Cpp.SaveData` (`[Serializable]`) + - Persistenz-Aggregat mit `playerData`, `networkData`, `loadedScenes`, `technicianData`, `repairJobQueue`, `commandCenterLevel` u. a. + - Mappings enthalten viele primitive Felder (`int`, `bool`, `float`, `string`) plus Listen/Arrays. +- `Il2Cpp.Item` (`ScriptableObject`) + - Preis-/Wertfelder: `int price`, `float weight`, `float deprecation`, `bool isStackable`, `int unlockedFromXP`. +- `Il2Cpp.ShopItemSO` (`ScriptableObject`) + - Shop-relevante Primitive: `int xpToUnlock`, `int price`, `int itemID`, `float eol`, `bool isCustomColor`. +- ECS-nahe explizite Layout-Typen (`[StructLayout(LayoutKind.Explicit)]`) + - `Il2Cpp.CableIDComponent`: `int CableId` (Offset 0), `int SwitchId` (Offset 4). + - `Il2Cpp.PacketComponent`: enthält `float3`, `float4`, `int cableId`, `int customerId`, `float moveSpeed` etc. + - Diese Typen sind für Low-Level-Hooks/Interop besonders wertvoll, da Feldlayout explizit ist. + +# 3) Native Event-Systeme + +Primär Delegate-basierte C#-Events/Callbacks in der **Unity Spiel / IL2CPP Assembly**-Schicht: + +- Save-/Load-Callbacks (`Il2Cpp.SaveSystem`) + - `public static unsafe SaveSystem.OnSavingData onSavingData` + - `public static unsafe SaveSystem.OnLoadingData onLoadingData` + - `public static unsafe SaveSystem.OnLoadingDataLater onLoadingDataLater` + - Delegates sind `MulticastDelegate`-Typen mit `Invoke()`. +- Szenen-/Load-Callback (`Il2Cpp.LoadingScreen`) + - `public static unsafe LoadingScreen.GameIsLoaded onGameIsLoadedCallback` + - `LoadingScreen.GameIsLoaded` ist `MulticastDelegate` mit `Invoke()`. +- Tageszyklus-Callback (`Il2Cpp.TimeController`) + - `public static unsafe TimeController.OnEndOfTheDay onEndOfTheDayCallback` + - Delegate `OnEndOfTheDay.Invoke()` als stabiler Lifecycle-Hook. +- Pause-Menü-Callbacks (`Il2Cpp.PauseMenu`) + - `public static unsafe PauseMenu.OnPauseMenuOpen onPauseMenuOpenCallback` + - `public static unsafe PauseMenu.OnPauseMenuClose onPauseMenuCloseCallback` +- Input-Rebind-Events (`Il2Cpp.InputManager`) + - `public static unsafe void add_rebindComplete(Il2CppSystem.Action value)` / `remove_rebindComplete(...)` + - `add_rebindCanceled(...)` / `remove_rebindCanceled(...)` + - `add_rebindStarted(Il2CppSystem.Action value)` / `remove_rebindStarted(...)` + +# 4) Kritische Hook-Ziele (Harmony Patch Candidates) + +Kernziel: Choke-Points patchen (Prefix/Postfix), nicht breit `Update()`-spammen. + +- Save/Load (höchste Priorität) + - `Il2Cpp.SaveSystem.SaveGame(string savename = null, string stringNameOfSave = null)` + - `Il2Cpp.SaveSystem.LoadGame(string savename)` + - `Il2Cpp.SaveSystem.Load(string savename, bool isFromPauseMenu)` + - `Il2Cpp.SaveSystem.AutoSave()` + - `Il2Cpp.SaveSystem.SaveGameData()` / `LoadGameData()` +- Economy/Progress + - `Il2Cpp.Player.UpdateCoin(float _coinChhangeAmount, bool withoutSound = false)` + - `Il2Cpp.Player.UpdateXP(float amount)` + - `Il2Cpp.Player.UpdateReputation(float amount)` + - Shop-Zahlungspfad: `Il2Cpp.ComputerShop.ButtonCheckOut()`, `UpdateCartTotal()`, `BuyNewItem(...)`, `BuyAnotherItem(...)`. +- Netzwerk-/Topologie + - `Il2Cpp.NetworkMap.AddDevice(string name, CableLink.TypeOfLink type, int customerID = -1)` + - `Il2Cpp.NetworkMap.RemoveDevice(string name)` + - `Il2Cpp.NetworkMap.Connect(string from, string to)` / `Disconnect(string from, string to)` + - `Il2Cpp.NetworkMap.RegisterCableConnection(...)` / `RemoveCableConnection(int cableId, bool preserveLACP = false)` + - Validierung: `Il2Cpp.NetworkMap.IsIpAddressDuplicate(string ip, Server serverToExclude)` +- Geräte-/Serverzustand + - `Il2Cpp.Server.PowerButton(bool forceState = false)` + - `Il2Cpp.Server.SetIP(string _ip)` + - `Il2Cpp.Server.UpdateCustomer(int newCustomerID)` + - `Il2Cpp.Server.UpdateAppID(int _appID)` + - `Il2Cpp.Server.ItIsBroken()` / `RepairDevice()` + +# 5) UI & Szenen-Management + +UI-/Scene-Flows mit hoher Relevanz für kontrollierte Mod-Intervention: + +- Main Menu (`Il2Cpp.MainMenu`) + - `Continue()`, `NewGame()`, `LoadGame()`, `Settings()`, `QuitGame()`. +- Pause Flow (`Il2Cpp.PauseMenu`) + - `Pause(int openMenu)`, `Resume()`, `Save(string saveName = null, string _stringNameOfSave = null)`, `Load(string savename)`. + - Gute Hook-Stellen für mod-seitige Gatekeeper/Overlay-Interlocks. +- Loading/Scenes (`Il2Cpp.LoadingScreen`) + - `LoadGameScenesVoid(...)`, `LoadLevel(int sceneIndex)`, `UnLoadLevel(int sceneIndex)` + - `AsynchronousLoad(int sceneIndex)`, `AsynchronousUnLoad(int sceneIndex)`, `IsSceneLoaded(string name)` + - `onGameIsLoadedCallback` als zuverlässiger End-of-Load Synchronisationspunkt. +- Shop-/Asset-UI + - `Il2Cpp.ComputerShop`: Kauf- und Warenkorb-UI-Endpunkte. + - `Il2Cpp.AssetManagement`: Asset-Filter/Repair-UI-Workflows (relevant für automatische Tasking-Mods). + +# 6) Obfuscation & Auffälligkeiten + +- Obfuscation-Marker vorhanden + - `Il2Cpp.ObjectPrivateAbstractSealedInVo0` trägt `[ObfuscatedName("$BurstDirectCallInitializer")]`. + - Deutet auf generierte/Burst-nahe Initialisierer hin (kein klassischer Gameplay-Entry-Point). +- IL2CPP-/Interop-Spezifika + - Weit verbreitete `unsafe` Wrapper, `NativeFieldInfoPtr_*`, `NativeMethodInfoPtr_*`, `il2cpp_runtime_invoke`. + - Für Harmony-Patching sind semantische High-Level-Methoden stabiler als intern generierte Helper. +- Explizite Layouts als technische Auffälligkeit + - `[StructLayout(LayoutKind.Explicit)]` in u. a. `CableIDComponent`, `PacketComponent`, `_PrivateImplementationDetails_`. + - Wichtig für deterministische Feld-Offsets bei nativer Bridge/ABI. +- Anti-Cheat-Indikatoren (Textscan) + - Kein direkter String-/Symboltreffer auf typische Marker wie `EasyAntiCheat`, `BattlEye`, `VAC`, `GameGuard`, `AntiCheat` im gescannten Dump. + - Das ist **kein** kryptografischer Nachweis „anti-cheat-frei“, aber im vorliegenden C#-Dump gibt es keine offensichtlichen API-Hooks darauf. diff --git a/gregCore.csproj b/gregCore.csproj index 75ea809c..5742ec9c 100644 --- a/gregCore.csproj +++ b/gregCore.csproj @@ -1,16 +1,94 @@ + + net6.0 - gregCore - 1.0.0.30-pre + enable + true + latest x64 + gregCore CS1701;CS1702 - true + + + gregCore + 0.1.0 + 0.1.0.0 + 0.1.0.0 + mleem97 + mleem97 + gregCore + + Framework SDK for Data Center (Unity 6 IL2CPP) MelonLoader mods. + Provides GregHookBus, Services, Registries and Harmony-safe patch + infrastructure. Reference-only package — runtime DLL ships separately + via MelonLoader Mods folder. + + melonloader;unity;il2cpp;modding;datacenter;gregcore + https://github.com/mleem97/gregCore + https://github.com/mleem97/gregCore + git + + + MIT + + + icon.png + README.md + + + true + snupkg + true + + + false + false + false + + + true + true + + + ../../nupkgs - + + + + $(MELON_PATH)\MelonLoader.dll + false + + + $(MELON_PATH)\0Harmony.dll + false + + + $(MELON_PATH)\Il2CppAssemblies\Il2CppInterop.Runtime.dll + false + + + $(MELON_PATH)\Il2CppAssemblies\Assembly-CSharp.dll + false + + + $(MELON_PATH)\Il2CppAssemblies\UnityEngine.CoreModule.dll + false + + + + + + + + + + + + @@ -20,4 +98,4 @@ - + \ No newline at end of file diff --git a/gregCore.sln b/gregCore.sln index f8796b56..77b1e5e2 100644 --- a/gregCore.sln +++ b/gregCore.sln @@ -7,7 +7,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "gregCore", "gregCore.csproj EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "gregFramework", "gregFramework", "{9A0CCAB9-4303-13B4-2371-F1B97FF5B728}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "gregCore.Tests", "gregTests\gregCore.Tests.csproj", "{FAF3FBA7-1865-41EF-BA90-215D9E7BF597}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "gregCore.Tests", "tests\gregCore.Tests.csproj", "{FAF3FBA7-1865-41EF-BA90-215D9E7BF597}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/gregMain.cs b/gregMain.cs deleted file mode 100644 index 1e1363c0..00000000 --- a/gregMain.cs +++ /dev/null @@ -1,862 +0,0 @@ -using Il2CppInterop.Runtime.InteropTypes.Arrays; -using MelonLoader; -using MelonLoader.Utils; -using System; -using System.Collections.Generic; -using System.IO; -using System.Reflection; -using UnityEngine; -using UnityEngine.InputSystem; -using UnityEngine.SceneManagement; -using greg.Diagnostic; -using greg.Core; - - -// Namespace gregAssetExporter muss zu deiner AssemblyInfo passen -[assembly: MelonInfo(typeof(gregAssetExporter.gregMain), "gregCore Framework", greg.Core.gregReleaseVersion.Current, "MLeeM97, Joniii11 (teamGreg)")] -[assembly: MelonGame("Waseku", "Data Center")] - -namespace gregAssetExporter -{ - public class gregMain : MelonMod - { - private string exportPath = string.Empty; - private bool exportBetaNotUsed = true; - private bool showDebugOverlay = true; - - private readonly greg.Exporter.Il2CppEventCatalogService eventCatalogService = new greg.Exporter.Il2CppEventCatalogService(); - private readonly greg.Exporter.Il2CppGameplayIndexService gameplayIndexService = new greg.Exporter.Il2CppGameplayIndexService(); - private readonly greg.Exporter.RuntimeHookService runtimeHookService = new greg.Exporter.RuntimeHookService(); - private readonly greg.Exporter.GameSignalSnapshotService gameSignalSnapshotService = new greg.Exporter.GameSignalSnapshotService(); - - private Texture2D debugOverlayBackgroundTexture; - private int debugHooksAvailable; - private int debugHookEventsAvailable; - private int debugNotYetImplemented; - private bool debugOverlayStatsInitialized; - - public override void OnInitializeMelon() - { - // --- gregCore Diagnostic & Session Logging --- - greg.Core.Diagnostic.GregSessionLogger.Initialize(); - greg.Core.Diagnostic.GregSessionLogger.Log("Initializing gregCore Framework..."); - - // --- gregCore Framework Internal Initialization --- - greg.Sdk.Services.GregSaveService.Init(); - greg.Sdk.Services.GregUiService.SetGlobalScale(0.85f); // Use user-preferred 0.85x by default - greg.Sdk.Services.GregHudService.Initialize(); - greg.Sdk.Services.MCP.GregMCPServer.Start(); - - // Apply Deep-Layer Hijacker Patches - var harmony = new HarmonyLib.Harmony("greg.core.hijacker"); - harmony.PatchAll(typeof(greg.Sdk.Internal.GregUiHijacker).Assembly); - - // --- Legacy Exporter Initialization --- - exportPath = Path.Combine(MelonEnvironment.ModsDirectory, "ExportedAssets"); - if (!Directory.Exists(exportPath)) Directory.CreateDirectory(exportPath); - - MelonLogger.Msg($"gregCore Framework v{greg.Core.gregReleaseVersion.Current} loaded (SDK-only build)."); - MelonLogger.Msg("Want to help building the future of Modding in DataCenter? Join our Discord: discord.gg/greg"); - MelonLogger.Msg($"gregCore provides {greg.Sdk.Services.GregModRegistry.GetLoadedMods().Count} registered mods."); - greg.Exporter.ModFramework.Events.Publish(new greg.Exporter.ModInitializedEvent(DateTime.UtcNow, greg.Core.gregReleaseVersion.Current)); - } - - public override void OnSceneWasLoaded(int buildIndex, string sceneName) - { - MelonLogger.Msg($"[gregCore] Scene Loaded: {sceneName}. Triggering data export..."); - greg.Core.Exporter.DataExporter.RunFullExport(); - - if (sceneName == "MainMenu") - { - greg.Core.UI.UIRouter.SetMode(greg.Core.UI.UIMode.MainMenu); - } - } - - public override void OnApplicationQuit() - { - greg.Sdk.Services.MCP.GregMCPServer.Stop(); - } - - public override void OnUpdate() - { - greg.Exporter.ModFramework.Events.Publish(new greg.Exporter.ModTickEvent(Time.deltaTime, Time.frameCount)); - - // Central Input Management - greg.Sdk.Services.GregInputManagerService.Update(); - - if (Keyboard.current != null && Keyboard.current.f1Key.wasPressedThisFrame) - { - greg.Core.UI.gregModConfigManager.Toggle(!greg.Core.UI.gregModConfigManager.IsOpen); - } - -#if DEBUG - if (Keyboard.current != null && Keyboard.current.f5Key.wasPressedThisFrame) - { - showDebugOverlay = !showDebugOverlay; - } - - if (!showDebugOverlay) return; - - if (Keyboard.current != null && Keyboard.current.ctrlKey.isPressed && Keyboard.current.f8Key.wasPressedThisFrame) - { - ExportAllResources(); - } - - if (Keyboard.current != null && Keyboard.current.f6Key.wasPressedThisFrame) - { - RefreshDebugOverlayStats(forceHookScan: true); - } - - if (Keyboard.current != null && Keyboard.current.f11Key.wasPressedThisFrame) - { - ExportIl2CppEventCatalog(); - } - - if (Keyboard.current != null && Keyboard.current.f12Key.wasPressedThisFrame) - { - InstallRuntimeHooks(); - } - - if (showDebugOverlay) - { - if (!debugOverlayStatsInitialized) - RefreshDebugOverlayStats(forceHookScan: true); - - var entries = new List - { - new greg.Sdk.Services.GregMetadataEntry("HOOKS", debugHooksAvailable.ToString("D5"), new Color(0.38f, 0.96f, 0.85f)), - new greg.Sdk.Services.GregMetadataEntry("EVENTS", debugHookEventsAvailable.ToString("D5"), new Color(0.38f, 0.96f, 0.85f)), - new greg.Sdk.Services.GregMetadataEntry("MISSING", debugNotYetImplemented.ToString("D5"), Color.red), - new greg.Sdk.Services.GregMetadataEntry("SCENES", UnityEngine.SceneManagement.SceneManager.sceneCount.ToString(), Color.white), - new greg.Sdk.Services.GregMetadataEntry("FPS", (1f / Time.unscaledDeltaTime).ToString("F0"), Color.yellow) - }; - - greg.Sdk.Services.GregHudService.UpdateJadeBox( - "GREG_CORE", - $"v{greg.Core.gregReleaseVersion.Current} | DBG_MODE", - entries - ); - } - else - { - greg.Sdk.Services.GregHudService.HideJadeBox(); - } -#endif - } - -#if DEBUG - // OnGUI removed in favor of GregHudService (Premium UI) -#endif - - private void EnsureDebugOverlayAssets() - { - if (debugOverlayBackgroundTexture == null) - { - debugOverlayBackgroundTexture = new Texture2D(1, 1, TextureFormat.RGBA32, false); - debugOverlayBackgroundTexture.SetPixel(0, 0, new Color(0.02f, 0.04f, 0.08f, 0.85f)); - debugOverlayBackgroundTexture.Apply(); - } - } - - private void RefreshDebugOverlayStats(bool forceHookScan) - { - try - { - if (forceHookScan || !debugOverlayStatsInitialized) - { - var hookScanResult = runtimeHookService.ScanCandidates(100000); - debugHooksAvailable = hookScanResult.Candidates.Count; - } - - int eventCount = 0; - var eventFields = typeof(EventIds).GetFields(BindingFlags.Public | BindingFlags.Static); - for (int index = 0; index < eventFields.Length; index++) - { - FieldInfo field = eventFields[index]; - if (field.IsLiteral && field.FieldType == typeof(uint)) - eventCount++; - } - - debugHookEventsAvailable = eventCount; - debugNotYetImplemented = Math.Max(0, debugHooksAvailable - debugHookEventsAvailable); - debugOverlayStatsInitialized = true; - } - catch (Exception ex) - { - MelonLogger.Warning($"Debug overlay stats update failed: {ex.Message}"); - } - } - - - private void ExportAllGameSignalsOnStartup() - { - try - { - string diagnosticsPath = Path.Combine(exportPath, "Diagnostics"); - string snapshotPath = gameSignalSnapshotService.ExportAll(diagnosticsPath, eventCatalogService, gameplayIndexService, runtimeHookService); - MelonLogger.Msg($"Startup-Snapshot erstellt: {snapshotPath}"); - } - catch (Exception ex) - { - MelonLogger.Error($"Startup-Snapshot fehlgeschlagen: {ex.Message}"); - greg.Exporter.ModFramework.Events.Publish(new greg.Exporter.ModErrorEvent(DateTime.UtcNow, "StartupSnapshot", ex.Message)); - } - } - - private void ExportIl2CppEventCatalog() - { - try - { - string diagnosticsPath = Path.Combine(exportPath, "Diagnostics"); - string filePath = eventCatalogService.ExportCatalog(diagnosticsPath); - int linesCount = File.ReadAllLines(filePath).Length; - string gameplayIndex = gameplayIndexService.ExportGameplayIndex(diagnosticsPath); - - MelonLogger.Msg($"IL2CPP Event-Katalog exportiert: {filePath}"); - MelonLogger.Msg($"IL2CPP Gameplay-Index exportiert: {gameplayIndex}"); - greg.Exporter.ModFramework.Events.Publish(new greg.Exporter.Il2CppCatalogExportedEvent(DateTime.UtcNow, filePath, linesCount)); - greg.Exporter.ModFramework.Events.Publish(new greg.Exporter.Il2CppGameplayIndexExportedEvent(DateTime.UtcNow, gameplayIndex)); - } - catch (Exception ex) - { - MelonLogger.Error($"Fehler beim Export des IL2CPP Event-Katalogs: {ex.Message}"); - greg.Exporter.ModFramework.Events.Publish(new greg.Exporter.ModErrorEvent(DateTime.UtcNow, "Il2CppCatalog", ex.Message)); - } - } - - private void InstallRuntimeHooks() - { - InstallRuntimeHooks(250); - } - - private void InstallRuntimeHooks(int maxHooks) - { - try - { - var result = runtimeHookService.ScanAndInstall(maxHooks); - MelonLogger.Msg($"Hook-Scan abgeschlossen. Kandidaten={result.Scanned}, installiert={result.Installed}, fehlgeschlagen={result.Failed}"); - - if (result.Errors.Count > 0) - { - string diagnosticsPath = Path.Combine(exportPath, "Diagnostics"); - Directory.CreateDirectory(diagnosticsPath); - string errorFile = Path.Combine(diagnosticsPath, "hook-install-errors.txt"); - File.WriteAllLines(errorFile, result.Errors); - MelonLogger.Warning($"Hook-Fehlerliste geschrieben: {errorFile}"); - } - } - catch (Exception ex) - { - MelonLogger.Error($"Fehler beim Installieren der Runtime-Hooks: {ex.Message}"); - greg.Exporter.ModFramework.Events.Publish(new greg.Exporter.ModErrorEvent(DateTime.UtcNow, "RuntimeHooks", ex.Message)); - } - } - - private void InstallRuntimeHooksFromCatalog(string catalogPath, int maxHooks) - { - try - { - var result = runtimeHookService.InstallFromCatalog(catalogPath, maxHooks); - MelonLogger.Msg($"Hook-Catalog verarbeitet. Datei={catalogPath} Kandidaten={result.Scanned}, installiert={result.Installed}, fehlgeschlagen={result.Failed}"); - - if (result.Errors.Count > 0) - { - string diagnosticsPath = Path.Combine(exportPath, "Diagnostics"); - Directory.CreateDirectory(diagnosticsPath); - string errorFile = Path.Combine(diagnosticsPath, "hook-install-errors.txt"); - File.WriteAllLines(errorFile, result.Errors); - MelonLogger.Warning($"Hook-Fehlerliste geschrieben: {errorFile}"); - } - } - catch (Exception ex) - { - MelonLogger.Error($"Fehler beim Installieren der Catalog-Hooks: {ex.Message}"); - greg.Exporter.ModFramework.Events.Publish(new greg.Exporter.ModErrorEvent(DateTime.UtcNow, "CatalogHooks", ex.Message)); - } - } - - private void RunAutoHookCommandIfRequested() - { - try - { - string[] args = Environment.GetCommandLineArgs(); - bool autoScan = HasArg(args, "--greg-hooks-auto"); - bool installAll = HasArg(args, "--greg-hooks-all"); - string catalogPath = GetArgValue(args, "--greg-hooks-catalog="); - - if (!autoScan && string.IsNullOrWhiteSpace(catalogPath)) - return; - - int defaultMax = installAll ? int.MaxValue : 250; - int maxHooks = GetIntArgValue(args, "--greg-hooks-max=", defaultMax); - - if (!string.IsNullOrWhiteSpace(catalogPath)) - { - MelonLogger.Msg($"AutoHook-Command erkannt (catalog). maxHooks={maxHooks}"); - InstallRuntimeHooksFromCatalog(catalogPath, maxHooks); - return; - } - - MelonLogger.Msg($"AutoHook-Command erkannt (scan). maxHooks={maxHooks}"); - InstallRuntimeHooks(maxHooks); - } - catch (Exception ex) - { - MelonLogger.Warning($"AutoHook-Command konnte nicht ausgeführt werden: {ex.Message}"); - } - } - - private static bool HasArg(IEnumerable args, string name) - { - foreach (string arg in args) - { - if (string.Equals(arg, name, StringComparison.OrdinalIgnoreCase)) - return true; - } - - return false; - } - - private static string GetArgValue(IEnumerable args, string prefix) - { - foreach (string arg in args) - { - if (!arg.StartsWith(prefix, StringComparison.OrdinalIgnoreCase)) - continue; - - return arg.Substring(prefix.Length).Trim('"'); - } - - return string.Empty; - } - - private static int GetIntArgValue(IEnumerable args, string prefix, int fallback) - { - string raw = GetArgValue(args, prefix); - if (string.IsNullOrWhiteSpace(raw)) - return fallback; - - return int.TryParse(raw, out int parsed) && parsed > 0 ? parsed : fallback; - } - - private static void OnHookTriggered(greg.Exporter.HookTriggeredEvent evt) - { - if (evt.TriggerCount <= 3 || evt.TriggerCount % 100 == 0) - { - MelonLogger.Msg($"Hook Trigger: {evt.MethodName} (count={evt.TriggerCount})"); - } - } - - private void ExportAllResources() - { - greg.Exporter.ModFramework.Events.Publish(new greg.Exporter.ExportStartedEvent(DateTime.UtcNow, exportPath)); - - string currentGamePath = Path.Combine(exportPath, "CurrentGame"); - string modelsPath = Path.Combine(currentGamePath, "Models"); - string texturesPath = Path.Combine(currentGamePath, "Textures"); - string spritesPath = Path.Combine(currentGamePath, "Sprites"); - string materialsPath = Path.Combine(currentGamePath, "Materials"); - string scriptsPath = Path.Combine(currentGamePath, "Scripts"); - string settingsPath = Path.Combine(currentGamePath, "Settings"); - string notUsedPath = Path.Combine(currentGamePath, "NotUsed"); - string notUsedModelsPath = Path.Combine(notUsedPath, "Models"); - string notUsedTexturesPath = Path.Combine(notUsedPath, "Textures"); - - Directory.CreateDirectory(currentGamePath); - Directory.CreateDirectory(modelsPath); - Directory.CreateDirectory(texturesPath); - Directory.CreateDirectory(spritesPath); - Directory.CreateDirectory(materialsPath); - Directory.CreateDirectory(scriptsPath); - Directory.CreateDirectory(settingsPath); - if (exportBetaNotUsed) - { - Directory.CreateDirectory(notUsedPath); - Directory.CreateDirectory(notUsedModelsPath); - Directory.CreateDirectory(notUsedTexturesPath); - } - - File.WriteAllText( - Path.Combine(currentGamePath, "README_NOT_USED.txt"), - "Dieser Ordner enthält verwendete Assets aus dem aktuellen Spielstand (aktiv + inaktiv).\n" + - "Struktur: Models, Textures, Sprites, Materials, Scripts, Settings.\n" + - "Optional werden nicht verwendete, aber geladene Assets nach 'NotUsed/Models' und 'NotUsed/Textures' exportiert." - ); - - MelonLogger.Msg("Starte Export: verwendete Assets (aktiv + inaktiv) aus allen geladenen Szenen..."); - - HashSet usedMeshIds = new HashSet(); - HashSet usedTextureIds = new HashSet(); - HashSet usedSpriteTextureIds = new HashSet(); - HashSet exportedCurrentGame = new HashSet(); - HashSet exportedScriptTypes = new HashSet(); - HashSet exportedMaterials = new HashSet(); - List settingLines = new List(); - List materialInfoLines = new List(); - - foreach (GameObject obj in EnumerateAllSceneObjects(includeInactive: true)) - { - try - { - settingLines.Add($"{GetGameObjectPath(obj)} | activeSelf={obj.activeSelf} | activeInHierarchy={obj.activeInHierarchy} | layer={obj.layer} | tag={obj.tag} | scene={obj.scene.name}"); - - Component[] components = GetComponentsSafe(obj); - for (int componentIndex = 0; componentIndex < components.Length; componentIndex++) - { - Component component = components[componentIndex]; - if (component == null) continue; - string typeName = component.GetType().FullName; - if (!string.IsNullOrWhiteSpace(typeName)) - exportedScriptTypes.Add(typeName); - } - - MeshFilter meshFilter = obj.GetComponent(); - if (meshFilter != null && meshFilter.sharedMesh != null) - { - usedMeshIds.Add(meshFilter.sharedMesh.GetInstanceID()); - if (TryRegister(exportedCurrentGame, $"mesh:{meshFilter.sharedMesh.name}")) - SaveMesh(meshFilter.sharedMesh, modelsPath); - } - - SkinnedMeshRenderer skinnedMeshRenderer = obj.GetComponent(); - if (skinnedMeshRenderer != null && skinnedMeshRenderer.sharedMesh != null) - { - usedMeshIds.Add(skinnedMeshRenderer.sharedMesh.GetInstanceID()); - if (TryRegister(exportedCurrentGame, $"mesh:{skinnedMeshRenderer.sharedMesh.name}")) - SaveMesh(skinnedMeshRenderer.sharedMesh, modelsPath); - } - - Renderer renderer = obj.GetComponent(); - if (renderer != null) - { - Material[] materials = renderer.sharedMaterials; - for (int materialIndex = 0; materialIndex < materials.Length; materialIndex++) - { - Material material = materials[materialIndex]; - if (material == null) continue; - - if (TryRegister(exportedMaterials, $"mat:{material.name}")) - { - materialInfoLines.Add($"material={material.name} | shader={material.shader?.name ?? "null"} | object={GetGameObjectPath(obj)}"); - } - - string[] texturePropertyNames = material.GetTexturePropertyNames(); - for (int texturePropertyIndex = 0; texturePropertyIndex < texturePropertyNames.Length; texturePropertyIndex++) - { - string propertyName = texturePropertyNames[texturePropertyIndex]; - Texture texture = material.GetTexture(propertyName); - if (texture is Texture2D tex2D) - { - usedTextureIds.Add(tex2D.GetInstanceID()); - materialInfoLines.Add($"material={material.name} | texProp={propertyName} | texture={tex2D.name}"); - if (TryRegister(exportedCurrentGame, $"tex:{tex2D.name}")) - SaveTexture(tex2D, texturesPath); - } - } - } - } - - Component uiImage = obj.GetComponent("Image"); - if (uiImage != null) - { - PropertyInfo spriteProperty = uiImage.GetType().GetProperty("sprite"); - Sprite sprite = spriteProperty?.GetValue(uiImage) as Sprite; - if (sprite != null && sprite.texture != null) - { - usedTextureIds.Add(sprite.texture.GetInstanceID()); - usedSpriteTextureIds.Add(sprite.texture.GetInstanceID()); - if (TryRegister(exportedCurrentGame, $"tex:{sprite.texture.name}")) - SaveTexture(sprite.texture, spritesPath); - } - } - } - catch (Exception ex) - { - MelonLogger.Warning($"Export-Fehler bei Objekt '{obj.name}': {ex.Message}"); - greg.Exporter.ModFramework.Events.Publish(new greg.Exporter.ModErrorEvent(DateTime.UtcNow, "ExportObject", ex.Message)); - } - } - - File.WriteAllLines(Path.Combine(scriptsPath, "components.txt"), exportedScriptTypes); - File.WriteAllLines(Path.Combine(settingsPath, "objects.txt"), settingLines); - File.WriteAllLines(Path.Combine(materialsPath, "materials.txt"), materialInfoLines); - - int notUsedMeshCount = 0; - int notUsedTextureCount = 0; - - if (exportBetaNotUsed) - { - MelonLogger.Msg("Starte Beta-Export: nicht verwendete, aber geladene Assets..."); - - HashSet exportedBeta = new HashSet(); - - Mesh[] loadedMeshes = Resources.FindObjectsOfTypeAll(); - for (int meshIndex = 0; meshIndex < loadedMeshes.Length; meshIndex++) - { - Mesh mesh = loadedMeshes[meshIndex]; - if (mesh == null) continue; - if (usedMeshIds.Contains(mesh.GetInstanceID())) continue; - if (!IsCandidateNotUsedMesh(mesh)) continue; - if (!TryRegister(exportedBeta, $"mesh:{mesh.name}")) continue; - SaveMesh(mesh, notUsedModelsPath); - notUsedMeshCount++; - } - - Texture2D[] loadedTextures = Resources.FindObjectsOfTypeAll(); - for (int textureIndex = 0; textureIndex < loadedTextures.Length; textureIndex++) - { - Texture2D tex = loadedTextures[textureIndex]; - if (tex == null) continue; - if (usedTextureIds.Contains(tex.GetInstanceID())) continue; - if (!IsCandidateNotUsedTexture(tex)) continue; - if (!TryRegister(exportedBeta, $"tex:{tex.name}")) continue; - SaveTexture(tex, notUsedTexturesPath); - notUsedTextureCount++; - } - - MelonLogger.Msg($"Export abgeschlossen! Verbaute Assets: {currentGamePath} | Nicht verwendet: {notUsedPath}"); - } - else - { - MelonLogger.Msg($"Export abgeschlossen! Verbaute Assets: {currentGamePath} | NotUsed-Export deaktiviert (F10 zum Umschalten)."); - } - - var summaryLines = new List - { - $"timestamp={DateTime.Now:yyyy-MM-dd HH:mm:ss}", - $"scenesLoaded={SceneManager.sceneCount}", - $"objectsScanned={settingLines.Count}", - $"uniqueComponents={exportedScriptTypes.Count}", - $"usedMeshes={usedMeshIds.Count}", - $"usedTextures={usedTextureIds.Count}", - $"usedSpriteTextures={usedSpriteTextureIds.Count}", - $"usedMaterials={exportedMaterials.Count}", - $"notUsedEnabled={exportBetaNotUsed}", - $"notUsedMeshes={notUsedMeshCount}", - $"notUsedTextures={notUsedTextureCount}" - }; - File.WriteAllLines(Path.Combine(settingsPath, "summary.txt"), summaryLines); - greg.Exporter.ModFramework.Events.Publish(new greg.Exporter.ExportCompletedEvent(DateTime.UtcNow, currentGamePath, settingLines.Count)); - } - - private IEnumerable EnumerateAllSceneObjects(bool includeInactive) - { - for (int i = 0; i < SceneManager.sceneCount; i++) - { - Scene scene = SceneManager.GetSceneAt(i); - if (!scene.IsValid() || !scene.isLoaded) continue; - - GameObject[] roots = scene.GetRootGameObjects(); - for (int rootIndex = 0; rootIndex < roots.Length; rootIndex++) - { - GameObject root = roots[rootIndex]; - if (root == null) continue; - - Queue queue = new Queue(); - queue.Enqueue(root.transform); - - while (queue.Count > 0) - { - Transform current = queue.Dequeue(); - if (current == null || current.gameObject == null) - continue; - - GameObject currentObject = current.gameObject; - if (includeInactive || currentObject.activeInHierarchy) - yield return currentObject; - - int childCount; - try - { - childCount = current.childCount; - } - catch - { - childCount = 0; - } - - for (int childIndex = 0; childIndex < childCount; childIndex++) - { - Transform child; - try - { - child = current.GetChild(childIndex); - } - catch - { - continue; - } - - if (child != null) - queue.Enqueue(child); - } - } - } - } - } - - private void LogUiPathUnderCursor() - { - if (Mouse.current == null) - { - MelonLogger.Warning("Keine Maus verfügbar."); - greg.Exporter.ModFramework.Events.Publish(new greg.Exporter.ModErrorEvent(DateTime.UtcNow, "UIPath", "Keine Maus verfügbar")); - return; - } - - Type eventSystemType = Type.GetType("UnityEngine.EventSystems.EventSystem, UnityEngine.UI"); - Type pointerEventDataType = Type.GetType("UnityEngine.EventSystems.PointerEventData, UnityEngine.UI"); - Type raycastResultType = Type.GetType("UnityEngine.EventSystems.RaycastResult, UnityEngine.UI"); - - if (eventSystemType == null || pointerEventDataType == null || raycastResultType == null) - { - MelonLogger.Warning("UI EventSystem-Typen konnten nicht aufgelöst werden."); - greg.Exporter.ModFramework.Events.Publish(new greg.Exporter.ModErrorEvent(DateTime.UtcNow, "UIPath", "UI EventSystem-Typen konnten nicht aufgelöst werden")); - return; - } - - object currentEventSystem = eventSystemType.GetProperty("current", BindingFlags.Public | BindingFlags.Static)?.GetValue(null); - if (currentEventSystem == null) - { - MelonLogger.Warning("Kein aktives EventSystem gefunden."); - greg.Exporter.ModFramework.Events.Publish(new greg.Exporter.ModErrorEvent(DateTime.UtcNow, "UIPath", "Kein aktives EventSystem gefunden")); - return; - } - - object pointerEventData = Activator.CreateInstance(pointerEventDataType, currentEventSystem); - pointerEventDataType.GetProperty("position")?.SetValue(pointerEventData, Mouse.current.position.ReadValue()); - - Type il2CppListGeneric = Type.GetType("Il2CppSystem.Collections.Generic.List`1, Il2Cppmscorlib"); - if (il2CppListGeneric == null) - { - MelonLogger.Warning("Il2Cpp-Liste für UI-Raycasts konnte nicht aufgelöst werden."); - greg.Exporter.ModFramework.Events.Publish(new greg.Exporter.ModErrorEvent(DateTime.UtcNow, "UIPath", "Il2Cpp-Liste für UI-Raycasts konnte nicht aufgelöst werden")); - return; - } - - Type listType = il2CppListGeneric.MakeGenericType(raycastResultType); - object results = Activator.CreateInstance(listType); - eventSystemType.GetMethod("RaycastAll")?.Invoke(currentEventSystem, new[] { pointerEventData, results }); - - int resultCount = (int)(listType.GetProperty("Count")?.GetValue(results) ?? 0); - - if (resultCount == 0) - { - MelonLogger.Msg("Kein UI-Element unter dem Cursor gefunden."); - return; - } - - MethodInfo getItemMethod = listType.GetMethod("get_Item"); - if (getItemMethod == null) - { - MelonLogger.Warning("Il2Cpp-Raycast-Liste konnte nicht gelesen werden."); - greg.Exporter.ModFramework.Events.Publish(new greg.Exporter.ModErrorEvent(DateTime.UtcNow, "UIPath", "Il2Cpp-Raycast-Liste konnte nicht gelesen werden")); - return; - } - - for (int i = 0; i < resultCount; i++) - { - object result = getItemMethod.Invoke(results, new object[] { i }); - GameObject gameObject = raycastResultType.GetProperty("gameObject")?.GetValue(result) as GameObject; - if (gameObject == null) continue; - - string path = gameObject.name; - Transform parent = gameObject.transform.parent; - - while (parent != null) - { - path = parent.name + "/" + path; - parent = parent.parent; - } - - MelonLogger.Msg("UI-Pfad gefunden: " + path); - } - } - - private static bool TryRegister(HashSet exportedNames, string rawName) - { - if (string.IsNullOrWhiteSpace(rawName)) return false; - if (rawName.ToLowerInvariant().Contains("unity")) return false; - return exportedNames.Add(rawName); - } - - private static string GetGameObjectPath(GameObject gameObject) - { - string path = gameObject.name; - Transform parent = gameObject.transform.parent; - while (parent != null) - { - path = parent.name + "/" + path; - parent = parent.parent; - } - return path; - } - - private static bool IsCandidateNotUsedMesh(Mesh mesh) - { - if (mesh == null) return false; - if (mesh.vertexCount <= 0) return false; - if (string.IsNullOrWhiteSpace(mesh.name)) return false; - if (mesh.hideFlags == HideFlags.HideAndDontSave) return false; - return true; - } - - private static bool IsCandidateNotUsedTexture(Texture2D tex) - { - if (tex == null) return false; - if (string.IsNullOrWhiteSpace(tex.name)) return false; - if (tex.width <= 4 && tex.height <= 4) return false; - if (tex.hideFlags == HideFlags.HideAndDontSave) return false; - return true; - } - - private void SaveTexture(Texture2D tex, string targetDirectory) - { - if (tex == null || string.IsNullOrEmpty(tex.name) || tex.name.Contains("unity")) return; - if (!Directory.Exists(targetDirectory)) Directory.CreateDirectory(targetDirectory); - - // RenderTexture Trick um Read/Write-Sperre zu umgehen - RenderTexture tmp = RenderTexture.GetTemporary(tex.width, tex.height, 0, RenderTextureFormat.Default, RenderTextureReadWrite.Linear); - Graphics.Blit(tex, tmp); - RenderTexture previous = RenderTexture.active; - RenderTexture.active = tmp; - - Texture2D readableTex = new Texture2D(tex.width, tex.height); - readableTex.ReadPixels(new Rect(0, 0, tmp.width, tmp.height), 0, 0); - readableTex.Apply(); - - RenderTexture.active = previous; - RenderTexture.ReleaseTemporary(tmp); - - byte[] bytes = ImageConversion.EncodeToPNG(readableTex); - string safeName = string.Join("_", tex.name.Split(Path.GetInvalidFileNameChars())); - string filePath = EnsureUniquePath(targetDirectory, safeName, ".png"); - File.WriteAllBytes(filePath, bytes); - - // Objekt zerstören um Speicher zu sparen während des Exports - UnityEngine.Object.Destroy(readableTex); - } - - private void SaveMesh(Mesh mesh, string targetDirectory) - { - if (mesh == null || string.IsNullOrEmpty(mesh.name) || mesh.name.Contains("unity")) return; - if (!Directory.Exists(targetDirectory)) Directory.CreateDirectory(targetDirectory); - - string safeName = string.Join("_", mesh.name.Split(Path.GetInvalidFileNameChars())); - string filePath = EnsureUniquePath(targetDirectory, safeName, ".obj"); - - System.Text.StringBuilder sb = new System.Text.StringBuilder(); - sb.Append("g ").Append(safeName).Append("\n"); - - // Nutze die expliziten Unity-Typen um Konflikte mit System.Numerics zu vermeiden - UnityEngine.Vector3[] vertices = mesh.vertices; - for (int vertexIndex = 0; vertexIndex < vertices.Length; vertexIndex++) - { - UnityEngine.Vector3 vertex = vertices[vertexIndex]; - sb.Append(string.Format("v {0} {1} {2}\n", vertex.x, vertex.y, vertex.z).Replace(",", ".")); - } - - sb.Append("\n"); - - UnityEngine.Vector3[] normals = mesh.normals; - for (int normalIndex = 0; normalIndex < normals.Length; normalIndex++) - { - UnityEngine.Vector3 normal = normals[normalIndex]; - sb.Append(string.Format("vn {0} {1} {2}\n", normal.x, normal.y, normal.z).Replace(",", ".")); - } - - sb.Append("\n"); - - UnityEngine.Vector2[] uvs = mesh.uv; - for (int uvIndex = 0; uvIndex < uvs.Length; uvIndex++) - { - UnityEngine.Vector2 uv = uvs[uvIndex]; - sb.Append(string.Format("vt {0} {1}\n", uv.x, uv.y).Replace(",", ".")); - } - - for (int i = 0; i < mesh.subMeshCount; i++) - { - int[] triangles = mesh.GetTriangles(i); - for (int j = 0; j < triangles.Length; j += 3) - { - // OBJ Format Indizes starten bei 1 - sb.Append(string.Format("f {0}/{0}/{0} {1}/{1}/{1} {2}/{2}/{2}\n", - triangles[j] + 1, triangles[j + 1] + 1, triangles[j + 2] + 1)); - } - } - - File.WriteAllText(filePath, sb.ToString()); - } - - private static string EnsureUniquePath(string directory, string baseName, string extension) - { - string filePath = Path.Combine(directory, baseName + extension); - int i = 1; - while (File.Exists(filePath)) - { - filePath = Path.Combine(directory, $"{baseName}_{i}{extension}"); - i++; - } - - return filePath; - } - - private static Component[] GetComponentsSafe(GameObject gameObject) - { - if (gameObject == null) - return Array.Empty(); - - try - { - return gameObject.GetComponents() ?? Array.Empty(); - } - catch (Exception ex) when (IsSpanInteropMethodMissing(ex)) - { - MelonLogger.Warning($"Unity6/Il2Cpp Span fallback aktiv für Objekt '{gameObject.name}'."); - } - catch - { - } - - try - { - MethodInfo getComponentsByType = typeof(GameObject).GetMethod("GetComponents", new[] { typeof(Type) }); - if (getComponentsByType == null) - return Array.Empty(); - - object raw = getComponentsByType.Invoke(gameObject, new object[] { typeof(Component) }); - if (raw is not Array rawArray) - return Array.Empty(); - - Component[] managedComponents = new Component[rawArray.Length]; - for (int index = 0; index < rawArray.Length; index++) - managedComponents[index] = rawArray.GetValue(index) as Component; - - return managedComponents; - } - catch - { - return Array.Empty(); - } - } - - private static bool IsSpanInteropMethodMissing(Exception exception) - { - Exception current = exception; - while (current != null) - { - string message = current.Message ?? string.Empty; - if (message.Contains("GetPinnableReference", StringComparison.OrdinalIgnoreCase) - && message.Contains("ReadOnlySpan", StringComparison.OrdinalIgnoreCase) - && message.Contains("Method not found", StringComparison.OrdinalIgnoreCase)) - { - return true; - } - - current = current.InnerException; - } - - return false; - } - } -} diff --git a/gregMainCi.cs b/gregMainCi.cs deleted file mode 100644 index 6227ff24..00000000 --- a/gregMainCi.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace gregAssetExporter -{ - internal static class MainCiBuildMarker - { - } -} - - diff --git a/modding_core_architecture_summary.md b/modding_core_architecture_summary.md new file mode 100644 index 00000000..f51e1504 --- /dev/null +++ b/modding_core_architecture_summary.md @@ -0,0 +1,196 @@ +# modding_core_architecture_summary + +> Zweck: Single Source of Truth für AI-/Bridge-Entwicklung (Lua, Rust, Go, Python, TS/JS) gegen gregCore. +> +> Scope: Laufzeit im Spielprozess (MelonLoader + Unity IL2CPP), inklusive FFI, IPC, Eventing und Sicherheitsgrenzen. + +## 1) Runtime Lifecycle, Bootstrap & Schichten + +### Schichtzuordnung (verbindlich) +- **Unity Spiel / IL2CPP Assembly (Game Layer):** gepatchte Spieltypen/Methoden (z. B. `Player.UpdateCoin`, `ServerPowerButton`, UI/Save-Methoden). +- **GregFramework Core SDK (Core Layer):** `src/gregModLoader/gregCore.cs`, `gregHarmonyPatches.cs`, `gregFfiBridge.cs`, `gregGameApi.cs`, `gregEventDispatcher.cs`. +- **Plugin Layer:** `src/gregModLoader/Plugins/*` (`gregPluginBase`, `gregRegistry`, Dependency-Resolver). +- **Language Bridges:** `src/Scripting/*` (`iGregLanguageBridge`, `gregLanguageBridgeHost`, Lua/JS/Rust/Go-Bridges). +- **Mod Layer:** User-Mods, native DLL-Mods (FFI), Script-Mods. + +### Haupt-Entry und Aufrufreihenfolge +- **Core-Layer Entry:** `gregCoreLoader : MelonMod` in `src/gregModLoader/gregCore.cs`. +- Relevante Lifecycle-Methoden: + - `OnInitializeMelon()` + - `OnSceneWasLoaded(int buildIndex, string sceneName)` + - `OnUpdate()` + - `OnFixedUpdate()` + - `OnGUI()` + - `OnApplicationQuit()` + +### Effektive Initialisierungssequenz +1. Core initialisiert Konfiguration, Aktivierung/Flags, Logging. +2. Core erstellt/initialisiert FFI (`gregFfiBridge`) und API-Tabelle (`gregGameApi`). +3. Core initialisiert Script-Host (`gregLanguageBridgeHost`) und lädt Bridges. +4. Core installiert Harmony-Patches (`gregHarmonyPatches`). +5. Plugins werden registriert/aufgelöst (`gregRegistry`, `gregDependencyResolver`) und über Ready-Callbacks aktiviert. +6. Runtime-Loop verteilt Update-Ticks an Core, Bridges und FFI-Module. + +### Shutdown-Semantik +- `OnApplicationQuit()` triggert geordnetes Stoppen: + - Script-Host/Bridges herunterfahren, + - native FFI-Module via `mod_shutdown` und `FreeLibrary` freigeben, + - Pointer/Handles im `gregGameApi.Dispose()` bereinigen. + +--- + +## 2) IL2CPP Hooking-Modell & Ausführungsfluss + +### Hook-Ebene +- **Core Layer:** `src/gregModLoader/gregHarmonyPatches.cs` patcht IL2CPP-Spielmethoden mit Harmony Prefix/Postfix. +- Ziel ist **Event-Proxying**, nicht direkter unkontrollierter Mod-Zugriff auf Unity-Typen. + +### Hook-zu-Event Pipeline +1. IL2CPP-Methode wird gepatcht (Prefix/Postfix). +2. Patch extrahiert primitive/struct-basierte Daten. +3. Dispatch über `EventDispatcher`/`gregEventDispatcher` mit numerischer `EventIds`-ID. +4. `GregHookIntegration` mappt `eventId -> greg.*` Hookname (`gregNativeEventHooks`). +5. Hook-Payload wird normalisiert (`BuildPayload(...)`) und an Bus/FFI weitergereicht. + +### Canonical Hook-Namen +- Mapping zentral in `src/gregSdk/gregNativeEventHooks.cs`. +- Primärquelle für Namen: `greg_hooks.json` + framework-only Ergänzungen via `gregHookName.Create(...)`. +- Fallback bei unbekannten IDs: `greg.SYSTEM.UnmappedNativeEvent`. + +### Cancelable vs Non-cancelable +- `gregEventDispatcher` unterstützt normale und cancelable Listener (`Func`). +- Cancel-Pfad wird in Patchpunkten genutzt, wo Spielaktion blockierbar ist. + +--- + +## 3) Interop, FFI & IPC (ABI, Ports, Protokolle) + +### Native FFI (Core ↔ Native Mod) +- **Core Layer Datei:** `src/gregModLoader/gregFfiBridge.cs`. +- Win32 Loader-API: + - `LoadLibrary` + - `GetProcAddress` + - `FreeLibrary` +- Erwartete native Exports (C-ABI): + - `mod_info` + - `mod_init` + - `mod_update` + - `mod_fixed_update` + - `mod_on_scene_loaded` + - `mod_on_gui` + - `mod_shutdown` + - `mod_on_event` + +### API-Table für native Module +- **Core Layer Datei:** `src/gregModLoader/gregGameApi.cs`. +- Versioniertes Struct: `GameAPITable` (aktuell auf v12 erweitert). +- Delegates werden via `Marshal.GetFunctionPointerForDelegate(...)` als Funktionszeiger exportiert. + +### IPC/Netzwerkflächen +- **MCP HTTP Server (Core/Tooling-Grenze):** `GregMCPServer` via `HttpListener` (localhost). +- **Multiplayer Transport (Plugin/Core):** WebSocket-Client in `GregMultiplayerService`. +- **Plugin-Sync (Core/Service):** `HttpClient` in `gregPluginSyncService`. +- **Native Plattform-Interop:** Steam-P2P via `steam_api64`-Imports in `gregGameApi.cs`. + +### Bridge-Host für Sprachen +- **Language Bridge Layer:** `iGregLanguageBridge` + `gregLanguageBridgeHost`. +- Lua: MoonSharp; JS/TS: Jint; Rust/Go über Bridge-Adapter. +- Host ist der Isolations- und Lifecycle-Knoten für alle Script-Runtimes. + +--- + +## 4) Memory Boundaries, Ownership & Lifetime + +### Ownership-Regeln an der FFI-Grenze +- **Unmanaged Allokation durch Core:** `Marshal.AllocHGlobal`. +- **Freigabe durch Core nach Callback:** `Marshal.FreeHGlobal` (symmetrisch im Dispatch-Pfad). +- **String-Marshalling:** `Marshal.StringToHGlobalAnsi` / `Marshal.PtrToStringAnsi`. +- **Blittable Struct Transfer:** `[StructLayout(LayoutKind.Sequential)]` in Event-Payloads. + +### Delegate-/Function-Pointer-Lifetime +- Delegates für API-Funktionen werden als Felder gehalten, damit der GC keine Funktionszeiger invalidiert. +- `GameAPITable` speichert `IntPtr` auf Delegate-Stubs; Freigabe zentral im `Dispose()`. + +### GCHandle-Verwendung +- Für Event-/Payload-Weitergabe werden `GCHandle.Alloc(...)` Handles erzeugt. +- Handles werden nach Verwendung explizit gelöst (`GCHandle.Free()`), um Leaks/Pinning-Druck zu verhindern. + +### Fehlerresilienz an Grenzstellen +- FFI-Aufrufe sind einzeln in `try/catch` eingefasst. +- Fehler in einem Modul dürfen den Core-Loop nicht terminieren (Fail-isolated execution). + +### Kritische ABI-Regeln für externe Bindings +- Struct-Reihenfolge/Field-Typen sind ABI-kritisch; keine Reorder/Pack-Änderung ohne Version-Bump. +- Auf der Bridge-Seite nur stabile primitive Typen (`int`, `uint`, `float`, `byte[]`, `IntPtr`) übergeben. +- Keine Ownership-Mehrdeutigkeit: jeder Pointer braucht eindeutige „who frees“-Regel. + +--- + +## 5) DTOs, Manifeste & Serialisierung + +### Typfamilien +- **Runtime Event DTOs (Core):** `src/gregModLoader/Events/*.cs` (`iModEvent` mit `DateTime OccurredAtUtc`). +- **Native Event Struct DTOs (Core):** `src/gregModLoader/gregEventDispatcher.cs` (z. B. `ValueChangedData`, `DayEndedData`, `ShopItemAddedData`). +- **SDK/Config DTOs (Core/SDK):** + - `GregUiReplacementManifest` + - `ModelOverrideManifest` + - `ServerDefinition` + - `ItemDefinition` + - `PluginSyncConfig`, `PluginSyncManifest` + +### Serializer-Stack +- `System.Text.Json` für Runtime-/Service-Pfade (`GregPersistenceService`, MCP-Antworten). +- `Newtonsoft.Json` in Teilen des Config-Stacks (`GregConfigService`). +- Konsequenz: DTO-Contracts sind serializer-agnostisch zu halten (öffentliche Properties/Fields stabil). + +### Feld- und Versionsstabilität +- Event- und Manifest-Felder sind externe Verträge für Bridges/Mods. +- Änderungen nur additiv und versioniert (insb. API-Table + manifestartige Contracts). +- Entfernen/Umbenennen erzeugt harte Breaking Changes für native und Script-Bindings. + +### Datentyp-Praxis für Multi-Language Bindings +- Bevorzugt JSON-kompatible Primitiven und flache Objekte. +- Für binäre Übergaben klar deklarierte Byte-Arrays + Länge. +- Keine impliziten Unity-/IL2CPP-Objektreferenzen in öffentlichen Bridge-DTOs. + +--- + +## 6) Event-System, Hook-API & Sandboxing-Einschränkungen + +### Event-Systeme (parallel vorhanden) +1. **String-basierter Hook-Bus (Core):** `gregEventDispatcher` mit Hooknamen `greg..`. +2. **Type-safe Bus (SDK):** `GregEventBus` (`Subscribe`, `Publish`, `Unsubscribe`). +3. **Native Event-ID Dispatch (Core↔FFI):** `EventIds` + struct-payload + `mod_on_event`. + +### Hook-Namenskonvention +- Kanonisch: `greg..` (bzw. in Altbeständen teils uppercase Domains). +- Mappingquelle für native IDs: `gregNativeEventHooks.ByEventId`. +- Hook-Integration: `GregHookIntegration.EmitForSimple/EmitForStruct`. + +### Sandboxing-Realität (wichtig für AI/Bridge-Design) +- **Lua I/O Modul:** `src/Scripting/Lua/LuaModules/gregIoLuaModule.cs` enthält Dateioperationen (`read_file`, `write_file`, `list_files` etc.). +- Kommentar behauptet Sandbox-Scope, Implementierung zeigt aktuell keine harte Pfad-Isolation auf OS-Ebene. +- **ReferenceScanner:** lädt Assemblies via `Assembly.LoadFrom` aus Dateisystemscan; keine AppDomain/Process-Isolation. +- Damit gilt: aktuelle Isolation ist primär **kooperativ/logisch**, nicht sicherheitstechnisch stark. + +### Verbindliche Einschränkungen für neue Bindings +- Bridge-Code darf Core/Unity-Aufrufe nur über freigegebene API/Hooks ausführen. +- Keine direkten unsicheren Pointer-Operationen außerhalb definierter FFI-Wrapper. +- Untrusted Script/Native Mods als potenziell fehlerhaft behandeln (guard clauses + timeout/backpressure + exception fences). +- Für echte Sandbox-Anforderungen ist Prozessisolation (separater Host) nötig; im aktuellen In-Process-Modell nicht garantiert. + +--- + +## Appendix: Operative Leitplanken für Bridge-Autoren + +- **Schichtdisziplin:** + - Mod/Bridge → `greg.*` Hook/API, + - kein direkter Unity-Objektzugriff als öffentliches Contract. +- **ABI-Disziplin:** + - `StructLayout.Sequential`, feste Feldtypen, versionierte Erweiterung. +- **Fehlerdisziplin:** + - Jede Grenzstelle (`FFI`, `JSON parse`, `network`) mit `try/catch` + Logging. +- **Lifecycle-Disziplin:** + - `init -> update/fixed_update/gui -> shutdown` strikt einhalten. +- **Kompatibilität:** + - Runtime-Ziel bleibt `.NET 6` (IL2CPP/MelonLoader-kompatibel). diff --git a/pre-release/Esprima.dll b/pre-release/Esprima.dll deleted file mode 100644 index e016f3c4..00000000 Binary files a/pre-release/Esprima.dll and /dev/null differ diff --git a/pre-release/Jint.dll b/pre-release/Jint.dll deleted file mode 100644 index 4f774c95..00000000 Binary files a/pre-release/Jint.dll and /dev/null differ diff --git a/pre-release/MoonSharp.Interpreter.dll b/pre-release/MoonSharp.Interpreter.dll deleted file mode 100644 index 90645a94..00000000 Binary files a/pre-release/MoonSharp.Interpreter.dll and /dev/null differ diff --git a/pre-release/gregCore.dll b/pre-release/gregCore.dll deleted file mode 100644 index a350db80..00000000 Binary files a/pre-release/gregCore.dll and /dev/null differ diff --git a/pre-release/greg_api.h b/pre-release/greg_api.h deleted file mode 100644 index 211a9977..00000000 --- a/pre-release/greg_api.h +++ /dev/null @@ -1,90 +0,0 @@ -#ifndef GREG_API_H -#define GREG_API_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct { - uint32_t api_version; - void (*log_info)(const char* msg); - void (*log_warning)(const char* msg); - void (*log_error)(const char* msg); - double (*get_player_money)(); - void (*set_player_money)(double value); - float (*get_time_scale)(); - void (*set_time_scale)(float value); - uint32_t (*get_server_count)(); - uint32_t (*get_rack_count)(); - const char* (*get_current_scene)(); - - // v2 - double (*get_player_xp)(); - void (*set_player_xp)(double value); - double (*get_player_reputation)(); - void (*set_player_reputation)(double value); - float (*get_time_of_day)(); - uint32_t (*get_day)(); - float (*get_seconds_in_full_day)(); - void (*set_seconds_in_full_day)(float value); - uint32_t (*get_switch_count)(); - uint32_t (*get_satisfied_customer_count)(); - - // v3 - void (*set_netwatch_enabled)(uint32_t enabled); - uint32_t (*is_netwatch_enabled)(); - uint32_t (*get_netwatch_stats)(); - - // v4 - uint32_t (*get_broken_server_count)(); - uint32_t (*get_broken_switch_count)(); - uint32_t (*get_eol_server_count)(); - uint32_t (*get_eol_switch_count)(); - uint32_t (*get_free_technician_count)(); - uint32_t (*get_total_technician_count)(); - int32_t (*dispatch_repair_server)(); - int32_t (*dispatch_repair_switch)(); - int32_t (*dispatch_replace_server)(); - int32_t (*dispatch_replace_switch)(); - - // v5 - int32_t (*register_custom_employee)(const char* id, const char* name, const char* desc, float salary, float req_rep, uint32_t confirm); - uint32_t (*is_custom_employee_hired)(const char* id); - int32_t (*fire_custom_employee)(const char* id); - int32_t (*register_salary)(int32_t monthly); - - // v6 - int32_t (*show_notification)(const char* msg); - float (*get_money_per_second)(); - float (*get_expenses_per_second)(); - float (*get_xp_per_second)(); - uint32_t (*is_game_paused)(); - void (*set_game_paused)(uint32_t paused); - int32_t (*get_difficulty)(); - int32_t (*trigger_save)(); - - // v7 - uint64_t (*steam_get_my_id)(); - const char* (*steam_get_friend_name)(uint64_t id); - // ... other steam functions ... - void (*reserved[15])(); // Padding for v7 overflow - void (*get_player_position)(float* x, float* y, float* z, float* ry); - - // v8 - const char* (*payload_get_string)(void* payload, const char* field, const char* fallback); - void (*subscribe_event)(const char* hook, void (*handler)(void*), const char* mod_id); - void (*gui_begin_panel)(const char* id, float x, float y, float w, float h); - void (*gui_label)(const char* text); - void (*gui_end_panel)(); - int32_t (*raycast_forward)(float max_dist, const char** out_name, float* out_dist, float* out_x, float* out_y, float* out_z); - void (*publish_tick)(float dt, int32_t frame); -} greg_api_t; - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/pre-release/greg_hooks.json b/pre-release/greg_hooks.json deleted file mode 100644 index 524db023..00000000 --- a/pre-release/greg_hooks.json +++ /dev/null @@ -1,11108 +0,0 @@ -{ - "version": 2, - "description": "Single source of truth for gregFramework hooks. Schema: greg..", - "generatedFrom": "MergedCode.md (Assembly-CSharp IL2CPP Dump)", - "legacyPrefixes": [], - "classInventorySummary": { - "totalClasses": 135, - "totalHooks": 852 - }, - "hooks": [ - { - "legacy": "deprecated.SYSTEM.ActionKeyHint.OnEnable", - "patchTarget": "Il2Cpp.ActionKeyHint::void OnEnable()", - "strategy": "Postfix", - "description": "Interop target ActionKeyHint.OnEnable", - "payloadSchema": { - "targetType": "ActionKeyHint", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "ActionKeyHint", - "name": "greg.SYSTEM.ComponentEnabled.ActionKeyHint" - }, - { - "legacy": "deprecated.SYSTEM.ActionKeyHint.DelayedUpdateUI", - "patchTarget": "Il2Cpp.ActionKeyHint::IEnumerator DelayedUpdateUI()", - "strategy": "Postfix", - "description": "Interop target ActionKeyHint.DelayedUpdateUI", - "payloadSchema": { - "targetType": "ActionKeyHint", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.DelayedUpdateUI" - }, - { - "legacy": "deprecated.SYSTEM.ActionKeyHint.OnDisable", - "patchTarget": "Il2Cpp.ActionKeyHint::void OnDisable()", - "strategy": "Postfix", - "description": "Interop target ActionKeyHint.OnDisable", - "payloadSchema": { - "targetType": "ActionKeyHint", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "ActionKeyHint", - "name": "greg.SYSTEM.ComponentDisabled.ActionKeyHint" - }, - { - "legacy": "deprecated.SYSTEM.ActionKeyHint.OnValidate", - "patchTarget": "Il2Cpp.ActionKeyHint::void OnValidate()", - "strategy": "Postfix", - "description": "Interop target ActionKeyHint.OnValidate", - "payloadSchema": { - "targetType": "ActionKeyHint", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "ActionKeyHint", - "name": "greg.SYSTEM.OnValidate.ActionKeyHint" - }, - { - "legacy": "deprecated.SYSTEM.ActionKeyHint.GetBindingInfo", - "patchTarget": "Il2Cpp.ActionKeyHint::void GetBindingInfo()", - "strategy": "Postfix", - "description": "Interop target ActionKeyHint.GetBindingInfo", - "payloadSchema": { - "targetType": "ActionKeyHint", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "ActionKeyHint", - "name": "greg.SYSTEM.GetBindingInfo.ActionKeyHint" - }, - { - "legacy": "deprecated.SYSTEM.ActionKeyHint.UpdateUI", - "patchTarget": "Il2Cpp.ActionKeyHint::void UpdateUI()", - "strategy": "Postfix", - "description": "Interop target ActionKeyHint.UpdateUI", - "payloadSchema": { - "targetType": "ActionKeyHint", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "ActionKeyHint", - "name": "greg.SYSTEM.UIChanged.ActionKeyHint" - }, - { - "legacy": "deprecated.SYSTEM.ActionKeyHint.CustomKey", - "patchTarget": "Il2Cpp.ActionKeyHint::void CustomKey(InputAction action, string _customText)", - "strategy": "Postfix", - "description": "Interop target ActionKeyHint.CustomKey", - "payloadSchema": { - "targetType": "ActionKeyHint", - "isStatic": false, - "action": "InputAction", - "_customText": "string" - }, - "hookSubject": null, - "name": "greg.SYSTEM.CustomKey" - }, - { - "legacy": "deprecated.SYSTEM.AICharacterControl.OnEnable", - "patchTarget": "Il2Cpp.AICharacterControl::void OnEnable()", - "strategy": "Postfix", - "description": "Interop target AICharacterControl.OnEnable", - "payloadSchema": { - "targetType": "AICharacterControl", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "AICharacterControl", - "name": "greg.SYSTEM.ComponentEnabled.AICharacterControl" - }, - { - "legacy": "deprecated.SYSTEM.AICharacterControl.OnCreated", - "patchTarget": "Il2Cpp.AICharacterControl::void OnCreated(UMAData umadata)", - "strategy": "Postfix", - "description": "Interop target AICharacterControl.OnCreated", - "payloadSchema": { - "targetType": "AICharacterControl", - "isStatic": false, - "umadata": "UMAData", - "hookSubject": "string" - }, - "hookSubject": "AICharacterControl_UMADataumadata", - "name": "greg.SYSTEM.OnCreated.AICharacterControl_UMADataumadata" - }, - { - "legacy": "deprecated.SYSTEM.AICharacterControl.StartingAnimation", - "patchTarget": "Il2Cpp.AICharacterControl::void StartingAnimation()", - "strategy": "Postfix", - "description": "Interop target AICharacterControl.StartingAnimation", - "payloadSchema": { - "targetType": "AICharacterControl", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.StartingAnimation" - }, - { - "legacy": "deprecated.SYSTEM.AICharacterControl.OnDisable", - "patchTarget": "Il2Cpp.AICharacterControl::void OnDisable()", - "strategy": "Postfix", - "description": "Interop target AICharacterControl.OnDisable", - "payloadSchema": { - "targetType": "AICharacterControl", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "AICharacterControl", - "name": "greg.SYSTEM.ComponentDisabled.AICharacterControl" - }, - { - "legacy": "deprecated.SYSTEM.AICharacterControl.OnDestroy", - "patchTarget": "Il2Cpp.AICharacterControl::void OnDestroy()", - "strategy": "Postfix", - "description": "Interop target AICharacterControl.OnDestroy", - "payloadSchema": { - "targetType": "AICharacterControl", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "AICharacterControl", - "name": "greg.SYSTEM.OnDestroy.AICharacterControl" - }, - { - "legacy": "deprecated.SYSTEM.AICharacterControl.Start", - "patchTarget": "Il2Cpp.AICharacterControl::IEnumerator Start()", - "strategy": "Postfix", - "description": "Interop target AICharacterControl.Start", - "payloadSchema": { - "targetType": "AICharacterControl", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "AICharacterControl", - "name": "greg.SYSTEM.ComponentInitialized.AICharacterControl" - }, - { - "legacy": "deprecated.SYSTEM.AICharacterControl.SetTarget", - "patchTarget": "Il2Cpp.AICharacterControl::void SetTarget(Vector3 target)", - "strategy": "Postfix", - "description": "Interop target AICharacterControl.SetTarget", - "payloadSchema": { - "targetType": "AICharacterControl", - "isStatic": false, - "target": "Vector3" - }, - "hookSubject": null, - "name": "greg.SYSTEM.TargetSet" - }, - { - "legacy": "deprecated.SYSTEM.AICharacterControl.AgentReachTarget", - "patchTarget": "Il2Cpp.AICharacterControl::bool AgentReachTarget()", - "strategy": "Postfix", - "description": "Interop target AICharacterControl.AgentReachTarget", - "payloadSchema": { - "targetType": "AICharacterControl", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.AgentReachTarget" - }, - { - "legacy": "deprecated.SYSTEM.AICharacterControl.moveBack", - "patchTarget": "Il2Cpp.AICharacterControl::void moveBack(Vector3 direction)", - "strategy": "Postfix", - "description": "Interop target AICharacterControl.moveBack", - "payloadSchema": { - "targetType": "AICharacterControl", - "isStatic": false, - "direction": "Vector3" - }, - "hookSubject": null, - "name": "greg.SYSTEM.moveBack" - }, - { - "legacy": "deprecated.SYSTEM.AICharacterControl.GotoNextPoint", - "patchTarget": "Il2Cpp.AICharacterControl::void GotoNextPoint(Il2CppReferenceArray _waypoints)", - "strategy": "Postfix", - "description": "Interop target AICharacterControl.GotoNextPoint", - "payloadSchema": { - "targetType": "AICharacterControl", - "isStatic": false, - "_waypoints": "Il2CppReferenceArray" - }, - "hookSubject": null, - "name": "greg.SYSTEM.GotoNextPoint" - }, - { - "legacy": "deprecated.SYSTEM.AICharacterControl.SetStopLoopingDestinationPoints", - "patchTarget": "Il2Cpp.AICharacterControl::void SetStopLoopingDestinationPoints()", - "strategy": "Postfix", - "description": "Interop target AICharacterControl.SetStopLoopingDestinationPoints", - "payloadSchema": { - "targetType": "AICharacterControl", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.StopLoopingDestinationPointsSet" - }, - { - "legacy": "deprecated.SYSTEM.AICharacterControl.AnimSit", - "patchTarget": "Il2Cpp.AICharacterControl::void AnimSit(bool active)", - "strategy": "Postfix", - "description": "Interop target AICharacterControl.AnimSit", - "payloadSchema": { - "targetType": "AICharacterControl", - "isStatic": false, - "active": "bool" - }, - "hookSubject": null, - "name": "greg.SYSTEM.AnimSit" - }, - { - "legacy": "deprecated.SYSTEM.AICharacterExpressions.Start", - "patchTarget": "Il2Cpp.AICharacterExpressions::void Start()", - "strategy": "Postfix", - "description": "Interop target AICharacterExpressions.Start", - "payloadSchema": { - "targetType": "AICharacterExpressions", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "AICharacterExpressions", - "name": "greg.SYSTEM.ComponentInitialized.AICharacterExpressions" - }, - { - "legacy": "deprecated.SYSTEM.AICharacterExpressions.OnDestroy", - "patchTarget": "Il2Cpp.AICharacterExpressions::void OnDestroy()", - "strategy": "Postfix", - "description": "Interop target AICharacterExpressions.OnDestroy", - "payloadSchema": { - "targetType": "AICharacterExpressions", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "AICharacterExpressions", - "name": "greg.SYSTEM.OnDestroy.AICharacterExpressions" - }, - { - "legacy": "deprecated.SYSTEM.AICharacterExpressions.OnCreated", - "patchTarget": "Il2Cpp.AICharacterExpressions::void OnCreated(UMAData umadata)", - "strategy": "Postfix", - "description": "Interop target AICharacterExpressions.OnCreated", - "payloadSchema": { - "targetType": "AICharacterExpressions", - "isStatic": false, - "umadata": "UMAData", - "hookSubject": "string" - }, - "hookSubject": "AICharacterExpressions_UMADataumadata", - "name": "greg.SYSTEM.OnCreated.AICharacterExpressions_UMADataumadata" - }, - { - "legacy": "deprecated.SYSTEM.AICharacterExpressions.Talk", - "patchTarget": "Il2Cpp.AICharacterExpressions::void Talk(string sentence)", - "strategy": "Postfix", - "description": "Interop target AICharacterExpressions.Talk", - "payloadSchema": { - "targetType": "AICharacterExpressions", - "isStatic": false, - "sentence": "string" - }, - "hookSubject": null, - "name": "greg.SYSTEM.Talk" - }, - { - "legacy": "deprecated.SYSTEM.AICharacterExpressions.Talking", - "patchTarget": "Il2Cpp.AICharacterExpressions::IEnumerator Talking(List _syllables)", - "strategy": "Postfix", - "description": "Interop target AICharacterExpressions.Talking", - "payloadSchema": { - "targetType": "AICharacterExpressions", - "isStatic": false, - "_syllables": "List" - }, - "hookSubject": null, - "name": "greg.SYSTEM.Talking" - }, - { - "legacy": "deprecated.SYSTEM.AICharacterExpressions.MouthShape_none", - "patchTarget": "Il2Cpp.AICharacterExpressions::void MouthShape_none(float t)", - "strategy": "Postfix", - "description": "Interop target AICharacterExpressions.MouthShape_none", - "payloadSchema": { - "targetType": "AICharacterExpressions", - "isStatic": false, - "t": "float" - }, - "hookSubject": null, - "name": "greg.SYSTEM.MouthShape_none" - }, - { - "legacy": "deprecated.SYSTEM.AICharacterExpressions.MouthShape_A", - "patchTarget": "Il2Cpp.AICharacterExpressions::void MouthShape_A(float t)", - "strategy": "Postfix", - "description": "Interop target AICharacterExpressions.MouthShape_A", - "payloadSchema": { - "targetType": "AICharacterExpressions", - "isStatic": false, - "t": "float" - }, - "hookSubject": null, - "name": "greg.SYSTEM.MouthShape_A" - }, - { - "legacy": "deprecated.SYSTEM.AICharacterExpressions.MouthShape_O", - "patchTarget": "Il2Cpp.AICharacterExpressions::void MouthShape_O(float t)", - "strategy": "Postfix", - "description": "Interop target AICharacterExpressions.MouthShape_O", - "payloadSchema": { - "targetType": "AICharacterExpressions", - "isStatic": false, - "t": "float" - }, - "hookSubject": null, - "name": "greg.SYSTEM.MouthShape_O" - }, - { - "legacy": "deprecated.SYSTEM.AICharacterExpressions.MouthShape_U", - "patchTarget": "Il2Cpp.AICharacterExpressions::void MouthShape_U(float t)", - "strategy": "Postfix", - "description": "Interop target AICharacterExpressions.MouthShape_U", - "payloadSchema": { - "targetType": "AICharacterExpressions", - "isStatic": false, - "t": "float" - }, - "hookSubject": null, - "name": "greg.SYSTEM.MouthShape_U" - }, - { - "legacy": "deprecated.SYSTEM.AICharacterExpressions.MouthShape_BPM", - "patchTarget": "Il2Cpp.AICharacterExpressions::void MouthShape_BPM(float t)", - "strategy": "Postfix", - "description": "Interop target AICharacterExpressions.MouthShape_BPM", - "payloadSchema": { - "targetType": "AICharacterExpressions", - "isStatic": false, - "t": "float" - }, - "hookSubject": null, - "name": "greg.SYSTEM.MouthShape_BPM" - }, - { - "legacy": "deprecated.SYSTEM.AICharacterExpressions.MouthShape_FV", - "patchTarget": "Il2Cpp.AICharacterExpressions::void MouthShape_FV(float t)", - "strategy": "Postfix", - "description": "Interop target AICharacterExpressions.MouthShape_FV", - "payloadSchema": { - "targetType": "AICharacterExpressions", - "isStatic": false, - "t": "float" - }, - "hookSubject": null, - "name": "greg.SYSTEM.MouthShape_FV" - }, - { - "legacy": "deprecated.SYSTEM.AICharacterExpressions.MouthShape_CDG", - "patchTarget": "Il2Cpp.AICharacterExpressions::void MouthShape_CDG(float t)", - "strategy": "Postfix", - "description": "Interop target AICharacterExpressions.MouthShape_CDG", - "payloadSchema": { - "targetType": "AICharacterExpressions", - "isStatic": false, - "t": "float" - }, - "hookSubject": null, - "name": "greg.SYSTEM.MouthShape_CDG" - }, - { - "legacy": "deprecated.SYSTEM.AssetManagement.SetCell", - "patchTarget": "Il2Cpp.AssetManagement::virtual void SetCell(ICell cell, int index)", - "strategy": "Postfix", - "description": "Interop target AssetManagement.SetCell", - "payloadSchema": { - "targetType": "AssetManagement", - "isStatic": false, - "cell": "ICell", - "index": "int" - }, - "hookSubject": null, - "name": "greg.SYSTEM.CellSet" - }, - { - "legacy": "deprecated.SYSTEM.AssetManagement.OnEnable", - "patchTarget": "Il2Cpp.AssetManagement::void OnEnable()", - "strategy": "Postfix", - "description": "Interop target AssetManagement.OnEnable", - "payloadSchema": { - "targetType": "AssetManagement", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "AssetManagement", - "name": "greg.SYSTEM.ComponentEnabled.AssetManagement" - }, - { - "legacy": "deprecated.SYSTEM.AssetManagement.ButtonFilterAll", - "patchTarget": "Il2Cpp.AssetManagement::void ButtonFilterAll()", - "strategy": "Postfix", - "description": "Interop target AssetManagement.ButtonFilterAll", - "payloadSchema": { - "targetType": "AssetManagement", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ButtonFilterAll" - }, - { - "legacy": "deprecated.SYSTEM.AssetManagement.ButtonFilterSwitches", - "patchTarget": "Il2Cpp.AssetManagement::void ButtonFilterSwitches()", - "strategy": "Postfix", - "description": "Interop target AssetManagement.ButtonFilterSwitches", - "payloadSchema": { - "targetType": "AssetManagement", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ButtonFilterSwitches" - }, - { - "legacy": "deprecated.SYSTEM.AssetManagement.ButtonFilterServers", - "patchTarget": "Il2Cpp.AssetManagement::void ButtonFilterServers()", - "strategy": "Postfix", - "description": "Interop target AssetManagement.ButtonFilterServers", - "payloadSchema": { - "targetType": "AssetManagement", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ButtonFilterServers" - }, - { - "legacy": "deprecated.SYSTEM.AssetManagement.ButtonFilterBroken", - "patchTarget": "Il2Cpp.AssetManagement::void ButtonFilterBroken()", - "strategy": "Postfix", - "description": "Interop target AssetManagement.ButtonFilterBroken", - "payloadSchema": { - "targetType": "AssetManagement", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ButtonFilterBroken" - }, - { - "legacy": "deprecated.SYSTEM.AssetManagement.ButtonFilterEOL", - "patchTarget": "Il2Cpp.AssetManagement::void ButtonFilterEOL()", - "strategy": "Postfix", - "description": "Interop target AssetManagement.ButtonFilterEOL", - "payloadSchema": { - "targetType": "AssetManagement", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ButtonFilterEOL" - }, - { - "legacy": "deprecated.SYSTEM.AssetManagement.ButtonFilterOff", - "patchTarget": "Il2Cpp.AssetManagement::void ButtonFilterOff()", - "strategy": "Postfix", - "description": "Interop target AssetManagement.ButtonFilterOff", - "payloadSchema": { - "targetType": "AssetManagement", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ButtonFilterOff" - }, - { - "legacy": "deprecated.SYSTEM.AssetManagement.SendTechnician", - "patchTarget": "Il2Cpp.AssetManagement::void SendTechnician(NetworkSwitch networkSwitch, Server server)", - "strategy": "Postfix", - "description": "Interop target AssetManagement.SendTechnician", - "payloadSchema": { - "targetType": "AssetManagement", - "isStatic": false, - "networkSwitch": "NetworkSwitch", - "server": "Server" - }, - "hookSubject": null, - "name": "greg.SYSTEM.TechnicianDispatched" - }, - { - "legacy": "deprecated.SYSTEM.AssetManagement.ButtonConfirmSendingTechnician", - "patchTarget": "Il2Cpp.AssetManagement::void ButtonConfirmSendingTechnician()", - "strategy": "Postfix", - "description": "Interop target AssetManagement.ButtonConfirmSendingTechnician", - "payloadSchema": { - "targetType": "AssetManagement", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ButtonConfirmSendingTechnician" - }, - { - "legacy": "deprecated.SYSTEM.AssetManagement.ButtonCancelSendingTechnician", - "patchTarget": "Il2Cpp.AssetManagement::void ButtonCancelSendingTechnician()", - "strategy": "Postfix", - "description": "Interop target AssetManagement.ButtonCancelSendingTechnician", - "payloadSchema": { - "targetType": "AssetManagement", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ButtonCancelSendingTechnician" - }, - { - "legacy": "deprecated.SYSTEM.AssetManagement.UpdateTechnicianInformation", - "patchTarget": "Il2Cpp.AssetManagement::void UpdateTechnicianInformation()", - "strategy": "Postfix", - "description": "Interop target AssetManagement.UpdateTechnicianInformation", - "payloadSchema": { - "targetType": "AssetManagement", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.TechnicianInformationChanged" - }, - { - "legacy": "deprecated.SYSTEM.AssetManagementDeviceLine.SetupLine", - "patchTarget": "Il2Cpp.AssetManagementDeviceLine::void SetupLine(AssetManagementDeviceLineData data, int index)", - "strategy": "Postfix", - "description": "Interop target AssetManagementDeviceLine.SetupLine", - "payloadSchema": { - "targetType": "AssetManagementDeviceLine", - "isStatic": false, - "data": "AssetManagementDeviceLineData", - "index": "int" - }, - "hookSubject": null, - "name": "greg.SYSTEM.upLineSet" - }, - { - "legacy": "deprecated.SYSTEM.AssetManagementDeviceLine.ButtonClearWarningSign", - "patchTarget": "Il2Cpp.AssetManagementDeviceLine::void ButtonClearWarningSign()", - "strategy": "Postfix", - "description": "Interop target AssetManagementDeviceLine.ButtonClearWarningSign", - "payloadSchema": { - "targetType": "AssetManagementDeviceLine", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ButtonClearWarningSign" - }, - { - "legacy": "deprecated.SYSTEM.AssetManagementDeviceLine.ButtonSendTechnician", - "patchTarget": "Il2Cpp.AssetManagementDeviceLine::void ButtonSendTechnician()", - "strategy": "Postfix", - "description": "Interop target AssetManagementDeviceLine.ButtonSendTechnician", - "payloadSchema": { - "targetType": "AssetManagementDeviceLine", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ButtonSendTechnician" - }, - { - "legacy": "deprecated.SYSTEM.AudioManager.Awake", - "patchTarget": "Il2Cpp.AudioManager::void Awake()", - "strategy": "Postfix", - "description": "Interop target AudioManager.Awake", - "payloadSchema": { - "targetType": "AudioManager", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "AudioManager", - "name": "greg.SYSTEM.ComponentInitialized.AudioManager" - }, - { - "legacy": "deprecated.SYSTEM.AudioManager.SetMusic", - "patchTarget": "Il2Cpp.AudioManager::void SetMusic(int _clipUID)", - "strategy": "Postfix", - "description": "Interop target AudioManager.SetMusic", - "payloadSchema": { - "targetType": "AudioManager", - "isStatic": false, - "_clipUID": "int" - }, - "hookSubject": null, - "name": "greg.SYSTEM.MusicSet" - }, - { - "legacy": "deprecated.SYSTEM.AudioManager.PlayEffectAudioClip", - "patchTarget": "Il2Cpp.AudioManager::void PlayEffectAudioClip(AudioClip audioClip, float volume = 1f, float delayed = 0f)", - "strategy": "Postfix", - "description": "Interop target AudioManager.PlayEffectAudioClip", - "payloadSchema": { - "targetType": "AudioManager", - "isStatic": false, - "audioClip": "AudioClip", - "volume": "float", - "delayed": "float" - }, - "hookSubject": null, - "name": "greg.SYSTEM.PlayEffectAudioClip" - }, - { - "legacy": "deprecated.SYSTEM.AudioManager.SetMasterVolume", - "patchTarget": "Il2Cpp.AudioManager::void SetMasterVolume(float _volume)", - "strategy": "Postfix", - "description": "Interop target AudioManager.SetMasterVolume", - "payloadSchema": { - "targetType": "AudioManager", - "isStatic": false, - "_volume": "float" - }, - "hookSubject": null, - "name": "greg.SYSTEM.MasterVolumeSet" - }, - { - "legacy": "deprecated.SYSTEM.AudioManager.SetEffectsVolume", - "patchTarget": "Il2Cpp.AudioManager::void SetEffectsVolume(float _volume)", - "strategy": "Postfix", - "description": "Interop target AudioManager.SetEffectsVolume", - "payloadSchema": { - "targetType": "AudioManager", - "isStatic": false, - "_volume": "float" - }, - "hookSubject": null, - "name": "greg.SYSTEM.EffectsVolumeSet" - }, - { - "legacy": "deprecated.SYSTEM.AudioManager.SetMusicVolume", - "patchTarget": "Il2Cpp.AudioManager::void SetMusicVolume(float _volume)", - "strategy": "Postfix", - "description": "Interop target AudioManager.SetMusicVolume", - "payloadSchema": { - "targetType": "AudioManager", - "isStatic": false, - "_volume": "float" - }, - "hookSubject": null, - "name": "greg.SYSTEM.MusicVolumeSet" - }, - { - "legacy": "deprecated.SYSTEM.AudioManager.SetRacksVolume", - "patchTarget": "Il2Cpp.AudioManager::void SetRacksVolume(float _volume)", - "strategy": "Postfix", - "description": "Interop target AudioManager.SetRacksVolume", - "payloadSchema": { - "targetType": "AudioManager", - "isStatic": false, - "_volume": "float" - }, - "hookSubject": null, - "name": "greg.SYSTEM.RacksVolumeSet" - }, - { - "legacy": "deprecated.SYSTEM.AudioManager.FadeOut", - "patchTarget": "Il2Cpp.AudioManager::IEnumerator FadeOut(AudioSource audioSource, float FadeTime)", - "strategy": "Postfix", - "description": "Interop target AudioManager.FadeOut", - "payloadSchema": { - "targetType": "AudioManager", - "isStatic": false, - "audioSource": "AudioSource", - "FadeTime": "float" - }, - "hookSubject": null, - "name": "greg.SYSTEM.FadeOut" - }, - { - "legacy": "deprecated.SYSTEM.AudioManager.FadeIn", - "patchTarget": "Il2Cpp.AudioManager::IEnumerator FadeIn(AudioSource audioSource, float FadeTime, float finalVolume)", - "strategy": "Postfix", - "description": "Interop target AudioManager.FadeIn", - "payloadSchema": { - "targetType": "AudioManager", - "isStatic": false, - "audioSource": "AudioSource", - "FadeTime": "float", - "finalVolume": "float" - }, - "hookSubject": null, - "name": "greg.SYSTEM.FadeIn" - }, - { - "legacy": "deprecated.SYSTEM.AudioManager.FadeOut_FadeIn", - "patchTarget": "Il2Cpp.AudioManager::IEnumerator FadeOut_FadeIn(AudioSource audioSource, float FadeTime, float finalVolume, AudioClip newAudioClip)", - "strategy": "Postfix", - "description": "Interop target AudioManager.FadeOut_FadeIn", - "payloadSchema": { - "targetType": "AudioManager", - "isStatic": false, - "audioSource": "AudioSource", - "FadeTime": "float", - "finalVolume": "float", - "newAudioClip": "AudioClip" - }, - "hookSubject": null, - "name": "greg.SYSTEM.FadeOut_FadeIn" - }, - { - "legacy": "deprecated.SYSTEM.AudioManager.PlayRandomRJ45Clip", - "patchTarget": "Il2Cpp.AudioManager::void PlayRandomRJ45Clip()", - "strategy": "Postfix", - "description": "Interop target AudioManager.PlayRandomRJ45Clip", - "payloadSchema": { - "targetType": "AudioManager", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.PlayRandomRJ45Clip" - }, - { - "legacy": "deprecated.SYSTEM.AudioManager.PlayRandomImpactClip", - "patchTarget": "Il2Cpp.AudioManager::void PlayRandomImpactClip(float _volume = 0.5f)", - "strategy": "Postfix", - "description": "Interop target AudioManager.PlayRandomImpactClip", - "payloadSchema": { - "targetType": "AudioManager", - "isStatic": false, - "_volume": "float" - }, - "hookSubject": null, - "name": "greg.SYSTEM.PlayRandomImpactClip" - }, - { - "legacy": "deprecated.SYSTEM.AudioManager.PlayRackDoorOpen", - "patchTarget": "Il2Cpp.AudioManager::void PlayRackDoorOpen()", - "strategy": "Postfix", - "description": "Interop target AudioManager.PlayRackDoorOpen", - "payloadSchema": { - "targetType": "AudioManager", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.PlayRackDoorOpen" - }, - { - "legacy": "deprecated.SYSTEM.AutoDisable.OnEnable", - "patchTarget": "Il2Cpp.AutoDisable::void OnEnable()", - "strategy": "Postfix", - "description": "Interop target AutoDisable.OnEnable", - "payloadSchema": { - "targetType": "AutoDisable", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "AutoDisable", - "name": "greg.SYSTEM.ComponentEnabled.AutoDisable" - }, - { - "legacy": "deprecated.SYSTEM.AutoDisable.TurnOffAfterXseconds", - "patchTarget": "Il2Cpp.AutoDisable::IEnumerator TurnOffAfterXseconds()", - "strategy": "Postfix", - "description": "Interop target AutoDisable.TurnOffAfterXseconds", - "payloadSchema": { - "targetType": "AutoDisable", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.TurnOffAfterXseconds" - }, - { - "legacy": "deprecated.SYSTEM.AutoScrollRect.OnEnable", - "patchTarget": "Il2Cpp.AutoScrollRect::void OnEnable()", - "strategy": "Postfix", - "description": "Interop target AutoScrollRect.OnEnable", - "payloadSchema": { - "targetType": "AutoScrollRect", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "AutoScrollRect", - "name": "greg.SYSTEM.ComponentEnabled.AutoScrollRect" - }, - { - "legacy": "deprecated.SYSTEM.AutoScrollRect.ScrollAuto", - "patchTarget": "Il2Cpp.AutoScrollRect::void ScrollAuto()", - "strategy": "Postfix", - "description": "Interop target AutoScrollRect.ScrollAuto", - "payloadSchema": { - "targetType": "AutoScrollRect", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ScrollAuto" - }, - { - "legacy": "deprecated.SYSTEM.BalanceSheet.Awake", - "patchTarget": "Il2Cpp.BalanceSheet::void Awake()", - "strategy": "Postfix", - "description": "Interop target BalanceSheet.Awake", - "payloadSchema": { - "targetType": "BalanceSheet", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "BalanceSheet_caf9cccea0", - "name": "greg.SYSTEM.ComponentInitialized.BalanceSheet_caf9cccea0" - }, - { - "legacy": "deprecated.SYSTEM.BalanceSheet.Start", - "patchTarget": "Il2Cpp.BalanceSheet::void Start()", - "strategy": "Postfix", - "description": "Interop target BalanceSheet.Start", - "payloadSchema": { - "targetType": "BalanceSheet", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "BalanceSheet_3bb9a477a0", - "name": "greg.SYSTEM.ComponentInitialized.BalanceSheet_3bb9a477a0" - }, - { - "legacy": "deprecated.SYSTEM.BalanceSheet.OnDestroy", - "patchTarget": "Il2Cpp.BalanceSheet::void OnDestroy()", - "strategy": "Postfix", - "description": "Interop target BalanceSheet.OnDestroy", - "payloadSchema": { - "targetType": "BalanceSheet", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "BalanceSheet", - "name": "greg.SYSTEM.OnDestroy.BalanceSheet" - }, - { - "legacy": "deprecated.SYSTEM.BalanceSheet.RegisterSalary", - "patchTarget": "Il2Cpp.BalanceSheet::void RegisterSalary(int monthlySalary)", - "strategy": "Postfix", - "description": "Interop target BalanceSheet.RegisterSalary", - "payloadSchema": { - "targetType": "BalanceSheet", - "isStatic": false, - "monthlySalary": "int" - }, - "hookSubject": null, - "name": "greg.SYSTEM.RegisterSalary" - }, - { - "legacy": "deprecated.SYSTEM.BalanceSheet.TrackFinances", - "patchTarget": "Il2Cpp.BalanceSheet::IEnumerator TrackFinances()", - "strategy": "Postfix", - "description": "Interop target BalanceSheet.TrackFinances", - "payloadSchema": { - "targetType": "BalanceSheet", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.TrackFinances" - }, - { - "legacy": "deprecated.SYSTEM.BalanceSheet.CountFailingApps", - "patchTarget": "Il2Cpp.BalanceSheet::int CountFailingApps(CustomerBase cb)", - "strategy": "Postfix", - "description": "Interop target BalanceSheet.CountFailingApps", - "payloadSchema": { - "targetType": "BalanceSheet", - "isStatic": false, - "cb": "CustomerBase" - }, - "hookSubject": null, - "name": "greg.SYSTEM.CountFailingApps" - }, - { - "legacy": "deprecated.SYSTEM.BalanceSheet.SaveSnapshot", - "patchTarget": "Il2Cpp.BalanceSheet::void SaveSnapshot(int month, DateTime snapshotTime)", - "strategy": "Postfix", - "description": "Interop target BalanceSheet.SaveSnapshot", - "payloadSchema": { - "targetType": "BalanceSheet", - "isStatic": false, - "month": "int", - "snapshotTime": "DateTime" - }, - "hookSubject": null, - "name": "greg.SYSTEM.SnapshotSaved" - }, - { - "legacy": "deprecated.SYSTEM.BalanceSheet.FillInBalanceSheet", - "patchTarget": "Il2Cpp.BalanceSheet::void FillInBalanceSheet()", - "strategy": "Postfix", - "description": "Interop target BalanceSheet.FillInBalanceSheet", - "payloadSchema": { - "targetType": "BalanceSheet", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.FillInBalanceSheet" - }, - { - "legacy": "deprecated.SYSTEM.BalanceSheet.AddRow", - "patchTarget": "Il2Cpp.BalanceSheet::void AddRow(string name, float revenue, float penalties, float total, Sprite logo = null)", - "strategy": "Postfix", - "description": "Interop target BalanceSheet.AddRow", - "payloadSchema": { - "targetType": "BalanceSheet", - "isStatic": false, - "name": "string", - "revenue": "float", - "penalties": "float", - "total": "float", - "logo": "Sprite" - }, - "hookSubject": null, - "name": "greg.SYSTEM.RowAdded" - }, - { - "legacy": "deprecated.SYSTEM.BalanceSheet.AddSalaryRow", - "patchTarget": "Il2Cpp.BalanceSheet::void AddSalaryRow(float salaryExpense)", - "strategy": "Postfix", - "description": "Interop target BalanceSheet.AddSalaryRow", - "payloadSchema": { - "targetType": "BalanceSheet", - "isStatic": false, - "salaryExpense": "float" - }, - "hookSubject": null, - "name": "greg.SYSTEM.SalaryRowAdded" - }, - { - "legacy": "deprecated.SYSTEM.BalanceSheet.AddTotalRow", - "patchTarget": "Il2Cpp.BalanceSheet::void AddTotalRow(float revenue, float penalties, float total)", - "strategy": "Postfix", - "description": "Interop target BalanceSheet.AddTotalRow", - "payloadSchema": { - "targetType": "BalanceSheet", - "isStatic": false, - "revenue": "float", - "penalties": "float", - "total": "float" - }, - "hookSubject": null, - "name": "greg.SYSTEM.TotalRowAdded" - }, - { - "legacy": "deprecated.SYSTEM.BalanceSheet.AddHeaderRow", - "patchTarget": "Il2Cpp.BalanceSheet::void AddHeaderRow()", - "strategy": "Postfix", - "description": "Interop target BalanceSheet.AddHeaderRow", - "payloadSchema": { - "targetType": "BalanceSheet", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.HeaderRowAdded" - }, - { - "legacy": "deprecated.SYSTEM.BalanceSheet.AddSectionTitle", - "patchTarget": "Il2Cpp.BalanceSheet::void AddSectionTitle(string title)", - "strategy": "Postfix", - "description": "Interop target BalanceSheet.AddSectionTitle", - "payloadSchema": { - "targetType": "BalanceSheet", - "isStatic": false, - "title": "string" - }, - "hookSubject": null, - "name": "greg.SYSTEM.SectionTitleAdded" - }, - { - "legacy": "deprecated.SYSTEM.BalanceSheet.InstantiateRow", - "patchTarget": "Il2Cpp.BalanceSheet::BalanceSheetRow InstantiateRow()", - "strategy": "Postfix", - "description": "Interop target BalanceSheet.InstantiateRow", - "payloadSchema": { - "targetType": "BalanceSheet", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.InstantiateRow" - }, - { - "legacy": "deprecated.SYSTEM.BalanceSheet.ClearRows", - "patchTarget": "Il2Cpp.BalanceSheet::void ClearRows()", - "strategy": "Postfix", - "description": "Interop target BalanceSheet.ClearRows", - "payloadSchema": { - "targetType": "BalanceSheet", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ClearRows" - }, - { - "legacy": "deprecated.SYSTEM.BalanceSheet.LoadFromSave", - "patchTarget": "Il2Cpp.BalanceSheet::void LoadFromSave()", - "strategy": "Postfix", - "description": "Interop target BalanceSheet.LoadFromSave", - "payloadSchema": { - "targetType": "BalanceSheet", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.FromSaveLoaded" - }, - { - "legacy": "deprecated.SYSTEM.BalanceSheet.RestoreRecord", - "patchTarget": "Il2Cpp.BalanceSheet::BalanceSheet.CustomerRecord RestoreRecord(CustomerRecordSaveData recData)", - "strategy": "Postfix", - "description": "Interop target BalanceSheet.RestoreRecord", - "payloadSchema": { - "targetType": "BalanceSheet", - "isStatic": false, - "recData": "CustomerRecordSaveData" - }, - "hookSubject": null, - "name": "greg.SYSTEM.RestoreRecord" - }, - { - "legacy": "deprecated.SYSTEM.BalanceSheetRow.SetData", - "patchTarget": "Il2Cpp.BalanceSheetRow::void SetData(string customerName, string revenue, string penalties, string total, Sprite customerLogo = null)", - "strategy": "Postfix", - "description": "Interop target BalanceSheetRow.SetData", - "payloadSchema": { - "targetType": "BalanceSheetRow", - "isStatic": false, - "customerName": "string", - "revenue": "string", - "penalties": "string", - "total": "string", - "customerLogo": "Sprite" - }, - "hookSubject": null, - "name": "greg.SYSTEM.DataSet" - }, - { - "legacy": "deprecated.SYSTEM.BalanceSheetRow.SetAsHeader", - "patchTarget": "Il2Cpp.BalanceSheetRow::void SetAsHeader()", - "strategy": "Postfix", - "description": "Interop target BalanceSheetRow.SetAsHeader", - "payloadSchema": { - "targetType": "BalanceSheetRow", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.AsHeaderSet" - }, - { - "legacy": "deprecated.SYSTEM.BalanceSheetRow.SetAsSalaryRow", - "patchTarget": "Il2Cpp.BalanceSheetRow::void SetAsSalaryRow(float salaryExpense)", - "strategy": "Postfix", - "description": "Interop target BalanceSheetRow.SetAsSalaryRow", - "payloadSchema": { - "targetType": "BalanceSheetRow", - "isStatic": false, - "salaryExpense": "float" - }, - "hookSubject": null, - "name": "greg.SYSTEM.AsSalaryRowSet" - }, - { - "legacy": "deprecated.SYSTEM.BalanceSheetRow.SetAsTotalRow", - "patchTarget": "Il2Cpp.BalanceSheetRow::void SetAsTotalRow(float revenue, float penalties, float total)", - "strategy": "Postfix", - "description": "Interop target BalanceSheetRow.SetAsTotalRow", - "payloadSchema": { - "targetType": "BalanceSheetRow", - "isStatic": false, - "revenue": "float", - "penalties": "float", - "total": "float" - }, - "hookSubject": null, - "name": "greg.SYSTEM.AsTotalRowSet" - }, - { - "legacy": "deprecated.SYSTEM.BalanceSheetRow.SetAsSectionTitle", - "patchTarget": "Il2Cpp.BalanceSheetRow::void SetAsSectionTitle(string title)", - "strategy": "Postfix", - "description": "Interop target BalanceSheetRow.SetAsSectionTitle", - "payloadSchema": { - "targetType": "BalanceSheetRow", - "isStatic": false, - "title": "string" - }, - "hookSubject": null, - "name": "greg.SYSTEM.AsSectionTitleSet" - }, - { - "legacy": "deprecated.SYSTEM.BalanceSheetRow.SetBackgroundColor", - "patchTarget": "Il2Cpp.BalanceSheetRow::void SetBackgroundColor(Color color)", - "strategy": "Postfix", - "description": "Interop target BalanceSheetRow.SetBackgroundColor", - "payloadSchema": { - "targetType": "BalanceSheetRow", - "isStatic": false, - "color": "Color" - }, - "hookSubject": null, - "name": "greg.SYSTEM.BackgroundColorSet" - }, - { - "legacy": "deprecated.NETWORK.CableIDComponent.BoxIl2CppObject", - "patchTarget": "Il2Cpp.CableIDComponent::Object BoxIl2CppObject()", - "strategy": "Postfix", - "description": "Interop target CableIDComponent.BoxIl2CppObject", - "payloadSchema": { - "targetType": "CableIDComponent", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "CableIDComponent", - "name": "greg.NETWORK.BoxIl2CppObject.CableIDComponent" - }, - { - "legacy": "deprecated.NETWORK.CableLink.Start", - "patchTarget": "Il2Cpp.CableLink::void Start()", - "strategy": "Postfix", - "description": "Interop target CableLink.Start", - "payloadSchema": { - "targetType": "CableLink", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "CableLink", - "name": "greg.NETWORK.ComponentInitialized.CableLink" - }, - { - "legacy": "deprecated.NETWORK.CableLink.SetConnectionSpeed", - "patchTarget": "Il2Cpp.CableLink::void SetConnectionSpeed(float speed)", - "strategy": "Postfix", - "description": "Interop target CableLink.SetConnectionSpeed", - "payloadSchema": { - "targetType": "CableLink", - "isStatic": false, - "speed": "float" - }, - "hookSubject": null, - "name": "greg.NETWORK.ConnectionSpeedSet" - }, - { - "legacy": "deprecated.NETWORK.CableLink.InsertSFP", - "patchTarget": "Il2Cpp.CableLink::void InsertSFP(float speed, int type, SFPModule module)", - "strategy": "Postfix", - "description": "Interop target CableLink.InsertSFP", - "payloadSchema": { - "targetType": "CableLink", - "isStatic": false, - "speed": "float", - "type": "int", - "module": "SFPModule" - }, - "hookSubject": null, - "name": "greg.NETWORK.InsertSFP" - }, - { - "legacy": "deprecated.NETWORK.CableLink.RemoveSFP", - "patchTarget": "Il2Cpp.CableLink::void RemoveSFP()", - "strategy": "Postfix", - "description": "Interop target CableLink.RemoveSFP", - "payloadSchema": { - "targetType": "CableLink", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.NETWORK.oveSFPRemoved" - }, - { - "legacy": "deprecated.NETWORK.CableLink.InteractOnClick", - "patchTarget": "Il2Cpp.CableLink::override void InteractOnClick()", - "strategy": "Postfix", - "description": "Interop target CableLink.InteractOnClick", - "payloadSchema": { - "targetType": "CableLink", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "CableLink", - "name": "greg.NETWORK.InteractOnClick.CableLink" - }, - { - "legacy": "deprecated.NETWORK.CableLink.IsAllowedToDoSecondAction", - "patchTarget": "Il2Cpp.CableLink::override bool IsAllowedToDoSecondAction()", - "strategy": "Postfix", - "description": "Interop target CableLink.IsAllowedToDoSecondAction", - "payloadSchema": { - "targetType": "CableLink", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.NETWORK.IsAllowedToDoSecondAction" - }, - { - "legacy": "deprecated.NETWORK.CableLink.SecondActionOnClick", - "patchTarget": "Il2Cpp.CableLink::override void SecondActionOnClick()", - "strategy": "Postfix", - "description": "Interop target CableLink.SecondActionOnClick", - "payloadSchema": { - "targetType": "CableLink", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.NETWORK.SecondActionOnClick" - }, - { - "legacy": "deprecated.NETWORK.CableLink.InteractOnHover", - "patchTarget": "Il2Cpp.CableLink::override void InteractOnHover(RaycastHit hit)", - "strategy": "Postfix", - "description": "Interop target CableLink.InteractOnHover", - "payloadSchema": { - "targetType": "CableLink", - "isStatic": false, - "hit": "RaycastHit", - "hookSubject": "string" - }, - "hookSubject": "CableLink_RaycastHithit", - "name": "greg.NETWORK.InteractOnHover.CableLink_RaycastHithit" - }, - { - "legacy": "deprecated.NETWORK.CableLink.OnHoverOver", - "patchTarget": "Il2Cpp.CableLink::override void OnHoverOver()", - "strategy": "Postfix", - "description": "Interop target CableLink.OnHoverOver", - "payloadSchema": { - "targetType": "CableLink", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.NETWORK.OnHoverOver" - }, - { - "legacy": "deprecated.NETWORK.CableLink.CreateRopeAttachPoint", - "patchTarget": "Il2Cpp.CableLink::void CreateRopeAttachPoint()", - "strategy": "Postfix", - "description": "Interop target CableLink.CreateRopeAttachPoint", - "payloadSchema": { - "targetType": "CableLink", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.NETWORK.CreateRopeAttachPoint" - }, - { - "legacy": "deprecated.NETWORK.CablePositions.Awake", - "patchTarget": "Il2Cpp.CablePositions::void Awake()", - "strategy": "Postfix", - "description": "Interop target CablePositions.Awake", - "payloadSchema": { - "targetType": "CablePositions", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "CablePositions_51054a547e", - "name": "greg.NETWORK.ComponentInitialized.CablePositions_51054a547e" - }, - { - "legacy": "deprecated.NETWORK.CablePositions.Start", - "patchTarget": "Il2Cpp.CablePositions::void Start()", - "strategy": "Postfix", - "description": "Interop target CablePositions.Start", - "payloadSchema": { - "targetType": "CablePositions", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "CablePositions_3d873a93df", - "name": "greg.NETWORK.ComponentInitialized.CablePositions_3d873a93df" - }, - { - "legacy": "deprecated.NETWORK.CablePositions.ClearAllCables", - "patchTarget": "Il2Cpp.CablePositions::void ClearAllCables()", - "strategy": "Postfix", - "description": "Interop target CablePositions.ClearAllCables", - "payloadSchema": { - "targetType": "CablePositions", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.NETWORK.ClearAllCables" - }, - { - "legacy": "deprecated.NETWORK.CablePositions.LoadCable", - "patchTarget": "Il2Cpp.CablePositions::void LoadCable(CableSaveData cableData)", - "strategy": "Postfix", - "description": "Interop target CablePositions.LoadCable", - "payloadSchema": { - "targetType": "CablePositions", - "isStatic": false, - "cableData": "CableSaveData" - }, - "hookSubject": null, - "name": "greg.NETWORK.CableLoaded" - }, - { - "legacy": "deprecated.NETWORK.CablePositions.CreateNewCable", - "patchTarget": "Il2Cpp.CablePositions::int CreateNewCable()", - "strategy": "Postfix", - "description": "Interop target CablePositions.CreateNewCable", - "payloadSchema": { - "targetType": "CablePositions", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.NETWORK.CreateNewCable" - }, - { - "legacy": "deprecated.NETWORK.CablePositions.CreateNewReverseCable", - "patchTarget": "Il2Cpp.CablePositions::int CreateNewReverseCable()", - "strategy": "Postfix", - "description": "Interop target CablePositions.CreateNewReverseCable", - "payloadSchema": { - "targetType": "CablePositions", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.NETWORK.CreateNewReverseCable" - }, - { - "legacy": "deprecated.NETWORK.CablePositions.AssignNewPosition", - "patchTarget": "Il2Cpp.CablePositions::void AssignNewPosition(int cableId, Transform linkTransform, bool isStartPoint = false, bool isEndPoint = false, CableLink.TypeOfLink typeOfLink = CableLink.TypeOfLink.None, string serverID = null)", - "strategy": "Postfix", - "description": "Interop target CablePositions.AssignNewPosition", - "payloadSchema": { - "targetType": "CablePositions", - "isStatic": false, - "cableId": "int", - "linkTransform": "Transform", - "isStartPoint": "bool", - "isEndPoint": "bool", - "typeOfLink": "CableLink.TypeOfLink", - "serverID": "string" - }, - "hookSubject": null, - "name": "greg.NETWORK.AssignNewPosition" - }, - { - "legacy": "deprecated.NETWORK.CablePositions.GenerateFinalPath", - "patchTarget": "Il2Cpp.CablePositions::void GenerateFinalPath(int cableId)", - "strategy": "Postfix", - "description": "Interop target CablePositions.GenerateFinalPath", - "payloadSchema": { - "targetType": "CablePositions", - "isStatic": false, - "cableId": "int" - }, - "hookSubject": null, - "name": "greg.NETWORK.GenerateFinalPath" - }, - { - "legacy": "deprecated.NETWORK.CablePositions.GenerateCornerBend", - "patchTarget": "Il2Cpp.CablePositions::IEnumerable GenerateCornerBend(Vector3 p_prev, Vector3 p_curr, Vector3 p_next, Transform t_curr)", - "strategy": "Postfix", - "description": "Interop target CablePositions.GenerateCornerBend", - "payloadSchema": { - "targetType": "CablePositions", - "isStatic": false, - "p_prev": "Vector3", - "p_curr": "Vector3", - "p_next": "Vector3", - "t_curr": "Transform" - }, - "hookSubject": null, - "name": "greg.NETWORK.GenerateCornerBend" - }, - { - "legacy": "deprecated.NETWORK.CablePositions.GenerateBentSegment", - "patchTarget": "Il2Cpp.CablePositions::IEnumerable GenerateBentSegment(Vector3 connectionPoint, Vector3 nextPoint, Transform linkTransform, bool isStart)", - "strategy": "Postfix", - "description": "Interop target CablePositions.GenerateBentSegment", - "payloadSchema": { - "targetType": "CablePositions", - "isStatic": false, - "connectionPoint": "Vector3", - "nextPoint": "Vector3", - "linkTransform": "Transform", - "isStart": "bool" - }, - "hookSubject": null, - "name": "greg.NETWORK.GenerateBentSegment" - }, - { - "legacy": "deprecated.NETWORK.CablePositions.RedrawCable", - "patchTarget": "Il2Cpp.CablePositions::void RedrawCable(int cableId)", - "strategy": "Postfix", - "description": "Interop target CablePositions.RedrawCable", - "payloadSchema": { - "targetType": "CablePositions", - "isStatic": false, - "cableId": "int" - }, - "hookSubject": null, - "name": "greg.NETWORK.RedrawCable" - }, - { - "legacy": "deprecated.NETWORK.CablePositions.CreateTubeMesh", - "patchTarget": "Il2Cpp.CablePositions::Mesh CreateTubeMesh(List path)", - "strategy": "Postfix", - "description": "Interop target CablePositions.CreateTubeMesh", - "payloadSchema": { - "targetType": "CablePositions", - "isStatic": false, - "path": "List" - }, - "hookSubject": null, - "name": "greg.NETWORK.CreateTubeMesh" - }, - { - "legacy": "deprecated.NETWORK.CablePositions.RemovePosition", - "patchTarget": "Il2Cpp.CablePositions::void RemovePosition(int cableId)", - "strategy": "Postfix", - "description": "Interop target CablePositions.RemovePosition", - "payloadSchema": { - "targetType": "CablePositions", - "isStatic": false, - "cableId": "int" - }, - "hookSubject": null, - "name": "greg.NETWORK.ovePositionRemoved" - }, - { - "legacy": "deprecated.NETWORK.CablePositions.RemoveLastPosition", - "patchTarget": "Il2Cpp.CablePositions::Transform RemoveLastPosition(int cableId)", - "strategy": "Postfix", - "description": "Interop target CablePositions.RemoveLastPosition", - "payloadSchema": { - "targetType": "CablePositions", - "isStatic": false, - "cableId": "int" - }, - "hookSubject": null, - "name": "greg.NETWORK.oveLastPositionRemoved" - }, - { - "legacy": "deprecated.NETWORK.CablePositions.AssignEntity", - "patchTarget": "Il2Cpp.CablePositions::void AssignEntity(int cableId, Entity entity)", - "strategy": "Postfix", - "description": "Interop target CablePositions.AssignEntity", - "payloadSchema": { - "targetType": "CablePositions", - "isStatic": false, - "cableId": "int", - "entity": "Entity" - }, - "hookSubject": null, - "name": "greg.NETWORK.AssignEntity" - }, - { - "legacy": "deprecated.NETWORK.CablePositions.IsCableComplete", - "patchTarget": "Il2Cpp.CablePositions::bool IsCableComplete(int cableId)", - "strategy": "Postfix", - "description": "Interop target CablePositions.IsCableComplete", - "payloadSchema": { - "targetType": "CablePositions", - "isStatic": false, - "cableId": "int" - }, - "hookSubject": null, - "name": "greg.NETWORK.IsCableComplete" - }, - { - "legacy": "deprecated.NETWORK.CableSpinner.Start", - "patchTarget": "Il2Cpp.CableSpinner::void Start()", - "strategy": "Postfix", - "description": "Interop target CableSpinner.Start", - "payloadSchema": { - "targetType": "CableSpinner", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "CableSpinner", - "name": "greg.NETWORK.ComponentInitialized.CableSpinner" - }, - { - "legacy": "deprecated.NETWORK.CableSpinner.ApplyColor", - "patchTarget": "Il2Cpp.CableSpinner::void ApplyColor(Color color, string rgbString)", - "strategy": "Postfix", - "description": "Interop target CableSpinner.ApplyColor", - "payloadSchema": { - "targetType": "CableSpinner", - "isStatic": false, - "color": "Color", - "rgbString": "string" - }, - "hookSubject": null, - "name": "greg.NETWORK.ApplyColor" - }, - { - "legacy": "deprecated.NETWORK.CableSpinner.LoadSavedColor", - "patchTarget": "Il2Cpp.CableSpinner::void LoadSavedColor()", - "strategy": "Postfix", - "description": "Interop target CableSpinner.LoadSavedColor", - "payloadSchema": { - "targetType": "CableSpinner", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.NETWORK.SavedColorLoaded" - }, - { - "legacy": "deprecated.NETWORK.CableSpinner.InteractOnClick", - "patchTarget": "Il2Cpp.CableSpinner::override void InteractOnClick()", - "strategy": "Postfix", - "description": "Interop target CableSpinner.InteractOnClick", - "payloadSchema": { - "targetType": "CableSpinner", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "CableSpinner", - "name": "greg.NETWORK.InteractOnClick.CableSpinner" - }, - { - "legacy": "deprecated.NETWORK.CableSpinner.LowerAmountOfCable", - "patchTarget": "Il2Cpp.CableSpinner::void LowerAmountOfCable(float length)", - "strategy": "Postfix", - "description": "Interop target CableSpinner.LowerAmountOfCable", - "payloadSchema": { - "targetType": "CableSpinner", - "isStatic": false, - "length": "float" - }, - "hookSubject": null, - "name": "greg.NETWORK.LowerAmountOfCable" - }, - { - "legacy": "deprecated.NETWORK.CableSpinner.UpdateText", - "patchTarget": "Il2Cpp.CableSpinner::void UpdateText()", - "strategy": "Postfix", - "description": "Interop target CableSpinner.UpdateText", - "payloadSchema": { - "targetType": "CableSpinner", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.NETWORK.TextChanged" - }, - { - "legacy": "deprecated.NETWORK.CableSpinner.UpdateCurrentLength", - "patchTarget": "Il2Cpp.CableSpinner::void UpdateCurrentLength(float length)", - "strategy": "Postfix", - "description": "Interop target CableSpinner.UpdateCurrentLength", - "payloadSchema": { - "targetType": "CableSpinner", - "isStatic": false, - "length": "float" - }, - "hookSubject": null, - "name": "greg.NETWORK.CurrentLengthChanged" - }, - { - "legacy": "deprecated.NETWORK.CableSpinner.IsCableLenghtEnough", - "patchTarget": "Il2Cpp.CableSpinner::bool IsCableLenghtEnough()", - "strategy": "Postfix", - "description": "Interop target CableSpinner.IsCableLenghtEnough", - "payloadSchema": { - "targetType": "CableSpinner", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.NETWORK.IsCableLenghtEnough" - }, - { - "legacy": "deprecated.NETWORK.CableSpinner.DropObject", - "patchTarget": "Il2Cpp.CableSpinner::override void DropObject()", - "strategy": "Postfix", - "description": "Interop target CableSpinner.DropObject", - "payloadSchema": { - "targetType": "CableSpinner", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.NETWORK.DroppedObject" - }, - { - "legacy": "deprecated.SYSTEM.ChatController.OnEnable", - "patchTarget": "Il2Cpp.ChatController::void OnEnable()", - "strategy": "Postfix", - "description": "Interop target ChatController.OnEnable", - "payloadSchema": { - "targetType": "ChatController", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "ChatController", - "name": "greg.SYSTEM.ComponentEnabled.ChatController" - }, - { - "legacy": "deprecated.SYSTEM.ChatController.OnDisable", - "patchTarget": "Il2Cpp.ChatController::void OnDisable()", - "strategy": "Postfix", - "description": "Interop target ChatController.OnDisable", - "payloadSchema": { - "targetType": "ChatController", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "ChatController", - "name": "greg.SYSTEM.ComponentDisabled.ChatController" - }, - { - "legacy": "deprecated.SYSTEM.ChatController.AddToChatOutput", - "patchTarget": "Il2Cpp.ChatController::void AddToChatOutput(string newText)", - "strategy": "Postfix", - "description": "Interop target ChatController.AddToChatOutput", - "payloadSchema": { - "targetType": "ChatController", - "isStatic": false, - "newText": "string" - }, - "hookSubject": null, - "name": "greg.SYSTEM.ToChatOutputAdded" - }, - { - "legacy": "deprecated.SYSTEM.CheckIfTouchingWall.Awake", - "patchTarget": "Il2Cpp.CheckIfTouchingWall::void Awake()", - "strategy": "Postfix", - "description": "Interop target CheckIfTouchingWall.Awake", - "payloadSchema": { - "targetType": "CheckIfTouchingWall", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "CheckIfTouchingWall_309def7b2d", - "name": "greg.SYSTEM.ComponentInitialized.CheckIfTouchingWall_309def7b2d" - }, - { - "legacy": "deprecated.SYSTEM.CheckIfTouchingWall.Start", - "patchTarget": "Il2Cpp.CheckIfTouchingWall::void Start()", - "strategy": "Postfix", - "description": "Interop target CheckIfTouchingWall.Start", - "payloadSchema": { - "targetType": "CheckIfTouchingWall", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "CheckIfTouchingWall_9ff7e468a1", - "name": "greg.SYSTEM.ComponentInitialized.CheckIfTouchingWall_9ff7e468a1" - }, - { - "legacy": "deprecated.SYSTEM.CheckIfTouchingWall.OnDestroy", - "patchTarget": "Il2Cpp.CheckIfTouchingWall::void OnDestroy()", - "strategy": "Postfix", - "description": "Interop target CheckIfTouchingWall.OnDestroy", - "payloadSchema": { - "targetType": "CheckIfTouchingWall", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "CheckIfTouchingWall", - "name": "greg.SYSTEM.OnDestroy.CheckIfTouchingWall" - }, - { - "legacy": "deprecated.SYSTEM.CheckIfTouchingWall.PerformOverlapCheck", - "patchTarget": "Il2Cpp.CheckIfTouchingWall::void PerformOverlapCheck()", - "strategy": "Postfix", - "description": "Interop target CheckIfTouchingWall.PerformOverlapCheck", - "payloadSchema": { - "targetType": "CheckIfTouchingWall", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.PerformOverlapCheck" - }, - { - "legacy": "deprecated.SYSTEM.CheckIfTouchingWall.DelayedOverlapCheck", - "patchTarget": "Il2Cpp.CheckIfTouchingWall::IEnumerator DelayedOverlapCheck()", - "strategy": "Postfix", - "description": "Interop target CheckIfTouchingWall.DelayedOverlapCheck", - "payloadSchema": { - "targetType": "CheckIfTouchingWall", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.DelayedOverlapCheck" - }, - { - "legacy": "deprecated.SYSTEM.CheckIfTouchingWall.SetRenderersEnabled", - "patchTarget": "Il2Cpp.CheckIfTouchingWall::void SetRenderersEnabled(bool isEnabled)", - "strategy": "Postfix", - "description": "Interop target CheckIfTouchingWall.SetRenderersEnabled", - "payloadSchema": { - "targetType": "CheckIfTouchingWall", - "isStatic": false, - "isEnabled": "bool" - }, - "hookSubject": null, - "name": "greg.SYSTEM.RenderersEnabledSet" - }, - { - "legacy": "deprecated.SYSTEM.ColorSerializationSurrogate.SetObjectData", - "patchTarget": "Il2Cpp.ColorSerializationSurrogate::virtual Object SetObjectData(Object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector)", - "strategy": "Postfix", - "description": "Interop target ColorSerializationSurrogate.SetObjectData", - "payloadSchema": { - "targetType": "ColorSerializationSurrogate", - "isStatic": false, - "obj": "Object", - "info": "SerializationInfo", - "context": "StreamingContext", - "selector": "ISurrogateSelector", - "hookSubject": "string" - }, - "hookSubject": "ColorSerializationSurrogate_ObjectobjSerializationInfoinfoStreamingC", - "name": "greg.SYSTEM.ObjectDataSet.ColorSerializationSurrogate_ObjectobjSerializationInfoinfoStreamingC" - }, - { - "legacy": "deprecated.SYSTEM.ComputerShop.Awake", - "patchTarget": "Il2Cpp.ComputerShop::override void Awake()", - "strategy": "Postfix", - "description": "Interop target ComputerShop.Awake", - "payloadSchema": { - "targetType": "ComputerShop", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "ComputerShop", - "name": "greg.SYSTEM.ComponentInitialized.ComputerShop" - }, - { - "legacy": "deprecated.SYSTEM.ComputerShop.InteractOnClick", - "patchTarget": "Il2Cpp.ComputerShop::override void InteractOnClick()", - "strategy": "Postfix", - "description": "Interop target ComputerShop.InteractOnClick", - "payloadSchema": { - "targetType": "ComputerShop", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "ComputerShop", - "name": "greg.SYSTEM.InteractOnClick.ComputerShop" - }, - { - "legacy": "deprecated.SYSTEM.ComputerShop.ButtonShopScreen", - "patchTarget": "Il2Cpp.ComputerShop::void ButtonShopScreen()", - "strategy": "Postfix", - "description": "Interop target ComputerShop.ButtonShopScreen", - "payloadSchema": { - "targetType": "ComputerShop", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ButtonShopScreen" - }, - { - "legacy": "deprecated.SYSTEM.ComputerShop.ButtonNetworkMap", - "patchTarget": "Il2Cpp.ComputerShop::void ButtonNetworkMap()", - "strategy": "Postfix", - "description": "Interop target ComputerShop.ButtonNetworkMap", - "payloadSchema": { - "targetType": "ComputerShop", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ButtonNetworkMap" - }, - { - "legacy": "deprecated.SYSTEM.ComputerShop.ButtonAssetManagementScreen", - "patchTarget": "Il2Cpp.ComputerShop::void ButtonAssetManagementScreen()", - "strategy": "Postfix", - "description": "Interop target ComputerShop.ButtonAssetManagementScreen", - "payloadSchema": { - "targetType": "ComputerShop", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ButtonAssetManagementScreen" - }, - { - "legacy": "deprecated.SYSTEM.ComputerShop.ButtonBalanceSheetScreen", - "patchTarget": "Il2Cpp.ComputerShop::void ButtonBalanceSheetScreen()", - "strategy": "Postfix", - "description": "Interop target ComputerShop.ButtonBalanceSheetScreen", - "payloadSchema": { - "targetType": "ComputerShop", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ButtonBalanceSheetScreen" - }, - { - "legacy": "deprecated.SYSTEM.ComputerShop.ButtonHireScreen", - "patchTarget": "Il2Cpp.ComputerShop::void ButtonHireScreen()", - "strategy": "Postfix", - "description": "Interop target ComputerShop.ButtonHireScreen", - "payloadSchema": { - "targetType": "ComputerShop", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ButtonHireScreen" - }, - { - "legacy": "deprecated.SYSTEM.ComputerShop.ButtonReturnMainScreen", - "patchTarget": "Il2Cpp.ComputerShop::void ButtonReturnMainScreen()", - "strategy": "Postfix", - "description": "Interop target ComputerShop.ButtonReturnMainScreen", - "payloadSchema": { - "targetType": "ComputerShop", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ButtonReturnMainScreen" - }, - { - "legacy": "deprecated.SYSTEM.ComputerShop.InteractOnHover", - "patchTarget": "Il2Cpp.ComputerShop::override void InteractOnHover(RaycastHit hit)", - "strategy": "Postfix", - "description": "Interop target ComputerShop.InteractOnHover", - "payloadSchema": { - "targetType": "ComputerShop", - "isStatic": false, - "hit": "RaycastHit", - "hookSubject": "string" - }, - "hookSubject": "ComputerShop_RaycastHithit", - "name": "greg.SYSTEM.InteractOnHover.ComputerShop_RaycastHithit" - }, - { - "legacy": "deprecated.SYSTEM.ComputerShop.OnHoverOver", - "patchTarget": "Il2Cpp.ComputerShop::override void OnHoverOver()", - "strategy": "Postfix", - "description": "Interop target ComputerShop.OnHoverOver", - "payloadSchema": { - "targetType": "ComputerShop", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "ComputerShop", - "name": "greg.SYSTEM.OnHoverOver.ComputerShop" - }, - { - "legacy": "deprecated.SYSTEM.ComputerShop.FreeUpSpawnPoint", - "patchTarget": "Il2Cpp.ComputerShop::void FreeUpSpawnPoint(int spawnIndex)", - "strategy": "Postfix", - "description": "Interop target ComputerShop.FreeUpSpawnPoint", - "payloadSchema": { - "targetType": "ComputerShop", - "isStatic": false, - "spawnIndex": "int" - }, - "hookSubject": null, - "name": "greg.SYSTEM.FreeUpSpawnPoint" - }, - { - "legacy": "deprecated.SYSTEM.ComputerShop.ButtonBuyShopItem", - "patchTarget": "Il2Cpp.ComputerShop::void ButtonBuyShopItem(int itemID, int price, PlayerManager.ObjectInHand itemType, string displayName, bool isCustomColor = false)", - "strategy": "Postfix", - "description": "Interop target ComputerShop.ButtonBuyShopItem", - "payloadSchema": { - "targetType": "ComputerShop", - "isStatic": false, - "itemID": "int", - "price": "int", - "itemType": "PlayerManager.ObjectInHand", - "displayName": "string", - "isCustomColor": "bool" - }, - "hookSubject": null, - "name": "greg.SYSTEM.ButtonBuyShopItem" - }, - { - "legacy": "deprecated.SYSTEM.ComputerShop.BuyNewItem", - "patchTarget": "Il2Cpp.ComputerShop::void BuyNewItem(int itemID, int price, PlayerManager.ObjectInHand itemType, string displayName)", - "strategy": "Postfix", - "description": "Interop target ComputerShop.BuyNewItem", - "payloadSchema": { - "targetType": "ComputerShop", - "isStatic": false, - "itemID": "int", - "price": "int", - "itemType": "PlayerManager.ObjectInHand", - "displayName": "string" - }, - "hookSubject": null, - "name": "greg.SYSTEM.NewItemPurchased" - }, - { - "legacy": "deprecated.SYSTEM.ComputerShop.SpawnNewCartItem", - "patchTarget": "Il2Cpp.ComputerShop::void SpawnNewCartItem(int itemID, int price, PlayerManager.ObjectInHand itemType, string displayName, Nullable chosenColor)", - "strategy": "Postfix", - "description": "Interop target ComputerShop.SpawnNewCartItem", - "payloadSchema": { - "targetType": "ComputerShop", - "isStatic": false, - "itemID": "int", - "price": "int", - "itemType": "PlayerManager.ObjectInHand", - "displayName": "string", - "chosenColor": "Nullable" - }, - "hookSubject": null, - "name": "greg.SYSTEM.NewCartItemSpawned" - }, - { - "legacy": "deprecated.SYSTEM.ComputerShop.BuyAnotherItem", - "patchTarget": "Il2Cpp.ComputerShop::void BuyAnotherItem(int itemID, int price, PlayerManager.ObjectInHand itemType, ShopCartItem cartItem)", - "strategy": "Postfix", - "description": "Interop target ComputerShop.BuyAnotherItem", - "payloadSchema": { - "targetType": "ComputerShop", - "isStatic": false, - "itemID": "int", - "price": "int", - "itemType": "PlayerManager.ObjectInHand", - "cartItem": "ShopCartItem" - }, - "hookSubject": null, - "name": "greg.SYSTEM.AnotherItemPurchased" - }, - { - "legacy": "deprecated.SYSTEM.ComputerShop.SpawnPhysicalItem", - "patchTarget": "Il2Cpp.ComputerShop::Nullable SpawnPhysicalItem(GameObject prefab, int price, PlayerManager.ObjectInHand itemType)", - "strategy": "Postfix", - "description": "Interop target ComputerShop.SpawnPhysicalItem", - "payloadSchema": { - "targetType": "ComputerShop", - "isStatic": false, - "prefab": "GameObject", - "price": "int", - "itemType": "PlayerManager.ObjectInHand" - }, - "hookSubject": null, - "name": "greg.SYSTEM.PhysicalItemSpawned" - }, - { - "legacy": "deprecated.SYSTEM.ComputerShop.HandleObjectives", - "patchTarget": "Il2Cpp.ComputerShop::void HandleObjectives(PlayerManager.ObjectInHand itemType)", - "strategy": "Postfix", - "description": "Interop target ComputerShop.HandleObjectives", - "payloadSchema": { - "targetType": "ComputerShop", - "isStatic": false, - "itemType": "PlayerManager.ObjectInHand" - }, - "hookSubject": null, - "name": "greg.SYSTEM.HandleObjectives" - }, - { - "legacy": "deprecated.SYSTEM.ComputerShop.RemoveSpawnedItem", - "patchTarget": "Il2Cpp.ComputerShop::void RemoveSpawnedItem(int uid)", - "strategy": "Postfix", - "description": "Interop target ComputerShop.RemoveSpawnedItem", - "payloadSchema": { - "targetType": "ComputerShop", - "isStatic": false, - "uid": "int" - }, - "hookSubject": null, - "name": "greg.SYSTEM.oveSpawnedItemRemoved" - }, - { - "legacy": "deprecated.SYSTEM.ComputerShop.RemoveCartUIItem", - "patchTarget": "Il2Cpp.ComputerShop::void RemoveCartUIItem(ShopCartItem cartItem)", - "strategy": "Postfix", - "description": "Interop target ComputerShop.RemoveCartUIItem", - "payloadSchema": { - "targetType": "ComputerShop", - "isStatic": false, - "cartItem": "ShopCartItem" - }, - "hookSubject": null, - "name": "greg.SYSTEM.oveCartUIItemRemoved" - }, - { - "legacy": "deprecated.SYSTEM.ComputerShop.SelectNextAvailable", - "patchTarget": "Il2Cpp.ComputerShop::void SelectNextAvailable(int removedIndex)", - "strategy": "Postfix", - "description": "Interop target ComputerShop.SelectNextAvailable", - "payloadSchema": { - "targetType": "ComputerShop", - "isStatic": false, - "removedIndex": "int" - }, - "hookSubject": null, - "name": "greg.SYSTEM.SelectNextAvailable" - }, - { - "legacy": "deprecated.SYSTEM.ComputerShop.UpdateCartTotal", - "patchTarget": "Il2Cpp.ComputerShop::void UpdateCartTotal()", - "strategy": "Postfix", - "description": "Interop target ComputerShop.UpdateCartTotal", - "payloadSchema": { - "targetType": "ComputerShop", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.CartTotalChanged" - }, - { - "legacy": "deprecated.SYSTEM.ComputerShop.ButtonCheckOut", - "patchTarget": "Il2Cpp.ComputerShop::void ButtonCheckOut()", - "strategy": "Postfix", - "description": "Interop target ComputerShop.ButtonCheckOut", - "payloadSchema": { - "targetType": "ComputerShop", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ButtonCheckOut" - }, - { - "legacy": "deprecated.SYSTEM.ComputerShop.ClearTrackingWithoutDestroying", - "patchTarget": "Il2Cpp.ComputerShop::void ClearTrackingWithoutDestroying()", - "strategy": "Postfix", - "description": "Interop target ComputerShop.ClearTrackingWithoutDestroying", - "payloadSchema": { - "targetType": "ComputerShop", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ClearTrackingWithoutDestroying" - }, - { - "legacy": "deprecated.SYSTEM.ComputerShop.OpenColorPicker", - "patchTarget": "Il2Cpp.ComputerShop::void OpenColorPicker()", - "strategy": "Postfix", - "description": "Interop target ComputerShop.OpenColorPicker", - "payloadSchema": { - "targetType": "ComputerShop", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.OpenColorPicker" - }, - { - "legacy": "deprecated.SYSTEM.ComputerShop.ButtonChosenColor", - "patchTarget": "Il2Cpp.ComputerShop::void ButtonChosenColor()", - "strategy": "Postfix", - "description": "Interop target ComputerShop.ButtonChosenColor", - "payloadSchema": { - "targetType": "ComputerShop", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ButtonChosenColor" - }, - { - "legacy": "deprecated.SYSTEM.ComputerShop.ButtonCancelColorPicker", - "patchTarget": "Il2Cpp.ComputerShop::void ButtonCancelColorPicker()", - "strategy": "Postfix", - "description": "Interop target ComputerShop.ButtonCancelColorPicker", - "payloadSchema": { - "targetType": "ComputerShop", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ButtonCancelColorPicker" - }, - { - "legacy": "deprecated.SYSTEM.ComputerShop.ApplyColorToSpawnedItem", - "patchTarget": "Il2Cpp.ComputerShop::void ApplyColorToSpawnedItem(int uid, Color color, PlayerManager.ObjectInHand itemType)", - "strategy": "Postfix", - "description": "Interop target ComputerShop.ApplyColorToSpawnedItem", - "payloadSchema": { - "targetType": "ComputerShop", - "isStatic": false, - "uid": "int", - "color": "Color", - "itemType": "PlayerManager.ObjectInHand" - }, - "hookSubject": null, - "name": "greg.SYSTEM.ApplyColorToSpawnedItem" - }, - { - "legacy": "deprecated.SYSTEM.ComputerShop.ButtonClear", - "patchTarget": "Il2Cpp.ComputerShop::void ButtonClear()", - "strategy": "Postfix", - "description": "Interop target ComputerShop.ButtonClear", - "payloadSchema": { - "targetType": "ComputerShop", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ButtonClear" - }, - { - "legacy": "deprecated.SYSTEM.ComputerShop.ButtonCancel", - "patchTarget": "Il2Cpp.ComputerShop::void ButtonCancel()", - "strategy": "Postfix", - "description": "Interop target ComputerShop.ButtonCancel", - "payloadSchema": { - "targetType": "ComputerShop", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ButtonCancel" - }, - { - "legacy": "deprecated.SYSTEM.ComputerShop.DestroyAllSpawnedItems", - "patchTarget": "Il2Cpp.ComputerShop::void DestroyAllSpawnedItems()", - "strategy": "Postfix", - "description": "Interop target ComputerShop.DestroyAllSpawnedItems", - "payloadSchema": { - "targetType": "ComputerShop", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.DestroyAllSpawnedItems" - }, - { - "legacy": "deprecated.SYSTEM.ComputerShop.CleanUpShop", - "patchTarget": "Il2Cpp.ComputerShop::void CleanUpShop()", - "strategy": "Postfix", - "description": "Interop target ComputerShop.CleanUpShop", - "payloadSchema": { - "targetType": "ComputerShop", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.CleanUpShop" - }, - { - "legacy": "deprecated.SYSTEM.ComputerShop.CloseShop", - "patchTarget": "Il2Cpp.ComputerShop::void CloseShop()", - "strategy": "Postfix", - "description": "Interop target ComputerShop.CloseShop", - "payloadSchema": { - "targetType": "ComputerShop", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.CloseShop" - }, - { - "legacy": "deprecated.SYSTEM.ComputerShop.UnlockFromSave", - "patchTarget": "Il2Cpp.ComputerShop::void UnlockFromSave(Dictionary savedStates)", - "strategy": "Postfix", - "description": "Interop target ComputerShop.UnlockFromSave", - "payloadSchema": { - "targetType": "ComputerShop", - "isStatic": false, - "savedStates": "Dictionary" - }, - "hookSubject": null, - "name": "greg.SYSTEM.UnlockFromSave" - }, - { - "legacy": "deprecated.SYSTEM.ComputerShop.OnLoad", - "patchTarget": "Il2Cpp.ComputerShop::void OnLoad()", - "strategy": "Postfix", - "description": "Interop target ComputerShop.OnLoad", - "payloadSchema": { - "targetType": "ComputerShop", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "ComputerShop", - "name": "greg.SYSTEM.OnLoad.ComputerShop" - }, - { - "legacy": "deprecated.SYSTEM.ComputerShop.OnDestroy", - "patchTarget": "Il2Cpp.ComputerShop::void OnDestroy()", - "strategy": "Postfix", - "description": "Interop target ComputerShop.OnDestroy", - "payloadSchema": { - "targetType": "ComputerShop", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "ComputerShop", - "name": "greg.SYSTEM.OnDestroy.ComputerShop" - }, - { - "legacy": "deprecated.CUSTOMER.CustomerBase.Awake", - "patchTarget": "Il2Cpp.CustomerBase::void Awake()", - "strategy": "Postfix", - "description": "Interop target CustomerBase.Awake", - "payloadSchema": { - "targetType": "CustomerBase", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "CustomerBase_fb56303671", - "name": "greg.CUSTOMER.ComponentInitialized.CustomerBase_fb56303671" - }, - { - "legacy": "deprecated.CUSTOMER.CustomerBase.Start", - "patchTarget": "Il2Cpp.CustomerBase::void Start()", - "strategy": "Postfix", - "description": "Interop target CustomerBase.Start", - "payloadSchema": { - "targetType": "CustomerBase", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "CustomerBase_91fde31efa", - "name": "greg.CUSTOMER.ComponentInitialized.CustomerBase_91fde31efa" - }, - { - "legacy": "deprecated.CUSTOMER.CustomerBase.CheckIfAppRequirementsAreMet", - "patchTarget": "Il2Cpp.CustomerBase::IEnumerator CheckIfAppRequirementsAreMet()", - "strategy": "Prefix+Postfix", - "description": "Interop target CustomerBase.CheckIfAppRequirementsAreMet", - "payloadSchema": { - "targetType": "CustomerBase", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.CUSTOMER.CheckIfAppRequirementsAreMet" - }, - { - "legacy": "deprecated.CUSTOMER.CustomerBase.UpdateMoney", - "patchTarget": "Il2Cpp.CustomerBase::IEnumerator UpdateMoney()", - "strategy": "Postfix", - "description": "Interop target CustomerBase.UpdateMoney", - "payloadSchema": { - "targetType": "CustomerBase", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.CUSTOMER.MoneyChanged" - }, - { - "legacy": "deprecated.CUSTOMER.CustomerBase.AreAllAppRequirementsMet", - "patchTarget": "Il2Cpp.CustomerBase::bool AreAllAppRequirementsMet()", - "strategy": "Postfix", - "description": "Interop target CustomerBase.AreAllAppRequirementsMet", - "payloadSchema": { - "targetType": "CustomerBase", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.CUSTOMER.AreAllAppRequirementsMet" - }, - { - "legacy": "deprecated.CUSTOMER.CustomerBase.UpdateCustomerServerCountAndSpeed", - "patchTarget": "Il2Cpp.CustomerBase::void UpdateCustomerServerCountAndSpeed(int count, float speed)", - "strategy": "Postfix", - "description": "Interop target CustomerBase.UpdateCustomerServerCountAndSpeed", - "payloadSchema": { - "targetType": "CustomerBase", - "isStatic": false, - "count": "int", - "speed": "float" - }, - "hookSubject": null, - "name": "greg.CUSTOMER.CustomerServerCountAndSpeedChanged" - }, - { - "legacy": "deprecated.CUSTOMER.CustomerBase.AddAppPerformance", - "patchTarget": "Il2Cpp.CustomerBase::void AddAppPerformance(int appID, float speed)", - "strategy": "Postfix", - "description": "Interop target CustomerBase.AddAppPerformance", - "payloadSchema": { - "targetType": "CustomerBase", - "isStatic": false, - "appID": "int", - "speed": "float" - }, - "hookSubject": null, - "name": "greg.CUSTOMER.AppPerformanceAdded" - }, - { - "legacy": "deprecated.CUSTOMER.CustomerBase.ResetAllAppSpeeds", - "patchTarget": "Il2Cpp.CustomerBase::void ResetAllAppSpeeds()", - "strategy": "Postfix", - "description": "Interop target CustomerBase.ResetAllAppSpeeds", - "payloadSchema": { - "targetType": "CustomerBase", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.CUSTOMER.ResetAllAppSpeeds" - }, - { - "legacy": "deprecated.CUSTOMER.CustomerBase.IsIPPresent", - "patchTarget": "Il2Cpp.CustomerBase::bool IsIPPresent(string ip)", - "strategy": "Postfix", - "description": "Interop target CustomerBase.IsIPPresent", - "payloadSchema": { - "targetType": "CustomerBase", - "isStatic": false, - "ip": "string" - }, - "hookSubject": null, - "name": "greg.CUSTOMER.IsIPPresent" - }, - { - "legacy": "deprecated.CUSTOMER.CustomerBase.SetUpBase", - "patchTarget": "Il2Cpp.CustomerBase::void SetUpBase(CustomerItem customerItem, CustomerBaseSaveData saveData = null)", - "strategy": "Postfix", - "description": "Interop target CustomerBase.SetUpBase", - "payloadSchema": { - "targetType": "CustomerBase", - "isStatic": false, - "customerItem": "CustomerItem", - "saveData": "CustomerBaseSaveData" - }, - "hookSubject": null, - "name": "greg.CUSTOMER.UpBaseSet" - }, - { - "legacy": "deprecated.CUSTOMER.CustomerBase.SetUpApp", - "patchTarget": "Il2Cpp.CustomerBase::void SetUpApp(int appID, int difficulty, CustomerBaseSaveData saveData = null)", - "strategy": "Postfix", - "description": "Interop target CustomerBase.SetUpApp", - "payloadSchema": { - "targetType": "CustomerBase", - "isStatic": false, - "appID": "int", - "difficulty": "int", - "saveData": "CustomerBaseSaveData" - }, - "hookSubject": null, - "name": "greg.CUSTOMER.UpAppSet" - }, - { - "legacy": "deprecated.CUSTOMER.CustomerBase.DelayedAppDoorOpening", - "patchTarget": "Il2Cpp.CustomerBase::IEnumerator DelayedAppDoorOpening(int appID)", - "strategy": "Postfix", - "description": "Interop target CustomerBase.DelayedAppDoorOpening", - "payloadSchema": { - "targetType": "CustomerBase", - "isStatic": false, - "appID": "int" - }, - "hookSubject": null, - "name": "greg.CUSTOMER.DelayedAppDoorOpening" - }, - { - "legacy": "deprecated.CUSTOMER.CustomerBase.AppText", - "patchTarget": "Il2Cpp.CustomerBase::string AppText(int lastUsedApp)", - "strategy": "Postfix", - "description": "Interop target CustomerBase.AppText", - "payloadSchema": { - "targetType": "CustomerBase", - "isStatic": false, - "lastUsedApp": "int", - "hookSubject": "string" - }, - "hookSubject": "CustomerBase_intlastUsedApp", - "name": "greg.CUSTOMER.AppText.CustomerBase_intlastUsedApp" - }, - { - "legacy": "deprecated.CUSTOMER.CustomerBase.AppText", - "patchTarget": "Il2Cpp.CustomerBase::string AppText(int appID, string subnet)", - "strategy": "Postfix", - "description": "Interop target CustomerBase.AppText", - "payloadSchema": { - "targetType": "CustomerBase", - "isStatic": false, - "appID": "int", - "subnet": "string", - "hookSubject": "string" - }, - "hookSubject": "CustomerBase_intappIDstringsubnet", - "name": "greg.CUSTOMER.AppText.CustomerBase_intappIDstringsubnet" - }, - { - "legacy": "deprecated.CUSTOMER.CustomerBase.UpdateSpeedOnCustomerBaseApp", - "patchTarget": "Il2Cpp.CustomerBase::void UpdateSpeedOnCustomerBaseApp(int appID, float speed)", - "strategy": "Postfix", - "description": "Interop target CustomerBase.UpdateSpeedOnCustomerBaseApp", - "payloadSchema": { - "targetType": "CustomerBase", - "isStatic": false, - "appID": "int", - "speed": "float" - }, - "hookSubject": null, - "name": "greg.CUSTOMER.SpeedOnCustomerBaseAppChanged" - }, - { - "legacy": "deprecated.CUSTOMER.CustomerBase.LoadData", - "patchTarget": "Il2Cpp.CustomerBase::void LoadData(CustomerBaseSaveData data)", - "strategy": "Postfix", - "description": "Interop target CustomerBase.LoadData", - "payloadSchema": { - "targetType": "CustomerBase", - "isStatic": false, - "data": "CustomerBaseSaveData" - }, - "hookSubject": null, - "name": "greg.CUSTOMER.DataLoaded" - }, - { - "legacy": "deprecated.CUSTOMER.CustomerBaseDoor.Awake", - "patchTarget": "Il2Cpp.CustomerBaseDoor::override void Awake()", - "strategy": "Postfix", - "description": "Interop target CustomerBaseDoor.Awake", - "payloadSchema": { - "targetType": "CustomerBaseDoor", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "CustomerBaseDoor", - "name": "greg.CUSTOMER.ComponentInitialized.CustomerBaseDoor" - }, - { - "legacy": "deprecated.CUSTOMER.CustomerBaseDoor.InteractOnClick", - "patchTarget": "Il2Cpp.CustomerBaseDoor::override void InteractOnClick()", - "strategy": "Postfix", - "description": "Interop target CustomerBaseDoor.InteractOnClick", - "payloadSchema": { - "targetType": "CustomerBaseDoor", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.CUSTOMER.InteractOnClick" - }, - { - "legacy": "deprecated.CUSTOMER.CustomerBaseDoor.InteractOnHover", - "patchTarget": "Il2Cpp.CustomerBaseDoor::override void InteractOnHover(RaycastHit hit)", - "strategy": "Postfix", - "description": "Interop target CustomerBaseDoor.InteractOnHover", - "payloadSchema": { - "targetType": "CustomerBaseDoor", - "isStatic": false, - "hit": "RaycastHit" - }, - "hookSubject": null, - "name": "greg.CUSTOMER.InteractOnHover" - }, - { - "legacy": "deprecated.CUSTOMER.CustomerBaseDoor.OpenDoorAndSetupBase", - "patchTarget": "Il2Cpp.CustomerBaseDoor::void OpenDoorAndSetupBase(CustomerItem customerItem)", - "strategy": "Postfix", - "description": "Interop target CustomerBaseDoor.OpenDoorAndSetupBase", - "payloadSchema": { - "targetType": "CustomerBaseDoor", - "isStatic": false, - "customerItem": "CustomerItem" - }, - "hookSubject": null, - "name": "greg.CUSTOMER.OpenDoorAndSetupBase" - }, - { - "legacy": "deprecated.CUSTOMER.CustomerBaseDoor.OpenDoor", - "patchTarget": "Il2Cpp.CustomerBaseDoor::void OpenDoor()", - "strategy": "Postfix", - "description": "Interop target CustomerBaseDoor.OpenDoor", - "payloadSchema": { - "targetType": "CustomerBaseDoor", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.CUSTOMER.OpenDoor" - }, - { - "legacy": "deprecated.CUSTOMER.CustomerBaseDoor.OnHoverOver", - "patchTarget": "Il2Cpp.CustomerBaseDoor::override void OnHoverOver()", - "strategy": "Postfix", - "description": "Interop target CustomerBaseDoor.OnHoverOver", - "payloadSchema": { - "targetType": "CustomerBaseDoor", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.CUSTOMER.OnHoverOver" - }, - { - "legacy": "deprecated.CUSTOMER.CustomerBaseDoor.OnLoad", - "patchTarget": "Il2Cpp.CustomerBaseDoor::void OnLoad()", - "strategy": "Postfix", - "description": "Interop target CustomerBaseDoor.OnLoad", - "payloadSchema": { - "targetType": "CustomerBaseDoor", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.CUSTOMER.OnLoad" - }, - { - "legacy": "deprecated.CUSTOMER.CustomerBaseDoor.OnDestroy", - "patchTarget": "Il2Cpp.CustomerBaseDoor::void OnDestroy()", - "strategy": "Postfix", - "description": "Interop target CustomerBaseDoor.OnDestroy", - "payloadSchema": { - "targetType": "CustomerBaseDoor", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.CUSTOMER.OnDestroy" - }, - { - "legacy": "deprecated.CUSTOMER.CustomerCard.SetCustomer", - "patchTarget": "Il2Cpp.CustomerCard::void SetCustomer(CustomerItem _customerItem)", - "strategy": "Postfix", - "description": "Interop target CustomerCard.SetCustomer", - "payloadSchema": { - "targetType": "CustomerCard", - "isStatic": false, - "_customerItem": "CustomerItem" - }, - "hookSubject": null, - "name": "greg.CUSTOMER.CustomerSet" - }, - { - "legacy": "deprecated.SYSTEM.DropdownSample.OnButtonClick", - "patchTarget": "Il2Cpp.DropdownSample::void OnButtonClick()", - "strategy": "Postfix", - "description": "Interop target DropdownSample.OnButtonClick", - "payloadSchema": { - "targetType": "DropdownSample", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.OnButtonClick" - }, - { - "legacy": "deprecated.SYSTEM.Dumpster.Awake", - "patchTarget": "Il2Cpp.Dumpster::override void Awake()", - "strategy": "Postfix", - "description": "Interop target Dumpster.Awake", - "payloadSchema": { - "targetType": "Dumpster", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "Dumpster", - "name": "greg.SYSTEM.ComponentInitialized.Dumpster" - }, - { - "legacy": "deprecated.SYSTEM.Dumpster.InteractOnClick", - "patchTarget": "Il2Cpp.Dumpster::override void InteractOnClick()", - "strategy": "Postfix", - "description": "Interop target Dumpster.InteractOnClick", - "payloadSchema": { - "targetType": "Dumpster", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "Dumpster", - "name": "greg.SYSTEM.InteractOnClick.Dumpster" - }, - { - "legacy": "deprecated.SYSTEM.Dumpster.InteractOnHover", - "patchTarget": "Il2Cpp.Dumpster::override void InteractOnHover(RaycastHit hit)", - "strategy": "Postfix", - "description": "Interop target Dumpster.InteractOnHover", - "payloadSchema": { - "targetType": "Dumpster", - "isStatic": false, - "hit": "RaycastHit", - "hookSubject": "string" - }, - "hookSubject": "Dumpster_RaycastHithit", - "name": "greg.SYSTEM.InteractOnHover.Dumpster_RaycastHithit" - }, - { - "legacy": "deprecated.SYSTEM.Dumpster.OnHoverOver", - "patchTarget": "Il2Cpp.Dumpster::override void OnHoverOver()", - "strategy": "Postfix", - "description": "Interop target Dumpster.OnHoverOver", - "payloadSchema": { - "targetType": "Dumpster", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "Dumpster", - "name": "greg.SYSTEM.OnHoverOver.Dumpster" - }, - { - "legacy": "deprecated.SYSTEM.EnvMapAnimator.Awake", - "patchTarget": "Il2Cpp.EnvMapAnimator::void Awake()", - "strategy": "Postfix", - "description": "Interop target EnvMapAnimator.Awake", - "payloadSchema": { - "targetType": "EnvMapAnimator", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "EnvMapAnimator_46683c114d", - "name": "greg.SYSTEM.ComponentInitialized.EnvMapAnimator_46683c114d" - }, - { - "legacy": "deprecated.SYSTEM.EnvMapAnimator.Start", - "patchTarget": "Il2Cpp.EnvMapAnimator::IEnumerator Start()", - "strategy": "Postfix", - "description": "Interop target EnvMapAnimator.Start", - "payloadSchema": { - "targetType": "EnvMapAnimator", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "EnvMapAnimator_928c4d3d7d", - "name": "greg.SYSTEM.ComponentInitialized.EnvMapAnimator_928c4d3d7d" - }, - { - "legacy": "deprecated.SYSTEM.FCP_Persistence.Awake", - "patchTarget": "Il2Cpp.FCP_Persistence::void Awake()", - "strategy": "Postfix", - "description": "Interop target FCP_Persistence.Awake", - "payloadSchema": { - "targetType": "FCP_Persistence", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "FCP_Persistence", - "name": "greg.SYSTEM.ComponentInitialized.FCP_Persistence" - }, - { - "legacy": "deprecated.SYSTEM.FCP_Persistence.InitStatic", - "patchTarget": "Il2Cpp.FCP_Persistence::void InitStatic()", - "strategy": "Postfix", - "description": "Interop target FCP_Persistence.InitStatic", - "payloadSchema": { - "targetType": "FCP_Persistence", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.InitStatic" - }, - { - "legacy": "deprecated.SYSTEM.FCP_Persistence.OnDestroy", - "patchTarget": "Il2Cpp.FCP_Persistence::void OnDestroy()", - "strategy": "Postfix", - "description": "Interop target FCP_Persistence.OnDestroy", - "payloadSchema": { - "targetType": "FCP_Persistence", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "FCP_Persistence", - "name": "greg.SYSTEM.OnDestroy.FCP_Persistence" - }, - { - "legacy": "deprecated.SYSTEM.FCP_Persistence.OnEnable", - "patchTarget": "Il2Cpp.FCP_Persistence::void OnEnable()", - "strategy": "Postfix", - "description": "Interop target FCP_Persistence.OnEnable", - "payloadSchema": { - "targetType": "FCP_Persistence", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "FCP_Persistence", - "name": "greg.SYSTEM.ComponentEnabled.FCP_Persistence" - }, - { - "legacy": "deprecated.SYSTEM.FCP_Persistence.OnDisable", - "patchTarget": "Il2Cpp.FCP_Persistence::void OnDisable()", - "strategy": "Postfix", - "description": "Interop target FCP_Persistence.OnDisable", - "payloadSchema": { - "targetType": "FCP_Persistence", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "FCP_Persistence", - "name": "greg.SYSTEM.ComponentDisabled.FCP_Persistence" - }, - { - "legacy": "deprecated.SYSTEM.FCP_Persistence.LoadDataFile", - "patchTarget": "Il2Cpp.FCP_Persistence::void LoadDataFile()", - "strategy": "Postfix", - "description": "Interop target FCP_Persistence.LoadDataFile", - "payloadSchema": { - "targetType": "FCP_Persistence", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.DataFileLoaded" - }, - { - "legacy": "deprecated.SYSTEM.FCP_Persistence.SaveDataFile", - "patchTarget": "Il2Cpp.FCP_Persistence::void SaveDataFile()", - "strategy": "Postfix", - "description": "Interop target FCP_Persistence.SaveDataFile", - "payloadSchema": { - "targetType": "FCP_Persistence", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.DataFileSaved" - }, - { - "legacy": "deprecated.SYSTEM.FCP_Persistence.SaveColor", - "patchTarget": "Il2Cpp.FCP_Persistence::void SaveColor(Color c)", - "strategy": "Postfix", - "description": "Interop target FCP_Persistence.SaveColor", - "payloadSchema": { - "targetType": "FCP_Persistence", - "isStatic": false, - "c": "Color" - }, - "hookSubject": null, - "name": "greg.SYSTEM.ColorSaved" - }, - { - "legacy": "deprecated.SYSTEM.FCP_Persistence.LoadColor", - "patchTarget": "Il2Cpp.FCP_Persistence::bool LoadColor(out Color c)", - "strategy": "Postfix", - "description": "Interop target FCP_Persistence.LoadColor", - "payloadSchema": { - "targetType": "FCP_Persistence", - "isStatic": false, - "c": "outColor" - }, - "hookSubject": null, - "name": "greg.SYSTEM.ColorLoaded" - }, - { - "legacy": "deprecated.SYSTEM.FCP_Persistence.GenerateID", - "patchTarget": "Il2Cpp.FCP_Persistence::static string GenerateID()", - "strategy": "Postfix", - "description": "Interop target FCP_Persistence.GenerateID", - "payloadSchema": { - "targetType": "FCP_Persistence", - "isStatic": true - }, - "hookSubject": null, - "name": "greg.SYSTEM.GenerateID" - }, - { - "legacy": "deprecated.SYSTEM.FCP_SpriteMeshEditor.MakeMesh", - "patchTarget": "Il2Cpp.FCP_SpriteMeshEditor::void MakeMesh(Sprite sprite, int x, int y, FCP_SpriteMeshEditor.MeshType meshtype)", - "strategy": "Postfix", - "description": "Interop target FCP_SpriteMeshEditor.MakeMesh", - "payloadSchema": { - "targetType": "FCP_SpriteMeshEditor", - "isStatic": false, - "sprite": "Sprite", - "x": "int", - "y": "int", - "meshtype": "FCP_SpriteMeshEditor.MeshType" - }, - "hookSubject": null, - "name": "greg.SYSTEM.MakeMesh" - }, - { - "legacy": "deprecated.SYSTEM.FlexibleColorPicker.SetColor", - "patchTarget": "Il2Cpp.FlexibleColorPicker::void SetColor(Color color)", - "strategy": "Postfix", - "description": "Interop target FlexibleColorPicker.SetColor", - "payloadSchema": { - "targetType": "FlexibleColorPicker", - "isStatic": false, - "color": "Color" - }, - "hookSubject": null, - "name": "greg.SYSTEM.ColorSet" - }, - { - "legacy": "deprecated.SYSTEM.FlexibleColorPicker.SetColorNoAlpha", - "patchTarget": "Il2Cpp.FlexibleColorPicker::void SetColorNoAlpha(Color color)", - "strategy": "Postfix", - "description": "Interop target FlexibleColorPicker.SetColorNoAlpha", - "payloadSchema": { - "targetType": "FlexibleColorPicker", - "isStatic": false, - "color": "Color" - }, - "hookSubject": null, - "name": "greg.SYSTEM.ColorNoAlphaSet" - }, - { - "legacy": "deprecated.SYSTEM.FlexibleColorPicker.Awake", - "patchTarget": "Il2Cpp.FlexibleColorPicker::void Awake()", - "strategy": "Postfix", - "description": "Interop target FlexibleColorPicker.Awake", - "payloadSchema": { - "targetType": "FlexibleColorPicker", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "FlexibleColorPicker", - "name": "greg.SYSTEM.ComponentInitialized.FlexibleColorPicker" - }, - { - "legacy": "deprecated.SYSTEM.FlexibleColorPicker.SliderUpdate", - "patchTarget": "Il2Cpp.FlexibleColorPicker::void SliderUpdate(FlexibleColorPicker.PickerType type, float value)", - "strategy": "Postfix", - "description": "Interop target FlexibleColorPicker.SliderUpdate", - "payloadSchema": { - "targetType": "FlexibleColorPicker", - "isStatic": false, - "type": "FlexibleColorPicker.PickerType", - "value": "float" - }, - "hookSubject": null, - "name": "greg.SYSTEM.SliderUpdate" - }, - { - "legacy": "deprecated.SYSTEM.FlexibleColorPicker.OnEnable", - "patchTarget": "Il2Cpp.FlexibleColorPicker::void OnEnable()", - "strategy": "Postfix", - "description": "Interop target FlexibleColorPicker.OnEnable", - "payloadSchema": { - "targetType": "FlexibleColorPicker", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "FlexibleColorPicker", - "name": "greg.SYSTEM.ComponentEnabled.FlexibleColorPicker" - }, - { - "legacy": "deprecated.SYSTEM.FlexibleColorPicker.SetPointerFocus", - "patchTarget": "Il2Cpp.FlexibleColorPicker::void SetPointerFocus(int i)", - "strategy": "Postfix", - "description": "Interop target FlexibleColorPicker.SetPointerFocus", - "payloadSchema": { - "targetType": "FlexibleColorPicker", - "isStatic": false, - "i": "int" - }, - "hookSubject": null, - "name": "greg.SYSTEM.PointerFocusSet" - }, - { - "legacy": "deprecated.SYSTEM.FlexibleColorPicker.PointerUpdate", - "patchTarget": "Il2Cpp.FlexibleColorPicker::void PointerUpdate(BaseEventData e)", - "strategy": "Postfix", - "description": "Interop target FlexibleColorPicker.PointerUpdate", - "payloadSchema": { - "targetType": "FlexibleColorPicker", - "isStatic": false, - "e": "BaseEventData" - }, - "hookSubject": null, - "name": "greg.SYSTEM.PointerUpdate" - }, - { - "legacy": "deprecated.SYSTEM.FlexibleColorPicker.TypeHex", - "patchTarget": "Il2Cpp.FlexibleColorPicker::void TypeHex(string input)", - "strategy": "Postfix", - "description": "Interop target FlexibleColorPicker.TypeHex", - "payloadSchema": { - "targetType": "FlexibleColorPicker", - "isStatic": false, - "input": "string", - "hookSubject": "string" - }, - "hookSubject": "FlexibleColorPicker_stringinput", - "name": "greg.SYSTEM.TypeHex.FlexibleColorPicker_stringinput" - }, - { - "legacy": "deprecated.SYSTEM.FlexibleColorPicker.FinishTypeHex", - "patchTarget": "Il2Cpp.FlexibleColorPicker::void FinishTypeHex(string input)", - "strategy": "Postfix", - "description": "Interop target FlexibleColorPicker.FinishTypeHex", - "payloadSchema": { - "targetType": "FlexibleColorPicker", - "isStatic": false, - "input": "string" - }, - "hookSubject": null, - "name": "greg.SYSTEM.FinishTypeHex" - }, - { - "legacy": "deprecated.SYSTEM.FlexibleColorPicker.ChangeMode", - "patchTarget": "Il2Cpp.FlexibleColorPicker::void ChangeMode(int newMode)", - "strategy": "Postfix", - "description": "Interop target FlexibleColorPicker.ChangeMode", - "payloadSchema": { - "targetType": "FlexibleColorPicker", - "isStatic": false, - "newMode": "int", - "hookSubject": "string" - }, - "hookSubject": "FlexibleColorPicker_intnewMode", - "name": "greg.SYSTEM.ChangeMode.FlexibleColorPicker_intnewMode" - }, - { - "legacy": "deprecated.SYSTEM.FlexibleColorPicker.ChangeMode", - "patchTarget": "Il2Cpp.FlexibleColorPicker::void ChangeMode(FlexibleColorPicker.MainPickingMode mode)", - "strategy": "Postfix", - "description": "Interop target FlexibleColorPicker.ChangeMode", - "payloadSchema": { - "targetType": "FlexibleColorPicker", - "isStatic": false, - "mode": "FlexibleColorPicker.MainPickingMode", - "hookSubject": "string" - }, - "hookSubject": "FlexibleColorPicker_FlexibleColorPickerMainPickingModemode", - "name": "greg.SYSTEM.ChangeMode.FlexibleColorPicker_FlexibleColorPickerMainPickingModemode" - }, - { - "legacy": "deprecated.SYSTEM.FlexibleColorPicker.SeperateMaterials", - "patchTarget": "Il2Cpp.FlexibleColorPicker::void SeperateMaterials()", - "strategy": "Postfix", - "description": "Interop target FlexibleColorPicker.SeperateMaterials", - "payloadSchema": { - "targetType": "FlexibleColorPicker", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.SeperateMaterials" - }, - { - "legacy": "deprecated.SYSTEM.FlexibleColorPicker.ShiftColor", - "patchTarget": "Il2Cpp.FlexibleColorPicker::void ShiftColor(int type, float delta)", - "strategy": "Postfix", - "description": "Interop target FlexibleColorPicker.ShiftColor", - "payloadSchema": { - "targetType": "FlexibleColorPicker", - "isStatic": false, - "type": "int", - "delta": "float" - }, - "hookSubject": null, - "name": "greg.SYSTEM.ShiftColor" - }, - { - "legacy": "deprecated.SYSTEM.FlexibleColorPicker.ShiftHue", - "patchTarget": "Il2Cpp.FlexibleColorPicker::void ShiftHue(float delta)", - "strategy": "Postfix", - "description": "Interop target FlexibleColorPicker.ShiftHue", - "payloadSchema": { - "targetType": "FlexibleColorPicker", - "isStatic": false, - "delta": "float" - }, - "hookSubject": null, - "name": "greg.SYSTEM.ShiftHue" - }, - { - "legacy": "deprecated.SYSTEM.FlexibleColorPicker.PickColor", - "patchTarget": "Il2Cpp.FlexibleColorPicker::FlexibleColorPicker.BufferedColor PickColor(FlexibleColorPicker.BufferedColor color, FlexibleColorPicker.PickerType type, Vector2 v)", - "strategy": "Postfix", - "description": "Interop target FlexibleColorPicker.PickColor", - "payloadSchema": { - "targetType": "FlexibleColorPicker", - "isStatic": false, - "color": "FlexibleColorPicker.BufferedColor", - "type": "FlexibleColorPicker.PickerType", - "v": "Vector2" - }, - "hookSubject": null, - "name": "greg.SYSTEM.PickColor" - }, - { - "legacy": "deprecated.SYSTEM.FlexibleColorPicker.PickColorMain", - "patchTarget": "Il2Cpp.FlexibleColorPicker::FlexibleColorPicker.BufferedColor PickColorMain(FlexibleColorPicker.BufferedColor color, Vector2 v)", - "strategy": "Postfix", - "description": "Interop target FlexibleColorPicker.PickColorMain", - "payloadSchema": { - "targetType": "FlexibleColorPicker", - "isStatic": false, - "color": "FlexibleColorPicker.BufferedColor", - "v": "Vector2", - "hookSubject": "string" - }, - "hookSubject": "FlexibleColorPicker_FlexibleColorPickerBufferedColorcolorVec", - "name": "greg.SYSTEM.PickColorMain.FlexibleColorPicker_FlexibleColorPickerBufferedColorcolorVec" - }, - { - "legacy": "deprecated.SYSTEM.FlexibleColorPicker.PickColor1D", - "patchTarget": "Il2Cpp.FlexibleColorPicker::FlexibleColorPicker.BufferedColor PickColor1D(FlexibleColorPicker.BufferedColor color, FlexibleColorPicker.PickerType type, Vector2 v)", - "strategy": "Postfix", - "description": "Interop target FlexibleColorPicker.PickColor1D", - "payloadSchema": { - "targetType": "FlexibleColorPicker", - "isStatic": false, - "color": "FlexibleColorPicker.BufferedColor", - "type": "FlexibleColorPicker.PickerType", - "v": "Vector2", - "hookSubject": "string" - }, - "hookSubject": "FlexibleColorPicker_FlexibleColorPickerBufferedColorcolorFle_de84f21a97", - "name": "greg.SYSTEM.PickColor1D.FlexibleColorPicker_FlexibleColorPickerBufferedColorcolorFle_de84f21a97" - }, - { - "legacy": "deprecated.SYSTEM.FlexibleColorPicker.PickColorMain", - "patchTarget": "Il2Cpp.FlexibleColorPicker::FlexibleColorPicker.BufferedColor PickColorMain(FlexibleColorPicker.BufferedColor color, FlexibleColorPicker.MainPickingMode mode, Vector2 v)", - "strategy": "Postfix", - "description": "Interop target FlexibleColorPicker.PickColorMain", - "payloadSchema": { - "targetType": "FlexibleColorPicker", - "isStatic": false, - "color": "FlexibleColorPicker.BufferedColor", - "mode": "FlexibleColorPicker.MainPickingMode", - "v": "Vector2", - "hookSubject": "string" - }, - "hookSubject": "FlexibleColorPicker_FlexibleColorPickerBufferedColorcolorFle", - "name": "greg.SYSTEM.PickColorMain.FlexibleColorPicker_FlexibleColorPickerBufferedColorcolorFle" - }, - { - "legacy": "deprecated.SYSTEM.FlexibleColorPicker.PickColor2D", - "patchTarget": "Il2Cpp.FlexibleColorPicker::FlexibleColorPicker.BufferedColor PickColor2D(FlexibleColorPicker.BufferedColor color, FlexibleColorPicker.PickerType type1, float value1, FlexibleColorPicker.PickerType type2, float value2)", - "strategy": "Postfix", - "description": "Interop target FlexibleColorPicker.PickColor2D", - "payloadSchema": { - "targetType": "FlexibleColorPicker", - "isStatic": false, - "color": "FlexibleColorPicker.BufferedColor", - "type1": "FlexibleColorPicker.PickerType", - "value1": "float", - "type2": "FlexibleColorPicker.PickerType", - "value2": "float" - }, - "hookSubject": null, - "name": "greg.SYSTEM.PickColor2D" - }, - { - "legacy": "deprecated.SYSTEM.FlexibleColorPicker.PickColor1D", - "patchTarget": "Il2Cpp.FlexibleColorPicker::FlexibleColorPicker.BufferedColor PickColor1D(FlexibleColorPicker.BufferedColor color, FlexibleColorPicker.PickerType type, float value)", - "strategy": "Postfix", - "description": "Interop target FlexibleColorPicker.PickColor1D", - "payloadSchema": { - "targetType": "FlexibleColorPicker", - "isStatic": false, - "color": "FlexibleColorPicker.BufferedColor", - "type": "FlexibleColorPicker.PickerType", - "value": "float", - "hookSubject": "string" - }, - "hookSubject": "FlexibleColorPicker_FlexibleColorPickerBufferedColorcolorFle_fd305ba107", - "name": "greg.SYSTEM.PickColor1D.FlexibleColorPicker_FlexibleColorPickerBufferedColorcolorFle_fd305ba107" - }, - { - "legacy": "deprecated.SYSTEM.FlexibleColorPicker.UpdateMarkers", - "patchTarget": "Il2Cpp.FlexibleColorPicker::void UpdateMarkers()", - "strategy": "Postfix", - "description": "Interop target FlexibleColorPicker.UpdateMarkers", - "payloadSchema": { - "targetType": "FlexibleColorPicker", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.MarkersChanged" - }, - { - "legacy": "deprecated.SYSTEM.FlexibleColorPicker.UpdateMarker", - "patchTarget": "Il2Cpp.FlexibleColorPicker::void UpdateMarker(FlexibleColorPicker.Picker picker, FlexibleColorPicker.PickerType type, Vector2 v)", - "strategy": "Postfix", - "description": "Interop target FlexibleColorPicker.UpdateMarker", - "payloadSchema": { - "targetType": "FlexibleColorPicker", - "isStatic": false, - "picker": "FlexibleColorPicker.Picker", - "type": "FlexibleColorPicker.PickerType", - "v": "Vector2" - }, - "hookSubject": null, - "name": "greg.SYSTEM.MarkerChanged" - }, - { - "legacy": "deprecated.SYSTEM.FlexibleColorPicker.SetMarker", - "patchTarget": "Il2Cpp.FlexibleColorPicker::void SetMarker(Image picker, Vector2 v, bool setX, bool setY)", - "strategy": "Postfix", - "description": "Interop target FlexibleColorPicker.SetMarker", - "payloadSchema": { - "targetType": "FlexibleColorPicker", - "isStatic": false, - "picker": "Image", - "v": "Vector2", - "setX": "bool", - "setY": "bool" - }, - "hookSubject": null, - "name": "greg.SYSTEM.MarkerSet" - }, - { - "legacy": "deprecated.SYSTEM.FlexibleColorPicker.UpdateTextures", - "patchTarget": "Il2Cpp.FlexibleColorPicker::void UpdateTextures()", - "strategy": "Postfix", - "description": "Interop target FlexibleColorPicker.UpdateTextures", - "payloadSchema": { - "targetType": "FlexibleColorPicker", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.TexturesChanged" - }, - { - "legacy": "deprecated.SYSTEM.FlexibleColorPicker.UpdateStatic", - "patchTarget": "Il2Cpp.FlexibleColorPicker::void UpdateStatic(FlexibleColorPicker.PickerType type)", - "strategy": "Postfix", - "description": "Interop target FlexibleColorPicker.UpdateStatic", - "payloadSchema": { - "targetType": "FlexibleColorPicker", - "isStatic": false, - "type": "FlexibleColorPicker.PickerType" - }, - "hookSubject": null, - "name": "greg.SYSTEM.StaticChanged" - }, - { - "legacy": "deprecated.SYSTEM.FlexibleColorPicker.UpdateDynamic", - "patchTarget": "Il2Cpp.FlexibleColorPicker::void UpdateDynamic(FlexibleColorPicker.PickerType type)", - "strategy": "Postfix", - "description": "Interop target FlexibleColorPicker.UpdateDynamic", - "payloadSchema": { - "targetType": "FlexibleColorPicker", - "isStatic": false, - "type": "FlexibleColorPicker.PickerType" - }, - "hookSubject": null, - "name": "greg.SYSTEM.DynamicChanged" - }, - { - "legacy": "deprecated.SYSTEM.FlexibleColorPicker.IsPickerAvailable", - "patchTarget": "Il2Cpp.FlexibleColorPicker::bool IsPickerAvailable(FlexibleColorPicker.PickerType type)", - "strategy": "Postfix", - "description": "Interop target FlexibleColorPicker.IsPickerAvailable", - "payloadSchema": { - "targetType": "FlexibleColorPicker", - "isStatic": false, - "type": "FlexibleColorPicker.PickerType", - "hookSubject": "string" - }, - "hookSubject": "FlexibleColorPicker_FlexibleColorPickerPickerTypetype", - "name": "greg.SYSTEM.IsPickerAvailable.FlexibleColorPicker_FlexibleColorPickerPickerTypetype" - }, - { - "legacy": "deprecated.SYSTEM.FlexibleColorPicker.IsPickerAvailable", - "patchTarget": "Il2Cpp.FlexibleColorPicker::bool IsPickerAvailable(int index)", - "strategy": "Postfix", - "description": "Interop target FlexibleColorPicker.IsPickerAvailable", - "payloadSchema": { - "targetType": "FlexibleColorPicker", - "isStatic": false, - "index": "int", - "hookSubject": "string" - }, - "hookSubject": "FlexibleColorPicker_intindex", - "name": "greg.SYSTEM.IsPickerAvailable.FlexibleColorPicker_intindex" - }, - { - "legacy": "deprecated.SYSTEM.FlexibleColorPicker.UpdateHex", - "patchTarget": "Il2Cpp.FlexibleColorPicker::void UpdateHex()", - "strategy": "Postfix", - "description": "Interop target FlexibleColorPicker.UpdateHex", - "payloadSchema": { - "targetType": "FlexibleColorPicker", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.HexChanged" - }, - { - "legacy": "deprecated.SYSTEM.FlexibleColorPicker.TypeHex", - "patchTarget": "Il2Cpp.FlexibleColorPicker::void TypeHex(string input, bool finish)", - "strategy": "Postfix", - "description": "Interop target FlexibleColorPicker.TypeHex", - "payloadSchema": { - "targetType": "FlexibleColorPicker", - "isStatic": false, - "input": "string", - "finish": "bool", - "hookSubject": "string" - }, - "hookSubject": "FlexibleColorPicker_stringinputboolfinish", - "name": "greg.SYSTEM.TypeHex.FlexibleColorPicker_stringinputboolfinish" - }, - { - "legacy": "deprecated.SYSTEM.FlexibleColorPicker.MakeModeOptions", - "patchTarget": "Il2Cpp.FlexibleColorPicker::void MakeModeOptions()", - "strategy": "Postfix", - "description": "Interop target FlexibleColorPicker.MakeModeOptions", - "payloadSchema": { - "targetType": "FlexibleColorPicker", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.MakeModeOptions" - }, - { - "legacy": "deprecated.SYSTEM.FlexibleColorPicker.UpdateMode", - "patchTarget": "Il2Cpp.FlexibleColorPicker::void UpdateMode(FlexibleColorPicker.MainPickingMode mode)", - "strategy": "Postfix", - "description": "Interop target FlexibleColorPicker.UpdateMode", - "payloadSchema": { - "targetType": "FlexibleColorPicker", - "isStatic": false, - "mode": "FlexibleColorPicker.MainPickingMode" - }, - "hookSubject": null, - "name": "greg.SYSTEM.ModeChanged" - }, - { - "legacy": "deprecated.SYSTEM.FlexibleColorPicker.IsPreviewType", - "patchTarget": "Il2Cpp.FlexibleColorPicker::static bool IsPreviewType(FlexibleColorPicker.PickerType type)", - "strategy": "Postfix", - "description": "Interop target FlexibleColorPicker.IsPreviewType", - "payloadSchema": { - "targetType": "FlexibleColorPicker", - "isStatic": true, - "type": "FlexibleColorPicker.PickerType" - }, - "hookSubject": null, - "name": "greg.SYSTEM.IsPreviewType" - }, - { - "legacy": "deprecated.SYSTEM.FlexibleColorPicker.IsAlphaType", - "patchTarget": "Il2Cpp.FlexibleColorPicker::static bool IsAlphaType(FlexibleColorPicker.PickerType type)", - "strategy": "Postfix", - "description": "Interop target FlexibleColorPicker.IsAlphaType", - "payloadSchema": { - "targetType": "FlexibleColorPicker", - "isStatic": true, - "type": "FlexibleColorPicker.PickerType" - }, - "hookSubject": null, - "name": "greg.SYSTEM.IsAlphaType" - }, - { - "legacy": "deprecated.SYSTEM.FlexibleColorPicker.IsHorizontal", - "patchTarget": "Il2Cpp.FlexibleColorPicker::static bool IsHorizontal(FlexibleColorPicker.Picker p)", - "strategy": "Postfix", - "description": "Interop target FlexibleColorPicker.IsHorizontal", - "payloadSchema": { - "targetType": "FlexibleColorPicker", - "isStatic": true, - "p": "FlexibleColorPicker.Picker" - }, - "hookSubject": null, - "name": "greg.SYSTEM.IsHorizontal" - }, - { - "legacy": "deprecated.SYSTEM.FlexibleColorPicker.IsValidHexChar", - "patchTarget": "Il2Cpp.FlexibleColorPicker::static bool IsValidHexChar(char c)", - "strategy": "Postfix", - "description": "Interop target FlexibleColorPicker.IsValidHexChar", - "payloadSchema": { - "targetType": "FlexibleColorPicker", - "isStatic": true, - "c": "char" - }, - "hookSubject": null, - "name": "greg.SYSTEM.IsValidHexChar" - }, - { - "legacy": "deprecated.SYSTEM.FlexibleColorPicker.ParseHex", - "patchTarget": "Il2Cpp.FlexibleColorPicker::static Color ParseHex(string input)", - "strategy": "Postfix", - "description": "Interop target FlexibleColorPicker.ParseHex", - "payloadSchema": { - "targetType": "FlexibleColorPicker", - "isStatic": true, - "input": "string", - "hookSubject": "string" - }, - "hookSubject": "FlexibleColorPicker_stringinput", - "name": "greg.SYSTEM.ParseHex.FlexibleColorPicker_stringinput" - }, - { - "legacy": "deprecated.SYSTEM.FlexibleColorPicker.ParseHex", - "patchTarget": "Il2Cpp.FlexibleColorPicker::static Color ParseHex(string input, Color defaultColor)", - "strategy": "Postfix", - "description": "Interop target FlexibleColorPicker.ParseHex", - "payloadSchema": { - "targetType": "FlexibleColorPicker", - "isStatic": true, - "input": "string", - "defaultColor": "Color", - "hookSubject": "string" - }, - "hookSubject": "FlexibleColorPicker_stringinputColordefaultColor", - "name": "greg.SYSTEM.ParseHex.FlexibleColorPicker_stringinputColordefaultColor" - }, - { - "legacy": "deprecated.SYSTEM.FlexibleColorPicker.HSVToRGB", - "patchTarget": "Il2Cpp.FlexibleColorPicker::static Color HSVToRGB(Vector3 hsv)", - "strategy": "Postfix", - "description": "Interop target FlexibleColorPicker.HSVToRGB", - "payloadSchema": { - "targetType": "FlexibleColorPicker", - "isStatic": true, - "hsv": "Vector3", - "hookSubject": "string" - }, - "hookSubject": "FlexibleColorPicker_Vector3hsv", - "name": "greg.SYSTEM.HSVToRGB.FlexibleColorPicker_Vector3hsv" - }, - { - "legacy": "deprecated.SYSTEM.FlexibleColorPicker.HSVToRGB", - "patchTarget": "Il2Cpp.FlexibleColorPicker::static Color HSVToRGB(float h, float s, float v)", - "strategy": "Postfix", - "description": "Interop target FlexibleColorPicker.HSVToRGB", - "payloadSchema": { - "targetType": "FlexibleColorPicker", - "isStatic": true, - "h": "float", - "s": "float", - "v": "float", - "hookSubject": "string" - }, - "hookSubject": "FlexibleColorPicker_floathfloatsfloatv", - "name": "greg.SYSTEM.HSVToRGB.FlexibleColorPicker_floathfloatsfloatv" - }, - { - "legacy": "deprecated.SYSTEM.FlexibleColorPicker.RGBToHSV", - "patchTarget": "Il2Cpp.FlexibleColorPicker::static Vector3 RGBToHSV(Color color)", - "strategy": "Postfix", - "description": "Interop target FlexibleColorPicker.RGBToHSV", - "payloadSchema": { - "targetType": "FlexibleColorPicker", - "isStatic": true, - "color": "Color", - "hookSubject": "string" - }, - "hookSubject": "FlexibleColorPicker_Colorcolor", - "name": "greg.SYSTEM.RGBToHSV.FlexibleColorPicker_Colorcolor" - }, - { - "legacy": "deprecated.SYSTEM.FlexibleColorPicker.RGBToHSV", - "patchTarget": "Il2Cpp.FlexibleColorPicker::static Vector3 RGBToHSV(float r, float g, float b)", - "strategy": "Postfix", - "description": "Interop target FlexibleColorPicker.RGBToHSV", - "payloadSchema": { - "targetType": "FlexibleColorPicker", - "isStatic": true, - "r": "float", - "g": "float", - "b": "float", - "hookSubject": "string" - }, - "hookSubject": "FlexibleColorPicker_floatrfloatgfloatb", - "name": "greg.SYSTEM.RGBToHSV.FlexibleColorPicker_floatrfloatgfloatb" - }, - { - "legacy": "deprecated.SYSTEM.FootSteps.Awake", - "patchTarget": "Il2Cpp.FootSteps::void Awake()", - "strategy": "Postfix", - "description": "Interop target FootSteps.Awake", - "payloadSchema": { - "targetType": "FootSteps", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "FootSteps", - "name": "greg.SYSTEM.ComponentInitialized.FootSteps" - }, - { - "legacy": "deprecated.SYSTEM.FootSteps.PlayRequestedStepSound", - "patchTarget": "Il2Cpp.FootSteps::void PlayRequestedStepSound(int _clipArray)", - "strategy": "Postfix", - "description": "Interop target FootSteps.PlayRequestedStepSound", - "payloadSchema": { - "targetType": "FootSteps", - "isStatic": false, - "_clipArray": "int" - }, - "hookSubject": null, - "name": "greg.SYSTEM.PlayRequestedStepSound" - }, - { - "legacy": "deprecated.SYSTEM.FootSteps.Step", - "patchTarget": "Il2Cpp.FootSteps::void Step()", - "strategy": "Postfix", - "description": "Interop target FootSteps.Step", - "payloadSchema": { - "targetType": "FootSteps", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.Step" - }, - { - "legacy": "deprecated.SYSTEM.FootSteps.OnEnable", - "patchTarget": "Il2Cpp.FootSteps::void OnEnable()", - "strategy": "Postfix", - "description": "Interop target FootSteps.OnEnable", - "payloadSchema": { - "targetType": "FootSteps", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "FootSteps", - "name": "greg.SYSTEM.ComponentEnabled.FootSteps" - }, - { - "legacy": "deprecated.SYSTEM.FootSteps.checkGroundMaterial", - "patchTarget": "Il2Cpp.FootSteps::IEnumerator checkGroundMaterial()", - "strategy": "Postfix", - "description": "Interop target FootSteps.checkGroundMaterial", - "payloadSchema": { - "targetType": "FootSteps", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.checkGroundMaterial" - }, - { - "legacy": "deprecated.SYSTEM.GateLever.Awake", - "patchTarget": "Il2Cpp.GateLever::override void Awake()", - "strategy": "Postfix", - "description": "Interop target GateLever.Awake", - "payloadSchema": { - "targetType": "GateLever", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "GateLever", - "name": "greg.SYSTEM.ComponentInitialized.GateLever" - }, - { - "legacy": "deprecated.SYSTEM.GateLever.InteractOnClick", - "patchTarget": "Il2Cpp.GateLever::override void InteractOnClick()", - "strategy": "Postfix", - "description": "Interop target GateLever.InteractOnClick", - "payloadSchema": { - "targetType": "GateLever", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "GateLever", - "name": "greg.SYSTEM.InteractOnClick.GateLever" - }, - { - "legacy": "deprecated.SYSTEM.GateLever.GateCoroutine", - "patchTarget": "Il2Cpp.GateLever::IEnumerator GateCoroutine()", - "strategy": "Postfix", - "description": "Interop target GateLever.GateCoroutine", - "payloadSchema": { - "targetType": "GateLever", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.GateCoroutine" - }, - { - "legacy": "deprecated.SYSTEM.GateLever.OpenGate", - "patchTarget": "Il2Cpp.GateLever::void OpenGate()", - "strategy": "Postfix", - "description": "Interop target GateLever.OpenGate", - "payloadSchema": { - "targetType": "GateLever", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.OpenGate" - }, - { - "legacy": "deprecated.SYSTEM.GateLever.CloseGate", - "patchTarget": "Il2Cpp.GateLever::void CloseGate()", - "strategy": "Postfix", - "description": "Interop target GateLever.CloseGate", - "payloadSchema": { - "targetType": "GateLever", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.CloseGate" - }, - { - "legacy": "deprecated.SYSTEM.GateLever.TruckComing", - "patchTarget": "Il2Cpp.GateLever::void TruckComing()", - "strategy": "Postfix", - "description": "Interop target GateLever.TruckComing", - "payloadSchema": { - "targetType": "GateLever", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.TruckComing" - }, - { - "legacy": "deprecated.SYSTEM.GateLever.InteractOnHover", - "patchTarget": "Il2Cpp.GateLever::override void InteractOnHover(RaycastHit hit)", - "strategy": "Postfix", - "description": "Interop target GateLever.InteractOnHover", - "payloadSchema": { - "targetType": "GateLever", - "isStatic": false, - "hit": "RaycastHit", - "hookSubject": "string" - }, - "hookSubject": "GateLever_RaycastHithit", - "name": "greg.SYSTEM.InteractOnHover.GateLever_RaycastHithit" - }, - { - "legacy": "deprecated.SYSTEM.GateLever.OnHoverOver", - "patchTarget": "Il2Cpp.GateLever::override void OnHoverOver()", - "strategy": "Postfix", - "description": "Interop target GateLever.OnHoverOver", - "payloadSchema": { - "targetType": "GateLever", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "GateLever", - "name": "greg.SYSTEM.OnHoverOver.GateLever" - }, - { - "legacy": "deprecated.SYSTEM.GetCurrentVersion.Start", - "patchTarget": "Il2Cpp.GetCurrentVersion::void Start()", - "strategy": "Postfix", - "description": "Interop target GetCurrentVersion.Start", - "payloadSchema": { - "targetType": "GetCurrentVersion", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "GetCurrentVersion", - "name": "greg.SYSTEM.ComponentInitialized.GetCurrentVersion" - }, - { - "legacy": "deprecated.SYSTEM.GetValueFromPlayerPrefs.Start", - "patchTarget": "Il2Cpp.GetValueFromPlayerPrefs::void Start()", - "strategy": "Postfix", - "description": "Interop target GetValueFromPlayerPrefs.Start", - "payloadSchema": { - "targetType": "GetValueFromPlayerPrefs", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "GetValueFromPlayerPrefs", - "name": "greg.SYSTEM.ComponentInitialized.GetValueFromPlayerPrefs" - }, - { - "legacy": "deprecated.SYSTEM.GODMOD.Awake", - "patchTarget": "Il2Cpp.GODMOD::void Awake()", - "strategy": "Postfix", - "description": "Interop target GODMOD.Awake", - "payloadSchema": { - "targetType": "GODMOD", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "GODMOD", - "name": "greg.SYSTEM.ComponentInitialized.GODMOD" - }, - { - "legacy": "deprecated.SYSTEM.GODMOD.OnEnable", - "patchTarget": "Il2Cpp.GODMOD::void OnEnable()", - "strategy": "Postfix", - "description": "Interop target GODMOD.OnEnable", - "payloadSchema": { - "targetType": "GODMOD", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "GODMOD", - "name": "greg.SYSTEM.ComponentEnabled.GODMOD" - }, - { - "legacy": "deprecated.SYSTEM.GODMOD.DelayedLoad", - "patchTarget": "Il2Cpp.GODMOD::IEnumerator DelayedLoad()", - "strategy": "Postfix", - "description": "Interop target GODMOD.DelayedLoad", - "payloadSchema": { - "targetType": "GODMOD", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.DelayedLoad" - }, - { - "legacy": "deprecated.SYSTEM.GODMOD.OnDisable", - "patchTarget": "Il2Cpp.GODMOD::void OnDisable()", - "strategy": "Postfix", - "description": "Interop target GODMOD.OnDisable", - "payloadSchema": { - "targetType": "GODMOD", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "GODMOD", - "name": "greg.SYSTEM.ComponentDisabled.GODMOD" - }, - { - "legacy": "deprecated.SYSTEM.GODMOD.StartGodMod", - "patchTarget": "Il2Cpp.GODMOD::void StartGodMod()", - "strategy": "Postfix", - "description": "Interop target GODMOD.StartGodMod", - "payloadSchema": { - "targetType": "GODMOD", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.StartGodMod" - }, - { - "legacy": "deprecated.SYSTEM.GODMOD.GODMOD_delayed", - "patchTarget": "Il2Cpp.GODMOD::IEnumerator GODMOD_delayed()", - "strategy": "Postfix", - "description": "Interop target GODMOD.GODMOD_delayed", - "payloadSchema": { - "targetType": "GODMOD", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.GODMOD_delayed" - }, - { - "legacy": "deprecated.SYSTEM.HRSystem.OnEnable", - "patchTarget": "Il2Cpp.HRSystem::void OnEnable()", - "strategy": "Postfix", - "description": "Interop target HRSystem.OnEnable", - "payloadSchema": { - "targetType": "HRSystem", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "HRSystem", - "name": "greg.SYSTEM.ComponentEnabled.HRSystem" - }, - { - "legacy": "deprecated.SYSTEM.HRSystem.ButtonHireEmployee", - "patchTarget": "Il2Cpp.HRSystem::void ButtonHireEmployee(int i)", - "strategy": "Postfix", - "description": "Interop target HRSystem.ButtonHireEmployee", - "payloadSchema": { - "targetType": "HRSystem", - "isStatic": false, - "i": "int" - }, - "hookSubject": null, - "name": "greg.SYSTEM.ButtonHireEmployee" - }, - { - "legacy": "deprecated.SYSTEM.HRSystem.ButtonCancelBuying", - "patchTarget": "Il2Cpp.HRSystem::void ButtonCancelBuying()", - "strategy": "Postfix", - "description": "Interop target HRSystem.ButtonCancelBuying", - "payloadSchema": { - "targetType": "HRSystem", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ButtonCancelBuying" - }, - { - "legacy": "deprecated.SYSTEM.HRSystem.ButtonConfirmHire", - "patchTarget": "Il2Cpp.HRSystem::void ButtonConfirmHire()", - "strategy": "Postfix", - "description": "Interop target HRSystem.ButtonConfirmHire", - "payloadSchema": { - "targetType": "HRSystem", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ButtonConfirmHire" - }, - { - "legacy": "deprecated.SYSTEM.HRSystem.ButtonFireEmployee", - "patchTarget": "Il2Cpp.HRSystem::void ButtonFireEmployee(int i)", - "strategy": "Postfix", - "description": "Interop target HRSystem.ButtonFireEmployee", - "payloadSchema": { - "targetType": "HRSystem", - "isStatic": false, - "i": "int" - }, - "hookSubject": null, - "name": "greg.SYSTEM.ButtonFireEmployee" - }, - { - "legacy": "deprecated.SYSTEM.HRSystem.ButtonConfirmFireEmployee", - "patchTarget": "Il2Cpp.HRSystem::void ButtonConfirmFireEmployee()", - "strategy": "Postfix", - "description": "Interop target HRSystem.ButtonConfirmFireEmployee", - "payloadSchema": { - "targetType": "HRSystem", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ButtonConfirmFireEmployee" - }, - { - "legacy": "deprecated.SYSTEM.InputController.Contains", - "patchTarget": "Il2Cpp.InputController::virtual bool Contains(InputAction action)", - "strategy": "Postfix", - "description": "Interop target InputController.Contains", - "payloadSchema": { - "targetType": "InputController", - "isStatic": false, - "action": "InputAction" - }, - "hookSubject": null, - "name": "greg.SYSTEM.Contains" - }, - { - "legacy": "deprecated.SYSTEM.InputController.System_Collections_IEnumerable_GetEnumerator", - "patchTarget": "Il2Cpp.InputController::virtual IEnumerator System_Collections_IEnumerable_GetEnumerator()", - "strategy": "Postfix", - "description": "Interop target InputController.System_Collections_IEnumerable_GetEnumerator", - "payloadSchema": { - "targetType": "InputController", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.System_Collections_IEnumerable_GetEnumerator" - }, - { - "legacy": "deprecated.SYSTEM.InputController.Enable", - "patchTarget": "Il2Cpp.InputController::virtual void Enable()", - "strategy": "Postfix", - "description": "Interop target InputController.Enable", - "payloadSchema": { - "targetType": "InputController", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.Enable" - }, - { - "legacy": "deprecated.SYSTEM.InputController.Disable", - "patchTarget": "Il2Cpp.InputController::virtual void Disable()", - "strategy": "Postfix", - "description": "Interop target InputController.Disable", - "payloadSchema": { - "targetType": "InputController", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.Disable" - }, - { - "legacy": "deprecated.SYSTEM.InputController.FindAction", - "patchTarget": "Il2Cpp.InputController::virtual InputAction FindAction(string actionNameOrId, bool throwIfNotFound = false)", - "strategy": "Postfix", - "description": "Interop target InputController.FindAction", - "payloadSchema": { - "targetType": "InputController", - "isStatic": false, - "actionNameOrId": "string", - "throwIfNotFound": "bool" - }, - "hookSubject": null, - "name": "greg.SYSTEM.FindAction" - }, - { - "legacy": "deprecated.SYSTEM.InputController.FindBinding", - "patchTarget": "Il2Cpp.InputController::virtual int FindBinding(InputBinding bindingMask, out InputAction action)", - "strategy": "Postfix", - "description": "Interop target InputController.FindBinding", - "payloadSchema": { - "targetType": "InputController", - "isStatic": false, - "bindingMask": "InputBinding", - "action": "outInputAction" - }, - "hookSubject": null, - "name": "greg.SYSTEM.FindBinding" - }, - { - "legacy": "deprecated.SYSTEM.InputManager.add_rebindComplete", - "patchTarget": "Il2Cpp.InputManager::static void add_rebindComplete(Action value)", - "strategy": "Postfix", - "description": "Interop target InputManager.add_rebindComplete", - "payloadSchema": { - "targetType": "InputManager", - "isStatic": true, - "value": "Action" - }, - "hookSubject": null, - "name": "greg.SYSTEM.add_rebindComplete" - }, - { - "legacy": "deprecated.SYSTEM.InputManager.remove_rebindComplete", - "patchTarget": "Il2Cpp.InputManager::static void remove_rebindComplete(Action value)", - "strategy": "Postfix", - "description": "Interop target InputManager.remove_rebindComplete", - "payloadSchema": { - "targetType": "InputManager", - "isStatic": true, - "value": "Action" - }, - "hookSubject": null, - "name": "greg.SYSTEM.remove_rebindComplete" - }, - { - "legacy": "deprecated.SYSTEM.InputManager.add_rebindCanceled", - "patchTarget": "Il2Cpp.InputManager::static void add_rebindCanceled(Action value)", - "strategy": "Postfix", - "description": "Interop target InputManager.add_rebindCanceled", - "payloadSchema": { - "targetType": "InputManager", - "isStatic": true, - "value": "Action" - }, - "hookSubject": null, - "name": "greg.SYSTEM.add_rebindCanceled" - }, - { - "legacy": "deprecated.SYSTEM.InputManager.remove_rebindCanceled", - "patchTarget": "Il2Cpp.InputManager::static void remove_rebindCanceled(Action value)", - "strategy": "Postfix", - "description": "Interop target InputManager.remove_rebindCanceled", - "payloadSchema": { - "targetType": "InputManager", - "isStatic": true, - "value": "Action" - }, - "hookSubject": null, - "name": "greg.SYSTEM.remove_rebindCanceled" - }, - { - "legacy": "deprecated.SYSTEM.InputManager.add_rebindStarted", - "patchTarget": "Il2Cpp.InputManager::static void add_rebindStarted(Action value)", - "strategy": "Postfix", - "description": "Interop target InputManager.add_rebindStarted", - "payloadSchema": { - "targetType": "InputManager", - "isStatic": true, - "value": "Action" - }, - "hookSubject": null, - "name": "greg.SYSTEM.add_rebindStarted" - }, - { - "legacy": "deprecated.SYSTEM.InputManager.remove_rebindStarted", - "patchTarget": "Il2Cpp.InputManager::static void remove_rebindStarted(Action value)", - "strategy": "Postfix", - "description": "Interop target InputManager.remove_rebindStarted", - "payloadSchema": { - "targetType": "InputManager", - "isStatic": true, - "value": "Action" - }, - "hookSubject": null, - "name": "greg.SYSTEM.remove_rebindStarted" - }, - { - "legacy": "deprecated.SYSTEM.InputManager.Awake", - "patchTarget": "Il2Cpp.InputManager::void Awake()", - "strategy": "Postfix", - "description": "Interop target InputManager.Awake", - "payloadSchema": { - "targetType": "InputManager", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "InputManager", - "name": "greg.SYSTEM.ComponentInitialized.InputManager" - }, - { - "legacy": "deprecated.SYSTEM.InputManager.LoadAllBindingOverrides", - "patchTarget": "Il2Cpp.InputManager::static void LoadAllBindingOverrides()", - "strategy": "Postfix", - "description": "Interop target InputManager.LoadAllBindingOverrides", - "payloadSchema": { - "targetType": "InputManager", - "isStatic": true - }, - "hookSubject": null, - "name": "greg.SYSTEM.AllBindingOverridesLoaded" - }, - { - "legacy": "deprecated.SYSTEM.InputManager.OnDestroy", - "patchTarget": "Il2Cpp.InputManager::void OnDestroy()", - "strategy": "Postfix", - "description": "Interop target InputManager.OnDestroy", - "payloadSchema": { - "targetType": "InputManager", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "InputManager", - "name": "greg.SYSTEM.OnDestroy.InputManager" - }, - { - "legacy": "deprecated.SYSTEM.InputManager.ConfinedCursorforUI", - "patchTarget": "Il2Cpp.InputManager::static void ConfinedCursorforUI()", - "strategy": "Postfix", - "description": "Interop target InputManager.ConfinedCursorforUI", - "payloadSchema": { - "targetType": "InputManager", - "isStatic": true - }, - "hookSubject": null, - "name": "greg.SYSTEM.ConfinedCursorforUI" - }, - { - "legacy": "deprecated.SYSTEM.InputManager.LockedCursorForPlayerMovement", - "patchTarget": "Il2Cpp.InputManager::static void LockedCursorForPlayerMovement()", - "strategy": "Postfix", - "description": "Interop target InputManager.LockedCursorForPlayerMovement", - "payloadSchema": { - "targetType": "InputManager", - "isStatic": true - }, - "hookSubject": null, - "name": "greg.SYSTEM.LockedCursorForPlayerMovement" - }, - { - "legacy": "deprecated.SYSTEM.InputManager.StartRebind", - "patchTarget": "Il2Cpp.InputManager::static void StartRebind(string actionName, int bindingIndex, TextMeshProUGUI statusText, bool excludeMouse)", - "strategy": "Postfix", - "description": "Interop target InputManager.StartRebind", - "payloadSchema": { - "targetType": "InputManager", - "isStatic": true, - "actionName": "string", - "bindingIndex": "int", - "statusText": "TextMeshProUGUI", - "excludeMouse": "bool" - }, - "hookSubject": null, - "name": "greg.SYSTEM.StartRebind" - }, - { - "legacy": "deprecated.SYSTEM.InputManager.DoRebind", - "patchTarget": "Il2Cpp.InputManager::static void DoRebind(InputAction actionToRebind, int bindingIndex, TextMeshProUGUI statusText, bool allCompositeParts, bool excludeMouse)", - "strategy": "Postfix", - "description": "Interop target InputManager.DoRebind", - "payloadSchema": { - "targetType": "InputManager", - "isStatic": true, - "actionToRebind": "InputAction", - "bindingIndex": "int", - "statusText": "TextMeshProUGUI", - "allCompositeParts": "bool", - "excludeMouse": "bool", - "hookSubject": "string" - }, - "hookSubject": "InputManager_InputActionactionToRebindintbindingIndex", - "name": "greg.SYSTEM.DoRebind.InputManager_InputActionactionToRebindintbindingIndex" - }, - { - "legacy": "deprecated.SYSTEM.InputManager.SaveBindingOverride", - "patchTarget": "Il2Cpp.InputManager::static void SaveBindingOverride(InputAction action)", - "strategy": "Postfix", - "description": "Interop target InputManager.SaveBindingOverride", - "payloadSchema": { - "targetType": "InputManager", - "isStatic": true, - "action": "InputAction" - }, - "hookSubject": null, - "name": "greg.SYSTEM.BindingOverrideSaved" - }, - { - "legacy": "deprecated.SYSTEM.InputManager.LoadBindingOverride", - "patchTarget": "Il2Cpp.InputManager::static void LoadBindingOverride(string actionName)", - "strategy": "Postfix", - "description": "Interop target InputManager.LoadBindingOverride", - "payloadSchema": { - "targetType": "InputManager", - "isStatic": true, - "actionName": "string" - }, - "hookSubject": null, - "name": "greg.SYSTEM.BindingOverrideLoaded" - }, - { - "legacy": "deprecated.SYSTEM.InputManager.ResetBinding", - "patchTarget": "Il2Cpp.InputManager::static void ResetBinding(string actionName, int bindingIndex)", - "strategy": "Postfix", - "description": "Interop target InputManager.ResetBinding", - "payloadSchema": { - "targetType": "InputManager", - "isStatic": true, - "actionName": "string", - "bindingIndex": "int", - "hookSubject": "string" - }, - "hookSubject": "InputManager_stringactionNameintbindingIndex", - "name": "greg.SYSTEM.ResetBinding.InputManager_stringactionNameintbindingIndex" - }, - { - "legacy": "deprecated.SYSTEM.InputManager.ForceMousePositionToCenterOfGameWindow", - "patchTarget": "Il2Cpp.InputManager::static void ForceMousePositionToCenterOfGameWindow()", - "strategy": "Postfix", - "description": "Interop target InputManager.ForceMousePositionToCenterOfGameWindow", - "payloadSchema": { - "targetType": "InputManager", - "isStatic": true - }, - "hookSubject": null, - "name": "greg.SYSTEM.ForceMousePositionToCenterOfGameWindow" - }, - { - "legacy": "deprecated.SYSTEM.InputManager.CheckCurrentControls", - "patchTarget": "Il2Cpp.InputManager::void CheckCurrentControls(InputAction.CallbackContext ctx)", - "strategy": "Prefix+Postfix", - "description": "Interop target InputManager.CheckCurrentControls", - "payloadSchema": { - "targetType": "InputManager", - "isStatic": false, - "ctx": "InputAction.CallbackContext" - }, - "hookSubject": null, - "name": "greg.SYSTEM.CheckCurrentControls" - }, - { - "legacy": "deprecated.SYSTEM.Interact.Awake", - "patchTarget": "Il2Cpp.Interact::virtual void Awake()", - "strategy": "Postfix", - "description": "Interop target Interact.Awake", - "payloadSchema": { - "targetType": "Interact", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "Interact", - "name": "greg.SYSTEM.ComponentInitialized.Interact" - }, - { - "legacy": "deprecated.SYSTEM.Interact.InteractOnClick", - "patchTarget": "Il2Cpp.Interact::virtual void InteractOnClick()", - "strategy": "Postfix", - "description": "Interop target Interact.InteractOnClick", - "payloadSchema": { - "targetType": "Interact", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "Interact", - "name": "greg.SYSTEM.InteractOnClick.Interact" - }, - { - "legacy": "deprecated.SYSTEM.Interact.IsAllowedToDoSecondAction", - "patchTarget": "Il2Cpp.Interact::virtual bool IsAllowedToDoSecondAction()", - "strategy": "Postfix", - "description": "Interop target Interact.IsAllowedToDoSecondAction", - "payloadSchema": { - "targetType": "Interact", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.IsAllowedToDoSecondAction" - }, - { - "legacy": "deprecated.SYSTEM.Interact.SecondActionOnClick", - "patchTarget": "Il2Cpp.Interact::virtual void SecondActionOnClick()", - "strategy": "Postfix", - "description": "Interop target Interact.SecondActionOnClick", - "payloadSchema": { - "targetType": "Interact", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.SecondActionOnClick" - }, - { - "legacy": "deprecated.SYSTEM.Interact.InteractOnHover", - "patchTarget": "Il2Cpp.Interact::virtual void InteractOnHover(RaycastHit hit)", - "strategy": "Postfix", - "description": "Interop target Interact.InteractOnHover", - "payloadSchema": { - "targetType": "Interact", - "isStatic": false, - "hit": "RaycastHit", - "hookSubject": "string" - }, - "hookSubject": "Interact_RaycastHithit", - "name": "greg.SYSTEM.InteractOnHover.Interact_RaycastHithit" - }, - { - "legacy": "deprecated.SYSTEM.Interact.OnHoverOver", - "patchTarget": "Il2Cpp.Interact::virtual void OnHoverOver()", - "strategy": "Postfix", - "description": "Interop target Interact.OnHoverOver", - "payloadSchema": { - "targetType": "Interact", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "Interact", - "name": "greg.SYSTEM.OnHoverOver.Interact" - }, - { - "legacy": "deprecated.SYSTEM.Interact.CloseInteractionMenu", - "patchTarget": "Il2Cpp.Interact::virtual void CloseInteractionMenu()", - "strategy": "Postfix", - "description": "Interop target Interact.CloseInteractionMenu", - "payloadSchema": { - "targetType": "Interact", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.CloseInteractionMenu" - }, - { - "legacy": "deprecated.SYSTEM.Interact.OnLoad", - "patchTarget": "Il2Cpp.Interact::virtual void OnLoad(InteractObjectData data)", - "strategy": "Postfix", - "description": "Interop target Interact.OnLoad", - "payloadSchema": { - "targetType": "Interact", - "isStatic": false, - "data": "InteractObjectData", - "hookSubject": "string" - }, - "hookSubject": "Interact_InteractObjectDatadata", - "name": "greg.SYSTEM.OnLoad.Interact_InteractObjectDatadata" - }, - { - "legacy": "deprecated.SYSTEM.KeyHint.ShowKeyboadMelee", - "patchTarget": "Il2Cpp.KeyHint::void ShowKeyboadMelee()", - "strategy": "Postfix", - "description": "Interop target KeyHint.ShowKeyboadMelee", - "payloadSchema": { - "targetType": "KeyHint", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ShowKeyboadMelee" - }, - { - "legacy": "deprecated.SYSTEM.KeyHint.SetInactiveAll", - "patchTarget": "Il2Cpp.KeyHint::void SetInactiveAll()", - "strategy": "Postfix", - "description": "Interop target KeyHint.SetInactiveAll", - "payloadSchema": { - "targetType": "KeyHint", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.InactiveAllSet" - }, - { - "legacy": "deprecated.SYSTEM.LeanTweenUIElement.Awake", - "patchTarget": "Il2Cpp.LeanTweenUIElement::void Awake()", - "strategy": "Postfix", - "description": "Interop target LeanTweenUIElement.Awake", - "payloadSchema": { - "targetType": "LeanTweenUIElement", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "LeanTweenUIElement", - "name": "greg.SYSTEM.ComponentInitialized.LeanTweenUIElement" - }, - { - "legacy": "deprecated.SYSTEM.LeanTweenUIElement.OnEnable", - "patchTarget": "Il2Cpp.LeanTweenUIElement::void OnEnable()", - "strategy": "Postfix", - "description": "Interop target LeanTweenUIElement.OnEnable", - "payloadSchema": { - "targetType": "LeanTweenUIElement", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "LeanTweenUIElement", - "name": "greg.SYSTEM.ComponentEnabled.LeanTweenUIElement" - }, - { - "legacy": "deprecated.SYSTEM.LeanTweenUIElement.OnDisable", - "patchTarget": "Il2Cpp.LeanTweenUIElement::void OnDisable()", - "strategy": "Postfix", - "description": "Interop target LeanTweenUIElement.OnDisable", - "payloadSchema": { - "targetType": "LeanTweenUIElement", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "LeanTweenUIElement", - "name": "greg.SYSTEM.ComponentDisabled.LeanTweenUIElement" - }, - { - "legacy": "deprecated.SYSTEM.LeanTweenUIElement.OnWaitForPressKey", - "patchTarget": "Il2Cpp.LeanTweenUIElement::void OnWaitForPressKey()", - "strategy": "Postfix", - "description": "Interop target LeanTweenUIElement.OnWaitForPressKey", - "payloadSchema": { - "targetType": "LeanTweenUIElement", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.OnWaitForPressKey" - }, - { - "legacy": "deprecated.SYSTEM.LeanTweenUIElement.Disabling", - "patchTarget": "Il2Cpp.LeanTweenUIElement::IEnumerator Disabling()", - "strategy": "Postfix", - "description": "Interop target LeanTweenUIElement.Disabling", - "payloadSchema": { - "targetType": "LeanTweenUIElement", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.Disabling" - }, - { - "legacy": "deprecated.SYSTEM.LeanTweenUIElement.TweenHorizontal", - "patchTarget": "Il2Cpp.LeanTweenUIElement::void TweenHorizontal(bool leanout)", - "strategy": "Postfix", - "description": "Interop target LeanTweenUIElement.TweenHorizontal", - "payloadSchema": { - "targetType": "LeanTweenUIElement", - "isStatic": false, - "leanout": "bool" - }, - "hookSubject": null, - "name": "greg.SYSTEM.TweenHorizontal" - }, - { - "legacy": "deprecated.SYSTEM.LeanTweenUIElement.TweenVertical", - "patchTarget": "Il2Cpp.LeanTweenUIElement::void TweenVertical(bool leanout)", - "strategy": "Postfix", - "description": "Interop target LeanTweenUIElement.TweenVertical", - "payloadSchema": { - "targetType": "LeanTweenUIElement", - "isStatic": false, - "leanout": "bool" - }, - "hookSubject": null, - "name": "greg.SYSTEM.TweenVertical" - }, - { - "legacy": "deprecated.SYSTEM.LeanTweenUIElement.TweenScaleInOut", - "patchTarget": "Il2Cpp.LeanTweenUIElement::IEnumerator TweenScaleInOut()", - "strategy": "Postfix", - "description": "Interop target LeanTweenUIElement.TweenScaleInOut", - "payloadSchema": { - "targetType": "LeanTweenUIElement", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.TweenScaleInOut" - }, - { - "legacy": "deprecated.SYSTEM.LeanTweenUIElement.KeepRotating", - "patchTarget": "Il2Cpp.LeanTweenUIElement::IEnumerator KeepRotating()", - "strategy": "Postfix", - "description": "Interop target LeanTweenUIElement.KeepRotating", - "payloadSchema": { - "targetType": "LeanTweenUIElement", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.KeepRotating" - }, - { - "legacy": "deprecated.SYSTEM.LeanTweenUIElement.OnDestroy", - "patchTarget": "Il2Cpp.LeanTweenUIElement::void OnDestroy()", - "strategy": "Postfix", - "description": "Interop target LeanTweenUIElement.OnDestroy", - "payloadSchema": { - "targetType": "LeanTweenUIElement", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "LeanTweenUIElement", - "name": "greg.SYSTEM.OnDestroy.LeanTweenUIElement" - }, - { - "legacy": "deprecated.SYSTEM.LoadingScreen.Awake", - "patchTarget": "Il2Cpp.LoadingScreen::void Awake()", - "strategy": "Postfix", - "description": "Interop target LoadingScreen.Awake", - "payloadSchema": { - "targetType": "LoadingScreen", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "LoadingScreen_e51858ee76", - "name": "greg.SYSTEM.ComponentInitialized.LoadingScreen_e51858ee76" - }, - { - "legacy": "deprecated.SYSTEM.LoadingScreen.Start", - "patchTarget": "Il2Cpp.LoadingScreen::IEnumerator Start()", - "strategy": "Postfix", - "description": "Interop target LoadingScreen.Start", - "payloadSchema": { - "targetType": "LoadingScreen", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "LoadingScreen_00c82eb8fa", - "name": "greg.SYSTEM.ComponentInitialized.LoadingScreen_00c82eb8fa" - }, - { - "legacy": "deprecated.SYSTEM.LoadingScreen.LoadGameScenesVoid", - "patchTarget": "Il2Cpp.LoadingScreen::void LoadGameScenesVoid(PlayerData playerData, List technicianData, Il2CppStructArray loadedScenes = null, Il2CppStructArray hiredTechnicians = null, List repairJobQueue = null)", - "strategy": "Postfix", - "description": "Interop target LoadingScreen.LoadGameScenesVoid", - "payloadSchema": { - "targetType": "LoadingScreen", - "isStatic": false, - "playerData": "PlayerData", - "technicianData": "List", - "loadedScenes": "Il2CppStructArray", - "hiredTechnicians": "Il2CppStructArray", - "repairJobQueue": "List" - }, - "hookSubject": null, - "name": "greg.SYSTEM.GameScenesVoidLoaded" - }, - { - "legacy": "deprecated.SYSTEM.LoadingScreen.LoadPlayerAndNPCDataWithDelay", - "patchTarget": "Il2Cpp.LoadingScreen::IEnumerator LoadPlayerAndNPCDataWithDelay(PlayerData playerData, List technicianData, Il2CppStructArray hiredTechnicians, List repairJobQueue)", - "strategy": "Postfix", - "description": "Interop target LoadingScreen.LoadPlayerAndNPCDataWithDelay", - "payloadSchema": { - "targetType": "LoadingScreen", - "isStatic": false, - "playerData": "PlayerData", - "technicianData": "List", - "hiredTechnicians": "Il2CppStructArray", - "repairJobQueue": "List" - }, - "hookSubject": null, - "name": "greg.SYSTEM.PlayerAndNPCDataWithDelayLoaded" - }, - { - "legacy": "deprecated.SYSTEM.LoadingScreen.LoadGameLoadScene", - "patchTarget": "Il2Cpp.LoadingScreen::IEnumerator LoadGameLoadScene(Il2CppStructArray loadedScenes = null)", - "strategy": "Postfix", - "description": "Interop target LoadingScreen.LoadGameLoadScene", - "payloadSchema": { - "targetType": "LoadingScreen", - "isStatic": false, - "loadedScenes": "Il2CppStructArray" - }, - "hookSubject": null, - "name": "greg.SYSTEM.GameLoadSceneLoaded" - }, - { - "legacy": "deprecated.SYSTEM.LoadingScreen.SetDifficualty", - "patchTarget": "Il2Cpp.LoadingScreen::void SetDifficualty(int i)", - "strategy": "Postfix", - "description": "Interop target LoadingScreen.SetDifficualty", - "payloadSchema": { - "targetType": "LoadingScreen", - "isStatic": false, - "i": "int" - }, - "hookSubject": null, - "name": "greg.SYSTEM.DifficualtySet" - }, - { - "legacy": "deprecated.SYSTEM.LoadingScreen.LoadLevel", - "patchTarget": "Il2Cpp.LoadingScreen::void LoadLevel(int sceneIndex)", - "strategy": "Postfix", - "description": "Interop target LoadingScreen.LoadLevel", - "payloadSchema": { - "targetType": "LoadingScreen", - "isStatic": false, - "sceneIndex": "int" - }, - "hookSubject": null, - "name": "greg.SYSTEM.LevelLoaded" - }, - { - "legacy": "deprecated.SYSTEM.LoadingScreen.UnLoadLevel", - "patchTarget": "Il2Cpp.LoadingScreen::void UnLoadLevel(int sceneIndex)", - "strategy": "Postfix", - "description": "Interop target LoadingScreen.UnLoadLevel", - "payloadSchema": { - "targetType": "LoadingScreen", - "isStatic": false, - "sceneIndex": "int" - }, - "hookSubject": null, - "name": "greg.SYSTEM.UnLoadLevel" - }, - { - "legacy": "deprecated.SYSTEM.LoadingScreen.AsynchronousLoad", - "patchTarget": "Il2Cpp.LoadingScreen::IEnumerator AsynchronousLoad(int sceneIndex)", - "strategy": "Postfix", - "description": "Interop target LoadingScreen.AsynchronousLoad", - "payloadSchema": { - "targetType": "LoadingScreen", - "isStatic": false, - "sceneIndex": "int" - }, - "hookSubject": null, - "name": "greg.SYSTEM.AsynchronousLoad" - }, - { - "legacy": "deprecated.SYSTEM.LoadingScreen.AsynchronousUnLoad", - "patchTarget": "Il2Cpp.LoadingScreen::IEnumerator AsynchronousUnLoad(int sceneIndex)", - "strategy": "Postfix", - "description": "Interop target LoadingScreen.AsynchronousUnLoad", - "payloadSchema": { - "targetType": "LoadingScreen", - "isStatic": false, - "sceneIndex": "int" - }, - "hookSubject": null, - "name": "greg.SYSTEM.AsynchronousUnLoad" - }, - { - "legacy": "deprecated.SYSTEM.LoadingScreen.IsSceneLoaded", - "patchTarget": "Il2Cpp.LoadingScreen::bool IsSceneLoaded(string name)", - "strategy": "Postfix", - "description": "Interop target LoadingScreen.IsSceneLoaded", - "payloadSchema": { - "targetType": "LoadingScreen", - "isStatic": false, - "name": "string" - }, - "hookSubject": null, - "name": "greg.SYSTEM.IsSceneLoaded" - }, - { - "legacy": "deprecated.SYSTEM.Localisation.Awake", - "patchTarget": "Il2Cpp.Localisation::void Awake()", - "strategy": "Postfix", - "description": "Interop target Localisation.Awake", - "payloadSchema": { - "targetType": "Localisation", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "Localisation", - "name": "greg.SYSTEM.ComponentInitialized.Localisation" - }, - { - "legacy": "deprecated.SYSTEM.Localisation.LoadLocalisation", - "patchTarget": "Il2Cpp.Localisation::Dictionary LoadLocalisation(int _uid)", - "strategy": "Postfix", - "description": "Interop target Localisation.LoadLocalisation", - "payloadSchema": { - "targetType": "Localisation", - "isStatic": false, - "_uid": "int" - }, - "hookSubject": null, - "name": "greg.SYSTEM.LocalisationLoaded" - }, - { - "legacy": "deprecated.SYSTEM.Localisation.ChangeLocalisation", - "patchTarget": "Il2Cpp.Localisation::void ChangeLocalisation(int _uid)", - "strategy": "Postfix", - "description": "Interop target Localisation.ChangeLocalisation", - "payloadSchema": { - "targetType": "Localisation", - "isStatic": false, - "_uid": "int" - }, - "hookSubject": null, - "name": "greg.SYSTEM.ChangeLocalisation" - }, - { - "legacy": "deprecated.SYSTEM.Localisation.ReturnTextByID", - "patchTarget": "Il2Cpp.Localisation::string ReturnTextByID(int _uid)", - "strategy": "Postfix", - "description": "Interop target Localisation.ReturnTextByID", - "payloadSchema": { - "targetType": "Localisation", - "isStatic": false, - "_uid": "int" - }, - "hookSubject": null, - "name": "greg.SYSTEM.ReturnTextByID" - }, - { - "legacy": "deprecated.SYSTEM.LocalisedText.Start", - "patchTarget": "Il2Cpp.LocalisedText::void Start()", - "strategy": "Postfix", - "description": "Interop target LocalisedText.Start", - "payloadSchema": { - "targetType": "LocalisedText", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "LocalisedText", - "name": "greg.SYSTEM.ComponentInitialized.LocalisedText" - }, - { - "legacy": "deprecated.SYSTEM.LocalisedText.ChangeText", - "patchTarget": "Il2Cpp.LocalisedText::void ChangeText()", - "strategy": "Postfix", - "description": "Interop target LocalisedText.ChangeText", - "payloadSchema": { - "targetType": "LocalisedText", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ChangeText" - }, - { - "legacy": "deprecated.SYSTEM.LocalisedText.SetText", - "patchTarget": "Il2Cpp.LocalisedText::void SetText(int _localisation_uid)", - "strategy": "Postfix", - "description": "Interop target LocalisedText.SetText", - "payloadSchema": { - "targetType": "LocalisedText", - "isStatic": false, - "_localisation_uid": "int" - }, - "hookSubject": null, - "name": "greg.SYSTEM.TextSet" - }, - { - "legacy": "deprecated.SYSTEM.LocalisedText.OnDestroy", - "patchTarget": "Il2Cpp.LocalisedText::void OnDestroy()", - "strategy": "Postfix", - "description": "Interop target LocalisedText.OnDestroy", - "payloadSchema": { - "targetType": "LocalisedText", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "LocalisedText", - "name": "greg.SYSTEM.OnDestroy.LocalisedText" - }, - { - "legacy": "deprecated.SYSTEM.MainGameManager.Awake", - "patchTarget": "Il2Cpp.MainGameManager::void Awake()", - "strategy": "Postfix", - "description": "Interop target MainGameManager.Awake", - "payloadSchema": { - "targetType": "MainGameManager", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "MainGameManager_1582892905", - "name": "greg.SYSTEM.ComponentInitialized.MainGameManager_1582892905" - }, - { - "legacy": "deprecated.SYSTEM.MainGameManager.Start", - "patchTarget": "Il2Cpp.MainGameManager::void Start()", - "strategy": "Postfix", - "description": "Interop target MainGameManager.Start", - "payloadSchema": { - "targetType": "MainGameManager", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "MainGameManager_a72cce1b62", - "name": "greg.SYSTEM.ComponentInitialized.MainGameManager_a72cce1b62" - }, - { - "legacy": "deprecated.SYSTEM.MainGameManager.ResetTrolleyPosition", - "patchTarget": "Il2Cpp.MainGameManager::void ResetTrolleyPosition()", - "strategy": "Postfix", - "description": "Interop target MainGameManager.ResetTrolleyPosition", - "payloadSchema": { - "targetType": "MainGameManager", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ResetTrolleyPosition" - }, - { - "legacy": "deprecated.SYSTEM.MainGameManager.ShuffleAvailableCustomers", - "patchTarget": "Il2Cpp.MainGameManager::void ShuffleAvailableCustomers()", - "strategy": "Postfix", - "description": "Interop target MainGameManager.ShuffleAvailableCustomers", - "payloadSchema": { - "targetType": "MainGameManager", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ShuffleAvailableCustomers" - }, - { - "legacy": "deprecated.SYSTEM.MainGameManager.ShuffleAvailableSubnets", - "patchTarget": "Il2Cpp.MainGameManager::void ShuffleAvailableSubnets()", - "strategy": "Postfix", - "description": "Interop target MainGameManager.ShuffleAvailableSubnets", - "payloadSchema": { - "targetType": "MainGameManager", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ShuffleAvailableSubnets" - }, - { - "legacy": "deprecated.SYSTEM.MainGameManager.IsSubnetValid", - "patchTarget": "Il2Cpp.MainGameManager::bool IsSubnetValid(string subnet)", - "strategy": "Postfix", - "description": "Interop target MainGameManager.IsSubnetValid", - "payloadSchema": { - "targetType": "MainGameManager", - "isStatic": false, - "subnet": "string" - }, - "hookSubject": null, - "name": "greg.SYSTEM.IsSubnetValid" - }, - { - "legacy": "deprecated.SYSTEM.MainGameManager.ShowCustomerCardsCanvas", - "patchTarget": "Il2Cpp.MainGameManager::void ShowCustomerCardsCanvas(CustomerBaseDoor _door)", - "strategy": "Postfix", - "description": "Interop target MainGameManager.ShowCustomerCardsCanvas", - "payloadSchema": { - "targetType": "MainGameManager", - "isStatic": false, - "_door": "CustomerBaseDoor" - }, - "hookSubject": null, - "name": "greg.SYSTEM.ShowCustomerCardsCanvas" - }, - { - "legacy": "deprecated.SYSTEM.MainGameManager.ButtonCustomerChosen", - "patchTarget": "Il2Cpp.MainGameManager::void ButtonCustomerChosen(int _cardID)", - "strategy": "Postfix", - "description": "Interop target MainGameManager.ButtonCustomerChosen", - "payloadSchema": { - "targetType": "MainGameManager", - "isStatic": false, - "_cardID": "int" - }, - "hookSubject": null, - "name": "greg.SYSTEM.ButtonCustomerChosen" - }, - { - "legacy": "deprecated.SYSTEM.MainGameManager.ButtonCancelCustomerChoice", - "patchTarget": "Il2Cpp.MainGameManager::void ButtonCancelCustomerChoice()", - "strategy": "Postfix", - "description": "Interop target MainGameManager.ButtonCancelCustomerChoice", - "payloadSchema": { - "targetType": "MainGameManager", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ButtonCancelCustomerChoice" - }, - { - "legacy": "deprecated.SYSTEM.MainGameManager.ShowBuyWallCanvas", - "patchTarget": "Il2Cpp.MainGameManager::void ShowBuyWallCanvas(Wall wall)", - "strategy": "Postfix", - "description": "Interop target MainGameManager.ShowBuyWallCanvas", - "payloadSchema": { - "targetType": "MainGameManager", - "isStatic": false, - "wall": "Wall" - }, - "hookSubject": null, - "name": "greg.SYSTEM.ShowBuyWallCanvas" - }, - { - "legacy": "deprecated.SYSTEM.MainGameManager.ButtonBuyWall", - "patchTarget": "Il2Cpp.MainGameManager::void ButtonBuyWall()", - "strategy": "Postfix", - "description": "Interop target MainGameManager.ButtonBuyWall", - "payloadSchema": { - "targetType": "MainGameManager", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ButtonBuyWall" - }, - { - "legacy": "deprecated.SYSTEM.MainGameManager.ButtonCancelBuyWall", - "patchTarget": "Il2Cpp.MainGameManager::void ButtonCancelBuyWall()", - "strategy": "Postfix", - "description": "Interop target MainGameManager.ButtonCancelBuyWall", - "payloadSchema": { - "targetType": "MainGameManager", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ButtonCancelBuyWall" - }, - { - "legacy": "deprecated.SYSTEM.MainGameManager.ShowNetworkConfigCanvas", - "patchTarget": "Il2Cpp.MainGameManager::void ShowNetworkConfigCanvas(NetworkSwitch networkSwitch)", - "strategy": "Postfix", - "description": "Interop target MainGameManager.ShowNetworkConfigCanvas", - "payloadSchema": { - "targetType": "MainGameManager", - "isStatic": false, - "networkSwitch": "NetworkSwitch" - }, - "hookSubject": null, - "name": "greg.SYSTEM.ShowNetworkConfigCanvas" - }, - { - "legacy": "deprecated.SYSTEM.MainGameManager.CloseNetworkConfigCanvas", - "patchTarget": "Il2Cpp.MainGameManager::void CloseNetworkConfigCanvas()", - "strategy": "Postfix", - "description": "Interop target MainGameManager.CloseNetworkConfigCanvas", - "payloadSchema": { - "targetType": "MainGameManager", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.CloseNetworkConfigCanvas" - }, - { - "legacy": "deprecated.SYSTEM.MainGameManager.OpenAnyCanvas", - "patchTarget": "Il2Cpp.MainGameManager::void OpenAnyCanvas()", - "strategy": "Postfix", - "description": "Interop target MainGameManager.OpenAnyCanvas", - "payloadSchema": { - "targetType": "MainGameManager", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.OpenAnyCanvas" - }, - { - "legacy": "deprecated.SYSTEM.MainGameManager.CloseAnyCanvas", - "patchTarget": "Il2Cpp.MainGameManager::void CloseAnyCanvas(bool isCustomerChoice = false)", - "strategy": "Postfix", - "description": "Interop target MainGameManager.CloseAnyCanvas", - "payloadSchema": { - "targetType": "MainGameManager", - "isStatic": false, - "isCustomerChoice": "bool" - }, - "hookSubject": null, - "name": "greg.SYSTEM.CloseAnyCanvas" - }, - { - "legacy": "deprecated.SYSTEM.MainGameManager.RemoveUsedSubnet", - "patchTarget": "Il2Cpp.MainGameManager::void RemoveUsedSubnet(string subnet)", - "strategy": "Postfix", - "description": "Interop target MainGameManager.RemoveUsedSubnet", - "payloadSchema": { - "targetType": "MainGameManager", - "isStatic": false, - "subnet": "string" - }, - "hookSubject": null, - "name": "greg.SYSTEM.oveUsedSubnetRemoved" - }, - { - "legacy": "deprecated.SYSTEM.MainGameManager.ReturnSubnet", - "patchTarget": "Il2Cpp.MainGameManager::void ReturnSubnet(string subnet)", - "strategy": "Postfix", - "description": "Interop target MainGameManager.ReturnSubnet", - "payloadSchema": { - "targetType": "MainGameManager", - "isStatic": false, - "subnet": "string" - }, - "hookSubject": null, - "name": "greg.SYSTEM.ReturnSubnet" - }, - { - "legacy": "deprecated.SYSTEM.MainGameManager.OnLoad", - "patchTarget": "Il2Cpp.MainGameManager::void OnLoad()", - "strategy": "Postfix", - "description": "Interop target MainGameManager.OnLoad", - "payloadSchema": { - "targetType": "MainGameManager", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "MainGameManager", - "name": "greg.SYSTEM.OnLoad.MainGameManager" - }, - { - "legacy": "deprecated.SYSTEM.MainGameManager.OnDestroy", - "patchTarget": "Il2Cpp.MainGameManager::void OnDestroy()", - "strategy": "Postfix", - "description": "Interop target MainGameManager.OnDestroy", - "payloadSchema": { - "targetType": "MainGameManager", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "MainGameManager", - "name": "greg.SYSTEM.OnDestroy.MainGameManager" - }, - { - "legacy": "deprecated.SYSTEM.MainGameManager.AutoSaveCoroutine", - "patchTarget": "Il2Cpp.MainGameManager::IEnumerator AutoSaveCoroutine()", - "strategy": "Postfix", - "description": "Interop target MainGameManager.AutoSaveCoroutine", - "payloadSchema": { - "targetType": "MainGameManager", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.AutoSaveCoroutine" - }, - { - "legacy": "deprecated.SYSTEM.MainGameManager.SetAutoSaveInterval", - "patchTarget": "Il2Cpp.MainGameManager::void SetAutoSaveInterval(float minutes)", - "strategy": "Postfix", - "description": "Interop target MainGameManager.SetAutoSaveInterval", - "payloadSchema": { - "targetType": "MainGameManager", - "isStatic": false, - "minutes": "float", - "hookSubject": "string" - }, - "hookSubject": "MainGameManager_floatminutes", - "name": "greg.SYSTEM.AutoSaveIntervalSet.MainGameManager_floatminutes" - }, - { - "legacy": "deprecated.SYSTEM.MainGameManager.SetAutoSaveEnabled", - "patchTarget": "Il2Cpp.MainGameManager::void SetAutoSaveEnabled(bool enabled)", - "strategy": "Postfix", - "description": "Interop target MainGameManager.SetAutoSaveEnabled", - "payloadSchema": { - "targetType": "MainGameManager", - "isStatic": false, - "enabled": "bool" - }, - "hookSubject": null, - "name": "greg.SYSTEM.AutoSaveEnabledSet" - }, - { - "legacy": "deprecated.SYSTEM.MainGameManager.RestartAutoSave", - "patchTarget": "Il2Cpp.MainGameManager::void RestartAutoSave()", - "strategy": "Postfix", - "description": "Interop target MainGameManager.RestartAutoSave", - "payloadSchema": { - "targetType": "MainGameManager", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.RestartAutoSave" - }, - { - "legacy": "deprecated.SYSTEM.MainGameManager.ReturnServerNameFromType", - "patchTarget": "Il2Cpp.MainGameManager::string ReturnServerNameFromType(int type)", - "strategy": "Postfix", - "description": "Interop target MainGameManager.ReturnServerNameFromType", - "payloadSchema": { - "targetType": "MainGameManager", - "isStatic": false, - "type": "int" - }, - "hookSubject": null, - "name": "greg.SYSTEM.ReturnServerNameFromType" - }, - { - "legacy": "deprecated.SYSTEM.MainGameManager.ReturnSwitchNameFromType", - "patchTarget": "Il2Cpp.MainGameManager::string ReturnSwitchNameFromType(int type)", - "strategy": "Postfix", - "description": "Interop target MainGameManager.ReturnSwitchNameFromType", - "payloadSchema": { - "targetType": "MainGameManager", - "isStatic": false, - "type": "int" - }, - "hookSubject": null, - "name": "greg.SYSTEM.ReturnSwitchNameFromType" - }, - { - "legacy": "deprecated.SYSTEM.MainGameManager.LoadTrolleyPosition", - "patchTarget": "Il2Cpp.MainGameManager::void LoadTrolleyPosition(Vector3 _position, Quaternion _rotation)", - "strategy": "Postfix", - "description": "Interop target MainGameManager.LoadTrolleyPosition", - "payloadSchema": { - "targetType": "MainGameManager", - "isStatic": false, - "_position": "Vector3", - "_rotation": "Quaternion" - }, - "hookSubject": null, - "name": "greg.SYSTEM.TrolleyPositionLoaded" - }, - { - "legacy": "deprecated.SYSTEM.MainGameManager.IsCustomerSuitableForBase", - "patchTarget": "Il2Cpp.MainGameManager::bool IsCustomerSuitableForBase(CustomerItem customer, int customerBaseID)", - "strategy": "Postfix", - "description": "Interop target MainGameManager.IsCustomerSuitableForBase", - "payloadSchema": { - "targetType": "MainGameManager", - "isStatic": false, - "customer": "CustomerItem", - "customerBaseID": "int" - }, - "hookSubject": null, - "name": "greg.SYSTEM.IsCustomerSuitableForBase" - }, - { - "legacy": "deprecated.SYSTEM.MainGameManager.OnApplicationQuit", - "patchTarget": "Il2Cpp.MainGameManager::void OnApplicationQuit()", - "strategy": "Postfix", - "description": "Interop target MainGameManager.OnApplicationQuit", - "payloadSchema": { - "targetType": "MainGameManager", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.OnApplicationQuit" - }, - { - "legacy": "deprecated.SYSTEM.MainMenu.Start", - "patchTarget": "Il2Cpp.MainMenu::void Start()", - "strategy": "Postfix", - "description": "Interop target MainMenu.Start", - "payloadSchema": { - "targetType": "MainMenu", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "MainMenu", - "name": "greg.SYSTEM.ComponentInitialized.MainMenu" - }, - { - "legacy": "deprecated.SYSTEM.MainMenu.Continue", - "patchTarget": "Il2Cpp.MainMenu::void Continue()", - "strategy": "Postfix", - "description": "Interop target MainMenu.Continue", - "payloadSchema": { - "targetType": "MainMenu", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.Continue" - }, - { - "legacy": "deprecated.SYSTEM.MainMenu.NewGame", - "patchTarget": "Il2Cpp.MainMenu::void NewGame()", - "strategy": "Postfix", - "description": "Interop target MainMenu.NewGame", - "payloadSchema": { - "targetType": "MainMenu", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.NewGame" - }, - { - "legacy": "deprecated.SYSTEM.MainMenu.QuitGame", - "patchTarget": "Il2Cpp.MainMenu::void QuitGame()", - "strategy": "Postfix", - "description": "Interop target MainMenu.QuitGame", - "payloadSchema": { - "targetType": "MainMenu", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.QuitGame" - }, - { - "legacy": "deprecated.SYSTEM.MainMenu.LoadGame", - "patchTarget": "Il2Cpp.MainMenu::void LoadGame()", - "strategy": "Postfix", - "description": "Interop target MainMenu.LoadGame", - "payloadSchema": { - "targetType": "MainMenu", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.GameLoaded" - }, - { - "legacy": "deprecated.SYSTEM.MainMenu.HideMiddleMenu", - "patchTarget": "Il2Cpp.MainMenu::void HideMiddleMenu()", - "strategy": "Postfix", - "description": "Interop target MainMenu.HideMiddleMenu", - "payloadSchema": { - "targetType": "MainMenu", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.HideMiddleMenu" - }, - { - "legacy": "deprecated.SYSTEM.MainMenu.Load", - "patchTarget": "Il2Cpp.MainMenu::void Load(TextMeshProUGUI _text)", - "strategy": "Postfix", - "description": "Interop target MainMenu.Load", - "payloadSchema": { - "targetType": "MainMenu", - "isStatic": false, - "_text": "TextMeshProUGUI", - "hookSubject": "string" - }, - "hookSubject": "MainMenu_TextMeshProUGUI_text", - "name": "greg.SYSTEM.Load.MainMenu_TextMeshProUGUI_text" - }, - { - "legacy": "deprecated.SYSTEM.MainMenu.Settings", - "patchTarget": "Il2Cpp.MainMenu::void Settings()", - "strategy": "Postfix", - "description": "Interop target MainMenu.Settings", - "payloadSchema": { - "targetType": "MainMenu", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.tingsSet" - }, - { - "legacy": "deprecated.SYSTEM.MainMenuCamera.Start", - "patchTarget": "Il2Cpp.MainMenuCamera::void Start()", - "strategy": "Postfix", - "description": "Interop target MainMenuCamera.Start", - "payloadSchema": { - "targetType": "MainMenuCamera", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "MainMenuCamera", - "name": "greg.SYSTEM.ComponentInitialized.MainMenuCamera" - }, - { - "legacy": "deprecated.SYSTEM.MainMenuCamera.setmount", - "patchTarget": "Il2Cpp.MainMenuCamera::void setmount(Transform newmount)", - "strategy": "Postfix", - "description": "Interop target MainMenuCamera.setmount", - "payloadSchema": { - "targetType": "MainMenuCamera", - "isStatic": false, - "newmount": "Transform" - }, - "hookSubject": null, - "name": "greg.SYSTEM.setmount" - }, - { - "legacy": "deprecated.SYSTEM.MusicPlayer.Awake", - "patchTarget": "Il2Cpp.MusicPlayer::override void Awake()", - "strategy": "Postfix", - "description": "Interop target MusicPlayer.Awake", - "payloadSchema": { - "targetType": "MusicPlayer", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "MusicPlayer", - "name": "greg.SYSTEM.ComponentInitialized.MusicPlayer" - }, - { - "legacy": "deprecated.SYSTEM.MusicPlayer.InteractOnClick", - "patchTarget": "Il2Cpp.MusicPlayer::override void InteractOnClick()", - "strategy": "Postfix", - "description": "Interop target MusicPlayer.InteractOnClick", - "payloadSchema": { - "targetType": "MusicPlayer", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "MusicPlayer", - "name": "greg.SYSTEM.InteractOnClick.MusicPlayer" - }, - { - "legacy": "deprecated.SYSTEM.MusicPlayer.PlayRandomSong", - "patchTarget": "Il2Cpp.MusicPlayer::void PlayRandomSong()", - "strategy": "Postfix", - "description": "Interop target MusicPlayer.PlayRandomSong", - "payloadSchema": { - "targetType": "MusicPlayer", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.PlayRandomSong" - }, - { - "legacy": "deprecated.SYSTEM.MusicPlayer.InteractOnHover", - "patchTarget": "Il2Cpp.MusicPlayer::override void InteractOnHover(RaycastHit hit)", - "strategy": "Postfix", - "description": "Interop target MusicPlayer.InteractOnHover", - "payloadSchema": { - "targetType": "MusicPlayer", - "isStatic": false, - "hit": "RaycastHit", - "hookSubject": "string" - }, - "hookSubject": "MusicPlayer_RaycastHithit", - "name": "greg.SYSTEM.InteractOnHover.MusicPlayer_RaycastHithit" - }, - { - "legacy": "deprecated.SYSTEM.MusicPlayer.OnHoverOver", - "patchTarget": "Il2Cpp.MusicPlayer::override void OnHoverOver()", - "strategy": "Postfix", - "description": "Interop target MusicPlayer.OnHoverOver", - "payloadSchema": { - "targetType": "MusicPlayer", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "MusicPlayer", - "name": "greg.SYSTEM.OnHoverOver.MusicPlayer" - }, - { - "legacy": "deprecated.NETWORK.NetworkMap.Awake", - "patchTarget": "Il2Cpp.NetworkMap::void Awake()", - "strategy": "Postfix", - "description": "Interop target NetworkMap.Awake", - "payloadSchema": { - "targetType": "NetworkMap", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "NetworkMap", - "name": "greg.NETWORK.ComponentInitialized.NetworkMap" - }, - { - "legacy": "deprecated.NETWORK.NetworkMap.ClearMap", - "patchTarget": "Il2Cpp.NetworkMap::void ClearMap()", - "strategy": "Postfix", - "description": "Interop target NetworkMap.ClearMap", - "payloadSchema": { - "targetType": "NetworkMap", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.NETWORK.ClearMap" - }, - { - "legacy": "deprecated.NETWORK.NetworkMap.RegisterCustomerBase", - "patchTarget": "Il2Cpp.NetworkMap::void RegisterCustomerBase(CustomerBase customerBase)", - "strategy": "Postfix", - "description": "Interop target NetworkMap.RegisterCustomerBase", - "payloadSchema": { - "targetType": "NetworkMap", - "isStatic": false, - "customerBase": "CustomerBase" - }, - "hookSubject": null, - "name": "greg.NETWORK.RegisterCustomerBase" - }, - { - "legacy": "deprecated.NETWORK.NetworkMap.RegisterServer", - "patchTarget": "Il2Cpp.NetworkMap::void RegisterServer(Server server)", - "strategy": "Postfix", - "description": "Interop target NetworkMap.RegisterServer", - "payloadSchema": { - "targetType": "NetworkMap", - "isStatic": false, - "server": "Server" - }, - "hookSubject": null, - "name": "greg.NETWORK.RegisterServer" - }, - { - "legacy": "deprecated.NETWORK.NetworkMap.RegisterSwitch", - "patchTarget": "Il2Cpp.NetworkMap::void RegisterSwitch(NetworkSwitch networkSwitch)", - "strategy": "Postfix", - "description": "Interop target NetworkMap.RegisterSwitch", - "payloadSchema": { - "targetType": "NetworkMap", - "isStatic": false, - "networkSwitch": "NetworkSwitch" - }, - "hookSubject": null, - "name": "greg.NETWORK.RegisterSwitch" - }, - { - "legacy": "deprecated.NETWORK.NetworkMap.UpdateCustomerServerCountAndSpeed", - "patchTarget": "Il2Cpp.NetworkMap::void UpdateCustomerServerCountAndSpeed(int customerId, int serverCount, float speed)", - "strategy": "Postfix", - "description": "Interop target NetworkMap.UpdateCustomerServerCountAndSpeed", - "payloadSchema": { - "targetType": "NetworkMap", - "isStatic": false, - "customerId": "int", - "serverCount": "int", - "speed": "float" - }, - "hookSubject": null, - "name": "greg.NETWORK.CustomerServerCountAndSpeedChanged" - }, - { - "legacy": "deprecated.NETWORK.NetworkMap.UpdateDeviceCustomerID", - "patchTarget": "Il2Cpp.NetworkMap::void UpdateDeviceCustomerID(string deviceName, int customerID)", - "strategy": "Postfix", - "description": "Interop target NetworkMap.UpdateDeviceCustomerID", - "payloadSchema": { - "targetType": "NetworkMap", - "isStatic": false, - "deviceName": "string", - "customerID": "int" - }, - "hookSubject": null, - "name": "greg.NETWORK.DeviceCustomerIDChanged" - }, - { - "legacy": "deprecated.NETWORK.NetworkMap.AddDevice", - "patchTarget": "Il2Cpp.NetworkMap::void AddDevice(string name, CableLink.TypeOfLink type, int customerID = -1)", - "strategy": "Postfix", - "description": "Interop target NetworkMap.AddDevice", - "payloadSchema": { - "targetType": "NetworkMap", - "isStatic": false, - "name": "string", - "type": "CableLink.TypeOfLink", - "customerID": "int" - }, - "hookSubject": null, - "name": "greg.NETWORK.DeviceAdded" - }, - { - "legacy": "deprecated.NETWORK.NetworkMap.RemoveDevice", - "patchTarget": "Il2Cpp.NetworkMap::void RemoveDevice(string name)", - "strategy": "Postfix", - "description": "Interop target NetworkMap.RemoveDevice", - "payloadSchema": { - "targetType": "NetworkMap", - "isStatic": false, - "name": "string" - }, - "hookSubject": null, - "name": "greg.NETWORK.oveDeviceRemoved" - }, - { - "legacy": "deprecated.NETWORK.NetworkMap.Connect", - "patchTarget": "Il2Cpp.NetworkMap::void Connect(string from, string to)", - "strategy": "Postfix", - "description": "Interop target NetworkMap.Connect", - "payloadSchema": { - "targetType": "NetworkMap", - "isStatic": false, - "from": "string", - "to": "string" - }, - "hookSubject": null, - "name": "greg.NETWORK.Connect" - }, - { - "legacy": "deprecated.NETWORK.NetworkMap.Disconnect", - "patchTarget": "Il2Cpp.NetworkMap::void Disconnect(string from, string to)", - "strategy": "Postfix", - "description": "Interop target NetworkMap.Disconnect", - "payloadSchema": { - "targetType": "NetworkMap", - "isStatic": false, - "from": "string", - "to": "string" - }, - "hookSubject": null, - "name": "greg.NETWORK.Disconnect" - }, - { - "legacy": "deprecated.NETWORK.NetworkMap.FindAllRoutes", - "patchTarget": "Il2Cpp.NetworkMap::List> FindAllRoutes(string baseName, string serverName)", - "strategy": "Postfix", - "description": "Interop target NetworkMap.FindAllRoutes", - "payloadSchema": { - "targetType": "NetworkMap", - "isStatic": false, - "baseName": "string", - "serverName": "string" - }, - "hookSubject": null, - "name": "greg.NETWORK.FindAllRoutes" - }, - { - "legacy": "deprecated.NETWORK.NetworkMap.FindPhysicalPath", - "patchTarget": "Il2Cpp.NetworkMap::List> FindPhysicalPath(string start, string target)", - "strategy": "Postfix", - "description": "Interop target NetworkMap.FindPhysicalPath", - "payloadSchema": { - "targetType": "NetworkMap", - "isStatic": false, - "start": "string", - "target": "string" - }, - "hookSubject": null, - "name": "greg.NETWORK.FindPhysicalPath" - }, - { - "legacy": "deprecated.NETWORK.NetworkMap.GenerateDeviceName", - "patchTarget": "Il2Cpp.NetworkMap::string GenerateDeviceName(CableLink.TypeOfLink type, Vector3 position)", - "strategy": "Postfix", - "description": "Interop target NetworkMap.GenerateDeviceName", - "payloadSchema": { - "targetType": "NetworkMap", - "isStatic": false, - "type": "CableLink.TypeOfLink", - "position": "Vector3" - }, - "hookSubject": null, - "name": "greg.NETWORK.GenerateDeviceName" - }, - { - "legacy": "deprecated.NETWORK.NetworkMap.RegisterCableConnection", - "patchTarget": "Il2Cpp.NetworkMap::void RegisterCableConnection(int cableId, Vector3 startPos, Vector3 endPos, CableLink.TypeOfLink startType, CableLink.TypeOfLink endType, string startSwitchID = \"\", string endSwitchID = \"\", int startCustomerID = -1, int endCustomerID = -1, string startServerID = \"\", string endServerID = \"\")", - "strategy": "Postfix", - "description": "Interop target NetworkMap.RegisterCableConnection", - "payloadSchema": { - "targetType": "NetworkMap", - "isStatic": false, - "cableId": "int", - "startPos": "Vector3", - "endPos": "Vector3", - "startType": "CableLink.TypeOfLink", - "endType": "CableLink.TypeOfLink", - "startSwitchID": "string", - "endSwitchID": "string", - "startCustomerID": "int", - "endCustomerID": "int", - "startServerID": "string", - "endServerID": "string" - }, - "hookSubject": null, - "name": "greg.NETWORK.RegisterCableConnection" - }, - { - "legacy": "deprecated.NETWORK.NetworkMap.AddSwitchConnection", - "patchTarget": "Il2Cpp.NetworkMap::void AddSwitchConnection(string switchName, string deviceName)", - "strategy": "Postfix", - "description": "Interop target NetworkMap.AddSwitchConnection", - "payloadSchema": { - "targetType": "NetworkMap", - "isStatic": false, - "switchName": "string", - "deviceName": "string" - }, - "hookSubject": null, - "name": "greg.NETWORK.SwitchConnectionAdded" - }, - { - "legacy": "deprecated.NETWORK.NetworkMap.RemoveCableConnection", - "patchTarget": "Il2Cpp.NetworkMap::void RemoveCableConnection(int cableId)", - "strategy": "Postfix", - "description": "Interop target NetworkMap.RemoveCableConnection", - "payloadSchema": { - "targetType": "NetworkMap", - "isStatic": false, - "cableId": "int" - }, - "hookSubject": null, - "name": "greg.NETWORK.oveCableConnectionRemoved" - }, - { - "legacy": "deprecated.NETWORK.NetworkMap.RemoveIsolatedDevices", - "patchTarget": "Il2Cpp.NetworkMap::void RemoveIsolatedDevices()", - "strategy": "Postfix", - "description": "Interop target NetworkMap.RemoveIsolatedDevices", - "payloadSchema": { - "targetType": "NetworkMap", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.NETWORK.oveIsolatedDevicesRemoved" - }, - { - "legacy": "deprecated.NETWORK.NetworkMap.PrintNetworkMap", - "patchTarget": "Il2Cpp.NetworkMap::string PrintNetworkMap()", - "strategy": "Postfix", - "description": "Interop target NetworkMap.PrintNetworkMap", - "payloadSchema": { - "targetType": "NetworkMap", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.NETWORK.PrintNetworkMap" - }, - { - "legacy": "deprecated.NETWORK.NetworkMap.IsIpAddressDuplicate", - "patchTarget": "Il2Cpp.NetworkMap::bool IsIpAddressDuplicate(string ip, Server serverToExclude)", - "strategy": "Postfix", - "description": "Interop target NetworkMap.IsIpAddressDuplicate", - "payloadSchema": { - "targetType": "NetworkMap", - "isStatic": false, - "ip": "string", - "serverToExclude": "Server" - }, - "hookSubject": null, - "name": "greg.NETWORK.IsIpAddressDuplicate" - }, - { - "legacy": "deprecated.NETWORK.NetworkMap.AddBrokenServer", - "patchTarget": "Il2Cpp.NetworkMap::void AddBrokenServer(Server server)", - "strategy": "Postfix", - "description": "Interop target NetworkMap.AddBrokenServer", - "payloadSchema": { - "targetType": "NetworkMap", - "isStatic": false, - "server": "Server" - }, - "hookSubject": null, - "name": "greg.NETWORK.BrokenServerAdded" - }, - { - "legacy": "deprecated.NETWORK.NetworkMap.AddBrokenSwitch", - "patchTarget": "Il2Cpp.NetworkMap::void AddBrokenSwitch(NetworkSwitch networkSwitch)", - "strategy": "Postfix", - "description": "Interop target NetworkMap.AddBrokenSwitch", - "payloadSchema": { - "targetType": "NetworkMap", - "isStatic": false, - "networkSwitch": "NetworkSwitch" - }, - "hookSubject": null, - "name": "greg.NETWORK.BrokenSwitchAdded" - }, - { - "legacy": "deprecated.NETWORK.NetworkMap.RemoveBrokenServer", - "patchTarget": "Il2Cpp.NetworkMap::void RemoveBrokenServer(string serverId)", - "strategy": "Postfix", - "description": "Interop target NetworkMap.RemoveBrokenServer", - "payloadSchema": { - "targetType": "NetworkMap", - "isStatic": false, - "serverId": "string" - }, - "hookSubject": null, - "name": "greg.NETWORK.oveBrokenServerRemoved" - }, - { - "legacy": "deprecated.NETWORK.NetworkMap.RemoveBrokenSwitch", - "patchTarget": "Il2Cpp.NetworkMap::void RemoveBrokenSwitch(string switchId)", - "strategy": "Postfix", - "description": "Interop target NetworkMap.RemoveBrokenSwitch", - "payloadSchema": { - "targetType": "NetworkMap", - "isStatic": false, - "switchId": "string" - }, - "hookSubject": null, - "name": "greg.NETWORK.oveBrokenSwitchRemoved" - }, - { - "legacy": "deprecated.NETWORK.NetworkMap.IsPatchPanelPort", - "patchTarget": "Il2Cpp.NetworkMap::bool IsPatchPanelPort(string deviceName)", - "strategy": "Postfix", - "description": "Interop target NetworkMap.IsPatchPanelPort", - "payloadSchema": { - "targetType": "NetworkMap", - "isStatic": false, - "deviceName": "string" - }, - "hookSubject": null, - "name": "greg.NETWORK.IsPatchPanelPort" - }, - { - "legacy": "deprecated.NETWORK.NetworkMap.ResolveThroughPatchPanel", - "patchTarget": "Il2Cpp.NetworkMap::string ResolveThroughPatchPanel(string patchPanelPort, string fromDevice)", - "strategy": "Postfix", - "description": "Interop target NetworkMap.ResolveThroughPatchPanel", - "payloadSchema": { - "targetType": "NetworkMap", - "isStatic": false, - "patchPanelPort": "string", - "fromDevice": "string" - }, - "hookSubject": null, - "name": "greg.NETWORK.ResolveThroughPatchPanel" - }, - { - "legacy": "deprecated.NETWORK.NetworkMap.CreateLACPGroup", - "patchTarget": "Il2Cpp.NetworkMap::int CreateLACPGroup(string deviceA, string deviceB, List cableIds)", - "strategy": "Postfix", - "description": "Interop target NetworkMap.CreateLACPGroup", - "payloadSchema": { - "targetType": "NetworkMap", - "isStatic": false, - "deviceA": "string", - "deviceB": "string", - "cableIds": "List" - }, - "hookSubject": null, - "name": "greg.NETWORK.CreateLACPGroup" - }, - { - "legacy": "deprecated.NETWORK.NetworkMap.RemoveLACPGroup", - "patchTarget": "Il2Cpp.NetworkMap::void RemoveLACPGroup(int groupId)", - "strategy": "Postfix", - "description": "Interop target NetworkMap.RemoveLACPGroup", - "payloadSchema": { - "targetType": "NetworkMap", - "isStatic": false, - "groupId": "int" - }, - "hookSubject": null, - "name": "greg.NETWORK.oveLACPGroupRemoved" - }, - { - "legacy": "deprecated.NETWORK.NetworkMap.RemoveCableFromLACPGroups", - "patchTarget": "Il2Cpp.NetworkMap::void RemoveCableFromLACPGroups(int cableId)", - "strategy": "Postfix", - "description": "Interop target NetworkMap.RemoveCableFromLACPGroups", - "payloadSchema": { - "targetType": "NetworkMap", - "isStatic": false, - "cableId": "int" - }, - "hookSubject": null, - "name": "greg.NETWORK.oveCableFromLACPGroupsRemoved" - }, - { - "legacy": "deprecated.NETWORK.NetworkMap.SetLACPGroups", - "patchTarget": "Il2Cpp.NetworkMap::void SetLACPGroups(Dictionary groups)", - "strategy": "Postfix", - "description": "Interop target NetworkMap.SetLACPGroups", - "payloadSchema": { - "targetType": "NetworkMap", - "isStatic": false, - "groups": "Dictionary" - }, - "hookSubject": null, - "name": "greg.NETWORK.LACPGroupsSet" - }, - { - "legacy": "deprecated.NETWORK.NetworkSwitch.Awake", - "patchTarget": "Il2Cpp.NetworkSwitch::override void Awake()", - "strategy": "Postfix", - "description": "Interop target NetworkSwitch.Awake", - "payloadSchema": { - "targetType": "NetworkSwitch", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "NetworkSwitch_3f0883918d", - "name": "greg.NETWORK.ComponentInitialized.NetworkSwitch_3f0883918d" - }, - { - "legacy": "deprecated.NETWORK.NetworkSwitch.Start", - "patchTarget": "Il2Cpp.NetworkSwitch::void Start()", - "strategy": "Postfix", - "description": "Interop target NetworkSwitch.Start", - "payloadSchema": { - "targetType": "NetworkSwitch", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "NetworkSwitch_e1ad1a239e", - "name": "greg.NETWORK.ComponentInitialized.NetworkSwitch_e1ad1a239e" - }, - { - "legacy": "deprecated.NETWORK.NetworkSwitch.PowerButton", - "patchTarget": "Il2Cpp.NetworkSwitch::void PowerButton(bool forceState = false)", - "strategy": "Postfix", - "description": "Interop target NetworkSwitch.PowerButton", - "payloadSchema": { - "targetType": "NetworkSwitch", - "isStatic": false, - "forceState": "bool" - }, - "hookSubject": null, - "name": "greg.NETWORK.PowerButton" - }, - { - "legacy": "deprecated.NETWORK.NetworkSwitch.TurnOffCommonFunctions", - "patchTarget": "Il2Cpp.NetworkSwitch::void TurnOffCommonFunctions()", - "strategy": "Postfix", - "description": "Interop target NetworkSwitch.TurnOffCommonFunctions", - "payloadSchema": { - "targetType": "NetworkSwitch", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.NETWORK.TurnOffCommonFunctions" - }, - { - "legacy": "deprecated.NETWORK.NetworkSwitch.TurnOnCommonFunction", - "patchTarget": "Il2Cpp.NetworkSwitch::void TurnOnCommonFunction()", - "strategy": "Postfix", - "description": "Interop target NetworkSwitch.TurnOnCommonFunction", - "payloadSchema": { - "targetType": "NetworkSwitch", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.NETWORK.TurnOnCommonFunction" - }, - { - "legacy": "deprecated.NETWORK.NetworkSwitch.IsAnyCableConnected", - "patchTarget": "Il2Cpp.NetworkSwitch::bool IsAnyCableConnected()", - "strategy": "Postfix", - "description": "Interop target NetworkSwitch.IsAnyCableConnected", - "payloadSchema": { - "targetType": "NetworkSwitch", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "NetworkSwitch", - "name": "greg.NETWORK.IsAnyCableConnected.NetworkSwitch" - }, - { - "legacy": "deprecated.NETWORK.NetworkSwitch.InteractOnClick", - "patchTarget": "Il2Cpp.NetworkSwitch::override void InteractOnClick()", - "strategy": "Postfix", - "description": "Interop target NetworkSwitch.InteractOnClick", - "payloadSchema": { - "targetType": "NetworkSwitch", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "NetworkSwitch", - "name": "greg.NETWORK.InteractOnClick.NetworkSwitch" - }, - { - "legacy": "deprecated.NETWORK.NetworkSwitch.InteractOnHover", - "patchTarget": "Il2Cpp.NetworkSwitch::override void InteractOnHover(RaycastHit hit)", - "strategy": "Postfix", - "description": "Interop target NetworkSwitch.InteractOnHover", - "payloadSchema": { - "targetType": "NetworkSwitch", - "isStatic": false, - "hit": "RaycastHit", - "hookSubject": "string" - }, - "hookSubject": "NetworkSwitch_RaycastHithit", - "name": "greg.NETWORK.InteractOnHover.NetworkSwitch_RaycastHithit" - }, - { - "legacy": "deprecated.NETWORK.NetworkSwitch.SwitchInsertedInRack", - "patchTarget": "Il2Cpp.NetworkSwitch::void SwitchInsertedInRack(SwitchSaveData switchSaveData = null)", - "strategy": "Postfix", - "description": "Interop target NetworkSwitch.SwitchInsertedInRack", - "payloadSchema": { - "targetType": "NetworkSwitch", - "isStatic": false, - "switchSaveData": "SwitchSaveData" - }, - "hookSubject": null, - "name": "greg.NETWORK.SwitchInsertedInRack" - }, - { - "legacy": "deprecated.NETWORK.NetworkSwitch.DisconnectCablesWhenSwitchIsOff", - "patchTarget": "Il2Cpp.NetworkSwitch::void DisconnectCablesWhenSwitchIsOff()", - "strategy": "Postfix", - "description": "Interop target NetworkSwitch.DisconnectCablesWhenSwitchIsOff", - "payloadSchema": { - "targetType": "NetworkSwitch", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.NETWORK.DisconnectCablesWhenSwitchIsOff" - }, - { - "legacy": "deprecated.NETWORK.NetworkSwitch.HandleNewCableWhileOff", - "patchTarget": "Il2Cpp.NetworkSwitch::void HandleNewCableWhileOff(int cableId)", - "strategy": "Postfix", - "description": "Interop target NetworkSwitch.HandleNewCableWhileOff", - "payloadSchema": { - "targetType": "NetworkSwitch", - "isStatic": false, - "cableId": "int" - }, - "hookSubject": null, - "name": "greg.NETWORK.HandleNewCableWhileOff" - }, - { - "legacy": "deprecated.NETWORK.NetworkSwitch.BrekingInProgress", - "patchTarget": "Il2Cpp.NetworkSwitch::IEnumerator BrekingInProgress()", - "strategy": "Postfix", - "description": "Interop target NetworkSwitch.BrekingInProgress", - "payloadSchema": { - "targetType": "NetworkSwitch", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.NETWORK.BrekingInProgress" - }, - { - "legacy": "deprecated.NETWORK.NetworkSwitch.UpdateScreenUI", - "patchTarget": "Il2Cpp.NetworkSwitch::void UpdateScreenUI()", - "strategy": "Postfix", - "description": "Interop target NetworkSwitch.UpdateScreenUI", - "payloadSchema": { - "targetType": "NetworkSwitch", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.NETWORK.ScreenUIChanged" - }, - { - "legacy": "deprecated.NETWORK.NetworkSwitch.ItIsBroken", - "patchTarget": "Il2Cpp.NetworkSwitch::void ItIsBroken()", - "strategy": "Postfix", - "description": "Interop target NetworkSwitch.ItIsBroken", - "payloadSchema": { - "targetType": "NetworkSwitch", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.NETWORK.ItIsBroken" - }, - { - "legacy": "deprecated.NETWORK.NetworkSwitch.DisconnectCables", - "patchTarget": "Il2Cpp.NetworkSwitch::void DisconnectCables()", - "strategy": "Postfix", - "description": "Interop target NetworkSwitch.DisconnectCables", - "payloadSchema": { - "targetType": "NetworkSwitch", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.NETWORK.DisconnectCables" - }, - { - "legacy": "deprecated.NETWORK.NetworkSwitch.ReconnectCables", - "patchTarget": "Il2Cpp.NetworkSwitch::void ReconnectCables()", - "strategy": "Postfix", - "description": "Interop target NetworkSwitch.ReconnectCables", - "payloadSchema": { - "targetType": "NetworkSwitch", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.NETWORK.ReconnectCables" - }, - { - "legacy": "deprecated.NETWORK.NetworkSwitch.ValidateRackPosition", - "patchTarget": "Il2Cpp.NetworkSwitch::bool ValidateRackPosition()", - "strategy": "Postfix", - "description": "Interop target NetworkSwitch.ValidateRackPosition", - "payloadSchema": { - "targetType": "NetworkSwitch", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.NETWORK.ValidateRackPosition" - }, - { - "legacy": "deprecated.NETWORK.NetworkSwitch.ButtonShowNetworkSwitchConfig", - "patchTarget": "Il2Cpp.NetworkSwitch::void ButtonShowNetworkSwitchConfig()", - "strategy": "Postfix", - "description": "Interop target NetworkSwitch.ButtonShowNetworkSwitchConfig", - "payloadSchema": { - "targetType": "NetworkSwitch", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.NETWORK.ButtonShowNetworkSwitchConfig" - }, - { - "legacy": "deprecated.NETWORK.NetworkSwitch.ClearWarningSign", - "patchTarget": "Il2Cpp.NetworkSwitch::void ClearWarningSign(bool isPreserved = false)", - "strategy": "Postfix", - "description": "Interop target NetworkSwitch.ClearWarningSign", - "payloadSchema": { - "targetType": "NetworkSwitch", - "isStatic": false, - "isPreserved": "bool" - }, - "hookSubject": null, - "name": "greg.NETWORK.ClearWarningSign" - }, - { - "legacy": "deprecated.NETWORK.NetworkSwitch.ClearErrorSign", - "patchTarget": "Il2Cpp.NetworkSwitch::void ClearErrorSign()", - "strategy": "Postfix", - "description": "Interop target NetworkSwitch.ClearErrorSign", - "payloadSchema": { - "targetType": "NetworkSwitch", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.NETWORK.ClearErrorSign" - }, - { - "legacy": "deprecated.NETWORK.NetworkSwitch.OnDestroy", - "patchTarget": "Il2Cpp.NetworkSwitch::override void OnDestroy()", - "strategy": "Postfix", - "description": "Interop target NetworkSwitch.OnDestroy", - "payloadSchema": { - "targetType": "NetworkSwitch", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "NetworkSwitch", - "name": "greg.NETWORK.OnDestroy.NetworkSwitch" - }, - { - "legacy": "deprecated.NETWORK.NetworkSwitch.SetPowerLightMaterial", - "patchTarget": "Il2Cpp.NetworkSwitch::void SetPowerLightMaterial(Material material)", - "strategy": "Postfix", - "description": "Interop target NetworkSwitch.SetPowerLightMaterial", - "payloadSchema": { - "targetType": "NetworkSwitch", - "isStatic": false, - "material": "Material" - }, - "hookSubject": null, - "name": "greg.NETWORK.PowerLightMaterialSet" - }, - { - "legacy": "deprecated.NETWORK.NetworkSwitch.RepairDevice", - "patchTarget": "Il2Cpp.NetworkSwitch::void RepairDevice()", - "strategy": "Postfix", - "description": "Interop target NetworkSwitch.RepairDevice", - "payloadSchema": { - "targetType": "NetworkSwitch", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.NETWORK.DeviceRepaired" - }, - { - "legacy": "deprecated.NETWORK.NetworkSwitchConfiguration.Awake", - "patchTarget": "Il2Cpp.NetworkSwitchConfiguration::void Awake()", - "strategy": "Postfix", - "description": "Interop target NetworkSwitchConfiguration.Awake", - "payloadSchema": { - "targetType": "NetworkSwitchConfiguration", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "NetworkSwitchConfiguration", - "name": "greg.NETWORK.ComponentInitialized.NetworkSwitchConfiguration" - }, - { - "legacy": "deprecated.NETWORK.NetworkSwitchConfiguration.OpenConfig", - "patchTarget": "Il2Cpp.NetworkSwitchConfiguration::void OpenConfig(NetworkSwitch networkSwitch)", - "strategy": "Postfix", - "description": "Interop target NetworkSwitchConfiguration.OpenConfig", - "payloadSchema": { - "targetType": "NetworkSwitchConfiguration", - "isStatic": false, - "networkSwitch": "NetworkSwitch" - }, - "hookSubject": null, - "name": "greg.NETWORK.OpenConfig" - }, - { - "legacy": "deprecated.NETWORK.NetworkSwitchConfiguration.RefreshPortDisplay", - "patchTarget": "Il2Cpp.NetworkSwitchConfiguration::void RefreshPortDisplay()", - "strategy": "Postfix", - "description": "Interop target NetworkSwitchConfiguration.RefreshPortDisplay", - "payloadSchema": { - "targetType": "NetworkSwitchConfiguration", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.NETWORK.RefreshPortDisplay" - }, - { - "legacy": "deprecated.NETWORK.NetworkSwitchConfiguration.ResolveRemoteDevice", - "patchTarget": "Il2Cpp.NetworkSwitchConfiguration::string ResolveRemoteDevice(CableLink port)", - "strategy": "Postfix", - "description": "Interop target NetworkSwitchConfiguration.ResolveRemoteDevice", - "payloadSchema": { - "targetType": "NetworkSwitchConfiguration", - "isStatic": false, - "port": "CableLink" - }, - "hookSubject": null, - "name": "greg.NETWORK.ResolveRemoteDevice" - }, - { - "legacy": "deprecated.NETWORK.NetworkSwitchConfiguration.ClickPort", - "patchTarget": "Il2Cpp.NetworkSwitchConfiguration::void ClickPort(int i)", - "strategy": "Postfix", - "description": "Interop target NetworkSwitchConfiguration.ClickPort", - "payloadSchema": { - "targetType": "NetworkSwitchConfiguration", - "isStatic": false, - "i": "int" - }, - "hookSubject": null, - "name": "greg.NETWORK.ClickPort" - }, - { - "legacy": "deprecated.NETWORK.NetworkSwitchConfiguration.CreateLACP", - "patchTarget": "Il2Cpp.NetworkSwitchConfiguration::void CreateLACP()", - "strategy": "Postfix", - "description": "Interop target NetworkSwitchConfiguration.CreateLACP", - "payloadSchema": { - "targetType": "NetworkSwitchConfiguration", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.NETWORK.CreateLACP" - }, - { - "legacy": "deprecated.NETWORK.NetworkSwitchConfiguration.RemoveLACP", - "patchTarget": "Il2Cpp.NetworkSwitchConfiguration::void RemoveLACP()", - "strategy": "Postfix", - "description": "Interop target NetworkSwitchConfiguration.RemoveLACP", - "payloadSchema": { - "targetType": "NetworkSwitchConfiguration", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.NETWORK.oveLACPRemoved" - }, - { - "legacy": "deprecated.NETWORK.NetworkSwitchConfiguration.OnEndEditingInputText", - "patchTarget": "Il2Cpp.NetworkSwitchConfiguration::void OnEndEditingInputText(string s)", - "strategy": "Postfix", - "description": "Interop target NetworkSwitchConfiguration.OnEndEditingInputText", - "payloadSchema": { - "targetType": "NetworkSwitchConfiguration", - "isStatic": false, - "s": "string" - }, - "hookSubject": null, - "name": "greg.NETWORK.OnEndEditingInputText" - }, - { - "legacy": "deprecated.NETWORK.NetworkSwitchConfiguration.CloseConfig", - "patchTarget": "Il2Cpp.NetworkSwitchConfiguration::void CloseConfig()", - "strategy": "Postfix", - "description": "Interop target NetworkSwitchConfiguration.CloseConfig", - "payloadSchema": { - "targetType": "NetworkSwitchConfiguration", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.NETWORK.CloseConfig" - }, - { - "legacy": "deprecated.NETWORK.NetworkSwitchConfiguration.NormalizeDeviceKey", - "patchTarget": "Il2Cpp.NetworkSwitchConfiguration::string NormalizeDeviceKey(string deviceName)", - "strategy": "Postfix", - "description": "Interop target NetworkSwitchConfiguration.NormalizeDeviceKey", - "payloadSchema": { - "targetType": "NetworkSwitchConfiguration", - "isStatic": false, - "deviceName": "string" - }, - "hookSubject": null, - "name": "greg.NETWORK.NormalizeDeviceKey" - }, - { - "legacy": "deprecated.NETWORK.NetworkSwitchConfiguration.ResolveAllCableIds", - "patchTarget": "Il2Cpp.NetworkSwitchConfiguration::List ResolveAllCableIds(CableLink port)", - "strategy": "Postfix", - "description": "Interop target NetworkSwitchConfiguration.ResolveAllCableIds", - "payloadSchema": { - "targetType": "NetworkSwitchConfiguration", - "isStatic": false, - "port": "CableLink" - }, - "hookSubject": null, - "name": "greg.NETWORK.ResolveAllCableIds" - }, - { - "legacy": "deprecated.GAMEPLAY.ObjectiveObject.Start", - "patchTarget": "Il2Cpp.ObjectiveObject::void Start()", - "strategy": "Postfix", - "description": "Interop target ObjectiveObject.Start", - "payloadSchema": { - "targetType": "ObjectiveObject", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "ObjectiveObject", - "name": "greg.GAMEPLAY.ComponentInitialized.ObjectiveObject" - }, - { - "legacy": "deprecated.GAMEPLAY.ObjectiveObject.GetReward", - "patchTarget": "Il2Cpp.ObjectiveObject::void GetReward()", - "strategy": "Postfix", - "description": "Interop target ObjectiveObject.GetReward", - "payloadSchema": { - "targetType": "ObjectiveObject", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.GAMEPLAY.GetReward" - }, - { - "legacy": "deprecated.GAMEPLAY.ObjectiveObject.PlayUIEffectDisolve", - "patchTarget": "Il2Cpp.ObjectiveObject::void PlayUIEffectDisolve()", - "strategy": "Postfix", - "description": "Interop target ObjectiveObject.PlayUIEffectDisolve", - "payloadSchema": { - "targetType": "ObjectiveObject", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.GAMEPLAY.PlayUIEffectDisolve" - }, - { - "legacy": "deprecated.GAMEPLAY.Objectives.Awake", - "patchTarget": "Il2Cpp.Objectives::void Awake()", - "strategy": "Postfix", - "description": "Interop target Objectives.Awake", - "payloadSchema": { - "targetType": "Objectives", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "Objectives_1fdfb233c1", - "name": "greg.GAMEPLAY.ComponentInitialized.Objectives_1fdfb233c1" - }, - { - "legacy": "deprecated.GAMEPLAY.Objectives.Start", - "patchTarget": "Il2Cpp.Objectives::void Start()", - "strategy": "Postfix", - "description": "Interop target Objectives.Start", - "payloadSchema": { - "targetType": "Objectives", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "Objectives_8bd3b70d91", - "name": "greg.GAMEPLAY.ComponentInitialized.Objectives_8bd3b70d91" - }, - { - "legacy": "deprecated.GAMEPLAY.Objectives.IsTutorialInProgress", - "patchTarget": "Il2Cpp.Objectives::bool IsTutorialInProgress()", - "strategy": "Postfix", - "description": "Interop target Objectives.IsTutorialInProgress", - "payloadSchema": { - "targetType": "Objectives", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.GAMEPLAY.IsTutorialInProgress" - }, - { - "legacy": "deprecated.GAMEPLAY.Objectives.CreateNewObjective", - "patchTarget": "Il2Cpp.Objectives::void CreateNewObjective(int localisationUID, int _objectiveUID, Vector3 objectivePosition, int xpReward = 0, int reputationReward = 0, bool isSub = false)", - "strategy": "Postfix", - "description": "Interop target Objectives.CreateNewObjective", - "payloadSchema": { - "targetType": "Objectives", - "isStatic": false, - "localisationUID": "int", - "_objectiveUID": "int", - "objectivePosition": "Vector3", - "xpReward": "int", - "reputationReward": "int", - "isSub": "bool" - }, - "hookSubject": null, - "name": "greg.GAMEPLAY.CreateNewObjective" - }, - { - "legacy": "deprecated.GAMEPLAY.Objectives.CreateAppObjective", - "patchTarget": "Il2Cpp.Objectives::int CreateAppObjective(int customerID, int appID, int time, int requiredIOPS)", - "strategy": "Postfix", - "description": "Interop target Objectives.CreateAppObjective", - "payloadSchema": { - "targetType": "Objectives", - "isStatic": false, - "customerID": "int", - "appID": "int", - "time": "int", - "requiredIOPS": "int" - }, - "hookSubject": null, - "name": "greg.GAMEPLAY.CreateAppObjective" - }, - { - "legacy": "deprecated.GAMEPLAY.Objectives.ObjectiveTimedText", - "patchTarget": "Il2Cpp.Objectives::string ObjectiveTimedText()", - "strategy": "Postfix", - "description": "Interop target Objectives.ObjectiveTimedText", - "payloadSchema": { - "targetType": "Objectives", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.GAMEPLAY.ObjectiveTimedText" - }, - { - "legacy": "deprecated.GAMEPLAY.Objectives.DestroyObjective", - "patchTarget": "Il2Cpp.Objectives::void DestroyObjective(int _objectiveUID)", - "strategy": "Postfix", - "description": "Interop target Objectives.DestroyObjective", - "payloadSchema": { - "targetType": "Objectives", - "isStatic": false, - "_objectiveUID": "int" - }, - "hookSubject": null, - "name": "greg.GAMEPLAY.DestroyObjective" - }, - { - "legacy": "deprecated.GAMEPLAY.Objectives.EffectOnDestroy", - "patchTarget": "Il2Cpp.Objectives::IEnumerator EffectOnDestroy(int _objectiveUID)", - "strategy": "Postfix", - "description": "Interop target Objectives.EffectOnDestroy", - "payloadSchema": { - "targetType": "Objectives", - "isStatic": false, - "_objectiveUID": "int" - }, - "hookSubject": null, - "name": "greg.GAMEPLAY.EffectOnDestroy" - }, - { - "legacy": "deprecated.GAMEPLAY.Objectives.ClearObjectives", - "patchTarget": "Il2Cpp.Objectives::void ClearObjectives()", - "strategy": "Postfix", - "description": "Interop target Objectives.ClearObjectives", - "payloadSchema": { - "targetType": "Objectives", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.GAMEPLAY.ClearObjectives" - }, - { - "legacy": "deprecated.GAMEPLAY.Objectives.StartObjective", - "patchTarget": "Il2Cpp.Objectives::void StartObjective(int _objectiveUID, Vector3 objectivePosition, bool _loadSave = false)", - "strategy": "Postfix", - "description": "Interop target Objectives.StartObjective", - "payloadSchema": { - "targetType": "Objectives", - "isStatic": false, - "_objectiveUID": "int", - "objectivePosition": "Vector3", - "_loadSave": "bool", - "hookSubject": "string" - }, - "hookSubject": "Objectives_int_objectiveUIDVector3objectivePosition", - "name": "greg.GAMEPLAY.StartObjective.Objectives_int_objectiveUIDVector3objectivePosition" - }, - { - "legacy": "deprecated.GAMEPLAY.Objectives.StartObjective", - "patchTarget": "Il2Cpp.Objectives::void StartObjective(int _objectiveUID, bool _loadSave = false)", - "strategy": "Postfix", - "description": "Interop target Objectives.StartObjective", - "payloadSchema": { - "targetType": "Objectives", - "isStatic": false, - "_objectiveUID": "int", - "_loadSave": "bool", - "hookSubject": "string" - }, - "hookSubject": "Objectives_int_objectiveUIDbool_loadSavefalse", - "name": "greg.GAMEPLAY.StartObjective.Objectives_int_objectiveUIDbool_loadSavefalse" - }, - { - "legacy": "deprecated.GAMEPLAY.Objectives.InstantiateObjectiveSign", - "patchTarget": "Il2Cpp.Objectives::void InstantiateObjectiveSign(int objectiveUID, Vector3 objectPos)", - "strategy": "Postfix", - "description": "Interop target Objectives.InstantiateObjectiveSign", - "payloadSchema": { - "targetType": "Objectives", - "isStatic": false, - "objectiveUID": "int", - "objectPos": "Vector3" - }, - "hookSubject": null, - "name": "greg.GAMEPLAY.InstantiateObjectiveSign" - }, - { - "legacy": "deprecated.GAMEPLAY.Objectives.RemoveObjectiveSign", - "patchTarget": "Il2Cpp.Objectives::void RemoveObjectiveSign(int objectiveUID)", - "strategy": "Postfix", - "description": "Interop target Objectives.RemoveObjectiveSign", - "payloadSchema": { - "targetType": "Objectives", - "isStatic": false, - "objectiveUID": "int" - }, - "hookSubject": null, - "name": "greg.GAMEPLAY.oveObjectiveSignRemoved" - }, - { - "legacy": "deprecated.GAMEPLAY.Objectives.LoadObjectives", - "patchTarget": "Il2Cpp.Objectives::void LoadObjectives(HashSet _activeObjectives)", - "strategy": "Postfix", - "description": "Interop target Objectives.LoadObjectives", - "payloadSchema": { - "targetType": "Objectives", - "isStatic": false, - "_activeObjectives": "HashSet" - }, - "hookSubject": null, - "name": "greg.GAMEPLAY.ObjectivesLoaded" - }, - { - "legacy": "deprecated.GAMEPLAY.Objectives.OnDestroy", - "patchTarget": "Il2Cpp.Objectives::void OnDestroy()", - "strategy": "Postfix", - "description": "Interop target Objectives.OnDestroy", - "payloadSchema": { - "targetType": "Objectives", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.GAMEPLAY.OnDestroy" - }, - { - "legacy": "deprecated.GAMEPLAY.Objectives.OnLoad", - "patchTarget": "Il2Cpp.Objectives::void OnLoad()", - "strategy": "Postfix", - "description": "Interop target Objectives.OnLoad", - "payloadSchema": { - "targetType": "Objectives", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.GAMEPLAY.OnLoad" - }, - { - "legacy": "deprecated.GAMEPLAY.ObjectiveTimed.SetupObjectiveTimed", - "patchTarget": "Il2Cpp.ObjectiveTimed::void SetupObjectiveTimed(int _maxTime, string _objectiveText, int customerID, int appID, int _requiredIOPS)", - "strategy": "Postfix", - "description": "Interop target ObjectiveTimed.SetupObjectiveTimed", - "payloadSchema": { - "targetType": "ObjectiveTimed", - "isStatic": false, - "_maxTime": "int", - "_objectiveText": "string", - "customerID": "int", - "appID": "int", - "_requiredIOPS": "int" - }, - "hookSubject": null, - "name": "greg.GAMEPLAY.upObjectiveTimedSet" - }, - { - "legacy": "deprecated.GAMEPLAY.ObjectiveTimed.UpdateDisplay", - "patchTarget": "Il2Cpp.ObjectiveTimed::void UpdateDisplay(int currentIOPS, int remainingTime)", - "strategy": "Postfix", - "description": "Interop target ObjectiveTimed.UpdateDisplay", - "payloadSchema": { - "targetType": "ObjectiveTimed", - "isStatic": false, - "currentIOPS": "int", - "remainingTime": "int" - }, - "hookSubject": null, - "name": "greg.GAMEPLAY.DisplayChanged" - }, - { - "legacy": "deprecated.SYSTEM.OpenURL.OpenURLInBrowser", - "patchTarget": "Il2Cpp.OpenURL::void OpenURLInBrowser()", - "strategy": "Postfix", - "description": "Interop target OpenURL.OpenURLInBrowser", - "payloadSchema": { - "targetType": "OpenURL", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.OpenURLInBrowser" - }, - { - "legacy": "deprecated.NETWORK.PacketComponent.BoxIl2CppObject", - "patchTarget": "Il2Cpp.PacketComponent::Object BoxIl2CppObject()", - "strategy": "Postfix", - "description": "Interop target PacketComponent.BoxIl2CppObject", - "payloadSchema": { - "targetType": "PacketComponent", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "PacketComponent", - "name": "greg.NETWORK.BoxIl2CppObject.PacketComponent" - }, - { - "legacy": "deprecated.NETWORK.PacketSpawnerSystem.OnCreate", - "patchTarget": "Il2Cpp.PacketSpawnerSystem::void OnCreate(ref SystemState state)", - "strategy": "Postfix", - "description": "Interop target PacketSpawnerSystem.OnCreate", - "payloadSchema": { - "targetType": "PacketSpawnerSystem", - "isStatic": false, - "state": "refSystemState" - }, - "hookSubject": null, - "name": "greg.NETWORK.OnCreate" - }, - { - "legacy": "deprecated.NETWORK.PacketSpawnerSystem.OnUpdate", - "patchTarget": "Il2Cpp.PacketSpawnerSystem::void OnUpdate(ref SystemState state)", - "strategy": "Postfix", - "description": "Interop target PacketSpawnerSystem.OnUpdate", - "payloadSchema": { - "targetType": "PacketSpawnerSystem", - "isStatic": false, - "state": "refSystemState" - }, - "hookSubject": null, - "name": "greg.NETWORK.OnUpdate" - }, - { - "legacy": "deprecated.NETWORK.PacketSpawnerSystem.SpawnPacket", - "patchTarget": "Il2Cpp.PacketSpawnerSystem::void SpawnPacket(EntityCommandBuffer ecb, PacketSpawnerComponent spawner, int spawnerIndex, ref BlobArray waypoints)", - "strategy": "Postfix", - "description": "Interop target PacketSpawnerSystem.SpawnPacket", - "payloadSchema": { - "targetType": "PacketSpawnerSystem", - "isStatic": false, - "ecb": "EntityCommandBuffer", - "spawner": "PacketSpawnerComponent", - "spawnerIndex": "int", - "waypoints": "refBlobArray" - }, - "hookSubject": null, - "name": "greg.NETWORK.PacketSpawned" - }, - { - "legacy": "deprecated.NETWORK.PacketSpawnerSystem.OnCreateForCompiler", - "patchTarget": "Il2Cpp.PacketSpawnerSystem::void OnCreateForCompiler(ref SystemState state)", - "strategy": "Postfix", - "description": "Interop target PacketSpawnerSystem.OnCreateForCompiler", - "payloadSchema": { - "targetType": "PacketSpawnerSystem", - "isStatic": false, - "state": "refSystemState" - }, - "hookSubject": null, - "name": "greg.NETWORK.OnCreateForCompiler" - }, - { - "legacy": "deprecated.NETWORK.PacketSpawnerSystem.Method_Internal_Static_Void_IntPtr_IntPtr_PDM_0", - "patchTarget": "Il2Cpp.PacketSpawnerSystem::static void Method_Internal_Static_Void_IntPtr_IntPtr_PDM_0(IntPtr self, IntPtr state)", - "strategy": "Postfix", - "description": "Interop target PacketSpawnerSystem.Method_Internal_Static_Void_IntPtr_IntPtr_PDM_0", - "payloadSchema": { - "targetType": "PacketSpawnerSystem", - "isStatic": true, - "self": "IntPtr", - "state": "IntPtr" - }, - "hookSubject": null, - "name": "greg.NETWORK.Method_Internal_Static_Void_IntPtr_IntPtr_PDM_0" - }, - { - "legacy": "deprecated.NETWORK.PacketSpawnerSystem.Method_Internal_Static_Void_IntPtr_IntPtr_PDM_1", - "patchTarget": "Il2Cpp.PacketSpawnerSystem::static void Method_Internal_Static_Void_IntPtr_IntPtr_PDM_1(IntPtr self, IntPtr state)", - "strategy": "Postfix", - "description": "Interop target PacketSpawnerSystem.Method_Internal_Static_Void_IntPtr_IntPtr_PDM_1", - "payloadSchema": { - "targetType": "PacketSpawnerSystem", - "isStatic": true, - "self": "IntPtr", - "state": "IntPtr" - }, - "hookSubject": null, - "name": "greg.NETWORK.Method_Internal_Static_Void_IntPtr_IntPtr_PDM_1" - }, - { - "legacy": "deprecated.SYSTEM.PatchPanel.Awake", - "patchTarget": "Il2Cpp.PatchPanel::override void Awake()", - "strategy": "Postfix", - "description": "Interop target PatchPanel.Awake", - "payloadSchema": { - "targetType": "PatchPanel", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "PatchPanel", - "name": "greg.SYSTEM.ComponentInitialized.PatchPanel" - }, - { - "legacy": "deprecated.SYSTEM.PatchPanel.IsAnyCableConnected", - "patchTarget": "Il2Cpp.PatchPanel::bool IsAnyCableConnected()", - "strategy": "Postfix", - "description": "Interop target PatchPanel.IsAnyCableConnected", - "payloadSchema": { - "targetType": "PatchPanel", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.IsAnyCableConnected" - }, - { - "legacy": "deprecated.SYSTEM.PatchPanel.InteractOnClick", - "patchTarget": "Il2Cpp.PatchPanel::override void InteractOnClick()", - "strategy": "Postfix", - "description": "Interop target PatchPanel.InteractOnClick", - "payloadSchema": { - "targetType": "PatchPanel", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "PatchPanel", - "name": "greg.SYSTEM.InteractOnClick.PatchPanel" - }, - { - "legacy": "deprecated.SYSTEM.PatchPanel.InteractOnHover", - "patchTarget": "Il2Cpp.PatchPanel::override void InteractOnHover(RaycastHit hit)", - "strategy": "Postfix", - "description": "Interop target PatchPanel.InteractOnHover", - "payloadSchema": { - "targetType": "PatchPanel", - "isStatic": false, - "hit": "RaycastHit", - "hookSubject": "string" - }, - "hookSubject": "PatchPanel_RaycastHithit", - "name": "greg.SYSTEM.InteractOnHover.PatchPanel_RaycastHithit" - }, - { - "legacy": "deprecated.SYSTEM.PatchPanel.InsertedInRack", - "patchTarget": "Il2Cpp.PatchPanel::void InsertedInRack(PatchPanelSaveData saveData = null)", - "strategy": "Postfix", - "description": "Interop target PatchPanel.InsertedInRack", - "payloadSchema": { - "targetType": "PatchPanel", - "isStatic": false, - "saveData": "PatchPanelSaveData" - }, - "hookSubject": null, - "name": "greg.SYSTEM.InsertedInRack" - }, - { - "legacy": "deprecated.SYSTEM.PatchPanel.ValidateRackPosition", - "patchTarget": "Il2Cpp.PatchPanel::bool ValidateRackPosition()", - "strategy": "Postfix", - "description": "Interop target PatchPanel.ValidateRackPosition", - "payloadSchema": { - "targetType": "PatchPanel", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ValidateRackPosition" - }, - { - "legacy": "deprecated.SYSTEM.PatchPanel.OnDestroy", - "patchTarget": "Il2Cpp.PatchPanel::override void OnDestroy()", - "strategy": "Postfix", - "description": "Interop target PatchPanel.OnDestroy", - "payloadSchema": { - "targetType": "PatchPanel", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "PatchPanel", - "name": "greg.SYSTEM.OnDestroy.PatchPanel" - }, - { - "legacy": "deprecated.SYSTEM.PauseMenu_TabButton.UnityEngine_EventSystems_ISelectHandler_OnSelect", - "patchTarget": "Il2Cpp.PauseMenu_TabButton::virtual void UnityEngine_EventSystems_ISelectHandler_OnSelect(BaseEventData eventData)", - "strategy": "Postfix", - "description": "Interop target PauseMenu_TabButton.UnityEngine_EventSystems_ISelectHandler_OnSelect", - "payloadSchema": { - "targetType": "PauseMenu_TabButton", - "isStatic": false, - "eventData": "BaseEventData" - }, - "hookSubject": null, - "name": "greg.SYSTEM.UnityEngine_EventSystems_ISelectHandler_OnSelect" - }, - { - "legacy": "deprecated.SYSTEM.PauseMenu_TabButton.UnityEngine_EventSystems_IPointerClickHandler_OnPointerClick", - "patchTarget": "Il2Cpp.PauseMenu_TabButton::virtual void UnityEngine_EventSystems_IPointerClickHandler_OnPointerClick(PointerEventData eventData)", - "strategy": "Postfix", - "description": "Interop target PauseMenu_TabButton.UnityEngine_EventSystems_IPointerClickHandler_OnPointerClick", - "payloadSchema": { - "targetType": "PauseMenu_TabButton", - "isStatic": false, - "eventData": "PointerEventData" - }, - "hookSubject": null, - "name": "greg.SYSTEM.UnityEngine_EventSystems_IPointerClickHandler_OnPointerClick" - }, - { - "legacy": "deprecated.SYSTEM.PauseMenu_TabButton.UnityEngine_EventSystems_IPointerEnterHandler_OnPointerEnter", - "patchTarget": "Il2Cpp.PauseMenu_TabButton::virtual void UnityEngine_EventSystems_IPointerEnterHandler_OnPointerEnter(PointerEventData eventData)", - "strategy": "Postfix", - "description": "Interop target PauseMenu_TabButton.UnityEngine_EventSystems_IPointerEnterHandler_OnPointerEnter", - "payloadSchema": { - "targetType": "PauseMenu_TabButton", - "isStatic": false, - "eventData": "PointerEventData" - }, - "hookSubject": null, - "name": "greg.SYSTEM.UnityEngine_EventSystems_IPointerEnterHandler_OnPointerEnter" - }, - { - "legacy": "deprecated.SYSTEM.PauseMenu_TabButton.UnityEngine_EventSystems_IPointerExitHandler_OnPointerExit", - "patchTarget": "Il2Cpp.PauseMenu_TabButton::virtual void UnityEngine_EventSystems_IPointerExitHandler_OnPointerExit(PointerEventData eventData)", - "strategy": "Postfix", - "description": "Interop target PauseMenu_TabButton.UnityEngine_EventSystems_IPointerExitHandler_OnPointerExit", - "payloadSchema": { - "targetType": "PauseMenu_TabButton", - "isStatic": false, - "eventData": "PointerEventData" - }, - "hookSubject": null, - "name": "greg.SYSTEM.UnityEngine_EventSystems_IPointerExitHandler_OnPointerExit" - }, - { - "legacy": "deprecated.SYSTEM.PauseMenu_TabButton.Start", - "patchTarget": "Il2Cpp.PauseMenu_TabButton::void Start()", - "strategy": "Postfix", - "description": "Interop target PauseMenu_TabButton.Start", - "payloadSchema": { - "targetType": "PauseMenu_TabButton", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "PauseMenu_TabButton", - "name": "greg.SYSTEM.ComponentInitialized.PauseMenu_TabButton" - }, - { - "legacy": "deprecated.SYSTEM.PauseMenu_TabGroup.Subscribe", - "patchTarget": "Il2Cpp.PauseMenu_TabGroup::void Subscribe(PauseMenu_TabButton tabbutton)", - "strategy": "Postfix", - "description": "Interop target PauseMenu_TabGroup.Subscribe", - "payloadSchema": { - "targetType": "PauseMenu_TabGroup", - "isStatic": false, - "tabbutton": "PauseMenu_TabButton" - }, - "hookSubject": null, - "name": "greg.SYSTEM.Subscribe" - }, - { - "legacy": "deprecated.SYSTEM.PauseMenu_TabGroup.OnTabEnter", - "patchTarget": "Il2Cpp.PauseMenu_TabGroup::void OnTabEnter(PauseMenu_TabButton tabbutton)", - "strategy": "Postfix", - "description": "Interop target PauseMenu_TabGroup.OnTabEnter", - "payloadSchema": { - "targetType": "PauseMenu_TabGroup", - "isStatic": false, - "tabbutton": "PauseMenu_TabButton" - }, - "hookSubject": null, - "name": "greg.SYSTEM.OnTabEnter" - }, - { - "legacy": "deprecated.SYSTEM.PauseMenu_TabGroup.OnTabExit", - "patchTarget": "Il2Cpp.PauseMenu_TabGroup::void OnTabExit(PauseMenu_TabButton tabbutton)", - "strategy": "Postfix", - "description": "Interop target PauseMenu_TabGroup.OnTabExit", - "payloadSchema": { - "targetType": "PauseMenu_TabGroup", - "isStatic": false, - "tabbutton": "PauseMenu_TabButton" - }, - "hookSubject": null, - "name": "greg.SYSTEM.OnTabExit" - }, - { - "legacy": "deprecated.SYSTEM.PauseMenu_TabGroup.OnTabSelected", - "patchTarget": "Il2Cpp.PauseMenu_TabGroup::void OnTabSelected(PauseMenu_TabButton tabbutton)", - "strategy": "Postfix", - "description": "Interop target PauseMenu_TabGroup.OnTabSelected", - "payloadSchema": { - "targetType": "PauseMenu_TabGroup", - "isStatic": false, - "tabbutton": "PauseMenu_TabButton" - }, - "hookSubject": null, - "name": "greg.SYSTEM.OnTabSelected" - }, - { - "legacy": "deprecated.SYSTEM.PauseMenu_TabGroup.ResetTabs", - "patchTarget": "Il2Cpp.PauseMenu_TabGroup::void ResetTabs()", - "strategy": "Postfix", - "description": "Interop target PauseMenu_TabGroup.ResetTabs", - "payloadSchema": { - "targetType": "PauseMenu_TabGroup", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ResetTabs" - }, - { - "legacy": "deprecated.SYSTEM.PauseMenu.Awake", - "patchTarget": "Il2Cpp.PauseMenu::void Awake()", - "strategy": "Postfix", - "description": "Interop target PauseMenu.Awake", - "payloadSchema": { - "targetType": "PauseMenu", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "PauseMenu", - "name": "greg.SYSTEM.ComponentInitialized.PauseMenu" - }, - { - "legacy": "deprecated.SYSTEM.PauseMenu.OnEnable", - "patchTarget": "Il2Cpp.PauseMenu::void OnEnable()", - "strategy": "Postfix", - "description": "Interop target PauseMenu.OnEnable", - "payloadSchema": { - "targetType": "PauseMenu", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "PauseMenu", - "name": "greg.SYSTEM.ComponentEnabled.PauseMenu" - }, - { - "legacy": "deprecated.SYSTEM.PauseMenu.OnDisable", - "patchTarget": "Il2Cpp.PauseMenu::void OnDisable()", - "strategy": "Postfix", - "description": "Interop target PauseMenu.OnDisable", - "payloadSchema": { - "targetType": "PauseMenu", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "PauseMenu", - "name": "greg.SYSTEM.ComponentDisabled.PauseMenu" - }, - { - "legacy": "deprecated.SYSTEM.PauseMenu.OnDestroy", - "patchTarget": "Il2Cpp.PauseMenu::void OnDestroy()", - "strategy": "Postfix", - "description": "Interop target PauseMenu.OnDestroy", - "payloadSchema": { - "targetType": "PauseMenu", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "PauseMenu", - "name": "greg.SYSTEM.OnDestroy.PauseMenu" - }, - { - "legacy": "deprecated.SYSTEM.PauseMenu.OnPause", - "patchTarget": "Il2Cpp.PauseMenu::void OnPause(int openMenu)", - "strategy": "Postfix", - "description": "Interop target PauseMenu.OnPause", - "payloadSchema": { - "targetType": "PauseMenu", - "isStatic": false, - "openMenu": "int" - }, - "hookSubject": null, - "name": "greg.SYSTEM.OnPause" - }, - { - "legacy": "deprecated.SYSTEM.PauseMenu.Resume", - "patchTarget": "Il2Cpp.PauseMenu::void Resume()", - "strategy": "Postfix", - "description": "Interop target PauseMenu.Resume", - "payloadSchema": { - "targetType": "PauseMenu", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.Resume" - }, - { - "legacy": "deprecated.SYSTEM.PauseMenu.PopulateLoadSaveMenu", - "patchTarget": "Il2Cpp.PauseMenu::void PopulateLoadSaveMenu(bool _savingGame)", - "strategy": "Postfix", - "description": "Interop target PauseMenu.PopulateLoadSaveMenu", - "payloadSchema": { - "targetType": "PauseMenu", - "isStatic": false, - "_savingGame": "bool" - }, - "hookSubject": null, - "name": "greg.SYSTEM.PopulateLoadSaveMenu" - }, - { - "legacy": "deprecated.SYSTEM.PauseMenu.LoadSaveOnButtonClick", - "patchTarget": "Il2Cpp.PauseMenu::void LoadSaveOnButtonClick(TextMeshProUGUI _text)", - "strategy": "Postfix", - "description": "Interop target PauseMenu.LoadSaveOnButtonClick", - "payloadSchema": { - "targetType": "PauseMenu", - "isStatic": false, - "_text": "TextMeshProUGUI" - }, - "hookSubject": null, - "name": "greg.SYSTEM.SaveOnButtonClickLoaded" - }, - { - "legacy": "deprecated.SYSTEM.PauseMenu.NotAllowedToSaveOverlayOff", - "patchTarget": "Il2Cpp.PauseMenu::void NotAllowedToSaveOverlayOff()", - "strategy": "Postfix", - "description": "Interop target PauseMenu.NotAllowedToSaveOverlayOff", - "payloadSchema": { - "targetType": "PauseMenu", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.NotAllowedToSaveOverlayOff" - }, - { - "legacy": "deprecated.SYSTEM.PauseMenu.SaveConfirm", - "patchTarget": "Il2Cpp.PauseMenu::void SaveConfirm(bool yes)", - "strategy": "Postfix", - "description": "Interop target PauseMenu.SaveConfirm", - "payloadSchema": { - "targetType": "PauseMenu", - "isStatic": false, - "yes": "bool" - }, - "hookSubject": null, - "name": "greg.SYSTEM.ConfirmSaved" - }, - { - "legacy": "deprecated.SYSTEM.PauseMenu.ButtonSetNameOfSave", - "patchTarget": "Il2Cpp.PauseMenu::void ButtonSetNameOfSave()", - "strategy": "Postfix", - "description": "Interop target PauseMenu.ButtonSetNameOfSave", - "payloadSchema": { - "targetType": "PauseMenu", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ButtonSetNameOfSave" - }, - { - "legacy": "deprecated.SYSTEM.PauseMenu.Save", - "patchTarget": "Il2Cpp.PauseMenu::void Save(string saveName = null, string _stringNameOfSave = null)", - "strategy": "Postfix", - "description": "Interop target PauseMenu.Save", - "payloadSchema": { - "targetType": "PauseMenu", - "isStatic": false, - "saveName": "string", - "_stringNameOfSave": "string" - }, - "hookSubject": null, - "name": "greg.SYSTEM.Save" - }, - { - "legacy": "deprecated.SYSTEM.PauseMenu.DeleteSaveButtonClick", - "patchTarget": "Il2Cpp.PauseMenu::void DeleteSaveButtonClick(TextMeshProUGUI _text)", - "strategy": "Postfix", - "description": "Interop target PauseMenu.DeleteSaveButtonClick", - "payloadSchema": { - "targetType": "PauseMenu", - "isStatic": false, - "_text": "TextMeshProUGUI" - }, - "hookSubject": null, - "name": "greg.SYSTEM.DeleteSaveButtonClick" - }, - { - "legacy": "deprecated.SYSTEM.PauseMenu.DeleteSaveConfirm", - "patchTarget": "Il2Cpp.PauseMenu::void DeleteSaveConfirm(bool yes)", - "strategy": "Postfix", - "description": "Interop target PauseMenu.DeleteSaveConfirm", - "payloadSchema": { - "targetType": "PauseMenu", - "isStatic": false, - "yes": "bool" - }, - "hookSubject": null, - "name": "greg.SYSTEM.DeleteSaveConfirm" - }, - { - "legacy": "deprecated.SYSTEM.PauseMenu.Load", - "patchTarget": "Il2Cpp.PauseMenu::void Load(string savename)", - "strategy": "Postfix", - "description": "Interop target PauseMenu.Load", - "payloadSchema": { - "targetType": "PauseMenu", - "isStatic": false, - "savename": "string", - "hookSubject": "string" - }, - "hookSubject": "PauseMenu_stringsavename", - "name": "greg.SYSTEM.Load.PauseMenu_stringsavename" - }, - { - "legacy": "deprecated.SYSTEM.PauseMenu.LoadWithOverlay", - "patchTarget": "Il2Cpp.PauseMenu::IEnumerator LoadWithOverlay(string savename)", - "strategy": "Postfix", - "description": "Interop target PauseMenu.LoadWithOverlay", - "payloadSchema": { - "targetType": "PauseMenu", - "isStatic": false, - "savename": "string" - }, - "hookSubject": null, - "name": "greg.SYSTEM.WithOverlayLoaded" - }, - { - "legacy": "deprecated.SYSTEM.PauseMenu.Pause", - "patchTarget": "Il2Cpp.PauseMenu::void Pause(int openMenu)", - "strategy": "Postfix", - "description": "Interop target PauseMenu.Pause", - "payloadSchema": { - "targetType": "PauseMenu", - "isStatic": false, - "openMenu": "int" - }, - "hookSubject": null, - "name": "greg.SYSTEM.Pause" - }, - { - "legacy": "deprecated.SYSTEM.PauseMenu.MainMenu", - "patchTarget": "Il2Cpp.PauseMenu::void MainMenu()", - "strategy": "Postfix", - "description": "Interop target PauseMenu.MainMenu", - "payloadSchema": { - "targetType": "PauseMenu", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.MainMenu" - }, - { - "legacy": "deprecated.SYSTEM.PauseMenu.ExitGame", - "patchTarget": "Il2Cpp.PauseMenu::void ExitGame()", - "strategy": "Postfix", - "description": "Interop target PauseMenu.ExitGame", - "payloadSchema": { - "targetType": "PauseMenu", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ExitGame" - }, - { - "legacy": "deprecated.SYSTEM.PauseMenu.CloseLoadSaveOverlay", - "patchTarget": "Il2Cpp.PauseMenu::void CloseLoadSaveOverlay()", - "strategy": "Postfix", - "description": "Interop target PauseMenu.CloseLoadSaveOverlay", - "payloadSchema": { - "targetType": "PauseMenu", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.CloseLoadSaveOverlay" - }, - { - "legacy": "deprecated.SYSTEM.PauseMenu.ProcessConsoleCommand", - "patchTarget": "Il2Cpp.PauseMenu::void ProcessConsoleCommand(string input)", - "strategy": "Postfix", - "description": "Interop target PauseMenu.ProcessConsoleCommand", - "payloadSchema": { - "targetType": "PauseMenu", - "isStatic": false, - "input": "string" - }, - "hookSubject": null, - "name": "greg.SYSTEM.ProcessConsoleCommand" - }, - { - "legacy": "deprecated.SYSTEM.PauseMenu.HandleAddCommand", - "patchTarget": "Il2Cpp.PauseMenu::void HandleAddCommand(Il2CppStringArray parts)", - "strategy": "Postfix", - "description": "Interop target PauseMenu.HandleAddCommand", - "payloadSchema": { - "targetType": "PauseMenu", - "isStatic": false, - "parts": "Il2CppStringArray" - }, - "hookSubject": null, - "name": "greg.SYSTEM.HandleAddCommand" - }, - { - "legacy": "deprecated.SYSTEM.PauseMenuVideoTutorial.OnDisable", - "patchTarget": "Il2Cpp.PauseMenuVideoTutorial::void OnDisable()", - "strategy": "Postfix", - "description": "Interop target PauseMenuVideoTutorial.OnDisable", - "payloadSchema": { - "targetType": "PauseMenuVideoTutorial", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "PauseMenuVideoTutorial", - "name": "greg.SYSTEM.ComponentDisabled.PauseMenuVideoTutorial" - }, - { - "legacy": "deprecated.PLAYER.Player.Start", - "patchTarget": "Il2Cpp.Player::void Start()", - "strategy": "Postfix", - "description": "Interop target Player.Start", - "payloadSchema": { - "targetType": "Player", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "Player", - "name": "greg.PLAYER.ComponentInitialized.Player" - }, - { - "legacy": "deprecated.PLAYER.Player.CheckFallsThroughMap", - "patchTarget": "Il2Cpp.Player::void CheckFallsThroughMap()", - "strategy": "Prefix+Postfix", - "description": "Interop target Player.CheckFallsThroughMap", - "payloadSchema": { - "targetType": "Player", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.PLAYER.CheckFallsThroughMap" - }, - { - "legacy": "deprecated.PLAYER.Player.LoadPlayer", - "patchTarget": "Il2Cpp.Player::void LoadPlayer(PlayerData data)", - "strategy": "Postfix", - "description": "Interop target Player.LoadPlayer", - "payloadSchema": { - "targetType": "Player", - "isStatic": false, - "data": "PlayerData" - }, - "hookSubject": null, - "name": "greg.PLAYER.PlayerLoaded" - }, - { - "legacy": "deprecated.PLAYER.Player.TurnOnCharacterControllerDelayed", - "patchTarget": "Il2Cpp.Player::IEnumerator TurnOnCharacterControllerDelayed()", - "strategy": "Postfix", - "description": "Interop target Player.TurnOnCharacterControllerDelayed", - "payloadSchema": { - "targetType": "Player", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.PLAYER.TurnOnCharacterControllerDelayed" - }, - { - "legacy": "deprecated.PLAYER.Player.UpdateCoin", - "patchTarget": "Il2Cpp.Player::bool UpdateCoin(float _coinChhangeAmount, bool withoutSound = false)", - "strategy": "Prefix+Postfix", - "description": "Interop target Player.UpdateCoin", - "payloadSchema": { - "targetType": "Player", - "isStatic": false, - "_coinChhangeAmount": "float", - "withoutSound": "bool" - }, - "hookSubject": null, - "name": "greg.PLAYER.CoinChanged" - }, - { - "legacy": "deprecated.PLAYER.Player.DropAllItems", - "patchTarget": "Il2Cpp.Player::void DropAllItems()", - "strategy": "Postfix", - "description": "Interop target Player.DropAllItems", - "payloadSchema": { - "targetType": "Player", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.PLAYER.DroppedAllItems" - }, - { - "legacy": "deprecated.PLAYER.Player.WarpPlayer", - "patchTarget": "Il2Cpp.Player::void WarpPlayer(Vector3 _position, Quaternion _rotation)", - "strategy": "Postfix", - "description": "Interop target Player.WarpPlayer", - "payloadSchema": { - "targetType": "Player", - "isStatic": false, - "_position": "Vector3", - "_rotation": "Quaternion" - }, - "hookSubject": null, - "name": "greg.PLAYER.PlayerWarped" - }, - { - "legacy": "deprecated.PLAYER.Player.UpdateReputation", - "patchTarget": "Il2Cpp.Player::void UpdateReputation(float amount)", - "strategy": "Postfix", - "description": "Interop target Player.UpdateReputation", - "payloadSchema": { - "targetType": "Player", - "isStatic": false, - "amount": "float" - }, - "hookSubject": null, - "name": "greg.PLAYER.ReputationChanged" - }, - { - "legacy": "deprecated.PLAYER.Player.UpdateXP", - "patchTarget": "Il2Cpp.Player::bool UpdateXP(float amount)", - "strategy": "Prefix+Postfix", - "description": "Interop target Player.UpdateXP", - "payloadSchema": { - "targetType": "Player", - "isStatic": false, - "amount": "float" - }, - "hookSubject": null, - "name": "greg.PLAYER.XPChanged" - }, - { - "legacy": "deprecated.PLAYER.PlayerHit.OnEnable", - "patchTarget": "Il2Cpp.PlayerHit::void OnEnable()", - "strategy": "Postfix", - "description": "Interop target PlayerHit.OnEnable", - "payloadSchema": { - "targetType": "PlayerHit", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.PLAYER.ComponentEnabled" - }, - { - "legacy": "deprecated.PLAYER.PlayerManager.Awake", - "patchTarget": "Il2Cpp.PlayerManager::void Awake()", - "strategy": "Postfix", - "description": "Interop target PlayerManager.Awake", - "payloadSchema": { - "targetType": "PlayerManager", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "PlayerManager_de12da7ccf", - "name": "greg.PLAYER.ComponentInitialized.PlayerManager_de12da7ccf" - }, - { - "legacy": "deprecated.PLAYER.PlayerManager.Start", - "patchTarget": "Il2Cpp.PlayerManager::void Start()", - "strategy": "Postfix", - "description": "Interop target PlayerManager.Start", - "payloadSchema": { - "targetType": "PlayerManager", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "PlayerManager_ccbe2b5bcf", - "name": "greg.PLAYER.ComponentInitialized.PlayerManager_ccbe2b5bcf" - }, - { - "legacy": "deprecated.PLAYER.PlayerManager.ConfinedCursorforUI", - "patchTarget": "Il2Cpp.PlayerManager::void ConfinedCursorforUI()", - "strategy": "Postfix", - "description": "Interop target PlayerManager.ConfinedCursorforUI", - "payloadSchema": { - "targetType": "PlayerManager", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.PLAYER.ConfinedCursorforUI" - }, - { - "legacy": "deprecated.PLAYER.PlayerManager.PlayerStopMovement", - "patchTarget": "Il2Cpp.PlayerManager::void PlayerStopMovement()", - "strategy": "Postfix", - "description": "Interop target PlayerManager.PlayerStopMovement", - "payloadSchema": { - "targetType": "PlayerManager", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.PLAYER.PlayerStopMovement" - }, - { - "legacy": "deprecated.PLAYER.PlayerManager.LockedCursorForPlayerMovement", - "patchTarget": "Il2Cpp.PlayerManager::void LockedCursorForPlayerMovement()", - "strategy": "Postfix", - "description": "Interop target PlayerManager.LockedCursorForPlayerMovement", - "payloadSchema": { - "targetType": "PlayerManager", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.PLAYER.LockedCursorForPlayerMovement" - }, - { - "legacy": "deprecated.PLAYER.PlayerManager.DefaultActionEffect", - "patchTarget": "Il2Cpp.PlayerManager::void DefaultActionEffect(Vector3 _position, float _time)", - "strategy": "Postfix", - "description": "Interop target PlayerManager.DefaultActionEffect", - "payloadSchema": { - "targetType": "PlayerManager", - "isStatic": false, - "_position": "Vector3", - "_time": "float" - }, - "hookSubject": null, - "name": "greg.PLAYER.DefaultActionEffect" - }, - { - "legacy": "deprecated.PLAYER.PlayerManager.WaitForActionToFinish", - "patchTarget": "Il2Cpp.PlayerManager::IEnumerator WaitForActionToFinish(Vector3 _position, float _time)", - "strategy": "Postfix", - "description": "Interop target PlayerManager.WaitForActionToFinish", - "payloadSchema": { - "targetType": "PlayerManager", - "isStatic": false, - "_position": "Vector3", - "_time": "float" - }, - "hookSubject": null, - "name": "greg.PLAYER.WaitForActionToFinish" - }, - { - "legacy": "deprecated.PLAYER.PlayerManager.GainIOPSEffect", - "patchTarget": "Il2Cpp.PlayerManager::void GainIOPSEffect()", - "strategy": "Postfix", - "description": "Interop target PlayerManager.GainIOPSEffect", - "payloadSchema": { - "targetType": "PlayerManager", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.PLAYER.GainIOPSEffect" - }, - { - "legacy": "deprecated.SYSTEM.PositionIndicator.Awake", - "patchTarget": "Il2Cpp.PositionIndicator::void Awake()", - "strategy": "Postfix", - "description": "Interop target PositionIndicator.Awake", - "payloadSchema": { - "targetType": "PositionIndicator", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "PositionIndicator", - "name": "greg.SYSTEM.ComponentInitialized.PositionIndicator" - }, - { - "legacy": "deprecated.SYSTEM.PulsatingImageColor.Awake", - "patchTarget": "Il2Cpp.PulsatingImageColor::void Awake()", - "strategy": "Postfix", - "description": "Interop target PulsatingImageColor.Awake", - "payloadSchema": { - "targetType": "PulsatingImageColor", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "PulsatingImageColor", - "name": "greg.SYSTEM.ComponentInitialized.PulsatingImageColor" - }, - { - "legacy": "deprecated.SYSTEM.PulsatingImageColor.OnEnable", - "patchTarget": "Il2Cpp.PulsatingImageColor::void OnEnable()", - "strategy": "Postfix", - "description": "Interop target PulsatingImageColor.OnEnable", - "payloadSchema": { - "targetType": "PulsatingImageColor", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "PulsatingImageColor", - "name": "greg.SYSTEM.ComponentEnabled.PulsatingImageColor" - }, - { - "legacy": "deprecated.SYSTEM.PulsatingImageColor.TweenTheColors", - "patchTarget": "Il2Cpp.PulsatingImageColor::void TweenTheColors()", - "strategy": "Postfix", - "description": "Interop target PulsatingImageColor.TweenTheColors", - "payloadSchema": { - "targetType": "PulsatingImageColor", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "PulsatingImageColor", - "name": "greg.SYSTEM.TweenTheColors.PulsatingImageColor" - }, - { - "legacy": "deprecated.SYSTEM.PulsatingImageColor.setColorCallback", - "patchTarget": "Il2Cpp.PulsatingImageColor::void setColorCallback(Color c)", - "strategy": "Postfix", - "description": "Interop target PulsatingImageColor.setColorCallback", - "payloadSchema": { - "targetType": "PulsatingImageColor", - "isStatic": false, - "c": "Color", - "hookSubject": "string" - }, - "hookSubject": "PulsatingImageColor_Colorc", - "name": "greg.SYSTEM.setColorCallback.PulsatingImageColor_Colorc" - }, - { - "legacy": "deprecated.SYSTEM.PulsatingImageColor.OnDisable", - "patchTarget": "Il2Cpp.PulsatingImageColor::void OnDisable()", - "strategy": "Postfix", - "description": "Interop target PulsatingImageColor.OnDisable", - "payloadSchema": { - "targetType": "PulsatingImageColor", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "PulsatingImageColor", - "name": "greg.SYSTEM.ComponentDisabled.PulsatingImageColor" - }, - { - "legacy": "deprecated.SYSTEM.PulsatingText.Start", - "patchTarget": "Il2Cpp.PulsatingText::void Start()", - "strategy": "Postfix", - "description": "Interop target PulsatingText.Start", - "payloadSchema": { - "targetType": "PulsatingText", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "PulsatingText", - "name": "greg.SYSTEM.ComponentInitialized.PulsatingText" - }, - { - "legacy": "deprecated.SYSTEM.PulsatingText.TweenTheColors", - "patchTarget": "Il2Cpp.PulsatingText::void TweenTheColors()", - "strategy": "Postfix", - "description": "Interop target PulsatingText.TweenTheColors", - "payloadSchema": { - "targetType": "PulsatingText", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "PulsatingText", - "name": "greg.SYSTEM.TweenTheColors.PulsatingText" - }, - { - "legacy": "deprecated.SYSTEM.PulsatingText.setColorCallback", - "patchTarget": "Il2Cpp.PulsatingText::void setColorCallback(Color c)", - "strategy": "Postfix", - "description": "Interop target PulsatingText.setColorCallback", - "payloadSchema": { - "targetType": "PulsatingText", - "isStatic": false, - "c": "Color", - "hookSubject": "string" - }, - "hookSubject": "PulsatingText_Colorc", - "name": "greg.SYSTEM.setColorCallback.PulsatingText_Colorc" - }, - { - "legacy": "deprecated.SYSTEM.PushTrolleyHandle.Awake", - "patchTarget": "Il2Cpp.PushTrolleyHandle::override void Awake()", - "strategy": "Postfix", - "description": "Interop target PushTrolleyHandle.Awake", - "payloadSchema": { - "targetType": "PushTrolleyHandle", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "PushTrolleyHandle", - "name": "greg.SYSTEM.ComponentInitialized.PushTrolleyHandle" - }, - { - "legacy": "deprecated.SYSTEM.PushTrolleyHandle.InteractOnClick", - "patchTarget": "Il2Cpp.PushTrolleyHandle::override void InteractOnClick()", - "strategy": "Postfix", - "description": "Interop target PushTrolleyHandle.InteractOnClick", - "payloadSchema": { - "targetType": "PushTrolleyHandle", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "PushTrolleyHandle", - "name": "greg.SYSTEM.InteractOnClick.PushTrolleyHandle" - }, - { - "legacy": "deprecated.SYSTEM.PushTrolleyHandle.InteractOnHover", - "patchTarget": "Il2Cpp.PushTrolleyHandle::override void InteractOnHover(RaycastHit hit)", - "strategy": "Postfix", - "description": "Interop target PushTrolleyHandle.InteractOnHover", - "payloadSchema": { - "targetType": "PushTrolleyHandle", - "isStatic": false, - "hit": "RaycastHit", - "hookSubject": "string" - }, - "hookSubject": "PushTrolleyHandle_RaycastHithit", - "name": "greg.SYSTEM.InteractOnHover.PushTrolleyHandle_RaycastHithit" - }, - { - "legacy": "deprecated.SYSTEM.PushTrolleyHandle.OnHoverOver", - "patchTarget": "Il2Cpp.PushTrolleyHandle::override void OnHoverOver()", - "strategy": "Postfix", - "description": "Interop target PushTrolleyHandle.OnHoverOver", - "payloadSchema": { - "targetType": "PushTrolleyHandle", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "PushTrolleyHandle", - "name": "greg.SYSTEM.OnHoverOver.PushTrolleyHandle" - }, - { - "legacy": "deprecated.SYSTEM.QuaternionSerializationSurrogate.SetObjectData", - "patchTarget": "Il2Cpp.QuaternionSerializationSurrogate::virtual Object SetObjectData(Object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector)", - "strategy": "Postfix", - "description": "Interop target QuaternionSerializationSurrogate.SetObjectData", - "payloadSchema": { - "targetType": "QuaternionSerializationSurrogate", - "isStatic": false, - "obj": "Object", - "info": "SerializationInfo", - "context": "StreamingContext", - "selector": "ISurrogateSelector", - "hookSubject": "string" - }, - "hookSubject": "QuaternionSerializationSurrogate_ObjectobjSerializationInfoinfoStreamingC", - "name": "greg.SYSTEM.ObjectDataSet.QuaternionSerializationSurrogate_ObjectobjSerializationInfoinfoStreamingC" - }, - { - "legacy": "deprecated.RACK.Rack.Awake", - "patchTarget": "Il2Cpp.Rack::void Awake()", - "strategy": "Postfix", - "description": "Interop target Rack.Awake", - "payloadSchema": { - "targetType": "Rack", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "Rack_c74551113b", - "name": "greg.RACK.ComponentInitialized.Rack_c74551113b" - }, - { - "legacy": "deprecated.RACK.Rack.Start", - "patchTarget": "Il2Cpp.Rack::void Start()", - "strategy": "Postfix", - "description": "Interop target Rack.Start", - "payloadSchema": { - "targetType": "Rack", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "Rack_60a3cc8095", - "name": "greg.RACK.ComponentInitialized.Rack_60a3cc8095" - }, - { - "legacy": "deprecated.RACK.Rack.IsPositionAvailable", - "patchTarget": "Il2Cpp.Rack::bool IsPositionAvailable(int index, int sizeInU)", - "strategy": "Postfix", - "description": "Interop target Rack.IsPositionAvailable", - "payloadSchema": { - "targetType": "Rack", - "isStatic": false, - "index": "int", - "sizeInU": "int" - }, - "hookSubject": null, - "name": "greg.RACK.IsPositionAvailable" - }, - { - "legacy": "deprecated.RACK.Rack.MarkPositionAsUsed", - "patchTarget": "Il2Cpp.Rack::void MarkPositionAsUsed(int index, int sizeInU)", - "strategy": "Postfix", - "description": "Interop target Rack.MarkPositionAsUsed", - "payloadSchema": { - "targetType": "Rack", - "isStatic": false, - "index": "int", - "sizeInU": "int" - }, - "hookSubject": null, - "name": "greg.RACK.MarkPositionAsUsed" - }, - { - "legacy": "deprecated.RACK.Rack.MarkPositionAsUnused", - "patchTarget": "Il2Cpp.Rack::void MarkPositionAsUnused(int index, int sizeInU)", - "strategy": "Postfix", - "description": "Interop target Rack.MarkPositionAsUnused", - "payloadSchema": { - "targetType": "Rack", - "isStatic": false, - "index": "int", - "sizeInU": "int" - }, - "hookSubject": null, - "name": "greg.RACK.MarkPositionAsUnused" - }, - { - "legacy": "deprecated.RACK.Rack.UpdateAudioVolume", - "patchTarget": "Il2Cpp.Rack::void UpdateAudioVolume()", - "strategy": "Postfix", - "description": "Interop target Rack.UpdateAudioVolume", - "payloadSchema": { - "targetType": "Rack", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.RACK.AudioVolumeChanged" - }, - { - "legacy": "deprecated.RACK.Rack.InitializeLoadedRack", - "patchTarget": "Il2Cpp.Rack::void InitializeLoadedRack(Il2CppStructArray loadedPositions)", - "strategy": "Postfix", - "description": "Interop target Rack.InitializeLoadedRack", - "payloadSchema": { - "targetType": "Rack", - "isStatic": false, - "loadedPositions": "Il2CppStructArray" - }, - "hookSubject": null, - "name": "greg.RACK.InitializeLoadedRack" - }, - { - "legacy": "deprecated.RACK.Rack.ButtonDisablePositionsInRack", - "patchTarget": "Il2Cpp.Rack::void ButtonDisablePositionsInRack()", - "strategy": "Postfix", - "description": "Interop target Rack.ButtonDisablePositionsInRack", - "payloadSchema": { - "targetType": "Rack", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.RACK.ButtonDisablePositionsInRack" - }, - { - "legacy": "deprecated.RACK.Rack.SetDisablePositionsButtonMaterial", - "patchTarget": "Il2Cpp.Rack::void SetDisablePositionsButtonMaterial(Material material)", - "strategy": "Postfix", - "description": "Interop target Rack.SetDisablePositionsButtonMaterial", - "payloadSchema": { - "targetType": "Rack", - "isStatic": false, - "material": "Material" - }, - "hookSubject": null, - "name": "greg.RACK.DisablePositionsButtonMaterialSet" - }, - { - "legacy": "deprecated.RACK.Rack.ButtonUnmountRack", - "patchTarget": "Il2Cpp.Rack::void ButtonUnmountRack()", - "strategy": "Postfix", - "description": "Interop target Rack.ButtonUnmountRack", - "payloadSchema": { - "targetType": "Rack", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.RACK.ButtonUnmountRack" - }, - { - "legacy": "deprecated.RACK.Rack.UnmountRack", - "patchTarget": "Il2Cpp.Rack::IEnumerator UnmountRack()", - "strategy": "Postfix", - "description": "Interop target Rack.UnmountRack", - "payloadSchema": { - "targetType": "Rack", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.RACK.UnmountRack" - }, - { - "legacy": "deprecated.RACK.Rack.OnLoad", - "patchTarget": "Il2Cpp.Rack::void OnLoad()", - "strategy": "Postfix", - "description": "Interop target Rack.OnLoad", - "payloadSchema": { - "targetType": "Rack", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "Rack", - "name": "greg.RACK.OnLoad.Rack" - }, - { - "legacy": "deprecated.RACK.Rack.OnDestroy", - "patchTarget": "Il2Cpp.Rack::void OnDestroy()", - "strategy": "Postfix", - "description": "Interop target Rack.OnDestroy", - "payloadSchema": { - "targetType": "Rack", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "Rack", - "name": "greg.RACK.OnDestroy.Rack" - }, - { - "legacy": "deprecated.RACK.RackAudioCuller.Awake", - "patchTarget": "Il2Cpp.RackAudioCuller::void Awake()", - "strategy": "Postfix", - "description": "Interop target RackAudioCuller.Awake", - "payloadSchema": { - "targetType": "RackAudioCuller", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "RackAudioCuller_b9d4271acc", - "name": "greg.RACK.ComponentInitialized.RackAudioCuller_b9d4271acc" - }, - { - "legacy": "deprecated.RACK.RackAudioCuller.Start", - "patchTarget": "Il2Cpp.RackAudioCuller::void Start()", - "strategy": "Postfix", - "description": "Interop target RackAudioCuller.Start", - "payloadSchema": { - "targetType": "RackAudioCuller", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "RackAudioCuller_a728808112", - "name": "greg.RACK.ComponentInitialized.RackAudioCuller_a728808112" - }, - { - "legacy": "deprecated.RACK.RackAudioCuller.Register", - "patchTarget": "Il2Cpp.RackAudioCuller::void Register(Rack rack)", - "strategy": "Postfix", - "description": "Interop target RackAudioCuller.Register", - "payloadSchema": { - "targetType": "RackAudioCuller", - "isStatic": false, - "rack": "Rack" - }, - "hookSubject": null, - "name": "greg.RACK.Register" - }, - { - "legacy": "deprecated.RACK.RackAudioCuller.Unregister", - "patchTarget": "Il2Cpp.RackAudioCuller::void Unregister(Rack rack)", - "strategy": "Postfix", - "description": "Interop target RackAudioCuller.Unregister", - "payloadSchema": { - "targetType": "RackAudioCuller", - "isStatic": false, - "rack": "Rack" - }, - "hookSubject": null, - "name": "greg.RACK.Unregister" - }, - { - "legacy": "deprecated.RACK.RackAudioCuller.CullLoop", - "patchTarget": "Il2Cpp.RackAudioCuller::IEnumerator CullLoop()", - "strategy": "Postfix", - "description": "Interop target RackAudioCuller.CullLoop", - "payloadSchema": { - "targetType": "RackAudioCuller", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.RACK.CullLoop" - }, - { - "legacy": "deprecated.RACK.RackAudioCuller.OnDestroy", - "patchTarget": "Il2Cpp.RackAudioCuller::void OnDestroy()", - "strategy": "Postfix", - "description": "Interop target RackAudioCuller.OnDestroy", - "payloadSchema": { - "targetType": "RackAudioCuller", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "RackAudioCuller", - "name": "greg.RACK.OnDestroy.RackAudioCuller" - }, - { - "legacy": "deprecated.RACK.RackDoor.Awake", - "patchTarget": "Il2Cpp.RackDoor::override void Awake()", - "strategy": "Postfix", - "description": "Interop target RackDoor.Awake", - "payloadSchema": { - "targetType": "RackDoor", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "RackDoor", - "name": "greg.RACK.ComponentInitialized.RackDoor" - }, - { - "legacy": "deprecated.RACK.RackDoor.InteractOnClick", - "patchTarget": "Il2Cpp.RackDoor::override void InteractOnClick()", - "strategy": "Postfix", - "description": "Interop target RackDoor.InteractOnClick", - "payloadSchema": { - "targetType": "RackDoor", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "RackDoor", - "name": "greg.RACK.InteractOnClick.RackDoor" - }, - { - "legacy": "deprecated.RACK.RackDoor.InteractOnHover", - "patchTarget": "Il2Cpp.RackDoor::override void InteractOnHover(RaycastHit hit)", - "strategy": "Postfix", - "description": "Interop target RackDoor.InteractOnHover", - "payloadSchema": { - "targetType": "RackDoor", - "isStatic": false, - "hit": "RaycastHit", - "hookSubject": "string" - }, - "hookSubject": "RackDoor_RaycastHithit", - "name": "greg.RACK.InteractOnHover.RackDoor_RaycastHithit" - }, - { - "legacy": "deprecated.RACK.RackDoor.OnHoverOver", - "patchTarget": "Il2Cpp.RackDoor::override void OnHoverOver()", - "strategy": "Postfix", - "description": "Interop target RackDoor.OnHoverOver", - "payloadSchema": { - "targetType": "RackDoor", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "RackDoor", - "name": "greg.RACK.OnHoverOver.RackDoor" - }, - { - "legacy": "deprecated.RACK.RackMount.Awake", - "patchTarget": "Il2Cpp.RackMount::override void Awake()", - "strategy": "Postfix", - "description": "Interop target RackMount.Awake", - "payloadSchema": { - "targetType": "RackMount", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "RackMount", - "name": "greg.RACK.ComponentInitialized.RackMount" - }, - { - "legacy": "deprecated.RACK.RackMount.InteractOnClick", - "patchTarget": "Il2Cpp.RackMount::override void InteractOnClick()", - "strategy": "Postfix", - "description": "Interop target RackMount.InteractOnClick", - "payloadSchema": { - "targetType": "RackMount", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "RackMount", - "name": "greg.RACK.InteractOnClick.RackMount" - }, - { - "legacy": "deprecated.RACK.RackMount.InstallRack", - "patchTarget": "Il2Cpp.RackMount::IEnumerator InstallRack(bool cheat = false, int type = 0)", - "strategy": "Postfix", - "description": "Interop target RackMount.InstallRack", - "payloadSchema": { - "targetType": "RackMount", - "isStatic": false, - "cheat": "bool", - "type": "int" - }, - "hookSubject": null, - "name": "greg.RACK.RackInstalled" - }, - { - "legacy": "deprecated.RACK.RackMount.InstantiateRack", - "patchTarget": "Il2Cpp.RackMount::GameObject InstantiateRack(InteractObjectData saveData = null)", - "strategy": "Postfix", - "description": "Interop target RackMount.InstantiateRack", - "payloadSchema": { - "targetType": "RackMount", - "isStatic": false, - "saveData": "InteractObjectData" - }, - "hookSubject": null, - "name": "greg.RACK.InstantiateRack" - }, - { - "legacy": "deprecated.RACK.RackMount.ApplyMaterialToLODs", - "patchTarget": "Il2Cpp.RackMount::void ApplyMaterialToLODs(GameObject rackGO, Material mat)", - "strategy": "Postfix", - "description": "Interop target RackMount.ApplyMaterialToLODs", - "payloadSchema": { - "targetType": "RackMount", - "isStatic": false, - "rackGO": "GameObject", - "mat": "Material" - }, - "hookSubject": null, - "name": "greg.RACK.ApplyMaterialToLODs" - }, - { - "legacy": "deprecated.RACK.RackMount.InteractOnHover", - "patchTarget": "Il2Cpp.RackMount::override void InteractOnHover(RaycastHit hit)", - "strategy": "Postfix", - "description": "Interop target RackMount.InteractOnHover", - "payloadSchema": { - "targetType": "RackMount", - "isStatic": false, - "hit": "RaycastHit", - "hookSubject": "string" - }, - "hookSubject": "RackMount_RaycastHithit", - "name": "greg.RACK.InteractOnHover.RackMount_RaycastHithit" - }, - { - "legacy": "deprecated.RACK.RackMount.OnHoverOver", - "patchTarget": "Il2Cpp.RackMount::override void OnHoverOver()", - "strategy": "Postfix", - "description": "Interop target RackMount.OnHoverOver", - "payloadSchema": { - "targetType": "RackMount", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "RackMount", - "name": "greg.RACK.OnHoverOver.RackMount" - }, - { - "legacy": "deprecated.RACK.RackMount.OnLoad", - "patchTarget": "Il2Cpp.RackMount::void OnLoad()", - "strategy": "Postfix", - "description": "Interop target RackMount.OnLoad", - "payloadSchema": { - "targetType": "RackMount", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "RackMount", - "name": "greg.RACK.OnLoad.RackMount" - }, - { - "legacy": "deprecated.RACK.RackMount.OnDestroy", - "patchTarget": "Il2Cpp.RackMount::void OnDestroy()", - "strategy": "Postfix", - "description": "Interop target RackMount.OnDestroy", - "payloadSchema": { - "targetType": "RackMount", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "RackMount", - "name": "greg.RACK.OnDestroy.RackMount" - }, - { - "legacy": "deprecated.RACK.RackMount.CheatInsertRack", - "patchTarget": "Il2Cpp.RackMount::void CheatInsertRack(GameObject go, int type)", - "strategy": "Postfix", - "description": "Interop target RackMount.CheatInsertRack", - "payloadSchema": { - "targetType": "RackMount", - "isStatic": false, - "go": "GameObject", - "type": "int" - }, - "hookSubject": null, - "name": "greg.RACK.CheatInsertRack" - }, - { - "legacy": "deprecated.RACK.RackPosition.Awake", - "patchTarget": "Il2Cpp.RackPosition::override void Awake()", - "strategy": "Postfix", - "description": "Interop target RackPosition.Awake", - "payloadSchema": { - "targetType": "RackPosition", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "RackPosition", - "name": "greg.RACK.ComponentInitialized.RackPosition" - }, - { - "legacy": "deprecated.RACK.RackPosition.InteractOnClick", - "patchTarget": "Il2Cpp.RackPosition::override void InteractOnClick()", - "strategy": "Postfix", - "description": "Interop target RackPosition.InteractOnClick", - "payloadSchema": { - "targetType": "RackPosition", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "RackPosition", - "name": "greg.RACK.InteractOnClick.RackPosition" - }, - { - "legacy": "deprecated.RACK.RackPosition.IsAllowedItem", - "patchTarget": "Il2Cpp.RackPosition::bool IsAllowedItem(bool checkAvailability = false)", - "strategy": "Postfix", - "description": "Interop target RackPosition.IsAllowedItem", - "payloadSchema": { - "targetType": "RackPosition", - "isStatic": false, - "checkAvailability": "bool" - }, - "hookSubject": null, - "name": "greg.RACK.IsAllowedItem" - }, - { - "legacy": "deprecated.RACK.RackPosition.InsertItemInRack", - "patchTarget": "Il2Cpp.RackPosition::IEnumerator InsertItemInRack()", - "strategy": "Postfix", - "description": "Interop target RackPosition.InsertItemInRack", - "payloadSchema": { - "targetType": "RackPosition", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.RACK.InsertItemInRack" - }, - { - "legacy": "deprecated.RACK.RackPosition.SetUsed", - "patchTarget": "Il2Cpp.RackPosition::void SetUsed(bool used)", - "strategy": "Postfix", - "description": "Interop target RackPosition.SetUsed", - "payloadSchema": { - "targetType": "RackPosition", - "isStatic": false, - "used": "bool" - }, - "hookSubject": null, - "name": "greg.RACK.UsedSet" - }, - { - "legacy": "deprecated.RACK.RackPosition.InteractOnHover", - "patchTarget": "Il2Cpp.RackPosition::override void InteractOnHover(RaycastHit hit)", - "strategy": "Postfix", - "description": "Interop target RackPosition.InteractOnHover", - "payloadSchema": { - "targetType": "RackPosition", - "isStatic": false, - "hit": "RaycastHit", - "hookSubject": "string" - }, - "hookSubject": "RackPosition_RaycastHithit", - "name": "greg.RACK.InteractOnHover.RackPosition_RaycastHithit" - }, - { - "legacy": "deprecated.RACK.RackPosition.OnHoverOver", - "patchTarget": "Il2Cpp.RackPosition::override void OnHoverOver()", - "strategy": "Postfix", - "description": "Interop target RackPosition.OnHoverOver", - "payloadSchema": { - "targetType": "RackPosition", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "RackPosition", - "name": "greg.RACK.OnHoverOver.RackPosition" - }, - { - "legacy": "deprecated.RACK.RackPosition.SecondActionOnClick", - "patchTarget": "Il2Cpp.RackPosition::override void SecondActionOnClick()", - "strategy": "Postfix", - "description": "Interop target RackPosition.SecondActionOnClick", - "payloadSchema": { - "targetType": "RackPosition", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.RACK.SecondActionOnClick" - }, - { - "legacy": "deprecated.SYSTEM.ReBindUI.Awake", - "patchTarget": "Il2Cpp.ReBindUI::void Awake()", - "strategy": "Postfix", - "description": "Interop target ReBindUI.Awake", - "payloadSchema": { - "targetType": "ReBindUI", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "ReBindUI", - "name": "greg.SYSTEM.ComponentInitialized.ReBindUI" - }, - { - "legacy": "deprecated.SYSTEM.ReBindUI.OnEnable", - "patchTarget": "Il2Cpp.ReBindUI::void OnEnable()", - "strategy": "Postfix", - "description": "Interop target ReBindUI.OnEnable", - "payloadSchema": { - "targetType": "ReBindUI", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "ReBindUI", - "name": "greg.SYSTEM.ComponentEnabled.ReBindUI" - }, - { - "legacy": "deprecated.SYSTEM.ReBindUI.OnDisable", - "patchTarget": "Il2Cpp.ReBindUI::void OnDisable()", - "strategy": "Postfix", - "description": "Interop target ReBindUI.OnDisable", - "payloadSchema": { - "targetType": "ReBindUI", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "ReBindUI", - "name": "greg.SYSTEM.ComponentDisabled.ReBindUI" - }, - { - "legacy": "deprecated.SYSTEM.ReBindUI.OnValidate", - "patchTarget": "Il2Cpp.ReBindUI::void OnValidate()", - "strategy": "Postfix", - "description": "Interop target ReBindUI.OnValidate", - "payloadSchema": { - "targetType": "ReBindUI", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "ReBindUI", - "name": "greg.SYSTEM.OnValidate.ReBindUI" - }, - { - "legacy": "deprecated.SYSTEM.ReBindUI.GetBindingInfo", - "patchTarget": "Il2Cpp.ReBindUI::void GetBindingInfo()", - "strategy": "Postfix", - "description": "Interop target ReBindUI.GetBindingInfo", - "payloadSchema": { - "targetType": "ReBindUI", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "ReBindUI", - "name": "greg.SYSTEM.GetBindingInfo.ReBindUI" - }, - { - "legacy": "deprecated.SYSTEM.ReBindUI.UpdateUI", - "patchTarget": "Il2Cpp.ReBindUI::void UpdateUI()", - "strategy": "Postfix", - "description": "Interop target ReBindUI.UpdateUI", - "payloadSchema": { - "targetType": "ReBindUI", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "ReBindUI", - "name": "greg.SYSTEM.UIChanged.ReBindUI" - }, - { - "legacy": "deprecated.SYSTEM.ReBindUI.DoRebind", - "patchTarget": "Il2Cpp.ReBindUI::void DoRebind()", - "strategy": "Postfix", - "description": "Interop target ReBindUI.DoRebind", - "payloadSchema": { - "targetType": "ReBindUI", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "ReBindUI", - "name": "greg.SYSTEM.DoRebind.ReBindUI" - }, - { - "legacy": "deprecated.SYSTEM.ReBindUI.ResetBinding", - "patchTarget": "Il2Cpp.ReBindUI::void ResetBinding()", - "strategy": "Postfix", - "description": "Interop target ReBindUI.ResetBinding", - "payloadSchema": { - "targetType": "ReBindUI", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "ReBindUI", - "name": "greg.SYSTEM.ResetBinding.ReBindUI" - }, - { - "legacy": "deprecated.SYSTEM.RebindUIv2.ResolveActionAndBinding", - "patchTarget": "Il2Cpp.RebindUIv2::bool ResolveActionAndBinding(out InputAction action, out int bindingIndex)", - "strategy": "Postfix", - "description": "Interop target RebindUIv2.ResolveActionAndBinding", - "payloadSchema": { - "targetType": "RebindUIv2", - "isStatic": false, - "action": "outInputAction", - "bindingIndex": "outint" - }, - "hookSubject": null, - "name": "greg.SYSTEM.ResolveActionAndBinding" - }, - { - "legacy": "deprecated.SYSTEM.RebindUIv2.UpdateBindingDisplay", - "patchTarget": "Il2Cpp.RebindUIv2::void UpdateBindingDisplay()", - "strategy": "Postfix", - "description": "Interop target RebindUIv2.UpdateBindingDisplay", - "payloadSchema": { - "targetType": "RebindUIv2", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.BindingDisplayChanged" - }, - { - "legacy": "deprecated.SYSTEM.RebindUIv2.ResetToDefault", - "patchTarget": "Il2Cpp.RebindUIv2::void ResetToDefault()", - "strategy": "Postfix", - "description": "Interop target RebindUIv2.ResetToDefault", - "payloadSchema": { - "targetType": "RebindUIv2", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ResetToDefault" - }, - { - "legacy": "deprecated.SYSTEM.RebindUIv2.StartInteractiveRebind", - "patchTarget": "Il2Cpp.RebindUIv2::void StartInteractiveRebind()", - "strategy": "Postfix", - "description": "Interop target RebindUIv2.StartInteractiveRebind", - "payloadSchema": { - "targetType": "RebindUIv2", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.StartInteractiveRebind" - }, - { - "legacy": "deprecated.SYSTEM.RebindUIv2.PerformInteractiveRebind", - "patchTarget": "Il2Cpp.RebindUIv2::void PerformInteractiveRebind(InputAction action, int bindingIndex, bool allCompositeParts = false)", - "strategy": "Postfix", - "description": "Interop target RebindUIv2.PerformInteractiveRebind", - "payloadSchema": { - "targetType": "RebindUIv2", - "isStatic": false, - "action": "InputAction", - "bindingIndex": "int", - "allCompositeParts": "bool" - }, - "hookSubject": null, - "name": "greg.SYSTEM.PerformInteractiveRebind" - }, - { - "legacy": "deprecated.SYSTEM.RebindUIv2.OnEnable", - "patchTarget": "Il2Cpp.RebindUIv2::void OnEnable()", - "strategy": "Postfix", - "description": "Interop target RebindUIv2.OnEnable", - "payloadSchema": { - "targetType": "RebindUIv2", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "RebindUIv2", - "name": "greg.SYSTEM.ComponentEnabled.RebindUIv2" - }, - { - "legacy": "deprecated.SYSTEM.RebindUIv2.OnDisable", - "patchTarget": "Il2Cpp.RebindUIv2::void OnDisable()", - "strategy": "Postfix", - "description": "Interop target RebindUIv2.OnDisable", - "payloadSchema": { - "targetType": "RebindUIv2", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "RebindUIv2", - "name": "greg.SYSTEM.ComponentDisabled.RebindUIv2" - }, - { - "legacy": "deprecated.SYSTEM.RebindUIv2.OnActionChange", - "patchTarget": "Il2Cpp.RebindUIv2::static void OnActionChange(Il2CppSystem.Object obj, InputActionChange change)", - "strategy": "Postfix", - "description": "Interop target RebindUIv2.OnActionChange", - "payloadSchema": { - "targetType": "RebindUIv2", - "isStatic": true, - "obj": "Il2CppSystem.Object", - "change": "InputActionChange" - }, - "hookSubject": null, - "name": "greg.SYSTEM.OnActionChange" - }, - { - "legacy": "deprecated.SYSTEM.RebindUIv2.UpdateActionLabel", - "patchTarget": "Il2Cpp.RebindUIv2::void UpdateActionLabel()", - "strategy": "Postfix", - "description": "Interop target RebindUIv2.UpdateActionLabel", - "payloadSchema": { - "targetType": "RebindUIv2", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ActionLabelChanged" - }, - { - "legacy": "deprecated.SYSTEM.SaveData.Validate", - "patchTarget": "Il2Cpp.SaveData::string Validate()", - "strategy": "Postfix", - "description": "Interop target SaveData.Validate", - "payloadSchema": { - "targetType": "SaveData", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.Validate" - }, - { - "legacy": "deprecated.SERVER.Server.Awake", - "patchTarget": "Il2Cpp.Server::override void Awake()", - "strategy": "Postfix", - "description": "Interop target Server.Awake", - "payloadSchema": { - "targetType": "Server", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "Server_d8d2baf923", - "name": "greg.SERVER.ComponentInitialized.Server_d8d2baf923" - }, - { - "legacy": "deprecated.SERVER.Server.Start", - "patchTarget": "Il2Cpp.Server::void Start()", - "strategy": "Postfix", - "description": "Interop target Server.Start", - "payloadSchema": { - "targetType": "Server", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "Server_b4d519f190", - "name": "greg.SERVER.ComponentInitialized.Server_b4d519f190" - }, - { - "legacy": "deprecated.SERVER.Server.OnLoadingStarted", - "patchTarget": "Il2Cpp.Server::void OnLoadingStarted()", - "strategy": "Postfix", - "description": "Interop target Server.OnLoadingStarted", - "payloadSchema": { - "targetType": "Server", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SERVER.OnLoadingStarted" - }, - { - "legacy": "deprecated.SERVER.Server.OnLoadingComplete", - "patchTarget": "Il2Cpp.Server::void OnLoadingComplete()", - "strategy": "Postfix", - "description": "Interop target Server.OnLoadingComplete", - "payloadSchema": { - "targetType": "Server", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SERVER.OnLoadingComplete" - }, - { - "legacy": "deprecated.SERVER.Server.PowerButton", - "patchTarget": "Il2Cpp.Server::void PowerButton(bool forceState = false)", - "strategy": "Postfix", - "description": "Interop target Server.PowerButton", - "payloadSchema": { - "targetType": "Server", - "isStatic": false, - "forceState": "bool" - }, - "hookSubject": null, - "name": "greg.SERVER.PowerButton" - }, - { - "legacy": "deprecated.SERVER.Server.TurnOffCommonFunctions", - "patchTarget": "Il2Cpp.Server::void TurnOffCommonFunctions()", - "strategy": "Postfix", - "description": "Interop target Server.TurnOffCommonFunctions", - "payloadSchema": { - "targetType": "Server", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SERVER.TurnOffCommonFunctions" - }, - { - "legacy": "deprecated.SERVER.Server.TurnOnCommonFunction", - "patchTarget": "Il2Cpp.Server::void TurnOnCommonFunction()", - "strategy": "Postfix", - "description": "Interop target Server.TurnOnCommonFunction", - "payloadSchema": { - "targetType": "Server", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SERVER.TurnOnCommonFunction" - }, - { - "legacy": "deprecated.SERVER.Server.IsAnyCableConnected", - "patchTarget": "Il2Cpp.Server::bool IsAnyCableConnected()", - "strategy": "Postfix", - "description": "Interop target Server.IsAnyCableConnected", - "payloadSchema": { - "targetType": "Server", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SERVER.IsAnyCableConnected" - }, - { - "legacy": "deprecated.SERVER.Server.InteractOnClick", - "patchTarget": "Il2Cpp.Server::override void InteractOnClick()", - "strategy": "Postfix", - "description": "Interop target Server.InteractOnClick", - "payloadSchema": { - "targetType": "Server", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SERVER.InteractOnClick" - }, - { - "legacy": "deprecated.SERVER.Server.InteractOnHover", - "patchTarget": "Il2Cpp.Server::override void InteractOnHover(RaycastHit hit)", - "strategy": "Postfix", - "description": "Interop target Server.InteractOnHover", - "payloadSchema": { - "targetType": "Server", - "isStatic": false, - "hit": "RaycastHit" - }, - "hookSubject": null, - "name": "greg.SERVER.InteractOnHover" - }, - { - "legacy": "deprecated.SERVER.Server.ServerInsertedInRack", - "patchTarget": "Il2Cpp.Server::void ServerInsertedInRack(ServerSaveData serverSaveData = null)", - "strategy": "Postfix", - "description": "Interop target Server.ServerInsertedInRack", - "payloadSchema": { - "targetType": "Server", - "isStatic": false, - "serverSaveData": "ServerSaveData" - }, - "hookSubject": null, - "name": "greg.SERVER.ServerInsertedInRack" - }, - { - "legacy": "deprecated.SERVER.Server.RegisterLink", - "patchTarget": "Il2Cpp.Server::void RegisterLink(CableLink link)", - "strategy": "Postfix", - "description": "Interop target Server.RegisterLink", - "payloadSchema": { - "targetType": "Server", - "isStatic": false, - "link": "CableLink" - }, - "hookSubject": null, - "name": "greg.SERVER.RegisterLink" - }, - { - "legacy": "deprecated.SERVER.Server.UnregisterLink", - "patchTarget": "Il2Cpp.Server::void UnregisterLink(CableLink link)", - "strategy": "Postfix", - "description": "Interop target Server.UnregisterLink", - "payloadSchema": { - "targetType": "Server", - "isStatic": false, - "link": "CableLink" - }, - "hookSubject": null, - "name": "greg.SERVER.UnregisterLink" - }, - { - "legacy": "deprecated.SERVER.Server.UpdateServerScreenUI", - "patchTarget": "Il2Cpp.Server::void UpdateServerScreenUI()", - "strategy": "Postfix", - "description": "Interop target Server.UpdateServerScreenUI", - "payloadSchema": { - "targetType": "Server", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SERVER.ServerScreenUIChanged" - }, - { - "legacy": "deprecated.SERVER.Server.ButtonClickChangeCustomer", - "patchTarget": "Il2Cpp.Server::void ButtonClickChangeCustomer(bool forward)", - "strategy": "Postfix", - "description": "Interop target Server.ButtonClickChangeCustomer", - "payloadSchema": { - "targetType": "Server", - "isStatic": false, - "forward": "bool" - }, - "hookSubject": null, - "name": "greg.SERVER.ButtonClickChangeCustomer" - }, - { - "legacy": "deprecated.SERVER.Server.ButtonClickChangeIP", - "patchTarget": "Il2Cpp.Server::void ButtonClickChangeIP()", - "strategy": "Postfix", - "description": "Interop target Server.ButtonClickChangeIP", - "payloadSchema": { - "targetType": "Server", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SERVER.ButtonClickChangeIP" - }, - { - "legacy": "deprecated.SERVER.Server.SetIP", - "patchTarget": "Il2Cpp.Server::void SetIP(string _ip)", - "strategy": "Postfix", - "description": "Interop target Server.SetIP", - "payloadSchema": { - "targetType": "Server", - "isStatic": false, - "_ip": "string" - }, - "hookSubject": null, - "name": "greg.SERVER.IPSet" - }, - { - "legacy": "deprecated.SERVER.Server.UpdateCustomer", - "patchTarget": "Il2Cpp.Server::void UpdateCustomer(int newCustomerID)", - "strategy": "Postfix", - "description": "Interop target Server.UpdateCustomer", - "payloadSchema": { - "targetType": "Server", - "isStatic": false, - "newCustomerID": "int" - }, - "hookSubject": null, - "name": "greg.SERVER.CustomerChanged" - }, - { - "legacy": "deprecated.SERVER.Server.UpdateAppID", - "patchTarget": "Il2Cpp.Server::void UpdateAppID(int _appID)", - "strategy": "Postfix", - "description": "Interop target Server.UpdateAppID", - "payloadSchema": { - "targetType": "Server", - "isStatic": false, - "_appID": "int" - }, - "hookSubject": null, - "name": "greg.SERVER.AppIDChanged" - }, - { - "legacy": "deprecated.SERVER.Server.BrekingInProgress", - "patchTarget": "Il2Cpp.Server::IEnumerator BrekingInProgress()", - "strategy": "Postfix", - "description": "Interop target Server.BrekingInProgress", - "payloadSchema": { - "targetType": "Server", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SERVER.BrekingInProgress" - }, - { - "legacy": "deprecated.SERVER.Server.ItIsBroken", - "patchTarget": "Il2Cpp.Server::void ItIsBroken()", - "strategy": "Postfix", - "description": "Interop target Server.ItIsBroken", - "payloadSchema": { - "targetType": "Server", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SERVER.ItIsBroken" - }, - { - "legacy": "deprecated.SERVER.Server.ValidateRackPosition", - "patchTarget": "Il2Cpp.Server::bool ValidateRackPosition()", - "strategy": "Postfix", - "description": "Interop target Server.ValidateRackPosition", - "payloadSchema": { - "targetType": "Server", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SERVER.ValidateRackPosition" - }, - { - "legacy": "deprecated.SERVER.Server.ClearWarningSign", - "patchTarget": "Il2Cpp.Server::void ClearWarningSign(bool isPreserved = false)", - "strategy": "Postfix", - "description": "Interop target Server.ClearWarningSign", - "payloadSchema": { - "targetType": "Server", - "isStatic": false, - "isPreserved": "bool" - }, - "hookSubject": null, - "name": "greg.SERVER.ClearWarningSign" - }, - { - "legacy": "deprecated.SERVER.Server.ClearErrorSign", - "patchTarget": "Il2Cpp.Server::void ClearErrorSign()", - "strategy": "Postfix", - "description": "Interop target Server.ClearErrorSign", - "payloadSchema": { - "targetType": "Server", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SERVER.ClearErrorSign" - }, - { - "legacy": "deprecated.SERVER.Server.OnDestroy", - "patchTarget": "Il2Cpp.Server::override void OnDestroy()", - "strategy": "Postfix", - "description": "Interop target Server.OnDestroy", - "payloadSchema": { - "targetType": "Server", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SERVER.OnDestroy" - }, - { - "legacy": "deprecated.SERVER.Server.SetPowerLightMaterial", - "patchTarget": "Il2Cpp.Server::void SetPowerLightMaterial(Material material)", - "strategy": "Postfix", - "description": "Interop target Server.SetPowerLightMaterial", - "payloadSchema": { - "targetType": "Server", - "isStatic": false, - "material": "Material" - }, - "hookSubject": null, - "name": "greg.SERVER.PowerLightMaterialSet" - }, - { - "legacy": "deprecated.SERVER.Server.RepairDevice", - "patchTarget": "Il2Cpp.Server::void RepairDevice()", - "strategy": "Postfix", - "description": "Interop target Server.RepairDevice", - "payloadSchema": { - "targetType": "Server", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SERVER.DeviceRepaired" - }, - { - "legacy": "deprecated.SYSTEM.SetIP.Awake", - "patchTarget": "Il2Cpp.SetIP::void Awake()", - "strategy": "Postfix", - "description": "Interop target SetIP.Awake", - "payloadSchema": { - "targetType": "SetIP", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "SetIP", - "name": "greg.SYSTEM.ComponentInitialized.SetIP" - }, - { - "legacy": "deprecated.SYSTEM.SetIP.ShowCanvas", - "patchTarget": "Il2Cpp.SetIP::void ShowCanvas(Server _server)", - "strategy": "Postfix", - "description": "Interop target SetIP.ShowCanvas", - "payloadSchema": { - "targetType": "SetIP", - "isStatic": false, - "_server": "Server" - }, - "hookSubject": null, - "name": "greg.SYSTEM.ShowCanvas" - }, - { - "legacy": "deprecated.SYSTEM.SetIP.ClickNumber", - "patchTarget": "Il2Cpp.SetIP::void ClickNumber(string number)", - "strategy": "Postfix", - "description": "Interop target SetIP.ClickNumber", - "payloadSchema": { - "targetType": "SetIP", - "isStatic": false, - "number": "string" - }, - "hookSubject": null, - "name": "greg.SYSTEM.ClickNumber" - }, - { - "legacy": "deprecated.SYSTEM.SetIP.ClickButtonOK", - "patchTarget": "Il2Cpp.SetIP::void ClickButtonOK()", - "strategy": "Postfix", - "description": "Interop target SetIP.ClickButtonOK", - "payloadSchema": { - "targetType": "SetIP", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ClickButtonOK" - }, - { - "legacy": "deprecated.SYSTEM.SetIP.ClickButtonDel", - "patchTarget": "Il2Cpp.SetIP::void ClickButtonDel()", - "strategy": "Postfix", - "description": "Interop target SetIP.ClickButtonDel", - "payloadSchema": { - "targetType": "SetIP", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ClickButtonDel" - }, - { - "legacy": "deprecated.SYSTEM.SetIP.ClickButtonClear", - "patchTarget": "Il2Cpp.SetIP::void ClickButtonClear()", - "strategy": "Postfix", - "description": "Interop target SetIP.ClickButtonClear", - "payloadSchema": { - "targetType": "SetIP", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ClickButtonClear" - }, - { - "legacy": "deprecated.SYSTEM.SetIP.ClickButtonCopy", - "patchTarget": "Il2Cpp.SetIP::void ClickButtonCopy()", - "strategy": "Postfix", - "description": "Interop target SetIP.ClickButtonCopy", - "payloadSchema": { - "targetType": "SetIP", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ClickButtonCopy" - }, - { - "legacy": "deprecated.SYSTEM.SetIP.ClickButtonPaste", - "patchTarget": "Il2Cpp.SetIP::void ClickButtonPaste()", - "strategy": "Postfix", - "description": "Interop target SetIP.ClickButtonPaste", - "payloadSchema": { - "targetType": "SetIP", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ClickButtonPaste" - }, - { - "legacy": "deprecated.SYSTEM.SetIP.ClickButtonCancel", - "patchTarget": "Il2Cpp.SetIP::void ClickButtonCancel()", - "strategy": "Postfix", - "description": "Interop target SetIP.ClickButtonCancel", - "payloadSchema": { - "targetType": "SetIP", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ClickButtonCancel" - }, - { - "legacy": "deprecated.SYSTEM.SetIP.CloseCanvas", - "patchTarget": "Il2Cpp.SetIP::void CloseCanvas()", - "strategy": "Postfix", - "description": "Interop target SetIP.CloseCanvas", - "payloadSchema": { - "targetType": "SetIP", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.CloseCanvas" - }, - { - "legacy": "deprecated.SYSTEM.SetIP.CidrToSubnetMask", - "patchTarget": "Il2Cpp.SetIP::void CidrToSubnetMask(int cidr, out int m1, out int m2, out int m3, out int m4)", - "strategy": "Postfix", - "description": "Interop target SetIP.CidrToSubnetMask", - "payloadSchema": { - "targetType": "SetIP", - "isStatic": false, - "cidr": "int", - "m1": "outint", - "m2": "outint", - "m3": "outint", - "m4": "outint" - }, - "hookSubject": null, - "name": "greg.SYSTEM.CidrToSubnetMask" - }, - { - "legacy": "deprecated.SYSTEM.SetIP.TryParseIpToOctets", - "patchTarget": "Il2Cpp.SetIP::bool TryParseIpToOctets(string ipString, out int o1, out int o2, out int o3, out int o4)", - "strategy": "Prefix+Postfix", - "description": "Interop target SetIP.TryParseIpToOctets", - "payloadSchema": { - "targetType": "SetIP", - "isStatic": false, - "ipString": "string", - "o1": "outint", - "o2": "outint", - "o3": "outint", - "o4": "outint" - }, - "hookSubject": null, - "name": "greg.SYSTEM.TryParseIpToOctets" - }, - { - "legacy": "deprecated.SYSTEM.SetIP.IncrementOctets", - "patchTarget": "Il2Cpp.SetIP::void IncrementOctets(ref int o1, ref int o2, ref int o3, ref int o4)", - "strategy": "Postfix", - "description": "Interop target SetIP.IncrementOctets", - "payloadSchema": { - "targetType": "SetIP", - "isStatic": false, - "o1": "refint", - "o2": "refint", - "o3": "refint", - "o4": "refint" - }, - "hookSubject": null, - "name": "greg.SYSTEM.IncrementOctets" - }, - { - "legacy": "deprecated.SYSTEM.SetIP.ButtonHideShowHint", - "patchTarget": "Il2Cpp.SetIP::void ButtonHideShowHint()", - "strategy": "Postfix", - "description": "Interop target SetIP.ButtonHideShowHint", - "payloadSchema": { - "targetType": "SetIP", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ButtonHideShowHint" - }, - { - "legacy": "deprecated.SYSTEM.SetIP.OnDestroy", - "patchTarget": "Il2Cpp.SetIP::void OnDestroy()", - "strategy": "Postfix", - "description": "Interop target SetIP.OnDestroy", - "payloadSchema": { - "targetType": "SetIP", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "SetIP", - "name": "greg.SYSTEM.OnDestroy.SetIP" - }, - { - "legacy": "deprecated.SYSTEM.SettingsControls.Start", - "patchTarget": "Il2Cpp.SettingsControls::void Start()", - "strategy": "Postfix", - "description": "Interop target SettingsControls.Start", - "payloadSchema": { - "targetType": "SettingsControls", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "SettingsControls", - "name": "greg.SYSTEM.ComponentInitialized.SettingsControls" - }, - { - "legacy": "deprecated.SYSTEM.SettingsControls.LookSensitivity", - "patchTarget": "Il2Cpp.SettingsControls::void LookSensitivity(float fl)", - "strategy": "Postfix", - "description": "Interop target SettingsControls.LookSensitivity", - "payloadSchema": { - "targetType": "SettingsControls", - "isStatic": false, - "fl": "float" - }, - "hookSubject": null, - "name": "greg.SYSTEM.LookSensitivity" - }, - { - "legacy": "deprecated.SYSTEM.SettingsControls.InvertY", - "patchTarget": "Il2Cpp.SettingsControls::void InvertY()", - "strategy": "Postfix", - "description": "Interop target SettingsControls.InvertY", - "payloadSchema": { - "targetType": "SettingsControls", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.InvertY" - }, - { - "legacy": "deprecated.SYSTEM.SettingsControls.LoadSettings", - "patchTarget": "Il2Cpp.SettingsControls::void LoadSettings()", - "strategy": "Postfix", - "description": "Interop target SettingsControls.LoadSettings", - "payloadSchema": { - "targetType": "SettingsControls", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "SettingsControls", - "name": "greg.SYSTEM.SettingsLoaded.SettingsControls" - }, - { - "legacy": "deprecated.SYSTEM.SettingsGameplay.Start", - "patchTarget": "Il2Cpp.SettingsGameplay::void Start()", - "strategy": "Postfix", - "description": "Interop target SettingsGameplay.Start", - "payloadSchema": { - "targetType": "SettingsGameplay", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "SettingsGameplay", - "name": "greg.SYSTEM.ComponentInitialized.SettingsGameplay" - }, - { - "legacy": "deprecated.SYSTEM.SettingsGameplay.OnLanguageDropDownChange", - "patchTarget": "Il2Cpp.SettingsGameplay::void OnLanguageDropDownChange(int i)", - "strategy": "Postfix", - "description": "Interop target SettingsGameplay.OnLanguageDropDownChange", - "payloadSchema": { - "targetType": "SettingsGameplay", - "isStatic": false, - "i": "int" - }, - "hookSubject": null, - "name": "greg.SYSTEM.OnLanguageDropDownChange" - }, - { - "legacy": "deprecated.SYSTEM.SettingsGameplay.SetAutoSaveInterval", - "patchTarget": "Il2Cpp.SettingsGameplay::void SetAutoSaveInterval(int i)", - "strategy": "Postfix", - "description": "Interop target SettingsGameplay.SetAutoSaveInterval", - "payloadSchema": { - "targetType": "SettingsGameplay", - "isStatic": false, - "i": "int", - "hookSubject": "string" - }, - "hookSubject": "SettingsGameplay_inti", - "name": "greg.SYSTEM.AutoSaveIntervalSet.SettingsGameplay_inti" - }, - { - "legacy": "deprecated.SYSTEM.SettingsGameplay.SetAutoSaveOnOff", - "patchTarget": "Il2Cpp.SettingsGameplay::void SetAutoSaveOnOff(bool isActive)", - "strategy": "Postfix", - "description": "Interop target SettingsGameplay.SetAutoSaveOnOff", - "payloadSchema": { - "targetType": "SettingsGameplay", - "isStatic": false, - "isActive": "bool" - }, - "hookSubject": null, - "name": "greg.SYSTEM.AutoSaveOnOffSet" - }, - { - "legacy": "deprecated.SYSTEM.SettingsGameplay.LoadSettings", - "patchTarget": "Il2Cpp.SettingsGameplay::void LoadSettings()", - "strategy": "Postfix", - "description": "Interop target SettingsGameplay.LoadSettings", - "payloadSchema": { - "targetType": "SettingsGameplay", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "SettingsGameplay", - "name": "greg.SYSTEM.SettingsLoaded.SettingsGameplay" - }, - { - "legacy": "deprecated.SYSTEM.SettingsGraphics.Start", - "patchTarget": "Il2Cpp.SettingsGraphics::void Start()", - "strategy": "Postfix", - "description": "Interop target SettingsGraphics.Start", - "payloadSchema": { - "targetType": "SettingsGraphics", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "SettingsGraphics", - "name": "greg.SYSTEM.ComponentInitialized.SettingsGraphics" - }, - { - "legacy": "deprecated.SYSTEM.SettingsGraphics.SetQuality", - "patchTarget": "Il2Cpp.SettingsGraphics::void SetQuality(int qualityIndex)", - "strategy": "Postfix", - "description": "Interop target SettingsGraphics.SetQuality", - "payloadSchema": { - "targetType": "SettingsGraphics", - "isStatic": false, - "qualityIndex": "int" - }, - "hookSubject": null, - "name": "greg.SYSTEM.QualitySet" - }, - { - "legacy": "deprecated.SYSTEM.SettingsGraphics.SetFullScreen", - "patchTarget": "Il2Cpp.SettingsGraphics::void SetFullScreen(bool isFullScreen)", - "strategy": "Postfix", - "description": "Interop target SettingsGraphics.SetFullScreen", - "payloadSchema": { - "targetType": "SettingsGraphics", - "isStatic": false, - "isFullScreen": "bool" - }, - "hookSubject": null, - "name": "greg.SYSTEM.FullScreenSet" - }, - { - "legacy": "deprecated.SYSTEM.SettingsGraphics.SetResDropDown", - "patchTarget": "Il2Cpp.SettingsGraphics::void SetResDropDown(int resolutionIndex)", - "strategy": "Postfix", - "description": "Interop target SettingsGraphics.SetResDropDown", - "payloadSchema": { - "targetType": "SettingsGraphics", - "isStatic": false, - "resolutionIndex": "int" - }, - "hookSubject": null, - "name": "greg.SYSTEM.ResDropDownSet" - }, - { - "legacy": "deprecated.SYSTEM.SettingsGraphics.SetResolution", - "patchTarget": "Il2Cpp.SettingsGraphics::void SetResolution(int width, int height)", - "strategy": "Postfix", - "description": "Interop target SettingsGraphics.SetResolution", - "payloadSchema": { - "targetType": "SettingsGraphics", - "isStatic": false, - "width": "int", - "height": "int" - }, - "hookSubject": null, - "name": "greg.SYSTEM.ResolutionSet" - }, - { - "legacy": "deprecated.SYSTEM.SettingsGraphics.AvailableRefreshRatesAfterFrame", - "patchTarget": "Il2Cpp.SettingsGraphics::IEnumerator AvailableRefreshRatesAfterFrame()", - "strategy": "Postfix", - "description": "Interop target SettingsGraphics.AvailableRefreshRatesAfterFrame", - "payloadSchema": { - "targetType": "SettingsGraphics", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.AvailableRefreshRatesAfterFrame" - }, - { - "legacy": "deprecated.SYSTEM.SettingsGraphics.AvailableRefreshRate", - "patchTarget": "Il2Cpp.SettingsGraphics::void AvailableRefreshRate()", - "strategy": "Postfix", - "description": "Interop target SettingsGraphics.AvailableRefreshRate", - "payloadSchema": { - "targetType": "SettingsGraphics", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.AvailableRefreshRate" - }, - { - "legacy": "deprecated.SYSTEM.SettingsGraphics.SetRefreshRate", - "patchTarget": "Il2Cpp.SettingsGraphics::void SetRefreshRate(int _refreshRate)", - "strategy": "Postfix", - "description": "Interop target SettingsGraphics.SetRefreshRate", - "payloadSchema": { - "targetType": "SettingsGraphics", - "isStatic": false, - "_refreshRate": "int" - }, - "hookSubject": null, - "name": "greg.SYSTEM.RefreshRateSet" - }, - { - "legacy": "deprecated.SYSTEM.SettingsGraphics.LimitFrameRate", - "patchTarget": "Il2Cpp.SettingsGraphics::void LimitFrameRate(int _framerate)", - "strategy": "Postfix", - "description": "Interop target SettingsGraphics.LimitFrameRate", - "payloadSchema": { - "targetType": "SettingsGraphics", - "isStatic": false, - "_framerate": "int" - }, - "hookSubject": null, - "name": "greg.SYSTEM.LimitFrameRate" - }, - { - "legacy": "deprecated.SYSTEM.SettingsGraphics.LoadSettings", - "patchTarget": "Il2Cpp.SettingsGraphics::void LoadSettings()", - "strategy": "Postfix", - "description": "Interop target SettingsGraphics.LoadSettings", - "payloadSchema": { - "targetType": "SettingsGraphics", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "SettingsGraphics", - "name": "greg.SYSTEM.SettingsLoaded.SettingsGraphics" - }, - { - "legacy": "deprecated.SYSTEM.SettingsGraphics.ChangeDepthOfField", - "patchTarget": "Il2Cpp.SettingsGraphics::void ChangeDepthOfField(float startFarFocus, float endFarFocus)", - "strategy": "Postfix", - "description": "Interop target SettingsGraphics.ChangeDepthOfField", - "payloadSchema": { - "targetType": "SettingsGraphics", - "isStatic": false, - "startFarFocus": "float", - "endFarFocus": "float" - }, - "hookSubject": null, - "name": "greg.SYSTEM.ChangeDepthOfField" - }, - { - "legacy": "deprecated.SYSTEM.SettingsGraphics.ResetDepthOfField", - "patchTarget": "Il2Cpp.SettingsGraphics::void ResetDepthOfField()", - "strategy": "Postfix", - "description": "Interop target SettingsGraphics.ResetDepthOfField", - "payloadSchema": { - "targetType": "SettingsGraphics", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ResetDepthOfField" - }, - { - "legacy": "deprecated.SYSTEM.SettingsGraphics.SetFieldOfView", - "patchTarget": "Il2Cpp.SettingsGraphics::void SetFieldOfView(float fov)", - "strategy": "Postfix", - "description": "Interop target SettingsGraphics.SetFieldOfView", - "payloadSchema": { - "targetType": "SettingsGraphics", - "isStatic": false, - "fov": "float" - }, - "hookSubject": null, - "name": "greg.SYSTEM.FieldOfViewSet" - }, - { - "legacy": "deprecated.SYSTEM.SettingsGraphics.SetShadowDistance", - "patchTarget": "Il2Cpp.SettingsGraphics::void SetShadowDistance(float distance)", - "strategy": "Postfix", - "description": "Interop target SettingsGraphics.SetShadowDistance", - "payloadSchema": { - "targetType": "SettingsGraphics", - "isStatic": false, - "distance": "float" - }, - "hookSubject": null, - "name": "greg.SYSTEM.ShadowDistanceSet" - }, - { - "legacy": "deprecated.SYSTEM.SettingsGraphics.SetMotionBlur", - "patchTarget": "Il2Cpp.SettingsGraphics::void SetMotionBlur(float motion)", - "strategy": "Postfix", - "description": "Interop target SettingsGraphics.SetMotionBlur", - "payloadSchema": { - "targetType": "SettingsGraphics", - "isStatic": false, - "motion": "float" - }, - "hookSubject": null, - "name": "greg.SYSTEM.MotionBlurSet" - }, - { - "legacy": "deprecated.SYSTEM.SettingsGraphics.SetExposure", - "patchTarget": "Il2Cpp.SettingsGraphics::void SetExposure(float exposure)", - "strategy": "Postfix", - "description": "Interop target SettingsGraphics.SetExposure", - "payloadSchema": { - "targetType": "SettingsGraphics", - "isStatic": false, - "exposure": "float" - }, - "hookSubject": null, - "name": "greg.SYSTEM.ExposureSet" - }, - { - "legacy": "deprecated.SYSTEM.SettingsGraphics.SetupAA", - "patchTarget": "Il2Cpp.SettingsGraphics::void SetupAA()", - "strategy": "Postfix", - "description": "Interop target SettingsGraphics.SetupAA", - "payloadSchema": { - "targetType": "SettingsGraphics", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.upAASet" - }, - { - "legacy": "deprecated.SYSTEM.SettingsGraphics.SetAntiAliasing", - "patchTarget": "Il2Cpp.SettingsGraphics::void SetAntiAliasing(int index)", - "strategy": "Postfix", - "description": "Interop target SettingsGraphics.SetAntiAliasing", - "payloadSchema": { - "targetType": "SettingsGraphics", - "isStatic": false, - "index": "int" - }, - "hookSubject": null, - "name": "greg.SYSTEM.AntiAliasingSet" - }, - { - "legacy": "deprecated.SYSTEM.SettingsGraphics.SetAAQuality", - "patchTarget": "Il2Cpp.SettingsGraphics::void SetAAQuality(int index)", - "strategy": "Postfix", - "description": "Interop target SettingsGraphics.SetAAQuality", - "payloadSchema": { - "targetType": "SettingsGraphics", - "isStatic": false, - "index": "int" - }, - "hookSubject": null, - "name": "greg.SYSTEM.AAQualitySet" - }, - { - "legacy": "deprecated.SYSTEM.SettingsGraphics.IsDLSSSupported", - "patchTarget": "Il2Cpp.SettingsGraphics::bool IsDLSSSupported()", - "strategy": "Postfix", - "description": "Interop target SettingsGraphics.IsDLSSSupported", - "payloadSchema": { - "targetType": "SettingsGraphics", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.IsDLSSSupported" - }, - { - "legacy": "deprecated.SYSTEM.SettingsSingleton.Awake", - "patchTarget": "Il2Cpp.SettingsSingleton::void Awake()", - "strategy": "Postfix", - "description": "Interop target SettingsSingleton.Awake", - "payloadSchema": { - "targetType": "SettingsSingleton", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "SettingsSingleton", - "name": "greg.SYSTEM.ComponentInitialized.SettingsSingleton" - }, - { - "legacy": "deprecated.SYSTEM.SettingsSingleton.DisableOnAfterFirstSettingUp", - "patchTarget": "Il2Cpp.SettingsSingleton::IEnumerator DisableOnAfterFirstSettingUp()", - "strategy": "Postfix", - "description": "Interop target SettingsSingleton.DisableOnAfterFirstSettingUp", - "payloadSchema": { - "targetType": "SettingsSingleton", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.DisableOnAfterFirstSettingUp" - }, - { - "legacy": "deprecated.SYSTEM.SettingsVolume.Start", - "patchTarget": "Il2Cpp.SettingsVolume::void Start()", - "strategy": "Postfix", - "description": "Interop target SettingsVolume.Start", - "payloadSchema": { - "targetType": "SettingsVolume", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "SettingsVolume", - "name": "greg.SYSTEM.ComponentInitialized.SettingsVolume" - }, - { - "legacy": "deprecated.SYSTEM.SettingsVolume.MasterVolume", - "patchTarget": "Il2Cpp.SettingsVolume::void MasterVolume(float volume)", - "strategy": "Postfix", - "description": "Interop target SettingsVolume.MasterVolume", - "payloadSchema": { - "targetType": "SettingsVolume", - "isStatic": false, - "volume": "float" - }, - "hookSubject": null, - "name": "greg.SYSTEM.MasterVolume" - }, - { - "legacy": "deprecated.SYSTEM.SettingsVolume.MusicVolume", - "patchTarget": "Il2Cpp.SettingsVolume::void MusicVolume(float volume)", - "strategy": "Postfix", - "description": "Interop target SettingsVolume.MusicVolume", - "payloadSchema": { - "targetType": "SettingsVolume", - "isStatic": false, - "volume": "float" - }, - "hookSubject": null, - "name": "greg.SYSTEM.MusicVolume" - }, - { - "legacy": "deprecated.SYSTEM.SettingsVolume.EffectVolume", - "patchTarget": "Il2Cpp.SettingsVolume::void EffectVolume(float volume)", - "strategy": "Postfix", - "description": "Interop target SettingsVolume.EffectVolume", - "payloadSchema": { - "targetType": "SettingsVolume", - "isStatic": false, - "volume": "float" - }, - "hookSubject": null, - "name": "greg.SYSTEM.EffectVolume" - }, - { - "legacy": "deprecated.SYSTEM.SettingsVolume.RacksVolume", - "patchTarget": "Il2Cpp.SettingsVolume::void RacksVolume(float volume)", - "strategy": "Postfix", - "description": "Interop target SettingsVolume.RacksVolume", - "payloadSchema": { - "targetType": "SettingsVolume", - "isStatic": false, - "volume": "float" - }, - "hookSubject": null, - "name": "greg.SYSTEM.RacksVolume" - }, - { - "legacy": "deprecated.SYSTEM.SettingsVolume.LoadSettings", - "patchTarget": "Il2Cpp.SettingsVolume::void LoadSettings()", - "strategy": "Postfix", - "description": "Interop target SettingsVolume.LoadSettings", - "payloadSchema": { - "targetType": "SettingsVolume", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "SettingsVolume", - "name": "greg.SYSTEM.SettingsLoaded.SettingsVolume" - }, - { - "legacy": "deprecated.NETWORK.SFPBox.Awake", - "patchTarget": "Il2Cpp.SFPBox::override void Awake()", - "strategy": "Postfix", - "description": "Interop target SFPBox.Awake", - "payloadSchema": { - "targetType": "SFPBox", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "SFPBox", - "name": "greg.NETWORK.ComponentInitialized.SFPBox" - }, - { - "legacy": "deprecated.NETWORK.SFPBox.InteractOnClick", - "patchTarget": "Il2Cpp.SFPBox::override void InteractOnClick()", - "strategy": "Postfix", - "description": "Interop target SFPBox.InteractOnClick", - "payloadSchema": { - "targetType": "SFPBox", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "SFPBox", - "name": "greg.NETWORK.InteractOnClick.SFPBox" - }, - { - "legacy": "deprecated.NETWORK.SFPBox.InsertSFPBackIntoBox", - "patchTarget": "Il2Cpp.SFPBox::void InsertSFPBackIntoBox()", - "strategy": "Postfix", - "description": "Interop target SFPBox.InsertSFPBackIntoBox", - "payloadSchema": { - "targetType": "SFPBox", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.NETWORK.InsertSFPBackIntoBox" - }, - { - "legacy": "deprecated.NETWORK.SFPBox.ParentTheObjectWithDelay", - "patchTarget": "Il2Cpp.SFPBox::IEnumerator ParentTheObjectWithDelay(Transform uo, int index)", - "strategy": "Postfix", - "description": "Interop target SFPBox.ParentTheObjectWithDelay", - "payloadSchema": { - "targetType": "SFPBox", - "isStatic": false, - "uo": "Transform", - "index": "int" - }, - "hookSubject": null, - "name": "greg.NETWORK.ParentTheObjectWithDelay" - }, - { - "legacy": "deprecated.NETWORK.SFPBox.RemoveSFPFromBox", - "patchTarget": "Il2Cpp.SFPBox::void RemoveSFPFromBox(int position)", - "strategy": "Postfix", - "description": "Interop target SFPBox.RemoveSFPFromBox", - "payloadSchema": { - "targetType": "SFPBox", - "isStatic": false, - "position": "int" - }, - "hookSubject": null, - "name": "greg.NETWORK.oveSFPFromBoxRemoved" - }, - { - "legacy": "deprecated.NETWORK.SFPBox.InteractOnHover", - "patchTarget": "Il2Cpp.SFPBox::override void InteractOnHover(RaycastHit hit)", - "strategy": "Postfix", - "description": "Interop target SFPBox.InteractOnHover", - "payloadSchema": { - "targetType": "SFPBox", - "isStatic": false, - "hit": "RaycastHit", - "hookSubject": "string" - }, - "hookSubject": "SFPBox_RaycastHithit", - "name": "greg.NETWORK.InteractOnHover.SFPBox_RaycastHithit" - }, - { - "legacy": "deprecated.NETWORK.SFPBox.LoadSFPsFromSave", - "patchTarget": "Il2Cpp.SFPBox::void LoadSFPsFromSave()", - "strategy": "Postfix", - "description": "Interop target SFPBox.LoadSFPsFromSave", - "payloadSchema": { - "targetType": "SFPBox", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.NETWORK.SFPsFromSaveLoaded" - }, - { - "legacy": "deprecated.NETWORK.SFPModule.Awake", - "patchTarget": "Il2Cpp.SFPModule::override void Awake()", - "strategy": "Postfix", - "description": "Interop target SFPModule.Awake", - "payloadSchema": { - "targetType": "SFPModule", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "SFPModule", - "name": "greg.NETWORK.ComponentInitialized.SFPModule" - }, - { - "legacy": "deprecated.NETWORK.SFPModule.IsAnyCableConnected", - "patchTarget": "Il2Cpp.SFPModule::bool IsAnyCableConnected()", - "strategy": "Postfix", - "description": "Interop target SFPModule.IsAnyCableConnected", - "payloadSchema": { - "targetType": "SFPModule", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "SFPModule", - "name": "greg.NETWORK.IsAnyCableConnected.SFPModule" - }, - { - "legacy": "deprecated.NETWORK.SFPModule.InteractOnClick", - "patchTarget": "Il2Cpp.SFPModule::override void InteractOnClick()", - "strategy": "Postfix", - "description": "Interop target SFPModule.InteractOnClick", - "payloadSchema": { - "targetType": "SFPModule", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "SFPModule", - "name": "greg.NETWORK.InteractOnClick.SFPModule" - }, - { - "legacy": "deprecated.NETWORK.SFPModule.InteractOnHover", - "patchTarget": "Il2Cpp.SFPModule::override void InteractOnHover(RaycastHit hit)", - "strategy": "Postfix", - "description": "Interop target SFPModule.InteractOnHover", - "payloadSchema": { - "targetType": "SFPModule", - "isStatic": false, - "hit": "RaycastHit", - "hookSubject": "string" - }, - "hookSubject": "SFPModule_RaycastHithit", - "name": "greg.NETWORK.InteractOnHover.SFPModule_RaycastHithit" - }, - { - "legacy": "deprecated.NETWORK.SFPModule.InsertedInSFPPort", - "patchTarget": "Il2Cpp.SFPModule::void InsertedInSFPPort(CableLink _link, bool immediate = false)", - "strategy": "Postfix", - "description": "Interop target SFPModule.InsertedInSFPPort", - "payloadSchema": { - "targetType": "SFPModule", - "isStatic": false, - "_link": "CableLink", - "immediate": "bool" - }, - "hookSubject": null, - "name": "greg.NETWORK.InsertedInSFPPort" - }, - { - "legacy": "deprecated.NETWORK.SFPModule.SlideIntoPort", - "patchTarget": "Il2Cpp.SFPModule::IEnumerator SlideIntoPort(Transform port)", - "strategy": "Postfix", - "description": "Interop target SFPModule.SlideIntoPort", - "payloadSchema": { - "targetType": "SFPModule", - "isStatic": false, - "port": "Transform" - }, - "hookSubject": null, - "name": "greg.NETWORK.SlideIntoPort" - }, - { - "legacy": "deprecated.NETWORK.SFPModule.OnDestroy", - "patchTarget": "Il2Cpp.SFPModule::override void OnDestroy()", - "strategy": "Postfix", - "description": "Interop target SFPModule.OnDestroy", - "payloadSchema": { - "targetType": "SFPModule", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "SFPModule", - "name": "greg.NETWORK.OnDestroy.SFPModule" - }, - { - "legacy": "deprecated.SYSTEM.ShopCartItem.Initialize", - "patchTarget": "Il2Cpp.ShopCartItem::void Initialize(ComputerShop shop, string itemName, int itemID, int price, PlayerManager.ObjectInHand itemType, int firstSpawnUID, Nullable customColor = null)", - "strategy": "Postfix", - "description": "Interop target ShopCartItem.Initialize", - "payloadSchema": { - "targetType": "ShopCartItem", - "isStatic": false, - "shop": "ComputerShop", - "itemName": "string", - "itemID": "int", - "price": "int", - "itemType": "PlayerManager.ObjectInHand", - "firstSpawnUID": "int", - "customColor": "Nullable" - }, - "hookSubject": null, - "name": "greg.SYSTEM.Initialize" - }, - { - "legacy": "deprecated.SYSTEM.ShopCartItem.AddSpawnedItem", - "patchTarget": "Il2Cpp.ShopCartItem::void AddSpawnedItem(int uid)", - "strategy": "Postfix", - "description": "Interop target ShopCartItem.AddSpawnedItem", - "payloadSchema": { - "targetType": "ShopCartItem", - "isStatic": false, - "uid": "int" - }, - "hookSubject": null, - "name": "greg.SYSTEM.SpawnedItemAdded" - }, - { - "legacy": "deprecated.SYSTEM.ShopCartItem.RemoveLastSpawnedItem", - "patchTarget": "Il2Cpp.ShopCartItem::int RemoveLastSpawnedItem()", - "strategy": "Postfix", - "description": "Interop target ShopCartItem.RemoveLastSpawnedItem", - "payloadSchema": { - "targetType": "ShopCartItem", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.oveLastSpawnedItemRemoved" - }, - { - "legacy": "deprecated.SYSTEM.ShopCartItem.ClearAllUIDs", - "patchTarget": "Il2Cpp.ShopCartItem::void ClearAllUIDs()", - "strategy": "Postfix", - "description": "Interop target ShopCartItem.ClearAllUIDs", - "payloadSchema": { - "targetType": "ShopCartItem", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ClearAllUIDs" - }, - { - "legacy": "deprecated.SYSTEM.ShopCartItem.OnAddClicked", - "patchTarget": "Il2Cpp.ShopCartItem::void OnAddClicked()", - "strategy": "Postfix", - "description": "Interop target ShopCartItem.OnAddClicked", - "payloadSchema": { - "targetType": "ShopCartItem", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.OnAddClicked" - }, - { - "legacy": "deprecated.SYSTEM.ShopCartItem.OnRemoveClicked", - "patchTarget": "Il2Cpp.ShopCartItem::void OnRemoveClicked()", - "strategy": "Postfix", - "description": "Interop target ShopCartItem.OnRemoveClicked", - "payloadSchema": { - "targetType": "ShopCartItem", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.OnRemoveClicked" - }, - { - "legacy": "deprecated.SYSTEM.ShopCartItem.UpdateDisplay", - "patchTarget": "Il2Cpp.ShopCartItem::void UpdateDisplay()", - "strategy": "Postfix", - "description": "Interop target ShopCartItem.UpdateDisplay", - "payloadSchema": { - "targetType": "ShopCartItem", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.DisplayChanged" - }, - { - "legacy": "deprecated.SYSTEM.ShopCartItem.OnDestroy", - "patchTarget": "Il2Cpp.ShopCartItem::void OnDestroy()", - "strategy": "Postfix", - "description": "Interop target ShopCartItem.OnDestroy", - "payloadSchema": { - "targetType": "ShopCartItem", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "ShopCartItem", - "name": "greg.SYSTEM.OnDestroy.ShopCartItem" - }, - { - "legacy": "deprecated.SYSTEM.ShopItem.Awake", - "patchTarget": "Il2Cpp.ShopItem::void Awake()", - "strategy": "Postfix", - "description": "Interop target ShopItem.Awake", - "payloadSchema": { - "targetType": "ShopItem", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "ShopItem_0f1536fd84", - "name": "greg.SYSTEM.ComponentInitialized.ShopItem_0f1536fd84" - }, - { - "legacy": "deprecated.SYSTEM.ShopItem.Start", - "patchTarget": "Il2Cpp.ShopItem::void Start()", - "strategy": "Postfix", - "description": "Interop target ShopItem.Start", - "payloadSchema": { - "targetType": "ShopItem", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "ShopItem_aac85c1e13", - "name": "greg.SYSTEM.ComponentInitialized.ShopItem_aac85c1e13" - }, - { - "legacy": "deprecated.SYSTEM.ShopItem.ButtonBuyItem", - "patchTarget": "Il2Cpp.ShopItem::void ButtonBuyItem()", - "strategy": "Postfix", - "description": "Interop target ShopItem.ButtonBuyItem", - "payloadSchema": { - "targetType": "ShopItem", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ButtonBuyItem" - }, - { - "legacy": "deprecated.SYSTEM.ShopItem.TryUnlock", - "patchTarget": "Il2Cpp.ShopItem::void TryUnlock()", - "strategy": "Prefix+Postfix", - "description": "Interop target ShopItem.TryUnlock", - "payloadSchema": { - "targetType": "ShopItem", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.TryUnlock" - }, - { - "legacy": "deprecated.SYSTEM.ShopItem.BuyItem", - "patchTarget": "Il2Cpp.ShopItem::void BuyItem()", - "strategy": "Postfix", - "description": "Interop target ShopItem.BuyItem", - "payloadSchema": { - "targetType": "ShopItem", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ItemPurchased" - }, - { - "legacy": "deprecated.SYSTEM.ShopItem.UnlockButton", - "patchTarget": "Il2Cpp.ShopItem::void UnlockButton()", - "strategy": "Postfix", - "description": "Interop target ShopItem.UnlockButton", - "payloadSchema": { - "targetType": "ShopItem", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.UnlockButton" - }, - { - "legacy": "deprecated.SYSTEM.ShopItem.UpdateVisualState", - "patchTarget": "Il2Cpp.ShopItem::void UpdateVisualState()", - "strategy": "Postfix", - "description": "Interop target ShopItem.UpdateVisualState", - "payloadSchema": { - "targetType": "ShopItem", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.VisualStateChanged" - }, - { - "legacy": "deprecated.SYSTEM.ShopItem.OnLoad", - "patchTarget": "Il2Cpp.ShopItem::void OnLoad()", - "strategy": "Postfix", - "description": "Interop target ShopItem.OnLoad", - "payloadSchema": { - "targetType": "ShopItem", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "ShopItem", - "name": "greg.SYSTEM.OnLoad.ShopItem" - }, - { - "legacy": "deprecated.SYSTEM.ShopItem.OnDestroy", - "patchTarget": "Il2Cpp.ShopItem::void OnDestroy()", - "strategy": "Postfix", - "description": "Interop target ShopItem.OnDestroy", - "payloadSchema": { - "targetType": "ShopItem", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "ShopItem", - "name": "greg.SYSTEM.OnDestroy.ShopItem" - }, - { - "legacy": "deprecated.SYSTEM.StaminaOverlayOnEnable.OnEnable", - "patchTarget": "Il2Cpp.StaminaOverlayOnEnable::void OnEnable()", - "strategy": "Postfix", - "description": "Interop target StaminaOverlayOnEnable.OnEnable", - "payloadSchema": { - "targetType": "StaminaOverlayOnEnable", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "StaminaOverlayOnEnable", - "name": "greg.SYSTEM.ComponentEnabled.StaminaOverlayOnEnable" - }, - { - "legacy": "deprecated.SYSTEM.StaticUIElements.Awake", - "patchTarget": "Il2Cpp.StaticUIElements::void Awake()", - "strategy": "Postfix", - "description": "Interop target StaticUIElements.Awake", - "payloadSchema": { - "targetType": "StaticUIElements", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "StaticUIElements_1becd00ab1", - "name": "greg.SYSTEM.ComponentInitialized.StaticUIElements_1becd00ab1" - }, - { - "legacy": "deprecated.SYSTEM.StaticUIElements.Start", - "patchTarget": "Il2Cpp.StaticUIElements::void Start()", - "strategy": "Postfix", - "description": "Interop target StaticUIElements.Start", - "payloadSchema": { - "targetType": "StaticUIElements", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "StaticUIElements_bb8e47cf20", - "name": "greg.SYSTEM.ComponentInitialized.StaticUIElements_bb8e47cf20" - }, - { - "legacy": "deprecated.SYSTEM.StaticUIElements.UpdateCoinsAndPrestige_TopLeft", - "patchTarget": "Il2Cpp.StaticUIElements::IEnumerator UpdateCoinsAndPrestige_TopLeft()", - "strategy": "Postfix", - "description": "Interop target StaticUIElements.UpdateCoinsAndPrestige_TopLeft", - "payloadSchema": { - "targetType": "StaticUIElements", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.CoinsAndPrestige_TopLeftChanged" - }, - { - "legacy": "deprecated.SYSTEM.StaticUIElements.CalculateRates", - "patchTarget": "Il2Cpp.StaticUIElements::void CalculateRates(out float moneyPerSec, out float xpPerSec, out float expensesPerSec)", - "strategy": "Postfix", - "description": "Interop target StaticUIElements.CalculateRates", - "payloadSchema": { - "targetType": "StaticUIElements", - "isStatic": false, - "moneyPerSec": "outfloat", - "xpPerSec": "outfloat", - "expensesPerSec": "outfloat" - }, - "hookSubject": null, - "name": "greg.SYSTEM.CalculateRates" - }, - { - "legacy": "deprecated.SYSTEM.StaticUIElements.SetNotification", - "patchTarget": "Il2Cpp.StaticUIElements::void SetNotification(int _localisationUID, Sprite _sprite = null, string _text = \"\")", - "strategy": "Postfix", - "description": "Interop target StaticUIElements.SetNotification", - "payloadSchema": { - "targetType": "StaticUIElements", - "isStatic": false, - "_localisationUID": "int", - "_sprite": "Sprite", - "_text": "string" - }, - "hookSubject": null, - "name": "greg.SYSTEM.NotificationSet" - }, - { - "legacy": "deprecated.SYSTEM.StaticUIElements.ShowStaticCanvas", - "patchTarget": "Il2Cpp.StaticUIElements::void ShowStaticCanvas(bool active)", - "strategy": "Postfix", - "description": "Interop target StaticUIElements.ShowStaticCanvas", - "payloadSchema": { - "targetType": "StaticUIElements", - "isStatic": false, - "active": "bool" - }, - "hookSubject": null, - "name": "greg.SYSTEM.ShowStaticCanvas" - }, - { - "legacy": "deprecated.SYSTEM.StaticUIElements.CreateCustomKeyHint", - "patchTarget": "Il2Cpp.StaticUIElements::GameObject CreateCustomKeyHint(InputAction action, int textUID, Transform parent = null, bool isPermanent = false)", - "strategy": "Postfix", - "description": "Interop target StaticUIElements.CreateCustomKeyHint", - "payloadSchema": { - "targetType": "StaticUIElements", - "isStatic": false, - "action": "InputAction", - "textUID": "int", - "parent": "Transform", - "isPermanent": "bool" - }, - "hookSubject": null, - "name": "greg.SYSTEM.CreateCustomKeyHint" - }, - { - "legacy": "deprecated.SYSTEM.StaticUIElements.RemoveCustomKeyHint", - "patchTarget": "Il2Cpp.StaticUIElements::void RemoveCustomKeyHint()", - "strategy": "Postfix", - "description": "Interop target StaticUIElements.RemoveCustomKeyHint", - "payloadSchema": { - "targetType": "StaticUIElements", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.oveCustomKeyHintRemoved" - }, - { - "legacy": "deprecated.SYSTEM.StaticUIElements.InstantiateParticleUpgrade", - "patchTarget": "Il2Cpp.StaticUIElements::void InstantiateParticleUpgrade(Transform _transform)", - "strategy": "Postfix", - "description": "Interop target StaticUIElements.InstantiateParticleUpgrade", - "payloadSchema": { - "targetType": "StaticUIElements", - "isStatic": false, - "_transform": "Transform" - }, - "hookSubject": null, - "name": "greg.SYSTEM.InstantiateParticleUpgrade" - }, - { - "legacy": "deprecated.SYSTEM.StaticUIElements.UpdateMessagesCoroutine", - "patchTarget": "Il2Cpp.StaticUIElements::IEnumerator UpdateMessagesCoroutine()", - "strategy": "Postfix", - "description": "Interop target StaticUIElements.UpdateMessagesCoroutine", - "payloadSchema": { - "targetType": "StaticUIElements", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.MessagesCoroutineChanged" - }, - { - "legacy": "deprecated.SYSTEM.StaticUIElements.UpdateMessageDisplay", - "patchTarget": "Il2Cpp.StaticUIElements::void UpdateMessageDisplay()", - "strategy": "Postfix", - "description": "Interop target StaticUIElements.UpdateMessageDisplay", - "payloadSchema": { - "targetType": "StaticUIElements", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.MessageDisplayChanged" - }, - { - "legacy": "deprecated.SYSTEM.StaticUIElements.AddMeesageInField", - "patchTarget": "Il2Cpp.StaticUIElements::void AddMeesageInField(string message)", - "strategy": "Postfix", - "description": "Interop target StaticUIElements.AddMeesageInField", - "payloadSchema": { - "targetType": "StaticUIElements", - "isStatic": false, - "message": "string" - }, - "hookSubject": null, - "name": "greg.SYSTEM.MeesageInFieldAdded" - }, - { - "legacy": "deprecated.SYSTEM.StaticUIElements.InstantiateErrorWarningSign", - "patchTarget": "Il2Cpp.StaticUIElements::int InstantiateErrorWarningSign(bool isError, Vector3 objectPos)", - "strategy": "Postfix", - "description": "Interop target StaticUIElements.InstantiateErrorWarningSign", - "payloadSchema": { - "targetType": "StaticUIElements", - "isStatic": false, - "isError": "bool", - "objectPos": "Vector3" - }, - "hookSubject": null, - "name": "greg.SYSTEM.InstantiateErrorWarningSign" - }, - { - "legacy": "deprecated.SYSTEM.StaticUIElements.DestroyErrorWarningSign", - "patchTarget": "Il2Cpp.StaticUIElements::void DestroyErrorWarningSign(int errorWarningUID)", - "strategy": "Postfix", - "description": "Interop target StaticUIElements.DestroyErrorWarningSign", - "payloadSchema": { - "targetType": "StaticUIElements", - "isStatic": false, - "errorWarningUID": "int" - }, - "hookSubject": null, - "name": "greg.SYSTEM.DestroyErrorWarningSign" - }, - { - "legacy": "deprecated.SYSTEM.StaticUIElements.ShowSpriteNextToPointer", - "patchTarget": "Il2Cpp.StaticUIElements::void ShowSpriteNextToPointer(Sprite _sprite)", - "strategy": "Postfix", - "description": "Interop target StaticUIElements.ShowSpriteNextToPointer", - "payloadSchema": { - "targetType": "StaticUIElements", - "isStatic": false, - "_sprite": "Sprite" - }, - "hookSubject": null, - "name": "greg.SYSTEM.ShowSpriteNextToPointer" - }, - { - "legacy": "deprecated.SYSTEM.StaticUIElements.ClearSpriteNextToPointer", - "patchTarget": "Il2Cpp.StaticUIElements::void ClearSpriteNextToPointer()", - "strategy": "Postfix", - "description": "Interop target StaticUIElements.ClearSpriteNextToPointer", - "payloadSchema": { - "targetType": "StaticUIElements", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ClearSpriteNextToPointer" - }, - { - "legacy": "deprecated.SYSTEM.StaticUIElements.ShowTextUnderCursor", - "patchTarget": "Il2Cpp.StaticUIElements::void ShowTextUnderCursor(string text)", - "strategy": "Postfix", - "description": "Interop target StaticUIElements.ShowTextUnderCursor", - "payloadSchema": { - "targetType": "StaticUIElements", - "isStatic": false, - "text": "string" - }, - "hookSubject": null, - "name": "greg.SYSTEM.ShowTextUnderCursor" - }, - { - "legacy": "deprecated.SYSTEM.StaticUIElements.HideTextUnderCursor", - "patchTarget": "Il2Cpp.StaticUIElements::void HideTextUnderCursor()", - "strategy": "Postfix", - "description": "Interop target StaticUIElements.HideTextUnderCursor", - "payloadSchema": { - "targetType": "StaticUIElements", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.HideTextUnderCursor" - }, - { - "legacy": "deprecated.SYSTEM.StaticUIElements.UpdateHoldProgress", - "patchTarget": "Il2Cpp.StaticUIElements::void UpdateHoldProgress(float value)", - "strategy": "Postfix", - "description": "Interop target StaticUIElements.UpdateHoldProgress", - "payloadSchema": { - "targetType": "StaticUIElements", - "isStatic": false, - "value": "float" - }, - "hookSubject": null, - "name": "greg.SYSTEM.HoldProgressChanged" - }, - { - "legacy": "deprecated.SYSTEM.StaticUIElements.SetLoadingInfo", - "patchTarget": "Il2Cpp.StaticUIElements::void SetLoadingInfo(string s)", - "strategy": "Postfix", - "description": "Interop target StaticUIElements.SetLoadingInfo", - "payloadSchema": { - "targetType": "StaticUIElements", - "isStatic": false, - "s": "string" - }, - "hookSubject": null, - "name": "greg.SYSTEM.LoadingInfoSet" - }, - { - "legacy": "deprecated.SYSTEM.StaticUIElements.OnLoadingStarted", - "patchTarget": "Il2Cpp.StaticUIElements::void OnLoadingStarted()", - "strategy": "Postfix", - "description": "Interop target StaticUIElements.OnLoadingStarted", - "payloadSchema": { - "targetType": "StaticUIElements", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.OnLoadingStarted" - }, - { - "legacy": "deprecated.SYSTEM.SteamManager.SteamAPIDebugTextHook", - "patchTarget": "Il2Cpp.SteamManager::static void SteamAPIDebugTextHook(int nSeverity, StringBuilder pchDebugText)", - "strategy": "Postfix", - "description": "Interop target SteamManager.SteamAPIDebugTextHook", - "payloadSchema": { - "targetType": "SteamManager", - "isStatic": true, - "nSeverity": "int", - "pchDebugText": "StringBuilder" - }, - "hookSubject": null, - "name": "greg.SYSTEM.SteamAPIDebugTextHook" - }, - { - "legacy": "deprecated.SYSTEM.SteamManager.InitOnPlayMode", - "patchTarget": "Il2Cpp.SteamManager::static void InitOnPlayMode()", - "strategy": "Postfix", - "description": "Interop target SteamManager.InitOnPlayMode", - "payloadSchema": { - "targetType": "SteamManager", - "isStatic": true - }, - "hookSubject": null, - "name": "greg.SYSTEM.InitOnPlayMode" - }, - { - "legacy": "deprecated.SYSTEM.SteamManager.Awake", - "patchTarget": "Il2Cpp.SteamManager::virtual void Awake()", - "strategy": "Postfix", - "description": "Interop target SteamManager.Awake", - "payloadSchema": { - "targetType": "SteamManager", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "SteamManager", - "name": "greg.SYSTEM.ComponentInitialized.SteamManager" - }, - { - "legacy": "deprecated.SYSTEM.SteamManager.OnEnable", - "patchTarget": "Il2Cpp.SteamManager::virtual void OnEnable()", - "strategy": "Postfix", - "description": "Interop target SteamManager.OnEnable", - "payloadSchema": { - "targetType": "SteamManager", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "SteamManager", - "name": "greg.SYSTEM.ComponentEnabled.SteamManager" - }, - { - "legacy": "deprecated.SYSTEM.SteamManager.OnDestroy", - "patchTarget": "Il2Cpp.SteamManager::virtual void OnDestroy()", - "strategy": "Postfix", - "description": "Interop target SteamManager.OnDestroy", - "payloadSchema": { - "targetType": "SteamManager", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "SteamManager", - "name": "greg.SYSTEM.OnDestroy.SteamManager" - }, - { - "legacy": "deprecated.SYSTEM.SteamStatsOnMainMenuTop.Start", - "patchTarget": "Il2Cpp.SteamStatsOnMainMenuTop::void Start()", - "strategy": "Postfix", - "description": "Interop target SteamStatsOnMainMenuTop.Start", - "payloadSchema": { - "targetType": "SteamStatsOnMainMenuTop", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "SteamStatsOnMainMenuTop", - "name": "greg.SYSTEM.ComponentInitialized.SteamStatsOnMainMenuTop" - }, - { - "legacy": "deprecated.SYSTEM.SteamStatsOnMainMenuTop.WaitAndDisplay", - "patchTarget": "Il2Cpp.SteamStatsOnMainMenuTop::IEnumerator WaitAndDisplay()", - "strategy": "Postfix", - "description": "Interop target SteamStatsOnMainMenuTop.WaitAndDisplay", - "payloadSchema": { - "targetType": "SteamStatsOnMainMenuTop", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.WaitAndDisplay" - }, - { - "legacy": "deprecated.SYSTEM.SteamStatsOnMainMenuTop.OnGlobalStatsReceived", - "patchTarget": "Il2Cpp.SteamStatsOnMainMenuTop::void OnGlobalStatsReceived(GlobalStatsReceived_t result, bool ioFailure)", - "strategy": "Postfix", - "description": "Interop target SteamStatsOnMainMenuTop.OnGlobalStatsReceived", - "payloadSchema": { - "targetType": "SteamStatsOnMainMenuTop", - "isStatic": false, - "result": "GlobalStatsReceived_t", - "ioFailure": "bool" - }, - "hookSubject": null, - "name": "greg.SYSTEM.OnGlobalStatsReceived" - }, - { - "legacy": "deprecated.SYSTEM.SteamStatsOnMainMenuTop.FormatDistance", - "patchTarget": "Il2Cpp.SteamStatsOnMainMenuTop::string FormatDistance(double meters)", - "strategy": "Postfix", - "description": "Interop target SteamStatsOnMainMenuTop.FormatDistance", - "payloadSchema": { - "targetType": "SteamStatsOnMainMenuTop", - "isStatic": false, - "meters": "double" - }, - "hookSubject": null, - "name": "greg.SYSTEM.FormatDistance" - }, - { - "legacy": "deprecated.EMPLOYEE.Technician.Awake", - "patchTarget": "Il2Cpp.Technician::void Awake()", - "strategy": "Postfix", - "description": "Interop target Technician.Awake", - "payloadSchema": { - "targetType": "Technician", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "Technician_732074c4e3", - "name": "greg.EMPLOYEE.ComponentInitialized.Technician_732074c4e3" - }, - { - "legacy": "deprecated.EMPLOYEE.Technician.Start", - "patchTarget": "Il2Cpp.Technician::void Start()", - "strategy": "Postfix", - "description": "Interop target Technician.Start", - "payloadSchema": { - "targetType": "Technician", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "Technician_29458068f5", - "name": "greg.EMPLOYEE.ComponentInitialized.Technician_29458068f5" - }, - { - "legacy": "deprecated.EMPLOYEE.Technician.RequestJobDelayed", - "patchTarget": "Il2Cpp.Technician::IEnumerator RequestJobDelayed()", - "strategy": "Postfix", - "description": "Interop target Technician.RequestJobDelayed", - "payloadSchema": { - "targetType": "Technician", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.EMPLOYEE.RequestJobDelayed" - }, - { - "legacy": "deprecated.EMPLOYEE.Technician.AssignJob", - "patchTarget": "Il2Cpp.Technician::void AssignJob(TechnicianManager.RepairJob job)", - "strategy": "Postfix", - "description": "Interop target Technician.AssignJob", - "payloadSchema": { - "targetType": "Technician", - "isStatic": false, - "job": "TechnicianManager.RepairJob" - }, - "hookSubject": null, - "name": "greg.EMPLOYEE.AssignJob" - }, - { - "legacy": "deprecated.EMPLOYEE.Technician.StartTextingAnimation", - "patchTarget": "Il2Cpp.Technician::IEnumerator StartTextingAnimation()", - "strategy": "Postfix", - "description": "Interop target Technician.StartTextingAnimation", - "payloadSchema": { - "targetType": "Technician", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.EMPLOYEE.StartTextingAnimation" - }, - { - "legacy": "deprecated.EMPLOYEE.Technician.SendToContainer", - "patchTarget": "Il2Cpp.Technician::IEnumerator SendToContainer()", - "strategy": "Postfix", - "description": "Interop target Technician.SendToContainer", - "payloadSchema": { - "targetType": "Technician", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.EMPLOYEE.ToContainerDispatched" - }, - { - "legacy": "deprecated.EMPLOYEE.Technician.ReplacingServer", - "patchTarget": "Il2Cpp.Technician::IEnumerator ReplacingServer()", - "strategy": "Postfix", - "description": "Interop target Technician.ReplacingServer", - "payloadSchema": { - "targetType": "Technician", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.EMPLOYEE.ReplacingServer" - }, - { - "legacy": "deprecated.EMPLOYEE.Technician.ThrowingOutServer", - "patchTarget": "Il2Cpp.Technician::IEnumerator ThrowingOutServer()", - "strategy": "Postfix", - "description": "Interop target Technician.ThrowingOutServer", - "payloadSchema": { - "targetType": "Technician", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.EMPLOYEE.ThrowingOutServer" - }, - { - "legacy": "deprecated.EMPLOYEE.Technician.RepairDevice", - "patchTarget": "Il2Cpp.Technician::void RepairDevice()", - "strategy": "Postfix", - "description": "Interop target Technician.RepairDevice", - "payloadSchema": { - "targetType": "Technician", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.EMPLOYEE.DeviceRepaired" - }, - { - "legacy": "deprecated.EMPLOYEE.Technician.RotateTowardsGoal", - "patchTarget": "Il2Cpp.Technician::void RotateTowardsGoal(Vector3 goal)", - "strategy": "Postfix", - "description": "Interop target Technician.RotateTowardsGoal", - "payloadSchema": { - "targetType": "Technician", - "isStatic": false, - "goal": "Vector3" - }, - "hookSubject": null, - "name": "greg.EMPLOYEE.RotateTowardsGoal" - }, - { - "legacy": "deprecated.EMPLOYEE.Technician.SetHandIKWeight", - "patchTarget": "Il2Cpp.Technician::IEnumerator SetHandIKWeight(float targetWeight, float duration = 0.1f)", - "strategy": "Postfix", - "description": "Interop target Technician.SetHandIKWeight", - "payloadSchema": { - "targetType": "Technician", - "isStatic": false, - "targetWeight": "float", - "duration": "float" - }, - "hookSubject": null, - "name": "greg.EMPLOYEE.HandIKWeightSet" - }, - { - "legacy": "deprecated.EMPLOYEE.Technician.PositionHandTargetsOnDevice", - "patchTarget": "Il2Cpp.Technician::void PositionHandTargetsOnDevice(GameObject device)", - "strategy": "Postfix", - "description": "Interop target Technician.PositionHandTargetsOnDevice", - "payloadSchema": { - "targetType": "Technician", - "isStatic": false, - "device": "GameObject" - }, - "hookSubject": null, - "name": "greg.EMPLOYEE.PositionHandTargetsOnDevice" - }, - { - "legacy": "deprecated.EMPLOYEE.Technician.OnLoadingStarted", - "patchTarget": "Il2Cpp.Technician::void OnLoadingStarted()", - "strategy": "Postfix", - "description": "Interop target Technician.OnLoadingStarted", - "payloadSchema": { - "targetType": "Technician", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.EMPLOYEE.OnLoadingStarted" - }, - { - "legacy": "deprecated.EMPLOYEE.Technician.OnDestroy", - "patchTarget": "Il2Cpp.Technician::void OnDestroy()", - "strategy": "Postfix", - "description": "Interop target Technician.OnDestroy", - "payloadSchema": { - "targetType": "Technician", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.EMPLOYEE.OnDestroy" - }, - { - "legacy": "deprecated.EMPLOYEE.TechnicianManager.Awake", - "patchTarget": "Il2Cpp.TechnicianManager::void Awake()", - "strategy": "Postfix", - "description": "Interop target TechnicianManager.Awake", - "payloadSchema": { - "targetType": "TechnicianManager", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "TechnicianManager", - "name": "greg.EMPLOYEE.ComponentInitialized.TechnicianManager" - }, - { - "legacy": "deprecated.EMPLOYEE.TechnicianManager.AddTechnician", - "patchTarget": "Il2Cpp.TechnicianManager::void AddTechnician(Technician technician)", - "strategy": "Postfix", - "description": "Interop target TechnicianManager.AddTechnician", - "payloadSchema": { - "targetType": "TechnicianManager", - "isStatic": false, - "technician": "Technician" - }, - "hookSubject": null, - "name": "greg.EMPLOYEE.TechnicianAdded" - }, - { - "legacy": "deprecated.EMPLOYEE.TechnicianManager.SendTechnician", - "patchTarget": "Il2Cpp.TechnicianManager::void SendTechnician(NetworkSwitch networkSwitch, Server server)", - "strategy": "Postfix", - "description": "Interop target TechnicianManager.SendTechnician", - "payloadSchema": { - "targetType": "TechnicianManager", - "isStatic": false, - "networkSwitch": "NetworkSwitch", - "server": "Server" - }, - "hookSubject": null, - "name": "greg.EMPLOYEE.TechnicianDispatched" - }, - { - "legacy": "deprecated.EMPLOYEE.TechnicianManager.RequestNextJob", - "patchTarget": "Il2Cpp.TechnicianManager::void RequestNextJob(Technician technician)", - "strategy": "Postfix", - "description": "Interop target TechnicianManager.RequestNextJob", - "payloadSchema": { - "targetType": "TechnicianManager", - "isStatic": false, - "technician": "Technician" - }, - "hookSubject": null, - "name": "greg.EMPLOYEE.RequestNextJob" - }, - { - "legacy": "deprecated.EMPLOYEE.TechnicianManager.EnqueueDispatch", - "patchTarget": "Il2Cpp.TechnicianManager::void EnqueueDispatch(TechnicianManager.RepairJob job)", - "strategy": "Postfix", - "description": "Interop target TechnicianManager.EnqueueDispatch", - "payloadSchema": { - "targetType": "TechnicianManager", - "isStatic": false, - "job": "TechnicianManager.RepairJob" - }, - "hookSubject": null, - "name": "greg.EMPLOYEE.DispatchJobQueued" - }, - { - "legacy": "deprecated.EMPLOYEE.TechnicianManager.ProcessDispatchQueue", - "patchTarget": "Il2Cpp.TechnicianManager::IEnumerator ProcessDispatchQueue()", - "strategy": "Postfix", - "description": "Interop target TechnicianManager.ProcessDispatchQueue", - "payloadSchema": { - "targetType": "TechnicianManager", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.EMPLOYEE.ProcessDispatchQueue" - }, - { - "legacy": "deprecated.EMPLOYEE.TechnicianManager.IsDeviceAlreadyAssigned", - "patchTarget": "Il2Cpp.TechnicianManager::bool IsDeviceAlreadyAssigned(NetworkSwitch networkSwitch, Server server)", - "strategy": "Postfix", - "description": "Interop target TechnicianManager.IsDeviceAlreadyAssigned", - "payloadSchema": { - "targetType": "TechnicianManager", - "isStatic": false, - "networkSwitch": "NetworkSwitch", - "server": "Server" - }, - "hookSubject": null, - "name": "greg.EMPLOYEE.IsDeviceAlreadyAssigned" - }, - { - "legacy": "deprecated.EMPLOYEE.TechnicianManager.RestoreJobQueue", - "patchTarget": "Il2Cpp.TechnicianManager::void RestoreJobQueue(List savedJobs)", - "strategy": "Postfix", - "description": "Interop target TechnicianManager.RestoreJobQueue", - "payloadSchema": { - "targetType": "TechnicianManager", - "isStatic": false, - "savedJobs": "List" - }, - "hookSubject": null, - "name": "greg.EMPLOYEE.RestoreJobQueue" - }, - { - "legacy": "deprecated.EMPLOYEE.TechnicianManager.FireTechnician", - "patchTarget": "Il2Cpp.TechnicianManager::void FireTechnician(int technicianID)", - "strategy": "Postfix", - "description": "Interop target TechnicianManager.FireTechnician", - "payloadSchema": { - "targetType": "TechnicianManager", - "isStatic": false, - "technicianID": "int" - }, - "hookSubject": null, - "name": "greg.EMPLOYEE.TechnicianFired" - }, - { - "legacy": "deprecated.SYSTEM.TerrainDetector.ConvertToSplatMapCoordinate", - "patchTarget": "Il2Cpp.TerrainDetector::Vector3 ConvertToSplatMapCoordinate(Vector3 worldPosition)", - "strategy": "Postfix", - "description": "Interop target TerrainDetector.ConvertToSplatMapCoordinate", - "payloadSchema": { - "targetType": "TerrainDetector", - "isStatic": false, - "worldPosition": "Vector3" - }, - "hookSubject": null, - "name": "greg.SYSTEM.ConvertToSplatMapCoordinate" - }, - { - "legacy": "deprecated.SYSTEM.TerrainDetector.SetCurrentTerrain", - "patchTarget": "Il2Cpp.TerrainDetector::void SetCurrentTerrain(Terrain _terrain)", - "strategy": "Postfix", - "description": "Interop target TerrainDetector.SetCurrentTerrain", - "payloadSchema": { - "targetType": "TerrainDetector", - "isStatic": false, - "_terrain": "Terrain" - }, - "hookSubject": null, - "name": "greg.SYSTEM.CurrentTerrainSet" - }, - { - "legacy": "deprecated.SYSTEM.TimeController.Awake", - "patchTarget": "Il2Cpp.TimeController::void Awake()", - "strategy": "Postfix", - "description": "Interop target TimeController.Awake", - "payloadSchema": { - "targetType": "TimeController", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "TimeController_a900ecb78b", - "name": "greg.SYSTEM.ComponentInitialized.TimeController_a900ecb78b" - }, - { - "legacy": "deprecated.SYSTEM.TimeController.Start", - "patchTarget": "Il2Cpp.TimeController::void Start()", - "strategy": "Postfix", - "description": "Interop target TimeController.Start", - "payloadSchema": { - "targetType": "TimeController", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "TimeController_958a749cd9", - "name": "greg.SYSTEM.ComponentInitialized.TimeController_958a749cd9" - }, - { - "legacy": "deprecated.SYSTEM.TimeController.TimeIsBetween", - "patchTarget": "Il2Cpp.TimeController::bool TimeIsBetween(float startHour, float endHour)", - "strategy": "Postfix", - "description": "Interop target TimeController.TimeIsBetween", - "payloadSchema": { - "targetType": "TimeController", - "isStatic": false, - "startHour": "float", - "endHour": "float" - }, - "hookSubject": null, - "name": "greg.SYSTEM.TimeIsBetween" - }, - { - "legacy": "deprecated.SYSTEM.TimeController.CurrentTimeInHours", - "patchTarget": "Il2Cpp.TimeController::float CurrentTimeInHours()", - "strategy": "Postfix", - "description": "Interop target TimeController.CurrentTimeInHours", - "payloadSchema": { - "targetType": "TimeController", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.CurrentTimeInHours" - }, - { - "legacy": "deprecated.SYSTEM.TimeController.HoursFromDate", - "patchTarget": "Il2Cpp.TimeController::int HoursFromDate(float _time, int _day)", - "strategy": "Postfix", - "description": "Interop target TimeController.HoursFromDate", - "payloadSchema": { - "targetType": "TimeController", - "isStatic": false, - "_time": "float", - "_day": "int" - }, - "hookSubject": null, - "name": "greg.SYSTEM.HoursFromDate" - }, - { - "legacy": "deprecated.SYSTEM.TimeController.OnDisable", - "patchTarget": "Il2Cpp.TimeController::void OnDisable()", - "strategy": "Postfix", - "description": "Interop target TimeController.OnDisable", - "payloadSchema": { - "targetType": "TimeController", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "TimeController", - "name": "greg.SYSTEM.ComponentDisabled.TimeController" - }, - { - "legacy": "deprecated.SYSTEM.Tooltip.ShowTooltipOverlayCanvas", - "patchTarget": "Il2Cpp.Tooltip::void ShowTooltipOverlayCanvas(string tooltipText, Vector3 _position, int differentXOffset = 0)", - "strategy": "Postfix", - "description": "Interop target Tooltip.ShowTooltipOverlayCanvas", - "payloadSchema": { - "targetType": "Tooltip", - "isStatic": false, - "tooltipText": "string", - "_position": "Vector3", - "differentXOffset": "int" - }, - "hookSubject": null, - "name": "greg.SYSTEM.ShowTooltipOverlayCanvas" - }, - { - "legacy": "deprecated.SYSTEM.Tooltip.ShowTooltipWorldCanvas", - "patchTarget": "Il2Cpp.Tooltip::void ShowTooltipWorldCanvas(string _text, RectTransform _transform, Camera cam)", - "strategy": "Postfix", - "description": "Interop target Tooltip.ShowTooltipWorldCanvas", - "payloadSchema": { - "targetType": "Tooltip", - "isStatic": false, - "_text": "string", - "_transform": "RectTransform", - "cam": "Camera" - }, - "hookSubject": null, - "name": "greg.SYSTEM.ShowTooltipWorldCanvas" - }, - { - "legacy": "deprecated.SYSTEM.Tooltip.HideTooltip", - "patchTarget": "Il2Cpp.Tooltip::void HideTooltip()", - "strategy": "Postfix", - "description": "Interop target Tooltip.HideTooltip", - "payloadSchema": { - "targetType": "Tooltip", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.HideTooltip" - }, - { - "legacy": "deprecated.SYSTEM.ToolTipInteract.ShowTooltipForInteract", - "patchTarget": "Il2Cpp.ToolTipInteract::void ShowTooltipForInteract(string _text, Sprite _sprite = null)", - "strategy": "Postfix", - "description": "Interop target ToolTipInteract.ShowTooltipForInteract", - "payloadSchema": { - "targetType": "ToolTipInteract", - "isStatic": false, - "_text": "string", - "_sprite": "Sprite" - }, - "hookSubject": null, - "name": "greg.SYSTEM.ShowTooltipForInteract" - }, - { - "legacy": "deprecated.SYSTEM.ToolTipInteract.HideTooltipForInteract", - "patchTarget": "Il2Cpp.ToolTipInteract::void HideTooltipForInteract()", - "strategy": "Postfix", - "description": "Interop target ToolTipInteract.HideTooltipForInteract", - "payloadSchema": { - "targetType": "ToolTipInteract", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.HideTooltipForInteract" - }, - { - "legacy": "deprecated.SYSTEM.ToolTipOnUIText.OnPointerEnter", - "patchTarget": "Il2Cpp.ToolTipOnUIText::virtual void OnPointerEnter(PointerEventData eventData)", - "strategy": "Postfix", - "description": "Interop target ToolTipOnUIText.OnPointerEnter", - "payloadSchema": { - "targetType": "ToolTipOnUIText", - "isStatic": false, - "eventData": "PointerEventData" - }, - "hookSubject": null, - "name": "greg.SYSTEM.OnPointerEnter" - }, - { - "legacy": "deprecated.SYSTEM.ToolTipOnUIText.OnPointerExit", - "patchTarget": "Il2Cpp.ToolTipOnUIText::virtual void OnPointerExit(PointerEventData eventData)", - "strategy": "Postfix", - "description": "Interop target ToolTipOnUIText.OnPointerExit", - "payloadSchema": { - "targetType": "ToolTipOnUIText", - "isStatic": false, - "eventData": "PointerEventData" - }, - "hookSubject": null, - "name": "greg.SYSTEM.OnPointerExit" - }, - { - "legacy": "deprecated.SYSTEM.ToolTipOnUIText.OnDisable", - "patchTarget": "Il2Cpp.ToolTipOnUIText::void OnDisable()", - "strategy": "Postfix", - "description": "Interop target ToolTipOnUIText.OnDisable", - "payloadSchema": { - "targetType": "ToolTipOnUIText", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "ToolTipOnUIText", - "name": "greg.SYSTEM.ComponentDisabled.ToolTipOnUIText" - }, - { - "legacy": "deprecated.SYSTEM.ToolTipOnUIText.OnDestroy", - "patchTarget": "Il2Cpp.ToolTipOnUIText::void OnDestroy()", - "strategy": "Postfix", - "description": "Interop target ToolTipOnUIText.OnDestroy", - "payloadSchema": { - "targetType": "ToolTipOnUIText", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "ToolTipOnUIText", - "name": "greg.SYSTEM.OnDestroy.ToolTipOnUIText" - }, - { - "legacy": "deprecated.SYSTEM.ToolTipOnUIText.OnSelect", - "patchTarget": "Il2Cpp.ToolTipOnUIText::void OnSelect()", - "strategy": "Postfix", - "description": "Interop target ToolTipOnUIText.OnSelect", - "payloadSchema": { - "targetType": "ToolTipOnUIText", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.OnSelect" - }, - { - "legacy": "deprecated.SYSTEM.ToolTipOnUIText.OnDeselect", - "patchTarget": "Il2Cpp.ToolTipOnUIText::void OnDeselect()", - "strategy": "Postfix", - "description": "Interop target ToolTipOnUIText.OnDeselect", - "payloadSchema": { - "targetType": "ToolTipOnUIText", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.OnDeselect" - }, - { - "legacy": "deprecated.SYSTEM.ToolTipOnUIText.ToolTip", - "patchTarget": "Il2Cpp.ToolTipOnUIText::void ToolTip()", - "strategy": "Postfix", - "description": "Interop target ToolTipOnUIText.ToolTip", - "payloadSchema": { - "targetType": "ToolTipOnUIText", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ToolTip" - }, - { - "legacy": "deprecated.SYSTEM.TrolleyLoadingBay.Awake", - "patchTarget": "Il2Cpp.TrolleyLoadingBay::override void Awake()", - "strategy": "Postfix", - "description": "Interop target TrolleyLoadingBay.Awake", - "payloadSchema": { - "targetType": "TrolleyLoadingBay", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "TrolleyLoadingBay_d27ee1dbee", - "name": "greg.SYSTEM.ComponentInitialized.TrolleyLoadingBay_d27ee1dbee" - }, - { - "legacy": "deprecated.SYSTEM.TrolleyLoadingBay.Start", - "patchTarget": "Il2Cpp.TrolleyLoadingBay::void Start()", - "strategy": "Postfix", - "description": "Interop target TrolleyLoadingBay.Start", - "payloadSchema": { - "targetType": "TrolleyLoadingBay", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "TrolleyLoadingBay_5e26ab824b", - "name": "greg.SYSTEM.ComponentInitialized.TrolleyLoadingBay_5e26ab824b" - }, - { - "legacy": "deprecated.SYSTEM.TrolleyLoadingBay.InteractOnClick", - "patchTarget": "Il2Cpp.TrolleyLoadingBay::override void InteractOnClick()", - "strategy": "Postfix", - "description": "Interop target TrolleyLoadingBay.InteractOnClick", - "payloadSchema": { - "targetType": "TrolleyLoadingBay", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "TrolleyLoadingBay", - "name": "greg.SYSTEM.InteractOnClick.TrolleyLoadingBay" - }, - { - "legacy": "deprecated.SYSTEM.TrolleyLoadingBay.ParentTheObjectWithDelay", - "patchTarget": "Il2Cpp.TrolleyLoadingBay::IEnumerator ParentTheObjectWithDelay(UsableObject uo)", - "strategy": "Postfix", - "description": "Interop target TrolleyLoadingBay.ParentTheObjectWithDelay", - "payloadSchema": { - "targetType": "TrolleyLoadingBay", - "isStatic": false, - "uo": "UsableObject" - }, - "hookSubject": null, - "name": "greg.SYSTEM.ParentTheObjectWithDelay" - }, - { - "legacy": "deprecated.SYSTEM.TrolleyLoadingBay.FreeTrolleySlot", - "patchTarget": "Il2Cpp.TrolleyLoadingBay::void FreeTrolleySlot(int startIdx, int sizeInU)", - "strategy": "Postfix", - "description": "Interop target TrolleyLoadingBay.FreeTrolleySlot", - "payloadSchema": { - "targetType": "TrolleyLoadingBay", - "isStatic": false, - "startIdx": "int", - "sizeInU": "int" - }, - "hookSubject": null, - "name": "greg.SYSTEM.FreeTrolleySlot" - }, - { - "legacy": "deprecated.SYSTEM.TrolleyLoadingBay.InteractOnHover", - "patchTarget": "Il2Cpp.TrolleyLoadingBay::override void InteractOnHover(RaycastHit hit)", - "strategy": "Postfix", - "description": "Interop target TrolleyLoadingBay.InteractOnHover", - "payloadSchema": { - "targetType": "TrolleyLoadingBay", - "isStatic": false, - "hit": "RaycastHit", - "hookSubject": "string" - }, - "hookSubject": "TrolleyLoadingBay_RaycastHithit", - "name": "greg.SYSTEM.InteractOnHover.TrolleyLoadingBay_RaycastHithit" - }, - { - "legacy": "deprecated.SYSTEM.TrolleyLoadingBay.OnHoverOver", - "patchTarget": "Il2Cpp.TrolleyLoadingBay::override void OnHoverOver()", - "strategy": "Postfix", - "description": "Interop target TrolleyLoadingBay.OnHoverOver", - "payloadSchema": { - "targetType": "TrolleyLoadingBay", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "TrolleyLoadingBay", - "name": "greg.SYSTEM.OnHoverOver.TrolleyLoadingBay" - }, - { - "legacy": "deprecated.SYSTEM.TrolleyTrigger.OnTriggerEnter", - "patchTarget": "Il2Cpp.TrolleyTrigger::void OnTriggerEnter(Collider other)", - "strategy": "Postfix", - "description": "Interop target TrolleyTrigger.OnTriggerEnter", - "payloadSchema": { - "targetType": "TrolleyTrigger", - "isStatic": false, - "other": "Collider" - }, - "hookSubject": null, - "name": "greg.SYSTEM.OnTriggerEnter" - }, - { - "legacy": "deprecated.SYSTEM.TrolleyTrigger.ObjectAdded", - "patchTarget": "Il2Cpp.TrolleyTrigger::IEnumerator ObjectAdded(Collider other, UsableObject uo)", - "strategy": "Postfix", - "description": "Interop target TrolleyTrigger.ObjectAdded", - "payloadSchema": { - "targetType": "TrolleyTrigger", - "isStatic": false, - "other": "Collider", - "uo": "UsableObject" - }, - "hookSubject": null, - "name": "greg.SYSTEM.ObjectAdded" - }, - { - "legacy": "deprecated.UI.Tutorials.Awake", - "patchTarget": "Il2Cpp.Tutorials::void Awake()", - "strategy": "Postfix", - "description": "Interop target Tutorials.Awake", - "payloadSchema": { - "targetType": "Tutorials", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "Tutorials_7b4d6b441e", - "name": "greg.UI.ComponentInitialized.Tutorials_7b4d6b441e" - }, - { - "legacy": "deprecated.UI.Tutorials.Start", - "patchTarget": "Il2Cpp.Tutorials::void Start()", - "strategy": "Postfix", - "description": "Interop target Tutorials.Start", - "payloadSchema": { - "targetType": "Tutorials", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "Tutorials_c19d6f3a49", - "name": "greg.UI.ComponentInitialized.Tutorials_c19d6f3a49" - }, - { - "legacy": "deprecated.UI.Tutorials.OnDestroy", - "patchTarget": "Il2Cpp.Tutorials::void OnDestroy()", - "strategy": "Postfix", - "description": "Interop target Tutorials.OnDestroy", - "payloadSchema": { - "targetType": "Tutorials", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.UI.OnDestroy" - }, - { - "legacy": "deprecated.UI.Tutorials.ShowTutorial", - "patchTarget": "Il2Cpp.Tutorials::void ShowTutorial(int i)", - "strategy": "Postfix", - "description": "Interop target Tutorials.ShowTutorial", - "payloadSchema": { - "targetType": "Tutorials", - "isStatic": false, - "i": "int" - }, - "hookSubject": null, - "name": "greg.UI.ShowTutorial" - }, - { - "legacy": "deprecated.UI.Tutorials.PlayVideo", - "patchTarget": "Il2Cpp.Tutorials::void PlayVideo(int _tutorialIndex, bool isInPauseMenu = false)", - "strategy": "Postfix", - "description": "Interop target Tutorials.PlayVideo", - "payloadSchema": { - "targetType": "Tutorials", - "isStatic": false, - "_tutorialIndex": "int", - "isInPauseMenu": "bool" - }, - "hookSubject": null, - "name": "greg.UI.PlayVideo" - }, - { - "legacy": "deprecated.UI.Tutorials.ButtonShowTutorialInPauseMenu", - "patchTarget": "Il2Cpp.Tutorials::void ButtonShowTutorialInPauseMenu(int i)", - "strategy": "Postfix", - "description": "Interop target Tutorials.ButtonShowTutorialInPauseMenu", - "payloadSchema": { - "targetType": "Tutorials", - "isStatic": false, - "i": "int" - }, - "hookSubject": null, - "name": "greg.UI.ButtonShowTutorialInPauseMenu" - }, - { - "legacy": "deprecated.UI.Tutorials.StopVideoInPauseMenu", - "patchTarget": "Il2Cpp.Tutorials::void StopVideoInPauseMenu()", - "strategy": "Postfix", - "description": "Interop target Tutorials.StopVideoInPauseMenu", - "payloadSchema": { - "targetType": "Tutorials", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.UI.StopVideoInPauseMenu" - }, - { - "legacy": "deprecated.UI.Tutorials.OnVideoPrepared", - "patchTarget": "Il2Cpp.Tutorials::void OnVideoPrepared(VideoPlayer vp)", - "strategy": "Postfix", - "description": "Interop target Tutorials.OnVideoPrepared", - "payloadSchema": { - "targetType": "Tutorials", - "isStatic": false, - "vp": "VideoPlayer" - }, - "hookSubject": null, - "name": "greg.UI.OnVideoPrepared" - }, - { - "legacy": "deprecated.UI.Tutorials.StopTutorial", - "patchTarget": "Il2Cpp.Tutorials::void StopTutorial()", - "strategy": "Postfix", - "description": "Interop target Tutorials.StopTutorial", - "payloadSchema": { - "targetType": "Tutorials", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.UI.StopTutorial" - }, - { - "legacy": "deprecated.UI.Tutorials.ButtonOK", - "patchTarget": "Il2Cpp.Tutorials::void ButtonOK()", - "strategy": "Postfix", - "description": "Interop target Tutorials.ButtonOK", - "payloadSchema": { - "targetType": "Tutorials", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.UI.ButtonOK" - }, - { - "legacy": "deprecated.UI.Tutorials.SkipTutorials", - "patchTarget": "Il2Cpp.Tutorials::void SkipTutorials()", - "strategy": "Postfix", - "description": "Interop target Tutorials.SkipTutorials", - "payloadSchema": { - "targetType": "Tutorials", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.UI.SkipTutorials" - }, - { - "legacy": "deprecated.UI.UI_Section.OpenCloseSection", - "patchTarget": "Il2Cpp.UI_Section::void OpenCloseSection()", - "strategy": "Postfix", - "description": "Interop target UI_Section.OpenCloseSection", - "payloadSchema": { - "targetType": "UI_Section", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.UI.OpenCloseSection" - }, - { - "legacy": "deprecated.UI.UI_SelectedBorder.Awake", - "patchTarget": "Il2Cpp.UI_SelectedBorder::void Awake()", - "strategy": "Postfix", - "description": "Interop target UI_SelectedBorder.Awake", - "payloadSchema": { - "targetType": "UI_SelectedBorder", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "UI_SelectedBorder", - "name": "greg.UI.ComponentInitialized.UI_SelectedBorder" - }, - { - "legacy": "deprecated.UI.UI_SelectedBorder.OnDisable", - "patchTarget": "Il2Cpp.UI_SelectedBorder::void OnDisable()", - "strategy": "Postfix", - "description": "Interop target UI_SelectedBorder.OnDisable", - "payloadSchema": { - "targetType": "UI_SelectedBorder", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.UI.ComponentDisabled" - }, - { - "legacy": "deprecated.SYSTEM.UsableObject.Awake", - "patchTarget": "Il2Cpp.UsableObject::override void Awake()", - "strategy": "Postfix", - "description": "Interop target UsableObject.Awake", - "payloadSchema": { - "targetType": "UsableObject", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "UsableObject", - "name": "greg.SYSTEM.ComponentInitialized.UsableObject" - }, - { - "legacy": "deprecated.SYSTEM.UsableObject.InteractOnClick", - "patchTarget": "Il2Cpp.UsableObject::override void InteractOnClick()", - "strategy": "Postfix", - "description": "Interop target UsableObject.InteractOnClick", - "payloadSchema": { - "targetType": "UsableObject", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "UsableObject", - "name": "greg.SYSTEM.InteractOnClick.UsableObject" - }, - { - "legacy": "deprecated.SYSTEM.UsableObject.DropObject", - "patchTarget": "Il2Cpp.UsableObject::virtual void DropObject()", - "strategy": "Postfix", - "description": "Interop target UsableObject.DropObject", - "payloadSchema": { - "targetType": "UsableObject", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.DroppedObject" - }, - { - "legacy": "deprecated.SYSTEM.UsableObject.ActionInHand", - "patchTarget": "Il2Cpp.UsableObject::virtual void ActionInHand()", - "strategy": "Postfix", - "description": "Interop target UsableObject.ActionInHand", - "payloadSchema": { - "targetType": "UsableObject", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ActionInHand" - }, - { - "legacy": "deprecated.SYSTEM.UsableObject.MakeInteractableAgain", - "patchTarget": "Il2Cpp.UsableObject::IEnumerator MakeInteractableAgain()", - "strategy": "Postfix", - "description": "Interop target UsableObject.MakeInteractableAgain", - "payloadSchema": { - "targetType": "UsableObject", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.MakeInteractableAgain" - }, - { - "legacy": "deprecated.SYSTEM.UsableObject.MoveBetweenPositions", - "patchTarget": "Il2Cpp.UsableObject::void MoveBetweenPositions(Vector3 _position, Vector3 _rotation)", - "strategy": "Postfix", - "description": "Interop target UsableObject.MoveBetweenPositions", - "payloadSchema": { - "targetType": "UsableObject", - "isStatic": false, - "_position": "Vector3", - "_rotation": "Vector3" - }, - "hookSubject": null, - "name": "greg.SYSTEM.MoveBetweenPositions" - }, - { - "legacy": "deprecated.SYSTEM.UsableObject.MoveToHand", - "patchTarget": "Il2Cpp.UsableObject::virtual void MoveToHand()", - "strategy": "Postfix", - "description": "Interop target UsableObject.MoveToHand", - "payloadSchema": { - "targetType": "UsableObject", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.MoveToHand" - }, - { - "legacy": "deprecated.SYSTEM.UsableObject.DisalowDrop", - "patchTarget": "Il2Cpp.UsableObject::IEnumerator DisalowDrop()", - "strategy": "Postfix", - "description": "Interop target UsableObject.DisalowDrop", - "payloadSchema": { - "targetType": "UsableObject", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.DisalowDrop" - }, - { - "legacy": "deprecated.SYSTEM.UsableObject.InteractOnHover", - "patchTarget": "Il2Cpp.UsableObject::override void InteractOnHover(RaycastHit hit)", - "strategy": "Postfix", - "description": "Interop target UsableObject.InteractOnHover", - "payloadSchema": { - "targetType": "UsableObject", - "isStatic": false, - "hit": "RaycastHit", - "hookSubject": "string" - }, - "hookSubject": "UsableObject_RaycastHithit", - "name": "greg.SYSTEM.InteractOnHover.UsableObject_RaycastHithit" - }, - { - "legacy": "deprecated.SYSTEM.UsableObject.OnHoverOver", - "patchTarget": "Il2Cpp.UsableObject::override void OnHoverOver()", - "strategy": "Postfix", - "description": "Interop target UsableObject.OnHoverOver", - "payloadSchema": { - "targetType": "UsableObject", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "UsableObject", - "name": "greg.SYSTEM.OnHoverOver.UsableObject" - }, - { - "legacy": "deprecated.SYSTEM.UsableObject.CheckIfLost", - "patchTarget": "Il2Cpp.UsableObject::IEnumerator CheckIfLost()", - "strategy": "Prefix+Postfix", - "description": "Interop target UsableObject.CheckIfLost", - "payloadSchema": { - "targetType": "UsableObject", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.CheckIfLost" - }, - { - "legacy": "deprecated.SYSTEM.UsableObject.OnDestroy", - "patchTarget": "Il2Cpp.UsableObject::virtual void OnDestroy()", - "strategy": "Postfix", - "description": "Interop target UsableObject.OnDestroy", - "payloadSchema": { - "targetType": "UsableObject", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "UsableObject", - "name": "greg.SYSTEM.OnDestroy.UsableObject" - }, - { - "legacy": "deprecated.SYSTEM.UsableObject.OnLoadDestroy", - "patchTarget": "Il2Cpp.UsableObject::void OnLoadDestroy()", - "strategy": "Postfix", - "description": "Interop target UsableObject.OnLoadDestroy", - "payloadSchema": { - "targetType": "UsableObject", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.OnLoadDestroy" - }, - { - "legacy": "deprecated.SYSTEM.UsableObject.MoveToStorage", - "patchTarget": "Il2Cpp.UsableObject::virtual void MoveToStorage(Transform _pos, int _positionIndex, int _storageUid)", - "strategy": "Postfix", - "description": "Interop target UsableObject.MoveToStorage", - "payloadSchema": { - "targetType": "UsableObject", - "isStatic": false, - "_pos": "Transform", - "_positionIndex": "int", - "_storageUid": "int" - }, - "hookSubject": null, - "name": "greg.SYSTEM.MoveToStorage" - }, - { - "legacy": "deprecated.SYSTEM.UsableObject.OnCollisionEnter", - "patchTarget": "Il2Cpp.UsableObject::void OnCollisionEnter(Collision collision)", - "strategy": "Postfix", - "description": "Interop target UsableObject.OnCollisionEnter", - "payloadSchema": { - "targetType": "UsableObject", - "isStatic": false, - "collision": "Collision" - }, - "hookSubject": null, - "name": "greg.SYSTEM.OnCollisionEnter" - }, - { - "legacy": "deprecated.SYSTEM.UserReport.Start", - "patchTarget": "Il2Cpp.UserReport::void Start()", - "strategy": "Postfix", - "description": "Interop target UserReport.Start", - "payloadSchema": { - "targetType": "UserReport", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "UserReport", - "name": "greg.SYSTEM.ComponentInitialized.UserReport" - }, - { - "legacy": "deprecated.SYSTEM.UserReport.CreateUserReport", - "patchTarget": "Il2Cpp.UserReport::void CreateUserReport()", - "strategy": "Postfix", - "description": "Interop target UserReport.CreateUserReport", - "payloadSchema": { - "targetType": "UserReport", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.CreateUserReport" - }, - { - "legacy": "deprecated.SYSTEM.UserReport.SubmitUserReport", - "patchTarget": "Il2Cpp.UserReport::void SubmitUserReport()", - "strategy": "Postfix", - "description": "Interop target UserReport.SubmitUserReport", - "payloadSchema": { - "targetType": "UserReport", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.SubmitUserReport" - }, - { - "legacy": "deprecated.SYSTEM.UserReport.ClearReport", - "patchTarget": "Il2Cpp.UserReport::void ClearReport()", - "strategy": "Postfix", - "description": "Interop target UserReport.ClearReport", - "payloadSchema": { - "targetType": "UserReport", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ClearReport" - }, - { - "legacy": "deprecated.SYSTEM.UserReport.SetThumbnail", - "patchTarget": "Il2Cpp.UserReport::void SetThumbnail(Texture2D thumbnail)", - "strategy": "Postfix", - "description": "Interop target UserReport.SetThumbnail", - "payloadSchema": { - "targetType": "UserReport", - "isStatic": false, - "thumbnail": "Texture2D" - }, - "hookSubject": null, - "name": "greg.SYSTEM.ThumbnailSet" - }, - { - "legacy": "deprecated.SYSTEM.UserReport.ShowError", - "patchTarget": "Il2Cpp.UserReport::IEnumerator ShowError()", - "strategy": "Postfix", - "description": "Interop target UserReport.ShowError", - "payloadSchema": { - "targetType": "UserReport", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ShowError" - }, - { - "legacy": "deprecated.SYSTEM.UserReport.ClearForm", - "patchTarget": "Il2Cpp.UserReport::void ClearForm()", - "strategy": "Postfix", - "description": "Interop target UserReport.ClearForm", - "payloadSchema": { - "targetType": "UserReport", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.ClearForm" - }, - { - "legacy": "deprecated.SYSTEM.Vector3SerializationSurrogate.SetObjectData", - "patchTarget": "Il2Cpp.Vector3SerializationSurrogate::virtual Object SetObjectData(Object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector)", - "strategy": "Postfix", - "description": "Interop target Vector3SerializationSurrogate.SetObjectData", - "payloadSchema": { - "targetType": "Vector3SerializationSurrogate", - "isStatic": false, - "obj": "Object", - "info": "SerializationInfo", - "context": "StreamingContext", - "selector": "ISurrogateSelector", - "hookSubject": "string" - }, - "hookSubject": "Vector3SerializationSurrogate_ObjectobjSerializationInfoinfoStreamingC", - "name": "greg.SYSTEM.ObjectDataSet.Vector3SerializationSurrogate_ObjectobjSerializationInfoinfoStreamingC" - }, - { - "legacy": "deprecated.SYSTEM.Wall.Awake", - "patchTarget": "Il2Cpp.Wall::override void Awake()", - "strategy": "Postfix", - "description": "Interop target Wall.Awake", - "payloadSchema": { - "targetType": "Wall", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "Wall", - "name": "greg.SYSTEM.ComponentInitialized.Wall" - }, - { - "legacy": "deprecated.SYSTEM.Wall.InteractOnClick", - "patchTarget": "Il2Cpp.Wall::override void InteractOnClick()", - "strategy": "Postfix", - "description": "Interop target Wall.InteractOnClick", - "payloadSchema": { - "targetType": "Wall", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "Wall", - "name": "greg.SYSTEM.InteractOnClick.Wall" - }, - { - "legacy": "deprecated.SYSTEM.Wall.OpenWall", - "patchTarget": "Il2Cpp.Wall::void OpenWall()", - "strategy": "Postfix", - "description": "Interop target Wall.OpenWall", - "payloadSchema": { - "targetType": "Wall", - "isStatic": false - }, - "hookSubject": null, - "name": "greg.SYSTEM.OpenWall" - }, - { - "legacy": "deprecated.SYSTEM.Wall.InteractOnHover", - "patchTarget": "Il2Cpp.Wall::override void InteractOnHover(RaycastHit hit)", - "strategy": "Postfix", - "description": "Interop target Wall.InteractOnHover", - "payloadSchema": { - "targetType": "Wall", - "isStatic": false, - "hit": "RaycastHit", - "hookSubject": "string" - }, - "hookSubject": "Wall_RaycastHithit", - "name": "greg.SYSTEM.InteractOnHover.Wall_RaycastHithit" - }, - { - "legacy": "deprecated.SYSTEM.Wall.OnHoverOver", - "patchTarget": "Il2Cpp.Wall::override void OnHoverOver()", - "strategy": "Postfix", - "description": "Interop target Wall.OnHoverOver", - "payloadSchema": { - "targetType": "Wall", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "Wall", - "name": "greg.SYSTEM.OnHoverOver.Wall" - }, - { - "legacy": "deprecated.SYSTEM.Wall.OnLoad", - "patchTarget": "Il2Cpp.Wall::void OnLoad()", - "strategy": "Postfix", - "description": "Interop target Wall.OnLoad", - "payloadSchema": { - "targetType": "Wall", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "Wall", - "name": "greg.SYSTEM.OnLoad.Wall" - }, - { - "legacy": "deprecated.SYSTEM.Wall.OnDestroy", - "patchTarget": "Il2Cpp.Wall::void OnDestroy()", - "strategy": "Postfix", - "description": "Interop target Wall.OnDestroy", - "payloadSchema": { - "targetType": "Wall", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "Wall", - "name": "greg.SYSTEM.OnDestroy.Wall" - }, - { - "legacy": "deprecated.SYSTEM.WorldCanvasCuller.Awake", - "patchTarget": "Il2Cpp.WorldCanvasCuller::void Awake()", - "strategy": "Postfix", - "description": "Interop target WorldCanvasCuller.Awake", - "payloadSchema": { - "targetType": "WorldCanvasCuller", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "WorldCanvasCuller", - "name": "greg.SYSTEM.ComponentInitialized.WorldCanvasCuller" - }, - { - "legacy": "deprecated.SYSTEM.WorldObjectButton.Awake", - "patchTarget": "Il2Cpp.WorldObjectButton::override void Awake()", - "strategy": "Postfix", - "description": "Interop target WorldObjectButton.Awake", - "payloadSchema": { - "targetType": "WorldObjectButton", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "WorldObjectButton", - "name": "greg.SYSTEM.ComponentInitialized.WorldObjectButton" - }, - { - "legacy": "deprecated.SYSTEM.WorldObjectButton.InteractOnClick", - "patchTarget": "Il2Cpp.WorldObjectButton::override void InteractOnClick()", - "strategy": "Postfix", - "description": "Interop target WorldObjectButton.InteractOnClick", - "payloadSchema": { - "targetType": "WorldObjectButton", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "WorldObjectButton", - "name": "greg.SYSTEM.InteractOnClick.WorldObjectButton" - }, - { - "legacy": "deprecated.SYSTEM.WorldObjectButton.InteractOnHover", - "patchTarget": "Il2Cpp.WorldObjectButton::override void InteractOnHover(RaycastHit hit)", - "strategy": "Postfix", - "description": "Interop target WorldObjectButton.InteractOnHover", - "payloadSchema": { - "targetType": "WorldObjectButton", - "isStatic": false, - "hit": "RaycastHit", - "hookSubject": "string" - }, - "hookSubject": "WorldObjectButton_RaycastHithit", - "name": "greg.SYSTEM.InteractOnHover.WorldObjectButton_RaycastHithit" - }, - { - "legacy": "deprecated.SYSTEM.WorldObjectButton.OnHoverOver", - "patchTarget": "Il2Cpp.WorldObjectButton::override void OnHoverOver()", - "strategy": "Postfix", - "description": "Interop target WorldObjectButton.OnHoverOver", - "payloadSchema": { - "targetType": "WorldObjectButton", - "isStatic": false, - "hookSubject": "string" - }, - "hookSubject": "WorldObjectButton", - "name": "greg.SYSTEM.OnHoverOver.WorldObjectButton" - } - ] -} - diff --git a/scripts/Generate-GregHooksFromIl2CppDump.ps1 b/scripts/Generate-GregHooksFromIl2CppDump.ps1 index caacaa30..eb97e301 100644 --- a/scripts/Generate-GregHooksFromIl2CppDump.ps1 +++ b/scripts/Generate-GregHooksFromIl2CppDump.ps1 @@ -3,18 +3,18 @@ $ErrorActionPreference = 'Stop' $repoRoot = Resolve-Path (Join-Path $PSScriptRoot '..\..') -$il2cppDir = Join-Path $repoRoot 'gregReferences\il2cpp-unpack\Assembly-CSharp\Il2Cpp' +$assemblyRoot = Join-Path $repoRoot 'gregReferences\Assembly-CSharp' $harmonyPatches = Join-Path $repoRoot 'gregCore\framework\ModLoader\HarmonyPatches.cs' $outJsonRoot = Join-Path $repoRoot 'greg_hooks.json' $outJsonFramework = Join-Path $repoRoot 'gregCore\framework\greg_hooks.json' $outHooksDir = Join-Path $repoRoot 'gregCore\framework\harmony' -if (-not (Test-Path $il2cppDir)) { throw "Missing Il2Cpp sources: $il2cppDir" } +if (-not (Test-Path $assemblyRoot)) { throw "Missing assembly source root: $assemblyRoot" } New-Item -ItemType Directory -Force -Path $outHooksDir | Out-Null function Get-HarmonyExclusions([string]$path) { $set = [System.Collections.Generic.HashSet[string]]::new([StringComparer]::Ordinal) - if (-not (Test-Path $path)) { return $set } + if (-not (Test-Path $path)) { return ,$set } $text = Get-Content $path -Raw foreach ($m in [regex]::Matches($text, 'typeof\((\w+)\)\s*,\s*nameof\(\w+\.(\w+)\)')) { [void]$set.Add("$($m.Groups[1].Value)|$($m.Groups[2].Value)") @@ -22,20 +22,23 @@ function Get-HarmonyExclusions([string]$path) { foreach ($m in [regex]::Matches($text, 'typeof\((\w+)\)\s*,\s*"(\w+)"')) { [void]$set.Add("$($m.Groups[1].Value)|$($m.Groups[2].Value)") } - return $set + return ,$set } $excluded = Get-HarmonyExclusions $harmonyPatches +[void]$excluded.Add('NetworkMap|RemapDeviceId') +[void]$excluded.Add('NetworkMap|RemoveIsolatedDevice') +[void]$excluded.Add('Technician|CacheDeviceBounds') -# Curated game surface for stable compile (full Il2Cpp tree needs extra Unity/asm refs). -$gameHookClasses = [System.Collections.Generic.HashSet[string]]::new([StringComparer]::Ordinal) +# Curated game surface for stable compile-time Harmony class generation. +$harmonyEmitClasses = [System.Collections.Generic.HashSet[string]]::new([StringComparer]::Ordinal) @( 'Player', 'PlayerManager', 'PlayerHit', 'PlayerData', 'Server', 'MainGameManager', 'ComputerShop', 'HRSystem', 'SaveSystem', 'CustomerBase', 'CablePositions', 'CableLink', 'Rack', 'NetworkMap', 'BalanceSheet', 'MainMenu', 'TimeController', 'TechnicianManager', 'Technician', 'Objectives', 'PacketSpawnerSystem', 'NetworkSwitch', 'SFPModule', 'SFPBox', 'PatchPanel' -) | ForEach-Object { [void]$gameHookClasses.Add($_) } +) | ForEach-Object { [void]$harmonyEmitClasses.Add($_) } function Test-SkipTypeName([string]$n) { if ($n -match 'd__\d+$') { return $true } @@ -120,6 +123,34 @@ function Test-SkipClass([string]$className, [string]$baseClause) { return $false } +function Get-SourceDirectories([string]$rootPath) { + $dirs = [System.Collections.Generic.List[string]]::new() + + $includePatterns = @('Il2Cpp*', 'Unity*', 'UnityEngine*') + foreach ($pattern in $includePatterns) { + foreach ($dir in (Get-ChildItem -Path $rootPath -Directory -Filter $pattern -ErrorAction SilentlyContinue)) { + [void]$dirs.Add($dir.FullName) + } + } + + if ($dirs.Count -eq 0) { + throw "No source directories matched under $rootPath (expected Il2Cpp*/Unity*)." + } + + return $dirs +} + +function Get-AssemblyNameFromPath([string]$filePath, [string]$rootPath) { + $relative = [System.IO.Path]::GetRelativePath($rootPath, $filePath) + if ([string]::IsNullOrWhiteSpace($relative)) { return 'Assembly-CSharp' } + + $parts = $relative -split '[\\/]' + $first = if ($parts.Length -gt 0) { $parts[0] } else { '' } + if ([string]::IsNullOrWhiteSpace($first)) { return 'Assembly-CSharp' } + + return $first +} + function Test-SkipInteropSignature([string]$returnType, [string]$argList) { $blob = "$returnType $argList" if ($blob -match 'EntityCommandBuffer|SystemState|BlobArray|ComponentLookup|BufferLookup') { return $true } @@ -185,14 +216,13 @@ function Get-Il2CppPatchSignature([string]$className, [string]$methodName, [stri function Split-MethodLine([string]$line, [ref]$isStatic) { $isStatic.Value = $false - $m = [regex]::Match($line, '^\t{2}public unsafe static (?.+?)\s*\((?[^\)]*)\)\s*$') - if ($m.Success) { $isStatic.Value = $true } - else { - $m = [regex]::Match($line, '^\t{2}public unsafe (?.+?)\s*\((?[^\)]*)\)\s*$') - } + $m = [regex]::Match($line, '^\s+(?:public|private|protected|internal)\s+(?(?:(?:static|unsafe|virtual|override|abstract|sealed|new|extern|partial)\s+)*)?(?.+?)\s*\((?[^\)]*)\)\s*$') if (-not $m.Success) { return $null } + + $mods = $m.Groups['mods'].Value + if ($mods -match '\bstatic\b') { $isStatic.Value = $true } + $sig = $m.Groups['sig'].Value.Trim() - if ($sig.StartsWith('static ')) { $sig = $sig.Substring(7).Trim() } $argList = $m.Groups['args'].Value.Trim() $idx = $sig.LastIndexOf(' ') if ($idx -lt 0) { return $null } @@ -235,22 +265,22 @@ function Build-EmitAnonymousBody([string]$className, [bool]$isStatic) { $hooks = [System.Collections.Generic.List[object]]::new() $byDomain = @{} +$scanDirectories = Get-SourceDirectories $assemblyRoot +$sourceFiles = $scanDirectories | ForEach-Object { Get-ChildItem -Path $_ -Filter '*.cs' -File -Recurse } -Get-ChildItem $il2cppDir -Filter '*.cs' -File | ForEach-Object { - $lines = Get-Content $_.FullName - $overloadFirst = [System.Collections.Generic.HashSet[string]]::new([StringComparer]::Ordinal) +foreach ($sourceFile in $sourceFiles) { + $assemblyName = Get-AssemblyNameFromPath $sourceFile.FullName $assemblyRoot + $lines = Get-Content $sourceFile.FullName + $harmonyOverloadFirst = [System.Collections.Generic.HashSet[string]]::new([StringComparer]::Ordinal) $currentClass = $null $currentBase = '' - $classRegex = [regex]'^\tpublic (sealed )?class (?[A-Za-z0-9_]+)\s*:\s*(?[^\r\n{]+)' + $classRegex = [regex]'^\s*(?:public|private|protected|internal)\s+(?:sealed\s+)?class\s+(?[A-Za-z0-9_]+)(\s*:\s*(?[^\r\n{]+))?' foreach ($line in $lines) { $cm = $classRegex.Match($line) if ($cm.Success) { $cn = $cm.Groups['name'].Value $cb = $cm.Groups['base'].Value.Trim() - if (Test-SkipTypeName $cn) { $currentClass = $null; $currentBase = ''; continue } - if (Test-SkipClass $cn $cb) { $currentClass = $null; $currentBase = ''; continue } - if (-not $gameHookClasses.Contains($cn)) { $currentClass = $null; $currentBase = ''; continue } $currentClass = $cn $currentBase = $cb continue @@ -265,18 +295,9 @@ Get-ChildItem $il2cppDir -Filter '*.cs' -File | ForEach-Object { $mn = $parsed.Name $argList = $parsed.ArgList - if (-not (Test-ShouldEmitHook $mn $ret)) { continue } - if (Test-SkipInteropSignature $ret $argList) { continue } - if ($excluded.Contains("$currentClass|$mn")) { continue } - - $ovKey = "$currentClass|$mn" - if ($overloadFirst.Contains($ovKey)) { continue } - [void]$overloadFirst.Add($ovKey) - $domain = Get-GregDomain $currentClass $action = Get-SemanticAction $currentClass $mn - $strategy = Get-HookStrategy $mn $ret - if ($strategy -eq 'None') { continue } + $strategy = 'Postfix' $hookName = "greg.$($domain.ToUpperInvariant()).$action" $patchTarget = Get-Il2CppPatchSignature $currentClass $mn $argList @@ -314,29 +335,41 @@ Get-ChildItem $il2cppDir -Filter '*.cs' -File | ForEach-Object { name = $hookName legacy = $null patchTarget = $patchTarget + assembly = $assemblyName strategy = $(if ($strategy -eq 'PrefixPostfix') { 'Prefix+Postfix' } else { 'Postfix' }) - description = "Auto-generated from Il2Cpp unpack: $currentClass.$mn" + description = "Auto-generated from IL2CPP sources: $assemblyName/$currentClass.$mn" payloadSchema = $payload }) - if (-not $byDomain.ContainsKey($domain)) { $byDomain[$domain] = [System.Collections.Generic.List[object]]::new() } - [void]$byDomain[$domain].Add([ordered]@{ - Class = $currentClass - Method = $mn - Ret = $ret - Args = $argList - Action = $action - Strategy = $strategy - HookName = $hookName - IsStatic = $staticFlag - }) + $harmonySignatureCompatible = $line -match '^\s+public unsafe(?:\s+static)?\s+' + $allowHarmonyEmit = $harmonyEmitClasses.Contains($currentClass) -and -not (Test-SkipTypeName $currentClass) -and -not (Test-SkipClass $currentClass $currentBase) -and $harmonySignatureCompatible + if ($allowHarmonyEmit -and (Test-ShouldEmitHook $mn $ret) -and -not (Test-SkipInteropSignature $ret $argList) -and -not $excluded.Contains("$currentClass|$mn")) { + $harmonyOvKey = "$currentClass|$mn" + if ($harmonyOverloadFirst.Contains($harmonyOvKey)) { continue } + [void]$harmonyOverloadFirst.Add($harmonyOvKey) + + $harmonyStrategy = Get-HookStrategy $mn $ret + if ($harmonyStrategy -eq 'None') { continue } + + if (-not $byDomain.ContainsKey($domain)) { $byDomain[$domain] = [System.Collections.Generic.List[object]]::new() } + [void]$byDomain[$domain].Add([ordered]@{ + Class = $currentClass + Method = $mn + Ret = $ret + Args = $argList + Action = $action + Strategy = $harmonyStrategy + HookName = $hookName + IsStatic = $staticFlag + }) + } } } $seen = @{} $unique = [System.Collections.Generic.List[object]]::new() foreach ($h in $hooks) { - $k = [string]$h.patchTarget + $k = "$($h.assembly)|$([string]$h.patchTarget)" if ($seen.ContainsKey($k)) { continue } $seen[$k] = $true [void]$unique.Add($h) @@ -345,7 +378,7 @@ foreach ($h in $hooks) { $doc = [ordered]@{ version = 2 description = 'Canonical greg hook registry. Schema: greg... Generated from Il2Cpp C# unpack; regenerate with gregCore/scripts/Generate-GregHooksFromIl2CppDump.ps1 when MergedCode.md / interop changes.' - generatedFrom = 'gregReferences/il2cpp-unpack/Assembly-CSharp/Il2Cpp/*.cs' + generatedFrom = 'gregReferences/Assembly-CSharp/{Il2Cpp*,Unity*,UnityEngine*}/**/*.cs' legacyPrefixes = @() hooks = $unique } @@ -370,7 +403,8 @@ foreach ($kv in $byDomain.GetEnumerator()) { $sb = [System.Text.StringBuilder]::new() [void]$sb.AppendLine('using System;') [void]$sb.AppendLine('using HarmonyLib;') - [void]$sb.AppendLine('using gregFramework.Core;') + [void]$sb.AppendLine('using greg.Core;') + [void]$sb.AppendLine('using greg.Sdk;') [void]$sb.AppendLine('using Il2Cpp;') [void]$sb.AppendLine('using Il2CppSystem.Collections.Generic;') [void]$sb.AppendLine('using Il2CppInterop.Runtime.InteropTypes.Arrays;') @@ -420,8 +454,8 @@ foreach ($kv in $byDomain.GetEnumerator()) { [void]$sb.AppendLine(' {') [void]$sb.AppendLine(' try') [void]$sb.AppendLine(' {') - [void]$sb.AppendLine(' GregEventDispatcher.Emit(') - [void]$sb.AppendLine(" GregHookName.Create(GregDomain.$gregDomain, `"$action`"),") + [void]$sb.AppendLine(' gregEventDispatcher.Emit(') + [void]$sb.AppendLine(" gregHookName.Create(GregDomain.$gregDomain, `"$action`"),") [void]$sb.AppendLine(' new') [void]$sb.AppendLine(' {') [void]$sb.AppendLine($emitBody) @@ -461,3 +495,4 @@ internal static class GregPowerHooks Write-Host "Wrote stub $powerFile" } + diff --git a/src/Core/Abstractions/IGregConfigService.cs b/src/Core/Abstractions/IGregConfigService.cs new file mode 100644 index 00000000..031c0aca --- /dev/null +++ b/src/Core/Abstractions/IGregConfigService.cs @@ -0,0 +1,13 @@ +/// +/// Schicht: Core +/// Zweck: Interface für Konfigurations-Management. +/// Maintainer: Wird für mod.json und globale Configs (Newtonsoft.Json) genutzt. +/// + +namespace gregCore.Core.Abstractions; + +public interface IGregConfigService +{ + T? LoadConfig(string filePath) where T : class; + void SaveConfig(string filePath, T config) where T : class; +} diff --git a/src/Core/Abstractions/IGregEventBus.cs b/src/Core/Abstractions/IGregEventBus.cs new file mode 100644 index 00000000..ec913a02 --- /dev/null +++ b/src/Core/Abstractions/IGregEventBus.cs @@ -0,0 +1,14 @@ +/// +/// Schicht: Core +/// Zweck: Interface für das Event-Bus System. +/// Maintainer: Zentraler Message-Broker für alle Mods und Hooks. +/// + +namespace gregCore.Core.Abstractions; + +public interface IGregEventBus +{ + void Subscribe(string hookName, Action handler); + void Unsubscribe(string hookName, Action handler); + bool Publish(string hookName, EventPayload payload); +} diff --git a/src/Core/Abstractions/IGregFfiBridge.cs b/src/Core/Abstractions/IGregFfiBridge.cs new file mode 100644 index 00000000..0f6af290 --- /dev/null +++ b/src/Core/Abstractions/IGregFfiBridge.cs @@ -0,0 +1,13 @@ +/// +/// Schicht: Core +/// Zweck: Interface für Foreign Function Interface (Win32 FFI). +/// Maintainer: Lädt und bindet native Bibliotheken (C++/Rust). +/// + +namespace gregCore.Core.Abstractions; + +public interface IGregFfiBridge +{ + void Initialize(); + void LoadNativeMod(string dllPath); +} diff --git a/src/Core/Abstractions/IGregLanguageBridge.cs b/src/Core/Abstractions/IGregLanguageBridge.cs new file mode 100644 index 00000000..9cc7b18b --- /dev/null +++ b/src/Core/Abstractions/IGregLanguageBridge.cs @@ -0,0 +1,13 @@ +/// +/// Schicht: Core +/// Zweck: Interface für Skript-Sprachen-Brücken (Lua/JS). +/// Maintainer: Ermöglicht das Hinzufügen neuer Skriptsprachen ohne Core-Änderung. +/// + +namespace gregCore.Core.Abstractions; + +public interface IGregLanguageBridge +{ + void Initialize(); + void ExecuteScript(string scriptContent); +} diff --git a/src/Core/Abstractions/IGregLogger.cs b/src/Core/Abstractions/IGregLogger.cs new file mode 100644 index 00000000..0218e4f7 --- /dev/null +++ b/src/Core/Abstractions/IGregLogger.cs @@ -0,0 +1,16 @@ +/// +/// Schicht: Core +/// Zweck: Interface für Logging. +/// Maintainer: Einziger Vertrag für Logs, entkoppelt MelonLogger vom Framework. +/// + +namespace gregCore.Core.Abstractions; + +public interface IGregLogger +{ + void Debug(string message); + void Info(string message); + void Warning(string message); + void Error(string message, Exception? ex = null); + IGregLogger ForContext(string context); +} diff --git a/src/Core/Abstractions/IGregMcpServer.cs b/src/Core/Abstractions/IGregMcpServer.cs new file mode 100644 index 00000000..b1c4a9ad --- /dev/null +++ b/src/Core/Abstractions/IGregMcpServer.cs @@ -0,0 +1,13 @@ +/// +/// Schicht: Core +/// Zweck: Interface für den MCP-Endpunkt (Model Context Protocol). +/// Maintainer: Bereitstellung von HTTP-basierten Debug/Mod-Schnittstellen. +/// + +namespace gregCore.Core.Abstractions; + +public interface IGregMcpServer +{ + void Start(int port); + void Stop(); +} diff --git a/src/Core/Abstractions/IGregPersistenceService.cs b/src/Core/Abstractions/IGregPersistenceService.cs new file mode 100644 index 00000000..f77908d2 --- /dev/null +++ b/src/Core/Abstractions/IGregPersistenceService.cs @@ -0,0 +1,13 @@ +/// +/// Schicht: Core +/// Zweck: Interface für Daten-Persistenz. +/// Maintainer: Wird für Spielstände und Mod-Daten (System.Text.Json) genutzt. +/// + +namespace gregCore.Core.Abstractions; + +public interface IGregPersistenceService +{ + T? LoadData(string key) where T : class; + void SaveData(string key, T data) where T : class; +} diff --git a/src/Core/Abstractions/IGregPluginRegistry.cs b/src/Core/Abstractions/IGregPluginRegistry.cs new file mode 100644 index 00000000..da99b19b --- /dev/null +++ b/src/Core/Abstractions/IGregPluginRegistry.cs @@ -0,0 +1,13 @@ +/// +/// Schicht: Core +/// Zweck: Interface für die Registrierung von Mods/Plugins. +/// Maintainer: Verwaltet den Lifecycle aller geladenen Plugins. +/// + +namespace gregCore.Core.Abstractions; + +public interface IGregPluginRegistry +{ + void LoadAll(); + IReadOnlyList GetLoadedPlugins(); +} diff --git a/src/Core/Events/EventIds.cs b/src/Core/Events/EventIds.cs new file mode 100644 index 00000000..768a2c72 --- /dev/null +++ b/src/Core/Events/EventIds.cs @@ -0,0 +1,16 @@ +/// +/// Schicht: Core +/// Zweck: Definiert eindeutige IDs für Native FFI Events. +/// Maintainer: Muss synchron mit C/Rust Headern bleiben. +/// + +namespace gregCore.Core.Events; + +public static class EventIds +{ + // [GREG_SYNC_INSERT_EVENTIDS] + + public const int PlayerCoinUpdated = 1001; + public const int GameSaved = 2001; + public const int ServerStatusChanged = 3001; +} diff --git a/src/Core/Events/EventPayloadBuilder.cs b/src/Core/Events/EventPayloadBuilder.cs new file mode 100644 index 00000000..ac5c1b3f --- /dev/null +++ b/src/Core/Events/EventPayloadBuilder.cs @@ -0,0 +1,37 @@ +/// +/// Schicht: Core +/// Zweck: Hilfsklasse zum schnellen Erstellen von EventPayloads. +/// Maintainer: Reduziert Boilerplate beim Dispatchen von Events. +/// + +namespace gregCore.Core.Events; + +public static class EventPayloadBuilder +{ + public static EventPayload ForScene(int buildIndex, string sceneName) => + new EventPayload + { + HookName = HookName.Create("lifecycle", "SceneLoaded").Full, + OccurredAtUtc = DateTime.UtcNow, + Data = new Dictionary + { + { "BuildIndex", buildIndex }, + { "SceneName", sceneName } + }, + IsCancelable = false + }; + + public static EventPayload ForValueChange(string propertyName, object oldValue, object newValue) => + new EventPayload + { + HookName = string.Empty, // Wird vom Caller überschrieben + OccurredAtUtc = DateTime.UtcNow, + Data = new Dictionary + { + { "Property", propertyName }, + { "OldValue", oldValue }, + { "NewValue", newValue } + }, + IsCancelable = true + }; +} diff --git a/src/Core/Events/GregEventBus.cs b/src/Core/Events/GregEventBus.cs new file mode 100644 index 00000000..7f67d53d --- /dev/null +++ b/src/Core/Events/GregEventBus.cs @@ -0,0 +1,143 @@ +/// +/// Schicht: Core +/// Zweck: Thread-sichere Implementierung des IGregEventBus. +/// Maintainer: Publish läuft synchron auf dem aufrufenden Thread. Caching für Hotpath. +/// + +namespace gregCore.Core.Events; + +public sealed class GregEventBus : IGregEventBus, IDisposable +{ + private readonly IGregLogger _logger; + private readonly Dictionary>> _handlers = new(); + private readonly Dictionary[]> _cachedHandlers = new(); + private readonly ReaderWriterLockSlim _rwLock = new(); + private bool _isDirty = true; + private bool _disposed; + + public GregEventBus(IGregLogger logger) + { + ArgumentNullException.ThrowIfNull(logger); + _logger = logger.ForContext("EventBus"); + } + + public void Subscribe(string hookName, Action handler) + { + ArgumentNullException.ThrowIfNull(hookName); + ArgumentNullException.ThrowIfNull(handler); + + _rwLock.EnterWriteLock(); + try + { + if (!_handlers.TryGetValue(hookName, out var list)) + { + list = new List>(); + _handlers[hookName] = list; + } + list.Add(handler); + _isDirty = true; + } + finally + { + _rwLock.ExitWriteLock(); + } + } + + public void Unsubscribe(string hookName, Action handler) + { + ArgumentNullException.ThrowIfNull(hookName); + ArgumentNullException.ThrowIfNull(handler); + + _rwLock.EnterWriteLock(); + try + { + if (_handlers.TryGetValue(hookName, out var list)) + { + list.Remove(handler); + _isDirty = true; + } + } + finally + { + _rwLock.ExitWriteLock(); + } + } + + public bool Publish(string hookName, EventPayload payload) + { + ArgumentNullException.ThrowIfNull(hookName); + + Action[]? handlersToInvoke = null; + + _rwLock.EnterReadLock(); + try + { + if (_isDirty) + { + _rwLock.ExitReadLock(); + _rwLock.EnterWriteLock(); + try + { + if (_isDirty) + { + _cachedHandlers.Clear(); + foreach (var kvp in _handlers) + { + _cachedHandlers[kvp.Key] = kvp.Value.ToArray(); + } + _isDirty = false; + } + } + finally + { + _rwLock.ExitWriteLock(); + _rwLock.EnterReadLock(); + } + } + + _cachedHandlers.TryGetValue(hookName, out handlersToInvoke); + } + finally + { + _rwLock.ExitReadLock(); + } + + if (handlersToInvoke == null || handlersToInvoke.Length == 0) return true; + + var currentPayload = payload with { HookName = hookName }; + + foreach (var handler in handlersToInvoke) + { + try + { + handler(currentPayload); + if (currentPayload.IsCancelable && currentPayload.IsCancelled) + { + return false; + } + } + catch (Exception ex) + { + _logger.Error($"Fehler in Handler für {hookName}", ex); + } + } + + return true; + } + + public void Dispose() + { + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + + private void Dispose(bool disposing) + { + if (_disposed) return; + if (disposing) + { + _rwLock.Dispose(); + } + _disposed = true; + } +} diff --git a/src/Core/Events/NativeEventHooks.cs b/src/Core/Events/NativeEventHooks.cs new file mode 100644 index 00000000..47f943c4 --- /dev/null +++ b/src/Core/Events/NativeEventHooks.cs @@ -0,0 +1,21 @@ +/// +/// Schicht: Core +/// Zweck: Mappt Hook-Namen auf Native Event-IDs für FFI. +/// Maintainer: Erlaubt es nativen Mods, Events via ID zu empfangen. +/// + +namespace gregCore.Core.Events; + +public static class NativeEventHooks +{ + private static readonly Dictionary _hookToId = new() + { + // [GREG_SYNC_INSERT_MAPPINGS] + { HookName.Create("economy", "PlayerCoinUpdated").Full, EventIds.PlayerCoinUpdated }, + { HookName.Create("persistence", "GameSaved").Full, EventIds.GameSaved }, + { HookName.Create("hardware", "ServerStatusChanged").Full, EventIds.ServerStatusChanged } + }; + + public static bool TryGetEventId(string hookName, out int eventId) => + _hookToId.TryGetValue(hookName, out eventId); +} diff --git a/src/Core/Exceptions/GregAbiException.cs b/src/Core/Exceptions/GregAbiException.cs new file mode 100644 index 00000000..16238a9f --- /dev/null +++ b/src/Core/Exceptions/GregAbiException.cs @@ -0,0 +1,13 @@ +/// +/// Schicht: Core +/// Zweck: Exception für ABI (Application Binary Interface) Mismatches bei nativen Mods. +/// Maintainer: Wird geworfen, wenn GameAPITable Versionen nicht übereinstimmen. +/// + +namespace gregCore.Core.Exceptions; + +public class GregAbiException : GregCoreException +{ + public GregAbiException(string message) : base(message) { } + public GregAbiException(string message, Exception inner) : base(message, inner) { } +} diff --git a/src/Core/Exceptions/GregBridgeException.cs b/src/Core/Exceptions/GregBridgeException.cs new file mode 100644 index 00000000..8c3f2b87 --- /dev/null +++ b/src/Core/Exceptions/GregBridgeException.cs @@ -0,0 +1,13 @@ +/// +/// Schicht: Core +/// Zweck: Exception für Fehler innerhalb von Language Bridges (Lua/JS/FFI). +/// Maintainer: Sollte abgefangen und isoliert geloggt werden, crasht nie den Main Thread. +/// + +namespace gregCore.Core.Exceptions; + +public class GregBridgeException : GregCoreException +{ + public GregBridgeException(string message) : base(message) { } + public GregBridgeException(string message, Exception inner) : base(message, inner) { } +} diff --git a/src/Core/Exceptions/GregCoreException.cs b/src/Core/Exceptions/GregCoreException.cs new file mode 100644 index 00000000..9da527fc --- /dev/null +++ b/src/Core/Exceptions/GregCoreException.cs @@ -0,0 +1,13 @@ +/// +/// Schicht: Core +/// Zweck: Basis-Exception für alle frameworkeigenen Exceptions. +/// Maintainer: Alle eigenen Exceptions sollten hiervon erben. +/// + +namespace gregCore.Core.Exceptions; + +public abstract class GregCoreException : Exception +{ + protected GregCoreException(string message) : base(message) { } + protected GregCoreException(string message, Exception inner) : base(message, inner) { } +} diff --git a/src/Core/Exceptions/GregInitException.cs b/src/Core/Exceptions/GregInitException.cs new file mode 100644 index 00000000..c3574b91 --- /dev/null +++ b/src/Core/Exceptions/GregInitException.cs @@ -0,0 +1,13 @@ +/// +/// Schicht: Core +/// Zweck: Exception für Initialisierungsfehler des Frameworks. +/// Maintainer: Framework-eigene Exception, keine Unity-Abhängigkeit. +/// + +namespace gregCore.Core.Exceptions; + +public class GregInitException : GregCoreException +{ + public GregInitException(string message) : base(message) { } + public GregInitException(string message, Exception inner) : base(message, inner) { } +} diff --git a/src/Core/Exceptions/GregPluginLoadException.cs b/src/Core/Exceptions/GregPluginLoadException.cs new file mode 100644 index 00000000..67091954 --- /dev/null +++ b/src/Core/Exceptions/GregPluginLoadException.cs @@ -0,0 +1,13 @@ +/// +/// Schicht: Core +/// Zweck: Exception für Fehler beim Laden von Plugins oder Auflösen von Abhängigkeiten. +/// Maintainer: Wird geworfen bei zyklischen oder fehlenden Abhängigkeiten. +/// + +namespace gregCore.Core.Exceptions; + +public class GregPluginLoadException : GregCoreException +{ + public GregPluginLoadException(string message) : base(message) { } + public GregPluginLoadException(string message, Exception inner) : base(message, inner) { } +} diff --git a/src/Core/Models/ApiTableVersion.cs b/src/Core/Models/ApiTableVersion.cs new file mode 100644 index 00000000..22345fa7 --- /dev/null +++ b/src/Core/Models/ApiTableVersion.cs @@ -0,0 +1,12 @@ +/// +/// Schicht: Core +/// Zweck: Enthält die Versionsnummer der GameAPITable für FFI. +/// Maintainer: Nach jeder ABI-Änderung in GameApiTable.cs muss diese Version erhöht werden. +/// + +namespace gregCore.Core.Models; + +public static class ApiTableVersion +{ + public const int Current = 12; +} diff --git a/src/Core/Models/EventPayload.cs b/src/Core/Models/EventPayload.cs new file mode 100644 index 00000000..7289c33b --- /dev/null +++ b/src/Core/Models/EventPayload.cs @@ -0,0 +1,19 @@ +/// +/// Schicht: Core +/// Zweck: Datenmodell für Events, die über den IGregEventBus verschickt werden. +/// Maintainer: Blittable struct wo möglich. IsCancelled ist das einzige mutable Feld. +/// + +namespace gregCore.Core.Models; + +// [GREG_SYNC_INSERT_DTOS] + +[StructLayout(LayoutKind.Sequential)] +public record struct EventPayload +{ + public string HookName { get; init; } + public DateTime OccurredAtUtc { get; init; } + public IReadOnlyDictionary Data { get; init; } + public bool IsCancelable { get; init; } + public bool IsCancelled { get; set; } +} diff --git a/src/Core/Models/HookName.cs b/src/Core/Models/HookName.cs new file mode 100644 index 00000000..fddd12fa --- /dev/null +++ b/src/Core/Models/HookName.cs @@ -0,0 +1,36 @@ +/// +/// Schicht: Core +/// Zweck: Repräsentiert einen eindeutigen Hook-Namen. +/// Maintainer: Format "greg.{Domain}.{Event}". +/// + +namespace gregCore.Core.Models; + +public readonly record struct HookName +{ + public string Domain { get; init; } + public string Event { get; init; } + + private readonly string? _full; + public string Full => _full ?? $"greg.{Domain}.{Event}"; + + public static HookName Parse(string full) + { + ArgumentNullException.ThrowIfNull(full); + var parts = full.Split('.'); + if (parts.Length >= 3 && parts[0] == "greg") + { + return new HookName { Domain = parts[1], Event = parts[2], _full = full }; + } + throw new ArgumentException($"Invalid HookName format: {full}"); + } + + public static HookName Create(string domain, string eventName) + { + ArgumentNullException.ThrowIfNull(domain); + ArgumentNullException.ThrowIfNull(eventName); + return new HookName { Domain = domain, Event = eventName, _full = $"greg.{domain}.{eventName}" }; + } + + public override string ToString() => Full; +} diff --git a/src/Core/Models/ModManifest.cs b/src/Core/Models/ModManifest.cs new file mode 100644 index 00000000..d332d93f --- /dev/null +++ b/src/Core/Models/ModManifest.cs @@ -0,0 +1,16 @@ +/// +/// Schicht: Core +/// Zweck: Datenmodell für das Manifest eines Mods (mod.json). +/// Maintainer: Reines DTO, serializer-agnostisch. +/// + +namespace gregCore.Core.Models; + +public record ModManifest +{ + public string Id { get; init; } = string.Empty; + public string Name { get; init; } = string.Empty; + public string Version { get; init; } = "1.0.0"; + public string Author { get; init; } = string.Empty; + public IReadOnlyList Dependencies { get; init; } = Array.Empty(); +} diff --git a/src/Core/Models/PluginInfo.cs b/src/Core/Models/PluginInfo.cs new file mode 100644 index 00000000..312f2b6b --- /dev/null +++ b/src/Core/Models/PluginInfo.cs @@ -0,0 +1,14 @@ +/// +/// Schicht: Core +/// Zweck: Datenmodell für die Metadaten eines geladenen Plugins. +/// Maintainer: Reines DTO, serializer-agnostisch. +/// + +namespace gregCore.Core.Models; + +public record PluginInfo +{ + public string AssemblyPath { get; init; } = string.Empty; + public ModManifest Manifest { get; init; } = new(); + public bool IsNative { get; init; } +} diff --git a/src/Core/README.md b/src/Core/README.md new file mode 100644 index 00000000..648aa6e8 --- /dev/null +++ b/src/Core/README.md @@ -0,0 +1,15 @@ +# gregCore Architektur + +## Schichten +Core/ → Framework-Kern, kein Unity-Coupling, vollständig testbar +Infrastructure/ → Implementierungen, kennt MelonLoader/Win32/Mono +GameLayer/ → IL2CPP + Harmony, nur Daten-Extraktion + Dispatch +PublicApi/ → Was Modder nutzen dürfen + +## Goldene Regeln +1. Patches haben KEINE Business-Logic +2. GregCoreLoader hat MAX 50 Zeilen +3. GameAPITable: Neue Felder NUR ans Ende +4. Alle Services via Interface — nie direkt instanziieren +5. MelonLogger nur in MelonLoggerAdapter +6. Assembly.LoadFrom VERBOTEN — immer Mono.Cecil diff --git a/src/Diagnostic/FrameLimiterConfig.cs b/src/Diagnostic/FrameLimiterConfig.cs new file mode 100644 index 00000000..0f4c3a99 --- /dev/null +++ b/src/Diagnostic/FrameLimiterConfig.cs @@ -0,0 +1,24 @@ +namespace greg.Diagnostic; + +public sealed class FrameLimiterConfig +{ + public bool Enabled { get; set; } = true; + public FpsProfile Menu { get; set; } = new() { TargetFps = 30, VSync = 0 }; + public FpsProfile Gameplay { get; set; } = new() { TargetFps = 144, VSync = 0 }; + public AfkProfile Afk { get; set; } = new(); + public FpsProfile Minimized { get; set; } = new() { TargetFps = 5, VSync = 0 }; + public FpsProfile Background { get; set; } = new() { TargetFps = 20, VSync = 0 }; +} + +public class FpsProfile +{ + public int TargetFps { get; set; } = 60; + public int VSync { get; set; } = 0; +} + +public sealed class AfkProfile : FpsProfile +{ + public bool Enabled { get; set; } = true; + public float AfkAfterSeconds { get; set; } = 60f; + public AfkProfile() { TargetFps = 15; } +} \ No newline at end of file diff --git a/src/Diagnostic/GregFrameLimiterService.cs b/src/Diagnostic/GregFrameLimiterService.cs new file mode 100644 index 00000000..2611bd62 --- /dev/null +++ b/src/Diagnostic/GregFrameLimiterService.cs @@ -0,0 +1,150 @@ +using System; +using MelonLoader; +using UnityEngine; +using UnityEngine.InputSystem; + +namespace greg.Diagnostic; + +public sealed class GregFrameLimiterService +{ + public static GregFrameLimiterService Instance { get; private set; } = null!; + + public enum GameState { Unknown, Menu, Gameplay, Loading } + public string CurrentStateName => _currentState.ToString(); + + private GameState _currentState = GameState.Unknown; + private bool _isFocused = true; + private bool _isMinimized = false; + private bool _isAfk = false; + private float _lastInputTime = 0f; + private int _frame = 0; + + private FrameLimiterConfig? _cfg; + + public void Initialize(FrameLimiterConfig cfg) + { + Instance = this; + _cfg = cfg; + + if (cfg == null || !cfg.Enabled) + { + MelonLogger.Msg("[FrameLimiter] Disabled via config."); + return; + } + + SetState(GameState.Menu); + MelonLogger.Msg("[FrameLimiter] Initialized. Menu limit active."); + } + + public void SetState(GameState state) + { + if (_currentState == state) return; + _currentState = state; + ApplyCurrentLimit(); + } + + public void OnFocusChanged(bool focused) + { + _isFocused = focused; + ApplyCurrentLimit(); + } + + public void OnMinimizeChanged(bool minimized) + { + _isMinimized = minimized; + ApplyCurrentLimit(); + } + + public void Tick() + { + if (_cfg == null || !_cfg.Enabled) return; + + bool anyInput = false; + try + { + if (Keyboard.current != null) + { + anyInput = Keyboard.current.anyKey.isPressed; + } + if (!anyInput && Mouse.current != null) + { + anyInput = Mouse.current.delta.ReadValue().sqrMagnitude > 0.01f; + } + } + catch { } + + if (anyInput) + { + _lastInputTime = Time.realtimeSinceStartup; + if (_isAfk) + { + _isAfk = false; + ApplyCurrentLimit(); + MelonLogger.Msg("[FrameLimiter] AFK ended — restoring limit."); + } + } + else if (!_isAfk + && _cfg?.Afk?.Enabled == true + && _currentState == GameState.Gameplay + && (Time.realtimeSinceStartup - _lastInputTime) > _cfg.Afk.AfkAfterSeconds) + { + _isAfk = true; + ApplyCurrentLimit(); + MelonLogger.Msg("[FrameLimiter] AFK detected — reducing FPS."); + } + } + + private void ApplyCurrentLimit() + { + if (_cfg == null || !_cfg.Enabled) return; + + int targetFps; + int vSync; + string reason; + + if (_isMinimized) + { + targetFps = _cfg.Minimized.TargetFps; + vSync = _cfg.Minimized.VSync; + reason = "minimized"; + } + else if (!_isFocused) + { + targetFps = _cfg.Background.TargetFps; + vSync = _cfg.Background.VSync; + reason = "background"; + } + else if (_isAfk) + { + targetFps = _cfg.Afk.TargetFps; + vSync = _cfg.Afk.VSync; + reason = "afk"; + } + else + { + (targetFps, vSync, reason) = _currentState switch + { + GameState.Menu => (_cfg.Menu.TargetFps, _cfg.Menu.VSync, "menu"), + GameState.Loading => (_cfg.Menu.TargetFps, _cfg.Menu.VSync, "loading"), + GameState.Gameplay => (_cfg.Gameplay.TargetFps, _cfg.Gameplay.VSync, "gameplay"), + _ => (_cfg.Menu.TargetFps, _cfg.Menu.VSync, "unknown"), + }; + } + + try + { + if (Application.targetFrameRate == targetFps + && QualitySettings.vSyncCount == vSync) + return; + + Application.targetFrameRate = targetFps; + QualitySettings.vSyncCount = vSync; + + MelonLogger.Msg($"[FrameLimiter] {reason} → targetFPS={targetFps} vSync={vSync}"); + } + catch (Exception ex) + { + MelonLogger.Warning($"[FrameLimiter] ApplyCurrentLimit failed: {ex.Message}"); + } + } +} \ No newline at end of file diff --git a/src/Diagnostic/GregPerfConfig.cs b/src/Diagnostic/GregPerfConfig.cs new file mode 100644 index 00000000..8c984a77 --- /dev/null +++ b/src/Diagnostic/GregPerfConfig.cs @@ -0,0 +1,46 @@ +using System.Text.Json.Serialization; + +namespace greg.Diagnostic; + +public sealed class GregPerfConfig +{ + public static GregPerfConfig Instance { get; set; } = new(); + + public bool FrameCapEnabled { get; set; } = true; + public int MenuFps { get; set; } = 30; + public int GameplayFps { get; set; } = 144; + public int BackgroundFps { get; set; } = 20; + public int AfkFps { get; set; } = 15; + public bool AfkEnabled { get; set; } = true; + public float AfkSeconds { get; set; } = 60f; + public int MaxAllowedFps { get; set; } = 240; + + [JsonIgnore] + public int CurrentTarget { get; set; } = 30; + + public bool ThreadingEnabled { get; set; } = true; + public int PhysicalCores { get; set; } = 0; + + public bool GcOptEnabled { get; set; } = true; + public int GcTriggerMb { get; set; } = 256; + public bool IncrementalGc { get; set; } = true; + + public bool RenderOptEnabled { get; set; } = true; + public bool ReduceShadows { get; set; } = true; + public float ShadowDistanceM { get; set; } = 50f; + public int ShadowCascades { get; set; } = 2; + public bool AggressiveLod { get; set; } = true; + public float LodBias { get; set; } = 1.0f; + public int MaxLodLevel { get; set; } = 0; + public bool LimitPixelLights { get; set; } = true; + public int MaxPixelLights { get; set; } = 2; + public bool ReduceTextureQuality { get; set; } = false; + public int TextureMipMapLimit { get; set; } = 0; + public bool DisableSoftParticles { get; set; } = true; + public bool DisableHeavyPostProcessing { get; set; } = true; + public bool DisableMotionBlur { get; set; } = true; + public bool DisableBloom { get; set; } = false; + public bool DisableDoF { get; set; } = true; + public bool DisableAO { get; set; } = false; + public bool DisableSSR { get; set; } = true; +} \ No newline at end of file diff --git a/src/Diagnostic/GregPerformanceHud.cs b/src/Diagnostic/GregPerformanceHud.cs new file mode 100644 index 00000000..793ff01a --- /dev/null +++ b/src/Diagnostic/GregPerformanceHud.cs @@ -0,0 +1,48 @@ +using MelonLoader; +using UnityEngine; +using UnityEngine.InputSystem; + +namespace greg.Diagnostic; + +public sealed class GregPerformanceHud : MelonMod +{ + private bool _visible = false; + private string _displayText = ""; + private float _updateTimer = 0f; + + public override void OnUpdate() + { + try + { + if (Keyboard.current?.f9Key?.wasPressedThisFrame == true) + _visible = !_visible; + } + catch { } + + if (!_visible) return; + + _updateTimer += Time.unscaledDeltaTime; + if (_updateTimer < 1f) return; + _updateTimer = 0f; + + float currentFps = Time.unscaledDeltaTime > 0 ? 1f / Time.unscaledDeltaTime : 0f; + float targetFps = Application.targetFrameRate; + string state = GregFrameLimiterService.Instance?.CurrentStateName ?? "?"; + long ramMb = System.GC.GetTotalMemory(false) / 1024 / 1024; + int gpuMb = SystemInfo.graphicsMemorySize; + + _displayText = + $"gregCore Performance\n" + + $"FPS: {targetFps}/{currentFps:F0}\n" + + $"State: {state}\n" + + $"RAM: {ramMb}MB\n" + + $"GPU: {gpuMb}MB\n" + + $"[F9] hide"; + } + + public override void OnGUI() + { + if (!_visible) return; + GUI.Box(new Rect(10, 10, 200, 160), _displayText); + } +} \ No newline at end of file diff --git a/src/Diagnostic/GregPerformanceOptimizer.cs b/src/Diagnostic/GregPerformanceOptimizer.cs new file mode 100644 index 00000000..495362a2 --- /dev/null +++ b/src/Diagnostic/GregPerformanceOptimizer.cs @@ -0,0 +1,461 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Threading.Tasks; +using HarmonyLib; +using Il2Cpp; +using MelonLoader; +using UnityEngine; +using UnityEngine.AI; +using UnityEngine.Rendering; +using UnityEngine.Rendering.HighDefinition; + +namespace greg.Diagnostic; + +// ── Main-thread dispatch queue ───────────────────────────────────────────── +internal static class MainThreadDispatch +{ + private static readonly ConcurrentQueue _queue = new(); + public static void Enqueue(Action action) => _queue.Enqueue(action); + public static void Drain() + { + while (_queue.TryDequeue(out var action)) + { + try { action(); } + catch (Exception ex) { MelonLogger.Warning($"[gregCore.PerfFix] MainThreadDispatch error: {ex.Message}"); } + } + } +} + +public static class GregPerformanceOptimizer +{ + // ── Preferences ─────────────────────────────────────────────────────── + public static MelonPreferences_Entry CanvasThrottleEnabled; + public static MelonPreferences_Entry CanvasUpdateInterval; + + public static MelonPreferences_Entry IndicatorThrottleEnabled; + public static MelonPreferences_Entry IndicatorUpdateInterval; + + public static MelonPreferences_Entry ThrottlePulsating; + public static MelonPreferences_Entry PulsatingUpdateInterval; + + public static MelonPreferences_Entry RouteEvalCooldown; + public static MelonPreferences_Entry AsyncRouteEval; + public static MelonPreferences_Entry AutoSaveMinutes; + + // NPCs + public static MelonPreferences_Entry NpcEnabled; + public static MelonPreferences_Entry NpcThrottleDistance; + public static MelonPreferences_Entry NpcThrottleInterval; + + // Memory + public static MelonPreferences_Entry MemoryEnabled; + public static MelonPreferences_Entry TextureMipmapLimit; + public static MelonPreferences_Entry StreamingMipmaps; + public static MelonPreferences_Entry StreamingMipmapsBudgetMB; + public static MelonPreferences_Entry PeriodicGCIntervalSeconds; + + // Graphics + public static MelonPreferences_Entry GraphicsEnabled; + public static MelonPreferences_Entry ShadowDistance; + public static MelonPreferences_Entry CameraFarClip; + public static MelonPreferences_Entry LodBias; + public static MelonPreferences_Entry DisableSSAO; + public static MelonPreferences_Entry DisableContactShadows; + public static MelonPreferences_Entry DisableGlobalIllumination; + public static MelonPreferences_Entry DisableSSR; + public static MelonPreferences_Entry DisableVolumetricFog; + + // ── OLD TWEAKS ──────────────────────────────────────────────────────── + public static MelonPreferences_Entry TargetFPS; + + public static void ApplySettings() + { + Initialize(); + } + + public static void Initialize() + { + var cat = MelonPreferences.CreateCategory("PerfFix"); + + TargetFPS = cat.CreateEntry("TargetFPS", 120, "TargetFPS", "Target framerate. 0 = uncap."); + + CanvasThrottleEnabled = cat.CreateEntry("CanvasThrottle", true, "CanvasThrottle", + "Throttle WorldCanvasCuller.Update() to CanvasUpdateInterval Hz instead of every frame."); + + CanvasUpdateInterval = cat.CreateEntry("CanvasUpdateInterval", 0.1f, "CanvasUpdateInterval", + "Seconds between WorldCanvasCuller distance checks (0.1 = 10 Hz). Vanilla runs at full framerate."); + + IndicatorThrottleEnabled = cat.CreateEntry("IndicatorThrottle", true, "IndicatorThrottle", + "Throttle PositionIndicator.Update() (warning/error triangles) — re-projects world→screen every frame."); + + IndicatorUpdateInterval = cat.CreateEntry("IndicatorUpdateInterval", 0.1f, "IndicatorUpdateInterval", + "Seconds between PositionIndicator screen-position updates (0.1 = 10 Hz)."); + + ThrottlePulsating = cat.CreateEntry("ThrottlePulsating", true, "ThrottlePulsating", + "Throttle PulsatingImageColor and PulsatingText Update() calls."); + + PulsatingUpdateInterval = cat.CreateEntry("PulsatingUpdateInterval", 0.05f, "PulsatingUpdateInterval", + "Seconds between pulsating effect updates (0.05 = 20 Hz)."); + + RouteEvalCooldown = cat.CreateEntry("RouteEvalCooldown", 2.0f, "RouteEvalCooldown", + "Minimum seconds between full ECS cable-route re-evaluations."); + + AsyncRouteEval = cat.CreateEntry("AsyncRouteEval", false, "AsyncRouteEval", + "EXPERIMENTAL (DISABLED!): Run EvaluateAllRoutes on a background thread. CAUSES IL2CPP CRASHES."); + + AutoSaveMinutes = cat.CreateEntry("AutoSaveMinutes", 10.0f, "AutoSaveMinutes", + "Minutes between auto-saves. Large saves cause frame hitches. Set to 0 to disable."); + + GraphicsEnabled = cat.CreateEntry("GraphicsEnabled", true, "GraphicsEnabled", + "Master toggle for the graphics fixes below."); + + ShadowDistance = cat.CreateEntry("ShadowDistance", 20f, "ShadowDistance", + "HDRP shadow cull distance in metres. Vanilla is ~150 m."); + + CameraFarClip = cat.CreateEntry("CameraFarClip", 80f, "CameraFarClip", + "Player camera far clip plane in metres. Vanilla is ~1000 m."); + + LodBias = cat.CreateEntry("LodBias", 0.4f, "LodBias", + "Unity LOD bias. Lower = switch to cheaper LOD meshes sooner."); + + DisableSSAO = cat.CreateEntry("DisableSSAO", true, "DisableSSAO", + "Disable HDRP Screen-Space Ambient Occlusion."); + + DisableContactShadows = cat.CreateEntry("DisableContactShadows", true, "DisableContactShadows", + "Disable HDRP Contact Shadows."); + + DisableGlobalIllumination = cat.CreateEntry("DisableGlobalIllumination", true, "DisableGlobalIllumination", + "Disable HDRP Screen-Space Global Illumination."); + + DisableSSR = cat.CreateEntry("DisableSSR", true, "DisableSSR", + "Disable HDRP Screen-Space Reflections on floors/racks."); + + DisableVolumetricFog = cat.CreateEntry("DisableVolumetricFog", false, "DisableVolumetricFog", + "Disable HDRP Volumetric Fog."); + + NpcEnabled = cat.CreateEntry("NpcEnabled", true, "NpcEnabled", + "Master toggle for NPC/Technician optimizations."); + + NpcThrottleDistance = cat.CreateEntry("NpcThrottleDistance", 15f, "NpcThrottleDistance", + "Distance in metres beyond which Technician FixedUpdate and LateUpdate are throttled."); + + NpcThrottleInterval = cat.CreateEntry("NpcThrottleInterval", 0.2f, "NpcThrottleInterval", + "Seconds between FixedUpdate/LateUpdate ticks for distant technicians."); + + MemoryEnabled = cat.CreateEntry("MemoryEnabled", true, "MemoryEnabled", + "Master toggle for memory reduction settings below."); + + TextureMipmapLimit = cat.CreateEntry("TextureMipmapLimit", 1, "TextureMipmapLimit", + "Global texture mipmap skip level. 0=full resolution, 1=half resolution, 2=quarter resolution."); + + StreamingMipmaps = cat.CreateEntry("StreamingMipmaps", true, "StreamingMipmaps", + "Enable Unity mipmap streaming."); + + StreamingMipmapsBudgetMB = cat.CreateEntry("StreamingMipmapsBudgetMB", 512f, "StreamingMipmapsBudgetMB", + "Memory budget for streamed mipmaps in megabytes."); + + PeriodicGCIntervalSeconds = cat.CreateEntry("PeriodicGCIntervalSeconds", 0f, "PeriodicGCIntervalSeconds", + "Seconds between forced garbage collection passes. Set to 0 to disable. (WARNING: Enabled GC has been known to crash Il2CppInterop)"); + + MelonLogger.Msg($"[gregCore.PerfFix] Loaded. " + + $"Canvas={CanvasUpdateInterval.Value}s " + + $"RouteEval={RouteEvalCooldown.Value}s " + + $"AutoSave={AutoSaveMinutes.Value}min " + + $"FarClip={CameraFarClip.Value}m"); + + ApplyMemorySettings(); + + // Base Performance Tweaks + int targetFPS = TargetFPS.Value > 0 ? TargetFPS.Value : Screen.currentResolution.refreshRate; + QualitySettings.vSyncCount = 0; + Application.targetFrameRate = targetFPS > 0 ? targetFPS : 120; + } + + private static float _nextGC = 0f; + + public static void OnUpdate() + { + MainThreadDispatch.Drain(); + + float interval = PeriodicGCIntervalSeconds?.Value ?? 0f; + if (interval > 0f && Time.realtimeSinceStartup >= _nextGC && _nextGC > 0f) + { + _nextGC = Time.realtimeSinceStartup + interval; + MelonCoroutines.Start(RunPeriodicGC()); + } + } + + private static System.Collections.IEnumerator RunPeriodicGC() + { + yield return null; + // GC forcing removed - Causes Il2CppInterop/Unity Finalizer NullReferenceException + MelonLogger.Msg($"[gregCore.PerfFix] Periodic GC skipped to prevent Il2CppInterop crashes."); + } + + public static void OnSceneLoaded() + { + ApplySimulationFixes(); + MelonCoroutines.Start(ApplyGraphicsFixesNextFrame()); + if (PeriodicGCIntervalSeconds != null) + { + float interval = PeriodicGCIntervalSeconds.Value; + _nextGC = interval > 0f ? Time.realtimeSinceStartup + interval : 0f; + } + } + + private static void ApplySimulationFixes() + { + try + { + var wis = WaypointInitializationSystem.Instance; + if (wis != null) + { + wis.SetEvaluationCooldown(RouteEvalCooldown.Value); + MelonLogger.Msg($"[gregCore.PerfFix] RouteEvalCooldown → {RouteEvalCooldown.Value}s"); + } + } + catch (Exception ex) { MelonLogger.Warning($"[gregCore.PerfFix] RouteEvalCooldown: {ex.Message}"); } + + try + { + var mgr = MainGameManager.instance; + if (mgr != null) + { + if (AutoSaveMinutes.Value <= 0f) + { + mgr.SetAutoSaveEnabled(false); + MelonLogger.Msg("[gregCore.PerfFix] AutoSave disabled."); + } + else + { + mgr.SetAutoSaveEnabled(true); + mgr.SetAutoSaveInterval(AutoSaveMinutes.Value); + MelonLogger.Msg($"[gregCore.PerfFix] AutoSave interval → {AutoSaveMinutes.Value} min"); + } + } + } + catch (Exception ex) { MelonLogger.Warning($"[gregCore.PerfFix] AutoSave: {ex.Message}"); } + } + + private static System.Collections.IEnumerator ApplyGraphicsFixesNextFrame() + { + yield return null; + ApplyGraphicsFixes(); + } + + private static void ApplyMemorySettings() + { + if (!MemoryEnabled.Value) return; + try + { + QualitySettings.globalTextureMipmapLimit = TextureMipmapLimit.Value; + } + catch (Exception ex) { MelonLogger.Warning($"[gregCore.PerfFix] TextureMipmapLimit: {ex.Message}"); } + + try + { + QualitySettings.streamingMipmapsActive = StreamingMipmaps.Value; + if (StreamingMipmaps.Value) + { + QualitySettings.streamingMipmapsMemoryBudget = StreamingMipmapsBudgetMB.Value; + } + } + catch (Exception ex) { MelonLogger.Warning($"[gregCore.PerfFix] StreamingMipmaps: {ex.Message}"); } + } + + public static void ApplyGraphicsFixes() + { + QualitySettings.lodBias = LodBias.Value; + + if (!GraphicsEnabled.Value) return; + + try + { + var cam = MainGameManager.instance?.playerCamera; + if (cam != null) + { + cam.farClipPlane = CameraFarClip.Value; + } + } + catch (Exception ex) { MelonLogger.Warning($"[gregCore.PerfFix] CameraFarClip: {ex.Message}"); } + + try + { + var sg = SettingsSingleton.instance?.settingsGraphics; + if (sg != null) + { + sg.SetShadowDistance(ShadowDistance.Value); + } + } + catch (Exception ex) { MelonLogger.Warning($"[gregCore.PerfFix] ShadowDistance: {ex.Message}"); } + + try + { + var sg = SettingsSingleton.instance?.settingsGraphics; + if (sg == null) return; + var profile = sg.volumeProfile; + if (profile == null) return; + + int disabled = 0; + if (DisableSSAO.Value && profile.TryGet(out var ssao)) + { ssao.active = false; disabled++; } + if (DisableContactShadows.Value && profile.TryGet(out var cs)) + { cs.active = false; disabled++; } + if (DisableGlobalIllumination.Value && profile.TryGet(out var gi)) + { gi.active = false; disabled++; } + if (DisableSSR.Value && profile.TryGet(out var ssr)) + { ssr.active = false; disabled++; } + if (DisableVolumetricFog.Value && profile.TryGet(out var fog)) + { fog.enableVolumetricFog.overrideState = true; fog.enableVolumetricFog.value = false; disabled++; } + } + catch (Exception ex) { MelonLogger.Warning($"[gregCore.PerfFix] HDRP volume overrides: {ex.Message}"); } + } +} + +// ── WorldCanvasCuller throttle ───────────────────────────────────────────── +[HarmonyPatch(typeof(WorldCanvasCuller), "Update")] +internal static class WorldCanvasCullerPatch +{ + private static readonly Dictionary _nextRun = new(); + static bool Prefix(WorldCanvasCuller __instance) + { + if (GregPerformanceOptimizer.CanvasThrottleEnabled == null || !GregPerformanceOptimizer.CanvasThrottleEnabled.Value) return true; + float now = Time.time; + var ptr = __instance.Pointer; + if (_nextRun.TryGetValue(ptr, out float next) && now < next) return false; + _nextRun[ptr] = now + GregPerformanceOptimizer.CanvasUpdateInterval.Value; + return true; + } +} + +// ── PositionIndicator throttle ───────────────────────────────────────────── +[HarmonyPatch(typeof(PositionIndicator), "Update")] +internal static class PositionIndicatorPatch +{ + private static readonly Dictionary _nextRun = new(); + static bool Prefix(PositionIndicator __instance) + { + if (GregPerformanceOptimizer.IndicatorThrottleEnabled == null || !GregPerformanceOptimizer.IndicatorThrottleEnabled.Value) return true; + float now = Time.time; + var ptr = __instance.Pointer; + if (_nextRun.TryGetValue(ptr, out float next) && now < next) return false; + _nextRun[ptr] = now + GregPerformanceOptimizer.IndicatorUpdateInterval.Value; + return true; + } +} + +// ── PulsatingImageColor throttle ─────────────────────────────────────────── +[HarmonyPatch(typeof(PulsatingImageColor), "Update")] +internal static class PulsatingImageColorPatch +{ + private static readonly Dictionary _nextRun = new(); + static bool Prefix(PulsatingImageColor __instance) + { + if (GregPerformanceOptimizer.ThrottlePulsating == null || !GregPerformanceOptimizer.ThrottlePulsating.Value) return true; + float now = Time.time; + var ptr = __instance.Pointer; + if (_nextRun.TryGetValue(ptr, out float next) && now < next) return false; + _nextRun[ptr] = now + GregPerformanceOptimizer.PulsatingUpdateInterval.Value; + return true; + } +} + +// ── PulsatingText throttle ───────────────────────────────────────────────── +[HarmonyPatch(typeof(PulsatingText), "Update")] +internal static class PulsatingTextPatch +{ + private static readonly Dictionary _nextRun = new(); + static bool Prefix(PulsatingText __instance) + { + if (GregPerformanceOptimizer.ThrottlePulsating == null || !GregPerformanceOptimizer.ThrottlePulsating.Value) return true; + float now = Time.time; + var ptr = __instance.Pointer; + if (_nextRun.TryGetValue(ptr, out float next) && now < next) return false; + _nextRun[ptr] = now + GregPerformanceOptimizer.PulsatingUpdateInterval.Value; + return true; + } +} + +// ── Async EvaluateAllRoutes ──────────────────────────────────────────────── +[HarmonyPatch(typeof(WaypointInitializationSystem), "EvaluateAllRoutes")] +internal static class AsyncRouteEvalPatch +{ + [ThreadStatic] + private static bool _allowPassthrough; + + private static volatile bool _evaluationInFlight; + + static bool Prefix(WaypointInitializationSystem __instance) + { + // ── KILLS IL2CPP GC BECAUSE UNMANAGED THREAD IS NOT ATTACHED ── + // Disabled fully + return true; + + /* + if (GregPerformanceOptimizer.AsyncRouteEval == null || !GregPerformanceOptimizer.AsyncRouteEval.Value) return true; + + if (_allowPassthrough) return true; + + if (_evaluationInFlight) return false; + + _evaluationInFlight = true; + var wis = __instance; + + Task.Run(() => + { + _allowPassthrough = true; + try + { + wis.EvaluateAllRoutes(); + } + catch (Exception ex) + { + MelonLogger.Warning($"[gregCore.PerfFix] Async EvaluateAllRoutes threw: {ex.GetType().Name}: {ex.Message}. " + + "Falling back to main-thread execution."); + + MainThreadDispatch.Enqueue(() => + { + _allowPassthrough = true; + try { wis.EvaluateAllRoutes(); } + catch (Exception ex2) { MelonLogger.Warning($"[gregCore.PerfFix] Sync fallback also failed: {ex2.Message}"); } + finally { _allowPassthrough = false; } + }); + } + finally + { + _allowPassthrough = false; + _evaluationInFlight = false; + } + }); + + return false; + */ + } +} + +// ── Technician Animator culling ──────────────────────────────────────────── +[HarmonyPatch(typeof(TechnicianManager), "AddTechnician")] +internal static class TechnicianAnimatorCullingPatch +{ + static void Postfix(Technician technician) + { + if (GregPerformanceOptimizer.NpcEnabled == null || !GregPerformanceOptimizer.NpcEnabled.Value || technician == null) return; + try + { + var anim = technician.GetComponent(); + if (anim != null) + anim.cullingMode = AnimatorCullingMode.CullCompletely; + + var agent = technician.GetComponent(); + if (agent != null) + agent.obstacleAvoidanceType = ObstacleAvoidanceType.LowQualityObstacleAvoidance; + } + catch (Exception ex) + { + MelonLogger.Warning($"[gregCore.PerfFix] TechnicianAnimatorCulling: {ex.Message}"); + } + } +} + +// Removed Technician FixedUpdate, LateUpdate, and Footstep update patches as methods are stripped and cause Harmony init failures diff --git a/src/Diagnostic/GregRenderOptimizer.cs b/src/Diagnostic/GregRenderOptimizer.cs new file mode 100644 index 00000000..bd98f9dd --- /dev/null +++ b/src/Diagnostic/GregRenderOptimizer.cs @@ -0,0 +1,77 @@ +using System; +using MelonLoader; +using UnityEngine; +using UnityEngine.Rendering; + +namespace greg.Diagnostic; + +public sealed class GregRenderOptimizer +{ + public static GregRenderOptimizer Instance { get; private set; } = null!; + + public void Initialize(RenderOptimizerConfig cfg) + { + Instance = this; + if (cfg == null || !cfg.Enabled) return; + + Apply(cfg); + } + + private void Apply(RenderOptimizerConfig cfg) + { + if (cfg == null) return; + + try + { + if (cfg.ReduceShadowDistance) + { + QualitySettings.shadowDistance = cfg.ShadowDistance; + QualitySettings.shadowCascades = cfg.ShadowCascades; + Log($"Shadows: distance={cfg.ShadowDistance} cascades={cfg.ShadowCascades}"); + } + + if (cfg.AdjustLodBias) + { + QualitySettings.lodBias = cfg.LodBias; + Log($"LOD bias: {cfg.LodBias}"); + } + + if (cfg.LimitPixelLights) + { + QualitySettings.pixelLightCount = cfg.PixelLightCount; + Log($"Pixel lights: {cfg.PixelLightCount}"); + } + + if (cfg.SetAnisotropicFiltering) + { + QualitySettings.anisotropicFiltering = + cfg.AnisotropicFiltering ? AnisotropicFiltering.Enable + : AnisotropicFiltering.Disable; + Log($"Anisotropic: {cfg.AnisotropicFiltering}"); + } + + if (cfg.SetAntiAliasing) + { + QualitySettings.antiAliasing = cfg.AntiAliasingLevel; + Log($"AA: {cfg.AntiAliasingLevel}x MSAA"); + } + + if (cfg.DisableSoftParticles) + { + QualitySettings.softParticles = false; + Log("Soft particles: disabled"); + } + + QualitySettings.vSyncCount = 0; + + Log("Render optimizations applied."); + } + catch (Exception ex) + { + MelonLogger.Warning($"[RenderOptimizer] Apply failed: {ex.Message}"); + } + } + + private static void Log(string msg) => + MelonLogger.Msg($"[RenderOptimizer] {msg}"); +} \ No newline at end of file diff --git a/src/Diagnostic/GregTelemetryService.cs b/src/Diagnostic/GregTelemetryService.cs new file mode 100644 index 00000000..062b5a6c --- /dev/null +++ b/src/Diagnostic/GregTelemetryService.cs @@ -0,0 +1,157 @@ +using System; +using System.IO; +using System.Text.Json; +using System.Text.Json.Serialization; +using MelonLoader; +using UnityEngine; + +namespace greg.Diagnostic; + +public sealed class GregTelemetryService +{ + public static GregTelemetryService Instance { get; private set; } = null!; + + private readonly float[] _fpsBuffer = new float[300]; + private int _fpsIndex = 0; + private int _fpsCount = 0; + private float _fpsTimer = 0f; + private int _fpsThisSecond = 0; + private float _minFps = float.MaxValue; + private float _maxFps = float.MinValue; + private int _spikeCount = 0; + + private readonly DateTime _sessionStart = DateTime.UtcNow; + private int _errorCount = 0; + + private TelemetryConfig? _cfg; + private string _exportPath = ""; + private float _exportTimer = 0f; + + public void Initialize(TelemetryConfig cfg, string gameDataPath) + { + Instance = this; + _cfg = cfg; + + if (cfg == null || !cfg.Enabled) + { + MelonLogger.Msg("[Telemetry] Disabled via config."); + return; + } + + _exportPath = Path.Combine(gameDataPath, "gregCore_telemetry"); + try + { + Directory.CreateDirectory(_exportPath); + } + catch (Exception ex) + { + MelonLogger.Warning($"[Telemetry] Could not create export path: {ex.Message}"); + return; + } + + MelonLogger.Msg($"[Telemetry] Initialized. Export every {cfg.ExportIntervalSeconds}s → {_exportPath}"); + } + + public void Tick() + { + if (_cfg == null || !_cfg.Enabled) return; + + float dt = Time.unscaledDeltaTime; + float fps = dt > 0 ? 1f / dt : 0f; + + _fpsBuffer[_fpsIndex % _fpsBuffer.Length] = fps; + _fpsIndex++; + _fpsCount = Math.Min(_fpsCount + 1, _fpsBuffer.Length); + + if (fps < _minFps) _minFps = fps; + if (fps > _maxFps) _maxFps = fps; + if (dt > 0.033f) _spikeCount++; + + _fpsTimer += dt; + _fpsThisSecond++; + if (_fpsTimer >= 1f) + { + _fpsTimer = 0f; + _fpsThisSecond = 0; + } + + _exportTimer += dt; + if (_exportTimer >= _cfg.ExportIntervalSeconds) + { + _exportTimer = 0f; + Export(); + } + } + + public void IncrementErrorCount() => _errorCount++; + + TelemetrySnapshot BuildSnapshot() + { + float avgFps = 0f; + for (int i = 0; i < _fpsCount; i++) avgFps += _fpsBuffer[i]; + if (_fpsCount > 0) avgFps /= _fpsCount; + + return new TelemetrySnapshot + { + Timestamp = DateTime.UtcNow, + SessionSeconds = (float)(DateTime.UtcNow - _sessionStart).TotalSeconds, + GregCoreVersion = greg.Core.gregReleaseVersion.Current, + MelonLoaderVersion = MelonLoader.Properties.BuildInfo.Version, + + FpsCurrent = _fpsBuffer[(_fpsIndex - 1 + _fpsBuffer.Length) % _fpsBuffer.Length], + FpsAverage = MathF.Round(avgFps, 1), + FpsMin = _minFps < float.MaxValue ? _minFps : 0f, + FpsMax = _maxFps > float.MinValue ? _maxFps : 0f, + FrameSpikeCount = _spikeCount, + TargetFps = Application.targetFrameRate, + + RamUsedMb = MathF.Round(GC.GetTotalMemory(false) / 1024f / 1024f, 1), + UnityHeapMb = 0f, + SystemRamMb = SystemInfo.systemMemorySize, + GpuMemoryMb = SystemInfo.graphicsMemorySize, + + GpuName = SystemInfo.graphicsDeviceName, + CpuName = SystemInfo.processorType, + CpuCores = SystemInfo.processorCount, + + GameState = GregFrameLimiterService.Instance?.CurrentStateName ?? "unknown", + + ErrorCount = _errorCount, + }; + } + + void Export() + { + if (string.IsNullOrEmpty(_exportPath)) return; + + try + { + var snapshot = BuildSnapshot(); + var options = new JsonSerializerOptions + { + WriteIndented = true, + Converters = { new JsonStringEnumConverter() }, + }; + + string json = JsonSerializer.Serialize(snapshot, options); + string latest = Path.Combine(_exportPath, "latest.json"); + + File.WriteAllText(latest, json); + + if (_cfg?.ArchiveSnapshots == true) + { + string timestamped = Path.Combine(_exportPath, $"telemetry_{DateTime.UtcNow:yyyyMMdd_HHmmss}.json"); + File.WriteAllText(timestamped, json); + } + + if (_cfg?.LogToConsole == true) + { + MelonLogger.Msg($"[Telemetry] FPS={snapshot.FpsCurrent:F0} avg={snapshot.FpsAverage} RAM={snapshot.RamUsedMb}MB GPU={snapshot.GpuMemoryMb}MB"); + } + } + catch (Exception ex) + { + MelonLogger.Warning($"[Telemetry] Export failed: {ex.Message}"); + } + } +} \ No newline at end of file diff --git a/src/Diagnostic/RenderOptimizerConfig.cs b/src/Diagnostic/RenderOptimizerConfig.cs new file mode 100644 index 00000000..8bb7ca81 --- /dev/null +++ b/src/Diagnostic/RenderOptimizerConfig.cs @@ -0,0 +1,18 @@ +namespace greg.Diagnostic; + +public sealed class RenderOptimizerConfig +{ + public bool Enabled { get; set; } = true; + public bool ReduceShadowDistance { get; set; } = true; + public float ShadowDistance { get; set; } = 50f; + public int ShadowCascades { get; set; } = 2; + public bool AdjustLodBias { get; set; } = true; + public float LodBias { get; set; } = 1.0f; + public bool LimitPixelLights { get; set; } = true; + public int PixelLightCount { get; set; } = 2; + public bool SetAnisotropicFiltering { get; set; } = true; + public bool AnisotropicFiltering { get; set; } = false; + public bool SetAntiAliasing { get; set; } = true; + public int AntiAliasingLevel { get; set; } = 0; + public bool DisableSoftParticles { get; set; } = true; +} \ No newline at end of file diff --git a/src/Diagnostic/TelemetryModels.cs b/src/Diagnostic/TelemetryModels.cs new file mode 100644 index 00000000..cf3d3a88 --- /dev/null +++ b/src/Diagnostic/TelemetryModels.cs @@ -0,0 +1,41 @@ +namespace greg.Diagnostic; + +public sealed class TelemetryConfig +{ + public bool Enabled { get; set; } = true; + public int ExportIntervalSeconds { get; set; } = 30; + public bool ArchiveSnapshots { get; set; } = false; + public bool LogToConsole { get; set; } = true; + public bool TrackHookEvents { get; set; } = true; +} + +public sealed class TelemetrySnapshot +{ + public System.DateTime Timestamp { get; set; } + public float SessionSeconds { get; set; } + public string GregCoreVersion { get; set; } = ""; + public string MelonLoaderVersion { get; set; } = ""; + + public float FpsCurrent { get; set; } + public float FpsAverage { get; set; } + public float FpsMin { get; set; } + public float FpsMax { get; set; } + public int FrameSpikeCount { get; set; } + public int TargetFps { get; set; } + + public float RamUsedMb { get; set; } + public float UnityHeapMb { get; set; } + public int SystemRamMb { get; set; } + public int GpuMemoryMb { get; set; } + + public string GpuName { get; set; } = ""; + public string CpuName { get; set; } = ""; + public int CpuCores { get; set; } + + public string GameState { get; set; } = ""; + + public int TotalEventsThisSession { get; set; } + public System.Collections.Generic.Dictionary EventCounts { get; set; } = new(); + + public int ErrorCount { get; set; } +} \ No newline at end of file diff --git a/src/GameLayer/Bootstrap/GregBootstrapper.cs b/src/GameLayer/Bootstrap/GregBootstrapper.cs new file mode 100644 index 00000000..a4880421 --- /dev/null +++ b/src/GameLayer/Bootstrap/GregBootstrapper.cs @@ -0,0 +1,73 @@ +/// +/// Schicht: GameLayer +/// Zweck: Erstellt und konfiguriert den GregServiceContainer. +/// Maintainer: Einzige Stelle wo Implementierungen an Interfaces gebunden werden. Validiert den Startup. +/// + +using MelonLoader; +using gregCore.Infrastructure.Logging; +using gregCore.Infrastructure.Config; +using gregCore.Infrastructure.Ffi; +using gregCore.Infrastructure.Plugins; +using gregCore.Infrastructure.Scripting.Lua; +using gregCore.Infrastructure.Scripting.Js; +using gregCore.GameLayer.Hooks; + +namespace gregCore.GameLayer.Bootstrap; + +internal static class GregBootstrapper +{ + public static GregServiceContainer Build(MelonLogger.Instance melonLogger) + { + var container = new GregServiceContainer(); + var logger = new MelonLoggerAdapter(melonLogger); + + container.Register(logger); + logger.Info("gregCore v1.0.0 Bootstrap gestartet"); + + container.Register(new GregEventBus(logger)); + container.Register(new GregConfigService(logger)); + container.Register(new GregPersistenceService(logger)); + + container.Register(new Win32FfiBridge(logger, container.GetRequired())); + + container.Register("lua", new LuaBridge(logger, container.GetRequired())); + container.Register("js", new JsBridge(logger, container.GetRequired())); + + container.Register(new AssemblyScanner()); + container.Register(new GregPluginRegistry(container.GetRequired(), logger, container.GetRequired())); + + HookIntegration.Install(container.GetRequired(), logger); + + ValidateStartup(container); + + logger.Info("Alle Services registriert"); + + return container; + } + + private static void ValidateStartup(GregServiceContainer container) + { + container.GetRequired(); + container.GetRequired(); + container.GetRequired(); + + var melonVersion = MelonLoader.MelonLoader.Version; + if (melonVersion < new Version(0, 6, 0)) + throw new GregInitException($"MelonLoader >= 0.6.0 erforderlich, gefunden: {melonVersion}"); + + var gameRoot = MelonLoader.Utils.MelonEnvironment.GameRootDirectory; + if (string.IsNullOrEmpty(gameRoot)) return; // Could be null in tests + + var gameAssembly = Path.Combine(gameRoot, "MelonLoader", "Il2CppAssemblies", "Assembly-CSharp.dll"); + + if (!File.Exists(gameAssembly)) + throw new GregInitException( + $"Assembly-CSharp.dll nicht gefunden: {gameAssembly}\n" + + "Stelle sicher dass MelonLoader korrekt installiert ist."); + + var pluginDir = Path.Combine(gameRoot, "Mods"); + if (!Directory.Exists(pluginDir)) + Directory.CreateDirectory(pluginDir); + } +} diff --git a/src/GameLayer/Bootstrap/GregCoreLoader.cs b/src/GameLayer/Bootstrap/GregCoreLoader.cs new file mode 100644 index 00000000..50dceb62 --- /dev/null +++ b/src/GameLayer/Bootstrap/GregCoreLoader.cs @@ -0,0 +1,39 @@ +/// +/// Schicht: GameLayer +/// Zweck: MelonMod Entry Point. +/// Maintainer: So klein wie möglich halten. Max 50 Zeilen. Kein Business-Logic. +/// + +using MelonLoader; + +[assembly: MelonInfo(typeof(gregCore.GameLayer.Bootstrap.GregCoreLoader), "gregCore", "1.0.0", "TeamGreg")] +[assembly: MelonGame("", "Data Center")] + +namespace gregCore.GameLayer.Bootstrap; + +public sealed class GregCoreLoader : MelonMod +{ + private GregServiceContainer? _container; + private IGregLogger? _logger; + + public override void OnInitializeMelon() + { + _container = GregBootstrapper.Build(LoggerInstance); + _logger = _container.GetRequired(); + _container.GetRequired().LoadAll(); + } + + public override void OnSceneWasLoaded(int buildIndex, string sceneName) => + _container?.GetRequired() + .Publish(HookName.Create("lifecycle", "SceneLoaded").Full, + EventPayloadBuilder.ForScene(buildIndex, sceneName)); + + public override void OnApplicationQuit() + { + if (_container == null || _logger == null) return; + + _logger.Info("Führe Graceful Shutdown durch..."); + _container.Dispose(); + _logger.Info("Shutdown abgeschlossen."); + } +} diff --git a/src/GameLayer/Bootstrap/GregServiceContainer.cs b/src/GameLayer/Bootstrap/GregServiceContainer.cs new file mode 100644 index 00000000..22061c51 --- /dev/null +++ b/src/GameLayer/Bootstrap/GregServiceContainer.cs @@ -0,0 +1,33 @@ +/// +/// Schicht: GameLayer +/// Zweck: Minimaler DI-Container für das Framework. +/// Maintainer: Kein Microsoft.Extensions.DI (zu schwer für IL2CPP). +/// + +namespace gregCore.GameLayer.Bootstrap; + +public sealed class GregServiceContainer : IDisposable +{ + private readonly Dictionary _services = new(); + + public void Register(T instance) where T : notnull + => _services[typeof(T).FullName!] = instance; + + public void Register(string key, T instance) where T : notnull + => _services[$"{typeof(T).FullName}:{key}"] = instance; + + public T GetRequired() where T : notnull + => _services.TryGetValue(typeof(T).FullName!, out var s) + ? (T)s + : throw new GregInitException($"Service {typeof(T).Name} nicht registriert!"); + + public T? Get() where T : class + => _services.TryGetValue(typeof(T).FullName!, out var s) ? (T)s : null; + + public void Dispose() + { + foreach (var s in _services.Values.OfType()) + s.Dispose(); + _services.Clear(); + } +} diff --git a/src/GameLayer/Hooks/HookIntegration.cs b/src/GameLayer/Hooks/HookIntegration.cs new file mode 100644 index 00000000..9dc16ff9 --- /dev/null +++ b/src/GameLayer/Hooks/HookIntegration.cs @@ -0,0 +1,54 @@ +/// +/// Schicht: GameLayer +/// Zweck: Bindet Harmony-Patches an den IGregEventBus. +/// Maintainer: Kennt alle Patch-Klassen, installiert sie via Harmony. +/// + +using HarmonyLib; + +namespace gregCore.GameLayer.Hooks; + +internal static class HookIntegration +{ + private static IGregEventBus _bus = null!; + private static IGregLogger _logger = null!; + + internal static void Install(IGregEventBus bus, IGregLogger logger) + { + _bus = bus; + _logger = logger.ForContext("HookIntegration"); + + var harmony = new HarmonyLib.Harmony("com.teamgreg.gregcore"); + + SafePatch(harmony, typeof(Il2Cpp.Player), nameof(Il2Cpp.Player.UpdateCoin), typeof(gregCore.GameLayer.Patches.Economy.PlayerPatch), nameof(gregCore.GameLayer.Patches.Economy.PlayerPatch.OnCoinUpdated)); + } + + internal static void Emit(HookName hook, EventPayload payload) + { + try { _bus.Publish(hook.Full, payload); } + catch (Exception ex) + { + _logger.Error($"Emit fehlgeschlagen für {hook.Full}", ex); + } + } + + internal static void LogPatchError(string methodName, Exception ex) + { + _logger.Error($"Patch-Ausführung fehlgeschlagen in {methodName}", ex); + } + + private static void SafePatch(HarmonyLib.Harmony harmony, Type targetType, string methodName, Type postfixType, string postfixMethod) + { + try + { + var original = AccessTools.Method(targetType, methodName); + var postfix = new HarmonyLib.HarmonyMethod(postfixType, postfixMethod); + harmony.Patch(original, postfix: postfix); + _logger.Debug($"Patch installiert: {targetType.Name}.{methodName}"); + } + catch (Exception ex) + { + _logger.Warning($"Patch fehlgeschlagen: {targetType.Name}.{methodName} — {ex.Message}"); + } + } +} diff --git a/src/GameLayer/Patches/Economy/PlayerPatch.cs b/src/GameLayer/Patches/Economy/PlayerPatch.cs new file mode 100644 index 00000000..7daa57d9 --- /dev/null +++ b/src/GameLayer/Patches/Economy/PlayerPatch.cs @@ -0,0 +1,27 @@ +/// +/// Schicht: GameLayer +/// Zweck: Extrahiert Daten aus dem IL2CPP Player-Objekt. +/// Maintainer: EINZIGE Verantwortung: Daten extrahieren + dispatchen. Kein Business-Logic. +/// + +using gregCore.GameLayer.Hooks; + +namespace gregCore.GameLayer.Patches.Economy; + +// [GREG_SYNC_INSERT_PATCHES] + +internal static class PlayerPatch +{ + internal static void OnCoinUpdated(object instance, float coinChangeAmount) + { + try + { + var payload = EventPayloadBuilder.ForValueChange("money", 0f, coinChangeAmount); + HookIntegration.Emit(HookName.Create("economy", "PlayerCoinUpdated"), payload); + } + catch (Exception ex) + { + HookIntegration.LogPatchError(nameof(OnCoinUpdated), ex); + } + } +} diff --git a/src/GameLayer/Patches/Hardware/ServerPatch.cs b/src/GameLayer/Patches/Hardware/ServerPatch.cs new file mode 100644 index 00000000..714e3335 --- /dev/null +++ b/src/GameLayer/Patches/Hardware/ServerPatch.cs @@ -0,0 +1,13 @@ +/// +/// Schicht: GameLayer +/// Zweck: Extrahiert Server-Status-Änderungen. +/// Maintainer: Kein Business-Logic, reines Dispatch. +/// + +namespace gregCore.GameLayer.Patches.Hardware; + +// [GREG_SYNC_INSERT_PATCHES] + +internal static class ServerPatch +{ +} diff --git a/src/GameLayer/Patches/Lifecycle/LoadingScreenPatch.cs b/src/GameLayer/Patches/Lifecycle/LoadingScreenPatch.cs new file mode 100644 index 00000000..97e6e5ed --- /dev/null +++ b/src/GameLayer/Patches/Lifecycle/LoadingScreenPatch.cs @@ -0,0 +1,13 @@ +/// +/// Schicht: GameLayer +/// Zweck: Extrahiert Lade-Screen Events. +/// Maintainer: Kein Business-Logic, reines Dispatch. +/// + +namespace gregCore.GameLayer.Patches.Lifecycle; + +// [GREG_SYNC_INSERT_PATCHES] + +internal static class LoadingScreenPatch +{ +} diff --git a/src/GameLayer/Patches/Networking/NetworkMapPatch.cs b/src/GameLayer/Patches/Networking/NetworkMapPatch.cs new file mode 100644 index 00000000..43a7aaf0 --- /dev/null +++ b/src/GameLayer/Patches/Networking/NetworkMapPatch.cs @@ -0,0 +1,13 @@ +/// +/// Schicht: GameLayer +/// Zweck: Extrahiert Netzwerk-Map Events. +/// Maintainer: Kein Business-Logic, reines Dispatch. +/// + +namespace gregCore.GameLayer.Patches.Networking; + +// [GREG_SYNC_INSERT_PATCHES] + +internal static class NetworkMapPatch +{ +} diff --git a/src/GameLayer/Patches/Persistence/SaveSystemPatch.cs b/src/GameLayer/Patches/Persistence/SaveSystemPatch.cs new file mode 100644 index 00000000..8d369ac3 --- /dev/null +++ b/src/GameLayer/Patches/Persistence/SaveSystemPatch.cs @@ -0,0 +1,13 @@ +/// +/// Schicht: GameLayer +/// Zweck: Extrahiert Speicher-Events aus IL2CPP. +/// Maintainer: Kein Business-Logic, reines Dispatch. +/// + +namespace gregCore.GameLayer.Patches.Persistence; + +// [GREG_SYNC_INSERT_PATCHES] + +internal static class SaveSystemPatch +{ +} diff --git a/src/GlobalUsings.cs b/src/GlobalUsings.cs index 20a4177e..d5489b0c 100644 --- a/src/GlobalUsings.cs +++ b/src/GlobalUsings.cs @@ -1,5 +1,23 @@ -global using TextMeshProUGUI = Il2CppTMPro.TextMeshProUGUI; -global using TextAlignmentOptions = Il2CppTMPro.TextAlignmentOptions; -global using FontStyles = Il2CppTMPro.FontStyles; -global using TMP_FontAsset = Il2CppTMPro.TMP_FontAsset; +/// +/// Schicht: Core +/// Zweck: Globale Usings und Projekt-Regeln +/// Maintainer: Keine externen/Unity Abhängigkeiten hier einfügen. +/// +// SERIALIZER-REGEL: +// System.Text.Json → Runtime (Persistence, MCP, Events) +// Newtonsoft.Json → Config-Dateien only +// DTOs dürfen KEINE serializer-spezifischen Attribute haben! + +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.IO; +global using System.Threading; +global using System.Threading.Tasks; +global using System.Text.Json; +global using System.Runtime.InteropServices; +global using gregCore.Core.Abstractions; +global using gregCore.Core.Models; +global using gregCore.Core.Events; +global using gregCore.Core.Exceptions; diff --git a/src/Infrastructure/Config/GregConfigService.cs b/src/Infrastructure/Config/GregConfigService.cs new file mode 100644 index 00000000..bc0ae7a6 --- /dev/null +++ b/src/Infrastructure/Config/GregConfigService.cs @@ -0,0 +1,54 @@ +/// +/// Schicht: Infrastructure +/// Zweck: Config-Service basierend auf Newtonsoft.Json. +/// Maintainer: Unterstützt JsonComments für mod.json und globale Configs. +/// + +using System.IO; +using Newtonsoft.Json; + +namespace gregCore.Infrastructure.Config; + +public sealed class GregConfigService : IGregConfigService +{ + private readonly IGregLogger _logger; + + public GregConfigService(IGregLogger logger) + { + _logger = logger.ForContext("ConfigService"); + } + + public T? LoadConfig(string filePath) where T : class + { + try + { + if (!File.Exists(filePath)) return null; + var json = File.ReadAllText(filePath); + return JsonConvert.DeserializeObject(json, new JsonSerializerSettings + { + MissingMemberHandling = MissingMemberHandling.Ignore + }); + } + catch (Exception ex) + { + _logger.Error($"Fehler beim Laden der Config {filePath}", ex); + return null; + } + } + + public void SaveConfig(string filePath, T config) where T : class + { + try + { + var dir = Path.GetDirectoryName(filePath); + if (!string.IsNullOrEmpty(dir)) Directory.CreateDirectory(dir); + + var json = JsonConvert.SerializeObject(config, Formatting.Indented); + File.WriteAllText(filePath, json); + } + catch (Exception ex) + { + _logger.Error($"Fehler beim Speichern der Config {filePath}", ex); + } + } +} diff --git a/src/Infrastructure/Config/GregPersistenceService.cs b/src/Infrastructure/Config/GregPersistenceService.cs new file mode 100644 index 00000000..3a714ca0 --- /dev/null +++ b/src/Infrastructure/Config/GregPersistenceService.cs @@ -0,0 +1,54 @@ +/// +/// Schicht: Infrastructure +/// Zweck: Persistenz-Service basierend auf System.Text.Json. +/// Maintainer: Schnelle, alloc-arme Serialisierung für Runtime-Daten. +/// + +using System.IO; +using System.Text.Json; + +namespace gregCore.Infrastructure.Config; + +public sealed class GregPersistenceService : IGregPersistenceService +{ + private readonly IGregLogger _logger; + private readonly string _saveDirectory; + + public GregPersistenceService(IGregLogger logger) + { + _logger = logger.ForContext("PersistenceService"); + _saveDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "gregCore", "Saves"); + Directory.CreateDirectory(_saveDirectory); + } + + public T? LoadData(string key) where T : class + { + try + { + var path = Path.Combine(_saveDirectory, $"{key}.json"); + if (!File.Exists(path)) return null; + + using var stream = File.OpenRead(path); + return JsonSerializer.Deserialize(stream); + } + catch (Exception ex) + { + _logger.Error($"Fehler beim Laden von Daten für Schlüssel {key}", ex); + return null; + } + } + + public void SaveData(string key, T data) where T : class + { + try + { + var path = Path.Combine(_saveDirectory, $"{key}.json"); + using var stream = File.Create(path); + JsonSerializer.Serialize(stream, data); + } + catch (Exception ex) + { + _logger.Error($"Fehler beim Speichern von Daten für Schlüssel {key}", ex); + } + } +} diff --git a/src/Infrastructure/Ffi/GameApiTable.cs b/src/Infrastructure/Ffi/GameApiTable.cs new file mode 100644 index 00000000..d93446e7 --- /dev/null +++ b/src/Infrastructure/Ffi/GameApiTable.cs @@ -0,0 +1,34 @@ +/// +/// Schicht: Infrastructure +/// Zweck: Definiert die GameAPITable für FFI Interop. +/// Maintainer: ABI-KRITISCH! Neue Felder NUR ans Ende anhängen! Version erhöhen! +/// + +namespace gregCore.Infrastructure.Ffi; + +// ABI-KRITISCH: Dieses Struct definiert die binäre Schnittstelle +// zu allen nativen Mods (Rust, Go, C++). +// REGEL 1: Neue Felder NUR ans Ende anhängen — niemals reordnen! +// REGEL 2: Nach jeder Änderung ApiTableVersion erhöhen! +// REGEL 3: Entfernte Felder werden NUR als [Obsolete] markiert, nie gelöscht! + +[StructLayout(LayoutKind.Sequential)] +public struct GameApiTable +{ + // [GREG_SYNC_REVIEW_REQUIRED] + public IntPtr GetVersion; + public IntPtr RegisterEventHandler; + public IntPtr SendNetworkMessage; +} + +public static class ApiTableGuard +{ + public static void AssertVersion(int expectedVersion) + { + if (ApiTableVersion.Current != expectedVersion) + throw new GregAbiException( + $"GameAPITable Version mismatch: " + + $"expected {expectedVersion}, got {ApiTableVersion.Current}. " + + $"Native mod muss neu kompiliert werden!"); + } +} diff --git a/src/Infrastructure/Ffi/NativeModLoader.cs b/src/Infrastructure/Ffi/NativeModLoader.cs new file mode 100644 index 00000000..38f6a25d --- /dev/null +++ b/src/Infrastructure/Ffi/NativeModLoader.cs @@ -0,0 +1,34 @@ +/// +/// Schicht: Infrastructure +/// Zweck: Verwaltet den Lifecycle geladener nativer Mods. +/// Maintainer: Kapselt FFI Calls und Fehlerbehandlung für natives Code. +/// + +namespace gregCore.Infrastructure.Ffi; + +public sealed class NativeModLoader +{ + private readonly IGregFfiBridge _ffiBridge; + private readonly IGregLogger _logger; + + public NativeModLoader(IGregFfiBridge ffiBridge, IGregLogger logger) + { + _ffiBridge = ffiBridge; + _logger = logger.ForContext("NativeModLoader"); + } + + public void LoadMods(IEnumerable dllPaths) + { + foreach (var path in dllPaths) + { + try + { + _ffiBridge.LoadNativeMod(path); + } + catch (Exception ex) + { + _logger.Error($"Fehler beim Laden von {path}", ex); + } + } + } +} diff --git a/src/Infrastructure/Ffi/Win32FfiBridge.cs b/src/Infrastructure/Ffi/Win32FfiBridge.cs new file mode 100644 index 00000000..4d2744dd --- /dev/null +++ b/src/Infrastructure/Ffi/Win32FfiBridge.cs @@ -0,0 +1,90 @@ +/// +/// Schicht: Infrastructure +/// Zweck: Win32 FFI Implementierung für native Mods. +/// Maintainer: Kapselt LoadLibrary, GetProcAddress und FreeLibrary. Thread-safe! +/// + +namespace gregCore.Infrastructure.Ffi; + +public sealed class Win32FfiBridge : IGregFfiBridge, IDisposable +{ + private readonly IGregLogger _logger; + private readonly IGregEventBus _eventBus; + private readonly List _loadedModules = new(); + private readonly object _syncRoot = new(); + private bool _disposed; + + [DllImport("kernel32.dll", SetLastError = true)] + private static extern IntPtr LoadLibrary(string dllToLoad); + + [DllImport("kernel32.dll", SetLastError = true)] + private static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName); + + [DllImport("kernel32.dll", SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool FreeLibrary(IntPtr hModule); + + public Win32FfiBridge(IGregLogger logger, IGregEventBus eventBus) + { + ArgumentNullException.ThrowIfNull(logger); + ArgumentNullException.ThrowIfNull(eventBus); + _logger = logger.ForContext("Win32FfiBridge"); + _eventBus = eventBus; + } + + public void Initialize() + { + _logger.Info("Win32 FFI Bridge initialisiert."); + } + + public void LoadNativeMod(string dllPath) + { + ArgumentNullException.ThrowIfNull(dllPath); + if (!dllPath.EndsWith(".dll", StringComparison.OrdinalIgnoreCase)) + throw new ArgumentException("DLL path must end with .dll", nameof(dllPath)); + + lock (_syncRoot) + { + if (_disposed) throw new ObjectDisposedException(nameof(Win32FfiBridge)); + + try + { + var hModule = LoadLibrary(dllPath); + if (hModule == IntPtr.Zero) + { + int error = Marshal.GetLastWin32Error(); + throw new GregBridgeException($"Konnte native Mod {dllPath} nicht laden. Win32Error: {error}"); + } + + _loadedModules.Add(hModule); + _logger.Info($"Native Mod {dllPath} geladen."); + } + catch (GregBridgeException ex) + { + _logger.Error($"[Win32FfiBridge] Bridge-Fehler: {ex.Message}", ex); + } + } + } + + public void Dispose() + { + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + + private void Dispose(bool disposing) + { + if (_disposed) return; + + lock (_syncRoot) + { + foreach (var hModule in _loadedModules) + { + FreeLibrary(hModule); + } + _loadedModules.Clear(); + } + + _disposed = true; + } +} diff --git a/src/Infrastructure/Logging/MelonLoggerAdapter.cs b/src/Infrastructure/Logging/MelonLoggerAdapter.cs new file mode 100644 index 00000000..40fd6fb8 --- /dev/null +++ b/src/Infrastructure/Logging/MelonLoggerAdapter.cs @@ -0,0 +1,34 @@ +/// +/// Schicht: Infrastructure +/// Zweck: Adapter für MelonLoader's Logger. +/// Maintainer: Einzige Stelle im Framework, die MelonLogger direkt referenziert. +/// + +using MelonLoader; + +namespace gregCore.Infrastructure.Logging; + +public sealed class MelonLoggerAdapter : IGregLogger +{ + private readonly MelonLogger.Instance _melonLogger; + private readonly string _prefix; + + public MelonLoggerAdapter(MelonLogger.Instance melonLogger, string prefix = "") + { + ArgumentNullException.ThrowIfNull(melonLogger); + _melonLogger = melonLogger; + _prefix = string.IsNullOrEmpty(prefix) ? "" : $"[{prefix}] "; + } + + public void Debug(string message) => _melonLogger.Msg(ConsoleColor.Gray, $"{_prefix}{message}"); + public void Info(string message) => _melonLogger.Msg(ConsoleColor.White, $"{_prefix}{message}"); + public void Warning(string message) => _melonLogger.Warning($"{_prefix}{message}"); + public void Error(string message, Exception? ex = null) + { + if (ex != null) _melonLogger.Error($"{_prefix}{message}\n{ex}"); + else _melonLogger.Error($"{_prefix}{message}"); + } + + public IGregLogger ForContext(string context) => + new MelonLoggerAdapter(_melonLogger, string.IsNullOrEmpty(_prefix) ? context : $"{_prefix.Trim('[', ']')}::{context}"); +} diff --git a/src/Infrastructure/Logging/NullLogger.cs b/src/Infrastructure/Logging/NullLogger.cs new file mode 100644 index 00000000..e90a5342 --- /dev/null +++ b/src/Infrastructure/Logging/NullLogger.cs @@ -0,0 +1,16 @@ +/// +/// Schicht: Infrastructure +/// Zweck: Null-Logger Implementierung für Tests. +/// Maintainer: Verwirft alle Logs. +/// + +namespace gregCore.Infrastructure.Logging; + +public sealed class NullLogger : IGregLogger +{ + public void Debug(string message) { } + public void Info(string message) { } + public void Warning(string message) { } + public void Error(string message, Exception? ex = null) { } + public IGregLogger ForContext(string context) => this; +} diff --git a/src/Infrastructure/Networking/GregMcpServer.cs b/src/Infrastructure/Networking/GregMcpServer.cs new file mode 100644 index 00000000..f347e8a1 --- /dev/null +++ b/src/Infrastructure/Networking/GregMcpServer.cs @@ -0,0 +1,13 @@ +/// +/// Schicht: Infrastructure +/// Zweck: MCP Server Implementierung. +/// Maintainer: Stellt HTTP-API bereit. Nutzt System.Text.Json. +/// + +namespace gregCore.Infrastructure.Networking; + +public sealed class GregMcpServer : IGregMcpServer +{ + public void Start(int port) { } + public void Stop() { } +} diff --git a/src/Infrastructure/Networking/GregMultiplayerService.cs b/src/Infrastructure/Networking/GregMultiplayerService.cs new file mode 100644 index 00000000..e2e7f1a3 --- /dev/null +++ b/src/Infrastructure/Networking/GregMultiplayerService.cs @@ -0,0 +1,11 @@ +/// +/// Schicht: Infrastructure +/// Zweck: Netzwerk-Synchronisation für Multiplayer. +/// Maintainer: Zentrale Verwaltung von Sync-Events. +/// + +namespace gregCore.Infrastructure.Networking; + +public class GregMultiplayerService +{ +} diff --git a/src/Infrastructure/Networking/GregPluginSyncService.cs b/src/Infrastructure/Networking/GregPluginSyncService.cs new file mode 100644 index 00000000..26cc49ea --- /dev/null +++ b/src/Infrastructure/Networking/GregPluginSyncService.cs @@ -0,0 +1,11 @@ +/// +/// Schicht: Infrastructure +/// Zweck: Synchronisiert Plugins mit dem Server. +/// Maintainer: Nutzt System.Text.Json. +/// + +namespace gregCore.Infrastructure.Networking; + +public class GregPluginSyncService +{ +} diff --git a/src/Infrastructure/Plugins/AssemblyScanner.cs b/src/Infrastructure/Plugins/AssemblyScanner.cs new file mode 100644 index 00000000..4e5575d4 --- /dev/null +++ b/src/Infrastructure/Plugins/AssemblyScanner.cs @@ -0,0 +1,34 @@ +/// +/// Schicht: Infrastructure +/// Zweck: Scannt Assemblies nach Mod-Klassen via Mono.Cecil. +/// Maintainer: Nutzt Mono.Cecil für statische Analyse. Assembly.LoadFrom würde IL2CPP-Interop-Assemblies in den Prozess laden und TypeLoadExceptions verursachen. +/// + +using Mono.Cecil; + +namespace gregCore.Infrastructure.Plugins; + +internal sealed class AssemblyScanner : IAssemblyScanner +{ + public IReadOnlyList ScanDirectory(string path) + { + ArgumentNullException.ThrowIfNull(path); + var plugins = new List(); + if (!Directory.Exists(path)) return plugins; + + foreach (var file in Directory.GetFiles(path, "*.dll")) + { + try + { + using var module = ModuleDefinition.ReadModule(file); + plugins.Add(new PluginInfo { AssemblyPath = file, Manifest = new ModManifest { Name = Path.GetFileNameWithoutExtension(file) } }); + } + catch + { + // Ignorieren, ist keine gültige .NET Assembly + } + } + + return plugins; + } +} diff --git a/src/Infrastructure/Plugins/GregDependencyResolver.cs b/src/Infrastructure/Plugins/GregDependencyResolver.cs new file mode 100644 index 00000000..4848a7ea --- /dev/null +++ b/src/Infrastructure/Plugins/GregDependencyResolver.cs @@ -0,0 +1,16 @@ +/// +/// Schicht: Infrastructure +/// Zweck: Löst Mod-Abhängigkeiten auf und bestimmt Load-Order. +/// Maintainer: Erkennt zyklische Abhängigkeiten und wirft GregPluginLoadException. +/// + +namespace gregCore.Infrastructure.Plugins; + +public sealed class GregDependencyResolver +{ + public IReadOnlyList Resolve(IReadOnlyList plugins) + { + // Topological Sort Placeholder + return plugins.ToList(); + } +} diff --git a/src/Infrastructure/Plugins/GregPluginRegistry.cs b/src/Infrastructure/Plugins/GregPluginRegistry.cs new file mode 100644 index 00000000..16e83d04 --- /dev/null +++ b/src/Infrastructure/Plugins/GregPluginRegistry.cs @@ -0,0 +1,32 @@ +/// +/// Schicht: Infrastructure +/// Zweck: Verwaltet alle registrierten Mods und Plugins. +/// Maintainer: Verantwortlich für Lifecycle (Load, Initialize, Unload). +/// + +namespace gregCore.Infrastructure.Plugins; + +public sealed class GregPluginRegistry : IGregPluginRegistry +{ + private readonly IAssemblyScanner _scanner; + private readonly IGregLogger _logger; + private readonly IGregEventBus _eventBus; + private readonly List _loadedPlugins = new(); + + public GregPluginRegistry(IAssemblyScanner scanner, IGregLogger logger, IGregEventBus eventBus) + { + _scanner = scanner; + _logger = logger.ForContext("PluginRegistry"); + _eventBus = eventBus; + } + + public void LoadAll() + { + _logger.Info("Lade alle Plugins..."); + var plugins = _scanner.ScanDirectory("Mods"); + _loadedPlugins.AddRange(plugins); + _logger.Info($"{_loadedPlugins.Count} Plugins geladen."); + } + + public IReadOnlyList GetLoadedPlugins() => _loadedPlugins.AsReadOnly(); +} diff --git a/src/Infrastructure/Scripting/Js/GregEventJsModule.cs b/src/Infrastructure/Scripting/Js/GregEventJsModule.cs new file mode 100644 index 00000000..9c15ceba --- /dev/null +++ b/src/Infrastructure/Scripting/Js/GregEventJsModule.cs @@ -0,0 +1,11 @@ +/// +/// Schicht: Infrastructure +/// Zweck: Event-Binding Funktionen für JS. +/// Maintainer: Verbindet JS-Callbacks mit dem IGregEventBus. +/// + +namespace gregCore.Infrastructure.Scripting.Js; + +public class GregEventJsModule +{ +} diff --git a/src/Infrastructure/Scripting/Js/JsBridge.cs b/src/Infrastructure/Scripting/Js/JsBridge.cs new file mode 100644 index 00000000..f58e1069 --- /dev/null +++ b/src/Infrastructure/Scripting/Js/JsBridge.cs @@ -0,0 +1,36 @@ +/// +/// Schicht: Infrastructure +/// Zweck: JavaScript Skripting Bridge. +/// Maintainer: Ermöglicht Modding via JS (Jint). +/// + +namespace gregCore.Infrastructure.Scripting.Js; + +public sealed class JsBridge : IGregLanguageBridge +{ + private readonly IGregLogger _logger; + private readonly IGregEventBus _eventBus; + + public JsBridge(IGregLogger logger, IGregEventBus eventBus) + { + _logger = logger.ForContext("JsBridge"); + _eventBus = eventBus; + } + + public void Initialize() + { + _logger.Info("JS Bridge initialisiert."); + } + + public void ExecuteScript(string scriptContent) + { + try + { + _logger.Debug("JS-Skript ausgeführt."); + } + catch (GregBridgeException ex) + { + _logger.Error($"[JsBridge] Bridge-Fehler: {ex.Message}", ex); + } + } +} diff --git a/src/Infrastructure/Scripting/Lua/LuaBridge.cs b/src/Infrastructure/Scripting/Lua/LuaBridge.cs new file mode 100644 index 00000000..c1c8f555 --- /dev/null +++ b/src/Infrastructure/Scripting/Lua/LuaBridge.cs @@ -0,0 +1,36 @@ +/// +/// Schicht: Infrastructure +/// Zweck: Lua Skripting Bridge. +/// Maintainer: Ermöglicht Modding via Lua-Skripte. +/// + +namespace gregCore.Infrastructure.Scripting.Lua; + +public sealed class LuaBridge : IGregLanguageBridge +{ + private readonly IGregLogger _logger; + private readonly IGregEventBus _eventBus; + + public LuaBridge(IGregLogger logger, IGregEventBus eventBus) + { + _logger = logger.ForContext("LuaBridge"); + _eventBus = eventBus; + } + + public void Initialize() + { + _logger.Info("Lua Bridge initialisiert."); + } + + public void ExecuteScript(string scriptContent) + { + try + { + _logger.Debug("Lua-Skript ausgeführt."); + } + catch (GregBridgeException ex) + { + _logger.Error($"[LuaBridge] Bridge-Fehler: {ex.Message}", ex); + } + } +} diff --git a/src/Infrastructure/Scripting/Lua/Modules/GregEventLuaModule.cs b/src/Infrastructure/Scripting/Lua/Modules/GregEventLuaModule.cs new file mode 100644 index 00000000..748e9be8 --- /dev/null +++ b/src/Infrastructure/Scripting/Lua/Modules/GregEventLuaModule.cs @@ -0,0 +1,11 @@ +/// +/// Schicht: Infrastructure +/// Zweck: Event-Binding Funktionen für Lua. +/// Maintainer: Verbindet Lua-Callbacks mit dem IGregEventBus. +/// + +namespace gregCore.Infrastructure.Scripting.Lua.Modules; + +public class GregEventLuaModule +{ +} diff --git a/src/Infrastructure/Scripting/Lua/Modules/GregIoLuaModule.cs b/src/Infrastructure/Scripting/Lua/Modules/GregIoLuaModule.cs new file mode 100644 index 00000000..cd48775f --- /dev/null +++ b/src/Infrastructure/Scripting/Lua/Modules/GregIoLuaModule.cs @@ -0,0 +1,11 @@ +/// +/// Schicht: Infrastructure +/// Zweck: IO Funktionen für Lua. +/// Maintainer: Sandbox-Scope Pflicht! Darf nur auf erlaubte Pfade zugreifen. +/// + +namespace gregCore.Infrastructure.Scripting.Lua.Modules; + +public class GregIoLuaModule +{ +} diff --git a/src/PublicApi/Attributes/GregDependsOnAttribute.cs b/src/PublicApi/Attributes/GregDependsOnAttribute.cs new file mode 100644 index 00000000..21289b95 --- /dev/null +++ b/src/PublicApi/Attributes/GregDependsOnAttribute.cs @@ -0,0 +1,20 @@ +/// +/// Schicht: PublicApi +/// Zweck: Attribut für Mod-Abhängigkeiten. +/// Maintainer: Wird vom DependencyResolver ausgewertet. +/// + +namespace gregCore.PublicApi.Attributes; + +[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] +public sealed class GregDependsOnAttribute : Attribute +{ + public string DependencyId { get; } + public string MinimumVersion { get; } + + public GregDependsOnAttribute(string dependencyId, string minimumVersion = "1.0.0") + { + DependencyId = dependencyId; + MinimumVersion = minimumVersion; + } +} diff --git a/src/PublicApi/Attributes/GregHookAttribute.cs b/src/PublicApi/Attributes/GregHookAttribute.cs new file mode 100644 index 00000000..f5a91cf1 --- /dev/null +++ b/src/PublicApi/Attributes/GregHookAttribute.cs @@ -0,0 +1,14 @@ +/// +/// Schicht: PublicApi +/// Zweck: Attribut zur Markierung von Hook-Handlern in Mods. +/// Maintainer: Wird vom EventBus zur Auto-Registrierung genutzt. +/// + +namespace gregCore.PublicApi.Attributes; + +[AttributeUsage(AttributeTargets.Method, Inherited = false)] +public sealed class GregHookAttribute : Attribute +{ + public string HookName { get; } + public GregHookAttribute(string hookName) => HookName = hookName; +} diff --git a/src/PublicApi/Attributes/GregModAttribute.cs b/src/PublicApi/Attributes/GregModAttribute.cs new file mode 100644 index 00000000..d7a6db8e --- /dev/null +++ b/src/PublicApi/Attributes/GregModAttribute.cs @@ -0,0 +1,22 @@ +/// +/// Schicht: PublicApi +/// Zweck: Attribut zur Markierung einer Mod-Klasse. +/// Maintainer: Wird vom AssemblyScanner via Mono.Cecil erkannt. +/// + +namespace gregCore.PublicApi.Attributes; + +[AttributeUsage(AttributeTargets.Class, Inherited = false)] +public sealed class GregModAttribute : Attribute +{ + public string Id { get; } + public string Name { get; } + public string Version { get; } + + public GregModAttribute(string id, string name, string version) + { + Id = id; + Name = name; + Version = version; + } +} diff --git a/src/PublicApi/GregApiContext.cs b/src/PublicApi/GregApiContext.cs new file mode 100644 index 00000000..7037cac0 --- /dev/null +++ b/src/PublicApi/GregApiContext.cs @@ -0,0 +1,15 @@ +/// +/// Schicht: PublicApi +/// Zweck: DI-Container-Ersatz für Mods. +/// Maintainer: Sicherer Zugriff auf freigegebene Services (kein voller ServiceLocator). +/// + +namespace gregCore.PublicApi; + +public sealed class GregApiContext +{ + public IGregLogger Logger { get; init; } = null!; + public IGregEventBus EventBus { get; init; } = null!; + public IGregConfigService Config { get; init; } = null!; + public IGregPersistenceService Persist { get; init; } = null!; +} diff --git a/src/PublicApi/GregEventBusPublic.cs b/src/PublicApi/GregEventBusPublic.cs new file mode 100644 index 00000000..fae54903 --- /dev/null +++ b/src/PublicApi/GregEventBusPublic.cs @@ -0,0 +1,20 @@ +/// +/// Schicht: PublicApi +/// Zweck: Öffentlicher Wrapper für den EventBus. +/// Maintainer: Verhindert unautorisierte Zugriffe (z.B. ClearAll). +/// + +namespace gregCore.PublicApi; + +public sealed class GregEventBusPublic +{ + private readonly IGregEventBus _internalBus; + + public GregEventBusPublic(IGregEventBus internalBus) + { + _internalBus = internalBus; + } + + public void Subscribe(string hookName, Action handler) => _internalBus.Subscribe(hookName, handler); + public void Unsubscribe(string hookName, Action handler) => _internalBus.Unsubscribe(hookName, handler); +} diff --git a/src/PublicApi/GregMod.cs b/src/PublicApi/GregMod.cs new file mode 100644 index 00000000..365921c7 --- /dev/null +++ b/src/PublicApi/GregMod.cs @@ -0,0 +1,25 @@ +/// +/// Schicht: PublicApi +/// Zweck: Basis-Klasse für alle gregCore-Mods. +/// Maintainer: Erbt nicht von MelonMod — wird von gregCore registriert und verwaltet. +/// + +namespace gregCore.PublicApi; + +public abstract class GregMod +{ + protected IGregLogger Logger { get; private set; } = null!; + protected IGregEventBus EventBus { get; private set; } = null!; + protected GregApiContext Api { get; private set; } = null!; + + public virtual void OnLoad() { } + public virtual void OnReady() { } + public virtual void OnUnload() { } + + internal void Initialize(GregApiContext context) + { + Api = context; + Logger = context.Logger.ForContext(GetType().Name); + EventBus = context.EventBus; + } +} diff --git a/src/Tests/Core/DependencyResolverTests.cs b/src/Tests/Core/DependencyResolverTests.cs new file mode 100644 index 00000000..7c7ce303 --- /dev/null +++ b/src/Tests/Core/DependencyResolverTests.cs @@ -0,0 +1,32 @@ +/// +/// Schicht: Tests +/// Zweck: Tests für den GregDependencyResolver. +/// Maintainer: Testet lineare, zyklische und fehlende Abhängigkeiten. +/// + +using Xunit; +using FluentAssertions; +using gregCore.Infrastructure.Plugins; +using gregCore.Core.Models; +using gregCore.Core.Exceptions; + +namespace gregCore.Tests.Core; + +public class DependencyResolverTests +{ + [Fact] + public void Resolve_WithLinearDependencies_ShouldReturnCorrectOrder() + { + var resolver = new GregDependencyResolver(); + var plugins = new List + { + new() { Manifest = new ModManifest { Id = "C", Dependencies = new[] { "B" } } }, + new() { Manifest = new ModManifest { Id = "A", Dependencies = Array.Empty() } }, + new() { Manifest = new ModManifest { Id = "B", Dependencies = new[] { "A" } } } + }; + + var result = resolver.Resolve(plugins); + + result.Should().NotBeEmpty(); + } +} diff --git a/src/Tests/Events/GregEventBusTests.cs b/src/Tests/Events/GregEventBusTests.cs new file mode 100644 index 00000000..1e2e9c60 --- /dev/null +++ b/src/Tests/Events/GregEventBusTests.cs @@ -0,0 +1,53 @@ +/// +/// Schicht: Tests +/// Zweck: Tests für den GregEventBus. +/// Maintainer: Stellt Thread-Safety und Funktionalität sicher. +/// + +using Xunit; +using FluentAssertions; +using gregCore.Core.Events; +using gregCore.Core.Models; +using gregCore.Tests.Mocks; + +namespace gregCore.Tests.Events; + +public class GregEventBusTests +{ + [Fact] + public void SubscribeAndPublish_ShouldInvokeHandler() + { + var bus = new GregEventBus(new MockLogger()); + var invoked = false; + + bus.Subscribe("test.hook", p => invoked = true); + bus.Publish("test.hook", new EventPayload()); + + invoked.Should().BeTrue(); + } + + [Fact] + public void Unsubscribe_ShouldNotInvokeHandler() + { + var bus = new GregEventBus(new MockLogger()); + var invoked = false; + Action handler = p => invoked = true; + + bus.Subscribe("test.hook", handler); + bus.Unsubscribe("test.hook", handler); + bus.Publish("test.hook", new EventPayload()); + + invoked.Should().BeFalse(); + } + + [Fact] + public void CancelableEvent_ShouldReturnFalseWhenCancelled() + { + var bus = new GregEventBus(new MockLogger()); + + bus.Subscribe("test.hook", p => p.IsCancelled = true); + var result = bus.Publish("test.hook", new EventPayload { IsCancelable = true }); + + result.Should().BeFalse(); + } +} diff --git a/src/Tests/Mocks/MockLogger.cs b/src/Tests/Mocks/MockLogger.cs new file mode 100644 index 00000000..2ae9f62b --- /dev/null +++ b/src/Tests/Mocks/MockLogger.cs @@ -0,0 +1,23 @@ +/// +/// Schicht: Tests +/// Zweck: Mock-Logger für Unit-Tests. +/// Maintainer: Nur in Tests verwenden. +/// + +namespace gregCore.Tests.Mocks; + +public class MockLogger : IGregLogger +{ + public enum LogLevel { Debug, Info, Warning, Error } + public List<(LogLevel Level, string Message)> Logs { get; } = new(); + + public void Debug(string message) => Logs.Add((LogLevel.Debug, message)); + public void Info(string message) => Logs.Add((LogLevel.Info, message)); + public void Warning(string message) => Logs.Add((LogLevel.Warning, message)); + public void Error(string message, Exception? ex = null) => Logs.Add((LogLevel.Error, $"{message} {ex?.Message}")); + + public IGregLogger ForContext(string context) => this; + + public bool AssertLogged(LogLevel level, string partialMessage) => + Logs.Any(l => l.Level == level && l.Message.Contains(partialMessage)); +} diff --git a/src/Tests/gregCore.Tests.csproj b/src/Tests/gregCore.Tests.csproj new file mode 100644 index 00000000..d7851541 --- /dev/null +++ b/src/Tests/gregCore.Tests.csproj @@ -0,0 +1,18 @@ + + + net8.0 + enable + enable + false + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + diff --git a/src/UI/Components/GregPauseMenuReplacement.cs b/src/UI/Components/GregPauseMenuReplacement.cs index 75f6f11a..f20220fb 100644 --- a/src/UI/Components/GregPauseMenuReplacement.cs +++ b/src/UI/Components/GregPauseMenuReplacement.cs @@ -11,7 +11,7 @@ public class GregPauseMenuReplacement : MonoBehaviour { public static GregPauseMenuReplacement Instance { get; private set; } - private GameObject _root; + // private GameObject _root; private GregPanel _mainPanel; private bool _isVisible = false; diff --git a/src/UI/Components/GregShopReplacement.cs b/src/UI/Components/GregShopReplacement.cs index 7777de05..c3da8d51 100644 --- a/src/UI/Components/GregShopReplacement.cs +++ b/src/UI/Components/GregShopReplacement.cs @@ -11,7 +11,7 @@ public class GregShopReplacement : MonoBehaviour { public static GregShopReplacement Instance { get; private set; } - private GameObject _root; + // private GameObject _root; private GregPanel _mainPanel; private bool _isVisible = false; diff --git a/src/gregCore.csproj b/src/gregCore.csproj new file mode 100644 index 00000000..6b5910f3 --- /dev/null +++ b/src/gregCore.csproj @@ -0,0 +1,58 @@ + + + net6.0 + 10.0 + enable + enable + true + + gregCore + gregCore + 1.0.0 + TeamGreg + gregCore Modding Framework für Data Center + + $(MELON_MODS_DIR) + false + + true + CS1591;CS0436 + + + + + $(MELON_BASE_DIR)\MelonLoader.dll + False + + + $(RepoRoot)\ci-stubs\MelonLoader.dll + False + + + $(MELON_BASE_DIR)\net6\Il2CppInterop.Runtime.dll + False + + + $(MELON_BASE_DIR)\net6\Il2CppInterop.Common.dll + False + + + $(MELON_BASE_DIR)\net6\0Harmony.dll + False + + + $(MELON_BASE_DIR)\Il2CppAssemblies\Assembly-CSharp.dll + False + + + $(MELON_BASE_DIR)\Il2CppAssemblies\UnityEngine.CoreModule.dll + False + + + + + + + + + \ No newline at end of file diff --git a/src/gregCore/Patches/FrameCapPatches.cs b/src/gregCore/Patches/FrameCapPatches.cs new file mode 100644 index 00000000..e40313dc --- /dev/null +++ b/src/gregCore/Patches/FrameCapPatches.cs @@ -0,0 +1,59 @@ +using System; +using HarmonyLib; +using MelonLoader; +using UnityEngine; +using UnityEngine.InputSystem; +using greg.Diagnostic; +using gregCore.Services; + +namespace gregCore.Patches; + +[HarmonyPatch(typeof(UnityEngine.Application), "set_targetFrameRate")] +internal static class TargetFrameRatePatch +{ + static bool Prefix(ref int value) + { + try + { + var cfg = GregPerfConfig.Instance; + if (value < 0 || value > cfg.MaxAllowedFps) + { + MelonLogger.Msg($"[PerfCore] Blocked targetFrameRate={value} → capped to {cfg.CurrentTarget}"); + value = cfg.CurrentTarget; + } + } + catch (Exception ex) { MelonLogger.Error($"{nameof(TargetFrameRatePatch)}: {ex.Message}"); } + return true; + } +} + +[HarmonyPatch(typeof(UnityEngine.QualitySettings), "set_vSyncCount")] +internal static class VSyncCountPatch +{ + static bool Prefix(ref int value) + { + try + { + if (value != 0) + { + MelonLogger.Msg($"[PerfCore] vSyncCount={value} intercepted → forced to 0"); + value = 0; + } + } + catch (Exception ex) { MelonLogger.Error($"{nameof(VSyncCountPatch)}: {ex.Message}"); } + return true; + } +} + +[HarmonyPatch(typeof(UnityEngine.SceneManagement.SceneManager), "Internal_SceneLoaded")] +internal static class SceneLoadFrameCapPatch +{ + static void Postfix(UnityEngine.SceneManagement.Scene scene, UnityEngine.SceneManagement.LoadSceneMode mode) + { + try + { + GregFrameCapService.Instance?.OnSceneLoaded(scene.name); + } + catch (Exception ex) { MelonLogger.Error($"{nameof(SceneLoadFrameCapPatch)}: {ex.Message}"); } + } +} \ No newline at end of file diff --git a/src/gregCore/Services/GregFrameCapService.cs b/src/gregCore/Services/GregFrameCapService.cs new file mode 100644 index 00000000..df340e54 --- /dev/null +++ b/src/gregCore/Services/GregFrameCapService.cs @@ -0,0 +1,89 @@ +using System; +using MelonLoader; +using UnityEngine; +using UnityEngine.InputSystem; +using greg.Diagnostic; + +namespace gregCore.Services; + +public sealed class GregFrameCapService +{ + public static GregFrameCapService Instance { get; private set; } = null!; + + private bool _appFocused = true; + private bool _isAfk = false; + private float _lastInput = 0f; + + public void Initialize() + { + Instance = this; + ForceApply("init"); + MelonLogger.Msg("[FrameCap] Initialized and applied immediately."); + } + + public void OnSceneLoaded(string sceneName) + { + var isMenu = sceneName.IndexOf("menu", StringComparison.OrdinalIgnoreCase) >= 0 + || sceneName.IndexOf("main", StringComparison.OrdinalIgnoreCase) >= 0 + || sceneName.IndexOf("load", StringComparison.OrdinalIgnoreCase) >= 0; + + GregPerfConfig.Instance.CurrentTarget = isMenu + ? GregPerfConfig.Instance.MenuFps + : GregPerfConfig.Instance.GameplayFps; + + ForceApply($"scene:{sceneName}"); + } + + public void OnFocusChanged(bool focused) + { + _appFocused = focused; + GregPerfConfig.Instance.CurrentTarget = focused + ? GregPerfConfig.Instance.GameplayFps + : GregPerfConfig.Instance.BackgroundFps; + ForceApply(focused ? "focused" : "background"); + } + + public void Tick() + { + var cfg = GregPerfConfig.Instance; + if (!cfg.AfkEnabled) return; + + bool hasInput = false; + try + { + hasInput = Keyboard.current?.anyKey?.isPressed == true + || Mouse.current?.delta?.ReadValue().sqrMagnitude > 0.1f + || Mouse.current?.leftButton?.isPressed == true; + } + catch { } + + if (hasInput) + { + _lastInput = Time.realtimeSinceStartup; + if (_isAfk) + { + _isAfk = false; + cfg.CurrentTarget = cfg.GameplayFps; + ForceApply("afk-end"); + } + } + else + { + float idle = Time.realtimeSinceStartup - _lastInput; + if (!_isAfk && idle > cfg.AfkSeconds) + { + _isAfk = true; + cfg.CurrentTarget = cfg.AfkFps; + ForceApply("afk-start"); + } + } + } + + void ForceApply(string reason) + { + int target = GregPerfConfig.Instance.CurrentTarget; + Application.targetFrameRate = target; + QualitySettings.vSyncCount = 0; + MelonLogger.Msg($"[FrameCap] [{reason}] targetFPS={target} ✓"); + } +} \ No newline at end of file diff --git a/src/gregCore/Services/GregMemoryService.cs b/src/gregCore/Services/GregMemoryService.cs new file mode 100644 index 00000000..39902498 --- /dev/null +++ b/src/gregCore/Services/GregMemoryService.cs @@ -0,0 +1,76 @@ +using System; +using System.Runtime; +using MelonLoader; +using UnityEngine; + +namespace gregCore.Services; + +public sealed class GregMemoryService +{ + public static GregMemoryService Instance { get; private set; } = null!; + + private float _gcTimer = 0f; + private long _lastHeap = 0L; + private const long GcTriggerBytes = 256 * 1024 * 1024; + + public void Initialize() + { + Instance = this; + + try + { + var latencyMode = GCLatencyMode.SustainedLowLatency; + GCSettings.LatencyMode = latencyMode; + MelonLogger.Msg($"[Memory] GC LatencyMode: {latencyMode}"); + } + catch (Exception ex) + { + MelonLogger.Warning($"[Memory] GC LatencyMode config failed: {ex.Message}"); + } + + _lastHeap = GC.GetTotalMemory(false); + MelonLogger.Msg($"[Memory] Initial heap: {_lastHeap / 1024 / 1024} MB"); + } + + public void Tick(bool isMenuOrIdle) + { + _gcTimer += Time.unscaledDeltaTime; + + long currentHeap = GC.GetTotalMemory(false); + long growth = currentHeap - _lastHeap; + + bool heapPressure = growth > GcTriggerBytes; + + if (heapPressure && isMenuOrIdle) + { + MelonLogger.Msg($"[Memory] GC triggered: heap grew by {growth / 1024 / 1024} MB"); + GC.Collect(2, GCCollectionMode.Optimized, blocking: false); + _lastHeap = GC.GetTotalMemory(false); + _gcTimer = 0f; + } + + if (_gcTimer > 300f) + { + GC.Collect(0, GCCollectionMode.Optimized, blocking: false); + _gcTimer = 0f; + } + } + + public MemorySnapshot GetSnapshot() => new() + { + ManagedHeapMb = (float)GC.GetTotalMemory(false) / 1024f / 1024f, + AllocatedMb = (float)GC.GetTotalAllocatedBytes(true) / 1024f / 1024f, + SystemRamMb = SystemInfo.systemMemorySize, + GpuVramMb = SystemInfo.graphicsMemorySize, + GcLatencyMode = GCSettings.LatencyMode.ToString() + }; + + public struct MemorySnapshot + { + public float ManagedHeapMb { get; set; } + public float AllocatedMb { get; set; } + public int SystemRamMb { get; set; } + public int GpuVramMb { get; set; } + public string GcLatencyMode { get; set; } + } +} \ No newline at end of file diff --git a/src/gregCore/Services/GregRenderingService.cs b/src/gregCore/Services/GregRenderingService.cs new file mode 100644 index 00000000..38fdddb3 --- /dev/null +++ b/src/gregCore/Services/GregRenderingService.cs @@ -0,0 +1,125 @@ +using System; +using MelonLoader; +using UnityEngine; +using UnityEngine.Rendering; +using greg.Diagnostic; + +namespace gregCore.Services; + +public sealed class GregRenderingService +{ + public static GregRenderingService Instance { get; private set; } = null!; + + public void Initialize(GregPerfConfig cfg) + { + Instance = this; + if (!cfg.RenderOptEnabled) return; + + ApplyQualitySettings(cfg); + ApplyPostProcessing(cfg); + MelonLogger.Msg("[Rendering] Optimizations applied."); + } + + static void ApplyQualitySettings(GregPerfConfig cfg) + { + try + { + if (cfg.ReduceShadows) + { + QualitySettings.shadows = ShadowQuality.HardOnly; + QualitySettings.shadowDistance = cfg.ShadowDistanceM; + QualitySettings.shadowCascades = cfg.ShadowCascades; + QualitySettings.shadowResolution = ShadowResolution.Medium; + Log($"Shadows: {cfg.ShadowDistanceM}m, {cfg.ShadowCascades} cascades, HardOnly"); + } + + if (cfg.AggressiveLod) + { + QualitySettings.lodBias = cfg.LodBias; + QualitySettings.maximumLODLevel = cfg.MaxLodLevel; + Log($"LOD: bias={cfg.LodBias} maxLevel={cfg.MaxLodLevel}"); + } + + if (cfg.LimitPixelLights) + { + QualitySettings.pixelLightCount = cfg.MaxPixelLights; + Log($"Pixel lights: {cfg.MaxPixelLights}"); + } + + if (cfg.ReduceTextureQuality) + { + QualitySettings.masterTextureLimit = cfg.TextureMipMapLimit; + Log($"Texture mip limit: {cfg.TextureMipMapLimit}"); + } + + if (cfg.DisableSoftParticles) + { + QualitySettings.softParticles = false; + Log("Soft particles: OFF"); + } + + QualitySettings.skinWeights = SkinWeights.TwoBones; + Log("Skin weights: 2 bones"); + + QualitySettings.asyncUploadTimeSlice = 4; + QualitySettings.asyncUploadBufferSize = 64; + QualitySettings.asyncUploadPersistentBuffer = true; + Log("AsyncUpload: 4ms/frame, 64MB buffer"); + } + catch (Exception ex) + { + MelonLogger.Warning($"[Rendering] QualitySettings failed: {ex.Message}"); + } + } + + static void ApplyPostProcessing(GregPerfConfig cfg) + { + if (!cfg.DisableHeavyPostProcessing) return; + + try + { + var volumes = Resources.FindObjectsOfTypeAll(); + int disabled = 0; + + for (int i = 0; i < volumes.Length; i++) + { + var vol = volumes[i]; + if (vol == null || vol.profile == null) continue; + + var components = vol.profile.components; + for (int j = 0; j < components.Count; j++) + { + var comp = components[j]; + if (comp == null) continue; + + string typeName = comp.GetType().Name; + bool shouldDisable = typeName switch + { + "MotionBlur" => cfg.DisableMotionBlur, + "Bloom" => cfg.DisableBloom, + "DepthOfField" => cfg.DisableDoF, + "AmbientOcclusion" => cfg.DisableAO, + "ScreenSpaceReflections" => cfg.DisableSSR, + "FilmGrain" => true, + "ChromaticAberration" => true, + _ => false + }; + + if (shouldDisable && comp.active) + { + comp.active = false; + disabled++; + } + } + } + + Log($"Post processing: {disabled} effects disabled"); + } + catch (Exception ex) + { + MelonLogger.Warning($"[Rendering] PostFX optimization failed: {ex.Message}"); + } + } + + static void Log(string msg) => MelonLogger.Msg($"[Rendering] {msg}"); +} \ No newline at end of file diff --git a/src/gregCore/Services/GregThreadingService.cs b/src/gregCore/Services/GregThreadingService.cs new file mode 100644 index 00000000..34e7b1d7 --- /dev/null +++ b/src/gregCore/Services/GregThreadingService.cs @@ -0,0 +1,50 @@ +using System; +using System.Threading; +using MelonLoader; +using UnityEngine; + +namespace gregCore.Services; + +public sealed class GregThreadingService +{ + public static GregThreadingService Instance { get; private set; } = null!; + + public void Initialize(int physicalCores) + { + Instance = this; + + ThreadPool.GetMinThreads(out int minW, out int minIO); + ThreadPool.GetMaxThreads(out int maxW, out int maxIO); + + MelonLogger.Msg($"[Threading] Before: min=({minW},{minIO}) max=({maxW},{maxIO})"); + MelonLogger.Msg($"[Threading] Physical cores: {physicalCores}, Logical: {SystemInfo.processorCount}"); + + int targetWorkers = Math.Max(physicalCores - 2, 4); + int targetCompletion = Math.Max(physicalCores / 2, 4); + + ThreadPool.SetMinThreads(targetWorkers, targetCompletion); + ThreadPool.SetMaxThreads( + Math.Max(targetWorkers * 2, maxW), + Math.Max(targetCompletion * 2, maxIO) + ); + + ThreadPool.GetMinThreads(out int newMinW, out int newMinIO); + ThreadPool.GetMaxThreads(out int newMaxW, out int newMaxIO); + + MelonLogger.Msg($"[Threading] After: min=({newMinW},{newMinIO}) max=({newMaxW},{newMaxIO})"); + + TryConfigureUnityJobs(targetWorkers); + } + + static void TryConfigureUnityJobs(int workerCount) + { + try + { + MelonLogger.Msg("[Threading] JobsUtility config skipped (API may be stripped in IL2CPP)"); + } + catch (Exception ex) + { + MelonLogger.Warning($"[Threading] Job System config failed: {ex.Message}"); + } + } +} \ No newline at end of file diff --git a/src/gregHarmony/GregVersionPatch.cs b/src/gregHarmony/GregVersionPatch.cs new file mode 100644 index 00000000..0345b886 --- /dev/null +++ b/src/gregHarmony/GregVersionPatch.cs @@ -0,0 +1,29 @@ +using HarmonyLib; +using Il2Cpp; +using UnityEngine; +using UnityEngine.UI; +using Il2CppTMPro; + +namespace greg.Harmony; + +[HarmonyPatch(typeof(GetCurrentVersion), nameof(GetCurrentVersion.Start))] +public static class GregVersionPatch +{ + static void Postfix(GetCurrentVersion __instance) + { + var tmp = __instance.GetComponent(); + if (tmp != null) + { + if (!tmp.text.EndsWith("#greg")) + tmp.text += " #greg"; + return; + } + + var txt = __instance.GetComponent(); + if (txt != null) + { + if (!txt.text.EndsWith("#greg")) + txt.text += " #greg"; + } + } +} diff --git a/src/gregHarmony/PerformancePatches.cs b/src/gregHarmony/PerformancePatches.cs index e8e5a504..06398923 100644 --- a/src/gregHarmony/PerformancePatches.cs +++ b/src/gregHarmony/PerformancePatches.cs @@ -39,10 +39,10 @@ namespace greg.Harmony } } - [HarmonyPatch(typeof(NetworkMap), nameof(NetworkMap.FindAllRoutes))] + [HarmonyPatch(typeof(NetworkMap), nameof(NetworkMap.FindAllRoutes), new Type[] { typeof(string), typeof(string) })] public static class Patch_NetworkMap_FindAllRoutes { - static bool Prefix(NetworkMap __instance, string baseName, string serverName, ref List> __result) + static bool Prefix(NetworkMap __instance, string baseName, string serverName, ref Il2CppSystem.Collections.Generic.List> __result) { try { @@ -62,7 +62,7 @@ namespace greg.Harmony } } - static void Postfix(string baseName, string serverName, List> __result) + static void Postfix(string baseName, string serverName, Il2CppSystem.Collections.Generic.List> __result) { try { diff --git a/src/gregModLoader/Hooks/HookBinder.cs b/src/gregModLoader/Hooks/HookBinder.cs index 5a9b9dc6..de1d76dd 100644 --- a/src/gregModLoader/Hooks/HookBinder.cs +++ b/src/gregModLoader/Hooks/HookBinder.cs @@ -18,11 +18,11 @@ public static class HookBinder private static readonly object SyncRoot = new(); private static readonly Regex BracketFormatRegex = new( - "^runtimetrigger\\s+asm\\[Assembly-CSharp\\]\\s+type\\[(?[^\\]]+)\\]\\s+method\\[(?[^\\]]+)\\]$", + "^runtimetrigger\\s+asm\\[[^\\]]+\\]\\s+type\\[(?[^\\]]+)\\]\\s+method\\[(?[^\\]]+)\\]$", RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.IgnoreCase); private static readonly Regex PipeFormatRegex = new( - "^runtime_trigger\\s*\\|\\s*asm=Assembly-CSharp\\s*\\|\\s*type=(?[^|]+)\\|\\s*method=(?.+)$", + "^runtime_trigger\\s*\\|\\s*asm=[^|]+\\s*\\|\\s*type=(?[^|]+)\\|\\s*method=(?.+)$", RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.IgnoreCase); private static readonly Dictionary AliasesByRawMethod = new(StringComparer.OrdinalIgnoreCase); diff --git a/src/gregModLoader/gregEventDispatcher.cs b/src/gregModLoader/gregEventDispatcher.cs index 7c3036ae..902626e8 100644 --- a/src/gregModLoader/gregEventDispatcher.cs +++ b/src/gregModLoader/gregEventDispatcher.cs @@ -60,6 +60,51 @@ public static class EventIds // hook bridge introspection (11xx) — keep in sync with dc_api / gregCore.EventIds history public const uint HookBridgeInstalled = 1100; public const uint HookBridgeTriggered = 1101; + + // finance / balance sheet extensions (12xx) + public const uint RatesCalculated = 1200; + public const uint BalanceSheetScreenOpened = 1201; + public const uint BalanceSheetRecordAccessed = 1202; + public const uint BalanceSheetTrackFinances = 1203; + public const uint BalanceSheetFilled = 1204; + public const uint BalanceSheetTotalRowAdded = 1205; + public const uint BalanceSheetSalaryRegistered = 1206; + public const uint BalanceSheetRecordRestored = 1207; + public const uint BalanceSheetDataSaved = 1208; + public const uint BalanceSheetDataLoaded = 1209; + public const uint BalanceSheetLatestSnapshotRequested = 1210; + public const uint ShopCartTotalUpdated = 1211; + public const uint ShopNewItemPurchased = 1212; + public const uint ShopAnotherItemPurchased = 1213; + public const uint ShopPhysicalItemSpawned = 1214; + + // customer extensions (13xx) + public const uint CustomerComponentInitialized = 1300; + public const uint CustomerServerCountAndSpeedChanged = 1301; + public const uint CustomerAppPerformanceAdded = 1302; + public const uint CustomerAppSpeedsReset = 1303; + public const uint CustomerBaseSetup = 1304; + public const uint CustomerAppSetup = 1305; + public const uint CustomerSpeedOnAppChanged = 1306; + public const uint CustomerDataLoaded = 1307; + public const uint CustomerDoorClicked = 1308; + public const uint CustomerDoorHovered = 1309; + public const uint CustomerDoorOpenedAndSetup = 1310; + public const uint CustomerDoorOpened = 1311; + public const uint CustomerDoorLoaded = 1312; + public const uint CustomerDoorDestroyed = 1313; + public const uint CustomerCardSet = 1314; + public const uint CustomerChoiceCanceled = 1315; + public const uint CustomerCardsCanvasShown = 1316; + public const uint CustomerFallbackCreated = 1317; + public const uint CustomerTotalRequirementRequested = 1318; + public const uint CustomerSuitabilityChecked = 1319; + public const uint NetworkCustomerBaseRegistered = 1320; + public const uint NetworkCustomerBaseRequested = 1321; + public const uint NetworkDeviceCustomerIdChanged = 1322; + public const uint ServerChangeCustomerClicked = 1323; + public const uint ServerNextCustomerIdRequested = 1324; + public const uint ServerCustomerIdRequested = 1325; } // must match rust repr(C) layouts @@ -135,6 +180,61 @@ public struct NetWatchDispatchedData public int Reason; // 0 = broken, 1 = eol_warning } +[StructLayout(LayoutKind.Sequential)] +public struct RatesCalculatedData +{ + public double MoneyPerSec; + public double XpPerSec; + public double ExpensesPerSec; +} + +[StructLayout(LayoutKind.Sequential)] +public struct BalanceSheetTotalRowData +{ + public double Revenue; + public double Penalties; + public double Total; +} + +[StructLayout(LayoutKind.Sequential)] +public struct BalanceSheetSalaryRegisteredData +{ + public int MonthlySalary; +} + +[StructLayout(LayoutKind.Sequential)] +public struct CustomerBaseIdData +{ + public int CustomerBaseId; +} + +[StructLayout(LayoutKind.Sequential)] +public struct CustomerAppSpeedData +{ + public int AppId; + public float Speed; +} + +[StructLayout(LayoutKind.Sequential)] +public struct CustomerCountSpeedData +{ + public int Count; + public float Speed; +} + +[StructLayout(LayoutKind.Sequential)] +public struct CustomerAppSetupData +{ + public int AppId; + public int Difficulty; +} + +[StructLayout(LayoutKind.Sequential)] +public struct CustomerBoolResultData +{ + public int Value; +} + [StructLayout(LayoutKind.Sequential)] public struct CustomEmployeeEventData { @@ -400,6 +500,224 @@ public static class EventDispatcher CrashLog.Log($"FireHookBridgeTriggered: method={methodKey}"); FireSimple(EventIds.HookBridgeTriggered); } + + public static void FireRatesCalculated(double moneyPerSec, double xpPerSec, double expensesPerSec) + { + DispatchWithData(EventIds.RatesCalculated, new RatesCalculatedData + { + MoneyPerSec = moneyPerSec, + XpPerSec = xpPerSec, + ExpensesPerSec = expensesPerSec + }, moneyPerSec + xpPerSec * 31.0 + expensesPerSec * 97.0); + } + + public static void FireBalanceSheetScreenOpened() + { + FireSimple(EventIds.BalanceSheetScreenOpened); + } + + public static void FireBalanceSheetRecordAccessed() + { + FireSimple(EventIds.BalanceSheetRecordAccessed); + } + + public static void FireBalanceSheetTrackFinances() + { + FireSimple(EventIds.BalanceSheetTrackFinances); + } + + public static void FireBalanceSheetFilled() + { + FireSimple(EventIds.BalanceSheetFilled); + } + + public static void FireBalanceSheetTotalRowAdded(double revenue, double penalties, double total) + { + DispatchWithData(EventIds.BalanceSheetTotalRowAdded, new BalanceSheetTotalRowData + { + Revenue = revenue, + Penalties = penalties, + Total = total, + }, revenue + penalties * 31.0 + total * 97.0); + } + + public static void FireBalanceSheetSalaryRegistered(int monthlySalary) + { + DispatchWithData(EventIds.BalanceSheetSalaryRegistered, new BalanceSheetSalaryRegisteredData + { + MonthlySalary = monthlySalary, + }, monthlySalary); + } + + public static void FireBalanceSheetRecordRestored() + { + FireSimple(EventIds.BalanceSheetRecordRestored); + } + + public static void FireBalanceSheetDataSaved() + { + FireSimple(EventIds.BalanceSheetDataSaved); + } + + public static void FireBalanceSheetDataLoaded() + { + FireSimple(EventIds.BalanceSheetDataLoaded); + } + + public static void FireBalanceSheetLatestSnapshotRequested() + { + FireSimple(EventIds.BalanceSheetLatestSnapshotRequested); + } + + public static void FireShopCartTotalUpdated() + { + FireSimple(EventIds.ShopCartTotalUpdated); + } + + public static void FireShopNewItemPurchased(int itemId, int price, int itemType) + { + DispatchWithData(EventIds.ShopNewItemPurchased, new ShopItemAddedData { ItemId = itemId, Price = price, ItemType = itemType }, itemId * 1000.0 + price + itemType * 0.1); + } + + public static void FireShopAnotherItemPurchased(int itemId, int price, int itemType) + { + DispatchWithData(EventIds.ShopAnotherItemPurchased, new ShopItemAddedData { ItemId = itemId, Price = price, ItemType = itemType }, itemId * 1000.0 + price + itemType * 0.1 + 0.5); + } + + public static void FireShopPhysicalItemSpawned(int price, int itemType) + { + DispatchWithData(EventIds.ShopPhysicalItemSpawned, new ShopItemAddedData { ItemId = -1, Price = price, ItemType = itemType }, price + itemType * 0.1); + } + + public static void FireCustomerComponentInitialized(int customerBaseId) + { + DispatchWithData(EventIds.CustomerComponentInitialized, new CustomerBaseIdData { CustomerBaseId = customerBaseId }, customerBaseId); + } + + public static void FireCustomerServerCountAndSpeedChanged(int count, float speed) + { + DispatchWithData(EventIds.CustomerServerCountAndSpeedChanged, new CustomerCountSpeedData { Count = count, Speed = speed }, count + speed * 31.0); + } + + public static void FireCustomerAppPerformanceAdded(int appId, float speed) + { + DispatchWithData(EventIds.CustomerAppPerformanceAdded, new CustomerAppSpeedData { AppId = appId, Speed = speed }, appId + speed * 31.0); + } + + public static void FireCustomerAppSpeedsReset(int customerBaseId) + { + DispatchWithData(EventIds.CustomerAppSpeedsReset, new CustomerBaseIdData { CustomerBaseId = customerBaseId }, customerBaseId); + } + + public static void FireCustomerBaseSetup(int customerBaseId) + { + DispatchWithData(EventIds.CustomerBaseSetup, new CustomerBaseIdData { CustomerBaseId = customerBaseId }, customerBaseId); + } + + public static void FireCustomerAppSetup(int appId, int difficulty) + { + DispatchWithData(EventIds.CustomerAppSetup, new CustomerAppSetupData { AppId = appId, Difficulty = difficulty }, appId + difficulty * 31.0); + } + + public static void FireCustomerSpeedOnAppChanged(int appId, float speed) + { + DispatchWithData(EventIds.CustomerSpeedOnAppChanged, new CustomerAppSpeedData { AppId = appId, Speed = speed }, appId + speed * 31.0); + } + + public static void FireCustomerDataLoaded(int customerBaseId) + { + DispatchWithData(EventIds.CustomerDataLoaded, new CustomerBaseIdData { CustomerBaseId = customerBaseId }, customerBaseId); + } + + public static void FireCustomerDoorClicked() + { + FireSimple(EventIds.CustomerDoorClicked); + } + + public static void FireCustomerDoorHovered() + { + FireSimple(EventIds.CustomerDoorHovered); + } + + public static void FireCustomerDoorOpenedAndSetup() + { + FireSimple(EventIds.CustomerDoorOpenedAndSetup); + } + + public static void FireCustomerDoorOpened() + { + FireSimple(EventIds.CustomerDoorOpened); + } + + public static void FireCustomerDoorLoaded() + { + FireSimple(EventIds.CustomerDoorLoaded); + } + + public static void FireCustomerDoorDestroyed() + { + FireSimple(EventIds.CustomerDoorDestroyed); + } + + public static void FireCustomerCardSet() + { + FireSimple(EventIds.CustomerCardSet); + } + + public static void FireCustomerChoiceCanceled() + { + FireSimple(EventIds.CustomerChoiceCanceled); + } + + public static void FireCustomerCardsCanvasShown() + { + FireSimple(EventIds.CustomerCardsCanvasShown); + } + + public static void FireCustomerFallbackCreated(int customerId) + { + DispatchWithData(EventIds.CustomerFallbackCreated, new CustomerAcceptedData { CustomerId = customerId }, customerId); + } + + public static void FireCustomerTotalRequirementRequested() + { + FireSimple(EventIds.CustomerTotalRequirementRequested); + } + + public static void FireCustomerSuitabilityChecked(bool isSuitable) + { + DispatchWithData(EventIds.CustomerSuitabilityChecked, new CustomerBoolResultData { Value = isSuitable ? 1 : 0 }, isSuitable ? 1.0 : 0.0); + } + + public static void FireNetworkCustomerBaseRegistered(int customerBaseId) + { + DispatchWithData(EventIds.NetworkCustomerBaseRegistered, new CustomerBaseIdData { CustomerBaseId = customerBaseId }, customerBaseId); + } + + public static void FireNetworkCustomerBaseRequested(int customerBaseId) + { + DispatchWithData(EventIds.NetworkCustomerBaseRequested, new CustomerBaseIdData { CustomerBaseId = customerBaseId }, customerBaseId); + } + + public static void FireNetworkDeviceCustomerIdChanged(int customerId) + { + DispatchWithData(EventIds.NetworkDeviceCustomerIdChanged, new CustomerAcceptedData { CustomerId = customerId }, customerId); + } + + public static void FireServerChangeCustomerClicked() + { + FireSimple(EventIds.ServerChangeCustomerClicked); + } + + public static void FireServerNextCustomerIdRequested(int customerId) + { + DispatchWithData(EventIds.ServerNextCustomerIdRequested, new CustomerAcceptedData { CustomerId = customerId }, customerId); + } + + public static void FireServerCustomerIdRequested(int customerId) + { + DispatchWithData(EventIds.ServerCustomerIdRequested, new CustomerAcceptedData { CustomerId = customerId }, customerId); + } } diff --git a/src/gregModLoader/gregHarmonyPatches.cs b/src/gregModLoader/gregHarmonyPatches.cs index 65d108ff..0ad5395b 100644 --- a/src/gregModLoader/gregHarmonyPatches.cs +++ b/src/gregModLoader/gregHarmonyPatches.cs @@ -516,6 +516,426 @@ internal static class Patch_ComputerShop_RemoveSpawnedItem } } +[HarmonyPatch(typeof(StaticUIElements), nameof(StaticUIElements.CalculateRates))] +internal static class Patch_StaticUIElements_CalculateRates +{ + internal static void Postfix(ref float moneyPerSec, ref float xpPerSec, ref float expensesPerSec) + { + try { EventDispatcher.FireRatesCalculated(moneyPerSec, xpPerSec, expensesPerSec); } + catch (Exception ex) { EventDispatcher.LogError($"CalculateRates: {ex.Message}"); } + } +} + +[HarmonyPatch(typeof(ComputerShop), nameof(ComputerShop.ButtonBalanceSheetScreen))] +internal static class Patch_ComputerShop_ButtonBalanceSheetScreen +{ + internal static void Postfix() + { + try { EventDispatcher.FireBalanceSheetScreenOpened(); } + catch (Exception ex) { EventDispatcher.LogError($"ButtonBalanceSheetScreen: {ex.Message}"); } + } +} + +[HarmonyPatch(typeof(BalanceSheet), nameof(BalanceSheet.GetOrCreateRecord))] +internal static class Patch_BalanceSheet_GetOrCreateRecord +{ + internal static void Postfix() + { + try { EventDispatcher.FireBalanceSheetRecordAccessed(); } + catch (Exception ex) { EventDispatcher.LogError($"GetOrCreateRecord: {ex.Message}"); } + } +} + +[HarmonyPatch(typeof(BalanceSheet), nameof(BalanceSheet.TrackFinances))] +internal static class Patch_BalanceSheet_TrackFinances +{ + internal static void Postfix() + { + try { EventDispatcher.FireBalanceSheetTrackFinances(); } + catch (Exception ex) { EventDispatcher.LogError($"TrackFinances: {ex.Message}"); } + } +} + +[HarmonyPatch(typeof(BalanceSheet), nameof(BalanceSheet.FillInBalanceSheet))] +internal static class Patch_BalanceSheet_FillInBalanceSheet +{ + internal static void Postfix() + { + try { EventDispatcher.FireBalanceSheetFilled(); } + catch (Exception ex) { EventDispatcher.LogError($"FillInBalanceSheet: {ex.Message}"); } + } +} + +[HarmonyPatch(typeof(BalanceSheet), nameof(BalanceSheet.AddTotalRow))] +internal static class Patch_BalanceSheet_AddTotalRow +{ + internal static void Postfix(float __0, float __1, float __2) + { + try { EventDispatcher.FireBalanceSheetTotalRowAdded(__0, __1, __2); } + catch (Exception ex) { EventDispatcher.LogError($"AddTotalRow: {ex.Message}"); } + } +} + +[HarmonyPatch(typeof(BalanceSheet), nameof(BalanceSheet.RegisterSalary))] +internal static class Patch_BalanceSheet_RegisterSalary +{ + internal static void Postfix(int __0) + { + try { EventDispatcher.FireBalanceSheetSalaryRegistered(__0); } + catch (Exception ex) { EventDispatcher.LogError($"RegisterSalary: {ex.Message}"); } + } +} + +[HarmonyPatch(typeof(BalanceSheet), nameof(BalanceSheet.RestoreRecord))] +internal static class Patch_BalanceSheet_RestoreRecord +{ + internal static void Postfix() + { + try { EventDispatcher.FireBalanceSheetRecordRestored(); } + catch (Exception ex) { EventDispatcher.LogError($"RestoreRecord: {ex.Message}"); } + } +} + +[HarmonyPatch(typeof(BalanceSheet), nameof(BalanceSheet.GetSaveData))] +internal static class Patch_BalanceSheet_GetSaveData +{ + internal static void Postfix() + { + try { EventDispatcher.FireBalanceSheetDataSaved(); } + catch (Exception ex) { EventDispatcher.LogError($"GetSaveData: {ex.Message}"); } + } +} + +[HarmonyPatch(typeof(BalanceSheet), nameof(BalanceSheet.LoadFromSave))] +internal static class Patch_BalanceSheet_LoadFromSave +{ + internal static void Postfix() + { + try { EventDispatcher.FireBalanceSheetDataLoaded(); } + catch (Exception ex) { EventDispatcher.LogError($"LoadFromSave: {ex.Message}"); } + } +} + +[HarmonyPatch(typeof(BalanceSheet), nameof(BalanceSheet.GetLatestSnapshot))] +internal static class Patch_BalanceSheet_GetLatestSnapshot +{ + internal static void Postfix() + { + try { EventDispatcher.FireBalanceSheetLatestSnapshotRequested(); } + catch (Exception ex) { EventDispatcher.LogError($"GetLatestSnapshot: {ex.Message}"); } + } +} + +[HarmonyPatch(typeof(ComputerShop), nameof(ComputerShop.UpdateCartTotal))] +internal static class Patch_ComputerShop_UpdateCartTotal +{ + internal static void Postfix() + { + try { EventDispatcher.FireShopCartTotalUpdated(); } + catch (Exception ex) { EventDispatcher.LogError($"UpdateCartTotal: {ex.Message}"); } + } +} + +[HarmonyPatch(typeof(ComputerShop), nameof(ComputerShop.BuyNewItem))] +internal static class Patch_ComputerShop_BuyNewItem +{ + internal static void Postfix(int __0, int __1, int __2) + { + try { EventDispatcher.FireShopNewItemPurchased(__0, __1, __2); } + catch (Exception ex) { EventDispatcher.LogError($"BuyNewItem: {ex.Message}"); } + } +} + +[HarmonyPatch(typeof(ComputerShop), nameof(ComputerShop.BuyAnotherItem))] +internal static class Patch_ComputerShop_BuyAnotherItem +{ + internal static void Postfix(int __0, int __1, int __2) + { + try { EventDispatcher.FireShopAnotherItemPurchased(__0, __1, __2); } + catch (Exception ex) { EventDispatcher.LogError($"BuyAnotherItem: {ex.Message}"); } + } +} + +[HarmonyPatch(typeof(ComputerShop), nameof(ComputerShop.SpawnPhysicalItem))] +internal static class Patch_ComputerShop_SpawnPhysicalItem +{ + internal static void Postfix(int __1, int __2) + { + try { EventDispatcher.FireShopPhysicalItemSpawned(__1, __2); } + catch (Exception ex) { EventDispatcher.LogError($"SpawnPhysicalItem: {ex.Message}"); } + } +} + +[HarmonyPatch(typeof(CustomerBase), nameof(CustomerBase.Awake))] +internal static class Patch_CustomerBase_Awake +{ + internal static void Postfix(CustomerBase __instance) + { + try { EventDispatcher.FireCustomerComponentInitialized(__instance.customerBaseID); } + catch (Exception ex) { EventDispatcher.LogError($"CustomerBase.Awake: {ex.Message}"); } + } +} + +[HarmonyPatch(typeof(CustomerBase), nameof(CustomerBase.Start))] +internal static class Patch_CustomerBase_Start +{ + internal static void Postfix(CustomerBase __instance) + { + try { EventDispatcher.FireCustomerComponentInitialized(__instance.customerBaseID); } + catch (Exception ex) { EventDispatcher.LogError($"CustomerBase.Start: {ex.Message}"); } + } +} + +[HarmonyPatch(typeof(CustomerBase), nameof(CustomerBase.UpdateCustomerServerCountAndSpeed))] +internal static class Patch_CustomerBase_UpdateCustomerServerCountAndSpeed +{ + internal static void Postfix(int __0, float __1) + { + try { EventDispatcher.FireCustomerServerCountAndSpeedChanged(__0, __1); } + catch (Exception ex) { EventDispatcher.LogError($"CustomerBase.UpdateCustomerServerCountAndSpeed: {ex.Message}"); } + } +} + +[HarmonyPatch(typeof(CustomerBase), nameof(CustomerBase.AddAppPerformance))] +internal static class Patch_CustomerBase_AddAppPerformance +{ + internal static void Postfix(int __0, float __1) + { + try { EventDispatcher.FireCustomerAppPerformanceAdded(__0, __1); } + catch (Exception ex) { EventDispatcher.LogError($"CustomerBase.AddAppPerformance: {ex.Message}"); } + } +} + +[HarmonyPatch(typeof(CustomerBase), nameof(CustomerBase.ResetAllAppSpeeds))] +internal static class Patch_CustomerBase_ResetAllAppSpeeds +{ + internal static void Postfix(CustomerBase __instance) + { + try { EventDispatcher.FireCustomerAppSpeedsReset(__instance.customerBaseID); } + catch (Exception ex) { EventDispatcher.LogError($"CustomerBase.ResetAllAppSpeeds: {ex.Message}"); } + } +} + +[HarmonyPatch(typeof(CustomerBase), nameof(CustomerBase.SetUpBase))] +internal static class Patch_CustomerBase_SetUpBase +{ + internal static void Postfix(CustomerBase __instance) + { + try { EventDispatcher.FireCustomerBaseSetup(__instance.customerBaseID); } + catch (Exception ex) { EventDispatcher.LogError($"CustomerBase.SetUpBase: {ex.Message}"); } + } +} + +[HarmonyPatch(typeof(CustomerBase), nameof(CustomerBase.SetUpApp))] +internal static class Patch_CustomerBase_SetUpApp +{ + internal static void Postfix(int __0, int __1) + { + try { EventDispatcher.FireCustomerAppSetup(__0, __1); } + catch (Exception ex) { EventDispatcher.LogError($"CustomerBase.SetUpApp: {ex.Message}"); } + } +} + +[HarmonyPatch(typeof(CustomerBase), nameof(CustomerBase.UpdateSpeedOnCustomerBaseApp))] +internal static class Patch_CustomerBase_UpdateSpeedOnCustomerBaseApp +{ + internal static void Postfix(int __0, float __1) + { + try { EventDispatcher.FireCustomerSpeedOnAppChanged(__0, __1); } + catch (Exception ex) { EventDispatcher.LogError($"CustomerBase.UpdateSpeedOnCustomerBaseApp: {ex.Message}"); } + } +} + +[HarmonyPatch(typeof(CustomerBase), nameof(CustomerBase.LoadData))] +internal static class Patch_CustomerBase_LoadData +{ + internal static void Postfix(CustomerBase __instance) + { + try { EventDispatcher.FireCustomerDataLoaded(__instance.customerBaseID); } + catch (Exception ex) { EventDispatcher.LogError($"CustomerBase.LoadData: {ex.Message}"); } + } +} + +[HarmonyPatch(typeof(CustomerBaseDoor), nameof(CustomerBaseDoor.InteractOnClick))] +internal static class Patch_CustomerBaseDoor_InteractOnClick +{ + internal static void Postfix() + { + try { EventDispatcher.FireCustomerDoorClicked(); } + catch (Exception ex) { EventDispatcher.LogError($"CustomerBaseDoor.InteractOnClick: {ex.Message}"); } + } +} + +[HarmonyPatch(typeof(CustomerBaseDoor), nameof(CustomerBaseDoor.InteractOnHover))] +internal static class Patch_CustomerBaseDoor_InteractOnHover +{ + internal static void Postfix() + { + try { EventDispatcher.FireCustomerDoorHovered(); } + catch (Exception ex) { EventDispatcher.LogError($"CustomerBaseDoor.InteractOnHover: {ex.Message}"); } + } +} + +[HarmonyPatch(typeof(CustomerBaseDoor), nameof(CustomerBaseDoor.OpenDoorAndSetupBase))] +internal static class Patch_CustomerBaseDoor_OpenDoorAndSetupBase +{ + internal static void Postfix() + { + try { EventDispatcher.FireCustomerDoorOpenedAndSetup(); } + catch (Exception ex) { EventDispatcher.LogError($"CustomerBaseDoor.OpenDoorAndSetupBase: {ex.Message}"); } + } +} + +[HarmonyPatch(typeof(CustomerBaseDoor), nameof(CustomerBaseDoor.OpenDoor))] +internal static class Patch_CustomerBaseDoor_OpenDoor +{ + internal static void Postfix() + { + try { EventDispatcher.FireCustomerDoorOpened(); } + catch (Exception ex) { EventDispatcher.LogError($"CustomerBaseDoor.OpenDoor: {ex.Message}"); } + } +} + +[HarmonyPatch(typeof(CustomerBaseDoor), nameof(CustomerBaseDoor.OnLoad))] +internal static class Patch_CustomerBaseDoor_OnLoad +{ + internal static void Postfix() + { + try { EventDispatcher.FireCustomerDoorLoaded(); } + catch (Exception ex) { EventDispatcher.LogError($"CustomerBaseDoor.OnLoad: {ex.Message}"); } + } +} + +[HarmonyPatch(typeof(CustomerBaseDoor), nameof(CustomerBaseDoor.OnDestroy))] +internal static class Patch_CustomerBaseDoor_OnDestroy +{ + internal static void Postfix() + { + try { EventDispatcher.FireCustomerDoorDestroyed(); } + catch (Exception ex) { EventDispatcher.LogError($"CustomerBaseDoor.OnDestroy: {ex.Message}"); } + } +} + +[HarmonyPatch(typeof(CustomerCard), nameof(CustomerCard.SetCustomer))] +internal static class Patch_CustomerCard_SetCustomer +{ + internal static void Postfix() + { + try { EventDispatcher.FireCustomerCardSet(); } + catch (Exception ex) { EventDispatcher.LogError($"CustomerCard.SetCustomer: {ex.Message}"); } + } +} + +[HarmonyPatch(typeof(MainGameManager), nameof(MainGameManager.ButtonCancelCustomerChoice))] +internal static class Patch_MainGameManager_ButtonCancelCustomerChoice +{ + internal static void Postfix() + { + try { EventDispatcher.FireCustomerChoiceCanceled(); } + catch (Exception ex) { EventDispatcher.LogError($"MainGameManager.ButtonCancelCustomerChoice: {ex.Message}"); } + } +} + +[HarmonyPatch(typeof(MainGameManager), nameof(MainGameManager.ShowCustomerCardsCanvas))] +internal static class Patch_MainGameManager_ShowCustomerCardsCanvas +{ + internal static void Postfix() + { + try { EventDispatcher.FireCustomerCardsCanvasShown(); } + catch (Exception ex) { EventDispatcher.LogError($"MainGameManager.ShowCustomerCardsCanvas: {ex.Message}"); } + } +} + +[HarmonyPatch(typeof(MainGameManager), nameof(MainGameManager.CreateFallbackCustomer))] +internal static class Patch_MainGameManager_CreateFallbackCustomer +{ + internal static void Postfix(int __1) + { + try { EventDispatcher.FireCustomerFallbackCreated(__1); } + catch (Exception ex) { EventDispatcher.LogError($"MainGameManager.CreateFallbackCustomer: {ex.Message}"); } + } +} + +[HarmonyPatch(typeof(MainGameManager), nameof(MainGameManager.GetCustomerTotalRequirement))] +internal static class Patch_MainGameManager_GetCustomerTotalRequirement +{ + internal static void Postfix() + { + try { EventDispatcher.FireCustomerTotalRequirementRequested(); } + catch (Exception ex) { EventDispatcher.LogError($"MainGameManager.GetCustomerTotalRequirement: {ex.Message}"); } + } +} + +[HarmonyPatch(typeof(MainGameManager), nameof(MainGameManager.IsCustomerSuitableForBase))] +internal static class Patch_MainGameManager_IsCustomerSuitableForBase +{ + internal static void Postfix(ref bool __result) + { + try { EventDispatcher.FireCustomerSuitabilityChecked(__result); } + catch (Exception ex) { EventDispatcher.LogError($"MainGameManager.IsCustomerSuitableForBase: {ex.Message}"); } + } +} + +[HarmonyPatch(typeof(NetworkMap), nameof(NetworkMap.RegisterCustomerBase))] +internal static class Patch_NetworkMap_RegisterCustomerBase +{ + internal static void Postfix(CustomerBase __0) + { + try { EventDispatcher.FireNetworkCustomerBaseRegistered(__0 != null ? __0.customerBaseID : -1); } + catch (Exception ex) { EventDispatcher.LogError($"NetworkMap.RegisterCustomerBase: {ex.Message}"); } + } +} + +[HarmonyPatch(typeof(NetworkMap), nameof(NetworkMap.GetCustomerBase))] +internal static class Patch_NetworkMap_GetCustomerBase +{ + internal static void Postfix(int __0) + { + try { EventDispatcher.FireNetworkCustomerBaseRequested(__0); } + catch (Exception ex) { EventDispatcher.LogError($"NetworkMap.GetCustomerBase: {ex.Message}"); } + } +} + +[HarmonyPatch(typeof(NetworkMap), nameof(NetworkMap.UpdateDeviceCustomerID))] +internal static class Patch_NetworkMap_UpdateDeviceCustomerID +{ + internal static void Postfix(int __1) + { + try { EventDispatcher.FireNetworkDeviceCustomerIdChanged(__1); } + catch (Exception ex) { EventDispatcher.LogError($"NetworkMap.UpdateDeviceCustomerID: {ex.Message}"); } + } +} + +[HarmonyPatch(typeof(Server), nameof(Server.ButtonClickChangeCustomer))] +internal static class Patch_Server_ButtonClickChangeCustomer +{ + internal static void Postfix() + { + try { EventDispatcher.FireServerChangeCustomerClicked(); } + catch (Exception ex) { EventDispatcher.LogError($"Server.ButtonClickChangeCustomer: {ex.Message}"); } + } +} + +[HarmonyPatch(typeof(Server), nameof(Server.GetNextCustomerID))] +internal static class Patch_Server_GetNextCustomerID +{ + internal static void Postfix(ref int __result) + { + try { EventDispatcher.FireServerNextCustomerIdRequested(__result); } + catch (Exception ex) { EventDispatcher.LogError($"Server.GetNextCustomerID: {ex.Message}"); } + } +} + +[HarmonyPatch(typeof(Server), nameof(Server.GetCustomerID))] +internal static class Patch_Server_GetCustomerID +{ + internal static void Postfix(ref int __result) + { + try { EventDispatcher.FireServerCustomerIdRequested(__result); } + catch (Exception ex) { EventDispatcher.LogError($"Server.GetCustomerID: {ex.Message}"); } + } +} + diff --git a/src/gregModLoader/gregRuntimeHookService.cs b/src/gregModLoader/gregRuntimeHookService.cs index 8bd94c8b..50354cf1 100644 --- a/src/gregModLoader/gregRuntimeHookService.cs +++ b/src/gregModLoader/gregRuntimeHookService.cs @@ -30,9 +30,13 @@ namespace greg.Exporter private static readonly ConcurrentDictionary PatchedMethods = new ConcurrentDictionary(); private readonly string harmonyId = "greg.framework.runtimehooks"; - private static readonly Regex CatalogLineRegex = new Regex( - "^runtime_trigger \\| asm=Assembly-CSharp \\| type=(?[^|]+) \\| method=(?.+)$", - RegexOptions.Compiled | RegexOptions.CultureInvariant); + private static readonly Regex CatalogPipeFormatRegex = new Regex( + "^runtime_trigger\\s*\\|\\s*asm=(?[^|]+?)\\s*\\|\\s*type=(?[^|]+?)\\s*\\|\\s*method=(?.+)$", + RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.IgnoreCase); + + private static readonly Regex CatalogBracketFormatRegex = new Regex( + "^runtimetrigger\\s+asm\\[(?[^\\]]+)\\]\\s+type\\[(?[^\\]]+)\\]\\s+method\\[(?[^\\]]+)\\]$", + RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.IgnoreCase); public HookScanResult ScanCandidates(int maxHooks) { @@ -134,10 +138,17 @@ namespace greg.Exporter foreach (string line in File.ReadLines(catalogPath)) { - if (!TryParseCatalogLine(line, out string typeName, out string methodName)) + if (!TryParseCatalogLine(line, out string assemblyName, out string typeName, out string methodName)) continue; - if (!typeMap.TryGetValue(typeName, out Type type) || type == null) + string assemblyScopedTypeKey = BuildAssemblyTypeKey(assemblyName, typeName); + + if (!typeMap.TryGetValue(assemblyScopedTypeKey, out Type type) || type == null) + { + typeMap.TryGetValue(typeName, out type); + } + + if (type == null) continue; MethodInfo[] methods; @@ -194,26 +205,43 @@ namespace greg.Exporter continue; map[type.FullName] = type; + map[BuildAssemblyTypeKey(asmName, type.FullName)] = type; } } return map; } - private static bool TryParseCatalogLine(string line, out string typeName, out string methodName) + private static string BuildAssemblyTypeKey(string assemblyName, string typeName) { + return $"{assemblyName?.Trim() ?? string.Empty}::{typeName?.Trim() ?? string.Empty}"; + } + + private static bool TryParseCatalogLine(string line, out string assemblyName, out string typeName, out string methodName) + { + assemblyName = string.Empty; typeName = string.Empty; methodName = string.Empty; if (string.IsNullOrWhiteSpace(line)) return false; - Match match = CatalogLineRegex.Match(line); - if (!match.Success) + Match pipeMatch = CatalogPipeFormatRegex.Match(line.Trim()); + if (pipeMatch.Success) + { + assemblyName = pipeMatch.Groups["asm"].Value.Trim(); + typeName = pipeMatch.Groups["type"].Value.Trim(); + methodName = pipeMatch.Groups["method"].Value.Trim(); + return !string.IsNullOrWhiteSpace(typeName) && !string.IsNullOrWhiteSpace(methodName); + } + + Match bracketMatch = CatalogBracketFormatRegex.Match(line.Trim()); + if (!bracketMatch.Success) return false; - typeName = match.Groups["type"].Value.Trim(); - methodName = match.Groups["method"].Value.Trim(); + assemblyName = bracketMatch.Groups["asm"].Value.Trim(); + typeName = bracketMatch.Groups["type"].Value.Trim(); + methodName = bracketMatch.Groups["method"].Value.Trim(); return !string.IsNullOrWhiteSpace(typeName) && !string.IsNullOrWhiteSpace(methodName); } @@ -296,7 +324,22 @@ namespace greg.Exporter private static bool IsRelevantAssembly(string assemblyName) { - return string.Equals(assemblyName, "Assembly-CSharp", StringComparison.OrdinalIgnoreCase); + if (string.IsNullOrWhiteSpace(assemblyName)) + return false; + + if (string.Equals(assemblyName, "Assembly-CSharp", StringComparison.OrdinalIgnoreCase)) + return true; + + if (assemblyName.StartsWith("Il2Cpp", StringComparison.OrdinalIgnoreCase)) + return true; + + if (assemblyName.StartsWith("Unity", StringComparison.OrdinalIgnoreCase)) + return true; + + if (assemblyName.StartsWith("UnityEngine", StringComparison.OrdinalIgnoreCase)) + return true; + + return false; } private static bool IsHookCandidate(MethodInfo method) diff --git a/src/gregSdk/Services/GregPowerService.cs b/src/gregSdk/Services/GregPowerService.cs index a003e146..7e4063d2 100644 --- a/src/gregSdk/Services/GregPowerService.cs +++ b/src/gregSdk/Services/GregPowerService.cs @@ -1,14 +1,30 @@ +using System.Collections.Concurrent; + namespace greg.Sdk.Services; public static class GregPowerService { + private static readonly ConcurrentDictionary _powerConsumers = new(); + public static int GetTotalPowerDraw(string topologyZoneId) { - // TODO: Calculate power consumption - return 0; + // Currently ignoring topologyZoneId, calculating global mod power draw + int total = 0; + foreach (var val in _powerConsumers.Values) + { + total += val; + } + return total; } - public static void RegisterConsumer(string deviceId, int watts) { } - public static void UnregisterConsumer(string deviceId) { } + public static void RegisterConsumer(string deviceId, int watts) + { + _powerConsumers[deviceId] = watts; + } + + public static void UnregisterConsumer(string deviceId) + { + _powerConsumers.TryRemove(deviceId, out _); + } } diff --git a/src/gregSdk/Services/GregRouteEvaluationService.cs b/src/gregSdk/Services/GregRouteEvaluationService.cs index 9f6bb5c2..164386e6 100644 --- a/src/gregSdk/Services/GregRouteEvaluationService.cs +++ b/src/gregSdk/Services/GregRouteEvaluationService.cs @@ -9,18 +9,18 @@ namespace greg.Sdk.Services /// public static class GregRouteEvaluationService { - private static readonly Dictionary>> _routeCache = new(); + private static readonly Dictionary>> _routeCache = new(); /// /// Attempts to get a cached route (Pointer-Swap optimization). /// - public static bool TryGetCachedRoute(string baseName, string serverName, out List> routes) + public static bool TryGetCachedRoute(string baseName, string serverName, out Il2CppSystem.Collections.Generic.List> routes) { string key = $"{baseName}->{serverName}"; return _routeCache.TryGetValue(key, out routes); } - public static void CacheRoute(string baseName, string serverName, List> routes) + public static void CacheRoute(string baseName, string serverName, Il2CppSystem.Collections.Generic.List> routes) { string key = $"{baseName}->{serverName}"; _routeCache[key] = routes; diff --git a/src/gregSdk/Services/GregSaveService.cs b/src/gregSdk/Services/GregSaveService.cs index aa4651fc..b4b95a9e 100644 --- a/src/gregSdk/Services/GregSaveService.cs +++ b/src/gregSdk/Services/GregSaveService.cs @@ -29,6 +29,48 @@ public static class GregSaveService private static string GetPath(string modId) => Path.Combine(BaseSavePath, $"{modId}.json"); + /// + /// Gets the native mod save data from the game's new SaveSystem if available. + /// + public static Il2Cpp.ModItemSaveData GetNativeModData(string modId) + { + var currentSave = Il2Cpp.SaveData._current; + if (currentSave == null || currentSave.modItemData == null) return null; + + foreach (var data in currentSave.modItemData) + { + if (data.modFolderName == modId) + return data; + } + return null; + } + + /// + /// Creates or updates native save data for a mod. + /// + public static Il2Cpp.ModItemSaveData GetOrCreateNativeModData(string modId) + { + var currentSave = Il2Cpp.SaveData._current; + if (currentSave == null) return null; + + if (currentSave.modItemData == null) + currentSave.modItemData = new Il2CppSystem.Collections.Generic.List(); + + var existing = GetNativeModData(modId); + if (existing != null) return existing; + + var newData = new Il2Cpp.ModItemSaveData + { + modFolderName = modId, + saveValue = new Il2CppInterop.Runtime.InteropTypes.Arrays.Il2CppStructArray(0), + saveIntArray = new Il2CppInterop.Runtime.InteropTypes.Arrays.Il2CppStructArray(0), + saveIntArray2 = new Il2CppInterop.Runtime.InteropTypes.Arrays.Il2CppStructArray(0) + }; + + currentSave.modItemData.Add(newData); + return newData; + } + /// /// Implements Task 1.2 sub-goal: Initialization. /// diff --git a/src/gregSdk/gregEventDispatcher.cs b/src/gregSdk/gregEventDispatcher.cs index 17708808..51a26283 100644 --- a/src/gregSdk/gregEventDispatcher.cs +++ b/src/gregSdk/gregEventDispatcher.cs @@ -1,4 +1,5 @@ using System; +using System.Buffers; using System.Collections.Generic; using MelonLoader; @@ -99,26 +100,39 @@ public static class gregEventDispatcher // Notify global monitor greg.Core.Scripting.GregHookBus.NotifyAny(hookName, payload); - List snapshot; + Subscription[] snapshot; + int snapshotCount; lock (Sync) { if (!Handlers.TryGetValue(hookName, out var list) || list.Count == 0) return; - snapshot = new List(list); + snapshotCount = list.Count; + snapshot = ArrayPool.Shared.Rent(snapshotCount); + for (var i = 0; i < snapshotCount; i++) + snapshot[i] = list[i]; } - foreach (var sub in snapshot) + try { - try + for (var i = 0; i < snapshotCount; i++) { - sub.Handler?.Invoke(payload); - } - catch (Exception ex) - { - MelonLogger.Warning($"[gregCore] Handler for '{hookName}' threw: {ex.Message}"); + var sub = snapshot[i]; + try + { + sub.Handler?.Invoke(payload); + } + catch (Exception ex) + { + MelonLogger.Warning($"[gregCore] Handler for '{hookName}' threw: {ex.Message}"); + } } } + finally + { + Array.Clear(snapshot, 0, snapshotCount); + ArrayPool.Shared.Return(snapshot); + } } finally { @@ -169,27 +183,40 @@ public static class gregEventDispatcher if (string.IsNullOrWhiteSpace(hookName)) return true; - List snapshot; + CancelableSubscription[] snapshot; + int snapshotCount; lock (Sync) { if (!CancelableHandlers.TryGetValue(hookName, out var list) || list.Count == 0) return true; - snapshot = new List(list); + snapshotCount = list.Count; + snapshot = ArrayPool.Shared.Rent(snapshotCount); + for (var i = 0; i < snapshotCount; i++) + snapshot[i] = list[i]; } - foreach (var sub in snapshot) + try { - try + for (var i = 0; i < snapshotCount; i++) { - if (sub.Handler != null && !sub.Handler(payload)) - return false; - } - catch (Exception ex) - { - MelonLogger.Warning($"[gregCore] Cancelable handler for '{hookName}' threw: {ex.Message}"); + var sub = snapshot[i]; + try + { + if (sub.Handler != null && !sub.Handler(payload)) + return false; + } + catch (Exception ex) + { + MelonLogger.Warning($"[gregCore] Cancelable handler for '{hookName}' threw: {ex.Message}"); + } } } + finally + { + Array.Clear(snapshot, 0, snapshotCount); + ArrayPool.Shared.Return(snapshot); + } return true; } diff --git a/src/gregSdk/gregHookName.cs b/src/gregSdk/gregHookName.cs index 16df23b3..8bedea6a 100644 --- a/src/gregSdk/gregHookName.cs +++ b/src/gregSdk/gregHookName.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Concurrent; using System.Text; namespace greg.Sdk; @@ -9,6 +10,7 @@ namespace greg.Sdk; public static class gregHookName { private const string Prefix = "greg"; + private static readonly ConcurrentDictionary<(GregDomain Domain, string Action), string> NoSubjectCache = new(); public static string Create(GregDomain domain, string action) => Create(domain, action, null); @@ -18,12 +20,23 @@ public static class gregHookName if (string.IsNullOrWhiteSpace(action)) throw new ArgumentException("Action is required.", nameof(action)); - var domainPart = DomainToSegment(domain); - var sb = new StringBuilder(Prefix.Length + 1 + domainPart.Length + 1 + action.Length + 32); - sb.Append(Prefix).Append('.').Append(domainPart).Append('.').Append(action.Trim()); + var normalizedAction = action.Trim(); - if (!string.IsNullOrWhiteSpace(subject)) - sb.Append('.').Append(subject.Trim()); + if (string.IsNullOrWhiteSpace(subject)) + { + return NoSubjectCache.GetOrAdd((domain, normalizedAction), static key => + { + var domainPart = DomainToSegment(key.Domain); + var sb = new StringBuilder(Prefix.Length + 1 + domainPart.Length + 1 + key.Action.Length); + sb.Append(Prefix).Append('.').Append(domainPart).Append('.').Append(key.Action); + return sb.ToString(); + }); + } + + var domainPart = DomainToSegment(domain); + var normalizedSubject = subject.Trim(); + var sb = new StringBuilder(Prefix.Length + 1 + domainPart.Length + 1 + normalizedAction.Length + 1 + normalizedSubject.Length); + sb.Append(Prefix).Append('.').Append(domainPart).Append('.').Append(normalizedAction).Append('.').Append(normalizedSubject); return sb.ToString(); } diff --git a/src/gregSdk/gregNativeEventHooks.cs b/src/gregSdk/gregNativeEventHooks.cs index 5946fe26..3c8b94c3 100644 --- a/src/gregSdk/gregNativeEventHooks.cs +++ b/src/gregSdk/gregNativeEventHooks.cs @@ -38,6 +38,49 @@ public static class gregNativeEventHooks // —— Time / balance sheet —— public const string SystemSnapshotSaved = "greg.SYSTEM.SnapshotSaved"; + public const string SystemCalculateRates = "greg.SYSTEM.CalculateRates"; + public const string SystemButtonBalanceSheetScreen = "greg.SYSTEM.ButtonBalanceSheetScreen"; + public const string UiGetOrCreateRecord = "greg.UI.GetOrCreateRecord"; + public const string SystemTrackFinances = "greg.SYSTEM.TrackFinances"; + public const string SystemFillInBalanceSheet = "greg.SYSTEM.FillInBalanceSheet"; + public const string SystemTotalRowAdded = "greg.SYSTEM.TotalRowAdded"; + public const string SystemRegisterSalary = "greg.SYSTEM.RegisterSalary"; + public const string SystemRestoreRecord = "greg.SYSTEM.RestoreRecord"; + public const string UiGetSaveData = "greg.UI.GetSaveData"; + public const string UiFromSaveLoaded = "greg.UI.FromSaveLoaded"; + public const string UiGetLatestSnapshot = "greg.UI.GetLatestSnapshot"; + public const string SystemCartTotalChanged = "greg.SYSTEM.CartTotalChanged"; + public const string SystemNewItemPurchased = "greg.SYSTEM.NewItemPurchased"; + public const string SystemAnotherItemPurchased = "greg.SYSTEM.AnotherItemPurchased"; + public const string SystemPhysicalItemSpawned = "greg.SYSTEM.PhysicalItemSpawned"; + + // —— Customer extensions —— + public const string CustomerComponentInitialized = "greg.CUSTOMER.ComponentInitialized"; + public const string CustomerServerCountAndSpeedChanged = "greg.CUSTOMER.CustomerServerCountAndSpeedChanged"; + public const string CustomerAppPerformanceAdded = "greg.CUSTOMER.AppPerformanceAdded"; + public const string CustomerResetAllAppSpeeds = "greg.CUSTOMER.ResetAllAppSpeeds"; + public const string CustomerUpBaseSet = "greg.CUSTOMER.UpBaseSet"; + public const string CustomerUpAppSet = "greg.CUSTOMER.UpAppSet"; + public const string CustomerSpeedOnCustomerBaseAppChanged = "greg.CUSTOMER.SpeedOnCustomerBaseAppChanged"; + public const string CustomerDataLoaded = "greg.CUSTOMER.DataLoaded"; + public const string CustomerInteractOnClick = "greg.CUSTOMER.InteractOnClick"; + public const string CustomerInteractOnHover = "greg.CUSTOMER.InteractOnHover"; + public const string CustomerOpenDoorAndSetupBase = "greg.CUSTOMER.OpenDoorAndSetupBase"; + public const string CustomerOpenDoor = "greg.CUSTOMER.OpenDoor"; + public const string CustomerOnLoad = "greg.CUSTOMER.OnLoad"; + public const string CustomerOnDestroy = "greg.CUSTOMER.OnDestroy"; + public const string CustomerSet = "greg.CUSTOMER.CustomerSet"; + public const string SystemButtonCancelCustomerChoice = "greg.SYSTEM.ButtonCancelCustomerChoice"; + public const string SystemShowCustomerCardsCanvas = "greg.SYSTEM.ShowCustomerCardsCanvas"; + public const string SystemCreateFallbackCustomer = "greg.SYSTEM.CreateFallbackCustomer"; + public const string SystemGetCustomerTotalRequirement = "greg.SYSTEM.GetCustomerTotalRequirement"; + public const string SystemIsCustomerSuitableForBase = "greg.SYSTEM.IsCustomerSuitableForBase"; + public const string NetworkRegisterCustomerBase = "greg.NETWORK.RegisterCustomerBase"; + public const string NetworkGetCustomerBase = "greg.NETWORK.GetCustomerBase"; + public const string NetworkDeviceCustomerIDChanged = "greg.NETWORK.DeviceCustomerIDChanged"; + public const string ServerButtonClickChangeCustomer = "greg.SERVER.ButtonClickChangeCustomer"; + public const string ServerGetNextCustomerID = "greg.SERVER.GetNextCustomerID"; + public const string ServerGetCustomerID = "greg.SERVER.GetCustomerID"; // —— MainGameManager / ComputerShop / HR (greg_hooks lists these under greg.SYSTEM.*) —— public const string SystemButtonCustomerChosen = "greg.SYSTEM.ButtonCustomerChosen"; @@ -106,6 +149,21 @@ public static class gregNativeEventHooks public const string EmployeeAnimationStateChanged = "greg.EMPLOYEE.AnimationStateChanged"; public const string GameplayIncidentTriggered = "greg.GAMEPLAY.IncidentTriggered"; + // —— Performance & Telemetry —— + public const string SYSTEM_GameStateChanged = "greg.SYSTEM.GameStateChanged"; + public const string SYSTEM_FrameLimitChanged = "greg.SYSTEM.FrameLimitChanged"; + public const string SYSTEM_RenderOptimizerApplied = "greg.SYSTEM.RenderOptimizerApplied"; + public const string SYSTEM_TelemetryExported = "greg.SYSTEM.TelemetryExported"; + public const string SYSTEM_PlayerAfkDetected = "greg.SYSTEM.PlayerAfkDetected"; + public const string SYSTEM_PlayerAfkEnded = "greg.SYSTEM.PlayerAfkEnded"; + public const string SYSTEM_FrameSpikeDetected = "greg.SYSTEM.FrameSpikeDetected"; + + // —— PerfCore Hooks —— + public const string SYSTEM_FrameCapApplied = "greg.SYSTEM.FrameCapApplied"; + public const string SYSTEM_ThreadingConfigured = "greg.SYSTEM.ThreadingConfigured"; + public const string SYSTEM_PostFxOptimized = "greg.SYSTEM.PostFxOptimized"; + public const string SYSTEM_GcTriggered = "greg.SYSTEM.GcTriggered"; + // —— Framework-only (no matching entry in greg_hooks for this pipeline) —— public static readonly string SystemGameDayAdvanced = gregHookName.Create(GregDomain.System, "GameDayAdvanced"); public static readonly string CustomerAppRequirementsSatisfied = gregHookName.Create(GregDomain.Customer, "AppRequirementsSatisfied"); @@ -150,6 +208,48 @@ public static class gregNativeEventHooks [EventIds.DayEnded] = SystemGameDayAdvanced, [EventIds.MonthEnded] = SystemSnapshotSaved, + [EventIds.RatesCalculated] = SystemCalculateRates, + [EventIds.BalanceSheetScreenOpened] = SystemButtonBalanceSheetScreen, + [EventIds.BalanceSheetRecordAccessed] = UiGetOrCreateRecord, + [EventIds.BalanceSheetTrackFinances] = SystemTrackFinances, + [EventIds.BalanceSheetFilled] = SystemFillInBalanceSheet, + [EventIds.BalanceSheetTotalRowAdded] = SystemTotalRowAdded, + [EventIds.BalanceSheetSalaryRegistered] = SystemRegisterSalary, + [EventIds.BalanceSheetRecordRestored] = SystemRestoreRecord, + [EventIds.BalanceSheetDataSaved] = UiGetSaveData, + [EventIds.BalanceSheetDataLoaded] = UiFromSaveLoaded, + [EventIds.BalanceSheetLatestSnapshotRequested] = UiGetLatestSnapshot, + [EventIds.ShopCartTotalUpdated] = SystemCartTotalChanged, + [EventIds.ShopNewItemPurchased] = SystemNewItemPurchased, + [EventIds.ShopAnotherItemPurchased] = SystemAnotherItemPurchased, + [EventIds.ShopPhysicalItemSpawned] = SystemPhysicalItemSpawned, + + [EventIds.CustomerComponentInitialized] = CustomerComponentInitialized, + [EventIds.CustomerServerCountAndSpeedChanged] = CustomerServerCountAndSpeedChanged, + [EventIds.CustomerAppPerformanceAdded] = CustomerAppPerformanceAdded, + [EventIds.CustomerAppSpeedsReset] = CustomerResetAllAppSpeeds, + [EventIds.CustomerBaseSetup] = CustomerUpBaseSet, + [EventIds.CustomerAppSetup] = CustomerUpAppSet, + [EventIds.CustomerSpeedOnAppChanged] = CustomerSpeedOnCustomerBaseAppChanged, + [EventIds.CustomerDataLoaded] = CustomerDataLoaded, + [EventIds.CustomerDoorClicked] = CustomerInteractOnClick, + [EventIds.CustomerDoorHovered] = CustomerInteractOnHover, + [EventIds.CustomerDoorOpenedAndSetup] = CustomerOpenDoorAndSetupBase, + [EventIds.CustomerDoorOpened] = CustomerOpenDoor, + [EventIds.CustomerDoorLoaded] = CustomerOnLoad, + [EventIds.CustomerDoorDestroyed] = CustomerOnDestroy, + [EventIds.CustomerCardSet] = CustomerSet, + [EventIds.CustomerChoiceCanceled] = SystemButtonCancelCustomerChoice, + [EventIds.CustomerCardsCanvasShown] = SystemShowCustomerCardsCanvas, + [EventIds.CustomerFallbackCreated] = SystemCreateFallbackCustomer, + [EventIds.CustomerTotalRequirementRequested] = SystemGetCustomerTotalRequirement, + [EventIds.CustomerSuitabilityChecked] = SystemIsCustomerSuitableForBase, + [EventIds.NetworkCustomerBaseRegistered] = NetworkRegisterCustomerBase, + [EventIds.NetworkCustomerBaseRequested] = NetworkGetCustomerBase, + [EventIds.NetworkDeviceCustomerIdChanged] = NetworkDeviceCustomerIDChanged, + [EventIds.ServerChangeCustomerClicked] = ServerButtonClickChangeCustomer, + [EventIds.ServerNextCustomerIdRequested] = ServerGetNextCustomerID, + [EventIds.ServerCustomerIdRequested] = ServerGetCustomerID, [EventIds.CustomerAccepted] = SystemButtonCustomerChosen, [EventIds.CustomerSatisfied] = CustomerAppRequirementsSatisfied, diff --git a/tests/Core/DependencyResolverTests.cs b/tests/Core/DependencyResolverTests.cs new file mode 100644 index 00000000..55d36ffe --- /dev/null +++ b/tests/Core/DependencyResolverTests.cs @@ -0,0 +1,34 @@ +/// +/// Schicht: Tests +/// Zweck: Tests für den GregDependencyResolver. +/// Maintainer: Testet lineare, zyklische und fehlende Abhängigkeiten. +/// + +using System; +using System.Collections.Generic; +using System.Linq; +using Xunit; +using FluentAssertions; +using gregCore.Infrastructure.Plugins; +using gregCore.Core.Models; + +namespace gregCore.Tests.Core; + +public class DependencyResolverTests +{ + [Fact] + public void Resolve_WithLinearDependencies_ShouldReturnCorrectOrder() + { + var resolver = new GregDependencyResolver(); + var plugins = new List + { + new() { Manifest = new ModManifest { Id = "C", Dependencies = new[] { "B" } } }, + new() { Manifest = new ModManifest { Id = "A", Dependencies = Array.Empty() } }, + new() { Manifest = new ModManifest { Id = "B", Dependencies = new[] { "A" } } } + }; + + var result = resolver.Resolve(plugins); + + result.Should().NotBeEmpty(); + } +} diff --git a/tests/Events/GregEventBusTests.cs b/tests/Events/GregEventBusTests.cs new file mode 100644 index 00000000..589107e0 --- /dev/null +++ b/tests/Events/GregEventBusTests.cs @@ -0,0 +1,54 @@ +/// +/// Schicht: Tests +/// Zweck: Tests für den GregEventBus. +/// Maintainer: Stellt Thread-Safety und Funktionalität sicher. +/// + +using System; +using Xunit; +using FluentAssertions; +using gregCore.Core.Events; +using gregCore.Core.Models; +using gregCore.Tests.Mocks; + +namespace gregCore.Tests.Events; + +public class GregEventBusTests +{ + [Fact] + public void SubscribeAndPublish_ShouldInvokeHandler() + { + using var bus = new GregEventBus(new MockLogger()); + var invoked = false; + + bus.Subscribe("test.hook", p => invoked = true); + bus.Publish("test.hook", new EventPayload()); + + invoked.Should().BeTrue(); + } + + [Fact] + public void Unsubscribe_ShouldNotInvokeHandler() + { + using var bus = new GregEventBus(new MockLogger()); + var invoked = false; + Action handler = p => invoked = true; + + bus.Subscribe("test.hook", handler); + bus.Unsubscribe("test.hook", handler); + bus.Publish("test.hook", new EventPayload()); + + invoked.Should().BeFalse(); + } + + [Fact] + public void CancelableEvent_ShouldReturnFalseWhenCancelled() + { + using var bus = new GregEventBus(new MockLogger()); + + bus.Subscribe("test.hook", p => p.IsCancelled = true); + var result = bus.Publish("test.hook", new EventPayload { IsCancelable = true }); + + result.Should().BeFalse(); + } +} diff --git a/tests/Mocks/MockLogger.cs b/tests/Mocks/MockLogger.cs new file mode 100644 index 00000000..ed58624e --- /dev/null +++ b/tests/Mocks/MockLogger.cs @@ -0,0 +1,28 @@ +/// +/// Schicht: Tests +/// Zweck: Mock-Logger für Unit-Tests. +/// Maintainer: Nur in Tests verwenden. +/// + +using System; +using System.Collections.Generic; +using System.Linq; +using gregCore.Core.Abstractions; + +namespace gregCore.Tests.Mocks; + +public class MockLogger : IGregLogger +{ + public enum LogLevel { Debug, Info, Warning, Error } + public List<(LogLevel Level, string Message)> Logs { get; } = new(); + + public void Debug(string message) => Logs.Add((LogLevel.Debug, message)); + public void Info(string message) => Logs.Add((LogLevel.Info, message)); + public void Warning(string message) => Logs.Add((LogLevel.Warning, message)); + public void Error(string message, Exception? ex = null) => Logs.Add((LogLevel.Error, $"{message} {ex?.Message}")); + + public IGregLogger ForContext(string context) => this; + + public bool AssertLogged(LogLevel level, string partialMessage) => + Logs.Any(l => l.Level == level && l.Message.Contains(partialMessage)); +} diff --git a/tests/gregCore.Tests.csproj b/tests/gregCore.Tests.csproj index 37bc0891..0f7dd914 100644 --- a/tests/gregCore.Tests.csproj +++ b/tests/gregCore.Tests.csproj @@ -1,23 +1,21 @@ - net8.0 - v1.0.0.0 - enable + net6.0 + 10.0 enable + enable false - - - - - - - - - - - - - + + + + + + + + + + + \ No newline at end of file