]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - doc/lua_api.txt
Document which formspec fields are sent (#7717)
[dragonfireclient.git] / doc / lua_api.txt
index 1f103c8536126eb84b4404e7419fba78bb68144a..ca9133b1a3ba3eeabb931707d2517b78283bd02b 100644 (file)
@@ -1,5 +1,6 @@
 Minetest Lua Modding API Reference
 ==================================
+
 * More information at <http://www.minetest.net/>
 * Developer Wiki: <http://dev.minetest.net/>
 
@@ -21,16 +22,19 @@ functionality in the engine and API, and to document it here.
 
 Programming in Lua
 ------------------
+
 If you have any difficulty in understanding this, please read
 [Programming in Lua](http://www.lua.org/pil/).
 
 Startup
 -------
+
 Mods are loaded during server startup from the mod load paths by running
 the `init.lua` scripts in a shared environment.
 
 Paths
 -----
+
 * `RUN_IN_PLACE=1` (Windows release, local build)
     * `$path_user`: `<build directory>`
     * `$path_share`: `<build directory>`
@@ -93,29 +97,27 @@ Mods
 
 Mod load path
 -------------
-Paths are relative to the directories listed in the Paths section above.
+
+Paths are relative to the directories listed in the [Paths] section above.
 
 * `games/<gameid>/mods/`
 * `mods/`
 * `worlds/<worldname>/worldmods/`
 
-Mod load path for world-specific games
---------------------------------------
+World-specific games
+--------------------
+
 It is possible to include a game in a world; in this case, no mods or
 games are loaded or checked from anywhere else.
 
-This is useful for e.g. adventure worlds.
+This is useful for e.g. adventure worlds and happens if the `<worldname>/game/`
+directory exists.
 
-This happens if the following directory exists:
-
-    $world/game/
-
-Mods should then be placed in:
-
-    $world/game/mods/
+Mods should then be placed in `<worldname>/game/mods/`.
 
 Modpacks
 --------
+
 Mods can be put in a subdirectory, if the parent directory, which otherwise
 should be a mod, contains a file named `modpack.txt`. This file shall be
 empty, except for lines starting with `#`, which are comments.
@@ -140,10 +142,12 @@ Mod directory structure
     └── another
 
 ### modname
+
 The location of this directory can be fetched by using
 `minetest.get_modpath(modname)`.
 
 ### mod.conf
+
 A key-value store of mod details.
 
 * `name`: The mod name. Allows Minetest to determine the mod name even if the
@@ -158,10 +162,12 @@ A key-value store of mod details.
 Note: to support 0.4.x, please also provide depends.txt.
 
 ### `screenshot.png`
+
 A screenshot shown in the mod manager within the main menu. It should
 have an aspect ratio of 3:2 and a minimum size of 300×200 pixels.
 
 ### `depends.txt`
+
 **Deprecated:** you should use mod.conf instead.
 
 This file is used if there are no dependencies in mod.conf.
@@ -175,6 +181,7 @@ to a single modname. This means that if the specified mod
 is missing, it does not prevent this mod from being loaded.
 
 ### `description.txt`
+
 **Deprecated:** you should use mod.conf instead.
 
 This file is used if there is no description in mod.conf.
@@ -182,29 +189,35 @@ This file is used if there is no description in mod.conf.
 A file containing a description to be shown in the Mods tab of the main menu.
 
 ### `settingtypes.txt`
+
 A file in the same format as the one in builtin. It will be parsed by the
 settings menu and the settings will be displayed in the "Mods" category.
 
 ### `init.lua`
+
 The main Lua script. Running this script should register everything it
 wants to register. Subsequent execution depends on minetest calling the
 registered callbacks.
 
 `minetest.settings` can be used to read custom or existing settings at load
-time, if necessary. (See `Settings`)
+time, if necessary. (See [`Settings`])
 
 ### `models`
+
 Models for entities or meshnodes.
 
 ### `textures`, `sounds`, `media`
+
 Media files (textures, sounds, whatever) that will be transferred to the
 client and will be available for use by the mod.
 
 ### `locale`
-Translation files for the clients. (See `Translations`)
 
-Naming convention for registered textual names
-----------------------------------------------
+Translation files for the clients. (See [Translations])
+
+Naming conventions
+------------------
+
 Registered names should generally be in this format:
 
     modname:<whatever>
@@ -222,6 +235,7 @@ be used for overriding the registrations of some other mod.
 The `:` prefix can also be used for maintaining backwards compatibility.
 
 ### Example
+
 In the mod `experimental`, there is the ideal item/node/entity name `tnt`.
 So the name should be `experimental:tnt`.
 
@@ -259,42 +273,43 @@ and be able to use `/giveme stuff`.
 
 Mapgen aliases
 --------------
+
 In a game, a certain number of these must be set to tell core mapgens which
 of the game's nodes are to be used by the core mapgens. For example:
 
     minetest.register_alias("mapgen_stone", "default:stone")
 
-### Aliases needed for all mapgens except Mapgen v6
+### Aliases needed for all mapgens except Mapgen V6
 
 #### Base terrain
+
 * mapgen_stone
 * mapgen_water_source
 * mapgen_river_water_source
 
 #### Caves
+
+Not required if cave liquid nodes are set in biome definitions.
+
 * mapgen_lava_source
 
 #### Dungeons
-Only needed for registered biomes where 'node_stone' is stone:
+
+Not required if dungeon nodes are set in biome definitions.
 
 * mapgen_cobble
 * mapgen_stair_cobble
 * mapgen_mossycobble
-
-Only needed for registered biomes where 'node_stone' is desert stone:
-
 * mapgen_desert_stone
 * mapgen_stair_desert_stone
-
-Only needed for registered biomes where 'node_stone' is sandstone:
-
 * mapgen_sandstone
 * mapgen_sandstonebrick
 * mapgen_stair_sandstone_block
 
-### Aliases needed for Mapgen v6
+### Aliases needed for Mapgen V6
 
 #### Terrain and biomes
+
 * mapgen_stone
 * mapgen_water_source
 * mapgen_lava_source
@@ -310,6 +325,7 @@ Only needed for registered biomes where 'node_stone' is sandstone:
 * mapgen_ice
 
 #### Flora
+
 * mapgen_tree
 * mapgen_leaves
 * mapgen_apple
@@ -320,11 +336,19 @@ Only needed for registered biomes where 'node_stone' is sandstone:
 * mapgen_pine_needles
 
 #### Dungeons
+
 * mapgen_cobble
 * mapgen_stair_cobble
 * mapgen_mossycobble
 * mapgen_stair_desert_stone
 
+### Setting the node used in Mapgen Singlenode
+
+By default the world is filled with air nodes. To set a different node use, for
+example:
+
+    minetest.register_alias("mapgen_singlenode", "default:stone")
+
 
 
 
@@ -344,10 +368,12 @@ stripping out the file extension:
 
 Texture modifiers
 -----------------
+
 There are various texture modifiers that can be used
 to generate textures on-the-fly.
 
 ### Texture overlaying
+
 Textures can be overlaid by putting a `^` between them.
 
 Example:
@@ -359,6 +385,7 @@ The texture with the lower resolution will be automatically upscaled to
 the higher resolution texture.
 
 ### Texture grouping
+
 Textures can be grouped together by enclosing them in `(` and `)`.
 
 Example: `cobble.png^(thing1.png^thing2.png)`
@@ -367,6 +394,7 @@ A texture for `thing1.png^thing2.png` is created and the resulting
 texture is overlaid on top of `cobble.png`.
 
 ### Escaping
+
 Modifiers that accept texture names (e.g. `[combine`) accept escaping to allow
 passing complex texture names as arguments. Escaping is done with backslash and
 is required for `^` and `:`.
@@ -379,6 +407,7 @@ on top of `cobble.png`.
 ### Advanced texture modifiers
 
 #### Crack
+
 * `[crack:<n>:<p>`
 * `[cracko:<n>:<p>`
 * `[crack:<t>:<n>:<p>`
@@ -399,6 +428,7 @@ Example:
     default_cobble.png^[crack:10:1
 
 #### `[combine:<w>x<h>:<x1>,<y1>=<file1>:<x2>,<y2>=<file2>:...`
+
 * `<w>`: width
 * `<h>`: height
 * `<x>`: x position
@@ -413,6 +443,7 @@ Example:
     [combine:16x32:0,0=default_cobble.png:0,16=default_wood.png
 
 #### `[resize:<w>x<h>`
+
 Resizes the texture to the given dimensions.
 
 Example:
@@ -420,6 +451,7 @@ Example:
     default_sandstone.png^[resize:16x16
 
 #### `[opacity:<r>`
+
 Makes the base image transparent according to the given ratio.
 
 `r` must be between 0 (transparent) and 255 (opaque).
@@ -429,6 +461,7 @@ Example:
     default_sandstone.png^[opacity:127
 
 #### `[invert:<mode>`
+
 Inverts the given channels of the base image.
 Mode may contain the characters "r", "g", "b", "a".
 Only the channels that are mentioned in the mode string will be inverted.
@@ -438,6 +471,7 @@ Example:
     default_apple.png^[invert:rgb
 
 #### `[brighten`
+
 Brightens the texture.
 
 Example:
@@ -445,6 +479,7 @@ Example:
     tnt_tnt_side.png^[brighten
 
 #### `[noalpha`
+
 Makes the texture completely opaque.
 
 Example:
@@ -452,6 +487,7 @@ Example:
     default_leaves.png^[noalpha
 
 #### `[makealpha:<r>,<g>,<b>`
+
 Convert one color to transparency.
 
 Example:
@@ -459,6 +495,7 @@ Example:
     default_cobble.png^[makealpha:128,128,128
 
 #### `[transform<t>`
+
 * `<t>`: transformation(s) to apply
 
 Rotates and/or flips the image.
@@ -480,6 +517,7 @@ Example:
     default_stone.png^[transformFXR90
 
 #### `[inventorycube{<top>{<left>{<right>`
+
 Escaping does not apply here and `^` is replaced by `&` in texture names
 instead.
 
@@ -493,6 +531,7 @@ Creates an inventorycube with `grass.png`, `dirt.png^grass_side.png` and
 `dirt.png^grass_side.png` textures
 
 #### `[lowpart:<percent>:<file>`
+
 Blit the lower `<percent>`% part of `<file>` on the texture.
 
 Example:
@@ -500,6 +539,7 @@ Example:
     base.png^[lowpart:25:overlay.png
 
 #### `[verticalframe:<t>:<n>`
+
 * `<t>`: animation frame count
 * `<n>`: current animation frame
 
@@ -510,15 +550,18 @@ Example:
     default_torch_animated.png^[verticalframe:16:8
 
 #### `[mask:<file>`
+
 Apply a mask to the base image.
 
 The mask is applied using binary AND.
 
 #### `[sheet:<w>x<h>:<x>,<y>`
+
 Retrieves a tile at position x,y from the base image
 which it assumes to be a tilesheet with dimensions w,h.
 
 #### `[colorize:<color>:<ratio>`
+
 Colorize the textures with the given color.
 `<color>` is specified as a `ColorString`.
 `<ratio>` is an int ranging from 0 to 255 or the word "`alpha`".  If
@@ -530,6 +573,7 @@ the word "`alpha`", then each texture pixel will contain the RGB of
 texture pixel.
 
 #### `[multiply:<color>`
+
 Multiplies texture colors with the given color.
 `<color>` is specified as a `ColorString`.
 Result is more like what you'd expect if you put a color on top of another
@@ -538,6 +582,7 @@ don't change very much.
 
 Hardware coloring
 -----------------
+
 The goal of hardware coloring is to simplify the creation of
 colorful nodes. If your textures use the same pattern, and they only
 differ in their color (like colored wool blocks), you can use hardware
@@ -546,10 +591,12 @@ All of these methods use color multiplication (so a white-black texture
 with red coloring will result in red-black color).
 
 ### Static coloring
+
 This method is useful if you wish to create nodes/items with
 the same texture, in different colors, each in a new node/item definition.
 
 #### Global color
+
 When you register an item or node, set its `color` field (which accepts a
 `ColorSpec`) to the desired color.
 
@@ -557,6 +604,7 @@ An `ItemStack`'s static color can be overwritten by the `color` metadata
 field. If you set that field to a `ColorString`, that color will be used.
 
 #### Tile color
+
 Each tile may have an individual static color, which overwrites every
 other coloring method. To disable the coloring of a face,
 set its color to white (because multiplying with white does nothing).
@@ -564,12 +612,14 @@ You can set the `color` property of the tiles in the node's definition
 if the tile is in table format.
 
 ### Palettes
+
 For nodes and items which can have many colors, a palette is more
 suitable. A palette is a texture, which can contain up to 256 pixels.
 Each pixel is one possible color for the node/item.
 You can register one node/item, which can have up to 256 colors.
 
 #### Palette indexing
+
 When using palettes, you always provide a pixel index for the given
 node or `ItemStack`. The palette is read from left to right and from
 top to bottom. If the palette has less than 256 pixels, then it is
@@ -590,6 +640,7 @@ Examples:
 * 2x4 palette, index = 64: the pixel below the top left corner
 
 #### Using palettes with items
+
 When registering an item, set the item definition's `palette` field to
 a texture. You can also use texture modifiers.
 
@@ -598,6 +649,7 @@ stack's metadata. `palette_index` is an integer, which specifies the
 index of the pixel to use.
 
 #### Linking palettes with nodes
+
 When registering a node, set the item definition's `palette` field to
 a texture. You can also use texture modifiers.
 The node's color depends on its `param2`, so you also must set an
@@ -633,6 +685,7 @@ To colorize a node on the map, set its `param2` value (according
 to the node's paramtype2).
 
 ### Conversion between nodes in the inventory and on the map
+
 Static coloring is the same for both cases, there is no need
 for conversion.
 
@@ -662,6 +715,7 @@ Example:
     })
 
 ### Colored items in craft recipes
+
 Craft recipes only support item strings, but fortunately item strings
 can also contain metadata. Example craft recipe registration:
 
@@ -681,6 +735,7 @@ so the craft output is independent of the color of the ingredients.
 
 Soft texture overlay
 --------------------
+
 Sometimes hardware coloring is not enough, because it affects the
 whole tile. Soft texture overlays were added to Minetest to allow
 the dynamic coloring of only specific parts of the node's texture.
@@ -754,34 +809,34 @@ Examples of sound parameter tables:
 
     -- Play locationless on all clients
     {
-        gain = 1.0, -- default
-        fade = 0.0, -- default, change to a value > 0 to fade the sound in
-        pitch = 1.0, -- default
+        gain = 1.0,   -- default
+        fade = 0.0,   -- default, change to a value > 0 to fade the sound in
+        pitch = 1.0,  -- default
     }
     -- Play locationless to one player
     {
         to_player = name,
-        gain = 1.0, -- default
-        fade = 0.0, -- default, change to a value > 0 to fade the sound in
-        pitch = 1.0, -- default
+        gain = 1.0,   -- default
+        fade = 0.0,   -- default, change to a value > 0 to fade the sound in
+        pitch = 1.0,  -- default
     }
     -- Play locationless to one player, looped
     {
         to_player = name,
-        gain = 1.0, -- default
+        gain = 1.0,  -- default
         loop = true,
     }
     -- Play in a location
     {
         pos = {x = 1, y = 2, z = 3},
-        gain = 1.0, -- default
-        max_hear_distance = 32, -- default, uses an euclidean metric
+        gain = 1.0,  -- default
+        max_hear_distance = 32,  -- default, uses an euclidean metric
     }
     -- Play connected to an object, looped
     {
         object = <an ObjectRef>,
-        gain = 1.0, -- default
-        max_hear_distance = 32, -- default, uses an euclidean metric
+        gain = 1.0,  -- default
+        max_hear_distance = 32,  -- default, uses an euclidean metric
         loop = true,
     }
 
@@ -790,6 +845,7 @@ one player using `to_player = name,`
 
 `SimpleSoundSpec`
 -----------------
+
 * e.g. `""`
 * e.g. `"default_place_node"`
 * e.g. `{}`
@@ -880,16 +936,6 @@ Example: If you want to check the drawtype of a node, you could do:
     end
     local drawtype = get_nodedef_field(nodename, "drawtype")
 
-Example: `minetest.get_item_group(name, group)` has been implemented as:
-
-    function minetest.get_item_group(name, group)
-        if not minetest.registered_items[name] or not
-                minetest.registered_items[name].groups[group] then
-            return 0
-        end
-        return minetest.registered_items[name].groups[group]
-    end
-
 
 
 
@@ -904,7 +950,7 @@ The definition of a node is stored and can be accessed by using
 
     minetest.registered_nodes[node.name]
 
-See "Registered definitions".
+See [Registered definitions].
 
 Nodes are passed by value between Lua and the engine.
 They are represented by a table:
@@ -917,6 +963,7 @@ use them to store arbitrary values.
 
 Node paramtypes
 ---------------
+
 The functions of `param1` and `param2` are determined by certain fields in the
 node definition.
 
@@ -1007,10 +1054,11 @@ node definition.
       and 63 being full.
     * Liquid texture is defined using `special_tiles = {"modname_tilename.png"}`
 
-Nodes can also contain extra data. See "Node Metadata".
+Nodes can also contain extra data. See [Node Metadata].
 
 Node drawtypes
 --------------
+
 There are a bunch of different looking node types.
 
 Look for examples in `games/minimal` or `games/minetest_game`.
@@ -1029,7 +1077,7 @@ Look for examples in `games/minimal` or `games/minetest_game`.
 * `glasslike_framed`
     * All face-connected nodes are drawn as one volume within a surrounding
       frame.
-    * The frame appearence is generated from the edges of the first texture
+    * The frame appearance is generated from the edges of the first texture
       specified in `tiles`. The width of the edges used are 1/16th of texture
       size: 1 pixel for 16x16, 2 pixels for 32x32 etc.
     * The glass 'shine' (or other desired detail) on each node face is supplied
@@ -1080,7 +1128,7 @@ Look for examples in `games/minimal` or `games/minetest_game`.
 * `nodebox`
     * Often used for stairs and slabs.
     * Allows defining nodes consisting of an arbitrary number of boxes.
-    * See 'Node boxes' below for more information.
+    * See [Node boxes] below for more information.
 * `mesh`
     * Uses models for nodes.
     * Tiles should hold model materials textures.
@@ -1101,6 +1149,7 @@ Look for examples in `games/minimal` or `games/minetest_game`.
 
 Node boxes
 ----------
+
 Node selection boxes are defined using "node boxes".
 
 A nodebox is defined as any of:
@@ -1171,6 +1220,7 @@ HUD
 
 HUD element types
 -----------------
+
 The position field is used for all element types.
 
 To account for differing resolutions, the position coordinates are the
@@ -1209,6 +1259,7 @@ Displays an image on the HUD.
 * `offset`: offset in pixels from position.
 
 ### `text`
+
 Displays text on the HUD.
 
 * `scale`: Defines the bounding rectangle of the text.
@@ -1220,6 +1271,7 @@ Displays text on the HUD.
 * `offset`: offset in pixels from position.
 
 ### `statbar`
+
 Displays a horizontal bar made up of half-images.
 
 * `text`: The name of the texture that is used.
@@ -1231,6 +1283,7 @@ Displays a horizontal bar made up of half-images.
   pack image size)
 
 ### `inventory`
+
 * `text`: The name of the inventory list to be displayed.
 * `number`: Number of items in the inventory to be displayed.
 * `item`: Position of item that is selected.
@@ -1238,6 +1291,7 @@ Displays a horizontal bar made up of half-images.
 * `offset`: offset in pixels from position.
 
 ### `waypoint`
+
 Displays distance to selected world position.
 
 * `name`: The name of the waypoint.
@@ -1257,14 +1311,26 @@ Position/vector
 
     {x=num, y=num, z=num}
 
-For helper functions see "Spatial Vectors".
+For helper functions see [Spatial Vectors].
 
 `pointed_thing`
 ---------------
+
 * `{type="nothing"}`
 * `{type="node", under=pos, above=pos}`
 * `{type="object", ref=ObjectRef}`
 
+Exact pointing location (currently only `Raycast` supports these fields):
+* `pointed_thing.intersection_point`: The absolute world coordinates of the
+  point on the selection box which is pointed at. May be in the selection box
+  if the pointer is in the box too.
+* `pointed_thing.box_id`: The ID of the pointed selection box (counting starts
+  from 1).
+* `pointed_thing.intersection_normal`: Unit vector, points outwards of the
+  selected selection box. This specifies which face is pointed at.
+  Is a null vector `{x = 0, y = 0, z = 0}` when the pointer is inside the
+  selection box.
+
 
 
 
@@ -1310,16 +1376,18 @@ Items
 
 Item types
 ----------
+
 There are three kinds of items: nodes, tools and craftitems.
 
-* Node (`register_node`): A node from the world.
-* Tool (`register_tool`): A tool/weapon that can dig and damage
-  things according to `tool_capabilities`.
-* Craftitem (`register_craftitem`): A miscellaneous item.
+* Node: Can be placed in the world's voxel grid
+* Tool: Has a wear property but cannot be stacked. The default use action is to
+  dig nodes or hit objects according to its tool capabilities.
+* Craftitem: Cannot dig nodes or be placed
 
 Amount and wear
 ---------------
-All item stacks have an amount between 0 to 65535. It is 1 by
+
+All item stacks have an amount between 0 and 65535. It is 1 by
 default. Tool item stacks can not have an amount greater than 1.
 
 Tools use a wear (damage) value ranging from 0 to 65535. The
@@ -1329,6 +1397,7 @@ a higher wear. Non-tools always have a wear value of 0.
 
 Item formats
 ------------
+
 Items and item stacks can exist in three formats: Serializes, table format
 and `ItemStack`.
 
@@ -1336,6 +1405,7 @@ When an item must be passed to a function, it can usually be in any of
 these formats.
 
 ### Serialized
+
 This is called "stackstring" or "itemstring". It is a simple string with
 1-3 components: the full item identifier, an optional amount and an optional
 wear value. Syntax:
@@ -1350,6 +1420,7 @@ Examples:
 * `'default:pick_wood 1 21323'`: a wooden pickaxe, ca. 1/3 worn out
 
 ### Table format
+
 Examples:
 
 5 dirt nodes:
@@ -1365,8 +1436,9 @@ An apple:
     {name="default:apple", count=1, wear=0, metadata=""}
 
 ### `ItemStack`
+
 A native C++ format with many helper methods. Useful for converting
-between formats. See the Class reference section for details.
+between formats. See the [Class reference] section for details.
 
 
 
@@ -1381,6 +1453,7 @@ the thing without actually knowing what the thing is.
 
 Usage
 -----
+
 Groups are stored in a table, having the group names with keys and the
 group ratings as values. For example:
 
@@ -1402,29 +1475,34 @@ You can read the rating of a group for an item or a node by using
 
 Groups of items
 ---------------
+
 Groups of items can define what kind of an item it is (e.g. wool).
 
 Groups of nodes
 ---------------
+
 In addition to the general item things, groups are used to define whether
 a node is destroyable and how long it takes to destroy by a tool.
 
 Groups of entities
 ------------------
+
 For entities, groups are, as of now, used only for calculating damage.
 The rating is the percentage of damage caused by tools with this damage group.
-See "Entity damage mechanism".
+See [Entity damage mechanism].
 
     object.get_armor_groups() --> a group-rating table (e.g. {fleshy=100})
     object.set_armor_groups({fleshy=30, cracky=80})
 
 Groups of tools
 ---------------
+
 Groups in tools define which groups of nodes and entities they are
 effective towards.
 
 Groups in crafting recipes
 --------------------------
+
 An example: Make meat soup from any meat, any water and any bowl:
 
     {
@@ -1447,6 +1525,7 @@ Another example: Make red wool from white wool and red dye:
 
 Special groups
 --------------
+
 * `immortal`: Disables the group damage system for an entity
 * `punch_operable`: For entities; disables the regular damage mechanism for
   players punching it by hand or a non-tool item, so that it can do something
@@ -1472,10 +1551,13 @@ Special groups
   connect to each other
 * `slippery`: Players and items will slide on the node.
   Slipperiness rises steadily with `slippery` value, starting at 1.
+* `disable_repair`: If set to 1 for a tool, it cannot be repaired using the
+  `"toolrepair"` crafting recipe
 
 
 Known damage and digging time defining groups
 ---------------------------------------------
+
 * `crumbly`: dirt, sand
 * `cracky`: tough but crackable stuff like stone.
 * `snappy`: something that can be cut using fine tools; e.g. leaves, small
@@ -1493,6 +1575,7 @@ Known damage and digging time defining groups
 
 Examples of custom groups
 -------------------------
+
 Item groups are often used for defining, well, _groups of items_.
 
 * `meat`: any meat-kind of a thing (rating might define the size or healing
@@ -1508,6 +1591,7 @@ Item groups are often used for defining, well, _groups of items_.
 
 Digging time calculation specifics
 ----------------------------------
+
 Groups such as `crumbly`, `cracky` and `snappy` are used for this
 purpose. Rating is `1`, `2` or `3`. A higher rating for such a group implies
 faster digging time.
@@ -1530,6 +1614,7 @@ Tools
 
 Tools definition
 ----------------
+
 Tools define:
 
 * Full punch interval
@@ -1585,7 +1670,7 @@ i.e. players can more quickly click the nodes away instead of holding LMB.
 
 ### Damage groups
 
-List of damage for groups of entities. See "Entity damage mechanism".
+List of damage for groups of entities. See [Entity damage mechanism].
 
 Example definition of the capabilities of a tool
 ------------------------------------------------
@@ -1691,9 +1776,10 @@ Metadata
 
 Node Metadata
 -------------
+
 The instance of a node in the world normally only contains the three values
-mentioned in "Nodes". However, it is possible to insert extra data into a
-node. It is called "node metadata"; See `NodeMetaRef`.
+mentioned in [Nodes]. However, it is possible to insert extra data into a node.
+It is called "node metadata"; See `NodeMetaRef`.
 
 Node metadata contains two things:
 
@@ -1702,7 +1788,7 @@ Node metadata contains two things:
 
 Some of the values in the key-value store are handled specially:
 
-* `formspec`: Defines a right-click inventory menu. See "Formspec".
+* `formspec`: Defines a right-click inventory menu. See [Formspec].
 * `infotext`: Text shown on the screen when the node is pointed at
 
 Example:
@@ -1735,7 +1821,8 @@ Example:
 
 Item Metadata
 -------------
-Item stacks can store metadata too. See `ItemStackMetaRef`.
+
+Item stacks can store metadata too. See [`ItemStackMetaRef`].
 
 Item metadata only contains a key-value store.
 
@@ -1774,7 +1861,7 @@ For coloured text you can use `minetest.colorize`.
 
 WARNING: Minetest allows you to add elements to every single formspec instance
 using `player:set_formspec_prepend()`, which may be the reason backgrounds are
-appearing when you don't expect them to. See `no_prepend[]`
+appearing when you don't expect them to. See [`no_prepend[]`].
 
 Examples
 --------
@@ -1805,11 +1892,13 @@ Elements
 --------
 
 ### `size[<W>,<H>,<fixed_size>]`
+
 * Define the size of the menu in inventory slots
 * `fixed_size`: `true`/`false` (optional)
 * deprecated: `invsize[<W>,<H>;]`
 
 ### `position[<X>,<Y>]`
+
 * Must be used after `size` element.
 * Defines the position on the game window of the formspec's `anchor` point.
 * For X and Y, 0.0 and 1.0 represent opposite edges of the game window,
@@ -1819,6 +1908,7 @@ Elements
 * Defaults to the center of the game window [0.5, 0.5].
 
 ### `anchor[<X>,<Y>]`
+
 * Must be used after both `size` and `position` (if present) elements.
 * Defines the location of the anchor point within the formspec.
 * For X and Y, 0.0 and 1.0 represent opposite edges of the formspec,
@@ -1831,10 +1921,12 @@ Elements
   extending off the game window due to particular game window sizes.
 
 ### `no_prepend[]`
+
 * Must be used after the `size`, `position`, and `anchor` elements (if present).
 * Disables player:set_formspec_prepend() from applying to this formspec.
 
 ### `container[<X>,<Y>]`
+
 * Start of a container block, moves all physical elements in the container by
   (X, Y).
 * Must have matching `container_end`
@@ -1842,16 +1934,20 @@ Elements
   (child containers are relative to parent containers)
 
 ### `container_end[]`
+
 * End of a container, following elements are no longer relative to this
   container.
 
 ### `list[<inventory location>;<list name>;<X>,<Y>;<W>,<H>;]`
+
 * Show an inventory list
 
 ### `list[<inventory location>;<list name>;<X>,<Y>;<W>,<H>;<starting item index>]`
+
 * Show an inventory list
 
 ### `listring[<inventory location>;<list name>]`
+
 * Allows to create a ring of inventory lists
 * Shift-clicking on items in one element of the ring
   will send them to the next inventory list inside the ring
@@ -1859,19 +1955,23 @@ Elements
   determine the inventory where items will be sent to
 
 ### `listring[]`
+
 * Shorthand for doing `listring[<inventory location>;<list name>]`
   for the last two inventory lists added by list[...]
 
 ### `listcolors[<slot_bg_normal>;<slot_bg_hover>]`
+
 * Sets background color of slots as `ColorString`
 * Sets background color of slots on mouse hovering
 
 ### `listcolors[<slot_bg_normal>;<slot_bg_hover>;<slot_border>]`
+
 * Sets background color of slots as `ColorString`
 * Sets background color of slots on mouse hovering
 * Sets color of slots border
 
 ### `listcolors[<slot_bg_normal>;<slot_bg_hover>;<slot_border>;<tooltip_bgcolor>;<tooltip_fontcolor>]`
+
 * Sets background color of slots as `ColorString`
 * Sets background color of slots on mouse hovering
 * Sets color of slots border
@@ -1879,27 +1979,38 @@ Elements
 * Sets default font color of tooltips
 
 ### `tooltip[<gui_element_name>;<tooltip_text>;<bgcolor>;<fontcolor>]`
+
 * Adds tooltip for an element
 * `<bgcolor>` tooltip background color as `ColorString` (optional)
 * `<fontcolor>` tooltip font color as `ColorString` (optional)
 
+### `tooltip[<X>,<Y>;<W>,<H>;<tooltip_text>;<bgcolor>;<fontcolor>]`
+* Adds tooltip for an area. Other tooltips will take priority when present.
+* `<bgcolor>` tooltip background color as `ColorString` (optional)
+* `<fontcolor>` tooltip font color as `ColorString` (optional)
+
 ### `image[<X>,<Y>;<W>,<H>;<texture name>]`
+
 * Show an image
 
 ### `item_image[<X>,<Y>;<W>,<H>;<item name>]`
+
 * Show an inventory image of registered item/node
 
 ### `bgcolor[<color>;<fullscreen>]`
+
 * Sets background color of formspec as `ColorString`
 * If `true`, the background color is drawn fullscreen (does not affect the size
   of the formspec).
 
 ### `background[<X>,<Y>;<W>,<H>;<texture name>]`
+
 * Use a background. Inventory rectangles are not drawn then.
 * Example for formspec 8x4 in 16x resolution: image shall be sized
   8 times 16px  times  4 times 16px.
 
 ### `background[<X>,<Y>;<W>,<H>;<texture name>;<auto_clip>]`
+
 * Use a background. Inventory rectangles are not drawn then.
 * Example for formspec 8x4 in 16x resolution:
   image shall be sized 8 times 16px  times  4 times 16px
@@ -1907,15 +2018,17 @@ Elements
   (`x` and `y` are used as offset values, `w` and `h` are ignored)
 
 ### `pwdfield[<X>,<Y>;<W>,<H>;<name>;<label>]`
+
 * Textual password style field; will be sent to server when a button is clicked
 * When enter is pressed in field, fields.key_enter_field will be sent with the
   name of this field.
 * Fields are a set height, but will be vertically centred on `H`
 * `name` is the name of the field as returned in fields to `on_receive_fields`
 * `label`, if not blank, will be text printed on the top left above the field
-* See field_close_on_enter to stop enter closing the formspec
+* See `field_close_on_enter` to stop enter closing the formspec
 
 ### `field[<X>,<Y>;<W>,<H>;<name>;<label>;<default>]`
+
 * Textual field; will be sent to server when a button is clicked
 * When enter is pressed in field, `fields.key_enter_field` will be sent with
   the name of this field.
@@ -1929,6 +2042,7 @@ Elements
 * See `field_close_on_enter` to stop enter closing the formspec
 
 ### `field[<name>;<label>;<default>]`
+
 * As above, but without position/size units
 * When enter is pressed in field, `fields.key_enter_field` will be sent with
   the name of this field.
@@ -1938,36 +2052,43 @@ Elements
 * See `field_close_on_enter` to stop enter closing the formspec
 
 ### `field_close_on_enter[<name>;<close_on_enter>]`
+
 * <name> is the name of the field
 * if <close_on_enter> is false, pressing enter in the field will submit the
   form but not close it.
 * defaults to true when not specified (ie: no tag for a field)
 
 ### `textarea[<X>,<Y>;<W>,<H>;<name>;<label>;<default>]`
+
 * Same as fields above, but with multi-line input
 * If the text overflows, a vertical scrollbar is added.
 * If the name is empty, the textarea is read-only and
   the background is not shown, which corresponds to a multi-line label.
 
 ### `label[<X>,<Y>;<label>]`
+
 * The label formspec element displays the text set in `label`
   at the specified position.
 * The text is displayed directly without automatic line breaking,
   so label should not be used for big text chunks.
 
 ### `vertlabel[<X>,<Y>;<label>]`
+
 * Textual label drawn vertically
 * `label` is the text on the label
 
 ### `button[<X>,<Y>;<W>,<H>;<name>;<label>]`
+
 * Clickable button. When clicked, fields will be sent.
 * Fixed button height. It will be vertically centred on `H`
 * `label` is the text on the button
 
 ### `image_button[<X>,<Y>;<W>,<H>;<texture name>;<name>;<label>]`
+
 * `texture name` is the filename of an image
 
 ### `image_button[<X>,<Y>;<W>,<H>;<texture name>;<name>;<label>;<noclip>;<drawborder>;<pressed texture name>]`
+
 * `texture name` is the filename of an image
 * `noclip=true` means the image button doesn't need to be within specified
   formsize.
@@ -1975,17 +2096,21 @@ Elements
 * `pressed texture name` is the filename of an image on pressed state
 
 ### `item_image_button[<X>,<Y>;<W>,<H>;<item name>;<name>;<label>]`
+
 * `item name` is the registered name of an item/node,
   tooltip will be made out of its description
   to override it use tooltip element
 
 ### `button_exit[<X>,<Y>;<W>,<H>;<name>;<label>]`
+
 * When clicked, fields will be sent and the form will quit.
 
 ### `image_button_exit[<X>,<Y>;<W>,<H>;<texture name>;<name>;<label>]`
+
 * When clicked, fields will be sent and the form will quit.
 
 ### `textlist[<X>,<Y>;<W>,<H>;<name>;<listelem 1>,<listelem 2>,...,<listelem n>]`
+
 * Scrollable item list showing arbitrary text elements
 * `name` fieldname sent to server on doubleclick value is current selected
   element.
@@ -1994,6 +2119,7 @@ Elements
     * if you want a listelement to start with "#" write "##".
 
 ### `textlist[<X>,<Y>;<W>,<H>;<name>;<listelem 1>,<listelem 2>,...,<listelem n>;<selected idx>;<transparent>]`
+
 * Scrollable itemlist showing arbitrary text elements
 * `name` fieldname sent to server on doubleclick value is current selected
   element.
@@ -2005,6 +2131,7 @@ Elements
   (main menu: `core.explode_textlist_event`).
 
 ### `tabheader[<X>,<Y>;<name>;<caption 1>,<caption 2>,...,<caption n>;<current_tab>;<transparent>;<draw_border>]`
+
 * Show a tab**header** at specific position (ignores formsize)
 * `name` fieldname data is transferred to Lua
 * `caption 1`...: name shown on top of tab
@@ -2013,11 +2140,13 @@ Elements
 * `draw_border` (optional): draw border
 
 ### `box[<X>,<Y>;<W>,<H>;<color>]`
+
 * Simple colored box
 * `color` is color specified as a `ColorString`.
   If the alpha component is left blank, the box will be semitransparent.
 
 ### `dropdown[<X>,<Y>;<W>;<name>;<item 1>,<item 2>, ...,<item n>;<selected idx>]`
+
 * Show a dropdown field
 * **Important note**: There are two different operation modes:
     1. handle directly on change (only changed dropdown is submitted)
@@ -2029,12 +2158,14 @@ Elements
 * Index of currently selected dropdown item
 
 ### `checkbox[<X>,<Y>;<name>;<label>;<selected>]`
+
 * Show a checkbox
 * `name` fieldname data is transferred to Lua
 * `label` to be shown left of checkbox
 * `selected` (optional): `true`/`false`
 
 ### `scrollbar[<X>,<Y>;<W>,<H>;<orientation>;<name>;<value>]`
+
 * Show a scrollbar
 * There are two ways to use it:
     1. handle the changed event (only changed scrollbar is available)
@@ -2046,6 +2177,7 @@ Elements
   (main menu: `core.explode_scrollbar_event`).
 
 ### `table[<X>,<Y>;<W>,<H>;<name>;<cell 1>,<cell 2>,...,<cell n>;<selected idx>]`
+
 * Show scrollable table using options defined by the previous `tableoptions[]`
 * Displays cells as defined by the previous `tablecolumns[]`
 * `name`: fieldname sent to server on row select or doubleclick
@@ -2055,6 +2187,7 @@ Elements
   (main menu: `core.explode_table_event`).
 
 ### `tableoptions[<opt 1>;<opt 2>;...]`
+
 * Sets options for `table[]`
 * `color=#RRGGBB`
     * default text color (`ColorString`), defaults to `#FFFFFF`
@@ -2071,6 +2204,7 @@ Elements
     * only useful when there is a column of type "tree"
 
 ### `tablecolumns[<type 1>,<opt 1a>,<opt 1b>,...;<type 2>,<opt 2a>,<opt 2b>;...]`
+
 * Sets columns for `table[]`
 * Types: `text`, `image`, `color`, `indent`, `tree`
     * `text`:   show cell contents as text
@@ -2113,6 +2247,7 @@ Inventory
 
 Inventory locations
 -------------------
+
 * `"context"`: Selected node metadata (deprecated: `"current_name"`)
 * `"current_player"`: Player to whom the menu is shown
 * `"player:<name>"`: Any player
@@ -2121,10 +2256,13 @@ Inventory locations
 
 Player Inventory lists
 ----------------------
+
 * `main`: list containing the default inventory
 * `craft`: list containing the craft input
-* `craftpreview`: list containing the craft output
+* `craftpreview`: list containing the craft prediction
+* `craftresult`: list containing the crafted output
 * `hand`: list containing an override for the empty hand
+    * Is not created automatically, use `InvRef:set_size`
 
 
 
@@ -2134,6 +2272,7 @@ Colors
 
 `ColorString`
 -------------
+
 `#RGB` defines a color in hexadecimal format.
 
 `#RGBA` defines a color in hexadecimal format and alpha channel.
@@ -2150,6 +2289,7 @@ representing the alpha value must (always) be two hexadecimal digits.
 
 `ColorSpec`
 -----------
+
 A ColorSpec specifies a 32-bit color. It can be written in any of the following
 forms:
 
@@ -2314,6 +2454,7 @@ translation files.
 
 Translating a string
 --------------------
+
 Two functions are provided to translate strings: `minetest.translate` and
 `minetest.get_translator`.
 
@@ -2369,6 +2510,7 @@ operations such as `minetest.colorize` which are also concatenation.
 
 Translation file format
 -----------------------
+
 A translation file has the suffix `.[lang].tr`, where `[lang]` is the language
 it corresponds to. It must be put into the `locale` subdirectory of the mod.
 The file should be a text file, with the following format:
@@ -2378,12 +2520,13 @@ The file should be a text file, with the following format:
 * All other empty lines or lines beginning with `#` are ignored.
 * Other lines should be in the format `original=translated`. Both `original`
   and `translated` can contain escape sequences beginning with `@` to insert
-  arguments, literal `@`, `=` or newline (See ### Escapes below).
+  arguments, literal `@`, `=` or newline (See [Escapes] below).
   There must be no extraneous whitespace around the `=` or at the beginning or
   the end of the line.
 
 Escapes
 -------
+
 Strings that need to be translated can contain several escapes, preceded by `@`.
 
 * `@@` acts as a literal `@`.
@@ -2413,6 +2556,7 @@ structure of ores.
 
 Structure of perlin noise
 -------------------------
+
 An 'octave' is a simple noise generator that outputs a value between -1 and 1.
 The smooth wavy noise it generates has a single characteristic scale, almost
 like a 'wavelength', so on its own does not create fine detail.
@@ -2434,18 +2578,22 @@ noise = offset + scale * (octave1 +
 
 Noise Parameters
 ----------------
+
 Noise Parameters are commonly called `NoiseParams`.
 
 ### `offset`
+
 After the multiplication by `scale` this is added to the result and is the final
 step in creating the noise value.
 Can be positive or negative.
 
 ### `scale`
+
 Once all octaves have been combined, the result is multiplied by this.
 Can be positive or negative.
 
 ### `spread`
+
 For octave1, this is roughly the change of input value needed for a very large
 variation in the noise value generated by octave1. It is almost like a
 'wavelength' for the wavy noise variation.
@@ -2458,6 +2606,7 @@ stretched or compressed in the desired axes.
 Values are positive numbers.
 
 ### `seed`
+
 This is a whole number that determines the entire pattern of the noise
 variation. Altering it enables different noise patterns to be created.
 With other parameters equal, different seeds produce different noise patterns
@@ -2472,6 +2621,7 @@ When used in mapgen this is actually a 'seed offset', it is added to the
 different pattern in different worlds.
 
 ### `octaves`
+
 The number of simple noise generators that are combined.
 A whole number, 1 or more.
 Each additional octave adds finer detail to the noise but also increases the
@@ -2487,6 +2637,7 @@ nodes, octaves will be 6 because the 'wavelengths' of the octaves will be
 Warning: If the 'wavelength' of any octave falls below 1 an error will occur.
 
 ### `persistence`
+
 Each additional octave has an amplitude that is the amplitude of the previous
 octave multiplied by `persistence`, to reduce the amplitude of finer details,
 as is often helpful and natural to do so.
@@ -2500,6 +2651,7 @@ This may need to be tuned when altering `lacunarity`; when doing so consider
 that a common medium value is 1 / lacunarity.
 
 ### `lacunarity`
+
 Each additional octave has a 'wavelength' that is the 'wavelength' of the
 previous octave multiplied by 1 / lacunarity, to create finer detail.
 'lacunarity' is often 2.0 so 'wavelength' often halves per octave.
@@ -2509,14 +2661,17 @@ Values below 2.0 create higher quality noise at the expense of requiring more
 octaves to cover a paticular range of 'wavelengths'.
 
 ### `flags`
+
 Leave this field unset for no special handling.
 Currently supported are `defaults`, `eased` and `absvalue`:
 
 #### `defaults`
+
 Specify this if you would like to keep auto-selection of eased/not-eased while
 specifying some other flags.
 
 #### `eased`
+
 Maps noise gradient values onto a quintic S-curve before performing
 interpolation. This results in smooth, rolling noise.
 Disable this (`noeased`) for sharp-looking noise with a slightly gridded
@@ -2527,6 +2682,7 @@ Easing a 3D noise significantly increases the noise calculation load, so use
 with restraint.
 
 #### `absvalue`
+
 The absolute value of each octave's noise variation is used when combining the
 octaves. The final perlin noise variation is created as follows:
 
@@ -2537,6 +2693,7 @@ noise = offset + scale * (abs(octave1) +
                           ...)
 
 ### Format example
+
 For 2D or 3D perlin noise or perlin noise maps:
 
     np_terrain = {
@@ -2561,11 +2718,13 @@ Ores
 
 Ore types
 ---------
+
 These tell in what manner the ore is generated.
 
 All default ores are of the uniformly-distributed scatter type.
 
 ### `scatter`
+
 Randomly chooses a location and generates a cluster of ore.
 
 If `noise_params` is specified, the ore will be placed if the 3D perlin noise
@@ -2573,6 +2732,7 @@ at that point is greater than the `noise_threshold`, giving the ability to
 create a non-equal distribution of ore.
 
 ### `sheet`
+
 Creates a sheet of ore in a blob shape according to the 2D perlin noise
 described by `noise_params` and `noise_threshold`. This is essentially an
 improved version of the so-called "stratus" ore seen in some unofficial mods.
@@ -2594,6 +2754,7 @@ The ore parameters `clust_scarcity` and `clust_num_ores` are ignored for this
 ore type.
 
 ### `puff`
+
 Creates a sheet of ore in a cloud-like puff shape.
 
 As with the `sheet` ore type, the size and shape of puffs are described by
@@ -2604,11 +2765,13 @@ The vertical top and bottom displacement of each puff are determined by the
 noise parameters `np_puff_top` and `np_puff_bottom`, respectively.
 
 ### `blob`
+
 Creates a deformed sphere of ore according to 3d perlin noise described by
 `noise_params`. The maximum size of the blob is `clust_size`, and
 `clust_scarcity` has the same meaning as with the `scatter` type.
 
 ### `vein`
+
 Creates veins of ore varying in density by according to the intersection of two
 instances of 3d perlin noise with different seeds, both described by
 `noise_params`.
@@ -2639,6 +2802,7 @@ The following is a decent set of parameters to work from:
 computationally expensive than any other ore.
 
 ### `stratum`
+
 Creates a single undulating ore stratum that is continuous across mapchunk
 borders and horizontally spans the world.
 
@@ -2669,17 +2833,20 @@ The parameters `clust_num_ores`, `clust_size`, `noise_threshold` and
 
 Ore attributes
 --------------
-See section "Flag Specifier Format".
+
+See section [Flag Specifier Format].
 
 Currently supported flags:
 `puff_cliffs`, `puff_additive_composition`.
 
 ### `puff_cliffs`
+
 If set, puff ore generation will not taper down large differences in
 displacement when approaching the edge of a puff. This flag has no effect for
 ore types other than `puff`.
 
 ### `puff_additive_composition`
+
 By default, when noise described by `np_puff_top` or `np_puff_bottom` results
 in a negative displacement, the sub-column at that point is not generated. With
 this attribute set, puff ore generation will instead generate the absolute
@@ -2696,6 +2863,7 @@ The varying types of decorations that can be placed.
 
 `simple`
 --------
+
 Creates a 1 times `H` times 1 column of a specified node (or a random node from
 a list, if a decoration list is specified). Can specify a certain node it must
 spawn next to, such as water or lava, for example. Can also generate a
@@ -2705,6 +2873,7 @@ papyri, waterlilies and so on.
 
 `schematic`
 -----------
+
 Copies a box of `MapNodes` from a specified schematic file (or raw description).
 Can specify a probability of a node randomly appearing when placed.
 This decoration type is intended to be used for multi-node sized discrete
@@ -2718,6 +2887,7 @@ Schematics
 
 Schematic specifier
 --------------------
+
 A schematic specifier identifies a schematic by either a filename to a
 Minetest Schematic file (`.mts`) or through raw data supplied through Lua,
 in the form of a table.  This table specifies the following fields:
@@ -2752,7 +2922,8 @@ About probability values:
 
 Schematic attributes
 --------------------
-See section "Flag Specifier Format".
+
+See section [Flag Specifier Format].
 
 Currently supported flags: `place_center_x`, `place_center_y`, `place_center_z`,
                            `force_placement`.
@@ -2771,6 +2942,7 @@ Lua Voxel Manipulator
 
 About VoxelManip
 ----------------
+
 VoxelManip is a scripting interface to the internal 'Map Voxel Manipulator'
 facility. The purpose of this object is for fast, low-level, bulk access to
 reading and writing Map content. As such, setting map nodes through VoxelManip
@@ -2796,6 +2968,7 @@ is faster than a VoxelManip for a 3x3x3 node cube or smaller.
 
 Using VoxelManip
 ----------------
+
 A VoxelManip object can be created any time using either:
 `VoxelManip([p1, p2])`, or `minetest.get_voxel_manip([p1, p2])`.
 
@@ -2819,11 +2992,11 @@ Nodes in a VoxelManip object may also be read in bulk to a flat array table
 using:
 
 * `VoxelManip:get_data()` for node content (in Content ID form, see section
-  'Content IDs'),
+  [Content IDs]),
 * `VoxelManip:get_light_data()` for node light levels, and
 * `VoxelManip:get_param2_data()` for the node type-dependent "param2" values.
 
-See section 'Flat array format' for more details.
+See section [Flat array format] for more details.
 
 It is very important to understand that the tables returned by any of the above
 three functions represent a snapshot of the VoxelManip's internal state at the
@@ -2836,7 +3009,7 @@ Once the bulk data has been edited to your liking, the internal VoxelManip
 state can be set using:
 
 * `VoxelManip:set_data()` for node content (in Content ID form, see section
-  'Content IDs'),
+  [Content IDs]),
 * `VoxelManip:set_light_data()` for node light levels, and
 * `VoxelManip:set_param2_data()` for the node type-dependent `param2` values.
 
@@ -2849,6 +3022,7 @@ changes can be committed back to the map by calling `VoxelManip:write_to_map()`
 
 
 ### Flat array format
+
 Let
     `Nx = p2.X - p1.X + 1`,
     `Ny = p2.Y - p1.Y + 1`, and
@@ -2859,19 +3033,17 @@ including the value of the expression `Nx * Ny * Nz`.
 
 Positions offset from p1 are present in the array with the format of:
 
-```
-[
-    (0, 0, 0),   (1, 0, 0),   (2, 0, 0),   ... (Nx, 0, 0),
-    (0, 1, 0),   (1, 1, 0),   (2, 1, 0),   ... (Nx, 1, 0),
-    ...
-    (0, Ny, 0),  (1, Ny, 0),  (2, Ny, 0),  ... (Nx, Ny, 0),
-    (0, 0, 1),   (1, 0, 1),   (2, 0, 1),   ... (Nx, 0, 1),
-    ...
-    (0, Ny, 2),  (1, Ny, 2),  (2, Ny, 2),  ... (Nx, Ny, 2),
-    ...
-    (0, Ny, Nz), (1, Ny, Nz), (2, Ny, Nz), ... (Nx, Ny, Nz)
-]
-```
+    [
+        (0, 0, 0),   (1, 0, 0),   (2, 0, 0),   ... (Nx, 0, 0),
+        (0, 1, 0),   (1, 1, 0),   (2, 1, 0),   ... (Nx, 1, 0),
+        ...
+        (0, Ny, 0),  (1, Ny, 0),  (2, Ny, 0),  ... (Nx, Ny, 0),
+        (0, 0, 1),   (1, 0, 1),   (2, 0, 1),   ... (Nx, 0, 1),
+        ...
+        (0, Ny, 2),  (1, Ny, 2),  (2, Ny, 2),  ... (Nx, Ny, 2),
+        ...
+        (0, Ny, Nz), (1, Ny, Nz), (2, Ny, Nz), ... (Nx, Ny, Nz)
+    ]
 
 and the array index for a position p contained completely in p1..p2 is:
 
@@ -2879,10 +3051,11 @@ and the array index for a position p contained completely in p1..p2 is:
 
 Note that this is the same "flat 3D array" format as
 `PerlinNoiseMap:get3dMap_flat()`.
-VoxelArea objects (see section 'VoxelArea') can be used to simplify calculation
+VoxelArea objects (see section [`VoxelArea`]) can be used to simplify calculation
 of the index for a single point in a flat VoxelManip array.
 
 ### Content IDs
+
 A Content ID is a unique integer identifier for a specific node type.
 These IDs are used by VoxelManip in place of the node name string for
 `VoxelManip:get_data()` and `VoxelManip:set_data()`. You can use
@@ -2900,6 +3073,7 @@ The following builtin node types have their Content IDs defined as constants:
 * `minetest.CONTENT_IGNORE`:  ID for "ignore" nodes
 
 ### Mapgen VoxelManip objects
+
 Inside of `on_generated()` callbacks, it is possible to retrieve the same
 VoxelManip object used by the core's Map Generator (commonly abbreviated
 Mapgen). Most of the rules previously described still apply but with a few
@@ -2924,6 +3098,7 @@ differences:
   `VoxelManip:calc_lighting()` or `VoxelManip:set_lighting()`.
 
 ### Other API functions operating on a VoxelManip
+
 If any VoxelManip contents were set to a liquid node,
 `VoxelManip:update_liquids()` must be called for these liquid nodes to begin
 flowing. It is recommended to call this function only after having written all
@@ -2940,6 +3115,7 @@ directly on the map at the specified position, it will place the schematic
 inside the VoxelManip.
 
 ### Notes
+
 * Attempting to read data from a VoxelManip object before map is read will
   result in a zero-length array table for `VoxelManip:get_data()`, and an
   "ignore" node at any position for `VoxelManip:get_node_at()`.
@@ -2958,6 +3134,7 @@ inside the VoxelManip.
 
 Methods
 -------
+
 * `read_from_map(p1, p2)`:  Loads a chunk of map into the VoxelManip object
   containing the region formed by `p1` and `p2`.
     * returns actual emerged `pmin`, actual emerged `pmax`
@@ -3023,11 +3200,13 @@ Methods
 
 `VoxelArea`
 -----------
+
 A helper class for voxel areas.
 It can be created via `VoxelArea:new{MinEdge=pmin, MaxEdge=pmax}`.
 The coordinates are *inclusive*, like most other things in Minetest.
 
 ### Methods
+
 * `getExtent()`: returns a 3D vector containing the size of the area formed by
   `MinEdge` and `MaxEdge`.
 * `getVolume()`: returns the volume of the area formed by `MinEdge` and
@@ -3222,6 +3401,7 @@ Key for special L-System symbols used in axioms
 
 Example
 -------
+
 Spawn a small apple tree:
 
     pos = {x=230,y=20,z=4}
@@ -3282,7 +3462,9 @@ Utilities
           no_chat_message_prediction = true,
           -- The transparency channel of textures can optionally be used on
           -- objects (ie: players and lua entities)
-          object_use_texture_alpha = true
+          object_use_texture_alpha = true,
+          -- Object selectionbox is settable independently from collisionbox
+          object_independent_selectionbox = true,
       }
 
 * `minetest.has_feature(arg)`: returns `boolean, missing_features`
@@ -3342,6 +3524,7 @@ Utilities
 
 Logging
 -------
+
 * `minetest.debug(...)`
     * Equivalent to `minetest.log(table.concat({...}, "\t"))`
 * `minetest.log([level,] text)`
@@ -3350,6 +3533,7 @@ Logging
 
 Registration functions
 ----------------------
+
 Call these functions only at load time!
 
 * `minetest.register_entity(name, entity definition)`
@@ -3361,7 +3545,7 @@ Call these functions only at load time!
 * `minetest.unregister_item(name)`
 * `minetest.register_alias(name, convert_to)`
     * Also use this to set the 'mapgen aliases' needed in a game for the core
-    * mapgens. See 'Mapgen aliases' section above.
+    * mapgens. See [Mapgen aliases] section above.
 * `minetest.register_alias_force(name, convert_to)`
 * `minetest.register_craft(recipe)`
     * Check recipe table syntax for different types below.
@@ -3371,7 +3555,7 @@ Call these functions only at load time!
       ignored. For input use the same recipe table syntax as for
       `minetest.register_craft(recipe)`. For output specify only the item,
       without a quantity.
-    * If no erase candidate could be found, Lua exception will be thrown.
+    * Returns false if no erase candidate could be found, otherwise returns true.
     * **Warning**! The type field ("shaped", "cooking" or any other) will be
       ignored if the recipe contains output. Erasing is then done independently
       from the crafting method.
@@ -3388,6 +3572,7 @@ Call these functions only at load time!
 
 Global callback registration functions
 --------------------------------------
+
 Call these functions only at load time!
 
 * `minetest.register_globalstep(func(dtime))`
@@ -3482,7 +3667,11 @@ Call these functions only at load time!
     * Return `true` to mark the message as handled, which means that it will
       not be sent to other players.
 * `minetest.register_on_player_receive_fields(func(player, formname, fields))`
-    * Called when a button is pressed in player's inventory form
+    * Called when a button is pressed in player's inventory form, when form
+      values are submitted or when the form is actively closed by the player.
+    * Fields are sent for formspec elements which define a field, and the "quit"
+      field is sent when actively closing the form by mouse click, keypress or
+      through a button_exit[] element.
     * Newest functions are called first
     * If function returns `true`, remaining functions are not called
 * `minetest.register_on_craft(func(itemstack, player, old_craft_grid, craft_inv))`
@@ -3542,6 +3731,7 @@ Call these functions only at load time!
 
 Other registration functions
 ----------------------------
+
 * `minetest.register_chatcommand(cmd, chatcommand definition)`
     * Adds definition to `minetest.registered_chatcommands`
 * `minetest.override_chatcommand(name, redefinition)`
@@ -3571,6 +3761,7 @@ Other registration functions
 
 Setting-related
 ---------------
+
 * `minetest.settings`: Settings object containing all of the settings from the
   main config file (`minetest.conf`).
 * `minetest.setting_get_pos(name)`: Loads a setting from the main settings and
@@ -3578,6 +3769,7 @@ Setting-related
 
 Authentication
 --------------
+
 * `minetest.string_to_privs(str)`: returns `{priv1=true,...}`
 * `minetest.privs_to_string(privs)`: returns `"priv1,priv2,..."`
     * Convert between two privilege representations
@@ -3608,7 +3800,7 @@ Authentication
     * The player needs to be online for this to be successful.
 
 * `minetest.get_auth_handler()`: Return the currently active auth handler
-    * See the `Authentication handler definition`
+    * See the [Authentication handler definition]
     * Use this to e.g. get the authentication data for a player:
       `local auth_data = minetest.get_auth_handler().get_auth(playername)`
 * `minetest.notify_authentication_modified(name)`
@@ -3627,11 +3819,13 @@ handler.
 
 Chat
 ----
+
 * `minetest.chat_send_all(text)`
 * `minetest.chat_send_player(name, text)`
 
 Environment access
 ------------------
+
 * `minetest.set_node(pos, node)`
 * `minetest.add_node(pos, node)`: alias to `minetest.set_node`
     * Set node at position `pos`
@@ -3743,7 +3937,7 @@ Environment access
     * Returns the decoration ID number for the provided decoration name string,
       or `nil` on failure.
 * `minetest.get_mapgen_object(objectname)`
-    * Return requested mapgen object if available (see "Mapgen objects")
+    * Return requested mapgen object if available (see [Mapgen objects])
 * `minetest.get_heat(pos)`
     * Returns the heat at the position, or `nil` on failure.
 * `minetest.get_humidity(pos)`
@@ -3837,19 +4031,19 @@ Environment access
     * If `callback` is a valid Lua function, this will be called for each block
       emerged.
     * The function signature of callback is:
-        * `function EmergeAreaCallback(blockpos, action, calls_remaining, param)`
-            * `blockpos` is the *block* coordinates of the block that had been
-              emerged.
-            * `action` could be one of the following constant values:
-                * `minetest.EMERGE_CANCELLED`
-                * `minetest.EMERGE_ERRORED`
-                * `minetest.EMERGE_FROM_MEMORY`
-                * `minetest.EMERGE_FROM_DISK`
-                * `minetest.EMERGE_GENERATED`
-            * `calls_remaining` is the number of callbacks to be expected after
-              this one.
-            * `param` is the user-defined parameter passed to emerge_area (or
-              nil if the parameter was absent).
+      `function EmergeAreaCallback(blockpos, action, calls_remaining, param)`
+        * `blockpos` is the *block* coordinates of the block that had been
+          emerged.
+        * `action` could be one of the following constant values:
+            * `minetest.EMERGE_CANCELLED`
+            * `minetest.EMERGE_ERRORED`
+            * `minetest.EMERGE_FROM_MEMORY`
+            * `minetest.EMERGE_FROM_DISK`
+            * `minetest.EMERGE_GENERATED`
+        * `calls_remaining` is the number of callbacks to be expected after
+          this one.
+        * `param` is the user-defined parameter passed to emerge_area (or
+          nil if the parameter was absent).
 * `minetest.delete_area(pos1, pos2)`
     * delete all mapblocks in the area from pos1 to pos2, inclusive
 * `minetest.line_of_sight(pos1, pos2)`: returns `boolean, pos`
@@ -3927,6 +4121,7 @@ Environment access
 
 Mod channels
 ------------
+
 You can find mod channels communication scheme in `doc/mod_channels.png`.
 
 * `minetest.mod_channel_join(channel_name)`
@@ -3936,6 +4131,7 @@ You can find mod channels communication scheme in `doc/mod_channels.png`.
 
 Inventory
 ---------
+
 `minetest.get_inventory(location)`: returns an `InvRef`
 
 * `location` = e.g.
@@ -3944,19 +4140,22 @@ Inventory
     * `{type="detached", name="creative"}`
 * `minetest.create_detached_inventory(name, callbacks, [player_name])`: returns
   an `InvRef`.
-    * `callbacks`: See "Detached inventory callbacks"
+    * `callbacks`: See [Detached inventory callbacks]
     * `player_name`: Make detached inventory available to one player
       exclusively, by default they will be sent to every player (even if not
       used).
       Note that this parameter is mostly just a workaround and will be removed
       in future releases.
     * Creates a detached inventory. If it already exists, it is cleared.
+* `minetest.remove_detached_inventory(name)`
+    * Returns a `boolean` indicating whether the removal succeeded.
 * `minetest.do_item_eat(hp_change, replace_with_item, itemstack, user, pointed_thing)`:
   returns left over ItemStack.
     * See `minetest.item_eat` and `minetest.register_on_item_eat`
 
 Formspec
 --------
+
 * `minetest.show_formspec(playername, formname, formspec)`
     * `playername`: name of player to show formspec
     * `formname`: name passed to `on_player_receive_fields` callbacks.
@@ -3995,6 +4194,7 @@ Formspec
 
 Item handling
 -------------
+
 * `minetest.inventorycube(img1, img2, img3)`
     * Returns a string for making an image of a cube (useful as an item image)
 * `minetest.get_pointed_thing_position(pointed_thing, above)`
@@ -4087,6 +4287,7 @@ Item handling
 
 Rollback
 --------
+
 * `minetest.rollback_get_node_actions(pos, range, seconds, limit)`:
   returns `{{actor, pos, time, oldnode, newnode}, ...}`
     * Find who has done something to a node, or near a node
@@ -4098,6 +4299,7 @@ Rollback
 
 Defaults for the `on_*` item definition functions
 -------------------------------------------------
+
 These functions return the leftover itemstack.
 
 * `minetest.item_place_node(itemstack, placer, pointed_thing[, param2, prevent_after_place])`
@@ -4125,6 +4327,7 @@ These functions return the leftover itemstack.
 
 Defaults for the `on_punch` and `on_dig` node definition callbacks
 ------------------------------------------------------------------
+
 * `minetest.node_punch(pos, node, puncher, pointed_thing)`
     * Calls functions registered by `minetest.register_on_punchnode()`
 * `minetest.node_dig(pos, node, digger)`
@@ -4133,6 +4336,7 @@ Defaults for the `on_punch` and `on_dig` node definition callbacks
 
 Sounds
 ------
+
 * `minetest.sound_play(spec, parameters)`: returns a handle
     * `spec` is a `SimpleSoundSpec`
     * `parameters` is a sound parameter table
@@ -4146,12 +4350,14 @@ Sounds
 
 Timing
 ------
+
 * `minetest.after(time, func, ...)`
     * Call the function `func` after `time` seconds, may be fractional
     * Optional: Variable number of arguments that are passed to `func`
 
 Server
 ------
+
 * `minetest.request_shutdown([message],[reconnect],[delay])`: request for
   server shutdown. Will display `message` to clients.
     * `reconnect` == true displays a reconnect button
@@ -4178,6 +4384,7 @@ Server
 
 Bans
 ----
+
 * `minetest.get_ban_list()`: returns the ban list
   (same as `minetest.get_ban_description("")`).
 * `minetest.get_ban_description(ip_or_name)`: returns ban description (string)
@@ -4188,6 +4395,7 @@ Bans
 
 Particles
 ---------
+
 * `minetest.add_particle(particle definition)`
     * Deprecated: `minetest.add_particle(pos, velocity, acceleration,
       expirationtime, size, collisiondetection, texture, playername)`
@@ -4212,6 +4420,7 @@ Particles
 
 Schematics
 ----------
+
 * `minetest.create_schematic(p1, p2, probability_list, filename, slice_prob_list)`
     * Create a schematic from the volume of map specified by the box formed by
       p1 and p2.
@@ -4242,7 +4451,7 @@ Schematics
     * Saves schematic in the Minetest Schematic format to filename.
 
 * `minetest.place_schematic(pos, schematic, rotation, replacements, force_placement, flags)`
-    * Place the schematic specified by schematic (see: Schematic specifier) at
+    * Place the schematic specified by schematic (see [Schematic specifier]) at
       `pos`.
     * `rotation` can equal `"0"`, `"90"`, `"180"`, `"270"`, or `"random"`.
     * If the `rotation` parameter is omitted, the schematic is not rotated.
@@ -4277,7 +4486,7 @@ Schematics
 
 * `minetest.serialize_schematic(schematic, format, options)`
     * Return the serialized schematic specified by schematic
-      (see: Schematic specifier)
+      (see [Schematic specifier])
     * in the `format` of either "mts" or "lua".
     * "mts" - a string containing the binary MTS data used in the MTS file
       format.
@@ -4293,6 +4502,7 @@ Schematics
 
 HTTP Requests
 -------------
+
 * `minetest.request_http_api()`:
     * returns `HTTPApiTable` containing http functions if the calling mod has
       been granted access by being listed in the `secure.http_mods` or
@@ -4316,14 +4526,16 @@ HTTP Requests
 
 Storage API
 -----------
+
 * `minetest.get_mod_storage()`:
     * returns reference to mod private `StorageRef`
     * must be called during mod load time
 
 Misc.
 -----
+
 * `minetest.get_connected_players()`: returns list of `ObjectRefs`
-* `minetest.is_player(o)`: boolean, whether `o` is a player
+* `minetest.is_player(obj)`: boolean, whether `obj` is a player
 * `minetest.player_exists(name)`: boolean, whether player exists
   (regardless of online status)
 * `minetest.hud_replace_builtin(name, hud_definition)`
@@ -4491,6 +4703,7 @@ Misc.
 
 Global objects
 --------------
+
 * `minetest.env`: `EnvRef` of the server environment and world.
     * Any function in the minetest namespace can be called using the syntax
       `minetest.env:somefunction(somearguments)`
@@ -4499,6 +4712,7 @@ Global objects
 
 Global tables
 -------------
+
 * `minetest.registered_items`
     * Map of registered items, indexed by name
 * `minetest.registered_nodes`
@@ -4532,6 +4746,7 @@ Sorted alphabetically.
 
 `AreaStore`
 -----------
+
 A fast access data structure to store areas, and find areas near a given
 position or area.
 Every area has a `data` string attribute to store additional information.
@@ -4541,6 +4756,7 @@ If you chose the parameter-less constructor, a fast implementation will be
 automatically chosen for you.
 
 ### Methods
+
 * `get_area(id, include_borders, include_data)`: returns the area with the id
   `id`.
   (optional) Boolean values `include_borders` and `include_data` control what's
@@ -4572,14 +4788,13 @@ automatically chosen for you.
 * `set_cache_params(params)`: sets params for the included prefiltering cache.
   Calling invalidates the cache, so that its elements have to be newly
   generated.
-    * `params`:
-      {
-        enabled = boolean,     -- whether to enable, default true
-        block_radius = number, -- the radius (in nodes) of the areas the cache
-                                  generates prefiltered lists for, minimum 16,
-                                  default 64.
-        limit = number,        -- the cache's size, minimum 20, default 1000
-      }
+    * `params` is a table with the following fields:
+
+          enabled = boolean,   -- Whether to enable, default true
+          block_radius = int,  -- The radius (in nodes) of the areas the cache
+                               -- generates prefiltered lists for, minimum 16,
+                               -- default 64
+          limit = int,         -- The cache size, minimum 20, default 1000
 * `to_string()`: Experimental. Returns area store serialized as a (binary)
   string.
 * `to_file(filename)`: Experimental. Like `to_string()`, but writes the data to
@@ -4592,9 +4807,11 @@ automatically chosen for you.
 
 `InvRef`
 --------
+
 An `InvRef` is a reference to an inventory.
 
 ### Methods
+
 * `is_empty(listname)`: return `true` if list is empty
 * `get_size(listname)`: get size of a list
 * `set_size(listname, size)`: set size of a list
@@ -4626,12 +4843,14 @@ An `InvRef` is a reference to an inventory.
 
 `ItemStack`
 -----------
+
 An `ItemStack` is a stack of items.
 
 It can be created via `ItemStack(x)`, where x is an `ItemStack`,
 an itemstring, a table or `nil`.
 
 ### Methods
+
 * `is_empty()`: returns `true` if stack is empty.
 * `get_name()`: returns item name (e.g. `"default:stone"`).
 * `set_name(item_name)`: returns a boolean indicating whether the item was
@@ -4674,10 +4893,12 @@ an itemstring, a table or `nil`.
 
 `ItemStackMetaRef`
 ------------------
+
 ItemStack metadata: reference extra data and functionality stored in a stack.
 Can be obtained via `item:get_meta()`.
 
 ### Methods
+
 * All methods in MetaDataRef
 * `set_tool_capabilities([tool_capabilities])`
     * Overrides the item's tool capabilities
@@ -4686,9 +4907,11 @@ Can be obtained via `item:get_meta()`.
 
 `MetaDataRef`
 -------------
-See `StorageRef`, `NodeMetaRef`, `ItemStackMetaRef`, and `PlayerMetaRef`.
+
+See [`StorageRef`], [`NodeMetaRef`], [`ItemStackMetaRef`], and [`PlayerMetaRef`].
 
 ### Methods
+
 * `contains(key)`: Returns true if key present, otherwise false.
     * Returns `nil` when the MetaData is inexistent.
 * `get(key)`: Returns `nil` if key not present, else the stored string.
@@ -4703,16 +4926,18 @@ See `StorageRef`, `NodeMetaRef`, `ItemStackMetaRef`, and `PlayerMetaRef`.
     * `inventory`: `{list1 = {}, ...}}` (NodeMetaRef only)
 * `from_table(nil or {})`
     * Any non-table value will clear the metadata
-    * See "Node Metadata" for an example
+    * See [Node Metadata] for an example
     * returns `true` on success
 * `equals(other)`
     * returns `true` if this metadata has the same key-value pairs as `other`
 
 `ModChannel`
 ------------
+
 An interface to use mod channels on client and server
 
 ### Methods
+
 * `leave()`: leave the mod channel.
     * Server leaves channel `channel_name`.
     * No more incoming or outgoing messages can be sent to this channel from
@@ -4727,10 +4952,12 @@ An interface to use mod channels on client and server
 
 `NodeMetaRef`
 -------------
+
 Node metadata: reference extra data and functionality stored in a node.
 Can be obtained via `minetest.get_meta(pos)`.
 
 ### Methods
+
 * All methods in MetaDataRef
 * `get_inventory()`: returns `InvRef`
 * `mark_as_private(name or {name1, name2, ...})`: Mark specific vars as private
@@ -4741,10 +4968,12 @@ Can be obtained via `minetest.get_meta(pos)`.
 
 `NodeTimerRef`
 --------------
+
 Node Timers: a high resolution persistent per-node timer.
 Can be gotten via `minetest.get_node_timer(pos)`.
 
 ### Methods
+
 * `set(timeout,elapsed)`
     * set a timer's state
     * `timeout` is in seconds, and supports fractional values (0.1 etc)
@@ -4766,15 +4995,17 @@ Can be gotten via `minetest.get_node_timer(pos)`.
 
 `ObjectRef`
 -----------
+
 Moving things in the game are generally these.
 
 This is basically a reference to a C++ `ServerActiveObject`
 
 ### Methods
+
 * `remove()`: remove object (after returning from Lua)
     * Note: Doesn't work on players, use `minetest.kick_player` instead
 * `get_pos()`: returns `{x=num, y=num, z=num}`
-* `set_pos(pos)`; `pos`=`{x=num, y=num, z=num}`
+* `set_pos(pos)`: `pos`=`{x=num, y=num, z=num}`
 * `move_to(pos, continuous=false)`: interpolated move
 * `punch(puncher, time_from_last_punch, tool_capabilities, direction)`
     * `puncher` = another `ObjectRef`,
@@ -4832,6 +5063,7 @@ This is basically a reference to a C++ `ServerActiveObject`
       }
 
 #### LuaEntitySAO-only (no-op for other objects)
+
 * `set_velocity(vel)`
     * `vel` is a vector, e.g. `{x=0.0, y=2.3, z=1.0}`
 * `add_velocity(vel)`
@@ -4842,6 +5074,9 @@ This is basically a reference to a C++ `ServerActiveObject`
 * `set_acceleration(acc)`
     * `acc` is a vector
 * `get_acceleration()`: returns the acceleration, a vector
+* `set_rotation(rot)`
+    * `rot` is a vector (radians)
+* `get_rotation()` : returns the rotation, a vector (radians)
 * `set_yaw(radians)`
 * `get_yaw()`: returns number in radians
 * `set_texture_mod(mod)`
@@ -4859,6 +5094,7 @@ This is basically a reference to a C++ `ServerActiveObject`
 * `get_luaentity()`
 
 #### Player-only (no-op for other objects)
+
 * `get_player_name()`: returns `""` if is not a player
 * `get_player_velocity()`: returns `nil` if is not a player, otherwise a
   table {x, y, z} representing the player's instantaneous velocity in nodes/s
@@ -4888,7 +5124,7 @@ This is basically a reference to a C++ `ServerActiveObject`
     * values:
         * `0`: player is drowning
         * max: bubbles bar is not shown
-        * See Object properties for more information
+        * See [Object properties] for more information
 * `set_attribute(attribute, value)`:  DEPRECATED, use get_meta() instead
     * Sets an extra attribute with value on player.
     * `value` must be a string, or a number which will be converted to a
@@ -4938,18 +5174,21 @@ This is basically a reference to a C++ `ServerActiveObject`
     * element `stat` values:
       `position`, `name`, `scale`, `text`, `number`, `item`, `dir`
 * `hud_get(id)`: gets the HUD element definition structure of the specified ID
-* `hud_set_flags(flags)`: sets specified HUD flags to `true`/`false`
-    * `flags`: (is visible) `hotbar`, `healthbar`, `crosshair`, `wielditem`,
-      `breathbar`, `minimap`, `minimap_radar`
-    * pass a table containing a `true`/`false` value of each flag to be set or
-      unset.
-    * if a flag equals `nil`, the flag is not modified
-    * note that setting `minimap` modifies the client's permission to view the
-      minimap - the client may locally elect to not view the minimap.
-    * minimap `radar` is only usable when `minimap` is true
-* `hud_get_flags()`: returns a table containing status of hud flags
-    * returns `{hotbar=true, healthbar=true, crosshair=true, wielditem=true,
-      breathbar=true, minimap=true, minimap_radar=true}`
+* `hud_set_flags(flags)`: sets specified HUD flags of player.
+    * `flags`: A table with the following fields set to boolean values
+        * hotbar
+        * healthbar
+        * crosshair
+        * wielditem
+        * breathbar
+        * minimap
+        * minimap_radar
+    * If a flag equals `nil`, the flag is not modified
+    * `minimap`: Modifies the client's permission to view the minimap.
+      The client may locally elect to not view the minimap.
+    * `minimap_radar` is only usable when `minimap` is true
+* `hud_get_flags()`: returns a table of player HUD flags with boolean values.
+    * See `hud_set_flags` for a list of flags that can be toggled.
 * `hud_set_hotbar_itemcount(count)`: sets number of items in builtin hotbar
     * `count`: number of items, must be between `1` and `23`
 * `hud_get_hotbar_itemcount`: returns number of visible items
@@ -4990,11 +5229,11 @@ This is basically a reference to a C++ `ServerActiveObject`
 * `set_local_animation(stand/idle, walk, dig, walk+dig, frame_speed=frame_speed)`:
   set animation for player model in third person view
 
-      set_local_animation({x=0, y=79}, -- stand/idle animation key frames
-          {x=168, y=187}, -- walk animation key frames
-          {x=189, y=198}, -- dig animation key frames
-          {x=200, y=219}, -- walk+dig animation key frames
-          frame_speed=30): -- animation frame speed
+      set_local_animation({x=0, y=79},  -- stand/idle animation key frames
+          {x=168, y=187},  -- walk animation key frames
+          {x=189, y=198},  -- dig animation key frames
+          {x=200, y=219},  -- walk+dig animation key frames
+          frame_speed=30)  -- animation frame speed
 * `get_local_animation()`: returns stand, walk, dig, dig+walk tables and
   `frame_speed`.
 * `set_eye_offset({x=0,y=0,z=0},{x=0,y=0,z=0})`: defines offset value for
@@ -5005,6 +5244,7 @@ This is basically a reference to a C++ `ServerActiveObject`
 
 `PcgRandom`
 -----------
+
 A 32-bit pseudorandom number generator.
 Uses PCG32, an algorithm of the permuted congruential generator family,
 offering very strong randomness.
@@ -5012,6 +5252,7 @@ offering very strong randomness.
 It can be created via `PcgRandom(seed)` or `PcgRandom(seed, sequence)`.
 
 ### Methods
+
 * `next()`: return next integer random number [`-2147483648`...`2147483647`]
 * `next(min, max)`: return next integer random number [`min`...`max`]
 * `rand_normal_dist(min, max, num_trials=6)`: return normally distributed
@@ -5023,6 +5264,7 @@ It can be created via `PcgRandom(seed)` or `PcgRandom(seed, sequence)`.
 
 `PerlinNoise`
 -------------
+
 A perlin noise generator.
 It can be created via `PerlinNoise(seed, octaves, persistence, scale)`
 or `PerlinNoise(noiseparams)`.
@@ -5030,11 +5272,13 @@ Alternatively with `minetest.get_perlin(seeddiff, octaves, persistence, scale)`
 or `minetest.get_perlin(noiseparams)`.
 
 ### Methods
+
 * `get_2d(pos)`: returns 2D noise value at `pos={x=,y=}`
 * `get_3d(pos)`: returns 3D noise value at `pos={x=,y=,z=}`
 
 `PerlinNoiseMap`
 ----------------
+
 A fast, bulk perlin noise generator.
 
 It can be created via `PerlinNoiseMap(noiseparams, size)` or
@@ -5049,6 +5293,7 @@ not nil, this table will be used to store the result instead of creating a new
 table.
 
 ### Methods
+
 * `get_2d_map(pos)`: returns a `<size.x>` times `<size.y>` 2D array of 2D noise
   with values starting at `pos={x=,y=}`
 * `get_3d_map(pos)`: returns a `<size.x>` times `<size.y>` times `<size.z>`
@@ -5076,22 +5321,26 @@ table.
 
 `PlayerMetaRef`
 ---------------
+
 Player metadata.
 Uses the same method of storage as the deprecated player attribute API, so
 data there will also be in player meta.
 Can be obtained using `player:get_meta()`.
 
 ### Methods
+
 * All methods in MetaDataRef
 
 `PseudoRandom`
 --------------
+
 A 16-bit pseudorandom number generator.
 Uses a well-known LCG algorithm introduced by K&R.
 
 It can be created via `PseudoRandom(seed)`.
 
 ### Methods
+
 * `next()`: return next integer random number [`0`...`32767`]
 * `next(min, max)`: return next integer random number [`min`...`max`]
     * `((max - min) == 32767) or ((max-min) <= 6553))` must be true
@@ -5099,8 +5348,14 @@ It can be created via `PseudoRandom(seed)`.
 
 `Raycast`
 ---------
+
 A raycast on the map. It works with selection boxes.
-Can be used as an iterator in a for loop.
+Can be used as an iterator in a for loop as:
+
+    local ray = Raycast(...)
+    for pointed_thing in ray do
+        ...
+    end
 
 The map is loaded as the ray advances. If the map is modified after the
 `Raycast` is created, the changes may or may not have an effect on the object.
@@ -5114,27 +5369,32 @@ It can be created via `Raycast(pos1, pos2, objects, liquids)` or
 * `liquids`: if false, liquid nodes won't be returned. Default is false.
 
 ### Methods
-* `next()`: returns a `pointed_thing`
+
+* `next()`: returns a `pointed_thing` with exact pointing location
     * Returns the next thing pointed by the ray or nil.
 
 `SecureRandom`
 --------------
+
 Interface for the operating system's crypto-secure PRNG.
 
 It can be created via `SecureRandom()`.  The constructor returns nil if a
 secure random device cannot be found on the system.
 
 ### Methods
+
 * `next_bytes([count])`: return next `count` (default 1, capped at 2048) many
   random bytes, as a string.
 
 `Settings`
 ----------
+
 An interface to read config files in the format of `minetest.conf`.
 
 It can be created via `Settings(filename)`.
 
 ### Methods
+
 * `get(key)`: returns a value
 * `get_bool(key, [default])`: returns a boolean
     * `default` is the value returned if `key` is not found.
@@ -5158,10 +5418,12 @@ It can be created via `Settings(filename)`.
 
 `StorageRef`
 ------------
+
 Mod metadata: per mod metadata, saved automatically.
 Can be obtained via `minetest.get_mod_storage()` during load time.
 
 ### Methods
+
 * All methods in MetaDataRef
 
 
@@ -5173,105 +5435,134 @@ Definition tables
 Object properties
 -----------------
 
-Used by `ObjectRef` methods.
+Used by `ObjectRef` methods. Part of an Entity definition.
 
     {
         hp_max = 1,
-    --  ^ For players: Defaults to `minetest.PLAYER_MAX_HP_DEFAULT`
+        -- For players only. Defaults to `minetest.PLAYER_MAX_HP_DEFAULT`.
+
         breath_max = 0,
-    --  ^ For players only. Defaults to `minetest.PLAYER_MAX_BREATH_DEFAULT`
+        -- For players only. Defaults to `minetest.PLAYER_MAX_BREATH_DEFAULT`.
+
         zoom_fov = 0.0,
-    --  ^ For players only. Zoom FOV in degrees.
-    --    Note that zoom loads and/or generates world beyond the server's
-    --    maximum send and generate distances, so acts like a telescope.
-    --    Smaller zoomFOV values increase the distance loaded and/or generated.
-    --    Defaults to 15 in creative mode, 0 in survival mode.
-    --    zoom_fov = 0 disables zooming for the player.
+        -- For players only. Zoom FOV in degrees.
+        -- Note that zoom loads and/or generates world beyond the server's
+        -- maximum send and generate distances, so acts like a telescope.
+        -- Smaller zoom_fov values increase the distance loaded/generated.
+        -- Defaults to 15 in creative mode, 0 in survival mode.
+        -- zoom_fov = 0 disables zooming for the player.
+
         eye_height = 1.625,
-    --  ^ For players only. Camera height above feet position in nodes.
-    --    Defaults to 1.625.
+        -- For players only. Camera height above feet position in nodes.
+        -- Defaults to 1.625.
+
         physical = true,
+
         collide_with_objects = true,
-    --  ^ Collide with other objects if physical = true.
+        -- Collide with other objects if physical = true
+
         weight = 5,
-        collisionbox = {-0.5, 0.0, -0.5, 0.5, 1.0, 0.5},
+
+        collisionbox = {-0.5, 0.0, -0.5, 0.5, 1.0, 0.5},  -- Default
         selectionbox = {-0.5, 0.0, -0.5, 0.5, 1.0, 0.5},
-    --  ^ Default, uses collision box dimensions when not set.
-    --  ^ For both boxes: {xmin, ymin, zmin, xmax, ymax, zmax} in nodes from
-    --    object position.
+        -- Selection box uses collision box dimensions when not set.
+        -- For both boxes: {xmin, ymin, zmin, xmax, ymax, zmax} in nodes from
+        -- object position.
+
         pointable = true,
-    --  ^ Overrides selection box when false.
+        -- Overrides selection box when false
+
         visual = "cube" / "sprite" / "upright_sprite" / "mesh" / "wielditem",
-    --  ^ "cube" is a node-sized cube.
-    --  ^ "sprite" is a flat texture always facing the player.
-    --  ^ "upright_sprite" is a vertical flat texture.
-    --  ^ "mesh" uses the defined mesh model.
-    --  ^ "wielditem" is used for dropped items
-    --    (see builtin/game/item_entity.lua).
-    --    For this use 'textures = {itemname}'.
-    --    If the item has a 'wield_image' the object will be an extrusion of
-    --    that, otherwise:
-    --    If 'itemname' is a cubic node or nodebox the object will appear
-    --    identical to 'itemname'.
-    --    If 'itemname' is a plantlike node the object will be an extrusion of
-    --    its texture.
-    --    Otherwise for non-node items, the object will be an extrusion of
-    --    'inventory_image'.
+        -- "cube" is a node-sized cube.
+        -- "sprite" is a flat texture always facing the player.
+        -- "upright_sprite" is a vertical flat texture.
+        -- "mesh" uses the defined mesh model.
+        -- "wielditem" is used for dropped items.
+        --   (see builtin/game/item_entity.lua).
+        --   For this use 'textures = {itemname}'.
+        --   If the item has a 'wield_image' the object will be an extrusion of
+        --   that, otherwise:
+        --   If 'itemname' is a cubic node or nodebox the object will appear
+        --   identical to 'itemname'.
+        --   If 'itemname' is a plantlike node the object will be an extrusion
+        --   of its texture.
+        --   Otherwise for non-node items, the object will be an extrusion of
+        --   'inventory_image'.
+
         visual_size = {x = 1, y = 1},
-    --  ^ `x` multiplies horizontal (X and Z) visual size.
-    --  ^ `y` multiplies vertical (Y) visual size.
+        -- `x` multiplies horizontal (X and Z) visual size.
+        -- `y` multiplies vertical (Y) visual size.
+
         mesh = "model",
+
         textures = {},
-    --  ^ Number of required textures depends on visual.
-    --  ^ "cube" uses 6 textures in the way a node does.
-    --  ^ "sprite" uses 1 texture.
-    --  ^ "upright_sprite" uses 2 textures: {front, back}.
-    --  ^ "wielditem" expects 'textures = {itemname}' (see 'visual' above).
+        -- Number of required textures depends on visual.
+        -- "cube" uses 6 textures in the way a node does.
+        -- "sprite" uses 1 texture.
+        -- "upright_sprite" uses 2 textures: {front, back}.
+        -- "wielditem" expects 'textures = {itemname}' (see 'visual' above).
+
         colors = {},
-    --  ^ Number of required colors depends on visual.
+        -- Number of required colors depends on visual
+
         use_texture_alpha = false,
-    --  ^ Use texture's alpha channel, excludes "upright_sprite" and "wielditem"
-       --  ^ Note: currently causes visual issues when viewed through other
-       --  ^ semi-transparent materials such as water.
+        -- Use texture's alpha channel.
+        -- Excludes "upright_sprite" and "wielditem".
+        -- Note: currently causes visual issues when viewed through other
+        -- semi-transparent materials such as water.
+
         spritediv = {x = 1, y = 1},
-    --  ^ Used with spritesheet textures for animation and/or frame selection
-    --    according to position relative to player.
-    --  ^ Defines the number of columns and rows in the spritesheet:
-    --    {columns, rows}.
+        -- Used with spritesheet textures for animation and/or frame selection
+        -- according to position relative to player.
+        -- Defines the number of columns and rows in the spritesheet:
+        -- {columns, rows}.
+
         initial_sprite_basepos = {x = 0, y = 0},
-    --  ^ Used with spritesheet textures.
-    --  ^ Defines the {column, row} position of the initially used frame in the
-    --    spritesheet.
+        -- Used with spritesheet textures.
+        -- Defines the {column, row} position of the initially used frame in the
+        -- spritesheet.
+
         is_visible = true,
+
         makes_footstep_sound = false,
+
         automatic_rotate = 0,
-    --  ^ Set constant rotation in radians per second, positive or negative.
-    --  ^ Set to 0 to disable constant rotation.
+        -- Set constant rotation in radians per second, positive or negative.
+        -- Set to 0 to disable constant rotation.
+
         stepheight = 0,
+
         automatic_face_movement_dir = 0.0,
-    --  ^ Automatically set yaw to movement direction, offset in degrees,
-    --    'false' to disable.
+        -- Automatically set yaw to movement direction, offset in degrees.
+        -- 'false' to disable.
+
         automatic_face_movement_max_rotation_per_sec = -1,
-    --  ^ Limit automatic rotation to this value in degrees per second,
-    --    value < 0 no limit.
+        -- Limit automatic rotation to this value in degrees per second.
+        -- No limit if value < 0.
+
         backface_culling = true,
-    --  ^ Set to false to disable backface_culling for model.
+        -- Set to false to disable backface_culling for model
+
         glow = 0,
-    --  ^ Add this much extra lighting when calculating texture color.
-    --    Value < 0 disables light's effect on texture color.
-    --    For faking self-lighting, UI style entities, or programmatic coloring
-    --    in mods.
+        -- Add this much extra lighting when calculating texture color.
+        -- Value < 0 disables light's effect on texture color.
+        -- For faking self-lighting, UI style entities, or programmatic coloring
+        -- in mods.
+
         nametag = "",
-    --  ^ By default empty, for players their name is shown if empty.
-        nametag_color = <color>,
-    --  ^ Sets color of nametag as ColorSpec.
+        -- By default empty, for players their name is shown if empty
+
+        nametag_color = <ColorSpec>,
+        -- Sets color of nametag
+
         infotext = "",
-    --  ^ By default empty, text to be shown when pointed at object.
+        -- By default empty, text to be shown when pointed at object
+
         static_save = true,
-    --  ^ If false, never save this object statically. It will simply be
-    --    deleted when the block gets unloaded.
-    --    The get_staticdata() callback is never called then.
-    --    Defaults to 'true'
+        -- If false, never save this object statically. It will simply be
+        -- deleted when the block gets unloaded.
+        -- The get_staticdata() callback is never called then.
+        -- Defaults to 'true'.
     }
 
 Entity definition
@@ -5280,21 +5571,31 @@ Entity definition
 Used by `minetest.register_entity`.
 
     {
-    --  Deprecated: Everything in object properties is read directly from here
-
-        initial_properties = --[[<initial object properties>]],
+        initial_properties = {
+            visual = "mesh",
+            mesh = "boats_boat.obj",
+            ...,
+        },
+        -- A table of object properties, see the `Object properties` section.
+        -- Object properties being read directly from the entity definition
+        -- table is deprecated. Define object properties in this
+        -- `initial_properties` table instead.
 
         on_activate = function(self, staticdata, dtime_s),
+
         on_step = function(self, dtime),
+
         on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir),
+
         on_rightclick = function(self, clicker),
+
         get_staticdata = function(self),
-    --  ^ Called sometimes; the string returned is passed to on_activate when
-    --    the entity is re-activated from static state
+        -- Called sometimes; the string returned is passed to on_activate when
+        -- the entity is re-activated from static state
 
         _custom_field = whatever,
-    --  ^ You can define arbitrary member variables here (see item definition
-    --    for more info) by using a '_' prefix.
+        -- You can define arbitrary member variables here (see Item definition
+        -- for more info) by using a '_' prefix
     }
 
 ABM (ActiveBlockModifier) definition
@@ -5304,34 +5605,40 @@ Used by `minetest.register_abm`.
 
     {
         label = "Lava cooling",
-        ^ Descriptive label for profiling purposes (optional).
-          Definitions with identical labels will be listed as one.
+        -- Descriptive label for profiling purposes (optional).
+        -- Definitions with identical labels will be listed as one.
+
         nodenames = {"default:lava_source"},
-        ^ Apply `action` function to these nodes.
-        ^ `group:groupname` can also be used here.
+        -- Apply `action` function to these nodes.
+        -- `group:groupname` can also be used here.
+
         neighbors = {"default:water_source", "default:water_flowing"},
-        ^ Only apply `action` to nodes that have one of, or any
-          combination of, these neighbors.
-        ^ If left out or empty, any neighbor will do.
-        ^ `group:groupname` can also be used here.
+        -- Only apply `action` to nodes that have one of, or any
+        -- combination of, these neighbors.
+        -- If left out or empty, any neighbor will do.
+        -- `group:groupname` can also be used here.
+
         interval = 1.0,
-        ^ Operation interval in seconds.
+        -- Operation interval in seconds
+
         chance = 1,
-        ^ Chance of triggering `action` per-node per-interval is 1.0 / this
-          value.
+        -- Chance of triggering `action` per-node per-interval is 1.0 / this
+        -- value
+
         catch_up = true,
-        ^ If true, catch-up behaviour is enabled: The `chance` value is
-          temporarily reduced when returning to an area to simulate time lost
-          by the area being unattended. Note that the `chance` value can often
-          be reduced to 1.
+        -- If true, catch-up behaviour is enabled: The `chance` value is
+        -- temporarily reduced when returning to an area to simulate time lost
+        -- by the area being unattended. Note that the `chance` value can often
+        -- be reduced to 1.
+
         action = function(pos, node, active_object_count, active_object_count_wider),
-        ^ Function triggered for each qualifying node.
-        ^ `active_object_count` is number of active objects in the node's
-          mapblock.
-        ^ `active_object_count_wider` is number of active objects in the node's
-          mapblock plus all 26 neighboring mapblocks. If any neighboring
-          mapblocks are unloaded an estmate is calculated for them based on
-          loaded mapblocks.
+        -- Function triggered for each qualifying node.
+        -- `active_object_count` is number of active objects in the node's
+        -- mapblock.
+        -- `active_object_count_wider` is number of active objects in the node's
+        -- mapblock plus all 26 neighboring mapblocks. If any neighboring
+        -- mapblocks are unloaded an estmate is calculated for them based on
+        -- loaded mapblocks.
     }
 
 LBM (LoadingBlockModifier) definition
@@ -5341,20 +5648,80 @@ Used by `minetest.register_lbm`.
 
     {
         label = "Upgrade legacy doors",
-    --  ^ Descriptive label for profiling purposes (optional).
-    --    Definitions with identical labels will be listed as one.
+        -- Descriptive label for profiling purposes (optional).
+        -- Definitions with identical labels will be listed as one.
+
         name = "modname:replace_legacy_door",
+
         nodenames = {"default:lava_source"},
-    --  ^ List of node names to trigger the LBM on.
-    --    Also non-registered nodes will work.
-    --    Groups (as of group:groupname) will work as well.
+        -- List of node names to trigger the LBM on.
+        -- Also non-registered nodes will work.
+        -- Groups (as of group:groupname) will work as well.
+
         run_at_every_load = false,
-    --  ^ Whether to run the LBM's action every time a block gets loaded,
-    --    and not just for blocks that were saved last time before LBMs were
-    --    introduced to the world.
+        -- Whether to run the LBM's action every time a block gets loaded,
+        -- and not just for blocks that were saved last time before LBMs were
+        -- introduced to the world.
+
         action = func(pos, node),
     }
 
+Tile definition
+---------------
+
+* `"image.png"`
+* `{name="image.png", animation={Tile Animation definition}}`
+* `{name="image.png", backface_culling=bool, tileable_vertical=bool,
+  tileable_horizontal=bool, align_style="node"/"world"/"user", scale=int}`
+    * backface culling enabled by default for most nodes
+    * tileable flags are info for shaders, how they should treat texture
+      when displacement mapping is used.
+      Directions are from the point of view of the tile texture,
+      not the node it's on.
+    * align style determines whether the texture will be rotated with the node
+      or kept aligned with its surroundings. "user" means that client
+      setting will be used, similar to `glasslike_framed_optional`.
+      Note: supported by solid nodes and nodeboxes only.
+    * scale is used to make texture span several (exactly `scale`) nodes,
+      instead of just one, in each direction. Works for world-aligned
+      textures only.
+      Note that as the effect is applied on per-mapblock basis, `16` should
+      be equally divisible by `scale` or you may get wrong results.
+* `{name="image.png", color=ColorSpec}`
+    * the texture's color will be multiplied with this color.
+    * the tile's color overrides the owning node's color in all cases.
+* deprecated, yet still supported field names:
+    * `image` (name)
+
+Tile animation definition
+-------------------------
+
+    {
+        type = "vertical_frames",
+
+        aspect_w = 16,
+        -- Width of a frame in pixels
+
+        aspect_h = 16,
+        -- Height of a frame in pixels
+
+        length = 3.0,
+        -- Full loop length
+    }
+
+    {
+        type = "sheet_2d",
+
+        frames_w = 5,
+        -- Width in number of frames
+
+        frames_h = 3,
+        -- Height in number of frames
+
+        frame_length = 0.5,
+        -- Length of a single frame
+    }
+
 Item definition
 ---------------
 
@@ -5363,32 +5730,43 @@ Used by `minetest.register_node`, `minetest.register_craftitem`, and
 
     {
         description = "Steel Axe",
-        groups = {}, -- key = name, value = rating; rating = 1..3.
-                        if rating not applicable, use 1.
-                        e.g. {wool = 1, fluffy = 3}
-                            {soil = 2, outerspace = 1, crumbly = 1}
-                            {bendy = 2, snappy = 1},
-                            {hard = 1, metal = 1, spikes = 1}
+
+        groups = {},
+        -- key = name, value = rating; rating = 1..3.
+        -- If rating not applicable, use 1.
+        -- e.g. {wool = 1, fluffy = 3}
+        --      {soil = 2, outerspace = 1, crumbly = 1}
+        --      {bendy = 2, snappy = 1},
+        --      {hard = 1, metal = 1, spikes = 1}
+
         inventory_image = "default_tool_steelaxe.png",
+
         inventory_overlay = "overlay.png",
-        ^ An overlay which does not get colorized.
+        -- An overlay which does not get colorized
+
         wield_image = "",
+
         wield_overlay = "",
+
         palette = "",
-        --[[
-        ^ An image file containing the palette of a node.
-        ^ You can set the currently used color as the
-        ^ "palette_index" field of the item stack metadata.
-        ^ The palette is always stretched to fit indices
-        ^ between 0 and 255, to ensure compatibility with
-        ^ "colorfacedir" and "colorwallmounted" nodes.
-        ]]
+        -- An image file containing the palette of a node.
+        -- You can set the currently used color as the "palette_index" field of
+        -- the item stack metadata.
+        -- The palette is always stretched to fit indices between 0 and 255, to
+        -- ensure compatibility with "colorfacedir" and "colorwallmounted" nodes.
+
         color = "0xFFFFFFFF",
-        ^ The color of the item. The palette overrides this.
+        -- The color of the item. The palette overrides this.
+
         wield_scale = {x = 1, y = 1, z = 1},
+
         stack_max = 99,
+
         range = 4.0,
+
         liquids_pointable = false,
+
+        -- See "Tools" section
         tool_capabilities = {
             full_punch_interval = 1.0,
             max_drop_level = 0,
@@ -5399,376 +5777,353 @@ Used by `minetest.register_node`, `minetest.register_craftitem`, and
             },
             damage_groups = {groupname = damage},
         },
+
         node_placement_prediction = nil,
-        --[[
-        ^ If nil and item is node, prediction is made automatically
-        ^ If nil and item is not a node, no prediction is made
-        ^ If "" and item is anything, no prediction is made
-        ^ Otherwise should be name of node which the client immediately places
-          on ground when the player places the item. Server will always update
-          actual result to client in a short moment.
-        ]]
+        -- If nil and item is node, prediction is made automatically.
+        -- If nil and item is not a node, no prediction is made.
+        -- If "" and item is anything, no prediction is made.
+        -- Otherwise should be name of node which the client immediately places
+        -- on ground when the player places the item. Server will always update
+        -- actual result to client in a short moment.
+
         node_dig_prediction = "air",
-        --[[
-        ^ if "", no prediction is made
-        ^ if "air", node is removed
-        ^ Otherwise should be name of node which the client immediately places
-          upon digging. Server will always update actual result shortly.
-        ]]
+        -- if "", no prediction is made.
+        -- if "air", node is removed.
+        -- Otherwise should be name of node which the client immediately places
+        -- upon digging. Server will always update actual result shortly.
+
         sound = {
-            breaks = "default_tool_break", -- tools only
-            place = --[[<SimpleSoundSpec>]],
+            breaks = "default_tool_break",  -- tools only
+            place = <SimpleSoundSpec>,
         },
 
         on_place = func(itemstack, placer, pointed_thing),
-        --[[
-        ^ Shall place item and return the leftover itemstack
-        ^ The placer may be any ObjectRef or nil.
-        ^ default: minetest.item_place ]]
+        -- Shall place item and return the leftover itemstack.
+        -- The placer may be any ObjectRef or nil.
+        -- default: minetest.item_place
+
         on_secondary_use = func(itemstack, user, pointed_thing),
-        --[[
-        ^ Same as on_place but called when pointing at nothing.
-        ^ The user may be any ObjectRef or nil.
-        ^ pointed_thing : always { type = "nothing" }
-        ]]
+        -- Same as on_place but called when pointing at nothing.
+        -- The user may be any ObjectRef or nil.
+        -- pointed_thing: always { type = "nothing" }
+
         on_drop = func(itemstack, dropper, pos),
-        --[[
-        ^ Shall drop item and return the leftover itemstack
-        ^ The dropper may be any ObjectRef or nil.
-        ^ default: minetest.item_drop ]]
+        -- Shall drop item and return the leftover itemstack.
+        -- The dropper may be any ObjectRef or nil.
+        -- default: minetest.item_drop
+
         on_use = func(itemstack, user, pointed_thing),
-        --[[
-        ^  default: nil
-        ^ Function must return either nil if no item shall be removed from
-          inventory, or an itemstack to replace the original itemstack.
-          e.g. itemstack:take_item(); return itemstack
-        ^ Otherwise, the function is free to do what it wants.
-        ^ The user may be any ObjectRef or nil.
-        ^ The default functions handle regular use cases.
-        ]]
+        -- default: nil
+        -- Function must return either nil if no item shall be removed from
+        -- inventory, or an itemstack to replace the original itemstack.
+        -- e.g. itemstack:take_item(); return itemstack
+        -- Otherwise, the function is free to do what it wants.
+        -- The user may be any ObjectRef or nil.
+        -- The default functions handle regular use cases.
+
         after_use = func(itemstack, user, node, digparams),
-        --[[
-        ^  default: nil
-        ^ If defined, should return an itemstack and will be called instead of
-          wearing out the tool. If returns nil, does nothing.
-          If after_use doesn't exist, it is the same as:
-            function(itemstack, user, node, digparams)
-              itemstack:add_wear(digparams.wear)
-              return itemstack
-            end
-        ^ The user may be any ObjectRef or nil.
-        ]]
+        -- default: nil
+        -- If defined, should return an itemstack and will be called instead of
+        -- wearing out the tool. If returns nil, does nothing.
+        -- If after_use doesn't exist, it is the same as:
+        --   function(itemstack, user, node, digparams)
+        --     itemstack:add_wear(digparams.wear)
+        --     return itemstack
+        --   end
+        -- The user may be any ObjectRef or nil.
+
         _custom_field = whatever,
-        --[[
-        ^ Add your own custom fields. By convention, all custom field names
-          should start with `_` to avoid naming collisions with future engine
-          usage.
-        ]]
+        -- Add your own custom fields. By convention, all custom field names
+        -- should start with `_` to avoid naming collisions with future engine
+        -- usage.
     }
 
-Tile definition
+Node definition
 ---------------
-* `"image.png"`
-* `{name="image.png", animation={Tile Animation definition}}`
-* `{name="image.png", backface_culling=bool, tileable_vertical=bool,
-    tileable_horizontal=bool, align_style="node"/"world"/"user", scale=int}`
-    * backface culling enabled by default for most nodes
-    * tileable flags are info for shaders, how they should treat texture
-      when displacement mapping is used
-      Directions are from the point of view of the tile texture,
-      not the node it's on
-    * align style determines whether the texture will be rotated with the node
-      or kept aligned with its surroundings. "user" means that client
-      setting will be used, similar to `glasslike_framed_optional`.
-      Note: supported by solid nodes and nodeboxes only.
-    * scale is used to make texture span several (exactly `scale`) nodes,
-      instead of just one, in each direction. Works for world-aligned
-      textures only.
-      Note that as the effect is applied on per-mapblock basis, `16` should
-      be equally divisible by `scale` or you may get wrong results.
-* `{name="image.png", color=ColorSpec}`
-    * the texture's color will be multiplied with this color.
-    * the tile's color overrides the owning node's color in all cases.
-* deprecated, yet still supported field names:
-    * `image` (name)
 
-Tile animation definition
--------------------------
+Used by `minetest.register_node`.
 
     {
-        type = "vertical_frames",
-        aspect_w = 16,
-        -- ^ specify width of a frame in pixels
-        aspect_h = 16,
-        -- ^ specify height of a frame in pixels
-        length = 3.0,
-        -- ^ specify full loop length
-    }
+        -- <all fields allowed in item definitions>,
 
-    {
-        type = "sheet_2d",
-        frames_w = 5,
-        -- ^ specify width in number of frames
-        frames_h = 3,
-        -- ^ specify height in number of frames
-        frame_length = 0.5,
-        -- ^ specify length of a single frame
-    }
+        drawtype = "normal",  -- See "Node drawtypes"
 
-Node definition
----------------
+        visual_scale = 1.0,
+        -- Supported for drawtypes "plantlike", "signlike", "torchlike",
+        -- "firelike", "mesh".
+        -- For plantlike and firelike, the image will start at the bottom of the
+        -- node, for the other drawtypes the image will be centered on the node.
+        -- Note that positioning for "torchlike" may still change.
 
-Used by `minetest.register_node`.
+        tiles = {tile definition 1, def2, def3, def4, def5, def6},
+        -- Textures of node; +Y, -Y, +X, -X, +Z, -Z
+        -- Old field name was 'tile_images'.
+        -- List can be shortened to needed length.
 
-    {
-        -- <all fields allowed in item definitions>,
+        overlay_tiles = {tile definition 1, def2, def3, def4, def5, def6},
+        -- Same as `tiles`, but these textures are drawn on top of the base
+        -- tiles. You can use this to colorize only specific parts of your
+        -- texture. If the texture name is an empty string, that overlay is not
+        -- drawn. Since such tiles are drawn twice, it is not recommended to use
+        -- overlays on very common nodes.
+
+        special_tiles = {tile definition 1, Tile definition 2},
+        -- Special textures of node; used rarely.
+        -- Old field name was 'special_materials'.
+        -- List can be shortened to needed length.
+
+        color = ColorSpec,
+        -- The node's original color will be multiplied with this color.
+        -- If the node has a palette, then this setting only has an effect in
+        -- the inventory and on the wield item.
 
-        drawtype = "normal", -- See "Node drawtypes"
-        visual_scale = 1.0, --[[
-        ^ Supported for drawtypes "plantlike", "signlike", "torchlike",
-        ^ "firelike", "mesh".
-        ^ For plantlike and firelike, the image will start at the bottom of the
-        ^ node, for the other drawtypes the image will be centered on the node.
-        ^ Note that positioning for "torchlike" may still change. ]]
-        tiles = {tile definition 1, def2, def3, def4, def5, def6}, --[[
-        ^ Textures of node; +Y, -Y, +X, -X, +Z, -Z
-        ^ Old field name was 'tile_images'.
-        ^ List can be shortened to needed length ]]
-        overlay_tiles = {tile definition 1, def2, def3, def4, def5, def6}, --[[
-        ^ Same as `tiles`, but these textures are drawn on top of the
-        ^ base tiles. You can use this to colorize only specific parts of
-        ^ your texture. If the texture name is an empty string, that
-        ^ overlay is not drawn. Since such tiles are drawn twice, it
-        ^ is not recommended to use overlays on very common nodes. ]]
-        special_tiles = {tile definition 1, Tile definition 2}, --[[
-        ^ Special textures of node; used rarely
-        ^ Old field name was 'special_materials'.
-        ^ List can be shortened to needed length ]]
-        color = ColorSpec, --[[
-        ^ The node's original color will be multiplied with this color.
-        ^ If the node has a palette, then this setting only has an effect
-        ^ in the inventory and on the wield item. ]]
         use_texture_alpha = false,
-        ^ Use texture's alpha channel.
-        palette = "palette.png", --[[
-        ^ The node's `param2` is used to select a pixel from the image
-        ^ (pixels are arranged from left to right and from top to bottom).
-        ^ The node's color will be multiplied with the selected pixel's
-        ^ color. Tiles can override this behavior.
-        ^ Only when `paramtype2` supports palettes. ]]
+        -- Use texture's alpha channel
+
+        palette = "palette.png",
+        -- The node's `param2` is used to select a pixel from the image.
+        -- Pixels are arranged from left to right and from top to bottom.
+        -- The node's color will be multiplied with the selected pixel's color.
+        -- Tiles can override this behavior.
+        -- Only when `paramtype2` supports palettes.
+
         post_effect_color = "green#0F",
-        ^ Screen tint if player is inside node, see "ColorSpec".
-        paramtype = "none", -- See "Nodes".
-        paramtype2 = "none", -- See "Nodes"
-        place_param2 = nil, -- Force value for param2 when player places node
+        -- Screen tint if player is inside node, see "ColorSpec"
+
+        paramtype = "none",  -- See "Nodes"
+
+        paramtype2 = "none",  -- See "Nodes"
+
+        place_param2 = nil,  -- Force value for param2 when player places node
+
         is_ground_content = true,
-        ^ If false, the cave generator will not carve through this node.
+        -- If false, the cave generator will not carve through this node
+
         sunlight_propagates = false,
-        ^ If true, sunlight will go infinitely through this.
-        walkable = true, -- If true, objects collide with node
-        pointable = true, -- If true, can be pointed at
-        diggable = true, -- If false, can never be dug
-        climbable = false, -- If true, can be climbed on (ladder)
-        buildable_to = false, -- If true, placed nodes can replace this node
-        floodable = false, --[[
-        ^ If true, liquids flow into and replace this node.
-        ^ Warning: making a liquid node 'floodable' will cause problems. ]]
-        liquidtype = "none", -- "none"/"source"/"flowing"
-        liquid_alternative_flowing = "", -- Flowing version of source liquid
-        liquid_alternative_source = "", -- Source version of flowing liquid
-        liquid_viscosity = 0, -- Higher viscosity = slower flow (max. 7)
-        liquid_renewable = true, --[[
-        ^ If true, a new liquid source can be created by placing two or more
-          sources nearby. ]]
-        leveled = 16, --[[
-        ^ Only valid for "nodebox" drawtype with 'type = "leveled"'.
-        ^ Allows defining the nodebox height without using param2.
-        ^ The nodebox height is 'leveled' / 64 nodes.
-        ^ The maximum value of 'leveled' is 127. ]]
-        liquid_range = 8, -- number of flowing nodes around source (max. 8)
+        -- If true, sunlight will go infinitely through this node
+
+        walkable = true,  -- If true, objects collide with node
+
+        pointable = true,  -- If true, can be pointed at
+
+        diggable = true,  -- If false, can never be dug
+
+        climbable = false,  -- If true, can be climbed on (ladder)
+
+        buildable_to = false,  -- If true, placed nodes can replace this node
+
+        floodable = false,
+        -- If true, liquids flow into and replace this node.
+        -- Warning: making a liquid node 'floodable' will cause problems.
+
+        liquidtype = "none",  -- "none" / "source" / "flowing"
+
+        liquid_alternative_flowing = "",  -- Flowing version of source liquid
+
+        liquid_alternative_source = "",  -- Source version of flowing liquid
+
+        liquid_viscosity = 0,  -- Higher viscosity = slower flow (max. 7)
+
+        liquid_renewable = true,
+        -- If true, a new liquid source can be created by placing two or more
+        -- sources nearby
+
+        leveled = 16,
+        -- Only valid for "nodebox" drawtype with 'type = "leveled"'.
+        -- Allows defining the nodebox height without using param2.
+        -- The nodebox height is 'leveled' / 64 nodes.
+        -- The maximum value of 'leveled' is 127.
+
+        liquid_range = 8,  -- Number of flowing nodes around source (max. 8)
+
         drowning = 0,
-        ^ Player will take this amount of damage if no bubbles are left.
-        light_source = 0, --[[
-        ^ Amount of light emitted by node.
-        ^ To set the maximum (currently 14), use the value
-        ^ 'minetest.LIGHT_MAX'.
-        ^ A value outside the range 0 to minetest.LIGHT_MAX causes undefined
-        ^ behavior.]]
+        -- Player will take this amount of damage if no bubbles are left
+
+        light_source = 0,
+        -- Amount of light emitted by node.
+        -- To set the maximum (14), use the value 'minetest.LIGHT_MAX'.
+        -- A value outside the range 0 to minetest.LIGHT_MAX causes undefined
+        -- behavior.
+
         damage_per_second = 0,
-        ^ If player is inside node, this damage is caused.
-        node_box = {type="regular"}, -- See "Node boxes"
-        connects_to = nodenames, --[[
-        ^ Used for nodebox nodes with the type == "connected"
-        ^ Specifies to what neighboring nodes connections will be drawn
-        ^ e.g. `{"group:fence", "default:wood"}` or `"default:stone"` ]]
+        -- If player is inside node, this damage is caused
+
+        node_box = {type="regular"},  -- See "Node boxes"
+
+        connects_to = nodenames,
+        -- Used for nodebox nodes with the type == "connected".
+        -- Specifies to what neighboring nodes connections will be drawn.
+        -- e.g. `{"group:fence", "default:wood"}` or `"default:stone"`
+
         connect_sides = { "top", "bottom", "front", "left", "back", "right" },
-               -- [[
-        ^ Tells connected nodebox nodes to connect only to these sides of this
-        ^ node. ]]
+        -- Tells connected nodebox nodes to connect only to these sides of this
+        -- node
+
         mesh = "model",
+
         selection_box = {
             type = "fixed",
             fixed = {
                 {-2 / 16, -0.5, -2 / 16, 2 / 16, 3 / 16, 2 / 16},
             },
         },
-        ^ Custom selection box definition. Multiple boxes can be defined.
-        ^ If drawtype "nodebox" is used and selection_box is nil, then node_box
-        ^ definition is used for the selection box.
+        -- Custom selection box definition. Multiple boxes can be defined.
+        -- If "nodebox" drawtype is used and selection_box is nil, then node_box
+        -- definition is used for the selection box.
+
         collision_box = {
             type = "fixed",
             fixed = {
                 {-2 / 16, -0.5, -2 / 16, 2 / 16, 3 / 16, 2 / 16},
             },
         },
-        ^ Custom collision box definition. Multiple boxes can be defined.
-        ^ If drawtype "nodebox" is used and collision_box is nil, then node_box
-        ^ definition is used for the collision box.
-        ^ For both of the above a box is defined as:
-        ^ {xmin, ymin, zmin, xmax, ymax, zmax} in nodes from node center.
+        -- Custom collision box definition. Multiple boxes can be defined.
+        -- If "nodebox" drawtype is used and collision_box is nil, then node_box
+        -- definition is used for the collision box.
+        -- Both of the boxes above are defined as:
+        -- {xmin, ymin, zmin, xmax, ymax, zmax} in nodes from node center.
+
+        -- Support maps made in and before January 2012
         legacy_facedir_simple = false,
-        ^ Support maps made in and before January 2012.
         legacy_wallmounted = false,
-        ^ Support maps made in and before January 2012.
-        waving = 0, --[[
-        ^ Valid for mesh, nodebox, plantlike, allfaces_optional nodes.
-        ^ 1 - wave node like plants (top of node moves, bottom is fixed)
-        ^ 2 - wave node like leaves (whole node moves side-to-side)
-        ^ caveats: not all models will properly wave.
-        ^ plantlike drawtype nodes can only wave like plants.
-        ^ allfaces_optional drawtype nodes can only wave like leaves. --]]
+
+        waving = 0,
+        -- Valid for mesh, nodebox, plantlike, allfaces_optional nodes.
+        -- 1 - wave node like plants (top of node moves, bottom is fixed)
+        -- 2 - wave node like leaves (whole node moves side-to-side)
+        -- caveats: not all models will properly wave.
+        -- plantlike drawtype nodes can only wave like plants.
+        -- allfaces_optional drawtype nodes can only wave like leaves.
+
         sounds = {
             footstep = <SimpleSoundSpec>,
-            dig = <SimpleSoundSpec>, -- "__group" = group-based sound (default)
+            dig = <SimpleSoundSpec>,  -- "__group" = group-based sound (default)
             dug = <SimpleSoundSpec>,
             place = <SimpleSoundSpec>,
             place_failed = <SimpleSoundSpec>,
         },
+
         drop = "",
-        ^ Name of dropped node when dug. Default is the node itself.
-        ^ Alternatively:
+        -- Name of dropped node when dug. Default is the node itself.
+        -- Alternatively:
         drop = {
-            max_items = 1,  -- Maximum number of items to drop.
-            items = {  -- Choose max_items randomly from this list.
+            -- Maximum number of items to drop
+            max_items = 1,
+            -- Choose max_items randomly from this list
+            items = {
                 {
-                    items = {"foo:bar", "baz:frob"},  -- Items to drop.
-                    rarity = 1,  -- Probability of dropping is 1 / rarity.
-                    inherit_color = true, -- To inherit palette color from the
-                                             node.
+                    items = {"foo:bar", "baz:frob"},  -- Items to drop
+                    rarity = 1,  -- Probability of dropping is 1 / rarity
+                    inherit_color = true, -- Inherit palette color from the node
                 },
             },
         },
 
-        on_construct = func(pos), --[[
-        ^ Node constructor; called after adding node
-        ^ Can set up metadata and stuff like that
-        ^ Not called for bulk node placement (i.e. schematics and VoxelManip)
-        ^ default: nil ]]
-
-        on_destruct = func(pos), --[[
-        ^ Node destructor; called before removing node
-        ^ Not called for bulk node placement (i.e. schematics and VoxelManip)
-        ^ default: nil ]]
-
-        after_destruct = func(pos, oldnode), --[[
-        ^ Node destructor; called after removing node
-        ^ Not called for bulk node placement (i.e. schematics and VoxelManip)
-        ^ default: nil ]]
-
-        on_flood = func(pos, oldnode, newnode), --[[
-        ^ Called when a liquid (newnode) is about to flood oldnode, if
-        ^ it has `floodable = true` in the nodedef. Not called for bulk
-        ^ node placement (i.e. schematics and VoxelManip) or air nodes. If
-        ^ return true the node is not flooded, but on_flood callback will
-        ^ most likely be called over and over again every liquid update
-        ^ interval. Default: nil.
-        ^ Warning: making a liquid node 'floodable' will cause problems. ]]
-
-        preserve_metadata = func(pos, oldnode, oldmeta, drops) --[[
-        ^ Called when oldnode is about be converted to an item, but before the
-        ^ node is deleted from the world or the drops are added. This is
-        ^ generally the result of either the node being dug or an attached node
-        ^ becoming detached.
-        ^ drops is a table of ItemStacks, so any metadata to be preserved can
-        ^ be added directly to one or more of the dropped items. See
-        ^ "ItemStackMetaRef".
-        ^ default: nil ]]
-
-        after_place_node = func(pos, placer, itemstack, pointed_thing) --[[
-        ^ Called after constructing node when node was placed using
-        ^ minetest.item_place_node / minetest.place_node
-        ^ If return true no item is taken from itemstack
-        ^ `placer` may be any valid ObjectRef or nil
-        ^ default: nil ]]
-
-        after_dig_node = func(pos, oldnode, oldmetadata, digger), --[[
-        ^ oldmetadata is in table format
-        ^ Called after destructing node when node was dug using
-        ^ minetest.node_dig / minetest.dig_node
-        ^ default: nil ]]
-
-        can_dig = function(pos, [player]) --[[
-        ^ returns true if node can be dug, or false if not
-        ^ default: nil ]]
-
-        on_punch = func(pos, node, puncher, pointed_thing), --[[
-        ^ default: minetest.node_punch
-        ^ By default: Calls minetest.register_on_punchnode callbacks ]]
+        on_construct = func(pos),
+        -- Node constructor; called after adding node.
+        -- Can set up metadata and stuff like that.
+        -- Not called for bulk node placement (i.e. schematics and VoxelManip).
+        -- default: nil
+
+        on_destruct = func(pos),
+        -- Node destructor; called before removing node.
+        -- Not called for bulk node placement.
+        -- default: nil
+
+        after_destruct = func(pos, oldnode),
+        -- Node destructor; called after removing node.
+        -- Not called for bulk node placement.
+        -- default: nil
+
+        on_flood = func(pos, oldnode, newnode),
+        -- Called when a liquid (newnode) is about to flood oldnode, if it has
+        -- `floodable = true` in the nodedef. Not called for bulk node placement
+        -- (i.e. schematics and VoxelManip) or air nodes. If return true the
+        -- node is not flooded, but on_flood callback will most likely be called
+        -- over and over again every liquid update interval.
+        -- Default: nil
+        -- Warning: making a liquid node 'floodable' will cause problems.
+
+        preserve_metadata = func(pos, oldnode, oldmeta, drops),
+        -- Called when oldnode is about be converted to an item, but before the
+        -- node is deleted from the world or the drops are added. This is
+        -- generally the result of either the node being dug or an attached node
+        -- becoming detached.
+        -- drops is a table of ItemStacks, so any metadata to be preserved can
+        -- be added directly to one or more of the dropped items. See
+        -- "ItemStackMetaRef".
+        -- default: nil
+
+        after_place_node = func(pos, placer, itemstack, pointed_thing),
+        -- Called after constructing node when node was placed using
+        -- minetest.item_place_node / minetest.place_node.
+        -- If return true no item is taken from itemstack.
+        -- `placer` may be any valid ObjectRef or nil.
+        -- default: nil
+
+        after_dig_node = func(pos, oldnode, oldmetadata, digger),
+        -- oldmetadata is in table format.
+        -- Called after destructing node when node was dug using
+        -- minetest.node_dig / minetest.dig_node.
+        -- default: nil
+
+        can_dig = function(pos, [player]),
+
+        on_punch = func(pos, node, puncher, pointed_thing),
+        -- Returns true if node can be dug, or false if not.
+        -- default: nil
+        -- default: minetest.node_punch
+        -- By default calls minetest.register_on_punchnode callbacks.
 
         on_rightclick = func(pos, node, clicker, itemstack, pointed_thing),
-        --[[
-        ^ default: nil
-        ^ itemstack will hold clicker's wielded item
-        ^ Shall return the leftover itemstack
-        ^ Note: pointed_thing can be nil, if a mod calls this function
-        ^ This function does not get triggered by clients <=0.4.16 if the
-        ^ "formspec" node metadata field is set ]]
-
-        on_dig = func(pos, node, digger), --[[
-        ^ default: minetest.node_dig
-        ^ By default: checks privileges, wears out tool and removes node ]]
-
-        on_timer = function(pos,elapsed), --[[
-        ^ default: nil
-        ^ called by NodeTimers, see minetest.get_node_timer and NodeTimerRef
-        ^ elapsed is the total time passed since the timer was started
-        ^ return true to run the timer for another cycle with the same timeout
-        ^ value. ]]
-
-        on_receive_fields = func(pos, formname, fields, sender), --[[
-        ^ fields = {name1 = value1, name2 = value2, ...}
-        ^ Called when an UI form (e.g. sign text input) returns data
-        ^ default: nil ]]
+        -- default: nil
+        -- itemstack will hold clicker's wielded item.
+        -- Shall return the leftover itemstack.
+        -- Note: pointed_thing can be nil, if a mod calls this function.
+        -- This function does not get triggered by clients <=0.4.16 if the
+        -- "formspec" node metadata field is set.
+
+        on_dig = func(pos, node, digger),
+        -- default: minetest.node_dig
+        -- By default checks privileges, wears out tool and removes node.
+
+        on_timer = function(pos, elapsed),
+        -- default: nil
+        -- called by NodeTimers, see minetest.get_node_timer and NodeTimerRef.
+        -- elapsed is the total time passed since the timer was started.
+        -- return true to run the timer for another cycle with the same timeout
+        -- value.
+
+        on_receive_fields = func(pos, formname, fields, sender),
+        -- fields = {name1 = value1, name2 = value2, ...}
+        -- Called when an UI form (e.g. sign text input) returns data.
+        -- default: nil
 
         allow_metadata_inventory_move = func(pos, from_list, from_index, to_list, to_index, count, player),
-        --[[
-        ^ Called when a player wants to move items inside the inventory
-        ^ Return value: number of items allowed to move ]]
+        -- Called when a player wants to move items inside the inventory.
+        -- Return value: number of items allowed to move.
 
         allow_metadata_inventory_put = func(pos, listname, index, stack, player),
-        --[[
-        ^ Called when a player wants to put something into the inventory
-        ^ Return value: number of items allowed to put
-        ^ Return value: -1: Allow and don't modify item count in inventory ]]
+        -- Called when a player wants to put something into the inventory.
+        -- Return value: number of items allowed to put.
+        -- Return value -1: Allow and don't modify item count in inventory.
 
         allow_metadata_inventory_take = func(pos, listname, index, stack, player),
-        --[[
-        ^ Called when a player wants to take something out of the inventory
-        ^ Return value: number of items allowed to take
-        ^ Return value: -1: Allow and don't modify item count in inventory ]]
+        -- Called when a player wants to take something out of the inventory.
+        -- Return value: number of items allowed to take.
+        -- Return value -1: Allow and don't modify item count in inventory.
 
         on_metadata_inventory_move = func(pos, from_list, from_index, to_list, to_index, count, player),
         on_metadata_inventory_put = func(pos, listname, index, stack, player),
         on_metadata_inventory_take = func(pos, listname, index, stack, player),
-        --[[
-        ^ Called after the actual action has happened, according to what was
-        ^ allowed.
-        ^ No return value ]]
-
-        on_blast = func(pos, intensity), --[[
-        ^ intensity: 1.0 = mid range of regular TNT
-        ^ If defined, called when an explosion touches the node, instead of
-          removing the node ]]
+        -- Called after the actual action has happened, according to what was
+        -- allowed.
+        -- No return value.
+
+        on_blast = func(pos, intensity),
+        -- intensity: 1.0 = mid range of regular TNT.
+        -- If defined, called when an explosion touches the node, instead of
+        -- removing the node.
     }
 
 Crafting recipes
@@ -5783,24 +6138,24 @@ Used by `minetest.register_craft`.
         recipe = {
             {'default:cobble', 'default:cobble', 'default:cobble'},
             {'', 'default:stick', ''},
-            {'', 'default:stick', ''}, -- Also groups; e.g. 'group:crumbly'
+            {'', 'default:stick', ''},  -- Also groups; e.g. 'group:crumbly'
         },
-        replacements = --[[<optional list of item pairs,
-                        replace one input item with another item on crafting>]]
+        replacements = <list of item pairs>,
+        -- replacements: replace one input item with another item on crafting
+        -- (optional).
     }
 
 ### Shapeless
 
     {
-       type = "shapeless",
-       output = 'mushrooms:mushroom_stew',
-       recipe = {
-           "mushrooms:bowl",
-           "mushrooms:mushroom_brown",
-           "mushrooms:mushroom_red",
-       },
-       replacements = --[[<optional list of item pairs,
-                       replace one input item with another item on crafting>]]
+        type = "shapeless",
+        output = 'mushrooms:mushroom_stew',
+        recipe = {
+            "mushrooms:bowl",
+            "mushrooms:mushroom_brown",
+            "mushrooms:mushroom_red",
+        },
+        replacements = <list of item pairs>,
     }
 
 ### Tool repair
@@ -5810,6 +6165,8 @@ Used by `minetest.register_craft`.
         additional_wear = -0.02,
     }
 
+Note: Tools with group `disable_repair=1` will not repairable by this recipe.
+
 ### Cooking
 
     {
@@ -5823,8 +6180,9 @@ Used by `minetest.register_craft`.
 
     {
         type = "fuel",
-        recipe = "default:leaves",
-        burntime = 1,
+        recipe = "bucket:bucket_lava",
+        burntime = 60,
+        replacements = {{"bucket:bucket_lava", "bucket:bucket_empty"}},
     }
 
 Ore definition
@@ -5832,34 +6190,43 @@ Ore definition
 
 Used by `minetest.register_ore`.
 
-See 'Ore types' section above for essential information.
+See [Ores] section above for essential information.
 
     {
         ore_type = "scatter",
+
         ore = "default:stone_with_coal",
+
         ore_param2 = 3,
-    --  ^ Facedir rotation. Default is 0 (unchanged rotation)
+        -- Facedir rotation. Default is 0 (unchanged rotation)
+
         wherein = "default:stone",
-    --  ^ a list of nodenames is supported too
+        -- A list of nodenames is supported too
+
         clust_scarcity = 8 * 8 * 8,
-    --  ^ Ore has a 1 out of clust_scarcity chance of spawning in a node
-    --  ^ If the desired average distance between ores is 'd', set this to
-    --  ^ d * d * d.
+        -- Ore has a 1 out of clust_scarcity chance of spawning in a node.
+        -- If the desired average distance between ores is 'd', set this to
+        -- d * d * d.
+
         clust_num_ores = 8,
-    --  ^ Number of ores in a cluster
+        -- Number of ores in a cluster
+
         clust_size = 3,
-    --  ^ Size of the bounding box of the cluster
-    --  ^ In this example, there is a 3 * 3 * 3 cluster where 8 out of the 27
-    --  ^ nodes are coal ore.
+        -- Size of the bounding box of the cluster.
+        -- In this example, there is a 3 * 3 * 3 cluster where 8 out of the 27
+        -- nodes are coal ore.
+
         y_min = -31000,
         y_max = 64,
-    --  ^ Lower and upper limits for ore.
+        -- Lower and upper limits for ore
+
         flags = "",
-    --  ^ Attributes for this ore generation, see 'Ore attributes' section
-    --  ^ above.
+        -- Attributes for the ore generation, see 'Ore attributes' section above
+
         noise_threshold = 0.5,
-    --  ^ If noise is above this threshold, ore is placed. Not needed for a
-    --  ^ uniform distribution.
+        -- If noise is above this threshold, ore is placed. Not needed for a
+        -- uniform distribution.
+
         noise_params = {
             offset = 0,
             scale = 1,
@@ -5868,22 +6235,27 @@ See 'Ore types' section above for essential information.
             octaves = 3,
             persist = 0.7
         },
-    --  ^ NoiseParams structure describing one of the perlin noises used for
-    --  ^ ore distribution.
-    --  ^ Needed by "sheet", "puff", "blob" and "vein" ores.
-    --  ^ Omit from "scatter" ore for a uniform ore distribution.
-    --  ^ Omit from "stratum ore for a simple horizontal strata from y_min to
-    --  ^ y_max.
-        biomes = {"desert", "rainforest"}
-    --  ^ List of biomes in which this decoration occurs.
-    --  ^ Occurs in all biomes if this is omitted, and ignored if the Mapgen
-    --  ^ being used does not support biomes.
-    --  ^ Can be a list of (or a single) biome names, IDs, or definitions.
+        -- NoiseParams structure describing one of the perlin noises used for
+        -- ore distribution.
+        -- Needed by "sheet", "puff", "blob" and "vein" ores.
+        -- Omit from "scatter" ore for a uniform ore distribution.
+        -- Omit from "stratum" ore for a simple horizontal strata from y_min to
+        -- y_max.
+
+        biomes = {"desert", "rainforest"},
+        -- List of biomes in which this ore occurs.
+        -- Occurs in all biomes if this is omitted, and ignored if the Mapgen
+        -- being used does not support biomes.
+        -- Can be a list of (or a single) biome names, IDs, or definitions.
+
+        -- Type-specific parameters
+
+        -- sheet
         column_height_min = 1,
         column_height_max = 16,
         column_midpoint_factor = 0.5,
-    --  ^ See 'Ore types' section above.
-    --  ^ The above 3 parameters are only valid for "sheet" ore.
+
+        -- puff
         np_puff_top = {
             offset = 4,
             scale = 2,
@@ -5900,11 +6272,11 @@ See 'Ore types' section above for essential information.
             octaves = 3,
             persist = 0.7
         },
-    --  ^ See 'Ore types' section above.
-    --  ^ The above 2 parameters are only valid for "puff" ore.
+
+        -- vein
         random_factor = 1.0,
-    --  ^ See 'Ore types' section above.
-    --  ^ Only valid for "vein" ore.
+
+        -- stratum
         np_stratum_thickness = {
             offset = 8,
             scale = 4,
@@ -5914,8 +6286,6 @@ See 'Ore types' section above for essential information.
             persist = 0.7
         },
         stratum_thickness = 8,
-    --  ^ See 'Ore types' section above.
-    --  ^ The above 2 parameters are only valid for "stratum" ore.
     }
 
 Biome definition
@@ -5925,86 +6295,105 @@ Used by `minetest.register_biome`.
 
     {
         name = "tundra",
+
         node_dust = "default:snow",
-    --  ^ Node dropped onto upper surface after all else is generated.
+        -- Node dropped onto upper surface after all else is generated
+
         node_top = "default:dirt_with_snow",
         depth_top = 1,
-    --  ^ Node forming surface layer of biome and thickness of this layer.
+        -- Node forming surface layer of biome and thickness of this layer
+
         node_filler = "default:permafrost",
         depth_filler = 3,
-    --  ^ Node forming lower layer of biome and thickness of this layer.
+        -- Node forming lower layer of biome and thickness of this layer
+
         node_stone = "default:bluestone",
-    --  ^ Node that replaces all stone nodes between roughly y_min and y_max.
+        -- Node that replaces all stone nodes between roughly y_min and y_max.
+
         node_water_top = "default:ice",
         depth_water_top = 10,
-    --  ^ Node forming a surface layer in seawater with the defined thickness.
+        -- Node forming a surface layer in seawater with the defined thickness
+
         node_water = "",
-    --  ^ Node that replaces all seawater nodes not in the defined surface
-    --  ^ layer.
+        -- Node that replaces all seawater nodes not in the surface layer
+
         node_river_water = "default:ice",
-    --  ^ Node that replaces river water in mapgens that use
-    --  ^ default:river_water.
+        -- Node that replaces river water in mapgens that use
+        -- default:river_water
+
         node_riverbed = "default:gravel",
         depth_riverbed = 2,
-    --  ^ Node placed under river water and thickness of this layer.
+        -- Node placed under river water and thickness of this layer
+
         node_cave_liquid = "default:water_source",
-    --  ^ Nodes placed as a blob of liquid in 50% of large caves.
-    --  ^ If absent, cave liquids fall back to classic behaviour of lava or
-    --  ^ water distributed according to a hardcoded 3D noise.
+        -- Nodes placed as a blob of liquid in 50% of large caves.
+        -- If absent, cave liquids fall back to classic behaviour of lava or
+        -- water distributed according to a hardcoded 3D noise.
+
         node_dungeon = "default:cobble",
-    --  ^ Node used for primary dungeon structure.
-    --  ^ If absent, dungeon materials fall back to classic behaviour.
-    --  ^ If present, the following two nodes are also used.
+        -- Node used for primary dungeon structure.
+        -- If absent, dungeon materials fall back to classic behaviour.
+        -- If present, the following two nodes are also used.
+
         node_dungeon_alt = "default:mossycobble",
-    --  ^ Node used for randomly-distributed alternative structure nodes.
-    --  ^ If alternative structure nodes are not wanted leave this absent for
-    --  ^ performance reasons.
+        -- Node used for randomly-distributed alternative structure nodes.
+        -- If alternative structure nodes are not wanted leave this absent for
+        -- performance reasons.
+
         node_dungeon_stair = "stairs:stair_cobble",
-    --  ^ Node used for dungeon stairs.
-    --  ^ If absent, stairs fall back to 'node_dungeon'.
+        -- Node used for dungeon stairs.
+        -- If absent, stairs fall back to 'node_dungeon'.
+
         y_max = 31000,
         y_min = 1,
-    --  ^ Upper and lower limits for biome.
-    --  ^ Alternatively you can use xyz limits as shown below.
+        -- Upper and lower limits for biome.
+        -- Alternatively you can use xyz limits as shown below.
+
         max_pos = {x = 31000, y = 128, z = 31000},
         min_pos = {x = -31000, y = 9, z = -31000},
-    --  ^ xyz limits for biome, an alternative to using 'y_min' and 'y_max'.
-    --  ^ Biome is limited to a cuboid defined by these positions.
-    --  ^ Any x, y or z field left undefined defaults to -31000 in 'min_pos' or
-    --  ^ 31000 in 'max_pos'.
+        -- xyz limits for biome, an alternative to using 'y_min' and 'y_max'.
+        -- Biome is limited to a cuboid defined by these positions.
+        -- Any x, y or z field left undefined defaults to -31000 in 'min_pos' or
+        -- 31000 in 'max_pos'.
+
         vertical_blend = 8,
-    --  ^ Vertical distance in nodes above 'y_max' over which the biome will
-    --  ^ blend with the biome above.
-    --  ^ Set to 0 for no vertical blend. Defaults to 0.
+        -- Vertical distance in nodes above 'y_max' over which the biome will
+        -- blend with the biome above.
+        -- Set to 0 for no vertical blend. Defaults to 0.
+
         heat_point = 0,
         humidity_point = 50,
-    --  ^ Characteristic temperature and humidity for the biome.
-    --  ^ These values create 'biome points' on a voronoi diagram with heat and
-    --  ^ humidity as axes. The resulting voronoi cells determine the
-    --  ^ distribution of the biomes.
-    --  ^ Heat and humidity have average values of 50, vary mostly between
-    --  ^ 0 and 100 but can exceed these values.
+        -- Characteristic temperature and humidity for the biome.
+        -- These values create 'biome points' on a voronoi diagram with heat and
+        -- humidity as axes. The resulting voronoi cells determine the
+        -- distribution of the biomes.
+        -- Heat and humidity have average values of 50, vary mostly between
+        -- 0 and 100 but can exceed these values.
     }
 
 Decoration definition
 ---------------------
 
-Used by `minetest.register_decoration`.
+See [Decoration types]. Used by `minetest.register_decoration`.
 
     {
-        deco_type = "simple", -- See "Decoration types"
+        deco_type = "simple",
+
         place_on = "default:dirt_with_grass",
-    --  ^ Node (or list of nodes) that the decoration can be placed on
+        -- Node (or list of nodes) that the decoration can be placed on
+
         sidelen = 8,
-    --  ^ Size of the square divisions of the mapchunk being generated.
-    --  ^ Determines the resolution of noise variation if used.
-    --  ^ If the chunk size is not evenly divisible by sidelen, sidelen is made
-    --  ^ equal to the chunk size.
+        -- Size of the square divisions of the mapchunk being generated.
+        -- Determines the resolution of noise variation if used.
+        -- If the chunk size is not evenly divisible by sidelen, sidelen is made
+        -- equal to the chunk size.
+
         fill_ratio = 0.02,
-    --  ^ The value determines 'decorations per surface node'.
-    --  ^ Used only if noise_params is not specified.
-    --  ^ If >= 10.0 complete coverage is enabled and decoration placement uses
-    --  ^ a different and much faster method.
+        -- The value determines 'decorations per surface node'.
+        -- Used only if noise_params is not specified.
+        -- If >= 10.0 complete coverage is enabled and decoration placement uses
+        -- a different and much faster method.
+
         noise_params = {
             offset = 0,
             scale = 0.45,
@@ -6015,82 +6404,93 @@ Used by `minetest.register_decoration`.
             lacunarity = 2.0,
             flags = "absvalue"
         },
-    --  ^ NoiseParams structure describing the perlin noise used for decoration
-    --  ^ distribution.
-    --  ^ A noise value is calculated for each square division and determines
-    --  ^ 'decorations per surface node' within each division.
-    --  ^ If the noise value >= 10.0 complete coverage is enabled and decoration
-    --  ^ placement uses a different and much faster method.
+        -- NoiseParams structure describing the perlin noise used for decoration
+        -- distribution.
+        -- A noise value is calculated for each square division and determines
+        -- 'decorations per surface node' within each division.
+        -- If the noise value >= 10.0 complete coverage is enabled and
+        -- decoration placement uses a different and much faster method.
+
         biomes = {"Oceanside", "Hills", "Plains"},
-    --  ^ List of biomes in which this decoration occurs. Occurs in all biomes
-    --  ^ if this is omitted, and ignored if the Mapgen being used does not
-    --  ^ support biomes.
-    --  ^ Can be a list of (or a single) biome names, IDs, or definitions.
-        y_min = -31000
-        y_max = 31000
-    --  ^ Lower and upper limits for decoration.
-    --  ^ These parameters refer to the Y co-ordinate of the 'place_on' node.
+        -- List of biomes in which this decoration occurs. Occurs in all biomes
+        -- if this is omitted, and ignored if the Mapgen being used does not
+        -- support biomes.
+        -- Can be a list of (or a single) biome names, IDs, or definitions.
+
+        y_min = -31000,
+        y_max = 31000,
+        -- Lower and upper limits for decoration.
+        -- These parameters refer to the Y co-ordinate of the 'place_on' node.
+
         spawn_by = "default:water",
-    --  ^ Node (or list of nodes) that the decoration only spawns next to.
-    --  ^ Checks two horizontal planes of 8 neighbouring nodes (including
-    --  ^ diagonal neighbours), one plane level with the 'place_on' node and a
-    --  ^ plane one node above that.
+        -- Node (or list of nodes) that the decoration only spawns next to.
+        -- Checks two horizontal planes of 8 neighbouring nodes (including
+        -- diagonal neighbours), one plane level with the 'place_on' node and a
+        -- plane one node above that.
+
         num_spawn_by = 1,
-    --  ^ Number of spawn_by nodes that must be surrounding the decoration
-    --  ^ position to occur.
-    --  ^ If absent or -1, decorations occur next to any nodes.
+        -- Number of spawn_by nodes that must be surrounding the decoration
+        -- position to occur.
+        -- If absent or -1, decorations occur next to any nodes.
+
         flags = "liquid_surface, force_placement, all_floors, all_ceilings",
-    --  ^ Flags for all decoration types.
-    --  ^ "liquid_surface": Instead of placement on the highest solid surface
-    --  ^   in a mapchunk column, placement is on the highest liquid surface.
-    --  ^   Placement is disabled if solid nodes are found above the liquid
-    --  ^   surface.
-    --  ^ "force_placement": Nodes other than "air" and "ignore" are replaced
-    --  ^   by the decoration.
-    --  ^ "all_floors", "all_ceilings": Instead of placement on the highest
-    --  ^   surface in a mapchunk the decoration is placed on all floor and/or
-    --  ^   ceiling surfaces, for example in caves and dungeons.
-    --  ^   Ceiling decorations act as an inversion of floor decorations so the
-    --  ^   effect of 'place_offset_y' is inverted.
-    --  ^   Y-slice probabilities do not function correctly for ceiling
-    --  ^   schematic decorations as the behaviour is unchanged.
-    --  ^   If a single decoration registration has both flags the floor and
-    --  ^   ceiling decorations will be aligned vertically.
+        -- Flags for all decoration types.
+        -- "liquid_surface": Instead of placement on the highest solid surface
+        --   in a mapchunk column, placement is on the highest liquid surface.
+        --   Placement is disabled if solid nodes are found above the liquid
+        --   surface.
+        -- "force_placement": Nodes other than "air" and "ignore" are replaced
+        --   by the decoration.
+        -- "all_floors", "all_ceilings": Instead of placement on the highest
+        --   surface in a mapchunk the decoration is placed on all floor and/or
+        --   ceiling surfaces, for example in caves and dungeons.
+        --   Ceiling decorations act as an inversion of floor decorations so the
+        --   effect of 'place_offset_y' is inverted.
+        --   Y-slice probabilities do not function correctly for ceiling
+        --   schematic decorations as the behaviour is unchanged.
+        --   If a single decoration registration has both flags the floor and
+        --   ceiling decorations will be aligned vertically.
 
         ----- Simple-type parameters
+
         decoration = "default:grass",
-    --  ^ The node name used as the decoration.
-    --  ^ If instead a list of strings, a randomly selected node from the list
-    --  ^ is placed as the decoration.
+        -- The node name used as the decoration.
+        -- If instead a list of strings, a randomly selected node from the list
+        -- is placed as the decoration.
+
         height = 1,
-    --  ^ Decoration height in nodes.
-    --  ^ If height_max is not 0, this is the lower limit of a randomly
-    --  ^ selected height.
+        -- Decoration height in nodes.
+        -- If height_max is not 0, this is the lower limit of a randomly
+        -- selected height.
+
         height_max = 0,
-    --  ^ Upper limit of the randomly selected height.
-    --  ^ If absent, the parameter 'height' is used as a constant.
+        -- Upper limit of the randomly selected height.
+        -- If absent, the parameter 'height' is used as a constant.
+
         param2 = 0,
-    --  ^ Param2 value of decoration nodes.
-    --  ^ If param2_max is not 0, this is the lower limit of a randomly
-    --  ^ selected param2.
+        -- Param2 value of decoration nodes.
+        -- If param2_max is not 0, this is the lower limit of a randomly
+        -- selected param2.
+
         param2_max = 0,
-    --  ^ Upper limit of the randomly selected param2.
-    --  ^ If absent, the parameter 'param2' is used as a constant.
+        -- Upper limit of the randomly selected param2.
+        -- If absent, the parameter 'param2' is used as a constant.
+
         place_offset_y = 0,
-    --  ^ Y offset of the decoration base node relative to the standard base
-    --  ^ node position.
-    --  ^ Can be positive or negative. Default is 0.
-    --  ^ Effect is inverted for "all_ceilings" decorations.
-    --  ^ Ignored by 'y_min', 'y_max' and 'spawn_by' checks, which always refer
-    --  ^ to the 'place_on' node.
+        -- Y offset of the decoration base node relative to the standard base
+        -- node position.
+        -- Can be positive or negative. Default is 0.
+        -- Effect is inverted for "all_ceilings" decorations.
+        -- Ignored by 'y_min', 'y_max' and 'spawn_by' checks, which always refer
+        -- to the 'place_on' node.
 
         ----- Schematic-type parameters
+
         schematic = "foobar.mts",
-    --  ^ If schematic is a string, it is the filepath relative to the current
-    --  ^ working directory of the specified Minetest schematic file.
-    --  ^  - OR -, could be the ID of a previously registered schematic
-    --  ^  - OR -, could instead be a table containing two mandatory fields,
-    --  ^ size and data, and an optional table yslice_prob:
+        -- If schematic is a string, it is the filepath relative to the current
+        -- working directory of the specified Minetest schematic file.
+        -- Could also be the ID of a previously registered schematic.
+
         schematic = {
             size = {x = 4, y = 6, z = 4},
             data = {
@@ -6105,20 +6505,26 @@ Used by `minetest.register_decoration`.
                  ...
             },
         },
-    --  ^ See 'Schematic specifier' for details.
+        -- Alternative schematic specification by supplying a table. The fields
+        -- size and data are mandatory whereas yslice_prob is optional.
+        -- See 'Schematic specifier' for details.
+
         replacements = {["oldname"] = "convert_to", ...},
+
         flags = "place_center_x, place_center_y, place_center_z",
-    --  ^ Flags for schematic decorations.  See 'Schematic attributes'.
+        -- Flags for schematic decorations. See 'Schematic attributes'.
+
         rotation = "90",
-    --  ^ Rotation can be "0", "90", "180", "270", or "random".
+        -- Rotation can be "0", "90", "180", "270", or "random"
+
         place_offset_y = 0,
-    --  ^ If the flag 'place_center_y' is set this parameter is ignored.
-    --  ^ Y offset of the schematic base node layer relative to the 'place_on'
-    --  ^ node.
-    --  ^ Can be positive or negative. Default is 0.
-    --  ^ Effect is inverted for "all_ceilings" decorations.
-    --  ^ Ignored by 'y_min', 'y_max' and 'spawn_by' checks, which always refer
-    --  ^ to the 'place_on' node.
+        -- If the flag 'place_center_y' is set this parameter is ignored.
+        -- Y offset of the schematic base node layer relative to the 'place_on'
+        -- node.
+        -- Can be positive or negative. Default is 0.
+        -- Effect is inverted for "all_ceilings" decorations.
+        -- Ignored by 'y_min', 'y_max' and 'spawn_by' checks, which always refer
+        -- to the 'place_on' node.
     }
 
 Chat command definition
@@ -6127,12 +6533,14 @@ Chat command definition
 Used by `minetest.register_chatcommand`.
 
     {
-        params = "<name> <privilege>", -- Short parameter description
-        description = "Remove privilege from player", -- Full description
-        privs = {privs=true}, -- Require the "privs" privilege to run
-        func = function(name, param), -- Called when command is run.
-                                      -- Returns boolean success and text
-                                      -- output.
+        params = "<name> <privilege>",  -- Short parameter description
+
+        description = "Remove privilege from player",  -- Full description
+
+        privs = {privs=true},  -- Require the "privs" privilege to run
+
+        func = function(name, param),
+        -- Called when command is run. Returns boolean success and text output.
     }
 
 Note that in params, use of symbols is as follows:
@@ -6154,52 +6562,61 @@ Used by `minetest.create_detached_inventory`.
 
     {
         allow_move = func(inv, from_list, from_index, to_list, to_index, count, player),
-    --  ^ Called when a player wants to move items inside the inventory
-    --  ^ Return value: number of items allowed to move
+        -- Called when a player wants to move items inside the inventory.
+        -- Return value: number of items allowed to move.
 
         allow_put = func(inv, listname, index, stack, player),
-    --  ^ Called when a player wants to put something into the inventory
-    --  ^ Return value: number of items allowed to put
-    --  ^ Return value: -1: Allow and don't modify item count in inventory
+        -- Called when a player wants to put something into the inventory.
+        -- Return value: number of items allowed to put.
+        -- Return value -1: Allow and don't modify item count in inventory.
 
         allow_take = func(inv, listname, index, stack, player),
-    --  ^ Called when a player wants to take something out of the inventory
-    --  ^ Return value: number of items allowed to take
-    --  ^ Return value: -1: Allow and don't modify item count in inventory
+        -- Called when a player wants to take something out of the inventory.
+        -- Return value: number of items allowed to take.
+        -- Return value -1: Allow and don't modify item count in inventory.
 
         on_move = func(inv, from_list, from_index, to_list, to_index, count, player),
         on_put = func(inv, listname, index, stack, player),
         on_take = func(inv, listname, index, stack, player),
-    --  ^ Called after the actual action has happened, according to what was
-    --  ^ allowed.
-    --  ^ No return value
+        -- Called after the actual action has happened, according to what was
+        -- allowed.
+        -- No return value.
     }
 
 HUD Definition
 --------------
 
-Used by `minetest.hud_add`. Returned by `minetest.hud_get`.
+See [HUD] section.
+
+Used by `Player:hud_add`. Returned by `Player:hud_get`.
 
     {
-        hud_elem_type = "image", -- see HUD element types
-    --  ^ type of HUD element, can be either of "image", "text", "statbar",
-          "inventory".
+        hud_elem_type = "image",  -- See HUD element types
+        -- Type of element, can be "image", "text", "statbar", or "inventory"
+
         position = {x=0.5, y=0.5},
-    --  ^ Left corner position of element
+        -- Left corner position of element
+
         name = "<name>",
+
         scale = {x = 2, y = 2},
+
         text = "<text>",
+
         number = 2,
+
         item = 3,
-    --  ^ Selected item in inventory.  0 for no item selected.
+        -- Selected item in inventory. 0 for no item selected.
+
         direction = 0,
-    --  ^ Direction: 0: left-right, 1: right-left, 2: top-bottom, 3: bottom-top
+        -- Direction: 0: left-right, 1: right-left, 2: top-bottom, 3: bottom-top
+
         alignment = {x=0, y=0},
-    --  ^ See "HUD Element Types"
+
         offset = {x=0, y=0},
-    --  ^ See "HUD Element Types"
+
         size = { x=100, y=100 },
-    --  ^ Size of element in pixels
+        -- Size of element in pixels
     }
 
 Particle definition
@@ -6211,26 +6628,41 @@ Used by `minetest.add_particle`.
         pos = {x=0, y=0, z=0},
         velocity = {x=0, y=0, z=0},
         acceleration = {x=0, y=0, z=0},
-    --  ^ Spawn particle at pos with velocity and acceleration
+        -- Spawn particle at pos with velocity and acceleration
+
         expirationtime = 1,
-    --  ^ Disappears after expirationtime seconds
+        -- Disappears after expirationtime seconds
+
         size = 1,
+        -- Scales the visual size of the particle texture.
+
         collisiondetection = false,
-    --  ^ collisiondetection: if true collides with physical objects
+        -- If true collides with `walkable` nodes and, depending on the
+        -- `object_collision` field, objects too.
+
         collision_removal = false,
-    --  ^ collision_removal: if true then particle is removed when it collides,
-    --  ^ requires collisiondetection = true to have any effect
+        -- If true particle is removed when it collides.
+        -- Requires collisiondetection = true to have any effect.
+
+        object_collision = false,
+        -- If true particle collides with objects that are defined as
+        -- `physical = true,` and `collide_with_objects = true,`.
+        -- Requires collisiondetection = true to have any effect.
+
         vertical = false,
-    --  ^ vertical: if true faces player using y axis only
+        -- If true faces player using y axis only
+
         texture = "image.png",
-    --  ^ Uses texture (string)
+
         playername = "singleplayer",
-    --  ^ Optional, if specified spawns particle only on the player's client
+        -- Optional, if specified spawns particle only on the player's client
+
         animation = {Tile Animation definition},
-    --  ^ Optional, specifies how to animate the particle texture
+        -- Optional, specifies how to animate the particle texture
+
         glow = 0
-    --  ^ Optional, specify particle self-luminescence in darkness.
-    --  ^ Values 0-14.
+        -- Optional, specify particle self-luminescence in darkness.
+        -- Values 0-14.
     }
 
 
@@ -6241,9 +6673,13 @@ Used by `minetest.add_particlespawner`.
 
     {
         amount = 1,
+        -- Number of particles spawned over the time period `time`.
+
         time = 1,
-    --  ^ If time is 0 has infinite lifespan and spawns the amount on a
-    --  ^ per-second basis.
+        -- Lifespan of spawner in seconds.
+        -- If time is 0 spawner has infinite lifespan and spawns the `amount` on
+        -- a per-second basis.
+
         minpos = {x=0, y=0, z=0},
         maxpos = {x=0, y=0, z=0},
         minvel = {x=0, y=0, z=0},
@@ -6254,30 +6690,41 @@ Used by `minetest.add_particlespawner`.
         maxexptime = 1,
         minsize = 1,
         maxsize = 1,
-    --  ^ The particle's properties are random values in between the bounds:
-    --  ^ minpos/maxpos, minvel/maxvel (velocity),
-    --  ^ minacc/maxacc (acceleration), minsize/maxsize,
-    --  ^ minexptime/maxexptime (expirationtime).
+        -- The particles' properties are random values between the min and max
+        -- values.
+        -- pos, velocity, acceleration, expirationtime, size
+
         collisiondetection = false,
-    --  ^ collisiondetection: if true uses collision detection
+        -- If true collide with `walkable` nodes and, depending on the
+        -- `object_collision` field, objects too.
+
         collision_removal = false,
-    --  ^ collision_removal: if true then particle is removed when it collides,
-    --  ^ requires collisiondetection = true to have any effect
+        -- If true particles are removed when they collide.
+        -- Requires collisiondetection = true to have any effect.
+
+        object_collision = false,
+        -- If true particles collide with objects that are defined as
+        -- `physical = true,` and `collide_with_objects = true,`.
+        -- Requires collisiondetection = true to have any effect.
+
         attached = ObjectRef,
-    --  ^ attached: if defined, particle positions, velocities and
-    --  ^ accelerations are relative to this object's position and yaw.
+        -- If defined, particle positions, velocities and accelerations are
+        -- relative to this object's position and yaw
+
         vertical = false,
-    --  ^ vertical: if true faces player using y axis only
+        -- If true face player using y axis only
+
         texture = "image.png",
-    --  ^ Uses texture (string)
-        playername = "singleplayer"
-    --  ^ Playername is optional, if specified spawns particle only on the
-    --  ^ player's client.
+
+        playername = "singleplayer",
+        -- Optional, if specified spawns particles only on the player's client
+
         animation = {Tile Animation definition},
-    --  ^ Optional, specifies how to animate the particle texture
+        -- Optional, specifies how to animate the particles' texture
+
         glow = 0
-    --  ^ Optional, specify particle self-luminescence in darkness.
-    --  ^ Values 0-14.
+        -- Optional, specify particle self-luminescence in darkness.
+        -- Values 0-14.
     }
 
 `HTTPRequest` definition
@@ -6287,23 +6734,28 @@ Used by `HTTPApiTable.fetch` and `HTTPApiTable.fetch_async`.
 
     {
         url = "http://example.org",
+
         timeout = 10,
-    --  ^ Timeout for connection in seconds. Default is 3 seconds.
+        -- Timeout for connection in seconds. Default is 3 seconds.
+
         post_data = "Raw POST request data string" OR {field1 = "data1", field2 = "data2"},
-    --  ^ Optional, if specified a POST request with post_data is performed.
-    --  ^ Accepts both a string and a table. If a table is specified, encodes
-    --  ^ table as x-www-form-urlencoded key-value pairs.
-    --  ^ If post_data ist not specified, a GET request is performed instead.
+        -- Optional, if specified a POST request with post_data is performed.
+        -- Accepts both a string and a table. If a table is specified, encodes
+        -- table as x-www-form-urlencoded key-value pairs.
+        -- If post_data is not specified, a GET request is performed instead.
+
         user_agent = "ExampleUserAgent",
-    --  ^ Optional, if specified replaces the default minetest user agent with
-    --  ^ given string.
+        -- Optional, if specified replaces the default minetest user agent with
+        -- given string
+
         extra_headers = { "Accept-Language: en-us", "Accept-Charset: utf-8" },
-    --  ^ Optional, if specified adds additional headers to the HTTP request.
-    --  ^ You must make sure that the header strings follow HTTP specification
-    --  ^ ("Key: Value").
+        -- Optional, if specified adds additional headers to the HTTP request.
+        -- You must make sure that the header strings follow HTTP specification
+        -- ("Key: Value").
+
         multipart = boolean
-    --  ^ Optional, if true performs a multipart HTTP request.
-    --  ^ Default is false.
+        -- Optional, if true performs a multipart HTTP request.
+        -- Default is false.
     }
 
 `HTTPRequestResult` definition
@@ -6314,14 +6766,18 @@ Passed to `HTTPApiTable.fetch` callback. Returned by
 
     {
         completed = true,
-    --  ^ If true, the request has finished (either succeeded, failed or timed
-          out).
+        -- If true, the request has finished (either succeeded, failed or timed
+        -- out)
+
         succeeded = true,
-    --  ^ If true, the request was successful
+        -- If true, the request was successful
+
         timeout = false,
-    --  ^ If true, the request timed out
+        -- If true, the request timed out
+
         code = 200,
-    --  ^ HTTP status code
+        -- HTTP status code
+
         data = "response"
     }
 
@@ -6332,30 +6788,37 @@ Used by `minetest.register_authentication_handler`.
 
     {
         get_auth = func(name),
-    --  ^ Get authentication data for existing player `name` (`nil` if player
-          doesn't exist).
-    --  ^ returns following structure:
-    --  ^ `{password=<string>, privileges=<table>, last_login=<number or nil>}`
+        -- Get authentication data for existing player `name` (`nil` if player
+        -- doesn't exist).
+        -- Returns following structure:
+        -- `{password=<string>, privileges=<table>, last_login=<number or nil>}`
+
         create_auth = func(name, password),
-    --  ^ Create new auth data for player `name`
-    --  ^ Note that `password` is not plain-text but an arbitrary
-    --  ^ representation decided by the engine
+        -- Create new auth data for player `name`.
+        -- Note that `password` is not plain-text but an arbitrary
+        -- representation decided by the engine.
+
         delete_auth = func(name),
-    --  ^ Delete auth data of player `name`, returns boolean indicating success
-    --  ^ (false if player nonexistant).
+        -- Delete auth data of player `name`.
+        -- Returns boolean indicating success (false if player is nonexistent).
+
         set_password = func(name, password),
-    --  ^ Set password of player `name` to `password`
-           Auth data should be created if not present
+        -- Set password of player `name` to `password`.
+        -- Auth data should be created if not present.
+
         set_privileges = func(name, privileges),
-    --  ^ Set privileges of player `name`
-    --  ^ `privileges` is in table form, auth data should be created if not
-    --  ^ present.
+        -- Set privileges of player `name`.
+        -- `privileges` is in table form, auth data should be created if not
+        -- present.
+
         reload = func(),
-    --  ^ Reload authentication data from the storage location
-    --  ^ Returns boolean indicating success
+        -- Reload authentication data from the storage location.
+        -- Returns boolean indicating success.
+
         record_login = func(name),
-    --  ^ Called when player joins, used for keeping track of last_login
+        -- Called when player joins, used for keeping track of last_login
+
         iterate = func(),
-    --  ^ Returns an iterator (use with `for` loops) for all player names
-    --  ^ currently in the auth database.
+        -- Returns an iterator (use with `for` loops) for all player names
+        -- currently in the auth database
     }