Symptom → cause → fix. (Oxide equivalent: “Reporting Issues” + owner troubleshooting, adapted to a client framework.)
| Symptom |
Cause |
Fix |
| “No hooks found” / no events fire |
game_hooks.json not next to gregCore.dll |
Place both JSON files alongside the DLL (Mods/ or BepInEx/plugins/gregCore/); check [DynamicPatcher] log lines |
| F1 Hub never opens |
Misplaced files, or another overlay locked input |
Verify install; close Pause/Escape/Options overlays; check GregMenuRegistry lock state in log |
HWID SYSTEM ACTIVE missing |
Framework did not boot |
Re-extract release ZIP; confirm loader version (MelonLoader 0.7.2+ / BepInEx 6+); read full loader log |
| Toast about incompatible ID mod |
Old standalone 404-PersistentID mod present |
Remove it — IncompatibleModGuard already unpatched it; gregID must be the only ID system |
| Mod placed but never loads, no error |
File sits under a .deactivated folder |
By design — loaders never read .deactivated; move the mod back out and restart (Player Mod Users Guide) |
[gregCore][Manifest] warnings at boot |
Mods/manifest.json entry missing, not a .dll, or deactivated |
Fix the path, or remove the entry; deactivated entries must be activated first |
| Symptom |
Cause |
Fix |
| “Lua mod not loading” |
Wrong folder / missing entry |
Folder must be UserData/gregCore/Mods/Lua/<modId>/ with main.lua (or mod.json → custom entry) |
Silent failures, safe defaults (0/""/nil) |
Called outside the game or on error (by design, guarded boundary) |
Test in-game via F12 REPL; add greg.ui.log_info checkpoints |
| Per-frame log spam / stutter |
Logging or heavy work in on_update |
Move to greg.every; cache + throttle; see Developer Timers Coroutines |
require fails |
Path outside mod dir / circular |
Only <modDir>/ (+modules/) and @shared/; check *.lua vs */init.lua candidates |
| IO “access denied” |
Escape from sandbox |
Stay inside <modId>/data/; never .., /, \ in paths |
| JS/Python example code fails |
Examples are stale (subscribe/fire_event era) |
Use current JsBridge/PythonFFIBridge surface per Developer Scripting Bridges |
| Symptom |
Cause |
Fix |
| Invisible panel text |
Missing game font |
Apply GregFontLoader.DefaultUGUIFont (null-tolerant) |
| Clicks do nothing |
Only ClickEvent callback registered |
Add the GregClickRouter worldBound fallback + 500 ms dedup |
| Input stuck after closing panel |
Lock not released |
Pair every SetOpen(id, true) + Report with close-path release; re-check cursor/movement restore |
| Hub shows display-only row |
No opener registered |
RegisterOpener (or BindToggle) for that menuId |
| Symptom |
Cause |
Fix |
| Mod data gone after update |
Reused IDs / wrote vanilla structures |
Use sidecars + stable high-range IDs; never write vanilla save fields directly |
| Save won’t load vanilla after mod removal |
Modded fields leaked into vanilla |
Route through GregModPack/GregModSave + RegisterVanillaModuleMap fallback; test uninstall round-trip |
[HwId] error spam |
Corrupt entry in save |
Healer null-guards per entry — identify the ID from the log, EntityInventory.Verify() / Dump() (MelonPreferences gregCore.EntityInventory) |
| Symptom |
Cause |
Fix |
dotnet test fails: no .NET 6 runtime |
Host has only .NET 8/10 |
DOTNET_ROLL_FORWARD=Major dotnet test |
| Stale API after game update |
Interop/dump outdated |
Re-copy assemblies → GameApiGenerator/regenerate → re-dump hooks → validate_contracts.py → vanilla-first test |
| Coverage claim disputed |
Wrong denominator |
game_hooks.json (raw 1,850) vs framework/greg_hooks.json (curated) — see docs/modding/api/coverage.md |
- Backquote console →
mods, menus, keys, version — paste the output.
- Loader log excerpt (
[gregCore], [gregCore][HwId], [DynamicPatcher], errors).
- Game + framework + loader versions, mod list, single-player vs co-op.
- Mod-specific → mod tracker; Hub/HUD/consoles/saves → gregCore tracker; security →
SECURITY.md (never public).