Skip to content

Conversation

@DasKeifer
Copy link
Member

@DasKeifer DasKeifer commented Feb 3, 2026

As the title says, this enhances the modApiExt hooks and events to provide the same level of details as the modLoader hooks/events. This relies on the ModLoader PR: itb-community/ITB-ModLoader#230

Below is an example of an intentionally injected hook and event failure. Before this it was a one line error on the specific line. This should allow for easier debugging of hooks especially that are failing in lower level, generic code

[2026-02-02 22:01:45] [./scripts/mod_loader/bootstrap/event.lua:282]: An event callback failed: ...tedRiceExts/exts/CPLUS+_Ex/scripts/time_traveler.lua:19: attempt to index global 'varToFailOn' (a nil value)
- Event\Hook: onPodLanded
- Call trace: 
    stack traceback:
        ...tedRiceExts/exts/CPLUS+_Ex/scripts/time_traveler.lua:19: in function 'testFnEventFailure3'
        ...tedRiceExts/exts/CPLUS+_Ex/scripts/time_traveler.lua:23: in function 'testFnEventFailure2'
        ...tedRiceExts/exts/CPLUS+_Ex/scripts/time_traveler.lua:27: in function 'testFnEventFailure1'
        ...tedRiceExts/exts/CPLUS+_Ex/scripts/time_traveler.lua:60: in function <...tedRiceExts/exts/CPLUS+_Ex/scripts/time_traveler.lua:59>
        (tail call): ?
- Subscribed at: 
    stack traceback:
        ./scripts/mod_loader/bootstrap/event.lua:140: in function 'subscribe'
        ...tedRiceExts/exts/CPLUS+_Ex/scripts/time_traveler.lua:59: in function 'init'
        ...ns/RedactedRiceExts/exts/CPLUS+_Ex/cplus_plus_ex.lua:77: in function 'initModules'
        ...ns/RedactedRiceExts/exts/CPLUS+_Ex/cplus_plus_ex.lua:135: in function 'init'
        ...ons/RedactedRiceExts/exts/CPLUS+_Ex/scripts/init.lua:25: in function 'init'
        ./scripts/mod_loader/mod_loader.lua:464: in function <./scripts/mod_loader/mod_loader.lua:462>
        [C]: in function 'xpcall'
        ./scripts/mod_loader/mod_loader.lua:461: in function 'initMod'
        ./scripts/mod_loader/mod_loader.lua:157: in function 'init'
        ./scripts/mod_loader/mod_loader.lua:781: in main chunk
        [C]: in function 'require'
        ./scripts/mod_loader/__scripts.lua:42: in main chunk
        [C]: in function 'require'
        scripts/modloader.lua:1: in main chunk
- Dispatched at: 
    stack traceback:
        ./scripts/mod_loader/bootstrap/event.lua:294: in function 'dispatch'
        ...oaderExtensions/mods/modApiExt/scripts/modApiExt.lua:143: in function 'fn'
        ...LoaderExtensions/mods/modApiExt/scripts/internal.lua:48: in function <...LoaderExtensions/mods/modApiExt/scripts/internal.lua:48>
        [C]: in function 'xpcall'
        ...LoaderExtensions/mods/modApiExt/scripts/internal.lua:46: in function 'firePodLandedHooks'
        ...modLoaderExtensions/mods/modApiExt/scripts/alter.lua:356: in function 'findAndTrackPods'
        ...modLoaderExtensions/mods/modApiExt/scripts/alter.lua:327: in function 'updateTiles'
        ...modLoaderExtensions/mods/modApiExt/scripts/alter.lua:748: in function 'fn'
        ./scripts/mod_loader/bootstrap/modApi.lua:186: in function <./scripts/mod_loader/bootstrap/modApi.lua:184>
        (tail call): ?
        [C]: in function 'xpcall'
        ./scripts/mod_loader/bootstrap/event.lua:56: in function 'notify'
        ./scripts/mod_loader/bootstrap/event.lua:297: in function 'dispatch'
        ./scripts/mod_loader/bootstrap/modApi.lua:181: in function 'fireMissionUpdateHooks'
        ./scripts/mod_loader/altered/missions.lua:72: in function <./scripts/mod_loader/altered/missions.lua:61>
        (tail call): ?
