Game Api
Game Api
=================
GitHub Repo: https://github.com/minetest/minetest_game
Introduction
------------
The Minetest Game subgame offers multiple new possibilities in addition to the
Minetest engine's built-in API,
allowing you to add new plants to farming mod, buckets for new liquids, new stairs
and custom panes.
For information on the Minetest API, visit
https://github.com/minetest/minetest/blob/master/doc/lua_api.txt
Please note:
Bucket API
----------
The bucket API allows registering new types of buckets for non-default liquids.
bucket.register_liquid(
"default:lava_source", -- name of the source node
"default:lava_flowing", -- name of the flowing node
"bucket:bucket_lava", -- name of the new bucket item (or nil if
liquid is not takeable)
"bucket_lava.png", -- texture of the new bucket item (ignored if
itemname == nil)
"Lava Bucket", -- text description of the bucket item
{lava_bucket = 1}, -- groups of the bucket item, OPTIONAL
false -- force-renew, OPTIONAL. Force the liquid
source to renew if it has
-- a source neighbour, even if defined as
'liquid_renewable = false'.
-- Needed to avoid creating holes in sloping
rivers.
)
The filled bucket item is returned to the player that uses an empty bucket pointing
to the given liquid source.
When punching with an empty bucket pointing to an entity or a non-liquid node, the
on_punch of the entity or node will be triggered.
Beds API
--------
beds.register_bed(
"beds:bed", -- Bed name
def -- See [#Bed definition]
)
{
description = "Simple Bed",
inventory_image = "beds_bed.png",
wield_image = "beds_bed.png",
tiles = {
bottom = {'Tile definition'}, -- the tiles of the bottom part of
the bed.
top = {Tile definition} -- the tiles of the bottom part of the
bed.
},
nodebox = {
bottom = 'regular nodebox', -- bottom part of bed (see [Node
boxes])
top = 'regular nodebox', -- top part of bed (see [Node
boxes])
},
selectionbox = 'regular nodebox', -- for both nodeboxes (see [Node
boxes])
recipe = { -- Craft recipe
{"group:wool", "group:wool", "group:wool"},
{"group:wood", "group:wood", "group:wood"}
}
}
Creative API
------------
is used to show all tools. Name is used in the sfinv page name, title is the
human readable title.
creative.is_enabled_for(name)
Doors API
---------
The doors mod allows modders to register custom doors and trapdoors.
`doors.register_door(name, def)`
`doors.register_trapdoor(name, def)`
* Registers new trapdoor
* `name` Name for trapdoor
* `def` See [#Trapdoor definition]
`doors.register_fencegate(name, def)`
`doors.get(pos)`
### Methods
Fence API
---------
Registers a new fence. Custom fields texture and material are required, as
are name and description. The rest is optional. You can pass most normal
nodedef fields here except drawtype. The fence group will always be added
for this node.
name = "default:fence_wood",
description = "Wooden Fence",
texture = "default_wood.png",
material = "default:wood",
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
sounds = default.node_sound_wood_defaults(),
Walls API
---------
The walls API allows easy addition of stone auto-connecting wall nodes.
Farming API
-----------
The farming API allows you to easily register plants and hoes.
`farming.registered_plants[name] = definition`
* Table of registered plants, indexed by plant name
{
description = "", -- Description for tooltip
inventory_image = "unknown_item.png", -- Image to be used as wield-
and inventory image
max_uses = 30, -- Uses until destroyed
material = "", -- Material for recipes
recipe = { -- Craft recipe, if material
isn't used
{"air", "air", "air"},
{"", "group:stick"},
{"", "group:stick"},
}
}
{
description = "", -- Description of seed item
inventory_image = "unknown_item.png", -- Image to be used as seed's
wield- and inventory image
steps = 8, -- How many steps the plant has
to grow, until it can be harvested
-- ^ Always provide a plant texture for each step, format:
modname_plantname_i.png (i = stepnumber)
minlight = 13, -- Minimum light to grow
maxlight = default.LIGHT_MAX -- Maximum light to grow
}
Fire API
--------
`on_burn(pos)`
`on_ignite(pos, igniter)`
* Called when Flint and steel (or a mod defined ignitor) is used on a node.
Defining it may prevent the default action (spawning flames) from triggering.
* `pos` Position of the ignited node.
* `igniter` Player that used the tool, when available.
`give_initial_stuff.give(player)`
`give_initial_stuff.add(stack)`
`give_initial_stuff.clear()`
`give_initial_stuff.get_list()`
`give_initial_stuff.set_list(list)`
`give_initial_stuff.add_from_csv(str)`
TNT API
----------
`tnt.register_tnt(definition)`
`tnt.boom(position[, definition])`
^ Create an explosion.
`tnt.burn(position, [nodename])`
^ Ignite node at position, triggering its `on_ignite` callback (see fire mod).
If no such callback exists, fallback to turn tnt group nodes to their
"_burning" variant.
nodename isn't required unless already known.
To make dropping items from node inventories easier, you can use the
following helper function from 'default':
default.get_inventory_drops(pos, inventory, drops)
The function returns no values. The drops are returned in the `drops`
parameter, and drops is not reinitialized so you can call it several
times in a row to add more inventory items to it.
`on_blast` callbacks:
`nodedef.on_blast(pos, intensity)`
^ Allow drop and node removal overriding
* `pos` - node position
* `intensity` - TNT explosion measure. larger or equal to 1.0
^ Should return a list of drops (e.g. {"default:stone"})
^ Should perform node removal itself. If callback exists in the nodedef
^ then the TNT code will not destroy this node.
`entitydef.on_blast(luaobj, damage)`
^ Allow TNT effects on entities to be overridden
* `luaobj` - LuaEntityRef of the entity
* `damage` - suggested HP damage value
^ Should return a list of (bool do_damage, bool do_knockback, table drops)
* `do_damage` - if true then TNT mod wil damage the entity
* `do_knockback` - if true then TNT mod will knock the entity away
* `drops` - a list of drops, e.g. {"wool:red"}
Screwdriver API
---------------
The screwdriver API allows you to control a node's behaviour when a screwdriver is
used on it.
To use it, add the `on_screwdriver` function to the node definition.
The sethome API adds three global functions to allow mods to read a players home
position,
set a players home position and teleport a player to home position.
`sethome.get(name)`
`sethome.set(name, pos)`
`sethome.go(name)`
Sfinv API
---------
**Pages**
**Contexts**
**Theming**
### Context
### sfinv.register_page
sfinv.register_page(name, def)
Stairs API
----------
The stairs API lets you register stairs and slabs and ensures that they are
registered the same way as those
delivered with Minetest Game, to keep them compatible with other mods.
* Registers a stair.
* `subname`: Basically the material name (e.g. cobble) used for the stair name.
Nodename pattern: "stairs:stair_subname"
* `recipeitem`: Item used in the craft recipe, e.g. "default:cobble", may be `nil`
* `groups`: see [Known damage and digging time defining groups]
* `images`: see [Tile definition]
* `description`: used for the description field in the stair's definition
* `sounds`: see [#Default sounds]
* Registers a slabs
* `subname`: Basically the material name (e.g. cobble) used for the stair name.
Nodename pattern: "stairs:stair_subname"
* `recipeitem`: Item used in the craft recipe, e.g. "default:cobble"
* `groups`: see [Known damage and digging time defining groups]
* `images`: see [Tile definition]
* `description`: used for the description field in the stair's definition
* `sounds`: see [#Default sounds]
Xpanes API
----------
Creates panes that automatically connect to each other
`xpanes.register_pane(subname, def)`
{
textures = {"texture for sides", (unused), "texture for top and
bottom"}, -- More tiles aren't supported
groups = {group = rating}, -- Uses the known node groups, see [Known
damage and digging time defining groups]
sounds = SoundSpec, -- See [#Default sounds]
recipe = {{"","","","","","","","",""}}, -- Recipe field only
}
Raillike definitions
--------------------
The following nodes use the group `connect_to_raillike` and will only connect to
raillike nodes within this group and the same group value.
Use `minetest.raillike_group(<Name>)` to get the group value.
Example:
If you want to add a new rail type and want it to connect with default:rail,
add `connect_to_raillike=minetest.raillike_group("rail")` into the `groups` table
of your node.
Default sounds
--------------
Sounds inside the default table can be used within the sounds field of node
definitions.
* `default.node_sound_defaults()`
* `default.node_sound_stone_defaults()`
* `default.node_sound_dirt_defaults()`
* `default.node_sound_sand_defaults()`
* `default.node_sound_wood_defaults()`
* `default.node_sound_leaves_defaults()`
* `default.node_sound_glass_defaults()`
* `default.node_sound_metal_defaults()`
Default constants
-----------------
The player API can register player models and update the player's appearence
`default.player_register_model(name, def)`
`default.registered_player_models[name]`
`default.player_set_model(player, model_name)`
`default.player_set_textures(player, textures)`
default.player_get_animation(player)
{
animation_speed = 30, -- Default animation speed, in FPS.
textures = {"character.png", }, -- Default array of textures.
visual_size = {x = 1, y = 1}, -- Used to scale the model.
animations = {
-- <anim_name> = {x = <start_frame>, y = <end_frame>},
foo = {x = 0, y = 19},
bar = {x = 20, y = 39},
-- ...
},
}
Leafdecay
---------
To enable leaf decay for leaves when a tree is cut down by a player,
register the tree with the default.register_leafdecay(leafdecaydef)
function.
`default.register_leafdecay(leafdecaydef)`
Dyes
----
To make recipes that will work with any dye ever made by anybody, define
them based on groups. You can select any group of groups, based on your need for
amount of colors.
* `basecolor_white`
* `basecolor_grey`
* `basecolor_black`
* `basecolor_red`
* `basecolor_yellow`
* `basecolor_green`
* `basecolor_cyan`
* `basecolor_blue`
* `basecolor_magenta`
* `excolor_white` *
* `excolor_lightgrey`
* `excolor_grey` *
* `excolor_darkgrey`
* `excolor_black` *
* `excolor_red` *
* `excolor_orange`
* `excolor_yellow` *
* `excolor_lime`
* `excolor_green` *
* `excolor_aqua`
* `excolor_cyan` *
* `excolor_sky_blue`
* `excolor_blue` *
* `excolor_violet`
* `excolor_magenta` *
* `excolor_red_violet`
* `unicolor_<excolor>`
* `unicolor_medium_<excolor>`
* `unicolor_dark_<excolor>`
* `unicolor_light_<excolor>`
* `unicolor_<excolor>_s50`
* `unicolor_medium_<excolor>_s50`
* `unicolor_dark_<excolor>_s50`
minetest.register_craft({
type = "shapeless",
output = '<mod>:item_yellow',
recipe = {'<mod>:item_no_color', 'group:basecolor_yellow'},
})
Trees
-----
* `default.grow_tree(pos, is_apple_tree)`
* Grows a mgv6 tree or apple tree at pos
* `default.grow_jungle_tree(pos)`
* Grows a mgv6 jungletree at pos
* `default.grow_pine_tree(pos)`
* Grows a mgv6 pinetree at pos
* `default.grow_new_apple_tree(pos)`
* Grows a new design apple tree at pos
* `default.grow_new_jungle_tree(pos)`
* Grows a new design jungle tree at pos
* `default.grow_new_pine_tree(pos)`
* Grows a new design pine tree at pos
* `default.grow_new_snowy_pine_tree(pos)`
* Grows a new design snowy pine tree at pos
* `default.grow_new_acacia_tree(pos)`
* Grows a new design acacia tree at pos
* `default.grow_new_aspen_tree(pos)`
* Grows a new design aspen tree at pos
* `default.grow_bush(pos)`
* Grows a bush at pos
* `default.grow_acacia_bush(pos)`
* Grows an acaia bush at pos
Carts
-----
carts.register_rail(
"mycarts:myrail", -- Rail name
nodedef, -- standard nodedef
railparams -- rail parameter struct (optional)
)
railparams = {
on_step(obj, dtime), -- Event handler called when
-- cart is on rail
acceleration, -- integer acceleration factor (negative
-- values to brake)
}
Key API
-------
The key API allows mods to add key functionality to nodes that have
ownership or specific permissions. Using the API will make it so
that a node owner can use skeleton keys on their nodes to create keys
for that node in that location, and give that key to other players,
allowing them some sort of access that they otherwise would not have
due to node protection.
To make your new nodes work with the key API, you need to register
two callback functions in each nodedef:
`on_key_use(pos, player)`
* Is called when a player right-clicks (uses) a normal key on your
* node.
* `pos` - position of the node
* `player` - PlayerRef
* return value: none, ignored
The `on_key_use` callback should validate that the player is wielding
a key item with the right key meta secret. If needed the code should
deny access to the node functionality.
Aside from the secret value, the function should retun a descriptive
name for the node and the owner name. The return values are all
encoded in the key that will be given to the player in replacement
for the wielded skeleton key.