]> git.lizzy.rs Git - minetest.git/blob - doc/lua_api.txt
Added ratio argument to colorize, removed the weird alpha-based ratio.
[minetest.git] / doc / lua_api.txt
1 Minetest Lua Modding API Reference 0.4.11
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
1930 ### Formspec
1931 * `minetest.show_formspec(playername, formname, formspec)`
1932     * `playername`: name of player to show formspec
1933     * `formname`: name passed to `on_player_receive_fields` callbacks.
1934       It should follow the `"modname:<whatever>"` naming convention
1935     * `formspec`: formspec to display
1936 * `minetest.formspec_escape(string)`: returns a string
1937     * escapes the characters "[", "]", "\", "," and ";", which can not be used in formspecs
1938 * `minetest.explode_table_event(string)`: returns a table
1939     * returns e.g. `{type="CHG", row=1, column=2}`
1940     * `type` is one of:
1941         * `"INV"`: no row selected)
1942         * `"CHG"`: selected)
1943         * `"DCL"`: double-click
1944 * `minetest.explode_textlist_event(string)`: returns a table
1945     * returns e.g. `{type="CHG", index=1}`
1946     * `type` is one of:
1947         * `"INV"`: no row selected)
1948         * `"CHG"`: selected)
1949         * `"DCL"`: double-click
1950 * `minetest.explode_scrollbar_event(string)`: returns a table
1951     * returns e.g. `{type="CHG", value=500}`
1952     * `type` is one of:
1953         * `"INV"`: something failed
1954         * `"CHG"`: has been changed
1955         * `"VAL"`: not changed
1956
1957 ### Item handling
1958 * `minetest.inventorycube(img1, img2, img3)`
1959     * Returns a string for making an image of a cube (useful as an item image)
1960 * `minetest.get_pointed_thing_position(pointed_thing, above)`
1961     * Get position of a `pointed_thing` (that you can get from somewhere)
1962 * `minetest.dir_to_facedir(dir, is6d)`
1963     * Convert a vector to a facedir value, used in `param2` for `paramtype2="facedir"`;
1964     * passing something non-`nil`/`false` for the optional second parameter causes it to
1965       take the y component into account
1966 * `minetest.facedir_to_dir(facedir)`
1967     * Convert a facedir back into a vector aimed directly out the "back" of a node
1968 * `minetest.dir_to_wallmounted(dir)`
1969     * Convert a vector to a wallmounted value, used for `paramtype2="wallmounted"`
1970 * `minetest.get_node_drops(nodename, toolname)`
1971     * Returns list of item names.
1972     * **Note**: This will be removed or modified in a future version.
1973 * `minetest.get_craft_result(input)`: returns `output, decremented_input`
1974     * `input.method` = `"normal"` or `"cooking"` or `"fuel"`
1975     * `input.width` = for example `3`
1976     * `input.items` = for example
1977       `{ stack1, stack2, stack3, stack4, stack 5, stack 6, stack 7, stack 8, stack 9 }`
1978     * `output.item` = `ItemStack`, if unsuccessful: empty `ItemStack`
1979     * `output.time` = a number, if unsuccessful: `0`
1980     * `decremented_input` = like `input`
1981 * `minetest.get_craft_recipe(output)`: returns input
1982     * returns last registered recipe for output item (node)
1983     * `output` is a node or item type such as `"default:torch"`
1984     * `input.method` = `"normal"` or `"cooking"` or `"fuel"`
1985     * `input.width` = for example `3`
1986     * `input.items` = for example
1987       `{ stack1, stack2, stack3, stack4, stack 5, stack 6, stack 7, stack 8, stack 9 }`
1988       * `input.items` = `nil` if no recipe found
1989 * `minetest.get_all_craft_recipes(query item)`: returns a table or `nil`
1990     * returns indexed table with all registered recipes for query item (node)
1991       or `nil` if no recipe was found
1992     * recipe entry table:
1993             {
1994                 method = 'normal' or 'cooking' or 'fuel'
1995                 width = 0-3, 0 means shapeless recipe
1996                 items = indexed [1-9] table with recipe items
1997                 output = string with item name and quantity
1998             }
1999     * Example query for `"default:gold_ingot"` will return table:
2000             {
2001                 [1]={type = "cooking", width = 3, output = "default:gold_ingot",
2002                 items = {1 = "default:gold_lump"}},
2003                 [2]={type = "normal", width = 1, output = "default:gold_ingot 9",
2004                 items = {1 = "default:goldblock"}}
2005             }
2006 * `minetest.handle_node_drops(pos, drops, digger)`
2007     * `drops`: list of itemstrings
2008     * Handles drops from nodes after digging: Default action is to put them into
2009       digger's inventory
2010     * Can be overridden to get different functionality (e.g. dropping items on
2011       ground)
2012
2013 ### Rollback
2014 * `minetest.rollback_get_node_actions(pos, range, seconds, limit)`:
2015   returns `{{actor, pos, time, oldnode, newnode}, ...}`
2016     * Find who has done something to a node, or near a node
2017     * `actor`: `"player:<name>"`, also `"liquid"`.
2018 * `minetest.rollback_revert_actions_by(actor, seconds)`: returns `boolean, log_messages`
2019     * Revert latest actions of someone
2020     * `actor`: `"player:<name>"`, also `"liquid"`.
2021
2022 ### Defaults for the `on_*` item definition functions
2023 These functions return the leftover itemstack.
2024
2025 * `minetest.item_place_node(itemstack, placer, pointed_thing, param2)`
2026     * Place item as a node
2027     * `param2` overrides `facedir` and wallmounted `param2`
2028     * returns `itemstack, success`
2029 * `minetest.item_place_object(itemstack, placer, pointed_thing)`
2030     * Place item as-is
2031 * `minetest.item_place(itemstack, placer, pointed_thing, param2)`
2032     * Use one of the above based on what the item is.
2033     * Calls `on_rightclick` of `pointed_thing.under` if defined instead
2034     * **Note**: is not called when wielded item overrides `on_place`
2035     * `param2` overrides `facedir` and wallmounted `param2`
2036     * returns `itemstack, success`
2037 * `minetest.item_drop(itemstack, dropper, pos)`
2038     * Drop the item
2039 * `minetest.item_eat(hp_change, replace_with_item)`
2040     * Eat the item. `replace_with_item` can be `nil`.
2041
2042 ### Defaults for the `on_punch` and `on_dig` node definition callbacks
2043 * `minetest.node_punch(pos, node, puncher, pointed_thing)`
2044     * Calls functions registered by `minetest.register_on_punchnode()`
2045 * `minetest.node_dig(pos, node, digger)`
2046     * Checks if node can be dug, puts item into inventory, removes node
2047     * Calls functions registered by `minetest.registered_on_dignodes()`
2048
2049 ### Sounds
2050 * `minetest.sound_play(spec, parameters)`: returns a handle
2051     * `spec` is a `SimpleSoundSpec`
2052     * `parameters` is a sound parameter table
2053 * `minetest.sound_stop(handle)`
2054
2055 ### Timing
2056 * `minetest.after(time, func, ...)`
2057     * Call the function `func` after `time` seconds
2058     * Optional: Variable number of arguments that are passed to `func`
2059
2060 ### Server
2061 * `minetest.request_shutdown()`: request for server shutdown
2062 * `minetest.get_server_status()`: returns server status string
2063
2064 ### Bans
2065 * `minetest.get_ban_list()`: returns the ban list (same as `minetest.get_ban_description("")`)
2066 * `minetest.get_ban_description(ip_or_name)`: returns ban description (string)
2067 * `minetest.ban_player(name)`: ban a player
2068 * `minetest.unban_player_or_ip(name)`: unban player or IP address
2069 * `minetest.kick_player(name, [reason])`: disconnect a player with a optional reason
2070
2071 ### Particles
2072 * `minetest.add_particle(particle definition)`
2073     * Deprecated: `minetest.add_particle(pos, velocity, acceleration, expirationtime,
2074       size, collisiondetection, texture, playername)`
2075
2076 * `minetest.add_particlespawner(particlespawner definition)`
2077     * Add a `ParticleSpawner`, an object that spawns an amount of particles over `time` seconds
2078     * Returns an `id`
2079     * `Deprecated: minetest.add_particlespawner(amount, time,
2080       minpos, maxpos,
2081       minvel, maxvel,
2082       minacc, maxacc,
2083       minexptime, maxexptime,
2084       minsize, maxsize,
2085       collisiondetection, texture, playername)`
2086
2087 * `minetest.delete_particlespawner(id, player)``
2088     * Delete `ParticleSpawner` with `id` (return value from `minetest.add_particlespawner`)
2089     * If playername is specified, only deletes on the player's client,
2090     * otherwise on all clients
2091
2092 ### Schematics
2093 * `minetest.create_schematic(p1, p2, probability_list, filename, slice_prob_list)`
2094     * Create a schematic from the volume of map specified by the box formed by p1 and p2.
2095     * Apply the specified probability values to the specified nodes in `probability_list`.
2096         * `probability_list` is an array of tables containing two fields, `pos` and `prob`.
2097             * `pos` is the 3D vector specifying the absolute coordinates of the node being modified,
2098             * `prob` is the integer value from `0` to `255` of the probability (see: Schematic specifier).
2099             * If there are two or more entries with the same pos value, the last entry is used.
2100             * If `pos` is not inside the box formed by `p1` and `p2`, it is ignored.
2101             * If `probability_list` equals `nil`, no probabilities are applied.
2102             * Slice probability works in the same manner, except takes a field called `ypos` instead which
2103               indicates the y position of the slice with a probability applied.
2104             * If slice probability list equals `nil`, no slice probabilities are applied.
2105     * Saves schematic in the Minetest Schematic format to filename.
2106
2107 * `minetest.place_schematic(pos, schematic, rotation, replacements, force_placement)`
2108     * Place the schematic specified by schematic (see: Schematic specifier) at `pos`.
2109     * `rotation` can equal `"0"`, `"90"`, `"180"`, `"270"`, or `"random"`.
2110     * If the `rotation` parameter is omitted, the schematic is not rotated.
2111     * `replacements` = `{["old_name"] = "convert_to", ...}`
2112     * `force_placement` is a boolean indicating whether nodes other than `air` and
2113       `ignore` are replaced by the schematic
2114
2115 ### Misc.
2116 * `minetest.get_connected_players()`: returns list of `ObjectRefs`
2117 * `minetest.hash_node_position({x=,y=,z=})`: returns an 48-bit integer
2118     * Gives a unique hash number for a node position (16+16+16=48bit)
2119 * `minetest.get_position_from_hash(hash)`: returns a position
2120     * Inverse transform of `minetest.hash_node_position`
2121 * `minetest.get_item_group(name, group)`: returns a rating
2122     * Get rating of a group of an item. (`0` means: not in group)
2123 * `minetest.get_node_group(name, group)`: returns a rating
2124     * Deprecated: An alias for the former.
2125 * `minetest.get_content_id(name)`: returns an integer
2126     * Gets the internal content ID of `name`
2127 * `minetest.get_name_from_content_id(content_id)`: returns a string
2128     * Gets the name of the content with that content ID
2129 * `minetest.parse_json(string[, nullvalue])`: returns something
2130     * Convert a string containing JSON data into the Lua equivalent
2131     * `nullvalue`: returned in place of the JSON null; defaults to `nil`
2132     * On success returns a table, a string, a number, a boolean or `nullvalue`
2133     * On failure outputs an error message and returns `nil`
2134     * Example: `parse_json("[10, {\"a\":false}]")`, returns `{10, {a = false}}`
2135 * `minetest.write_json(data[, styled])`: returns a string or `nil` and an error message
2136     * Convert a Lua table into a JSON string
2137     * styled: Outputs in a human-readable format if this is set, defaults to false
2138     * Unserializable things like functions and userdata are saved as null.
2139     * **Warning**: JSON is more strict than the Lua table format.
2140         1. You can only use strings and positive integers of at least one as keys.
2141         2. You can not mix string and integer keys.
2142            This is due to the fact that JSON has two distinct array and object values.
2143     * Example: `write_json({10, {a = false}})`, returns `"[10, {\"a\": false}]"`
2144 * `minetest.serialize(table)`: returns a string
2145     * Convert a table containing tables, strings, numbers, booleans and `nil`s
2146       into string form readable by `minetest.deserialize`
2147     * Example: `serialize({foo='bar'})`, returns `'return { ["foo"] = "bar" }'`
2148 * `minetest.deserialize(string)`: returns a table
2149     * Convert a string returned by `minetest.deserialize` into a table
2150     * `string` is loaded in an empty sandbox environment.
2151     * Will load functions, but they cannot access the global environment.
2152     * Example: `deserialize('return { ["foo"] = "bar" }')`, returns `{foo='bar'}`
2153     * Example: `deserialize('print("foo")')`, returns `nil` (function call fails)
2154         * `error:[string "print("foo")"]:1: attempt to call global 'print' (a nil value)`
2155 * `minetest.compress(data, method, ...)`: returns `compressed_data`
2156     * Compress a string of data.
2157     * `method` is a string identifying the compression method to be used.
2158     * Supported compression methods:
2159     *     Deflate (zlib): `"deflate"`
2160     * `...` indicates method-specific arguments.  Currently defined arguments are:
2161     *     Deflate: `level` - Compression level, `0`-`9` or `nil`.
2162 * `minetest.decompress(compressed_data, method, ...)`: returns data
2163     * Decompress a string of data (using ZLib).
2164     * See documentation on `minetest.compress()` for supported compression methods.
2165     * currently supported.
2166     * `...` indicates method-specific arguments. Currently, no methods use this.
2167 * `minetest.is_protected(pos, name)`: returns boolean
2168     * This function should be overridden by protection mods and should be used to
2169       check if a player can interact at a position.
2170     * This function should call the old version of itself if the position is not
2171       protected by the mod.
2172     * Example:
2173
2174             local old_is_protected = minetest.is_protected
2175             function minetest.is_protected(pos, name)
2176                 if mymod:position_protected_from(pos, name) then
2177                     return true
2178                 end
2179                     return old_is_protected(pos, name)
2180             end
2181 * `minetest.record_protection_violation(pos, name)`
2182      * This function calls functions registered with
2183        `minetest.register_on_protection_violation`.
2184 * `minetest.rotate_and_place(itemstack, placer, pointed_thing, infinitestacks, orient_flags)`
2185     * Attempt to predict the desired orientation of the facedir-capable node
2186       defined by `itemstack`, and place it accordingly (on-wall, on the floor, or
2187       hanging from the ceiling). Stacks are handled normally if the `infinitestacks`
2188       field is false or omitted (else, the itemstack is not changed). `orient_flags`
2189       is an optional table containing extra tweaks to the placement code:
2190         * `invert_wall`:   if `true`, place wall-orientation on the ground and ground-
2191     orientation on the wall.
2192         * `force_wall` :   if `true`, always place the node in wall orientation.
2193         * `force_ceiling`: if `true`, always place on the ceiling.
2194         * `force_floor`:   if `true`, always place the node on the floor.
2195         * `force_facedir`: if `true`, forcefully reset the facedir to north when placing on
2196           the floor or ceiling
2197         * The first four options are mutually-exclusive; the last in the list takes
2198           precedence over the first.
2199
2200
2201
2202 * `minetest.rotate_node(itemstack, placer, pointed_thing)`
2203      * calls `rotate_and_place()` with infinitestacks set according to the state of
2204        the creative mode setting, and checks for "sneak" to set the `invert_wall`
2205        parameter.
2206
2207 * `minetest.forceload_block(pos)`
2208     * forceloads the position `pos`.
2209     * returns `true` if area could be forceloaded
2210
2211 * `minetest.forceload_free_block(pos)`
2212     * stops forceloading the position `pos`
2213
2214 Please note that forceloaded areas are saved when the server restarts.
2215
2216 ### Global objects
2217 * `minetest.env`: `EnvRef` of the server environment and world.
2218     * Any function in the minetest namespace can be called using the syntax
2219      `minetest.env:somefunction(somearguments)`
2220      instead of `minetest.somefunction(somearguments)`
2221    * Deprecated, but support is not to be dropped soon
2222
2223 ### Global tables
2224 * `minetest.registered_items`
2225     * Map of registered items, indexed by name
2226 * `minetest.registered_nodes`
2227     * Map of registered node definitions, indexed by name
2228 * `minetest.registered_craftitems`
2229     * Map of registered craft item definitions, indexed by name
2230 * `minetest.registered_tools`
2231     * Map of registered tool definitions, indexed by name
2232 * `minetest.registered_entities`
2233     * Map of registered entity prototypes, indexed by name
2234 * `minetest.object_refs`
2235     * Map of object references, indexed by active object id
2236 * `minetest.luaentities`
2237     * Map of Lua entities, indexed by active object id
2238 * `minetest.registered_ores`
2239     * List of registered ore definitions.
2240 * `minetest.registered_decorations`
2241     * List of registered decoration definitions.
2242
2243 Class reference
2244 ---------------
2245
2246 ### `NodeMetaRef`
2247 Node metadata: reference extra data and functionality stored in a node.  
2248 Can be gotten via `minetest.get_meta(pos)`.
2249
2250 #### Methods
2251 * `set_string(name, value)`
2252 * `get_string(name)`
2253 * `set_int(name, value)`
2254 * `get_int(name)`
2255 * `set_float(name, value)`
2256 * `get_float(name)`
2257 * `get_inventory()`: returns `InvRef`
2258 * `to_table()`: returns `nil` or `{fields = {...}, inventory = {list1 = {}, ...}}`
2259 * `from_table(nil or {})`
2260     * See "Node Metadata"
2261
2262 ### `NoteTimerRef`
2263 Node Timers: a high resolution persistent per-node timer.  
2264 Can be gotten via `minetest.get_node_timer(pos)`.
2265
2266 #### Methods
2267 * `set(timeout,elapsed)`
2268     * set a timer's state
2269     * `timeout` is in seconds, and supports fractional values (0.1 etc)
2270     * `elapsed` is in seconds, and supports fractional values (0.1 etc)
2271     * will trigger the node's `on_timer` function after `timeout`-elapsed seconds
2272 * `start(timeout)`
2273     * start a timer
2274     * equivalent to `set(timeout,0)`
2275 * `stop()`
2276     * stops the timer
2277 * `get_timeout()`: returns current timeout in seconds
2278     * if `timeout` equals `0`, timer is inactive
2279 * `get_elapsed()`: returns current elapsed time in seconds
2280     * the node's `on_timer` function will be called after `timeout`-elapsed seconds
2281 * `is_started()`: returns boolean state of timer
2282     * returns `true` if timer is started, otherwise `false`
2283
2284 ### `ObjectRef`
2285 Moving things in the game are generally these.
2286
2287 This is basically a reference to a C++ `ServerActiveObject`
2288
2289 #### Methods
2290 * `remove()`: remove object (after returning from Lua)
2291 * `getpos()`: returns `{x=num, y=num, z=num}`
2292 * `setpos(pos)`; `pos`=`{x=num, y=num, z=num}`
2293 * `moveto(pos, continuous=false)`: interpolated move
2294 * `punch(puncher, time_from_last_punch, tool_capabilities, direction)`
2295     * `puncher` = another `ObjectRef`,
2296     * `time_from_last_punch` = time since last punch action of the puncher
2297     * `direction`: can be `nil`
2298 * `right_click(clicker)`; `clicker` is another `ObjectRef`
2299 * `get_hp()`: returns number of hitpoints (2 * number of hearts)
2300 * `set_hp(hp)`: set number of hitpoints (2 * number of hearts)
2301 * `get_inventory()`: returns an `InvRef`
2302 * `get_wield_list()`: returns the name of the inventory list the wielded item is in
2303 * `get_wield_index()`: returns the index of the wielded item
2304 * `get_wielded_item()`: returns an `ItemStack`
2305 * `set_wielded_item(item)`: replaces the wielded item, returns `true` if successful
2306 * `set_armor_groups({group1=rating, group2=rating, ...})`
2307 * `set_animation({x=1,y=1}, frame_speed=15, frame_blend=0)`
2308 * `set_attach(parent, bone, position, rotation)`
2309     * `bone`: string
2310     * `position`: `{x=num, y=num, z=num}` (relative)
2311     * `rotation`: `{x=num, y=num, z=num}`
2312 * `set_detach()`
2313 * `set_bone_position(bone, position, rotation)`
2314     * `bone`: string
2315     * `position`: `{x=num, y=num, z=num}` (relative)
2316     * `rotation`: `{x=num, y=num, z=num}`
2317 * `set_properties(object property table)`
2318
2319 ##### LuaEntitySAO-only (no-op for other objects)
2320 * `setvelocity({x=num, y=num, z=num})`
2321 * `getvelocity()`: returns `{x=num, y=num, z=num}`
2322 * `setacceleration({x=num, y=num, z=num})`
2323 * `getacceleration()`: returns `{x=num, y=num, z=num}`
2324 * `setyaw(radians)`
2325 * `getyaw()`: returns number in radians
2326 * `settexturemod(mod)`
2327 * `setsprite(p={x=0,y=0}, num_frames=1, framelength=0.2,
2328   select_horiz_by_yawpitch=false)`
2329     * Select sprite from spritesheet with optional animation and DM-style
2330       texture selection based on yaw relative to camera
2331 * `get_entity_name()` (**Deprecated**: Will be removed in a future version)
2332 * `get_luaentity()`
2333
2334 ##### Player-only (no-op for other objects)
2335 * `is_player()`: true for players, false for others
2336 * `get_player_name()`: returns `""` if is not a player
2337 * `get_look_dir()`: get camera direction as a unit vector
2338 * `get_look_pitch()`: pitch in radians
2339 * `get_look_yaw()`: yaw in radians (wraps around pretty randomly as of now)
2340 * `set_look_pitch(radians)`: sets look pitch
2341 * `set_look_yaw(radians)`: sets look yaw
2342 * `get_breath()`: returns players breath
2343 * `set_breath(value)`: sets players breath
2344      * values:
2345         * `0`: player is drowning,
2346         * `1`-`10`: remaining number of bubbles
2347         * `11`: bubbles bar is not shown
2348 * `set_inventory_formspec(formspec)`
2349     * Redefine player's inventory form
2350     * Should usually be called in on_joinplayer
2351 * `get_inventory_formspec()`: returns a formspec string
2352 * `get_player_control()`: returns table with player pressed keys
2353     * `{jump=bool,right=bool,left=bool,LMB=bool,RMB=bool,sneak=bool,aux1=bool,down=bool,up=bool}`
2354 * `get_player_control_bits()`: returns integer with bit packed player pressed keys
2355     * bit nr/meaning: 0/up ,1/down ,2/left ,3/right ,4/jump ,5/aux1 ,6/sneak ,7/LMB ,8/RMB
2356 * `set_physics_override(override_table)`
2357     * `override_table` is a table with the following fields:
2358         * `speed`: multiplier to default walking speed value (default: `1`)
2359         * `jump`: multiplier to default jump value (default: `1`)
2360         * `gravity`: multiplier to default gravity value (default: `1`)
2361         * `sneak`: whether player can sneak (default: `true`)
2362         * `sneak_glitch`: whether player can use the sneak glitch (default: `true`)
2363 * `hud_add(hud definition)`: add a HUD element described by HUD def, returns ID number on success
2364 * `hud_remove(id)`: remove the HUD element of the specified id
2365 * `hud_change(id, stat, value)`: change a value of a previously added HUD element
2366     * element `stat` values: `position`, `name`, `scale`, `text`, `number`, `item`, `dir`
2367 * `hud_get(id)`: gets the HUD element definition structure of the specified ID
2368 * `hud_set_flags(flags)`: sets specified HUD flags to `true`/`false`
2369     * `flags`: (is visible) `hotbar`, `healthbar`, `crosshair`, `wielditem`
2370     * pass a table containing a `true`/`false` value of each flag to be set or unset
2371     * if a flag equals `nil`, the flag is not modified
2372 * `hud_get_flags()`: returns a table containing status of hud flags
2373     * returns `{ hotbar=true, healthbar=true, crosshair=true, wielditem=true, breathbar=true }`
2374 * `hud_set_hotbar_itemcount(count)`: sets number of items in builtin hotbar
2375     * `count`: number of items, must be between `1` and `23`
2376 * `hud_set_hotbar_image(texturename)`
2377     * sets background image for hotbar
2378 * `hud_set_hotbar_selected_image(texturename)`
2379     * sets image for selected item of hotbar
2380 * `hud_replace_builtin(name, hud_definition)`
2381     * replace definition of a builtin hud element
2382     * `name`: `"breath"` or `"health"`
2383     * `hud_definition`: definition to replace builtin definition
2384 * `set_sky(bgcolor, type, {texture names})`
2385     * `bgcolor`: `{r=0...255, g=0...255, b=0...255}` or `nil`, defaults to white
2386     * Available types:
2387         * `"regular"`: Uses 0 textures, `bgcolor` ignored
2388         * `"skybox"`: Uses 6 textures, `bgcolor` used
2389         * `"plain"`: Uses 0 textures, `bgcolor` used
2390     * **Note**: currently does not work directly in `on_joinplayer`; use
2391       `minetest.after(0)` in there.
2392 * `override_day_night_ratio(ratio or nil)`
2393     * `0`...`1`: Overrides day-night ratio, controlling sunlight to a specific amount
2394     * `nil`: Disables override, defaulting to sunlight based on day-night cycle
2395 * `set_local_animation({x=0, y=79}, {x=168, y=187}, {x=189, y=198}, {x=200, y=219}, frame_speed=30)`:
2396   set animation for player model in third person view
2397     * stand/idle animation key frames
2398     * walk animation key frames
2399     * dig animation key frames
2400     * walk+dig animation key frames
2401     * animation frame speed
2402 * `set_eye_offset({x=0,y=0,z=0},{x=0,y=0,z=0})`: defines offset value for camera per player
2403     * in first person view
2404     * in third person view (max. values `{x=-10/10,y=-10,15,z=-5/5}`)
2405
2406 ### `InvRef`
2407 An `InvRef` is a reference to an inventory.
2408
2409 #### Methods
2410 * `is_empty(listname)`: return `true` if list is empty
2411 * `get_size(listname)`: get size of a list
2412 * `set_size(listname, size)`: set size of a list
2413     * returns `false` on error (e.g. invalid `listname` or `size`)
2414 * `get_width(listname)`: get width of a list
2415 * `set_width(listname, width)`: set width of list; currently used for crafting
2416 * `get_stack(listname, i)`: get a copy of stack index `i` in list
2417 * `set_stack(listname, i, stack)`: copy `stack` to index `i` in list
2418 * `get_list(listname)`: return full list
2419 * `set_list(listname, list)`: set full list (size will not change)
2420 * `get_lists()`: returns list of inventory lists
2421 * `set_lists(lists)`: sets inventory lists (size will not change)
2422 * `add_item(listname, stack)`: add item somewhere in list, returns leftover `ItemStack`
2423 * `room_for_item(listname, stack):` returns `true` if the stack of items
2424   can be fully added to the list
2425 * `contains_item(listname, stack)`: returns `true` if the stack of items
2426   can be fully taken from the list
2427 * `remove_item(listname, stack)`: take as many items as specified from the list,
2428   returns the items that were actually removed (as an `ItemStack`) -- note that
2429   any item metadata is ignored, so attempting to remove a specific unique
2430   item this way will likely remove the wrong one -- to do that use `set_stack`
2431   with an empty `ItemStack`
2432 * `get_location()`: returns a location compatible to `minetest.get_inventory(location)`
2433     * returns `{type="undefined"}` in case location is not known
2434
2435 ### `ItemStack`
2436 An `ItemStack` is a stack of items.
2437
2438 It can be created via `ItemStack(x)`, where x is an `ItemStack`,
2439 an itemstring, a table or `nil`.
2440
2441 #### Methods
2442 * `is_empty()`: Returns `true` if stack is empty.
2443 * `get_name()`: Returns item name (e.g. `"default:stone"`).
2444 * `set_name(item_name)`: Returns boolean success.
2445   Clears item on failure.
2446 * `get_count()`: Returns number of items on the stack.
2447 * `set_count(count)`
2448 * `get_wear()`: Returns tool wear (`0`-`65535`), `0` for non-tools.
2449 * `set_wear(wear)`: Returns boolean success.
2450   Clears item on failure.
2451 * `get_metadata()`: Returns metadata (a string attached to an item stack).
2452 * `set_metadata(metadata)`: Returns true.
2453 * `clear()`: removes all items from the stack, making it empty.
2454 * `replace(item)`: replace the contents of this stack.
2455     * `item` can also be an itemstring or table.
2456 * `to_string()`: Returns the stack in itemstring form.
2457 * `to_table()`: Returns the stack in Lua table form.
2458 * `get_stack_max()`: Returns the maximum size of the stack (depends on the item).
2459 * `get_free_space()`: Returns `get_stack_max() - get_count()`.
2460 * `is_known()`: Returns `true` if the item name refers to a defined item type.
2461 * `get_definition()`: Returns the item definition table.
2462 * `get_tool_capabilities()`: Returns the digging properties of the item,
2463   or those of the hand if none are defined for this item type
2464 * `add_wear(amount)`: Increases wear by `amount` if the item is a tool.
2465 * `add_item(item)`: Put some item or stack onto this stack.
2466    Returns leftover `ItemStack`.
2467 * `item_fits(item)`: Returns `true` if item or stack can be fully added to
2468   this one.
2469 * `take_item(n=1)`: Take (and remove) up to `n` items from this stack.
2470   Returns taken `ItemStack`.
2471 * `peek_item(n=1)`: copy (don't remove) up to `n` items from this stack.
2472   Returns taken `ItemStack`.
2473
2474 ### `PseudoRandom`
2475 A pseudorandom number generator.
2476
2477 It can be created via `PseudoRandom(seed)`.
2478
2479 #### Methods
2480 * `next()`: return next integer random number [`0`...`32767`]
2481 * `next(min, max)`: return next integer random number [`min`...`max`]
2482     * `((max - min) == 32767) or ((max-min) <= 6553))` must be true
2483       due to the simple implementation making bad distribution otherwise.
2484
2485 ### `PerlinNoise`
2486 A perlin noise generator.
2487 It can be created via `PerlinNoise(seed, octaves, persistence, scale)`
2488 or `PerlinNoise(noiseparams)`.  
2489 Alternatively with `minetest.get_perlin(seeddiff, octaves, persistence, scale)`
2490 or `minetest.get_perlin(noiseparams)`.
2491
2492 #### Methods
2493 * `get2d(pos)`: returns 2D noise value at `pos={x=,y=}`
2494 * `get3d(pos)`: returns 3D noise value at `pos={x=,y=,z=}`
2495
2496 ### `PerlinNoiseMap`
2497 A fast, bulk perlin noise generator.
2498
2499 It can be created via `PerlinNoiseMap(noiseparams, size)` or
2500 `minetest.get_perlin_map(noiseparams, size)`.
2501
2502 Format of `size` is `{x=dimx, y=dimy, z=dimz}`.  The `z` conponent is ommitted
2503 for 2D noise, and it must be must be larger than 1 for 3D noise (otherwise
2504 `nil` is returned).
2505
2506 #### Methods
2507 * `get2dMap(pos)`: returns a `<size.x>` times `<size.y>` 2D array of 2D noise
2508   with values starting at `pos={x=,y=}`
2509 * `get3dMap(pos)`: returns a `<size.x>` times `<size.y>` times `<size.z>` 3D array
2510   of 3D noise with values starting at `pos={x=,y=,z=}`
2511 * `get2dMap_flat(pos)`: returns a flat `<size.x * size.y>` element array of 2D noise
2512   with values starting at `pos={x=,y=}`
2513 * `get3dMap_flat(pos)`: Same as `get2dMap_flat`, but 3D noise
2514
2515 ### `VoxelManip`
2516 An interface to the `MapVoxelManipulator` for Lua.
2517
2518 It can be created via `VoxelManip()` or `minetest.get_voxel_manip()`.
2519 The map will be pre-loaded if two positions are passed to either.
2520
2521 #### Methods
2522 * `read_from_map(p1, p2)`:  Reads a chunk of map from the map containing the region formed by `p1` and `p2`.
2523     * returns actual emerged `pmin`, actual emerged `pmax`
2524 * `write_to_map()`: Writes the data loaded from the `VoxelManip` back to the map.
2525     * **important**: data must be set using `VoxelManip:set_data` before calling this
2526 * `get_node_at(pos)`: Returns a `MapNode` table of the node currently loaded in the `VoxelManip` at that position
2527 * `set_node_at(pos, node)`: Sets a specific `MapNode` in the `VoxelManip` at that position
2528 * `get_data()`: Gets the data read into the `VoxelManip` object
2529     * returns raw node data is in the form of an array of node content IDs
2530 * `set_data(data)`: Sets the data contents of the `VoxelManip` object
2531 * `update_map()`: Update map after writing chunk back to map.
2532     * To be used only by `VoxelManip` objects created by the mod itself; not a `VoxelManip` that was
2533       retrieved from `minetest.get_mapgen_object`
2534 * `set_lighting(light, p1, p2)`: Set the lighting within the `VoxelManip` to a uniform value
2535     * `light` is a table, `{day=<0...15>, night=<0...15>}`
2536     * To be used only by a `VoxelManip` object from `minetest.get_mapgen_object`
2537     * (`p1`, `p2`) is the area in which lighting is set; defaults to the whole area if left out
2538 * `get_light_data()`: Gets the light data read into the `VoxelManip` object
2539     * Returns an array (indices 1 to volume) of integers ranging from `0` to `255`
2540     * Each value is the bitwise combination of day and night light values (`0` to `15` each)
2541     * `light = day + (night * 16)`
2542 * `set_light_data(light_data)`: Sets the `param1` (light) contents of each node in the `VoxelManip`
2543     * expects lighting data in the same format that `get_light_data()` returns
2544 * `get_param2_data()`: Gets the raw `param2` data read into the `VoxelManip` object
2545 * `set_param2_data(param2_data)`: Sets the `param2` contents of each node in the `VoxelManip`
2546 * `calc_lighting(p1, p2)`:  Calculate lighting within the `VoxelManip`
2547     * To be used only by a `VoxelManip` object from `minetest.get_mapgen_object`
2548     * (`p1`, `p2`) is the area in which lighting is set; defaults to the whole area if left out
2549 * `update_liquids()`: Update liquid flow
2550 * `was_modified()`: Returns `true` or `false` if the data in the voxel manipulator had been modified since
2551   the last read from map, due to a call to `minetest.set_data()` on the loaded area elsewhere
2552 * `get_emerged_area()`: Returns actual emerged minimum and maximum positions.
2553
2554 ### `VoxelArea`
2555 A helper class for voxel areas.
2556 It can be created via `VoxelArea:new{MinEdge=pmin, MaxEdge=pmax}`.
2557 The coordinates are *inclusive*, like most other things in Minetest.
2558
2559 #### Methods
2560 * `getExtent()`: returns a 3D vector containing the size of the area formed by `MinEdge` and `MaxEdge`
2561 * `getVolume()`: returns the volume of the area formed by `MinEdge` and `MaxEdge`
2562 * `index(x, y, z)`: returns the index of an absolute position in a flat array starting at `1`
2563     * useful for things like `VoxelManip`, raw Schematic specifiers, `PerlinNoiseMap:get2d`/`3dMap`, and so on
2564 * `indexp(p)`: same as above, except takes a vector
2565 * `position(i)`: returns the absolute position vector corresponding to index `i`
2566 * `contains(x, y, z)`: check if (`x`,`y`,`z`) is inside area formed by `MinEdge` and `MaxEdge`
2567 * `containsp(p)`: same as above, except takes a vector
2568 * `containsi(i)`: same as above, except takes an index `i`
2569 * `iter(minx, miny, minz, maxx, maxy, maxz)`: returns an iterator that returns indices
2570     * from (`minx`,`miny`,`minz`) to (`maxx`,`maxy`,`maxz`) in the order of `[z [y [x]]]`
2571 * `iterp(minp, maxp)`: same as above, except takes a vector
2572
2573 ### `Settings`
2574 An interface to read config files in the format of `minetest.conf`.
2575
2576 It can be created via `Settings(filename)`.
2577
2578 #### Methods
2579 * `get(key)`: returns a value
2580 * `get_bool(key)`: returns a boolean
2581 * `set(key, value)`
2582 * `remove(key)`: returns a boolean (`true` for success)
2583 * `get_names()`: returns `{key1,...}`
2584 * `write()`: returns a boolean (`true` for success)
2585     * write changes to file
2586 * `to_table()`: returns `{[key1]=value1,...}`
2587
2588 Mapgen objects
2589 --------------
2590 A mapgen object is a construct used in map generation. Mapgen objects can be used by an `on_generate`
2591 callback to speed up operations by avoiding unnecessary recalculations; these can be retrieved using the
2592 `minetest.get_mapgen_object()` function. If the requested Mapgen object is unavailable, or
2593 `get_mapgen_object()` was called outside of an `on_generate()` callback, `nil` is returned.
2594
2595 The following Mapgen objects are currently available:
2596
2597 ### `voxelmanip`
2598 This returns three values; the `VoxelManip` object to be used, minimum and maximum emerged position, in that
2599 order. All mapgens support this object.
2600
2601 ### `heightmap`
2602 Returns an array containing the y coordinates of the ground levels of nodes in the most recently
2603 generated chunk by the current mapgen.
2604
2605 ### `biomemap`
2606 Returns an array containing the biome IDs of nodes in the most recently generated chunk by the
2607 current mapgen.
2608
2609 ### `heatmap`
2610 Returns an array containing the temperature values of nodes in the most recently generated chunk by
2611 the current mapgen.
2612
2613 ### `humiditymap`
2614 Returns an array containing the humidity values of nodes in the most recently generated chunk by the
2615 current mapgen.
2616
2617 ### `gennotify`
2618 Returns a table mapping requested generation notification types to arrays of positions at which the
2619 corresponding generated structures are located at within the current chunk. To set the capture of positions
2620 of interest to be recorded on generate, use `minetest.set_gen_notify()`.
2621
2622 Possible fields of the table returned are:
2623
2624 * `dungeon`
2625 * `temple`
2626 * `cave_begin`
2627 * `cave_end`
2628 * `large_cave_begin`
2629 * `large_cave_end`
2630 * `decoration`
2631
2632 Decorations have a key in the format of `"decoration#id"`, where `id` is the numeric unique decoration ID.
2633
2634 Registered entities
2635 -------------------
2636 * Functions receive a "luaentity" as `self`:
2637     * It has the member `.name`, which is the registered name `("mod:thing")`
2638     * It has the member `.object`, which is an `ObjectRef` pointing to the object
2639     * The original prototype stuff is visible directly via a metatable
2640 * Callbacks:
2641     * `on_activate(self, staticdata)`
2642         * Called when the object is instantiated.
2643     * `on_step(self, dtime)`
2644         * Called on every server tick, after movement and collision processing.
2645           `dtime` is usually 0.1 seconds, as per the `dedicated_server_step` setting
2646           `in minetest.conf`.
2647     * `on_punch(self, puncher, time_from_last_punch, tool_capabilities, dir`
2648         * Called when somebody punches the object.
2649         * Note that you probably want to handle most punches using the
2650           automatic armor group system.
2651           * `puncher`: an `ObjectRef` (can be `nil`)
2652           * `time_from_last_punch`: Meant for disallowing spamming of clicks (can be `nil`)
2653           * `tool_capabilities`: capability table of used tool (can be `nil`)
2654           * `dir`: unit vector of direction of punch. Always defined. Points from
2655             the puncher to the punched.
2656     * `on_rightclick(self, clicker)`
2657     * `get_staticdata(self)`
2658         * Should return a string that will be passed to `on_activate` when
2659           the object is instantiated the next time.
2660
2661 L-system trees
2662 --------------
2663
2664 ### Tree definition
2665
2666     treedef={
2667         axiom,         --string  initial tree axiom
2668         rules_a,       --string  rules set A
2669         rules_b,       --string  rules set B
2670         rules_c,       --string  rules set C
2671         rules_d,       --string  rules set D
2672         trunk,         --string  trunk node name
2673         leaves,        --string  leaves node name
2674         leaves2,       --string  secondary leaves node name
2675         leaves2_chance,--num     chance (0-100) to replace leaves with leaves2
2676         angle,         --num     angle in deg
2677         iterations,    --num     max # of iterations, usually 2 -5
2678         random_level,  --num     factor to lower nr of iterations, usually 0 - 3
2679         trunk_type,    --string  single/double/crossed) type of trunk: 1 node, 2x2 nodes or 3x3 in cross shape
2680         thin_branches, --boolean true -> use thin (1 node) branches
2681         fruit,         --string  fruit node name
2682         fruit_chance,  --num     chance (0-100) to replace leaves with fruit node
2683         seed,          --num     random seed; if no seed is provided, the engine will create one
2684     }
2685
2686 ### Key for Special L-System Symbols used in Axioms
2687
2688 * `G`: move forward one unit with the pen up
2689 * `F`: move forward one unit with the pen down drawing trunks and branches
2690 * `f`: move forward one unit with the pen down drawing leaves (100% chance)
2691 * `T`: move forward one unit with the pen down drawing trunks only
2692 * `R`: move forward one unit with the pen down placing fruit
2693 * `A`: replace with rules set A
2694 * `B`: replace with rules set B
2695 * `C`: replace with rules set C
2696 * `D`: replace with rules set D
2697 * `a`: replace with rules set A, chance 90%
2698 * `b`: replace with rules set B, chance 80%
2699 * `c`: replace with rules set C, chance 70%
2700 * `d`: replace with rules set D, chance 60%
2701 * `+`: yaw the turtle right by `angle` parameter
2702 * `-`: yaw the turtle left by `angle` parameter
2703 * `&`: pitch the turtle down by `angle` parameter
2704 * `^`: pitch the turtle up by `angle` parameter
2705 * `/`: roll the turtle to the right by `angle` parameter
2706 * `*`: roll the turtle to the left by `angle` parameter
2707 * `[`: save in stack current state info
2708 * `]`: recover from stack state info
2709
2710 ### Example
2711 Spawn a small apple tree:
2712
2713     pos = {x=230,y=20,z=4}
2714     apple_tree={
2715         axiom="FFFFFAFFBF",
2716         rules_a="[&&&FFFFF&&FFFF][&&&++++FFFFF&&FFFF][&&&----FFFFF&&FFFF]",
2717         rules_b="[&&&++FFFFF&&FFFF][&&&--FFFFF&&FFFF][&&&------FFFFF&&FFFF]",
2718         trunk="default:tree",
2719         leaves="default:leaves",
2720         angle=30,
2721         iterations=2,
2722         random_level=0,
2723         trunk_type="single",
2724         thin_branches=true,
2725         fruit_chance=10,
2726         fruit="default:apple"
2727     }
2728     minetest.spawn_tree(pos,apple_tree)
2729
2730 Definition tables
2731 -----------------
2732
2733 ### Object Properties
2734
2735     {
2736         hp_max = 1,
2737         physical = true,
2738         collide_with_objects = true, -- collide with other objects if physical=true
2739         weight = 5,
2740         collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
2741         visual = "cube"/"sprite"/"upright_sprite"/"mesh"/"wielditem",
2742         visual_size = {x=1, y=1},
2743         mesh = "model",
2744         textures = {}, -- number of required textures depends on visual
2745         colors = {}, -- number of required colors depends on visual
2746         spritediv = {x=1, y=1},
2747         initial_sprite_basepos = {x=0, y=0},
2748         is_visible = true,
2749         makes_footstep_sound = false,
2750         automatic_rotate = false,
2751         stepheight = 0,
2752         automatic_face_movement_dir = 0.0,
2753     --  ^ automatically set yaw to movement direction; offset in degrees; false to disable
2754     }
2755
2756 ### Entity definition (`register_entity`)
2757
2758     {
2759     --  Deprecated: Everything in object properties is read directly from here
2760
2761         initial_properties = --[[<initial object properties>]],
2762
2763         on_activate = function(self, staticdata, dtime_s),
2764         on_step = function(self, dtime),
2765         on_punch = function(self, hitter),
2766         on_rightclick = function(self, clicker),
2767         get_staticdata = function(self),
2768     --  ^ Called sometimes; the string returned is passed to on_activate when
2769     --    the entity is re-activated from static state
2770
2771         -- Also you can define arbitrary member variables here
2772         myvariable = whatever,
2773     }
2774
2775 ### ABM (ActiveBlockModifier) definition (`register_abm`)
2776
2777     {
2778     --  In the following two fields, also group:groupname will work.
2779         nodenames = {"default:lava_source"},
2780         neighbors = {"default:water_source", "default:water_flowing"}, -- (any of these)
2781     --  ^ If left out or empty, any neighbor will do
2782         interval = 1.0, -- (operation interval)
2783         chance = 1, -- (chance of trigger is 1.0/this)
2784         action = func(pos, node, active_object_count, active_object_count_wider),
2785     }
2786
2787 ### Item definition (`register_node`, `register_craftitem`, `register_tool`)
2788
2789     {
2790         description = "Steel Axe",
2791         groups = {}, -- key=name, value=rating; rating=1..3.
2792                         if rating not applicable, use 1.
2793                         e.g. {wool=1, fluffy=3}
2794                             {soil=2, outerspace=1, crumbly=1}
2795                             {bendy=2, snappy=1},
2796                             {hard=1, metal=1, spikes=1}
2797         inventory_image = "default_tool_steelaxe.png",
2798         wield_image = "",
2799         wield_scale = {x=1,y=1,z=1},
2800         stack_max = 99,
2801         range = 4.0,
2802         liquids_pointable = false,
2803         tool_capabilities = {
2804             full_punch_interval = 1.0,
2805             max_drop_level=0,
2806             groupcaps={
2807                 -- For example:
2808                 snappy={times={[2]=0.80, [3]=0.40}, maxwear=0.05, maxlevel=1},
2809                 choppy={times={[3]=0.90}, maxwear=0.05, maxlevel=0}
2810             },
2811             damage_groups = {groupname=damage},
2812         },
2813         node_placement_prediction = nil,
2814         --[[
2815         ^ If nil and item is node, prediction is made automatically
2816         ^ If nil and item is not a node, no prediction is made
2817         ^ If "" and item is anything, no prediction is made
2818         ^ Otherwise should be name of node which the client immediately places
2819           on ground when the player places the item. Server will always update
2820           actual result to client in a short moment.
2821         ]]
2822         sound = {
2823             place = --[[<SimpleSoundSpec>]],
2824         },
2825
2826         on_place = func(itemstack, placer, pointed_thing),
2827         --[[
2828         ^ Shall place item and return the leftover itemstack
2829         ^ default: minetest.item_place ]]
2830         on_drop = func(itemstack, dropper, pos),
2831         --[[
2832         ^ Shall drop item and return the leftover itemstack
2833         ^ default: minetest.item_drop ]]
2834         on_use = func(itemstack, user, pointed_thing),
2835         --[[
2836         ^  default: nil
2837         ^ Function must return either nil if no item shall be removed from
2838           inventory, or an itemstack to replace the original itemstack.
2839             e.g. itemstack:take_item(); return itemstack
2840         ^ Otherwise, the function is free to do what it wants.
2841         ^ The default functions handle regular use cases.
2842         ]]
2843         after_use = func(itemstack, user, node, digparams),
2844         --[[
2845         ^  default: nil
2846         ^ If defined, should return an itemstack and will be called instead of
2847           wearing out the tool. If returns nil, does nothing.
2848           If after_use doesn't exist, it is the same as:
2849             function(itemstack, user, node, digparams)
2850               itemstack:add_wear(digparams.wear)
2851               return itemstack
2852             end
2853         ]]
2854     }
2855
2856 ### Tile definition
2857 * `"image.png"`
2858 * `{name="image.png", animation={Tile Animation definition}}`
2859 * `{name="image.png", backface_culling=bool}`
2860     * backface culling only supported in special tiles
2861 * deprecated, yet still supported field names:
2862     * `image` (name)
2863
2864 ### Tile animation definition
2865 * `{type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}`
2866
2867 ### Node definition (`register_node`)
2868
2869     {
2870         -- <all fields allowed in item definitions>,
2871
2872         drawtype = "normal", -- See "Node drawtypes"
2873         visual_scale = 1.0, --[[
2874         ^ Supported for drawtypes "plantlike", "signlike", "torchlike", "mesh".
2875         ^ For plantlike, the image will start at the bottom of the node; for the
2876         ^ other drawtypes, the image will be centered on the node.
2877         ^ Note that positioning for "torchlike" may still change. ]]
2878         tiles = {tile definition 1, def2, def3, def4, def5, def6}, --[[
2879         ^ Textures of node; +Y, -Y, +X, -X, +Z, -Z (old field name: tile_images)
2880         ^ List can be shortened to needed length ]]
2881         special_tiles = {tile definition 1, Tile definition 2}, --[[
2882         ^ Special textures of node; used rarely (old field name: special_materials)
2883         ^ List can be shortened to needed length ]]
2884         alpha = 255,
2885         use_texture_alpha = false, -- Use texture's alpha channel
2886         post_effect_color = {a=0, r=0, g=0, b=0}, -- If player is inside node
2887         paramtype = "none", -- See "Nodes" --[[
2888         ^ paramtype = "light" allows light to propagate from or through the node with light value
2889         ^ falling by 1 per node. This line is essential for a light source node to spread its light. ]]
2890         paramtype2 = "none", -- See "Nodes"
2891         is_ground_content = true, -- If false, the cave generator will not carve through this
2892         sunlight_propagates = false, -- If true, sunlight will go infinitely through this
2893         walkable = true, -- If true, objects collide with node
2894         pointable = true, -- If true, can be pointed at
2895         diggable = true, -- If false, can never be dug
2896         climbable = false, -- If true, can be climbed on (ladder)
2897         buildable_to = false, -- If true, placed nodes can replace this node
2898         liquidtype = "none", -- "none"/"source"/"flowing"
2899         liquid_alternative_flowing = "", -- Flowing version of source liquid
2900         liquid_alternative_source = "", -- Source version of flowing liquid
2901         liquid_viscosity = 0, -- Higher viscosity = slower flow (max. 7)
2902         liquid_renewable = true, -- Can new liquid source be created by placing two or more sources nearby?
2903         leveled = 0, --[[
2904         ^ Block contains level in param2. Value is default level, used for snow.
2905         ^ Don't forget to use "leveled" type nodebox. ]]
2906         liquid_range = 8, -- number of flowing nodes around source (max. 8)
2907         drowning = 0, -- Player will take this amount of damage if no bubbles are left
2908         light_source = 0, -- Amount of light emitted by node
2909         damage_per_second = 0, -- If player is inside node, this damage is caused
2910         node_box = {type="regular"}, -- See "Node boxes"
2911         mesh = "model",
2912         selection_box = {type="regular"}, -- See "Node boxes" --[[
2913         ^ If drawtype "nodebox" is used and selection_box is nil, then node_box is used. ]]
2914         legacy_facedir_simple = false, -- Support maps made in and before January 2012
2915         legacy_wallmounted = false, -- Support maps made in and before January 2012
2916         sounds = {
2917             footstep = <SimpleSoundSpec>,
2918             dig = <SimpleSoundSpec>, -- "__group" = group-based sound (default)
2919             dug = <SimpleSoundSpec>,
2920             place = <SimpleSoundSpec>,
2921         },
2922         drop = "",  -- Name of dropped node when dug. Default is the node itself.
2923         -- Alternatively:
2924         drop = {
2925             max_items = 1,  -- Maximum number of items to drop.
2926             items = { -- Choose max_items randomly from this list.
2927                 {
2928                     items = {"foo:bar", "baz:frob"},  -- Choose one item randomly from this list.
2929                     rarity = 1,  -- Probability of getting is 1 / rarity.
2930                 },
2931             },
2932         },
2933
2934         on_construct = func(pos), --[[
2935         ^ Node constructor; always called after adding node
2936         ^ Can set up metadata and stuff like that
2937         ^ default: nil ]]
2938         on_destruct = func(pos), --[[
2939         ^ Node destructor; always called before removing node
2940         ^ default: nil ]]
2941         after_destruct = func(pos, oldnode), --[[
2942         ^ Node destructor; always called after removing node
2943         ^ default: nil ]]
2944
2945         after_place_node = func(pos, placer, itemstack, pointed_thing) --[[
2946         ^ Called after constructing node when node was placed using
2947           minetest.item_place_node / minetest.place_node
2948         ^ If return true no item is taken from itemstack
2949         ^ default: nil ]]
2950         after_dig_node = func(pos, oldnode, oldmetadata, digger), --[[
2951         ^ oldmetadata is in table format
2952         ^ Called after destructing node when node was dug using
2953           minetest.node_dig / minetest.dig_node
2954         ^ default: nil ]]
2955         can_dig = function(pos,player) --[[
2956         ^ returns true if node can be dug, or false if not
2957         ^ default: nil ]]
2958
2959         on_punch = func(pos, node, puncher, pointed_thing), --[[
2960         ^ default: minetest.node_punch
2961         ^ By default: Calls minetest.register_on_punchnode callbacks ]]
2962         on_rightclick = func(pos, node, clicker, itemstack, pointed_thing), --[[
2963         ^ default: nil
2964         ^ if defined, itemstack will hold clicker's wielded item
2965         ^ Shall return the leftover itemstack
2966         ^ Note: pointed_thing can be nil, if a mod calls this function ]]
2967
2968         on_dig = func(pos, node, digger), --[[
2969         ^ default: minetest.node_dig
2970         ^ By default: checks privileges, wears out tool and removes node ]]
2971
2972         on_timer = function(pos,elapsed), --[[
2973         ^ default: nil
2974         ^ called by NodeTimers, see minetest.get_node_timer and NodeTimerRef
2975         ^ elapsed is the total time passed since the timer was started
2976         ^ return true to run the timer for another cycle with the same timeout value ]]
2977
2978         on_receive_fields = func(pos, formname, fields, sender), --[[
2979         ^ fields = {name1 = value1, name2 = value2, ...}
2980         ^ Called when an UI form (e.g. sign text input) returns data
2981         ^ default: nil ]]
2982
2983         allow_metadata_inventory_move = func(pos, from_list, from_index,
2984                 to_list, to_index, count, player), --[[
2985         ^ Called when a player wants to move items inside the inventory
2986         ^ Return value: number of items allowed to move ]]
2987
2988         allow_metadata_inventory_put = func(pos, listname, index, stack, player), --[[
2989         ^ Called when a player wants to put something into the inventory
2990         ^ Return value: number of items allowed to put
2991         ^ Return value: -1: Allow and don't modify item count in inventory ]]
2992
2993         allow_metadata_inventory_take = func(pos, listname, index, stack, player), --[[
2994         ^ Called when a player wants to take something out of the inventory
2995         ^ Return value: number of items allowed to take
2996         ^ Return value: -1: Allow and don't modify item count in inventory ]]
2997
2998         on_metadata_inventory_move = func(pos, from_list, from_index,
2999                 to_list, to_index, count, player),
3000         on_metadata_inventory_put = func(pos, listname, index, stack, player),
3001         on_metadata_inventory_take = func(pos, listname, index, stack, player), --[[
3002         ^ Called after the actual action has happened, according to what was allowed.
3003         ^ No return value ]]
3004
3005         on_blast = func(pos, intensity), --[[
3006         ^ intensity: 1.0 = mid range of regular TNT
3007         ^ If defined, called when an explosion touches the node, instead of
3008           removing the node ]]
3009     }
3010
3011 ### Recipe for `register_craft` (shaped)
3012
3013     {
3014         output = 'default:pick_stone',
3015         recipe = {
3016             {'default:cobble', 'default:cobble', 'default:cobble'},
3017             {'', 'default:stick', ''},
3018             {'', 'default:stick', ''}, -- Also groups; e.g. 'group:crumbly'
3019         },
3020         replacements = --[[<optional list of item pairs,
3021                         replace one input item with another item on crafting>]]
3022     }
3023
3024 ### Recipe for `register_craft` (shapeless)
3025
3026     {
3027        type = "shapeless",
3028        output = 'mushrooms:mushroom_stew',
3029        recipe = {
3030            "mushrooms:bowl",
3031            "mushrooms:mushroom_brown",
3032            "mushrooms:mushroom_red",
3033        },
3034        replacements = --[[<optional list of item pairs,
3035                        replace one input item with another item on crafting>]]
3036    }
3037
3038 ### Recipe for `register_craft` (tool repair)
3039
3040     {
3041         type = "toolrepair",
3042         additional_wear = -0.02,
3043     }
3044
3045 ### Recipe for `register_craft` (cooking)
3046
3047     {
3048         type = "cooking",
3049         output = "default:glass",
3050         recipe = "default:sand",
3051         cooktime = 3,
3052     }
3053
3054 ### Recipe for `register_craft` (furnace fuel)
3055
3056     {
3057         type = "fuel",
3058         recipe = "default:leaves",
3059         burntime = 1,
3060     }
3061
3062 ### Ore definition (`register_ore`)
3063
3064     {
3065         ore_type = "scatter", -- See "Ore types"
3066         ore = "default:stone_with_coal",
3067         wherein = "default:stone",
3068     --  ^ a list of nodenames is supported too
3069         clust_scarcity = 8*8*8,
3070     --  ^ Ore has a 1 out of clust_scarcity chance of spawning in a node
3071     --  ^ This value should be *MUCH* higher than your intuition might tell you!
3072         clust_num_ores = 8,
3073     --  ^ Number of ores in a cluster
3074         clust_size = 3,
3075     --  ^ Size of the bounding box of the cluster
3076     --  ^ In this example, there is a 3x3x3 cluster where 8 out of the 27 nodes are coal ore
3077         y_min = -31000,
3078         y_max = 64,
3079         flags = "",
3080     --  ^ Attributes for this ore generation
3081         noise_threshhold = 0.5,
3082     --  ^ If noise is above this threshold, ore is placed.  Not needed for a uniform distribution
3083         noise_params = {offset=0, scale=1, spread={x=100, y=100, z=100}, seed=23, octaves=3, persist=0.70}
3084     --  ^ NoiseParams structure describing the perlin noise used for ore distribution.
3085     --  ^ Needed for sheet ore_type.  Omit from scatter ore_type for a uniform ore distribution
3086         random_factor = 1.0,
3087     --  ^ Multiplier of the randomness contribution to the noise value at any
3088     --   given point to decide if ore should be placed.  Set to 0 for solid veins.
3089     --  ^ This parameter is only valid for ore_type == "vein".
3090     }
3091
3092 ### Decoration definition (`register_decoration`)
3093
3094     {
3095         deco_type = "simple", -- See "Decoration types"
3096         place_on = "default:dirt_with_grass",
3097     --  ^ Node that decoration can be placed on
3098         sidelen = 8,
3099     --  ^ Size of divisions made in the chunk being generated.
3100     --  ^ If the chunk size is not evenly divisible by sidelen, sidelen is made equal to the chunk size.
3101         fill_ratio = 0.02,
3102     --  ^ Ratio of the area to be uniformly filled by the decoration.
3103     --  ^ Used only if noise_params is not specified.
3104         noise_params = {offset=0, scale=.45, spread={x=100, y=100, z=100}, seed=354, octaves=3, persist=0.7},
3105     --  ^ NoiseParams structure describing the perlin noise used for decoration distribution.
3106     --  ^ The result of this is multiplied by the 2d area of the division being decorated.
3107         biomes = {"Oceanside", "Hills", "Plains"},
3108     --  ^ List of biomes in which this decoration occurs.  Occurs in all biomes if this is omitted,
3109     --  ^ and ignored if the Mapgen being used does not support biomes.
3110         y_min = -31000
3111         y_max = 31000
3112     -- ^ Minimum and maximum `y` positions these decorations can be generated at.
3113     -- ^ This parameter refers to the `y` position of the decoration base, so
3114     --   the actual maximum height would be `height_max + size.Y`.
3115
3116         ----- Simple-type parameters
3117         decoration = "default:grass",
3118     --  ^ The node name used as the decoration.
3119     --  ^ If instead a list of strings, a randomly selected node from the list is placed as the decoration.
3120         height = 1,
3121     --  ^ Number of nodes high the decoration is made.
3122     --  ^ If height_max is not 0, this is the lower bound of the randomly selected height.
3123         height_max = 0,
3124     --      ^ Number of nodes the decoration can be at maximum.
3125     --  ^ If absent, the parameter 'height' is used as a constant.
3126         spawn_by = "default:water",
3127     --  ^ Node that the decoration only spawns next to, in a 1-node square radius.
3128         num_spawn_by = 1,
3129     --  ^ Number of spawn_by nodes that must be surrounding the decoration position to occur.
3130     --  ^ If absent or -1, decorations occur next to any nodes.
3131
3132         ----- Schematic-type parameters
3133         schematic = "foobar.mts",
3134     --  ^ If schematic is a string, it is the filepath relative to the current working directory of the
3135     --  ^ specified Minetest schematic file.
3136     --  ^  - OR -, could instead be a table containing two mandatory fields, size and data,
3137     --  ^ and an optional table yslice_prob:
3138         schematic = {
3139             size = {x=4, y=6, z=4},
3140             data = {
3141                 {name="cobble", param1=255, param2=0},
3142                 {name="dirt_with_grass", param1=255, param2=0},
3143                  ...
3144             },
3145             yslice_prob = {
3146                 {ypos=2, prob=128},
3147                 {ypos=5, prob=64},
3148                  ...
3149             },
3150         },
3151     --  ^ See 'Schematic specifier' for details.
3152         replacements = {["oldname"] = "convert_to", ...},
3153         flags = "place_center_x, place_center_z",
3154     --  ^ Flags for schematic decorations.  See 'Schematic attributes'.
3155         rotation = "90" -- rotate schematic 90 degrees on placement
3156     --  ^ Rotation can be "0", "90", "180", "270", or "random".
3157     }
3158
3159 ### Chat command definition (`register_chatcommand`)
3160
3161     {
3162         params = "<name> <privilege>", -- Short parameter description
3163         description = "Remove privilege from player", -- Full description
3164         privs = {privs=true}, -- Require the "privs" privilege to run
3165         func = function(name, param), -- Called when command is run.
3166                                       -- Returns boolean success and text output.
3167     }
3168
3169 ### Detached inventory callbacks
3170
3171     {
3172         allow_move = func(inv, from_list, from_index, to_list, to_index, count, player),
3173     --  ^ Called when a player wants to move items inside the inventory
3174     --  ^ Return value: number of items allowed to move
3175
3176         allow_put = func(inv, listname, index, stack, player),
3177     --  ^ Called when a player wants to put something into the inventory
3178     --  ^ Return value: number of items allowed to put
3179     --  ^ Return value: -1: Allow and don't modify item count in inventory
3180
3181         allow_take = func(inv, listname, index, stack, player),
3182     --  ^ Called when a player wants to take something out of the inventory
3183     --  ^ Return value: number of items allowed to take
3184     --  ^ Return value: -1: Allow and don't modify item count in inventory
3185
3186         on_move = func(inv, from_list, from_index, to_list, to_index, count, player),
3187         on_put = func(inv, listname, index, stack, player),
3188         on_take = func(inv, listname, index, stack, player),
3189     --  ^ Called after the actual action has happened, according to what was allowed.
3190     --  ^ No return value
3191     }
3192
3193 ### HUD Definition (`hud_add`, `hud_get`)
3194
3195     {
3196         hud_elem_type = "image", -- see HUD element types
3197     --  ^ type of HUD element, can be either of "image", "text", "statbar", or "inventory"
3198         position = {x=0.5, y=0.5},
3199     --  ^ Left corner position of element
3200         name = "<name>",
3201         scale = {x=2, y=2},
3202         text = "<text>",
3203         number = 2,
3204         item = 3,
3205     --  ^ Selected item in inventory.  0 for no item selected.
3206         direction = 0,
3207     --  ^ Direction: 0: left-right, 1: right-left, 2: top-bottom, 3: bottom-top
3208         alignment = {x=0, y=0},
3209     --  ^ See "HUD Element Types"
3210         offset = {x=0, y=0},
3211     --  ^ See "HUD Element Types"
3212         size = { x=100, y=100 },
3213     --  ^ Size of element in pixels
3214     }
3215
3216 ### Particle definition (`add_particle`)
3217
3218     {
3219         pos = {x=0, y=0, z=0},
3220         velocity = {x=0, y=0, z=0},
3221         acceleration = {x=0, y=0, z=0},
3222     --  ^ Spawn particle at pos with velocity and acceleration
3223         expirationtime = 1,
3224     --  ^ Disappears after expirationtime seconds
3225         size = 1,
3226         collisiondetection = false,
3227     --  ^ collisiondetection: if true collides with physical objects
3228         vertical = false,
3229     --  ^ vertical: if true faces player using y axis only
3230         texture = "image.png",
3231     --  ^ Uses texture (string)
3232         playername = "singleplayer"
3233     --  ^ optional, if specified spawns particle only on the player's client
3234     }
3235
3236 ### `ParticleSpawner` definition (`add_particlespawner`)
3237
3238     {
3239         amount = 1,
3240         time = 1,
3241     --  ^ If time is 0 has infinite lifespan and spawns the amount on a per-second base
3242         minpos = {x=0, y=0, z=0},
3243         maxpos = {x=0, y=0, z=0},
3244         minvel = {x=0, y=0, z=0},
3245         maxvel = {x=0, y=0, z=0},
3246         minacc = {x=0, y=0, z=0},
3247         maxacc = {x=0, y=0, z=0},
3248         minexptime = 1,
3249         maxexptime = 1,
3250         minsize = 1,
3251         maxsize = 1,
3252     --  ^ The particle's properties are random values in between the bounds:
3253     --  ^ minpos/maxpos, minvel/maxvel (velocity), minacc/maxacc (acceleration),
3254     --  ^ minsize/maxsize, minexptime/maxexptime (expirationtime)
3255         collisiondetection = false,
3256     --  ^ collisiondetection: if true uses collision detection
3257         vertical = false,
3258     --  ^ vertical: if true faces player using y axis only
3259         texture = "image.png",
3260     --  ^ Uses texture (string)
3261         playername = "singleplayer"
3262     --  ^ Playername is optional, if specified spawns particle only on the player's client
3263     }