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 "default:dirt" 5'
77 -- eg. 'tool "default:pick_wood" 21323'
78 -- eg. 'craft "default:apple" 2'
80 -- item: A single item in Lua table format.
81 -- eg. {type="node", name="default: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="default: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_inventory(location) -> InvRef
114 -- minetest.get_modpath(modname) -> eg. "/home/user/.minetest/usermods/modname"
115 -- ^ location = eg. {type="player", name="celeron55"}
116 -- {type="node", pos={x=, y=, z=}}
118 -- stackstring_take_item(stackstring) -> stackstring, item
119 -- stackstring_put_item(stackstring, item) -> stackstring, success
120 -- stackstring_put_stackstring(stackstring, stackstring) -> stackstring, success
122 -- minetest.digprop_constanttime(time)
123 -- minetest.digprop_stonelike(toughness)
124 -- minetest.digprop_dirtlike(toughness)
125 -- minetest.digprop_gravellike(toughness)
126 -- minetest.digprop_woodlike(toughness)
127 -- minetest.digprop_leaveslike(toughness)
128 -- minetest.digprop_glasslike(toughness)
131 -- minetest.env - environment reference
134 -- minetest.registered_nodes
135 -- ^ List of registered node definitions, indexed by name
136 -- minetest.registered_craftitems
137 -- ^ List of registered craft item definitions, indexed by name
138 -- minetest.registered_entities
139 -- ^ List of registered entity prototypes, indexed by name
140 -- minetest.object_refs
141 -- ^ List of object references, indexed by active object id
142 -- minetest.luaentities
143 -- ^ List of lua entities, indexed by active object id
145 -- EnvRef is basically ServerEnvironment and ServerMap combined.
147 -- - add_node(pos, node)
148 -- - remove_node(pos)
150 -- ^ Returns {name="ignore", ...} for unloaded area
151 -- - get_node_or_nil(pos)
152 -- ^ Returns nil for unloaded area
153 -- - get_node_light(pos, timeofday) -> 0...15 or nil
154 -- ^ timeofday: nil = current time, 0 = night, 0.5 = day
155 -- - add_entity(pos, name)
156 -- - add_item(pos, itemstring)
158 -- - add_firefly(pos)
159 -- - get_meta(pos) -- Get a NodeMetaRef at that position
160 -- - get_player_by_name(name) -- Get an ObjectRef to a player
161 -- - get_objects_inside_radius(pos, radius)
165 -- - allows_text_input()
166 -- - set_text(text) -- eg. set the text of a sign
169 -- Generic node metadata specific:
170 -- - set_infotext(infotext)
171 -- - get_inventory() -> InvRef
172 -- - inventory_set_list(name, {item1, item2, ...})
173 -- - inventory_get_list(name)
174 -- - set_inventory_draw_spec(string)
175 -- - set_allow_text_input(bool)
176 -- - set_allow_removal(bool)
177 -- - set_enforce_owner(bool)
178 -- - is_inventory_modified()
179 -- - reset_inventory_modified()
180 -- - is_text_modified()
181 -- - reset_text_modified()
182 -- - set_string(name, value)
183 -- - get_string(name)
185 -- ObjectRef is basically ServerActiveObject.
186 -- ObjectRef methods:
187 -- - remove(): remove object (after returning from Lua)
188 -- - getpos() -> {x=num, y=num, z=num}
189 -- - setpos(pos); pos={x=num, y=num, z=num}
190 -- - moveto(pos, continuous=false): interpolated move
191 -- - punch(puncher, time_from_last_punch)
192 -- ^ puncher = an another ObjectRef,
193 -- ^ time_from_last_punch = time since last punch action of the puncher
194 -- - right_click(clicker); clicker = an another ObjectRef
195 -- - get_wield_digging_properties() -> digging property table
196 -- - damage_wielded_item(num) (item damage/wear range is 0-65535)
197 -- - add_to_inventory(itemstring): add an item to object inventory
198 -- - add_to_inventory_later(itemstring): like above, but after callback returns (only allowed for craftitem callbacks)
199 -- - get_hp(): returns number of hitpoints (2 * number of hearts)
200 -- - set_hp(hp): set number of hitpoints (2 * number of hearts)
201 -- LuaEntitySAO-only:
202 -- - setvelocity({x=num, y=num, z=num})
203 -- - setacceleration({x=num, y=num, z=num})
204 -- - getacceleration() -> {x=num, y=num, z=num}
205 -- - settexturemod(mod)
206 -- - setsprite(p={x=0,y=0}, num_frames=1, framelength=0.2,
207 -- - select_horiz_by_yawpitch=false)
209 -- - get_player_name(): will return nil if is not a player
210 -- - get_inventory() -> InvRef
211 -- - inventory_set_list(name, {item1, item2, ...})
212 -- - inventory_get_list(name) -> {item1, item2, ...}
213 -- - get_look_dir(): get camera direction as a unit vector
214 -- - get_look_pitch(): pitch in radians
216 -- - get_look_yaw(): yaw in radians (wraps around pretty randomly as of now)
218 -- - get_size(listname): get size of a list
219 -- - set_size(listname, size): set size of a list
220 -- - get_stack(listname, i): get a copy of stack index i in list
221 -- - set_stack(listname, i, stack): copy stack to index i in list
222 -- - get_list(listname): return full list
223 -- - set_list(listname, list): set full list (size will not change)
224 -- - autoinsert_stack(listname, stack): insert stack somewhere in list
225 -- - autoinsert_stackstring(listname, stackstring)
228 -- - peek_item(): return item from stack without removing it
229 -- - take_item(): remove item from stack and return it
230 -- - put_item(item): put item in stack; return false if not possible
231 -- - put_stackstring(stackstring): return false if not possible
233 -- Registered entities:
234 -- - Functions receive a "luaentity" as self:
235 -- - It has the member .object, which is an ObjectRef pointing to the object
236 -- - The original prototype stuff is visible directly via a metatable
238 -- - on_activate(self, staticdata)
239 -- - on_step(self, dtime)
240 -- - on_punch(self, hitter)
241 -- - on_rightclick(self, clicker)
242 -- - get_staticdata(self)
243 -- ^ return string that will be passed to on_activate when the object
244 -- is created next time
246 -- Entity prototype table:
249 -- collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
251 -- textures = {texture,texture,texture,texture,texture,texture},
252 -- on_activate = function(self, staticdata),
253 -- on_step = function(self, dtime),
254 -- on_punch = function(self, hitter),
255 -- on_rightclick = function(self, clicker),
256 -- get_staticdata = function(self),
257 -- # Also you can define arbitrary member variables here
258 -- myvariable = whatever,
263 -- image = "default_tool_steelaxe.png",
264 -- full_punch_interval = 1.0,
267 -- dt_crackiness = -0.2,
268 -- dt_crumbliness = 1,
269 -- dt_cuttability = -0.5,
270 -- basedurability = 330,
272 -- dd_crackiness = 0,
273 -- dd_crumbliness = 0,
274 -- dd_cuttability = 0,
277 -- Node definition options:
279 -- name = "modname:somenode",
280 -- drawtype = "normal",
281 -- visual_scale = 1.0,
282 -- tile_images = {"default_unknown_block.png"},
283 -- inventory_image = "default_unknown_block.png",
284 -- special_materials = {
285 -- {image="", backface_culling=true},
286 -- {image="", backface_culling=true},
289 -- post_effect_color = {a=0, r=0, g=0, b=0},
290 -- paramtype = "none",
291 -- is_ground_content = false,
292 -- sunlight_propagates = false,
296 -- climbable = false,
297 -- buildable_to = false,
298 -- wall_mounted = false,
299 -- often_contains_mineral = false,
301 -- extra_dug_item = "",
302 -- extra_dug_item_rarity = 2,
303 -- metadata_name = "",
304 -- liquidtype = "none",
305 -- liquid_alternative_flowing = "",
306 -- liquid_alternative_source = "",
307 -- liquid_viscosity = 0,
309 -- damage_per_second = 0,
310 -- selection_box = {type="regular"},
312 -- diggablity = "normal",
319 -- cookresult_itemstring = "", -- Cannot be cooked
320 -- furnace_cooktime = 3.0,
321 -- furnace_burntime = -1, -- Cannot be used as fuel
324 -- Craftitem definition options:
325 -- minetest.register_craftitem("modname_name", {
326 -- image = "default_image.png",
327 -- stack_max = <maximum number of items in stack>,
328 -- cookresult_itemstring = itemstring (result of cooking),
329 -- furnace_cooktime = <cooking time>,
330 -- furnace_burntime = <time to burn as fuel in furnace>,
331 -- usable = <uh... some boolean value>,
332 -- dropcount = <amount of items to drop using drop action>
333 -- liquids_pointable = <whether can point liquids>,
334 -- on_drop = func(item, dropper, pos),
335 -- on_place_on_ground = func(item, placer, pos),
336 -- on_use = func(item, player, pointed_thing),
341 -- output = 'tool "default:pick_stone"',
343 -- {'node "default:cobble"', 'node "default:cobble"', 'node "default:cobble"'},
344 -- {'', 'craft "default:stick"', ''},
345 -- {'', 'craft "default:stick"', ''},
349 -- ABM (ActiveBlockModifier) definition:
351 -- nodenames = {"default:lava_source"},
352 -- neighbors = {"default:water_source", "default:water_flowing"}, -- (any of these)
353 -- ^ If left out or empty, any neighbor will do
354 -- ^ This might get removed in the future
355 -- interval = 1.0, -- (operation interval)
356 -- chance = 1, -- (chance of trigger is 1.0/this)
357 -- action = func(pos, node, active_object_count, active_object_count_wider),
365 -- Definitions made by this mod that other mods can use too
373 minetest.register_tool(":", {
387 minetest.register_tool("default:pick_wood", {
388 image = "default_tool_woodpick.png",
391 dt_crackiness = -0.5,
400 minetest.register_tool("default:pick_stone", {
401 image = "default_tool_stonepick.png",
404 dt_crackiness = -0.5,
407 basedurability = 100,
413 minetest.register_tool("default:pick_steel", {
414 image = "default_tool_steelpick.png",
417 dt_crackiness = -0.5,
420 basedurability = 333,
426 minetest.register_tool("default:pick_mese", {
427 image = "default_tool_mesepick.png",
433 basedurability = 1337,
439 minetest.register_tool("default:shovel_wood", {
440 image = "default_tool_woodshovel.png",
444 dt_crumbliness = -1.5,
445 dt_cuttability = 0.3,
452 minetest.register_tool("default:shovel_stone", {
453 image = "default_tool_stoneshovel.png",
457 dt_crumbliness = -1.5,
458 dt_cuttability = 0.1,
459 basedurability = 100,
465 minetest.register_tool("default:shovel_steel", {
466 image = "default_tool_steelshovel.png",
470 dt_crumbliness = -1.5,
471 dt_cuttability = 0.0,
472 basedurability = 330,
478 minetest.register_tool("default:axe_wood", {
479 image = "default_tool_woodaxe.png",
482 dt_crackiness = -0.2,
484 dt_cuttability = -0.5,
491 minetest.register_tool("default:axe_stone", {
492 image = "default_tool_stoneaxe.png",
495 dt_crackiness = -0.2,
497 dt_cuttability = -0.5,
498 basedurability = 100,
504 minetest.register_tool("default:axe_steel", {
505 image = "default_tool_steelaxe.png",
508 dt_crackiness = -0.2,
510 dt_cuttability = -0.5,
511 basedurability = 330,
517 minetest.register_tool("default:sword_wood", {
518 image = "default_tool_woodsword.png",
530 minetest.register_tool("default:sword_stone", {
531 image = "default_tool_stonesword.png",
537 basedurability = 100,
543 minetest.register_tool("default:sword_steel", {
544 image = "default_tool_steelsword.png",
550 basedurability = 330,
558 -- Crafting definition
561 minetest.register_craft({
562 output = 'node "default:wood" 4',
564 {'node "default:tree"'},
568 minetest.register_craft({
569 output = 'craft "default:stick" 4',
571 {'node "default:wood"'},
575 minetest.register_craft({
576 output = 'node "default:fence_wood" 2',
578 {'craft "default:stick"', 'craft "default:stick"', 'craft "default:stick"'},
579 {'craft "default:stick"', 'craft "default:stick"', 'craft "default:stick"'},
583 minetest.register_craft({
584 output = 'node "default:sign_wall" 1',
586 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
587 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
588 {'', 'craft "default:stick"', ''},
592 minetest.register_craft({
593 output = 'node "default:torch" 4',
595 {'craft "default:coal_lump"'},
596 {'craft "default:stick"'},
600 minetest.register_craft({
601 output = 'tool "default:pick_wood"',
603 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
604 {'', 'craft "default:stick"', ''},
605 {'', 'craft "default:stick"', ''},
609 minetest.register_craft({
610 output = 'tool "default:pick_stone"',
612 {'node "default:cobble"', 'node "default:cobble"', 'node "default:cobble"'},
613 {'', 'craft "default:stick"', ''},
614 {'', 'craft "default:stick"', ''},
618 minetest.register_craft({
619 output = 'tool "default:pick_steel"',
621 {'craft "default:steel_ingot"', 'craft "default:steel_ingot"', 'craft "default:steel_ingot"'},
622 {'', 'craft "default:stick"', ''},
623 {'', 'craft "default:stick"', ''},
627 minetest.register_craft({
628 output = 'tool "default:pick_mese"',
630 {'node "default:mese"', 'node "default:mese"', 'node "default:mese"'},
631 {'', 'craft "default:stick"', ''},
632 {'', 'craft "default:stick"', ''},
636 minetest.register_craft({
637 output = 'tool "default:shovel_wood"',
639 {'node "default:wood"'},
640 {'craft "default:stick"'},
641 {'craft "default:stick"'},
645 minetest.register_craft({
646 output = 'tool "default:shovel_stone"',
648 {'node "default:cobble"'},
649 {'craft "default:stick"'},
650 {'craft "default:stick"'},
654 minetest.register_craft({
655 output = 'tool "default:shovel_steel"',
657 {'craft "default:steel_ingot"'},
658 {'craft "default:stick"'},
659 {'craft "default:stick"'},
663 minetest.register_craft({
664 output = 'tool "default:axe_wood"',
666 {'node "default:wood"', 'node "default:wood"'},
667 {'node "default:wood"', 'craft "default:stick"'},
668 {'', 'craft "default:stick"'},
672 minetest.register_craft({
673 output = 'tool "default:axe_stone"',
675 {'node "default:cobble"', 'node "default:cobble"'},
676 {'node "default:cobble"', 'craft "default:stick"'},
677 {'', 'craft "default:stick"'},
681 minetest.register_craft({
682 output = 'tool "default:axe_steel"',
684 {'craft "default:steel_ingot"', 'craft "default:steel_ingot"'},
685 {'craft "default:steel_ingot"', 'craft "default:stick"'},
686 {'', 'craft "default:stick"'},
690 minetest.register_craft({
691 output = 'tool "default:sword_wood"',
693 {'node "default:wood"'},
694 {'node "default:wood"'},
695 {'craft "default:stick"'},
699 minetest.register_craft({
700 output = 'tool "default:sword_stone"',
702 {'node "default:cobble"'},
703 {'node "default:cobble"'},
704 {'craft "default:stick"'},
708 minetest.register_craft({
709 output = 'tool "default:sword_steel"',
711 {'craft "default:steel_ingot"'},
712 {'craft "default:steel_ingot"'},
713 {'craft "default:stick"'},
717 minetest.register_craft({
718 output = 'node "default:rail" 15',
720 {'craft "default:steel_ingot"', '', 'craft "default:steel_ingot"'},
721 {'craft "default:steel_ingot"', 'craft "default:stick"', 'craft "default:steel_ingot"'},
722 {'craft "default:steel_ingot"', '', 'craft "default:steel_ingot"'},
726 minetest.register_craft({
727 output = 'node "default:chest" 1',
729 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
730 {'node "default:wood"', '', 'node "default:wood"'},
731 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
735 minetest.register_craft({
736 output = 'node "default:chest_locked" 1',
738 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
739 {'node "default:wood"', 'craft "default:steel_ingot"', 'node "default:wood"'},
740 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
744 minetest.register_craft({
745 output = 'node "default:furnace" 1',
747 {'node "default:cobble"', 'node "default:cobble"', 'node "default:cobble"'},
748 {'node "default:cobble"', '', 'node "default:cobble"'},
749 {'node "default:cobble"', 'node "default:cobble"', 'node "default:cobble"'},
753 minetest.register_craft({
754 output = 'node "default:steelblock" 1',
756 {'craft "default:steel_ingot"', 'craft "default:steel_ingot"', 'craft "default:steel_ingot"'},
757 {'craft "default:steel_ingot"', 'craft "default:steel_ingot"', 'craft "default:steel_ingot"'},
758 {'craft "default:steel_ingot"', 'craft "default:steel_ingot"', 'craft "default:steel_ingot"'},
762 minetest.register_craft({
763 output = 'node "default:sandstone" 1',
765 {'node "default:sand"', 'node "default:sand"'},
766 {'node "default:sand"', 'node "default:sand"'},
770 minetest.register_craft({
771 output = 'node "default:clay" 1',
773 {'craft "default:clay_lump"', 'craft "default:clay_lump"'},
774 {'craft "default:clay_lump"', 'craft "default:clay_lump"'},
778 minetest.register_craft({
779 output = 'node "default:brick" 1',
781 {'craft "default:clay_brick"', 'craft "default:clay_brick"'},
782 {'craft "default:clay_brick"', 'craft "default:clay_brick"'},
786 minetest.register_craft({
787 output = 'craft "default:paper" 1',
789 {'node "default:papyrus"', 'node "default:papyrus"', 'node "default:papyrus"'},
793 minetest.register_craft({
794 output = 'craft "default:book" 1',
796 {'craft "default:paper"'},
797 {'craft "default:paper"'},
798 {'craft "default:paper"'},
802 minetest.register_craft({
803 output = 'node "default:bookshelf" 1',
805 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
806 {'craft "default:book"', 'craft "default:book"', 'craft "default:book"'},
807 {'node "default:wood"', 'node "default:wood"', 'node "default:wood"'},
811 minetest.register_craft({
812 output = 'node "default:ladder" 1',
814 {'craft "default:stick"', '', 'craft "default:stick"'},
815 {'craft "default:stick"', 'craft "default:stick"', 'craft "default:stick"'},
816 {'craft "default:stick"', '', 'craft "default:stick"'},
824 minetest.register_node("default:stone", {
825 tile_images = {"default_stone.png"},
826 inventory_image = minetest.inventorycube("default_stone.png"),
827 paramtype = "mineral",
828 is_ground_content = true,
829 often_contains_mineral = true, -- Texture atlas hint
830 material = minetest.digprop_stonelike(1.0),
831 dug_item = 'node "default:cobble" 1',
834 minetest.register_node("default:dirt_with_grass", {
835 tile_images = {"default_grass.png", "default_dirt.png", "default_dirt.png^default_grass_side.png"},
836 inventory_image = minetest.inventorycube("default_dirt.png^default_grass_side.png"),
837 is_ground_content = true,
838 material = minetest.digprop_dirtlike(1.0),
839 dug_item = 'node "default:dirt" 1',
842 minetest.register_node("default:dirt_with_grass_footsteps", {
843 tile_images = {"default_grass_footsteps.png", "default_dirt.png", "default_dirt.png^default_grass_side.png"},
844 inventory_image = "default_grass_footsteps.png",
845 is_ground_content = true,
846 material = minetest.digprop_dirtlike(1.0),
847 dug_item = 'node "default:dirt" 1',
850 minetest.register_node("default:dirt", {
851 tile_images = {"default_dirt.png"},
852 inventory_image = minetest.inventorycube("default_dirt.png"),
853 is_ground_content = true,
854 material = minetest.digprop_dirtlike(1.0),
857 minetest.register_node("default:sand", {
858 tile_images = {"default_sand.png"},
859 inventory_image = minetest.inventorycube("default_sand.png"),
860 is_ground_content = true,
861 material = minetest.digprop_dirtlike(1.0),
862 cookresult_itemstring = 'node "default:glass" 1',
865 minetest.register_node("default:gravel", {
866 tile_images = {"default_gravel.png"},
867 inventory_image = minetest.inventorycube("default_gravel.png"),
868 is_ground_content = true,
869 material = minetest.digprop_gravellike(1.0),
872 minetest.register_node("default:sandstone", {
873 tile_images = {"default_sandstone.png"},
874 inventory_image = minetest.inventorycube("default_sandstone.png"),
875 is_ground_content = true,
876 material = minetest.digprop_dirtlike(1.0), -- FIXME should this be stonelike?
877 dug_item = 'node "default:sand" 1', -- FIXME is this intentional?
880 minetest.register_node("default:clay", {
881 tile_images = {"default_clay.png"},
882 inventory_image = minetest.inventorycube("default_clay.png"),
883 is_ground_content = true,
884 material = minetest.digprop_dirtlike(1.0),
885 dug_item = 'craft "default:clay_lump" 4',
888 minetest.register_node("default:brick", {
889 tile_images = {"default_brick.png"},
890 inventory_image = minetest.inventorycube("default_brick.png"),
891 is_ground_content = true,
892 material = minetest.digprop_stonelike(1.0),
893 dug_item = 'craft "default:clay_brick" 4',
896 minetest.register_node("default:tree", {
897 tile_images = {"default_tree_top.png", "default_tree_top.png", "default_tree.png"},
898 inventory_image = minetest.inventorycube("default_tree_top.png", "default_tree.png", "default_tree.png"),
899 is_ground_content = true,
900 material = minetest.digprop_woodlike(1.0),
901 cookresult_itemstring = 'craft "default:coal_lump" 1',
902 furnace_burntime = 30,
905 minetest.register_node("default:jungletree", {
906 tile_images = {"default_jungletree_top.png", "default_jungletree_top.png", "default_jungletree.png"},
907 inventory_image = minetest.inventorycube("default_jungletree_top.png", "default_jungletree.png", "default_jungletree.png"),
908 is_ground_content = true,
909 material = minetest.digprop_woodlike(1.0),
910 cookresult_itemstring = 'craft "default:coal_lump" 1',
911 furnace_burntime = 30,
914 minetest.register_node("default:junglegrass", {
915 drawtype = "plantlike",
917 tile_images = {"default_junglegrass.png"},
918 inventory_image = "default_junglegrass.png",
921 material = minetest.digprop_leaveslike(1.0),
922 furnace_burntime = 2,
925 minetest.register_node("default:leaves", {
926 drawtype = "allfaces_optional",
928 tile_images = {"default_leaves.png"},
929 inventory_image = minetest.inventorycube("default_leaves.png"),
931 material = minetest.digprop_leaveslike(1.0),
932 extra_dug_item = 'node "default:sapling" 1',
933 extra_dug_item_rarity = 20,
934 furnace_burntime = 1,
937 minetest.register_node("default:cactus", {
938 tile_images = {"default_cactus_top.png", "default_cactus_top.png", "default_cactus_side.png"},
939 inventory_image = minetest.inventorycube("default_cactus_top.png", "default_cactus_side.png", "default_cactus_side.png"),
940 is_ground_content = true,
941 material = minetest.digprop_woodlike(0.75),
942 furnace_burntime = 15,
945 minetest.register_node("default:papyrus", {
946 drawtype = "plantlike",
947 tile_images = {"default_papyrus.png"},
948 inventory_image = "default_papyrus.png",
950 is_ground_content = true,
952 material = minetest.digprop_leaveslike(0.5),
953 furnace_burntime = 1,
956 minetest.register_node("default:bookshelf", {
957 tile_images = {"default_wood.png", "default_wood.png", "default_bookshelf.png"},
958 inventory_image = minetest.inventorycube("default_wood.png", "default_bookshelf.png", "default_bookshelf.png"),
959 is_ground_content = true,
960 material = minetest.digprop_woodlike(0.75),
961 furnace_burntime = 30,
964 minetest.register_node("default:glass", {
965 drawtype = "glasslike",
966 tile_images = {"default_glass.png"},
967 inventory_image = minetest.inventorycube("default_glass.png"),
969 sunlight_propagates = true,
970 is_ground_content = true,
971 material = minetest.digprop_glasslike(1.0),
974 minetest.register_node("default:fence_wood", {
975 drawtype = "fencelike",
976 tile_images = {"default_wood.png"},
977 inventory_image = "default_fence.png",
979 is_ground_content = true,
982 fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7},
984 furnace_burntime = 15,
985 material = minetest.digprop_woodlike(0.75),
988 minetest.register_node("default:rail", {
989 drawtype = "raillike",
990 tile_images = {"default_rail.png", "default_rail_curved.png", "default_rail_t_junction.png", "default_rail_crossing.png"},
991 inventory_image = "default_rail.png",
993 is_ground_content = true,
999 material = minetest.digprop_dirtlike(0.75),
1002 minetest.register_node("default:ladder", {
1003 drawtype = "signlike",
1004 tile_images = {"default_ladder.png"},
1005 inventory_image = "default_ladder.png",
1006 paramtype = "light",
1007 is_ground_content = true,
1008 wall_mounted = true,
1012 type = "wallmounted",
1013 --wall_top = = <default>
1014 --wall_bottom = = <default>
1015 --wall_side = = <default>
1017 furnace_burntime = 5,
1018 material = minetest.digprop_woodlike(0.5),
1021 minetest.register_node("default:wood", {
1022 tile_images = {"default_wood.png"},
1023 inventory_image = minetest.inventorycube("default_wood.png"),
1024 is_ground_content = true,
1025 furnace_burntime = 7,
1026 material = minetest.digprop_woodlike(0.75),
1029 minetest.register_node("default:mese", {
1030 tile_images = {"default_mese.png"},
1031 inventory_image = minetest.inventorycube("default_mese.png"),
1032 is_ground_content = true,
1033 furnace_burntime = 30,
1034 material = minetest.digprop_stonelike(0.5),
1037 minetest.register_node("default:cloud", {
1038 tile_images = {"default_cloud.png"},
1039 inventory_image = minetest.inventorycube("default_cloud.png"),
1040 is_ground_content = true,
1043 minetest.register_node("default:water_flowing", {
1044 drawtype = "flowingliquid",
1045 tile_images = {"default_water.png"},
1046 alpha = WATER_ALPHA,
1047 inventory_image = minetest.inventorycube("default_water.png"),
1048 paramtype = "light",
1052 buildable_to = true,
1053 liquidtype = "flowing",
1054 liquid_alternative_flowing = "default:water_flowing",
1055 liquid_alternative_source = "default:water_source",
1056 liquid_viscosity = WATER_VISC,
1057 post_effect_color = {a=64, r=100, g=100, b=200},
1058 special_materials = {
1059 {image="default_water.png", backface_culling=false},
1060 {image="default_water.png", backface_culling=true},
1064 minetest.register_node("default:water_source", {
1065 drawtype = "liquid",
1066 tile_images = {"default_water.png"},
1067 alpha = WATER_ALPHA,
1068 inventory_image = minetest.inventorycube("default_water.png"),
1069 paramtype = "light",
1073 buildable_to = true,
1074 liquidtype = "source",
1075 liquid_alternative_flowing = "default:water_flowing",
1076 liquid_alternative_source = "default:water_source",
1077 liquid_viscosity = WATER_VISC,
1078 post_effect_color = {a=64, r=100, g=100, b=200},
1079 special_materials = {
1080 -- New-style water source material (mostly unused)
1081 {image="default_water.png", backface_culling=false},
1085 minetest.register_node("default:lava_flowing", {
1086 drawtype = "flowingliquid",
1087 tile_images = {"default_lava.png"},
1088 inventory_image = minetest.inventorycube("default_lava.png"),
1089 paramtype = "light",
1090 light_source = LIGHT_MAX - 1,
1094 buildable_to = true,
1095 liquidtype = "flowing",
1096 liquid_alternative_flowing = "default:lava_flowing",
1097 liquid_alternative_source = "default:lava_source",
1098 liquid_viscosity = LAVA_VISC,
1099 damage_per_second = 4*2,
1100 post_effect_color = {a=192, r=255, g=64, b=0},
1101 special_materials = {
1102 {image="default_lava.png", backface_culling=false},
1103 {image="default_lava.png", backface_culling=true},
1107 minetest.register_node("default:lava_source", {
1108 drawtype = "liquid",
1109 tile_images = {"default_lava.png"},
1110 inventory_image = minetest.inventorycube("default_lava.png"),
1111 paramtype = "light",
1112 light_source = LIGHT_MAX - 1,
1116 buildable_to = true,
1117 liquidtype = "source",
1118 liquid_alternative_flowing = "default:lava_flowing",
1119 liquid_alternative_source = "default:lava_source",
1120 liquid_viscosity = LAVA_VISC,
1121 damage_per_second = 4*2,
1122 post_effect_color = {a=192, r=255, g=64, b=0},
1123 special_materials = {
1124 -- New-style lava source material (mostly unused)
1125 {image="default_lava.png", backface_culling=false},
1127 furnace_burntime = 60,
1130 minetest.register_node("default:torch", {
1131 drawtype = "torchlike",
1132 tile_images = {"default_torch_on_floor.png", "default_torch_on_ceiling.png", "default_torch.png"},
1133 inventory_image = "default_torch_on_floor.png",
1134 paramtype = "light",
1135 sunlight_propagates = true,
1137 wall_mounted = true,
1138 light_source = LIGHT_MAX-1,
1140 type = "wallmounted",
1141 wall_top = {-0.1, 0.5-0.6, -0.1, 0.1, 0.5, 0.1},
1142 wall_bottom = {-0.1, -0.5, -0.1, 0.1, -0.5+0.6, 0.1},
1143 wall_side = {-0.5, -0.3, -0.1, -0.5+0.3, 0.3, 0.1},
1145 material = minetest.digprop_constanttime(0.0),
1146 furnace_burntime = 4,
1149 minetest.register_node("default:sign_wall", {
1150 drawtype = "signlike",
1151 tile_images = {"default_sign_wall.png"},
1152 inventory_image = "default_sign_wall.png",
1153 paramtype = "light",
1154 sunlight_propagates = true,
1156 wall_mounted = true,
1157 metadata_name = "sign",
1159 type = "wallmounted",
1160 --wall_top = <default>
1161 --wall_bottom = <default>
1162 --wall_side = <default>
1164 material = minetest.digprop_constanttime(0.5),
1165 furnace_burntime = 10,
1168 minetest.register_node("default:chest", {
1169 tile_images = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
1170 "default_chest_side.png", "default_chest_side.png", "default_chest_front.png"},
1171 inventory_image = minetest.inventorycube("default_chest_top.png", "default_chest_front.png", "default_chest_side.png"),
1172 paramtype = "facedir_simple",
1173 metadata_name = "chest",
1174 material = minetest.digprop_woodlike(1.0),
1175 furnace_burntime = 30,
1178 minetest.register_node("default:chest_locked", {
1179 tile_images = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
1180 "default_chest_side.png", "default_chest_side.png", "default_chest_lock.png"},
1181 inventory_image = minetest.inventorycube("default_chest_top.png", "default_chest_lock.png", "default_chest_side.png"),
1182 paramtype = "facedir_simple",
1183 metadata_name = "locked_chest",
1184 material = minetest.digprop_woodlike(1.0),
1185 furnace_burntime = 30,
1188 minetest.register_node("default:furnace", {
1189 tile_images = {"default_furnace_side.png", "default_furnace_side.png", "default_furnace_side.png",
1190 "default_furnace_side.png", "default_furnace_side.png", "default_furnace_front.png"},
1191 inventory_image = minetest.inventorycube("default_furnace_side.png", "default_furnace_front.png", "default_furnace_side.png"),
1192 paramtype = "facedir_simple",
1193 metadata_name = "furnace",
1194 material = minetest.digprop_stonelike(3.0),
1197 minetest.register_node("default:cobble", {
1198 tile_images = {"default_cobble.png"},
1199 inventory_image = minetest.inventorycube("default_cobble.png"),
1200 is_ground_content = true,
1201 cookresult_itemstring = 'node "default:stone" 1',
1202 material = minetest.digprop_stonelike(0.9),
1205 minetest.register_node("default:mossycobble", {
1206 tile_images = {"default_mossycobble.png"},
1207 inventory_image = minetest.inventorycube("default_mossycobble.png"),
1208 is_ground_content = true,
1209 material = minetest.digprop_stonelike(0.8),
1212 minetest.register_node("default:steelblock", {
1213 tile_images = {"default_steel_block.png"},
1214 inventory_image = minetest.inventorycube("default_steel_block.png"),
1215 is_ground_content = true,
1216 material = minetest.digprop_stonelike(5.0),
1219 minetest.register_node("default:nyancat", {
1220 tile_images = {"default_nc_side.png", "default_nc_side.png", "default_nc_side.png",
1221 "default_nc_side.png", "default_nc_back.png", "default_nc_front.png"},
1222 inventory_image = "default_nc_front.png",
1223 paramtype = "facedir_simple",
1224 material = minetest.digprop_stonelike(3.0),
1225 furnace_burntime = 1,
1228 minetest.register_node("default:nyancat_rainbow", {
1229 tile_images = {"default_nc_rb.png"},
1230 inventory_image = "default_nc_rb.png",
1231 material = minetest.digprop_stonelike(3.0),
1232 furnace_burntime = 1,
1235 minetest.register_node("default:sapling", {
1236 drawtype = "plantlike",
1238 tile_images = {"default_sapling.png"},
1239 inventory_image = "default_sapling.png",
1240 paramtype = "light",
1242 material = minetest.digprop_constanttime(0.0),
1243 furnace_burntime = 10,
1246 minetest.register_node("default:apple", {
1247 drawtype = "plantlike",
1249 tile_images = {"default_apple.png"},
1250 inventory_image = "default_apple.png",
1251 paramtype = "light",
1252 sunlight_propagates = true,
1254 dug_item = 'craft "default:apple" 1',
1255 material = minetest.digprop_constanttime(0.0),
1256 furnace_burntime = 3,
1263 minetest.register_craftitem("default:stick", {
1264 image = "default_stick.png",
1265 --furnace_burntime = ...,
1266 on_place_on_ground = minetest.craftitem_place_item,
1269 minetest.register_craftitem("default:paper", {
1270 image = "default_paper.png",
1271 on_place_on_ground = minetest.craftitem_place_item,
1274 minetest.register_craftitem("default:book", {
1275 image = "default_book.png",
1276 on_place_on_ground = minetest.craftitem_place_item,
1279 minetest.register_craftitem("default:coal_lump", {
1280 image = "default_coal_lump.png",
1281 furnace_burntime = 40;
1282 on_place_on_ground = minetest.craftitem_place_item,
1285 minetest.register_craftitem("default:iron_lump", {
1286 image = "default_iron_lump.png",
1287 cookresult_itemstring = 'craft "default:steel_ingot" 1',
1288 on_place_on_ground = minetest.craftitem_place_item,
1291 minetest.register_craftitem("default:clay_lump", {
1292 image = "default_clay_lump.png",
1293 cookresult_itemstring = 'craft "default:clay_brick" 1',
1294 on_place_on_ground = minetest.craftitem_place_item,
1297 minetest.register_craftitem("default:steel_ingot", {
1298 image = "default_steel_ingot.png",
1299 on_place_on_ground = minetest.craftitem_place_item,
1302 minetest.register_craftitem("default:clay_brick", {
1303 image = "default_clay_brick.png",
1304 on_place_on_ground = minetest.craftitem_place_item,
1307 minetest.register_craftitem("default:scorched_stuff", {
1308 image = "default_scorched_stuff.png",
1309 on_place_on_ground = minetest.craftitem_place_item,
1312 minetest.register_craftitem("default:apple", {
1313 image = "default_apple.png",
1314 on_place_on_ground = minetest.craftitem_place_item,
1315 on_use = minetest.craftitem_eat(4),
1319 -- Creative inventory
1322 minetest.add_to_creative_inventory('tool "default:pick_mese" 0')
1323 minetest.add_to_creative_inventory('tool "default:pick_steel" 0')
1324 minetest.add_to_creative_inventory('tool "default:axe_steel" 0')
1325 minetest.add_to_creative_inventory('tool "default:shovel_steel" 0')
1327 minetest.add_to_creative_inventory('node "default:torch" 0')
1328 minetest.add_to_creative_inventory('node "default:cobble" 0')
1329 minetest.add_to_creative_inventory('node "default:dirt" 0')
1330 minetest.add_to_creative_inventory('node "default:stone" 0')
1331 minetest.add_to_creative_inventory('node "default:sand" 0')
1332 minetest.add_to_creative_inventory('node "default:sandstone" 0')
1333 minetest.add_to_creative_inventory('node "default:clay" 0')
1334 minetest.add_to_creative_inventory('node "default:brick" 0')
1335 minetest.add_to_creative_inventory('node "default:tree" 0')
1336 minetest.add_to_creative_inventory('node "default:wood" 0')
1337 minetest.add_to_creative_inventory('node "default:leaves" 0')
1338 minetest.add_to_creative_inventory('node "default:cactus" 0')
1339 minetest.add_to_creative_inventory('node "default:papyrus" 0')
1340 minetest.add_to_creative_inventory('node "default:bookshelf" 0')
1341 minetest.add_to_creative_inventory('node "default:glass" 0')
1342 minetest.add_to_creative_inventory('node "default:fence" 0')
1343 minetest.add_to_creative_inventory('node "default:rail" 0')
1344 minetest.add_to_creative_inventory('node "default:mese" 0')
1345 minetest.add_to_creative_inventory('node "default:chest" 0')
1346 minetest.add_to_creative_inventory('node "default:furnace" 0')
1347 minetest.add_to_creative_inventory('node "default:sign_wall" 0')
1348 minetest.add_to_creative_inventory('node "default:water_source" 0')
1349 minetest.add_to_creative_inventory('node "default:lava_source" 0')
1350 minetest.add_to_creative_inventory('node "default:ladder" 0')
1353 -- Some common functions
1356 default.falling_node_names = {}
1358 function nodeupdate_single(p)
1359 n = minetest.env:get_node(p)
1360 if default.falling_node_names[n.name] ~= nil then
1361 p_bottom = {x=p.x, y=p.y-1, z=p.z}
1362 n_bottom = minetest.env:get_node(p_bottom)
1363 if n_bottom.name == "air" then
1364 minetest.env:remove_node(p)
1365 minetest.env:add_entity(p, "default:falling_"..n.name)
1371 function nodeupdate(p)
1375 p2 = {x=p.x+x, y=p.y+y, z=p.z+z}
1376 nodeupdate_single(p2)
1386 function default.register_falling_node(nodename, texture)
1387 default.falling_node_names[nodename] = true
1388 -- Override naming conventions for stuff like :default:falling_default:sand
1389 minetest.register_entity(":default:falling_"..nodename, {
1390 -- Static definition
1392 collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
1394 textures = {texture,texture,texture,texture,texture,texture},
1397 on_step = function(self, dtime)
1399 self.object:setacceleration({x=0, y=-10, z=0})
1400 -- Turn to actual sand when collides to ground or just move
1401 local pos = self.object:getpos()
1402 local bcp = {x=pos.x, y=pos.y-0.7, z=pos.z} -- Position of bottom center point
1403 local bcn = minetest.env:get_node(bcp)
1404 if bcn.name ~= "air" then
1405 -- Turn to a sand node
1406 local np = {x=bcp.x, y=bcp.y+1, z=bcp.z}
1407 minetest.env:add_node(np, {name=nodename})
1408 self.object:remove()
1416 default.register_falling_node("default:sand", "default_sand.png")
1417 default.register_falling_node("default:gravel", "default_gravel.png")
1423 -- Global environment step function
1424 function on_step(dtime)
1427 minetest.register_globalstep(on_step)
1429 function on_placenode(p, node)
1430 --print("on_placenode")
1433 minetest.register_on_placenode(on_placenode)
1435 function on_dignode(p, node)
1436 --print("on_dignode")
1439 minetest.register_on_dignode(on_dignode)
1441 function on_punchnode(p, node)
1443 minetest.register_on_punchnode(on_punchnode)
1445 minetest.register_on_chat_message(function(name, message)
1446 --print("default on_chat_message: name="..dump(name).." message="..dump(message))
1447 local cmd = "/giveme"
1448 if message:sub(0, #cmd) == cmd then
1449 if not minetest.get_player_privs(name)["give"] then
1450 minetest.chat_send_player(name, "you don't have permission to give")
1451 return true -- Handled chat message
1453 local stackstring = string.match(message, cmd.." (.*)")
1454 if stackstring == nil then
1455 minetest.chat_send_player(name, 'usage: '..cmd..' stackstring')
1456 return true -- Handled chat message
1458 print(cmd..' invoked, stackstring="'..stackstring..'"')
1459 local player = minetest.env:get_player_by_name(name)
1460 if player == nil then
1461 minetest.chat_send_player(name, name2..' is not a known player')
1462 return true -- Handled chat message
1464 local added, error_msg = player:add_to_inventory(stackstring)
1466 minetest.chat_send_player(name, '"'..stackstring
1467 ..'" added to inventory.');
1469 minetest.chat_send_player(name, 'Could not give "'..stackstring
1470 ..'": '..error_msg);
1472 return true -- Handled chat message
1475 if message:sub(0, #cmd) == cmd then
1476 if not minetest.get_player_privs(name)["give"] then
1477 minetest.chat_send_player(name, "you don't have permission to give")
1478 return true -- Handled chat message
1480 local name2, stackstring = string.match(message, cmd.." ([%a%d_-]+) (.*)")
1481 if name == nil or stackstring == nil then
1482 minetest.chat_send_player(name, 'usage: '..cmd..' name stackstring')
1483 return true -- Handled chat message
1485 print(cmd..' invoked, name2="'..name2
1486 ..'" stackstring="'..stackstring..'"')
1487 local player = minetest.env:get_player_by_name(name2)
1488 if player == nil then
1489 minetest.chat_send_player(name, name2..' is not a known player')
1490 return true -- Handled chat message
1492 local added, error_msg = player:add_to_inventory(stackstring)
1494 minetest.chat_send_player(name, '"'..stackstring
1495 ..'" added to '..name2..'\'s inventory.');
1496 minetest.chat_send_player(name2, '"'..stackstring
1497 ..'" added to inventory.');
1499 minetest.chat_send_player(name, 'Could not give "'..stackstring
1500 ..'": '..error_msg);
1502 return true -- Handled chat message
1504 local cmd = "/spawnentity"
1505 if message:sub(0, #cmd) == cmd then
1506 if not minetest.get_player_privs(name)["give"] then
1507 minetest.chat_send_player(name, "you don't have permission to spawn (give)")
1508 return true -- Handled chat message
1510 local entityname = string.match(message, cmd.." (.*)")
1511 if entityname == nil then
1512 minetest.chat_send_player(name, 'usage: '..cmd..' entityname')
1513 return true -- Handled chat message
1515 print(cmd..' invoked, entityname="'..entityname..'"')
1516 local player = minetest.env:get_player_by_name(name)
1517 if player == nil then
1518 print("Unable to spawn entity, player is nil")
1519 return true -- Handled chat message
1521 local p = player:getpos()
1523 minetest.env:add_entity(p, entityname)
1524 minetest.chat_send_player(name, '"'..entityname
1526 return true -- Handled chat message
1531 -- Done, print some random stuff
1534 --print("minetest.registered_entities:")
1535 --dump2(minetest.registered_entities)