{"@attributes":{"version":"2.0"},"channel":{"title":"Main Page on Luanti Documentation","link":"https:\/\/docs.luanti.org\/","description":"Recent content in Main Page on Luanti Documentation","generator":"Hugo","language":"en-us","item":[{"title":"Android","link":"https:\/\/docs.luanti.org\/for-engine-devs\/compiling\/android\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-engine-devs\/compiling\/android\/","description":"<h1 id=\"compiling-luanti-for-android\">Compiling Luanti for Android<a class=\"anchor\" href=\"#compiling-luanti-for-android\">#<\/a><\/h1>\n<p>The instructions in this article were written for and tested on Linux,\nbut the tools used here should also work on other platforms.<\/p>\n<h2 id=\"prerequisites\">Prerequisites<a class=\"anchor\" href=\"#prerequisites\">#<\/a><\/h2>\n<ul>\n<li>Basic familiarity with the command line.<\/li>\n<li>You have a working network connection.<\/li>\n<li>You have already downloaded \/ cloned a copy of Luanti to a folder called <code>luanti<\/code>.<\/li>\n<li>You have an Android device you want to install Luanti on for testing purposes\nor you want to produce a Luanti release build for distribution.<\/li>\n<\/ul>\n<h2 id=\"cli-tools\">CLI tools<a class=\"anchor\" href=\"#cli-tools\">#<\/a><\/h2>\n<h3 id=\"setup\">Setup<a class=\"anchor\" href=\"#setup\">#<\/a><\/h3>\n<p>You should have a recent version of OpenJDK installed (17 should be enough).<\/p>"},{"title":"Backup Solutions","link":"https:\/\/docs.luanti.org\/for-server-hosts\/backup-solutions\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-server-hosts\/backup-solutions\/","description":"<h1 id=\"backup-solutions\">Backup Solutions<a class=\"anchor\" href=\"#backup-solutions\">#<\/a><\/h1>\n<p>It is always important to backup data you and others might care about. For players, backing up a world is as simple as copying the world folder from <code>luanti\/worlds<\/code> to a different folder. The backup can then be loaded by copying that folder back into <code>luanti\/worlds<\/code>. The rest of this document covers advanced backup solutions for server hosts.<\/p>\n<h2 id=\"world-backups\">World Backups<a class=\"anchor\" href=\"#world-backups\">#<\/a><\/h2>\n<p>Worlds will usually be contained in the Luanti user data directory under the <code>worlds<\/code> directory, unless you run a dedicated server and explicitly specify a path to the world. The world is a folder containing various files associated with the world.<\/p>"},{"title":"Basic data structures","link":"https:\/\/docs.luanti.org\/for-engine-devs\/basic-data-structures\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-engine-devs\/basic-data-structures\/","description":"<h1 id=\"basic-data-structures\">Basic data structures<a class=\"anchor\" href=\"#basic-data-structures\">#<\/a><\/h1>\n<h2 id=\"irc-logs-on-this-subject\">IRC logs on this subject<a class=\"anchor\" href=\"#irc-logs-on-this-subject\">#<\/a><\/h2>\n<p><a href=\"http:\/\/web.archive.org\/web\/20160309052711\/http:\/\/logs.2pktfkt.de\/minetest-delta\/2011-11-07.html\">minetest-delta\/2011-11-07<\/a> <a href=\"http:\/\/web.archive.org\/web\/20160308105531\/http:\/\/logs.2pktfkt.de\/minetest-delta\/2011-11-08.html\">minetest-delta\/2011-11-08<\/a><\/p>\n<p>For the log dating 2011-11-07, the subject discussion starts at the end.<\/p>\n<h2 id=\"node\">Node<a class=\"anchor\" href=\"#node\">#<\/a><\/h2>\n<p>Simply put, <a href=\"https:\/\/docs.luanti.org\/for-players\/nodes\">nodes<\/a> are the &ldquo;cubes&rdquo; that make the world.<\/p>\n<p>A node in Luanti is a cubic section of the world with the size 1\u00d71\u00d71 set in a 3-D raster. Each node has one, and only one distinct type like dirt, sand, stone, air, water source, etc. Every node in the world has whole-number coordinates like (4,6,12). This means you can&rsquo;t place a node at a position like (4.5, 7.553, -64.5). There can only be one node per 3-D position, e.g. there can&rsquo;t be a stone <em>and<\/em> sand node at the same position.<\/p>"},{"title":"Blitz3d file format specification","link":"https:\/\/docs.luanti.org\/for-creators\/models\/b3d-spec\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/models\/b3d-spec\/","description":"<h1 id=\"blitz3d-file-format-specification\">Blitz3d file format specification<a class=\"anchor\" href=\"#blitz3d-file-format-specification\">#<\/a><\/h1>\n<p>This is a reformatted version of the specification of the Blitz3D file format, version 0.01,\npresumably by <code>marksibly@blitzbasic.co.nz<\/code>, originally available on <code>http:\/\/www.blitzbasic.co.nz<\/code>\n(which no longer operates) and placed in the public domain.<\/p>\n<h2 id=\"introduction\">Introduction<a class=\"anchor\" href=\"#introduction\">#<\/a><\/h2>\n<p>The Blitz3D file format specifies a format for storing texture, brush and entity descriptions for\nuse with the Blitz3D programming language.<\/p>\n<p>The rationale behind the creation of this format is to allow for the generation of much richer and\nmore complex Blitz3D scenes than is possible using established file formats - many of which do not\nsupport key features of Blitz3D, and all of which miss out on at least some features!<\/p>"},{"title":"Calinou's Law","link":"https:\/\/docs.luanti.org\/for-creators\/mapgen\/calinous-law\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/mapgen\/calinous-law\/","description":"<h1 id=\"calinous-law\">Calinou&rsquo;s Law<a class=\"anchor\" href=\"#calinous-law\">#<\/a><\/h1>\n<p><strong>Calinou&rsquo;s Law<\/strong> is a supposition about the density of ores in Luanti. It states, approximately:<\/p>\n<p>The more ores that are registered, the more likely you will be to find nothing BUT ores by the time you dig down to -31 km.<\/p>\n<p>In theory, one could reach a state in a game where there are indeed nothing but minerals and no plain stone at some depth by adding enough ore-bearing mods, however this particular idea refers more to the issue some people have of going on a mining expedition and coming back so loaded down with ores that one has no room in their inventory for anything else, such as cobblestone. Calinou&rsquo;s Law is this phenomenon taken to its logical extreme.<\/p>"},{"title":"celeron55","link":"https:\/\/docs.luanti.org\/about\/history\/celeron55\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/about\/history\/celeron55\/","description":"<h1 id=\"celeron55\">celeron55<a class=\"anchor\" href=\"#celeron55\">#<\/a><\/h1>\n<p><a href=\"https:\/\/docs.luanti.org\/images\/celeron55\/C55.jpg\"><img src=\"https:\/\/docs.luanti.org\/images\/celeron55\/C55.jpg\" alt=\"\" \/><\/a><\/p>\n<p>celeron55 <em>(old picture)<\/em><\/p>\n<p><a href=\"https:\/\/docs.luanti.org\/images\/celeron55\/C55-2.jpg\"><img src=\"https:\/\/docs.luanti.org\/images\/celeron55\/C55-2.jpg\" alt=\"\" \/><\/a><\/p>\n<p>celeron55 in 2012, using his Panasonic Toughbook CF-51.<\/p>\n<p>Perttu Ahola, better known as <strong>celeron55<\/strong> is the founder and lead developer of <a href=\"https:\/\/docs.luanti.org\/about\/luanti\">Luanti<\/a>.<\/p>\n<h2 id=\"biography\">Biography<a class=\"anchor\" href=\"#biography\">#<\/a><\/h2>\n<p>celeron55 leads quite a private life and so not much is known about his early life.<\/p>\n<p>He has worked on several other projects aside from Luanti.<\/p>\n<p>Much of his other work can be found on:<\/p>\n<ul>\n<li>his <a href=\"http:\/\/c55.me\/blog\/\">Blog<\/a>, (no longer online)<\/li>\n<li>his <a href=\"http:\/\/www.youtube.com\/celeron55\/\">YouTube<\/a>.<\/li>\n<\/ul>\n<h2 id=\"other-work\">Other Work<a class=\"anchor\" href=\"#other-work\">#<\/a><\/h2>\n<p><a href=\"http:\/\/c55.me\/blog\/?page_id=545\">His List<\/a> (no longer online)<\/p>"},{"title":"Changelog","link":"https:\/\/docs.luanti.org\/about\/changelog\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/about\/changelog\/","description":"<h1 id=\"changelog\">Changelog<a class=\"anchor\" href=\"#changelog\">#<\/a><\/h1>\n<p>Note that not all changes made to the code between releases are listed here. Fixes to bugs that were introduced after the previous release, small internal changes, code style fixes, and changes of the like are not listed.\nIf you want a list of <em>every<\/em> change made between releases see the <a href=\"https:\/\/github.com\/luanti-org\/luanti\/commits\/master\">commit log<\/a>.<\/p>\n<h2 id=\"5160--5161\">5.16.0 \u2192 5.16.1<a class=\"anchor\" href=\"#5160--5161\">#<\/a><\/h2>\n<p><strong><a href=\"https:\/\/github.com\/luanti-org\/luanti\/releases\/tag\/5.16.1\">Release<\/a><\/strong><\/p>\n<p>Released on 10 May 2026.<\/p>\n<h3 id=\"client--audiovisuals\">Client \/ Audiovisuals<a class=\"anchor\" href=\"#client--audiovisuals\">#<\/a><\/h3>\n<ul>\n<li>Flowing liquids are again rendered correctly.<\/li>\n<\/ul>\n<h2 id=\"5150--5160\">5.15.0 \u2192 5.16.0<a class=\"anchor\" href=\"#5150--5160\">#<\/a><\/h2>\n<p><strong><a href=\"https:\/\/github.com\/luanti-org\/luanti\/releases\/tag\/5.16.0\">Release<\/a><\/strong><\/p>"},{"title":"Chat","link":"https:\/\/docs.luanti.org\/for-players\/chat\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-players\/chat\/","description":"<h1 id=\"chat\">Chat<a class=\"anchor\" href=\"#chat\">#<\/a><\/h1>\n<p><em>This page is all about the in-game chat of Luanti. If you are interested in general Luanti chatter, refer to <a href=\"https:\/\/docs.luanti.org\/about\/irc\/\">IRC<\/a>.<\/em><\/p>\n<p>The <strong>in-game chat functionality<\/strong> allows players to communicate with each other with short text messages inside a <a href=\"https:\/\/docs.luanti.org\/for-players\/servers\/\">server<\/a>. This article also covers the chat log which is used for purposes other than showing chat messages as well.<\/p>\n<h2 id=\"sending-messages\">Sending messages<a class=\"anchor\" href=\"#sending-messages\">#<\/a><\/h2>\n<p>First of all, before you can chat anything at all, you require the \u201cshout\u201d privilege. Most servers give you this privilege by default, or they may require you to do something before you are granted access to chat.<\/p>"},{"title":"Cheating","link":"https:\/\/docs.luanti.org\/for-players\/cheating\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-players\/cheating\/","description":"<h1 id=\"cheating\">Cheating<a class=\"anchor\" href=\"#cheating\">#<\/a><\/h1>\n<p>Cheating means misusing features or exploits in the client, mods, or games, in an unintended way to have an advantage over other players.<\/p>\n<p>What is considered cheating and what isn&rsquo;t varies among server operators and players. If a feature is obviously unintended (e.g. duplicating items in some way), please refrain from using it, or at least ask if it is allowed. Use common sense.<\/p>\n<p><strong>Please don&rsquo;t add examples of serious bugs\/exploits to this page. That should be left as an exercise to readers.<\/strong><\/p>"},{"title":"Code style guidelines","link":"https:\/\/docs.luanti.org\/for-engine-devs\/code-style-guidelines\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-engine-devs\/code-style-guidelines\/","description":"<h1 id=\"code-style-guidelines\">Code style guidelines<a class=\"anchor\" href=\"#code-style-guidelines\">#<\/a><\/h1>\n<p>This is the coding style used for C\/C++ code. Also see the <a href=\"https:\/\/docs.luanti.org\/Lua_code_style_guidelines\">Lua code style guidelines<\/a>.<\/p>\n<p>The coding style is based on the <a href=\"https:\/\/www.kernel.org\/doc\/html\/latest\/process\/coding-style.html\">Linux kernel code style<\/a>. Much of the existing code doesn&rsquo;t follow the current code style guidelines, do not try to replicate that. Use your best judgment for C++-specific syntax.<\/p>\n<p>Currently, the code uses C++17. Do not use features that depend on more recent versions.<\/p>\n<h3 id=\"spelling\">Spelling<a class=\"anchor\" href=\"#spelling\">#<\/a><\/h3>\n<p>Use American English, but avoid idioms that may be difficult to understand by non-native speakers.<\/p>"},{"title":"Compatibility Guideline","link":"https:\/\/docs.luanti.org\/for-engine-devs\/compatibility-guideline\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-engine-devs\/compatibility-guideline\/","description":"<h1 id=\"compatibility-guideline\">Compatibility Guideline<a class=\"anchor\" href=\"#compatibility-guideline\">#<\/a><\/h1>\n<p><em>This file was written based on engine version 5.14.0-dev after PR 16796.<\/em><\/p>\n<p>When implementing features or extending the behavior of existing APIs, we generally want the following:<\/p>\n<ol>\n<li>Backwards compatibility: Keep existing features working (according to <a href=\"https:\/\/docs.luanti.org\/for-engine-devs\/version-number.md\">versioning<\/a>).<\/li>\n<li>Forwards compatibility and future-proofing: Make it as easy as possible to extend the feature in the future.<\/li>\n<\/ol>\n<p>This document gives a few insights on how to achieve backwards and forwards\ncompatibility among:<\/p>\n<ul>\n<li>old server + new client<\/li>\n<li>new server + old client<\/li>\n<\/ul>\n<h2 id=\"imperfect-backwards-compatibility\">Imperfect backwards compatibility<a class=\"anchor\" href=\"#imperfect-backwards-compatibility\">#<\/a><\/h2>\n<p>In many cases it is not possible to implement a feature such that it works perfectly\nwell on older clients. A compromise has to be defined.<\/p>"},{"title":"Console","link":"https:\/\/docs.luanti.org\/for-players\/console\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-players\/console\/","description":"<h1 id=\"console\">Console<a class=\"anchor\" href=\"#console\">#<\/a><\/h1>\n<p>The <strong>console<\/strong> is part of Luanti\u2019s GUI and makes it a bit easier to keep track of the <a href=\"https:\/\/docs.luanti.org\/for-players\/chat\/\">chat<\/a> and system messages. You also can type in chat messages and commands and scroll through an extensive log of messages.<\/p>\n<h2 id=\"usage\">Usage<a class=\"anchor\" href=\"#usage\">#<\/a><\/h2>\n<p>The console acts similar to the chat window but makes things just a bit more convenient. If you type a line which does not begin with a \u201c\/\u201d and hit Enter this line will be send as ordinary chat message. If the line <em>does<\/em> begin with a \u201c\/\u201d, the line will be interpreted as command. See <a href=\"https:\/\/docs.luanti.org\/for-players\/server-commands\/\">Server commands<\/a> for detailed usage instructions.<\/p>"},{"title":"ContentDB","link":"https:\/\/docs.luanti.org\/about\/contentdb\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/about\/contentdb\/","description":"<h1 id=\"contentdb\">ContentDB<a class=\"anchor\" href=\"#contentdb\">#<\/a><\/h1>\n<p><strong>ContentDB<\/strong> (short for &ldquo;Content Database&rdquo;) is the official source to download content such as mods, games and texture packs (collectively referred to as &ldquo;packages&rdquo;) that have been developed by the Luanti community. It&rsquo;s the fastest and most convenient method to obtain those things, and is available both in the client and on the web.<\/p>\n<p>But ContentDB isn&rsquo;t just about supporting the in-game content downloader; it&rsquo;s common for technical users to find and review packages using the ContentDB website, but install using Git rather than the in-game installer. ContentDB&rsquo;s purpose is to be a well-formatted source of information about mods, games, and texture packs for Luanti.<\/p>"},{"title":"Contributing to Docs","link":"https:\/\/docs.luanti.org\/about\/contributing-to-docs\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/about\/contributing-to-docs\/","description":"<h1 id=\"contributing-to-docs\">Contributing to Docs<a class=\"anchor\" href=\"#contributing-to-docs\">#<\/a><\/h1>\n<p>Luanti Documentation is written in Markdown and transformed into HTML by <a href=\"https:\/\/gohugo.io\">Hugo<\/a>, a free and open-source static site generator. The source code is currently hosted on GitHub and deployed with GitHub Actions.<\/p>\n<h2 id=\"local-development\">Local Development<a class=\"anchor\" href=\"#local-development\">#<\/a><\/h2>\n<p>When cloning the repository you need to clone it recursively so that the theme submodule gets included:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>git clone --recursive https:\/\/github.com\/luanti-org\/docs.luanti.org<\/span><\/span><\/code><\/pre><\/div><p>If you have already cloned, you can fetch the submodules as such:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>git submodule init\n<\/span><\/span><span style=\"display:flex;\"><span>git submodule update --remote<\/span><\/span><\/code><\/pre><\/div><p>This project uses <a href=\"https:\/\/gohugo.io\/\">Hugo<\/a> to build the site and various Node packages to test it.<\/p>"},{"title":"Controls","link":"https:\/\/docs.luanti.org\/for-players\/controls\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-players\/controls\/","description":"<h1 id=\"controls\">Controls<a class=\"anchor\" href=\"#controls\">#<\/a><\/h1>\n<p>This is an overview of all controls used in Luanti.<\/p>\n<h2 id=\"changing-controls\">Changing controls<a class=\"anchor\" href=\"#changing-controls\">#<\/a><\/h2>\n<p>There are two ways to change the controls: Either by using the options menu accessible inside the game or by editing <a href=\"https:\/\/docs.luanti.org\/for-players\/minetest-conf\">minetest.conf<\/a>. See minetest.conf.example to learn the setting names. Note that some controls are fixed and cannot be changed at all.<\/p>\n<h2 id=\"game-controls\">Game controls<a class=\"anchor\" href=\"#game-controls\">#<\/a><\/h2>\n<h3 id=\"pc\">PC<a class=\"anchor\" href=\"#pc\">#<\/a><\/h3>\n<style type=\"text\/css\">\n \n .notice {\n --title-color: #fff;\n --title-background-color: #6be;\n --content-color: #444;\n --content-background-color: #e7f2fa;\n }\n\n .notice.info {\n --title-background-color: #fb7;\n --content-background-color: #fec;\n }\n\n .notice.tip {\n --title-background-color: #5a5;\n --content-background-color: #efe;\n }\n\n .notice.warning {\n --title-background-color: #c33;\n --content-background-color: #fee;\n }\n\n \n @media (prefers-color-scheme:dark) {\n .notice {\n --title-color: #fff;\n --title-background-color: #069;\n --content-color: #ddd;\n --content-background-color: #023;\n }\n\n .notice.info {\n --title-background-color: #a50;\n --content-background-color: #420;\n }\n\n .notice.tip {\n --title-background-color: #363;\n --content-background-color: #121;\n }\n\n .notice.warning {\n --title-background-color: #800;\n --content-background-color: #400;\n }\n }\n\n body.dark .notice {\n --title-color: #fff;\n --title-background-color: #069;\n --content-color: #ddd;\n --content-background-color: #023;\n }\n\n body.dark .notice.info {\n --title-background-color: #a50;\n --content-background-color: #420;\n }\n\n body.dark .notice.tip {\n --title-background-color: #363;\n --content-background-color: #121;\n }\n\n body.dark .notice.warning {\n --title-background-color: #800;\n --content-background-color: #400;\n }\n\n \n .notice {\n padding: 18px;\n line-height: 24px;\n margin-bottom: 24px;\n border-radius: 4px;\n color: var(--content-color);\n background: var(--content-background-color);\n }\n\n .notice p:last-child {\n margin-bottom: 0\n }\n\n \n .notice-title {\n margin: -18px -18px 12px;\n padding: 4px 18px;\n border-radius: 4px 4px 0 0;\n font-weight: 700;\n color: var(--title-color);\n background: var(--title-background-color);\n }\n\n \n .icon-notice {\n display: inline-flex;\n align-self: center;\n margin-right: 8px;\n }\n\n .icon-notice img,\n .icon-notice svg {\n height: 1em;\n width: 1em;\n fill: currentColor;\n }\n\n .icon-notice img,\n .icon-notice.baseline svg {\n top: .125em;\n position: relative;\n }\n<\/style><div class=\"notice note\" >\n <p class=\"notice-title\">\n <span class=\"icon-notice baseline\">\n <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 128 300 300\">\n <path d=\"M150 128c82.813 0 150 67.188 150 150 0 82.813-67.188 150-150 150C67.187 428 0 360.812 0 278c0-82.813 67.188-150 150-150Zm25 243.555v-37.11c0-3.515-2.734-6.445-6.055-6.445h-37.5c-3.515 0-6.445 2.93-6.445 6.445v37.11c0 3.515 2.93 6.445 6.445 6.445h37.5c3.32 0 6.055-2.93 6.055-6.445Zm-.39-67.188 3.515-121.289c0-1.367-.586-2.734-1.953-3.516-1.172-.976-2.93-1.562-4.688-1.562h-42.968c-1.758 0-3.516.586-4.688 1.563-1.367.78-1.953 2.148-1.953 3.515l3.32 121.29c0 2.734 2.93 4.882 6.64 4.882h36.134c3.515 0 6.445-2.148 6.64-4.883Z\"\/>\n<\/svg>\n\n <\/span> Note <\/p>"},{"title":"Coordinates","link":"https:\/\/docs.luanti.org\/for-players\/coordinates\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-players\/coordinates\/","description":"<h1 id=\"coordinates\">Coordinates<a class=\"anchor\" href=\"#coordinates\">#<\/a><\/h1>\n<p>A <a href=\"https:\/\/docs.luanti.org\/about\/luanti\">Luanti<\/a> world is a large cube. And because of this, a position in the world can be easily expressed with Cartesian <strong>coordinates<\/strong>. That is, for each position in the world, there are 3 values X, Y and Z.<\/p>\n<h2 id=\"notation\">Notation<a class=\"anchor\" href=\"#notation\">#<\/a><\/h2>\n<p>Coordinates are expressed like this: (5, 45, -12)<\/p>\n<p>This refers to the position where X=5, Y=45 and Z=-12. The 3 letters are called \u201caxes\u201d: Y is for the height. X and Z are for the horizontal position.<\/p>"},{"title":"Creating mods","link":"https:\/\/docs.luanti.org\/for-creators\/creating-mods\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/creating-mods\/","description":"<h1 id=\"creating-mods\">Creating mods<a class=\"anchor\" href=\"#creating-mods\">#<\/a><\/h1>\n<p>Luanti has a scripting API which is used to program games and <a href=\"https:\/\/docs.luanti.org\/for-players\/mods\">mods<\/a>, allowing creators to create new experiences or extend existing ones with mods. The API is accessed using <a href=\"https:\/\/www.lua.org\/\">Lua<\/a>, an easy-to-use programming language. Version 5.1 of Lua is used, but many people run LuaJIT for greater performance. The only thing you will need is <em>basic<\/em> programming knowledge.<\/p>\n<p>The official Luanti Lua API reference can be found at <a href=\"https:\/\/api.luanti.org\/\">api.luanti.org<\/a>, with guides hosted in the <a href=\"https:\/\/docs.luanti.org\/for-creators\/api\">API section of this site<\/a>.<\/p>"},{"title":"Creating Texture Packs","link":"https:\/\/docs.luanti.org\/for-creators\/creating-texture-packs\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/creating-texture-packs\/","description":"<h1 id=\"creating-texture-packs\">Creating texture packs<a class=\"anchor\" href=\"#creating-texture-packs\">#<\/a><\/h1>\n<p><a href=\"https:\/\/docs.luanti.org\/for-players\/texture-packs\">Texture packs<\/a> are a simple folder containing image files named after the default ones. Luanti has very few requirements for using a texture pack and texture packs are normally used by games.<\/p>\n<h2 id=\"image-structure\">Image Structure<a class=\"anchor\" href=\"#image-structure\">#<\/a><\/h2>\n<p>Below is a brief overview of the texture structure as of version 5.1<\/p>\n<h3 id=\"luanti\">Luanti<a class=\"anchor\" href=\"#luanti\">#<\/a><\/h3>\n<p>The Luanti engine has very few base textures; these can be found under <code>your\/path\/to\/luanti\/textures\/base\/pack<\/code>. This includes textures for things such as; server icons, minimap overlays, logos and headers.<\/p>"},{"title":"Custom Lua Mapgen","link":"https:\/\/docs.luanti.org\/for-creators\/mapgen\/custom-lua-mapgen\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/mapgen\/custom-lua-mapgen\/","description":"<h1 id=\"custom-lua-mapgen\">Custom Lua Mapgen<a class=\"anchor\" href=\"#custom-lua-mapgen\">#<\/a><\/h1>\n<p>The Luanti engine provides several built-in map generators implemented in C++, where biomes and decorations can be registered by mods. In addition to this you can also write your own mapgen in Lua. This is done by hooking into the <code>singlenode<\/code> mapgen (by default consisting only of <code>air<\/code>) and generating your own terrain using the Lua API.<\/p>\n<h2 id=\"performance\">Performance<a class=\"anchor\" href=\"#performance\">#<\/a><\/h2>\n<p>As of 5.9, it is possible to write Lua map generators that run in a separate environment for each mapgen thread (see <a href=\"https:\/\/api.luanti.org\/core-namespace-reference\/#mapgen-environment\">Mapgen environment<\/a>), improving the performance of the mapgen.<\/p>"},{"title":"Database backends","link":"https:\/\/docs.luanti.org\/for-server-hosts\/database-backends\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-server-hosts\/database-backends\/","description":"<h1 id=\"database-backends\">Database backends<a class=\"anchor\" href=\"#database-backends\">#<\/a><\/h1>\n<p>Luanti uses a database system for certain world data where the backend that stores the data can be switched out depending on the use cases needed. This page lists all databases and the backends that can be used with them.<\/p>\n<h2 id=\"databases\">Databases<a class=\"anchor\" href=\"#databases\">#<\/a><\/h2>\n<p>There are four databases that store data for each world:<\/p>\n<ul>\n<li>Map<\/li>\n<li>Players<\/li>\n<li>Authentication<\/li>\n<li>Mod Storage<\/li>\n<\/ul>\n<h3 id=\"map-database\">Map database<a class=\"anchor\" href=\"#map-database\">#<\/a><\/h3>\n<p>The map database stores mapblock data. The backend is set using the <code>backend<\/code> setting in <code>world.mt<\/code>.<\/p>"},{"title":"Debug","link":"https:\/\/docs.luanti.org\/for-creators\/debug\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/debug\/","description":"<h1 id=\"debug\">Debug<a class=\"anchor\" href=\"#debug\">#<\/a><\/h1>\n<p>The <strong>debug screen<\/strong> can be accessed by pressing the F5 key (by default) and shows various technical information about Luanti which are mostly interesting for developers, but some information are also useful for players, especially the <a href=\"https:\/\/docs.luanti.org\/for-players\/coordinates\">coordinates<\/a>.<\/p>\n<p>It contains various information useful for development and testing. Press F5 to access different debug screen modes:<\/p>\n<ul>\n<li>Debug screen disabled<\/li>\n<li>Debug info<\/li>\n<li>Debug info + profiler graph<\/li>\n<li>Debug info + wireframe (only with \u201cdebug\u201d <a href=\"https:\/\/docs.luanti.org\/for-players\/privileges\">privilege<\/a>)<\/li>\n<\/ul>\n<h2 id=\"debug-info\">Debug info<a class=\"anchor\" href=\"#debug-info\">#<\/a><\/h2>\n<h3 id=\"basic-debug-info\">Basic debug info<a class=\"anchor\" href=\"#basic-debug-info\">#<\/a><\/h3>\n<p>The basic debug information is located at the top left of the screen. It looks like this:<\/p>"},{"title":"Development Setup","link":"https:\/\/docs.luanti.org\/for-creators\/development-setup\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/development-setup\/","description":"<h1 id=\"development-setup\">Development Setup<a class=\"anchor\" href=\"#development-setup\">#<\/a><\/h1>\n<h2 id=\"introduction\">Introduction<a class=\"anchor\" href=\"#introduction\">#<\/a><\/h2>\n<p>You can use any text editor to write mods,\nbut it is recommended to pick an editor\nthat supports the <a href=\"https:\/\/microsoft.github.io\/language-server-protocol\/\">Language Server Protocol (LSP)<\/a>.\nThe LSP provides auto completions and diagnostics\nto aid you in development.<\/p>\n<p>Examples of Editors that support the LSP are:<\/p>\n<ul>\n<li><a href=\"https:\/\/code.visualstudio.com\/\">Visual Studio Code<\/a><\/li>\n<li><a href=\"https:\/\/apps.kde.org\/kate\/\">Kate<\/a><\/li>\n<li><a href=\"https:\/\/neovim.io\/\">NeoVim<\/a><\/li>\n<li><a href=\"https:\/\/helix-editor.com\/\">Helix<\/a><\/li>\n<\/ul>\n<h2 id=\"installing-the-language-server\">Installing the Language Server<a class=\"anchor\" href=\"#installing-the-language-server\">#<\/a><\/h2>\n<p>How you install the language server depends on the editor and operating system you use.<\/p>"},{"title":"Development Tools","link":"https:\/\/docs.luanti.org\/for-creators\/development-tools\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/development-tools\/","description":"<h1 id=\"development-tools\">Development Tools<a class=\"anchor\" href=\"#development-tools\">#<\/a><\/h1>\n<p>This page contains a list of tools that are useful for developing games and mods for Luanti, or working with parts of the engine.<\/p>\n<p>In addition to this list, you can also see the <a href=\"https:\/\/content.luanti.org\/packages\/?tag=developer_tools\">Development Tools<\/a> tag on ContentDB for mods useful for development and the <a href=\"https:\/\/github.com\/luanti-org\/modtools\">modtools<\/a> repository for officially maintained modding tools.<\/p>\n<h2 id=\"engine-development\">Engine development<a class=\"anchor\" href=\"#engine-development\">#<\/a><\/h2>\n<ul>\n<li>Development Test: A testing game for testing various engine features<\/li>\n<li><a href=\"https:\/\/github.com\/luanti-org\/luanti\/tree\/master\/util\">\/luanti\/util<\/a>: Various maintenance utilities<\/li>\n<\/ul>\n<h2 id=\"general-lua-tools\">General Lua Tools<a class=\"anchor\" href=\"#general-lua-tools\">#<\/a><\/h2>\n<ul>\n<li><a href=\"https:\/\/github.com\/lunarmodules\/luacheck\">luacheck<\/a>: Lua linter and static code analyzer (see also <a href=\"https:\/\/rubenwardy.com\/minetest_modding_book\/en\/quality\/luacheck.html\">the chapter in rubenwardy&rsquo;s modding book<\/a>)<\/li>\n<li><a href=\"https:\/\/olivinelabs.com\/busted\/\">busted<\/a>: Lua unit testing framework (see also <a href=\"https:\/\/rubenwardy.com\/minetest_modding_book\/en\/quality\/unit_testing.html\">the chapter in rubenwardy&rsquo;s modding book<\/a>)<\/li>\n<li><a href=\"https:\/\/gitspartv.github.io\/lua-patterns\/\">Lua pattern viewer<\/a>: A site like <a href=\"https:\/\/regexr.com\/\">Regexr<\/a> but for visualizing and working with Lua patterns.<\/li>\n<li><a href=\"https:\/\/gitlab.com\/Warr1024\/luatools\">Warr1024&rsquo;s Lua Code Tools<\/a>: Lua formatter &amp; locals generator<\/li>\n<\/ul>\n<h2 id=\"debuggingprofiling\">Debugging\/profiling<a class=\"anchor\" href=\"#debuggingprofiling\">#<\/a><\/h2>\n<ul>\n<li><a href=\"https:\/\/content.luanti.org\/packages\/LMD\/dbg\/\">debug<\/a>: Luanti mod library that offers more debugging capabilities.<\/li>\n<li><a href=\"https:\/\/content.luanti.org\/packages\/jwmhjwmh\/jitprofiler\/\">LuaJIT Profiler<\/a>: Luanti mod that allows you to profile mods using LuaJIT&rsquo;s built-in profiler and flame graph.<\/li>\n<li><a href=\"https:\/\/gitlab.com\/sztest\/minetestserver\">Warr1024&rsquo;s Minetest Server Docker Image<\/a>: Comes with useful debugging and performance profiling tools<\/li>\n<\/ul>\n<h2 id=\"syntax-highlightingautocompletion\">Syntax highlighting\/autocompletion<a class=\"anchor\" href=\"#syntax-highlightingautocompletion\">#<\/a><\/h2>\n<ul>\n<li>Luanti Tools (<a href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=GreenXenith.minetest-tools\">VS Code marketplace<\/a>, <a href=\"https:\/\/open-vsx.org\/extension\/GreenXenith\/minetest-tools\/\">OpenVSX<\/a>): Extension for VS Code and other Code - OSS based code editors that provides Lua API autocompletion and more<\/li>\n<\/ul>\n<h2 id=\"schematics\">Schematics<a class=\"anchor\" href=\"#schematics\">#<\/a><\/h2>\n<ul>\n<li><a href=\"https:\/\/content.luanti.org\/packages\/Wuzzy\/schemedit\/\">Schematic Editor<\/a>: Luanti mod that allows you to import, edit and export schematics straight within Luanti.<\/li>\n<li><a href=\"https:\/\/forum.luanti.org\/viewtopic.php?f=14&amp;t=23724\">MTS Editor<\/a>: Standalone program to view and edit Luanti schematics, but it supports other file formats (e.g. Minecraft schematics) as well.<\/li>\n<li><a href=\"https:\/\/content.luanti.org\/packages\/Neuromancer\/lua2mts\/\">Lua2Mts<\/a>: Luanti mod to convert .lua schematics to .mts schematics.<\/li>\n<li><a href=\"https:\/\/content.luanti.org\/packages\/Warr1024\/aaschems\/\">ASCII Art Schematics<\/a>: Library to manage Luanti schematics as ASCII art<\/li>\n<\/ul>\n<h2 id=\"biomes\">Biomes<a class=\"anchor\" href=\"#biomes\">#<\/a><\/h2>\n<ul>\n<li><a href=\"https:\/\/wuzzy.codeberg.page\/LiBPoV\/\">Luanti Biome Point Visualizer<\/a>: Edit and visualize biome heat\/humidity points in a Voronoi diagram (<a href=\"https:\/\/codeberg.org\/Wuzzy\/LiBPoV\">source code<\/a>)<\/li>\n<\/ul>\n<h2 id=\"perlin-noise\">Perlin Noise<a class=\"anchor\" href=\"#perlin-noise\">#<\/a><\/h2>\n<ul>\n<li><a href=\"https:\/\/content.luanti.org\/packages\/Wuzzy\/perlin_explorer\/\">Perlin Explorer<\/a>: Luanti mod that allows you to experiment with all sorts of Perlin noise.<\/li>\n<li><a href=\"https:\/\/codepen.io\/treer\/pen\/gOPZyov?editors=0010\">Perlin noise tuner<\/a>: Visualizes 2D Perlin noise that Luanti will generate with different noise params.(Emulation of Luanti Perlin noise can be wrong in extremes\/edge-cases due to precision of JavaScript number type)<\/li>\n<\/ul>\n<h2 id=\"3d-models\">3D models<a class=\"anchor\" href=\"#3d-models\">#<\/a><\/h2>\n<ul>\n<li><a href=\"https:\/\/www.blender.org\/\">Blender<\/a>: Essential for making animated models in Luanti, see <a href=\"https:\/\/docs.luanti.org\/for-creators\/models\/using-blender\/\">Using Blender<\/a>.<\/li>\n<li><a href=\"https:\/\/www.blockbench.net\/\">Blockbench<\/a>: Useful for making static voxel models for Luanti, see <a href=\"https:\/\/docs.luanti.org\/for-creators\/models\/using-blockbench\/\">Using Blockbench<\/a>.<\/li>\n<\/ul>\n<h2 id=\"images\">Images<a class=\"anchor\" href=\"#images\">#<\/a><\/h2>\n<ul>\n<li><a href=\"https:\/\/optipng.sourceforge.net\/\">optipng<\/a>: Lossless PNG compressor<\/li>\n<li><a href=\"https:\/\/pmt.sourceforge.io\/pngcrush\/\">pngcrush<\/a>: Lossless PNG compressor<\/li>\n<li><a href=\"https:\/\/pngquant.org\/\">pngquant<\/a>: <em>Lossy<\/em> PNG compressor<\/li>\n<li><a href=\"https:\/\/github.com\/google\/guetzli\">guetzli<\/a>: JPG compressor<\/li>\n<\/ul>\n<h2 id=\"formspecs\">Formspecs<a class=\"anchor\" href=\"#formspecs\">#<\/a><\/h2>\n<ul>\n<li><a href=\"https:\/\/content.luanti.org\/packages\/Just_Visiting\/formspec_editor\/\">formspec_editor<\/a>: Luanti game that allows you to write formspecs and preview them instantly within Luanti<\/li>\n<li><a href=\"https:\/\/luk3yx.gitlab.io\/minetest-formspec-editor\/\">Luanti Formspec Editor<\/a>: WYSIWYG online formspec editor<\/li>\n<\/ul>\n<h2 id=\"translation\">Translation<a class=\"anchor\" href=\"#translation\">#<\/a><\/h2>\n<ul>\n<li><a href=\"https:\/\/www.gnu.org\/software\/gettext\/\">Gettext utils<\/a>: For maintaining content translations for the new .po\/Gettext format<\/li>\n<li><a href=\"https:\/\/github.com\/luanti-org\/modtools\/blob\/main\/mod_translation_updater.py\">mod_translation_updater<\/a>: Python script to create and update legacy .tr mod translation files<\/li>\n<\/ul>\n<h2 id=\"contentdb\">ContentDB<a class=\"anchor\" href=\"#contentdb\">#<\/a><\/h2>\n<ul>\n<li><a href=\"https:\/\/gitlab.com\/sztest\/cdbrelease\">cdbrelease<\/a>: Release automation tool for ContentDB packages<\/li>\n<\/ul>\n<h2 id=\"misc\">Misc.<a class=\"anchor\" href=\"#misc\">#<\/a><\/h2>\n<ul>\n<li><a href=\"https:\/\/gitlab.com\/sztest\/defripper\">Definition Ripper<\/a>: Extract node and item definitions, generating decorative and inert facades from them<\/li>\n<\/ul>"},{"title":"Development troubleshooting","link":"https:\/\/docs.luanti.org\/for-creators\/development-troubleshooting\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/development-troubleshooting\/","description":"<h1 id=\"development-troubleshooting\">Development troubleshooting<a class=\"anchor\" href=\"#development-troubleshooting\">#<\/a><\/h1>\n<h2 id=\"lua-api\">Lua API<a class=\"anchor\" href=\"#lua-api\">#<\/a><\/h2>\n<p>Be sure to check out the <a href=\"http:\/\/www.lua.org\/manual\/5.1\/manual.html\">Lua 5.1 Reference Manual<\/a> and actually understand the Lua functions you are using well, in order to minimize stupid mistakes.<\/p>\n<p>Q. I&rsquo;ve created a new class for the Lua API, but whenever I try to call a method from it, I get a Lua error that says something along the lines of &ldquo;attempt to index local &lsquo;objecthere&rsquo; (a userdata value)&rdquo;\nA. Did you forget to register the class? An object from C is Lua userdata unless it has an __index and __metatable field describing that it is a class and what members it has. See the static Register() method from the LuaPerlinNoise as an example of what to do. Be sure you remember to call your Register function in the body of scriptapi_export().<\/p>"},{"title":"Distributing Games Outside ContentDB","link":"https:\/\/docs.luanti.org\/for-creators\/distributing-games-outside-contentdb\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/distributing-games-outside-contentdb\/","description":"<h1 id=\"distributing-games-outside-contentdb\">Distributing Games Outside ContentDB<a class=\"anchor\" href=\"#distributing-games-outside-contentdb\">#<\/a><\/h1>\n<p>This page documents how to publish a Luanti game outside of <a href=\"https:\/\/docs.luanti.org\/about\/contentdb\">ContentDB<\/a>. It assumes that you know how to compile Luanti from source.<\/p>\n<p>Luanti as an engine itself doesn&rsquo;t have any official means to export a game into a self-contained package with the engine, instead games are published on <a href=\"https:\/\/content.luanti.org\/packages\/?type=game\">ContentDB<\/a> which allows your game to be installed from the main menu content browser. However as Luanti is free software you can fork the engine to rebrand it and bundle it with your game for distribution outside of the Luanti ecosystem.<\/p>"},{"title":"Docker \/ Container","link":"https:\/\/docs.luanti.org\/for-server-hosts\/setup\/containers\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-server-hosts\/setup\/containers\/","description":"<h1 id=\"docker--container-configuration\">Docker \/ Container Configuration<a class=\"anchor\" href=\"#docker--container-configuration\">#<\/a><\/h1>\n<h2 id=\"obtaining-a-server-binary\">Obtaining a server binary<a class=\"anchor\" href=\"#obtaining-a-server-binary\">#<\/a><\/h2>\n<ul>\n<li>\n<p>The official image can be found <a href=\"https:\/\/github.com\/luanti-org\/luanti\/pkgs\/container\/luanti\">here<\/a><\/p>\n<ul>\n<li>ghcr.io\/luanti-org\/luanti:latest - latest stable release<\/li>\n<li>ghcr.io\/luanti-org\/luanti:&lt;tag&gt; - a specific version (git tag)<\/li>\n<li>ghcr.io\/luanti-org\/luanti:master - latest dev version<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"https:\/\/hub.docker.com\/r\/warr1024\/minetestserver\">Warr1024&rsquo;s Docker image<\/a>.<\/p>\n<\/li>\n<\/ul>\n<h2 id=\"running-the-server\">Running the Server<a class=\"anchor\" href=\"#running-the-server\">#<\/a><\/h2>\n<h3 id=\"docker\">Docker<a class=\"anchor\" href=\"#docker\">#<\/a><\/h3>\n<p>It is recommended that you use <a href=\"https:\/\/docs.docker.com\/compose\">docker compose<\/a> to set up, configure, and run your server<\/p>\n<p>A simple <code>compose.yml<\/code> example:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yml\" data-lang=\"yml\"><span style=\"display:flex;\"><span><span style=\"color:#f92672\">services<\/span>:\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#f92672\">luanti_server<\/span>:\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#f92672\">image<\/span>: <span style=\"color:#ae81ff\">ghcr.io\/luanti-org\/luanti:latest<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#f92672\">restart<\/span>: <span style=\"color:#ae81ff\">unless-stopped<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#f92672\">volumes<\/span>:\n<\/span><\/span><span style=\"display:flex;\"><span> - <span style=\"color:#ae81ff\">.\/config:\/etc\/minetest:ro<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> - <span style=\"color:#ae81ff\">.\/data:\/var\/lib\/minetest<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> - <span style=\"color:#ae81ff\">.\/games:\/var\/lib\/minetest\/.minetest\/games:ro<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> - <span style=\"color:#ae81ff\">.\/mods:\/var\/lib\/minetest\/.minetest\/mods:ro<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#f92672\">ports<\/span>:\n<\/span><\/span><span style=\"display:flex;\"><span> - <span style=\"color:#e6db74\">&#34;30000:30000\/udp&#34;<\/span><\/span><\/span><\/code><\/pre><\/div><p>Before starting the container:<\/p>"},{"title":"Engine Structure","link":"https:\/\/docs.luanti.org\/for-engine-devs\/structure\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-engine-devs\/structure\/","description":"<h1 id=\"enginestructure\">Engine\/Structure<a class=\"anchor\" href=\"#enginestructure\">#<\/a><\/h1>\n<p><a href=\"https:\/\/docs.luanti.org\/images\/minetest-0.3-dfd-visio.webp\"><img src=\"https:\/\/docs.luanti.org\/images\/minetest-0.3-dfd-visio.webp\" alt=\"\" \/><\/a><\/p>\n<p>0.3 data flow diagram - still mostly accurate.<\/p>\n<h2 id=\"general-architecture\">General architecture<a class=\"anchor\" href=\"#general-architecture\">#<\/a><\/h2>\n<p>Luanti consists of 3 main &ldquo;components&rdquo;:<\/p>\n<ul>\n<li>Server - runs server-side logic, updating things for connected players.<\/li>\n<li>Client - graphics, controls, and logic for a single player.<\/li>\n<li>Mainmenu - The main menu, before joining a game.<\/li>\n<\/ul>\n<p>Each of these &ldquo;components&rdquo; consists of some C++ code and a Lua API for scripting.<\/p>\n<p>When playing a game, there must always be a server. A singleplayer game will consist of a client and a server running in the same process but on different threads. A multiple remote game will consist of a client running locally, and a server running remotely.<\/p>"},{"title":"FAQ","link":"https:\/\/docs.luanti.org\/about\/faq\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/about\/faq\/","description":"<h1 id=\"faq\">FAQ<a class=\"anchor\" href=\"#faq\">#<\/a><\/h1>\n<p>This is a collection of some <strong>frequently asked questions<\/strong> about Luanti. For technical problems, refer to <a href=\"https:\/\/docs.luanti.org\/for-players\/troubleshooting\">Troubleshooting<\/a>.<\/p>\n<h2 id=\"what-is-luanti\">What is Luanti?<a class=\"anchor\" href=\"#what-is-luanti\">#<\/a><\/h2>\n<p>Luanti is a free software game engine designed to create <a href=\"https:\/\/en.wikipedia.org\/wiki\/Voxel\">voxel<\/a>-based games. A detailed description can be found at <a href=\"https:\/\/docs.luanti.org\/about\/luanti\">Luanti<\/a>.<\/p>\n<h2 id=\"about-the-engine\">About the Engine<a class=\"anchor\" href=\"#about-the-engine\">#<\/a><\/h2>\n<h3 id=\"how-much-does-luanti-cost\">How much does Luanti cost?<a class=\"anchor\" href=\"#how-much-does-luanti-cost\">#<\/a><\/h3>\n<p>Nothing. It&rsquo;s free.<\/p>\n<h3 id=\"is-luanti-a-clone-of-minecraft\">Is Luanti a clone of Minecraft?<a class=\"anchor\" href=\"#is-luanti-a-clone-of-minecraft\">#<\/a><\/h3>\n<p>No. Luanti has very different goals from Minecraft, and doesn&rsquo;t aim to compete with or replace Minecraft. Luanti is an engine and a platform for many different voxel games, rather than one cohesive gaming experience.<\/p>"},{"title":"Filesystem","link":"https:\/\/docs.luanti.org\/for-creators\/api\/filesystem\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/api\/filesystem\/","description":"<h1 id=\"filesystem\">Filesystem<a class=\"anchor\" href=\"#filesystem\">#<\/a><\/h1>\n<p>Luanti provides various utility functions to help with managing paths, files &amp; directories.<\/p>\n<style type=\"text\/css\">\n \n .notice {\n --title-color: #fff;\n --title-background-color: #6be;\n --content-color: #444;\n --content-background-color: #e7f2fa;\n }\n\n .notice.info {\n --title-background-color: #fb7;\n --content-background-color: #fec;\n }\n\n .notice.tip {\n --title-background-color: #5a5;\n --content-background-color: #efe;\n }\n\n .notice.warning {\n --title-background-color: #c33;\n --content-background-color: #fee;\n }\n\n \n @media (prefers-color-scheme:dark) {\n .notice {\n --title-color: #fff;\n --title-background-color: #069;\n --content-color: #ddd;\n --content-background-color: #023;\n }\n\n .notice.info {\n --title-background-color: #a50;\n --content-background-color: #420;\n }\n\n .notice.tip {\n --title-background-color: #363;\n --content-background-color: #121;\n }\n\n .notice.warning {\n --title-background-color: #800;\n --content-background-color: #400;\n }\n }\n\n body.dark .notice {\n --title-color: #fff;\n --title-background-color: #069;\n --content-color: #ddd;\n --content-background-color: #023;\n }\n\n body.dark .notice.info {\n --title-background-color: #a50;\n --content-background-color: #420;\n }\n\n body.dark .notice.tip {\n --title-background-color: #363;\n --content-background-color: #121;\n }\n\n body.dark .notice.warning {\n --title-background-color: #800;\n --content-background-color: #400;\n }\n\n \n .notice {\n padding: 18px;\n line-height: 24px;\n margin-bottom: 24px;\n border-radius: 4px;\n color: var(--content-color);\n background: var(--content-background-color);\n }\n\n .notice p:last-child {\n margin-bottom: 0\n }\n\n \n .notice-title {\n margin: -18px -18px 12px;\n padding: 4px 18px;\n border-radius: 4px 4px 0 0;\n font-weight: 700;\n color: var(--title-color);\n background: var(--title-background-color);\n }\n\n \n .icon-notice {\n display: inline-flex;\n align-self: center;\n margin-right: 8px;\n }\n\n .icon-notice img,\n .icon-notice svg {\n height: 1em;\n width: 1em;\n fill: currentColor;\n }\n\n .icon-notice img,\n .icon-notice.baseline svg {\n top: .125em;\n position: relative;\n }\n<\/style><div class=\"notice info\" >\n <p class=\"notice-title\">\n <span class=\"icon-notice baseline\">\n <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"92 59.5 300 300\">\n <path d=\"M292 303.25V272c0-3.516-2.734-6.25-6.25-6.25H267v-100c0-3.516-2.734-6.25-6.25-6.25h-62.5c-3.516 0-6.25 2.734-6.25 6.25V197c0 3.516 2.734 6.25 6.25 6.25H217v62.5h-18.75c-3.516 0-6.25 2.734-6.25 6.25v31.25c0 3.516 2.734 6.25 6.25 6.25h87.5c3.516 0 6.25-2.734 6.25-6.25Zm-25-175V97c0-3.516-2.734-6.25-6.25-6.25h-37.5c-3.516 0-6.25 2.734-6.25 6.25v31.25c0 3.516 2.734 6.25 6.25 6.25h37.5c3.516 0 6.25-2.734 6.25-6.25Zm125 81.25c0 82.813-67.188 150-150 150-82.813 0-150-67.188-150-150 0-82.813 67.188-150 150-150 82.813 0 150 67.188 150 150Z\"\/>\n<\/svg>\n\n <\/span> Info <\/p>"},{"title":"Game Theme Re-implementation","link":"https:\/\/docs.luanti.org\/for-creators\/game-theme-re-implementation\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/game-theme-re-implementation\/","description":"<h1 id=\"game-theme-re-implementation\">Game Theme Re-implementation<a class=\"anchor\" href=\"#game-theme-re-implementation\">#<\/a><\/h1>\n<p>The part of the main menu that controls the game theming aspects is implemented with <code>mm_game_theme<\/code>, in <code>game_theme.lua<\/code>. If you wish to rebrand the main menu, dealing with the complexity of this implementation can be rather unnecessary if you just want a single background and header that shows up on every tab.<\/p>\n<p>What <code>mm_game_theme<\/code> does is essentially just abstract away calls to <code>core.set_background<\/code>, a function which controls background textures, but also header and footer textures. See the entry for it in <code>menu_lua_api.md<\/code>:<\/p>"},{"title":"Gamepads","link":"https:\/\/docs.luanti.org\/for-players\/gamepads\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-players\/gamepads\/","description":"<h1 id=\"gamepads\">Gamepads<a class=\"anchor\" href=\"#gamepads\">#<\/a><\/h1>\n<p>Many players prefer using gamepads (aka controllers or joysticks) over a keyboard and mouse.<\/p>\n<h2 id=\"built-in-support\">Built-in support<a class=\"anchor\" href=\"#built-in-support\">#<\/a><\/h2>\n<h3 id=\"version-previous-to-517\">Version previous to 5.17<a class=\"anchor\" href=\"#version-previous-to-517\">#<\/a><\/h3>\n<p>Luanti has some experimental built-in support for gamepads but it is quite broken and doesn&rsquo;t work on most hardware. Even when it does work, it doesn&rsquo;t support using GUIs.\n<strong>it&rsquo;s recommended that you use an external program for controllers, and not Luanti<\/strong>.<\/p>\n<h3 id=\"version-517-and-greater\">Version 5.17 and greater<a class=\"anchor\" href=\"#version-517-and-greater\">#<\/a><\/h3>\n<p>Luanti has the start of gamepad support. You can use it to move and interact with the world, but not to use menus\/GUIs. We recommend using it with another form of input for menus (like touchscreen or a mouse) or on games that do not involve menus. We plan on improving support in the future.<\/p>"},{"title":"German translation notes","link":"https:\/\/docs.luanti.org\/for-creators\/translation\/de\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/translation\/de\/","description":"<h1 id=\"german-translation-notes\">German translation notes<a class=\"anchor\" href=\"#german-translation-notes\">#<\/a><\/h1>\n<p>This page contains information for German translators.<\/p>\n<h2 id=\"wiederkehrende-\u00fcbersetzungen\">Wiederkehrende \u00dcbersetzungen<a class=\"anchor\" href=\"#wiederkehrende-%c3%bcbersetzungen\">#<\/a><\/h2>\n<p>Hier gibt es eine Sammlung von Luanti-spezifischen Vokabeln, die der Konsistenz zuliebe immer gleich \u00fcbersetzt werden sollten. Wenn ein besonderer Ausdruck auftauchen sollte, der hier noch nicht aufgef\u00fchrt wurde, bitte an den bestehenden \u00dcbersetzungen orientieren und hier einf\u00fcgen.<\/p>\n<h3 id=\"substantive\">Substantive<a class=\"anchor\" href=\"#substantive\">#<\/a><\/h3>\n<table>\n <thead>\n <tr>\n <th>Original<\/th>\n <th>\u00dcbersetzung<\/th>\n <th>Geschlecht<\/th>\n <th>Kommentar<\/th>\n <\/tr>\n <\/thead>\n <tbody>\n <tr>\n <td><em>anisotropic filtering<\/em><\/td>\n <td><em>Anisotroper Filter<\/em><\/td>\n <td>m<\/td>\n <td><\/td>\n <\/tr>\n <tr>\n <td><em>automatic forwards<\/em><\/td>\n <td><em>Vorw\u00e4rtsautomatik<\/em> oder <em>Autovorw\u00e4rts<\/em><\/td>\n <td>f<\/td>\n <td><\/td>\n <\/tr>\n <tr>\n <td><em>block<\/em> \/ <em>mapblock<\/em><\/td>\n <td><em>Kartenblock<\/em><\/td>\n <td>m<\/td>\n <td>Hier ist besonders darauf zu achten, nicht \u201eBlock&quot; zu nehmen, da es sonst mit \u201enode&quot; verwechselt wird.<\/td>\n <\/tr>\n <tr>\n <td><em>cave<\/em><\/td>\n <td><em>H\u00f6hle<\/em><\/td>\n <td>f<\/td>\n <td><\/td>\n <\/tr>\n <tr>\n <td><em>cavern<\/em><\/td>\n <td><em>Hohlraum<\/em><\/td>\n <td>m<\/td>\n <td><\/td>\n <\/tr>\n <tr>\n <td><em>Cinematic Mode<\/em><\/td>\n <td><em>Filmmodus<\/em><\/td>\n <td>m<\/td>\n <td>Nicht <em>Kinomodus<\/em>, da es zum Filmen geeignet ist.<\/td>\n <\/tr>\n <tr>\n <td><em>client<\/em><\/td>\n <td><em>Client<\/em><\/td>\n <td>m<\/td>\n <td><\/td>\n <\/tr>\n <tr>\n <td><em>Creative Mode<\/em> \/ <em>creative mode<\/em><\/td>\n <td><em>Kreativmodus<\/em><\/td>\n <td>m<\/td>\n <td><\/td>\n <\/tr>\n <tr>\n <td><em>content store<\/em><\/td>\n <td><em>Inhaltespeicher<\/em><\/td>\n <td>m<\/td>\n <td><\/td>\n <\/tr>\n <tr>\n <td><em>dungeon<\/em><\/td>\n <td><em>Verlies<\/em><\/td>\n <td>n<\/td>\n <td><\/td>\n <\/tr>\n <tr>\n <td><em>entity<\/em>, <em>entities<\/em><\/td>\n <td><em>Entity<\/em>, <em>Entitys<\/em><\/td>\n <td>n<\/td>\n <td><\/td>\n <\/tr>\n <tr>\n <td><em>flags<\/em><\/td>\n <td><em>Flags<\/em><\/td>\n <td>f<\/td>\n <td>Klassische Eindeutschung eines Fremdworts; das Konzept ist schwer mit einem anderen Wort wiederzuspiegeln<\/td>\n <\/tr>\n <tr>\n <td><em>floatland<\/em> \/ <em>floatlands<\/em><\/td>\n <td><em>Schwebeland<\/em> \/ <em>Schwebel\u00e4nder<\/em><\/td>\n <td>n<\/td>\n <td>Schwebende Landmassen, spezielle Funktion im v7-Kartengenerator (siehe <a href=\"https:\/\/docs.luanti.org\/for-creators\/mapgen\/features#floatlands-experimental\">1<\/a>)<\/td>\n <\/tr>\n <tr>\n <td><em>hotbar<\/em><\/td>\n <td><em>Schnellleiste<\/em><\/td>\n <td>f<\/td>\n <td><\/td>\n <\/tr>\n <tr>\n <td><em>game<\/em><\/td>\n <td><em>Spiel<\/em><\/td>\n <td>n<\/td>\n <td>Siehe<\/td>\n <\/tr>\n <tr>\n <td><em>instrumentation<\/em><\/td>\n <td><em>Instrumentierung<\/em><\/td>\n <td>f<\/td>\n <td>Siehe: <a href=\"https:\/\/de.wikipedia.org\/wiki\/Instrumentierung_%28Softwareentwicklung%29\">3<\/a><\/td>\n <\/tr>\n <tr>\n <td><em>item<\/em><\/td>\n <td><em>Gegenstand<\/em><\/td>\n <td>m<\/td>\n <td>Als \u201eitem&quot; wird alles bezeichnet, was man mit sich im Inventar tragen kann. Das umfasst alle Bl\u00f6cke (z.B. Sand), Werkzeuge (z.B. Spitzhacke) und sonstige Dinge (z.B. Kohleklumpen oder Buch).<\/td>\n <\/tr>\n <tr>\n <td><em>lacunarity<\/em><\/td>\n <td><em>L\u00fcckenhaftigkeit<\/em><\/td>\n <td>f<\/td>\n <td>Fachbegriff aus der Mathematik. Siehe: <a href=\"https:\/\/www.dict.cc\/?s=lacunarity\">4<\/a><\/td>\n <\/tr>\n <tr>\n <td><em>map<\/em><\/td>\n <td><em>Karte<\/em><\/td>\n <td>f<\/td>\n <td><\/td>\n <\/tr>\n <tr>\n <td><em>mapchunk<\/em><\/td>\n <td><em>Mapchunk<\/em><\/td>\n <td>m<\/td>\n <td>Noch eine \u201efaule&quot; Eindeutschung eines Fremdworts. Siehe <a href=\"https:\/\/docs.luanti.org\/glossary\">Glossary<\/a><\/td>\n <\/tr>\n <tr>\n <td><em>mapgen<\/em> \/ <em>map generator<\/em><\/td>\n <td><em>Kartengenerator<\/em><\/td>\n <td>m<\/td>\n <td><\/td>\n <\/tr>\n <tr>\n <td><em>mod<\/em><\/td>\n <td><em>Mod<\/em><\/td>\n <td>f<\/td>\n <td>die <em>Modifikation<\/em><\/td>\n <\/tr>\n <tr>\n <td><em>modpack<\/em><\/td>\n <td><em>Modpack<\/em><\/td>\n <td>n<\/td>\n <td>das \u201eMod-Paket&quot;<\/td>\n <\/tr>\n <tr>\n <td><em>node<\/em><\/td>\n <td><em>Block<\/em><\/td>\n <td>m<\/td>\n <td>Die w\u00f6rtliche \u00dcbersetzung w\u00e4re \u201eKnoten&quot;, was aber sehr irref\u00fchrend w\u00e4re.<\/td>\n <\/tr>\n <tr>\n <td><em>noclip<\/em><\/td>\n <td><em>Geistmodus<\/em><\/td>\n <td>m<\/td>\n <td><\/td>\n <\/tr>\n <tr>\n <td><em>mesh<\/em><\/td>\n <td><em>Mesh<\/em><\/td>\n <td>f<\/td>\n <td>Gemeint ist \u201epolygon mesh&quot;, siehe <a href=\"https:\/\/en.wikipedia.org\/wiki\/Polygon_mesh\">5<\/a><\/td>\n <\/tr>\n <tr>\n <td><em>minimap<\/em><\/td>\n <td><em>\u00dcbersichtskarte<\/em><\/td>\n <td>f<\/td>\n <td>Kann bei Platzmangel auch zu \u201eKarte&quot; abgek\u00fcrzt werden<\/td>\n <\/tr>\n <tr>\n <td><em>noise<\/em><\/td>\n <td><em>Rauschen<\/em><\/td>\n <td>n<\/td>\n <td><\/td>\n <\/tr>\n <tr>\n <td><em>noise param<\/em> \/ <em>noise parameter<\/em><\/td>\n <td><em>Rauschparameter<\/em><\/td>\n <td>m<\/td>\n <td><\/td>\n <\/tr>\n <tr>\n <td><em>ridge<\/em><\/td>\n <td><em>Flusskanal<\/em><\/td>\n <td>m<\/td>\n <td>Kontext: Die breiten Fl\u00fcsse in v7, erzeugt vom \u201eridges&quot;-Flag. Siehe <a href=\"https:\/\/docs.luanti.org\/for-creators\/mapgen\/features#rivers\">6<\/a><\/td>\n <\/tr>\n <tr>\n <td><em>shader<\/em><\/td>\n <td><em>Shader<\/em><\/td>\n <td>m<\/td>\n <td><\/td>\n <\/tr>\n <tr>\n <td><em>screenshot<\/em><\/td>\n <td><em>Bildschirmfoto<\/em><\/td>\n <td>n<\/td>\n <td><\/td>\n <\/tr>\n <tr>\n <td><em>special<\/em><\/td>\n <td><em>Spezial<\/em><\/td>\n <td><\/td>\n <td>Name einer Taste<\/td>\n <\/tr>\n <tr>\n <td><em>threshold<\/em><\/td>\n <td><em>Schwellwert<\/em><\/td>\n <td>m<\/td>\n <td>Kontext: Kartengenerator<\/td>\n <\/tr>\n <tr>\n <td><em>tone mapping<\/em><\/td>\n <td><em>Dynamikkompression<\/em><\/td>\n <td>m<\/td>\n <td><\/td>\n <\/tr>\n <tr>\n <td><em>spawn point<\/em><\/td>\n <td><em>Einstiegsposition<\/em><\/td>\n <td>f<\/td>\n <td>Position, in der neue oder wiederbelebte Spieler auftauchen<\/td>\n <\/tr>\n <tr>\n <td><em>world<\/em><\/td>\n <td><em>Welt<\/em><\/td>\n <td>f<\/td>\n <td><\/td>\n <\/tr>\n <\/tbody>\n<\/table>\n<h3 id=\"verben\">Verben<a class=\"anchor\" href=\"#verben\">#<\/a><\/h3>\n<table>\n <thead>\n <tr>\n <th>Original<\/th>\n <th>\u00dcbersetzung<\/th>\n <th>Kommentar<\/th>\n <\/tr>\n <\/thead>\n <tbody>\n <tr>\n <td>to <em>instrument<\/em><\/td>\n <td><em>instrumentieren<\/em><\/td>\n <td>Siehe: <a href=\"https:\/\/de.wikipedia.org\/wiki\/Instrumentierung_%28Softwareentwicklung%29\">7<\/a><\/td>\n <\/tr>\n <tr>\n <td>to <em>render<\/em><\/td>\n <td><em>rendern<\/em><\/td>\n <td><\/td>\n <\/tr>\n <tr>\n <td>to <em>sneak<\/em><\/td>\n <td><em>schleichen<\/em><\/td>\n <td><\/td>\n <\/tr>\n <\/tbody>\n<\/table>\n<h3 id=\"adjektive\">Adjektive<a class=\"anchor\" href=\"#adjektive\">#<\/a><\/h3>\n<table>\n <thead>\n <tr>\n <th>Original<\/th>\n <th>\u00dcbersetzung<\/th>\n <th>Kommentar<\/th>\n <\/tr>\n <\/thead>\n <tbody>\n <tr>\n <td><em>deprecated<\/em><\/td>\n <td><em>veraltet<\/em><\/td>\n <td>Siehe <a href=\"https:\/\/en.wikipedia.org\/wiki\/Deprecated#Software_deprecation\">8<\/a><\/td>\n <\/tr>\n <\/tbody>\n<\/table>\n<h2 id=\"sonstiges\">Sonstiges<a class=\"anchor\" href=\"#sonstiges\">#<\/a><\/h2>\n<ul>\n<li>Benutzer werden in der H\u00f6flichkeitsform (\u201eSie&quot;) angeredet<\/li>\n<li>Anf\u00fchrungszeichen: \u201e &quot;<\/li>\n<li>Innere Anf\u00fchrungszeichen: \u201a '<\/li>\n<\/ul>"},{"title":"Getting Started","link":"https:\/\/docs.luanti.org\/for-players\/getting-started\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-players\/getting-started\/","description":"<h1 id=\"getting-started\">Getting Started<a class=\"anchor\" href=\"#getting-started\">#<\/a><\/h1>\n<p>Welcome to Luanti! This page explains what Luanti is all about, how to get it, and how to start playing your first games alone or online.<\/p>\n<h2 id=\"what-is-this-strange-luanti-thing-i-keep-hearing-about\">\u201cWhat is this strange \u2018Luanti\u2019 thing I keep hearing about?\u201d<a class=\"anchor\" href=\"#what-is-this-strange-luanti-thing-i-keep-hearing-about\">#<\/a><\/h2>\n<ul>\n<li><strong>Luanti<\/strong> is a platform on which you can play many <strong>games<\/strong> which are set in a <strong>world entirely made out of blocks<\/strong>, voxels.<\/li>\n<li>You can play <strong>offline or online<\/strong>, in singleplayer or multiplayer.<\/li>\n<li>Most games (but not all!) have a sandbox gameplay focused on construction, mining and creativity.<\/li>\n<li>You can browse the list of games available on <a href=\"https:\/\/content.luanti.org\/packages\/?type=game\">ContentDB<\/a>.<\/li>\n<li>You can install <strong><a href=\"https:\/\/docs.luanti.org\/for-players\/mods\/\">mods<\/a> to modify<\/strong> certain <strong>aspects of gameplay<\/strong>. Mods are an <strong>inherent<\/strong> part of Luanti, it is even what games consist of.<\/li>\n<li><strong>Mods work out of the box when playing on <a href=\"https:\/\/docs.luanti.org\/for-players\/servers\/\">servers<\/a><\/strong>, no additional installations required. Mods are server-side, everything is handled automatically.<\/li>\n<\/ul>\n<h2 id=\"getting-luanti\">Getting Luanti<a class=\"anchor\" href=\"#getting-luanti\">#<\/a><\/h2>\n<p>You can find links and instructions for downloading Luanti for your platform on the <a href=\"https:\/\/luanti.org\/downloads\/\">downloads page<\/a>.<\/p>"},{"title":"Getting Your IP Address","link":"https:\/\/docs.luanti.org\/for-server-hosts\/setup\/ip-address\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-server-hosts\/setup\/ip-address\/","description":"<h1 id=\"getting-your-ip-address\">Getting Your IP Address<a class=\"anchor\" href=\"#getting-your-ip-address\">#<\/a><\/h1>\n<p>When hosting from home it is necessary to know both your external and internal IP and understanding the difference between the two. The guide will reference these addresses multiple times later so it is good to know what they are for you.<\/p>\n<h2 id=\"external-ip\">External IP<a class=\"anchor\" href=\"#external-ip\">#<\/a><\/h2>\n<p>Your external IP address is the Internet facing address you have. It is what websites see and what people will need to connect to when joining your server. In order to find your external IP address you can simply search &ldquo;what is my ip address&rdquo; on DuckDuckGo and it should show it:<\/p>"},{"title":"Git Guidelines","link":"https:\/\/docs.luanti.org\/for-engine-devs\/git-guidelines\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-engine-devs\/git-guidelines\/","description":"<h1 id=\"git-guidelines\">Git Guidelines<a class=\"anchor\" href=\"#git-guidelines\">#<\/a><\/h1>\n<p>This page is mostly directed to core team members with commit or triage access to upstream repositories.<\/p>\n<p>For determining who is allowed to do what, see <a href=\"https:\/\/docs.luanti.org\/for-engine-devs\/organization\">Organization<\/a>.<\/p>\n<p>For guidelines about overall pull request quality, see <a href=\"https:\/\/docs.luanti.org\/Merging_core_pull_requests_to_upstream\">Merging core pull requests to upstream<\/a>.<\/p>\n<h2 id=\"rules\">Rules<a class=\"anchor\" href=\"#rules\">#<\/a><\/h2>\n<h3 id=\"upstream-branch-rules\">Upstream branch rules<a class=\"anchor\" href=\"#upstream-branch-rules\">#<\/a><\/h3>\n<p>Feature freezes take effect on the master branch.<\/p>\n<p>If desired a separate development branch (&ldquo;dev&rdquo;) can be made into which pull requests are merged during the freeze. It is then rebased onto master once the freeze is over.\nHowever, this is <strong>usually skipped<\/strong> when nobody feels like merging features during a feature freeze.<\/p>"},{"title":"Glossary","link":"https:\/\/docs.luanti.org\/about\/glossary\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/about\/glossary\/","description":"<h1 id=\"glossary\">Glossary<a class=\"anchor\" href=\"#glossary\">#<\/a><\/h1>\n<p>This page contains a hopefully complete list of terminology related to Luanti.<\/p>\n<h2 id=\"luanti-and-its-components\">Luanti and its components<a class=\"anchor\" href=\"#luanti-and-its-components\">#<\/a><\/h2>\n<ul>\n<li><strong>Luanti<\/strong>: The game engine whose wiki you are on right now, generally refers to the engine.<\/li>\n<li><strong>Minetest<\/strong>: The former name of Luanti<\/li>\n<li><strong>IrrlichtMt<\/strong> \/ <strong>Irrlicht<\/strong><sup id=\"fnref:1\"><a href=\"#fn:1\" class=\"footnote-ref\" role=\"doc-noteref\">1<\/a><\/sup>: The name of Luanti&rsquo;s 3D rendering library. It was forked by the Luanti developers from the original <a href=\"https:\/\/irrlicht.sourceforge.io\/\">Irrlicht<\/a>, which is ancient and poorly maintained nowadays.\n<ul>\n<li>IrrlichtMt has been merged into the Luanti repository as the <a href=\"https:\/\/github.com\/luanti-org\/luanti\/tree\/master\/irr\"><code>irr\/<\/code><\/a> directory.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Game<\/strong>: A collection of mods and some additional metadata, which can be selected from the main menu. Not to be confused with Modpack which is a pack of mods selectable like regular mods.\n<ul>\n<li>Previously were referred to as <strong>Subgames<\/strong>, but this term is outdated. Please update any references to it as such.<\/li>\n<\/ul>\n<\/li>\n<li><a href=\"https:\/\/content.luanti.org\/packages\/Minetest\/minetest_game\/\"><strong>Minetest Game<\/strong><\/a> (abbreviated MTG): The name of the game that used to be shipped with Luanti by default.\n<ul>\n<li><a href=\"https:\/\/github.com\/luanti-org\/minetest_game\">minetest_game<\/a>: Repository name of Minetest Game and technical name of the game.<\/li>\n<\/ul>\n<\/li>\n<li><a href=\"https:\/\/docs.luanti.org\/for-players\/mods\"><strong>Mods<\/strong><\/a> : What all games consist of, or can be added on top of an existing game. They are written in Lua using Luanti&rsquo;s modding API.\n<ul>\n<li>Sometimes abbreviated SSM, Server-Side Mod to make the distinction that regular Luanti mods run on the server as compared to CSMs which run on the client.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Client-Side Mod<\/strong> (abbreviated <strong>CSM<\/strong>): An experimental API allowing for the client itself to run Lua code.\n<ul>\n<li><strong>Server-Sent Client-Side Mod<\/strong> (abbreviated <strong>SSCSM<\/strong>): A currently unimplemented feature referring to CSMs being sent from the server to the client, to allow for code to be run on the client for improved latency, among other things.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Modpack<\/strong>: A collection of mods which can be selected like a regular mod. Not to be confused with a Game, which can be selected from the main menu as its own distinct game.<\/li>\n<li><strong>Texture pack<\/strong>: A collection of textures that can replace the textures in games and mods. May only support specific games and\/or mods.<\/li>\n<li><strong><a href=\"https:\/\/content.luanti.org\/\">ContentDB<\/a><\/strong> (abbreviated CDB): The official place to upload and download games, mods and texture packs. It is what powers the content browser accessible from the main menu.<\/li>\n<li><strong>Server<\/strong>: The program that manages and distributes mod, texture and sound data to the players. It also does all of the mod initiation.<\/li>\n<li><strong>Client<\/strong>: The program that the player uses to connect to singleplayer or multiplayer games. Handles the rendering of the world.\n<ul>\n<li>In singleplayer, the client will start a server in the background restricted to the <em>singleplayer<\/em> user which will then join it, acting both as a client and a server in that case.<\/li>\n<\/ul>\n<\/li>\n<li><strong><a href=\"https:\/\/docs.luanti.org\/for-players\/minetest-conf\">minetest.conf<\/a><\/strong>: A file in the root directory of Luanti&rsquo;s user directory which contains configuration settings for Luanti. A list of the settings can be found in the main menu&rsquo;s &ldquo;All settings&rdquo; menu or in <a href=\"https:\/\/github.com\/luanti-org\/luanti\/blob\/master\/minetest.conf.example\"><strong>minetest.conf.example<\/strong><\/a>.<\/li>\n<\/ul>\n<h2 id=\"in-game-content\">In-game Content<a class=\"anchor\" href=\"#in-game-content\">#<\/a><\/h2>\n<ul>\n<li><strong>World<\/strong>: A saved game in Luanti, which contains:\n<ul>\n<li><strong>Map<\/strong>: a <a href=\"https:\/\/docs.luanti.org\/for-server-hosts\/database-backends\">database<\/a> of the map&rsquo;s content, everything from blocks to chest contents.<\/li>\n<li>Player passwords, their health, and their inventory.<\/li>\n<li>Other needed files, such as ban lists, seed numbers and protected areas.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Nodes<\/strong>: 1\u00d71\u00d71 meter individual cubes in the game, and are grouped and loaded by their mapblocks. Informally referred to as blocks by regular players.\n<ul>\n<li><strong>Node Metadata<\/strong>: Additional data that is attached to a node&rsquo;s position in the map. For example container nodes use this to store their inventories, and signs use this to store what is written on them.<\/li>\n<li><strong>Liquids<\/strong>: Nodes with <em>some<\/em> kind of property related to liquids. In development, this term is problematic when used without any clarification, as node properties related to liquids are decoupled. To avoid confusion, say to which <em>precise<\/em> technical property you refer to, for example, the &ldquo;liquid&rdquo; drawtype, liquid spreading\/flowing, liquid viscosity, liquid player movement physics, etc.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Blocks<\/strong>\/<strong>MapBlocks<\/strong>: 16\u00d716\u00d716 groups of nodes.<\/li>\n<li><strong>Sectors<\/strong>: Stacks of single mapblocks, extending from the absolute bottom of the map to the top.<\/li>\n<li><strong>MapChunks<\/strong>: Groups of 80x80x80 nodes (5x5x5 mapblocks), they are an abstraction used only for mapgen for performance reasons.<\/li>\n<li><strong>Object<\/strong>: A movable thing that is not bound to a fixed position on the map. Following kinds of objects exist:\n<ul>\n<li><strong>Entity<\/strong>: An object that is defined and controlled by Lua. For example: mobs, falling nodes or primed TNT.<\/li>\n<li><strong>Player<\/strong>: An object that represents a player.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Items<\/strong>: Any thing that can be put inside of an inventory. Items <em>can<\/em> have special uses like digging, dealing damage, crafting, placing, etc., but this is optional. Note the 3 item types are a technical distinction, not a semantic one.\n<ul>\n<li><strong>Tool<\/strong>\/<strong>Tool item<\/strong>: a type of item that is non-stackable and has a &ldquo;wear&rdquo; property so it is capable of wearing out and break.<\/li>\n<li><strong>Node item<\/strong>: the &ldquo;item form&rdquo; of a node which can be placed by default. Every node has a node item associated with it. For example, cobblestone from Minetest Game is a <em>node<\/em> when it exists in the world, but it is a <em>node item<\/em> when in an inventory.<\/li>\n<li><strong>Craftitem<\/strong>: A type of item that is neither a tool nor a node item.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Item stacks<\/strong>\/<strong>ItemStack<\/strong>: Stacks of identical items with an item count.<\/li>\n<li><strong>Environment<\/strong>: A global Lua\/C++ scripting object that (amongst other things) provides access to all nodes, (active) objects and players.<\/li>\n<li><strong>Active Block Modifier<\/strong> (Abbreviated ABM): Functions that run on nodes of a certain type, changing them or giving them interactive properties (eg. grass and moss growth).<\/li>\n<li><strong>Loading Block Modifiers<\/strong> (Abbreviated LBM): Similar to ABMs but are only run when a mapblock is loaded. They can also only run once, depending on its definition.<\/li>\n<\/ul>\n<h2 id=\"lua-and-modding-related\">Lua and Modding-related<a class=\"anchor\" href=\"#lua-and-modding-related\">#<\/a><\/h2>\n<ul>\n<li><strong>Lua<\/strong>: A simple, minimal and fast programming language which is used for Luanti&rsquo;s API.<\/li>\n<li><strong>Modding API<\/strong>\/<strong>Lua API<\/strong>\/<strong>Luanti API<\/strong>: a selection of functions and values, used by mod files to modify, extend or add features and blocks. API stands for Application Programming Interface.<\/li>\n<li><a href=\"https:\/\/github.com\/luanti-org\/luanti\/blob\/master\/doc\/lua_api.md\"><strong>lua_api.md<\/strong><\/a>: A file in the <code>doc\/<\/code> directory that contains the full reference of the Lua API. The same content is also available in <a href=\"https:\/\/api.luanti.org\/\">HTML format<\/a>.<\/li>\n<\/ul>\n<h2 id=\"notes\">Notes<a class=\"anchor\" href=\"#notes\">#<\/a><\/h2>\n<div class=\"footnotes\" role=\"doc-endnotes\">\n<hr>\n<ol>\n<li id=\"fn:1\">\n<p>Officially, Luanti&rsquo;s rendering library is called &ldquo;IrrlichtMt&rdquo;, but the name &ldquo;Irrlicht&rdquo; is used interchangeably. When we say &ldquo;Irrlicht&rdquo;, we usually mean Luanti&rsquo;s rendering library, not the original one&#160;<a href=\"#fnref:1\" class=\"footnote-backref\" role=\"doc-backlink\">&#x21a9;&#xfe0e;<\/a><\/p>"},{"title":"Groups","link":"https:\/\/docs.luanti.org\/for-creators\/groups\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/groups\/","description":"<h1 id=\"groups\">Groups<a class=\"anchor\" href=\"#groups\">#<\/a><\/h1>\n<p><strong>Groups<\/strong> is a concept for <a href=\"https:\/\/docs.luanti.org\/for-players\/nodes\">nodes<\/a>, <a href=\"https:\/\/docs.luanti.org\/for-players\/items\">items<\/a> and <a href=\"https:\/\/docs.luanti.org\/for-players\/tool\">tools<\/a> in Luanti. Any of these may be a member of a group or multiple groups, or none at all. Groups are used mainly for crafting recipes, to determine damage, to determine digging time and lots of other stuff as well.<\/p>\n<style type=\"text\/css\">\n \n .notice {\n --title-color: #fff;\n --title-background-color: #6be;\n --content-color: #444;\n --content-background-color: #e7f2fa;\n }\n\n .notice.info {\n --title-background-color: #fb7;\n --content-background-color: #fec;\n }\n\n .notice.tip {\n --title-background-color: #5a5;\n --content-background-color: #efe;\n }\n\n .notice.warning {\n --title-background-color: #c33;\n --content-background-color: #fee;\n }\n\n \n @media (prefers-color-scheme:dark) {\n .notice {\n --title-color: #fff;\n --title-background-color: #069;\n --content-color: #ddd;\n --content-background-color: #023;\n }\n\n .notice.info {\n --title-background-color: #a50;\n --content-background-color: #420;\n }\n\n .notice.tip {\n --title-background-color: #363;\n --content-background-color: #121;\n }\n\n .notice.warning {\n --title-background-color: #800;\n --content-background-color: #400;\n }\n }\n\n body.dark .notice {\n --title-color: #fff;\n --title-background-color: #069;\n --content-color: #ddd;\n --content-background-color: #023;\n }\n\n body.dark .notice.info {\n --title-background-color: #a50;\n --content-background-color: #420;\n }\n\n body.dark .notice.tip {\n --title-background-color: #363;\n --content-background-color: #121;\n }\n\n body.dark .notice.warning {\n --title-background-color: #800;\n --content-background-color: #400;\n }\n\n \n .notice {\n padding: 18px;\n line-height: 24px;\n margin-bottom: 24px;\n border-radius: 4px;\n color: var(--content-color);\n background: var(--content-background-color);\n }\n\n .notice p:last-child {\n margin-bottom: 0\n }\n\n \n .notice-title {\n margin: -18px -18px 12px;\n padding: 4px 18px;\n border-radius: 4px 4px 0 0;\n font-weight: 700;\n color: var(--title-color);\n background: var(--title-background-color);\n }\n\n \n .icon-notice {\n display: inline-flex;\n align-self: center;\n margin-right: 8px;\n }\n\n .icon-notice img,\n .icon-notice svg {\n height: 1em;\n width: 1em;\n fill: currentColor;\n }\n\n .icon-notice img,\n .icon-notice.baseline svg {\n top: .125em;\n position: relative;\n }\n<\/style><div class=\"notice info\" >\n <p class=\"notice-title\">\n <span class=\"icon-notice baseline\">\n <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"92 59.5 300 300\">\n <path d=\"M292 303.25V272c0-3.516-2.734-6.25-6.25-6.25H267v-100c0-3.516-2.734-6.25-6.25-6.25h-62.5c-3.516 0-6.25 2.734-6.25 6.25V197c0 3.516 2.734 6.25 6.25 6.25H217v62.5h-18.75c-3.516 0-6.25 2.734-6.25 6.25v31.25c0 3.516 2.734 6.25 6.25 6.25h87.5c3.516 0 6.25-2.734 6.25-6.25Zm-25-175V97c0-3.516-2.734-6.25-6.25-6.25h-37.5c-3.516 0-6.25 2.734-6.25 6.25v31.25c0 3.516 2.734 6.25 6.25 6.25h37.5c3.516 0 6.25-2.734 6.25-6.25Zm125 81.25c0 82.813-67.188 150-150 150-82.813 0-150-67.188-150-150 0-82.813 67.188-150 150-150 82.813 0 150 67.188 150 150Z\"\/>\n<\/svg>\n\n <\/span> Info <\/p>"},{"title":"Hand","link":"https:\/\/docs.luanti.org\/for-creators\/hand\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/hand\/","description":"<h1 id=\"hand\">Hand<a class=\"anchor\" href=\"#hand\">#<\/a><\/h1>\n<p>The <strong>hand<\/strong> is the most basic \u201ctool\u201d in Luanti. The hand is capable of breaking blocks and <a href=\"https:\/\/docs.luanti.org\/for-players\/punching\">punching<\/a>. But these features might differ in games. The hand is automatically selected when you wield nothing.<\/p>\n<h2 id=\"the-implicit-hand\">The \u201cimplicit\u201d hand<a class=\"anchor\" href=\"#the-implicit-hand\">#<\/a><\/h2>\n<p>If you carry an item which is not a tool (for example: a stone), it has the same properties as you\u2019d have with the hand, which means, you can collect items and dig the weakest blocks with the same digging time as with the hand. If you use a tool to break a block for which this tool wasn\u2019t build for, the digging time also equals those of the hand as long as the block is breakable by hand at all. The tool does not wear down from that. For example, if you use a pickaxe to dig out dirt, the pickaxe behaves exactly like the hand.<\/p>"},{"title":"How to emulate mapgen v6 using a customized mapgen v7","link":"https:\/\/docs.luanti.org\/for-creators\/mapgen\/emulate-mapgen-v6-using-a-customized-mapgen-v7\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/mapgen\/emulate-mapgen-v6-using-a-customized-mapgen-v7\/","description":"<h1 id=\"how-to-emulate-mapgen-v6-using-a-customized-mapgen-v7\">How to emulate mapgen v6 using a customized mapgen v7<a class=\"anchor\" href=\"#how-to-emulate-mapgen-v6-using-a-customized-mapgen-v7\">#<\/a><\/h1>\n<p>Some players like aspects of <a href=\"https:\/\/docs.luanti.org\/for-creators\/mapgen\">Mapgen<\/a> v6, but the biomes are hardcoded, so it&rsquo;s not possible for games to register their own biomes. It is also very different from the other mapgens in how it works and is more difficult to support in games.<\/p>\n<p>It is actually possible to approximately emulate Mapgen v6 in Mapgen v7 using customized settings. This is only possible in version 5.2.0 or later due to the \u201crandomwalk\u201d caves now being more configurable, allowing Mapgen v7 to have caves like in Mapgen v6.<\/p>"},{"title":"How to get a domain name for your server","link":"https:\/\/docs.luanti.org\/for-server-hosts\/domain\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-server-hosts\/domain\/","description":"<h1 id=\"how-to-get-a-domain-name-for-your-server\">How to get a domain name for your server<a class=\"anchor\" href=\"#how-to-get-a-domain-name-for-your-server\">#<\/a><\/h1>\n<h2 id=\"what-is-dns\">What is DNS<a class=\"anchor\" href=\"#what-is-dns\">#<\/a><\/h2>\n<p><em>Skip to Step 1 if you already know about dynamic DNS.<\/em><\/p>\n<p>DNS just means &ldquo;Domain Name System&rdquo;. A domain name is a label that&rsquo;s easy for people to read or remember, which computers can use to look up an internet address (IP address).<\/p>\n<p>For example, the domain &ldquo;docs.luanti.org&rdquo; tells your computer to go to an IP address like 89.188.9.43<\/p>"},{"title":"HTTP API","link":"https:\/\/docs.luanti.org\/for-creators\/api\/http-api\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/api\/http-api\/","description":"<h1 id=\"http-api\">HTTP API<a class=\"anchor\" href=\"#http-api\">#<\/a><\/h1>\n<p>Enables mods to make HTTP requests.<\/p>\n<h2 id=\"settings\">Settings<a class=\"anchor\" href=\"#settings\">#<\/a><\/h2>\n<p>To use this API, mods need to be listed in one or the other following\nsettings in CSV format:<\/p>\n<ul>\n<li><code>secure.trusted_mods<\/code><\/li>\n<li><code>secure.http_mods<\/code><\/li>\n<\/ul>\n<p>An example would be:<\/p>\n<pre tabindex=\"0\"><code>secure.http_mods = modname1, modname2, modname3<\/code><\/pre><h2 id=\"types\">Types<a class=\"anchor\" href=\"#types\">#<\/a><\/h2>\n<h3 id=\"httprequest\">HttpRequest<a class=\"anchor\" href=\"#httprequest\">#<\/a><\/h3>\n<p>A table consisting of the following parameters:<\/p>\n<ul>\n<li><code>url<\/code> (required):\n<ul>\n<li>Type string<\/li>\n<li>Example: <code>https:\/\/subdomain.domain.tld<\/code><\/li>\n<\/ul>\n<\/li>\n<li><code>timeout<\/code> (optional):\n<ul>\n<li>Time in seconds<\/li>\n<li>Default is what <code>curl_timeout<\/code> setting is set to (NOTE: setting is\nin milliseconds)<\/li>\n<\/ul>\n<\/li>\n<li><code>method<\/code> (optional):\n<ul>\n<li>Type string<\/li>\n<li>Supports <code>GET<\/code>, <code>POST<\/code>, <code>PUT<\/code>, <code>DELETE<\/code><\/li>\n<li>Default is <code>GET<\/code><\/li>\n<\/ul>\n<\/li>\n<li><code>data<\/code> (optional):\n<ul>\n<li>Supports string or table<\/li>\n<li>Tables are encoded as <code>x-www-form-urlencoded<\/code> key value pairs<\/li>\n<\/ul>\n<\/li>\n<li><code>post_data<\/code> (optional):\n<ul>\n<li>Deprecated, see data above<\/li>\n<\/ul>\n<\/li>\n<li><code>user_agent<\/code> (optional):\n<ul>\n<li>Type string<\/li>\n<li>Replaces the default user agent if provided<\/li>\n<\/ul>\n<\/li>\n<li><code>extra_headers<\/code> (optional):\n<ul>\n<li>Table of strings<\/li>\n<li>Each string needs to follow http spec, <code>&quot;key: value&quot;<\/code><\/li>\n<\/ul>\n<\/li>\n<li><code>multipart<\/code> (optional):\n<ul>\n<li>Boolean, default false<\/li>\n<li>Method must be <code>POST<\/code><\/li>\n<li>Learn more at <a href=\"https:\/\/en.wikipedia.org\/wiki\/MIME#Multipart_messages\">MIME (Wikipedia)<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3 id=\"httprequestresult\">HttpRequestResult<a class=\"anchor\" href=\"#httprequestresult\">#<\/a><\/h3>\n<p>A table consisting of the following parameters<\/p>"},{"title":"HUD","link":"https:\/\/docs.luanti.org\/for-players\/hud\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-players\/hud\/","description":"<h1 id=\"hud\">HUD<a class=\"anchor\" href=\"#hud\">#<\/a><\/h1>\n<style type=\"text\/css\">\n \n .notice {\n --title-color: #fff;\n --title-background-color: #6be;\n --content-color: #444;\n --content-background-color: #e7f2fa;\n }\n\n .notice.info {\n --title-background-color: #fb7;\n --content-background-color: #fec;\n }\n\n .notice.tip {\n --title-background-color: #5a5;\n --content-background-color: #efe;\n }\n\n .notice.warning {\n --title-background-color: #c33;\n --content-background-color: #fee;\n }\n\n \n @media (prefers-color-scheme:dark) {\n .notice {\n --title-color: #fff;\n --title-background-color: #069;\n --content-color: #ddd;\n --content-background-color: #023;\n }\n\n .notice.info {\n --title-background-color: #a50;\n --content-background-color: #420;\n }\n\n .notice.tip {\n --title-background-color: #363;\n --content-background-color: #121;\n }\n\n .notice.warning {\n --title-background-color: #800;\n --content-background-color: #400;\n }\n }\n\n body.dark .notice {\n --title-color: #fff;\n --title-background-color: #069;\n --content-color: #ddd;\n --content-background-color: #023;\n }\n\n body.dark .notice.info {\n --title-background-color: #a50;\n --content-background-color: #420;\n }\n\n body.dark .notice.tip {\n --title-background-color: #363;\n --content-background-color: #121;\n }\n\n body.dark .notice.warning {\n --title-background-color: #800;\n --content-background-color: #400;\n }\n\n \n .notice {\n padding: 18px;\n line-height: 24px;\n margin-bottom: 24px;\n border-radius: 4px;\n color: var(--content-color);\n background: var(--content-background-color);\n }\n\n .notice p:last-child {\n margin-bottom: 0\n }\n\n \n .notice-title {\n margin: -18px -18px 12px;\n padding: 4px 18px;\n border-radius: 4px 4px 0 0;\n font-weight: 700;\n color: var(--title-color);\n background: var(--title-background-color);\n }\n\n \n .icon-notice {\n display: inline-flex;\n align-self: center;\n margin-right: 8px;\n }\n\n .icon-notice img,\n .icon-notice svg {\n height: 1em;\n width: 1em;\n fill: currentColor;\n }\n\n .icon-notice img,\n .icon-notice.baseline svg {\n top: .125em;\n position: relative;\n }\n<\/style><div class=\"notice warning\" >\n <p class=\"notice-title\">\n <span class=\"icon-notice baseline\">\n <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"126 76.5 300 300\">\n <path d=\"M297.431 324.397v-34.255c0-3.245-2.344-5.95-5.358-5.95h-32.146c-3.014 0-5.358 2.705-5.358 5.95v34.255c0 3.245 2.344 5.95 5.358 5.95h32.146c3.014 0 5.358-2.705 5.358-5.95Zm-.335-67.428 3.014-82.753c0-1.081-.502-2.524-1.674-3.425-1.005-.902-2.512-1.983-4.019-1.983h-36.834c-1.507 0-3.014 1.081-4.019 1.983-1.172.901-1.674 2.704-1.674 3.786l2.846 82.392c0 2.344 2.512 4.146 5.693 4.146h30.975c3.013 0 5.525-1.803 5.692-4.146Zm-2.344-168.39L423.34 342.425c3.683 7.032 3.516 15.686-.335 22.717-3.85 7.031-10.883 11.358-18.417 11.358H147.413c-7.534 0-14.566-4.327-18.417-11.358-3.85-7.031-4.018-15.685-.335-22.716L257.248 88.578C260.93 81.188 268.13 76.5 276 76.5c7.87 0 15.069 4.688 18.752 12.08Z\"\/>\n<\/svg>\n\n <\/span> Warning <\/p>"},{"title":"Improving Build Times","link":"https:\/\/docs.luanti.org\/for-engine-devs\/compiling\/improving-build-times\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-engine-devs\/compiling\/improving-build-times\/","description":"<h1 id=\"improving-build-times\">Improving build times<a class=\"anchor\" href=\"#improving-build-times\">#<\/a><\/h1>\n<p>This page contains useful tips for improving build times when compiling Luanti. This is useful when you are repeatedly building Luanti for testing or if you want to make incremental builds as quick as possible.<\/p>\n<p>The instructions assume you are on Linux, as that&rsquo;s where you can usually expect the best compile times in general.<\/p>\n<h2 id=\"use-clang\">Use Clang<a class=\"anchor\" href=\"#use-clang\">#<\/a><\/h2>\n<p>Luanti supports building with the Clang compiler, which generally compiles somewhat faster compared to GCC. You should be able to install Clang from your Linux distribution&rsquo;s package manager and then make CMake build with Clang instead of GCC with the following build options:<\/p>"},{"title":"Installing Client-Side Mods","link":"https:\/\/docs.luanti.org\/for-players\/installing-client-side-mods\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-players\/installing-client-side-mods\/","description":"<h1 id=\"installing-client-side-mods\">Installing Client-Side Mods<a class=\"anchor\" href=\"#installing-client-side-mods\">#<\/a><\/h1>\n<h2 id=\"security-considerations\">Security considerations<a class=\"anchor\" href=\"#security-considerations\">#<\/a><\/h2>\n<p><strong>Prior to installing any <a href=\"https:\/\/docs.luanti.org\/for-players\/mods\/#client-side-mods\">Client-side mods<\/a>, please make sure that you have received it from someone you trust. Malicious code can damage your computer, violate your privacy or cause your computer to take part in illegal activities.<\/strong><\/p>\n<h2 id=\"installing-a-client-side-mod\">Installing a Client-side mod<a class=\"anchor\" href=\"#installing-a-client-side-mod\">#<\/a><\/h2>\n<p>After downloading a client-side mod (e.g. from the <a href=\"https:\/\/forum.luanti.org\/viewforum.php?f=53\">Client-side modding forum<\/a>) you usually have a Zip archive. In order to get the mod running, you have to unpack it into the clientmods folder.<\/p>"},{"title":"Installing Mods","link":"https:\/\/docs.luanti.org\/for-players\/installing-mods\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-players\/installing-mods\/","description":"<h1 id=\"installing-mods\">Installing Mods<a class=\"anchor\" href=\"#installing-mods\">#<\/a><\/h1>\n<h2 id=\"security-considerations\">Security considerations<a class=\"anchor\" href=\"#security-considerations\">#<\/a><\/h2>\n<p><strong>Mods are by default run in a secure environment that restricts access to the filesystem and execution of external programs, however not all sandboxes are 100% secure. Additionally do not mark mods as trusted or disable mod security altogether if you are not aware of what you are doing, as they will run un-sandboxed at the same privileges as Luanti. This applies not only to malicious mods but benign ones with security vulnerabilities. Exercise caution when downloading mods outside of official channels such as ContentDB where mods are vetted by the community for safety and security.<\/strong><\/p>"},{"title":"Inventory","link":"https:\/\/docs.luanti.org\/for-players\/inventory\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-players\/inventory\/","description":"<h1 id=\"inventory\">Inventory<a class=\"anchor\" href=\"#inventory\">#<\/a><\/h1>\n<p>An <strong>inventory<\/strong> is primarily used to store <a href=\"https:\/\/docs.luanti.org\/for-players\/items#item-stack\">item stacks<\/a>. There are other uses, such as crafting. An inventory consists of a rectangular grid of item slots. Each item slot can be either empty or hold one item stack. Item stacks can be moved freely between slot and slot, given that the destination slot is either empty or of the same item type.<\/p>\n<h2 id=\"inventory-menu\">Inventory menu<a class=\"anchor\" href=\"#inventory-menu\">#<\/a><\/h2>\n<p>The <strong>inventory menu<\/strong> is a special in-game menu where the player normally, but not necessarily, finds an inventory and other related stuff.<\/p>"},{"title":"IRC","link":"https:\/\/docs.luanti.org\/about\/irc\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/about\/irc\/","description":"<h1 id=\"irc\">IRC<a class=\"anchor\" href=\"#irc\">#<\/a><\/h1>\n<p>Internet Relay Chat (IRC) is one of the platforms that Luanti uses for real-time chat. IRC also serves as a common ground between other platforms such as Discord and Matrix.<\/p>\n<p>All the engaged people from the community and the developer team can be found there, and most prolific modders will also be available there.<\/p>\n<h2 id=\"channels\">Channels<a class=\"anchor\" href=\"#channels\">#<\/a><\/h2>\n<p>All of the Luanti IRC channels are on irc.libera.chat. You can connect either via webchat or install an external IRC client (see <a href=\"#irc-software\">IRC software<\/a>).<\/p>"},{"title":"Items","link":"https:\/\/docs.luanti.org\/for-players\/items\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-players\/items\/","description":"<h1 id=\"items\">Items<a class=\"anchor\" href=\"#items\">#<\/a><\/h1>\n<p><strong>Items<\/strong> are things that can be stored in an <a href=\"https:\/\/docs.luanti.org\/for-players\/inventory\">inventory<\/a>. This includes tools, weapons, <a href=\"https:\/\/docs.luanti.org\/for-players\/nodes\">nodes<\/a> and pure crafting elements that may or may not have additional behaviors (&ldquo;craftitems&rdquo;).<\/p>\n<h2 id=\"item-stack\">Item stack<a class=\"anchor\" href=\"#item-stack\">#<\/a><\/h2>\n<p>An <strong>item stack<\/strong> is a collection of multiple items of the same type. Any item type has a stack limit, it is not possible to stack more items of such an item than the stack limit.<\/p>\n<h3 id=\"appearance\">Appearance<a class=\"anchor\" href=\"#appearance\">#<\/a><\/h3>\n<p>Item stacks can be stored in inventories and can also appear in the world itself.<\/p>"},{"title":"ItemStackMetaData","link":"https:\/\/docs.luanti.org\/for-creators\/api\/classes\/itemstackmetadata\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/api\/classes\/itemstackmetadata\/","description":"<h1 id=\"itemstackmetadata\">ItemStackMetaData<a class=\"anchor\" href=\"#itemstackmetadata\">#<\/a><\/h1>\n<p>ItemStackMetaData is a subclass of <a href=\"https:\/\/docs.luanti.org\/for-creators\/api\/classes\/metadata\/\">MetaData<\/a> obtained via <code>stack:get_meta()<\/code> allowing for persistent storage of key-value pairs tied to ItemStacks.<\/p>\n<style type=\"text\/css\">\n \n .notice {\n --title-color: #fff;\n --title-background-color: #6be;\n --content-color: #444;\n --content-background-color: #e7f2fa;\n }\n\n .notice.info {\n --title-background-color: #fb7;\n --content-background-color: #fec;\n }\n\n .notice.tip {\n --title-background-color: #5a5;\n --content-background-color: #efe;\n }\n\n .notice.warning {\n --title-background-color: #c33;\n --content-background-color: #fee;\n }\n\n \n @media (prefers-color-scheme:dark) {\n .notice {\n --title-color: #fff;\n --title-background-color: #069;\n --content-color: #ddd;\n --content-background-color: #023;\n }\n\n .notice.info {\n --title-background-color: #a50;\n --content-background-color: #420;\n }\n\n .notice.tip {\n --title-background-color: #363;\n --content-background-color: #121;\n }\n\n .notice.warning {\n --title-background-color: #800;\n --content-background-color: #400;\n }\n }\n\n body.dark .notice {\n --title-color: #fff;\n --title-background-color: #069;\n --content-color: #ddd;\n --content-background-color: #023;\n }\n\n body.dark .notice.info {\n --title-background-color: #a50;\n --content-background-color: #420;\n }\n\n body.dark .notice.tip {\n --title-background-color: #363;\n --content-background-color: #121;\n }\n\n body.dark .notice.warning {\n --title-background-color: #800;\n --content-background-color: #400;\n }\n\n \n .notice {\n padding: 18px;\n line-height: 24px;\n margin-bottom: 24px;\n border-radius: 4px;\n color: var(--content-color);\n background: var(--content-background-color);\n }\n\n .notice p:last-child {\n margin-bottom: 0\n }\n\n \n .notice-title {\n margin: -18px -18px 12px;\n padding: 4px 18px;\n border-radius: 4px 4px 0 0;\n font-weight: 700;\n color: var(--title-color);\n background: var(--title-background-color);\n }\n\n \n .icon-notice {\n display: inline-flex;\n align-self: center;\n margin-right: 8px;\n }\n\n .icon-notice img,\n .icon-notice svg {\n height: 1em;\n width: 1em;\n fill: currentColor;\n }\n\n .icon-notice img,\n .icon-notice.baseline svg {\n top: .125em;\n position: relative;\n }\n<\/style><div class=\"notice warning\" >\n <p class=\"notice-title\">\n <span class=\"icon-notice baseline\">\n <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"126 76.5 300 300\">\n <path d=\"M297.431 324.397v-34.255c0-3.245-2.344-5.95-5.358-5.95h-32.146c-3.014 0-5.358 2.705-5.358 5.95v34.255c0 3.245 2.344 5.95 5.358 5.95h32.146c3.014 0 5.358-2.705 5.358-5.95Zm-.335-67.428 3.014-82.753c0-1.081-.502-2.524-1.674-3.425-1.005-.902-2.512-1.983-4.019-1.983h-36.834c-1.507 0-3.014 1.081-4.019 1.983-1.172.901-1.674 2.704-1.674 3.786l2.846 82.392c0 2.344 2.512 4.146 5.693 4.146h30.975c3.013 0 5.525-1.803 5.692-4.146Zm-2.344-168.39L423.34 342.425c3.683 7.032 3.516 15.686-.335 22.717-3.85 7.031-10.883 11.358-18.417 11.358H147.413c-7.534 0-14.566-4.327-18.417-11.358-3.85-7.031-4.018-15.685-.335-22.716L257.248 88.578C260.93 81.188 268.13 76.5 276 76.5c7.87 0 15.069 4.688 18.752 12.08Z\"\/>\n<\/svg>\n\n <\/span> Warning <\/p>"},{"title":"Itemstrings","link":"https:\/\/docs.luanti.org\/for-players\/itemstrings\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-players\/itemstrings\/","description":"<h1 id=\"itemstrings\">Itemstrings<a class=\"anchor\" href=\"#itemstrings\">#<\/a><\/h1>\n<p><strong>Itemstrings<\/strong> are the internal names for items, blocks, nodes (everything which can be stored in an <a href=\"https:\/\/docs.luanti.org\/for-players\/inventory\">inventory<\/a>).<\/p>\n<h2 id=\"syntax\">Syntax<a class=\"anchor\" href=\"#syntax\">#<\/a><\/h2>\n<p>An usual itemstring consists of a the name of the <a href=\"https:\/\/docs.luanti.org\/for-players\/mods\">mod<\/a> where the item originates from followed by a \u201c:\u201d followed by an item name. All itemstrings are case sensitive.<\/p>\n<pre tabindex=\"0\"><code>&lt;mod_name&gt;:&lt;item_name&gt;<\/code><\/pre><p>Examples:<\/p>\n<ul>\n<li><code>default:torch<\/code> \u2014 a torch (from mod \u201cdefault\u201d)<\/li>\n<li><code>default:dirt<\/code> \u2014 dirt (from mod \u201cdefault\u201d)<\/li>\n<li><code>farming:bread<\/code> \u2014 bread (from mod \u201cfarming\u201d)<\/li>\n<li><code>wool:orange<\/code> \u2014 orange wool (from mod \u201cwool\u201d)<\/li>\n<li><code>screwdriver:screwdriver<\/code> \u2014 screwdriver (from mod \u201cscrewdriver\u201d)<\/li>\n<\/ul>\n<p>There are itemstrings which don\u2019t follow the syntax rules, see <a href=\"#special-itemstrings\">#Special itemstrings<\/a>.<\/p>"},{"title":"Keeping world compatibility","link":"https:\/\/docs.luanti.org\/for-creators\/keeping-world-compatibility\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/keeping-world-compatibility\/","description":"<h1 id=\"keeping-world-compatibility\">Keeping world compatibility<a class=\"anchor\" href=\"#keeping-world-compatibility\">#<\/a><\/h1>\n<p>If your game or mod is stable and played by many players then it is a good idea to keep compatibility with old worlds as much as possible, in order to prevent unknown or glitched nodes showing up in players worlds.<\/p>\n<h2 id=\"aliases\">Aliases<a class=\"anchor\" href=\"#aliases\">#<\/a><\/h2>\n<p>Nodes and items support itemstring aliases, allowing you to alias an outdated itemstring to a new one.<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-lua\" data-lang=\"lua\"><span style=\"display:flex;\"><span>core.register_alias(<span style=\"color:#e6db74\">&#39;mymod:old_item_name&#39;<\/span>, <span style=\"color:#e6db74\">&#39;mymod:new_item_name&#39;<\/span>)<\/span><\/span><\/code><\/pre><\/div><p>This is also very useful for keeping compatibility when refactoring and\/or namespacing technical mod names in a game:<\/p>"},{"title":"L-system trees","link":"https:\/\/docs.luanti.org\/for-creators\/l-system-trees\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/l-system-trees\/","description":"<h1 id=\"l-system-trees\">L-system trees<a class=\"anchor\" href=\"#l-system-trees\">#<\/a><\/h1>\n<p>Luanti has two types of trees built in: Small simple ones like the trees in the vanilla Minetest Game, and more complex ones generated using a L-system and a tree definition. L-system trees can be spawned with <code>core.spawn_tree<\/code> and are defined by a <code>treedef<\/code> table.<\/p>\n<p>The following chat log might be helpful in understanding how L-system trees work: <a href=\"http:\/\/irc.minetest.ru\/minetest\/2013-08-08#i_3250058\">#minetest 2013-08-08<\/a><\/p>\n<h2 id=\"turtle-graphics\">Turtle graphics<a class=\"anchor\" href=\"#turtle-graphics\">#<\/a><\/h2>\n<p>The <a href=\"https:\/\/en.wikipedia.org\/wiki\/L-system\">L-system<\/a> is much like turtle graphics: there is a cursor, it is called the turtle. It can be moved and rotated, and place none, one or more nodes in each step, depending on the used command:<\/p>"},{"title":"Licensing","link":"https:\/\/docs.luanti.org\/for-creators\/licensing\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/licensing\/","description":"<h1 id=\"licensing\">Licensing<a class=\"anchor\" href=\"#licensing\">#<\/a><\/h1>\n<p>A considerable number of Luanti-based games have appeared in the Android play store and Google Play. See the <a href=\"https:\/\/docs.luanti.org\/about\/luanti-forks\">list of Luanti forks<\/a> for examples of these.<\/p>\n<p><em>Please look at: <a href=\"http:\/\/www.flightgear.org\/flightprosim.html\">FlightGear<\/a> as they have the same issue as Luanti has.<\/em><\/p>\n<h2 id=\"complying-with-the-license\">Complying with the License<a class=\"anchor\" href=\"#complying-with-the-license\">#<\/a><\/h2>\n<p>The code of both the Luanti engine and Minetest Game are licensed under <a href=\"https:\/\/www.gnu.org\/licenses\/lgpl-2.1.html\">LGPL 2.1+ free software license<\/a>. Other components may be similarly licensed, however this document does not cover them. <strong>Note that this document is only intended for informational purposes<\/strong>, for the real legally binding terms you should read the <a href=\"https:\/\/www.gnu.org\/licenses\/lgpl-2.1.html\">LGPL 2.1+ license<\/a>.<\/p>"},{"title":"Light","link":"https:\/\/docs.luanti.org\/for-players\/light\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-players\/light\/","description":"<h1 id=\"light\">Light<a class=\"anchor\" href=\"#light\">#<\/a><\/h1>\n<p>In Luanti, <strong>light<\/strong> is entirely block-based, just like the rest of the world.<\/p>\n<h2 id=\"light-level\">Light level<a class=\"anchor\" href=\"#light-level\">#<\/a><\/h2>\n<p>As the world is entirely block-based, so is the light in the world. Each block has its own brightness.<\/p>\n<p>The brightness of a block is expressed in a \u201clight level\u201d which ranges from 0 (total darkness) to 15 (as bright as the sun).<\/p>\n<h2 id=\"types-of-light\">Types of light<a class=\"anchor\" href=\"#types-of-light\">#<\/a><\/h2>\n<p>There are two types of light: Sunlight and artificial light.<\/p>"},{"title":"Limitations","link":"https:\/\/docs.luanti.org\/for-creators\/limitations\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/limitations\/","description":"<h1 id=\"limitations\">Limitations<a class=\"anchor\" href=\"#limitations\">#<\/a><\/h1>\n<p>This page lists various limitations that exist in the Luanti engine. This list could also be seen as a wishlist for far fetched features.<\/p>\n<p>Also see the <a href=\"https:\/\/docs.luanti.org\/for-creators\/list-of-hardcoded-features\">List of hardcoded features<\/a> page for behavior in the engine that is mostly hardcoded.<\/p>\n<h2 id=\"running-code-on-the-client\">Running code on the client<a class=\"anchor\" href=\"#running-code-on-the-client\">#<\/a><\/h2>\n<p>Mods always run on the server, and not on the client. While there is a client modding API (with client-side mods, CSMs), they are very limited and require to be manually installed. The concept of SSCSM (Server-sent client side modding) would solve this but has not been fully implemented yet.<\/p>"},{"title":"Linux","link":"https:\/\/docs.luanti.org\/for-server-hosts\/setup\/linux\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-server-hosts\/setup\/linux\/","description":"<h1 id=\"linux-configuration\">Linux Configuration<a class=\"anchor\" href=\"#linux-configuration\">#<\/a><\/h1>\n<h2 id=\"obtaining-a-server-binary\">Obtaining a server binary<a class=\"anchor\" href=\"#obtaining-a-server-binary\">#<\/a><\/h2>\n<style type=\"text\/css\">\n \n .notice {\n --title-color: #fff;\n --title-background-color: #6be;\n --content-color: #444;\n --content-background-color: #e7f2fa;\n }\n\n .notice.info {\n --title-background-color: #fb7;\n --content-background-color: #fec;\n }\n\n .notice.tip {\n --title-background-color: #5a5;\n --content-background-color: #efe;\n }\n\n .notice.warning {\n --title-background-color: #c33;\n --content-background-color: #fee;\n }\n\n \n @media (prefers-color-scheme:dark) {\n .notice {\n --title-color: #fff;\n --title-background-color: #069;\n --content-color: #ddd;\n --content-background-color: #023;\n }\n\n .notice.info {\n --title-background-color: #a50;\n --content-background-color: #420;\n }\n\n .notice.tip {\n --title-background-color: #363;\n --content-background-color: #121;\n }\n\n .notice.warning {\n --title-background-color: #800;\n --content-background-color: #400;\n }\n }\n\n body.dark .notice {\n --title-color: #fff;\n --title-background-color: #069;\n --content-color: #ddd;\n --content-background-color: #023;\n }\n\n body.dark .notice.info {\n --title-background-color: #a50;\n --content-background-color: #420;\n }\n\n body.dark .notice.tip {\n --title-background-color: #363;\n --content-background-color: #121;\n }\n\n body.dark .notice.warning {\n --title-background-color: #800;\n --content-background-color: #400;\n }\n\n \n .notice {\n padding: 18px;\n line-height: 24px;\n margin-bottom: 24px;\n border-radius: 4px;\n color: var(--content-color);\n background: var(--content-background-color);\n }\n\n .notice p:last-child {\n margin-bottom: 0\n }\n\n \n .notice-title {\n margin: -18px -18px 12px;\n padding: 4px 18px;\n border-radius: 4px 4px 0 0;\n font-weight: 700;\n color: var(--title-color);\n background: var(--title-background-color);\n }\n\n \n .icon-notice {\n display: inline-flex;\n align-self: center;\n margin-right: 8px;\n }\n\n .icon-notice img,\n .icon-notice svg {\n height: 1em;\n width: 1em;\n fill: currentColor;\n }\n\n .icon-notice img,\n .icon-notice.baseline svg {\n top: .125em;\n position: relative;\n }\n<\/style><div class=\"notice info\" >\n <p class=\"notice-title\">\n <span class=\"icon-notice baseline\">\n <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"92 59.5 300 300\">\n <path d=\"M292 303.25V272c0-3.516-2.734-6.25-6.25-6.25H267v-100c0-3.516-2.734-6.25-6.25-6.25h-62.5c-3.516 0-6.25 2.734-6.25 6.25V197c0 3.516 2.734 6.25 6.25 6.25H217v62.5h-18.75c-3.516 0-6.25 2.734-6.25 6.25v31.25c0 3.516 2.734 6.25 6.25 6.25h87.5c3.516 0 6.25-2.734 6.25-6.25Zm-25-175V97c0-3.516-2.734-6.25-6.25-6.25h-37.5c-3.516 0-6.25 2.734-6.25 6.25v31.25c0 3.516 2.734 6.25 6.25 6.25h37.5c3.516 0 6.25-2.734 6.25-6.25Zm125 81.25c0 82.813-67.188 150-150 150-82.813 0-150-67.188-150-150 0-82.813 67.188-150 150-150 82.813 0 150 67.188 150 150Z\"\/>\n<\/svg>\n\n <\/span> Info <\/p>"},{"title":"Linux - headless server","link":"https:\/\/docs.luanti.org\/for-engine-devs\/compiling\/linux-server\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-engine-devs\/compiling\/linux-server\/","description":"<style type=\"text\/css\">\n \n .notice {\n --title-color: #fff;\n --title-background-color: #6be;\n --content-color: #444;\n --content-background-color: #e7f2fa;\n }\n\n .notice.info {\n --title-background-color: #fb7;\n --content-background-color: #fec;\n }\n\n .notice.tip {\n --title-background-color: #5a5;\n --content-background-color: #efe;\n }\n\n .notice.warning {\n --title-background-color: #c33;\n --content-background-color: #fee;\n }\n\n \n @media (prefers-color-scheme:dark) {\n .notice {\n --title-color: #fff;\n --title-background-color: #069;\n --content-color: #ddd;\n --content-background-color: #023;\n }\n\n .notice.info {\n --title-background-color: #a50;\n --content-background-color: #420;\n }\n\n .notice.tip {\n --title-background-color: #363;\n --content-background-color: #121;\n }\n\n .notice.warning {\n --title-background-color: #800;\n --content-background-color: #400;\n }\n }\n\n body.dark .notice {\n --title-color: #fff;\n --title-background-color: #069;\n --content-color: #ddd;\n --content-background-color: #023;\n }\n\n body.dark .notice.info {\n --title-background-color: #a50;\n --content-background-color: #420;\n }\n\n body.dark .notice.tip {\n --title-background-color: #363;\n --content-background-color: #121;\n }\n\n body.dark .notice.warning {\n --title-background-color: #800;\n --content-background-color: #400;\n }\n\n \n .notice {\n padding: 18px;\n line-height: 24px;\n margin-bottom: 24px;\n border-radius: 4px;\n color: var(--content-color);\n background: var(--content-background-color);\n }\n\n .notice p:last-child {\n margin-bottom: 0\n }\n\n \n .notice-title {\n margin: -18px -18px 12px;\n padding: 4px 18px;\n border-radius: 4px 4px 0 0;\n font-weight: 700;\n color: var(--title-color);\n background: var(--title-background-color);\n }\n\n \n .icon-notice {\n display: inline-flex;\n align-self: center;\n margin-right: 8px;\n }\n\n .icon-notice img,\n .icon-notice svg {\n height: 1em;\n width: 1em;\n fill: currentColor;\n }\n\n .icon-notice img,\n .icon-notice.baseline svg {\n top: .125em;\n position: relative;\n }\n<\/style><div class=\"notice info\" >\n <p class=\"notice-title\">\n <span class=\"icon-notice baseline\">\n <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"92 59.5 300 300\">\n <path d=\"M292 303.25V272c0-3.516-2.734-6.25-6.25-6.25H267v-100c0-3.516-2.734-6.25-6.25-6.25h-62.5c-3.516 0-6.25 2.734-6.25 6.25V197c0 3.516 2.734 6.25 6.25 6.25H217v62.5h-18.75c-3.516 0-6.25 2.734-6.25 6.25v31.25c0 3.516 2.734 6.25 6.25 6.25h87.5c3.516 0 6.25-2.734 6.25-6.25Zm-25-175V97c0-3.516-2.734-6.25-6.25-6.25h-37.5c-3.516 0-6.25 2.734-6.25 6.25v31.25c0 3.516 2.734 6.25 6.25 6.25h37.5c3.516 0 6.25-2.734 6.25-6.25Zm125 81.25c0 82.813-67.188 150-150 150-82.813 0-150-67.188-150-150 0-82.813 67.188-150 150-150 82.813 0 150 67.188 150 150Z\"\/>\n<\/svg>\n\n <\/span> Info <\/p>"},{"title":"Liquid","link":"https:\/\/docs.luanti.org\/for-players\/liquid\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-players\/liquid\/","description":"<h1 id=\"liquid\">Liquid<a class=\"anchor\" href=\"#liquid\">#<\/a><\/h1>\n<p><strong>Liquids<\/strong> are special dynamic <a href=\"https:\/\/docs.luanti.org\/for-players\/nodes\">nodes<\/a> in Luanti. They behave quite differently than in real life. Liquids like to spread and flow to their surrounding blocks and players can swim and drown in them.<\/p>\n<h2 id=\"liquid-forms\">Liquid forms<a class=\"anchor\" href=\"#liquid-forms\">#<\/a><\/h2>\n<p>Liquids usually come in two forms: In source form and in flowing form.<\/p>\n<h3 id=\"liquid-source\">Liquid source<a class=\"anchor\" href=\"#liquid-source\">#<\/a><\/h3>\n<p>Liquid sources have the shape of a full cube. A liquid source will generate flowing liquids around it from time to time, and, if the liquid is renewable, it also generates liquid sources (see below). A liquid source can sustain itself. If no special event happens, a liquid source will keep its place forever and it will never drain out.<\/p>"},{"title":"List of hardcoded features","link":"https:\/\/docs.luanti.org\/for-creators\/list-of-hardcoded-features\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/list-of-hardcoded-features\/","description":"<h1 id=\"list-of-hardcoded-features\">List of hardcoded features<a class=\"anchor\" href=\"#list-of-hardcoded-features\">#<\/a><\/h1>\n<p>This is a <strong>list of hardcoded features<\/strong> in Luanti. A hardcoded feature is a feature with a certain functionality that behaves always in a certain fixed way that cannot be customized. Luanti in general wants to allow its mods and games to customize pretty much everything, so in the long run, any hardcoded feature should be made customizable. Note not all hardcoded features are created equal, some are less annoying than others, while for some features it really doesn&rsquo;t matter that they are hardcoded. Also, this list should be more seen as a documentation, not as a feature request to un-hardcode everything in this list.<\/p>"},{"title":"Lua code style guidelines","link":"https:\/\/docs.luanti.org\/for-engine-devs\/lua-code-style-guidelines\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-engine-devs\/lua-code-style-guidelines\/","description":"<h1 id=\"lua-code-style-guidelines\">Lua code style guidelines<a class=\"anchor\" href=\"#lua-code-style-guidelines\">#<\/a><\/h1>\n<p>This is largely inspired by <a href=\"https:\/\/www.python.org\/dev\/peps\/pep-0008\">the Python style guide<\/a> except for some indentation and\nlanguage differences. When in doubt, consult that guide (if applicable).<\/p>\n<p>Note that these are only <em>guidelines<\/em> for more readable code. In some (rare) cases they may result in <em>less<\/em> readable code. Use your best judgement.<\/p>\n<h2 id=\"comments\">Comments<a class=\"anchor\" href=\"#comments\">#<\/a><\/h2>\n<ul>\n<li>\n<p>Incorrect or outdated comments are worse than no comments.<\/p>\n<\/li>\n<li>\n<p>Avoid inline comments, unless they&rsquo;re very short.<\/p>\n<\/li>\n<li>\n<p>Write comments to clarify anything that may be confusing. Don&rsquo;t write comments that describe things that are obvious from the code.<\/p>"},{"title":"Lua Conventions","link":"https:\/\/docs.luanti.org\/for-creators\/lua-conventions\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/lua-conventions\/","description":"<h1 id=\"lua-conventions\">Lua Conventions<a class=\"anchor\" href=\"#lua-conventions\">#<\/a><\/h1>\n<p>Lua is a simple, minimalistic, elegant, efficient, embeddable, expressive scripting language.\nA good grasp of Lua is required to effectively develop Luanti mods and games.<\/p>\n<p>Lua is a very flexible - perhaps for the taste of many too flexible - language.<\/p>\n<blockquote class='book-hint '>\n<p>Lua gives you the power, you build the mechanisms\n- <a href=\"https:\/\/www.lua.org\/pil\">&ldquo;Programming in Lua&rdquo;, first edition<\/a><\/p><\/blockquote><p>This document describes some mechanisms and conventions used in Luanti.<\/p>\n<h2 id=\"resources\">Resources<a class=\"anchor\" href=\"#resources\">#<\/a><\/h2>\n<p>This does not teach you programming in general or the basics of Lua programming specifically.\nRefer to the following resources instead:<\/p>"},{"title":"Lua Environment","link":"https:\/\/docs.luanti.org\/for-creators\/api\/lua-environment\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/api\/lua-environment\/","description":"<h1 id=\"lua-environment\">Lua Environment<a class=\"anchor\" href=\"#lua-environment\">#<\/a><\/h1>\n<p>Luanti uses Lua 5.1. The environment in which Luanti executes mods depends on four factors:<\/p>\n<ol>\n<li>The operating system<\/li>\n<li>The Luanti build: <a href=\"https:\/\/docs.luanti.org\/for-creators\/api\/luajit\">LuaJIT<\/a> (default) or PUC Lua 5.1<\/li>\n<li>The mod type: Client-side or server-side<\/li>\n<li>The mod environment: Secure or insecure<\/li>\n<\/ol>\n<h2 id=\"platform-independence--portability\">Platform Independence \/ Portability<a class=\"anchor\" href=\"#platform-independence--portability\">#<\/a><\/h2>\n<p>See the <a href=\"https:\/\/www.lua.org\/manual\/5.1\/manual.html\">Lua 5.1 Reference Manual<\/a> for platform- and OS-environment-dependent Lua features. These include:<\/p>\n<ul>\n<li>Locale, affecting pattern matching (character classes) and character codes used by <code>string.char<\/code> and <code>string.byte<\/code><\/li>\n<li>Large parts of the <code>os<\/code> library, particularly <code>os.execute<\/code> (only available in an insecure environment)<\/li>\n<li>Some parts of the <code>io<\/code> library like <code>io.popen<\/code> (only available in an insecure environment) or handling of binary files<\/li>\n<li><code>require<\/code> and <code>package.loadlib<\/code> (only available in an insecure environment anyways)<\/li>\n<\/ul>\n<h2 id=\"global-strictness\">Global Strictness<a class=\"anchor\" href=\"#global-strictness\">#<\/a><\/h2>\n<p>Variables in Lua are global by default (both assignment and access). This often leads to mistaken use of global variables, with the two perhaps most common issues being:<\/p>"},{"title":"Lua Optimization Tips","link":"https:\/\/docs.luanti.org\/for-creators\/lua-optimization-tips\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/lua-optimization-tips\/","description":"<h1 id=\"lua-optimization-tips\">Lua Optimization Tips<a class=\"anchor\" href=\"#lua-optimization-tips\">#<\/a><\/h1>\n<p>Remember, every second you spend in Lua is a second that the Server thread, Connection thread, and possibly one or more Emerge threads stay at a complete standstill! For this reason, intensive mods should designed with speed in mind.<\/p>\n<p><strong>Note<\/strong>: Many of these tips are specific to neither Lua nor Luanti.<\/p>\n<h2 id=\"using-script-api\">Using Script API<a class=\"anchor\" href=\"#using-script-api\">#<\/a><\/h2>\n<h3 id=\"profiling\">Profiling<a class=\"anchor\" href=\"#profiling\">#<\/a><\/h3>\n<p>Very simple; no reason not to do so:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-lua\" data-lang=\"lua\"><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">local<\/span> t1 <span style=\"color:#f92672\">=<\/span> core.get_us_time()\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">--... work here ...<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>print(string.format(<span style=\"color:#e6db74\">&#34;elapsed time: %g\u00a0ms&#34;<\/span>, (core.get_us_time() <span style=\"color:#f92672\">-<\/span> t1) <span style=\"color:#f92672\">\/<\/span> <span style=\"color:#ae81ff\">1000<\/span>))<\/span><\/span><\/code><\/pre><\/div><ul>\n<li>Compare results often to identify bottlenecks before they become harder to find<\/li>\n<\/ul>\n<h3 id=\"loop-ordering\">Loop ordering<a class=\"anchor\" href=\"#loop-ordering\">#<\/a><\/h3>\n<p>Always use z, y, x ordering unless there&rsquo;s a good reason not to.<\/p>"},{"title":"LuaJIT","link":"https:\/\/docs.luanti.org\/for-creators\/api\/luajit\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/api\/luajit\/","description":"<h1 id=\"luajit\">LuaJIT<a class=\"anchor\" href=\"#luajit\">#<\/a><\/h1>\n<p>LuaJIT is a just-in-time compiler for Lua, which implements the language as it was in the reference Lua 5.1 implementation (referred to as PUC Lua to distinguish it) albeit with some additions and differences. LuaJIT typically executes code much faster than PUC Lua, which is why its usage is strongly recommended.<\/p>\n<p>More often than not, unless you have compiled Luanti from source without LuaJIT, Luanti will use LuaJIT as its Lua runtime. The official Windows, Android and most packaged Linux builds should be compiled with LuaJIT enabled. To confirm what Lua runtime Luanti is built with you can open a terminal and run <code>.\/luanti --version<\/code>.<\/p>"},{"title":"Luanti","link":"https:\/\/docs.luanti.org\/about\/luanti\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/about\/luanti\/","description":"<h1 id=\"luanti\">Luanti<a class=\"anchor\" href=\"#luanti\">#<\/a><\/h1>\n<p><img src=\"https:\/\/docs.luanti.org\/images\/luanti\/Luanti_logo.png\" alt=\"Luanti logo\" \/><\/p>\n<p><strong>Luanti<\/strong> (formerly <a href=\"https:\/\/blog.luanti.org\/2024\/10\/13\/Introducing-Our-New-Name\/\"><strong>Minetest<\/strong><\/a>) is a <a href=\"https:\/\/en.wikipedia.org\/wiki\/Free_software\">free software<\/a> <a href=\"https:\/\/en.wikipedia.org\/wiki\/Game_engine\">game engine<\/a> to create various games based on <a href=\"https:\/\/en.wikipedia.org\/wiki\/Voxel\">voxel<\/a> gameplay, inspired by InfiniMiner, Minecraft, and the like. Luanti was originally created by Perttu Ahola (alias \u201c<a href=\"https:\/\/docs.luanti.org\/about\/history\/celeron55\">celeron55<\/a>\u201d).<\/p>\n<p>The basic idea of each game is always the same: The <a href=\"https:\/\/docs.luanti.org\/for-players\/player\">player<\/a> is thrown into a huge <a href=\"https:\/\/docs.luanti.org\/for-players\/worlds\">world<\/a> made out of cubes\/<a href=\"https:\/\/docs.luanti.org\/for-players\/nodes\">blocks<\/a>. Most of the time, these cubes make the landscape and these blocks can be removed and placed almost entirely freely. Using the collected <a href=\"https:\/\/docs.luanti.org\/for-players\/items\">items<\/a>, new <a href=\"https:\/\/docs.luanti.org\/for-players\/tool\">tools<\/a> and other items can be crafted. Games in Luanti can, however, be much more complex than this.<\/p>"},{"title":"Luanti .obj file format specification","link":"https:\/\/docs.luanti.org\/for-creators\/models\/obj-spec\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/models\/obj-spec\/","description":"<h1 id=\"luanti-obj-file-format-specification\">Luanti <code>.obj<\/code> file format specification<a class=\"anchor\" href=\"#luanti-obj-file-format-specification\">#<\/a><\/h1>\n<p>The <code>.obj<\/code> file format supported by Luanti is a subset of <a href=\"https:\/\/web.archive.org\/web\/20250620145323\/https:\/\/paulbourke.net\/dataformats\/obj\/\">Wavefront Object (<code>.obj<\/code>) Files<\/a>.<\/p>\n<p>Material (<code>.mtl<\/code>) files are not supported; <code>.obj<\/code> files can not be animated.<\/p>\n<h2 id=\"number-formatting\">Number formatting<a class=\"anchor\" href=\"#number-formatting\">#<\/a><\/h2>\n<p>Numbers are formatted as either floats or integers:<\/p>\n<h3 id=\"floats\">Floats<a class=\"anchor\" href=\"#floats\">#<\/a><\/h3>\n<p>An optional minus sign (<code>-<\/code>), followed by one or more digits,\nfollowed by a decimal dot (<code>.<\/code>), followed by one or more digits.\nExample: <code>-42.3<\/code>.<\/p>\n<h3 id=\"integers\">Integers<a class=\"anchor\" href=\"#integers\">#<\/a><\/h3>\n<p>Optional minus sign (<code>-<\/code>), followed by one or more digits.\nExample: <code>-42<\/code>.<\/p>"},{"title":"Luanti NMPR","link":"https:\/\/docs.luanti.org\/for-engine-devs\/nmpr\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-engine-devs\/nmpr\/","description":"<h1 id=\"luanti-nmpr\">Luanti NMPR<a class=\"anchor\" href=\"#luanti-nmpr\">#<\/a><\/h1>\n<p>The Luanti engine is built on a small core, that was the original network multiplayer release of luanti (let&rsquo;s call it NMPR; the 2010-10-24 version). As the current code still largely bases on the NMPR, it is useful to look at how it works for getting a basic understanding of the engine.<\/p>\n<p>Being around 10000 lines of code, it contains:<\/p>\n<ul>\n<li>The <strong>Map<\/strong>: Voxel storage + lighting + rendering<\/li>\n<li>The <strong>Environment<\/strong>: Contains the map and the players, handles the simulation of the world<\/li>\n<li>The <strong>Client<\/strong> + <strong>Server<\/strong> logic<\/li>\n<li>The <strong>main loop<\/strong>: Invokes the client, the server, the environment and the rendering.<\/li>\n<li>A bunch of wrappers for OS-dependent things, and utilities.<\/li>\n<\/ul>\n<p>NMPR has been made available at <a href=\"https:\/\/github.com\/celeron55\/minetest_nmpr\">https:\/\/github.com\/celeron55\/minetest_nmpr<\/a> which is the easiest to build.<\/p>"},{"title":"Luanti Schematic File Format","link":"https:\/\/docs.luanti.org\/for-creators\/luanti-schematic-file-format\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/luanti-schematic-file-format\/","description":"<h1 id=\"luanti-schematic-file-format\">Luanti Schematic File Format<a class=\"anchor\" href=\"#luanti-schematic-file-format\">#<\/a><\/h1>\n<p>The <strong>Luanti Schematic File Format<\/strong> if the file format used by Luanti when schematics are serialized by e.g. <code>core.create_schematic<\/code>. Schematic files are supposed to have \u201c<code>.mts<\/code>\u201d as a file name suffix. This document describes the MTS format native to Luanti.<\/p>\n<h2 id=\"informal-definition\">Informal definition<a class=\"anchor\" href=\"#informal-definition\">#<\/a><\/h2>\n<p>Warning: This definition has not been proofread yet! Don&rsquo;t rely on it 100% yet.<\/p>\n<h3 id=\"overview\">Overview<a class=\"anchor\" href=\"#overview\">#<\/a><\/h3>\n<p>An MTS file has 3 sections, in this order:<\/p>"},{"title":"LuantiEDU","link":"https:\/\/docs.luanti.org\/about\/luanti-edu\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/about\/luanti-edu\/","description":"<h1 id=\"luantiedu\">LuantiEDU<a class=\"anchor\" href=\"#luantiedu\">#<\/a><\/h1>\n<style type=\"text\/css\">\n \n .notice {\n --title-color: #fff;\n --title-background-color: #6be;\n --content-color: #444;\n --content-background-color: #e7f2fa;\n }\n\n .notice.info {\n --title-background-color: #fb7;\n --content-background-color: #fec;\n }\n\n .notice.tip {\n --title-background-color: #5a5;\n --content-background-color: #efe;\n }\n\n .notice.warning {\n --title-background-color: #c33;\n --content-background-color: #fee;\n }\n\n \n @media (prefers-color-scheme:dark) {\n .notice {\n --title-color: #fff;\n --title-background-color: #069;\n --content-color: #ddd;\n --content-background-color: #023;\n }\n\n .notice.info {\n --title-background-color: #a50;\n --content-background-color: #420;\n }\n\n .notice.tip {\n --title-background-color: #363;\n --content-background-color: #121;\n }\n\n .notice.warning {\n --title-background-color: #800;\n --content-background-color: #400;\n }\n }\n\n body.dark .notice {\n --title-color: #fff;\n --title-background-color: #069;\n --content-color: #ddd;\n --content-background-color: #023;\n }\n\n body.dark .notice.info {\n --title-background-color: #a50;\n --content-background-color: #420;\n }\n\n body.dark .notice.tip {\n --title-background-color: #363;\n --content-background-color: #121;\n }\n\n body.dark .notice.warning {\n --title-background-color: #800;\n --content-background-color: #400;\n }\n\n \n .notice {\n padding: 18px;\n line-height: 24px;\n margin-bottom: 24px;\n border-radius: 4px;\n color: var(--content-color);\n background: var(--content-background-color);\n }\n\n .notice p:last-child {\n margin-bottom: 0\n }\n\n \n .notice-title {\n margin: -18px -18px 12px;\n padding: 4px 18px;\n border-radius: 4px 4px 0 0;\n font-weight: 700;\n color: var(--title-color);\n background: var(--title-background-color);\n }\n\n \n .icon-notice {\n display: inline-flex;\n align-self: center;\n margin-right: 8px;\n }\n\n .icon-notice img,\n .icon-notice svg {\n height: 1em;\n width: 1em;\n fill: currentColor;\n }\n\n .icon-notice img,\n .icon-notice.baseline svg {\n top: .125em;\n position: relative;\n }\n<\/style><div class=\"notice info\" >\n <p class=\"notice-title\">\n <span class=\"icon-notice baseline\">\n <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"92 59.5 300 300\">\n <path d=\"M292 303.25V272c0-3.516-2.734-6.25-6.25-6.25H267v-100c0-3.516-2.734-6.25-6.25-6.25h-62.5c-3.516 0-6.25 2.734-6.25 6.25V197c0 3.516 2.734 6.25 6.25 6.25H217v62.5h-18.75c-3.516 0-6.25 2.734-6.25 6.25v31.25c0 3.516 2.734 6.25 6.25 6.25h87.5c3.516 0 6.25-2.734 6.25-6.25Zm-25-175V97c0-3.516-2.734-6.25-6.25-6.25h-37.5c-3.516 0-6.25 2.734-6.25 6.25v31.25c0 3.516 2.734 6.25 6.25 6.25h37.5c3.516 0 6.25-2.734 6.25-6.25Zm125 81.25c0 82.813-67.188 150-150 150-82.813 0-150-67.188-150-150 0-82.813 67.188-150 150-150 82.813 0 150 67.188 150 150Z\"\/>\n<\/svg>\n\n <\/span> Info <\/p>"},{"title":"Macos","link":"https:\/\/docs.luanti.org\/for-engine-devs\/compiling\/macos\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-engine-devs\/compiling\/macos\/","description":"<h1 id=\"compiling-on-macos\">Compiling on MacOS<a class=\"anchor\" href=\"#compiling-on-macos\">#<\/a><\/h1>\n<h2 id=\"requirements\">Requirements<a class=\"anchor\" href=\"#requirements\">#<\/a><\/h2>\n<ul>\n<li><a href=\"https:\/\/brew.sh\/\">Homebrew<\/a><\/li>\n<li><a href=\"https:\/\/git-scm.com\/downloads\">Git<\/a><\/li>\n<\/ul>\n<p>Install dependencies with homebrew:<\/p>\n<pre tabindex=\"0\"><code>brew install cmake freetype gettext gmp hiredis jpeg-turbo jsoncpp leveldb libogg libpng libvorbis luajit zstd gettext sdl2 openal-soft<\/code><\/pre><h2 id=\"download\">Download<a class=\"anchor\" href=\"#download\">#<\/a><\/h2>\n<p>Download source (this is the URL to the latest of source repository, which might not work at all times) using Git:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>git clone --depth <span style=\"color:#ae81ff\">1<\/span> https:\/\/github.com\/luanti-org\/luanti luanti\n<\/span><\/span><span style=\"display:flex;\"><span>cd luanti<\/span><\/span><\/code><\/pre><\/div><h2 id=\"building-for-personal-usage\">Building for personal usage<a class=\"anchor\" href=\"#building-for-personal-usage\">#<\/a><\/h2>\n<h3 id=\"build\">Build<a class=\"anchor\" href=\"#build\">#<\/a><\/h3>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>mkdir build\n<\/span><\/span><span style=\"display:flex;\"><span>cd build\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>cmake .. <span style=\"color:#ae81ff\">\\\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#ae81ff\"><\/span> -DCMAKE_FIND_FRAMEWORK<span style=\"color:#f92672\">=<\/span>LAST <span style=\"color:#ae81ff\">\\\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#ae81ff\"><\/span> -DCMAKE_INSTALL_PREFIX<span style=\"color:#f92672\">=<\/span>..\/build\/macos\/ <span style=\"color:#ae81ff\">\\\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#ae81ff\"><\/span> -DRUN_IN_PLACE<span style=\"color:#f92672\">=<\/span>FALSE -DENABLE_GETTEXT<span style=\"color:#f92672\">=<\/span>TRUE\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>make -j<span style=\"color:#66d9ef\">$(<\/span>sysctl -n hw.logicalcpu<span style=\"color:#66d9ef\">)<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>make install\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\"># Apple Silicon (M1\/M2) Macs w\/ MacOS &gt;= BigSur signature for local run<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>codesign --force --deep -s - --entitlements ..\/misc\/macos\/entitlements\/debug.entitlements macos\/luanti.app<\/span><\/span><\/code><\/pre><\/div><p>If you are using LuaJIT with <code>MAP_JIT<\/code> support use <code>debug_map_jit.entitlements<\/code>.<\/p>"},{"title":"Main menu music","link":"https:\/\/docs.luanti.org\/for-creators\/main-menu-music\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/main-menu-music\/","description":"<h1 id=\"main-menu-music\">Main menu music<a class=\"anchor\" href=\"#main-menu-music\">#<\/a><\/h1>\n<p>Luanti supports music in the main menu, which can <a href=\"https:\/\/api.luanti.org\/games\/#menu-music\">be provided by games<\/a> (5.5.0+). Previously it was possible to provide main menu music in sound packs, but this broke alongside the implementation of game-specific main menu music.<\/p>"},{"title":"Map generator evolution","link":"https:\/\/docs.luanti.org\/about\/history\/mapgen-evolution\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/about\/history\/mapgen-evolution\/","description":"<h1 id=\"map-generator-evolution\">Map Generator Evolution<a class=\"anchor\" href=\"#map-generator-evolution\">#<\/a><\/h1>\n<p>This page shows the development history of the <a href=\"https:\/\/docs.luanti.org\/for-creators\/mapgen\">map generators<\/a> in Luanti.<\/p>\n<h2 id=\"development-of-a-single-map-generator\">Development of a single map generator<a class=\"anchor\" href=\"#development-of-a-single-map-generator\">#<\/a><\/h2>\n<p>Initially, Luanti (then called \u201cMinetest-c55\u201d, later \u201cMinetest\u201d) had only one map generator which was continuously improved and had its own version number, where each version replaced the previous one. The earliest map generators are based on 2D Perlin noise.<\/p>\n<h3 id=\"early-development\">Early development<a class=\"anchor\" href=\"#early-development\">#<\/a><\/h3>\n<p>Also dubbed \u201cVersion 0\u201d, this section summarizes the earliest map generator experiments before the release of the first official map generator.<\/p>"},{"title":"Map generator features","link":"https:\/\/docs.luanti.org\/for-creators\/mapgen\/features\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/mapgen\/features\/","description":"<h1 id=\"map-generator-features\">Map generator features<a class=\"anchor\" href=\"#map-generator-features\">#<\/a><\/h1>\n<p>This page shows the various special features which <a href=\"https:\/\/docs.luanti.org\/for-creators\/mapgen\">map generators<\/a> have and explains how to use them.<\/p>\n<style type=\"text\/css\">\n \n .notice {\n --title-color: #fff;\n --title-background-color: #6be;\n --content-color: #444;\n --content-background-color: #e7f2fa;\n }\n\n .notice.info {\n --title-background-color: #fb7;\n --content-background-color: #fec;\n }\n\n .notice.tip {\n --title-background-color: #5a5;\n --content-background-color: #efe;\n }\n\n .notice.warning {\n --title-background-color: #c33;\n --content-background-color: #fee;\n }\n\n \n @media (prefers-color-scheme:dark) {\n .notice {\n --title-color: #fff;\n --title-background-color: #069;\n --content-color: #ddd;\n --content-background-color: #023;\n }\n\n .notice.info {\n --title-background-color: #a50;\n --content-background-color: #420;\n }\n\n .notice.tip {\n --title-background-color: #363;\n --content-background-color: #121;\n }\n\n .notice.warning {\n --title-background-color: #800;\n --content-background-color: #400;\n }\n }\n\n body.dark .notice {\n --title-color: #fff;\n --title-background-color: #069;\n --content-color: #ddd;\n --content-background-color: #023;\n }\n\n body.dark .notice.info {\n --title-background-color: #a50;\n --content-background-color: #420;\n }\n\n body.dark .notice.tip {\n --title-background-color: #363;\n --content-background-color: #121;\n }\n\n body.dark .notice.warning {\n --title-background-color: #800;\n --content-background-color: #400;\n }\n\n \n .notice {\n padding: 18px;\n line-height: 24px;\n margin-bottom: 24px;\n border-radius: 4px;\n color: var(--content-color);\n background: var(--content-background-color);\n }\n\n .notice p:last-child {\n margin-bottom: 0\n }\n\n \n .notice-title {\n margin: -18px -18px 12px;\n padding: 4px 18px;\n border-radius: 4px 4px 0 0;\n font-weight: 700;\n color: var(--title-color);\n background: var(--title-background-color);\n }\n\n \n .icon-notice {\n display: inline-flex;\n align-self: center;\n margin-right: 8px;\n }\n\n .icon-notice img,\n .icon-notice svg {\n height: 1em;\n width: 1em;\n fill: currentColor;\n }\n\n .icon-notice img,\n .icon-notice.baseline svg {\n top: .125em;\n position: relative;\n }\n<\/style><div class=\"notice note\" >\n <p class=\"notice-title\">\n <span class=\"icon-notice baseline\">\n <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 128 300 300\">\n <path d=\"M150 128c82.813 0 150 67.188 150 150 0 82.813-67.188 150-150 150C67.187 428 0 360.812 0 278c0-82.813 67.188-150 150-150Zm25 243.555v-37.11c0-3.515-2.734-6.445-6.055-6.445h-37.5c-3.515 0-6.445 2.93-6.445 6.445v37.11c0 3.515 2.93 6.445 6.445 6.445h37.5c3.32 0 6.055-2.93 6.055-6.445Zm-.39-67.188 3.515-121.289c0-1.367-.586-2.734-1.953-3.516-1.172-.976-2.93-1.562-4.688-1.562h-42.968c-1.758 0-3.516.586-4.688 1.563-1.367.78-1.953 2.148-1.953 3.515l3.32 121.29c0 2.734 2.93 4.882 6.64 4.882h36.134c3.515 0 6.445-2.148 6.64-4.883Z\"\/>\n<\/svg>\n\n <\/span> Note <\/p>"},{"title":"Mapgen memory optimizations","link":"https:\/\/docs.luanti.org\/for-creators\/mapgen\/memory-optimizations\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/mapgen\/memory-optimizations\/","description":"<h1 id=\"mapgen-memory-optimizations\">Mapgen memory optimizations<a class=\"anchor\" href=\"#mapgen-memory-optimizations\">#<\/a><\/h1>\n<p>This page intends to list all possible optimization techniques that can be used when writing a mapgen in Lua.<\/p>\n<p>Lua map generators can use excessive memory if they are not using these 3 optimizations. Not using these optimizations can eventually lead to OOM (out-of-memory) errors because the Lua mapgen wasted way too much memory. Applying this advice is <strong>strongly recommended<\/strong>, and should make OOM errors much less likely. But there is no guarantee this will fix all OOM errors, your mapgen might still use excessive memory for other reasons, or the computer just has very limited memory.<\/p>"},{"title":"Meetings","link":"https:\/\/docs.luanti.org\/for-engine-devs\/meetings\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-engine-devs\/meetings\/","description":"<h1 id=\"meetings\">Meetings<a class=\"anchor\" href=\"#meetings\">#<\/a><\/h1>\n<p>Core developer meetings are held when needed. They take place in the #luanti-dev <a href=\"https:\/\/docs.luanti.org\/about\/irc\">IRC<\/a> channel.<\/p>\n<p>This Wiki page contains the meeting plans for upcoming meetings, and meeting notes for previous meetings.<\/p>\n<p><strong>Only core team should edit this page.<\/strong> You can raise points to be discussed in an upcoming meeting by contacting a core dev, or messaging on IRC. Please avoid derailing meetings by posting unrelated things whilst discussion about other things is happening.<\/p>"},{"title":"Merging core pull requests to upstream","link":"https:\/\/docs.luanti.org\/for-engine-devs\/merging-core-pull-requests-to-upstream\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-engine-devs\/merging-core-pull-requests-to-upstream\/","description":"<h1 id=\"merging-core-pull-requests-to-upstream\">Merging core pull requests to upstream<a class=\"anchor\" href=\"#merging-core-pull-requests-to-upstream\">#<\/a><\/h1>\n<p>This page contains <strong>technical guidelines<\/strong> for core developers when deciding whether to merge a pull request.<\/p>\n<p>For determining who is allowed to do what, see <a href=\"https:\/\/docs.luanti.org\/for-engine-devs\/organization\">Organization<\/a>.<\/p>\n<p>For guidelines and rules on Git and Github, see <a href=\"https:\/\/docs.luanti.org\/for-engine-devs\/git-guidelines\">Git Guidelines<\/a>.<\/p>\n<p>Also see:<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/luanti-org\/luanti\/blob\/master\/.github\/CONTRIBUTING.md\">https:\/\/github.com\/luanti-org\/luanti\/blob\/master\/.github\/CONTRIBUTING.md<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/luanti-org\/luanti\/blob\/master\/doc\/direction.md\">https:\/\/github.com\/luanti-org\/luanti\/blob\/master\/doc\/direction.md<\/a><\/li>\n<\/ul>\n<h2 id=\"requirements\">Requirements<a class=\"anchor\" href=\"#requirements\">#<\/a><\/h2>\n<p>There are five major requirements that each pull request must fulfill in order to be mergeable to upstream Luanti.<\/p>\n<ol>\n<li>It should follow a roadmap in some way, to make sure it fits the whole picture of the project. Different roadmaps and project guidance is managed in <a href=\"https:\/\/github.com\/luanti-org\/luanti\/blob\/master\/doc\/direction.md\">https:\/\/github.com\/luanti-org\/luanti\/blob\/master\/doc\/direction.md<\/a>. A core dev can decide to review and merge something that doesn&rsquo;t follow direction.md if they consider it to be beneficial to the project.<\/li>\n<li>It must work in the first place. Compile it and test it in game, or write mod code that uses it.<\/li>\n<li>The code style must be correct. <a href=\"https:\/\/docs.luanti.org\/for-engine-devs\/code-style-guidelines\">Code style guidelines<\/a><\/li>\n<li>The internal interfaces of the code must be good, and it should be reasonably optimized, depending on how often the code is called.<\/li>\n<li>The protocols and formats that it uses must be well designed, including the required compatibility in the part in question. On-disk formats are extremely important to get right. Modding API concerns are split between this and req2. This is about knowing the engine&rsquo;s design along with its pitfalls.<\/li>\n<\/ol>\n<p>&hellip;which can be checked by:<\/p>"},{"title":"MetaData","link":"https:\/\/docs.luanti.org\/for-creators\/api\/classes\/metadata\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/api\/classes\/metadata\/","description":"<h1 id=\"metadata\">MetaData<a class=\"anchor\" href=\"#metadata\">#<\/a><\/h1>\n<p>MetaData is an interface implemented by various reference types implementing persistent string-based key-value stores. The methods documented below are available in all subclasses.<\/p>\n<h2 id=\"subclasses\">Subclasses<a class=\"anchor\" href=\"#subclasses\">#<\/a><\/h2>\n<p>Subclasses tie the key-value store to various objects recognized by Luanti:<\/p>\n<ul>\n<li><a href=\"https:\/\/docs.luanti.org\/for-creators\/api\/classes\/modstorage\/\">ModStorage<\/a> - per mod<\/li>\n<li><a href=\"https:\/\/docs.luanti.org\/for-creators\/api\/classes\/nodemetadata\/\">NodeMetaData<\/a> - per node on the map<\/li>\n<li><a href=\"https:\/\/docs.luanti.org\/for-creators\/api\/classes\/itemstackmetadata\/\">ItemStackMetaData<\/a> - per item stack<\/li>\n<li><a href=\"https:\/\/docs.luanti.org\/for-creators\/api\/classes\/playermetadata\/\">PlayerMetaData<\/a> - per player<\/li>\n<\/ul>\n<h2 id=\"methods\">Methods<a class=\"anchor\" href=\"#methods\">#<\/a><\/h2>\n<h3 id=\"getters\">Getters<a class=\"anchor\" href=\"#getters\">#<\/a><\/h3>\n<style type=\"text\/css\">\n \n .notice {\n --title-color: #fff;\n --title-background-color: #6be;\n --content-color: #444;\n --content-background-color: #e7f2fa;\n }\n\n .notice.info {\n --title-background-color: #fb7;\n --content-background-color: #fec;\n }\n\n .notice.tip {\n --title-background-color: #5a5;\n --content-background-color: #efe;\n }\n\n .notice.warning {\n --title-background-color: #c33;\n --content-background-color: #fee;\n }\n\n \n @media (prefers-color-scheme:dark) {\n .notice {\n --title-color: #fff;\n --title-background-color: #069;\n --content-color: #ddd;\n --content-background-color: #023;\n }\n\n .notice.info {\n --title-background-color: #a50;\n --content-background-color: #420;\n }\n\n .notice.tip {\n --title-background-color: #363;\n --content-background-color: #121;\n }\n\n .notice.warning {\n --title-background-color: #800;\n --content-background-color: #400;\n }\n }\n\n body.dark .notice {\n --title-color: #fff;\n --title-background-color: #069;\n --content-color: #ddd;\n --content-background-color: #023;\n }\n\n body.dark .notice.info {\n --title-background-color: #a50;\n --content-background-color: #420;\n }\n\n body.dark .notice.tip {\n --title-background-color: #363;\n --content-background-color: #121;\n }\n\n body.dark .notice.warning {\n --title-background-color: #800;\n --content-background-color: #400;\n }\n\n \n .notice {\n padding: 18px;\n line-height: 24px;\n margin-bottom: 24px;\n border-radius: 4px;\n color: var(--content-color);\n background: var(--content-background-color);\n }\n\n .notice p:last-child {\n margin-bottom: 0\n }\n\n \n .notice-title {\n margin: -18px -18px 12px;\n padding: 4px 18px;\n border-radius: 4px 4px 0 0;\n font-weight: 700;\n color: var(--title-color);\n background: var(--title-background-color);\n }\n\n \n .icon-notice {\n display: inline-flex;\n align-self: center;\n margin-right: 8px;\n }\n\n .icon-notice img,\n .icon-notice svg {\n height: 1em;\n width: 1em;\n fill: currentColor;\n }\n\n .icon-notice img,\n .icon-notice.baseline svg {\n top: .125em;\n position: relative;\n }\n<\/style><div class=\"notice note\" >\n <p class=\"notice-title\">\n <span class=\"icon-notice baseline\">\n <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 128 300 300\">\n <path d=\"M150 128c82.813 0 150 67.188 150 150 0 82.813-67.188 150-150 150C67.187 428 0 360.812 0 278c0-82.813 67.188-150 150-150Zm25 243.555v-37.11c0-3.515-2.734-6.445-6.055-6.445h-37.5c-3.515 0-6.445 2.93-6.445 6.445v37.11c0 3.515 2.93 6.445 6.445 6.445h37.5c3.32 0 6.055-2.93 6.055-6.445Zm-.39-67.188 3.515-121.289c0-1.367-.586-2.734-1.953-3.516-1.172-.976-2.93-1.562-4.688-1.562h-42.968c-1.758 0-3.516.586-4.688 1.563-1.367.78-1.953 2.148-1.953 3.515l3.32 121.29c0 2.734 2.93 4.882 6.64 4.882h36.134c3.515 0 6.445-2.148 6.64-4.883Z\"\/>\n<\/svg>\n\n <\/span> Note <\/p>"},{"title":"Migrating your data from portable builds on Windows","link":"https:\/\/docs.luanti.org\/for-players\/migrate-portable-data\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-players\/migrate-portable-data\/","description":"<h1 id=\"migrating-your-data-from-portable-builds-on-windows\">Migrating your data from portable builds on Windows<a class=\"anchor\" href=\"#migrating-your-data-from-portable-builds-on-windows\">#<\/a><\/h1>\n<p>Starting in December 2025 Luanti switched its distribution format\nfrom portable builds (<code>ZIP<\/code> archive) to a self-extracting installer.<\/p>\n<p>This guide will explain how you can copy your data (games, worlds, mods, &hellip;)\nfrom a previous portable folder to the to the new location.<\/p>\n<h4 id=\"1-run-the-new-luanti-version\">1. Run the new Luanti version<a class=\"anchor\" href=\"#1-run-the-new-luanti-version\">#<\/a><\/h4>\n<p>First, make sure you have <a href=\"https:\/\/www.luanti.org\/en\/downloads\/\">downloaded the installer<\/a>\ncalled <code>luanti-5.XX.X.exe<\/code> and run it at least once.<\/p>"},{"title":"Minetest.conf","link":"https:\/\/docs.luanti.org\/for-players\/minetest-conf\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-players\/minetest-conf\/","description":"<h1 id=\"minetestconf\">Minetest.conf<a class=\"anchor\" href=\"#minetestconf\">#<\/a><\/h1>\n<p><strong>Note:<\/strong> Since version 0.4.14, Luanti has an \u201cadvanced settings\u201d feature to change virtually all settings in Luanti, including a brief description of what each setting does. You will now rarely need to edit minetest.conf manually.<\/p>\n<p><strong>minetest.conf<\/strong> is the configuration file used for numerous purposes. This file is read every time the game starts and is always created\/modified when the menu quits.<\/p>\n<p>A file called <a href=\"https:\/\/github.com\/luanti-org\/luanti\/blob\/master\/minetest.conf.example\">minetest.conf.example<\/a> is provided as an example. See that file for a more complete list of options.<\/p>"},{"title":"minetestmapper","link":"https:\/\/docs.luanti.org\/for-server-hosts\/minetestmapper\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-server-hosts\/minetestmapper\/","description":"<h1 id=\"minetestmapper\">Minetestmapper<a class=\"anchor\" href=\"#minetestmapper\">#<\/a><\/h1>\n<p><img src=\"https:\/\/docs.luanti.org\/images\/Screenshot_minetestmapper.png\" alt=\"\" \/><\/p>\n<p>Sample minetestmapper output<\/p>\n<p>The <strong>minetestmapper<\/strong> utility creates a top-down overview image of your <a href=\"https:\/\/docs.luanti.org\/for-players\/worlds\">world<\/a>, where one <a href=\"https:\/\/docs.luanti.org\/for-players\/nodes\">node<\/a> corresponds to one pixel.<\/p>\n<h3 id=\"usage\">Usage<a class=\"anchor\" href=\"#usage\">#<\/a><\/h3>\n<p>Make sure there is a <code>colors.txt<\/code> file that matches the game of your world the same folder as the mapper, or the world folder.\nThe default file is suitable only for Minetest Game without mods.<\/p>\n<p>On GNU\/Linux, open a terminal in the folder the mapper is. Create a map using this command:<\/p>"},{"title":"Mining","link":"https:\/\/docs.luanti.org\/for-players\/mining\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-players\/mining\/","description":"<h1 id=\"mining\">Mining<a class=\"anchor\" href=\"#mining\">#<\/a><\/h1>\n<p><strong>Mining<\/strong> is one of the most basic activities in Luanti. Mining is the activity of removing a node with a mining <a href=\"https:\/\/docs.luanti.org\/for-players\/tool\">tool<\/a>.<\/p>\n<h2 id=\"how-to-mine\">How to mine<a class=\"anchor\" href=\"#how-to-mine\">#<\/a><\/h2>\n<p>Mining requires the \u201cinteract\u201d <a href=\"https:\/\/docs.luanti.org\/for-players\/privileges\">privilege<\/a> (which is a default privilege).<\/p>\n<p>Mining is done by <a href=\"https:\/\/docs.luanti.org\/for-players\/pointing\">pointing<\/a> on the desired node and holding the attack button (Left mouse button by default).<\/p>\n<p>Not everything can be mined with all <a href=\"https:\/\/docs.luanti.org\/for-players\/tool\/#mining-tools\">mining tools<\/a>. Some tools are better for certain materials. Also, mining often takes some time to finish. The mining speed depends on your tool and the node you want to mine.<\/p>"},{"title":"Mobile","link":"https:\/\/docs.luanti.org\/for-players\/mobile\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-players\/mobile\/","description":"<h1 id=\"mobile\">Mobile<a class=\"anchor\" href=\"#mobile\">#<\/a><\/h1>\n<p>Luanti supports mobile devices and can be played using a touchscreen.<\/p>\n<p>Please do not download unofficial Luanti builds from the Google Play and any other app store. The builds found there may contain excessive adverts or spyware. They may be distributed under proprietary terms, without the source code, which makes them illegal to develop. They may be old or unsupported.<\/p>\n<h2 id=\"android\">Android<a class=\"anchor\" href=\"#android\">#<\/a><\/h2>\n<p>There is an official Android version. It&rsquo;s available on the <a href=\"https:\/\/www.luanti.org\/downloads\/\">Luanti website<\/a>, on <a href=\"https:\/\/play.google.com\/store\/apps\/details?id=net.minetest.minetest\">Google Play<\/a> and on <a href=\"https:\/\/f-droid.org\/packages\/net.minetest.minetest\/\">F-Droid<\/a>.<\/p>"},{"title":"Mobile (for creators)","link":"https:\/\/docs.luanti.org\/for-creators\/mobile\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/mobile\/","description":"<h1 id=\"mobile-for-creators\">Mobile (for creators)<a class=\"anchor\" href=\"#mobile-for-creators\">#<\/a><\/h1>\n<p>Luanti supports mobile devices and can be played using a touchscreen.<\/p>\n<h2 id=\"platforms\">Platforms<a class=\"anchor\" href=\"#platforms\">#<\/a><\/h2>\n<h3 id=\"android\">Android<a class=\"anchor\" href=\"#android\">#<\/a><\/h3>\n<p>There is an official Android version. It&rsquo;s available on the <a href=\"https:\/\/www.luanti.org\/downloads\/\">Luanti website<\/a>, on <a href=\"https:\/\/play.google.com\/store\/apps\/details?id=net.minetest.minetest\">Google Play<\/a> and on <a href=\"https:\/\/f-droid.org\/packages\/net.minetest.minetest\/\">F-Droid<\/a>.<\/p>\n<p>Traditionally, the Android version only supported the touchscreen controls. Starting with version 5.10.0<sup id=\"fnref:1\"><a href=\"#fn:1\" class=\"footnote-ref\" role=\"doc-noteref\">1<\/a><\/sup>, the desktop controls also work out of the box if you connect mouse and keyboard via bluetooth, without any special configuration required.<\/p>\n<p>Useful resources:<\/p>\n<ul>\n<li><a href=\"https:\/\/docs.luanti.org\/mobile-support\/accessing-android-data-directory\">Accessing Android Data Directory<\/a><\/li>\n<\/ul>\n<p>Please do not download unofficial Luanti builds from the Google Play and any other app store. The builds found there may contain excessive adverts or spyware. They may be distributed under proprietary terms, without the source code, which makes them illegal to develop. They may be old or unsupported.<\/p>"},{"title":"Mobs","link":"https:\/\/docs.luanti.org\/for-players\/mobs\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-players\/mobs\/","description":"<h1 id=\"mobs\">Mobs<a class=\"anchor\" href=\"#mobs\">#<\/a><\/h1>\n<p><strong>Mobs<\/strong>\u2014short for <a href=\"https:\/\/en.wikipedia.org\/wiki\/Mob_%28video_games%29\"><strong>mobiles<\/strong><\/a>\u2014consists of peaceful or hostile creatures that roam the world.<\/p>\n<p>They generally appear randomly in the game world depending on lighting, height and spawning <a href=\"https:\/\/docs.luanti.org\/for-players\/nodes\">node<\/a> conditions. Some of them may drop more or less precious <a href=\"https:\/\/docs.luanti.org\/for-players\/items\">items<\/a> when killed. Mobs are created by <a href=\"https:\/\/docs.luanti.org\/for-players\/mods\">mods<\/a> only, so their exact behavior depends on the mod or game you use. Technically, mobs are <a href=\"https:\/\/docs.luanti.org\/for-engine-devs\/objects\">objects<\/a>.<\/p>\n<h2 id=\"see-also\">See also<a class=\"anchor\" href=\"#see-also\">#<\/a><\/h2>\n<ul>\n<li><a href=\"https:\/\/content.luanti.org\/packages\/?type=mod&amp;page=1&amp;tag=mobs\">List of mods which add mobs<\/a><\/li>\n<\/ul>"},{"title":"Mod Dependency Management","link":"https:\/\/docs.luanti.org\/for-creators\/mod-dependency-management\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/mod-dependency-management\/","description":"<h1 id=\"mod-dependency-management\">Mod Dependency Management<a class=\"anchor\" href=\"#mod-dependency-management\">#<\/a><\/h1>\n<p>A mod has the ability to depend on other mods, either required dependencies or optional dependencies. These are specified as comma separated lists in the mod&rsquo;s <code>mod.conf<\/code> file, <code>depends<\/code> and <code>optional_depends<\/code> respectively.<\/p>\n<p>A mod&rsquo;s dependencies get loaded before the mod, such that API functions get defined and are available for use. If no mods have dependencies, mod loading order goes in reverse alphabetical order, but this is undocumented and you should not rely on this - you can use the <code>random_mod_load_order<\/code> setting to shuffle the order to make sure your game or mod still functions.<\/p>"},{"title":"Mod interoperability","link":"https:\/\/docs.luanti.org\/for-creators\/mod-interoperability\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/mod-interoperability\/","description":"<h1 id=\"mod-interoperability\">Mod interoperability<a class=\"anchor\" href=\"#mod-interoperability\">#<\/a><\/h1>\n<p>This page is aimed towards modders and lists a couple of mods and conventions which are known in the community.<\/p>\n<p>The main goal is to improve interoperability between mods and reduce code duplication. Often it is better to use existing APIs rather than trying to reinvent the wheel to reduce code duplication, redundancy and overall chaos. Of course, deciding to not use existing APIs may still be a viable choice if they do not suit your needs.<\/p>"},{"title":"Modchannels","link":"https:\/\/docs.luanti.org\/for-creators\/api\/modchannels\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/api\/modchannels\/","description":"<h1 id=\"modchannels\">Modchannels<a class=\"anchor\" href=\"#modchannels\">#<\/a><\/h1>\n<p>Allows server side mods (SSMs) communication to client side mods (CSMs) and vice versa.<\/p>\n<h2 id=\"server-side-api\">Server Side API<a class=\"anchor\" href=\"#server-side-api\">#<\/a><\/h2>\n<h3 id=\"functions\">Functions<a class=\"anchor\" href=\"#functions\">#<\/a><\/h3>\n<h4 id=\"coremod_channel_joinchannel_name\"><code>core.mod_channel_join(channel_name)<\/code><a class=\"anchor\" href=\"#coremod_channel_joinchannel_name\">#<\/a><\/h4>\n<ul>\n<li><code>channel_name<\/code>: string, modchannel name<\/li>\n<\/ul>\n<p>Returns an object for use with <a href=\"#methods\">Methods<\/a>. Creates the channel if it does not exist and joins the channel.<\/p>\n<h4 id=\"coreregister_on_modchannel_messagefunctionchannel_name-sender-message\"><code>core.register_on_modchannel_message(function(channel_name, sender, message))<\/code><a class=\"anchor\" href=\"#coreregister_on_modchannel_messagefunctionchannel_name-sender-message\">#<\/a><\/h4>\n<ul>\n<li><code>channel_name<\/code>: string, modchannel name (already joined)<\/li>\n<li><code>sender<\/code>: string, empty if from a SSM, player name if from a client<\/li>\n<li><code>message<\/code>: string, message<\/li>\n<\/ul>\n<p>Used for handling messages received from the client.<\/p>"},{"title":"Modding Tips","link":"https:\/\/docs.luanti.org\/for-creators\/modding-tips\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/modding-tips\/","description":"<h1 id=\"modding-tips\">Modding Tips<a class=\"anchor\" href=\"#modding-tips\">#<\/a><\/h1>\n<p>This page is a random collection of various tips and tricks, and solutions to common tasks\/problems that occur frequently in mod\/game development. See also: <a href=\"https:\/\/docs.luanti.org\/about\/faq\/#game-and-mod-development\">Modding FAQ<\/a><\/p>\n<h2 id=\"troubleshooting\">Troubleshooting<a class=\"anchor\" href=\"#troubleshooting\">#<\/a><\/h2>\n<h3 id=\"oom-errors\">OOM errors<a class=\"anchor\" href=\"#oom-errors\">#<\/a><\/h3>\n<p>If your game or mod crashes due to an OOM error, it means that Luanti has ran out of memory (=OOM). This happens if your Lua code somewhere uses up a large amount of memory. This can happen if you construct large tables and fill them with lots of data and never free them, or you got a nice <a href=\"https:\/\/en.wikipedia.org\/wiki\/Memory_leak\">memory leak<\/a>. Badly coded mapgens are a likely cause of OOM errors, if you implement a Lua API, you should always apply all <a href=\"https:\/\/docs.luanti.org\/for-creators\/mapgen\/memory-optimizations\">Mapgen memory optimizations<\/a>.<\/p>"},{"title":"Mods","link":"https:\/\/docs.luanti.org\/for-players\/mods\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-players\/mods\/","description":"<h1 id=\"mods\">Mods<a class=\"anchor\" href=\"#mods\">#<\/a><\/h1>\n<p><strong>Mods<\/strong> (short for <strong>modifications<\/strong> or <strong>modules<\/strong>) are user-created modifications to a game in such a way that adds to or alters the gameplay. Some larger mods may add a lot of content to the game, while other smaller mods may add more settings\/customization options or tweak the gameplay in small ways. <a href=\"https:\/\/docs.luanti.org\/for-players\/servers\">Server<\/a> mods or plugins mainly give server admins more options and ease of use, and all mods for singleplayer can also be used in multiplayer.<\/p>"},{"title":"ModStorage","link":"https:\/\/docs.luanti.org\/for-creators\/api\/classes\/modstorage\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/api\/classes\/modstorage\/","description":"<h1 id=\"modstorage\">ModStorage<a class=\"anchor\" href=\"#modstorage\">#<\/a><\/h1>\n<p>ModStorage is a per-world, per-mod persistent string key-value store implementing all methods of <a href=\"https:\/\/docs.luanti.org\/for-creators\/api\/classes\/metadata\/\">MetaData<\/a>.<\/p>\n<p>The granularity of the persisted snapshots is determined by the <code>map_save_interval<\/code> setting.<\/p>\n<h2 id=\"backends\">Backends<a class=\"anchor\" href=\"#backends\">#<\/a><\/h2>\n<p>Two backends are available for ModStorage: JSON and SQLite3.<\/p>\n<style type=\"text\/css\">\n \n .notice {\n --title-color: #fff;\n --title-background-color: #6be;\n --content-color: #444;\n --content-background-color: #e7f2fa;\n }\n\n .notice.info {\n --title-background-color: #fb7;\n --content-background-color: #fec;\n }\n\n .notice.tip {\n --title-background-color: #5a5;\n --content-background-color: #efe;\n }\n\n .notice.warning {\n --title-background-color: #c33;\n --content-background-color: #fee;\n }\n\n \n @media (prefers-color-scheme:dark) {\n .notice {\n --title-color: #fff;\n --title-background-color: #069;\n --content-color: #ddd;\n --content-background-color: #023;\n }\n\n .notice.info {\n --title-background-color: #a50;\n --content-background-color: #420;\n }\n\n .notice.tip {\n --title-background-color: #363;\n --content-background-color: #121;\n }\n\n .notice.warning {\n --title-background-color: #800;\n --content-background-color: #400;\n }\n }\n\n body.dark .notice {\n --title-color: #fff;\n --title-background-color: #069;\n --content-color: #ddd;\n --content-background-color: #023;\n }\n\n body.dark .notice.info {\n --title-background-color: #a50;\n --content-background-color: #420;\n }\n\n body.dark .notice.tip {\n --title-background-color: #363;\n --content-background-color: #121;\n }\n\n body.dark .notice.warning {\n --title-background-color: #800;\n --content-background-color: #400;\n }\n\n \n .notice {\n padding: 18px;\n line-height: 24px;\n margin-bottom: 24px;\n border-radius: 4px;\n color: var(--content-color);\n background: var(--content-background-color);\n }\n\n .notice p:last-child {\n margin-bottom: 0\n }\n\n \n .notice-title {\n margin: -18px -18px 12px;\n padding: 4px 18px;\n border-radius: 4px 4px 0 0;\n font-weight: 700;\n color: var(--title-color);\n background: var(--title-background-color);\n }\n\n \n .icon-notice {\n display: inline-flex;\n align-self: center;\n margin-right: 8px;\n }\n\n .icon-notice img,\n .icon-notice svg {\n height: 1em;\n width: 1em;\n fill: currentColor;\n }\n\n .icon-notice img,\n .icon-notice.baseline svg {\n top: .125em;\n position: relative;\n }\n<\/style><div class=\"notice warning\" >\n <p class=\"notice-title\">\n <span class=\"icon-notice baseline\">\n <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"126 76.5 300 300\">\n <path d=\"M297.431 324.397v-34.255c0-3.245-2.344-5.95-5.358-5.95h-32.146c-3.014 0-5.358 2.705-5.358 5.95v34.255c0 3.245 2.344 5.95 5.358 5.95h32.146c3.014 0 5.358-2.705 5.358-5.95Zm-.335-67.428 3.014-82.753c0-1.081-.502-2.524-1.674-3.425-1.005-.902-2.512-1.983-4.019-1.983h-36.834c-1.507 0-3.014 1.081-4.019 1.983-1.172.901-1.674 2.704-1.674 3.786l2.846 82.392c0 2.344 2.512 4.146 5.693 4.146h30.975c3.013 0 5.525-1.803 5.692-4.146Zm-2.344-168.39L423.34 342.425c3.683 7.032 3.516 15.686-.335 22.717-3.85 7.031-10.883 11.358-18.417 11.358H147.413c-7.534 0-14.566-4.327-18.417-11.358-3.85-7.031-4.018-15.685-.335-22.716L257.248 88.578C260.93 81.188 268.13 76.5 276 76.5c7.87 0 15.069 4.688 18.752 12.08Z\"\/>\n<\/svg>\n\n <\/span> Warning <\/p>"},{"title":"Network Protocol","link":"https:\/\/docs.luanti.org\/for-engine-devs\/network-protocol\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-engine-devs\/network-protocol\/","description":"<h1 id=\"enginenetwork-protocol\">Engine\/Network Protocol<a class=\"anchor\" href=\"#enginenetwork-protocol\">#<\/a><\/h1>\n<h2 id=\"high-level-protocol\">High-level protocol<a class=\"anchor\" href=\"#high-level-protocol\">#<\/a><\/h2>\n<p>The high-level protocol is clearly written down and updated in <a href=\"https:\/\/github.com\/luanti-org\/luanti\/blob\/master\/src\/network\/networkprotocol.h\">networkprotocol.h<\/a>.<\/p>\n<p>For specifics, refer to <a href=\"https:\/\/github.com\/luanti-org\/luanti\/blob\/master\/src\/client\/client.cpp\">client.cpp<\/a> and <a href=\"https:\/\/github.com\/luanti-org\/luanti\/blob\/master\/src\/server.cpp\">server.cpp<\/a> for the sending, and <a href=\"https:\/\/github.com\/luanti-org\/luanti\/blob\/master\/src\/network\/clientpackethandler.cpp\">clientpackethandler.cpp<\/a> and <a href=\"https:\/\/github.com\/luanti-org\/luanti\/blob\/master\/src\/network\/serverpackethandler.cpp\">serverpackethandler.cpp<\/a> for the receiving.<\/p>\n<p>There is also an ascii art inside <a href=\"https:\/\/github.com\/luanti-org\/luanti\/blob\/master\/src\/server\/clientiface.h\">clientiface.h<\/a> describing the protocol from a high level perspective.<\/p>\n<p>Actual minimum protocol version is: <strong>24<\/strong>. This corresponds to version <strong>0.4.11<\/strong>.<\/p>\n<h3 id=\"handshake\">Handshake<a class=\"anchor\" href=\"#handshake\">#<\/a><\/h3>\n<p>From client&rsquo;s standpoint:<\/p>\n<ul>\n<li>-&gt; TOSERVER_INIT<\/li>\n<li>&lt;- TOCLIENT_HELLO<\/li>\n<li>&lt;-&gt; Authentication<\/li>\n<li>&lt;- TOCLIENT_AUTH_ACCEPT<\/li>\n<li>-&gt; TOSERVER_INIT2<\/li>\n<li>&lt;- Many many things<\/li>\n<\/ul>\n<p>If you just want to check if a server is alive, you can disconnect after receiving TOCLIENT_INIT. Note that handshake changed with protocol 25. In order to be compliant with both old and new servers, send both TOCLIENT_INIT and TOCLIENT_INIT_LEGACY with a protocol version &gt;= 25. New servers will ignore TOCLIENT_INIT_LEGACY that have a protocol version &gt;= 25, and listen for TOCLIENT_INIT. Old servers will ignore TOCLIENT_INIT because its an unknown packet for them.<\/p>"},{"title":"NodeMetaData","link":"https:\/\/docs.luanti.org\/for-creators\/api\/classes\/nodemetadata\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/api\/classes\/nodemetadata\/","description":"<h1 id=\"nodemetadata\">NodeMetaData<a class=\"anchor\" href=\"#nodemetadata\">#<\/a><\/h1>\n<p>NodeMetaData allows extending the basic node storage with a per-world, per-in-world-node persistent string key-value store implementing all methods of MetaData allowing you to associate arbitrary data with any node. Additionally, node metadata allows storing inventories for nodes like chests or furnaces.<\/p>\n<p>The traditional node storage in Luanti is usually limited to:<\/p>\n<ul>\n<li>A content ID (determining the node name),<\/li>\n<li>The <code>param1<\/code> unsigned byte (<code>0<\/code> - <code>255<\/code> both inclusive) which is usually reserved for lighting,<\/li>\n<li>The <code>param2<\/code> unsigned byte (<code>0<\/code> - <code>255<\/code> both inclusive) which can be used depending on <code>paramtype2<\/code><\/li>\n<\/ul>\n<h2 id=\"coreget_metapos\"><code>core.get_meta(pos)<\/code><a class=\"anchor\" href=\"#coreget_metapos\">#<\/a><\/h2>\n<p>Obtains a mutable NodeMetaData reference for the node at <code>pos<\/code>.<\/p>"},{"title":"Nodes","link":"https:\/\/docs.luanti.org\/for-players\/nodes\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-players\/nodes\/","description":"<h1 id=\"nodes\">Nodes<a class=\"anchor\" href=\"#nodes\">#<\/a><\/h1>\n<p>Nodes (also called blocks by players) are what make up the voxel terrain in Luanti. They are generally cubic in shape, with a full node being considered one cubic meter in volume, and make up the voxel world. Only one node can exist in a particular position in the voxel grid, but can extend into other cells and take wildly different shapes. In most games, the player is able to break and place nodes to shape the terrain into what they see fit, or can be interacted with to provide different gameplay functions.<\/p>"},{"title":"Object Properties","link":"https:\/\/docs.luanti.org\/for-creators\/api\/object-properties\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/api\/object-properties\/","description":"<h1 id=\"object-properties\">Object Properties<a class=\"anchor\" href=\"#object-properties\">#<\/a><\/h1>\n<p>This page lists the properties an object may have.<\/p>\n<h2 id=\"properties-applying-only-to-players\">Properties Applying Only to Players<a class=\"anchor\" href=\"#properties-applying-only-to-players\">#<\/a><\/h2>\n<h3 id=\"hp_max\"><code>hp_max<\/code><a class=\"anchor\" href=\"#hp_max\">#<\/a><\/h3>\n<ul>\n<li>internal type: <code>u16<\/code><\/li>\n<li>default value: <code>20<\/code><\/li>\n<\/ul>\n<p>Sets the max HP of a player.<\/p>\n<style type=\"text\/css\">\n \n .notice {\n --title-color: #fff;\n --title-background-color: #6be;\n --content-color: #444;\n --content-background-color: #e7f2fa;\n }\n\n .notice.info {\n --title-background-color: #fb7;\n --content-background-color: #fec;\n }\n\n .notice.tip {\n --title-background-color: #5a5;\n --content-background-color: #efe;\n }\n\n .notice.warning {\n --title-background-color: #c33;\n --content-background-color: #fee;\n }\n\n \n @media (prefers-color-scheme:dark) {\n .notice {\n --title-color: #fff;\n --title-background-color: #069;\n --content-color: #ddd;\n --content-background-color: #023;\n }\n\n .notice.info {\n --title-background-color: #a50;\n --content-background-color: #420;\n }\n\n .notice.tip {\n --title-background-color: #363;\n --content-background-color: #121;\n }\n\n .notice.warning {\n --title-background-color: #800;\n --content-background-color: #400;\n }\n }\n\n body.dark .notice {\n --title-color: #fff;\n --title-background-color: #069;\n --content-color: #ddd;\n --content-background-color: #023;\n }\n\n body.dark .notice.info {\n --title-background-color: #a50;\n --content-background-color: #420;\n }\n\n body.dark .notice.tip {\n --title-background-color: #363;\n --content-background-color: #121;\n }\n\n body.dark .notice.warning {\n --title-background-color: #800;\n --content-background-color: #400;\n }\n\n \n .notice {\n padding: 18px;\n line-height: 24px;\n margin-bottom: 24px;\n border-radius: 4px;\n color: var(--content-color);\n background: var(--content-background-color);\n }\n\n .notice p:last-child {\n margin-bottom: 0\n }\n\n \n .notice-title {\n margin: -18px -18px 12px;\n padding: 4px 18px;\n border-radius: 4px 4px 0 0;\n font-weight: 700;\n color: var(--title-color);\n background: var(--title-background-color);\n }\n\n \n .icon-notice {\n display: inline-flex;\n align-self: center;\n margin-right: 8px;\n }\n\n .icon-notice img,\n .icon-notice svg {\n height: 1em;\n width: 1em;\n fill: currentColor;\n }\n\n .icon-notice img,\n .icon-notice.baseline svg {\n top: .125em;\n position: relative;\n }\n<\/style><div class=\"notice note\" >\n <p class=\"notice-title\">\n <span class=\"icon-notice baseline\">\n <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 128 300 300\">\n <path d=\"M150 128c82.813 0 150 67.188 150 150 0 82.813-67.188 150-150 150C67.187 428 0 360.812 0 278c0-82.813 67.188-150 150-150Zm25 243.555v-37.11c0-3.515-2.734-6.445-6.055-6.445h-37.5c-3.515 0-6.445 2.93-6.445 6.445v37.11c0 3.515 2.93 6.445 6.445 6.445h37.5c3.32 0 6.055-2.93 6.055-6.445Zm-.39-67.188 3.515-121.289c0-1.367-.586-2.734-1.953-3.516-1.172-.976-2.93-1.562-4.688-1.562h-42.968c-1.758 0-3.516.586-4.688 1.563-1.367.78-1.953 2.148-1.953 3.515l3.32 121.29c0 2.734 2.93 4.882 6.64 4.882h36.134c3.515 0 6.445-2.148 6.64-4.883Z\"\/>\n<\/svg>\n\n <\/span> Note <\/p>"},{"title":"Objects","link":"https:\/\/docs.luanti.org\/for-engine-devs\/objects\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-engine-devs\/objects\/","description":"<h1 id=\"engineobjects\">Engine\/Objects<a class=\"anchor\" href=\"#engineobjects\">#<\/a><\/h1>\n<p>In Luanti, an object is a moving thing in the world. The two types of objects are players and entities.<\/p>\n<p>A static object is one that is saved in a mapblock, and an active object is one that is currently loaded and updating in the environment.<\/p>\n<h2 id=\"activeobjects\">ActiveObjects<a class=\"anchor\" href=\"#activeobjects\">#<\/a><\/h2>\n<p>ActiveObjects aka objects are objects in the environment, consisting of roughly everything that is not part of the voxel world (=Map).<\/p>\n<p><code>SAO = ServerActiveObject CAO = ClientActiveObject<\/code><\/p>"},{"title":"Organization","link":"https:\/\/docs.luanti.org\/for-engine-devs\/organization\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-engine-devs\/organization\/","description":"<h1 id=\"organization\">Organization<a class=\"anchor\" href=\"#organization\">#<\/a><\/h1>\n<h2 id=\"contributors\">Contributors<a class=\"anchor\" href=\"#contributors\">#<\/a><\/h2>\n<p>A contributor is anyone who has made a pull request that has been merged, or successfully sent a patch to be applied otherwise.<\/p>\n<h2 id=\"core-developers\">Core developers<a class=\"anchor\" href=\"#core-developers\">#<\/a><\/h2>\n<p>Core developers have special privileges and responsibilities compared to other contributors:<\/p>\n<ul>\n<li>Can vote for and against merging pull requests (See also <a href=\"https:\/\/docs.luanti.org\/for-engine-devs\/git-guidelines\">Git Guidelines<\/a>)<\/li>\n<li>Has write access to the Luanti&rsquo;s team&rsquo;s repositories on GitHub<\/li>\n<\/ul>\n<p>The core team should all be people who are trusted and capable of reviewing C++ code if you ask them to. They don&rsquo;t necessarily need to have the time. However, if a core developer doesn&rsquo;t write or review any code for a long time, the trust disappears.<\/p>"},{"title":"Overview of Luanti forks","link":"https:\/\/docs.luanti.org\/about\/luanti-forks\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/about\/luanti-forks\/","description":"<h1 id=\"luanti-forks\">Luanti forks<a class=\"anchor\" href=\"#luanti-forks\">#<\/a><\/h1>\n<p>A software is said to be a <strong>fork<\/strong> if it is a derivation of a copy of another software; that is, if it is based on its source code and other related data. Luanti has seen some forks in its history. This article gives an overview of some of the known forks of Luanti.<\/p>\n<h2 id=\"what-is-a-luanti-fork\">What is a Luanti fork?<a class=\"anchor\" href=\"#what-is-a-luanti-fork\">#<\/a><\/h2>\n<p>As said, above, a fork is another copy of software that is edited. For Luanti, it is the same. Except a few mods put together is not called a fork, that would be a modpack. A fork is a Core engine change(s) that are not official and will not be released as a version of Luanti unless submitted and accepted in a pull request.<\/p>"},{"title":"Persistence","link":"https:\/\/docs.luanti.org\/for-creators\/api\/persistence\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/api\/persistence\/","description":"<h1 id=\"persistence\">Persistence<a class=\"anchor\" href=\"#persistence\">#<\/a><\/h1>\n<p>This page aims to give an overview of the serialization options Luanti provides.<\/p>\n<p>Your choice for persistence depends on the data you want to persist:<\/p>\n<ul>\n<li>Structure &amp; types of the data: How is the data structured? What data types occur?<\/li>\n<li>Size of the data, frequency of changes to the data: Can it fit into memory? How expensive can updates be?<\/li>\n<li>Granularity needed: How often must the data be persisted?<\/li>\n<li>Required query-ability of the data: Are indices for fast lookups required?<\/li>\n<li>Required data access, objects the data is tied to: Items? Players?<\/li>\n<\/ul>\n<h2 id=\"de-serialization\">(De-)Serialization<a class=\"anchor\" href=\"#de-serialization\">#<\/a><\/h2>\n<h3 id=\"json\">JSON<a class=\"anchor\" href=\"#json\">#<\/a><\/h3>\n<p>Luanti provides a JSON serializer based on <code>jsoncpp<\/code>.<\/p>"},{"title":"Player","link":"https:\/\/docs.luanti.org\/for-players\/player\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-players\/player\/","description":"<h1 id=\"player\">Player<a class=\"anchor\" href=\"#player\">#<\/a><\/h1>\n<p>The <strong>player<\/strong> or <strong>\u201cplayer character\u201d<\/strong> is the character that a user controls.<\/p>\n<h2 id=\"health\">Health<a class=\"anchor\" href=\"#health\">#<\/a><\/h2>\n<p>Players start with 10 hearts, which is equal to 20 hit points (HP). The smallest unit of health is 0.5 hearts or 1 HP. Players die when they have lost all hearts.<\/p>\n<p>Players can restore health by consuming food. Players can lose health by various means, including, but not limited to: Falling too hard, touching a harmful block such as lava, drowning in a <a href=\"https:\/\/docs.luanti.org\/for-players\/liquid\">liquid<\/a> or getting attacked by other players (if PvP is enabled).<\/p>"},{"title":"Player physics","link":"https:\/\/docs.luanti.org\/for-creators\/player-physics\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/player-physics\/","description":"<h1 id=\"player-physics\">Player physics<a class=\"anchor\" href=\"#player-physics\">#<\/a><\/h1>\n<p><strong>Player physics<\/strong> refers to special physical attributes of the player that can be changed in Lua with <code>player:set_physics_override<\/code>. With this function, you can set e.g. jump strength, walking speed and gravity for each player.<\/p>\n<h2 id=\"basic-usage\">Basic usage<a class=\"anchor\" href=\"#basic-usage\">#<\/a><\/h2>\n<p>See <code>lua_api.md<\/code>. Seriously, read it. :P<\/p>\n<h2 id=\"when-things-break\">When things break<a class=\"anchor\" href=\"#when-things-break\">#<\/a><\/h2>\n<p>However, this method only can set the raw physical values, which will overwrite any previous value the player had.<\/p>\n<p>As long you have only exactly one mod in your entire game that sets player physics using this method, this is not a problem. But as soon more than 1 mod messes with the same player physics attribute (e.g. speed), all hell breaks loose and hilarity ensues, because each mod now competes for the \u201ccorrect\u201d physics attribute. In the worst case, speed, jump strength or gravity will go all over the place.<\/p>"},{"title":"Player Spawn Algorithm","link":"https:\/\/docs.luanti.org\/for-creators\/spawn-algorithm\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/spawn-algorithm\/","description":"<h1 id=\"player-spawn-algorithm\">Player Spawn Algorithm<a class=\"anchor\" href=\"#player-spawn-algorithm\">#<\/a><\/h1>\n<p>The <strong>player spawn algorithm<\/strong> (or <strong>spawn algorithm<\/strong> for short) tries to find a suitable spawn or respawn position for players. It is run whenever a player spawns or respawns.<\/p>\n<p>This page describes how Luanti&rsquo;s builtin spawn algorithm works, as of <strong>version 5.7.0<\/strong>.\nNote that individual mods and games can choose to override the spawning behavior (Minetest Game notably does).\nThe setting <code>static_spawnpoint<\/code> can also override it.<\/p>\n<h2 id=\"overview\">Overview<a class=\"anchor\" href=\"#overview\">#<\/a><\/h2>\n<p>If the setting <code>static_spawnpoint<\/code> is set to a valid position, Luanti will spawn new players at this position.<\/p>"},{"title":"Player-World interaction","link":"https:\/\/docs.luanti.org\/for-creators\/player-world-interaction\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/player-world-interaction\/","description":"<h1 id=\"player-world-interaction\">Player-World Interaction<a class=\"anchor\" href=\"#player-world-interaction\">#<\/a><\/h1>\n<h2 id=\"digging-a-node\">Digging a node<a class=\"anchor\" href=\"#digging-a-node\">#<\/a><\/h2>\n<p>Preconditions are:<\/p>\n<ul>\n<li>a node somewhere in the map<\/li>\n<li>this node is pointable, has a selection box and can be dug by the hand or the tool the player is wielding.<\/li>\n<li>the player has <code>interact<\/code> <a href=\"https:\/\/docs.luanti.org\/for-players\/privileges\">privilege<\/a><\/li>\n<li>the active tool has a tool range that the node can be <a href=\"https:\/\/docs.luanti.org\/for-players\/pointing\">pointed<\/a><\/li>\n<li>the node is not stuck somewhere the player can&rsquo;t point it<\/li>\n<\/ul>\n<ol>\n<li>First look at the node, it becomes <code>pointed_thing<\/code>. Note that on android the node is pointed without looking (referring to the cross position) at it.<\/li>\n<li>Then LMB is pressed down while holding an item which does not have <code>on_use<\/code>. If LMB wasn&rsquo;t released before, a click happens, which causes a punch event.\n<ol>\n<li>The client sends a punch event (<code>client-&gt;interact(4, pointed)<\/code>, see <code>game.cpp:3657<\/code> (28.02.2017)).<\/li>\n<li>On server side the punch event is passed to mods, see <code>on_punch<\/code> and the deprecated <code>register_on_punchnode<\/code>.<\/li>\n<li>Then the client sends the digging start event to the server (<code>interact(0, pointed)<\/code>, <code>game.cpp:3948<\/code>).<\/li>\n<li>The server uses this information for anticheat measurements.<\/li>\n<\/ol>\n<\/li>\n<li>Now continue looking at the node, i.e. keep pointing it, and hold down LMB.\n<ol>\n<li>Periodically client-side: Crack animation is updated, digging particles are spawned (if not disabled in the settings) and the node dig sound is played.<\/li>\n<li>The dig sound is either the &ldquo;dig&rdquo; field in the &ldquo;sounds&rdquo; table in the nodedef<\/li>\n<li>If it&rsquo;s not present, the client uses the sound <code>default_dig_${group_name}<\/code> (file name extension omitted here), where <code>$group_name<\/code> is one of the groups the node has, see (<code>game.cpp:4001<\/code>), and <code>gain<\/code> is set to <code>0.5<\/code>.<\/li>\n<\/ol>\n<\/li>\n<li>Some time later, when the digging time elapsed, the client sends a digging completion event to the server (interact(2, pointed), game.cpp:4018), the node disappears client-side, more particles are spawned (if enabled) and the dug sound is played.<\/li>\n<li>Now the server receives the digging completion event. Anticheat probably, e.g due to lag, thinks the player dug the node too fast.\n<ol>\n<li><code>dug_too_fast<\/code> cheat is passed to mods, see <code>register_on_cheat<\/code>, and digging aborts.<\/li>\n<li>If the <code>nodedef<\/code> has a <code>can_dig<\/code> function, it&rsquo;s executed and probably stops the digging.<\/li>\n<li>The <code>on_dig<\/code> function in the nodedef is called now.<\/li>\n<li>The default <code>on_dig<\/code> function probably removes the node:\n<ol>\n<li>The <code>on_destruct<\/code> is executed, air is set and <code>after_destruct<\/code> is executed.<\/li>\n<li>It then calls the <code>after_dig_node<\/code> function in the <code>nodedef<\/code> if present.<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<\/li>\n<\/ol>"},{"title":"PlayerMetaData","link":"https:\/\/docs.luanti.org\/for-creators\/api\/classes\/playermetadata\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/api\/classes\/playermetadata\/","description":"<h1 id=\"playermetadata\">PlayerMetaData<a class=\"anchor\" href=\"#playermetadata\">#<\/a><\/h1>\n<p>PlayerMetaData is a per-world, per-player persistent string key-value store implementing all methods of <a href=\"https:\/\/docs.luanti.org\/for-creators\/api\/classes\/metadata\/\">MetaData<\/a>.<\/p>\n<p>The granularity of the persisted snapshots is determined by the <code>map_save_interval<\/code> setting.<\/p>\n<style type=\"text\/css\">\n \n .notice {\n --title-color: #fff;\n --title-background-color: #6be;\n --content-color: #444;\n --content-background-color: #e7f2fa;\n }\n\n .notice.info {\n --title-background-color: #fb7;\n --content-background-color: #fec;\n }\n\n .notice.tip {\n --title-background-color: #5a5;\n --content-background-color: #efe;\n }\n\n .notice.warning {\n --title-background-color: #c33;\n --content-background-color: #fee;\n }\n\n \n @media (prefers-color-scheme:dark) {\n .notice {\n --title-color: #fff;\n --title-background-color: #069;\n --content-color: #ddd;\n --content-background-color: #023;\n }\n\n .notice.info {\n --title-background-color: #a50;\n --content-background-color: #420;\n }\n\n .notice.tip {\n --title-background-color: #363;\n --content-background-color: #121;\n }\n\n .notice.warning {\n --title-background-color: #800;\n --content-background-color: #400;\n }\n }\n\n body.dark .notice {\n --title-color: #fff;\n --title-background-color: #069;\n --content-color: #ddd;\n --content-background-color: #023;\n }\n\n body.dark .notice.info {\n --title-background-color: #a50;\n --content-background-color: #420;\n }\n\n body.dark .notice.tip {\n --title-background-color: #363;\n --content-background-color: #121;\n }\n\n body.dark .notice.warning {\n --title-background-color: #800;\n --content-background-color: #400;\n }\n\n \n .notice {\n padding: 18px;\n line-height: 24px;\n margin-bottom: 24px;\n border-radius: 4px;\n color: var(--content-color);\n background: var(--content-background-color);\n }\n\n .notice p:last-child {\n margin-bottom: 0\n }\n\n \n .notice-title {\n margin: -18px -18px 12px;\n padding: 4px 18px;\n border-radius: 4px 4px 0 0;\n font-weight: 700;\n color: var(--title-color);\n background: var(--title-background-color);\n }\n\n \n .icon-notice {\n display: inline-flex;\n align-self: center;\n margin-right: 8px;\n }\n\n .icon-notice img,\n .icon-notice svg {\n height: 1em;\n width: 1em;\n fill: currentColor;\n }\n\n .icon-notice img,\n .icon-notice.baseline svg {\n top: .125em;\n position: relative;\n }\n<\/style><div class=\"notice note\" >\n <p class=\"notice-title\">\n <span class=\"icon-notice baseline\">\n <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 128 300 300\">\n <path d=\"M150 128c82.813 0 150 67.188 150 150 0 82.813-67.188 150-150 150C67.187 428 0 360.812 0 278c0-82.813 67.188-150 150-150Zm25 243.555v-37.11c0-3.515-2.734-6.445-6.055-6.445h-37.5c-3.515 0-6.445 2.93-6.445 6.445v37.11c0 3.515 2.93 6.445 6.445 6.445h37.5c3.32 0 6.055-2.93 6.055-6.445Zm-.39-67.188 3.515-121.289c0-1.367-.586-2.734-1.953-3.516-1.172-.976-2.93-1.562-4.688-1.562h-42.968c-1.758 0-3.516.586-4.688 1.563-1.367.78-1.953 2.148-1.953 3.515l3.32 121.29c0 2.734 2.93 4.882 6.64 4.882h36.134c3.515 0 6.445-2.148 6.64-4.883Z\"\/>\n<\/svg>\n\n <\/span> Note <\/p>"},{"title":"Pointing","link":"https:\/\/docs.luanti.org\/for-players\/pointing\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-players\/pointing\/","description":"<h1 id=\"pointing\">Pointing<a class=\"anchor\" href=\"#pointing\">#<\/a><\/h1>\n<p><strong>Pointing<\/strong> means to look at something with the crosshair (which is in the center of your screen) on it while being close enough to it. When something is pointed, it is highlighted, either by a wireframe or by some sort of \u201chalo\u201d. Pointing things (aka pointing <strong>at<\/strong> things) is necessary for tasks like mining, building, using items, etc.<\/p>\n<p>The default distance for pointing is less than 4 blocks away. In Minetest Game, this distance increases to 10 when using creative mode. It is possible for items and held nodes to have their own pointing range.<\/p>"},{"title":"Privileges","link":"https:\/\/docs.luanti.org\/for-players\/privileges\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-players\/privileges\/","description":"<h1 id=\"privileges\">Privileges<a class=\"anchor\" href=\"#privileges\">#<\/a><\/h1>\n<p>Every player has a set of privileges, which differ from server to server. Roughly spoken, one\u2019s privileges determine what one is able to do and what not. Each privilege has a name (the meaning is described below). Privileges can be granted and revoked from other players by any player who has the privilege called \u201cprivs\u201d. On a multiplayer server with a default configuration, new players start with the privileges called \u201cinteract\u201d and \u201cshout\u201d. To view one\u2019s own privileges, one can issue the <a href=\"https:\/\/docs.luanti.org\/for-players\/server-commands\">server command<\/a> \u201c\/privs\u201d.<\/p>"},{"title":"Profiler graph","link":"https:\/\/docs.luanti.org\/for-engine-devs\/profiler-graph\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-engine-devs\/profiler-graph\/","description":"<h1 id=\"profiler-graph\">Profiler graph<a class=\"anchor\" href=\"#profiler-graph\">#<\/a><\/h1>\n<p>The profiler graphs show the performance of Luanti in a more detailed fashion. This information is useful for engine developers. The profiler graphs are shown when you hit the debug key (F5 by default) twice.<\/p>\n<p><a href=\"https:\/\/docs.luanti.org\/images\/Profiler_graph.webp\"><img src=\"https:\/\/docs.luanti.org\/images\/Profiler_graph.webp\" alt=\"Profiler graph\" \/><\/a><\/p>\n<p>The following graphs are available:<\/p>\n<ul>\n<li><strong>rudp_rtt<\/strong>:\u00a0???<\/li>\n<li><strong>rudp_jitter<\/strong>:\u00a0???<\/li>\n<li><strong>packets_lost<\/strong>:\u00a0???<\/li>\n<li><strong>num_processed_meshes<\/strong>: The engine generates geometric meshes from MapBlock data for drawing. This is the number of those meshes that finished generating in each frame.<\/li>\n<li><strong>mainloop_sleep<\/strong>: If the game runs at a faster rate than <code>wanted_fps<\/code>, a sleep is inserted into each frame after drawing in order to not consume excess resources; this is that sleep time in seconds.<\/li>\n<li><strong>mainloop_other<\/strong>: Time (in seconds) spent in each frame for everything else than drawing.<\/li>\n<li><strong>mainloop_dtime<\/strong>: Total time (in seconds) spent per frame (<code>mainloop_other + mainloop_draw + mainloop_sleep<\/code>); FPS = 1 divided by this, averaged.<\/li>\n<li><strong>mainloop_draw<\/strong>: Time (in seconds) spent in each frame for drawing (rendering).<\/li>\n<li><strong>client_received_packets<\/strong>: Number of received high-level protocol packets in each frame.<\/li>\n<\/ul>\n<h2 id=\"see-also\">See also<a class=\"anchor\" href=\"#see-also\">#<\/a><\/h2>\n<ul>\n<li><a href=\"https:\/\/docs.luanti.org\/for-creators\/debug\">Debug<\/a><\/li>\n<\/ul>"},{"title":"Programs and Editors","link":"https:\/\/docs.luanti.org\/for-creators\/programs-and-editors\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/programs-and-editors\/","description":"<h1 id=\"programs-and-editors\">Programs and Editors<a class=\"anchor\" href=\"#programs-and-editors\">#<\/a><\/h1>\n<p>This is a list of unofficial <a href=\"https:\/\/docs.luanti.org\/about\/luanti\">Luanti<\/a>-related software.<\/p>\n<p>This is not a comprehensive list, for more see <a href=\"https:\/\/forum.luanti.org\/viewforum.php?f=14\">Luanti-related projects<\/a> in the forum.<\/p>\n<h2 id=\"mapping\">Mapping<a class=\"anchor\" href=\"#mapping\">#<\/a><\/h2>\n<table>\n <thead>\n <tr>\n <th>Name<\/th>\n <th>Description<\/th>\n <th>Info\/webpage<\/th>\n <th>Author<\/th>\n <\/tr>\n <\/thead>\n <tbody>\n <tr>\n <td><a href=\"https:\/\/github.com\/luanti-org\/minetestmapper\">Minetest Mapper<\/a><\/td>\n <td>Creates 2D map images of an already existing world. One block corresponds to one pixel. There is also a <a href=\"https:\/\/forum.luanti.org\/viewtopic.php?t=12139\">Minetest Mapper GUI<\/a> available.<\/td>\n <td><a href=\"https:\/\/docs.luanti.org\/for-server-hosts\/minetestmapper\">minetestmapper<\/a><\/td>\n <td><a href=\"https:\/\/github.com\/luanti-org\/minetestmapper\/graphs\/contributors\">Many contributors<\/a><\/td>\n <\/tr>\n <tr>\n <td><a href=\"https:\/\/github.com\/Treer\/Amidst-for-Minetest\">Amidst for Minetest<\/a><\/td>\n <td>Creates a map of biomes without actually creating the world. This tool just needs a world type, biome profile and seed. Can also view the biomes as Voronoi diagrams.<\/td>\n <td><a href=\"https:\/\/forum.luanti.org\/viewtopic.php?t=19869\">Forum<\/a><\/td>\n <td><a href=\"https:\/\/forum.luanti.org\/memberlist.php?mode=viewprofile&amp;u=19464\">Dr. Frankenstone<\/a><\/td>\n <\/tr>\n <tr>\n <td><a href=\"https:\/\/bitbucket.org\/s_l_teichmann\/mtsatellite\/src\/master\/\">MTSatellite<\/a><\/td>\n <td>A real-time Web mapping system. Play on your world and share a map of it in the Web, live.<\/td>\n <td><a href=\"https:\/\/forum.luanti.org\/viewtopic.php?t=10278\">Forum<\/a><\/td>\n <td><a href=\"https:\/\/forum.luanti.org\/memberlist.php?mode=viewprofile&amp;u=11044\">s-l-teichmann<\/a><\/td>\n <\/tr>\n <tr>\n <td><a href=\"https:\/\/github.com\/minetest-mapserver\/mapserver\">Minetest mapserver<\/a><\/td>\n <td>A real-time Web mapping system with POI, player, shop and item-search support. Play on your world and share a map of it in the Web, live. written in Go.<\/td>\n <td><a href=\"https:\/\/forum.luanti.org\/viewtopic.php?t=21999\">Forum<\/a><\/td>\n <td><a href=\"https:\/\/forum.luanti.org\/memberlist.php?mode=viewprofile&amp;u=22999\">BuckarooBanzay<\/a><\/td>\n <\/tr>\n <tr>\n <td><a href=\"https:\/\/github.com\/HybridDog\/onomatopoeia\">Onomatopoeia<\/a><\/td>\n <td>Creates isometric images of already existing worlds.<\/td>\n <td><a href=\"https:\/\/forum.luanti.org\/viewtopic.php?t=18698\">Forum<\/a><\/td>\n <td><a href=\"https:\/\/github.com\/HybridDog\/onomatopoeia\/graphs\/contributors\">Zeg9 and HybridDog<\/a><\/td>\n <\/tr>\n <\/tbody>\n<\/table>\n<h2 id=\"world-editing\">World editing<a class=\"anchor\" href=\"#world-editing\">#<\/a><\/h2>\n<table>\n <thead>\n <tr>\n <th>Name<\/th>\n <th>Description<\/th>\n <th>Info\/webpage<\/th>\n <th>Author<\/th>\n <\/tr>\n <\/thead>\n <tbody>\n <tr>\n <td><a href=\"https:\/\/github.com\/gaelysam\/geo-mapgen\">Geo mapgen<\/a><\/td>\n <td>Generate worlds from real-world topographical data. Reads GeoTiff land cover data and digital elevation models such as those provided by <a href=\"http:\/\/srtm.csi.cgiar.org\/SELECTION\/inputCoord.asp\">SRTM<\/a><\/td>\n <td><a href=\"https:\/\/forum.luanti.org\/viewtopic.php?t=19387\">Forum<\/a><\/td>\n <td><a href=\"https:\/\/forum.luanti.org\/memberlist.php?mode=viewprofile&amp;u=9067\">Gael de Sailly<\/a><\/td>\n <\/tr>\n <tr>\n <td><a href=\"https:\/\/github.com\/bobombolo\/realterrain\">Real Terrain<\/a><\/td>\n <td>Use image files as heightmaps and biome-maps to generate worlds.<\/td>\n <td><a href=\"https:\/\/forum.luanti.org\/viewtopic.php?t=12666\">Forum<\/a><\/td>\n <td><a href=\"https:\/\/forum.luanti.org\/memberlist.php?mode=viewprofile&amp;u=15865\">bobomb<\/a><\/td>\n <\/tr>\n <tr>\n <td><a href=\"https:\/\/github.com\/minetest-tools\/mtmapprune\">mtmapprune<\/a><\/td>\n <td>Prunes the map.sqlite file of a world and deletes blocks outside a specified range.<\/td>\n <td><a href=\"https:\/\/forum.luanti.org\/viewtopic.php?t=18579\">Forum<\/a><\/td>\n <td><a href=\"https:\/\/github.com\/sofar\">sofar<\/a><\/td>\n <\/tr>\n <tr>\n <td><a href=\"https:\/\/www.worldpainter.net\/\">WorldPainter<\/a><\/td>\n <td>WorldPainter is a Minecraft tool that provides Luanti support via a plugin. WorldPainter generates the world according to your instructions about the terrain height and type, and any additional &ldquo;layers&rdquo; you&rsquo;ve painted which can add things like trees and other vegetation, caves or any type of custom object. You can paint and sculpt the terrain by hand, but you can also use height maps and\/or image masks.<\/td>\n <td><a href=\"https:\/\/forum.luanti.org\/viewtopic.php?t=16649\">Forum<\/a><\/td>\n <td><a href=\"https:\/\/forum.luanti.org\/memberlist.php?mode=viewprofile&amp;u=20528\">Captain Chaos<\/a><\/td>\n <\/tr>\n <tr>\n <td><a href=\"https:\/\/github.com\/random-geek\/MapEditr\">MapEditr<\/a><\/td>\n <td>MapEditr is a command-line tool for fast manipulation of Luanti map database files. Functionally similar to WorldEdit, but runs outside of the game and is designed for handling larger tasks.<\/td>\n <td><a href=\"https:\/\/forum.luanti.org\/viewtopic.php?t=26803\">Forum<\/a><\/td>\n <td><a href=\"https:\/\/forum.luanti.org\/memberlist.php?mode=viewprofile&amp;u=23195\">Random Geek<\/a><\/td>\n <\/tr>\n <tr>\n <td><a href=\"https:\/\/github.com\/random-geek\/MapEdit\">MapEdit<\/a><\/td>\n <td>Superseded by MapEditr (above)<\/td>\n <td><a href=\"https:\/\/github.com\/random-geek\/MapEdit\">Forum<\/a><\/td>\n <td><a href=\"https:\/\/forum.luanti.org\/memberlist.php?mode=viewprofile&amp;u=23195\">Random Geek<\/a><\/td>\n <\/tr>\n <\/tbody>\n<\/table>\n<h2 id=\"convert-data-from-minecraft\">Convert data from <em>Minecraft<\/em><a class=\"anchor\" href=\"#convert-data-from-minecraft\">#<\/a><\/h2>\n<table>\n <thead>\n <tr>\n <th>Name<\/th>\n <th>Description<\/th>\n <th>Info\/webpage<\/th>\n <th>Author<\/th>\n <\/tr>\n <\/thead>\n <tbody>\n <tr>\n <td><a href=\"https:\/\/github.com\/minetest-tools\/mcimport\">mcimport<\/a><\/td>\n <td>A world converter for whole Minecraft maps (saves), outputting a new, playable Luanti world. For GNU\/Linux.<\/td>\n <td><a href=\"https:\/\/forum.luanti.org\/viewtopic.php?f=14&amp;t=13709\">Forum<\/a><\/td>\n <td><a href=\"https:\/\/github.com\/minetest-tools\/mcimport\/graphs\/contributors\">many contributors<\/a><\/td>\n <\/tr>\n <tr>\n <td><a href=\"https:\/\/github.com\/minetest-tools\/mcresconvert\">mcresconvert<\/a><\/td>\n <td>Convert Minecraft resource packs and texture packs to Luanti texture packs<\/td>\n <td><a href=\"https:\/\/forum.luanti.org\/viewtopic.php?f=4&amp;t=14283\">Forum<\/a><\/td>\n <td><a href=\"https:\/\/github.com\/minetest-tools\/mcresconvert\/graphs\/contributors\">many contributors<\/a><\/td>\n <\/tr>\n <\/tbody>\n<\/table>\n<p>Twoelk also describes <a href=\"https:\/\/forum.luanti.org\/viewtopic.php?p=251194&amp;sid=8558c08027ecfd8d6f08620c9344882f#p251194\">other converters for importing Minecraft data into Luanti<\/a>.<\/p>"},{"title":"Protection","link":"https:\/\/docs.luanti.org\/for-players\/protection\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-players\/protection\/","description":"<h1 id=\"protection\">Protection<a class=\"anchor\" href=\"#protection\">#<\/a><\/h1>\n<style type=\"text\/css\">\n \n .notice {\n --title-color: #fff;\n --title-background-color: #6be;\n --content-color: #444;\n --content-background-color: #e7f2fa;\n }\n\n .notice.info {\n --title-background-color: #fb7;\n --content-background-color: #fec;\n }\n\n .notice.tip {\n --title-background-color: #5a5;\n --content-background-color: #efe;\n }\n\n .notice.warning {\n --title-background-color: #c33;\n --content-background-color: #fee;\n }\n\n \n @media (prefers-color-scheme:dark) {\n .notice {\n --title-color: #fff;\n --title-background-color: #069;\n --content-color: #ddd;\n --content-background-color: #023;\n }\n\n .notice.info {\n --title-background-color: #a50;\n --content-background-color: #420;\n }\n\n .notice.tip {\n --title-background-color: #363;\n --content-background-color: #121;\n }\n\n .notice.warning {\n --title-background-color: #800;\n --content-background-color: #400;\n }\n }\n\n body.dark .notice {\n --title-color: #fff;\n --title-background-color: #069;\n --content-color: #ddd;\n --content-background-color: #023;\n }\n\n body.dark .notice.info {\n --title-background-color: #a50;\n --content-background-color: #420;\n }\n\n body.dark .notice.tip {\n --title-background-color: #363;\n --content-background-color: #121;\n }\n\n body.dark .notice.warning {\n --title-background-color: #800;\n --content-background-color: #400;\n }\n\n \n .notice {\n padding: 18px;\n line-height: 24px;\n margin-bottom: 24px;\n border-radius: 4px;\n color: var(--content-color);\n background: var(--content-background-color);\n }\n\n .notice p:last-child {\n margin-bottom: 0\n }\n\n \n .notice-title {\n margin: -18px -18px 12px;\n padding: 4px 18px;\n border-radius: 4px 4px 0 0;\n font-weight: 700;\n color: var(--title-color);\n background: var(--title-background-color);\n }\n\n \n .icon-notice {\n display: inline-flex;\n align-self: center;\n margin-right: 8px;\n }\n\n .icon-notice img,\n .icon-notice svg {\n height: 1em;\n width: 1em;\n fill: currentColor;\n }\n\n .icon-notice img,\n .icon-notice.baseline svg {\n top: .125em;\n position: relative;\n }\n<\/style><div class=\"notice warning\" >\n <p class=\"notice-title\">\n <span class=\"icon-notice baseline\">\n <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"126 76.5 300 300\">\n <path d=\"M297.431 324.397v-34.255c0-3.245-2.344-5.95-5.358-5.95h-32.146c-3.014 0-5.358 2.705-5.358 5.95v34.255c0 3.245 2.344 5.95 5.358 5.95h32.146c3.014 0 5.358-2.705 5.358-5.95Zm-.335-67.428 3.014-82.753c0-1.081-.502-2.524-1.674-3.425-1.005-.902-2.512-1.983-4.019-1.983h-36.834c-1.507 0-3.014 1.081-4.019 1.983-1.172.901-1.674 2.704-1.674 3.786l2.846 82.392c0 2.344 2.512 4.146 5.693 4.146h30.975c3.013 0 5.525-1.803 5.692-4.146Zm-2.344-168.39L423.34 342.425c3.683 7.032 3.516 15.686-.335 22.717-3.85 7.031-10.883 11.358-18.417 11.358H147.413c-7.534 0-14.566-4.327-18.417-11.358-3.85-7.031-4.018-15.685-.335-22.716L257.248 88.578C260.93 81.188 268.13 76.5 276 76.5c7.87 0 15.069 4.688 18.752 12.08Z\"\/>\n<\/svg>\n\n <\/span> Warning <\/p>"},{"title":"Punching","link":"https:\/\/docs.luanti.org\/for-players\/punching\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-players\/punching\/","description":"<h1 id=\"punching\">Punching<a class=\"anchor\" href=\"#punching\">#<\/a><\/h1>\n<p><strong>Punching<\/strong> is your primary means of attacking in close range and performed with the left mouse button. Hitting a <a href=\"https:\/\/docs.luanti.org\/for-players\/player\">player<\/a> or <a href=\"https:\/\/docs.luanti.org\/for-players\/mobs\">mob<\/a> may cause direct damage. The damage dealt depends on these criteria:<\/p>\n<ul>\n<li>The kind of <a href=\"https:\/\/docs.luanti.org\/for-players\/tool#weapons\">weapon<\/a> (including the <a href=\"https:\/\/docs.luanti.org\/for-creators\/hand\">hand<\/a>) you are currently using<\/li>\n<li>The punch interval of the weapon<\/li>\n<li>The time since the last punch<\/li>\n<li>The damage type of the weapon and the armor of the victim<\/li>\n<\/ul>\n<h2 id=\"punch-interval\">Punch interval<a class=\"anchor\" href=\"#punch-interval\">#<\/a><\/h2>\n<p>If you hold down the punch button, even the strongest weapon will only deal rather low damage. To fight efficiently, you have to wait before punching again.<\/p>"},{"title":"Random","link":"https:\/\/docs.luanti.org\/for-creators\/api\/classes\/random\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/api\/classes\/random\/","description":"<h1 id=\"random\">Random<a class=\"anchor\" href=\"#random\">#<\/a><\/h1>\n<p>Luanti provides four different random sources, each with its own merits. Modders must choose wisely unless they can let the engine do the random for them (e.g. randomly picking a sound or a texture for particles).<\/p>\n<h2 id=\"lua-builtins\">Lua builtins<a class=\"anchor\" href=\"#lua-builtins\">#<\/a><\/h2>\n<p>Not restricted by mod security, these functions are available to both SSMs and CSMs:<\/p>\n<h3 id=\"mathrandomseed\"><a href=\"https:\/\/www.lua.org\/manual\/5.1\/manual.html#pdf-math.randomseed\"><code>math.randomseed<\/code><\/a><a class=\"anchor\" href=\"#mathrandomseed\">#<\/a><\/h3>\n<p>Seed the random. Luanti already does this for you using the system time.<\/p>\n<div class=\"notice info\" >\n <p class=\"notice-title\">\n <span class=\"icon-notice baseline\">\n <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"92 59.5 300 300\">\n <path d=\"M292 303.25V272c0-3.516-2.734-6.25-6.25-6.25H267v-100c0-3.516-2.734-6.25-6.25-6.25h-62.5c-3.516 0-6.25 2.734-6.25 6.25V197c0 3.516 2.734 6.25 6.25 6.25H217v62.5h-18.75c-3.516 0-6.25 2.734-6.25 6.25v31.25c0 3.516 2.734 6.25 6.25 6.25h87.5c3.516 0 6.25-2.734 6.25-6.25Zm-25-175V97c0-3.516-2.734-6.25-6.25-6.25h-37.5c-3.516 0-6.25 2.734-6.25 6.25v31.25c0 3.516 2.734 6.25 6.25 6.25h37.5c3.516 0 6.25-2.734 6.25-6.25Zm125 81.25c0 82.813-67.188 150-150 150-82.813 0-150-67.188-150-150 0-82.813 67.188-150 150-150 82.813 0 150 67.188 150 150Z\"\/>\n<\/svg>\n\n <\/span> Info <\/p>"},{"title":"Raycast","link":"https:\/\/docs.luanti.org\/for-creators\/api\/classes\/raycast\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/api\/classes\/raycast\/","description":"<h1 id=\"raycast\">Raycast<a class=\"anchor\" href=\"#raycast\">#<\/a><\/h1>\n<p>Raycasts are used to simulate rays and determine which selection boxes they intersect with.<\/p>\n<p>With some limitations, they work almost exactly like the player pointing at things.<\/p>\n<h2 id=\"pointed-thing\">Pointed Thing<a class=\"anchor\" href=\"#pointed-thing\">#<\/a><\/h2>\n<p>Pointed things in-game as passed to various callbacks are either<\/p>\n<ul>\n<li>Nothing (<code>{type = &quot;nothing&quot;}<\/code>), or<\/li>\n<li>Objects (entities or players), or<\/li>\n<li>Nodes (solids or liquids)<\/li>\n<\/ul>\n<p>Pointed thing tables are thus a &ldquo;tagged union&rdquo; type, taking the following forms for objects &amp; nodes:<\/p>"},{"title":"Releasing Luanti","link":"https:\/\/docs.luanti.org\/for-engine-devs\/releasing-luanti\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-engine-devs\/releasing-luanti\/","description":"<h1 id=\"releasing-luanti\">Releasing Luanti<a class=\"anchor\" href=\"#releasing-luanti\">#<\/a><\/h1>\n<p>The <a href=\"#feature-freeze\">feature freeze<\/a> and release date is set by core developers.<\/p>\n<p>In the past, the team aimed to release every 6 months. Whilst this was sometimes met, releases were usually delayed by months. To deliver bugfixes and features quicker, the goal is to consistently release every 3 months without delaying for non-critical features.<\/p>\n<ul>\n<li>Goal: January, April, July, October<\/li>\n<li>A release before November should be prioritized because the Game Jam (<a href=\"https:\/\/forum.luanti.org\/viewtopic.php?t=31059\">2024 forum post<\/a>) would like to make use of new features.<\/li>\n<\/ul>\n<p>Patch releases are exempt from this schedule.<\/p>"},{"title":"Remote media","link":"https:\/\/docs.luanti.org\/for-server-hosts\/remote-media\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-server-hosts\/remote-media\/","description":"<h1 id=\"remote-media\">Remote media<a class=\"anchor\" href=\"#remote-media\">#<\/a><\/h1>\n<p>When connecting to a server, Luanti allows for media to be received over a remote HTTP server, as opposed to &ldquo;traditionally&rdquo; over the UDP server connection (assuming Luanti is compiled with cURL support and <code>enable_remote_media_server<\/code> is enabled).<\/p>\n<p>Usually this is a more efficient means of transferring for servers with large amounts of media, even if you host the HTTP server on the same computer as the Luanti server it should still be able to download faster. It is also useful for Luanti servers hosted on a low speed residential internet connection, where the media downloading can be offloaded to make it significantly faster and dedicate more of the connection to communication with the Luanti server.<\/p>"},{"title":"Reporting Bugs","link":"https:\/\/docs.luanti.org\/for-players\/reporting-bugs\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-players\/reporting-bugs\/","description":"<h1 id=\"reporting-bugs\">Reporting bugs<a class=\"anchor\" href=\"#reporting-bugs\">#<\/a><\/h1>\n<h3 id=\"notes\">Notes<a class=\"anchor\" href=\"#notes\">#<\/a><\/h3>\n<p>Luanti is never finished, it is constantly a work in progress. Thus all bug reports trivial, or not, help us making the engine better for everyone.<\/p>\n<h3 id=\"check-for-similar-reports\">Check for similar reports<a class=\"anchor\" href=\"#check-for-similar-reports\">#<\/a><\/h3>\n<p>A bug might already be reported or even fixed by the time you are having problems. Please check the following sources for solution prior reporting:<\/p>\n<ul>\n<li><a href=\"https:\/\/www.luanti.org\/downloads\/\">Newest Luanti version<\/a> - are you using the most recent one?<\/li>\n<li><a href=\"https:\/\/github.com\/luanti-org\/luanti\/issues?q=is%3Aissue\">GitHub issue tracker<\/a><\/li>\n<li><a href=\"https:\/\/kiwiirc.com\/nextclient\/irc.libera.chat:&#43;6697\/#luanti\">Libera IRC (English)<\/a> (answers might take a while)<\/li>\n<li><a href=\"https:\/\/forum.luanti.org\/viewforum.php?f=6\">Luanti Forums: &lsquo;Problems&rsquo;<\/a><\/li>\n<\/ul>\n<h3 id=\"gathering-information\">Gathering information<a class=\"anchor\" href=\"#gathering-information\">#<\/a><\/h3>\n<p>If you cannot find any similar reported bug, please collect as much relevant information to the developers. More information usually means faster issue tracking. Usually it helps us a lot to provide following information.<\/p>"},{"title":"Right to a Name","link":"https:\/\/docs.luanti.org\/for-creators\/right-to-a-name\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/right-to-a-name\/","description":"<h1 id=\"right-to-a-name\">Right to a Name<a class=\"anchor\" href=\"#right-to-a-name\">#<\/a><\/h1>\n<p>Right to a Name (abbreviated RTAN, alternatively RTaN) is a policy enforced by ContentDB where every modname (the technical name of a mod) needs to be unique. For the official policy see <a href=\"https:\/\/content.luanti.org\/policy_and_guidance\/#31-right-to-a-name\">Package Inclusion Policy and Guidance \u00a7 3.1. Right to a Name<\/a>.<\/p>\n<h2 id=\"motivation\">Motivation<a class=\"anchor\" href=\"#motivation\">#<\/a><\/h2>\n<p>The reason for its enforcement is due to the Luanti dependency system requiring unique technical names and can&rsquo;t distinguish several mods with the same technical name. They will be treated as the same mod and any mods depending on it would break if the wrong incompatible version was enabled.<\/p>"},{"title":"Schematic","link":"https:\/\/docs.luanti.org\/for-creators\/schematic\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/schematic\/","description":"<h1 id=\"schematic\">Schematic<a class=\"anchor\" href=\"#schematic\">#<\/a><\/h1>\n<p><strong>Schematics<\/strong> are pre-defined node patterns to be placed somewhere in the world. They allow to create some complex figures or structures and repeat them with little random alterations.<\/p>\n<p>A schematic tells in an area what nodes should be created, with a given probability for each node to appear.<\/p>\n<h2 id=\"features\">Features<a class=\"anchor\" href=\"#features\">#<\/a><\/h2>\n<p>Schematics save the contents of an area of the world. It saves node names and the param2 value for each node. Node metadata is not saved.<\/p>"},{"title":"Script Engine","link":"https:\/\/docs.luanti.org\/for-engine-devs\/script-engine\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-engine-devs\/script-engine\/","description":"<h1 id=\"enginescript-engine\">Engine\/Script Engine<a class=\"anchor\" href=\"#enginescript-engine\">#<\/a><\/h1>\n<h2 id=\"conventions\">Conventions<a class=\"anchor\" href=\"#conventions\">#<\/a><\/h2>\n<ul>\n<li>Script Engine uses a modular design separating code with different purpose as much as possible.<\/li>\n<li>As Luanti uses a flat include file namespace any filename has to be unique. As result files are prefixed within script engine.<\/li>\n<\/ul>\n<h2 id=\"initialization\">Initialization<a class=\"anchor\" href=\"#initialization\">#<\/a><\/h2>\n<p>There are basically two initialization phases, on creation of application prototypes register lua_api modules to ScriptApi. Once server is started a new ScriptApi instance is created which initializes a new Lua stack using all initialization functions provided by lua_api.<\/p>"},{"title":"Server Commands","link":"https:\/\/docs.luanti.org\/for-players\/server-commands\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-players\/server-commands\/","description":"<h1 id=\"server-commands\">Server Commands<a class=\"anchor\" href=\"#server-commands\">#<\/a><\/h1>\n<p><strong>Server commands<\/strong> (also called \u201c<strong>chat commands<\/strong>\u201d) are special commands to the server that can be entered by any player via the <a href=\"https:\/\/docs.luanti.org\/for-players\/chat\">chat<\/a> to cause the server to do something.<\/p>\n<h2 id=\"command-basics\">Command basics<a class=\"anchor\" href=\"#command-basics\">#<\/a><\/h2>\n<p>Luanti comes with a set of built-in commands, but games and <a href=\"https:\/\/docs.luanti.org\/for-players\/mods\">mods<\/a> may add custom commands or even alter or remove some of the built-in-commands.<\/p>\n<p>There are many commands, but you only need to remember the <code>\/help<\/code> command. This will give you a list of all commands that are <em>currently<\/em> available, plus a brief explanation.<\/p>"},{"title":"Server Metrics using Prometheus","link":"https:\/\/docs.luanti.org\/for-server-hosts\/prometheus-metrics\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-server-hosts\/prometheus-metrics\/","description":"<h1 id=\"server-metrics-using-prometheus\">Server Metrics using Prometheus<a class=\"anchor\" href=\"#server-metrics-using-prometheus\">#<\/a><\/h1>\n<p>Prometheus is an &ldquo;open-source monitoring system with a dimensional data model, flexible query language, efficient time series database and modern alerting approach&rdquo;.<\/p>\n<p>Luanti has built-in support for Prometheus, allowing you to see metrics about your server - such as player count and performance information.<\/p>\n<p>Here are some examples of Grafana dashboards created using Prometheus:<\/p>\n<ul>\n<li><a href=\"https:\/\/monitor.rubenwardy.com\/d\/9TgIegyGk\/ctf\">monitor.rubenwardy.com<\/a><\/li>\n<li><a href=\"https:\/\/monitoring.luanti.ch\/\">https:\/\/monitoring.luanti.ch\/<\/a> (note: this contains heavy modifications)<\/li>\n<\/ul>\n<h2 id=\"using-prometheus-in-luanti\">Using Prometheus in Luanti<a class=\"anchor\" href=\"#using-prometheus-in-luanti\">#<\/a><\/h2>\n<h3 id=\"get-or-build-the-prometheus-cpp-library\">Get or build the prometheus-cpp library<a class=\"anchor\" href=\"#get-or-build-the-prometheus-cpp-library\">#<\/a><\/h3>\n<p>You may be able to find prometheus-cpp in your distro&rsquo;s package manager. Otherwise, you&rsquo;ll need to build it and make it available to Luanti.<\/p>"},{"title":"Servers","link":"https:\/\/docs.luanti.org\/for-players\/servers\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-players\/servers\/","description":"<h1 id=\"servers\">Servers<a class=\"anchor\" href=\"#servers\">#<\/a><\/h1>\n<p>Luanti <strong>servers<\/strong> allow players to play online with other people. They can be run from a dedicated server, a Virtual Private Server or a home computer.<\/p>\n<p>This is not a list of servers, please see the <a href=\"https:\/\/luanti.org\/servers\">Luanti Server List<\/a> or <a href=\"https:\/\/forum.luanti.org\/viewforum.php?f=10\">Luanti Forum servers section<\/a> instead.<\/p>\n<p>To setup your own server, see <a href=\"https:\/\/docs.luanti.org\/for-server-hosts\">For Server Hosts<\/a><\/p>\n<h2 id=\"getting-access-to-a-server\">Getting access to a server<a class=\"anchor\" href=\"#getting-access-to-a-server\">#<\/a><\/h2>\n<h3 id=\"finding-a-server\">Finding a server<a class=\"anchor\" href=\"#finding-a-server\">#<\/a><\/h3>\n<p><img src=\"https:\/\/docs.luanti.org\/images\/server\/Minetest_serverlist.png\" alt=\"Luanti client&rsquo;s server list\" \/><\/p>\n<p>In order to play on a server at all, you need to know the address and a port number of a server first. There are many ways to find those addresses:<\/p>"},{"title":"Sneaking","link":"https:\/\/docs.luanti.org\/for-players\/sneaking\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-players\/sneaking\/","description":"<h1 id=\"sneaking\">Sneaking<a class=\"anchor\" href=\"#sneaking\">#<\/a><\/h1>\n<p>Sneaking is part of the basic <a href=\"https:\/\/docs.luanti.org\/for-players\/controls\">controls<\/a> in Luanti with many useful capabilities. Normally, sneaking slows you down and protects you from accidentally falling off ledges. In some games, sneaking allows you to use powerful \u201csneak ladders\u201d which can be climbed super fast.<\/p>\n<p>Sneaking is a surprisingly diverse move; this article will explain all the details.<\/p>\n<h2 id=\"controls\">Controls<a class=\"anchor\" href=\"#controls\">#<\/a><\/h2>\n<p>The default key for sneaking is Shift. You will sneak as long as you hold down the sneak key. You can not sneak while you are at any climbable block (like a ladder), inside a <a href=\"https:\/\/docs.luanti.org\/for-players\/liquid\">liquid<\/a> or have activated <a href=\"https:\/\/docs.luanti.org\/for-players\/controls#movement-modes\">Fly Mode<\/a>.<\/p>"},{"title":"Steam Deck","link":"https:\/\/docs.luanti.org\/for-engine-devs\/steamdeck\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-engine-devs\/steamdeck\/","description":"<h1 id=\"steam-deck\">Steam Deck<a class=\"anchor\" href=\"#steam-deck\">#<\/a><\/h1>\n<p>This page contains information useful for developing Luanti for the Steam Deck. Contact rubenwardy with any questions.<\/p>\n<h2 id=\"usage-as-an-end-user\">Usage as an end user<a class=\"anchor\" href=\"#usage-as-an-end-user\">#<\/a><\/h2>\n<p>See <a href=\"https:\/\/blog.rubenwardy.com\/2022\/12\/02\/minetest-steam-deck\/\">rubenwardy&rsquo;s blog post<\/a><\/p>\n<h2 id=\"installing-a-dev-version\">Installing a dev version<a class=\"anchor\" href=\"#installing-a-dev-version\">#<\/a><\/h2>\n<p>Uploading an AppImage using Deck DevKit\nSource: <a href=\"https:\/\/partner.steamgames.com\/doc\/steamdeck\/loadgames\">https:\/\/partner.steamgames.com\/doc\/steamdeck\/loadgames<\/a><\/p>\n<ul>\n<li>Name: MinetestAppImage<\/li>\n<li>Local folder: <code>\/home\/user\/dev\/tmp\/minetestdeck\/<\/code><\/li>\n<li>Upload filtering [Include only] <code>Minetest-dev.AppImage<\/code><\/li>\n<li>Start command: <code>Minetest-dev.AppImage<\/code><\/li>\n<li>Save config<\/li>\n<li>Click Upload<\/li>\n<li>On deck: <code>cp \/usr\/lib\/libcrypto.so ~\/devkit-game\/MinetestAppImage\/libcrypto.so.1<\/code><\/li>\n<li>Luanti should now be in Non-steam games as &ldquo;Devkit games: MinetestAppImage&rdquo;<\/li>\n<\/ul>\n<p>Note, I had issues reusing the layout from the stable version of the game. Pressing &ldquo;apply layout&rdquo; did nothing. I needed to follow this bizarre workaround <a href=\"https:\/\/www.reddit.com\/r\/SteamDeck\/comments\/10tsp1a\/i_cant_change_the_default_controller_layout\/\">https:\/\/www.reddit.com\/r\/SteamDeck\/comments\/10tsp1a\/i_cant_change_the_default_controller_layout\/<\/a><\/p>"},{"title":"Texture Modifiers","link":"https:\/\/docs.luanti.org\/for-creators\/api\/texture-modifiers\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/api\/texture-modifiers\/","description":"<h1 id=\"texture-modifiers\">Texture Modifiers<a class=\"anchor\" href=\"#texture-modifiers\">#<\/a><\/h1>\n<p>Texture modifiers - strings instructing Luanti to manipulate images - are, besides dynamic media, the only way to dynamically generate textures at runtime.<\/p>\n<p>They can also be used to simplify mods by generating repetitive textures such as differently colored tool textures.<\/p>\n<style type=\"text\/css\">\n \n .notice {\n --title-color: #fff;\n --title-background-color: #6be;\n --content-color: #444;\n --content-background-color: #e7f2fa;\n }\n\n .notice.info {\n --title-background-color: #fb7;\n --content-background-color: #fec;\n }\n\n .notice.tip {\n --title-background-color: #5a5;\n --content-background-color: #efe;\n }\n\n .notice.warning {\n --title-background-color: #c33;\n --content-background-color: #fee;\n }\n\n \n @media (prefers-color-scheme:dark) {\n .notice {\n --title-color: #fff;\n --title-background-color: #069;\n --content-color: #ddd;\n --content-background-color: #023;\n }\n\n .notice.info {\n --title-background-color: #a50;\n --content-background-color: #420;\n }\n\n .notice.tip {\n --title-background-color: #363;\n --content-background-color: #121;\n }\n\n .notice.warning {\n --title-background-color: #800;\n --content-background-color: #400;\n }\n }\n\n body.dark .notice {\n --title-color: #fff;\n --title-background-color: #069;\n --content-color: #ddd;\n --content-background-color: #023;\n }\n\n body.dark .notice.info {\n --title-background-color: #a50;\n --content-background-color: #420;\n }\n\n body.dark .notice.tip {\n --title-background-color: #363;\n --content-background-color: #121;\n }\n\n body.dark .notice.warning {\n --title-background-color: #800;\n --content-background-color: #400;\n }\n\n \n .notice {\n padding: 18px;\n line-height: 24px;\n margin-bottom: 24px;\n border-radius: 4px;\n color: var(--content-color);\n background: var(--content-background-color);\n }\n\n .notice p:last-child {\n margin-bottom: 0\n }\n\n \n .notice-title {\n margin: -18px -18px 12px;\n padding: 4px 18px;\n border-radius: 4px 4px 0 0;\n font-weight: 700;\n color: var(--title-color);\n background: var(--title-background-color);\n }\n\n \n .icon-notice {\n display: inline-flex;\n align-self: center;\n margin-right: 8px;\n }\n\n .icon-notice img,\n .icon-notice svg {\n height: 1em;\n width: 1em;\n fill: currentColor;\n }\n\n .icon-notice img,\n .icon-notice.baseline svg {\n top: .125em;\n position: relative;\n }\n<\/style><div class=\"notice info\" >\n <p class=\"notice-title\">\n <span class=\"icon-notice baseline\">\n <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"92 59.5 300 300\">\n <path d=\"M292 303.25V272c0-3.516-2.734-6.25-6.25-6.25H267v-100c0-3.516-2.734-6.25-6.25-6.25h-62.5c-3.516 0-6.25 2.734-6.25 6.25V197c0 3.516 2.734 6.25 6.25 6.25H217v62.5h-18.75c-3.516 0-6.25 2.734-6.25 6.25v31.25c0 3.516 2.734 6.25 6.25 6.25h87.5c3.516 0 6.25-2.734 6.25-6.25Zm-25-175V97c0-3.516-2.734-6.25-6.25-6.25h-37.5c-3.516 0-6.25 2.734-6.25 6.25v31.25c0 3.516 2.734 6.25 6.25 6.25h37.5c3.516 0 6.25-2.734 6.25-6.25Zm125 81.25c0 82.813-67.188 150-150 150-82.813 0-150-67.188-150-150 0-82.813 67.188-150 150-150 82.813 0 150 67.188 150 150Z\"\/>\n<\/svg>\n\n <\/span> Info <\/p>"},{"title":"Texture Packs","link":"https:\/\/docs.luanti.org\/for-players\/texture-packs\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-players\/texture-packs\/","description":"<h1 id=\"texture-packs\">Texture Packs<a class=\"anchor\" href=\"#texture-packs\">#<\/a><\/h1>\n<p>A <strong>texture pack<\/strong> is a collection of files that are used to change the in-game textures of:<\/p>\n<ul>\n<li><a href=\"https:\/\/docs.luanti.org\/for-players\/nodes\">blocks<\/a><\/li>\n<li><a href=\"https:\/\/docs.luanti.org\/for-players\/items\">items<\/a><\/li>\n<li><a href=\"https:\/\/docs.luanti.org\/for-players\/mobs\">mobs<\/a><\/li>\n<li>GUI<\/li>\n<\/ul>\n<p>The native resolution of Luanti&rsquo;s textures are 16 \u00d7 16 pixels.<\/p>\n<p>All versions of Luanti support custom textures with a folder under the main Luanti folder called <em>textures<\/em>. This folder was added in 0.4.dev-20120408 <em>(18d8e3ac)<\/em>. Changing texture packs is done via the in game main menu tab <em>Content<\/em>.<\/p>"},{"title":"Textures","link":"https:\/\/docs.luanti.org\/for-creators\/textures\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/textures\/","description":"<h1 id=\"textures\">Textures<a class=\"anchor\" href=\"#textures\">#<\/a><\/h1>\n<p>This page lists the image formats that Luanti supports for textures, along with information on optimizing them or working with them programmatically.<\/p>\n<h2 id=\"png-png\">PNG (<code>.png<\/code>)<a class=\"anchor\" href=\"#png-png\">#<\/a><\/h2>\n<p>PNG is an all-round good image format, with lossless compression.<\/p>\n<h3 id=\"optimizing\">Optimizing<a class=\"anchor\" href=\"#optimizing\">#<\/a><\/h3>\n<p>PNG files can be losslessly optimized using the <a href=\"https:\/\/optipng.sourceforge.net\/\"><code>optipng<\/code><\/a> tool, which is useful for trimming the filesize of all textures without losing any important information.<\/p>\n<p>When run with no arguments <code>optipng<\/code> optimizes completely losslessly (no color, metadata or transparency is lost). However there are arguments in addition that can be added in order to further reduce the size or to preserve specific data you might want to keep. A more exhaustive list of arguments and what they do can be found in optipng&rsquo;s manual or in the help text available with <code>optipng -h<\/code>.<\/p>"},{"title":"Timing and Event loop","link":"https:\/\/docs.luanti.org\/for-creators\/api\/timing-and-event-loop\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/api\/timing-and-event-loop\/","description":"<h1 id=\"timing-and-event-loop\">Timing and Event loop<a class=\"anchor\" href=\"#timing-and-event-loop\">#<\/a><\/h1>\n<p>Luanti&rsquo;s Lua API can be used to get time and date or to schedule &ldquo;events&rdquo; to run once or every server step.<\/p>\n<h2 id=\"settings\">Settings<a class=\"anchor\" href=\"#settings\">#<\/a><\/h2>\n<ul>\n<li>\n<p><strong><em>On servers<\/em><\/strong><\/p>\n<ul>\n<li>The <code>dedicated_server_step<\/code> setting controls the time between server steps. This is the maximum granularity (the most time spent between steps and the finest timing possible) of each game loop without a busy-wait.<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong><em>In singleplayer<\/em><\/strong><\/p>\n<ul>\n<li>Framerate determines server steps.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2 id=\"lua-builtins\">Lua builtins<a class=\"anchor\" href=\"#lua-builtins\">#<\/a><\/h2>\n<p>Not restricted by mod security, these functions are available to both SSMs and CSMs and allow getting times \/ dates.<\/p>"},{"title":"Tool","link":"https:\/\/docs.luanti.org\/for-players\/tool\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-players\/tool\/","description":"<h1 id=\"tool\">Tool<a class=\"anchor\" href=\"#tool\">#<\/a><\/h1>\n<p>A <strong>tool<\/strong> is an <a href=\"https:\/\/docs.luanti.org\/for-players\/items\">item<\/a> which has some practical use to interact with the environment. Although some tools are unique, all tools have certain properties in common.<\/p>\n<h2 id=\"usage\">Usage<a class=\"anchor\" href=\"#usage\">#<\/a><\/h2>\n<p>How to use a tool often depends on the tool itself. Most tools are used with the attack key (Left mouse button) or the build key (right mouse button).<\/p>\n<h2 id=\"mining-tools\">Mining tools<a class=\"anchor\" href=\"#mining-tools\">#<\/a><\/h2>\n<p>Many tools are mining tools; refer to Mining for more information.<\/p>"},{"title":"Translating a game on weblate","link":"https:\/\/docs.luanti.org\/for-creators\/translation\/weblate\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/translation\/weblate\/","description":"<h1 id=\"translating-a-game-on-weblate\">Translating a game on Weblate<a class=\"anchor\" href=\"#translating-a-game-on-weblate\">#<\/a><\/h1>\n<p>If you have a game, it is very useful to post it on a <a href=\"https:\/\/weblate.org\/\">Weblate<\/a> instance. Weblate is a free software that creates a website where translators can translate software from their web browser. This makes it much easier for translators to contribute, because editing those locale files by hand can get tedious. Luanti itself is hosted on a Weblate instance.<\/p>\n<p>This guide gives a <strong>rough<\/strong> (!) step-by-step guide on how to set-up Weblate for your Luanti game.<\/p>"},{"title":"Translating Mods and Games","link":"https:\/\/docs.luanti.org\/for-creators\/translation\/mods-and-games\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/translation\/mods-and-games\/","description":"<h1 id=\"translating-mods-and-games\">Translating Mods and Games<a class=\"anchor\" href=\"#translating-mods-and-games\">#<\/a><\/h1>\n<p>This page explains how to translate mods and games for Luanti. To learn how Luanti itself (the engine) is translated, see <a href=\"https:\/\/docs.luanti.org\/for-creators\/translation\">Translation<\/a>.<\/p>\n<h2 id=\"before-you-begin\">Before you begin<a class=\"anchor\" href=\"#before-you-begin\">#<\/a><\/h2>\n<p>Sometimes, games and mods give an overview on about how it can be translated in the README file. This file may contain valuable information on how to get started.<\/p>\n<p>Apart from that, games and mods generally share the same rules when it comes to translation.<\/p>"},{"title":"Troubleshooting","link":"https:\/\/docs.luanti.org\/for-players\/troubleshooting\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-players\/troubleshooting\/","description":"<h1 id=\"troubleshooting\">Troubleshooting<a class=\"anchor\" href=\"#troubleshooting\">#<\/a><\/h1>\n<p>This page lists common technical problems like crashes and error messages (enclosed in quotation marks) and possible solutions or explanations. For general questions, refer to <a href=\"https:\/\/docs.luanti.org\/about\/faq\">FAQ<\/a>.<\/p>\n<p>For information on how to report bugs, read <a href=\"https:\/\/docs.luanti.org\/for-players\/reporting-bugs\">Reporting bugs<\/a>.<\/p>\n<h2 id=\"graphics-and-sound\">Graphics and sound<a class=\"anchor\" href=\"#graphics-and-sound\">#<\/a><\/h2>\n<h3 id=\"the-screen-is-too-dark\">The screen is too dark<a class=\"anchor\" href=\"#the-screen-is-too-dark\">#<\/a><\/h3>\n<p>If you feel the screen is too dark, you can adjust the display gamma to a more comfortable value. By default, it is set to 2.2 out of the possible choices between 1.0 and 3.0, with <em>higher<\/em> numbers being brighter.<\/p>"},{"title":"TrueNAS","link":"https:\/\/docs.luanti.org\/for-server-hosts\/setup\/truenas\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-server-hosts\/setup\/truenas\/","description":"<h1 id=\"truenas-configuration\">TrueNAS configuration<a class=\"anchor\" href=\"#truenas-configuration\">#<\/a><\/h1>\n<style type=\"text\/css\">\n \n .notice {\n --title-color: #fff;\n --title-background-color: #6be;\n --content-color: #444;\n --content-background-color: #e7f2fa;\n }\n\n .notice.info {\n --title-background-color: #fb7;\n --content-background-color: #fec;\n }\n\n .notice.tip {\n --title-background-color: #5a5;\n --content-background-color: #efe;\n }\n\n .notice.warning {\n --title-background-color: #c33;\n --content-background-color: #fee;\n }\n\n \n @media (prefers-color-scheme:dark) {\n .notice {\n --title-color: #fff;\n --title-background-color: #069;\n --content-color: #ddd;\n --content-background-color: #023;\n }\n\n .notice.info {\n --title-background-color: #a50;\n --content-background-color: #420;\n }\n\n .notice.tip {\n --title-background-color: #363;\n --content-background-color: #121;\n }\n\n .notice.warning {\n --title-background-color: #800;\n --content-background-color: #400;\n }\n }\n\n body.dark .notice {\n --title-color: #fff;\n --title-background-color: #069;\n --content-color: #ddd;\n --content-background-color: #023;\n }\n\n body.dark .notice.info {\n --title-background-color: #a50;\n --content-background-color: #420;\n }\n\n body.dark .notice.tip {\n --title-background-color: #363;\n --content-background-color: #121;\n }\n\n body.dark .notice.warning {\n --title-background-color: #800;\n --content-background-color: #400;\n }\n\n \n .notice {\n padding: 18px;\n line-height: 24px;\n margin-bottom: 24px;\n border-radius: 4px;\n color: var(--content-color);\n background: var(--content-background-color);\n }\n\n .notice p:last-child {\n margin-bottom: 0\n }\n\n \n .notice-title {\n margin: -18px -18px 12px;\n padding: 4px 18px;\n border-radius: 4px 4px 0 0;\n font-weight: 700;\n color: var(--title-color);\n background: var(--title-background-color);\n }\n\n \n .icon-notice {\n display: inline-flex;\n align-self: center;\n margin-right: 8px;\n }\n\n .icon-notice img,\n .icon-notice svg {\n height: 1em;\n width: 1em;\n fill: currentColor;\n }\n\n .icon-notice img,\n .icon-notice.baseline svg {\n top: .125em;\n position: relative;\n }\n<\/style><div class=\"notice info\" >\n <p class=\"notice-title\">\n <span class=\"icon-notice baseline\">\n <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"92 59.5 300 300\">\n <path d=\"M292 303.25V272c0-3.516-2.734-6.25-6.25-6.25H267v-100c0-3.516-2.734-6.25-6.25-6.25h-62.5c-3.516 0-6.25 2.734-6.25 6.25V197c0 3.516 2.734 6.25 6.25 6.25H217v62.5h-18.75c-3.516 0-6.25 2.734-6.25 6.25v31.25c0 3.516 2.734 6.25 6.25 6.25h87.5c3.516 0 6.25-2.734 6.25-6.25Zm-25-175V97c0-3.516-2.734-6.25-6.25-6.25h-37.5c-3.516 0-6.25 2.734-6.25 6.25v31.25c0 3.516 2.734 6.25 6.25 6.25h37.5c3.516 0 6.25-2.734 6.25-6.25Zm125 81.25c0 82.813-67.188 150-150 150-82.813 0-150-67.188-150-150 0-82.813 67.188-150 150-150 82.813 0 150 67.188 150 150Z\"\/>\n<\/svg>\n\n <\/span> Info <\/p>"},{"title":"Using Blender","link":"https:\/\/docs.luanti.org\/for-creators\/models\/using-blender\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/models\/using-blender\/","description":"<h1 id=\"using-blender\">Using Blender<a class=\"anchor\" href=\"#using-blender\">#<\/a><\/h1>\n<p>3D models can be used to change the appearance of <a href=\"https:\/\/docs.luanti.org\/for-players\/player\">players<\/a>, <a href=\"https:\/\/docs.luanti.org\/for-players\/nodes\">nodes<\/a>, <a href=\"https:\/\/docs.luanti.org\/for-players\/mobs\">mobs<\/a> and other entities.<\/p>\n<p>If you need to create models for your <a href=\"https:\/\/docs.luanti.org\/for-players\/mods\">mod<\/a>, it is recommended that you use <a href=\"https:\/\/www.blender.org\/\">Blender<\/a>.<\/p>\n<h2 id=\"coordinate-spaces\">Coordinate spaces<a class=\"anchor\" href=\"#coordinate-spaces\">#<\/a><\/h2>\n<p>Recall that Luanti uses a left-handed Y-up coordinate space (X axis points &ldquo;right&rdquo;, Z axis points &ldquo;forward&rdquo;).<\/p>\n<p>Blender uses a right-handed Z-up coordinate space, where forward is instead the positive Y axis. Make sure that your models are facing that direction. When in doubt, hit G, Y, 1 - if the model has moved forward, that means it&rsquo;s facing the right axis. Otherwise you&rsquo;ll have to rotate it.<\/p>"},{"title":"Using Blockbench","link":"https:\/\/docs.luanti.org\/for-creators\/models\/using-blockbench\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/models\/using-blockbench\/","description":"<h1 id=\"using-blockbench\">Using Blockbench<a class=\"anchor\" href=\"#using-blockbench\">#<\/a><\/h1>\n<p>Blockbench is a 3D modelling software designed for making low-poly and voxel models, making it suitable for making Luanti models.\nAs Blockbench supports exporting to <code>.obj<\/code> it is very easy to create static models and export them directly into Luanti.<\/p>\n<p>It is also possible to use Blockbench for making nodeboxes for Luanti, as well as making animated models that can be directly exported as glTF in Luanti 5.10 and newer.<\/p>"},{"title":"Vector API","link":"https:\/\/docs.luanti.org\/for-creators\/api\/classes\/vector\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/api\/classes\/vector\/","description":"<h1 id=\"vector-api\">Vector API<a class=\"anchor\" href=\"#vector-api\">#<\/a><\/h1>\n<p>The <code>vector<\/code> type used to be a simple <code>table<\/code> with <code>x<\/code>, <code>y<\/code>, and <code>z<\/code> values.\nHowever it has more recently been given metatable methods for convenience.\nUnless otherwise noted, the <code>vector<\/code> type always refers to the metatable-enhanced variety.\nDo note that functions here will accept an old-style (non-metatable) <code>vector<\/code>, but you cannot perform metatable operations with said <code>vector<\/code>.<\/p>\n<style type=\"text\/css\">\n \n .notice {\n --title-color: #fff;\n --title-background-color: #6be;\n --content-color: #444;\n --content-background-color: #e7f2fa;\n }\n\n .notice.info {\n --title-background-color: #fb7;\n --content-background-color: #fec;\n }\n\n .notice.tip {\n --title-background-color: #5a5;\n --content-background-color: #efe;\n }\n\n .notice.warning {\n --title-background-color: #c33;\n --content-background-color: #fee;\n }\n\n \n @media (prefers-color-scheme:dark) {\n .notice {\n --title-color: #fff;\n --title-background-color: #069;\n --content-color: #ddd;\n --content-background-color: #023;\n }\n\n .notice.info {\n --title-background-color: #a50;\n --content-background-color: #420;\n }\n\n .notice.tip {\n --title-background-color: #363;\n --content-background-color: #121;\n }\n\n .notice.warning {\n --title-background-color: #800;\n --content-background-color: #400;\n }\n }\n\n body.dark .notice {\n --title-color: #fff;\n --title-background-color: #069;\n --content-color: #ddd;\n --content-background-color: #023;\n }\n\n body.dark .notice.info {\n --title-background-color: #a50;\n --content-background-color: #420;\n }\n\n body.dark .notice.tip {\n --title-background-color: #363;\n --content-background-color: #121;\n }\n\n body.dark .notice.warning {\n --title-background-color: #800;\n --content-background-color: #400;\n }\n\n \n .notice {\n padding: 18px;\n line-height: 24px;\n margin-bottom: 24px;\n border-radius: 4px;\n color: var(--content-color);\n background: var(--content-background-color);\n }\n\n .notice p:last-child {\n margin-bottom: 0\n }\n\n \n .notice-title {\n margin: -18px -18px 12px;\n padding: 4px 18px;\n border-radius: 4px 4px 0 0;\n font-weight: 700;\n color: var(--title-color);\n background: var(--title-background-color);\n }\n\n \n .icon-notice {\n display: inline-flex;\n align-self: center;\n margin-right: 8px;\n }\n\n .icon-notice img,\n .icon-notice svg {\n height: 1em;\n width: 1em;\n fill: currentColor;\n }\n\n .icon-notice img,\n .icon-notice.baseline svg {\n top: .125em;\n position: relative;\n }\n<\/style><div class=\"notice tip\" >\n <p class=\"notice-title\">\n <span class=\"icon-notice baseline\">\n <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"300.5 134 300 300\">\n <path d=\"M551.281 252.36c0-3.32-1.172-6.641-3.515-8.985l-17.774-17.578c-2.344-2.344-5.469-3.711-8.789-3.711-3.32 0-6.445 1.367-8.789 3.71l-79.687 79.493-44.141-44.14c-2.344-2.344-5.469-3.712-8.79-3.712-3.32 0-6.444 1.368-8.788 3.711l-17.774 17.579c-2.343 2.343-3.515 5.664-3.515 8.984 0 3.32 1.172 6.445 3.515 8.789l70.704 70.703c2.343 2.344 5.664 3.711 8.789 3.711 3.32 0 6.64-1.367 8.984-3.71l106.055-106.056c2.343-2.343 3.515-5.468 3.515-8.789ZM600.5 284c0 82.813-67.188 150-150 150-82.813 0-150-67.188-150-150 0-82.813 67.188-150 150-150 82.813 0 150 67.188 150 150Z\"\/>\n<\/svg>\n\n <\/span> Tip <\/p>"},{"title":"Version Number","link":"https:\/\/docs.luanti.org\/for-engine-devs\/version-number\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-engine-devs\/version-number\/","description":"<h1 id=\"version-number\">Version Number<a class=\"anchor\" href=\"#version-number\">#<\/a><\/h1>\n<p>The <strong>version number<\/strong> of Luanti is used to keep different versions of Luanti apart.<\/p>\n<h2 id=\"stable-releases\">Stable releases<a class=\"anchor\" href=\"#stable-releases\">#<\/a><\/h2>\n<p>A stable release is any publicly released version of Luanti where downloadable builds are officially made available on the <a href=\"https:\/\/www.luanti.org\/downloads\/\">downloads page<\/a>, and sometimes patch releases are only made available for specific platforms.<\/p>\n<p>The version number of a stable release is a sequence of 3 natural numbers (including 0). The leftmost number is the most significant number, denoting more and more significant changes. The full version number of Luanti is always displayed in the window title.<\/p>"},{"title":"VoxelArea","link":"https:\/\/docs.luanti.org\/for-creators\/api\/classes\/voxelarea\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/api\/classes\/voxelarea\/","description":"<h1 id=\"voxelarea\">VoxelArea<a class=\"anchor\" href=\"#voxelarea\">#<\/a><\/h1>\n<p>The <code>VoxelArea<\/code> metatable provides an OOP-like utility for dealing with LuaVoxelManip (specifically, for doing the index math).<\/p>\n<h2 id=\"voxelareanewself-o\"><code>VoxelArea.new(self, o)<\/code><a class=\"anchor\" href=\"#voxelareanewself-o\">#<\/a><\/h2>\n<p>Sets <code>self.__index<\/code> to <code>self<\/code> and <code>self<\/code> as the metatable of <code>o<\/code>, which can have the following fields:<\/p>\n<ul>\n<li><code>MinEdge<\/code>: Minimum position of the area, inclusive. Defaults to <code>vector.new(1, 1, 1)<\/code> if <code>nil<\/code>.<\/li>\n<li><code>MaxEdge<\/code>: Maximum position of the area, inclusive. Defaults to <code>vector.new(0, 0, 0)<\/code> if <code>nil<\/code>.<\/li>\n<\/ul>\n<p>Both positions should be <code>vector<\/code>s of integer numbers; each component of <code>MinEdge<\/code> should be smaller than the respective component of <code>MaxEdge<\/code> if the <code>VoxelArea<\/code> is to be non-empty. You can use <code>minp, maxp = vector.sort(minp, maxp)<\/code> to achieve this.<\/p>"},{"title":"Warnings","link":"https:\/\/docs.luanti.org\/for-creators\/warnings\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-creators\/warnings\/","description":"<h1 id=\"warnings\">Warnings<a class=\"anchor\" href=\"#warnings\">#<\/a><\/h1>\n<p>When you run Luanti, it often produces helpful warnings\nthat indicate issues with mods and games that need to be addressed.\nMost commonly, these are <em>deprecation warnings<\/em> for APIs that\nwill change in a future Luanti version.\nThis document explains some of the more frequently encountered warnings and how to resolve them.<\/p>\n<h2 id=\"log-levels\">Log levels<a class=\"anchor\" href=\"#log-levels\">#<\/a><\/h2>\n<p>As a mod developer, you might want to set <code>chat_log_level = warning<\/code> to see client warnings right in your chat.<\/p>"},{"title":"Windows","link":"https:\/\/docs.luanti.org\/for-server-hosts\/setup\/windows\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-server-hosts\/setup\/windows\/","description":"<h1 id=\"windows-configuration\">Windows Configuration<a class=\"anchor\" href=\"#windows-configuration\">#<\/a><\/h1>\n<h2 id=\"obtaining-a-server-binary\">Obtaining a server binary<a class=\"anchor\" href=\"#obtaining-a-server-binary\">#<\/a><\/h2>\n<p>The regular Windows builds provided on the <a href=\"https:\/\/www.luanti.org\/en\/downloads\/\">download page<\/a> work fine, running it as <code>luanti.exe --server<\/code> to access the server portion of it.<\/p>\n<h2 id=\"running-the-server\">Running the Server<a class=\"anchor\" href=\"#running-the-server\">#<\/a><\/h2>\n<style type=\"text\/css\">\n \n .notice {\n --title-color: #fff;\n --title-background-color: #6be;\n --content-color: #444;\n --content-background-color: #e7f2fa;\n }\n\n .notice.info {\n --title-background-color: #fb7;\n --content-background-color: #fec;\n }\n\n .notice.tip {\n --title-background-color: #5a5;\n --content-background-color: #efe;\n }\n\n .notice.warning {\n --title-background-color: #c33;\n --content-background-color: #fee;\n }\n\n \n @media (prefers-color-scheme:dark) {\n .notice {\n --title-color: #fff;\n --title-background-color: #069;\n --content-color: #ddd;\n --content-background-color: #023;\n }\n\n .notice.info {\n --title-background-color: #a50;\n --content-background-color: #420;\n }\n\n .notice.tip {\n --title-background-color: #363;\n --content-background-color: #121;\n }\n\n .notice.warning {\n --title-background-color: #800;\n --content-background-color: #400;\n }\n }\n\n body.dark .notice {\n --title-color: #fff;\n --title-background-color: #069;\n --content-color: #ddd;\n --content-background-color: #023;\n }\n\n body.dark .notice.info {\n --title-background-color: #a50;\n --content-background-color: #420;\n }\n\n body.dark .notice.tip {\n --title-background-color: #363;\n --content-background-color: #121;\n }\n\n body.dark .notice.warning {\n --title-background-color: #800;\n --content-background-color: #400;\n }\n\n \n .notice {\n padding: 18px;\n line-height: 24px;\n margin-bottom: 24px;\n border-radius: 4px;\n color: var(--content-color);\n background: var(--content-background-color);\n }\n\n .notice p:last-child {\n margin-bottom: 0\n }\n\n \n .notice-title {\n margin: -18px -18px 12px;\n padding: 4px 18px;\n border-radius: 4px 4px 0 0;\n font-weight: 700;\n color: var(--title-color);\n background: var(--title-background-color);\n }\n\n \n .icon-notice {\n display: inline-flex;\n align-self: center;\n margin-right: 8px;\n }\n\n .icon-notice img,\n .icon-notice svg {\n height: 1em;\n width: 1em;\n fill: currentColor;\n }\n\n .icon-notice img,\n .icon-notice.baseline svg {\n top: .125em;\n position: relative;\n }\n<\/style><div class=\"notice warning\" >\n <p class=\"notice-title\">\n <span class=\"icon-notice baseline\">\n <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"126 76.5 300 300\">\n <path d=\"M297.431 324.397v-34.255c0-3.245-2.344-5.95-5.358-5.95h-32.146c-3.014 0-5.358 2.705-5.358 5.95v34.255c0 3.245 2.344 5.95 5.358 5.95h32.146c3.014 0 5.358-2.705 5.358-5.95Zm-.335-67.428 3.014-82.753c0-1.081-.502-2.524-1.674-3.425-1.005-.902-2.512-1.983-4.019-1.983h-36.834c-1.507 0-3.014 1.081-4.019 1.983-1.172.901-1.674 2.704-1.674 3.786l2.846 82.392c0 2.344 2.512 4.146 5.693 4.146h30.975c3.013 0 5.525-1.803 5.692-4.146Zm-2.344-168.39L423.34 342.425c3.683 7.032 3.516 15.686-.335 22.717-3.85 7.031-10.883 11.358-18.417 11.358H147.413c-7.534 0-14.566-4.327-18.417-11.358-3.85-7.031-4.018-15.685-.335-22.716L257.248 88.578C260.93 81.188 268.13 76.5 276 76.5c7.87 0 15.069 4.688 18.752 12.08Z\"\/>\n<\/svg>\n\n <\/span> Warning <\/p>"},{"title":"Windows (msvc)","link":"https:\/\/docs.luanti.org\/for-engine-devs\/compiling\/windows-msvc\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-engine-devs\/compiling\/windows-msvc\/","description":"<h1 id=\"compiling-on-windows-using-msvc\">Compiling on Windows using MSVC<a class=\"anchor\" href=\"#compiling-on-windows-using-msvc\">#<\/a><\/h1>\n<h2 id=\"requirements\">Requirements<a class=\"anchor\" href=\"#requirements\">#<\/a><\/h2>\n<ul>\n<li><a href=\"https:\/\/visualstudio.microsoft.com\">Visual Studio 2015 or newer<\/a><\/li>\n<li><a href=\"https:\/\/cmake.org\/download\/\">CMake<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Microsoft\/vcpkg\">vcpkg<\/a><\/li>\n<li><a href=\"https:\/\/git-scm.com\/downloads\">Git<\/a><\/li>\n<\/ul>\n<h2 id=\"compiling-and-installing-the-dependencies\">Compiling and installing the dependencies<a class=\"anchor\" href=\"#compiling-and-installing-the-dependencies\">#<\/a><\/h2>\n<p>It is highly recommended to use vcpkg as package manager.<\/p>\n<p>After you successfully built vcpkg you can easily install the required libraries:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-powershell\" data-lang=\"powershell\"><span style=\"display:flex;\"><span>vcpkg install zlib zstd curl[<span style=\"color:#66d9ef\">ssl<\/span>] openal-soft libvorbis libogg libjpeg-turbo sqlite3 freetype luajit gmp jsoncpp gettext[<span style=\"color:#66d9ef\">tools<\/span>] sdl2 --triplet x64-windows<\/span><\/span><\/code><\/pre><\/div><ul>\n<li><code>curl[ssl]<\/code> is optional, but required to use many online features.<\/li>\n<li><code>openal-soft<\/code>, <code>libvorbis<\/code> and <code>libogg<\/code> are optional, but required to use sound.<\/li>\n<li><code>luajit<\/code> is optional, it replaces the integrated Lua interpreter with a faster just-in-time interpreter.<\/li>\n<li><code>gmp<\/code> and <code>jsoncpp<\/code> are optional, otherwise the bundled versions will be compiled<\/li>\n<li><code>gettext<\/code> is optional, but required to use translations.<\/li>\n<\/ul>\n<p>There are other optional libraries, but they are not tested if they can build and link correctly.<\/p>"},{"title":"Windows (msys2)","link":"https:\/\/docs.luanti.org\/for-engine-devs\/compiling\/windows\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-engine-devs\/compiling\/windows\/","description":"<h1 id=\"compiling-on-windows-with-msys2\">Compiling on Windows with MSYS2<a class=\"anchor\" href=\"#compiling-on-windows-with-msys2\">#<\/a><\/h1>\n<p>There are two ways to compile Luanti on a Windows machine: MSYS2 or a combination of vcpkg, cmake, and Visual Studio.<\/p>\n<p>The simplest way to compile on Windows is with MSYS2. MSYS2 is a collection of tools and libraries providing you with an easy-to-use environment for building, installing and running native Windows software. This page lists how to compile Luanti on Windows using MSYS2.<\/p>\n<h2 id=\"installation\">Installation<a class=\"anchor\" href=\"#installation\">#<\/a><\/h2>\n<p>First, download and install the <a href=\"https:\/\/www.msys2.org\/\">latest version of MSYS2<\/a>.<\/p>"},{"title":"World Boundaries","link":"https:\/\/docs.luanti.org\/for-players\/world-boundaries\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-players\/world-boundaries\/","description":"<h1 id=\"world-boundaries\">World Boundaries<a class=\"anchor\" href=\"#world-boundaries\">#<\/a><\/h1>\n<p>Luanti&rsquo;s world is not infinitely large. Therefore, you can theoretically reach the world boundaries if you just travel far enough. How easy it would be for a player to reach the boundary depends on what movement options are provided by the game, or if the game has allocated certain vertical or horizontal space for separate dimensions that are teleported to in gameplay.<\/p>\n<p>The world boundary is an invisible barrier which isn&rsquo;t supposed to be passed by normal means. Beyond the world boundaries, no node can be placed and there is just an endless void technically occupied by the Ignore node. Luanti&rsquo;s world is a huge cube with a side length of ca. 60000 nodes and the dimensions (X, Y and Z) ranges from \u221230912 to 30927 by default. The theoretical boundaries are at the signed 16-bit integer limit, but have been cut short in order to reduce bugs that may be exhibited at the theoretical boundary.<\/p>"},{"title":"Worlds","link":"https:\/\/docs.luanti.org\/for-players\/worlds\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/docs.luanti.org\/for-players\/worlds\/","description":"<h1 id=\"worlds\">Worlds<a class=\"anchor\" href=\"#worlds\">#<\/a><\/h1>\n<p>A <strong>world<\/strong> contains an environment and\/or building(s) you can play in. A world also includes all saved data associated with a world, like player data, mob positions, health, breath, and the like.<\/p>\n<h2 id=\"finding-worlds\">Finding worlds<a class=\"anchor\" href=\"#finding-worlds\">#<\/a><\/h2>\n<p>See the <a href=\"https:\/\/forum.luanti.org\/viewforum.php?f=12\">Maps forum<\/a> on the Luanti forums to find downloads to worlds that others have made.<\/p>\n<h2 id=\"installation\">Installation<a class=\"anchor\" href=\"#installation\">#<\/a><\/h2>\n<p><strong>To install worlds:<\/strong> You have to extract them first. Most of them are in <code>.zip<\/code>, some of them can be in <code>.7z<\/code>, <code>.rar<\/code> or <code>.tar.gz<\/code> format. To extract archive files other than <code>.zip<\/code> on Windows, you need <a href=\"https:\/\/7-zip.org\/\">7-Zip<\/a>.<\/p>"}]}}