Introduction
Luanti 5.12.0 is here! Perfectly on schedule, we swear! Anyway, this time Luanti is sporting new input handling and controls, new item and entity visuals, better map performance, and more.
You can download Luanti from our website, check out the code on GitHub, or read the full changelog.
Table of Contents
- SDL2 Window and Input Handling
- Control Your Controls
- More Animation, Less Blur, and New Reviews
- Camera Mode, Entity Visuals, and More
- World and Object Performance
- Other Highlights
- What’s Next?
SDL2 Window and Input Handling
This section covers a plethora of outstanding issues, so don’t skip this one— SDL is a bigger deal than you might think! Until this release, Luanti relied on Irrlicht’s custom window and input interfaces, which (much like a lot of old Irrlicht code) was very outdated and buggy. SDL, on the other hand, has been consistently updated since 1998 and has been battle-tested by thousands of major applications over the years.
Efforts to migrate to SDL2 have been ongoing for a few years now, and 5.12.0 is the first version to finally see those efforts come to fruition. The cross-platform wrappers SDL2 brings have enabled a bunch of cool stuff:
- Touchscreen controls are now supported on any touchscreen device (not just mobile) (irr#262, #14146, #14075, others)
- Key binding is now based on physical position (scancodes), allowing non-QWERTY keyboards to work out of the box and fixing some platform-specific issues on macOS and others (#14964)
- Support for high-DPI screens (#14703)
- Desktop IME support for text input on all platforms (helpful for CJK and other lanuages) (#14942)
- Toggle fullscreen with F11 on all platforms (#14714)
This also brings reliability and stability to the window and input system, fixing many other long-standing bugs. It will also make it easier to upgrade to SDL3, should we choose to in the future.
Control Your Controls
Speaking of input handling, there have been a handful of control improvements.
Keybinds now live in the Settings menu, bringing with it some missing controls and keys (and now benefiting from Lua formspec features). The sneak
and aux1
keys are now optionally togglable, saving you from finger strain while running along all those edges.

For our touchscreen users, dig and place buttons can be enabled instead of using gestures.
More Animation, Less Blur, and New Reviews
This time we’ll start with a big one: Animated node textures on the GUI! After all these years, animated node textures are finally displayed in the inventory, hotbar, and hand. Non-node animations coming soon.
Texture filtering is no longer a blurry mess, softening pixels as intended. Gone are the days of screenshots ruined by bilinear and trilinear filtering!

Package pages in the content browser now have a Reviews tab where you can see exactly what other users like (or dislike) about that thing you want to download. Also pictured below is the new default flat button style with the 2000s-style gradient removed.

Camera Mode, Entity Visuals, and More
Are you making a game with an exclusively 3rd-person camera? Need the player to take a good look at themselves? The new set_camera
player method allows developers to set the current camera mode by force! This method will hopefully expand in the future.
The node
visual type has been introduced to entities to represent any node (instead of hacking the item
visual til it looks right).
initial_properties = {
visual = "node",
node = {
name = "mymod:mynode",
param2 = 42, -- It supports paramtypes too!
}
}
Developers can now prevent the Escape
key from closing their formspecs using the allow_close[true]
element. The form can still be closed with an exit button or with Shift + Esc
in emergencies (so don’t rely on your forms being locked open). The try_quit
event field has also been introduced to watch for close attempts on locked forms.
As for notable fixes, custom hands now properly override all tool capabilities. glTF models saw various fixes, most importantly local transforms no longer affect meshes.
World and Object Performance
Alongside better world loading and generation performance, world storage has been changed to save block positions as separate integers instead of a hash. This simpler implementation is much easier to work with internally and for external tools. Please note: Worlds created with or migrated to 5.12.0 are not backward-compatible.
Objects have also seen a storage speed upgrade with a new spatial index, as well as better collision detection.
Other Highlights
- Perlin noise has been renamed to Value noise (old methods are not yet deprecated) (#15858)
/msg
will echo your sent message back to you like it used to (#15887)- Item registration is now stricter to avoid bad practice (#15912)
- Server texture packs have been documented (#15951)
- IPv6 is now enabled by default for servers (#15739 🚂)
What’s Next?
5.13.0 will likely be released a month sooner than normal, so expect a smaller update, but you can still track the work being done on animated items, glTF morph animations, skybox layers, and more. Coming soon to a Luanti version near you!
Questions? Ideas? Feel free to get involved!
Cover image by GreenXenith.