mirror of
				https://github.com/luanti-org/luanti.git
				synced 2025-10-31 07:25:22 +01:00 
			
		
		
		
	Those functions are: * minetest.get_ban_list() * minetest.get_ban_description(ip_or_name) * minetest.ban_player(name) * minetest.unban_player_or_ip(ip_or_name)
		
			
				
	
	
		
			1491 lines
		
	
	
		
			55 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			1491 lines
		
	
	
		
			55 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| Minetest Lua Modding API Reference 0.4.0
 | |
| ==========================================
 | |
| More information at http://c55.me/minetest/
 | |
| 
 | |
| Introduction
 | |
| -------------
 | |
| Content and functionality can be added to Minetest 0.4 by using Lua
 | |
| scripting in run-time loaded mods.
 | |
| 
 | |
| A mod is a self-contained bunch of scripts, textures and other related
 | |
| things that is loaded by and interfaces with Minetest.
 | |
| 
 | |
| Mods are contained and ran solely on the server side. Definitions and media
 | |
| files are automatically transferred to the client.
 | |
| 
 | |
| If you see a deficiency in the API, feel free to attempt to add the
 | |
| functionality in the engine and API. You can send such improvements as
 | |
| source code patches to <celeron55@gmail.com>.
 | |
| 
 | |
| Programming in Lua
 | |
| -------------------
 | |
| If you have any difficulty in understanding this, please read:
 | |
|   http://www.lua.org/pil/
 | |
| 
 | |
| Startup
 | |
| --------
 | |
| Mods are loaded during server startup from the mod load paths by running
 | |
| the init.lua scripts in a shared environment.
 | |
| 
 | |
| Mod load path
 | |
| -------------
 | |
| Generic:
 | |
|   $path_share/games/gameid/mods/
 | |
|   $path_share/mods/gameid/
 | |
|   $path_user/games/gameid/mods/
 | |
|   $path_user/mods/gameid/ <-- User-installed mods
 | |
|   $worldpath/worldmods/
 | |
| 
 | |
| In a run-in-place version (eg. the distributed windows version):
 | |
|   minetest-0.4.x/games/gameid/mods/
 | |
|   minetest-0.4.x/mods/gameid/ <-- User-installed mods
 | |
|   minetest-0.4.x/worlds/worldname/worldmods/
 | |
| 
 | |
| On an installed version on linux:
 | |
|   /usr/share/minetest/games/gameid/mods/
 | |
|   ~/.minetest/mods/gameid/ <-- User-installed mods
 | |
|   ~/.minetest/worlds/worldname/worldmods
 | |
| 
 | |
| Mod load path for world-specific games
 | |
| --------------------------------------
 | |
| It is possible to include a game in a world; in this case, no mods or
 | |
| games are loaded or checked from anywhere else.
 | |
| 
 | |
| This is useful for eg. adventure worlds.
 | |
| 
 | |
| This happens if the following directory exists:
 | |
|   $world/game/
 | |
| 
 | |
| Mods should be then be placed in:
 | |
|   $world/game/mods/
 | |
| 
 | |
| Modpack support
 | |
| ----------------
 | |
| Mods can be put in a subdirectory, if the parent directory, which otherwise
 | |
| should be a mod, contains a file named modpack.txt. This file shall be
 | |
| empty, except for lines starting with #, which are comments.
 | |
| 
 | |
| Mod directory structure
 | |
| ------------------------
 | |
| mods
 | |
| |-- modname
 | |
| |   |-- depends.txt
 | |
| |   |-- init.lua
 | |
| |   |-- textures
 | |
| |   |   |-- modname_stuff.png
 | |
| |   |   `-- modname_something_else.png
 | |
| |   |-- sounds
 | |
| |   |-- media
 | |
| |   `-- <custom data>
 | |
| `-- another
 | |
| 
 | |
| modname:
 | |
|   The location of this directory can be fetched by using
 | |
|   minetest.get_modpath(modname)
 | |
| 
 | |
| depends.txt:
 | |
|   List of mods that have to be loaded before loading this mod.
 | |
|   A single line contains a single modname.
 | |
| 
 | |
| init.lua:
 | |
|   The main Lua script. Running this script should register everything it
 | |
|   wants to register. Subsequent execution depends on minetest calling the
 | |
|   registered callbacks.
 | |
| 
 | |
|   minetest.setting_get(name) and minetest.setting_getbool(name) can be used
 | |
|   to read custom or existing settings at load time, if necessary.
 | |
| 
 | |
| textures, sounds, media:
 | |
|   Media files (textures, sounds, whatever) that will be transferred to the
 | |
|   client and will be available for use by the mod.
 | |
| 
 | |
| Naming convention for registered textual names
 | |
| ----------------------------------------------
 | |
| Registered names should generally be in this format:
 | |
|   "modname:<whatever>" (<whatever> can have characters a-zA-Z0-9_)
 | |
| 
 | |
| This is to prevent conflicting names from corrupting maps and is
 | |
| enforced by the mod loader.
 | |
| 
 | |
| Example: mod "experimental", ideal item/node/entity name "tnt":
 | |
|          -> the name should be "experimental:tnt".
 | |
| 
 | |
| Enforcement can be overridden by prefixing the name with ":". This can
 | |
| be used for overriding the registrations of some other mod.
 | |
| 
 | |
| Example: Any mod can redefine experimental:tnt by using the name
 | |
|          ":experimental:tnt" when registering it.
 | |
| (also that mod is required to have "experimental" as a dependency)
 | |
| 
 | |
| The ":" prefix can also be used for maintaining backwards compatibility.
 | |
| 
 | |
| Aliases
 | |
| -------
 | |
| Aliases can be added by using minetest.register_alias(name, convert_to)
 | |
| 
 | |
| This will make Minetest to convert things called name to things called
 | |
| convert_to.
 | |
| 
 | |
| This can be used for maintaining backwards compatibility.
 | |
| 
 | |
| This can be also used for setting quick access names for things, eg. if
 | |
| you have an item called epiclylongmodname:stuff, you could do
 | |
|   minetest.register_alias("stuff", "epiclylongmodname:stuff")
 | |
| and be able to use "/giveme stuff".
 | |
| 
 | |
| Textures
 | |
| --------
 | |
| Mods should generally prefix their textures with modname_, eg. given
 | |
| the mod name "foomod", a texture could be called
 | |
|   "foomod_foothing.png"
 | |
| 
 | |
| Textures are referred to by their complete name, or alternatively by
 | |
| stripping out the file extension:
 | |
|   eg. foomod_foothing.png
 | |
|   eg. foomod_foothing
 | |
| 
 | |
| Sounds
 | |
| -------
 | |
| Only OGG files are supported.
 | |
| 
 | |
| For positional playing of sounds, only single-channel (mono) files are
 | |
| supported. Otherwise OpenAL will play them non-positionally.
 | |
| 
 | |
| Mods should generally prefix their sounds with modname_, eg. given
 | |
| the mod name "foomod", a sound could be called
 | |
|   "foomod_foosound.ogg"
 | |
| 
 | |
| Sounds are referred to by their name with a dot, a single digit and the
 | |
| file extension stripped out.  When a sound is played, the actual sound file
 | |
| is chosen randomly from the matching sounds.
 | |
| 
 | |
| When playing the sound "foomod_foosound", the sound is chosen randomly
 | |
| from the available ones of the following files:
 | |
|   foomod_foosound.ogg
 | |
|   foomod_foosound.0.ogg
 | |
|   foomod_foosound.1.ogg
 | |
|   ...
 | |
|   foomod_foosound.9.ogg
 | |
| 
 | |
| Examples of sound parameter tables:
 | |
| -- Play locationless on all clients
 | |
| {
 | |
| 	gain = 1.0, -- default
 | |
| }
 | |
| -- Play locationless to a player
 | |
| {
 | |
| 	to_player = name,
 | |
| 	gain = 1.0, -- default
 | |
| }
 | |
| -- Play in a location
 | |
| {
 | |
| 	pos = {x=1,y=2,z=3},
 | |
| 	gain = 1.0, -- default
 | |
| 	max_hear_distance = 32, -- default
 | |
| }
 | |
| -- Play connected to an object, looped
 | |
| {
 | |
|     object = <an ObjectRef>,
 | |
|     gain = 1.0, -- default
 | |
|     max_hear_distance = 32, -- default
 | |
|     loop = true, -- only sounds connected to objects can be looped
 | |
| }
 | |
| 
 | |
| SimpleSoundSpec:
 | |
| eg. ""
 | |
| eg. "default_place_node"
 | |
| eg. {}
 | |
| eg. {name="default_place_node"}
 | |
| eg. {name="default_place_node", gain=1.0}
 | |
| 
 | |
| Registered definitions of stuff
 | |
| --------------------------------
 | |
| Anything added using certain minetest.register_* functions get added to
 | |
| the global minetest.registered_* tables.
 | |
| 
 | |
| minetest.register_entity(name, prototype table)
 | |
|  -> minetest.registered_entities[name]
 | |
| 
 | |
| minetest.register_node(name, node definition)
 | |
|  -> minetest.registered_items[name]
 | |
|  -> minetest.registered_nodes[name]
 | |
| 
 | |
| minetest.register_tool(name, item definition)
 | |
|  -> minetest.registered_items[name]
 | |
| 
 | |
| minetest.register_craftitem(name, item definition)
 | |
|  -> minetest.registered_items[name]
 | |
| 
 | |
| Note that in some cases you will stumble upon things that are not contained
 | |
| in these tables (eg. when a mod has been removed). Always check for
 | |
| existence before trying to access the fields.
 | |
| 
 | |
| Example: If you want to check the drawtype of a node, you could do:
 | |
| 
 | |
| local function get_nodedef_field(nodename, fieldname)
 | |
|     if not minetest.registered_nodes[nodename] then
 | |
|         return nil
 | |
|     end
 | |
|     return minetest.registered_nodes[nodename][fieldname]
 | |
| end
 | |
| local drawtype = get_nodedef_field(nodename, "drawtype")
 | |
| 
 | |
| Example: minetest.get_item_group(name, group) has been implemented as:
 | |
| 
 | |
| function minetest.get_item_group(name, group)
 | |
| 	if not minetest.registered_items[name] or not
 | |
| 			minetest.registered_items[name].groups[group] then
 | |
| 		return 0
 | |
| 	end
 | |
| 	return minetest.registered_items[name].groups[group]
 | |
| end
 | |
| 
 | |
| Nodes
 | |
| ------
 | |
| Nodes are the bulk data of the world: cubes and other things that take the
 | |
| space of a cube. Huge amounts of them are handled efficiently, but they
 | |
| are quite static.
 | |
| 
 | |
| The definition of a node is stored and can be accessed by name in
 | |
|   minetest.registered_nodes[node.name]
 | |
| See "Registered definitions of stuff".
 | |
| 
 | |
| Nodes are passed by value between Lua and the engine.
 | |
| They are represented by a table:
 | |
|   {name="name", param1=num, param2=num}
 | |
| 
 | |
| param1 and param2 are 8 bit integers. The engine uses them for certain
 | |
| automated functions. If you don't use these functions, you can use them to
 | |
| store arbitrary values.
 | |
| 
 | |
| The functions of param1 and param2 are determined by certain fields in the
 | |
| node definition:
 | |
| param1 is reserved for the engine when paramtype != "none":
 | |
|   paramtype = "light"
 | |
|   ^ The value stores light with and without sun in it's
 | |
|     upper and lower 4 bits.
 | |
| param2 is reserved for the engine when any of these are used:
 | |
|   liquidtype == "flowing"
 | |
|   ^ The level and some flags of the liquid is stored in param2
 | |
|   drawtype == "flowingliquid"
 | |
|   ^ The drawn liquid level is read from param2
 | |
|   drawtype == "torchlike"
 | |
|   drawtype == "signlike"
 | |
|   paramtype2 == "wallmounted"
 | |
|   ^ The rotation of the node is stored in param2. You can make this value
 | |
|     by using minetest.dir_to_wallmounted().
 | |
|   paramtype2 == "facedir"
 | |
|   ^ The rotation of the node is stored in param2. Furnaces and chests are
 | |
|     rotated this way. Can be made by using minetest.dir_to_facedir().
 | |
| 
 | |
| Nodes can also contain extra data. See "Node Metadata".
 | |
| 
 | |
| Node drawtypes
 | |
| ---------------
 | |
| There are a bunch of different looking node types. These are mostly just
 | |
| copied from Minetest 0.3; more may be made in the future.
 | |
| 
 | |
| Look for examples in games/minimal or games/minetest_game.
 | |
| 
 | |
| - normal
 | |
| - airlike
 | |
| - liquid
 | |
| - flowingliquid
 | |
| - glasslike
 | |
| - allfaces
 | |
| - allfaces_optional
 | |
| - torchlike
 | |
| - signlike
 | |
| - plantlike
 | |
| - fencelike
 | |
| - raillike
 | |
| - nodebox -- See below. EXPERIMENTAL
 | |
| 
 | |
| Node boxes
 | |
| -----------
 | |
| Node selection boxes are defined using "node boxes"
 | |
| 
 | |
| The "nodebox" node drawtype allows defining visual of nodes consisting of
 | |
| arbitrary number of boxes. It allows defining stuff like stairs. Only the
 | |
| "fixed" box type is supported for these.
 | |
| ^ Please note that this is still experimental, and may be incompatibly
 | |
|   changed in the future.
 | |
| 
 | |
| A nodebox is defined as any of:
 | |
| {
 | |
|     -- A normal cube; the default in most things
 | |
|     type = "regular"
 | |
| }
 | |
| {
 | |
|     -- A fixed box (facedir param2 is used, if applicable)
 | |
|     type = "fixed",
 | |
|     fixed = box OR {box1, box2, ...}
 | |
| }
 | |
| {
 | |
|     -- A box like the selection box for torches
 | |
|     -- (wallmounted param2 is used, if applicable)
 | |
|     type = "wallmounted",
 | |
|     wall_top = box,
 | |
|     wall_bottom = box,
 | |
|     wall_side = box
 | |
| }
 | |
| 
 | |
| A box is defined as:
 | |
|   {x1, y1, z1, x2, y2, z2}
 | |
| A box of a regular node would look like:
 | |
|   {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
 | |
| 
 | |
| Representations of simple things
 | |
| --------------------------------
 | |
| Position/vector:
 | |
|   {x=num, y=num, z=num}
 | |
| Currently the API does not provide any helper functions for addition,
 | |
| subtraction and whatever; you can define those that you need yourself.
 | |
| 
 | |
| pointed_thing:
 | |
|   {type="nothing"}
 | |
|   {type="node", under=pos, above=pos}
 | |
|   {type="object", ref=ObjectRef}
 | |
| 
 | |
| Items
 | |
| ------
 | |
| Node (register_node):
 | |
|   A node from the world
 | |
| Tool (register_tool):
 | |
|   A tool/weapon that can dig and damage things according to tool_capabilities
 | |
| Craftitem (register_craftitem):
 | |
|   A miscellaneous item
 | |
| 
 | |
| Items and item stacks can exist in three formats:
 | |
| 
 | |
| Serialized; This is called stackstring or itemstring:
 | |
| eg. 'default:dirt 5'
 | |
| eg. 'default:pick_wood 21323'
 | |
| eg. 'default:apple'
 | |
| 
 | |
| Table format:
 | |
| eg. {name="default:dirt", count=5, wear=0, metadata=""} 
 | |
|     ^ 5 dirt nodes
 | |
| eg. {name="default:pick_wood", count=1, wear=21323, metadata=""}
 | |
|     ^ a wooden pick about 1/3 weared out
 | |
| eg. {name="default:apple", count=1, wear=0, metadata=""}
 | |
|     ^ an apple.
 | |
| 
 | |
| ItemStack:
 | |
| C++ native format with many helper methods. Useful for converting between
 | |
| formats. See the Class reference section for details.
 | |
| 
 | |
| When an item must be passed to a function, it can usually be in any of
 | |
| these formats.
 | |
| 
 | |
| Groups
 | |
| -------
 | |
| In a number of places, there is a group table. Groups define the
 | |
| properties of a thing (item, node, armor of entity, capabilities of
 | |
| tool) in such a way that the engine and other mods can can interact with
 | |
| the thing without actually knowing what the thing is.
 | |
| 
 | |
| Usage:
 | |
| - Groups are stored in a table, having the group names with keys and the
 | |
|   group ratings as values. For example:
 | |
|     groups = {crumbly=3, soil=1}
 | |
|     ^ Default dirt (soil group actually currently not defined; TODO)
 | |
|     groups = {crumbly=2, soil=1, level=2, outerspace=1}
 | |
|     ^ A more special dirt-kind of thing
 | |
| - Groups always have a rating associated with them. If there is no
 | |
|   useful meaning for a rating for an enabled group, it shall be 1.
 | |
| - When not defined, the rating of a group defaults to 0. Thus when you
 | |
|   read groups, you must interpret nil and 0 as the same value, 0.
 | |
| 
 | |
| You can read the rating of a group for an item or a node by using
 | |
|   minetest.get_item_group(itemname, groupname)
 | |
| 
 | |
| Groups of items
 | |
| ----------------
 | |
| Groups of items can define what kind of an item it is (eg. wool).
 | |
| 
 | |
| Groups of nodes
 | |
| ----------------
 | |
| In addition to the general item things, groups are used to define whether
 | |
| a node is destroyable and how long it takes to destroy by a tool.
 | |
| 
 | |
| Groups of entities
 | |
| -------------------
 | |
| For entities, groups are, as of now, used only for calculating damage.
 | |
| 
 | |
| object.get_armor_groups() -> a group-rating table (eg. {fleshy=3})
 | |
| object.set_armor_groups({level=2, fleshy=2, cracky=2})
 | |
| 
 | |
| Groups of tools
 | |
| ----------------
 | |
| Groups in tools define which groups of nodes and entities they are
 | |
| effective towards.
 | |
| 
 | |
| Groups in crafting recipes
 | |
| ---------------------------
 | |
| An example: Make meat soup from any meat, any water and any bowl
 | |
| {
 | |
|     output = 'food:meat_soup_raw',
 | |
|     recipe = {
 | |
|         {'group:meat'},
 | |
|         {'group:water'},
 | |
|         {'group:bowl'},
 | |
|     },
 | |
|     -- preserve = {'group:bowl'}, -- Not implemented yet (TODO)
 | |
| }
 | |
| An another example: Make red wool from white wool and red dye
 | |
| {
 | |
| 	type = 'shapeless',
 | |
|     output = 'wool:red',
 | |
|     recipe = {'wool:white', 'group:dye,basecolor_red'},
 | |
| }
 | |
| 
 | |
| Special groups
 | |
| ---------------
 | |
| - immortal: Disables the group damage system for an entity
 | |
| - level: Can be used to give an additional sense of progression in the game.
 | |
|   - A larger level will cause eg. a weapon of a lower level make much less
 | |
|     damage, and get weared out much faster, or not be able to get drops
 | |
| 	from destroyed nodes.
 | |
|   - 0 is something that is directly accessible at the start of gameplay
 | |
|   - There is no upper limit
 | |
| - dig_immediate: (player can always pick up node without tool wear)
 | |
|   - 2: node is removed without tool wear after 0.5 seconds or so
 | |
|        (rail, sign)
 | |
|   - 3: node is removed without tool wear immediately (torch)
 | |
| 
 | |
| Known damage and digging time defining groups
 | |
| ----------------------------------------------
 | |
| Valid ratings for these are 0, 1, 2 and 3, unless otherwise stated.
 | |
| - crumbly: dirt, sand
 | |
| - cracky: tough but crackable stuff like stone.
 | |
| - snappy: something that can be cut using fine tools; eg. leaves, small
 | |
|           plants, wire, sheets of metal
 | |
| - choppy: something that can be cut using force; eg. trees, wooden planks
 | |
| - fleshy: Living things like animals and the player. This could imply
 | |
|           some blood effects when hitting.
 | |
| - explody: Especially prone to explosions
 | |
| - oddly_breakable_by_hand:
 | |
|    Can be added to nodes that shouldn't logically be breakable by the
 | |
|    hand but are. Somewhat similar to dig_immediate, but times are more
 | |
|    like {[1]=3.50,[2]=2.00,[3]=0.70} and this does not override the
 | |
|    speed of a tool if the tool can dig at a faster speed than this
 | |
|    suggests for the hand.
 | |
| 
 | |
| Examples of custom groups
 | |
| --------------------------
 | |
| Item groups are often used for defining, well, //groups of items//.
 | |
| - meat: any meat-kind of a thing (rating might define the size or healing
 | |
|   ability or be irrelevant - it is not defined as of yet)
 | |
| - eatable: anything that can be eaten. Rating might define HP gain in half
 | |
|   hearts.
 | |
| - flammable: can be set on fire. Rating might define the intensity of the
 | |
|   fire, affecting eg. the speed of the spreading of an open fire.
 | |
| - wool: any wool (any origin, any color)
 | |
| - metal: any metal
 | |
| - weapon: any weapon
 | |
| - heavy: anything considerably heavy
 | |
| 
 | |
| Digging time calculation specifics
 | |
| -----------------------------------
 | |
| Groups such as **crumbly**, **cracky** and **snappy** are used for this
 | |
| purpose. Rating is 1, 2 or 3. A higher rating for such a group implies
 | |
| faster digging time.
 | |
| 
 | |
| The **level** group is used to limit the toughness of nodes a tool can dig
 | |
| and to scale the digging times / damage to a greater extent.
 | |
| 
 | |
| ^ PLEASE DO UNDERSTAND THIS, otherwise you cannot use the system to it's
 | |
|   full potential.
 | |
| 
 | |
| Tools define their properties by a list of parameters for groups. They
 | |
| cannot dig other groups; thus it is important to use a standard bunch of
 | |
| groups to enable interaction with tools.
 | |
| 
 | |
| **Tools define:**
 | |
|   * Full punch interval
 | |
|   * Maximum drop level
 | |
|   * For an arbitrary list of groups:
 | |
|     * Uses (until the tool breaks)
 | |
|     * Maximum level (usually 0, 1, 2 or 3)
 | |
|     * Digging times
 | |
| 
 | |
| **Full punch interval**:
 | |
| When used as a weapon, the tool will do full damage if this time is spent
 | |
| between punches. If eg. half the time is spent, the tool will do half
 | |
| damage.
 | |
| 
 | |
| **Maximum drop level**
 | |
| Suggests the maximum level of node, when dug with the tool, that will drop
 | |
| it's useful item. (eg. iron ore to drop a lump of iron).
 | |
| - This is not automated; it is the responsibility of the node definition
 | |
|   to implement this
 | |
| 
 | |
| **Uses**
 | |
| Determines how many uses the tool has when it is used for digging a node,
 | |
| of this group, of the maximum level. For lower leveled nodes, the use count
 | |
| is multiplied by 3^leveldiff.
 | |
| - uses=10, leveldiff=0 -> actual uses: 10
 | |
| - uses=10, leveldiff=1 -> actual uses: 30
 | |
| - uses=10, leveldiff=2 -> actual uses: 90
 | |
| 
 | |
| **Maximum level**
 | |
| Tells what is the maximum level of a node of this group that the tool will
 | |
| be able to dig.
 | |
| 
 | |
| **Digging times**
 | |
| List of digging times for different ratings of the group, for nodes of the
 | |
| maximum level.
 | |
|   * For example, as a lua table, ''times={2=2.00, 3=0.70}''. This would
 | |
|     result in the tool to be able to dig nodes that have a rating of 2 or 3
 | |
|     for this group, and unable to dig the rating 1, which is the toughest.
 | |
|     Unless there is a matching group that enables digging otherwise.
 | |
|   * For entities, damage equals the amount of nodes dug in the time spent
 | |
|     between hits, with a maximum time of ''full_punch_interval''.
 | |
| 
 | |
| Example definition of the capabilities of a tool
 | |
| -------------------------------------------------
 | |
| tool_capabilities = {
 | |
| 	full_punch_interval=1.5,
 | |
| 	max_drop_level=1,
 | |
| 	groupcaps={
 | |
| 		crumbly={maxlevel=2, uses=20, times={[1]=1.60, [2]=1.20, [3]=0.80}}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| This makes the tool be able to dig nodes that fullfill both of these:
 | |
| - Have the **crumbly** group
 | |
| - Have a **level** group less or equal to 2
 | |
| 
 | |
| Table of resulting digging times:
 | |
| crumbly        0     1     2     3     4  <- level
 | |
|      ->  0     -     -     -     -     -
 | |
|          1  0.80  1.60  1.60     -     -
 | |
|          2  0.60  1.20  1.20     -     -
 | |
|          3  0.40  0.80  0.80     -     -
 | |
| 
 | |
| level diff:    2     1     0    -1    -2
 | |
| 
 | |
| Table of resulting tool uses:
 | |
|      ->  0     -     -     -     -     -
 | |
|          1   180    60    20     -     -
 | |
|          2   180    60    20     -     -
 | |
|          3   180    60    20     -     -
 | |
| 
 | |
| Notes:
 | |
| - At crumbly=0, the node is not diggable.
 | |
| - At crumbly=3, the level difference digging time divider kicks in and makes
 | |
|   easy nodes to be quickly breakable.
 | |
| - At level > 2, the node is not diggable, because it's level > maxlevel
 | |
| 
 | |
| Entity damage mechanism
 | |
| ------------------------
 | |
| Damage calculation:
 | |
| - Take the time spent after the last hit
 | |
| - Limit time to full_punch_interval
 | |
| - Take the damage groups and imagine a bunch of nodes that have them
 | |
| - Damage in HP is the amount of nodes destroyed in this time.
 | |
| 
 | |
| Client predicts damage based on damage groups. Because of this, it is able to
 | |
| give an immediate response when an entity is damaged or dies; the response is
 | |
| pre-defined somehow (eg. by defining a sprite animation) (not implemented;
 | |
| TODO).
 | |
| - Currently a smoke puff will appear when an entity dies.
 | |
| 
 | |
| The group **immortal** completely disables normal damage.
 | |
| 
 | |
| Entities can define a special armor group, which is **punch_operable**. This
 | |
| group disables the regular damage mechanism for players punching it by hand or
 | |
| a non-tool item, so that it can do something else than take damage.
 | |
| 
 | |
| On the Lua side, every punch calls ''entity:on_punch(puncher,
 | |
| time_from_last_punch, tool_capabilities, direction)''. This should never be
 | |
| called directly, because damage is usually not handled by the entity itself.
 | |
|   * ''puncher'' is the object performing the punch. Can be nil. Should never be
 | |
|     accessed unless absolutely required, to encourage interoperability.
 | |
|   * ''time_from_last_punch'' is time from last punch (by puncher) or nil.
 | |
|   * ''tool_capabilities'' can be nil.
 | |
|   * ''direction'' is a unit vector, pointing from the source of the punch to
 | |
|     the punched object.
 | |
| 
 | |
| To punch an entity/object in Lua, call ''object:punch(puncher,
 | |
| time_from_last_punch, tool_capabilities, direction)''.
 | |
|   * Return value is tool wear.
 | |
|   * Parameters are equal to the above callback.
 | |
|   * If ''direction'' is nil and ''puncher'' is not nil, ''direction'' will be
 | |
|     automatically filled in based on the location of ''puncher''.
 | |
| 
 | |
| Node Metadata
 | |
| -------------
 | |
| The instance of a node in the world normally only contains the three values
 | |
| mentioned in "Nodes". However, it is possible to insert extra data into a
 | |
| node. It is called "node metadata"; See "NodeMetaRef".
 | |
| 
 | |
| Metadata contains two things:
 | |
| - A key-value store
 | |
| - An inventory
 | |
| 
 | |
| Some of the values in the key-value store are handled specially:
 | |
| - formspec: Defines a right-click inventory menu. See "Formspec".
 | |
| - infotext: Text shown on the screen when the node is pointed at
 | |
| 
 | |
| Example stuff:
 | |
| 
 | |
| local meta = minetest.env:get_meta(pos)
 | |
| meta:set_string("formspec",
 | |
|         "invsize[8,9;]"..
 | |
|         "list[context;main;0,0;8,4;]"..
 | |
|         "list[current_player;main;0,5;8,4;]")
 | |
| meta:set_string("infotext", "Chest");
 | |
| local inv = meta:get_inventory()
 | |
| inv:set_size("main", 8*4)
 | |
| print(dump(meta:to_table()))
 | |
| meta:from_table({
 | |
|     inventory = {
 | |
|         main = {[1] = "default:dirt", [2] = "", [3] = "", [4] = "", [5] = "", [6] = "", [7] = "", [8] = "", [9] = "", [10] = "", [11] = "", [12] = "", [13] = "", [14] = "default:cobble", [15] = "", [16] = "", [17] = "", [18] = "", [19] = "", [20] = "default:cobble", [21] = "", [22] = "", [23] = "", [24] = "", [25] = "", [26] = "", [27] = "", [28] = "", [29] = "", [30] = "", [31] = "", [32] = ""}
 | |
|     },
 | |
|     fields = {
 | |
|         formspec = "invsize[8,9;]list[context;main;0,0;8,4;]list[current_player;main;0,5;8,4;]",
 | |
|         infotext = "Chest"
 | |
|     }
 | |
| })
 | |
| 
 | |
| Formspec
 | |
| --------
 | |
| Formspec defines a menu. Currently not much else than inventories are
 | |
| supported. It is a string, with a somewhat strange format.
 | |
| 
 | |
| Spaces and newlines can be inserted between the blocks, as is used in the
 | |
| examples.
 | |
| 
 | |
| Examples:
 | |
| - Chest:
 | |
|     invsize[8,9;]
 | |
|     list[context;main;0,0;8,4;]
 | |
|     list[current_player;main;0,5;8,4;]
 | |
| - Furnace:
 | |
|     invsize[8,9;]
 | |
|     list[context;fuel;2,3;1,1;]
 | |
|     list[context;src;2,1;1,1;]
 | |
|     list[context;dst;5,1;2,2;]
 | |
|     list[current_player;main;0,5;8,4;]
 | |
| - Minecraft-like player inventory
 | |
|     invsize[8,7.5;]
 | |
|     image[1,0.6;1,2;player.png]
 | |
|     list[current_player;main;0,3.5;8,4;]
 | |
|     list[current_player;craft;3,0;3,3;]
 | |
|     list[current_player;craftpreview;7,1;1,1;]
 | |
| 
 | |
| Elements:
 | |
| 
 | |
| size[<W>,<H>]
 | |
| ^ Define the size of the menu in inventory slots
 | |
| ^ deprecated: invsize[<W>,<H>;]
 | |
| 
 | |
| list[<inventory location>;<list name>;<X>,<Y>;<W>,<H>;]
 | |
| list[<inventory location>;<list name>;<X>,<Y>;<W>,<H>;<starting item index>]
 | |
| ^ Show an inventory list
 | |
| 
 | |
| image[<X>,<Y>;<W>,<H>;<texture name>]
 | |
| ^ Show an image
 | |
| ^ Position and size units are inventory slots
 | |
| 
 | |
| field[<X>,<Y>;<W>,<H>;<name>;<label>;<default>]
 | |
| ^ Textual field; will be sent to server when a button is clicked
 | |
| ^ x and y position the field relative to the top left of the menu
 | |
| ^ w and h are the size of the field
 | |
| ^ fields are a set height, but will be vertically centred on h
 | |
| ^ Position and size units are inventory slots
 | |
| ^ name is the name of the field as returned in fields to on_receive_fields
 | |
| ^ label, if not blank, will be text printed on the top left above the field
 | |
| ^ default is the default value of the field
 | |
|   ^ default may contain variable references such as '${text}' which
 | |
|     will fill the value from the metadata value 'text'
 | |
| 	^ Note: no extra text or more than a single variable is supported ATM.
 | |
| 
 | |
| field[<name>;<label>;<default>]
 | |
| ^ as above but without position/size units
 | |
| ^ special field for creating simple forms, such as sign text input
 | |
| ^ must be used without a size[] element
 | |
| ^ a 'Proceed' button will be added automatically
 | |
| 
 | |
| label[<X>,<Y>;<label>]
 | |
| ^ x and y work as per field
 | |
| ^ label is the text on the label
 | |
| ^ Position and size units are inventory slots
 | |
| 
 | |
| button[<X>,<Y>;<W>,<H>;<name>;<label>]
 | |
| ^ Clickable button. When clicked, fields will be sent.
 | |
| ^ x, y and name work as per field
 | |
| ^ w and h are the size of the button
 | |
| ^ label is the text on the button
 | |
| ^ Position and size units are inventory slots
 | |
| 
 | |
| image_button[<X>,<Y>;<W>,<H>;<texture name>;<name>;<label>]
 | |
| ^ x, y, w, h, and name work as per button
 | |
| ^ image is the filename of an image
 | |
| ^ Position and size units are inventory slots
 | |
| 
 | |
| button_exit[<X>,<Y>;<W>,<H>;<name>;<label>]
 | |
| ^ When clicked, fields will be sent and the form will quit.
 | |
| 
 | |
| image_button_exit[<X>,<Y>;<W>,<H>;<texture name>;<name>;<label>]
 | |
| ^ When clicked, fields will be sent and the form will quit.
 | |
| 
 | |
| Inventory location:
 | |
| 
 | |
| - "context": Selected node metadata (deprecated: "current_name")
 | |
| - "current_player": Player to whom the menu is shown
 | |
| - "player:<name>": Any player
 | |
| - "nodemeta:<X>,<Y>,<Z>": Any node metadata
 | |
| - "detached:<name>": A detached inventory
 | |
| 
 | |
| Helper functions
 | |
| -----------------
 | |
| dump2(obj, name="_", dumped={})
 | |
| ^ Return object serialized as a string, handles reference loops
 | |
| dump(obj, dumped={})
 | |
| ^ Return object serialized as a string
 | |
| string:split(separator)
 | |
| ^ eg. string:split("a,b", ",") == {"a","b"}
 | |
| string:trim()
 | |
| ^ eg. string.trim("\n \t\tfoo bar\t ") == "foo bar"
 | |
| minetest.pos_to_string({x=X,y=Y,z=Z}) -> "(X,Y,Z)"
 | |
| ^ Convert position to a printable string
 | |
| minetest.string_to_pos(string) -> position
 | |
| 
 | |
| minetest namespace reference
 | |
| -----------------------------
 | |
| minetest.get_current_modname() -> string
 | |
| minetest.get_modpath(modname) -> eg. "/home/user/.minetest/usermods/modname"
 | |
| ^ Useful for loading additional .lua modules or static data from mod
 | |
| minetest.get_modnames() -> list of installed mods
 | |
| ^ Return a list of installed mods, sorted alphabetically
 | |
| minetest.get_worldpath() -> eg. "/home/user/.minetest/world"
 | |
| ^ Useful for storing custom data
 | |
| minetest.is_singleplayer()
 | |
| 
 | |
| minetest.debug(line)
 | |
| ^ Always printed to stderr and logfile (print() is redirected here)
 | |
| minetest.log(line)
 | |
| minetest.log(loglevel, line)
 | |
| ^ loglevel one of "error", "action", "info", "verbose"
 | |
| 
 | |
| Registration functions: (Call these only at load time)
 | |
| minetest.register_entity(name, prototype table)
 | |
| minetest.register_abm(abm definition)
 | |
| minetest.register_node(name, node definition)
 | |
| minetest.register_tool(name, item definition)
 | |
| minetest.register_craftitem(name, item definition)
 | |
| minetest.register_alias(name, convert_to)
 | |
| minetest.register_craft(recipe)
 | |
| 
 | |
| Global callback registration functions: (Call these only at load time)
 | |
| minetest.register_globalstep(func(dtime))
 | |
| ^ Called every server step, usually interval of 0.05s
 | |
| minetest.register_on_placenode(func(pos, newnode, placer, oldnode))
 | |
| ^ Called when a node has been placed
 | |
| ^ Deprecated: Use on_construct or after_place_node in node definition instead
 | |
| minetest.register_on_dignode(func(pos, oldnode, digger))
 | |
| ^ Called when a node has been dug.
 | |
| ^ Deprecated: Use on_destruct or after_dig_node in node definition instead
 | |
| minetest.register_on_punchnode(func(pos, node, puncher))
 | |
| ^ Called when a node is punched
 | |
| minetest.register_on_generated(func(minp, maxp, blockseed))
 | |
| ^ Called after generating a piece of world. Modifying nodes inside the area
 | |
|   is a bit faster than usually.
 | |
| minetest.register_on_newplayer(func(ObjectRef))
 | |
| ^ Called after a new player has been created
 | |
| minetest.register_on_dieplayer(func(ObjectRef))
 | |
| ^ Called when a player dies
 | |
| minetest.register_on_respawnplayer(func(ObjectRef))
 | |
| ^ Called when player is to be respawned
 | |
| ^ Called _before_ repositioning of player occurs
 | |
| ^ return true in func to disable regular player placement
 | |
| minetest.register_on_joinplayer(func(ObjectRef))
 | |
| ^ Called when a player joins the game
 | |
| minetest.register_on_leaveplayer(func(ObjectRef))
 | |
| ^ Called when a player leaves the game
 | |
| minetest.register_on_chat_message(func(name, message))
 | |
| ^ Called always when a player says something
 | |
| minetest.register_on_player_receive_fields(func(player, formname, fields))
 | |
| ^ Called when a button is pressed in player's inventory form
 | |
| ^ Newest functions are called first
 | |
| ^ If function returns true, remaining functions are not called
 | |
| 
 | |
| Other registration functions:
 | |
| minetest.register_chatcommand(cmd, chatcommand definition)
 | |
| minetest.register_privilege(name, definition)
 | |
| ^ definition: "description text"
 | |
| ^ definition: {
 | |
|       description = "description text",
 | |
|       give_to_singleplayer = boolean, -- default: true
 | |
|   }
 | |
| minetest.register_authentication_handler(handler)
 | |
| ^ See minetest.builtin_auth_handler in builtin.lua for reference
 | |
| 
 | |
| Setting-related:
 | |
| minetest.setting_set(name, value)
 | |
| minetest.setting_get(name) -> string or nil
 | |
| minetest.setting_getbool(name) -> boolean value or nil
 | |
| minetest.setting_get_pos(name) -> position or nil
 | |
| minetest.add_to_creative_inventory(itemstring)
 | |
| 
 | |
| Authentication:
 | |
| minetest.notify_authentication_modified(name)
 | |
| ^ Should be called by the authentication handler if privileges change.
 | |
| ^ To report everybody, set name=nil.
 | |
| minetest.get_password_hash(name, raw_password)
 | |
| ^ Convert a name-password pair to a password hash that minetest can use
 | |
| minetest.string_to_privs(str) -> {priv1=true,...}
 | |
| minetest.privs_to_string(privs) -> "priv1,priv2,..."
 | |
| ^ Convert between two privilege representations
 | |
| minetest.set_player_password(name, password_hash)
 | |
| minetest.set_player_privs(name, {priv1=true,...})
 | |
| minetest.get_player_privs(name) -> {priv1=true,...}
 | |
| minetest.auth_reload()
 | |
| ^ These call the authentication handler
 | |
| minetest.check_player_privs(name, {priv1=true,...}) -> bool, missing_privs
 | |
| ^ A quickhand for checking privileges
 | |
| 
 | |
| Chat:
 | |
| minetest.chat_send_all(text)
 | |
| minetest.chat_send_player(name, text)
 | |
| 
 | |
| Inventory:
 | |
| minetest.get_inventory(location) -> InvRef
 | |
| ^ location = eg. {type="player", name="celeron55"}
 | |
|                  {type="node", pos={x=, y=, z=}}
 | |
|                  {type="detached", name="creative"}
 | |
| minetest.create_detached_inventory(name, callbacks) -> InvRef
 | |
| ^ callbacks: See "Detached inventory callbacks"
 | |
| ^ Creates a detached inventory. If it already exists, it is cleared.
 | |
| 
 | |
| Item handling:
 | |
| minetest.inventorycube(img1, img2, img3)
 | |
| ^ Returns a string for making an image of a cube (useful as an item image)
 | |
| minetest.get_pointed_thing_position(pointed_thing, above)
 | |
| ^ Get position of a pointed_thing (that you can get from somewhere)
 | |
| minetest.dir_to_facedir(dir)
 | |
| ^ Convert a vector to a facedir value, used in param2 for paramtype2="facedir"
 | |
| minetest.dir_to_wallmounted(dir)
 | |
| ^ Convert a vector to a wallmounted value, used for paramtype2="wallmounted"
 | |
| minetest.get_node_drops(nodename, toolname)
 | |
| ^ Returns list of item names.
 | |
| ^ Note: This will be removed or modified in a future version.
 | |
| minetest.get_craft_result(input) -> output, decremented_input
 | |
| ^ input.method = 'normal' or 'cooking' or 'fuel'
 | |
| ^ input.width = for example 3
 | |
| ^ input.items = for example { stack 1, stack 2, stack 3, stack 4,
 | |
|                               stack 5, stack 6, stack 7, stack 8, stack 9 }
 | |
| ^ output.item = ItemStack, if unsuccessful: empty ItemStack
 | |
| ^ output.time = number, if unsuccessful: 0
 | |
| ^ decremented_input = like input
 | |
| minetest.get_craft_recipe(output) -> input
 | |
| ^ output is a node or item type such as 'default:torch'
 | |
| ^ input.method = 'normal' or 'cooking' or 'fuel'
 | |
| ^ input.width = for example 3
 | |
| ^ input.items = for example { stack 1, stack 2, stack 3, stack 4,
 | |
|                               stack 5, stack 6, stack 7, stack 8, stack 9 }
 | |
| ^ input.items = nil if no recipe found
 | |
| 
 | |
| Rollbacks:
 | |
| minetest.rollback_get_last_node_actor(p, range, seconds) -> actor, p, seconds
 | |
| ^ Find who has done something to a node, or near a node
 | |
| ^ actor: "player:<name>", also "liquid".
 | |
| minetest.rollback_revert_actions_by(actor, seconds) -> bool, log messages
 | |
| ^ Revert latest actions of someone
 | |
| ^ actor: "player:<name>", also "liquid".
 | |
| 
 | |
| Defaults for the on_* item definition functions:
 | |
| (These return the leftover itemstack)
 | |
| minetest.item_place_node(itemstack, placer, pointed_thing)
 | |
| ^ Place item as a node
 | |
| minetest.item_place_object(itemstack, placer, pointed_thing)
 | |
| ^ Place item as-is
 | |
| minetest.item_place(itemstack, placer, pointed_thing)
 | |
| ^ Use one of the above based on what the item is.
 | |
| minetest.item_drop(itemstack, dropper, pos)
 | |
| ^ Drop the item
 | |
| minetest.item_eat(hp_change, replace_with_item)
 | |
| ^ Eat the item. replace_with_item can be nil.
 | |
| 
 | |
| Defaults for the on_punch and on_dig node definition callbacks:
 | |
| minetest.node_punch(pos, node, puncher)
 | |
| ^ Calls functions registered by minetest.register_on_punchnode()
 | |
| minetest.node_dig(pos, node, digger)
 | |
| ^ Checks if node can be dug, puts item into inventory, removes node
 | |
| ^ Calls functions registered by minetest.registered_on_dignodes()
 | |
| 
 | |
| Sounds:
 | |
| minetest.sound_play(spec, parameters) -> handle
 | |
| ^ spec = SimpleSoundSpec
 | |
| ^ parameters = sound parameter table
 | |
| minetest.sound_stop(handle)
 | |
| 
 | |
| Timing:
 | |
| minetest.after(time, func, param)
 | |
| ^ Call function after time seconds
 | |
| ^ param is optional; to pass multiple parameters, pass a table.
 | |
| 
 | |
| Server:
 | |
| minetest.request_shutdown() -> request for server shutdown
 | |
| minetest.get_server_status() -> server status string
 | |
| 
 | |
| Bans:
 | |
| minetest.get_ban_list() -> ban list (same as minetest.get_ban_description(""))
 | |
| minetest.get_ban_description(ip_or_name) -> ban description (string)
 | |
| minetest.ban_player(name) -> ban a player
 | |
| minetest.unban_player_or_ip(name) -> unban player or IP address
 | |
| 
 | |
| Random:
 | |
| minetest.get_connected_players() -> list of ObjectRefs
 | |
| minetest.hash_node_position({x=,y=,z=}) -> 48-bit integer
 | |
| ^ Gives a unique hash number for a node position (16+16+16=48bit)
 | |
| minetest.get_item_group(name, group) -> rating
 | |
| ^ Get rating of a group of an item. (0 = not in group)
 | |
| minetest.get_node_group(name, group) -> rating
 | |
| ^ Deprecated: An alias for the former.
 | |
| minetest.serialize(table) -> string
 | |
| ^ Convert a table containing tables, strings, numbers, booleans and nils
 | |
|   into string form readable by minetest.deserialize
 | |
| ^ Example: serialize({foo='bar'}) -> 'return { ["foo"] = "bar" }'
 | |
| minetest.deserialize(string) -> table
 | |
| ^ Convert a string returned by minetest.deserialize into a table
 | |
| ^ String is loaded in an empty sandbox environment.
 | |
| ^ Will load functions, but they cannot access the global environment.
 | |
| ^ Example: deserialize('return { ["foo"] = "bar" }') -> {foo='bar'}
 | |
| ^ Example: deserialize('print("foo")') -> nil (function call fails)
 | |
|   ^ error:[string "print("foo")"]:1: attempt to call global 'print' (a nil value)
 | |
| 
 | |
| Global objects:
 | |
| minetest.env - EnvRef of the server environment and world.
 | |
| ^ Using this you can access nodes and entities
 | |
| 
 | |
| Global tables:
 | |
| minetest.registered_items
 | |
| ^ List of registered items, indexed by name
 | |
| minetest.registered_nodes
 | |
| ^ List of registered node definitions, indexed by name
 | |
| minetest.registered_craftitems
 | |
| ^ List of registered craft item definitions, indexed by name
 | |
| minetest.registered_tools
 | |
| ^ List of registered tool definitions, indexed by name
 | |
| minetest.registered_entities
 | |
| ^ List of registered entity prototypes, indexed by name
 | |
| minetest.object_refs
 | |
| ^ List of object references, indexed by active object id
 | |
| minetest.luaentities
 | |
| ^ List of lua entities, indexed by active object id
 | |
| 
 | |
| Deprecated but defined for backwards compatibility:
 | |
| minetest.digprop_constanttime(time)
 | |
| minetest.digprop_stonelike(toughness)
 | |
| minetest.digprop_dirtlike(toughness)
 | |
| minetest.digprop_gravellike(toughness)
 | |
| minetest.digprop_woodlike(toughness)
 | |
| minetest.digprop_leaveslike(toughness)
 | |
| minetest.digprop_glasslike(toughness)
 | |
| 
 | |
| Class reference
 | |
| ----------------
 | |
| EnvRef: basically ServerEnvironment and ServerMap combined.
 | |
| methods:
 | |
| - set_node(pos, node)
 | |
| - add_node(pos, node): alias set_node(pos, node)
 | |
|  ^ Set node at position (node = {name="foo", param1=0, param2=0})
 | |
| - remove_node(pos)
 | |
|   ^ Equivalent to set_node(pos, "air")
 | |
| - get_node(pos)
 | |
|   ^ Returns {name="ignore", ...} for unloaded area
 | |
| - get_node_or_nil(pos)
 | |
|   ^ Returns nil for unloaded area
 | |
| - get_node_light(pos, timeofday) -> 0...15 or nil
 | |
|   ^ timeofday: nil = current time, 0 = night, 0.5 = day
 | |
| 
 | |
| - place_node(pos, node)
 | |
|   ^ Place node with the same effects that a player would cause
 | |
| - dig_node(pos)
 | |
|   ^ Dig node with the same effects that a player would cause
 | |
| - punch_node(pos)
 | |
|   ^ Punch node with the same effects that a player would cause
 | |
|   
 | |
| - get_meta(pos) -- Get a NodeMetaRef at that position
 | |
| - get_node_timer(pos) -- Get NodeTimerRef
 | |
| 
 | |
| - add_entity(pos, name): Spawn Lua-defined entity at position
 | |
|   ^ Returns ObjectRef, or nil if failed
 | |
| - add_item(pos, item): Spawn item
 | |
|   ^ Returns ObjectRef, or nil if failed
 | |
| - get_player_by_name(name) -- Get an ObjectRef to a player
 | |
| - get_objects_inside_radius(pos, radius)
 | |
| - set_timeofday(val): val: 0...1; 0 = midnight, 0.5 = midday
 | |
| - get_timeofday()
 | |
| - find_node_near(pos, radius, nodenames) -> pos or nil
 | |
|   ^ nodenames: eg. {"ignore", "group:tree"} or "default:dirt"
 | |
| - find_nodes_in_area(minp, maxp, nodenames) -> list of positions
 | |
|   ^ nodenames: eg. {"ignore", "group:tree"} or "default:dirt"
 | |
| - get_perlin(seeddiff, octaves, persistence, scale)
 | |
|   ^ Return world-specific perlin noise (int(worldseed)+seeddiff)
 | |
| - clear_objects()
 | |
|   ^ clear all objects in the environments 
 | |
| Deprecated:
 | |
| - add_rat(pos): Add C++ rat object (no-op)
 | |
| - add_firefly(pos): Add C++ firefly object (no-op)
 | |
| 
 | |
| NodeMetaRef: Node metadata - reference extra data and functionality stored
 | |
|              in a node
 | |
| - Can be gotten via minetest.env:get_nodemeta(pos)
 | |
| methods:
 | |
| - set_string(name, value)
 | |
| - get_string(name)
 | |
| - set_int(name, value)
 | |
| - get_int(name)
 | |
| - set_float(name, value)
 | |
| - get_float(name)
 | |
| - get_inventory() -> InvRef
 | |
| - to_table() -> nil or {fields = {...}, inventory = {list1 = {}, ...}}
 | |
| - from_table(nil or {})
 | |
|   ^ See "Node Metadata"
 | |
|   
 | |
| NodeTimerRef: Node Timers - a high resolution persistent per-node timer
 | |
| - Can be gotten via minetest.env:get_node_timer(pos)
 | |
| methods:
 | |
| - set(timeout,elapsed)
 | |
|   ^ set a timer's state
 | |
|   ^ timeout is in seconds, and supports fractional values (0.1 etc)
 | |
|   ^ elapsed is in seconds, and supports fractional values (0.1 etc)
 | |
|   ^ will trigger the node's on_timer function after timeout-elapsed seconds
 | |
| - start(timeout)
 | |
|   ^ start a timer
 | |
|   ^ equivelent to set(timeout,0)
 | |
| - stop()
 | |
|   ^ stops the timer
 | |
| - get_timeout() -> current timeout in seconds
 | |
|   ^ if timeout is 0, timer is inactive
 | |
| - get_elapsed() -> current elapsed time in seconds
 | |
|   ^ the node's on_timer function will be called after timeout-elapsed seconds
 | |
| - is_started() -> boolean state of timer
 | |
|   ^ returns true if timer is started, otherwise false
 | |
| 
 | |
| ObjectRef: Moving things in the game are generally these
 | |
| (basically reference to a C++ ServerActiveObject)
 | |
| methods:
 | |
| - remove(): remove object (after returning from Lua)
 | |
| - getpos() -> {x=num, y=num, z=num}
 | |
| - setpos(pos); pos={x=num, y=num, z=num}
 | |
| - moveto(pos, continuous=false): interpolated move
 | |
| - punch(puncher, time_from_last_punch, tool_capabilities, direction)
 | |
|   ^ puncher = an another ObjectRef,
 | |
|   ^ time_from_last_punch = time since last punch action of the puncher
 | |
| - right_click(clicker); clicker = an another ObjectRef
 | |
| - get_hp(): returns number of hitpoints (2 * number of hearts)
 | |
| - set_hp(hp): set number of hitpoints (2 * number of hearts)
 | |
| - get_inventory() -> InvRef
 | |
| - get_wield_list(): returns the name of the inventory list the wielded item is in
 | |
| - get_wield_index(): returns the index of the wielded item
 | |
| - get_wielded_item() -> ItemStack
 | |
| - set_wielded_item(item): replaces the wielded item, returns true if successful
 | |
| - set_armor_groups({group1=rating, group2=rating, ...})
 | |
| - set_properties(object property table)
 | |
| LuaEntitySAO-only: (no-op for other objects)
 | |
| - setvelocity({x=num, y=num, z=num})
 | |
| - getvelocity() -> {x=num, y=num, z=num}
 | |
| - setacceleration({x=num, y=num, z=num})
 | |
| - getacceleration() -> {x=num, y=num, z=num}
 | |
| - setyaw(radians)
 | |
| - getyaw() -> radians
 | |
| - settexturemod(mod)
 | |
| - setsprite(p={x=0,y=0}, num_frames=1, framelength=0.2,
 | |
| -           select_horiz_by_yawpitch=false)
 | |
|   ^ Select sprite from spritesheet with optional animation and DM-style
 | |
|     texture selection based on yaw relative to camera
 | |
| - get_entity_name() (DEPRECATED: Will be removed in a future version)
 | |
| - get_luaentity()
 | |
| Player-only: (no-op for other objects)
 | |
| - is_player(): true for players, false for others
 | |
| - get_player_name(): returns "" if is not a player
 | |
| - get_look_dir(): get camera direction as a unit vector
 | |
| - get_look_pitch(): pitch in radians
 | |
| - get_look_yaw(): yaw in radians (wraps around pretty randomly as of now)
 | |
| - set_inventory_formspec(formspec)
 | |
|   ^ Redefine player's inventory form
 | |
|   ^ Should usually be called in on_joinplayer
 | |
| - get_inventory_formspec() -> formspec string
 | |
| 
 | |
| InvRef: Reference to an inventory
 | |
| methods:
 | |
| - is_empty(listname): return true if list is empty
 | |
| - get_size(listname): get size of a list
 | |
| - set_size(listname, size): set size of a list
 | |
| - get_stack(listname, i): get a copy of stack index i in list
 | |
| - set_stack(listname, i, stack): copy stack to index i in list
 | |
| - get_list(listname): return full list
 | |
| - set_list(listname, list): set full list (size will not change)
 | |
| - add_item(listname, stack): add item somewhere in list, returns leftover ItemStack
 | |
| - room_for_item(listname, stack): returns true if the stack of items
 | |
|     can be fully added to the list
 | |
| - contains_item(listname, stack): returns true if the stack of items
 | |
|     can be fully taken from the list
 | |
|   remove_item(listname, stack): take as many items as specified from the list,
 | |
|     returns the items that were actually removed (as an ItemStack)
 | |
| 
 | |
| ItemStack: A stack of items.
 | |
| - Can be created via ItemStack(itemstack or itemstring or table or nil)
 | |
| methods:
 | |
| - is_empty(): return true if stack is empty
 | |
| - get_name(): returns item name (e.g. "default:stone")
 | |
| - get_count(): returns number of items on the stack
 | |
| - get_wear(): returns tool wear (0-65535), 0 for non-tools
 | |
| - get_metadata(): returns metadata (a string attached to an item stack)
 | |
| - clear(): removes all items from the stack, making it empty
 | |
| - replace(item): replace the contents of this stack (item can also
 | |
|     be an itemstring or table)
 | |
| - to_string(): returns the stack in itemstring form
 | |
| - to_table(): returns the stack in Lua table form
 | |
| - get_stack_max(): returns the maximum size of the stack (depends on the item)
 | |
| - get_free_space(): returns get_stack_max() - get_count()
 | |
| - is_known(): returns true if the item name refers to a defined item type
 | |
| - get_definition(): returns the item definition table
 | |
| - get_tool_capabilities(): returns the digging properties of the item,
 | |
|   ^ or those of the hand if none are defined for this item type
 | |
| - add_wear(amount): increases wear by amount if the item is a tool
 | |
| - add_item(item): put some item or stack onto this stack,
 | |
|   ^ returns leftover ItemStack
 | |
| - item_fits(item): returns true if item or stack can be fully added to this one
 | |
| - take_item(n): take (and remove) up to n items from this stack
 | |
|   ^ returns taken ItemStack
 | |
|   ^ if n is omitted, n=1 is used
 | |
| - peek_item(n): copy (don't remove) up to n items from this stack
 | |
|   ^ returns copied ItemStack
 | |
|   ^ if n is omitted, n=1 is used
 | |
| 
 | |
| PseudoRandom: A pseudorandom number generator
 | |
| - Can be created via PseudoRandom(seed)
 | |
| methods:
 | |
| - next(): return next integer random number [0...32767]
 | |
| - next(min, max): return next integer random number [min...max]
 | |
|                   (max - min) must be 32767 or <= 6553 due to the simple
 | |
|                   implementation making bad distribution otherwise.
 | |
| 
 | |
| PerlinNoise: A perlin noise generator
 | |
| - Can be created via PerlinNoise(seed, octaves, persistence, scale)
 | |
| - Also minetest.env:get_perlin(seeddiff, octaves, persistence, scale)
 | |
| methods:
 | |
| - get2d(pos) -> 2d noise value at pos={x=,y=}
 | |
| - get3d(pos) -> 3d noise value at pos={x=,y=,z=}
 | |
| 
 | |
| Registered entities
 | |
| --------------------
 | |
| - Functions receive a "luaentity" as self:
 | |
|   - It has the member .name, which is the registered name ("mod:thing")
 | |
|   - It has the member .object, which is an ObjectRef pointing to the object
 | |
|   - The original prototype stuff is visible directly via a metatable
 | |
| - Callbacks:
 | |
|   - on_activate(self, staticdata)
 | |
|     ^ Called when the object is instantiated.
 | |
|   - on_step(self, dtime)
 | |
|     ^ Called on every server tick (dtime is usually 0.05 seconds)
 | |
|   - on_punch(self, puncher, time_from_last_punch, tool_capabilities, dir)
 | |
|     ^ Called when somebody punches the object.
 | |
|     ^ Note that you probably want to handle most punches using the
 | |
|       automatic armor group system.
 | |
|     ^ puncher: ObjectRef (can be nil)
 | |
|     ^ time_from_last_punch: Meant for disallowing spamming of clicks (can be nil)
 | |
|     ^ tool_capabilities: capability table of used tool (can be nil)
 | |
| 	^ dir: unit vector of direction of punch. Always defined. Points from
 | |
| 	       the puncher to the punched.
 | |
|   - on_rightclick(self, clicker)
 | |
|   - get_staticdata(self)
 | |
|     ^ Should return a string that will be passed to on_activate when
 | |
|       the object is instantiated the next time.
 | |
| 
 | |
| Definition tables
 | |
| ------------------
 | |
| 
 | |
| Object Properties
 | |
| {
 | |
|     hp_max = 1,
 | |
|     physical = true,
 | |
|     weight = 5,
 | |
|     collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
 | |
|     visual = "cube"/"sprite"/"upright_sprite",
 | |
|     visual_size = {x=1, y=1},
 | |
|     textures = {}, -- number of required textures depends on visual
 | |
|     spritediv = {x=1, y=1},
 | |
|     initial_sprite_basepos = {x=0, y=0},
 | |
|     is_visible = true,
 | |
|     makes_footstep_sound = false,
 | |
|     automatic_rotate = false,
 | |
| }
 | |
| 
 | |
| Entity definition (register_entity)
 | |
| {
 | |
|     (Deprecated: Everything in object properties is read directly from here)
 | |
|     
 | |
|     initial_properties = <initial object properties>,
 | |
| 
 | |
|     on_activate = function(self, staticdata),
 | |
|     on_step = function(self, dtime),
 | |
|     on_punch = function(self, hitter),
 | |
|     on_rightclick = function(self, clicker),
 | |
|     get_staticdata = function(self),
 | |
|     ^ Called sometimes; the string returned is passed to on_activate when
 | |
|       the entity is re-activated from static state
 | |
|     
 | |
|     # Also you can define arbitrary member variables here
 | |
|     myvariable = whatever,
 | |
| }
 | |
| 
 | |
| ABM (ActiveBlockModifier) definition (register_abm)
 | |
| {
 | |
|     -- In the following two fields, also group:groupname will work.
 | |
|     nodenames = {"default:lava_source"},
 | |
|     neighbors = {"default:water_source", "default:water_flowing"}, -- (any of these)
 | |
|      ^ If left out or empty, any neighbor will do
 | |
|     interval = 1.0, -- (operation interval)
 | |
|     chance = 1, -- (chance of trigger is 1.0/this)
 | |
|     action = func(pos, node, active_object_count, active_object_count_wider),
 | |
| }
 | |
| 
 | |
| Item definition (register_node, register_craftitem, register_tool)
 | |
| {
 | |
|     description = "Steel Axe",
 | |
|     groups = {}, -- key=name, value=rating; rating=1..3.
 | |
|                     if rating not applicable, use 1.
 | |
|                     eg. {wool=1, fluffy=3}
 | |
|                         {soil=2, outerspace=1, crumbly=1}
 | |
|                         {bendy=2, snappy=1},
 | |
|                         {hard=1, metal=1, spikes=1}
 | |
|     inventory_image = "default_tool_steelaxe.png",
 | |
|     wield_image = "",
 | |
|     wield_scale = {x=1,y=1,z=1},
 | |
|     stack_max = 99,
 | |
|     liquids_pointable = false,
 | |
|     tool_capabilities = {
 | |
|         full_punch_interval = 1.0,
 | |
|         max_drop_level=0,
 | |
|         groupcaps={
 | |
|             -- For example:
 | |
|             fleshy={times={[2]=0.80, [3]=0.40}, maxwear=0.05, maxlevel=1},
 | |
|             snappy={times={[2]=0.80, [3]=0.40}, maxwear=0.05, maxlevel=1},
 | |
|             choppy={times={[3]=0.90}, maxwear=0.05, maxlevel=0}
 | |
|         }
 | |
|     }
 | |
|     node_placement_prediction = nil,
 | |
|     ^ If nil and item is node, prediction is made automatically
 | |
|     ^ If nil and item is not a node, no prediction is made
 | |
|     ^ If "" and item is anything, no prediction is made
 | |
|     ^ Otherwise should be name of node which the client immediately places
 | |
|       on ground when the player places the item. Server will always update
 | |
|       actual result to client in a short moment.
 | |
| 
 | |
|     on_place = func(itemstack, placer, pointed_thing),
 | |
|     ^ Shall place item and return the leftover itemstack
 | |
|     ^ default: minetest.item_place
 | |
|     on_drop = func(itemstack, dropper, pos),
 | |
|     ^ Shall drop item and return the leftover itemstack
 | |
|     ^ default: minetest.item_drop
 | |
|     on_use = func(itemstack, user, pointed_thing),
 | |
|     ^  default: nil
 | |
|     ^ Function must return either nil if no item shall be removed from
 | |
|       inventory, or an itemstack to replace the original itemstack.
 | |
|         eg. itemstack:take_item(); return itemstack
 | |
|     ^ Otherwise, the function is free to do what it wants.
 | |
|     ^ The default functions handle regular use cases.
 | |
| }
 | |
| 
 | |
| Tile definition:
 | |
| - "image.png"
 | |
| - {name="image.png", animation={Tile Animation definition}}
 | |
| - {name="image.png", backface_culling=bool}
 | |
|   ^ backface culling only supported in special tiles
 | |
| - deprecated still supported field names:
 | |
|   - image -> name
 | |
| 
 | |
| Tile animation definition:
 | |
| - {type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}
 | |
| 
 | |
| Node definition (register_node)
 | |
| {
 | |
|     <all fields allowed in item definitions>,
 | |
| 
 | |
|     drawtype = "normal", -- See "Node drawtypes"
 | |
|     visual_scale = 1.0,
 | |
|     tiles = {tile definition 1, def2, def3, def4, def5, def6},
 | |
| 	^ Textures of node; +Y, -Y, +X, -X, +Z, -Z (old field name: tile_images)
 | |
|     ^ List can be shortened to needed length
 | |
|     special_tiles = {tile definition 1, Tile definition 2},
 | |
| 	^ Special textures of node; used rarely (old field name: special_materials)
 | |
|     ^ List can be shortened to needed length
 | |
|     alpha = 255,
 | |
|     post_effect_color = {a=0, r=0, g=0, b=0}, -- If player is inside node
 | |
|     paramtype = "none", -- See "Nodes"
 | |
|     paramtype2 = "none", -- See "Nodes"
 | |
|     is_ground_content = false, -- Currently not used for anything
 | |
|     sunlight_propagates = false, -- If true, sunlight will go infinitely through this
 | |
|     walkable = true, -- If true, objects collide with node
 | |
|     pointable = true, -- If true, can be pointed at
 | |
|     diggable = true, -- If false, can never be dug
 | |
|     climbable = false, -- If true, can be climbed on (ladder)
 | |
|     buildable_to = false, -- If true, placed nodes can replace this node
 | |
|     drop = "", -- alternatively drop = { max_items = ..., items = { ... } }
 | |
|     liquidtype = "none", -- "none"/"source"/"flowing"
 | |
|     liquid_alternative_flowing = "", -- Flowing version of source liquid
 | |
|     liquid_alternative_source = "", -- Source version of flowing liquid
 | |
|     liquid_viscosity = 0, -- Higher viscosity = slower flow (max. 7)
 | |
|     light_source = 0, -- Amount of light emitted by node
 | |
|     damage_per_second = 0, -- If player is inside node, this damage is caused
 | |
|     node_box = {type="regular"}, -- See "Node boxes"
 | |
|     selection_box = {type="regular"}, -- See "Node boxes"
 | |
|     legacy_facedir_simple = false, -- Support maps made in and before January 2012
 | |
|     legacy_wallmounted = false, -- Support maps made in and before January 2012
 | |
|     sounds = {
 | |
|         footstep = <SimpleSoundSpec>,
 | |
|         dig = <SimpleSoundSpec>, -- "__group" = group-based sound (default)
 | |
|         dug = <SimpleSoundSpec>,
 | |
|     },
 | |
| 
 | |
|     on_construct = func(pos),
 | |
|     ^ Node constructor; always called after adding node
 | |
|     ^ Can set up metadata and stuff like that
 | |
|     ^ default: nil
 | |
|     on_destruct = func(pos),
 | |
|     ^ Node destructor; always called before removing node
 | |
|     ^ default: nil
 | |
|     after_destruct = func(pos, oldnode),
 | |
|     ^ Node destructor; always called after removing node
 | |
|     ^ default: nil
 | |
| 
 | |
|     after_place_node = func(pos, placer),
 | |
|     ^ Called after constructing node when node was placed using
 | |
|       minetest.item_place_node / minetest.env:place_node
 | |
|     ^ default: nil
 | |
|     after_dig_node = func(pos, oldnode, oldmetadata, digger),
 | |
|     ^ oldmetadata is in table format
 | |
|     ^ Called after destructing node when node was dug using
 | |
|       minetest.node_dig / minetest.env:dig_node
 | |
|     ^ default: nil
 | |
|     can_dig = function(pos,player)
 | |
|     ^ returns true if node can be dug, or false if not
 | |
|     ^ default: nil
 | |
| 	
 | |
|     on_punch = func(pos, node, puncher),
 | |
|     ^ default: minetest.node_punch
 | |
|     ^ By default: does nothing
 | |
|     on_dig = func(pos, node, digger),
 | |
|     ^ default: minetest.node_dig
 | |
|     ^ By default: checks privileges, wears out tool and removes node
 | |
|     
 | |
|     on_timer = function(pos,elapsed),
 | |
|     ^ default: nil
 | |
|     ^ called by NodeTimers, see EnvRef and NodeTimerRef
 | |
|     ^ elapsed is the total time passed since the timer was started
 | |
|     ^ return true to run the timer for another cycle with the same timeout value
 | |
| 
 | |
|     on_receive_fields = func(pos, formname, fields, sender),
 | |
|     ^ fields = {name1 = value1, name2 = value2, ...}
 | |
|     ^ Called when an UI form (eg. sign text input) returns data
 | |
|     ^ default: nil
 | |
| 
 | |
| 	allow_metadata_inventory_move = func(pos, from_list, from_index,
 | |
| 			to_list, to_index, count, player),
 | |
| 	^ Called when a player wants to move items inside the inventory
 | |
| 	^ Return value: number of items allowed to move
 | |
| 	
 | |
| 	allow_metadata_inventory_put = func(pos, listname, index, stack, player),
 | |
| 	^ Called when a player wants to put something into the inventory
 | |
| 	^ Return value: number of items allowed to put
 | |
| 	^ Return value: -1: Allow and don't modify item count in inventory
 | |
|   
 | |
| 	allow_metadata_inventory_take = func(pos, listname, index, stack, player),
 | |
| 	^ Called when a player wants to take something out of the inventory
 | |
| 	^ Return value: number of items allowed to take
 | |
| 	^ Return value: -1: Allow and don't modify item count in inventory
 | |
| 
 | |
| 	on_metadata_inventory_move = func(pos, from_list, from_index,
 | |
| 			to_list, to_index, count, player),
 | |
| 	on_metadata_inventory_put = func(pos, listname, index, stack, player),
 | |
| 	on_metadata_inventory_take = func(pos, listname, index, stack, player),
 | |
| 	^ Called after the actual action has happened, according to what was allowed.
 | |
| 	^ No return value
 | |
| }
 | |
| 
 | |
| Recipe for register_craft: (shaped)
 | |
| {
 | |
|     output = 'default:pick_stone',
 | |
|     recipe = {
 | |
|         {'default:cobble', 'default:cobble', 'default:cobble'},
 | |
|         {'', 'default:stick', ''},
 | |
|         {'', 'default:stick', ''}, -- Also groups; eg. 'group:crumbly'
 | |
|     },
 | |
|     replacements = <optional list of item pairs,
 | |
|                     replace one input item with another item on crafting>
 | |
| }
 | |
| 
 | |
| Recipe for register_craft (shapeless)
 | |
| {
 | |
|     type = "shapeless",
 | |
|     output = 'mushrooms:mushroom_stew',
 | |
|     recipe = {
 | |
|         "mushrooms:bowl",
 | |
|         "mushrooms:mushroom_brown",
 | |
|         "mushrooms:mushroom_red",
 | |
|     },
 | |
|     replacements = <optional list of item pairs,
 | |
|                     replace one input item with another item on crafting>
 | |
| }
 | |
| 
 | |
| Recipe for register_craft (tool repair)
 | |
| {
 | |
|     type = "toolrepair",
 | |
|     additional_wear = -0.02,
 | |
| }
 | |
| 
 | |
| Recipe for register_craft (cooking)
 | |
| {
 | |
|     type = "cooking",
 | |
|     output = "default:glass",
 | |
|     recipe = "default:sand",
 | |
|     cooktime = 3,
 | |
| }
 | |
| 
 | |
| Recipe for register_craft (furnace fuel)
 | |
| {
 | |
|     type = "fuel",
 | |
|     recipe = "default:leaves",
 | |
|     burntime = 1,
 | |
| }
 | |
| 
 | |
| Chatcommand definition (register_chatcommand)
 | |
| {
 | |
|     params = "<name> <privilege>", -- short parameter description
 | |
|     description = "Remove privilege from player", -- full description
 | |
|     privs = {privs=true}, -- require the "privs" privilege to run
 | |
|     func = function(name, param), -- called when command is run
 | |
| }
 | |
| 
 | |
| Detached inventory callbacks
 | |
| {
 | |
| 	allow_move = func(inv, from_list, from_index, to_list, to_index, count, player),
 | |
|     ^ Called when a player wants to move items inside the inventory
 | |
| 	^ Return value: number of items allowed to move
 | |
| 	
 | |
|     allow_put = func(inv, listname, index, stack, player),
 | |
|     ^ Called when a player wants to put something into the inventory
 | |
| 	^ Return value: number of items allowed to put
 | |
| 	^ Return value: -1: Allow and don't modify item count in inventory
 | |
|    
 | |
|     allow_take = func(inv, listname, index, stack, player),
 | |
|     ^ Called when a player wants to take something out of the inventory
 | |
| 	^ Return value: number of items allowed to take
 | |
| 	^ Return value: -1: Allow and don't modify item count in inventory
 | |
| 	
 | |
| 	on_move = func(inv, from_list, from_index, to_list, to_index, count, player),
 | |
|     on_put = func(inv, listname, index, stack, player),
 | |
|     on_take = func(inv, listname, index, stack, player),
 | |
| 	^ Called after the actual action has happened, according to what was allowed.
 | |
| 	^ No return value
 | |
| }
 | |
| 
 |