* Developer Wiki: <http://dev.minetest.net/>
-
-
Introduction
============
Paths
-----
* `RUN_IN_PLACE=1` (Windows release, local build)
- * `$path_user`:
- * Linux: `<build directory>`
- * Windows: `<build directory>`
- * `$path_share`
- * Linux: `<build directory>`
- * Windows: `<build directory>`
+ * `$path_user`: `<build directory>`
+ * `$path_share`: `<build directory>`
* `RUN_IN_PLACE=0`: (Linux release)
- * `$path_share`
+ * `$path_share`:
* Linux: `/usr/share/minetest`
* Windows: `<install directory>/minetest-0.4.x`
* `$path_user`:
texturepack, overriding mod textures.
Any server texturepack will override mod textures and the game texturepack.
-### Menu images
+Menu images
+-----------
Games can provide custom main menu images. They are put inside a `menu`
directory inside the game directory.
$world/game/
-Mods should be then be placed in:
+Mods should then be placed in:
$world/game/mods/
-----------------------
mods
- |-- modname
- | |-- mod.conf
- | |-- screenshot.png
- | |-- settingtypes.txt
- | |-- init.lua
- | |-- models
- | |-- textures
- | | |-- modname_stuff.png
- | | `-- modname_something_else.png
- | |-- sounds
- | |-- media
- | |-- locale
- | `-- <custom data>
- `-- another
+ ├── modname
+ │ ├── mod.conf
+ │ ├── screenshot.png
+ │ ├── settingtypes.txt
+ │ ├── init.lua
+ │ ├── models
+ │ ├── textures
+ │ │ ├── modname_stuff.png
+ │ │ └── modname_something_else.png
+ │ ├── sounds
+ │ ├── media
+ │ ├── locale
+ │ └── <custom data>
+ └── another
### modname
The location of this directory can be fetched by using
### Aliases needed for all mapgens except Mapgen v6
-Base terrain:
-
-"mapgen_stone"
-"mapgen_water_source"
-"mapgen_river_water_source"
+#### Base terrain
+* mapgen_stone
+* mapgen_water_source
+* mapgen_river_water_source
-Caves:
-
-"mapgen_lava_source"
-
-Dungeons:
+#### Caves
+* mapgen_lava_source
+#### Dungeons
Only needed for registered biomes where 'node_stone' is stone:
-"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
+* mapgen_cobble
+* mapgen_stair_cobble
+* mapgen_mossycobble
-Terrain and biomes:
+Only needed for registered biomes where 'node_stone' is desert stone:
-"mapgen_stone"
-"mapgen_water_source"
-"mapgen_lava_source"
-"mapgen_dirt"
-"mapgen_dirt_with_grass"
-"mapgen_sand"
-"mapgen_gravel"
-"mapgen_desert_stone"
-"mapgen_desert_sand"
-"mapgen_dirt_with_snow"
-"mapgen_snowblock"
-"mapgen_snow"
-"mapgen_ice"
+* mapgen_desert_stone
+* mapgen_stair_desert_stone
-Flora:
+Only needed for registered biomes where 'node_stone' is sandstone:
-"mapgen_tree"
-"mapgen_leaves"
-"mapgen_apple"
-"mapgen_jungletree"
-"mapgen_jungleleaves"
-"mapgen_junglegrass"
-"mapgen_pine_tree"
-"mapgen_pine_needles"
+* mapgen_sandstone
+* mapgen_sandstonebrick
+* mapgen_stair_sandstone_block
-Dungeons:
+### Aliases needed for Mapgen v6
-"mapgen_cobble"
-"mapgen_stair_cobble"
-"mapgen_mossycobble"
-"mapgen_stair_desert_stone"
+#### Terrain and biomes
+* mapgen_stone
+* mapgen_water_source
+* mapgen_lava_source
+* mapgen_dirt
+* mapgen_dirt_with_grass
+* mapgen_sand
+* mapgen_gravel
+* mapgen_desert_stone
+* mapgen_desert_sand
+* mapgen_dirt_with_snow
+* mapgen_snowblock
+* mapgen_snow
+* mapgen_ice
+
+#### Flora
+* mapgen_tree
+* mapgen_leaves
+* mapgen_apple
+* mapgen_jungletree
+* mapgen_jungleleaves
+* mapgen_junglegrass
+* mapgen_pine_tree
+* mapgen_pine_needles
+
+#### Dungeons
+* mapgen_cobble
+* mapgen_stair_cobble
+* mapgen_mossycobble
+* mapgen_stair_desert_stone
* `[cracko:<t>:<n>:<p>`
Parameters:
+
* `<t>` = tile count (in each direction)
* `<n>` = animation frame count
* `<p>` = current animation frame
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`.
When you register an item or node, set its `color` field (which accepts a
`ColorSpec`) to the desired color.
-An `ItemStack`s static color can be overwritten by the `color` metadata
+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 methods. To disable the coloring of a face,
+other coloring method. To disable the coloring of a face,
set its color to white (because multiplying with white does nothing).
You can set the `color` property of the tiles in the node's definition
if the tile is in table format.
Looped sounds must either be connected to an object or played locationless to
one player using `to_player = name,`
-### `SimpleSoundSpec`
+`SimpleSoundSpec`
+-----------------
* e.g. `""`
* e.g. `"default_place_node"`
* e.g. `{}`
-Registered definitions of stuff
-===============================
+Registered definitions
+======================
-Anything added using certain `minetest.register_*` functions get added to
+Anything added using certain `minetest.register_*` functions gets added to
the global `minetest.registered_*` tables.
* `minetest.register_entity(name, prototype table)`
space of a cube. Huge amounts of them are handled efficiently, but they
are quite static.
-The definition of a node is stored and can be accessed by name in
+The definition of a node is stored and can be accessed by using
minetest.registered_nodes[node.name]
-See "Registered definitions of stuff".
+See "Registered definitions".
Nodes are passed by value between Lua and the engine.
They are represented by a table:
Representations of simple things
================================
-### Position/vector
+Position/vector
+---------------
{x=num, y=num, z=num}
For helper functions see "Spatial Vectors".
-### `pointed_thing`
+`pointed_thing`
+---------------
* `{type="nothing"}`
* `{type="node", under=pos, above=pos}`
* `{type="object", ref=ObjectRef}`
Items
=====
-### Item types
+Item types
+----------
There are three kinds of items: nodes, tools and craftitems.
* Node (`register_node`): A node from the world.
things according to `tool_capabilities`.
* Craftitem (`register_craftitem`): A miscellaneous item.
-### Amount and wear
+Amount and wear
+---------------
All item stacks have an amount between 0 to 65535. It is 1 by
default. Tool item stacks can not have an amount greater than 1.
1 to 65535 are used for worn tools, where a higher value stands for
a higher wear. Non-tools always have a wear value of 0.
-### Item formats
+Item formats
+------------
Items and item stacks can exist in three formats: Serializes, table format
and `ItemStack`.
-#### Serialized
+### 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:
* `'default:pick_stone'`: a new stone pickaxe
* `'default:pick_wood 1 21323'`: a wooden pickaxe, ca. 1/3 worn out
-#### Table format
+### Table format
Examples:
5 dirt nodes:
{name="default:apple", count=1, wear=0, metadata=""}
-#### `ItemStack`
+### `ItemStack`
A native C++ format with many helper methods. Useful for converting
between formats. See the Class reference section for details.
tool) in such a way that the engine and other mods can can interact with
the thing without actually knowing what the thing is.
-### Usage
+Usage
+-----
Groups are stored in a table, having the group names with keys and the
group ratings as values. For example:
minetest.get_item_group(itemname, groupname)
-### Groups of items
+Groups of items
+---------------
Groups of items can define what kind of an item it is (e.g. wool).
-### Groups of nodes
+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
+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".
object.get_armor_groups() --> a group-rating table (e.g. {fleshy=100})
object.set_armor_groups({fleshy=30, cracky=80})
-### Groups of tools
+Groups of tools
+---------------
Groups in tools define which groups of nodes and entities they are
effective towards.
-### Groups in crafting recipes
+Groups in crafting recipes
+--------------------------
An example: Make meat soup from any meat, any water and any bowl:
{
recipe = {'wool:white', 'group:dye,basecolor_red'},
}
-### Special groups
+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
Slipperiness rises steadily with `slippery` value, starting at 1.
-### Known damage and digging time defining groups
+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
speed of a tool if the tool can dig at a faster speed than this
suggests for the hand.
-### Examples of custom 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
* `weapon`: any weapon
* `heavy`: anything considerably heavy
-### Digging time calculation specifics
+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.
Tools
=====
-#### Tools definition
+Tools definition
+----------------
Tools define:
* Full punch interval
* Digging times
* Damage groups
-#### Full punch interval
+### Full punch interval
+
When used as a weapon, the tool will do full damage if this time is spent
between punches. If e.g. half the time is spent, the tool will do half
damage.
-#### Maximum drop level
+### Maximum drop level
+
Suggests the maximum level of node, when dug with the tool, that will drop
it's useful item. (e.g. iron ore to drop a lump of iron).
This is not automated; it is the responsibility of the node definition
to implement this.
-#### Uses
+### Uses
+
Determines how many uses the tool has when it is used for digging a node,
of this group, of the maximum level. For lower leveled nodes, the use count
is multiplied by `3^leveldiff`.
* `uses=10, leveldiff=1`: actual uses: 30
* `uses=10, leveldiff=2`: actual uses: 90
-#### Maximum level
+### Maximum level
+
Tells what is the maximum level of a node of this group that the tool will
be able to dig.
-#### Digging times
+### Digging times
+
List of digging times for different ratings of the group, for nodes of the
maximum level.
digging nodes; If the player releases LMB after digging, this delay is set to 0,
i.e. players can more quickly click the nodes away instead of holding LMB.
-#### Damage groups
+### Damage groups
+
List of damage for groups of entities. See "Entity damage mechanism".
-#### Example definition of the capabilities of a tool
+Example definition of the capabilities of a tool
+------------------------------------------------
tool_capabilities = {
full_punch_interval=1.5,
using player:set_formspec_prepend(), which may be the reason backgrounds are
appearing when you don't expect them to. See `no_prepend[]`
-### Examples
+Examples
+--------
-#### Chest
+### Chest
size[8,9]
list[context;main;0,0;8,4;]
list[current_player;main;0,5;8,4;]
-#### Furnace
+### Furnace
size[8,9]
list[context;fuel;2,3;1,1;]
list[context;dst;5,1;2,2;]
list[current_player;main;0,5;8,4;]
-#### Minecraft-like player inventory
+### Minecraft-like player inventory
size[8,7.5]
image[1,0.6;1,2;player.png]
list[current_player;craft;3,0;3,3;]
list[current_player;craftpreview;7,1;1,1;]
-### Elements
+Elements
+--------
-#### `size[<W>,<H>,<fixed_size>]`
+### `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>]`
+### `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,
* [1.0, 1.0] sets the position to the bottom right of the game window.
* Defaults to the center of the game window [0.5, 0.5].
-#### `anchor[<X>,<Y>]`
+### `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,
* `position` and `anchor` elements need suitable values to avoid a formspec
extending off the game window due to particular game window sizes.
-#### `no_prepend[]`
+### `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>]`
+### `container[<X>,<Y>]`
* Start of a container block, moves all physical elements in the container by
(X, Y).
* Must have matching `container_end`
* Containers can be nested, in which case the offsets are added
(child containers are relative to parent containers)
-#### `container_end[]`
+### `container_end[]`
* End of a container, following elements are no longer relative to this
container.
-#### `list[<inventory location>;<list name>;<X>,<Y>;<W>,<H>;]`
+### `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>]`
+### `list[<inventory location>;<list name>;<X>,<Y>;<W>,<H>;<starting item index>]`
* Show an inventory list
-#### `listring[<inventory location>;<list name>]`
+### `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
* The first occurrence of an element inside the ring will
determine the inventory where items will be sent to
-#### `listring[]`
+### `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>]`
+### `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>]`
+### `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>]`
+### `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
* Sets default background color of tooltips
* Sets default font color of tooltips
-#### `tooltip[<gui_element_name>;<tooltip_text>;<bgcolor>;<fontcolor>]`
+### `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)
-#### `image[<X>,<Y>;<W>,<H>;<texture name>]`
+### `image[<X>,<Y>;<W>,<H>;<texture name>]`
* Show an image
* Position and size units are inventory slots
-#### `item_image[<X>,<Y>;<W>,<H>;<item name>]`
+### `item_image[<X>,<Y>;<W>,<H>;<item name>]`
* Show an inventory image of registered item/node
* Position and size units are inventory slots
-#### `bgcolor[<color>;<fullscreen>]`
+### `bgcolor[<color>;<fullscreen>]`
* Sets background color of formspec as `ColorString`
* If `true`, the background color is drawn fullscreen (does not effect the size
of the formspec).
-#### `background[<X>,<Y>;<W>,<H>;<texture name>]`
+### `background[<X>,<Y>;<W>,<H>;<texture name>]`
* Use a background. Inventory rectangles are not drawn then.
* Position and size units are inventory slots
* 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>]`
+### `background[<X>,<Y>;<W>,<H>;<texture name>;<auto_clip>]`
* Use a background. Inventory rectangles are not drawn then.
* Position and size units are inventory slots
* Example for formspec 8x4 in 16x resolution:
* If `true` the background is clipped to formspec size
(`x` and `y` are used as offset values, `w` and `h` are ignored)
-#### `pwdfield[<X>,<Y>;<W>,<H>;<name>;<label>]`
+### `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.
* `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
-#### `field[<X>,<Y>;<W>,<H>;<name>;<label>;<default>]`
+### `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.
* **Note**: no extra text or more than a single variable is supported ATM.
* See `field_close_on_enter` to stop enter closing the formspec
-#### `field[<name>;<label>;<default>]`
+### `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.
* A "Proceed" button will be added automatically
* See `field_close_on_enter` to stop enter closing the formspec
-#### `field_close_on_enter[<name>;<close_on_enter>]`
+### `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>]`
+### `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 readonly, the label is not displayed.
-#### `label[<X>,<Y>;<label>]`
+### `label[<X>,<Y>;<label>]`
* `x` and `y` work as per field
* `label` is the text on the label
* Position and size units are inventory slots
-#### `vertlabel[<X>,<Y>;<label>]`
+### `vertlabel[<X>,<Y>;<label>]`
* Textual label drawn vertically
* `x` and `y` work as per field
* `label` is the text on the label
* Position and size units are inventory slots
-#### `button[<X>,<Y>;<W>,<H>;<name>;<label>]`
+### `button[<X>,<Y>;<W>,<H>;<name>;<label>]`
* Clickable button. When clicked, fields will be sent.
* `x`, `y` and `name` work as per field
* `w` and `h` are the size of the button
* `label` is the text on the button
* Position and size units are inventory slots
-#### `image_button[<X>,<Y>;<W>,<H>;<texture name>;<name>;<label>]`
+### `image_button[<X>,<Y>;<W>,<H>;<texture name>;<name>;<label>]`
* `x`, `y`, `w`, `h`, and `name` work as per button
* `texture name` is the filename of an image
* Position and size units are inventory slots
-#### `image_button[<X>,<Y>;<W>,<H>;<texture name>;<name>;<label>;<noclip>;<drawborder>;<pressed texture name>]`
+### `image_button[<X>,<Y>;<W>,<H>;<texture name>;<name>;<label>;<noclip>;<drawborder>;<pressed texture name>]`
* `x`, `y`, `w`, `h`, and `name` work as per button
* `texture name` is the filename of an image
* Position and size units are inventory slots
* `drawborder`: draw button border or not
* `pressed texture name` is the filename of an image on pressed state
-#### `item_image_button[<X>,<Y>;<W>,<H>;<item name>;<name>;<label>]`
+### `item_image_button[<X>,<Y>;<W>,<H>;<item name>;<name>;<label>]`
* `x`, `y`, `w`, `h`, `name` and `label` work as per button
* `item name` is the registered name of an item/node,
tooltip will be made out of its description
to override it use tooltip element
* Position and size units are inventory slots
-#### `button_exit[<X>,<Y>;<W>,<H>;<name>;<label>]`
+### `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>]`
+### `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>]`
+### `textlist[<X>,<Y>;<W>,<H>;<name>;<listelem 1>,<listelem 2>,...,<listelem n>]`
* Scrollable item list showing arbitrary text elements
* `x` and `y` position the itemlist relative to the top left of the menu
* `w` and `h` are the size of the itemlist
(only).
* if you want a listelement to start with "#" write "##".
-#### `textlist[<X>,<Y>;<W>,<H>;<name>;<listelem 1>,<listelem 2>,...,<listelem n>;<selected idx>;<transparent>]`
+### `textlist[<X>,<Y>;<W>,<H>;<name>;<listelem 1>,<listelem 2>,...,<listelem n>;<selected idx>;<transparent>]`
* Scrollable itemlist showing arbitrary text elements
* `x` and `y` position the item list relative to the top left of the menu
* `w` and `h` are the size of the item list
* See also `minetest.explode_textlist_event`
(main menu: `core.explode_textlist_event`).
-#### `tabheader[<X>,<Y>;<name>;<caption 1>,<caption 2>,...,<caption n>;<current_tab>;<transparent>;<draw_border>]`
+### `tabheader[<X>,<Y>;<name>;<caption 1>,<caption 2>,...,<caption n>;<current_tab>;<transparent>;<draw_border>]`
* Show a tab**header** at specific position (ignores formsize)
* `x` and `y` position the itemlist relative to the top left of the menu
* `name` fieldname data is transferred to Lua
* `transparent` (optional): show transparent
* `draw_border` (optional): draw border
-#### `box[<X>,<Y>;<W>,<H>;<color>]`
+### `box[<X>,<Y>;<W>,<H>;<color>]`
* Simple colored box
* `x` and `y` position the box relative to the top left of the menu
* `w` and `h` are the size of 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>]`
+### `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)
* Items to be shown in dropdown
* Index of currently selected dropdown item
-#### `checkbox[<X>,<Y>;<name>;<label>;<selected>]`
+### `checkbox[<X>,<Y>;<name>;<label>;<selected>]`
* Show a checkbox
* `x` and `y`: position of 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>]`
+### `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)
* See also `minetest.explode_scrollbar_event`
(main menu: `core.explode_scrollbar_event`).
-#### `table[<X>,<Y>;<W>,<H>;<name>;<cell 1>,<cell 2>,...,<cell n>;<selected idx>]`
+### `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[]`
* `x` and `y`: position the itemlist relative to the top left of the menu
* See also `minetest.explode_table_event`
(main menu: `core.explode_table_event`).
-#### `tableoptions[<opt 1>;<opt 2>;...]`
+### `tableoptions[<opt 1>;<opt 2>;...]`
* Sets options for `table[]`
* `color=#RRGGBB`
* default text color (`ColorString`), defaults to `#FFFFFF`
* all subtrees up to `depth < value` are open (default value = `0`)
* only useful when there is a column of type "tree"
-#### `tablecolumns[<type 1>,<opt 1a>,<opt 1b>,...;<type 2>,<opt 2a>,<opt 2b>;...]`
+### `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
-Colours
-=======
+Colors
+======
`ColorString`
-------------
Texts can be translated client-side with the help of `minetest.translate` and
translation files.
-### Translating a string
+Translating a string
+--------------------
Two functions are provided to translate strings: `minetest.translate` and
`minetest.get_translator`.
this will be displayed as "Laine Rouge" on clients with a French locale.
-### Operations on translated strings
+Operations on translated strings
+--------------------------------
The output of `minetest.translate` is a string, with escape sequences adding
additional information to that string so that it can be translated on the
sentences by breaking them into parts; arguments should be used instead), and
operations such as `minetest.colorize` which are also concatenation.
-### Translation file format
+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:
There must be no extraneous whitespace around the `=` or at the beginning or
the end of the line.
-### Escapes
+Escapes
+-------
Strings that need to be translated can contain several escapes, preceded by `@`.
* `@@` acts as a literal `@`.
and humidity to distribute biomes, vary the density of decorations or vary the
structure of ores.
-### Structure of perlin noise
+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.
The varying types of decorations that can be placed.
-### `simple`
+`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
This type of decoration is intended for placement of grass, flowers, cacti,
papyri, waterlilies and so on.
-### `schematic`
+`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
Lua Voxel Manipulator
=====================
-### About VoxelManip
+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
A recent simple test of setting cubic areas showed that `minetest.set_node()`
is faster than a VoxelManip for a 3x3x3 node cube or smaller.
-### Using VoxelManip
+Using VoxelManip
+----------------
A VoxelManip object can be created any time using either:
`VoxelManip([p1, p2])`, or `minetest.get_voxel_manip([p1, p2])`.
changes can be committed back to the map by calling `VoxelManip:write_to_map()`
-#### Flat array format
+### Flat array format
Let
`Nx = p2.X - p1.X + 1`,
`Ny = p2.Y - p1.Y + 1`, and
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
+### 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
* `minetest.CONTENT_AIR`: ID for "air" nodes
* `minetest.CONTENT_IGNORE`: ID for "ignore" nodes
-#### Mapgen VoxelManip objects
+### 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
necessary to update lighting information using either:
`VoxelManip:calc_lighting()` or `VoxelManip:set_lighting()`.
-#### Other API functions operating on a VoxelManip
+### 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
directly on the map at the specified position, it will place the schematic
inside the VoxelManip.
-#### Notes
+### 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()`.
to write map data to instead of returning a new table each call. This greatly
enhances performance by avoiding unnecessary memory allocations.
-### Methods
+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`
`minetest.set_data()` on the loaded area elsewhere.
* `get_emerged_area()`: Returns actual emerged minimum and maximum positions.
-### `VoxelArea`
+`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
+### 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
The following Mapgen objects are currently available:
### `voxelmanip`
+
This returns three values; the `VoxelManip` object to be used, minimum and
maximum emerged position, in that order. All mapgens support this object.
### `heightmap`
+
Returns an array containing the y coordinates of the ground levels of nodes in
the most recently generated chunk by the current mapgen.
### `biomemap`
+
Returns an array containing the biome IDs of nodes in the most recently
generated chunk by the current mapgen.
### `heatmap`
+
Returns an array containing the temperature values of nodes in the most
recently generated chunk by the current mapgen.
### `humiditymap`
+
Returns an array containing the humidity values of nodes in the most recently
generated chunk by the current mapgen.
### `gennotify`
+
Returns a table mapping requested generation notification types to arrays of
positions at which the corresponding generated structures are located within
the current chunk. To set the capture of positions of interest to be recorded
L-system trees
==============
-### Tree definition
+Tree definition
+---------------
treedef={
axiom, --string initial tree axiom
will create one.
}
-### Key for Special L-System Symbols used in Axioms
+Key for Special L-System Symbols used in Axioms
+-----------------------------------------------
* `G`: move forward one unit with the pen up
* `F`: move forward one unit with the pen down drawing trunks and branches
* `[`: save in stack current state info
* `]`: recover from stack state info
-### Example
+Example
+-------
Spawn a small apple tree:
pos = {x=230,y=20,z=4}
'minetest' namespace reference
==============================
-### Utilities
+Utilities
+---------
* `minetest.get_current_modname()`: returns the currently loading mod's name,
when loading a mod.
* `data`: string of data to hash
* `raw`: return raw bytes instead of hex digits, default: false
-### Logging
+Logging
+-------
* `minetest.debug(...)`
* Equivalent to `minetest.log(table.concat({...}, "\t"))`
* `minetest.log([level,] text)`
* `level` is one of `"none"`, `"error"`, `"warning"`, `"action"`,
`"info"`, or `"verbose"`. Default is `"none"`.
-### Registration functions
+Registration functions
+----------------------
Call these functions only at load time!
* `minetest.register_entity(name, prototype table)`
* `minetest.clear_registered_biomes()`
* `minetest.clear_registered_decorations()`
-### Global callback registration functions
+Global callback registration functions
+--------------------------------------
Call these functions only at load time!
* `minetest.register_globalstep(func(dtime))`
* You should have joined some channels to receive events.
* If message comes from a server mod, `sender` field is an empty string.
-### Other registration functions
+Other registration functions
+----------------------------
* `minetest.register_chatcommand(cmd, chatcommand definition)`
* Adds definition to `minetest.registered_chatcommands`
* `minetest.override_chatcommand(name, redefinition)`
* Registers an auth handler that overrides the builtin one
* This function can be called by a single mod once only.
-### Setting-related
+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
parses it as a position (in the format `(1,2,3)`). Returns a position or nil.
-### Authentication
+Authentication
+--------------
* `minetest.string_to_privs(str)`: returns `{priv1=true,...}`
* `minetest.privs_to_string(privs)`: returns `"priv1,priv2,..."`
* Convert between two privilege representations
`minetest_get_player_privs` and `minetest.auth_reload` call the authentication
handler.
-### Chat
+Chat
+----
* `minetest.chat_send_all(text)`
* `minetest.chat_send_player(name, text)`
-### Environment access
+Environment access
+------------------
* `minetest.set_node(pos, node)`
* `minetest.add_node(pos, node): alias to `minetest.set_node`
* Set node at position `pos`
* The spawn level is intentionally above terrain level to cope with
full-node biome 'dust' nodes.
-### Mod channels
+Mod channels
+------------
You can find mod channels communication scheme in `docs/mod_channels.png`.
* `minetest.mod_channel_join(channel_name)`
`minetest.register_on_modchannel_message` call to receive incoming
messages.
-### Inventory
+Inventory
+---------
`minetest.get_inventory(location)`: returns an `InvRef`
* `location` = e.g.
returns left over ItemStack.
* See `minetest.item_eat` and `minetest.register_on_item_eat`
-### Formspec
+Formspec
+--------
* `minetest.show_formspec(playername, formname, formspec)`
* `playername`: name of player to show formspec
* `formname`: name passed to `on_player_receive_fields` callbacks.
* `"CHG"`: has been changed
* `"VAL"`: not changed
-### Item handling
+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)`
table and native form.
* `colorstring`: the new color of the item stack
-### Rollback
+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
* Revert latest actions of someone
* `actor`: `"player:<name>"`, also `"liquid"`.
-### Defaults for the `on_*` item definition functions
+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])`
different spot. Can be `nil`
* See `minetest.do_item_eat`
-### Defaults for the `on_punch` and `on_dig` node definition callbacks
+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)`
* Checks if node can be dug, puts item into inventory, removes node
* Calls functions registered by `minetest.registered_on_dignodes()`
-### Sounds
+Sounds
+------
* `minetest.sound_play(spec, parameters)`: returns a handle
* `spec` is a `SimpleSoundSpec`
* `parameters` is a sound parameter table
the sound volume.
* `gain` the target gain for the fade.
-### Timing
+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
+Server
+------
* `minetest.request_shutdown([message],[reconnect],[delay])`: request for
server shutdown. Will display `message` to clients.
* `reconnect` == true displays a reconnect button
* `minetest.remove_player_auth(name)`: remove player authentication data
* Returns boolean indicating success (false if player nonexistant)
-### Bans
+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)
* `minetest.kick_player(name, [reason])`: disconnect a player with a optional
reason.
-### Particles
+Particles
+---------
* `minetest.add_particle(particle definition)`
* Deprecated: `minetest.add_particle(pos, velocity, acceleration,
expirationtime, size, collisiondetection, texture, playername)`
* If playername is specified, only deletes on the player's client,
otherwise on all clients.
-### Schematics
+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.
the Lua code generated will use that number of spaces as indentation
instead of a tab character.
-### HTTP Requests:
+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
* `HTTPApiTable.fetch_async_get(handle)`: returns HTTPRequestResult
* Return response data for given asynchronous HTTP request
-### Storage API:
+Storage API:
+------------
* `minetest.get_mod_storage()`:
* returns reference to mod private `StorageRef`
* must be called during mod load time
-### Misc.
+Misc.
+-----
* `minetest.get_connected_players()`: returns list of `ObjectRefs`
* `minetest.is_player(o)`: boolean, whether `o` is a player
* `minetest.player_exists(name)`: boolean, whether player exists
* `minetest.global_exists(name)`
* Checks if a global variable has been set, without triggering a warning.
-### Global objects
+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)`
instead of `minetest.somefunction(somearguments)`
* Deprecated, but support is not to be dropped soon
-### Global tables
+Global tables
+-------------
* `minetest.registered_items`
* Map of registered items, indexed by name
* `minetest.registered_nodes`
Sorted alphabetically.
-### `AreaStore`
+`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.
If you chose the parameter-less constructor, a fast implementation will be
automatically chosen for you.
-#### Methods
+### 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
* `from_file(filename)`: Experimental. Like `from_string()`, but reads the data
from a file.
-### `InvRef`
+`InvRef`
+--------
An `InvRef` is a reference to an inventory.
-#### Methods
+### 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
`minetest.get_inventory(location)`.
* returns `{type="undefined"}` in case location is not known
-### `ItemStack`
+`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
+### 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
* Copy (don't remove) up to `n` items from this stack
* `n`: number, default: `1`
-### `ItemStackMetaRef`
+`ItemStackMetaRef`
+------------------
ItemStack metadata: reference extra data and functionality stored in a stack.
Can be obtained via `item:get_meta()`.
-#### Methods
+### Methods
* All methods in MetaDataRef
* `set_tool_capabilities([tool_capabilities])`
* Overrides the item's tool capabilities
* A nil value will clear the override data and restore the original
behavior.
-### `MetaDataRef`
+`MetaDataRef`
+-------------
See `StorageRef`, `NodeMetaRef`, `ItemStackMetaRef`, and `PlayerMetaRef`.
-#### Methods
+### 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.
* `equals(other)`
* returns `true` if this metadata has the same key-value pairs as `other`
-### ModChannel
+ModChannel
+----------
An interface to use mod channels on client and server
-#### Methods
+### Methods
* `leave()`: leave the mod channel.
* Server leaves channel `channel_name`.
* No more incoming or outgoing messages can be sent to this channel from
server mods.
* This invalidate all future object usage.
- * Ensure your set mod_channel to nil after that to free Lua resources.
+ * Ensure you set mod_channel to nil after that to free Lua resources.
* `is_writeable()`: returns true if channel is writeable and mod can send over
it.
* `send_all(message)`: Send `message` though the mod channel.
* If mod channel is not writeable or invalid, message will be dropped.
* Message size is limited to 65535 characters by protocol.
-### `NodeMetaRef`
+`NodeMetaRef`
+-------------
Node metadata: reference extra data and functionality stored in a node.
Can be obtained via `minetest.get_meta(pos)`.
-#### Methods
+### Methods
* All methods in MetaDataRef
* `get_inventory()`: returns `InvRef`
* `mark_as_private(name or {name1, name2, ...})`: Mark specific vars as private
meaning it's best to call this when initializing all other meta (e.g.
`on_construct`).
-### `NodeTimerRef`
+`NodeTimerRef`
+--------------
Node Timers: a high resolution persistent per-node timer.
Can be gotten via `minetest.get_node_timer(pos)`.
-#### Methods
+### Methods
* `set(timeout,elapsed)`
* set a timer's state
* `timeout` is in seconds, and supports fractional values (0.1 etc)
* `is_started()`: returns boolean state of timer
* returns `true` if timer is started, otherwise `false`
-### `ObjectRef`
+`ObjectRef`
+-----------
Moving things in the game are generally these.
This is basically a reference to a C++ `ServerActiveObject`
-#### Methods
+### 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}`
text = "My Nametag",
}
-##### LuaEntitySAO-only (no-op for other objects)
+#### 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)`
* `get_entity_name()` (**Deprecated**: Will be removed in a future version)
* `get_luaentity()`
-##### Player-only (no-op for other objects)
+#### 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
* in third person view (max. values `{x=-10/10,y=-10,15,z=-5/5}`)
* `get_eye_offset()`: returns `offset_first` and `offset_third`
-### `PcgRandom`
+`PcgRandom`
+-----------
A 32-bit pseudorandom number generator.
Uses PCG32, an algorithm of the permuted congruential generator family,
offering very strong randomness.
It can be created via `PcgRandom(seed)` or `PcgRandom(seed, sequence)`.
-#### Methods
+### 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
* `variance = (((max - min + 1) ^ 2) - 1) / (12 * num_trials)`
* Increasing `num_trials` improves accuracy of the approximation
-### `PerlinNoise`
+`PerlinNoise`
+-------------
A perlin noise generator.
It can be created via `PerlinNoise(seed, octaves, persistence, scale)`
or `PerlinNoise(noiseparams)`.
Alternatively with `minetest.get_perlin(seeddiff, octaves, persistence, scale)`
or `minetest.get_perlin(noiseparams)`.
-#### Methods
+### 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`
+`PerlinNoiseMap`
+----------------
A fast, bulk perlin noise generator.
It can be created via `PerlinNoiseMap(noiseparams, size)` or
not nil, this table will be used to store the result instead of creating a new
table.
-#### Methods
+### 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>`
`noise:calc_3d_map({x=1000, y=1000, z=1000})`
`noisevals = noise:get_map_slice({x=24, z=1}, {x=1, z=1})`
-### `PlayerMetaRef`
+`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
+### Methods
* All methods in MetaDataRef
-### `PseudoRandom`
+`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
+### 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
due to the simple implementation making bad distribution otherwise.
-### `Raycast`
+`Raycast`
+---------
A raycast on the map. It works with selection boxes.
Can be used as an iterator in a for loop.
* `objects` : if false, only nodes will be returned. Default is true.
* `liquids' : if false, liquid nodes won't be returned. Default is false.
-#### Methods
+### Methods
* `next()`: returns a `pointed_thing`
* Returns the next thing pointed by the ray or nil.
-### `SecureRandom`
+`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
+### Methods
* `next_bytes([count])`: return next `count` (default 1, capped at 2048) many
random bytes, as a string.
-### `Settings`
+`Settings`
+----------
An interface to read config files in the format of `minetest.conf`.
It can be created via `Settings(filename)`.
-#### Methods
+### Methods
* `get(key)`: returns a value
* `get_bool(key, [default])`: returns a boolean
* `default` is the value returned if `key` is not found.
* Writes changes to file.
* `to_table()`: returns `{[key1]=value1,...}`
-### `StorageRef`
+`StorageRef`
+------------
Mod metadata: per mod metadata, saved automatically.
Can be obtained via `minetest.get_mod_storage()` during load time.
-#### Methods
+### Methods
* All methods in MetaDataRef
Definition tables
=================
-### Object Properties
+Object Properties
+-----------------
{
hp_max = 1,
-- Defaults to 'true'
}
-### Entity definition (`register_entity`)
+Entity definition (`register_entity`)
+-------------------------------------
{
-- Deprecated: Everything in object properties is read directly from here
-- for more info) by using a '_' prefix.
}
-### ABM (ActiveBlockModifier) definition (`register_abm`)
+ABM (ActiveBlockModifier) definition (`register_abm`)
+-----------------------------------------------------
{
label = "Lava cooling",
loaded mapblocks.
}
-### LBM (LoadingBlockModifier) definition (`register_lbm`)
+LBM (LoadingBlockModifier) definition (`register_lbm`)
+------------------------------------------------------
{
label = "Upgrade legacy doors",
action = func(pos, node),
}
-### Item definition (`register_node`, `register_craftitem`, `register_tool`)
+Item definition (`register_node`, `register_craftitem`, `register_tool`)
+------------------------------------------------------------------------
{
description = "Steel Axe",
]]
}
-### Tile definition
+Tile definition
+---------------
* `"image.png"`
* `{name="image.png", animation={Tile Animation definition}}`
* `{name="image.png", backface_culling=bool, tileable_vertical=bool,
* deprecated, yet still supported field names:
* `image` (name)
-### Tile animation definition
+Tile animation definition
+-------------------------
{
type = "vertical_frames",
-- ^ specify length of a single frame
}
-### Node definition (`register_node`)
+Node definition (`register_node`)
+---------------------------------
{
-- <all fields allowed in item definitions>,
removing the node ]]
}
-### Recipe for `register_craft` (shaped)
+Recipe for `register_craft` (shaped)
+------------------------------------
{
output = 'default:pick_stone',
replace one input item with another item on crafting>]]
}
-### Recipe for `register_craft` (shapeless)
+Recipe for `register_craft` (shapeless)
+---------------------------------------
{
type = "shapeless",
replace one input item with another item on crafting>]]
}
-### Recipe for `register_craft` (tool repair)
+Recipe for `register_craft` (tool repair)
+-----------------------------------------
{
type = "toolrepair",
additional_wear = -0.02,
}
-### Recipe for `register_craft` (cooking)
+Recipe for `register_craft` (cooking)
+-------------------------------------
{
type = "cooking",
cooktime = 3,
}
-### Recipe for `register_craft` (furnace fuel)
+Recipe for `register_craft` (furnace fuel)
+------------------------------------------
{
type = "fuel",
burntime = 1,
}
-### Ore definition (`register_ore`)
+Ore definition (`register_ore`)
+-------------------------------
See 'Ore types' section above for essential information.
-- ^ The above 2 parameters are only valid for "stratum" ore.
}
-### Biome definition (`register_biome`)
+Biome definition (`register_biome`)
+-----------------------------------
{
name = "tundra",
-- ^ 0 and 100 but can exceed these values.
}
-### Decoration definition (`register_decoration`)
+Decoration definition (`register_decoration`)
+---------------------------------------------
{
deco_type = "simple", -- See "Decoration types"
-- ^ to the 'place_on' node.
}
-### Chat command definition (`register_chatcommand`)
+Chat command definition (`register_chatcommand`)
+------------------------------------------------
{
params = "<name> <privilege>", -- Short parameter description
* `()` signifies grouping. For example, when param1 and param2 are both
required, or only param3 is required: `(<param1> <param2>) | <param3>`
-### Detached inventory callbacks
+Detached inventory callbacks
+----------------------------
{
allow_move = func(inv, from_list, from_index, to_list, to_index, count, player),
-- ^ No return value
}
-### HUD Definition (`hud_add`, `hud_get`)
+HUD Definition (`hud_add`, `hud_get`)
+-------------------------------------
{
hud_elem_type = "image", -- see HUD element types
-- ^ Size of element in pixels
}
-### Particle definition (`add_particle`)
+Particle definition (`add_particle`)
+------------------------------------
{
pos = {x=0, y=0, z=0},
}
-### `ParticleSpawner` definition (`add_particlespawner`)
+`ParticleSpawner` definition (`add_particlespawner`)
+----------------------------------------------------
{
amount = 1,
-- ^ Values 0-14.
}
-### `HTTPRequest` definition (`HTTPApiTable.fetch_async`, `HTTPApiTable.fetch_async`)
+`HTTPRequest` definition (`HTTPApiTable.fetch_async`, `HTTPApiTable.fetch_async`)
+---------------------------------------------------------------------------------
{
url = "http://example.org",
-- ^ Default is false.
}
-### `HTTPRequestResult` definition (`HTTPApiTable.fetch` callback, `HTTPApiTable.fetch_async_get`)
+`HTTPRequestResult` definition (`HTTPApiTable.fetch` callback, `HTTPApiTable.fetch_async_get`)
+----------------------------------------------------------------------------------------------
{
completed = true,
data = "response"
}
-### Authentication handler definition
+Authentication handler definition
+---------------------------------
{
get_auth = func(name),