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
113 -- minetest.get_modpath(modname) -> eg. "/home/user/.minetest/usermods/modname"
115 -- stackstring_take_item(stackstring) -> stackstring, item
116 -- stackstring_put_item(stackstring, item) -> stackstring, success
117 -- stackstring_put_stackstring(stackstring, stackstring) -> stackstring, success
119 -- minetest.digprop_constanttime(time)
120 -- minetest.digprop_stonelike(toughness)
121 -- minetest.digprop_dirtlike(toughness)
122 -- minetest.digprop_gravellike(toughness)
123 -- minetest.digprop_woodlike(toughness)
124 -- minetest.digprop_leaveslike(toughness)
125 -- minetest.digprop_glasslike(toughness)
128 -- minetest.env - environment reference
131 -- minetest.registered_nodes
132 -- ^ List of registered node definitions, indexed by name
133 -- minetest.registered_craftitems
134 -- ^ List of registered craft item definitions, indexed by name
135 -- minetest.registered_entities
136 -- ^ List of registered entity prototypes, indexed by name
137 -- minetest.object_refs
138 -- ^ List of object references, indexed by active object id
139 -- minetest.luaentities
140 -- ^ List of lua entities, indexed by active object id
142 -- EnvRef is basically ServerEnvironment and ServerMap combined.
144 -- - add_node(pos, node)
145 -- - remove_node(pos)
147 -- ^ Returns {name="ignore", ...} for unloaded area
148 -- - get_node_or_nil(pos)
149 -- ^ Returns nil for unloaded area
150 -- - get_node_light(pos, timeofday) -> 0...15 or nil
151 -- ^ timeofday: nil = current time, 0 = night, 0.5 = day
152 -- - add_entity(pos, name)
153 -- - add_item(pos, itemstring)
155 -- - add_firefly(pos)
156 -- - get_meta(pos) -- Get a NodeMetaRef at that position
157 -- - get_player_by_name(name) -- Get an ObjectRef to a player
161 -- - allows_text_input()
162 -- - set_text(text) -- eg. set the text of a sign
165 -- Generic node metadata specific:
166 -- - set_infotext(infotext)
167 -- - inventory_set_list(name, {item1, item2, ...})
168 -- - inventory_get_list(name)
169 -- - set_inventory_draw_spec(string)
170 -- - set_allow_text_input(bool)
171 -- - set_allow_removal(bool)
172 -- - set_enforce_owner(bool)
173 -- - is_inventory_modified()
174 -- - reset_inventory_modified()
175 -- - is_text_modified()
176 -- - reset_text_modified()
177 -- - set_string(name, value)
178 -- - get_string(name)
180 -- ObjectRef is basically ServerActiveObject.
181 -- ObjectRef methods:
182 -- - remove(): remove object (after returning from Lua)
183 -- - getpos() -> {x=num, y=num, z=num}
184 -- - setpos(pos); pos={x=num, y=num, z=num}
185 -- - moveto(pos, continuous=false): interpolated move
186 -- - punch(puncher, time_from_last_punch)
187 -- ^ puncher = an another ObjectRef,
188 -- ^ time_from_last_punch = time since last punch action of the puncher
189 -- - right_click(clicker); clicker = an another ObjectRef
190 -- - get_wield_digging_properties() -> digging property table
191 -- - add_to_inventory_later(itemstring): like above, but after callback returns (only allowed for craftitem callbacks)
192 -- - get_hp(): returns number of hitpoints (2 * number of hearts)
193 -- - set_hp(hp): set number of hitpoints (2 * number of hearts)
194 -- LuaEntitySAO-only:
195 -- - setvelocity({x=num, y=num, z=num})
196 -- - setacceleration({x=num, y=num, z=num})
197 -- - getacceleration() -> {x=num, y=num, z=num}
198 -- - settexturemod(mod)
199 -- - setsprite(p={x=0,y=0}, num_frames=1, framelength=0.2,
200 -- - select_horiz_by_yawpitch=false)
202 -- - get_player_name(): will return nil if is not a player
203 -- - inventory_set_list(name, {item1, item2, ...})
204 -- - inventory_get_list(name) -> {item1, item2, ...}
205 -- - damage_wielded_item(num) (item damage/wear range is 0-65535)
206 -- - add_to_inventory(itemstring): add an item to object inventory
208 -- Registered entities:
209 -- - Functions receive a "luaentity" as self:
210 -- - It has the member .object, which is an ObjectRef pointing to the object
211 -- - The original prototype stuff is visible directly via a metatable
213 -- - on_activate(self, staticdata)
214 -- - on_step(self, dtime)
215 -- - on_punch(self, hitter)
216 -- - on_rightclick(self, clicker)
217 -- - get_staticdata(self)
218 -- ^ return string that will be passed to on_activate when the object
219 -- is created next time
221 -- Entity prototype table:
224 -- collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
226 -- textures = {texture,texture,texture,texture,texture,texture},
227 -- on_activate = function(self, staticdata),
228 -- on_step = function(self, dtime),
229 -- on_punch = function(self, hitter),
230 -- on_rightclick = function(self, clicker),
231 -- get_staticdata = function(self),
232 -- # Also you can define arbitrary member variables here
233 -- myvariable = whatever,
238 -- image = "default_tool_steelaxe.png",
239 -- full_punch_interval = 1.0,
242 -- dt_crackiness = -0.2,
243 -- dt_crumbliness = 1,
244 -- dt_cuttability = -0.5,
245 -- basedurability = 330,
247 -- dd_crackiness = 0,
248 -- dd_crumbliness = 0,
249 -- dd_cuttability = 0,
252 -- Node definition options:
254 -- name = "modname:somenode",
255 -- drawtype = "normal",
256 -- visual_scale = 1.0,
257 -- tile_images = {"default_unknown_block.png"},
258 -- inventory_image = "default_unknown_block.png",
259 -- special_materials = {
260 -- {image="", backface_culling=true},
261 -- {image="", backface_culling=true},
264 -- post_effect_color = {a=0, r=0, g=0, b=0},
265 -- paramtype = "none",
266 -- is_ground_content = false,
267 -- sunlight_propagates = false,
271 -- climbable = false,
272 -- buildable_to = false,
273 -- wall_mounted = false,
274 -- often_contains_mineral = false,
276 -- extra_dug_item = "",
277 -- extra_dug_item_rarity = 2,
278 -- metadata_name = "",
279 -- liquidtype = "none",
280 -- liquid_alternative_flowing = "",
281 -- liquid_alternative_source = "",
282 -- liquid_viscosity = 0,
284 -- damage_per_second = 0,
285 -- selection_box = {type="regular"},
287 -- diggablity = "normal",
294 -- cookresult_itemstring = "", -- Cannot be cooked
295 -- furnace_cooktime = 3.0,
296 -- furnace_burntime = -1, -- Cannot be used as fuel
299 -- Craftitem definition options:
300 -- minetest.register_craftitem("modname_name", {
301 -- image = "default_image.png",
302 -- stack_max = <maximum number of items in stack>,
303 -- cookresult_itemstring = itemstring (result of cooking),
304 -- furnace_cooktime = <cooking time>,
305 -- furnace_burntime = <time to burn as fuel in furnace>,
306 -- usable = <uh... some boolean value>,
307 -- dropcount = <amount of items to drop using drop action>
308 -- liquids_pointable = <whether can point liquids>,
309 -- on_drop = func(item, dropper, pos),
310 -- on_place_on_ground = func(item, placer, pos),
311 -- on_use = func(item, player, pointed_thing),
316 -- output = 'tool "default:pick_stone"',
318 -- {'node "cobble"', 'node "cobble"', 'node "cobble"'},
319 -- {'', 'craft "default:stick"', ''},
320 -- {'', 'craft "default:stick"', ''},
324 -- ABM (ActiveBlockModifier) definition:
326 -- nodenames = {"lava_source"},
327 -- neighbors = {"water_source", "water_flowing"}, -- (any of these)
328 -- ^ If left out or empty, any neighbor will do
329 -- ^ This might get removed in the future
330 -- interval = 1.0, -- (operation interval)
331 -- chance = 1, -- (chance of trigger is 1.0/this)
332 -- action = func(pos, node, active_object_count, active_object_count_wider),
340 -- Definitions made by this mod that other mods can use too
348 minetest.register_tool(":", {
362 minetest.register_tool("default:pick_wood", {
363 image = "default_tool_woodpick.png",
366 dt_crackiness = -0.5,
375 minetest.register_tool("default:pick_stone", {
376 image = "default_tool_stonepick.png",
379 dt_crackiness = -0.5,
382 basedurability = 100,
388 minetest.register_tool("default:pick_steel", {
389 image = "default_tool_steelpick.png",
392 dt_crackiness = -0.5,
395 basedurability = 333,
401 minetest.register_tool("default:pick_mese", {
402 image = "default_tool_mesepick.png",
408 basedurability = 1337,
414 minetest.register_tool("default:shovel_wood", {
415 image = "default_tool_woodshovel.png",
419 dt_crumbliness = -1.5,
420 dt_cuttability = 0.3,
427 minetest.register_tool("default:shovel_stone", {
428 image = "default_tool_stoneshovel.png",
432 dt_crumbliness = -1.5,
433 dt_cuttability = 0.1,
434 basedurability = 100,
440 minetest.register_tool("default:shovel_steel", {
441 image = "default_tool_steelshovel.png",
445 dt_crumbliness = -1.5,
446 dt_cuttability = 0.0,
447 basedurability = 330,
453 minetest.register_tool("default:axe_wood", {
454 image = "default_tool_woodaxe.png",
457 dt_crackiness = -0.2,
459 dt_cuttability = -0.5,
466 minetest.register_tool("default:axe_stone", {
467 image = "default_tool_stoneaxe.png",
470 dt_crackiness = -0.2,
472 dt_cuttability = -0.5,
473 basedurability = 100,
479 minetest.register_tool("default:axe_steel", {
480 image = "default_tool_steelaxe.png",
483 dt_crackiness = -0.2,
485 dt_cuttability = -0.5,
486 basedurability = 330,
492 minetest.register_tool("default:sword_wood", {
493 image = "default_tool_woodsword.png",
505 minetest.register_tool("default:sword_stone", {
506 image = "default_tool_stonesword.png",
512 basedurability = 100,
518 minetest.register_tool("default:sword_steel", {
519 image = "default_tool_steelsword.png",
525 basedurability = 330,
533 -- Crafting definition
536 minetest.register_craft({
537 output = 'node "default:wood" 4',
543 minetest.register_craft({
544 output = 'craft "default:stick" 4',
546 {'node "default:wood"'},
550 minetest.register_craft({
551 output = 'node "default:fence_wood" 2',
553 {'craft "default:stick"', 'craft "default:stick"', 'craft "default:stick"'},
554 {'craft "default:stick"', 'craft "default:stick"', 'craft "default:stick"'},
558 minetest.register_craft({
559 output = 'node "default:sign_wall" 1',
561 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
562 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
563 {'', 'craft "default:stick"', ''},
567 minetest.register_craft({
568 output = 'node "default:torch" 4',
570 {'craft "default:coal_lump"'},
571 {'craft "default:stick"'},
575 minetest.register_craft({
576 output = 'tool "default:pick_wood"',
578 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
579 {'', 'craft "default:stick"', ''},
580 {'', 'craft "default:stick"', ''},
584 minetest.register_craft({
585 output = 'tool "default:pick_stone"',
587 {'node "cobble"', 'node "cobble"', 'node "cobble"'},
588 {'', 'craft "default:stick"', ''},
589 {'', 'craft "default:stick"', ''},
593 minetest.register_craft({
594 output = 'tool "default:pick_steel"',
596 {'craft "default:steel_ingot"', 'craft "default:steel_ingot"', 'craft "default:steel_ingot"'},
597 {'', 'craft "default:stick"', ''},
598 {'', 'craft "default:stick"', ''},
602 minetest.register_craft({
603 output = 'tool "default:pick_mese"',
605 {'node "mese"', 'node "mese"', 'node "mese"'},
606 {'', 'craft "default:stick"', ''},
607 {'', 'craft "default:stick"', ''},
611 minetest.register_craft({
612 output = 'tool "default:shovel_wood"',
614 {'node "default:wood"'},
615 {'craft "default:stick"'},
616 {'craft "default:stick"'},
620 minetest.register_craft({
621 output = 'tool "default:shovel_stone"',
624 {'craft "default:stick"'},
625 {'craft "default:stick"'},
629 minetest.register_craft({
630 output = 'tool "default:shovel_steel"',
632 {'craft "default:steel_ingot"'},
633 {'craft "default:stick"'},
634 {'craft "default:stick"'},
638 minetest.register_craft({
639 output = 'tool "default:axe_wood"',
641 {'node "default:wood"', 'node "default:wood"'},
642 {'node "default:wood"', 'craft "default:stick"'},
643 {'', 'craft "default:stick"'},
647 minetest.register_craft({
648 output = 'tool "default:axe_stone"',
650 {'node "cobble"', 'node "cobble"'},
651 {'node "cobble"', 'craft "default:stick"'},
652 {'', 'craft "default:stick"'},
656 minetest.register_craft({
657 output = 'tool "default:axe_steel"',
659 {'craft "default:steel_ingot"', 'craft "default:steel_ingot"'},
660 {'craft "default:steel_ingot"', 'craft "default:stick"'},
661 {'', 'craft "default:stick"'},
665 minetest.register_craft({
666 output = 'tool "default:sword_wood"',
668 {'node "default:wood"'},
669 {'node "default:wood"'},
670 {'craft "default:stick"'},
674 minetest.register_craft({
675 output = 'tool "default:sword_stone"',
679 {'craft "default:stick"'},
683 minetest.register_craft({
684 output = 'tool "default:sword_steel"',
686 {'craft "default:steel_ingot"'},
687 {'craft "default:steel_ingot"'},
688 {'craft "default:stick"'},
692 minetest.register_craft({
693 output = 'node "default:rail" 15',
695 {'craft "default:steel_ingot"', '', 'craft "default:steel_ingot"'},
696 {'craft "default:steel_ingot"', 'craft "default:stick"', 'craft "default:steel_ingot"'},
697 {'craft "default:steel_ingot"', '', 'craft "default:steel_ingot"'},
701 minetest.register_craft({
702 output = 'node "default:chest" 1',
704 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
705 {'node "default:wood"', '', 'node "default:wood"'},
706 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
710 minetest.register_craft({
711 output = 'node "default:chest_locked" 1',
713 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
714 {'node "default:wood"', 'craft "default:steel_ingot"', 'node "default:wood"'},
715 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
719 minetest.register_craft({
720 output = 'node "default:furnace" 1',
722 {'node "cobble"', 'node "cobble"', 'node "cobble"'},
723 {'node "cobble"', '', 'node "cobble"'},
724 {'node "cobble"', 'node "cobble"', 'node "cobble"'},
728 minetest.register_craft({
729 output = 'node "default:steelblock" 1',
731 {'craft "default:steel_ingot"', 'craft "default:steel_ingot"', 'craft "default:steel_ingot"'},
732 {'craft "default:steel_ingot"', 'craft "default:steel_ingot"', 'craft "default:steel_ingot"'},
733 {'craft "default:steel_ingot"', 'craft "default:steel_ingot"', 'craft "default:steel_ingot"'},
737 minetest.register_craft({
738 output = 'node "default:sandstone" 1',
740 {'node "sand"', 'node "sand"'},
741 {'node "sand"', 'node "sand"'},
745 minetest.register_craft({
746 output = 'node "default:clay" 1',
748 {'craft "default:clay_lump"', 'craft "default:clay_lump"'},
749 {'craft "default:clay_lump"', 'craft "default:clay_lump"'},
753 minetest.register_craft({
754 output = 'node "default:brick" 1',
756 {'craft "default:clay_brick"', 'craft "default:clay_brick"'},
757 {'craft "default:clay_brick"', 'craft "default:clay_brick"'},
761 minetest.register_craft({
762 output = 'craft "default:paper" 1',
764 {'node "papyrus"', 'node "papyrus"', 'node "papyrus"'},
768 minetest.register_craft({
769 output = 'craft "default:book" 1',
771 {'craft "default:paper"'},
772 {'craft "default:paper"'},
773 {'craft "default:paper"'},
777 minetest.register_craft({
778 output = 'node "default:bookshelf" 1',
780 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
781 {'craft "default:book"', 'craft "default:book"', 'craft "default:book"'},
782 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
786 minetest.register_craft({
787 output = 'node "default:ladder" 1',
789 {'craft "default:stick"', '', 'craft "default:stick"'},
790 {'craft "default:stick"', 'craft "default:stick"', 'craft "default:stick"'},
791 {'craft "default:stick"', '', 'craft "default:stick"'},
799 minetest.register_node("default:stone", {
800 tile_images = {"default_stone.png"},
801 inventory_image = minetest.inventorycube("default_stone.png"),
802 paramtype = "mineral",
803 is_ground_content = true,
804 often_contains_mineral = true, -- Texture atlas hint
805 material = minetest.digprop_stonelike(1.0),
806 dug_item = 'node "cobble" 1',
809 minetest.register_node("default:dirt_with_grass", {
810 tile_images = {"default_grass.png", "default_dirt.png", "default_dirt.png^default_grass_side.png"},
811 inventory_image = minetest.inventorycube("default_dirt.png^default_grass_side.png"),
812 is_ground_content = true,
813 material = minetest.digprop_dirtlike(1.0),
814 dug_item = 'node "dirt" 1',
817 minetest.register_node("default:dirt_with_grass_footsteps", {
818 tile_images = {"default_grass_footsteps.png", "default_dirt.png", "default_dirt.png^default_grass_side.png"},
819 inventory_image = "default_grass_footsteps.png",
820 is_ground_content = true,
821 material = minetest.digprop_dirtlike(1.0),
822 dug_item = 'node "dirt" 1',
825 minetest.register_node("default:dirt", {
826 tile_images = {"default_dirt.png"},
827 inventory_image = minetest.inventorycube("default_dirt.png"),
828 is_ground_content = true,
829 material = minetest.digprop_dirtlike(1.0),
832 minetest.register_node("default:sand", {
833 tile_images = {"default_sand.png"},
834 inventory_image = minetest.inventorycube("default_sand.png"),
835 is_ground_content = true,
836 material = minetest.digprop_dirtlike(1.0),
837 cookresult_itemstring = 'node "glass" 1',
840 minetest.register_node("default:gravel", {
841 tile_images = {"default_gravel.png"},
842 inventory_image = minetest.inventorycube("default_gravel.png"),
843 is_ground_content = true,
844 material = minetest.digprop_gravellike(1.0),
847 minetest.register_node("default:sandstone", {
848 tile_images = {"default_sandstone.png"},
849 inventory_image = minetest.inventorycube("default_sandstone.png"),
850 is_ground_content = true,
851 material = minetest.digprop_dirtlike(1.0), -- FIXME should this be stonelike?
852 dug_item = 'node "sand" 1', -- FIXME is this intentional?
855 minetest.register_node("default:clay", {
856 tile_images = {"default_clay.png"},
857 inventory_image = minetest.inventorycube("default_clay.png"),
858 is_ground_content = true,
859 material = minetest.digprop_dirtlike(1.0),
860 dug_item = 'craft "default:clay_lump" 4',
863 minetest.register_node("default:brick", {
864 tile_images = {"default_brick.png"},
865 inventory_image = minetest.inventorycube("default_brick.png"),
866 is_ground_content = true,
867 material = minetest.digprop_stonelike(1.0),
868 dug_item = 'craft "default:clay_brick" 4',
871 minetest.register_node("default:tree", {
872 tile_images = {"default_tree_top.png", "default_tree_top.png", "default_tree.png"},
873 inventory_image = minetest.inventorycube("default_tree_top.png", "default_tree.png", "default_tree.png"),
874 is_ground_content = true,
875 material = minetest.digprop_woodlike(1.0),
876 cookresult_itemstring = 'craft "default:coal_lump" 1',
877 furnace_burntime = 30,
880 minetest.register_node("default:jungletree", {
881 tile_images = {"default_jungletree_top.png", "default_jungletree_top.png", "default_jungletree.png"},
882 inventory_image = minetest.inventorycube("default_jungletree_top.png", "default_jungletree.png", "default_jungletree.png"),
883 is_ground_content = true,
884 material = minetest.digprop_woodlike(1.0),
885 cookresult_itemstring = 'craft "default:coal_lump" 1',
886 furnace_burntime = 30,
889 minetest.register_node("default:junglegrass", {
890 drawtype = "plantlike",
892 tile_images = {"default_junglegrass.png"},
893 inventory_image = "default_junglegrass.png",
896 material = minetest.digprop_leaveslike(1.0),
897 furnace_burntime = 2,
900 minetest.register_node("default:leaves", {
901 drawtype = "allfaces_optional",
903 tile_images = {"default_leaves.png"},
904 inventory_image = minetest.inventorycube("default_leaves.png"),
906 material = minetest.digprop_leaveslike(1.0),
907 extra_dug_item = 'node "sapling" 1',
908 extra_dug_item_rarity = 20,
909 furnace_burntime = 1,
912 minetest.register_node("default:cactus", {
913 tile_images = {"default_cactus_top.png", "default_cactus_top.png", "default_cactus_side.png"},
914 inventory_image = minetest.inventorycube("default_cactus_top.png", "default_cactus_side.png", "default_cactus_side.png"),
915 is_ground_content = true,
916 material = minetest.digprop_woodlike(0.75),
917 furnace_burntime = 15,
920 minetest.register_node("default:papyrus", {
921 drawtype = "plantlike",
922 tile_images = {"default_papyrus.png"},
923 inventory_image = "default_papyrus.png",
925 is_ground_content = true,
927 material = minetest.digprop_leaveslike(0.5),
928 furnace_burntime = 1,
931 minetest.register_node("default:bookshelf", {
932 tile_images = {"default_wood.png", "default_wood.png", "default_bookshelf.png"},
933 inventory_image = minetest.inventorycube("default_wood.png", "default_bookshelf.png", "default_bookshelf.png"),
934 is_ground_content = true,
935 material = minetest.digprop_woodlike(0.75),
936 furnace_burntime = 30,
939 minetest.register_node("default:glass", {
940 drawtype = "glasslike",
941 tile_images = {"default_glass.png"},
942 inventory_image = minetest.inventorycube("default_glass.png"),
944 sunlight_propagates = true,
945 is_ground_content = true,
946 material = minetest.digprop_glasslike(1.0),
949 minetest.register_node("default:fence_wood", {
950 drawtype = "fencelike",
951 tile_images = {"default_wood.png"},
952 inventory_image = "default_fence.png",
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",
968 is_ground_content = true,
974 material = minetest.digprop_dirtlike(0.75),
977 minetest.register_node("default:ladder", {
978 drawtype = "signlike",
979 tile_images = {"default_ladder.png"},
980 inventory_image = "default_ladder.png",
982 is_ground_content = true,
987 type = "wallmounted",
988 --wall_top = = <default>
989 --wall_bottom = = <default>
990 --wall_side = = <default>
992 furnace_burntime = 5,
993 material = minetest.digprop_woodlike(0.5),
996 minetest.register_node("default:wood", {
997 tile_images = {"default_wood.png"},
998 inventory_image = minetest.inventorycube("default_wood.png"),
999 is_ground_content = true,
1000 furnace_burntime = 7,
1001 material = minetest.digprop_woodlike(0.75),
1004 minetest.register_node("default:mese", {
1005 tile_images = {"default_mese.png"},
1006 inventory_image = minetest.inventorycube("default_mese.png"),
1007 is_ground_content = true,
1008 furnace_burntime = 30,
1009 material = minetest.digprop_stonelike(0.5),
1012 minetest.register_node("default:cloud", {
1013 tile_images = {"default_cloud.png"},
1014 inventory_image = minetest.inventorycube("default_cloud.png"),
1015 is_ground_content = true,
1018 minetest.register_node("default:water_flowing", {
1019 drawtype = "flowingliquid",
1020 tile_images = {"default_water.png"},
1021 alpha = WATER_ALPHA,
1022 inventory_image = minetest.inventorycube("default_water.png"),
1023 paramtype = "light",
1027 buildable_to = true,
1028 liquidtype = "flowing",
1029 liquid_alternative_flowing = "water_flowing",
1030 liquid_alternative_source = "water_source",
1031 liquid_viscosity = WATER_VISC,
1032 post_effect_color = {a=64, r=100, g=100, b=200},
1033 special_materials = {
1034 {image="default_water.png", backface_culling=false},
1035 {image="default_water.png", backface_culling=true},
1039 minetest.register_node("default:water_source", {
1040 drawtype = "liquid",
1041 tile_images = {"default_water.png"},
1042 alpha = WATER_ALPHA,
1043 inventory_image = minetest.inventorycube("default_water.png"),
1044 paramtype = "light",
1048 buildable_to = true,
1049 liquidtype = "source",
1050 liquid_alternative_flowing = "water_flowing",
1051 liquid_alternative_source = "water_source",
1052 liquid_viscosity = WATER_VISC,
1053 post_effect_color = {a=64, r=100, g=100, b=200},
1054 special_materials = {
1055 -- New-style water source material (mostly unused)
1056 {image="default_water.png", backface_culling=false},
1060 minetest.register_node("default:lava_flowing", {
1061 drawtype = "flowingliquid",
1062 tile_images = {"default_lava.png"},
1063 inventory_image = minetest.inventorycube("default_lava.png"),
1064 paramtype = "light",
1065 light_source = LIGHT_MAX - 1,
1069 buildable_to = true,
1070 liquidtype = "flowing",
1071 liquid_alternative_flowing = "lava_flowing",
1072 liquid_alternative_source = "lava_source",
1073 liquid_viscosity = LAVA_VISC,
1074 damage_per_second = 4*2,
1075 post_effect_color = {a=192, r=255, g=64, b=0},
1076 special_materials = {
1077 {image="default_lava.png", backface_culling=false},
1078 {image="default_lava.png", backface_culling=true},
1082 minetest.register_node("default:lava_source", {
1083 drawtype = "liquid",
1084 tile_images = {"default_lava.png"},
1085 inventory_image = minetest.inventorycube("default_lava.png"),
1086 paramtype = "light",
1087 light_source = LIGHT_MAX - 1,
1091 buildable_to = true,
1092 liquidtype = "source",
1093 liquid_alternative_flowing = "lava_flowing",
1094 liquid_alternative_source = "lava_source",
1095 liquid_viscosity = LAVA_VISC,
1096 damage_per_second = 4*2,
1097 post_effect_color = {a=192, r=255, g=64, b=0},
1098 special_materials = {
1099 -- New-style lava source material (mostly unused)
1100 {image="default_lava.png", backface_culling=false},
1102 furnace_burntime = 60,
1105 minetest.register_node("default:torch", {
1106 drawtype = "torchlike",
1107 tile_images = {"default_torch_on_floor.png", "default_torch_on_ceiling.png", "default_torch.png"},
1108 inventory_image = "default_torch_on_floor.png",
1109 paramtype = "light",
1110 sunlight_propagates = true,
1112 wall_mounted = true,
1113 light_source = LIGHT_MAX-1,
1115 type = "wallmounted",
1116 wall_top = {-0.1, 0.5-0.6, -0.1, 0.1, 0.5, 0.1},
1117 wall_bottom = {-0.1, -0.5, -0.1, 0.1, -0.5+0.6, 0.1},
1118 wall_side = {-0.5, -0.3, -0.1, -0.5+0.3, 0.3, 0.1},
1120 material = minetest.digprop_constanttime(0.0),
1121 furnace_burntime = 4,
1124 minetest.register_node("default:sign_wall", {
1125 drawtype = "signlike",
1126 tile_images = {"default_sign_wall.png"},
1127 inventory_image = "default_sign_wall.png",
1128 paramtype = "light",
1129 sunlight_propagates = true,
1131 wall_mounted = true,
1132 metadata_name = "sign",
1134 type = "wallmounted",
1135 --wall_top = <default>
1136 --wall_bottom = <default>
1137 --wall_side = <default>
1139 material = minetest.digprop_constanttime(0.5),
1140 furnace_burntime = 10,
1143 minetest.register_node("default:chest", {
1144 tile_images = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
1145 "default_chest_side.png", "default_chest_side.png", "default_chest_front.png"},
1146 inventory_image = minetest.inventorycube("default_chest_top.png", "default_chest_front.png", "default_chest_side.png"),
1147 paramtype = "facedir_simple",
1148 metadata_name = "chest",
1149 material = minetest.digprop_woodlike(1.0),
1150 furnace_burntime = 30,
1153 minetest.register_node("default:chest_locked", {
1154 tile_images = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
1155 "default_chest_side.png", "default_chest_side.png", "default_chest_lock.png"},
1156 inventory_image = minetest.inventorycube("default_chest_top.png", "default_chest_lock.png", "default_chest_side.png"),
1157 paramtype = "facedir_simple",
1158 metadata_name = "locked_chest",
1159 material = minetest.digprop_woodlike(1.0),
1160 furnace_burntime = 30,
1163 minetest.register_node("default:furnace", {
1164 tile_images = {"default_furnace_side.png", "default_furnace_side.png", "default_furnace_side.png",
1165 "default_furnace_side.png", "default_furnace_side.png", "default_furnace_front.png"},
1166 inventory_image = minetest.inventorycube("default_furnace_side.png", "default_furnace_front.png", "default_furnace_side.png"),
1167 paramtype = "facedir_simple",
1168 metadata_name = "furnace",
1169 material = minetest.digprop_stonelike(3.0),
1172 minetest.register_node("default:cobble", {
1173 tile_images = {"default_cobble.png"},
1174 inventory_image = minetest.inventorycube("default_cobble.png"),
1175 is_ground_content = true,
1176 cookresult_itemstring = 'node "stone" 1',
1177 material = minetest.digprop_stonelike(0.9),
1180 minetest.register_node("default:mossycobble", {
1181 tile_images = {"default_mossycobble.png"},
1182 inventory_image = minetest.inventorycube("default_mossycobble.png"),
1183 is_ground_content = true,
1184 material = minetest.digprop_stonelike(0.8),
1187 minetest.register_node("default:steelblock", {
1188 tile_images = {"default_steel_block.png"},
1189 inventory_image = minetest.inventorycube("default_steel_block.png"),
1190 is_ground_content = true,
1191 material = minetest.digprop_stonelike(5.0),
1194 minetest.register_node("default:nyancat", {
1195 tile_images = {"default_nc_side.png", "default_nc_side.png", "default_nc_side.png",
1196 "default_nc_side.png", "default_nc_back.png", "default_nc_front.png"},
1197 inventory_image = "default_nc_front.png",
1198 paramtype = "facedir_simple",
1199 material = minetest.digprop_stonelike(3.0),
1200 furnace_burntime = 1,
1203 minetest.register_node("default:nyancat_rainbow", {
1204 tile_images = {"default_nc_rb.png"},
1205 inventory_image = "default_nc_rb.png",
1206 material = minetest.digprop_stonelike(3.0),
1207 furnace_burntime = 1,
1210 minetest.register_node("default:sapling", {
1211 drawtype = "plantlike",
1213 tile_images = {"default_sapling.png"},
1214 inventory_image = "default_sapling.png",
1215 paramtype = "light",
1217 material = minetest.digprop_constanttime(0.0),
1218 furnace_burntime = 10,
1221 minetest.register_node("default:apple", {
1222 drawtype = "plantlike",
1224 tile_images = {"default_apple.png"},
1225 inventory_image = "default_apple.png",
1226 paramtype = "light",
1227 sunlight_propagates = true,
1229 dug_item = 'craft "apple" 1',
1230 material = minetest.digprop_constanttime(0.0),
1231 furnace_burntime = 3,
1238 minetest.register_craftitem("default:stick", {
1239 image = "default_stick.png",
1240 --furnace_burntime = ...,
1241 on_place_on_ground = minetest.craftitem_place_item,
1244 minetest.register_craftitem("default:paper", {
1245 image = "default_paper.png",
1246 on_place_on_ground = minetest.craftitem_place_item,
1249 minetest.register_craftitem("default:book", {
1250 image = "default_book.png",
1251 on_place_on_ground = minetest.craftitem_place_item,
1254 minetest.register_craftitem("default:coal_lump", {
1255 image = "default_coal_lump.png",
1256 furnace_burntime = 40;
1257 on_place_on_ground = minetest.craftitem_place_item,
1260 minetest.register_craftitem("default:iron_lump", {
1261 image = "default_iron_lump.png",
1262 cookresult_itemstring = 'craft "default:steel_ingot" 1',
1263 on_place_on_ground = minetest.craftitem_place_item,
1266 minetest.register_craftitem("default:clay_lump", {
1267 image = "default_clay_lump.png",
1268 cookresult_itemstring = 'craft "default:clay_brick" 1',
1269 on_place_on_ground = minetest.craftitem_place_item,
1272 minetest.register_craftitem("default:steel_ingot", {
1273 image = "default_steel_ingot.png",
1274 on_place_on_ground = minetest.craftitem_place_item,
1277 minetest.register_craftitem("default:clay_brick", {
1278 image = "default_clay_brick.png",
1279 on_place_on_ground = minetest.craftitem_place_item,
1282 minetest.register_craftitem("default:scorched_stuff", {
1283 image = "default_scorched_stuff.png",
1284 on_place_on_ground = minetest.craftitem_place_item,
1287 minetest.register_craftitem("default:apple", {
1288 image = "default_apple.png",
1289 on_place_on_ground = minetest.craftitem_place_item,
1290 on_use = minetest.craftitem_eat(4),
1294 -- Creative inventory
1297 minetest.add_to_creative_inventory('tool "default:pick_mese" 0')
1298 minetest.add_to_creative_inventory('tool "default:pick_steel" 0')
1299 minetest.add_to_creative_inventory('tool "default:axe_steel" 0')
1300 minetest.add_to_creative_inventory('tool "default:shovel_steel" 0')
1302 minetest.add_to_creative_inventory('node "default:torch" 0')
1303 minetest.add_to_creative_inventory('node "default:cobble" 0')
1304 minetest.add_to_creative_inventory('node "default:dirt" 0')
1305 minetest.add_to_creative_inventory('node "default:stone" 0')
1306 minetest.add_to_creative_inventory('node "default:sand" 0')
1307 minetest.add_to_creative_inventory('node "default:sandstone" 0')
1308 minetest.add_to_creative_inventory('node "default:clay" 0')
1309 minetest.add_to_creative_inventory('node "default:brick" 0')
1310 minetest.add_to_creative_inventory('node "default:tree" 0')
1311 minetest.add_to_creative_inventory('node "default:leaves" 0')
1312 minetest.add_to_creative_inventory('node "default:cactus" 0')
1313 minetest.add_to_creative_inventory('node "default:papyrus" 0')
1314 minetest.add_to_creative_inventory('node "default:bookshelf" 0')
1315 minetest.add_to_creative_inventory('node "default:glass" 0')
1316 minetest.add_to_creative_inventory('node "default:fence" 0')
1317 minetest.add_to_creative_inventory('node "default:rail" 0')
1318 minetest.add_to_creative_inventory('node "default:mese" 0')
1319 minetest.add_to_creative_inventory('node "default:chest" 0')
1320 minetest.add_to_creative_inventory('node "default:furnace" 0')
1321 minetest.add_to_creative_inventory('node "default:sign_wall" 0')
1322 minetest.add_to_creative_inventory('node "default:water_source" 0')
1323 minetest.add_to_creative_inventory('node "default:lava_source" 0')
1324 minetest.add_to_creative_inventory('node "default:ladder" 0')
1327 -- Some common functions
1330 default.falling_node_names = {}
1332 function nodeupdate_single(p)
1333 n = minetest.env:get_node(p)
1334 if default.falling_node_names[n.name] ~= nil then
1335 p_bottom = {x=p.x, y=p.y-1, z=p.z}
1336 n_bottom = minetest.env:get_node(p_bottom)
1337 if n_bottom.name == "air" then
1338 minetest.env:remove_node(p)
1339 minetest.env:add_entity(p, "default:falling_"..n.name)
1345 function nodeupdate(p)
1349 p2 = {x=p.x+x, y=p.y+y, z=p.z+z}
1350 nodeupdate_single(p2)
1360 function default.register_falling_node(nodename, texture)
1361 default.falling_node_names[nodename] = true
1362 -- Override naming conventions for stuff like :default:falling_default:sand
1363 minetest.register_entity(":default:falling_"..nodename, {
1364 -- Static definition
1366 collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
1368 textures = {texture,texture,texture,texture,texture,texture},
1371 on_step = function(self, dtime)
1373 self.object:setacceleration({x=0, y=-10, z=0})
1374 -- Turn to actual sand when collides to ground or just move
1375 local pos = self.object:getpos()
1376 local bcp = {x=pos.x, y=pos.y-0.7, z=pos.z} -- Position of bottom center point
1377 local bcn = minetest.env:get_node(bcp)
1378 if bcn.name ~= "air" then
1379 -- Turn to a sand node
1380 local np = {x=bcp.x, y=bcp.y+1, z=bcp.z}
1381 minetest.env:add_node(np, {name=nodename})
1382 self.object:remove()
1390 default.register_falling_node("default:sand", "default_sand.png")
1391 default.register_falling_node("default:gravel", "default_gravel.png")
1397 -- Global environment step function
1398 function on_step(dtime)
1401 minetest.register_globalstep(on_step)
1403 function on_placenode(p, node)
1404 --print("on_placenode")
1407 minetest.register_on_placenode(on_placenode)
1409 function on_dignode(p, node)
1410 --print("on_dignode")
1413 minetest.register_on_dignode(on_dignode)
1415 function on_punchnode(p, node)
1417 minetest.register_on_punchnode(on_punchnode)
1419 minetest.register_on_chat_message(function(name, message)
1420 --print("default on_chat_message: name="..dump(name).." message="..dump(message))
1421 local cmd = "/giveme"
1422 if message:sub(0, #cmd) == cmd then
1423 if not minetest.get_player_privs(name)["give"] then
1424 minetest.chat_send_player(name, "you don't have permission to give")
1425 return true -- Handled chat message
1427 local stackstring = string.match(message, cmd.." (.*)")
1428 if stackstring == nil then
1429 minetest.chat_send_player(name, 'usage: '..cmd..' stackstring')
1430 return true -- Handled chat message
1432 print(cmd..' invoked, stackstring="'..stackstring..'"')
1433 local player = minetest.env:get_player_by_name(name)
1434 if player == nil then
1435 minetest.chat_send_player(name, name2..' is not a known player')
1436 return true -- Handled chat message
1438 local added, error_msg = player:add_to_inventory(stackstring)
1440 minetest.chat_send_player(name, '"'..stackstring
1441 ..'" added to inventory.');
1443 minetest.chat_send_player(name, 'Could not give "'..stackstring
1444 ..'": '..error_msg);
1446 return true -- Handled chat message
1449 if message:sub(0, #cmd) == cmd then
1450 if not minetest.get_player_privs(name)["give"] then
1451 minetest.chat_send_player(name, "you don't have permission to give")
1452 return true -- Handled chat message
1454 local name2, stackstring = string.match(message, cmd.." ([%a%d_-]+) (.*)")
1455 if name == nil or stackstring == nil then
1456 minetest.chat_send_player(name, 'usage: '..cmd..' name stackstring')
1457 return true -- Handled chat message
1459 print(cmd..' invoked, name2="'..name2
1460 ..'" stackstring="'..stackstring..'"')
1461 local player = minetest.env:get_player_by_name(name2)
1462 if player == nil then
1463 minetest.chat_send_player(name, name2..' is not a known player')
1464 return true -- Handled chat message
1466 local added, error_msg = player:add_to_inventory(stackstring)
1468 minetest.chat_send_player(name, '"'..stackstring
1469 ..'" added to '..name2..'\'s inventory.');
1470 minetest.chat_send_player(name2, '"'..stackstring
1471 ..'" added to inventory.');
1473 minetest.chat_send_player(name, 'Could not give "'..stackstring
1474 ..'": '..error_msg);
1476 return true -- Handled chat message
1478 local cmd = "/spawnentity"
1479 if message:sub(0, #cmd) == cmd then
1480 if not minetest.get_player_privs(name)["give"] then
1481 minetest.chat_send_player(name, "you don't have permission to spawn (give)")
1482 return true -- Handled chat message
1484 local entityname = string.match(message, cmd.." (.*)")
1485 if entityname == nil then
1486 minetest.chat_send_player(name, 'usage: '..cmd..' entityname')
1487 return true -- Handled chat message
1489 print(cmd..' invoked, entityname="'..entityname..'"')
1490 local player = minetest.env:get_player_by_name(name)
1491 if player == nil then
1492 print("Unable to spawn entity, player is nil")
1493 return true -- Handled chat message
1495 local p = player:getpos()
1497 minetest.env:add_entity(p, entityname)
1498 minetest.chat_send_player(name, '"'..entityname
1500 return true -- Handled chat message
1505 -- Done, print some random stuff
1508 --print("minetest.registered_entities:")
1509 --dump2(minetest.registered_entities)