Minetest Lua Modding API Reference
==================================
+
* More information at <http://www.minetest.net/>
* Developer Wiki: <http://dev.minetest.net/>
-
Introduction
-============
+------------
Content and functionality can be added to Minetest using Lua scripting
in run-time loaded mods.
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>`
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 happens if the following directory exists:
-
- $world/game/
+This is useful for e.g. adventure worlds and happens if the `<worldname>/game/`
+directory exists.
-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.
+should be a mod, contains a file named `modpack.conf`.
+The file is a key-value store of modpack details.
+
+* `name`: The modpack name.
+* `description`: Description of mod to be shown in the Mods tab of the main
+ menu.
+
+Note: to support 0.4.x, please also create an empty modpack.txt file.
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
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.
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.
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>
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`.
Aliases
=======
-Aliases can be added by using `minetest.register_alias(name, convert_to)` or
-`minetest.register_alias_force(name, convert_to)`.
+Aliases of itemnames can be added by using
+`minetest.register_alias(alias, original_name)` or
+`minetest.register_alias_force(alias, original_name)`.
-This converts anything called `name` to `convert_to`.
+This adds an alias `alias` for the item called `original_name`.
+From now on, you can use `alias` to refer to the item `original_name`.
The only difference between `minetest.register_alias` and
-`minetest.register_alias_force` is that if an item called `name` exists,
+`minetest.register_alias_force` is that if an item named `alias` already exists,
`minetest.register_alias` will do nothing while
`minetest.register_alias_force` will unregister it.
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
* mapgen_ice
#### Flora
+
* mapgen_tree
* mapgen_leaves
* mapgen_apple
* 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")
+
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:
the higher resolution texture.
### Texture grouping
+
Textures can be grouped together by enclosing them in `(` and `)`.
Example: `cobble.png^(thing1.png^thing2.png)`
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 `:`.
### Advanced texture modifiers
#### Crack
+
* `[crack:<n>:<p>`
* `[cracko:<n>:<p>`
* `[crack:<t>:<n>:<p>`
default_cobble.png^[crack:10:1
#### `[combine:<w>x<h>:<x1>,<y1>=<file1>:<x2>,<y2>=<file2>:...`
+
* `<w>`: width
* `<h>`: height
* `<x>`: x position
[combine:16x32:0,0=default_cobble.png:0,16=default_wood.png
#### `[resize:<w>x<h>`
+
Resizes the texture to the given dimensions.
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).
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.
default_apple.png^[invert:rgb
#### `[brighten`
+
Brightens the texture.
Example:
tnt_tnt_side.png^[brighten
#### `[noalpha`
+
Makes the texture completely opaque.
Example:
default_leaves.png^[noalpha
#### `[makealpha:<r>,<g>,<b>`
+
Convert one color to transparency.
Example:
default_cobble.png^[makealpha:128,128,128
#### `[transform<t>`
+
* `<t>`: transformation(s) to apply
Rotates and/or flips the image.
default_stone.png^[transformFXR90
#### `[inventorycube{<top>{<left>{<right>`
+
Escaping does not apply here and `^` is replaced by `&` in texture names
instead.
`dirt.png^grass_side.png` textures
#### `[lowpart:<percent>:<file>`
+
Blit the lower `<percent>`% part of `<file>` on the texture.
Example:
base.png^[lowpart:25:overlay.png
#### `[verticalframe:<t>:<n>`
+
* `<t>`: animation frame count
* `<n>`: current animation frame
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
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
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
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.
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).
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
* 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.
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
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.
})
### Colored items in craft recipes
+
Craft recipes only support item strings, but fortunately item strings
can also contain metadata. Example craft recipe registration:
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.
-- 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,
}
Looped sounds must either be connected to an object or played locationless to
-one player using `to_player = name,`
+one player using `to_player = name,`.
+
+A positional sound will only be heard by players that are within
+`max_hear_distance` of the sound position, at the start of the sound.
`SimpleSoundSpec`
-----------------
+
* e.g. `""`
* e.g. `"default_place_node"`
* e.g. `{}`
Registered definitions
======================
-Anything added using certain `minetest.register_*` functions gets added to
-the global `minetest.registered_*` tables.
-
-* `minetest.register_entity(name, entity definition)`
- * added to `minetest.registered_entities[name]`
-
-* `minetest.register_node(name, node definition)`
- * added to `minetest.registered_items[name]`
- * added to `minetest.registered_nodes[name]`
-
-* `minetest.register_tool(name, item definition)`
- * added to `minetest.registered_items[name]`
-
-* `minetest.register_craftitem(name, item definition)`
- * added to `minetest.registered_items[name]`
-
-* `minetest.unregister_item(name)`
- * Unregisters the item name from engine, and deletes the entry with key
- `name` from `minetest.registered_items` and from the associated item
- table according to its nature: `minetest.registered_nodes[]` etc
-
-* `minetest.register_biome(biome definition)`
- * returns an integer uniquely identifying the registered biome
- * added to `minetest.registered_biome` with the key of `biome.name`
- * if `biome.name` is nil, the key is the returned ID
-
-* `minetest.unregister_biome(name)`
- * Unregisters the biome name from engine, and deletes the entry with key
- `name` from `minetest.registered_biome`
-
-* `minetest.register_ore(ore definition)`
- * returns an integer uniquely identifying the registered ore
- * added to `minetest.registered_ores` with the key of `ore.name`
- * if `ore.name` is nil, the key is the returned ID
-
-* `minetest.register_decoration(decoration definition)`
- * returns an integer uniquely identifying the registered decoration
- * added to `minetest.registered_decorations` with the key of
- `decoration.name`.
- * if `decoration.name` is nil, the key is the returned ID
-
-* `minetest.register_schematic(schematic definition)`
- * returns an integer uniquely identifying the registered schematic
- * added to `minetest.registered_schematic` with the key of `schematic.name`
- * if `schematic.name` is nil, the key is the returned ID
- * if the schematic is loaded from a file, schematic.name is set to the
- filename.
- * if the function is called when loading the mod, and schematic.name is a
- relative path, then the current mod path will be prepended to the
- schematic filename.
-
-* `minetest.clear_registered_biomes()`
- * clears all biomes currently registered
-
-* `minetest.clear_registered_ores()`
- * clears all ores currently registered
-
-* `minetest.clear_registered_decorations()`
- * clears all decorations currently registered
-
-* `minetest.clear_registered_schematics()`
- * clears all schematics currently registered
+Anything added using certain [Registration functions] gets added to one or more
+of the global [Registered definition tables].
Note that in some cases you will stumble upon things that are not contained
in these tables (e.g. when a mod has been removed). Always check for
existence before trying to access the fields.
-Example: If you want to check the drawtype of a node, you could do:
+Example:
+
+All nodes register with `minetest.register_node` get added to the table
+`minetest.registered_nodes`.
+
+If you want to check the drawtype of a node, you could do:
local function get_nodedef_field(nodename, fieldname)
if not minetest.registered_nodes[nodename] then
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
-
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:
Node paramtypes
---------------
+
The functions of `param1` and `param2` are determined by certain fields in the
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`.
* `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
* `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.
Node boxes
----------
+
Node selection boxes are defined using "node boxes".
A nodebox is defined as any of:
+Map terminology and coordinates
+===============================
+
+Nodes, mapblocks, mapchunks
+---------------------------
+
+A 'node' is the fundamental cubic unit of a world and appears to a player as
+roughly 1x1x1 meters in size.
+
+A 'mapblock' (often abbreviated to 'block') is 16x16x16 nodes and is the
+fundamental region of a world that is stored in the world database, sent to
+clients and handled by many parts of the engine.
+'mapblock' is preferred terminology to 'block' to help avoid confusion with
+'node', however 'block' often appears in the API.
+
+A 'mapchunk' (sometimes abbreviated to 'chunk') is usually 5x5x5 mapblocks
+(80x80x80 nodes) and is the volume of world generated in one operation by
+the map generator.
+The size in mapblocks has been chosen to optimise map generation.
+
+Coordinates
+-----------
+
+### Orientation of axes
+
+For node and mapblock coordinates, +X is East, +Y is up, +Z is North.
+
+### Node coordinates
+
+Almost all positions used in the API use node coordinates.
+
+### Mapblock coordinates
+
+Occasionally the API uses 'blockpos' which refers to mapblock coordinates that
+specify a particular mapblock.
+For example blockpos (0,0,0) specifies the mapblock that extends from
+node position (0,0,0) to node position (15,15,15).
+
+#### Converting node position to the containing blockpos
+
+To calculate the blockpos of the mapblock that contains the node at 'nodepos',
+for each axis:
+
+* blockpos = math.floor(nodepos / 16)
+
+#### Converting blockpos to min/max node positions
+
+To calculate the min/max node positions contained in the mapblock at 'blockpos',
+for each axis:
+
+* Minimum:
+ nodepos = blockpos * 16
+* Maximum:
+ nodepos = blockpos * 16 + 15
+
+
+
+
HUD
===
HUD element types
-----------------
+
The position field is used for all element types.
To account for differing resolutions, the position coordinates are the
`0` draws from left to right, `1` draws from right to left, `2` draws from
top to bottom, and `3` draws from bottom to top.
-The `alignment` field specifies how the item will be aligned. It ranges from
-`-1` to `1`, with `0` being the center. `-1` is moved to the left/up, and `1`
-is to the right/down. Fractional values can be used.
+The `alignment` field specifies how the item will be aligned. It is a table
+where `x` and `y` range from `-1` to `1`, with `0` being central. `-1` is
+moved to the left/up, and `1` is to the right/down. Fractional values can be
+used.
The `offset` field specifies a pixel offset from the position. Contrary to
position, the offset is not scaled to screen size. This allows for some
type are ignored.
### `image`
+
Displays an image on the HUD.
* `scale`: The scale of the image, with 1 being the original texture size.
* `offset`: offset in pixels from position.
### `text`
+
Displays text on the HUD.
* `scale`: Defines the bounding rectangle of the text.
* `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.
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.
* `offset`: offset in pixels from position.
### `waypoint`
+
Displays distance to selected world position.
* `name`: The name of the waypoint.
{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.
+
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
Item formats
------------
+
Items and item stacks can exist in three formats: Serializes, table format
and `ItemStack`.
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:
* `'default:pick_wood 1 21323'`: a wooden pickaxe, ca. 1/3 worn out
### Table format
+
Examples:
5 dirt nodes:
{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.
Usage
-----
+
Groups are stored in a table, having the group names with keys and the
group ratings as values. For example:
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:
{
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
* `fall_damage_add_percent`: damage speed = `speed * (1 + value/100)`
* `bouncy`: value is bounce speed in percent
* `falling_node`: if there is no walkable block under the node it will fall
+* `float`: the node will not fall through liquids
* `attached_node`: if the node under it is not a walkable block the node will be
dropped as an item. If the node is wallmounted the wallmounted direction is
checked.
-* `soil`: saplings will grow on nodes in this group
* `connect_to_raillike`: makes nodes of raillike drawtype with same group value
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
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
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 definition
----------------
+
Tools define:
* Full punch interval
### 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
------------------------------------------------
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:
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:
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.
Formspec
========
-Formspec defines a menu. Currently not much else than inventories are
-supported. It is a string, with a somewhat strange format.
+Formspec defines a menu. This supports inventories and some of the
+typical widgets like buttons, checkboxes, text input fields, etc.
+It is a string, with a somewhat strange format.
+
+A formspec is made out of formspec elements, which includes widgets
+like buttons but also can be used to set stuff like background color.
+
+Many formspec elements have a `name`, which is a unique identifier which
+is used when the server receives user input. You must not use the name
+"quit" for formspec elements.
Spaces and newlines can be inserted between the blocks, as is used in the
examples.
Position and size units are inventory slots, `X` and `Y` position the formspec
element relative to the top left of the menu or container. `W` and `H` are its
width and height values.
+Inventories with a `player:<name>` inventory location are only sent to the
+player named `<name>`.
+
When displaying text which can contain formspec code, e.g. text set by a player,
use `minetest.formspec_escape`.
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
--------
--------
### `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,
* 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,
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`
(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
+
+* Show an inventory list if it has been sent to the client. Nothing will
+ be shown if the inventory list is of size 0.
### `list[<inventory location>;<list name>;<X>,<Y>;<W>,<H>;<starting item index>]`
-* Show an inventory list
+
+* Show an inventory list if it has been sent to the client. Nothing will
+ be shown if the inventory list is of size 0.
### `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
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
* 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
(`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.
* 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.
* 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.
* `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
+
+* `item name` is the registered name of an item/node
+* The item description will be used as the tooltip. This can be overridden with
+ a 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.
* 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.
(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
* `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)
* 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)
(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
(main menu: `core.explode_table_event`).
### `tableoptions[<opt 1>;<opt 2>;...]`
+
* Sets options for `table[]`
* `color=#RRGGBB`
* default text color (`ColorString`), defaults to `#FFFFFF`
* 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
Inventory locations
-------------------
+
* `"context"`: Selected node metadata (deprecated: `"current_name"`)
* `"current_player"`: Player to whom the menu is shown
* `"player:<name>"`: Any player
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`
`ColorString`
-------------
+
`#RGB` defines a color in hexadecimal format.
`#RGBA` defines a color in hexadecimal format and alpha channel.
`ColorSpec`
-----------
+
A ColorSpec specifies a 32-bit color. It can be written in any of the following
forms:
Spatial Vectors
===============
+A spatial vector is similar to a position, but instead using
+absolute world coordinates, it uses *relative* coordinates, relative to
+no particular point.
+
+Internally, it is implemented as a table with the 3 fields
+`x`, `y` and `z`. Example: `{x = 0, y = 1, z = 0}`.
For the following functions, `v`, `v1`, `v2` are vectors,
`p1`, `p2` are positions:
* Returns a boolean, `true` if the vectors are identical.
* `vector.sort(v1, v2)`:
* Returns in order minp, maxp vectors of the cuboid defined by `v1`, `v2`.
+* `vector.angle(v1, v2)`:
+ * Returns the angle between `v1` and `v2` in radians.
For the following functions `x` can be either a vector or a number:
* `vector.add(v, x)`:
* Returns a vector.
+ * If `x` is a vector: Returns the sum of `v` and `x`.
+ * If `x` is a number: Adds `x` to each component of `v`.
* `vector.subtract(v, x)`:
* Returns a vector.
+ * If `x` is a vector: Returns the difference of `v` subtracted by `x`.
+ * If `x` is a number: Subtracts `x` from each component of `v`.
* `vector.multiply(v, x)`:
* Returns a scaled vector or Schur product.
* `vector.divide(v, x)`:
* tolerance: number, default: `0.0`
* If the absolute value of `x` is within the `tolerance` or `x` is NaN,
`0` is returned.
+* `math.factorial(x)`: returns the factorial of `x`
* `string.split(str, separator, include_empty, max_splits, sep_is_pattern)`
* `separator`: string, default: `","`
* `include_empty`: boolean, default: `false`
* returns time with microsecond precision. May not return wall time.
* `table.copy(table)`: returns a table
* returns a deep copy of `table`
+* `table.indexof(list, val)`: returns the smallest numerical index containing
+ the value `val` in the table `list`. Non-numerical indices are ignored.
+ If `val` could not be found, `-1` is returned. `list` must not have
+ negative indices.
* `table.insert_all(table, other_table)`:
* Appends all values in `other_table` to `table` - uses `#table + 1` to
find new indices.
* `minetest.pointed_thing_to_face_pos(placer, pointed_thing)`: returns a
position.
* returns the exact position on the surface of a pointed node
+* `minetest.get_dig_params(groups, tool_capabilities)`: Simulates a tool
+ that digs a node.
+ Returns a table with the following fields:
+ * `diggable`: `true` if node can be dug, `false` otherwise.
+ * `time`: Time it would take to dig the node.
+ * `wear`: How much wear would be added to the tool.
+ `time` and `wear` are meaningless if node's not diggable
+ Parameters:
+ * `groups`: Table of the node groups of the node that would be dug
+ * `tool_capabilities`: Tool capabilities table of the tool
+* `minetest.get_hit_params(groups, tool_capabilities [, time_from_last_punch])`:
+ Simulates an item that punches an object.
+ Returns a table with the following fields:
+ * `hp`: How much damage the punch would cause.
+ * `wear`: How much wear would be added to the tool.
+ Parameters:
+ * `groups`: Damage groups of the object
+ * `tool_capabilities`: Tool capabilities table of the item
+ * `time_from_last_punch`: time in seconds since last punch action
Translating a string
--------------------
+
Two functions are provided to translate strings: `minetest.translate` and
`minetest.get_translator`.
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:
* 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 `@`.
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.
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.
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
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
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.
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.
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
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:
...)
### Format example
+
For 2D or 3D perlin noise or perlin noise maps:
np_terrain = {
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
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.
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
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`.
computationally expensive than any other ore.
### `stratum`
+
Creates a single undulating ore stratum that is continuous across mapchunk
borders and horizontally spans the world.
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
`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
`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
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:
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`.
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
Using VoxelManip
----------------
+
A VoxelManip object can be created any time using either:
`VoxelManip([p1, p2])`, or `minetest.get_voxel_manip([p1, p2])`.
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
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.
Once the internal VoxelManip state has been modified to your liking, the
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
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:
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
* `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
`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
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()`.
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`
* To be used only by a `VoxelManip` object from
`minetest.get_mapgen_object`.
* (`p1`, `p2`) is the area in which lighting is set, defaults to the whole
- area if left out or nil.
+ area if left out or nil. For almost all uses these should be left out
+ or nil to use the default.
* `propagate_shadow` is an optional boolean deciding whether shadows in a
generated mapchunk above are propagated down into the mapchunk, defaults
to `true` if left out.
`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
* Called on every server tick, after movement and collision processing.
`dtime` is usually 0.1 seconds, as per the `dedicated_server_step` setting
in `minetest.conf`.
-* `on_punch(self, puncher, time_from_last_punch, tool_capabilities, dir)`
+* `on_punch(self, puncher, time_from_last_punch, tool_capabilities, dir, damage)`
* Called when somebody punches the object.
* Note that you probably want to handle most punches using the automatic
armor group system.
* `tool_capabilities`: capability table of used tool (can be `nil`)
* `dir`: unit vector of direction of punch. Always defined. Points from the
puncher to the punched.
+ * `damage`: damage that will be done to entity.
* `on_death(self, killer)`
* Called when the object dies.
* `killer`: an `ObjectRef` (can be `nil`)
Example
-------
+
Spawn a small apple tree:
pos = {x=230,y=20,z=4}
* `minetest.features`: Table containing API feature flags
{
- glasslike_framed = true,
- nodebox_as_selectionbox = true,
- chat_send_player_param3 = true,
- get_all_craft_recipes_works = true,
+ glasslike_framed = true, -- 0.4.7
+ nodebox_as_selectionbox = true, -- 0.4.7
+ get_all_craft_recipes_works = true, -- 0.4.7
-- The transparency channel of textures can optionally be used on
- -- nodes
+ -- nodes (0.4.7)
use_texture_alpha = true,
- -- Tree and grass ABMs are no longer done from C++
+ -- Tree and grass ABMs are no longer done from C++ (0.4.8)
no_legacy_abms = true,
- -- Texture grouping is possible using parentheses
+ -- Texture grouping is possible using parentheses (0.4.11)
texture_names_parens = true,
- -- Unique Area ID for AreaStore:insert_area
+ -- Unique Area ID for AreaStore:insert_area (0.4.14)
area_store_custom_ids = true,
-- add_entity supports passing initial staticdata to on_activate
+ -- (0.4.16)
add_entity_with_staticdata = true,
- -- Chat messages are no longer predicted
+ -- Chat messages are no longer predicted (0.4.16)
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
+ -- objects (ie: players and lua entities) (5.0.0)
+ object_use_texture_alpha = true,
+ -- Object selectionbox is settable independently from collisionbox
+ -- (5.0.0)
+ object_independent_selectionbox = true,
+ -- Specifies whether binary data can be uploaded or downloaded using
+ -- the HTTP API (5.1.0)
+ httpfetch_binary_data = true,
}
* `minetest.has_feature(arg)`: returns `boolean, missing_features`
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
-----------------------
-Call these functions only at load time!
+Registration functions
+----------------------
+
+Call these functions only at load time!
+
+### Environment
+
+* `minetest.register_node(name, node definition)`
+* `minetest.register_craftitem(name, item definition)`
+* `minetest.register_tool(name, item definition)`
+* `minetest.override_item(name, redefinition)`
+ * Overrides fields of an item registered with register_node/tool/craftitem.
+ * Note: Item must already be defined, (opt)depend on the mod defining it.
+ * Example: `minetest.override_item("default:mese",
+ {light_source=minetest.LIGHT_MAX})`
+* `minetest.unregister_item(name)`
+ * Unregisters the item from the engine, and deletes the entry with key
+ `name` from `minetest.registered_items` and from the associated item table
+ according to its nature: `minetest.registered_nodes`, etc.
+* `minetest.register_entity(name, entity definition)`
+* `minetest.register_abm(abm definition)`
+* `minetest.register_lbm(lbm definition)`
+* `minetest.register_alias(alias, original_name)`
+ * Also use this to set the 'mapgen aliases' needed in a game for the core
+ mapgens. See [Mapgen aliases] section above.
+* `minetest.register_alias_force(alias, original_name)`
+* `minetest.register_ore(ore definition)`
+ * Returns an integer uniquely identifying the registered ore on success.
+ * The order of ore registrations determines the order of ore generation.
+* `minetest.register_biome(biome definition)`
+ * Returns an integer uniquely identifying the registered biome on success.
+* `minetest.unregister_biome(name)`
+ * Unregisters the biome from the engine, and deletes the entry with key
+ `name` from `minetest.registered_biomes`.
+* `minetest.register_decoration(decoration definition)`
+ * Returns an integer uniquely identifying the registered decoration on
+ success.
+ * The order of decoration registrations determines the order of decoration
+ generation.
+* `minetest.register_schematic(schematic definition)`
+ * Returns an integer uniquely identifying the registered schematic on
+ success.
+ * If the schematic is loaded from a file, the `name` field is set to the
+ filename.
+ * If the function is called when loading the mod, and `name` is a relative
+ path, then the current mod path will be prepended to the schematic
+ filename.
+* `minetest.clear_registered_ores()`
+ * Clears all ores currently registered.
+* `minetest.clear_registered_biomes()`
+ * Clears all biomes currently registered.
+* `minetest.clear_registered_decorations()`
+ * Clears all decorations currently registered.
+* `minetest.clear_registered_schematics()`
+ * Clears all schematics currently registered.
+
+### Gameplay
-* `minetest.register_entity(name, entity definition)`
-* `minetest.register_abm(abm definition)`
-* `minetest.register_lbm(lbm definition)`
-* `minetest.register_node(name, node definition)`
-* `minetest.register_tool(name, item definition)`
-* `minetest.register_craftitem(name, item definition)`
-* `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.
-* `minetest.register_alias_force(name, convert_to)`
* `minetest.register_craft(recipe)`
* Check recipe table syntax for different types below.
* `minetest.clear_craft(recipe)`
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.
-* `minetest.register_ore(ore definition)`
-* `minetest.register_biome(biome definition)`
-* `minetest.register_decoration(decoration definition)`
-* `minetest.override_item(name, redefinition)`
- * Overrides fields of an item registered with register_node/tool/craftitem.
- * Note: Item must already be defined, (opt)depend on the mod defining it.
- * Example: `minetest.override_item("default:mese", {light_source=LIGHT_MAX})`
-* `minetest.clear_registered_ores()`
-* `minetest.clear_registered_biomes()`
-* `minetest.clear_registered_decorations()`
+* `minetest.register_chatcommand(cmd, chatcommand definition)`
+* `minetest.override_chatcommand(name, redefinition)`
+ * Overrides fields of a chatcommand registered with `register_chatcommand`.
+* `minetest.unregister_chatcommand(name)`
+ * Unregisters a chatcommands registered with `register_chatcommand`.
+* `minetest.register_privilege(name, definition)`
+ * `definition` can be a description or a definition table (see [Privilege
+ definition]).
+ * If it is a description, the priv will be granted to singleplayer and admin
+ by default.
+ * To allow players with `basic_privs` to grant, see the `basic_privs`
+ minetest.conf setting.
+* `minetest.register_authentication_handler(authentication handler definition)`
+ * Registers an auth handler that overrides the builtin one.
+ * This function can be called by a single mod once only.
Global callback registration functions
--------------------------------------
+
Call these functions only at load time!
-* `minetest.register_globalstep(func(dtime))`
+* `minetest.register_globalstep(function(dtime))`
* Called every server step, usually interval of 0.1s
-* `minetest.register_on_mods_loaded(func())`
+* `minetest.register_on_mods_loaded(function())`
* Called after mods have finished loading and before the media is cached or the
aliases handled.
-* `minetest.register_on_shutdown(func())`
+* `minetest.register_on_shutdown(function())`
* Called before server shutdown
* **Warning**: If the server terminates abnormally (i.e. crashes), the
registered callbacks **will likely not be run**. Data should be saved at
semi-frequent intervals as well as on server shutdown.
-* `minetest.register_on_placenode(func(pos, newnode, placer, oldnode, itemstack, pointed_thing))`
+* `minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack, pointed_thing))`
* Called when a node has been placed
* If return `true` no item is taken from `itemstack`
* `placer` may be any valid ObjectRef or nil.
* **Not recommended**; use `on_construct` or `after_place_node` in node
definition whenever possible.
-* `minetest.register_on_dignode(func(pos, oldnode, digger))`
+* `minetest.register_on_dignode(function(pos, oldnode, digger))`
* Called when a node has been dug.
* **Not recommended**; Use `on_destruct` or `after_dig_node` in node
definition whenever possible.
-* `minetest.register_on_punchnode(func(pos, node, puncher, pointed_thing))`
+* `minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing))`
* Called when a node is punched
-* `minetest.register_on_generated(func(minp, maxp, blockseed))`
+* `minetest.register_on_generated(function(minp, maxp, blockseed))`
* Called after generating a piece of world. Modifying nodes inside the area
is a bit faster than usually.
-* `minetest.register_on_newplayer(func(ObjectRef))`
+* `minetest.register_on_newplayer(function(ObjectRef))`
* Called after a new player has been created
-* `minetest.register_on_punchplayer(func(player, hitter, time_from_last_punch, tool_capabilities, dir, damage))`
+* `minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool_capabilities, dir, damage))`
* Called when a player is punched
+ * Note: This callback is invoked even if the punched player is dead.
* `player`: ObjectRef - Player that was punched
* `hitter`: ObjectRef - Player that hit
* `time_from_last_punch`: Meant for disallowing spamming of clicks
the puncher to the punched.
* `damage`: Number that represents the damage calculated by the engine
* should return `true` to prevent the default damage mechanism
-* `minetest.register_on_player_hpchange(func(player, hp_change, reason), modifier)`
+* `minetest.register_on_player_hpchange(function(player, hp_change, reason), modifier)`
* Called when the player gets damaged or healed
* `player`: ObjectRef of the player
* `hp_change`: the amount of change. Negative when it is damage.
giving a type - use this for custom damage types.
* `punch`: Was punched. `reason.object` will hold the puncher, or nil if none.
* `fall`
- * `node_damage`: damage_per_second from a neighbouring node.
+ * `node_damage`: `damage_per_second` from a neighbouring node.
+ `reason.node` will hold the node name or nil.
* `drown`
* `respawn`
* Any of the above types may have additional fields from mods.
* `reason.from` will be `mod` or `engine`.
* `modifier`: when true, the function should return the actual `hp_change`.
- Note: modifiers only get a temporary hp_change that can be modified by later modifiers.
- modifiers can return true as a second argument to stop the execution of further functions.
- Non-modifiers receive the final hp change calculated by the modifiers.
-* `minetest.register_on_dieplayer(func(ObjectRef, reason))`
+ Note: modifiers only get a temporary `hp_change` that can be modified by later modifiers.
+ Modifiers can return true as a second argument to stop the execution of further functions.
+ Non-modifiers receive the final HP change calculated by the modifiers.
+* `minetest.register_on_dieplayer(function(ObjectRef, reason))`
* Called when a player dies
* `reason`: a PlayerHPChangeReason table, see register_on_player_hpchange
-* `minetest.register_on_respawnplayer(func(ObjectRef))`
+* `minetest.register_on_respawnplayer(function(ObjectRef))`
* Called when player is to be respawned
* Called _before_ repositioning of player occurs
* return true in func to disable regular player placement
-* `minetest.register_on_prejoinplayer(func(name, ip))`
+* `minetest.register_on_prejoinplayer(function(name, ip))`
* Called before a player joins the game
* If it returns a string, the player is disconnected with that string as
reason.
-* `minetest.register_on_joinplayer(func(ObjectRef))`
+* `minetest.register_on_joinplayer(function(ObjectRef))`
* Called when a player joins the game
-* `minetest.register_on_leaveplayer(func(ObjectRef, timed_out))`
+* `minetest.register_on_leaveplayer(function(ObjectRef, timed_out))`
* Called when a player leaves the game
* `timed_out`: True for timeout, false for other reasons.
-* `minetest.register_on_auth_fail(func(name, ip))`
+* `minetest.register_on_auth_fail(function(name, ip))`
* Called when a client attempts to log into an account but supplies the
wrong password.
* `ip`: The IP address of the client.
* `name`: The account the client attempted to log into.
-* `minetest.register_on_cheat(func(ObjectRef, cheat))`
+* `minetest.register_on_cheat(function(ObjectRef, cheat))`
* Called when a player cheats
* `cheat`: `{type=<cheat_type>}`, where `<cheat_type>` is one of:
* `moved_too_fast`
* `finished_unknown_dig`
* `dug_unbreakable`
* `dug_too_fast`
-* `minetest.register_on_chat_message(func(name, message))`
+* `minetest.register_on_chat_message(function(name, message))`
* Called always when a player says something
* 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
+* `minetest.register_on_player_receive_fields(function(player, formname, fields))`
+ * Called when the server received input from `player` in a formspec with
+ the given `formname`. Specifically, this is called on any of the
+ following events:
+ * a button was pressed,
+ * Enter was pressed while the focus was on a text field
+ * a checkbox was toggled,
+ * something was selecteed in a drop-down list,
+ * a different tab was selected,
+ * selection was changed in a textlist or table,
+ * an entry was double-clicked in a textlist or table,
+ * a scrollbar was moved, or
+ * the form was actively closed by the player.
+ * Fields are sent for formspec elements which define a field. `fields`
+ is a table containing each formspecs element value (as string), with
+ the `name` parameter as index for each. The value depends on the
+ formspec element type:
+ * `button` and variants: If pressed, contains the user-facing button
+ text as value. If not pressed, is `nil`
+ * `field`, `textarea` and variants: Text in the field
+ * `dropdown`: Text of selected item
+ * `tabheader`: Tab index, starting with `"1"` (only if tab changed)
+ * `checkbox`: `"true"` if checked, `"false"` if unchecked
+ * `textlist`: See `minetest.explode_textlist_event`
+ * `table`: See `minetest.explode_table_event`
+ * `scrollbar`: See `minetest.explode_scrollbar_event`
+ * Special case: `["quit"]="true"` is sent when the user actively
+ closed the form by mouse click, keypress or through a button_exit[]
+ element.
+ * Special case: `["key_enter"]="true"` is sent when the user pressed
+ the Enter key and the focus was either nowhere (causing the formspec
+ to be closed) or on a button. If the focus was on a text field,
+ additionally, the index `key_enter_field` contains the name of the
+ text field. See also: `field_close_on_enter`.
* 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))`
+* `minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv))`
* Called when `player` crafts something
* `itemstack` is the output
* `old_craft_grid` contains the recipe (Note: the one in the inventory is
* `craft_inv` is the inventory with the crafting grid
* Return either an `ItemStack`, to replace the output, or `nil`, to not
modify it.
-* `minetest.register_craft_predict(func(itemstack, player, old_craft_grid, craft_inv))`
+* `minetest.register_craft_predict(function(itemstack, player, old_craft_grid, craft_inv))`
* The same as before, except that it is called before the player crafts, to
make craft prediction, and it should not change anything.
-* `minetest.register_allow_player_inventory_action(func(player, inventory, action, inventory_info))`
+* `minetest.register_allow_player_inventory_action(function(player, action, inventory, inventory_info))`
* Determinates how much of a stack may be taken, put or moved to a
player inventory.
* `player` (type `ObjectRef`) is the player who modified the inventory
* `take`: Same as `put`
* Return a numeric value to limit the amount of items to be taken, put or
moved. A value of `-1` for `take` will make the source stack infinite.
-* `minetest.register_on_player_inventory_action(func(player, inventory, action, inventory_info))`
+* `minetest.register_on_player_inventory_action(function(player, action, inventory, inventory_info))`
* Called after a take, put or move event from/to/in a player inventory
* Function arguments: see `minetest.register_allow_player_inventory_action`
* Does not accept or handle any return value.
-* `minetest.register_on_protection_violation(func(pos, name))`
+* `minetest.register_on_protection_violation(function(pos, name))`
* Called by `builtin` and mods when a player violates protection at a
position (eg, digs a node or punches a protected entity).
* The registered functions can be called using
* The provided function should check that the position is protected by the
mod calling this function before it prints a message, if it does, to
allow for multiple protection mods.
-* `minetest.register_on_item_eat(func(hp_change, replace_with_item, itemstack, user, pointed_thing))`
+* `minetest.register_on_item_eat(function(hp_change, replace_with_item, itemstack, user, pointed_thing))`
* Called when an item is eaten, by `minetest.item_eat`
* Return `true` or `itemstack` to cancel the default item eat response
(i.e.: hp increase).
* `minetest.register_can_bypass_userlimit(function(name, ip))`
* Called when `name` user connects with `ip`.
* Return `true` to by pass the player limit
-* `minetest.register_on_modchannel_message(func(channel_name, sender, message))`
+* `minetest.register_on_modchannel_message(function(channel_name, sender, message))`
* Called when an incoming mod channel message is received
* 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
-----------------------------
-* `minetest.register_chatcommand(cmd, chatcommand definition)`
- * Adds definition to `minetest.registered_chatcommands`
-* `minetest.override_chatcommand(name, redefinition)`
- * Overrides fields of a chatcommand registered with `register_chatcommand`.
-* `minetest.unregister_chatcommand(name)`
- * Unregisters a chatcommands registered with `register_chatcommand`.
-* `minetest.register_privilege(name, definition)`
- * `definition`: `"description text"`
- * `definition`:
- `{description = "description text", give_to_singleplayer = boolean}`
- the default of `give_to_singleplayer` is true.
- * To allow players with `basic_privs` to grant, see `basic_privs`
- minetest.conf setting.
- * `on_grant(name, granter_name)`: Called when given to player `name` by
- `granter_name`.
- `granter_name` will be nil if the priv was granted by a mod.
- * `on_revoke(name, revoker_name)`: Called when taken from player `name` by
- `revoker_name`.
- `revoker_name` will be nil if the priv was revoked by a mod
- * Note that the above two callbacks will be called twice if a player is
- responsible, once with the player name, and then with a nil player name.
- * Return true in the above callbacks to stop register_on_priv_grant or
- revoke being called.
-* `minetest.register_authentication_handler(authentication handler definition)`
- * Registers an auth handler that overrides the builtin one
- * This function can be called by a single mod once only.
-
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
Authentication
--------------
+
* `minetest.string_to_privs(str)`: returns `{priv1=true,...}`
* `minetest.privs_to_string(privs)`: returns `"priv1,priv2,..."`
* Convert between two privilege representations
* 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)`
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`
* Return value: Table with all node positions with a node air above
* Area volume is limited to 4,096,000 nodes
* `minetest.get_perlin(noiseparams)`
-* `minetest.get_perlin(seeddiff, octaves, persistence, scale)`
+* `minetest.get_perlin(seeddiff, octaves, persistence, spread)`
* Return world-specific perlin noise (`int(worldseed)+seeddiff`)
* `minetest.get_voxel_manip([pos1, pos2])`
* Return voxel manipulator object.
* 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)`
* mode = `"quick"`: Clear objects immediately in loaded mapblocks,
clear objects in unloaded mapblocks only when the
mapblocks are next activated.
+* `minetest.load_area(pos1[, pos2])`
+ * Load the mapblocks containing the area from `pos1` to `pos2`.
+ `pos2` defaults to `pos1` if not specified.
+ * This function does not trigger map generation.
* `minetest.emerge_area(pos1, pos2, [callback], [param])`
* Queue all blocks in the area from `pos1` to `pos2`, inclusive, to be
asynchronously fetched from memory, loaded from disk, or if inexistent,
* 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`
Mod channels
------------
+
You can find mod channels communication scheme in `doc/mod_channels.png`.
* `minetest.mod_channel_join(channel_name)`
Inventory
---------
+
`minetest.get_inventory(location)`: returns an `InvRef`
* `location` = e.g.
* `{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.
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)`
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
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])`
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)`
Sounds
------
+
* `minetest.sound_play(spec, parameters)`: returns a handle
* `spec` is a `SimpleSoundSpec`
* `parameters` is a sound parameter table
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
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)
Particles
---------
+
* `minetest.add_particle(particle definition)`
* Deprecated: `minetest.add_particle(pos, velocity, acceleration,
expirationtime, size, collisiondetection, texture, playername)`
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.
* 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.
* `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.
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
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)`
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)`
Global tables
-------------
+
+### Registered definition tables
+
* `minetest.registered_items`
* Map of registered items, indexed by name
* `minetest.registered_nodes`
* Map of object references, indexed by active object id
* `minetest.luaentities`
* Map of Lua entities, indexed by active object id
-* `minetest.registered_chatcommands`
- * Map of registered chat command definitions, indexed by name
+* `minetest.registered_abms`
+ * List of ABM definitions
+* `minetest.registered_lbms`
+ * List of LBM definitions
+* `minetest.registered_aliases`
+ * Map of registered aliases, indexed by name
* `minetest.registered_ores`
- * List of registered ore definitions.
+ * Map of registered ore definitions, indexed by the `name` field.
+ * If `name` is nil, the key is the ID returned by `minetest.register_ore`.
* `minetest.registered_biomes`
- * List of registered biome definitions.
+ * Map of registered biome definitions, indexed by the `name` field.
+ * If `name` is nil, the key is the ID returned by `minetest.register_biome`.
* `minetest.registered_decorations`
- * List of registered decoration definitions.
+ * Map of registered decoration definitions, indexed by the `name` field.
+ * If `name` is nil, the key is the ID returned by
+ `minetest.register_decoration`.
+* `minetest.registered_schematics`
+ * Map of registered schematic definitions, indexed by the `name` field.
+ * If `name` is nil, the key is the ID returned by
+ `minetest.register_schematic`.
+* `minetest.registered_chatcommands`
+ * Map of registered chat command definitions, indexed by name
+* `minetest.registered_privileges`
+ * Map of registered privilege definitions, indexed by name
+
+### Registered callback tables
+
+All callbacks registered with [Global callback registration functions] are added
+to corresponding `minetest.registered_*` tables.
`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.
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
* `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
`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
`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
`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
`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.
* `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
`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
`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)
`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}`
}
#### 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)`
* `set_acceleration(acc)`
* `acc` is a vector
* `get_acceleration()`: returns the acceleration, a vector
-* `set_yaw(radians)`
+* `set_rotation(rot)`
+ * `rot` is a vector (radians). X is pitch (elevation), Y is yaw (heading)
+ and Z is roll (bank).
+* `get_rotation()`: returns the rotation, a vector (radians)
+* `set_yaw(radians)`: sets the yaw (heading).
* `get_yaw()`: returns number in radians
* `set_texture_mod(mod)`
* `get_texture_mod()` returns current texture modifier
* `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
* 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
* `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`
+ * `count`: number of items, must be between `1` and `32`
* `hud_get_hotbar_itemcount`: returns number of visible items
* `hud_set_hotbar_image(texturename)`
* sets background image for hotbar
* `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
* in first person view
* in third person view (max. values `{x=-10/10,y=-10,15,z=-5/5}`)
* `get_eye_offset()`: returns `offset_first` and `offset_third`
+* `send_mapblock(blockpos)`:
+ * Sends a server-side loaded mapblock to the player.
+ * Returns `false` if failed.
+ * Resource intensive - use sparsely
+ * To get blockpos, integer divide pos by 16
`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
+
* `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
`PerlinNoise`
-------------
+
A perlin noise generator.
-It can be created via `PerlinNoise(seed, octaves, persistence, scale)`
+It can be created via `PerlinNoise(seed, octaves, persistence, spread)`
or `PerlinNoise(noiseparams)`.
-Alternatively with `minetest.get_perlin(seeddiff, octaves, persistence, scale)`
+Alternatively with `minetest.get_perlin(seeddiff, octaves, persistence, spread)`
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
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>`
`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
`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.
* `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.
`StorageRef`
------------
+
Mod metadata: per mod metadata, saved automatically.
Can be obtained via `minetest.get_mod_storage()` during load time.
### Methods
+
* All methods in MetaDataRef
pointable = true,
-- Overrides selection box when false
- visual = "cube" / "sprite" / "upright_sprite" / "mesh" / "wielditem",
+ visual = "cube" / "sprite" / "upright_sprite" / "mesh" / "wielditem" / "item",
-- "cube" is a node-sized cube.
-- "sprite" is a flat texture always facing the player.
-- "upright_sprite" is a vertical flat texture.
-- of its texture.
-- Otherwise for non-node items, the object will be an extrusion of
-- 'inventory_image'.
+ -- "item" is similar to "wielditem" but ignores the 'wield_image' parameter.
- visual_size = {x = 1, y = 1},
- -- `x` multiplies horizontal (X and Z) visual size.
- -- `y` multiplies vertical (Y) visual size.
+ visual_size = {x = 1, y = 1, z = 1},
+ -- Multipliers for the visual size. If `z` is not specified, `x` will be used
+ -- to scale the entity along both horizontal axes.
mesh = "model",
textures = {},
-- Number of required textures depends on visual.
- -- "cube" uses 6 textures in the way a node does.
+ -- "cube" uses 6 textures just like a node, but all 6 must be defined.
-- "sprite" uses 1 texture.
-- "upright_sprite" uses 2 textures: {front, back}.
-- "wielditem" expects 'textures = {itemname}' (see 'visual' above).
automatic_face_movement_max_rotation_per_sec = -1,
-- Limit automatic rotation to this value in degrees per second.
- -- No limit if value < 0.
+ -- No limit if value <= 0.
backface_culling = true,
-- Set to false to disable backface_culling for model
-- and not just for blocks that were saved last time before LBMs were
-- introduced to the world.
- action = func(pos, node),
+ action = function(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
-- 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}
+ -- {soil = 2, outerspace = 1, crumbly = 1}
+ -- {bendy = 2, snappy = 1},
+ -- {hard = 1, metal = 1, spikes = 1}
inventory_image = "default_tool_steelaxe.png",
sound = {
breaks = "default_tool_break", -- tools only
place = <SimpleSoundSpec>,
+ eat = <SimpleSoundSpec>,
},
- on_place = func(itemstack, placer, pointed_thing),
+ on_place = function(itemstack, placer, pointed_thing),
-- 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),
+ on_secondary_use = function(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" }
- on_drop = func(itemstack, dropper, pos),
+ on_drop = function(itemstack, dropper, pos),
-- 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),
+ on_use = function(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.
-- The user may be any ObjectRef or nil.
-- The default functions handle regular use cases.
- after_use = func(itemstack, user, node, digparams),
+ after_use = function(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.
-- usage.
}
-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
- }
-
Node definition
---------------
-- Only when `paramtype2` supports palettes.
post_effect_color = "green#0F",
- -- Screen tint if player is inside node, see "ColorSpec".
+ -- Screen tint if player is inside node, see "ColorSpec"
paramtype = "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 and dungeon generator will not carve
+ -- through this node.
+ -- Specifically, this stops mod-added nodes being removed by caves and
+ -- dungeons when those generate in a neighbor mapchunk and extend out
+ -- beyond the edge of that mapchunk.
sunlight_propagates = false,
-- If true, sunlight will go infinitely through this node
legacy_wallmounted = false,
waving = 0,
- -- Valid for mesh, nodebox, plantlike, allfaces_optional nodes.
- -- 1 - wave node like plants (top of node moves, bottom is fixed)
+ -- Valid for drawtypes:
+ -- mesh, nodebox, plantlike, allfaces_optional, liquid, flowingliquid.
+ -- 1 - wave node like plants (node top moves side-to-side, 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.
+ -- 3 - wave node like liquids (whole node moves up and down)
+ -- Not all models will properly wave.
+ -- plantlike drawtype can only wave like plants.
+ -- allfaces_optional drawtype can only wave like leaves.
+ -- liquid, flowingliquid drawtypes can only wave like liquids.
sounds = {
footstep = <SimpleSoundSpec>,
dug = <SimpleSoundSpec>,
place = <SimpleSoundSpec>,
place_failed = <SimpleSoundSpec>,
+ fall = <SimpleSoundSpec>,
},
drop = "",
- -- Name of dropped node when dug. Default is the node itself.
- -- Alternatively:
+ -- Name of dropped item when dug.
+ -- Default dropped item is the node itself.
+ -- Using a table allows multiple items, drop chances and tool filtering:
drop = {
- -- Maximum number of items to drop
max_items = 1,
- -- Choose max_items randomly from this list
+ -- Maximum number of item lists to drop.
+ -- The entries in 'items' are processed in order. For each:
+ -- Tool filtering is applied, chance of drop is applied, if both are
+ -- successful the entire item list is dropped.
+ -- Entry processing continues until the number of dropped item lists
+ -- equals 'max_items'.
+ -- Therefore, entries should progress from low to high drop chance.
items = {
+ -- Entry examples.
+ {
+ -- 1 in 1000 chance of dropping a diamond.
+ -- Default rarity is '1'.
+ rarity = 1000,
+ items = {"default:diamond"},
+ },
+ {
+ -- Only drop if using a tool whose name is identical to one
+ -- of these.
+ tools = {"default:shovel_mese", "default:shovel_diamond"},
+ rarity = 5,
+ items = {"default:dirt"},
+ -- Whether all items in the dropped item list inherit the
+ -- hardware coloring palette color from the dug node.
+ -- Default is 'false'.
+ inherit_color = true,
+ },
{
- 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
+ -- Only drop if using a tool whose name contains
+ -- "default:shovel_".
+ tools = {"~default:shovel_"},
+ rarity = 2,
+ -- The item list dropped.
+ items = {"default:sand", "default:desert_sand"},
},
},
},
- on_construct = func(pos),
+ on_construct = function(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),
+ on_destruct = function(pos),
-- Node destructor; called before removing node.
-- Not called for bulk node placement.
-- default: nil
- after_destruct = func(pos, oldnode),
+ after_destruct = function(pos, oldnode),
-- Node destructor; called after removing node.
-- Not called for bulk node placement.
-- default: nil
- on_flood = func(pos, oldnode, newnode),
+ on_flood = function(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
-- Default: nil
-- Warning: making a liquid node 'floodable' will cause problems.
- preserve_metadata = func(pos, oldnode, oldmeta, drops),
+ preserve_metadata = function(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
-- "ItemStackMetaRef".
-- default: nil
- after_place_node = func(pos, placer, itemstack, pointed_thing),
+ after_place_node = function(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),
+ after_dig_node = function(pos, oldnode, oldmetadata, digger),
-- oldmetadata is in table format.
-- Called after destructing node when node was dug using
-- minetest.node_dig / minetest.dig_node.
can_dig = function(pos, [player]),
- on_punch = func(pos, node, puncher, pointed_thing),
+ on_punch = function(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),
+ on_rightclick = function(pos, node, clicker, itemstack, pointed_thing),
-- default: nil
-- itemstack will hold clicker's wielded item.
-- Shall return the leftover itemstack.
-- 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),
+ on_dig = function(pos, node, digger),
-- default: minetest.node_dig
-- By default checks privileges, wears out tool and removes node.
-- return true to run the timer for another cycle with the same timeout
-- value.
- on_receive_fields = func(pos, formname, fields, sender),
+ on_receive_fields = function(pos, formname, fields, sender),
-- fields = {name1 = value1, name2 = value2, ...}
-- Called when an UI form (e.g. sign text input) returns data.
+ -- See minetest.register_on_player_receive_fields for more info.
-- default: nil
- allow_metadata_inventory_move = func(pos, from_list, from_index, to_list, to_index, count, player),
+ allow_metadata_inventory_move = function(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.
- allow_metadata_inventory_put = func(pos, listname, index, stack, player),
+ allow_metadata_inventory_put = function(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.
- allow_metadata_inventory_take = func(pos, listname, index, stack, player),
+ allow_metadata_inventory_take = function(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.
- 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),
+ on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player),
+ on_metadata_inventory_put = function(pos, listname, index, stack, player),
+ on_metadata_inventory_take = function(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),
+ on_blast = function(pos, intensity),
-- intensity: 1.0 = mid range of regular TNT.
-- If defined, called when an explosion touches the node, instead of
-- removing the node.
{'', 'default:stick', ''}, -- Also groups; e.g. 'group:crumbly'
},
replacements = <list of item pairs>,
- -- `replacements`: replace one input item with another item on crafting
+ -- replacements: replace one input item with another item on crafting
-- (optional).
}
"mushrooms:mushroom_red",
},
replacements = <list of item pairs>,
- -- `replacements`: replace one input item with another item on crafting
- -- (optional).
}
### Tool repair
additional_wear = -0.02,
}
+Note: Tools with group `disable_repair=1` will not repairable by this recipe.
+
### Cooking
{
{
type = "fuel",
- recipe = "default:leaves",
- burntime = 1,
+ recipe = "bucket:bucket_lava",
+ burntime = 60,
+ replacements = {{"bucket:bucket_lava", "bucket:bucket_empty"}},
}
Ore definition
Used by `minetest.register_ore`.
-See 'Ores' section above for essential information.
+See [Ores] section above for essential information.
{
ore_type = "scatter",
-- In this example, there is a 3 * 3 * 3 cluster where 8 out of the 27
-- nodes are coal ore.
- -- Lower and upper limits for ore
y_min = -31000,
y_max = 64,
+ -- Lower and upper limits for ore
flags = "",
-- Attributes for the ore generation, see 'Ore attributes' section above
depth_riverbed = 2,
-- 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.
+ node_cave_liquid = "default:lava_source",
+ node_cave_liquid = {"default:water_source", "default:lava_source"},
+ -- Nodes placed inside 50% of the medium size caves.
+ -- Multiple nodes can be specified, each cave will use a randomly
+ -- chosen node from the list.
+ -- If this field is left out or 'nil', cave liquids fall back to
+ -- classic behaviour of lava and water distributed using 3D noise.
+ -- For no cave liquid, specify "air".
node_dungeon = "default:cobble",
-- Node used for primary dungeon structure.
Decoration definition
---------------------
-See "Decoration types". Used by `minetest.register_decoration`.
+See [Decoration types]. Used by `minetest.register_decoration`.
{
deco_type = "simple",
* `()` signifies grouping. For example, when param1 and param2 are both
required, or only param3 is required: `(<param1> <param2>) | <param3>`
+Privilege definition
+--------------------
+
+Used by `minetest.register_privilege`.
+
+ {
+ description = "Can teleport", -- Privilege description
+
+ give_to_singleplayer = false,
+ -- Whether to grant the privilege to singleplayer (default true).
+
+ give_to_admin = true,
+ -- Whether to grant the privilege to the server admin.
+ -- Uses value of 'give_to_singleplayer' by default.
+
+ on_grant = function(name, granter_name),
+ -- Called when given to player 'name' by 'granter_name'.
+ -- 'granter_name' will be nil if the priv was granted by a mod.
+
+ on_revoke = function(name, revoker_name),
+ -- Called when taken from player 'name' by 'revoker_name'.
+ -- 'revoker_name' will be nil if the priv was revoked by a mod.
+
+ -- Note that the above two callbacks will be called twice if a player is
+ -- responsible, once with the player name, and then with a nil player
+ -- name.
+ -- Return true in the above callbacks to stop register_on_priv_grant or
+ -- revoke being called.
+ }
+
Detached inventory callbacks
----------------------------
Used by `minetest.create_detached_inventory`.
{
- allow_move = func(inv, from_list, from_index, to_list, to_index, count, player),
+ allow_move = function(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.
- allow_put = func(inv, listname, index, stack, player),
+ allow_put = function(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.
- allow_take = func(inv, listname, index, stack, player),
+ allow_take = function(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.
- 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),
+ on_move = function(inv, from_list, from_index, to_list, to_index, count, player),
+ on_put = function(inv, listname, index, stack, player),
+ on_take = function(inv, listname, index, stack, player),
-- Called after the actual action has happened, according to what was
-- allowed.
-- No return value.
HUD Definition
--------------
-See "HUD" section.
+See [HUD] section.
Used by `Player:hud_add`. Returned by `Player:hud_get`.
-- Disappears after expirationtime seconds
size = 1,
+ -- Scales the visual size of the particle texture.
collisiondetection = false,
- -- If true collides with physical objects
+ -- If true collides with `walkable` nodes and, depending on the
+ -- `object_collision` field, objects too.
collision_removal = false,
-- 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,
-- If true faces player using y axis only
{
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},
maxexptime = 1,
minsize = 1,
maxsize = 1,
- -- The particle's properties are random values in between the bounds
+ -- The particles' properties are random values between the min and max
+ -- values.
-- pos, velocity, acceleration, expirationtime, size
collisiondetection = false,
- -- If true collides with physical objects
+ -- If true collide with `walkable` nodes and, depending on the
+ -- `object_collision` field, objects too.
collision_removal = false,
- -- If true particle is removed when it collides.
+ -- 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,
-- relative to this object's position and yaw
vertical = false,
- -- If true faces player using y axis only
+ -- If true face player using y axis only
texture = "image.png",
playername = "singleplayer",
- -- Optional, if specified spawns particle only on the player's client
+ -- 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.
Used by `minetest.register_authentication_handler`.
{
- get_auth = func(name),
+ get_auth = function(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>}`
- create_auth = func(name, password),
+ create_auth = function(name, password),
-- 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 = function(name),
-- Delete auth data of player `name`.
-- Returns boolean indicating success (false if player is nonexistent).
- set_password = func(name, password),
+ set_password = function(name, password),
-- Set password of player `name` to `password`.
-- Auth data should be created if not present.
- set_privileges = func(name, privileges),
+ set_privileges = function(name, privileges),
-- Set privileges of player `name`.
-- `privileges` is in table form, auth data should be created if not
-- present.
- reload = func(),
+ reload = function(),
-- Reload authentication data from the storage location.
-- Returns boolean indicating success.
- record_login = func(name),
+ record_login = function(name),
-- Called when player joins, used for keeping track of last_login
- iterate = func(),
+ iterate = function(),
-- Returns an iterator (use with `for` loops) for all player names
-- currently in the auth database
}