1 -- default (Minetest 0.4 mod)
4 -- Quick documentation about the API
5 -- =================================
7 -- Helper functions defined by builtin.lua:
8 -- dump2(obj, name="_", dumped={})
9 -- dump(obj, dumped={})
15 -- $path_userdata/usermods/
18 -- On a run-in-place version (eg. the distributed windows version):
19 -- minetest-0.4.x/data/mods/
20 -- minetest-0.4.x/usermods/
21 -- minetest-0.4.x/world/worldmods/
23 -- On an installed version on linux:
24 -- /usr/share/minetest/mods/
25 -- ~/.minetest/usermods
26 -- ~/.minetest/world/worldmods
28 -- Naming convention for registered textual names
29 -- ----------------------------------------------
30 -- "modname:<whatever>" (<whatever> can have characters a-zA-Z0-9_)
32 -- This is to prevent conflicting names from corrupting maps and is
33 -- enforced by the mod loader.
35 -- Example: mod "experimental", ideal item/node/entity name "tnt":
36 -- -> the name should be "experimental:tnt".
38 -- Enforcement can be overridden by prefixing the name with ":". This can
39 -- be used for overriding the registrations of some other mod.
41 -- Example: Any mod can redefine experimental:tnt by using the name
42 -- ":experimental:tnt" when registering it.
43 -- (also that mods is required to have "experimental" as a dependency)
45 -- The legacy mod uses ":" for maintaining backwards compatibility.
49 -- Mods should generally prefix their textures with modname_, eg. given
50 -- the mod name "foomod", a texture could be called "default_foomod_superfurnace.png"
52 -- This is not crucial and a conflicting name will not corrupt maps.
54 -- Representations of simple things
55 -- --------------------------------
57 -- MapNode representation:
58 -- {name="name", param1=num, param2=num}
60 -- param1 and param2 are 8 bit and 4 bit integers, respectively. They
61 -- are reserved for certain automated functions. If you don't use these
62 -- functions, you can use them to store arbitrary values.
64 -- param1 is reserved for the engine when:
65 -- paramtype != "none"
66 -- param2 is reserved for the engine when any of these are used:
67 -- liquidtype == "flowing"
68 -- drawtype == "flowingliquid"
69 -- drawtype == "torchlike"
70 -- drawtype == "signlike"
72 -- Position representation:
73 -- {x=num, y=num, z=num}
75 -- stackstring/itemstring: A stack of items in serialized format.
76 -- eg. 'node "dirt" 5'
77 -- eg. 'tool "default:pick_wood" 21323'
78 -- eg. 'craft "apple" 2'
80 -- item: A single item in Lua table format.
81 -- eg. {type="node", name="dirt"}
82 -- ^ a single dirt node
83 -- eg. {type="tool", name="default:pick_wood", wear=21323}
84 -- ^ a wooden pick about 1/3 weared out
85 -- eg. {type="craft", name="apple"}
89 -- minetest.register_entity(name, prototype table)
90 -- minetest.register_tool(name, tool definition)
91 -- minetest.register_node(name, node definition)
92 -- minetest.register_craftitem(name, craftitem definition)
93 -- minetest.register_craft(recipe)
94 -- minetest.register_abm(abm definition)
95 -- minetest.alias_node(name, convert_to)
96 -- minetest.alias_tool(name, convert_to)
97 -- minetest.alias_craftitem(name, convert_to)
98 -- minetest.register_globalstep(func(dtime))
99 -- minetest.register_on_placenode(func(pos, newnode, placer))
100 -- minetest.register_on_dignode(func(pos, oldnode, digger))
101 -- minetest.register_on_punchnode(func(pos, node, puncher))
102 -- minetest.register_on_generated(func(minp, maxp))
103 -- minetest.register_on_newplayer(func(ObjectRef))
104 -- minetest.register_on_respawnplayer(func(ObjectRef))
105 -- ^ return true in func to disable regular player placement
106 -- minetest.register_on_chat_message(func(name, message))
107 -- minetest.add_to_creative_inventory(itemstring)
108 -- minetest.setting_get(name) -> string or nil
109 -- minetest.setting_getbool(name) -> boolean value or nil
110 -- minetest.chat_send_all(text)
111 -- minetest.chat_send_player(name, text)
112 -- minetest.get_player_privs(name) -> set of privs
114 -- stackstring_take_item(stackstring) -> stackstring, item
115 -- stackstring_put_item(stackstring, item) -> stackstring, success
116 -- stackstring_put_stackstring(stackstring, stackstring) -> stackstring, success
118 -- minetest.digprop_constanttime(time)
119 -- minetest.digprop_stonelike(toughness)
120 -- minetest.digprop_dirtlike(toughness)
121 -- minetest.digprop_gravellike(toughness)
122 -- minetest.digprop_woodlike(toughness)
123 -- minetest.digprop_leaveslike(toughness)
124 -- minetest.digprop_glasslike(toughness)
127 -- minetest.env - environment reference
130 -- minetest.registered_nodes
131 -- ^ List of registered node definitions, indexed by name
132 -- minetest.registered_craftitems
133 -- ^ List of registered craft item definitions, indexed by name
134 -- minetest.registered_entities
135 -- ^ List of registered entity prototypes, indexed by name
136 -- minetest.object_refs
137 -- ^ List of object references, indexed by active object id
138 -- minetest.luaentities
139 -- ^ List of lua entities, indexed by active object id
141 -- EnvRef is basically ServerEnvironment and ServerMap combined.
143 -- - add_node(pos, node)
144 -- - remove_node(pos)
146 -- ^ Returns {name="ignore", ...} for unloaded area
147 -- - get_node_or_nil(pos)
148 -- ^ Returns nil for unloaded area
149 -- - add_luaentity(pos, name)
150 -- - add_item(pos, itemstring)
152 -- - add_firefly(pos)
153 -- - get_meta(pos) -- Get a NodeMetaRef at that position
154 -- - get_player_by_name(name) -- Get an ObjectRef to a player
158 -- - allows_text_input()
159 -- - set_text(text) -- eg. set the text of a sign
162 -- Generic node metadata specific:
163 -- - set_infotext(infotext)
164 -- - inventory_set_list(name, {item1, item2, ...})
165 -- - inventory_get_list(name)
166 -- - set_inventory_draw_spec(string)
167 -- - set_allow_text_input(bool)
168 -- - set_allow_removal(bool)
169 -- - set_enforce_owner(bool)
170 -- - is_inventory_modified()
171 -- - reset_inventory_modified()
172 -- - is_text_modified()
173 -- - reset_text_modified()
174 -- - set_string(name, value)
175 -- - get_string(name)
177 -- ObjectRef is basically ServerActiveObject.
178 -- ObjectRef methods:
179 -- - remove(): remove object (after returning from Lua)
180 -- - getpos() -> {x=num, y=num, z=num}
181 -- - setpos(pos); pos={x=num, y=num, z=num}
182 -- - moveto(pos, continuous=false): interpolated move
183 -- - punch(puncher, time_from_last_punch)
184 -- ^ puncher = an another ObjectRef,
185 -- ^ time_from_last_punch = time since last punch action of the puncher
186 -- - right_click(clicker); clicker = an another ObjectRef
187 -- - get_wield_digging_properties() -> digging property table
188 -- - add_to_inventory_later(itemstring): like above, but after callback returns (only allowed for craftitem callbacks)
189 -- - get_hp(): returns number of hitpoints (2 * number of hearts)
190 -- - set_hp(hp): set number of hitpoints (2 * number of hearts)
191 -- LuaEntitySAO-only:
192 -- - setvelocity({x=num, y=num, z=num})
193 -- - setacceleration({x=num, y=num, z=num})
194 -- - getacceleration() -> {x=num, y=num, z=num}
195 -- - settexturemod(mod)
196 -- - setsprite(p={x=0,y=0}, num_frames=1, framelength=0.2,
197 -- - select_horiz_by_yawpitch=false)
199 -- - get_player_name(): will return nil if is not a player
200 -- - inventory_set_list(name, {item1, item2, ...})
201 -- - inventory_get_list(name) -> {item1, item2, ...}
202 -- - damage_wielded_item(num) (item damage/wear range is 0-65535)
203 -- - add_to_inventory(itemstring): add an item to object inventory
205 -- Registered entities:
206 -- - Functions receive a "luaentity" as self:
207 -- - It has the member .object, which is an ObjectRef pointing to the object
208 -- - The original prototype stuff is visible directly via a metatable
210 -- - on_activate(self, staticdata)
211 -- - on_step(self, dtime)
212 -- - on_punch(self, hitter)
213 -- - on_rightclick(self, clicker)
214 -- - get_staticdata(self)
215 -- ^ return string that will be passed to on_activate when the object
216 -- is created next time
218 -- Entity prototype table:
221 -- collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
223 -- textures = {texture,texture,texture,texture,texture,texture},
224 -- on_activate = function(self, staticdata),
225 -- on_step = function(self, dtime),
226 -- on_punch = function(self, hitter),
227 -- on_rightclick = function(self, clicker),
228 -- get_staticdata = function(self),
229 -- # Also you can define arbitrary member variables here
230 -- myvariable = whatever,
235 -- image = "default_tool_steelaxe.png",
236 -- full_punch_interval = 1.0,
239 -- dt_crackiness = -0.2,
240 -- dt_crumbliness = 1,
241 -- dt_cuttability = -0.5,
242 -- basedurability = 330,
244 -- dd_crackiness = 0,
245 -- dd_crumbliness = 0,
246 -- dd_cuttability = 0,
249 -- Node definition options:
251 -- name = "modname:somenode",
252 -- drawtype = "normal",
253 -- visual_scale = 1.0,
254 -- tile_images = {"default_unknown_block.png"},
255 -- inventory_image = "default_unknown_block.png",
256 -- special_materials = {
257 -- {image="", backface_culling=true},
258 -- {image="", backface_culling=true},
261 -- post_effect_color = {a=0, r=0, g=0, b=0},
262 -- paramtype = "none",
263 -- is_ground_content = false,
264 -- sunlight_propagates = false,
268 -- climbable = false,
269 -- buildable_to = false,
270 -- wall_mounted = false,
271 -- often_contains_mineral = false,
273 -- extra_dug_item = "",
274 -- extra_dug_item_rarity = 2,
275 -- metadata_name = "",
276 -- liquidtype = "none",
277 -- liquid_alternative_flowing = "",
278 -- liquid_alternative_source = "",
279 -- liquid_viscosity = 0,
281 -- damage_per_second = 0,
282 -- selection_box = {type="regular"},
284 -- diggablity = "normal",
291 -- cookresult_itemstring = "", -- Cannot be cooked
292 -- furnace_cooktime = 3.0,
293 -- furnace_burntime = -1, -- Cannot be used as fuel
296 -- Craftitem definition options:
297 -- minetest.register_craftitem("modname_name", {
298 -- image = "default_image.png",
299 -- stack_max = <maximum number of items in stack>,
300 -- cookresult_itemstring = itemstring (result of cooking),
301 -- furnace_cooktime = <cooking time>,
302 -- furnace_burntime = <time to burn as fuel in furnace>,
303 -- usable = <uh... some boolean value>,
304 -- dropcount = <amount of items to drop using drop action>
305 -- liquids_pointable = <whether can point liquids>,
306 -- on_drop = func(item, dropper, pos),
307 -- on_place_on_ground = func(item, placer, pos),
308 -- on_use = func(item, player, pointed_thing),
313 -- output = 'tool "default:pick_stone"',
315 -- {'node "cobble"', 'node "cobble"', 'node "cobble"'},
316 -- {'', 'craft "default:stick"', ''},
317 -- {'', 'craft "default:stick"', ''},
321 -- ABM (ActiveBlockModifier) definition:
323 -- nodenames = {"lava_source"},
324 -- neighbors = {"water_source", "water_flowing"}, -- (any of these)
325 -- ^ If left out or empty, any neighbor will do
326 -- ^ This might get removed in the future
327 -- interval = 1.0, -- (operation interval)
328 -- chance = 1, -- (chance of trigger is 1.0/this)
329 -- action = func(pos, node, active_object_count, active_object_count_wider),
337 -- Definitions made by this mod that other mods can use too
345 minetest.register_tool(":", {
359 minetest.register_tool("default:pick_wood", {
360 image = "default_tool_woodpick.png",
363 dt_crackiness = -0.5,
372 minetest.register_tool("default:pick_stone", {
373 image = "default_tool_stonepick.png",
376 dt_crackiness = -0.5,
379 basedurability = 100,
385 minetest.register_tool("default:pick_steel", {
386 image = "default_tool_steelpick.png",
389 dt_crackiness = -0.5,
392 basedurability = 333,
398 minetest.register_tool("default:pick_mese", {
399 image = "default_tool_mesepick.png",
405 basedurability = 1337,
411 minetest.register_tool("default:shovel_wood", {
412 image = "default_tool_woodshovel.png",
416 dt_crumbliness = -1.5,
417 dt_cuttability = 0.3,
424 minetest.register_tool("default:shovel_stone", {
425 image = "default_tool_stoneshovel.png",
429 dt_crumbliness = -1.5,
430 dt_cuttability = 0.1,
431 basedurability = 100,
437 minetest.register_tool("default:shovel_steel", {
438 image = "default_tool_steelshovel.png",
442 dt_crumbliness = -1.5,
443 dt_cuttability = 0.0,
444 basedurability = 330,
450 minetest.register_tool("default:axe_wood", {
451 image = "default_tool_woodaxe.png",
454 dt_crackiness = -0.2,
456 dt_cuttability = -0.5,
463 minetest.register_tool("default:axe_stone", {
464 image = "default_tool_stoneaxe.png",
467 dt_crackiness = -0.2,
469 dt_cuttability = -0.5,
470 basedurability = 100,
476 minetest.register_tool("default:axe_steel", {
477 image = "default_tool_steelaxe.png",
480 dt_crackiness = -0.2,
482 dt_cuttability = -0.5,
483 basedurability = 330,
489 minetest.register_tool("default:sword_wood", {
490 image = "default_tool_woodsword.png",
502 minetest.register_tool("default:sword_stone", {
503 image = "default_tool_stonesword.png",
509 basedurability = 100,
515 minetest.register_tool("default:sword_steel", {
516 image = "default_tool_steelsword.png",
522 basedurability = 330,
530 -- Crafting definition
533 minetest.register_craft({
534 output = 'node "default:wood" 4',
540 minetest.register_craft({
541 output = 'craft "default:stick" 4',
543 {'node "default:wood"'},
547 minetest.register_craft({
548 output = 'node "default:fence_wood" 2',
550 {'craft "default:stick"', 'craft "default:stick"', 'craft "default:stick"'},
551 {'craft "default:stick"', 'craft "default:stick"', 'craft "default:stick"'},
555 minetest.register_craft({
556 output = 'node "default:sign_wall" 1',
558 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
559 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
560 {'', 'craft "default:stick"', ''},
564 minetest.register_craft({
565 output = 'node "default:torch" 4',
567 {'craft "default:coal_lump"'},
568 {'craft "default:stick"'},
572 minetest.register_craft({
573 output = 'tool "default:pick_wood"',
575 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
576 {'', 'craft "default:stick"', ''},
577 {'', 'craft "default:stick"', ''},
581 minetest.register_craft({
582 output = 'tool "default:pick_stone"',
584 {'node "cobble"', 'node "cobble"', 'node "cobble"'},
585 {'', 'craft "default:stick"', ''},
586 {'', 'craft "default:stick"', ''},
590 minetest.register_craft({
591 output = 'tool "default:pick_steel"',
593 {'craft "default:steel_ingot"', 'craft "default:steel_ingot"', 'craft "default:steel_ingot"'},
594 {'', 'craft "default:stick"', ''},
595 {'', 'craft "default:stick"', ''},
599 minetest.register_craft({
600 output = 'tool "default:pick_mese"',
602 {'node "mese"', 'node "mese"', 'node "mese"'},
603 {'', 'craft "default:stick"', ''},
604 {'', 'craft "default:stick"', ''},
608 minetest.register_craft({
609 output = 'tool "default:shovel_wood"',
611 {'node "default:wood"'},
612 {'craft "default:stick"'},
613 {'craft "default:stick"'},
617 minetest.register_craft({
618 output = 'tool "default:shovel_stone"',
621 {'craft "default:stick"'},
622 {'craft "default:stick"'},
626 minetest.register_craft({
627 output = 'tool "default:shovel_steel"',
629 {'craft "default:steel_ingot"'},
630 {'craft "default:stick"'},
631 {'craft "default:stick"'},
635 minetest.register_craft({
636 output = 'tool "default:axe_wood"',
638 {'node "default:wood"', 'node "default:wood"'},
639 {'node "default:wood"', 'craft "default:stick"'},
640 {'', 'craft "default:stick"'},
644 minetest.register_craft({
645 output = 'tool "default:axe_stone"',
647 {'node "cobble"', 'node "cobble"'},
648 {'node "cobble"', 'craft "default:stick"'},
649 {'', 'craft "default:stick"'},
653 minetest.register_craft({
654 output = 'tool "default:axe_steel"',
656 {'craft "default:steel_ingot"', 'craft "default:steel_ingot"'},
657 {'craft "default:steel_ingot"', 'craft "default:stick"'},
658 {'', 'craft "default:stick"'},
662 minetest.register_craft({
663 output = 'tool "default:sword_wood"',
665 {'node "default:wood"'},
666 {'node "default:wood"'},
667 {'craft "default:stick"'},
671 minetest.register_craft({
672 output = 'tool "default:sword_stone"',
676 {'craft "default:stick"'},
680 minetest.register_craft({
681 output = 'tool "default:sword_steel"',
683 {'craft "default:steel_ingot"'},
684 {'craft "default:steel_ingot"'},
685 {'craft "default:stick"'},
689 minetest.register_craft({
690 output = 'node "default:rail" 15',
692 {'craft "default:steel_ingot"', '', 'craft "default:steel_ingot"'},
693 {'craft "default:steel_ingot"', 'craft "default:stick"', 'craft "default:steel_ingot"'},
694 {'craft "default:steel_ingot"', '', 'craft "default:steel_ingot"'},
698 minetest.register_craft({
699 output = 'node "default:chest" 1',
701 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
702 {'node "default:wood"', '', 'node "default:wood"'},
703 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
707 minetest.register_craft({
708 output = 'node "default:chest_locked" 1',
710 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
711 {'node "default:wood"', 'craft "default:steel_ingot"', 'node "default:wood"'},
712 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
716 minetest.register_craft({
717 output = 'node "default:furnace" 1',
719 {'node "cobble"', 'node "cobble"', 'node "cobble"'},
720 {'node "cobble"', '', 'node "cobble"'},
721 {'node "cobble"', 'node "cobble"', 'node "cobble"'},
725 minetest.register_craft({
726 output = 'node "default:steelblock" 1',
728 {'craft "default:steel_ingot"', 'craft "default:steel_ingot"', 'craft "default:steel_ingot"'},
729 {'craft "default:steel_ingot"', 'craft "default:steel_ingot"', 'craft "default:steel_ingot"'},
730 {'craft "default:steel_ingot"', 'craft "default:steel_ingot"', 'craft "default:steel_ingot"'},
734 minetest.register_craft({
735 output = 'node "default:sandstone" 1',
737 {'node "sand"', 'node "sand"'},
738 {'node "sand"', 'node "sand"'},
742 minetest.register_craft({
743 output = 'node "default:clay" 1',
745 {'craft "default:clay_lump"', 'craft "default:clay_lump"'},
746 {'craft "default:clay_lump"', 'craft "default:clay_lump"'},
750 minetest.register_craft({
751 output = 'node "default:brick" 1',
753 {'craft "default:clay_brick"', 'craft "default:clay_brick"'},
754 {'craft "default:clay_brick"', 'craft "default:clay_brick"'},
758 minetest.register_craft({
759 output = 'craft "default:paper" 1',
761 {'node "papyrus"', 'node "papyrus"', 'node "papyrus"'},
765 minetest.register_craft({
766 output = 'craft "default:book" 1',
768 {'craft "default:paper"'},
769 {'craft "default:paper"'},
770 {'craft "default:paper"'},
774 minetest.register_craft({
775 output = 'node "default:bookshelf" 1',
777 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
778 {'craft "default:book"', 'craft "default:book"', 'craft "default:book"'},
779 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
783 minetest.register_craft({
784 output = 'node "default:ladder" 1',
786 {'craft "default:stick"', '', 'craft "default:stick"'},
787 {'craft "default:stick"', 'craft "default:stick"', 'craft "default:stick"'},
788 {'craft "default:stick"', '', 'craft "default:stick"'},
796 minetest.register_node("default:stone", {
797 tile_images = {"default_stone.png"},
798 inventory_image = minetest.inventorycube("default_stone.png"),
799 paramtype = "mineral",
800 is_ground_content = true,
801 often_contains_mineral = true, -- Texture atlas hint
802 material = minetest.digprop_stonelike(1.0),
803 dug_item = 'node "cobble" 1',
806 minetest.register_node("default:dirt_with_grass", {
807 tile_images = {"default_grass.png", "default_dirt.png", "default_dirt.png^default_grass_side.png"},
808 inventory_image = minetest.inventorycube("default_dirt.png^default_grass_side.png"),
809 is_ground_content = true,
810 material = minetest.digprop_dirtlike(1.0),
811 dug_item = 'node "dirt" 1',
814 minetest.register_node("default:dirt_with_grass_footsteps", {
815 tile_images = {"default_grass_footsteps.png", "default_dirt.png", "default_dirt.png^default_grass_side.png"},
816 inventory_image = "default_grass_footsteps.png",
817 is_ground_content = true,
818 material = minetest.digprop_dirtlike(1.0),
819 dug_item = 'node "dirt" 1',
822 minetest.register_node("default:dirt", {
823 tile_images = {"default_dirt.png"},
824 inventory_image = minetest.inventorycube("default_dirt.png"),
825 is_ground_content = true,
826 material = minetest.digprop_dirtlike(1.0),
829 minetest.register_node("default:sand", {
830 tile_images = {"default_sand.png"},
831 inventory_image = minetest.inventorycube("default_sand.png"),
832 is_ground_content = true,
833 material = minetest.digprop_dirtlike(1.0),
834 cookresult_itemstring = 'node "glass" 1',
837 minetest.register_node("default:gravel", {
838 tile_images = {"default_gravel.png"},
839 inventory_image = minetest.inventorycube("default_gravel.png"),
840 is_ground_content = true,
841 material = minetest.digprop_gravellike(1.0),
844 minetest.register_node("default:sandstone", {
845 tile_images = {"default_sandstone.png"},
846 inventory_image = minetest.inventorycube("default_sandstone.png"),
847 is_ground_content = true,
848 material = minetest.digprop_dirtlike(1.0), -- FIXME should this be stonelike?
849 dug_item = 'node "sand" 1', -- FIXME is this intentional?
852 minetest.register_node("default:clay", {
853 tile_images = {"default_clay.png"},
854 inventory_image = minetest.inventorycube("default_clay.png"),
855 is_ground_content = true,
856 material = minetest.digprop_dirtlike(1.0),
857 dug_item = 'craft "default:clay_lump" 4',
860 minetest.register_node("default:brick", {
861 tile_images = {"default_brick.png"},
862 inventory_image = minetest.inventorycube("default_brick.png"),
863 is_ground_content = true,
864 material = minetest.digprop_stonelike(1.0),
865 dug_item = 'craft "default:clay_brick" 4',
868 minetest.register_node("default:tree", {
869 tile_images = {"default_tree_top.png", "default_tree_top.png", "default_tree.png"},
870 inventory_image = minetest.inventorycube("default_tree_top.png", "default_tree.png", "default_tree.png"),
871 is_ground_content = true,
872 material = minetest.digprop_woodlike(1.0),
873 cookresult_itemstring = 'craft "default:coal_lump" 1',
874 furnace_burntime = 30,
877 minetest.register_node("default:jungletree", {
878 tile_images = {"default_jungletree_top.png", "default_jungletree_top.png", "default_jungletree.png"},
879 inventory_image = minetest.inventorycube("default_jungletree_top.png", "default_jungletree.png", "default_jungletree.png"),
880 is_ground_content = true,
881 material = minetest.digprop_woodlike(1.0),
882 cookresult_itemstring = 'craft "default:coal_lump" 1',
883 furnace_burntime = 30,
886 minetest.register_node("default:junglegrass", {
887 drawtype = "plantlike",
889 tile_images = {"default_junglegrass.png"},
890 inventory_image = "default_junglegrass.png",
893 material = minetest.digprop_leaveslike(1.0),
894 furnace_burntime = 2,
897 minetest.register_node("default:leaves", {
898 drawtype = "allfaces_optional",
900 tile_images = {"default_leaves.png"},
901 inventory_image = minetest.inventorycube("default_leaves.png"),
903 material = minetest.digprop_leaveslike(1.0),
904 extra_dug_item = 'node "sapling" 1',
905 extra_dug_item_rarity = 20,
906 furnace_burntime = 1,
909 minetest.register_node("default:cactus", {
910 tile_images = {"default_cactus_top.png", "default_cactus_top.png", "default_cactus_side.png"},
911 inventory_image = minetest.inventorycube("default_cactus_top.png", "default_cactus_side.png", "default_cactus_side.png"),
912 is_ground_content = true,
913 material = minetest.digprop_woodlike(0.75),
914 furnace_burntime = 15,
917 minetest.register_node("default:papyrus", {
918 drawtype = "plantlike",
919 tile_images = {"default_papyrus.png"},
920 inventory_image = "default_papyrus.png",
922 is_ground_content = true,
924 material = minetest.digprop_leaveslike(0.5),
925 furnace_burntime = 1,
928 minetest.register_node("default:bookshelf", {
929 tile_images = {"default_wood.png", "default_wood.png", "default_bookshelf.png"},
930 inventory_image = minetest.inventorycube("default_wood.png", "default_bookshelf.png", "default_bookshelf.png"),
931 is_ground_content = true,
932 material = minetest.digprop_woodlike(0.75),
933 furnace_burntime = 30,
936 minetest.register_node("default:glass", {
937 drawtype = "glasslike",
938 tile_images = {"default_glass.png"},
939 inventory_image = minetest.inventorycube("default_glass.png"),
941 sunlight_propagates = true,
942 is_ground_content = true,
943 material = minetest.digprop_glasslike(1.0),
946 minetest.register_node("default:fence_wood", {
947 drawtype = "fencelike",
948 tile_images = {"default_wood.png"},
949 inventory_image = "default_fence.png",
951 is_ground_content = true,
954 fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7},
956 furnace_burntime = 15,
957 material = minetest.digprop_woodlike(0.75),
960 minetest.register_node("default:rail", {
961 drawtype = "raillike",
962 tile_images = {"default_rail.png", "default_rail_curved.png", "default_rail_t_junction.png", "default_rail_crossing.png"},
963 inventory_image = "default_rail.png",
965 is_ground_content = true,
971 material = minetest.digprop_dirtlike(0.75),
974 minetest.register_node("default:ladder", {
975 drawtype = "signlike",
976 tile_images = {"default_ladder.png"},
977 inventory_image = "default_ladder.png",
979 is_ground_content = true,
984 type = "wallmounted",
985 --wall_top = = <default>
986 --wall_bottom = = <default>
987 --wall_side = = <default>
989 furnace_burntime = 5,
990 material = minetest.digprop_woodlike(0.5),
993 minetest.register_node("default:wood", {
994 tile_images = {"default_wood.png"},
995 inventory_image = minetest.inventorycube("default_wood.png"),
996 is_ground_content = true,
997 furnace_burntime = 7,
998 material = minetest.digprop_woodlike(0.75),
1001 minetest.register_node("default:mese", {
1002 tile_images = {"default_mese.png"},
1003 inventory_image = minetest.inventorycube("default_mese.png"),
1004 is_ground_content = true,
1005 furnace_burntime = 30,
1006 material = minetest.digprop_stonelike(0.5),
1009 minetest.register_node("default:cloud", {
1010 tile_images = {"default_cloud.png"},
1011 inventory_image = minetest.inventorycube("default_cloud.png"),
1012 is_ground_content = true,
1015 minetest.register_node("default:water_flowing", {
1016 drawtype = "flowingliquid",
1017 tile_images = {"default_water.png"},
1018 alpha = WATER_ALPHA,
1019 inventory_image = minetest.inventorycube("default_water.png"),
1020 paramtype = "light",
1024 buildable_to = true,
1025 liquidtype = "flowing",
1026 liquid_alternative_flowing = "water_flowing",
1027 liquid_alternative_source = "water_source",
1028 liquid_viscosity = WATER_VISC,
1029 post_effect_color = {a=64, r=100, g=100, b=200},
1030 special_materials = {
1031 {image="default_water.png", backface_culling=false},
1032 {image="default_water.png", backface_culling=true},
1036 minetest.register_node("default:water_source", {
1037 drawtype = "liquid",
1038 tile_images = {"default_water.png"},
1039 alpha = WATER_ALPHA,
1040 inventory_image = minetest.inventorycube("default_water.png"),
1041 paramtype = "light",
1045 buildable_to = true,
1046 liquidtype = "source",
1047 liquid_alternative_flowing = "water_flowing",
1048 liquid_alternative_source = "water_source",
1049 liquid_viscosity = WATER_VISC,
1050 post_effect_color = {a=64, r=100, g=100, b=200},
1051 special_materials = {
1052 -- New-style water source material (mostly unused)
1053 {image="default_water.png", backface_culling=false},
1057 minetest.register_node("default:lava_flowing", {
1058 drawtype = "flowingliquid",
1059 tile_images = {"default_lava.png"},
1060 inventory_image = minetest.inventorycube("default_lava.png"),
1061 paramtype = "light",
1062 light_source = LIGHT_MAX - 1,
1066 buildable_to = true,
1067 liquidtype = "flowing",
1068 liquid_alternative_flowing = "lava_flowing",
1069 liquid_alternative_source = "lava_source",
1070 liquid_viscosity = LAVA_VISC,
1071 damage_per_second = 4*2,
1072 post_effect_color = {a=192, r=255, g=64, b=0},
1073 special_materials = {
1074 {image="default_lava.png", backface_culling=false},
1075 {image="default_lava.png", backface_culling=true},
1079 minetest.register_node("default:lava_source", {
1080 drawtype = "liquid",
1081 tile_images = {"default_lava.png"},
1082 inventory_image = minetest.inventorycube("default_lava.png"),
1083 paramtype = "light",
1084 light_source = LIGHT_MAX - 1,
1088 buildable_to = true,
1089 liquidtype = "source",
1090 liquid_alternative_flowing = "lava_flowing",
1091 liquid_alternative_source = "lava_source",
1092 liquid_viscosity = LAVA_VISC,
1093 damage_per_second = 4*2,
1094 post_effect_color = {a=192, r=255, g=64, b=0},
1095 special_materials = {
1096 -- New-style lava source material (mostly unused)
1097 {image="default_lava.png", backface_culling=false},
1099 furnace_burntime = 60,
1102 minetest.register_node("default:torch", {
1103 drawtype = "torchlike",
1104 tile_images = {"default_torch_on_floor.png", "default_torch_on_ceiling.png", "default_torch.png"},
1105 inventory_image = "default_torch_on_floor.png",
1106 paramtype = "light",
1107 sunlight_propagates = true,
1109 wall_mounted = true,
1110 light_source = LIGHT_MAX-1,
1112 type = "wallmounted",
1113 wall_top = {-0.1, 0.5-0.6, -0.1, 0.1, 0.5, 0.1},
1114 wall_bottom = {-0.1, -0.5, -0.1, 0.1, -0.5+0.6, 0.1},
1115 wall_side = {-0.5, -0.3, -0.1, -0.5+0.3, 0.3, 0.1},
1117 material = minetest.digprop_constanttime(0.0),
1118 furnace_burntime = 4,
1121 minetest.register_node("default:sign_wall", {
1122 drawtype = "signlike",
1123 tile_images = {"default_sign_wall.png"},
1124 inventory_image = "default_sign_wall.png",
1125 paramtype = "light",
1126 sunlight_propagates = true,
1128 wall_mounted = true,
1129 metadata_name = "sign",
1131 type = "wallmounted",
1132 --wall_top = <default>
1133 --wall_bottom = <default>
1134 --wall_side = <default>
1136 material = minetest.digprop_constanttime(0.5),
1137 furnace_burntime = 10,
1140 minetest.register_node("default:chest", {
1141 tile_images = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
1142 "default_chest_side.png", "default_chest_side.png", "default_chest_front.png"},
1143 inventory_image = minetest.inventorycube("default_chest_top.png", "default_chest_front.png", "default_chest_side.png"),
1144 paramtype = "facedir_simple",
1145 metadata_name = "chest",
1146 material = minetest.digprop_woodlike(1.0),
1147 furnace_burntime = 30,
1150 minetest.register_node("default:chest_locked", {
1151 tile_images = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
1152 "default_chest_side.png", "default_chest_side.png", "default_chest_lock.png"},
1153 inventory_image = minetest.inventorycube("default_chest_top.png", "default_chest_lock.png", "default_chest_side.png"),
1154 paramtype = "facedir_simple",
1155 metadata_name = "locked_chest",
1156 material = minetest.digprop_woodlike(1.0),
1157 furnace_burntime = 30,
1160 minetest.register_node("default:furnace", {
1161 tile_images = {"default_furnace_side.png", "default_furnace_side.png", "default_furnace_side.png",
1162 "default_furnace_side.png", "default_furnace_side.png", "default_furnace_front.png"},
1163 inventory_image = minetest.inventorycube("default_furnace_side.png", "default_furnace_front.png", "default_furnace_side.png"),
1164 paramtype = "facedir_simple",
1165 metadata_name = "furnace",
1166 material = minetest.digprop_stonelike(3.0),
1169 minetest.register_node("default:cobble", {
1170 tile_images = {"default_cobble.png"},
1171 inventory_image = minetest.inventorycube("default_cobble.png"),
1172 is_ground_content = true,
1173 cookresult_itemstring = 'node "stone" 1',
1174 material = minetest.digprop_stonelike(0.9),
1177 minetest.register_node("default:mossycobble", {
1178 tile_images = {"default_mossycobble.png"},
1179 inventory_image = minetest.inventorycube("default_mossycobble.png"),
1180 is_ground_content = true,
1181 material = minetest.digprop_stonelike(0.8),
1184 minetest.register_node("default:steelblock", {
1185 tile_images = {"default_steel_block.png"},
1186 inventory_image = minetest.inventorycube("default_steel_block.png"),
1187 is_ground_content = true,
1188 material = minetest.digprop_stonelike(5.0),
1191 minetest.register_node("default:nyancat", {
1192 tile_images = {"default_nc_side.png", "default_nc_side.png", "default_nc_side.png",
1193 "default_nc_side.png", "default_nc_back.png", "default_nc_front.png"},
1194 inventory_image = "default_nc_front.png",
1195 paramtype = "facedir_simple",
1196 material = minetest.digprop_stonelike(3.0),
1197 furnace_burntime = 1,
1200 minetest.register_node("default:nyancat_rainbow", {
1201 tile_images = {"default_nc_rb.png"},
1202 inventory_image = "default_nc_rb.png",
1203 material = minetest.digprop_stonelike(3.0),
1204 furnace_burntime = 1,
1207 minetest.register_node("default:sapling", {
1208 drawtype = "plantlike",
1210 tile_images = {"default_sapling.png"},
1211 inventory_image = "default_sapling.png",
1212 paramtype = "light",
1214 material = minetest.digprop_constanttime(0.0),
1215 furnace_burntime = 10,
1218 minetest.register_node("default:apple", {
1219 drawtype = "plantlike",
1221 tile_images = {"default_apple.png"},
1222 inventory_image = "default_apple.png",
1223 paramtype = "light",
1224 sunlight_propagates = true,
1226 dug_item = 'craft "apple" 1',
1227 material = minetest.digprop_constanttime(0.0),
1228 furnace_burntime = 3,
1235 minetest.register_craftitem("default:stick", {
1236 image = "default_stick.png",
1237 --furnace_burntime = ...,
1238 on_place_on_ground = minetest.craftitem_place_item,
1241 minetest.register_craftitem("default:paper", {
1242 image = "default_paper.png",
1243 on_place_on_ground = minetest.craftitem_place_item,
1246 minetest.register_craftitem("default:book", {
1247 image = "default_book.png",
1248 on_place_on_ground = minetest.craftitem_place_item,
1251 minetest.register_craftitem("default:coal_lump", {
1252 image = "default_coal_lump.png",
1253 furnace_burntime = 40;
1254 on_place_on_ground = minetest.craftitem_place_item,
1257 minetest.register_craftitem("default:iron_lump", {
1258 image = "default_iron_lump.png",
1259 cookresult_itemstring = 'craft "default:steel_ingot" 1',
1260 on_place_on_ground = minetest.craftitem_place_item,
1263 minetest.register_craftitem("default:clay_lump", {
1264 image = "default_clay_lump.png",
1265 cookresult_itemstring = 'craft "default:clay_brick" 1',
1266 on_place_on_ground = minetest.craftitem_place_item,
1269 minetest.register_craftitem("default:steel_ingot", {
1270 image = "default_steel_ingot.png",
1271 on_place_on_ground = minetest.craftitem_place_item,
1274 minetest.register_craftitem("default:clay_brick", {
1275 image = "default_clay_brick.png",
1276 on_place_on_ground = minetest.craftitem_place_item,
1279 minetest.register_craftitem("default:scorched_stuff", {
1280 image = "default_scorched_stuff.png",
1281 on_place_on_ground = minetest.craftitem_place_item,
1284 minetest.register_craftitem("default:apple", {
1285 image = "default_apple.png",
1286 on_place_on_ground = minetest.craftitem_place_item,
1287 on_use = minetest.craftitem_eat(4),
1291 -- Creative inventory
1294 minetest.add_to_creative_inventory('tool "default:pick_mese" 0')
1295 minetest.add_to_creative_inventory('tool "default:pick_steel" 0')
1296 minetest.add_to_creative_inventory('tool "default:axe_steel" 0')
1297 minetest.add_to_creative_inventory('tool "default:shovel_steel" 0')
1299 minetest.add_to_creative_inventory('node "default:torch" 0')
1300 minetest.add_to_creative_inventory('node "default:cobble" 0')
1301 minetest.add_to_creative_inventory('node "default:dirt" 0')
1302 minetest.add_to_creative_inventory('node "default:stone" 0')
1303 minetest.add_to_creative_inventory('node "default:sand" 0')
1304 minetest.add_to_creative_inventory('node "default:sandstone" 0')
1305 minetest.add_to_creative_inventory('node "default:clay" 0')
1306 minetest.add_to_creative_inventory('node "default:brick" 0')
1307 minetest.add_to_creative_inventory('node "default:tree" 0')
1308 minetest.add_to_creative_inventory('node "default:leaves" 0')
1309 minetest.add_to_creative_inventory('node "default:cactus" 0')
1310 minetest.add_to_creative_inventory('node "default:papyrus" 0')
1311 minetest.add_to_creative_inventory('node "default:bookshelf" 0')
1312 minetest.add_to_creative_inventory('node "default:glass" 0')
1313 minetest.add_to_creative_inventory('node "default:fence" 0')
1314 minetest.add_to_creative_inventory('node "default:rail" 0')
1315 minetest.add_to_creative_inventory('node "default:mese" 0')
1316 minetest.add_to_creative_inventory('node "default:chest" 0')
1317 minetest.add_to_creative_inventory('node "default:furnace" 0')
1318 minetest.add_to_creative_inventory('node "default:sign_wall" 0')
1319 minetest.add_to_creative_inventory('node "default:water_source" 0')
1320 minetest.add_to_creative_inventory('node "default:lava_source" 0')
1321 minetest.add_to_creative_inventory('node "default:ladder" 0')
1324 -- Some common functions
1327 default.falling_node_names = {}
1329 function nodeupdate_single(p)
1330 n = minetest.env:get_node(p)
1331 if default.falling_node_names[n.name] ~= nil then
1332 p_bottom = {x=p.x, y=p.y-1, z=p.z}
1333 n_bottom = minetest.env:get_node(p_bottom)
1334 if n_bottom.name == "air" then
1335 minetest.env:remove_node(p)
1336 minetest.env:add_luaentity(p, "default:falling_"..n.name)
1342 function nodeupdate(p)
1346 p2 = {x=p.x+x, y=p.y+y, z=p.z+z}
1347 nodeupdate_single(p2)
1357 function default.register_falling_node(nodename, texture)
1358 default.falling_node_names[nodename] = true
1359 -- Override naming conventions for stuff like :default:falling_default:sand
1360 minetest.register_entity(":default:falling_"..nodename, {
1361 -- Static definition
1363 collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
1365 textures = {texture,texture,texture,texture,texture,texture},
1368 on_step = function(self, dtime)
1370 self.object:setacceleration({x=0, y=-10, z=0})
1371 -- Turn to actual sand when collides to ground or just move
1372 local pos = self.object:getpos()
1373 local bcp = {x=pos.x, y=pos.y-0.7, z=pos.z} -- Position of bottom center point
1374 local bcn = minetest.env:get_node(bcp)
1375 if bcn.name ~= "air" then
1376 -- Turn to a sand node
1377 local np = {x=bcp.x, y=bcp.y+1, z=bcp.z}
1378 minetest.env:add_node(np, {name=nodename})
1379 self.object:remove()
1387 default.register_falling_node("default:sand", "default_sand.png")
1388 default.register_falling_node("default:gravel", "default_gravel.png")
1394 -- Global environment step function
1395 function on_step(dtime)
1398 minetest.register_globalstep(on_step)
1400 function on_placenode(p, node)
1401 --print("on_placenode")
1404 minetest.register_on_placenode(on_placenode)
1406 function on_dignode(p, node)
1407 --print("on_dignode")
1410 minetest.register_on_dignode(on_dignode)
1412 function on_punchnode(p, node)
1414 minetest.register_on_punchnode(on_punchnode)
1416 minetest.register_on_chat_message(function(name, message)
1417 --print("default on_chat_message: name="..dump(name).." message="..dump(message))
1418 local cmd = "/giveme"
1419 if message:sub(0, #cmd) == cmd then
1420 if not minetest.get_player_privs(name)["give"] then
1421 minetest.chat_send_player(name, "you don't have permission to give")
1422 return true -- Handled chat message
1424 local stackstring = string.match(message, cmd.." (.*)")
1425 if stackstring == nil then
1426 minetest.chat_send_player(name, 'usage: '..cmd..' stackstring')
1427 return true -- Handled chat message
1429 print(cmd..' invoked, stackstring="'..stackstring..'"')
1430 local player = minetest.env:get_player_by_name(name)
1431 if player == nil then
1432 minetest.chat_send_player(name, name2..' is not a known player')
1433 return true -- Handled chat message
1435 local added, error_msg = player:add_to_inventory(stackstring)
1437 minetest.chat_send_player(name, '"'..stackstring
1438 ..'" added to inventory.');
1440 minetest.chat_send_player(name, 'Could not give "'..stackstring
1441 ..'": '..error_msg);
1443 return true -- Handled chat message
1446 if message:sub(0, #cmd) == cmd then
1447 if not minetest.get_player_privs(name)["give"] then
1448 minetest.chat_send_player(name, "you don't have permission to give")
1449 return true -- Handled chat message
1451 local name2, stackstring = string.match(message, cmd.." ([%a%d_-]+) (.*)")
1452 if name == nil or stackstring == nil then
1453 minetest.chat_send_player(name, 'usage: '..cmd..' name stackstring')
1454 return true -- Handled chat message
1456 print(cmd..' invoked, name2="'..name2
1457 ..'" stackstring="'..stackstring..'"')
1458 local player = minetest.env:get_player_by_name(name2)
1459 if player == nil then
1460 minetest.chat_send_player(name, name2..' is not a known player')
1461 return true -- Handled chat message
1463 local added, error_msg = player:add_to_inventory(stackstring)
1465 minetest.chat_send_player(name, '"'..stackstring
1466 ..'" added to '..name2..'\'s inventory.');
1467 minetest.chat_send_player(name2, '"'..stackstring
1468 ..'" added to inventory.');
1470 minetest.chat_send_player(name, 'Could not give "'..stackstring
1471 ..'": '..error_msg);
1473 return true -- Handled chat message
1478 -- Done, print some random stuff
1481 --print("minetest.registered_entities:")
1482 --dump2(minetest.registered_entities)