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.register_globalstep(func(dtime))
96 -- minetest.register_on_placenode(func(pos, newnode, placer))
97 -- minetest.register_on_dignode(func(pos, oldnode, digger))
98 -- minetest.register_on_punchnode(func(pos, node, puncher))
99 -- minetest.register_on_generated(func(minp, maxp))
100 -- minetest.register_on_newplayer(func(ObjectRef))
101 -- minetest.register_on_respawnplayer(func(ObjectRef))
102 -- ^ return true in func to disable regular player placement
103 -- minetest.register_on_chat_message(func(name, message))
104 -- minetest.add_to_creative_inventory(itemstring)
105 -- minetest.setting_get(name) -> string or nil
106 -- minetest.setting_getbool(name) -> boolean value or nil
107 -- minetest.chat_send_all(text)
108 -- minetest.chat_send_player(name, text)
109 -- minetest.get_player_privs(name) -> set of privs
111 -- stackstring_take_item(stackstring) -> stackstring, item
112 -- stackstring_put_item(stackstring, item) -> stackstring, success
113 -- stackstring_put_stackstring(stackstring, stackstring) -> stackstring, success
115 -- minetest.digprop_constanttime(time)
116 -- minetest.digprop_stonelike(toughness)
117 -- minetest.digprop_dirtlike(toughness)
118 -- minetest.digprop_gravellike(toughness)
119 -- minetest.digprop_woodlike(toughness)
120 -- minetest.digprop_leaveslike(toughness)
121 -- minetest.digprop_glasslike(toughness)
124 -- minetest.env - environment reference
127 -- minetest.registered_nodes
128 -- ^ List of registered node definitions, indexed by name
129 -- minetest.registered_craftitems
130 -- ^ List of registered craft item definitions, indexed by name
131 -- minetest.registered_entities
132 -- ^ List of registered entity prototypes, indexed by name
133 -- minetest.object_refs
134 -- ^ List of object references, indexed by active object id
135 -- minetest.luaentities
136 -- ^ List of lua entities, indexed by active object id
138 -- EnvRef is basically ServerEnvironment and ServerMap combined.
140 -- - add_node(pos, node)
141 -- - remove_node(pos)
143 -- ^ Returns {name="ignore", ...} for unloaded area
144 -- - get_node_or_nil(pos)
145 -- ^ Returns nil for unloaded area
146 -- - add_luaentity(pos, name)
147 -- - add_item(pos, itemstring)
149 -- - add_firefly(pos)
150 -- - get_meta(pos) -- Get a NodeMetaRef at that position
151 -- - get_player_by_name(name) -- Get an ObjectRef to a player
155 -- - allows_text_input()
156 -- - set_text(text) -- eg. set the text of a sign
159 -- Generic node metadata specific:
160 -- - set_infotext(infotext)
161 -- - inventory_set_list(name, {item1, item2, ...})
162 -- - inventory_get_list(name)
163 -- - set_inventory_draw_spec(string)
164 -- - set_allow_text_input(bool)
165 -- - set_allow_removal(bool)
166 -- - set_enforce_owner(bool)
167 -- - is_inventory_modified()
168 -- - reset_inventory_modified()
169 -- - is_text_modified()
170 -- - reset_text_modified()
171 -- - set_string(name, value)
172 -- - get_string(name)
174 -- ObjectRef is basically ServerActiveObject.
175 -- ObjectRef methods:
176 -- - remove(): remove object (after returning from Lua)
177 -- - getpos() -> {x=num, y=num, z=num}
178 -- - setpos(pos); pos={x=num, y=num, z=num}
179 -- - moveto(pos, continuous=false): interpolated move
180 -- - punch(puncher, time_from_last_punch)
181 -- ^ puncher = an another ObjectRef,
182 -- ^ time_from_last_punch = time since last punch action of the puncher
183 -- - right_click(clicker); clicker = an another ObjectRef
184 -- - get_wield_digging_properties() -> digging property table
185 -- - add_to_inventory_later(itemstring): like above, but after callback returns (only allowed for craftitem callbacks)
186 -- - get_hp(): returns number of hitpoints (2 * number of hearts)
187 -- - set_hp(hp): set number of hitpoints (2 * number of hearts)
188 -- LuaEntitySAO-only:
189 -- - setvelocity({x=num, y=num, z=num})
190 -- - setacceleration({x=num, y=num, z=num})
191 -- - getacceleration() -> {x=num, y=num, z=num}
192 -- - settexturemod(mod)
193 -- - setsprite(p={x=0,y=0}, num_frames=1, framelength=0.2,
194 -- - select_horiz_by_yawpitch=false)
196 -- - get_player_name(): will return nil if is not a player
197 -- - inventory_set_list(name, {item1, item2, ...})
198 -- - inventory_get_list(name) -> {item1, item2, ...}
199 -- - damage_wielded_item(num) (item damage/wear range is 0-65535)
200 -- - add_to_inventory(itemstring): add an item to object inventory
202 -- Registered entities:
203 -- - Functions receive a "luaentity" as self:
204 -- - It has the member .object, which is an ObjectRef pointing to the object
205 -- - The original prototype stuff is visible directly via a metatable
207 -- - on_activate(self, staticdata)
208 -- - on_step(self, dtime)
209 -- - on_punch(self, hitter)
210 -- - on_rightclick(self, clicker)
211 -- - get_staticdata(self)
212 -- ^ return string that will be passed to on_activate when the object
213 -- is created next time
215 -- Entity prototype table:
218 -- collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
220 -- textures = {texture,texture,texture,texture,texture,texture},
221 -- on_activate = function(self, staticdata),
222 -- on_step = function(self, dtime),
223 -- on_punch = function(self, hitter),
224 -- on_rightclick = function(self, clicker),
225 -- get_staticdata = function(self),
226 -- # Also you can define arbitrary member variables here
227 -- myvariable = whatever,
232 -- image = "default_tool_steelaxe.png",
233 -- full_punch_interval = 1.0,
236 -- dt_crackiness = -0.2,
237 -- dt_crumbliness = 1,
238 -- dt_cuttability = -0.5,
239 -- basedurability = 330,
241 -- dd_crackiness = 0,
242 -- dd_crumbliness = 0,
243 -- dd_cuttability = 0,
246 -- Node definition options:
248 -- name = "modname:somenode",
249 -- drawtype = "normal",
250 -- visual_scale = 1.0,
251 -- tile_images = {"default_unknown_block.png"},
252 -- inventory_image = "default_unknown_block.png",
253 -- special_materials = {
254 -- {image="", backface_culling=true},
255 -- {image="", backface_culling=true},
258 -- post_effect_color = {a=0, r=0, g=0, b=0},
259 -- paramtype = "none",
260 -- is_ground_content = false,
261 -- light_propagates = false,
262 -- sunlight_propagates = false,
266 -- climbable = false,
267 -- buildable_to = false,
268 -- wall_mounted = false,
269 -- often_contains_mineral = false,
271 -- extra_dug_item = "",
272 -- extra_dug_item_rarity = 2,
273 -- metadata_name = "",
274 -- liquidtype = "none",
275 -- liquid_alternative_flowing = "",
276 -- liquid_alternative_source = "",
277 -- liquid_viscosity = 0,
279 -- damage_per_second = 0,
280 -- selection_box = {type="regular"},
282 -- diggablity = "normal",
289 -- cookresult_itemstring = "", -- Cannot be cooked
290 -- furnace_cooktime = 3.0,
291 -- furnace_burntime = -1, -- Cannot be used as fuel
294 -- Craftitem definition options:
295 -- minetest.register_craftitem("modname_name", {
296 -- image = "default_image.png",
297 -- stack_max = <maximum number of items in stack>,
298 -- cookresult_itemstring = itemstring (result of cooking),
299 -- furnace_cooktime = <cooking time>,
300 -- furnace_burntime = <time to burn as fuel in furnace>,
301 -- usable = <uh... some boolean value>,
302 -- dropcount = <amount of items to drop using drop action>
303 -- liquids_pointable = <whether can point liquids>,
304 -- on_drop = func(item, dropper, pos),
305 -- on_place_on_ground = func(item, placer, pos),
306 -- on_use = func(item, player, pointed_thing),
311 -- output = 'tool "default:pick_stone"',
313 -- {'node "cobble"', 'node "cobble"', 'node "cobble"'},
314 -- {'', 'craft "default:stick"', ''},
315 -- {'', 'craft "default:stick"', ''},
319 -- ABM (ActiveBlockModifier) definition:
321 -- nodenames = {"lava_source"},
322 -- neighbors = {"water_source", "water_flowing"}, -- (any of these)
323 -- ^ If left out or empty, any neighbor will do
324 -- ^ This might get removed in the future
325 -- interval = 1.0, -- (operation interval)
326 -- chance = 1, -- (chance of trigger is 1.0/this)
327 -- action = func(pos, node, active_object_count, active_object_count_wider),
335 -- Definitions made by this mod that other mods can use too
343 minetest.register_tool(":", {
357 minetest.register_tool("default:pick_wood", {
358 image = "default_tool_woodpick.png",
361 dt_crackiness = -0.5,
370 minetest.register_tool("default:pick_stone", {
371 image = "default_tool_stonepick.png",
374 dt_crackiness = -0.5,
377 basedurability = 100,
383 minetest.register_tool("default:pick_steel", {
384 image = "default_tool_steelpick.png",
387 dt_crackiness = -0.5,
390 basedurability = 333,
396 minetest.register_tool("default:pick_mese", {
397 image = "default_tool_mesepick.png",
403 basedurability = 1337,
409 minetest.register_tool("default:shovel_wood", {
410 image = "default_tool_woodshovel.png",
414 dt_crumbliness = -1.5,
415 dt_cuttability = 0.3,
422 minetest.register_tool("default:shovel_stone", {
423 image = "default_tool_stoneshovel.png",
427 dt_crumbliness = -1.5,
428 dt_cuttability = 0.1,
429 basedurability = 100,
435 minetest.register_tool("default:shovel_steel", {
436 image = "default_tool_steelshovel.png",
440 dt_crumbliness = -1.5,
441 dt_cuttability = 0.0,
442 basedurability = 330,
448 minetest.register_tool("default:axe_wood", {
449 image = "default_tool_woodaxe.png",
452 dt_crackiness = -0.2,
454 dt_cuttability = -0.5,
461 minetest.register_tool("default:axe_stone", {
462 image = "default_tool_stoneaxe.png",
465 dt_crackiness = -0.2,
467 dt_cuttability = -0.5,
468 basedurability = 100,
474 minetest.register_tool("default:axe_steel", {
475 image = "default_tool_steelaxe.png",
478 dt_crackiness = -0.2,
480 dt_cuttability = -0.5,
481 basedurability = 330,
487 minetest.register_tool("default:sword_wood", {
488 image = "default_tool_woodsword.png",
500 minetest.register_tool("default:sword_stone", {
501 image = "default_tool_stonesword.png",
507 basedurability = 100,
513 minetest.register_tool("default:sword_steel", {
514 image = "default_tool_steelsword.png",
520 basedurability = 330,
528 -- Crafting definition
531 minetest.register_craft({
532 output = 'node "default:wood" 4',
538 minetest.register_craft({
539 output = 'craft "default:stick" 4',
541 {'node "default:wood"'},
545 minetest.register_craft({
546 output = 'node "fence_wooden" 2',
548 {'craft "default:stick"', 'craft "default:stick"', 'craft "default:stick"'},
549 {'craft "default:stick"', 'craft "default:stick"', 'craft "default:stick"'},
553 minetest.register_craft({
554 output = 'node "default:sign_wall" 1',
556 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
557 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
558 {'', 'craft "default:stick"', ''},
562 minetest.register_craft({
563 output = 'node "default:torch" 4',
565 {'craft "default:coal_lump"'},
566 {'craft "default:stick"'},
570 minetest.register_craft({
571 output = 'tool "default:pick_wood"',
573 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
574 {'', 'craft "default:stick"', ''},
575 {'', 'craft "default:stick"', ''},
579 minetest.register_craft({
580 output = 'tool "default:pick_stone"',
582 {'node "cobble"', 'node "cobble"', 'node "cobble"'},
583 {'', 'craft "default:stick"', ''},
584 {'', 'craft "default:stick"', ''},
588 minetest.register_craft({
589 output = 'tool "default:pick_steel"',
591 {'craft "default:steel_ingot"', 'craft "default:steel_ingot"', 'craft "default:steel_ingot"'},
592 {'', 'craft "default:stick"', ''},
593 {'', 'craft "default:stick"', ''},
597 minetest.register_craft({
598 output = 'tool "default:pick_mese"',
600 {'node "mese"', 'node "mese"', 'node "mese"'},
601 {'', 'craft "default:stick"', ''},
602 {'', 'craft "default:stick"', ''},
606 minetest.register_craft({
607 output = 'tool "default:shovel_wood"',
609 {'node "default:wood"'},
610 {'craft "default:stick"'},
611 {'craft "default:stick"'},
615 minetest.register_craft({
616 output = 'tool "default:shovel_stone"',
619 {'craft "default:stick"'},
620 {'craft "default:stick"'},
624 minetest.register_craft({
625 output = 'tool "default:shovel_steel"',
627 {'craft "default:steel_ingot"'},
628 {'craft "default:stick"'},
629 {'craft "default:stick"'},
633 minetest.register_craft({
634 output = 'tool "default:axe_wood"',
636 {'node "default:wood"', 'node "default:wood"'},
637 {'node "default:wood"', 'craft "default:stick"'},
638 {'', 'craft "default:stick"'},
642 minetest.register_craft({
643 output = 'tool "default:axe_stone"',
645 {'node "cobble"', 'node "cobble"'},
646 {'node "cobble"', 'craft "default:stick"'},
647 {'', 'craft "default:stick"'},
651 minetest.register_craft({
652 output = 'tool "default:axe_steel"',
654 {'craft "default:steel_ingot"', 'craft "default:steel_ingot"'},
655 {'craft "default:steel_ingot"', 'craft "default:stick"'},
656 {'', 'craft "default:stick"'},
660 minetest.register_craft({
661 output = 'tool "default:sword_wood"',
663 {'node "default:wood"'},
664 {'node "default:wood"'},
665 {'craft "default:stick"'},
669 minetest.register_craft({
670 output = 'tool "default:sword_stone"',
674 {'craft "default:stick"'},
678 minetest.register_craft({
679 output = 'tool "default:sword_steel"',
681 {'craft "default:steel_ingot"'},
682 {'craft "default:steel_ingot"'},
683 {'craft "default:stick"'},
687 minetest.register_craft({
688 output = 'node "default:rail" 15',
690 {'craft "default:steel_ingot"', '', 'craft "default:steel_ingot"'},
691 {'craft "default:steel_ingot"', 'craft "default:stick"', 'craft "default:steel_ingot"'},
692 {'craft "default:steel_ingot"', '', 'craft "default:steel_ingot"'},
696 minetest.register_craft({
697 output = 'node "default:chest" 1',
699 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
700 {'node "default:wood"', '', 'node "default:wood"'},
701 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
705 minetest.register_craft({
706 output = 'node "default:chest_locked" 1',
708 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
709 {'node "default:wood"', 'craft "default:steel_ingot"', 'node "default:wood"'},
710 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
714 minetest.register_craft({
715 output = 'node "default:furnace" 1',
717 {'node "cobble"', 'node "cobble"', 'node "cobble"'},
718 {'node "cobble"', '', 'node "cobble"'},
719 {'node "cobble"', 'node "cobble"', 'node "cobble"'},
723 minetest.register_craft({
724 output = 'node "default:steelblock" 1',
726 {'craft "default:steel_ingot"', 'craft "default:steel_ingot"', 'craft "default:steel_ingot"'},
727 {'craft "default:steel_ingot"', 'craft "default:steel_ingot"', 'craft "default:steel_ingot"'},
728 {'craft "default:steel_ingot"', 'craft "default:steel_ingot"', 'craft "default:steel_ingot"'},
732 minetest.register_craft({
733 output = 'node "default:sandstone" 1',
735 {'node "sand"', 'node "sand"'},
736 {'node "sand"', 'node "sand"'},
740 minetest.register_craft({
741 output = 'node "default:clay" 1',
743 {'craft "default:clay_lump"', 'craft "default:clay_lump"'},
744 {'craft "default:clay_lump"', 'craft "default:clay_lump"'},
748 minetest.register_craft({
749 output = 'node "default:brick" 1',
751 {'craft "default:clay_brick"', 'craft "default:clay_brick"'},
752 {'craft "default:clay_brick"', 'craft "default:clay_brick"'},
756 minetest.register_craft({
757 output = 'craft "default:paper" 1',
759 {'node "papyrus"', 'node "papyrus"', 'node "papyrus"'},
763 minetest.register_craft({
764 output = 'craft "default:book" 1',
766 {'craft "default:paper"'},
767 {'craft "default:paper"'},
768 {'craft "default:paper"'},
772 minetest.register_craft({
773 output = 'node "default:bookshelf" 1',
775 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
776 {'craft "default:book"', 'craft "default:book"', 'craft "default:book"'},
777 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
781 minetest.register_craft({
782 output = 'node "default:ladder" 1',
784 {'craft "default:stick"', '', 'craft "default:stick"'},
785 {'craft "default:stick"', 'craft "default:stick"', 'craft "default:stick"'},
786 {'craft "default:stick"', '', 'craft "default:stick"'},
794 minetest.register_node("default:stone", {
795 tile_images = {"default_stone.png"},
796 inventory_image = minetest.inventorycube("default_stone.png"),
797 paramtype = "mineral",
798 is_ground_content = true,
799 often_contains_mineral = true, -- Texture atlas hint
800 material = minetest.digprop_stonelike(1.0),
801 dug_item = 'node "cobble" 1',
804 minetest.register_node("default:dirt_with_grass", {
805 tile_images = {"default_grass.png", "default_dirt.png", "default_dirt.png^default_grass_side.png"},
806 inventory_image = minetest.inventorycube("default_dirt.png^default_grass_side.png"),
807 is_ground_content = true,
808 material = minetest.digprop_dirtlike(1.0),
809 dug_item = 'node "dirt" 1',
812 minetest.register_node("default:dirt_with_grass_footsteps", {
813 tile_images = {"default_grass_footsteps.png", "default_dirt.png", "default_dirt.png^default_grass_side.png"},
814 inventory_image = "default_grass_footsteps.png",
815 is_ground_content = true,
816 material = minetest.digprop_dirtlike(1.0),
817 dug_item = 'node "dirt" 1',
820 minetest.register_node("default:dirt", {
821 tile_images = {"default_dirt.png"},
822 inventory_image = minetest.inventorycube("default_dirt.png"),
823 is_ground_content = true,
824 material = minetest.digprop_dirtlike(1.0),
827 minetest.register_node("default:sand", {
828 tile_images = {"default_sand.png"},
829 inventory_image = minetest.inventorycube("default_sand.png"),
830 is_ground_content = true,
831 material = minetest.digprop_dirtlike(1.0),
832 cookresult_itemstring = 'node "glass" 1',
835 minetest.register_node("default:gravel", {
836 tile_images = {"default_gravel.png"},
837 inventory_image = minetest.inventorycube("default_gravel.png"),
838 is_ground_content = true,
839 material = minetest.digprop_gravellike(1.0),
842 minetest.register_node("default:sandstone", {
843 tile_images = {"default_sandstone.png"},
844 inventory_image = minetest.inventorycube("default_sandstone.png"),
845 is_ground_content = true,
846 material = minetest.digprop_dirtlike(1.0), -- FIXME should this be stonelike?
847 dug_item = 'node "sand" 1', -- FIXME is this intentional?
850 minetest.register_node("default:clay", {
851 tile_images = {"default_clay.png"},
852 inventory_image = minetest.inventorycube("default_clay.png"),
853 is_ground_content = true,
854 material = minetest.digprop_dirtlike(1.0),
855 dug_item = 'craft "default:clay_lump" 4',
858 minetest.register_node("default:brick", {
859 tile_images = {"default_brick.png"},
860 inventory_image = minetest.inventorycube("default_brick.png"),
861 is_ground_content = true,
862 material = minetest.digprop_stonelike(1.0),
863 dug_item = 'craft "default:clay_brick" 4',
866 minetest.register_node("default:tree", {
867 tile_images = {"default_tree_top.png", "default_tree_top.png", "default_tree.png"},
868 inventory_image = minetest.inventorycube("default_tree_top.png", "default_tree.png", "default_tree.png"),
869 is_ground_content = true,
870 material = minetest.digprop_woodlike(1.0),
871 cookresult_itemstring = 'craft "default:coal_lump" 1',
872 furnace_burntime = 30,
875 minetest.register_node("default:jungletree", {
876 tile_images = {"default_jungletree_top.png", "default_jungletree_top.png", "default_jungletree.png"},
877 inventory_image = minetest.inventorycube("default_jungletree_top.png", "default_jungletree.png", "default_jungletree.png"),
878 is_ground_content = true,
879 material = minetest.digprop_woodlike(1.0),
880 cookresult_itemstring = 'craft "default:coal_lump" 1',
881 furnace_burntime = 30,
884 minetest.register_node("default:junglegrass", {
885 drawtype = "plantlike",
887 tile_images = {"default_junglegrass.png"},
888 inventory_image = "default_junglegrass.png",
889 light_propagates = true,
892 material = minetest.digprop_leaveslike(1.0),
893 furnace_burntime = 2,
896 minetest.register_node("default:leaves", {
897 drawtype = "allfaces_optional",
899 tile_images = {"default_leaves.png"},
900 inventory_image = minetest.inventorycube("default_leaves.png"),
901 light_propagates = true,
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",
921 light_propagates = true,
923 is_ground_content = true,
925 material = minetest.digprop_leaveslike(0.5),
926 furnace_burntime = 1,
929 minetest.register_node("default:bookshelf", {
930 tile_images = {"default_wood.png", "default_wood.png", "default_bookshelf.png"},
931 inventory_image = minetest.inventorycube("default_wood.png", "default_bookshelf.png", "default_bookshelf.png"),
932 is_ground_content = true,
933 material = minetest.digprop_woodlike(0.75),
934 furnace_burntime = 30,
937 minetest.register_node("default:glass", {
938 drawtype = "glasslike",
939 tile_images = {"default_glass.png"},
940 inventory_image = minetest.inventorycube("default_glass.png"),
941 light_propagates = true,
943 sunlight_propagates = true,
944 is_ground_content = true,
945 material = minetest.digprop_glasslike(1.0),
948 minetest.register_node("default:fence_wooden", {
949 drawtype = "fencelike",
950 tile_images = {"default_wood.png"},
951 inventory_image = "default_fence.png",
952 light_propagates = true,
954 is_ground_content = true,
957 fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7},
959 furnace_burntime = 15,
960 material = minetest.digprop_woodlike(0.75),
963 minetest.register_node("default:rail", {
964 drawtype = "raillike",
965 tile_images = {"default_rail.png", "default_rail_curved.png", "default_rail_t_junction.png", "default_rail_crossing.png"},
966 inventory_image = "default_rail.png",
967 light_propagates = true,
969 is_ground_content = true,
975 material = minetest.digprop_dirtlike(0.75),
978 minetest.register_node("default:ladder", {
979 drawtype = "signlike",
980 tile_images = {"default_ladder.png"},
981 inventory_image = "default_ladder.png",
982 light_propagates = true,
984 is_ground_content = true,
989 type = "wallmounted",
990 --wall_top = = <default>
991 --wall_bottom = = <default>
992 --wall_side = = <default>
994 furnace_burntime = 5,
995 material = minetest.digprop_woodlike(0.5),
998 minetest.register_node("default:wood", {
999 tile_images = {"default_wood.png"},
1000 inventory_image = minetest.inventorycube("default_wood.png"),
1001 is_ground_content = true,
1002 furnace_burntime = 7,
1003 material = minetest.digprop_woodlike(0.75),
1006 minetest.register_node("default:mese", {
1007 tile_images = {"default_mese.png"},
1008 inventory_image = minetest.inventorycube("default_mese.png"),
1009 is_ground_content = true,
1010 furnace_burntime = 30,
1011 material = minetest.digprop_stonelike(0.5),
1014 minetest.register_node("default:cloud", {
1015 tile_images = {"default_cloud.png"},
1016 inventory_image = minetest.inventorycube("default_cloud.png"),
1017 is_ground_content = true,
1020 minetest.register_node("default:water_flowing", {
1021 drawtype = "flowingliquid",
1022 tile_images = {"default_water.png"},
1023 alpha = WATER_ALPHA,
1024 inventory_image = minetest.inventorycube("default_water.png"),
1025 paramtype = "light",
1026 light_propagates = true,
1030 buildable_to = true,
1031 liquidtype = "flowing",
1032 liquid_alternative_flowing = "water_flowing",
1033 liquid_alternative_source = "water_source",
1034 liquid_viscosity = WATER_VISC,
1035 post_effect_color = {a=64, r=100, g=100, b=200},
1036 special_materials = {
1037 {image="default_water.png", backface_culling=false},
1038 {image="default_water.png", backface_culling=true},
1042 minetest.register_node("default:water_source", {
1043 drawtype = "liquid",
1044 tile_images = {"default_water.png"},
1045 alpha = WATER_ALPHA,
1046 inventory_image = minetest.inventorycube("default_water.png"),
1047 paramtype = "light",
1048 light_propagates = true,
1052 buildable_to = true,
1053 liquidtype = "source",
1054 liquid_alternative_flowing = "water_flowing",
1055 liquid_alternative_source = "water_source",
1056 liquid_viscosity = WATER_VISC,
1057 post_effect_color = {a=64, r=100, g=100, b=200},
1058 special_materials = {
1059 -- New-style water source material (mostly unused)
1060 {image="default_water.png", backface_culling=false},
1064 minetest.register_node("default:lava_flowing", {
1065 drawtype = "flowingliquid",
1066 tile_images = {"default_lava.png"},
1067 inventory_image = minetest.inventorycube("default_lava.png"),
1068 paramtype = "light",
1069 light_propagates = false,
1070 light_source = LIGHT_MAX - 1,
1074 buildable_to = true,
1075 liquidtype = "flowing",
1076 liquid_alternative_flowing = "lava_flowing",
1077 liquid_alternative_source = "lava_source",
1078 liquid_viscosity = LAVA_VISC,
1079 damage_per_second = 4*2,
1080 post_effect_color = {a=192, r=255, g=64, b=0},
1081 special_materials = {
1082 {image="default_lava.png", backface_culling=false},
1083 {image="default_lava.png", backface_culling=true},
1087 minetest.register_node("default:lava_source", {
1088 drawtype = "liquid",
1089 tile_images = {"default_lava.png"},
1090 inventory_image = minetest.inventorycube("default_lava.png"),
1091 paramtype = "light",
1092 light_propagates = false,
1093 light_source = LIGHT_MAX - 1,
1097 buildable_to = true,
1098 liquidtype = "source",
1099 liquid_alternative_flowing = "lava_flowing",
1100 liquid_alternative_source = "lava_source",
1101 liquid_viscosity = LAVA_VISC,
1102 damage_per_second = 4*2,
1103 post_effect_color = {a=192, r=255, g=64, b=0},
1104 special_materials = {
1105 -- New-style lava source material (mostly unused)
1106 {image="default_lava.png", backface_culling=false},
1108 furnace_burntime = 60,
1111 minetest.register_node("default:torch", {
1112 drawtype = "torchlike",
1113 tile_images = {"default_torch_on_floor.png", "default_torch_on_ceiling.png", "default_torch.png"},
1114 inventory_image = "default_torch_on_floor.png",
1115 paramtype = "light",
1116 light_propagates = true,
1117 sunlight_propagates = true,
1119 wall_mounted = true,
1120 light_source = LIGHT_MAX-1,
1122 type = "wallmounted",
1123 wall_top = {-0.1, 0.5-0.6, -0.1, 0.1, 0.5, 0.1},
1124 wall_bottom = {-0.1, -0.5, -0.1, 0.1, -0.5+0.6, 0.1},
1125 wall_side = {-0.5, -0.3, -0.1, -0.5+0.3, 0.3, 0.1},
1127 material = minetest.digprop_constanttime(0.0),
1128 furnace_burntime = 4,
1131 minetest.register_node("default:sign_wall", {
1132 drawtype = "signlike",
1133 tile_images = {"default_sign_wall.png"},
1134 inventory_image = "default_sign_wall.png",
1135 paramtype = "light",
1136 light_propagates = true,
1137 sunlight_propagates = true,
1139 wall_mounted = true,
1140 metadata_name = "sign",
1142 type = "wallmounted",
1143 --wall_top = <default>
1144 --wall_bottom = <default>
1145 --wall_side = <default>
1147 material = minetest.digprop_constanttime(0.5),
1148 furnace_burntime = 10,
1151 minetest.register_node("default:chest", {
1152 tile_images = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
1153 "default_chest_side.png", "default_chest_side.png", "default_chest_front.png"},
1154 inventory_image = minetest.inventorycube("default_chest_top.png", "default_chest_front.png", "default_chest_side.png"),
1155 paramtype = "facedir_simple",
1156 metadata_name = "chest",
1157 material = minetest.digprop_woodlike(1.0),
1158 furnace_burntime = 30,
1161 minetest.register_node("default:chest_locked", {
1162 tile_images = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
1163 "default_chest_side.png", "default_chest_side.png", "default_chest_lock.png"},
1164 inventory_image = minetest.inventorycube("default_chest_top.png", "default_chest_lock.png", "default_chest_side.png"),
1165 paramtype = "facedir_simple",
1166 metadata_name = "locked_chest",
1167 material = minetest.digprop_woodlike(1.0),
1168 furnace_burntime = 30,
1171 minetest.register_node("default:furnace", {
1172 tile_images = {"default_furnace_side.png", "default_furnace_side.png", "default_furnace_side.png",
1173 "default_furnace_side.png", "default_furnace_side.png", "default_furnace_front.png"},
1174 inventory_image = minetest.inventorycube("default_furnace_side.png", "default_furnace_front.png", "default_furnace_side.png"),
1175 paramtype = "facedir_simple",
1176 metadata_name = "furnace",
1177 material = minetest.digprop_stonelike(3.0),
1180 minetest.register_node("default:cobble", {
1181 tile_images = {"default_cobble.png"},
1182 inventory_image = minetest.inventorycube("default_cobble.png"),
1183 is_ground_content = true,
1184 cookresult_itemstring = 'node "stone" 1',
1185 material = minetest.digprop_stonelike(0.9),
1188 minetest.register_node("default:mossycobble", {
1189 tile_images = {"default_mossycobble.png"},
1190 inventory_image = minetest.inventorycube("default_mossycobble.png"),
1191 is_ground_content = true,
1192 material = minetest.digprop_stonelike(0.8),
1195 minetest.register_node("default:steelblock", {
1196 tile_images = {"default_steel_block.png"},
1197 inventory_image = minetest.inventorycube("default_steel_block.png"),
1198 is_ground_content = true,
1199 material = minetest.digprop_stonelike(5.0),
1202 minetest.register_node("default:nyancat", {
1203 tile_images = {"default_nc_side.png", "default_nc_side.png", "default_nc_side.png",
1204 "default_nc_side.png", "default_nc_back.png", "default_nc_front.png"},
1205 inventory_image = "default_nc_front.png",
1206 paramtype = "facedir_simple",
1207 material = minetest.digprop_stonelike(3.0),
1208 furnace_burntime = 1,
1211 minetest.register_node("default:nyancat_rainbow", {
1212 tile_images = {"default_nc_rb.png"},
1213 inventory_image = "default_nc_rb.png",
1214 material = minetest.digprop_stonelike(3.0),
1215 furnace_burntime = 1,
1218 minetest.register_node("default:sapling", {
1219 drawtype = "plantlike",
1221 tile_images = {"default_sapling.png"},
1222 inventory_image = "default_sapling.png",
1223 paramtype = "light",
1224 light_propagates = true,
1226 material = minetest.digprop_constanttime(0.0),
1227 furnace_burntime = 10,
1230 minetest.register_node("default:apple", {
1231 drawtype = "plantlike",
1233 tile_images = {"default_apple.png"},
1234 inventory_image = "default_apple.png",
1235 paramtype = "light",
1236 light_propagates = true,
1237 sunlight_propagates = true,
1239 dug_item = 'craft "apple" 1',
1240 material = minetest.digprop_constanttime(0.0),
1241 furnace_burntime = 3,
1248 minetest.register_craftitem("default:stick", {
1249 image = "default_stick.png",
1250 --furnace_burntime = ...,
1251 on_place_on_ground = minetest.craftitem_place_item,
1254 minetest.register_craftitem("default:paper", {
1255 image = "default_paper.png",
1256 on_place_on_ground = minetest.craftitem_place_item,
1259 minetest.register_craftitem("default:book", {
1260 image = "default_book.png",
1261 on_place_on_ground = minetest.craftitem_place_item,
1264 minetest.register_craftitem("default:coal_lump", {
1265 image = "default_coal_lump.png",
1266 furnace_burntime = 40;
1267 on_place_on_ground = minetest.craftitem_place_item,
1270 minetest.register_craftitem("default:iron_lump", {
1271 image = "default_iron_lump.png",
1272 cookresult_itemstring = 'craft "default:steel_ingot" 1',
1273 on_place_on_ground = minetest.craftitem_place_item,
1276 minetest.register_craftitem("default:clay_lump", {
1277 image = "default_clay_lump.png",
1278 cookresult_itemstring = 'craft "default:clay_brick" 1',
1279 on_place_on_ground = minetest.craftitem_place_item,
1282 minetest.register_craftitem("default:steel_ingot", {
1283 image = "default_steel_ingot.png",
1284 on_place_on_ground = minetest.craftitem_place_item,
1287 minetest.register_craftitem("default:clay_brick", {
1288 image = "default_clay_brick.png",
1289 on_place_on_ground = minetest.craftitem_place_item,
1292 minetest.register_craftitem("default:scorched_stuff", {
1293 image = "default_scorched_stuff.png",
1294 on_place_on_ground = minetest.craftitem_place_item,
1297 minetest.register_craftitem("default:apple", {
1298 image = "default_apple.png",
1299 on_place_on_ground = minetest.craftitem_place_item,
1300 on_use = minetest.craftitem_eat(4),
1304 -- Creative inventory
1307 minetest.add_to_creative_inventory('tool "default:pick_mese" 0')
1308 minetest.add_to_creative_inventory('tool "default:pick_steel" 0')
1309 minetest.add_to_creative_inventory('tool "default:axe_steel" 0')
1310 minetest.add_to_creative_inventory('tool "default:shovel_steel" 0')
1312 minetest.add_to_creative_inventory('node "default:torch" 0')
1313 minetest.add_to_creative_inventory('node "default:cobble" 0')
1314 minetest.add_to_creative_inventory('node "default:dirt" 0')
1315 minetest.add_to_creative_inventory('node "default:stone" 0')
1316 minetest.add_to_creative_inventory('node "default:sand" 0')
1317 minetest.add_to_creative_inventory('node "default:sandstone" 0')
1318 minetest.add_to_creative_inventory('node "default:clay" 0')
1319 minetest.add_to_creative_inventory('node "default:brick" 0')
1320 minetest.add_to_creative_inventory('node "default:tree" 0')
1321 minetest.add_to_creative_inventory('node "default:leaves" 0')
1322 minetest.add_to_creative_inventory('node "default:cactus" 0')
1323 minetest.add_to_creative_inventory('node "default:papyrus" 0')
1324 minetest.add_to_creative_inventory('node "default:bookshelf" 0')
1325 minetest.add_to_creative_inventory('node "default:glass" 0')
1326 minetest.add_to_creative_inventory('node "default:fence" 0')
1327 minetest.add_to_creative_inventory('node "default:rail" 0')
1328 minetest.add_to_creative_inventory('node "default:mese" 0')
1329 minetest.add_to_creative_inventory('node "default:chest" 0')
1330 minetest.add_to_creative_inventory('node "default:furnace" 0')
1331 minetest.add_to_creative_inventory('node "default:sign_wall" 0')
1332 minetest.add_to_creative_inventory('node "default:water_source" 0')
1333 minetest.add_to_creative_inventory('node "default:lava_source" 0')
1334 minetest.add_to_creative_inventory('node "default:ladder" 0')
1337 -- Some common functions
1340 default.falling_node_names = {}
1342 function nodeupdate_single(p)
1343 n = minetest.env:get_node(p)
1344 if default.falling_node_names[n.name] ~= nil then
1345 p_bottom = {x=p.x, y=p.y-1, z=p.z}
1346 n_bottom = minetest.env:get_node(p_bottom)
1347 if n_bottom.name == "air" then
1348 minetest.env:remove_node(p)
1349 minetest.env:add_luaentity(p, "default:falling_"..n.name)
1355 function nodeupdate(p)
1359 p2 = {x=p.x+x, y=p.y+y, z=p.z+z}
1360 nodeupdate_single(p2)
1370 function default.register_falling_node(nodename, texture)
1371 default.falling_node_names[nodename] = true
1372 -- Override naming conventions for stuff like :default:falling_default:sand
1373 minetest.register_entity(":default:falling_"..nodename, {
1374 -- Static definition
1376 collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
1378 textures = {texture,texture,texture,texture,texture,texture},
1381 on_step = function(self, dtime)
1383 self.object:setacceleration({x=0, y=-10, z=0})
1384 -- Turn to actual sand when collides to ground or just move
1385 local pos = self.object:getpos()
1386 local bcp = {x=pos.x, y=pos.y-0.7, z=pos.z} -- Position of bottom center point
1387 local bcn = minetest.env:get_node(bcp)
1388 if bcn.name ~= "air" then
1389 -- Turn to a sand node
1390 local np = {x=bcp.x, y=bcp.y+1, z=bcp.z}
1391 minetest.env:add_node(np, {name=nodename})
1392 self.object:remove()
1400 default.register_falling_node("default:sand", "default_sand.png")
1401 default.register_falling_node("default:gravel", "default_gravel.png")
1407 -- Global environment step function
1408 function on_step(dtime)
1411 minetest.register_globalstep(on_step)
1413 function on_placenode(p, node)
1414 --print("on_placenode")
1417 minetest.register_on_placenode(on_placenode)
1419 function on_dignode(p, node)
1420 --print("on_dignode")
1423 minetest.register_on_dignode(on_dignode)
1425 function on_punchnode(p, node)
1427 minetest.register_on_punchnode(on_punchnode)
1429 minetest.register_on_chat_message(function(name, message)
1430 --print("default on_chat_message: name="..dump(name).." message="..dump(message))
1431 local cmd = "/giveme"
1432 if message:sub(0, #cmd) == cmd then
1433 if not minetest.get_player_privs(name)["give"] then
1434 minetest.chat_send_player(name, "you don't have permission to give")
1435 return true -- Handled chat message
1437 local stackstring = string.match(message, cmd.." (.*)")
1438 if stackstring == nil then
1439 minetest.chat_send_player(name, 'usage: '..cmd..' stackstring')
1440 return true -- Handled chat message
1442 print(cmd..' invoked, stackstring="'..stackstring..'"')
1443 local player = minetest.env:get_player_by_name(name)
1444 if player == nil then
1445 minetest.chat_send_player(name, name2..' is not a known player')
1446 return true -- Handled chat message
1448 local added, error_msg = player:add_to_inventory(stackstring)
1450 minetest.chat_send_player(name, '"'..stackstring
1451 ..'" added to inventory.');
1453 minetest.chat_send_player(name, 'Could not give "'..stackstring
1454 ..'": '..error_msg);
1456 return true -- Handled chat message
1459 if message:sub(0, #cmd) == cmd then
1460 if not minetest.get_player_privs(name)["give"] then
1461 minetest.chat_send_player(name, "you don't have permission to give")
1462 return true -- Handled chat message
1464 local name2, stackstring = string.match(message, cmd.." ([%a%d_-]+) (.*)")
1465 if name == nil or stackstring == nil then
1466 minetest.chat_send_player(name, 'usage: '..cmd..' name stackstring')
1467 return true -- Handled chat message
1469 print(cmd..' invoked, name2="'..name2
1470 ..'" stackstring="'..stackstring..'"')
1471 local player = minetest.env:get_player_by_name(name2)
1472 if player == nil then
1473 minetest.chat_send_player(name, name2..' is not a known player')
1474 return true -- Handled chat message
1476 local added, error_msg = player:add_to_inventory(stackstring)
1478 minetest.chat_send_player(name, '"'..stackstring
1479 ..'" added to '..name2..'\'s inventory.');
1480 minetest.chat_send_player(name2, '"'..stackstring
1481 ..'" added to inventory.');
1483 minetest.chat_send_player(name, 'Could not give "'..stackstring
1484 ..'": '..error_msg);
1486 return true -- Handled chat message
1491 -- Done, print some random stuff
1494 --print("minetest.registered_entities:")
1495 --dump2(minetest.registered_entities)