2 ["chest"] = "mcl_chests:chest",
3 ["chest_locked"] = "mcl_chests:chest",
4 ["blueberries"] = "mcl_farming:beetroot",
5 ["book"] = "mcl_books:book",
6 ["written_book"] = "mcl_books:book_written",
7 ["bronze_ingot"] = "mcl_core:iron_ingot",
8 ["clay_brick"] = "mcl_core:brick",
9 ["clay_lump"] = "mcl_core:clay_lump",
10 ["coal_lump"] = "mcl_core:coal_lump",
11 ["copper_ingot"] = "mcl_core:iron_ingot",
12 ["copper_lump"] = "mcl_core:stone_with_iron",
13 ["diamond"] = "mcl_core:diamond",
14 ["flint"] = "mcl_core:flint",
15 ["gold_ingot"] = "mcl_core:gold_ingot",
16 ["gold_lump"] = "mcl_core:stone_with_gold",
17 ["iron_lump"] = "mcl_core:stone_with_iron",
18 ["mese_crystal"] = "mcl_core:gold_ingot",
19 ["mese_crystal_fragment"] = "mcl_core:gold_nugget",
20 ["obsidian_shard"] = "mcl_core:obsidian",
21 ["paper"] = "mcl_core:paper",
22 ["steel_ingot"] = "mcl_core:iron_ingot",
23 ["stick"] = "mcl_core:stick",
24 ["tin_ingot"] = "mcl_core:iron_ingot",
25 ["tin_lump"] = "mcl_core:stone_with_iron",
26 ["stone"] = "mcl_core:stone",
27 ["cobble"] = "mcl_core:cobble",
28 ["stonebrick"] = "mcl_core:stonebrick",
29 ["stone_block"] = "mcl_core:stonebrick",
30 ["mossycobble"] = "mcl_core:mossycobble",
31 ["desert_stone"] = "mcl_core:redsandstone",
32 ["desert_cobble"] = "mcl_core:redsandstone",
33 ["desert_stonebrick"] = "mcl_core:redsandstonecarved",
34 ["desert_stone_block"] = "mcl_core:redsandstonecarved",
35 ["sandstone"] = "mcl_core:sandstone",
36 ["sandstonebrick"] = "mcl_core:sandstonecarved",
37 ["sandstone_block"] = "mcl_core:sandstonecarved",
38 ["desert_sandstone"] = "mcl_core:redsandstone",
39 ["desert_sandstone_brick"] = "mcl_core:redsandstonecarved",
40 ["desert_sandstone_block"] = "mcl_core:redsandstonecarved",
41 ["silver_sandstone"] = "mcl_core:sandstone",
42 ["silver_sandstonebrick"] = "mcl_core:sandstonecarved",
43 ["silver_sandstone_block"] = "mcl_core:sandstonecarved",
44 ["obsidian"] = "mcl_core:obsidian",
45 ["obsidianbrick"] = "mcl_core:obsidian",
46 ["obsidian_block"] = "mcl_core:obsidian",
47 ["dirt"] = "mcl_core:dirt",
48 ["dirt_with_grass"] = "mcl_core:dirt_with_grass",
49 ["dirt_with_grass_footsteps"] = "mcl_core:dirt_with_grass",
50 ["dirt_with_dry_grass"] = "mcl_core:dirt_with_grass",
51 ["dirt_with_snow"] = "mcl_core:dirt_with_grass_snow",
52 ["dirt_with_rainforest_litter"] = "mcl_core:dirt_with_grass",
53 ["dirt_with_coniferous_litter"] = "mcl_core:dirt_with_grass",
54 ["dry_dirt"] = "mcl_core:dirt",
55 ["dry_dirt_with_dry_grass"] = "mcl_core:dirt_with_grass",
56 ["permafrost"] = "mcl_core:stone",
57 ["permafrost_with_stones"] = "mcl_core:stone",
58 ["permafrost_with_moss"] = "mcl_core:stone",
59 ["sand"] = "mcl_core:sand",
60 ["desert_sand"] = "mcl_core:redsand",
61 ["silver_sand"] = "mcl_core:sand",
62 ["gravel"] = "mcl_core:gravel",
63 ["clay"] = "mcl_core:clay",
64 ["snow"] = "mcl_core:snow",
65 ["snowblock"] = "mcl_core:snowblock",
66 ["ice"] = "mcl_core:ice",
67 ["cave_ice"] = "mcl_core:packed_ice",
68 ["tree"] = "mcl_core:tree",
69 ["wood"] = "mcl_core:wood",
70 ["leaves"] = "mcl_core:leaves",
71 ["sapling"] = "mcl_core:sapling",
72 ["apple"] = "mcl_core:apple",
73 ["jungletree"] = "mcl_core:jungletree",
74 ["junglewood"] = "mcl_core:junglewood",
75 ["jungleleaves"] = "mcl_core:jungleleaves",
76 ["junglesapling"] = "mcl_core:junglesapling",
77 ["emergent_jungle_sapling"] = "mcl_core:junglesapling",
78 ["pine_tree"] = "mcl_core:sprucetree",
79 ["pine_wood"] = "mcl_core:sprucewood",
80 ["pine_needles"] = "mcl_core:spruceleaves",
81 ["pine_sapling"] = "mcl_core:sprucesapling",
82 ["acacia_tree"] = "mcl_core:acaciatree",
83 ["acacia_wood"] = "mcl_core:acaciawood",
84 ["acacia_leaves"] = "mcl_core:acacialeaves",
85 ["acacia_sapling"] = "mcl_core:acaciasapling",
86 ["aspen_tree"] = "mcl_core:birchtree",
87 ["aspen_wood"] = "mcl_core:birchwood",
88 ["aspen_leaves"] = "mcl_core:birchleaves",
89 ["aspen_sapling"] = "mcl_core:birchsapling",
90 ["stone_with_coal"] = "mcl_core:stone_with_coal",
91 ["coalblock"] = "mcl_core:coalblock",
92 ["stone_with_iron"] = "mcl_core:stone_with_iron",
93 ["steelblock"] = "mcl_core:ironblock",
94 ["stone_with_copper"] = "mcl_core:stone_with_iron",
95 ["copperblock"] = "mcl_core:ironblock",
96 ["stone_with_tin"] = "mcl_core:stone_with_iron",
97 ["tinblock"] = "mcl_core:ironblock",
98 ["bronzeblock"] = "mcl_core:ironblock",
99 ["stone_with_gold"] = "mcl_core:stone_with_gold",
100 ["goldblock"] = "mcl_core:goldblock",
101 ["stone_with_mese"] = "mcl_core:stone_with_gold",
102 ["mese"] = "mcl_core:goldblock",
103 ["stone_with_diamond"] = "mcl_core:stone_with_iron",
104 ["cactus"] = "mcl_core:cactus",
105 ["large_cactus_seedling"] = "mcl_core:cactus",
106 ["papyrus"] = "mcl_core:reeds",
107 ["dry_shrub"] = "mcl_core:deadbush",
108 ["junglegrass"] = "mcl_flowers:double_tallgrass",
109 ["grass_1"] = "mcl_flowers:tallgrass",
110 ["grass_2"] = "mcl_flowers:tallgrass",
111 ["grass_3"] = "mcl_flowers:tallgrass",
112 ["grass_4"] = "mcl_flowers:tallgrass",
113 ["grass_5"] = "mcl_flowers:tallgrass",
114 ["dry_grass_1"] = "mcl_flowers:tallgrass",
115 ["dry_grass_2"] = "mcl_flowers:tallgrass",
116 ["dry_grass_3"] = "mcl_flowers:tallgrass",
117 ["dry_grass_4"] = "mcl_flowers:tallgrass",
118 ["dry_grass_5"] = "mcl_flowers:tallgrass",
119 ["fern_1"] = "mcl_flowers:fern",
120 ["fern_2"] = "mcl_flowers:fern",
121 ["fern_3"] = "mcl_flowers:fern",
122 ["marram_grass_1"] = "mcl_flowers:tallgrass",
123 ["marram_grass_2"] = "mcl_flowers:tallgrass",
124 ["marram_grass_3"] = "mcl_flowers:tallgrass",
125 ["bush_stem"] = "mcl_core:tree",
126 ["bush_leaves"] = "mcl_core:leaves",
127 ["bush_sapling"] = "mcl_core:sapling",
128 ["acacia_bush_stem"] = "mcl_core:acaciatree",
129 ["acacia_bush_leaves"] = "mcl_core:acacialeaves",
130 ["acacia_bush_sapling"] = "mcl_core:acaciasapling",
131 ["pine_bush_stem"] = "mcl_core:sprucetree",
132 ["pine_bush_leaves"] = "mcl_core:spruceleaves",
133 ["pine_bush_sapling"] = "mcl_core:sprucesapling",
134 ["blueberry_bush_leaves_with_berries"] = "mcl_core:leaves",
135 ["blueberry_bush_leaves"] = "mcl_core:leaves",
136 ["blueberry_bush_sapling"] = "mcl_core:sapling",
137 ["sand_with_kelp"] = "mcl_ocean:kelp_sand",
138 ["coral_brown"] = "mcl_wool:brown",
139 ["coral_orange"] = "mcl_wool:orange",
140 ["coral_skeleton"] = "mcl_wool:white",
141 ["water_source"] = "mcl_core:water_source",
142 ["water_flowing"] = "mcl_core:water_flowing",
143 ["river_water_source"] = "mclx_core:river_water_source",
144 ["river_water_flowing"] = "mclx_core:river_water_flowing",
145 ["lava_source"] = "mcl_core:lava_source",
146 ["lava_flowing"] = "mcl_core:lava_flowing",
147 ["bookshelf"] = "mcl_books:bookshelf",
148 ["sign_wall_wood"] = "mcl_signs:sign_wall",
149 ["sign_wall_steel"] = "mcl_signs:sign_wall",
150 ["ladder_wood"] = "mcl_signs:ladder",
151 ["ladder_steel"] = "mcl_signs:ladder",
152 ["fence_wood"] = "mcl_fences:fence",
153 ["fence_acacia_wood"] = "mcl_fences:fence_acacia",
154 ["fence_junglewood"] = "mcl_fences:fence_jungle",
155 ["fence_pine_wood"] = "mcl_fences:fence_spruce",
156 ["fence_aspen_wood"] = "mcl_fences:fence_birch",
157 ["fence_rail_wood"] = "mcl_fences:fence",
158 ["fence_rail_acacia_wood"] = "mcl_fences:fence_acacia",
159 ["fence_rail_junglewood"] = "mcl_fences:fence_jungle",
160 ["fence_rail_pine_wood"] = "mcl_fences:fence_spruce",
161 ["fence_rail_aspen_wood"] = "mcl_fences:fence_birch",
162 ["glass"] = "mcl_core:glass",
163 ["obsidian_glass"] = "mcl_core:glass",
164 ["brick"] = "mcl_core:brick",
165 ["meselamp"] = "mcl_nether:glowstone",
166 ["mese_post_light"] = "mcl_nether:glowstone",
167 ["cloud"] = "mcl_core:bedrock",
168 ["pick_wood"] = "mcl_tools:pick_wood",
169 ["pick_stone"] = "mcl_tools:pick_stone",
170 ["pick_steel"] = "mcl_tools:pick_iron",
171 ["pick_bronze"] = "mcl_tools:pick_iron",
172 ["pick_mese"] = "mcl_tools:pick_gold",
173 ["pick_diamond"] = "mcl_tools:pick_diamond",
174 ["shovel_wood"] = "mcl_tools:shovel_wood",
175 ["shovel_stone"] = "mcl_tools:shovel_stone",
176 ["shovel_steel"] = "mcl_tools:shovel_iron",
177 ["shovel_bronze"] = "mcl_tools:shovel_iron",
178 ["shovel_mese"] = "mcl_tools:shovel_gold",
179 ["shovel_diamond"] = "mcl_tools:shovel_diamond",
180 ["axe_wood"] = "mcl_tools:axe_wood",
181 ["axe_stone"] = "mcl_tools:axe_stone",
182 ["axe_steel"] = "mcl_tools:axe_iron",
183 ["axe_bronze"] = "mcl_tools:axe_iron",
184 ["axe_mese"] = "mcl_tools:axe_gold",
185 ["axe_diamond"] = "mcl_tools:axe_diamond",
186 ["sword_wood"] = "mcl_tools:sword_wood",
187 ["sword_stone"] = "mcl_tools:sword_stone",
188 ["sword_steel"] = "mcl_tools:sword_iron",
189 ["sword_bronze"] = "mcl_tools:sword_iron",
190 ["sword_mese"] = "mcl_tools:sword_gold",
191 ["sword_diamond"] = "mcl_tools:sword_diamond",
192 ["key"] = "mcl_clock:clock",
193 ["torch"] = "mcl_torches:torch",
194 ["torch_wall"] = "mcl_torches:torch_wall",
195 ["torch_ceiling"] = "mcl_torches:torch",
197 for k, v in pairs(aliases) do
198 minetest.register_alias("default:" .. k, v)
212 function default.node_sound_defaults(table)
214 table.footstep = table.footstep or
215 {name = "", gain = 1.0}
216 table.dug = table.dug or
217 {name = "default_dug_node", gain = 0.25}
218 table.place = table.place or
219 {name = "default_place_node_hard", gain = 1.0}
223 function default.node_sound_stone_defaults(table)
225 table.footstep = table.footstep or
226 {name = "default_hard_footstep", gain = 0.3}
227 table.dug = table.dug or
228 {name = "default_hard_footstep", gain = 1.0}
229 default.node_sound_defaults(table)
233 function default.node_sound_dirt_defaults(table)
235 table.footstep = table.footstep or
236 {name = "default_dirt_footstep", gain = 0.4}
237 table.dug = table.dug or
238 {name = "default_dirt_footstep", gain = 1.0}
239 table.place = table.place or
240 {name = "default_place_node", gain = 1.0}
241 default.node_sound_defaults(table)
245 function default.node_sound_sand_defaults(table)
247 table.footstep = table.footstep or
248 {name = "default_sand_footstep", gain = 0.12}
249 table.dug = table.dug or
250 {name = "default_sand_footstep", gain = 0.24}
251 table.place = table.place or
252 {name = "default_place_node", gain = 1.0}
253 default.node_sound_defaults(table)
257 function default.node_sound_gravel_defaults(table)
259 table.footstep = table.footstep or
260 {name = "default_gravel_footstep", gain = 0.4}
261 table.dug = table.dug or
262 {name = "default_gravel_footstep", gain = 1.0}
263 table.place = table.place or
264 {name = "default_place_node", gain = 1.0}
265 default.node_sound_defaults(table)
269 function default.node_sound_wood_defaults(table)
271 table.footstep = table.footstep or
272 {name = "default_wood_footstep", gain = 0.3}
273 table.dug = table.dug or
274 {name = "default_wood_footstep", gain = 1.0}
275 default.node_sound_defaults(table)
279 function default.node_sound_leaves_defaults(table)
281 table.footstep = table.footstep or
282 {name = "default_grass_footstep", gain = 0.45}
283 table.dug = table.dug or
284 {name = "default_grass_footstep", gain = 0.7}
285 table.place = table.place or
286 {name = "default_place_node", gain = 1.0}
287 default.node_sound_defaults(table)
291 function default.node_sound_glass_defaults(table)
293 table.footstep = table.footstep or
294 {name = "default_glass_footstep", gain = 0.3}
295 table.dig = table.dig or
296 {name = "default_glass_footstep", gain = 0.5}
297 table.dug = table.dug or
298 {name = "default_break_glass", gain = 1.0}
299 default.node_sound_defaults(table)
303 function default.node_sound_metal_defaults(table)
305 table.footstep = table.footstep or
306 {name = "default_metal_footstep", gain = 0.4}
307 table.dig = table.dig or
308 {name = "default_dig_metal", gain = 0.5}
309 table.dug = table.dug or
310 {name = "default_dug_metal", gain = 0.5}
311 table.place = table.place or
312 {name = "default_place_node_metal", gain = 0.5}
313 default.node_sound_defaults(table)
317 function default.node_sound_water_defaults(table)
319 table.footstep = table.footstep or
320 {name = "default_water_footstep", gain = 0.2}
321 default.node_sound_defaults(table)
325 function default.node_sound_snow_defaults(table)
327 table.footstep = table.footstep or
328 {name = "default_snow_footstep", gain = 0.2}
329 table.dig = table.dig or
330 {name = "default_snow_footstep", gain = 0.3}
331 table.dug = table.dug or
332 {name = "default_snow_footstep", gain = 0.3}
333 table.place = table.place or
334 {name = "default_place_node", gain = 1.0}
335 default.node_sound_defaults(table)
340 -- Optimized helper to put all items in an inventory into a drops list
343 function default.get_inventory_drops(pos, inventory, drops)
344 local inv = minetest.get_meta(pos):get_inventory()
346 for i = 1, inv:get_size(inventory) do
347 local stack = inv:get_stack(inventory, i)
348 if stack:get_count() > 0 then
349 drops[n+1] = stack:to_table()
357 -- Papyrus and cactus growing
360 -- Wrapping the functions in ABM action is necessary to make overriding them possible
362 function default.grow_cactus(pos, node)
363 if node.param2 >= 4 then
367 if minetest.get_item_group(minetest.get_node(pos).name, "sand") == 0 then
372 while node.name == "default:cactus" and height < 4 do
375 node = minetest.get_node(pos)
377 if height == 4 or node.name ~= "air" then
380 if minetest.get_node_light(pos) < 13 then
383 minetest.set_node(pos, {name = "default:cactus"})
387 function default.grow_papyrus(pos, node)
389 local name = minetest.get_node(pos).name
390 if name ~= "default:dirt_with_grass" and name ~= "default:dirt" then
393 if not minetest.find_node_near(pos, 3, {"group:water"}) then
398 while node.name == "default:papyrus" and height < 4 do
401 node = minetest.get_node(pos)
403 if height == 4 or node.name ~= "air" then
406 if minetest.get_node_light(pos) < 13 then
409 minetest.set_node(pos, {name = "default:papyrus"})
417 function default.dig_up(pos, node, digger)
418 if digger == nil then return end
419 local np = {x = pos.x, y = pos.y + 1, z = pos.z}
420 local nn = minetest.get_node(np)
421 if nn.name == node.name then
422 minetest.node_dig(np, nn, digger)
430 -- Prevent decay of placed leaves
432 default.after_place_leaves = function(pos, placer, itemstack, pointed_thing)
433 if placer and placer:is_player() then
434 local node = minetest.get_node(pos)
436 minetest.set_node(pos, node)
441 local function leafdecay_after_destruct(pos, oldnode, def)
442 for _, v in pairs(minetest.find_nodes_in_area(vector.subtract(pos, def.radius),
443 vector.add(pos, def.radius), def.leaves)) do
444 local node = minetest.get_node(v)
445 local timer = minetest.get_node_timer(v)
446 if node.param2 ~= 1 and not timer:is_started() then
447 timer:start(math.random(20, 120) / 10)
452 local function leafdecay_on_timer(pos, def)
453 if minetest.find_node_near(pos, def.radius, def.trunks) then
457 local node = minetest.get_node(pos)
458 local drops = minetest.get_node_drops(node.name)
459 for _, item in ipairs(drops) do
461 for _, v in pairs(def.leaves) do
466 if minetest.get_item_group(item, "leafdecay_drop") ~= 0 or
469 x = pos.x - 0.5 + math.random(),
470 y = pos.y - 0.5 + math.random(),
471 z = pos.z - 0.5 + math.random(),
476 minetest.remove_node(pos)
477 minetest.check_for_falling(pos)
480 function default.register_leafdecay(def)
484 for _, v in pairs(def.trunks) do
485 minetest.override_item(v, {
486 after_destruct = function(pos, oldnode)
487 leafdecay_after_destruct(pos, oldnode, def)
491 for _, v in pairs(def.leaves) do
492 minetest.override_item(v, {
493 on_timer = function(pos)
494 leafdecay_on_timer(pos, def)
502 -- Register a craft to copy the metadata of items
505 function default.register_craft_metadata_copy(ingredient, result)
506 minetest.register_craft({
509 recipe = {ingredient, result}
512 minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv)
513 if itemstack:get_name() ~= result then
519 for i = 1, #old_craft_grid do
520 if old_craft_grid[i]:get_name() == result then
521 original = old_craft_grid[i]
528 local copymeta = original:get_meta():to_table()
529 itemstack:get_meta():from_table(copymeta)
530 -- put the book with metadata back in the craft grid
531 craft_inv:set_stack("craft", index, original)
537 function default.can_interact_with_node(player, pos)
538 if player and player:is_player() then
539 if minetest.check_player_privs(player, "protection_bypass") then
546 local meta = minetest.get_meta(pos)
547 local owner = meta:get_string("owner")
549 if not owner or owner == "" or owner == player:get_player_name() then