This looks really good, and would have helped a lot the younger me.
Beginners should try to get used to this, as will make everything more clear in their scripts, and easier to debug. (especially when about leaks)
Great job!
PS:
There are some things you might want to re-check
1. The filePath in ModuleManager is looking for directory "modules", while in your .zip you have "module" directory
2. The newTimer function should use funcName instead of this.funcName
3. onPlayerActionChange parameters are wrong
4. In debug.nut you are missing .len() in cmd "modules" for(), and the player argument in MessagePlayer
PS2:
Ah, I thought it allows using same event in multiple modules
EDIT:
Seems like there is a bigger problem with your newTimer - passing vargv to NewTimer.
I remember somebody created one which accepts all types of data; you should check that out.
The very sample you provided isn't working due to that reason..
EDIT2: Ah, ofc was the lord @. S.L.C. Extended Timers
Beginners should try to get used to this, as will make everything more clear in their scripts, and easier to debug. (especially when about leaks)
Great job!
PS:
There are some things you might want to re-check

1. The filePath in ModuleManager is looking for directory "modules", while in your .zip you have "module" directory
2. The newTimer function should use funcName instead of this.funcName
3. onPlayerActionChange parameters are wrong
4. In debug.nut you are missing .len() in cmd "modules" for(), and the player argument in MessagePlayer
PS2:
Ah, I thought it allows using same event in multiple modules
EDIT:
Seems like there is a bigger problem with your newTimer - passing vargv to NewTimer.
I remember somebody created one which accepts all types of data; you should check that out.
The very sample you provided isn't working due to that reason..
EDIT2: Ah, ofc was the lord @. S.L.C. Extended Timers
