]> git.lizzy.rs Git - minetest.git/blob - doc/lua_api.txt
Bump version to 0.4.12
[minetest.git] / doc / lua_api.txt
1 Minetest Lua Modding API Reference 0.4.12
2 =========================================
3 * More information at <http://www.minetest.net/>
4 * Developer Wiki: <http://dev.minetest.net/>
5
6 Introduction
7 ------------
8 Content and functionality can be added to Minetest 0.4 by using Lua
9 scripting in run-time loaded mods.
10
11 A mod is a self-contained bunch of scripts, textures and other related
12 things that is loaded by and interfaces with Minetest.
13
14 Mods are contained and ran solely on the server side. Definitions and media
15 files are automatically transferred to the client.
16
17 If you see a deficiency in the API, feel free to attempt to add the
18 functionality in the engine and API. You can send such improvements as
19 source code patches to <celeron55@gmail.com>.
20
21 Programming in Lua
22 ------------------
23 If you have any difficulty in understanding this, please read [Programming in Lua](http://www.lua.org/pil/).
24
25 Startup
26 -------
27 Mods are loaded during server startup from the mod load paths by running
28 the `init.lua` scripts in a shared environment.
29
30 Paths
31 -----
32 * `RUN_IN_PLACE=1` (Windows release, local build)
33     *  `$path_user`:
34         * Linux: `<build directory>`
35         * Windows: `<build directory>`
36     * `$path_share`
37         * Linux: `<build directory>`
38         * Windows:  `<build directory>`
39 * `RUN_IN_PLACE=0`: (Linux release)
40     * `$path_share`
41         * Linux: `/usr/share/minetest`
42         * Windows: `<install directory>/minetest-0.4.x`
43     * `$path_user`:
44         * Linux: `$HOME/.minetest`
45         * Windows: `C:/users/<user>/AppData/minetest` (maybe)
46
47 Games
48 -----
49 Games are looked up from:
50
51 * `$path_share/games/gameid/`
52 * `$path_user/games/gameid/`
53
54 where `gameid` is unique to each game.
55
56 The game directory contains the file `game.conf`, which contains these fields:
57
58     name = <Human-readable full name of the game>
59
60 e.g.
61
62     name = Minetest
63
64 The game directory can contain the file minetest.conf, which will be used
65 to set default settings when running the particular game.
66
67 Mod load path
68 -------------
69 Generic:
70
71 * `$path_share/games/gameid/mods/`
72 * `$path_share/mods/`
73 * `$path_user/games/gameid/mods/`
74 * `$path_user/mods/` (User-installed mods)
75 * `$worldpath/worldmods/`
76
77 In a run-in-place version (e.g. the distributed windows version):
78
79 * `minetest-0.4.x/games/gameid/mods/`
80 * `minetest-0.4.x/mods/` (User-installed mods)
81 * `minetest-0.4.x/worlds/worldname/worldmods/`
82
83 On an installed version on Linux:
84
85 * `/usr/share/minetest/games/gameid/mods/`
86 * `$HOME/.minetest/mods/` (User-installed mods)
87 * `$HOME/.minetest/worlds/worldname/worldmods`
88
89 Mod load path for world-specific games
90 --------------------------------------
91 It is possible to include a game in a world; in this case, no mods or
92 games are loaded or checked from anywhere else.
93
94 This is useful for e.g. adventure worlds.
95
96 This happens if the following directory exists:
97
98     $world/game/
99
100 Mods should be then be placed in:
101
102     $world/game/mods/
103
104 Modpack support
105 ----------------
106 Mods can be put in a subdirectory, if the parent directory, which otherwise
107 should be a mod, contains a file named `modpack.txt`. This file shall be
108 empty, except for lines starting with `#`, which are comments.
109
110 Mod directory structure
111 ------------------------
112
113     mods
114     |-- modname
115     |   |-- depends.txt
116     |   |-- screenshot.png
117     |   |-- description.txt
118     |   |-- init.lua
119     |   |-- models
120     |   |-- textures
121     |   |   |-- modname_stuff.png
122     |   |   `-- modname_something_else.png
123     |   |-- sounds
124     |   |-- media
125     |   `-- <custom data>
126     `-- another
127
128
129 ### modname
130 The location of this directory can be fetched by using
131 `minetest.get_modpath(modname)`.
132
133 ### `depends.txt`
134 List of mods that have to be loaded before loading this mod.
135
136 A single line contains a single modname.
137
138 Optional dependencies can be defined by appending a question mark
139 to a single modname. Their meaning is that if the specified mod
140 is missing, that does not prevent this mod from being loaded.
141
142 ### `screenshot.png`
143 A screenshot shown in modmanager within mainmenu.
144
145 ### `description.txt`
146 A File containing description to be shown within mainmenu.
147
148 ### `init.lua`
149 The main Lua script. Running this script should register everything it
150 wants to register. Subsequent execution depends on minetest calling the
151 registered callbacks.
152
153 `minetest.setting_get(name)` and `minetest.setting_getbool(name)` can be used
154 to read custom or existing settings at load time, if necessary.
155
156 ### `models`
157 Models for entities or meshnodes.
158
159 ### `textures`, `sounds`, `media`
160 Media files (textures, sounds, whatever) that will be transferred to the
161 client and will be available for use by the mod.
162
163 Naming convention for registered textual names
164 ----------------------------------------------
165 Registered names should generally be in this format:
166
167     "modname:<whatever>" (<whatever> can have characters a-zA-Z0-9_)
168
169 This is to prevent conflicting names from corrupting maps and is
170 enforced by the mod loader.
171
172 ### Example
173 In the mod `experimental`, there is the ideal item/node/entity name `tnt`.
174 So the name should be `experimental:tnt`.
175
176 Enforcement can be overridden by prefixing the name with `:`. This can
177 be used for overriding the registrations of some other mod.
178
179 Example: Any mod can redefine `experimental:tnt` by using the name
180
181     :experimental:tnt
182
183 when registering it.
184 (also that mod is required to have `experimental` as a dependency)
185
186 The `:` prefix can also be used for maintaining backwards compatibility.
187
188 ### Aliases
189 Aliases can be added by using `minetest.register_alias(name, convert_to)`.
190
191 This will make Minetest to convert things called name to things called
192 `convert_to`.
193
194 This can be used for maintaining backwards compatibility.
195
196 This can be also used for setting quick access names for things, e.g. if
197 you have an item called `epiclylongmodname:stuff`, you could do
198
199     minetest.register_alias("stuff", "epiclylongmodname:stuff")
200
201 and be able to use `/giveme stuff`.
202
203 Textures
204 --------
205 Mods should generally prefix their textures with `modname_`, e.g. given
206 the mod name `foomod`, a texture could be called:
207
208     foomod_foothing.png
209
210 Textures are referred to by their complete name, or alternatively by
211 stripping out the file extension:
212
213 * e.g. `foomod_foothing.png`
214 * e.g. `foomod_foothing`
215
216 Texture modifiers
217 -----------------
218 There are various texture modifiers that can be used
219 to generate textures on-the-fly.
220
221 ### Texture overlaying
222 Textures can be overlaid by putting a `^` between them.
223
224 Example:
225
226     default_dirt.png^default_grass_side.png
227
228 `default_grass_side.png` is overlayed over `default_dirt.png`.
229
230 ### Texture grouping
231 Textures can be grouped together by enclosing them in `(` and `)`.
232
233 Example: `cobble.png^(thing1.png^thing2.png)`
234
235 A texture for `thing1.png^thing2.png` is created and the resulting
236 texture is overlaid over `cobble.png`.
237
238 ### Advanced texture modifiers
239
240 #### `[crack:<n>:<p>`
241 * `<n>` = animation frame count
242 * `<p>` = current animation frame
243
244 Draw a step of the crack animation on the texture.
245
246 Example:
247
248     default_cobble.png^[crack:10:1
249
250 #### `[combine:<w>x<h>:<x1>,<y1>=<file1>:<x2>,<y2>=<file2>`
251 * `<w>` = width
252 * `<h>` = height
253 * `<x1>`/`<x2>` = x positions
254 * `<y1>`/`<y1>` = y positions
255 * `<file1>`/`<file2>` = textures to combine
256
257 Create a texture of size `<w>` times `<h>` and blit `<file1>` to (`<x1>`,`<y1>`)
258 and blit `<file2>` to (`<x2>`,`<y2>`).
259
260 Example:
261
262     [combine:16x32:0,0=default_cobble.png:0,16=default_wood.png
263
264 #### `[brighten`
265 Brightens the texture.
266
267 Example:
268
269     tnt_tnt_side.png^[brighten
270
271 #### `[noalpha`
272 Makes the texture completely opaque.
273
274 Example:
275
276     default_leaves.png^[noalpha
277
278 #### `[makealpha:<r>,<g>,<b>`
279 Convert one color to transparency.
280
281 Example:
282
283     default_cobble.png^[makealpha:128,128,128
284
285 #### `[transform<t>`
286 * `<t>` = transformation(s) to apply
287
288 Rotates and/or flips the image.
289
290 `<t>` can be a number (between 0 and 7) or a transform name.
291 Rotations are counter-clockwise.
292
293     0  I      identity
294     1  R90    rotate by 90 degrees
295     2  R180   rotate by 180 degrees
296     3  R270   rotate by 270 degrees
297     4  FX     flip X
298     5  FXR90  flip X then rotate by 90 degrees
299     6  FY     flip Y
300     7  FYR90  flip Y then rotate by 90 degrees
301
302 Example:
303
304     default_stone.png^[transformFXR90
305
306 #### `[inventorycube{<top>{<left>{<right>`
307 `^` is replaced by `&` in texture names.
308
309 Create an inventory cube texture using the side textures.
310
311 Example:
312
313     [inventorycube{grass.png{dirt.png&grass_side.png{dirt.png&grass_side.png
314
315 Creates an inventorycube with `grass.png`, `dirt.png^grass_side.png` and
316 `dirt.png^grass_side.png` textures
317
318 #### `[lowpart:<percent>:<file>`
319 Blit the lower `<percent>`% part of `<file>` on the texture.
320
321 Example:
322
323     base.png^[lowpart:25:overlay.png
324
325 #### `[verticalframe:<t>:<n>`
326 * `<t>` = animation frame count
327 * `<n>` = current animation frame
328
329 Crops the texture to a frame of a vertical animation.
330
331 Example:
332
333     default_torch_animated.png^[verticalframe:16:8
334
335 #### `[mask:<file>`
336 Apply a mask to the base image.
337
338 The mask is applied using binary AND.
339
340 #### `[colorize:<color>:<ratio>`
341 Colorize the textures with the given color.
342 `<color>` is specified as a `ColorString`.
343 `<ratio>` is an int ranging from 0 to 255, and specifies how much of the
344 color to apply. If ommitted, the alpha will be used.
345
346 Sounds
347 ------
348 Only Ogg Vorbis files are supported.
349
350 For positional playing of sounds, only single-channel (mono) files are
351 supported. Otherwise OpenAL will play them non-positionally.
352
353 Mods should generally prefix their sounds with `modname_`, e.g. given
354 the mod name "`foomod`", a sound could be called:
355
356     foomod_foosound.ogg
357
358 Sounds are referred to by their name with a dot, a single digit and the
359 file extension stripped out. When a sound is played, the actual sound file
360 is chosen randomly from the matching sounds.
361
362 When playing the sound `foomod_foosound`, the sound is chosen randomly
363 from the available ones of the following files:
364
365 * `foomod_foosound.ogg`
366 * `foomod_foosound.0.ogg`
367 * `foomod_foosound.1.ogg`
368 * (...)
369 * `foomod_foosound.9.ogg`
370
371 Examples of sound parameter tables:
372
373     -- Play location-less on all clients
374     {
375         gain = 1.0, -- default
376     }
377     -- Play location-less to a player
378     {
379         to_player = name,
380         gain = 1.0, -- default
381     }
382     -- Play in a location
383     {
384         pos = {x=1,y=2,z=3},
385         gain = 1.0, -- default
386         max_hear_distance = 32, -- default
387     }
388     -- Play connected to an object, looped
389     {
390         object = <an ObjectRef>,
391         gain = 1.0, -- default
392         max_hear_distance = 32, -- default
393         loop = true, -- only sounds connected to objects can be looped
394     }
395
396 ### `SimpleSoundSpec`
397 * e.g. `""`
398 * e.g. `"default_place_node"`
399 * e.g. `{}`
400 * e.g. `{name="default_place_node"}`
401 * e.g. `{name="default_place_node", gain=1.0}`
402
403 Registered definitions of stuff
404 -------------------------------
405 Anything added using certain `minetest.register_*` functions get added to
406 the global `minetest.registered_*` tables.
407
408 * `minetest.register_entity(name, prototype table)`
409     * added to `minetest.registered_entities[name]`
410
411 * `minetest.register_node(name, node definition)`
412     * added to `minetest.registered_items[name]`
413     * added to `minetest.registered_nodes[name]`
414
415 * `minetest.register_tool(name, item definition)`
416     * added to `minetest.registered_items[name]`
417
418 * `minetest.register_craftitem(name, item definition)`
419     * added to `minetest.registered_items[name]`
420
421 * `minetest.register_ore(ore definition)`
422     * returns an integer uniquely identifying the registered ore
423     * added to `minetest.registered_ores` with the key of `ore.name`
424     * if `ore.name` is nil, the key is the returned ID
425
426 * `minetest.register_decoration(decoration definition)`
427     * returns an integer uniquely identifying the registered decoration
428     * added to `minetest.registered_decorations` with the key of `decoration.name`
429     * if `decoration.name` is nil, the key is the returned ID
430
431 * `minetest.clear_registered_ores()`
432    * clears all ores currently registered
433
434 * `minetest.clear_registered_decorations()`
435    * clears all decorations currently registered
436
437 Note that in some cases you will stumble upon things that are not contained
438 in these tables (e.g. when a mod has been removed). Always check for
439 existence before trying to access the fields.
440
441 Example: If you want to check the drawtype of a node, you could do:
442
443     local function get_nodedef_field(nodename, fieldname)
444         if not minetest.registered_nodes[nodename] then
445             return nil
446         end
447         return minetest.registered_nodes[nodename][fieldname]
448     end
449     local drawtype = get_nodedef_field(nodename, "drawtype")
450
451 Example: `minetest.get_item_group(name, group)` has been implemented as:
452
453     function minetest.get_item_group(name, group)
454         if not minetest.registered_items[name] or not
455                 minetest.registered_items[name].groups[group] then
456             return 0
457         end
458         return minetest.registered_items[name].groups[group]
459     end
460
461 Nodes
462 -----
463 Nodes are the bulk data of the world: cubes and other things that take the
464 space of a cube. Huge amounts of them are handled efficiently, but they
465 are quite static.
466
467 The definition of a node is stored and can be accessed by name in
468
469     minetest.registered_nodes[node.name]
470
471 See "Registered definitions of stuff".
472
473 Nodes are passed by value between Lua and the engine.
474 They are represented by a table:
475
476     {name="name", param1=num, param2=num}
477
478 `param1` and `param2` are 8-bit integers. The engine uses them for certain
479 automated functions. If you don't use these functions, you can use them to
480 store arbitrary values.
481
482 The functions of `param1` and `param2` are determined by certain fields in the
483 node definition:
484
485 `param1` is reserved for the engine when `paramtype != "none"`:
486
487     paramtype = "light"
488     ^ The value stores light with and without sun in its upper and lower 4 bits
489       respectively. Allows light to propagate from or through the node with
490       light value falling by 1 per node. This is essential for a light source
491       node to spread its light.
492
493 `param2` is reserved for the engine when any of these are used:
494
495     liquidtype == "flowing"
496     ^ The level and some flags of the liquid is stored in param2
497     drawtype == "flowingliquid"
498     ^ The drawn liquid level is read from param2
499     drawtype == "torchlike"
500     drawtype == "signlike"
501     paramtype2 == "wallmounted"
502     ^ The rotation of the node is stored in param2. You can make this value
503       by using minetest.dir_to_wallmounted().
504     paramtype2 == "facedir"
505     ^ The rotation of the node is stored in param2. Furnaces and chests are
506       rotated this way. Can be made by using minetest.dir_to_facedir().
507       Values range 0 - 23
508       facedir modulo 4 = axisdir
509       0 = y+    1 = z+    2 = z-    3 = x+    4 = x-    5 = y-
510       facedir's two less significant bits are rotation around the axis
511     paramtype2 == "leveled"
512     collision_box = {
513       type = "fixed",
514       fixed = {
515                 {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
516       },
517     },
518     ^ defines list of collision boxes for the node. If empty, collision boxes
519       will be the same as nodeboxes, in case of any other nodes will be full cube
520       as in the example above.
521
522 Nodes can also contain extra data. See "Node Metadata".
523
524 Node drawtypes
525 ---------------
526 There are a bunch of different looking node types.
527
528 Look for examples in `games/minimal` or `games/minetest_game`.
529
530 * `normal`
531 * `airlike`
532 * `liquid`
533 * `flowingliquid`
534 * `glasslike`
535 * `glasslike_framed`
536 * `glasslike_framed_optional`
537 * `allfaces`
538 * `allfaces_optional`
539 * `torchlike`
540 * `signlike`
541 * `plantlike`
542 * `firelike`
543 * `fencelike`
544 * `raillike`
545 * `nodebox` -- See below. (**Experimental!**)
546 * `mesh` -- use models for nodes
547
548 `*_optional` drawtypes need less rendering time if deactivated (always client side).
549
550 Node boxes
551 -----------
552 Node selection boxes are defined using "node boxes"
553
554 The `nodebox` node drawtype allows defining visual of nodes consisting of
555 arbitrary number of boxes. It allows defining stuff like stairs. Only the
556 `fixed` and `leveled` box type is supported for these.
557
558 Please note that this is still experimental, and may be incompatibly
559 changed in the future.
560
561 A nodebox is defined as any of:
562
563     {
564         -- A normal cube; the default in most things
565         type = "regular"
566     }
567     {
568         -- A fixed box (facedir param2 is used, if applicable)
569         type = "fixed",
570         fixed = box OR {box1, box2, ...}
571     }
572     {
573         -- A box like the selection box for torches
574         -- (wallmounted param2 is used, if applicable)
575         type = "wallmounted",
576         wall_top = box,
577         wall_bottom = box,
578         wall_side = box
579     }
580
581 A `box` is defined as:
582
583     {x1, y1, z1, x2, y2, z2}
584
585 A box of a regular node would look like:
586
587     {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
588
589 `type = "leveled"` is same as `type = "fixed"`, but `y2` will be automatically
590 set to level from `param2`.
591
592
593 Meshes
594 ------
595 If drawtype `mesh` is used, tiles should hold model materials textures.
596 Only static meshes are implemented.
597 For supported model formats see Irrlicht engine documentation.
598
599
600 Noise Parameters
601 ----------------
602 Noise Parameters, or commonly called "`NoiseParams`", define the properties of perlin noise.
603
604 ### `offset`
605 Offset that the noise is translated by (i.e. added) after calculation.
606
607 ### `scale`
608 Factor that the noise is scaled by (i.e. multiplied) after calculation.
609
610 ### `spread`
611 Vector containing values by which each coordinate is divided by before calculation.
612 Higher spread values result in larger noise features.
613
614 A value of `{x=250, y=250, z=250}` is common.
615
616 ### `seed`
617 Random seed for the noise. Add the world seed to a seed offset for world-unique noise.
618 In the case of `minetest.get_perlin()`, this value has the world seed automatically added.
619
620 ### `octaves`
621 Number of times the noise gradient is accumulated into the noise.
622
623 Increase this number to increase the amount of detail in the resulting noise.
624
625 A value of `6` is common.
626
627 ### `persistence`
628 Factor by which the effect of the noise gradient function changes with each successive octave.
629
630 Values less than `1` make the details of successive octaves' noise diminish, while values
631 greater than `1` make successive octaves stronger.
632
633 A value of `0.6` is common.
634
635 ### `lacunarity`
636 Factor by which the noise feature sizes change with each successive octave.
637
638 A value of `2.0` is common.
639
640 ### `flags`
641 Leave this field unset for no special handling.
642
643 Currently supported are `defaults`, `eased` and `absvalue`.
644
645 #### `defaults`
646 Specify this if you would like to keep auto-selection of eased/not-eased while specifying
647 some other flags.
648
649 #### `eased`
650 Maps noise gradient values onto a quintic S-curve before performing interpolation.
651 This results in smooth, rolling noise. Disable this (`noeased`) for sharp-looking noise.
652 If no flags are specified (or defaults is), 2D noise is eased and 3D noise is not eased.
653
654 #### `absvalue`
655 Accumulates the absolute value of each noise gradient result.
656
657 Noise parameters format example for 2D or 3D perlin noise or perlin noise maps:
658     np_terrain = {
659         offset = 0,
660         scale = 1,
661         spread = {x=500, y=500, z=500},
662         seed = 571347,
663         octaves = 5,
664         persist = 0.63,
665         lacunarity = 2.0,
666         flags = "defaults, absvalue"
667     }
668   ^ A single noise parameter table can be used to get 2D or 3D noise,
669     when getting 2D noise spread.z is ignored.
670
671
672 Ore types
673 ---------
674 These tell in what manner the ore is generated.
675
676 All default ores are of the uniformly-distributed scatter type.
677
678 ### `scatter`
679 Randomly chooses a location and generates a cluster of ore.
680
681 If `noise_params` is specified, the ore will be placed if the 3D perlin noise at
682 that point is greater than the `noise_threshold`, giving the ability to create a non-equal
683 distribution of ore.
684
685 ### `sheet`
686 Creates a sheet of ore in a blob shape according to the 2D perlin noise described by `noise_params`.
687 The relative height of the sheet can be controlled by the same perlin noise as well, by specifying
688 a non-zero `scale` parameter in `noise_params`.
689
690 **IMPORTANT**: The noise is not transformed by `offset` or `scale` when comparing against the noise
691 threshold, but scale is used to determine relative height.
692 The height of the blob is randomly scattered, with a maximum height of `clust_size`.
693
694 `clust_scarcity` and `clust_num_ores` are ignored.
695
696 This is essentially an improved version of the so-called "stratus" ore seen in some unofficial mods.
697
698 ### `blob`
699 Creates a deformed sphere of ore according to 3d perlin noise described by
700 `noise_params`.  The maximum size of the blob is `clust_size`, and
701 `clust_scarcity` has the same meaning as with the `scatter` type.
702 ### `vein
703 Creates veins of ore varying in density by according to the intersection of two
704 instances of 3d perlin noise with diffferent seeds, both described by
705 `noise_params`.  `random_factor` varies the influence random chance has on
706 placement of an ore inside the vein, which is `1` by default. Note that
707 modifying this parameter may require adjusting `noise_threshhold`.
708 The parameters `clust_scarcity`, `clust_num_ores`, and `clust_size` are ignored
709 by this ore type.  This ore type is difficult to control since it is sensitive
710 to small changes.  The following is a decent set of parameters to work from:
711
712         noise_params = {
713             offset  = 0,
714             scale   = 3,
715             spread  = {x=200, y=200, z=200},
716             seed    = 5390,
717             octaves = 4,
718             persist = 0.5,
719             flags = "eased",
720         },
721         noise_threshhold = 1.6
722
723 WARNING:  Use this ore type *very* sparingly since it is ~200x more
724 computationally expensive than any other ore.
725
726 Ore attributes
727 --------------
728 See section "Flag Specifier Format".
729
730 Currently supported flags: `absheight`
731
732 ### `absheight`
733 Also produce this same ore between the height range of `-y_max` and `-y_min`.
734
735 Useful for having ore in sky realms without having to duplicate ore entries.
736
737 Decoration types
738 ----------------
739 The varying types of decorations that can be placed.
740
741 The default value is `simple`, and is currently the only type supported.
742
743 ### `simple`
744 Creates a 1 times `H` times 1 column of a specified node (or a random node from a list, if a
745 decoration list is specified). Can specify a certain node it must spawn next to, such as water or
746 lava, for example. Can also generate a decoration of random height between a specified lower and
747 upper bound. This type of decoration is intended for placement of grass, flowers, cacti, papyri,
748 and so on.
749
750 ### `schematic`
751 Copies a box of `MapNodes` from a specified schematic file (or raw description). Can specify a
752 probability of a node randomly appearing when placed.  This decoration type is intended to be used
753 for multi-node sized discrete structures, such as trees, cave spikes, rocks, and so on.
754
755
756 Schematic specifier
757 --------------------
758 A schematic specifier identifies a schematic by either a filename to a Minetest Schematic file (`.mts`)
759 or through raw data supplied through Lua, in the form of a table.  This table must specify two fields:
760
761 * The `size` field is a 3D vector containing the dimensions of the provided schematic.
762 * The `data` field is a flat table of MapNodes making up the schematic, in the order of `[z [y [x]]]`.
763
764 **Important**: The default value for `param1` in MapNodes here is `255`, which represents "always place".
765
766 In the bulk `MapNode` data, `param1`, instead of the typical light values, instead represents the
767 probability of that node appearing in the structure.
768
769 When passed to `minetest.create_schematic`, probability is an integer value ranging from `0` to `255`:
770
771 * A probability value of `0` means that node will never appear (0% chance).
772 * A probability value of `255` means the node will always appear (100% chance).
773 * If the probability value `p` is greater than `0`, then there is a `(p / 256 * 100)`% chance that node
774   will appear when the schematic is placed on the map.
775
776 **Important note**: Node aliases cannot be used for a raw schematic provided when registering as a decoration.
777
778
779 Schematic attributes
780 --------------------
781 See section "Flag Specifier Format".
782
783 Currently supported flags: `place_center_x`, `place_center_y`, `place_center_z`.
784
785 * `place_center_x`: Placement of this decoration is centered along the X axis.
786 * `place_center_y`: Placement of this decoration is centered along the Y axis.
787 * `place_center_z`: Placement of this decoration is centered along the Z axis.
788
789
790 HUD element types
791 -----------------
792 The position field is used for all element types.
793
794 To account for differing resolutions, the position coordinates are the percentage of the screen,
795 ranging in value from `0` to `1`.
796
797 The name field is not yet used, but should contain a description of what the HUD element represents.
798 The direction field is the direction in which something is drawn.
799
800 `0` draws from left to right, `1` draws from right to left, `2` draws from top to bottom,
801 and `3` draws from bottom to top.
802
803 The `alignment` field specifies how the item will be aligned. It ranges from `-1` to `1`,
804 with `0` being the center, `-1` is moved to the left/up, and `1` is to the right/down.
805 Fractional values can be used.
806
807 The `offset` field specifies a pixel offset from the position. Contrary to position,
808 the offset is not scaled to screen size. This allows for some precisely-positioned
809 items in the HUD.
810
811 **Note**: `offset` _will_ adapt to screen DPI as well as user defined scaling factor!
812
813 Below are the specific uses for fields in each type; fields not listed for that type are ignored.
814
815 **Note**: Future revisions to the HUD API may be incompatible; the HUD API is still in the experimental stages.
816
817 ### `image`
818 Displays an image on the HUD.
819
820 * `scale`: The scale of the image, with 1 being the original texture size.
821   Only the X coordinate scale is used (positive values).
822   Negative values represent that percentage of the screen it
823   should take; e.g. `x=-100` means 100% (width).
824 * `text`: The name of the texture that is displayed.
825 * `alignment`: The alignment of the image.
826 * `offset`: offset in pixels from position.
827
828 ### `text`
829 Displays text on the HUD.
830
831 * `scale`: Defines the bounding rectangle of the text.
832   A value such as `{x=100, y=100}` should work.
833 * `text`: The text to be displayed in the HUD element.
834 * `number`: An integer containing the RGB value of the color used to draw the text.
835   Specify `0xFFFFFF` for white text, `0xFF0000` for red, and so on.
836 * `alignment`: The alignment of the text.
837 * `offset`: offset in pixels from position.
838
839 ### `statbar`
840 Displays a horizontal bar made up of half-images.
841
842 * `text`: The name of the texture that is used.
843 * `number`: The number of half-textures that are displayed.
844   If odd, will end with a vertically center-split texture.
845 * `direction`
846 * `offset`: offset in pixels from position.
847 * `size`: If used, will force full-image size to this value (override texture pack image size)
848
849 ### `inventory`
850 * `text`: The name of the inventory list to be displayed.
851 * `number`: Number of items in the inventory to be displayed.
852 * `item`: Position of item that is selected.
853 * `direction`
854
855 ### `waypoint`
856 Displays distance to selected world position.
857
858 * `name`: The name of the waypoint.
859 * `text`: Distance suffix. Can be blank.
860 * `number:` An integer containing the RGB value of the color used to draw the text.
861 * `world_pos`: World position of the waypoint.
862
863 Representations of simple things
864 --------------------------------
865
866 ### Position/vector
867
868     {x=num, y=num, z=num}
869
870 For helper functions see "Vector helpers".
871
872 ### `pointed_thing`
873 * `{type="nothing"}`
874 * `{type="node", under=pos, above=pos}`
875 * `{type="object", ref=ObjectRef}`
876
877 Flag Specifier Format
878 ---------------------
879 Flags using the standardized flag specifier format can be specified in either of two ways, by string or table.
880
881 The string format is a comma-delimited set of flag names; whitespace and unrecognized flag fields are ignored.
882 Specifying a flag in the string sets the flag, and specifying a flag prefixed by the string `"no"` explicitly
883 clears the flag from whatever the default may be.
884
885 In addition to the standard string flag format, the schematic flags field can also be a table of flag names
886 to boolean values representing whether or not the flag is set. Additionally, if a field with the flag name
887 prefixed with `"no"` is present, mapped to a boolean of any value, the specified flag is unset.
888
889 E.g. A flag field of value
890
891     {place_center_x = true, place_center_y=false, place_center_z=true}
892
893 is equivalent to
894
895     {place_center_x = true, noplace_center_y=true, place_center_z=true}
896
897 which is equivalent to
898
899     "place_center_x, noplace_center_y, place_center_z"
900
901 or even
902
903     "place_center_x, place_center_z"
904
905 since, by default, no schematic attributes are set.
906
907 Items
908 -----
909
910 ### Item types
911 There are three kinds of items: nodes, tools and craftitems.
912
913 * Node (`register_node`): A node from the world.
914 * Tool (`register_tool`): A tool/weapon that can dig and damage
915   things according to `tool_capabilities`.
916 * Craftitem (`register_craftitem`): A miscellaneous item.
917
918 ### Item formats
919 Items and item stacks can exist in three formats: Serializes, table format
920 and `ItemStack`.
921
922 #### Serialized
923 This is called "stackstring" or "itemstring":
924
925 * e.g. `'default:dirt 5'`
926 * e.g. `'default:pick_wood 21323'`
927 * e.g. `'default:apple'`
928
929 #### Table format
930 Examples:
931
932 5 dirt nodes:
933
934     {name="default:dirt", count=5, wear=0, metadata=""}
935
936 A wooden pick about 1/3 worn out:
937
938     {name="default:pick_wood", count=1, wear=21323, metadata=""}
939
940 An apple:
941
942     {name="default:apple", count=1, wear=0, metadata=""}
943
944 #### `ItemStack`
945 A native C++ format with many helper methods. Useful for converting
946 between formats. See the Class reference section for details.
947
948 When an item must be passed to a function, it can usually be in any of
949 these formats.
950
951
952 Groups
953 ------
954 In a number of places, there is a group table. Groups define the
955 properties of a thing (item, node, armor of entity, capabilities of
956 tool) in such a way that the engine and other mods can can interact with
957 the thing without actually knowing what the thing is.
958
959 ### Usage
960 Groups are stored in a table, having the group names with keys and the
961 group ratings as values. For example:
962
963     groups = {crumbly=3, soil=1}
964     -- ^ Default dirt
965
966     groups = {crumbly=2, soil=1, level=2, outerspace=1}
967     -- ^ A more special dirt-kind of thing
968
969 Groups always have a rating associated with them. If there is no
970 useful meaning for a rating for an enabled group, it shall be `1`.
971
972 When not defined, the rating of a group defaults to `0`. Thus when you
973 read groups, you must interpret `nil` and `0` as the same value, `0`.
974
975 You can read the rating of a group for an item or a node by using
976
977     minetest.get_item_group(itemname, groupname)
978
979 ### Groups of items
980 Groups of items can define what kind of an item it is (e.g. wool).
981
982 ### Groups of nodes
983 In addition to the general item things, groups are used to define whether
984 a node is destroyable and how long it takes to destroy by a tool.
985
986 ### Groups of entities
987 For entities, groups are, as of now, used only for calculating damage.
988 The rating is the percentage of damage caused by tools with this damage group.
989 See "Entity damage mechanism".
990
991     object.get_armor_groups() --> a group-rating table (e.g. {fleshy=100})
992     object.set_armor_groups({fleshy=30, cracky=80})
993
994 ### Groups of tools
995 Groups in tools define which groups of nodes and entities they are
996 effective towards.
997
998 ### Groups in crafting recipes
999 An example: Make meat soup from any meat, any water and any bowl:
1000
1001     {
1002         output = 'food:meat_soup_raw',
1003         recipe = {
1004             {'group:meat'},
1005             {'group:water'},
1006             {'group:bowl'},
1007         },
1008         -- preserve = {'group:bowl'}, -- Not implemented yet (TODO)
1009     }
1010
1011 Another example: Make red wool from white wool and red dye:
1012
1013     {
1014         type = 'shapeless',
1015         output = 'wool:red',
1016         recipe = {'wool:white', 'group:dye,basecolor_red'},
1017     }
1018
1019 ### Special groups
1020 * `immortal`: Disables the group damage system for an entity
1021 * `level`: Can be used to give an additional sense of progression in the game.
1022      * A larger level will cause e.g. a weapon of a lower level make much less
1023        damage, and get worn out much faster, or not be able to get drops
1024        from destroyed nodes.
1025      * `0` is something that is directly accessible at the start of gameplay
1026      * There is no upper limit
1027 * `dig_immediate`: (player can always pick up node without tool wear)
1028     * `2`: node is removed without tool wear after 0.5 seconds or so
1029       (rail, sign)
1030     * `3`: node is removed without tool wear immediately (torch)
1031 * `disable_jump`: Player (and possibly other things) cannot jump from node
1032 * `fall_damage_add_percent`: damage speed = `speed * (1 + value/100)`
1033 * `bouncy`: value is bounce speed in percent
1034 * `falling_node`: if there is no walkable block under the node it will fall
1035 * `attached_node`: if the node under it is not a walkable block the node will be
1036   dropped as an item. If the node is wallmounted the wallmounted direction is
1037   checked.
1038 * `soil`: saplings will grow on nodes in this group
1039 * `connect_to_raillike`: makes nodes of raillike drawtype connect to
1040   other group members with same drawtype
1041
1042 ### Known damage and digging time defining groups
1043 * `crumbly`: dirt, sand
1044 * `cracky`: tough but crackable stuff like stone.
1045 * `snappy`: something that can be cut using fine tools; e.g. leaves, small
1046   plants, wire, sheets of metal
1047 * `choppy`: something that can be cut using force; e.g. trees, wooden planks
1048 * `fleshy`: Living things like animals and the player. This could imply
1049   some blood effects when hitting.
1050 * `explody`: Especially prone to explosions
1051 * `oddly_breakable_by_hand`:
1052    Can be added to nodes that shouldn't logically be breakable by the
1053    hand but are. Somewhat similar to `dig_immediate`, but times are more
1054    like `{[1]=3.50,[2]=2.00,[3]=0.70}` and this does not override the
1055    speed of a tool if the tool can dig at a faster speed than this
1056    suggests for the hand.
1057
1058 ### Examples of custom groups
1059 Item groups are often used for defining, well, _groups of items_.
1060 * `meat`: any meat-kind of a thing (rating might define the size or healing
1061   ability or be irrelevant -- it is not defined as of yet)
1062 * `eatable`: anything that can be eaten. Rating might define HP gain in half
1063   hearts.
1064 * `flammable`: can be set on fire. Rating might define the intensity of the
1065   fire, affecting e.g. the speed of the spreading of an open fire.
1066 * `wool`: any wool (any origin, any color)
1067 * `metal`: any metal
1068 * `weapon`: any weapon
1069 * `heavy`: anything considerably heavy
1070
1071 ### Digging time calculation specifics
1072 Groups such as `crumbly`, `cracky` and `snappy` are used for this
1073 purpose. Rating is `1`, `2` or `3`. A higher rating for such a group implies
1074 faster digging time.
1075
1076 The `level` group is used to limit the toughness of nodes a tool can dig
1077 and to scale the digging times / damage to a greater extent.
1078
1079 **Please do understand this**, otherwise you cannot use the system to it's
1080 full potential.
1081
1082 Tools define their properties by a list of parameters for groups. They
1083 cannot dig other groups; thus it is important to use a standard bunch of
1084 groups to enable interaction with tools.
1085
1086 #### Tools definition
1087 Tools define:
1088
1089 * Full punch interval
1090 * Maximum drop level
1091 * For an arbitrary list of groups:
1092     * Uses (until the tool breaks)
1093         * Maximum level (usually `0`, `1`, `2` or `3`)
1094         * Digging times
1095         * Damage groups
1096
1097 #### Full punch interval
1098 When used as a weapon, the tool will do full damage if this time is spent
1099 between punches. If e.g. half the time is spent, the tool will do half
1100 damage.
1101
1102 #### Maximum drop level
1103 Suggests the maximum level of node, when dug with the tool, that will drop
1104 it's useful item. (e.g. iron ore to drop a lump of iron).
1105
1106 This is not automated; it is the responsibility of the node definition
1107 to implement this.
1108
1109 #### Uses
1110 Determines how many uses the tool has when it is used for digging a node,
1111 of this group, of the maximum level. For lower leveled nodes, the use count
1112 is multiplied by `3^leveldiff`.
1113
1114 * `uses=10, leveldiff=0`: actual uses: 10
1115 * `uses=10, leveldiff=1`: actual uses: 30
1116 * `uses=10, leveldiff=2`: actual uses: 90
1117
1118 #### Maximum level
1119 Tells what is the maximum level of a node of this group that the tool will
1120 be able to dig.
1121
1122 #### Digging times
1123 List of digging times for different ratings of the group, for nodes of the
1124 maximum level.
1125
1126 For example, as a Lua table, `times={2=2.00, 3=0.70}`. This would
1127 result in the tool to be able to dig nodes that have a rating of `2` or `3`
1128 for this group, and unable to dig the rating `1`, which is the toughest.
1129 Unless there is a matching group that enables digging otherwise.
1130
1131 #### Damage groups
1132 List of damage for groups of entities. See "Entity damage mechanism".
1133
1134 #### Example definition of the capabilities of a tool
1135
1136     tool_capabilities = {
1137         full_punch_interval=1.5,
1138         max_drop_level=1,
1139         groupcaps={
1140             crumbly={maxlevel=2, uses=20, times={[1]=1.60, [2]=1.20, [3]=0.80}}
1141         }
1142         damage_groups = {fleshy=2},
1143     }
1144
1145 This makes the tool be able to dig nodes that fulfil both of these:
1146
1147 * Have the `crumbly` group
1148 * Have a `level` group less or equal to `2`
1149
1150 Table of resulting digging times:
1151
1152     crumbly        0     1     2     3     4  <- level
1153          ->  0     -     -     -     -     -
1154              1  0.80  1.60  1.60     -     -
1155              2  0.60  1.20  1.20     -     -
1156              3  0.40  0.80  0.80     -     -
1157
1158     level diff:    2     1     0    -1    -2
1159
1160 Table of resulting tool uses:
1161
1162     ->  0     -     -     -     -     -
1163         1   180    60    20     -     -
1164         2   180    60    20     -     -
1165         3   180    60    20     -     -
1166
1167 **Notes**:
1168
1169 * At `crumbly==0`, the node is not diggable.
1170 * At `crumbly==3`, the level difference digging time divider kicks in and makes
1171   easy nodes to be quickly breakable.
1172 * At `level > 2`, the node is not diggable, because it's `level > maxlevel`
1173
1174 Entity damage mechanism
1175 -----------------------
1176 Damage calculation:
1177
1178     damage = 0
1179     foreach group in cap.damage_groups:
1180         damage += cap.damage_groups[group] * limit(actual_interval / cap.full_punch_interval, 0.0, 1.0)
1181             * (object.armor_groups[group] / 100.0)
1182             -- Where object.armor_groups[group] is 0 for inexistent values
1183     return damage
1184
1185 Client predicts damage based on damage groups. Because of this, it is able to
1186 give an immediate response when an entity is damaged or dies; the response is
1187 pre-defined somehow (e.g. by defining a sprite animation) (not implemented;
1188 TODO).
1189 Currently a smoke puff will appear when an entity dies.
1190
1191 The group `immortal` completely disables normal damage.
1192
1193 Entities can define a special armor group, which is `punch_operable`. This
1194 group disables the regular damage mechanism for players punching it by hand or
1195 a non-tool item, so that it can do something else than take damage.
1196
1197 On the Lua side, every punch calls:
1198
1199     entity:on_punch(puncher, time_from_last_punch, tool_capabilities, direction)
1200
1201 This should never be called directly, because damage is usually not handled by the entity
1202 itself.
1203
1204 * `puncher` is the object performing the punch. Can be `nil`. Should never be
1205   accessed unless absolutely required, to encourage interoperability.
1206 * `time_from_last_punch` is time from last punch (by `puncher`) or `nil`.
1207 * `tool_capabilities` can be `nil`.
1208 * `direction` is a unit vector, pointing from the source of the punch to
1209    the punched object.
1210
1211 To punch an entity/object in Lua, call:
1212
1213     object:punch(puncher, time_from_last_punch, tool_capabilities, direction)
1214
1215 * Return value is tool wear.
1216 * Parameters are equal to the above callback.
1217 * If `direction` equals `nil` and `puncher` does not equal `nil`,
1218   `direction` will be automatically filled in based on the location of `puncher`.
1219
1220 Node Metadata
1221 -------------
1222 The instance of a node in the world normally only contains the three values
1223 mentioned in "Nodes". However, it is possible to insert extra data into a
1224 node. It is called "node metadata"; See "`NodeMetaRef`".
1225
1226 Metadata contains two things:
1227 * A key-value store
1228 * An inventory
1229
1230 Some of the values in the key-value store are handled specially:
1231 * `formspec`: Defines a right-click inventory menu. See "Formspec".
1232 * `infotext`: Text shown on the screen when the node is pointed at
1233
1234 Example stuff:
1235
1236     local meta = minetest.get_meta(pos)
1237     meta:set_string("formspec",
1238             "size[8,9]"..
1239             "list[context;main;0,0;8,4;]"..
1240             "list[current_player;main;0,5;8,4;]")
1241     meta:set_string("infotext", "Chest");
1242     local inv = meta:get_inventory()
1243     inv:set_size("main", 8*4)
1244     print(dump(meta:to_table()))
1245     meta:from_table({
1246         inventory = {
1247             main = {[1] = "default:dirt", [2] = "", [3] = "", [4] = "", [5] = "", [6] = "",
1248                     [7] = "", [8] = "", [9] = "", [10] = "", [11] = "", [12] = "", [13] = "",
1249                     [14] = "default:cobble", [15] = "", [16] = "", [17] = "", [18] = "",
1250                     [19] = "", [20] = "default:cobble", [21] = "", [22] = "", [23] = "",
1251                     [24] = "", [25] = "", [26] = "", [27] = "", [28] = "", [29] = "", [30] = "",
1252                     [31] = "", [32] = ""}
1253         },
1254         fields = {
1255             formspec = "size[8,9]list[context;main;0,0;8,4;]list[current_player;main;0,5;8,4;]",
1256             infotext = "Chest"
1257         }
1258     })
1259
1260 Formspec
1261 --------
1262 Formspec defines a menu. Currently not much else than inventories are
1263 supported. It is a string, with a somewhat strange format.
1264
1265 Spaces and newlines can be inserted between the blocks, as is used in the
1266 examples.
1267
1268 ### Examples
1269
1270 #### Chest
1271
1272     size[8,9]
1273     list[context;main;0,0;8,4;]
1274     list[current_player;main;0,5;8,4;]
1275
1276 #### Furnace
1277
1278     size[8,9]
1279     list[context;fuel;2,3;1,1;]
1280     list[context;src;2,1;1,1;]
1281     list[context;dst;5,1;2,2;]
1282     list[current_player;main;0,5;8,4;]
1283
1284 #### Minecraft-like player inventory
1285
1286     size[8,7.5]
1287     image[1,0.6;1,2;player.png]
1288     list[current_player;main;0,3.5;8,4;]
1289     list[current_player;craft;3,0;3,3;]
1290     list[current_player;craftpreview;7,1;1,1;]
1291
1292 ### Elements
1293
1294 #### `size[<W>,<H>,<fixed_size>]`
1295 * Define the size of the menu in inventory slots
1296 * `fixed_size`: `true`/`false` (optional)
1297 * deprecated: `invsize[<W>,<H>;]`
1298
1299 #### `list[<inventory location>;<list name>;<X>,<Y>;<W>,<H>;]`
1300 * Show an inventory list
1301
1302 #### `list[<inventory location>;<list name>;<X>,<Y>;<W>,<H>;<starting item index>]`
1303 * Show an inventory list
1304
1305 #### `listcolors[<slot_bg_normal>;<slot_bg_hover>]`
1306 * Sets background color of slots as `ColorString`
1307 * Sets background color of slots on mouse hovering
1308
1309 #### `listcolors[<slot_bg_normal>;<slot_bg_hover>;<slot_border>]`
1310 * Sets background color of slots as `ColorString`
1311 * Sets background color of slots on mouse hovering
1312 * Sets color of slots border
1313
1314 #### `listcolors[<slot_bg_normal>;<slot_bg_hover>;<slot_border>;<tooltip_bgcolor>;<tooltip_fontcolor>]`
1315 * Sets background color of slots as `ColorString`
1316 * Sets background color of slots on mouse hovering
1317 * Sets color of slots border
1318 * Sets default background color of tooltips
1319 * Sets default font color of tooltips
1320
1321 #### `tooltip[<gui_element_name>;<tooltip_text>;<bgcolor>,<fontcolor>]`
1322 * Adds tooltip for an element
1323 * `<bgcolor>` tooltip background color as `ColorString` (optional)
1324 * `<fontcolor>` tooltip font color as `ColorString` (optional)
1325
1326 #### `image[<X>,<Y>;<W>,<H>;<texture name>]`
1327 * Show an image
1328 * Position and size units are inventory slots
1329
1330 #### `item_image[<X>,<Y>;<W>,<H>;<item name>]`
1331 * Show an inventory image of registered item/node
1332 * Position and size units are inventory slots
1333
1334 #### `bgcolor[<color>;<fullscreen>]`
1335 * Sets background color of formspec as `ColorString`
1336 * If `true`, the background color is drawn fullscreen (does not effect the size of the formspec)
1337
1338 #### `background[<X>,<Y>;<W>,<H>;<texture name>]`
1339 * Use a background. Inventory rectangles are not drawn then.
1340 * Position and size units are inventory slots
1341 * Example for formspec 8x4 in 16x resolution: image shall be sized
1342   8 times 16px  times  4 times 16px.
1343
1344 #### `background[<X>,<Y>;<W>,<H>;<texture name>;<auto_clip>]`
1345 * Use a background. Inventory rectangles are not drawn then.
1346 * Position and size units are inventory slots
1347 * Example for formspec 8x4 in 16x resolution:
1348   image shall be sized 8 times 16px  times  4 times 16px
1349 * If `true` the background is clipped to formspec size
1350   (`x` and `y` are used as offset values, `w` and `h` are ignored)
1351
1352 #### `pwdfield[<X>,<Y>;<W>,<H>;<name>;<label>]`
1353 * Textual password style field; will be sent to server when a button is clicked
1354 * `x` and `y` position the field relative to the top left of the menu
1355 * `w` and `h` are the size of the field
1356 * fields are a set height, but will be vertically centred on `h`
1357 * Position and size units are inventory slots
1358 * `name` is the name of the field as returned in fields to `on_receive_fields`
1359 * `label`, if not blank, will be text printed on the top left above the field
1360
1361 #### `field[<X>,<Y>;<W>,<H>;<name>;<label>;<default>]`
1362 * Textual field; will be sent to server when a button is clicked
1363 * `x` and `y` position the field relative to the top left of the menu
1364 * `w` and `h` are the size of the field
1365 * fields are a set height, but will be vertically centred on `h`
1366 * Position and size units are inventory slots
1367 * `name` is the name of the field as returned in fields to `on_receive_fields`
1368 * `label`, if not blank, will be text printed on the top left above the field
1369 * `default` is the default value of the field
1370     * `default` may contain variable references such as `${text}'` which
1371       will fill the value from the metadata value `text`
1372     * **Note**: no extra text or more than a single variable is supported ATM.
1373
1374 #### `field[<name>;<label>;<default>]`
1375 * as above, but without position/size units
1376 * special field for creating simple forms, such as sign text input
1377 * must be used without a `size[]` element
1378 * a "Proceed" button will be added automatically
1379
1380 #### `textarea[<X>,<Y>;<W>,<H>;<name>;<label>;<default>]`
1381 * same as fields above, but with multi-line input
1382
1383 #### `label[<X>,<Y>;<label>]`
1384 * `x` and `y` work as per field
1385 * `label` is the text on the label
1386 * Position and size units are inventory slots
1387
1388 #### `vertlabel[<X>,<Y>;<label>]`
1389 * Textual label drawn vertically
1390 * `x` and `y` work as per field
1391 * `label` is the text on the label
1392 * Position and size units are inventory slots
1393
1394 #### `button[<X>,<Y>;<W>,<H>;<name>;<label>]`
1395 * Clickable button. When clicked, fields will be sent.
1396 * `x`, `y` and `name` work as per field
1397 * `w` and `h` are the size of the button
1398 * `label` is the text on the button
1399 * Position and size units are inventory slots
1400
1401 #### `image_button[<X>,<Y>;<W>,<H>;<texture name>;<name>;<label>]`
1402 * `x`, `y`, `w`, `h`, and `name` work as per button
1403 * `texture name` is the filename of an image
1404 * Position and size units are inventory slots
1405
1406 #### `image_button[<X>,<Y>;<W>,<H>;<texture name>;<name>;<label>;<noclip>;<drawborder>;<pressed texture name>]`
1407 * `x`, `y`, `w`, `h`, and `name` work as per button
1408 * `texture name` is the filename of an image
1409 * Position and size units are inventory slots
1410 * `noclip=true` means the image button doesn't need to be within specified formsize
1411 * `drawborder`: draw button border or not
1412 * `pressed texture name` is the filename of an image on pressed state
1413
1414 #### `item_image_button[<X>,<Y>;<W>,<H>;<item name>;<name>;<label>]`
1415 * `x`, `y`, `w`, `h`, `name` and `label` work as per button
1416 * `item name` is the registered name of an item/node,
1417    tooltip will be made out of its description
1418    to override it use tooltip element
1419 * Position and size units are inventory slots
1420
1421 #### `button_exit[<X>,<Y>;<W>,<H>;<name>;<label>]`
1422 * When clicked, fields will be sent and the form will quit.
1423
1424 #### `image_button_exit[<X>,<Y>;<W>,<H>;<texture name>;<name>;<label>]`
1425 * When clicked, fields will be sent and the form will quit.
1426
1427 #### `textlist[<X>,<Y>;<W>,<H>;<name>;<listelem 1>,<listelem 2>,...,<listelem n>]`
1428 * Scrollable item list showing arbitrary text elements
1429 * `x` and `y` position the itemlist relative to the top left of the menu
1430 * `w` and `h` are the size of the itemlist
1431 * `name` fieldname sent to server on doubleclick value is current selected element
1432 * `listelements` can be prepended by #color in hexadecimal format RRGGBB (only),
1433      * if you want a listelement to start with "#" write "##".
1434
1435 #### `textlist[<X>,<Y>;<W>,<H>;<name>;<listelem 1>,<listelem 2>,...,<listelem n>;<selected idx>;<transparent>]`
1436 * Scrollable itemlist showing arbitrary text elements
1437 * `x` and `y` position the item list relative to the top left of the menu
1438 * `w` and `h` are the size of the item list
1439 * `name` fieldname sent to server on doubleclick value is current selected element
1440 * `listelements` can be prepended by #RRGGBB (only) in hexadecimal format
1441      * if you want a listelement to start with "#" write "##"
1442 * index to be selected within textlist
1443 * `true`/`false`: draw transparent background
1444 * see also `minetest.explode_textlist_event` (main menu: `engine.explode_textlist_event`)
1445
1446 #### `tabheader[<X>,<Y>;<name>;<caption 1>,<caption 2>,...,<caption n>;<current_tab>;<transparent>;<draw_border>]`
1447 * show a tab**header** at specific position (ignores formsize)
1448 * `x` and `y` position the itemlist relative to the top left of the menu
1449 * `name` fieldname data is transferred to Lua
1450 * `caption 1`...: name shown on top of tab
1451 * `current_tab`: index of selected tab 1...
1452 * `transparent` (optional): show transparent
1453 * `draw_border` (optional): draw border
1454
1455 #### `box[<X>,<Y>;<W>,<H>;<color>]`
1456 * simple colored semitransparent box
1457 * `x` and `y` position the box relative to the top left of the menu
1458 * `w` and `h` are the size of box
1459 * `color` is color specified as a `ColorString`
1460
1461 #### `dropdown[<X>,<Y>;<W>;<name>;<item 1>,<item 2>, ...,<item n>;<selected idx>]`
1462 * show a dropdown field
1463 * **Important note**: There are two different operation modes:
1464      1. handle directly on change (only changed dropdown is submitted)
1465      2. read the value on pressing a button (all dropdown values are available)
1466 * `x` and `y` position of dropdown
1467 * width of dropdown
1468 * fieldname data is transferred to Lua
1469 * items to be shown in dropdown
1470 * index of currently selected dropdown item
1471
1472 #### `checkbox[<X>,<Y>;<name>;<label>;<selected>;<tooltip>]`
1473 * show a checkbox
1474 * `x` and `y`: position of checkbox
1475 * `name` fieldname data is transferred to Lua
1476 * `label` to be shown left of checkbox
1477 * `selected` (optional): `true`/`false`
1478 * `tooltip` (optional)
1479
1480 #### `scrollbar[<X>,<Y>;<W>,<H>;<orientation>;<name>;<value>]`
1481 * show a scrollbar
1482 * there are two ways to use it:
1483      1. handle the changed event (only changed scrollbar is available)
1484      2. read the value on pressing a button (all scrollbars are available)
1485 * `x` and `y`: position of trackbar
1486 * `w` and `h`: width and height
1487 * `orientation`:  `vertical`/`horizontal`
1488 * fieldname data is transferred to Lua
1489 * value this trackbar is set to (`0`-`1000`)
1490 * see also `minetest.explode_scrollbar_event` (main menu: `engine.explode_scrollbar_event`)
1491
1492 #### `table[<X>,<Y>;<W>,<H>;<name>;<cell 1>,<cell 2>,...,<cell n>;<selected idx>]`
1493 * show scrollable table using options defined by the previous `tableoptions[]`
1494 * displays cells as defined by the previous `tablecolumns[]`
1495 * `x` and `y`: position the itemlist relative to the top left of the menu
1496 * `w` and `h` are the size of the itemlist
1497 * `name`: fieldname sent to server on row select or doubleclick
1498 * `cell 1`...`cell n`: cell contents given in row-major order
1499 * `selected idx`: index of row to be selected within table (first row = `1`)
1500 * see also `minetest.explode_table_event` (main menu: `engine.explode_table_event`)
1501
1502 #### `tableoptions[<opt 1>;<opt 2>;...]`
1503 * sets options for `table[]`
1504 * `color=#RRGGBB`
1505      * default text color (`ColorString`), defaults to `#FFFFFF`
1506 * `background=#RRGGBB`
1507      * table background color (`ColorString`), defaults to `#000000`
1508 * `border=<true/false>`
1509      * should the table be drawn with a border? (default: `true`)
1510 * `highlight=#RRGGBB`
1511      * highlight background color (`ColorString`), defaults to `#466432`
1512 * `highlight_text=#RRGGBB`
1513      * highlight text color (`ColorString`), defaults to `#FFFFFF`
1514 * `opendepth=<value>`
1515      * all subtrees up to `depth < value` are open (default value = `0`)
1516      * only useful when there is a column of type "tree"
1517
1518 #### `tablecolumns[<type 1>,<opt 1a>,<opt 1b>,...;<type 2>,<opt 2a>,<opt 2b>;...]`
1519 * sets columns for `table[]`
1520 * types: `text`, `image`, `color`, `indent`, `tree`
1521     * `text`:   show cell contents as text
1522     * `image`:  cell contents are an image index, use column options to define images
1523     * `colo`:   cell contents are a ColorString and define color of following cell
1524     * `indent`: cell contents are a number and define indentation of following cell
1525     * `tree`:   same as indent, but user can open and close subtrees (treeview-like)
1526 * column options:
1527     * `align=<value>`
1528         * for `text` and `image`: content alignment within cells.
1529           Available values: `left` (default), `center`, `right`, `inline`
1530     * `width=<value>`
1531         * for `text` and `image`: minimum width in em (default: `0`)
1532         * for `indent` and `tree`: indent width in em (default: `1.5`)
1533     * `padding=<value>`: padding left of the column, in em (default `0.5`).
1534       Exception: defaults to 0 for indent columns
1535     * `tooltip=<value>`: tooltip text (default: empty)
1536     * `image` column options:
1537         * `0=<value>` sets image for image index 0
1538         * `1=<value>` sets image for image index 1
1539         * `2=<value>` sets image for image index 2
1540         * and so on; defined indices need not be contiguous empty or
1541           non-numeric cells are treated as `0`.
1542     * `color` column options:
1543         * `span=<value>`: number of following columns to affect (default: infinite)
1544
1545 **Note**: do _not_ use a element name starting with `key_`; those names are reserved to
1546 pass key press events to formspec!
1547
1548 Inventory locations
1549 -------------------
1550 * `"context"`: Selected node metadata (deprecated: `"current_name"`)
1551 * `"current_player"`: Player to whom the menu is shown
1552 * `"player:<name>"`: Any player
1553 * `"nodemeta:<X>,<Y>,<Z>"`: Any node metadata
1554 * `"detached:<name>"`: A detached inventory
1555
1556 `ColorString`
1557 -------------
1558 `#RGB` defines a color in hexadecimal format.
1559
1560 `#RGBA` defines a color in hexadecimal format and alpha channel.
1561
1562 `#RRGGBB` defines a color in hexadecimal format.
1563
1564 `#RRGGBBAA` defines a color in hexadecimal format and alpha channel.
1565
1566 Named colors are also supported and are equivalent to
1567 [CSS Color Module Level 4](http://dev.w3.org/csswg/css-color/#named-colors).
1568 To specify the value of the alpha channel, append `#AA` to the end of the color name
1569 (e.g. `colorname#08`). For named colors the hexadecimal string representing the alpha
1570 value must (always) be two hexadecimal digits.
1571
1572 Vector helpers
1573 --------------
1574
1575 * `vector.new([x[, y, z]])`: returns a vector.
1576     * `x` is a table or the `x` position.
1577
1578 * `vector.direction(p1, p2)`: returns a vector
1579 * `vector.distance(p1, p2)`: returns a number
1580 * `vector.length(v)`: returns a number
1581 * `vector.normalize(v)`: returns a vector
1582 * `vector.round(v)`: returns a vector
1583 * `vector.apply(v, func)`: returns a vector
1584 * `vector.equals(v1, v2)`: returns a boolean
1585
1586 For the following functions `x` can be either a vector or a number:
1587
1588 * `vector.add(v, x)`: returns a vector
1589 * `vector.subtract(v, x)`: returns a vector
1590 * `vector.multiply(v, x)`: returns a vector
1591 * `vector.divide(v, x)`: returns a vector
1592
1593 Helper functions
1594 -----------------
1595 * `dump2(obj, name="_", dumped={})`
1596      * Return object serialized as a string, handles reference loops
1597 * `dump(obj, dumped={})`
1598     * Return object serialized as a string
1599 * `math.hypot(x, y)`
1600     * Get the hypotenuse of a triangle with legs x and y.
1601       Useful for distance calculation.
1602 * `math.sign(x, tolerance)`
1603     * Get the sign of a number.
1604       Optional: Also returns `0` when the absolute value is within the tolerance (default: `0`)
1605 * `string.split(str, separator=",", include_empty=false, max_splits=-1,
1606 * sep_is_pattern=false)`
1607     * If `max_splits` is negative, do not limit splits.
1608     * `sep_is_pattern` specifies if separator is a plain string or a pattern (regex).
1609     * e.g. `string:split("a,b", ",") == {"a","b"}`
1610 * `string:trim()`
1611     * e.g. `string.trim("\n \t\tfoo bar\t ") == "foo bar"`
1612 * `minetest.pos_to_string({x=X,y=Y,z=Z})`: returns `"(X,Y,Z)"`
1613     * Convert position to a printable string
1614 * `minetest.string_to_pos(string)`: returns a position
1615     * Same but in reverse. Returns `nil` if the string can't be parsed to a position.
1616 * `minetest.formspec_escape(string)`: returns a string
1617     * escapes the characters "[", "]", "\", "," and ";", which can not be used in formspecs
1618 * `minetest.is_yes(arg)`
1619     * returns whether `arg` can be interpreted as yes
1620 * `minetest.get_us_time()`
1621     * returns time with microsecond precision
1622 * `table.copy(table)`: returns a table
1623     * returns a deep copy of `table`
1624
1625 `minetest` namespace reference
1626 ------------------------------
1627
1628 ### Utilities
1629
1630 * `minetest.get_current_modname()`: returns a string
1631 * `minetest.get_modpath(modname)`: returns e.g. `"/home/user/.minetest/usermods/modname"`
1632     * Useful for loading additional `.lua` modules or static data from mod
1633 * `minetest.get_modnames()`: returns a list of installed mods
1634     * Return a list of installed mods, sorted alphabetically
1635 * `minetest.get_worldpath()`: returns e.g. `"/home/user/.minetest/world"`
1636     * Useful for storing custom data
1637 * `minetest.is_singleplayer()`
1638 * `minetest.features`
1639     * table containing API feature flags: `{foo=true, bar=true}`
1640 * `minetest.has_feature(arg)`: returns `boolean, missing_features`
1641     * `arg`: string or table in format `{foo=true, bar=true}`
1642     * `missing_features`: `{foo=true, bar=true}`
1643 * `minetest.get_player_information(playername)`
1644     * table containing information about player peer.
1645
1646 Example of `minetest.get_player_information` return value:
1647
1648     {
1649         address = "127.0.0.1",     -- IP address of client
1650         ip_version = 4,            -- IPv4 / IPv6
1651         min_rtt = 0.01,            -- minimum round trip time
1652         max_rtt = 0.2,             -- maximum round trip time
1653         avg_rtt = 0.02,            -- average round trip time
1654         min_jitter = 0.01,         -- minimum packet time jitter
1655         max_jitter = 0.5,          -- maximum packet time jitter
1656         avg_jitter = 0.03,         -- average packet time jitter
1657         connection_uptime = 200,   -- seconds since client connected
1658
1659         -- following information is available on debug build only!!!
1660         -- DO NOT USE IN MODS
1661         --ser_vers = 26,             -- serialization version used by client
1662         --prot_vers = 23,            -- protocol version used by client
1663         --major = 0,                 -- major version number
1664         --minor = 4,                 -- minor version number
1665         --patch = 10,                -- patch version number
1666         --vers_string = "0.4.9-git", -- full version string
1667         --state = "Active"           -- current client state
1668     }
1669
1670 ### Logging
1671 * `minetest.debug(line)`
1672     * Always printed to `stderr` and logfile (`print()` is redirected here)
1673 * `minetest.log(line)`
1674 * `minetest.log(loglevel, line)`
1675     * `loglevel` is one of `"error"`, `"action"`, `"info"`, `"verbose"`
1676
1677 ### Registration functions
1678 Call these functions only at load time!
1679
1680 * `minetest.register_entity(name, prototype table)`
1681 * `minetest.register_abm(abm definition)`
1682 * `minetest.register_node(name, node definition)`
1683 * `minetest.register_tool(name, item definition)`
1684 * `minetest.register_craftitem(name, item definition)`
1685 * `minetest.register_alias(name, convert_to)`
1686 * `minetest.register_craft(recipe)`
1687 * `minetest.register_ore(ore definition)`
1688 * `minetest.register_decoration(decoration definition)`
1689 * `minetest.override_item(name, redefinition)`
1690     * Overrides fields of an item registered with register_node/tool/craftitem.
1691     * Note: Item must already be defined, (opt)depend on the mod defining it.
1692     * Example: `minetest.override_item("default:mese", {light_source=LIGHT_MAX})`
1693
1694 * `minetest.clear_registered_ores()`
1695 * `minetest.clear_registered_decorations()`
1696
1697 ### Global callback registration functions
1698 Call these functions only at load time!
1699
1700 * `minetest.register_globalstep(func(dtime))`
1701     * Called every server step, usually interval of 0.1s
1702 * `minetest.register_on_shutdown(func())`
1703     * Called before server shutdown
1704     * **Warning**: If the server terminates abnormally (i.e. crashes), the registered
1705       callbacks **will likely not be run**. Data should be saved at
1706       semi-frequent intervals as well as on server shutdown.
1707 * `minetest.register_on_placenode(func(pos, newnode, placer, oldnode, itemstack, pointed_thing))`
1708     * Called when a node has been placed
1709     * If return `true` no item is taken from `itemstack`
1710     * **Not recommended**; use `on_construct` or `after_place_node` in node definition
1711       whenever possible
1712 * `minetest.register_on_dignode(func(pos, oldnode, digger))`
1713     * Called when a node has been dug.
1714     * **Not recommended**; Use `on_destruct` or `after_dig_node` in node definition
1715       whenever possible
1716 * `minetest.register_on_punchnode(func(pos, node, puncher, pointed_thing))`
1717      * Called when a node is punched
1718 * `minetest.register_on_generated(func(minp, maxp, blockseed))`
1719      * Called after generating a piece of world. Modifying nodes inside the area
1720        is a bit faster than usually.
1721 * `minetest.register_on_newplayer(func(ObjectRef))`
1722      * Called after a new player has been created
1723 * `minetest.register_on_dieplayer(func(ObjectRef))`
1724      * Called when a player dies
1725 * `minetest.register_on_respawnplayer(func(ObjectRef))`
1726      * Called when player is to be respawned
1727      * Called _before_ repositioning of player occurs
1728      * return true in func to disable regular player placement
1729 * `minetest.register_on_prejoinplayer(func(name, ip))`
1730      * Called before a player joins the game
1731      * If it returns a string, the player is disconnected with that string as reason
1732 * `minetest.register_on_joinplayer(func(ObjectRef))`
1733     * Called when a player joins the game
1734 * `minetest.register_on_leaveplayer(func(ObjectRef))`
1735     * Called when a player leaves the game
1736 * `minetest.register_on_cheat(func(ObjectRef, cheat))`
1737     * Called when a player cheats
1738     * `cheat`: `{type=<cheat_type>}`, where `<cheat_type>` is one of:
1739         * `"moved_too_fast"`
1740         * `"interacted_too_far"`
1741         * `"finished_unknown_dig"`
1742         * `dug_unbreakable`
1743         * `dug_too_fast`
1744 * `minetest.register_on_chat_message(func(name, message))`
1745     * Called always when a player says something
1746 * `minetest.register_on_player_receive_fields(func(player, formname, fields))`
1747     * Called when a button is pressed in player's inventory form
1748     * Newest functions are called first
1749     * If function returns `true`, remaining functions are not called
1750 * `minetest.register_on_craft(func(itemstack, player, old_craft_grid, craft_inv))`
1751     * Called when `player` crafts something
1752     * `itemstack` is the output
1753     * `old_craft_grid` contains the recipe (Note: the one in the inventory is cleared)
1754     * `craft_inv` is the inventory with the crafting grid
1755     * Return either an `ItemStack`, to replace the output, or `nil`, to not modify it
1756 * `minetest.register_craft_predict(func(itemstack, player, old_craft_grid, craft_inv))`
1757     * The same as before, except that it is called before the player crafts, to make
1758    craft prediction, and it should not change anything.
1759 * `minetest.register_on_protection_violation(func(pos, name))`
1760     * Called by `builtin` and mods when a player violates protection at a position
1761       (eg, digs a node or punches a protected entity).
1762       * The registered functions can be called using `minetest.record_protection_violation`
1763       * The provided function should check that the position is protected by the mod
1764         calling this function before it prints a message, if it does, to allow for
1765         multiple protection mods.
1766 * `minetest.register_on_item_eat(func(hp_change, replace_with_item, itemstack, user, pointed_thing))`
1767     * Called when an item is eaten, by `minetest.item_eat`
1768     * Return `true` or `itemstack` to cancel the default item eat response (i.e.: hp increase)
1769
1770 ### Other registration functions
1771 * `minetest.register_chatcommand(cmd, chatcommand definition)`
1772 * `minetest.register_privilege(name, definition)`
1773     * `definition`: `"description text"`
1774     * `definition`: `{ description = "description text", give_to_singleplayer = boolean, -- default: true }`
1775 * `minetest.register_authentication_handler(handler)`
1776     * See `minetest.builtin_auth_handler` in `builtin.lua` for reference
1777
1778 ### Setting-related
1779 * `minetest.setting_set(name, value)`
1780 * `minetest.setting_get(name)`: returns string or `nil`
1781 * `minetest.setting_setbool(name, value)`
1782 * `minetest.setting_getbool(name)`: returns boolean or `nil`
1783 * `minetest.setting_get_pos(name)`: returns position or nil
1784 * `minetest.setting_save()`, returns `nil`, save all settings to config file
1785
1786 ### Authentication
1787 * `minetest.notify_authentication_modified(name)`
1788     * Should be called by the authentication handler if privileges changes.
1789     * To report everybody, set `name=nil`.
1790 * `minetest.get_password_hash(name, raw_password)`
1791     * Convert a name-password pair to a password hash that Minetest can use
1792 * `minetest.string_to_privs(str)`: returns `{priv1=true,...}`
1793 * `minetest.privs_to_string(privs)`: returns `"priv1,priv2,..."`
1794     * Convert between two privilege representations
1795 * `minetest.set_player_password(name, password_hash)`
1796 * `minetest.set_player_privs(name, {priv1=true,...})`
1797 * `minetest.get_player_privs(name) -> {priv1=true,...}`
1798 * `minetest.auth_reload()`
1799 * `minetest.check_player_privs(name, {priv1=true,...})`: returns `bool, missing_privs`
1800     * A quickhand for checking privileges
1801 * `minetest.get_player_ip(name)`: returns an IP address string
1802
1803 `minetest.set_player_password`, `minetest_set_player_privs`, `minetest_get_player_privs`
1804 and `minetest.auth_reload` call the authetification handler.
1805
1806 ### Chat
1807 * `minetest.chat_send_all(text)`
1808 * `minetest.chat_send_player(name, text)`
1809
1810 ### Environment access
1811 * `minetest.set_node(pos, node)`
1812 * `minetest.add_node(pos, node): alias set_node(pos, node)`
1813     * Set node at position (`node = {name="foo", param1=0, param2=0}`)
1814 * `minetest.swap_node(pos, node`
1815     * Set node at position, but don't remove metadata
1816 * `minetest.remove_node(pos)`
1817     * Equivalent to `set_node(pos, "air")`
1818 * `minetest.get_node(pos)`
1819     * Returns `{name="ignore", ...}` for unloaded area
1820 * `minetest.get_node_or_nil(pos)`
1821     * Returns `nil` for unloaded area
1822 * `minetest.get_node_light(pos, timeofday)` returns a number between `0` and `15` or `nil`
1823     * `timeofday`: `nil` for current time, `0` for night, `0.5` for day
1824
1825 * `minetest.place_node(pos, node)`
1826     * Place node with the same effects that a player would cause
1827 * `minetest.dig_node(pos)`
1828     * Dig node with the same effects that a player would cause
1829     * Returns `true` if successful, `false` on failure (e.g. protected location)
1830 * `minetest.punch_node(pos)`
1831     * Punch node with the same effects that a player would cause
1832
1833 * `minetest.get_meta(pos)`
1834     * Get a `NodeMetaRef` at that position
1835 * `minetest.get_node_timer(pos)`
1836     * Get `NodeTimerRef`
1837
1838 * `minetest.add_entity(pos, name)`: Spawn Lua-defined entity at position
1839     * Returns `ObjectRef`, or `nil` if failed
1840 * `minetest.add_item(pos, item)`: Spawn item
1841     * Returns `ObjectRef`, or `nil` if failed
1842 * `minetest.get_player_by_name(name)`: Get an `ObjectRef` to a player
1843 * `minetest.get_objects_inside_radius(pos, radius)`
1844 * `minetest.set_timeofday(val)`
1845     * `val` is between `0` and `1`; `0` for midnight, `0.5` for midday
1846 * `minetest.get_timeofday()`
1847 * `minetest.get_gametime()`: returns the time, in seconds, since the world was created
1848 * `minetest.find_node_near(pos, radius, nodenames)`: returns pos or `nil`
1849     * `nodenames`: e.g. `{"ignore", "group:tree"}` or `"default:dirt"`
1850 * `minetest.find_nodes_in_area(minp, maxp, nodenames)`: returns a list of positions
1851     * `nodenames`: e.g. `{"ignore", "group:tree"}` or `"default:dirt"`
1852 * `minetest.get_perlin(noiseparams)`
1853 * `minetest.get_perlin(seeddiff, octaves, persistence, scale)`
1854     * Return world-specific perlin noise (`int(worldseed)+seeddiff`)
1855 * `minetest.get_voxel_manip([pos1, pos2])`
1856     * Return voxel manipulator object.
1857     * Loads the manipulator from the map if positions are passed.
1858 * `minetest.set_gen_notify(flags, {deco_ids})`
1859     * Set the types of on-generate notifications that should be collected
1860     * `flags` is a flag field with the available flags: `dungeon`, `temple`, `cave_begin`,
1861    `cave_end`, `large_cave_begin`, `large_cave_end`, `decoration`
1862    * The second parameter is a list of IDS of decorations which notification is requested for
1863 * `minetest.get_mapgen_object(objectname)`
1864     * Return requested mapgen object if available (see "Mapgen objects")
1865 * `minetest.get_mapgen_params()` Returns mapgen parameters, a table containing
1866   `mgname`, `seed`, `chunksize`, `water_level`, and `flags`.
1867 * `minetest.set_mapgen_params(MapgenParams)`
1868     * Set map generation parameters
1869     * Function cannot be called after the registration period; only initialization and `on_mapgen_init`
1870     * Takes a table as an argument with the fields `mgname`, `seed`, `water_level`, and `flags`.
1871         * Leave field unset to leave that parameter unchanged
1872         * `flags` contains a comma-delimited string of flags to set,
1873           or if the prefix `"no"` is attached, clears instead.
1874         * `flags` is in the same format and has the same options as `mg_flags` in `minetest.conf`
1875 * `minetest.set_noiseparams(name, noiseparams, set_default)`
1876     * Sets the noiseparams setting of `name` to the noiseparams table specified in `noiseparams`.
1877     * `set_default` is an optional boolean (default: `true`) that specifies whether the setting
1878       should be applied to the default config or current active config
1879 * `minetest.generate_ores(vm)`
1880    * Generate all registered ores within the VoxelManip specified by `vm`.
1881 * `minetest.generate_decorations(vm)`
1882    * Generate all registered decorations within the VoxelManip specified by `vm`.
1883 * `minetest.clear_objects()`
1884     * clear all objects in the environments
1885 * `minetest.delete_area(pos1, pos2)`
1886     * delete all mapblocks in the area from pos1 to pos2, inclusive
1887 * `minetest.line_of_sight(pos1, pos2, stepsize)`: returns `boolean, pos`
1888     * Check if there is a direct line of sight between `pos1` and `pos2`
1889     * Returns the position of the blocking node when `false`
1890     * `pos1`: First position
1891     * `pos2`: Second position
1892     * `stepsize`: smaller gives more accurate results but requires more computing
1893       time. Default is `1`.
1894 * `minetest.find_path(pos1,pos2,searchdistance,max_jump,max_drop,algorithm)`
1895     * returns table containing path
1896     * returns a table of 3D points representing a path from `pos1` to `pos2` or `nil`
1897     * `pos1`: start position
1898     * `pos2`: end position
1899     * `searchdistance`: number of blocks to search in each direction
1900     * `max_jump`: maximum height difference to consider walkable
1901     * `max_drop`: maximum height difference to consider droppable
1902     * `algorithm`: One of `"A*_noprefetch"` (default), `"A*"`, `"Dijkstra"`
1903 * `minetest.spawn_tree (pos, {treedef})`
1904     * spawns L-System tree at given `pos` with definition in `treedef` table
1905 * `minetest.transforming_liquid_add(pos)`
1906     * add node to liquid update queue
1907 * `minetest.get_node_max_level(pos)`
1908     * get max available level for leveled node
1909 * `minetest.get_node_level(pos)`
1910     * get level of leveled node (water, snow)
1911 * `minetest.set_node_level(pos, level)`
1912     * set level of leveled node, default `level` equals `1`
1913     * if `totallevel > maxlevel`, returns rest (`total-max`).
1914 * `minetest.add_node_level(pos, level)`
1915     * increase level of leveled node by level, default `level` equals `1`
1916     * if `totallevel > maxlevel`, returns rest (`total-max`)
1917     * can be negative for decreasing
1918
1919 ### Inventory
1920 `minetest.get_inventory(location)`: returns an `InvRef`
1921
1922 * `location` = e.g.
1923     * `{type="player", name="celeron55"}`
1924     * `{type="node", pos={x=, y=, z=}}`
1925     * `{type="detached", name="creative"}`
1926 * `minetest.create_detached_inventory(name, callbacks)`: returns an `InvRef`
1927     * callbacks: See "Detached inventory callbacks"
1928     * Creates a detached inventory. If it already exists, it is cleared.
1929 * `minetest.do_item_eat(hp_change, replace_with_item, itemstack, user, pointed_thing)`: returns left over ItemStack
1930     * See `minetest.item_eat` and `minetest.register_on_item_eat`
1931
1932 ### Formspec
1933 * `minetest.show_formspec(playername, formname, formspec)`
1934     * `playername`: name of player to show formspec
1935     * `formname`: name passed to `on_player_receive_fields` callbacks.
1936       It should follow the `"modname:<whatever>"` naming convention
1937     * `formspec`: formspec to display
1938 * `minetest.formspec_escape(string)`: returns a string
1939     * escapes the characters "[", "]", "\", "," and ";", which can not be used in formspecs
1940 * `minetest.explode_table_event(string)`: returns a table
1941     * returns e.g. `{type="CHG", row=1, column=2}`
1942     * `type` is one of:
1943         * `"INV"`: no row selected)
1944         * `"CHG"`: selected)
1945         * `"DCL"`: double-click
1946 * `minetest.explode_textlist_event(string)`: returns a table
1947     * returns e.g. `{type="CHG", index=1}`
1948     * `type` is one of:
1949         * `"INV"`: no row selected)
1950         * `"CHG"`: selected)
1951         * `"DCL"`: double-click
1952 * `minetest.explode_scrollbar_event(string)`: returns a table
1953     * returns e.g. `{type="CHG", value=500}`
1954     * `type` is one of:
1955         * `"INV"`: something failed
1956         * `"CHG"`: has been changed
1957         * `"VAL"`: not changed
1958
1959 ### Item handling
1960 * `minetest.inventorycube(img1, img2, img3)`
1961     * Returns a string for making an image of a cube (useful as an item image)
1962 * `minetest.get_pointed_thing_position(pointed_thing, above)`
1963     * Get position of a `pointed_thing` (that you can get from somewhere)
1964 * `minetest.dir_to_facedir(dir, is6d)`
1965     * Convert a vector to a facedir value, used in `param2` for `paramtype2="facedir"`;
1966     * passing something non-`nil`/`false` for the optional second parameter causes it to
1967       take the y component into account
1968 * `minetest.facedir_to_dir(facedir)`
1969     * Convert a facedir back into a vector aimed directly out the "back" of a node
1970 * `minetest.dir_to_wallmounted(dir)`
1971     * Convert a vector to a wallmounted value, used for `paramtype2="wallmounted"`
1972 * `minetest.get_node_drops(nodename, toolname)`
1973     * Returns list of item names.
1974     * **Note**: This will be removed or modified in a future version.
1975 * `minetest.get_craft_result(input)`: returns `output, decremented_input`
1976     * `input.method` = `"normal"` or `"cooking"` or `"fuel"`
1977     * `input.width` = for example `3`
1978     * `input.items` = for example
1979       `{ stack1, stack2, stack3, stack4, stack 5, stack 6, stack 7, stack 8, stack 9 }`
1980     * `output.item` = `ItemStack`, if unsuccessful: empty `ItemStack`
1981     * `output.time` = a number, if unsuccessful: `0`
1982     * `decremented_input` = like `input`
1983 * `minetest.get_craft_recipe(output)`: returns input
1984     * returns last registered recipe for output item (node)
1985     * `output` is a node or item type such as `"default:torch"`
1986     * `input.method` = `"normal"` or `"cooking"` or `"fuel"`
1987     * `input.width` = for example `3`
1988     * `input.items` = for example
1989       `{ stack1, stack2, stack3, stack4, stack 5, stack 6, stack 7, stack 8, stack 9 }`
1990       * `input.items` = `nil` if no recipe found
1991 * `minetest.get_all_craft_recipes(query item)`: returns a table or `nil`
1992     * returns indexed table with all registered recipes for query item (node)
1993       or `nil` if no recipe was found
1994     * recipe entry table:
1995             {
1996                 method = 'normal' or 'cooking' or 'fuel'
1997                 width = 0-3, 0 means shapeless recipe
1998                 items = indexed [1-9] table with recipe items
1999                 output = string with item name and quantity
2000             }
2001     * Example query for `"default:gold_ingot"` will return table:
2002             {
2003                 [1]={type = "cooking", width = 3, output = "default:gold_ingot",
2004                 items = {1 = "default:gold_lump"}},
2005                 [2]={type = "normal", width = 1, output = "default:gold_ingot 9",
2006                 items = {1 = "default:goldblock"}}
2007             }
2008 * `minetest.handle_node_drops(pos, drops, digger)`
2009     * `drops`: list of itemstrings
2010     * Handles drops from nodes after digging: Default action is to put them into
2011       digger's inventory
2012     * Can be overridden to get different functionality (e.g. dropping items on
2013       ground)
2014
2015 ### Rollback
2016 * `minetest.rollback_get_node_actions(pos, range, seconds, limit)`:
2017   returns `{{actor, pos, time, oldnode, newnode}, ...}`
2018     * Find who has done something to a node, or near a node
2019     * `actor`: `"player:<name>"`, also `"liquid"`.
2020 * `minetest.rollback_revert_actions_by(actor, seconds)`: returns `boolean, log_messages`
2021     * Revert latest actions of someone
2022     * `actor`: `"player:<name>"`, also `"liquid"`.
2023
2024 ### Defaults for the `on_*` item definition functions
2025 These functions return the leftover itemstack.
2026
2027 * `minetest.item_place_node(itemstack, placer, pointed_thing, param2)`
2028     * Place item as a node
2029     * `param2` overrides `facedir` and wallmounted `param2`
2030     * returns `itemstack, success`
2031 * `minetest.item_place_object(itemstack, placer, pointed_thing)`
2032     * Place item as-is
2033 * `minetest.item_place(itemstack, placer, pointed_thing, param2)`
2034     * Use one of the above based on what the item is.
2035     * Calls `on_rightclick` of `pointed_thing.under` if defined instead
2036     * **Note**: is not called when wielded item overrides `on_place`
2037     * `param2` overrides `facedir` and wallmounted `param2`
2038     * returns `itemstack, success`
2039 * `minetest.item_drop(itemstack, dropper, pos)`
2040     * Drop the item
2041 * `minetest.item_eat(hp_change, replace_with_item)`
2042     * Eat the item.
2043     * `replace_with_item` is the itemstring which is added to the inventory.
2044       If the player is eating a stack, then replace_with_item goes to a
2045       different spot. Can be `nil`
2046     * See `minetest.do_item_eat`
2047
2048 ### Defaults for the `on_punch` and `on_dig` node definition callbacks
2049 * `minetest.node_punch(pos, node, puncher, pointed_thing)`
2050     * Calls functions registered by `minetest.register_on_punchnode()`
2051 * `minetest.node_dig(pos, node, digger)`
2052     * Checks if node can be dug, puts item into inventory, removes node
2053     * Calls functions registered by `minetest.registered_on_dignodes()`
2054
2055 ### Sounds
2056 * `minetest.sound_play(spec, parameters)`: returns a handle
2057     * `spec` is a `SimpleSoundSpec`
2058     * `parameters` is a sound parameter table
2059 * `minetest.sound_stop(handle)`
2060
2061 ### Timing
2062 * `minetest.after(time, func, ...)`
2063     * Call the function `func` after `time` seconds
2064     * Optional: Variable number of arguments that are passed to `func`
2065
2066 ### Server
2067 * `minetest.request_shutdown()`: request for server shutdown
2068 * `minetest.get_server_status()`: returns server status string
2069
2070 ### Bans
2071 * `minetest.get_ban_list()`: returns the ban list (same as `minetest.get_ban_description("")`)
2072 * `minetest.get_ban_description(ip_or_name)`: returns ban description (string)
2073 * `minetest.ban_player(name)`: ban a player
2074 * `minetest.unban_player_or_ip(name)`: unban player or IP address
2075 * `minetest.kick_player(name, [reason])`: disconnect a player with a optional reason
2076
2077 ### Particles
2078 * `minetest.add_particle(particle definition)`
2079     * Deprecated: `minetest.add_particle(pos, velocity, acceleration, expirationtime,
2080       size, collisiondetection, texture, playername)`
2081
2082 * `minetest.add_particlespawner(particlespawner definition)`
2083     * Add a `ParticleSpawner`, an object that spawns an amount of particles over `time` seconds
2084     * Returns an `id`
2085     * `Deprecated: minetest.add_particlespawner(amount, time,
2086       minpos, maxpos,
2087       minvel, maxvel,
2088       minacc, maxacc,
2089       minexptime, maxexptime,
2090       minsize, maxsize,
2091       collisiondetection, texture, playername)`
2092
2093 * `minetest.delete_particlespawner(id, player)``
2094     * Delete `ParticleSpawner` with `id` (return value from `minetest.add_particlespawner`)
2095     * If playername is specified, only deletes on the player's client,
2096     * otherwise on all clients
2097
2098 ### Schematics
2099 * `minetest.create_schematic(p1, p2, probability_list, filename, slice_prob_list)`
2100     * Create a schematic from the volume of map specified by the box formed by p1 and p2.
2101     * Apply the specified probability values to the specified nodes in `probability_list`.
2102         * `probability_list` is an array of tables containing two fields, `pos` and `prob`.
2103             * `pos` is the 3D vector specifying the absolute coordinates of the node being modified,
2104             * `prob` is the integer value from `0` to `255` of the probability (see: Schematic specifier).
2105             * If there are two or more entries with the same pos value, the last entry is used.
2106             * If `pos` is not inside the box formed by `p1` and `p2`, it is ignored.
2107             * If `probability_list` equals `nil`, no probabilities are applied.
2108             * Slice probability works in the same manner, except takes a field called `ypos` instead which
2109               indicates the y position of the slice with a probability applied.
2110             * If slice probability list equals `nil`, no slice probabilities are applied.
2111     * Saves schematic in the Minetest Schematic format to filename.
2112
2113 * `minetest.place_schematic(pos, schematic, rotation, replacements, force_placement)`
2114     * Place the schematic specified by schematic (see: Schematic specifier) at `pos`.
2115     * `rotation` can equal `"0"`, `"90"`, `"180"`, `"270"`, or `"random"`.
2116     * If the `rotation` parameter is omitted, the schematic is not rotated.
2117     * `replacements` = `{["old_name"] = "convert_to", ...}`
2118     * `force_placement` is a boolean indicating whether nodes other than `air` and
2119       `ignore` are replaced by the schematic
2120
2121 ### Misc.
2122 * `minetest.get_connected_players()`: returns list of `ObjectRefs`
2123 * `minetest.hash_node_position({x=,y=,z=})`: returns an 48-bit integer
2124     * Gives a unique hash number for a node position (16+16+16=48bit)
2125 * `minetest.get_position_from_hash(hash)`: returns a position
2126     * Inverse transform of `minetest.hash_node_position`
2127 * `minetest.get_item_group(name, group)`: returns a rating
2128     * Get rating of a group of an item. (`0` means: not in group)
2129 * `minetest.get_node_group(name, group)`: returns a rating
2130     * Deprecated: An alias for the former.
2131 * `minetest.get_content_id(name)`: returns an integer
2132     * Gets the internal content ID of `name`
2133 * `minetest.get_name_from_content_id(content_id)`: returns a string
2134     * Gets the name of the content with that content ID
2135 * `minetest.parse_json(string[, nullvalue])`: returns something
2136     * Convert a string containing JSON data into the Lua equivalent
2137     * `nullvalue`: returned in place of the JSON null; defaults to `nil`
2138     * On success returns a table, a string, a number, a boolean or `nullvalue`
2139     * On failure outputs an error message and returns `nil`
2140     * Example: `parse_json("[10, {\"a\":false}]")`, returns `{10, {a = false}}`
2141 * `minetest.write_json(data[, styled])`: returns a string or `nil` and an error message
2142     * Convert a Lua table into a JSON string
2143     * styled: Outputs in a human-readable format if this is set, defaults to false
2144     * Unserializable things like functions and userdata are saved as null.
2145     * **Warning**: JSON is more strict than the Lua table format.
2146         1. You can only use strings and positive integers of at least one as keys.
2147         2. You can not mix string and integer keys.
2148            This is due to the fact that JSON has two distinct array and object values.
2149     * Example: `write_json({10, {a = false}})`, returns `"[10, {\"a\": false}]"`
2150 * `minetest.serialize(table)`: returns a string
2151     * Convert a table containing tables, strings, numbers, booleans and `nil`s
2152       into string form readable by `minetest.deserialize`
2153     * Example: `serialize({foo='bar'})`, returns `'return { ["foo"] = "bar" }'`
2154 * `minetest.deserialize(string)`: returns a table
2155     * Convert a string returned by `minetest.deserialize` into a table
2156     * `string` is loaded in an empty sandbox environment.
2157     * Will load functions, but they cannot access the global environment.
2158     * Example: `deserialize('return { ["foo"] = "bar" }')`, returns `{foo='bar'}`
2159     * Example: `deserialize('print("foo")')`, returns `nil` (function call fails)
2160         * `error:[string "print("foo")"]:1: attempt to call global 'print' (a nil value)`
2161 * `minetest.compress(data, method, ...)`: returns `compressed_data`
2162     * Compress a string of data.
2163     * `method` is a string identifying the compression method to be used.
2164     * Supported compression methods:
2165     *     Deflate (zlib): `"deflate"`
2166     * `...` indicates method-specific arguments.  Currently defined arguments are:
2167     *     Deflate: `level` - Compression level, `0`-`9` or `nil`.
2168 * `minetest.decompress(compressed_data, method, ...)`: returns data
2169     * Decompress a string of data (using ZLib).
2170     * See documentation on `minetest.compress()` for supported compression methods.
2171     * currently supported.
2172     * `...` indicates method-specific arguments. Currently, no methods use this.
2173 * `minetest.is_protected(pos, name)`: returns boolean
2174     * This function should be overridden by protection mods and should be used to
2175       check if a player can interact at a position.
2176     * This function should call the old version of itself if the position is not
2177       protected by the mod.
2178     * Example:
2179
2180             local old_is_protected = minetest.is_protected
2181             function minetest.is_protected(pos, name)
2182                 if mymod:position_protected_from(pos, name) then
2183                     return true
2184                 end
2185                     return old_is_protected(pos, name)
2186             end
2187 * `minetest.record_protection_violation(pos, name)`
2188      * This function calls functions registered with
2189        `minetest.register_on_protection_violation`.
2190 * `minetest.rotate_and_place(itemstack, placer, pointed_thing, infinitestacks, orient_flags)`
2191     * Attempt to predict the desired orientation of the facedir-capable node
2192       defined by `itemstack`, and place it accordingly (on-wall, on the floor, or
2193       hanging from the ceiling). Stacks are handled normally if the `infinitestacks`
2194       field is false or omitted (else, the itemstack is not changed). `orient_flags`
2195       is an optional table containing extra tweaks to the placement code:
2196         * `invert_wall`:   if `true`, place wall-orientation on the ground and ground-
2197     orientation on the wall.
2198         * `force_wall` :   if `true`, always place the node in wall orientation.
2199         * `force_ceiling`: if `true`, always place on the ceiling.
2200         * `force_floor`:   if `true`, always place the node on the floor.
2201         * `force_facedir`: if `true`, forcefully reset the facedir to north when placing on
2202           the floor or ceiling
2203         * The first four options are mutually-exclusive; the last in the list takes
2204           precedence over the first.
2205
2206
2207
2208 * `minetest.rotate_node(itemstack, placer, pointed_thing)`
2209      * calls `rotate_and_place()` with infinitestacks set according to the state of
2210        the creative mode setting, and checks for "sneak" to set the `invert_wall`
2211        parameter.
2212
2213 * `minetest.forceload_block(pos)`
2214     * forceloads the position `pos`.
2215     * returns `true` if area could be forceloaded
2216
2217 * `minetest.forceload_free_block(pos)`
2218     * stops forceloading the position `pos`
2219
2220 Please note that forceloaded areas are saved when the server restarts.
2221
2222 ### Global objects
2223 * `minetest.env`: `EnvRef` of the server environment and world.
2224     * Any function in the minetest namespace can be called using the syntax
2225      `minetest.env:somefunction(somearguments)`
2226      instead of `minetest.somefunction(somearguments)`
2227    * Deprecated, but support is not to be dropped soon
2228
2229 ### Global tables
2230 * `minetest.registered_items`
2231     * Map of registered items, indexed by name
2232 * `minetest.registered_nodes`
2233     * Map of registered node definitions, indexed by name
2234 * `minetest.registered_craftitems`
2235     * Map of registered craft item definitions, indexed by name
2236 * `minetest.registered_tools`
2237     * Map of registered tool definitions, indexed by name
2238 * `minetest.registered_entities`
2239     * Map of registered entity prototypes, indexed by name
2240 * `minetest.object_refs`
2241     * Map of object references, indexed by active object id
2242 * `minetest.luaentities`
2243     * Map of Lua entities, indexed by active object id
2244 * `minetest.registered_ores`
2245     * List of registered ore definitions.
2246 * `minetest.registered_decorations`
2247     * List of registered decoration definitions.
2248
2249 Class reference
2250 ---------------
2251
2252 ### `NodeMetaRef`
2253 Node metadata: reference extra data and functionality stored in a node.
2254 Can be gotten via `minetest.get_meta(pos)`.
2255
2256 #### Methods
2257 * `set_string(name, value)`
2258 * `get_string(name)`
2259 * `set_int(name, value)`
2260 * `get_int(name)`
2261 * `set_float(name, value)`
2262 * `get_float(name)`
2263 * `get_inventory()`: returns `InvRef`
2264 * `to_table()`: returns `nil` or `{fields = {...}, inventory = {list1 = {}, ...}}`
2265 * `from_table(nil or {})`
2266     * See "Node Metadata"
2267
2268 ### `NoteTimerRef`
2269 Node Timers: a high resolution persistent per-node timer.
2270 Can be gotten via `minetest.get_node_timer(pos)`.
2271
2272 #### Methods
2273 * `set(timeout,elapsed)`
2274     * set a timer's state
2275     * `timeout` is in seconds, and supports fractional values (0.1 etc)
2276     * `elapsed` is in seconds, and supports fractional values (0.1 etc)
2277     * will trigger the node's `on_timer` function after `timeout`-elapsed seconds
2278 * `start(timeout)`
2279     * start a timer
2280     * equivalent to `set(timeout,0)`
2281 * `stop()`
2282     * stops the timer
2283 * `get_timeout()`: returns current timeout in seconds
2284     * if `timeout` equals `0`, timer is inactive
2285 * `get_elapsed()`: returns current elapsed time in seconds
2286     * the node's `on_timer` function will be called after `timeout`-elapsed seconds
2287 * `is_started()`: returns boolean state of timer
2288     * returns `true` if timer is started, otherwise `false`
2289
2290 ### `ObjectRef`
2291 Moving things in the game are generally these.
2292
2293 This is basically a reference to a C++ `ServerActiveObject`
2294
2295 #### Methods
2296 * `remove()`: remove object (after returning from Lua)
2297 * `getpos()`: returns `{x=num, y=num, z=num}`
2298 * `setpos(pos)`; `pos`=`{x=num, y=num, z=num}`
2299 * `moveto(pos, continuous=false)`: interpolated move
2300 * `punch(puncher, time_from_last_punch, tool_capabilities, direction)`
2301     * `puncher` = another `ObjectRef`,
2302     * `time_from_last_punch` = time since last punch action of the puncher
2303     * `direction`: can be `nil`
2304 * `right_click(clicker)`; `clicker` is another `ObjectRef`
2305 * `get_hp()`: returns number of hitpoints (2 * number of hearts)
2306 * `set_hp(hp)`: set number of hitpoints (2 * number of hearts)
2307 * `get_inventory()`: returns an `InvRef`
2308 * `get_wield_list()`: returns the name of the inventory list the wielded item is in
2309 * `get_wield_index()`: returns the index of the wielded item
2310 * `get_wielded_item()`: returns an `ItemStack`
2311 * `set_wielded_item(item)`: replaces the wielded item, returns `true` if successful
2312 * `set_armor_groups({group1=rating, group2=rating, ...})`
2313 * `set_animation({x=1,y=1}, frame_speed=15, frame_blend=0)`
2314 * `set_attach(parent, bone, position, rotation)`
2315     * `bone`: string
2316     * `position`: `{x=num, y=num, z=num}` (relative)
2317     * `rotation`: `{x=num, y=num, z=num}`
2318 * `set_detach()`
2319 * `set_bone_position(bone, position, rotation)`
2320     * `bone`: string
2321     * `position`: `{x=num, y=num, z=num}` (relative)
2322     * `rotation`: `{x=num, y=num, z=num}`
2323 * `set_properties(object property table)`
2324
2325 ##### LuaEntitySAO-only (no-op for other objects)
2326 * `setvelocity({x=num, y=num, z=num})`
2327 * `getvelocity()`: returns `{x=num, y=num, z=num}`
2328 * `setacceleration({x=num, y=num, z=num})`
2329 * `getacceleration()`: returns `{x=num, y=num, z=num}`
2330 * `setyaw(radians)`
2331 * `getyaw()`: returns number in radians
2332 * `settexturemod(mod)`
2333 * `setsprite(p={x=0,y=0}, num_frames=1, framelength=0.2,
2334   select_horiz_by_yawpitch=false)`
2335     * Select sprite from spritesheet with optional animation and DM-style
2336       texture selection based on yaw relative to camera
2337 * `get_entity_name()` (**Deprecated**: Will be removed in a future version)
2338 * `get_luaentity()`
2339
2340 ##### Player-only (no-op for other objects)
2341 * `is_player()`: true for players, false for others
2342 * `get_player_name()`: returns `""` if is not a player
2343 * `get_look_dir()`: get camera direction as a unit vector
2344 * `get_look_pitch()`: pitch in radians
2345 * `get_look_yaw()`: yaw in radians (wraps around pretty randomly as of now)
2346 * `set_look_pitch(radians)`: sets look pitch
2347 * `set_look_yaw(radians)`: sets look yaw
2348 * `get_breath()`: returns players breath
2349 * `set_breath(value)`: sets players breath
2350      * values:
2351         * `0`: player is drowning,
2352         * `1`-`10`: remaining number of bubbles
2353         * `11`: bubbles bar is not shown
2354 * `set_inventory_formspec(formspec)`
2355     * Redefine player's inventory form
2356     * Should usually be called in on_joinplayer
2357 * `get_inventory_formspec()`: returns a formspec string
2358 * `get_player_control()`: returns table with player pressed keys
2359     * `{jump=bool,right=bool,left=bool,LMB=bool,RMB=bool,sneak=bool,aux1=bool,down=bool,up=bool}`
2360 * `get_player_control_bits()`: returns integer with bit packed player pressed keys
2361     * bit nr/meaning: 0/up ,1/down ,2/left ,3/right ,4/jump ,5/aux1 ,6/sneak ,7/LMB ,8/RMB
2362 * `set_physics_override(override_table)`
2363     * `override_table` is a table with the following fields:
2364         * `speed`: multiplier to default walking speed value (default: `1`)
2365         * `jump`: multiplier to default jump value (default: `1`)
2366         * `gravity`: multiplier to default gravity value (default: `1`)
2367         * `sneak`: whether player can sneak (default: `true`)
2368         * `sneak_glitch`: whether player can use the sneak glitch (default: `true`)
2369 * `hud_add(hud definition)`: add a HUD element described by HUD def, returns ID number on success
2370 * `hud_remove(id)`: remove the HUD element of the specified id
2371 * `hud_change(id, stat, value)`: change a value of a previously added HUD element
2372     * element `stat` values: `position`, `name`, `scale`, `text`, `number`, `item`, `dir`
2373 * `hud_get(id)`: gets the HUD element definition structure of the specified ID
2374 * `hud_set_flags(flags)`: sets specified HUD flags to `true`/`false`
2375     * `flags`: (is visible) `hotbar`, `healthbar`, `crosshair`, `wielditem`
2376     * pass a table containing a `true`/`false` value of each flag to be set or unset
2377     * if a flag equals `nil`, the flag is not modified
2378 * `hud_get_flags()`: returns a table containing status of hud flags
2379     * returns `{ hotbar=true, healthbar=true, crosshair=true, wielditem=true, breathbar=true }`
2380 * `hud_set_hotbar_itemcount(count)`: sets number of items in builtin hotbar
2381     * `count`: number of items, must be between `1` and `23`
2382 * `hud_set_hotbar_image(texturename)`
2383     * sets background image for hotbar
2384 * `hud_set_hotbar_selected_image(texturename)`
2385     * sets image for selected item of hotbar
2386 * `hud_replace_builtin(name, hud_definition)`
2387     * replace definition of a builtin hud element
2388     * `name`: `"breath"` or `"health"`
2389     * `hud_definition`: definition to replace builtin definition
2390 * `set_sky(bgcolor, type, {texture names})`
2391     * `bgcolor`: `{r=0...255, g=0...255, b=0...255}` or `nil`, defaults to white
2392     * Available types:
2393         * `"regular"`: Uses 0 textures, `bgcolor` ignored
2394         * `"skybox"`: Uses 6 textures, `bgcolor` used
2395         * `"plain"`: Uses 0 textures, `bgcolor` used
2396     * **Note**: currently does not work directly in `on_joinplayer`; use
2397       `minetest.after(0)` in there.
2398 * `override_day_night_ratio(ratio or nil)`
2399     * `0`...`1`: Overrides day-night ratio, controlling sunlight to a specific amount
2400     * `nil`: Disables override, defaulting to sunlight based on day-night cycle
2401 * `set_local_animation({x=0, y=79}, {x=168, y=187}, {x=189, y=198}, {x=200, y=219}, frame_speed=30)`:
2402   set animation for player model in third person view
2403     * stand/idle animation key frames
2404     * walk animation key frames
2405     * dig animation key frames
2406     * walk+dig animation key frames
2407     * animation frame speed
2408 * `set_eye_offset({x=0,y=0,z=0},{x=0,y=0,z=0})`: defines offset value for camera per player
2409     * in first person view
2410     * in third person view (max. values `{x=-10/10,y=-10,15,z=-5/5}`)
2411
2412 ### `InvRef`
2413 An `InvRef` is a reference to an inventory.
2414
2415 #### Methods
2416 * `is_empty(listname)`: return `true` if list is empty
2417 * `get_size(listname)`: get size of a list
2418 * `set_size(listname, size)`: set size of a list
2419     * returns `false` on error (e.g. invalid `listname` or `size`)
2420 * `get_width(listname)`: get width of a list
2421 * `set_width(listname, width)`: set width of list; currently used for crafting
2422 * `get_stack(listname, i)`: get a copy of stack index `i` in list
2423 * `set_stack(listname, i, stack)`: copy `stack` to index `i` in list
2424 * `get_list(listname)`: return full list
2425 * `set_list(listname, list)`: set full list (size will not change)
2426 * `get_lists()`: returns list of inventory lists
2427 * `set_lists(lists)`: sets inventory lists (size will not change)
2428 * `add_item(listname, stack)`: add item somewhere in list, returns leftover `ItemStack`
2429 * `room_for_item(listname, stack):` returns `true` if the stack of items
2430   can be fully added to the list
2431 * `contains_item(listname, stack)`: returns `true` if the stack of items
2432   can be fully taken from the list
2433 * `remove_item(listname, stack)`: take as many items as specified from the list,
2434   returns the items that were actually removed (as an `ItemStack`) -- note that
2435   any item metadata is ignored, so attempting to remove a specific unique
2436   item this way will likely remove the wrong one -- to do that use `set_stack`
2437   with an empty `ItemStack`
2438 * `get_location()`: returns a location compatible to `minetest.get_inventory(location)`
2439     * returns `{type="undefined"}` in case location is not known
2440
2441 ### `ItemStack`
2442 An `ItemStack` is a stack of items.
2443
2444 It can be created via `ItemStack(x)`, where x is an `ItemStack`,
2445 an itemstring, a table or `nil`.
2446
2447 #### Methods
2448 * `is_empty()`: Returns `true` if stack is empty.
2449 * `get_name()`: Returns item name (e.g. `"default:stone"`).
2450 * `set_name(item_name)`: Returns boolean success.
2451   Clears item on failure.
2452 * `get_count()`: Returns number of items on the stack.
2453 * `set_count(count)`
2454 * `get_wear()`: Returns tool wear (`0`-`65535`), `0` for non-tools.
2455 * `set_wear(wear)`: Returns boolean success.
2456   Clears item on failure.
2457 * `get_metadata()`: Returns metadata (a string attached to an item stack).
2458 * `set_metadata(metadata)`: Returns true.
2459 * `clear()`: removes all items from the stack, making it empty.
2460 * `replace(item)`: replace the contents of this stack.
2461     * `item` can also be an itemstring or table.
2462 * `to_string()`: Returns the stack in itemstring form.
2463 * `to_table()`: Returns the stack in Lua table form.
2464 * `get_stack_max()`: Returns the maximum size of the stack (depends on the item).
2465 * `get_free_space()`: Returns `get_stack_max() - get_count()`.
2466 * `is_known()`: Returns `true` if the item name refers to a defined item type.
2467 * `get_definition()`: Returns the item definition table.
2468 * `get_tool_capabilities()`: Returns the digging properties of the item,
2469   or those of the hand if none are defined for this item type
2470 * `add_wear(amount)`: Increases wear by `amount` if the item is a tool.
2471 * `add_item(item)`: Put some item or stack onto this stack.
2472    Returns leftover `ItemStack`.
2473 * `item_fits(item)`: Returns `true` if item or stack can be fully added to
2474   this one.
2475 * `take_item(n=1)`: Take (and remove) up to `n` items from this stack.
2476   Returns taken `ItemStack`.
2477 * `peek_item(n=1)`: copy (don't remove) up to `n` items from this stack.
2478   Returns taken `ItemStack`.
2479
2480 ### `PseudoRandom`
2481 A pseudorandom number generator.
2482
2483 It can be created via `PseudoRandom(seed)`.
2484
2485 #### Methods
2486 * `next()`: return next integer random number [`0`...`32767`]
2487 * `next(min, max)`: return next integer random number [`min`...`max`]
2488     * `((max - min) == 32767) or ((max-min) <= 6553))` must be true
2489       due to the simple implementation making bad distribution otherwise.
2490
2491 ### `PerlinNoise`
2492 A perlin noise generator.
2493 It can be created via `PerlinNoise(seed, octaves, persistence, scale)`
2494 or `PerlinNoise(noiseparams)`.
2495 Alternatively with `minetest.get_perlin(seeddiff, octaves, persistence, scale)`
2496 or `minetest.get_perlin(noiseparams)`.
2497
2498 #### Methods
2499 * `get2d(pos)`: returns 2D noise value at `pos={x=,y=}`
2500 * `get3d(pos)`: returns 3D noise value at `pos={x=,y=,z=}`
2501
2502 ### `PerlinNoiseMap`
2503 A fast, bulk perlin noise generator.
2504
2505 It can be created via `PerlinNoiseMap(noiseparams, size)` or
2506 `minetest.get_perlin_map(noiseparams, size)`.
2507
2508 Format of `size` is `{x=dimx, y=dimy, z=dimz}`.  The `z` conponent is ommitted
2509 for 2D noise, and it must be must be larger than 1 for 3D noise (otherwise
2510 `nil` is returned).
2511
2512 #### Methods
2513 * `get2dMap(pos)`: returns a `<size.x>` times `<size.y>` 2D array of 2D noise
2514   with values starting at `pos={x=,y=}`
2515 * `get3dMap(pos)`: returns a `<size.x>` times `<size.y>` times `<size.z>` 3D array
2516   of 3D noise with values starting at `pos={x=,y=,z=}`
2517 * `get2dMap_flat(pos)`: returns a flat `<size.x * size.y>` element array of 2D noise
2518   with values starting at `pos={x=,y=}`
2519 * `get3dMap_flat(pos)`: Same as `get2dMap_flat`, but 3D noise
2520
2521 ### `VoxelManip`
2522 An interface to the `MapVoxelManipulator` for Lua.
2523
2524 It can be created via `VoxelManip()` or `minetest.get_voxel_manip()`.
2525 The map will be pre-loaded if two positions are passed to either.
2526
2527 #### Methods
2528 * `read_from_map(p1, p2)`:  Reads a chunk of map from the map containing the region formed by `p1` and `p2`.
2529     * returns actual emerged `pmin`, actual emerged `pmax`
2530 * `write_to_map()`: Writes the data loaded from the `VoxelManip` back to the map.
2531     * **important**: data must be set using `VoxelManip:set_data` before calling this
2532 * `get_node_at(pos)`: Returns a `MapNode` table of the node currently loaded in the `VoxelManip` at that position
2533 * `set_node_at(pos, node)`: Sets a specific `MapNode` in the `VoxelManip` at that position
2534 * `get_data()`: Gets the data read into the `VoxelManip` object
2535     * returns raw node data is in the form of an array of node content IDs
2536 * `set_data(data)`: Sets the data contents of the `VoxelManip` object
2537 * `update_map()`: Update map after writing chunk back to map.
2538     * To be used only by `VoxelManip` objects created by the mod itself; not a `VoxelManip` that was
2539       retrieved from `minetest.get_mapgen_object`
2540 * `set_lighting(light, p1, p2)`: Set the lighting within the `VoxelManip` to a uniform value
2541     * `light` is a table, `{day=<0...15>, night=<0...15>}`
2542     * To be used only by a `VoxelManip` object from `minetest.get_mapgen_object`
2543     * (`p1`, `p2`) is the area in which lighting is set; defaults to the whole area if left out
2544 * `get_light_data()`: Gets the light data read into the `VoxelManip` object
2545     * Returns an array (indices 1 to volume) of integers ranging from `0` to `255`
2546     * Each value is the bitwise combination of day and night light values (`0` to `15` each)
2547     * `light = day + (night * 16)`
2548 * `set_light_data(light_data)`: Sets the `param1` (light) contents of each node in the `VoxelManip`
2549     * expects lighting data in the same format that `get_light_data()` returns
2550 * `get_param2_data()`: Gets the raw `param2` data read into the `VoxelManip` object
2551 * `set_param2_data(param2_data)`: Sets the `param2` contents of each node in the `VoxelManip`
2552 * `calc_lighting(p1, p2)`:  Calculate lighting within the `VoxelManip`
2553     * To be used only by a `VoxelManip` object from `minetest.get_mapgen_object`
2554     * (`p1`, `p2`) is the area in which lighting is set; defaults to the whole area if left out
2555 * `update_liquids()`: Update liquid flow
2556 * `was_modified()`: Returns `true` or `false` if the data in the voxel manipulator had been modified since
2557   the last read from map, due to a call to `minetest.set_data()` on the loaded area elsewhere
2558 * `get_emerged_area()`: Returns actual emerged minimum and maximum positions.
2559
2560 ### `VoxelArea`
2561 A helper class for voxel areas.
2562 It can be created via `VoxelArea:new{MinEdge=pmin, MaxEdge=pmax}`.
2563 The coordinates are *inclusive*, like most other things in Minetest.
2564
2565 #### Methods
2566 * `getExtent()`: returns a 3D vector containing the size of the area formed by `MinEdge` and `MaxEdge`
2567 * `getVolume()`: returns the volume of the area formed by `MinEdge` and `MaxEdge`
2568 * `index(x, y, z)`: returns the index of an absolute position in a flat array starting at `1`
2569     * useful for things like `VoxelManip`, raw Schematic specifiers, `PerlinNoiseMap:get2d`/`3dMap`, and so on
2570 * `indexp(p)`: same as above, except takes a vector
2571 * `position(i)`: returns the absolute position vector corresponding to index `i`
2572 * `contains(x, y, z)`: check if (`x`,`y`,`z`) is inside area formed by `MinEdge` and `MaxEdge`
2573 * `containsp(p)`: same as above, except takes a vector
2574 * `containsi(i)`: same as above, except takes an index `i`
2575 * `iter(minx, miny, minz, maxx, maxy, maxz)`: returns an iterator that returns indices
2576     * from (`minx`,`miny`,`minz`) to (`maxx`,`maxy`,`maxz`) in the order of `[z [y [x]]]`
2577 * `iterp(minp, maxp)`: same as above, except takes a vector
2578
2579 ### `Settings`
2580 An interface to read config files in the format of `minetest.conf`.
2581
2582 It can be created via `Settings(filename)`.
2583
2584 #### Methods
2585 * `get(key)`: returns a value
2586 * `get_bool(key)`: returns a boolean
2587 * `set(key, value)`
2588 * `remove(key)`: returns a boolean (`true` for success)
2589 * `get_names()`: returns `{key1,...}`
2590 * `write()`: returns a boolean (`true` for success)
2591     * write changes to file
2592 * `to_table()`: returns `{[key1]=value1,...}`
2593
2594 Mapgen objects
2595 --------------
2596 A mapgen object is a construct used in map generation. Mapgen objects can be used by an `on_generate`
2597 callback to speed up operations by avoiding unnecessary recalculations; these can be retrieved using the
2598 `minetest.get_mapgen_object()` function. If the requested Mapgen object is unavailable, or
2599 `get_mapgen_object()` was called outside of an `on_generate()` callback, `nil` is returned.
2600
2601 The following Mapgen objects are currently available:
2602
2603 ### `voxelmanip`
2604 This returns three values; the `VoxelManip` object to be used, minimum and maximum emerged position, in that
2605 order. All mapgens support this object.
2606
2607 ### `heightmap`
2608 Returns an array containing the y coordinates of the ground levels of nodes in the most recently
2609 generated chunk by the current mapgen.
2610
2611 ### `biomemap`
2612 Returns an array containing the biome IDs of nodes in the most recently generated chunk by the
2613 current mapgen.
2614
2615 ### `heatmap`
2616 Returns an array containing the temperature values of nodes in the most recently generated chunk by
2617 the current mapgen.
2618
2619 ### `humiditymap`
2620 Returns an array containing the humidity values of nodes in the most recently generated chunk by the
2621 current mapgen.
2622
2623 ### `gennotify`
2624 Returns a table mapping requested generation notification types to arrays of positions at which the
2625 corresponding generated structures are located at within the current chunk. To set the capture of positions
2626 of interest to be recorded on generate, use `minetest.set_gen_notify()`.
2627
2628 Possible fields of the table returned are:
2629
2630 * `dungeon`
2631 * `temple`
2632 * `cave_begin`
2633 * `cave_end`
2634 * `large_cave_begin`
2635 * `large_cave_end`
2636 * `decoration`
2637
2638 Decorations have a key in the format of `"decoration#id"`, where `id` is the numeric unique decoration ID.
2639
2640 Registered entities
2641 -------------------
2642 * Functions receive a "luaentity" as `self`:
2643     * It has the member `.name`, which is the registered name `("mod:thing")`
2644     * It has the member `.object`, which is an `ObjectRef` pointing to the object
2645     * The original prototype stuff is visible directly via a metatable
2646 * Callbacks:
2647     * `on_activate(self, staticdata)`
2648         * Called when the object is instantiated.
2649     * `on_step(self, dtime)`
2650         * Called on every server tick, after movement and collision processing.
2651           `dtime` is usually 0.1 seconds, as per the `dedicated_server_step` setting
2652           `in minetest.conf`.
2653     * `on_punch(self, puncher, time_from_last_punch, tool_capabilities, dir`
2654         * Called when somebody punches the object.
2655         * Note that you probably want to handle most punches using the
2656           automatic armor group system.
2657           * `puncher`: an `ObjectRef` (can be `nil`)
2658           * `time_from_last_punch`: Meant for disallowing spamming of clicks (can be `nil`)
2659           * `tool_capabilities`: capability table of used tool (can be `nil`)
2660           * `dir`: unit vector of direction of punch. Always defined. Points from
2661             the puncher to the punched.
2662     * `on_rightclick(self, clicker)`
2663     * `get_staticdata(self)`
2664         * Should return a string that will be passed to `on_activate` when
2665           the object is instantiated the next time.
2666
2667 L-system trees
2668 --------------
2669
2670 ### Tree definition
2671
2672     treedef={
2673         axiom,         --string  initial tree axiom
2674         rules_a,       --string  rules set A
2675         rules_b,       --string  rules set B
2676         rules_c,       --string  rules set C
2677         rules_d,       --string  rules set D
2678         trunk,         --string  trunk node name
2679         leaves,        --string  leaves node name
2680         leaves2,       --string  secondary leaves node name
2681         leaves2_chance,--num     chance (0-100) to replace leaves with leaves2
2682         angle,         --num     angle in deg
2683         iterations,    --num     max # of iterations, usually 2 -5
2684         random_level,  --num     factor to lower nr of iterations, usually 0 - 3
2685         trunk_type,    --string  single/double/crossed) type of trunk: 1 node, 2x2 nodes or 3x3 in cross shape
2686         thin_branches, --boolean true -> use thin (1 node) branches
2687         fruit,         --string  fruit node name
2688         fruit_chance,  --num     chance (0-100) to replace leaves with fruit node
2689         seed,          --num     random seed; if no seed is provided, the engine will create one
2690     }
2691
2692 ### Key for Special L-System Symbols used in Axioms
2693
2694 * `G`: move forward one unit with the pen up
2695 * `F`: move forward one unit with the pen down drawing trunks and branches
2696 * `f`: move forward one unit with the pen down drawing leaves (100% chance)
2697 * `T`: move forward one unit with the pen down drawing trunks only
2698 * `R`: move forward one unit with the pen down placing fruit
2699 * `A`: replace with rules set A
2700 * `B`: replace with rules set B
2701 * `C`: replace with rules set C
2702 * `D`: replace with rules set D
2703 * `a`: replace with rules set A, chance 90%
2704 * `b`: replace with rules set B, chance 80%
2705 * `c`: replace with rules set C, chance 70%
2706 * `d`: replace with rules set D, chance 60%
2707 * `+`: yaw the turtle right by `angle` parameter
2708 * `-`: yaw the turtle left by `angle` parameter
2709 * `&`: pitch the turtle down by `angle` parameter
2710 * `^`: pitch the turtle up by `angle` parameter
2711 * `/`: roll the turtle to the right by `angle` parameter
2712 * `*`: roll the turtle to the left by `angle` parameter
2713 * `[`: save in stack current state info
2714 * `]`: recover from stack state info
2715
2716 ### Example
2717 Spawn a small apple tree:
2718
2719     pos = {x=230,y=20,z=4}
2720     apple_tree={
2721         axiom="FFFFFAFFBF",
2722         rules_a="[&&&FFFFF&&FFFF][&&&++++FFFFF&&FFFF][&&&----FFFFF&&FFFF]",
2723         rules_b="[&&&++FFFFF&&FFFF][&&&--FFFFF&&FFFF][&&&------FFFFF&&FFFF]",
2724         trunk="default:tree",
2725         leaves="default:leaves",
2726         angle=30,
2727         iterations=2,
2728         random_level=0,
2729         trunk_type="single",
2730         thin_branches=true,
2731         fruit_chance=10,
2732         fruit="default:apple"
2733     }
2734     minetest.spawn_tree(pos,apple_tree)
2735
2736 Definition tables
2737 -----------------
2738
2739 ### Object Properties
2740
2741     {
2742         hp_max = 1,
2743         physical = true,
2744         collide_with_objects = true, -- collide with other objects if physical=true
2745         weight = 5,
2746         collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
2747         visual = "cube"/"sprite"/"upright_sprite"/"mesh"/"wielditem",
2748         visual_size = {x=1, y=1},
2749         mesh = "model",
2750         textures = {}, -- number of required textures depends on visual
2751         colors = {}, -- number of required colors depends on visual
2752         spritediv = {x=1, y=1},
2753         initial_sprite_basepos = {x=0, y=0},
2754         is_visible = true,
2755         makes_footstep_sound = false,
2756         automatic_rotate = false,
2757         stepheight = 0,
2758         automatic_face_movement_dir = 0.0,
2759     --  ^ automatically set yaw to movement direction; offset in degrees; false to disable
2760     }
2761
2762 ### Entity definition (`register_entity`)
2763
2764     {
2765     --  Deprecated: Everything in object properties is read directly from here
2766
2767         initial_properties = --[[<initial object properties>]],
2768
2769         on_activate = function(self, staticdata, dtime_s),
2770         on_step = function(self, dtime),
2771         on_punch = function(self, hitter),
2772         on_rightclick = function(self, clicker),
2773         get_staticdata = function(self),
2774     --  ^ Called sometimes; the string returned is passed to on_activate when
2775     --    the entity is re-activated from static state
2776
2777         -- Also you can define arbitrary member variables here
2778         myvariable = whatever,
2779     }
2780
2781 ### ABM (ActiveBlockModifier) definition (`register_abm`)
2782
2783     {
2784     --  In the following two fields, also group:groupname will work.
2785         nodenames = {"default:lava_source"},
2786         neighbors = {"default:water_source", "default:water_flowing"}, -- (any of these)
2787     --  ^ If left out or empty, any neighbor will do
2788         interval = 1.0, -- (operation interval)
2789         chance = 1, -- (chance of trigger is 1.0/this)
2790         action = func(pos, node, active_object_count, active_object_count_wider),
2791     }
2792
2793 ### Item definition (`register_node`, `register_craftitem`, `register_tool`)
2794
2795     {
2796         description = "Steel Axe",
2797         groups = {}, -- key=name, value=rating; rating=1..3.
2798                         if rating not applicable, use 1.
2799                         e.g. {wool=1, fluffy=3}
2800                             {soil=2, outerspace=1, crumbly=1}
2801                             {bendy=2, snappy=1},
2802                             {hard=1, metal=1, spikes=1}
2803         inventory_image = "default_tool_steelaxe.png",
2804         wield_image = "",
2805         wield_scale = {x=1,y=1,z=1},
2806         stack_max = 99,
2807         range = 4.0,
2808         liquids_pointable = false,
2809         tool_capabilities = {
2810             full_punch_interval = 1.0,
2811             max_drop_level=0,
2812             groupcaps={
2813                 -- For example:
2814                 snappy={times={[2]=0.80, [3]=0.40}, maxwear=0.05, maxlevel=1},
2815                 choppy={times={[3]=0.90}, maxwear=0.05, maxlevel=0}
2816             },
2817             damage_groups = {groupname=damage},
2818         },
2819         node_placement_prediction = nil,
2820         --[[
2821         ^ If nil and item is node, prediction is made automatically
2822         ^ If nil and item is not a node, no prediction is made
2823         ^ If "" and item is anything, no prediction is made
2824         ^ Otherwise should be name of node which the client immediately places
2825           on ground when the player places the item. Server will always update
2826           actual result to client in a short moment.
2827         ]]
2828         sound = {
2829             place = --[[<SimpleSoundSpec>]],
2830         },
2831
2832         on_place = func(itemstack, placer, pointed_thing),
2833         --[[
2834         ^ Shall place item and return the leftover itemstack
2835         ^ default: minetest.item_place ]]
2836         on_drop = func(itemstack, dropper, pos),
2837         --[[
2838         ^ Shall drop item and return the leftover itemstack
2839         ^ default: minetest.item_drop ]]
2840         on_use = func(itemstack, user, pointed_thing),
2841         --[[
2842         ^  default: nil
2843         ^ Function must return either nil if no item shall be removed from
2844           inventory, or an itemstack to replace the original itemstack.
2845             e.g. itemstack:take_item(); return itemstack
2846         ^ Otherwise, the function is free to do what it wants.
2847         ^ The default functions handle regular use cases.
2848         ]]
2849         after_use = func(itemstack, user, node, digparams),
2850         --[[
2851         ^  default: nil
2852         ^ If defined, should return an itemstack and will be called instead of
2853           wearing out the tool. If returns nil, does nothing.
2854           If after_use doesn't exist, it is the same as:
2855             function(itemstack, user, node, digparams)
2856               itemstack:add_wear(digparams.wear)
2857               return itemstack
2858             end
2859         ]]
2860     }
2861
2862 ### Tile definition
2863 * `"image.png"`
2864 * `{name="image.png", animation={Tile Animation definition}}`
2865 * `{name="image.png", backface_culling=bool}`
2866     * backface culling only supported in special tiles
2867 * deprecated, yet still supported field names:
2868     * `image` (name)
2869
2870 ### Tile animation definition
2871 * `{type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}`
2872
2873 ### Node definition (`register_node`)
2874
2875     {
2876         -- <all fields allowed in item definitions>,
2877
2878         drawtype = "normal", -- See "Node drawtypes"
2879         visual_scale = 1.0, --[[
2880         ^ Supported for drawtypes "plantlike", "signlike", "torchlike", "mesh".
2881         ^ For plantlike, the image will start at the bottom of the node; for the
2882         ^ other drawtypes, the image will be centered on the node.
2883         ^ Note that positioning for "torchlike" may still change. ]]
2884         tiles = {tile definition 1, def2, def3, def4, def5, def6}, --[[
2885         ^ Textures of node; +Y, -Y, +X, -X, +Z, -Z (old field name: tile_images)
2886         ^ List can be shortened to needed length ]]
2887         special_tiles = {tile definition 1, Tile definition 2}, --[[
2888         ^ Special textures of node; used rarely (old field name: special_materials)
2889         ^ List can be shortened to needed length ]]
2890         alpha = 255,
2891         use_texture_alpha = false, -- Use texture's alpha channel
2892         post_effect_color = {a=0, r=0, g=0, b=0}, -- If player is inside node
2893         paramtype = "none", -- See "Nodes" --[[
2894         ^ paramtype = "light" allows light to propagate from or through the node with light value
2895         ^ falling by 1 per node. This line is essential for a light source node to spread its light. ]]
2896         paramtype2 = "none", -- See "Nodes"
2897         is_ground_content = true, -- If false, the cave generator will not carve through this
2898         sunlight_propagates = false, -- If true, sunlight will go infinitely through this
2899         walkable = true, -- If true, objects collide with node
2900         pointable = true, -- If true, can be pointed at
2901         diggable = true, -- If false, can never be dug
2902         climbable = false, -- If true, can be climbed on (ladder)
2903         buildable_to = false, -- If true, placed nodes can replace this node
2904         liquidtype = "none", -- "none"/"source"/"flowing"
2905         liquid_alternative_flowing = "", -- Flowing version of source liquid
2906         liquid_alternative_source = "", -- Source version of flowing liquid
2907         liquid_viscosity = 0, -- Higher viscosity = slower flow (max. 7)
2908         liquid_renewable = true, -- Can new liquid source be created by placing two or more sources nearby?
2909         leveled = 0, --[[
2910         ^ Block contains level in param2. Value is default level, used for snow.
2911         ^ Don't forget to use "leveled" type nodebox. ]]
2912         liquid_range = 8, -- number of flowing nodes around source (max. 8)
2913         drowning = 0, -- Player will take this amount of damage if no bubbles are left
2914         light_source = 0, -- Amount of light emitted by node
2915         damage_per_second = 0, -- If player is inside node, this damage is caused
2916         node_box = {type="regular"}, -- See "Node boxes"
2917         mesh = "model",
2918         selection_box = {type="regular"}, -- See "Node boxes" --[[
2919         ^ If drawtype "nodebox" is used and selection_box is nil, then node_box is used. ]]
2920         legacy_facedir_simple = false, -- Support maps made in and before January 2012
2921         legacy_wallmounted = false, -- Support maps made in and before January 2012
2922         sounds = {
2923             footstep = <SimpleSoundSpec>,
2924             dig = <SimpleSoundSpec>, -- "__group" = group-based sound (default)
2925             dug = <SimpleSoundSpec>,
2926             place = <SimpleSoundSpec>,
2927         },
2928         drop = "",  -- Name of dropped node when dug. Default is the node itself.
2929         -- Alternatively:
2930         drop = {
2931             max_items = 1,  -- Maximum number of items to drop.
2932             items = { -- Choose max_items randomly from this list.
2933                 {
2934                     items = {"foo:bar", "baz:frob"},  -- Choose one item randomly from this list.
2935                     rarity = 1,  -- Probability of getting is 1 / rarity.
2936                 },
2937             },
2938         },
2939
2940         on_construct = func(pos), --[[
2941         ^ Node constructor; always called after adding node
2942         ^ Can set up metadata and stuff like that
2943         ^ default: nil ]]
2944         on_destruct = func(pos), --[[
2945         ^ Node destructor; always called before removing node
2946         ^ default: nil ]]
2947         after_destruct = func(pos, oldnode), --[[
2948         ^ Node destructor; always called after removing node
2949         ^ default: nil ]]
2950
2951         after_place_node = func(pos, placer, itemstack, pointed_thing) --[[
2952         ^ Called after constructing node when node was placed using
2953           minetest.item_place_node / minetest.place_node
2954         ^ If return true no item is taken from itemstack
2955         ^ default: nil ]]
2956         after_dig_node = func(pos, oldnode, oldmetadata, digger), --[[
2957         ^ oldmetadata is in table format
2958         ^ Called after destructing node when node was dug using
2959           minetest.node_dig / minetest.dig_node
2960         ^ default: nil ]]
2961         can_dig = function(pos,player) --[[
2962         ^ returns true if node can be dug, or false if not
2963         ^ default: nil ]]
2964
2965         on_punch = func(pos, node, puncher, pointed_thing), --[[
2966         ^ default: minetest.node_punch
2967         ^ By default: Calls minetest.register_on_punchnode callbacks ]]
2968         on_rightclick = func(pos, node, clicker, itemstack, pointed_thing), --[[
2969         ^ default: nil
2970         ^ if defined, itemstack will hold clicker's wielded item
2971         ^ Shall return the leftover itemstack
2972         ^ Note: pointed_thing can be nil, if a mod calls this function ]]
2973
2974         on_dig = func(pos, node, digger), --[[
2975         ^ default: minetest.node_dig
2976         ^ By default: checks privileges, wears out tool and removes node ]]
2977
2978         on_timer = function(pos,elapsed), --[[
2979         ^ default: nil
2980         ^ called by NodeTimers, see minetest.get_node_timer and NodeTimerRef
2981         ^ elapsed is the total time passed since the timer was started
2982         ^ return true to run the timer for another cycle with the same timeout value ]]
2983
2984         on_receive_fields = func(pos, formname, fields, sender), --[[
2985         ^ fields = {name1 = value1, name2 = value2, ...}
2986         ^ Called when an UI form (e.g. sign text input) returns data
2987         ^ default: nil ]]
2988
2989         allow_metadata_inventory_move = func(pos, from_list, from_index,
2990                 to_list, to_index, count, player), --[[
2991         ^ Called when a player wants to move items inside the inventory
2992         ^ Return value: number of items allowed to move ]]
2993
2994         allow_metadata_inventory_put = func(pos, listname, index, stack, player), --[[
2995         ^ Called when a player wants to put something into the inventory
2996         ^ Return value: number of items allowed to put
2997         ^ Return value: -1: Allow and don't modify item count in inventory ]]
2998
2999         allow_metadata_inventory_take = func(pos, listname, index, stack, player), --[[
3000         ^ Called when a player wants to take something out of the inventory
3001         ^ Return value: number of items allowed to take
3002         ^ Return value: -1: Allow and don't modify item count in inventory ]]
3003
3004         on_metadata_inventory_move = func(pos, from_list, from_index,
3005                 to_list, to_index, count, player),
3006         on_metadata_inventory_put = func(pos, listname, index, stack, player),
3007         on_metadata_inventory_take = func(pos, listname, index, stack, player), --[[
3008         ^ Called after the actual action has happened, according to what was allowed.
3009         ^ No return value ]]
3010
3011         on_blast = func(pos, intensity), --[[
3012         ^ intensity: 1.0 = mid range of regular TNT
3013         ^ If defined, called when an explosion touches the node, instead of
3014           removing the node ]]
3015     }
3016
3017 ### Recipe for `register_craft` (shaped)
3018
3019     {
3020         output = 'default:pick_stone',
3021         recipe = {
3022             {'default:cobble', 'default:cobble', 'default:cobble'},
3023             {'', 'default:stick', ''},
3024             {'', 'default:stick', ''}, -- Also groups; e.g. 'group:crumbly'
3025         },
3026         replacements = --[[<optional list of item pairs,
3027                         replace one input item with another item on crafting>]]
3028     }
3029
3030 ### Recipe for `register_craft` (shapeless)
3031
3032     {
3033        type = "shapeless",
3034        output = 'mushrooms:mushroom_stew',
3035        recipe = {
3036            "mushrooms:bowl",
3037            "mushrooms:mushroom_brown",
3038            "mushrooms:mushroom_red",
3039        },
3040        replacements = --[[<optional list of item pairs,
3041                        replace one input item with another item on crafting>]]
3042    }
3043
3044 ### Recipe for `register_craft` (tool repair)
3045
3046     {
3047         type = "toolrepair",
3048         additional_wear = -0.02,
3049     }
3050
3051 ### Recipe for `register_craft` (cooking)
3052
3053     {
3054         type = "cooking",
3055         output = "default:glass",
3056         recipe = "default:sand",
3057         cooktime = 3,
3058     }
3059
3060 ### Recipe for `register_craft` (furnace fuel)
3061
3062     {
3063         type = "fuel",
3064         recipe = "default:leaves",
3065         burntime = 1,
3066     }
3067
3068 ### Ore definition (`register_ore`)
3069
3070     {
3071         ore_type = "scatter", -- See "Ore types"
3072         ore = "default:stone_with_coal",
3073         wherein = "default:stone",
3074     --  ^ a list of nodenames is supported too
3075         clust_scarcity = 8*8*8,
3076     --  ^ Ore has a 1 out of clust_scarcity chance of spawning in a node
3077     --  ^ This value should be *MUCH* higher than your intuition might tell you!
3078         clust_num_ores = 8,
3079     --  ^ Number of ores in a cluster
3080         clust_size = 3,
3081     --  ^ Size of the bounding box of the cluster
3082     --  ^ In this example, there is a 3x3x3 cluster where 8 out of the 27 nodes are coal ore
3083         y_min = -31000,
3084         y_max = 64,
3085         flags = "",
3086     --  ^ Attributes for this ore generation
3087         noise_threshhold = 0.5,
3088     --  ^ If noise is above this threshold, ore is placed.  Not needed for a uniform distribution
3089         noise_params = {offset=0, scale=1, spread={x=100, y=100, z=100}, seed=23, octaves=3, persist=0.70}
3090     --  ^ NoiseParams structure describing the perlin noise used for ore distribution.
3091     --  ^ Needed for sheet ore_type.  Omit from scatter ore_type for a uniform ore distribution
3092         random_factor = 1.0,
3093     --  ^ Multiplier of the randomness contribution to the noise value at any
3094     --   given point to decide if ore should be placed.  Set to 0 for solid veins.
3095     --  ^ This parameter is only valid for ore_type == "vein".
3096     }
3097
3098 ### Decoration definition (`register_decoration`)
3099
3100     {
3101         deco_type = "simple", -- See "Decoration types"
3102         place_on = "default:dirt_with_grass",
3103     --  ^ Node that decoration can be placed on
3104         sidelen = 8,
3105     --  ^ Size of divisions made in the chunk being generated.
3106     --  ^ If the chunk size is not evenly divisible by sidelen, sidelen is made equal to the chunk size.
3107         fill_ratio = 0.02,
3108     --  ^ Ratio of the area to be uniformly filled by the decoration.
3109     --  ^ Used only if noise_params is not specified.
3110         noise_params = {offset=0, scale=.45, spread={x=100, y=100, z=100}, seed=354, octaves=3, persist=0.7},
3111     --  ^ NoiseParams structure describing the perlin noise used for decoration distribution.
3112     --  ^ The result of this is multiplied by the 2d area of the division being decorated.
3113         biomes = {"Oceanside", "Hills", "Plains"},
3114     --  ^ List of biomes in which this decoration occurs.  Occurs in all biomes if this is omitted,
3115     --  ^ and ignored if the Mapgen being used does not support biomes.
3116         y_min = -31000
3117         y_max = 31000
3118     -- ^ Minimum and maximum `y` positions these decorations can be generated at.
3119     -- ^ This parameter refers to the `y` position of the decoration base, so
3120     --   the actual maximum height would be `height_max + size.Y`.
3121
3122         ----- Simple-type parameters
3123         decoration = "default:grass",
3124     --  ^ The node name used as the decoration.
3125     --  ^ If instead a list of strings, a randomly selected node from the list is placed as the decoration.
3126         height = 1,
3127     --  ^ Number of nodes high the decoration is made.
3128     --  ^ If height_max is not 0, this is the lower bound of the randomly selected height.
3129         height_max = 0,
3130     --      ^ Number of nodes the decoration can be at maximum.
3131     --  ^ If absent, the parameter 'height' is used as a constant.
3132         spawn_by = "default:water",
3133     --  ^ Node that the decoration only spawns next to, in a 1-node square radius.
3134         num_spawn_by = 1,
3135     --  ^ Number of spawn_by nodes that must be surrounding the decoration position to occur.
3136     --  ^ If absent or -1, decorations occur next to any nodes.
3137
3138         ----- Schematic-type parameters
3139         schematic = "foobar.mts",
3140     --  ^ If schematic is a string, it is the filepath relative to the current working directory of the
3141     --  ^ specified Minetest schematic file.
3142     --  ^  - OR -, could instead be a table containing two mandatory fields, size and data,
3143     --  ^ and an optional table yslice_prob:
3144         schematic = {
3145             size = {x=4, y=6, z=4},
3146             data = {
3147                 {name="cobble", param1=255, param2=0},
3148                 {name="dirt_with_grass", param1=255, param2=0},
3149                  ...
3150             },
3151             yslice_prob = {
3152                 {ypos=2, prob=128},
3153                 {ypos=5, prob=64},
3154                  ...
3155             },
3156         },
3157     --  ^ See 'Schematic specifier' for details.
3158         replacements = {["oldname"] = "convert_to", ...},
3159         flags = "place_center_x, place_center_z",
3160     --  ^ Flags for schematic decorations.  See 'Schematic attributes'.
3161         rotation = "90" -- rotate schematic 90 degrees on placement
3162     --  ^ Rotation can be "0", "90", "180", "270", or "random".
3163     }
3164
3165 ### Chat command definition (`register_chatcommand`)
3166
3167     {
3168         params = "<name> <privilege>", -- Short parameter description
3169         description = "Remove privilege from player", -- Full description
3170         privs = {privs=true}, -- Require the "privs" privilege to run
3171         func = function(name, param), -- Called when command is run.
3172                                       -- Returns boolean success and text output.
3173     }
3174
3175 ### Detached inventory callbacks
3176
3177     {
3178         allow_move = func(inv, from_list, from_index, to_list, to_index, count, player),
3179     --  ^ Called when a player wants to move items inside the inventory
3180     --  ^ Return value: number of items allowed to move
3181
3182         allow_put = func(inv, listname, index, stack, player),
3183     --  ^ Called when a player wants to put something into the inventory
3184     --  ^ Return value: number of items allowed to put
3185     --  ^ Return value: -1: Allow and don't modify item count in inventory
3186
3187         allow_take = func(inv, listname, index, stack, player),
3188     --  ^ Called when a player wants to take something out of the inventory
3189     --  ^ Return value: number of items allowed to take
3190     --  ^ Return value: -1: Allow and don't modify item count in inventory
3191
3192         on_move = func(inv, from_list, from_index, to_list, to_index, count, player),
3193         on_put = func(inv, listname, index, stack, player),
3194         on_take = func(inv, listname, index, stack, player),
3195     --  ^ Called after the actual action has happened, according to what was allowed.
3196     --  ^ No return value
3197     }
3198
3199 ### HUD Definition (`hud_add`, `hud_get`)
3200
3201     {
3202         hud_elem_type = "image", -- see HUD element types
3203     --  ^ type of HUD element, can be either of "image", "text", "statbar", or "inventory"
3204         position = {x=0.5, y=0.5},
3205     --  ^ Left corner position of element
3206         name = "<name>",
3207         scale = {x=2, y=2},
3208         text = "<text>",
3209         number = 2,
3210         item = 3,
3211     --  ^ Selected item in inventory.  0 for no item selected.
3212         direction = 0,
3213     --  ^ Direction: 0: left-right, 1: right-left, 2: top-bottom, 3: bottom-top
3214         alignment = {x=0, y=0},
3215     --  ^ See "HUD Element Types"
3216         offset = {x=0, y=0},
3217     --  ^ See "HUD Element Types"
3218         size = { x=100, y=100 },
3219     --  ^ Size of element in pixels
3220     }
3221
3222 ### Particle definition (`add_particle`)
3223
3224     {
3225         pos = {x=0, y=0, z=0},
3226         velocity = {x=0, y=0, z=0},
3227         acceleration = {x=0, y=0, z=0},
3228     --  ^ Spawn particle at pos with velocity and acceleration
3229         expirationtime = 1,
3230     --  ^ Disappears after expirationtime seconds
3231         size = 1,
3232         collisiondetection = false,
3233     --  ^ collisiondetection: if true collides with physical objects
3234         vertical = false,
3235     --  ^ vertical: if true faces player using y axis only
3236         texture = "image.png",
3237     --  ^ Uses texture (string)
3238         playername = "singleplayer"
3239     --  ^ optional, if specified spawns particle only on the player's client
3240     }
3241
3242 ### `ParticleSpawner` definition (`add_particlespawner`)
3243
3244     {
3245         amount = 1,
3246         time = 1,
3247     --  ^ If time is 0 has infinite lifespan and spawns the amount on a per-second base
3248         minpos = {x=0, y=0, z=0},
3249         maxpos = {x=0, y=0, z=0},
3250         minvel = {x=0, y=0, z=0},
3251         maxvel = {x=0, y=0, z=0},
3252         minacc = {x=0, y=0, z=0},
3253         maxacc = {x=0, y=0, z=0},
3254         minexptime = 1,
3255         maxexptime = 1,
3256         minsize = 1,
3257         maxsize = 1,
3258     --  ^ The particle's properties are random values in between the bounds:
3259     --  ^ minpos/maxpos, minvel/maxvel (velocity), minacc/maxacc (acceleration),
3260     --  ^ minsize/maxsize, minexptime/maxexptime (expirationtime)
3261         collisiondetection = false,
3262     --  ^ collisiondetection: if true uses collision detection
3263         vertical = false,
3264     --  ^ vertical: if true faces player using y axis only
3265         texture = "image.png",
3266     --  ^ Uses texture (string)
3267         playername = "singleplayer"
3268     --  ^ Playername is optional, if specified spawns particle only on the player's client
3269     }