Configuration Panel

API extension that allows seamless loading of mod configuration at runtime

API / Library / Programmer Tools

Configuration Panel is an API extension for Minetest that allows seamless loading of mod configuration at runtime. It provides much greater flexibility than Minetest's builtin 'Settings' interface, since the mod configuration itself is read as a native Lua script. Hence it's possible to include simple data structures without the need for serialization, in addition to temporary variables, mathematical expressions, and conditional branching.

"An important use of Lua is as a configuration language...."
from Programming in Lua: Extending your Application (https://www.lua.org/pil/25.html)

"Lua started off as a configuration language. This has some nice quirks in that it's great for creating and configuring things - which is what you want to do in a game."
from Lua Users Wiki: Lua versus Python (http://lua-users.org/wiki/LuaVersusPython)

While some might be opposed to using Lua for configuration purposes, arguing that it is anti-pattern, that's not actually true. In fact, Lua itself was originally intended to double as a configuration language, like JSON, so it is very befitting of its purpose.

There is only one function call necessary to load your mod's configuration:

minetest.load_config( base_config, options )
Automatically loads the mod configuration at server-startup according to the options and returns a table of key-value pairs.

By default, the configuration is first loaded from the 'config.lua' script within the mod directory. If not found, it will instead be loaded from a script residing within the 'config' subdirectory of the current world. That script must be named the same as the mod but with a '.lua' extension, of course.

This would be the typical order of loading on Linux distros of Minetest:

/usr/local/share/minetest/games/minetest_game/mods/sample_mod/config.lua
/home/minetest/.minetest/worlds/sample_world/config/sample_mod.lua

By specifying the option can_override = true, both scripts will be loaded, allowing for the world configuration to override the game configuration. So for example

/usr/local/share/minetest/games/minetest_game/mods/sample_mod/config.lua
        allow_fly = false
        allow_walk = false
        allow_swim = false

/home/minetest/.minetest/worlds/sample_world/config/sample_mod.lua
        allow_swim = true

Hence, 'allow_fly' and 'allow_walk' will be false, whereas 'allow_swim' will be true. By default, however, all three would remain false since the world configuration is ignored whenever the game configuration is found.

A chat command is also available for editing the configuration directly in-game. Simply type '/config' followed by the mod name to configure. The interface is self-explanatory.