[2026-02-02 22:01:45] [...LoaderExtensions/mods/modApiExt/scripts/internal.lua:10]: An event callback failed: ...tedRiceExts/exts/CPLUS+_Ex/scripts/time_traveler.lua:31: attempt to index global 'varToFailOn' (a nil value)
- Event\Hook: firePodLandedHooks
- Call trace: 
    stack traceback:
        ...tedRiceExts/exts/CPLUS+_Ex/scripts/time_traveler.lua:31: in function 'testFnHookFailure3'
        ...tedRiceExts/exts/CPLUS+_Ex/scripts/time_traveler.lua:35: in function 'testFnHookFailure2'
        ...tedRiceExts/exts/CPLUS+_Ex/scripts/time_traveler.lua:39: in function 'testFnHookFailure1'
        ...tedRiceExts/exts/CPLUS+_Ex/scripts/time_traveler.lua:82: in function 'fn'
        ...LoaderExtensions/mods/modApiExt/scripts/internal.lua:48: in function <...LoaderExtensions/mods/modApiExt/scripts/internal.lua:48>
- Subscribed at: 
    stack traceback:
        ...ns/RedactedRiceExts/exts/CPLUS+_Ex/cplus_plus_ex.lua:148: in function 'load'
        ...ons/RedactedRiceExts/exts/CPLUS+_Ex/scripts/init.lua:29: in function 'load'
        ./scripts/mod_loader/mod_loader.lua:721: in function <./scripts/mod_loader/mod_loader.lua:720>
        [C]: in function 'xpcall'
        ./scripts/mod_loader/mod_loader.lua:719: in function 'loadModContent'
        ./scripts/mod_loader/altered/misc.lua:170: in function <./scripts/mod_loader/altered/misc.lua:166>
- Dispatched at: 
    stack traceback:
        ...LoaderExtensions/mods/modApiExt/scripts/internal.lua:32: in function 'firePodLandedHooks'
        ...modLoaderExtensions/mods/modApiExt/scripts/alter.lua:356: in function 'findAndTrackPods'
        ...modLoaderExtensions/mods/modApiExt/scripts/alter.lua:327: in function 'updateTiles'
        ...modLoaderExtensions/mods/modApiExt/scripts/alter.lua:748: in function 'fn'
        ./scripts/mod_loader/bootstrap/modApi.lua:186: in function <./scripts/mod_loader/bootstrap/modApi.lua:184>
        (tail call): ?
        [C]: in function 'xpcall'
        ./scripts/mod_loader/bootstrap/event.lua:56: in function 'notify'
        ./scripts/mod_loader/bootstrap/event.lua:297: in function 'dispatch'
        ./scripts/mod_loader/bootstrap/modApi.lua:181: in function 'fireMissionUpdateHooks'
        ./scripts/mod_loader/altered/missions.lua:72: in function <./scripts/mod_loader/altered/missions.lua:61>
        (tail call): ?

To test, add code that will intentionally fail and trigger the hooks. In this case, I added podLanded hooks with a few layers of fns just to show the stack trace is working correctly

local function testFnEventFailure3()
	varToFailOn.nilObj = 5
end

local function testFnEventFailure2()
	testFnEventFailure3()
end

local function testFnEventFailure1()
	testFnEventFailure2()
end

local function testFnHookFailure3()
	varToFailOn.nilObj = 5
end

local function testFnHookFailure2()
	testFnHookFailure3()
end

local function testFnHookFailure1()
	testFnHookFailure2()
end

mod:init()
	modapiext.events.onPodLanded:subscribe(function()
		testFnEventFailure1()
	end)
end
mod:load()
	modapiext:addPodLandedHook(function()
		testFnHookFailure1()
	end)
end

Then enter a mission and trigger a pod landing via console with the pod command

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants