12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277 |
- Minetest Lua Modding API Reference 0.4.dev
- ==========================================
- 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 and 4 bit integers, respectively. 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".
- 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.
- 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:
- {
- output = 'food:meat_soup_raw',
- recipe = {
- {'group:meat'},
- {'group:water'},
- {'group:bowl'},
- },
- preserve = {'group:bowl'}, -- Not implemented yet (TODO)
- }
- 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:
- invsize[<W>,<H>;]
- ^ Define the size of the menu in inventory slots
- list[<inventory location>;<list name>;<X>,<Y>;<W>,<H>;]
- ^ 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
- ^ Position and size units are inventory slots
- ^ Not implemented
- button[<X>,<Y>;<W>,<H>;<name>;<label>]
- ^ Clickable button. When clicked, fields will be sent.
- ^ Button will be visible as a field, with the value "active".
- ^ Position and size units are inventory slots
- ^ Not implemented
- 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
- 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_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))
- ^ 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. digger can be nil.
- ^ 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_chat_message(func(name, message))
- 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=}}
- 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
- 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.
- 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
- - 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_meta(pos) -- Get a NodeMetaRef at that position
- - 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)
- 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"
- 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)
- 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
- {
- physical = true,
- 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,
- }
- 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}
- }
- }
- on_place = func(itemstack, placer, pointed_thing),
- ^ default: minetest.item_place
- on_drop = func(itemstack, dropper, pos),
- ^ 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.
- }
- Node definition (register_node)
- {
- <all fields allowed in item definitions>,
- drawtype = "normal",
- visual_scale = 1.0,
- tile_images = {"default_unknown_block.png"},
- special_materials = {
- {image="", backface_culling=true},
- {image="", backface_culling=true},
- },
- alpha = 255,
- post_effect_color = {a=0, r=0, g=0, b=0},
- paramtype = "none",
- paramtype2 = "none",
- is_ground_content = false,
- sunlight_propagates = false,
- walkable = true,
- pointable = true,
- diggable = true,
- climbable = false,
- buildable_to = false,
- drop = "",
- -- alternatively drop = { max_items = ..., items = { ... } }
- liquidtype = "none",
- liquid_alternative_flowing = "",
- liquid_alternative_source = "",
- liquid_viscosity = 0,
- light_source = 0,
- damage_per_second = 0,
- selection_box = {type="regular"},
- 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_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
- on_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 metadata
- ^ Should move items, or some items, if permitted. If not, should do
- nothing.
- ^ The engine ensures the action is valid, i.e. the stack fits at the
- given position
- ^ default: minetest.node_metadata_inventory_move_allow_all
- on_metadata_inventory_offer = func(pos, listname, index, stack, player),
- ^ Called when a player wants to put something into the metadata
- inventory
- ^ Should check if the action is permitted (the engine ensures the
- action is valid, i.e. the stack fits at the given position)
- ^ If permitted, modify the metadata inventory and return the
- "leftover" stack (normally nil).
- ^ If not permitted, return itemstack.
- ^ default: minetest.node_metadata_inventory_offer_allow_all
- on_metadata_inventory_take = func(pos, listname, index, count, player),
- ^ Called when a player wants to take something out of the metadata
- inventory
- ^ Should check if the action is permitted (the engine ensures the
- action is valid, i.e. there's a stack of at least “count” items at
- that position)
- ^ If permitted, modify the metadata inventory and return the
- stack of items
- ^ If not permitted, return nil.
- ^ default: minetest.node_metadata_inventory_take_allow_all
- }
- 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
- }
|