

In my opinion Luanti is a living proof that top-down extensibility aka “we make monolithic engine in C++ and then provide some APIs for scripting via bindings for some scripting language on the side” doesn’t work well. You can’t change main menu, you can’t fix player controller (and the default one sucks), you can’t write your own renderer, etc. Because developers didn’t imagine someone would want that (actually they probably did, but they simply don’t have capacity to provide this). Good extensibility/modability should be automatic, on binary level. Like what you get by developing in bytecode/JIT-compiled languages like Java/C# or in old Unreal Engines where everything was done in bytecode-(de)compilable special language called Unreal Script.
Its moddability/extensibility is way inferior to Minecraft, where you can change basically everything, including rendering, networking, main menu, sound engine, etc. Check my previous comment on my profile page.