1 -- mods/default/nodes.lua
4 --[[ Node name convention:
6 Although many node names are in combined-word form, the required form for new
7 node names is words separated by underscores. If both forms are used in written
8 language (for example pinewood and pine wood) the underscore form should be used.
17 (1. Material 2. Cobble variant 3. Brick variant [4. Modified forms])
26 default:desert_stonebrick
29 default:sandstonebrick
36 (1. Material [2. Modified forms])
39 default:dirt_with_grass
40 default:dirt_with_grass_footsteps
41 default:dirt_with_dry_grass
42 default:dirt_with_snow
58 (1. Trunk 2. Fabricated trunk 3. Leaves 4. Sapling [5. Fruits])
79 default:acacia_sapling
83 (1. In stone 2. Block)
85 default:stone_with_coal
88 default:stone_with_iron
91 default:stone_with_copper
95 default:stone_with_gold
98 default:stone_with_mese
101 default:stone_with_diamond
104 Plantlife (non-cubic)
105 ---------------------
125 (1. Source 2. Flowing)
128 default:water_flowing
130 default:river_water_source
131 default:river_water_flowing
136 Tools / "Advanced" crafting / Non-"natural"
137 -------------------------------------------
150 default:obsidian_glass
162 default:nyancat_rainbow
170 minetest.register_node("default:stone", {
171 description = "Stone",
172 tiles = {"default_stone.png"},
173 groups = {cracky=3, stone=1},
174 drop = 'default:cobble',
175 legacy_mineral = true,
176 sounds = default.node_sound_stone_defaults(),
179 minetest.register_node("default:cobble", {
180 description = "Cobblestone",
181 tiles = {"default_cobble.png"},
182 is_ground_content = false,
183 groups = {cracky=3, stone=2},
184 sounds = default.node_sound_stone_defaults(),
187 minetest.register_node("default:stonebrick", {
188 description = "Stone Brick",
189 tiles = {"default_stone_brick.png"},
190 is_ground_content = false,
191 groups = {cracky=2, stone=1},
192 sounds = default.node_sound_stone_defaults(),
195 minetest.register_node("default:mossycobble", {
196 description = "Mossy Cobblestone",
197 tiles = {"default_mossycobble.png"},
198 is_ground_content = false,
199 groups = {cracky=3, stone=1},
200 sounds = default.node_sound_stone_defaults(),
205 minetest.register_node("default:desert_stone", {
206 description = "Desert Stone",
207 tiles = {"default_desert_stone.png"},
208 groups = {cracky=3, stone=1},
209 drop = 'default:desert_cobble',
210 legacy_mineral = true,
211 sounds = default.node_sound_stone_defaults(),
214 minetest.register_node("default:desert_cobble", {
215 description = "Desert Cobblestone",
216 tiles = {"default_desert_cobble.png"},
217 is_ground_content = false,
218 groups = {cracky=3, stone=2},
219 sounds = default.node_sound_stone_defaults(),
222 minetest.register_node("default:desert_stonebrick", {
223 description = "Desert Stone Brick",
224 tiles = {"default_desert_stone_brick.png"},
225 is_ground_content = false,
226 groups = {cracky=2, stone=1},
227 sounds = default.node_sound_stone_defaults(),
232 minetest.register_node("default:sandstone", {
233 description = "Sandstone",
234 tiles = {"default_sandstone.png"},
235 groups = {crumbly=2,cracky=3},
236 sounds = default.node_sound_stone_defaults(),
239 minetest.register_node("default:sandstonebrick", {
240 description = "Sandstone Brick",
241 tiles = {"default_sandstone_brick.png"},
242 is_ground_content = false,
244 sounds = default.node_sound_stone_defaults(),
249 minetest.register_node("default:obsidian", {
250 description = "Obsidian",
251 tiles = {"default_obsidian.png"},
252 sounds = default.node_sound_stone_defaults(),
253 groups = {cracky=1,level=2},
256 minetest.register_node("default:obsidianbrick", {
257 description = "Obsidian Brick",
258 tiles = {"default_obsidian_brick.png"},
259 is_ground_content = false,
260 sounds = default.node_sound_stone_defaults(),
261 groups = {cracky=1,level=2},
268 minetest.register_node("default:dirt", {
269 description = "Dirt",
270 tiles = {"default_dirt.png"},
271 groups = {crumbly=3,soil=1},
272 sounds = default.node_sound_dirt_defaults(),
275 minetest.register_node("default:dirt_with_grass", {
276 description = "Dirt with Grass",
277 tiles = {"default_grass.png", "default_dirt.png",
278 {name = "default_dirt.png^default_grass_side.png",
279 tileable_vertical = false}},
280 groups = {crumbly=3,soil=1},
281 drop = 'default:dirt',
282 sounds = default.node_sound_dirt_defaults({
283 footstep = {name="default_grass_footstep", gain=0.25},
287 minetest.register_node("default:dirt_with_grass_footsteps", {
288 description = "Dirt with Grass and Footsteps",
289 tiles = {"default_grass.png^default_footprint.png", "default_dirt.png",
290 {name = "default_dirt.png^default_grass_side.png",
291 tileable_vertical = false}},
292 groups = {crumbly=3,soil=1,not_in_creative_inventory=1},
293 drop = 'default:dirt',
294 sounds = default.node_sound_dirt_defaults({
295 footstep = {name="default_grass_footstep", gain=0.25},
299 minetest.register_node("default:dirt_with_dry_grass", {
300 description = "Dirt with Dry Grass",
301 tiles = {"default_dry_grass.png",
303 {name = "default_dirt.png^default_dry_grass_side.png",
304 tileable_vertical = false}},
305 groups = {crumbly = 3, soil = 1},
306 drop = 'default:dirt',
307 sounds = default.node_sound_dirt_defaults({
308 footstep = {name = "default_grass_footstep", gain = 0.4},
312 minetest.register_node("default:dirt_with_snow", {
313 description = "Dirt with Snow",
314 tiles = {"default_snow.png", "default_dirt.png",
315 {name = "default_dirt.png^default_snow_side.png",
316 tileable_vertical = false}},
317 groups = {crumbly=3,soil=1},
318 drop = 'default:dirt',
319 sounds = default.node_sound_dirt_defaults({
320 footstep = {name="default_snow_footstep", gain=0.25},
325 minetest.register_node("default:sand", {
326 description = "Sand",
327 tiles = {"default_sand.png"},
328 groups = {crumbly=3, falling_node=1, sand=1},
329 sounds = default.node_sound_sand_defaults(),
332 minetest.register_node("default:desert_sand", {
333 description = "Desert Sand",
334 tiles = {"default_desert_sand.png"},
335 groups = {crumbly=3, falling_node=1, sand=1},
336 sounds = default.node_sound_sand_defaults(),
341 minetest.register_node("default:gravel", {
342 description = "Gravel",
343 tiles = {"default_gravel.png"},
344 groups = {crumbly=2, falling_node=1},
345 sounds = default.node_sound_dirt_defaults({
346 footstep = {name="default_gravel_footstep", gain=0.5},
347 dug = {name="default_gravel_footstep", gain=1.0},
353 minetest.register_node("default:clay", {
354 description = "Clay",
355 tiles = {"default_clay.png"},
356 groups = {crumbly=3},
357 drop = 'default:clay_lump 4',
358 sounds = default.node_sound_dirt_defaults(),
363 minetest.register_node("default:snow", {
364 description = "Snow",
365 tiles = {"default_snow.png"},
366 inventory_image = "default_snowball.png",
367 wield_image = "default_snowball.png",
370 drawtype = "nodebox",
374 {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5},
377 groups = {crumbly = 3, falling_node = 1, puts_out_fire = 1},
378 sounds = default.node_sound_dirt_defaults({
379 footstep = {name = "default_snow_footstep", gain = 0.25},
380 dug = {name = "default_snow_footstep", gain = 0.75},
383 on_construct = function(pos)
385 if minetest.get_node(pos).name == "default:dirt_with_grass" then
386 minetest.set_node(pos, {name = "default:dirt_with_snow"})
392 minetest.register_node("default:snowblock", {
393 description = "Snow Block",
394 tiles = {"default_snow.png"},
395 groups = {crumbly = 3, puts_out_fire = 1},
396 sounds = default.node_sound_dirt_defaults({
397 footstep = {name = "default_snow_footstep", gain = 0.25},
398 dug = {name = "default_snow_footstep", gain = 0.75},
404 minetest.register_node("default:ice", {
406 tiles = {"default_ice.png"},
407 is_ground_content = false,
409 groups = {cracky = 3, puts_out_fire = 1},
410 sounds = default.node_sound_glass_defaults(),
417 minetest.register_node("default:tree", {
418 description = "Tree",
419 tiles = {"default_tree_top.png", "default_tree_top.png", "default_tree.png"},
420 paramtype2 = "facedir",
421 is_ground_content = false,
422 groups = {tree=1,choppy=2,oddly_breakable_by_hand=1,flammable=2},
423 sounds = default.node_sound_wood_defaults(),
425 on_place = minetest.rotate_node
428 minetest.register_node("default:wood", {
429 description = "Wooden Planks",
430 tiles = {"default_wood.png"},
431 is_ground_content = false,
432 groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1},
433 sounds = default.node_sound_wood_defaults(),
436 minetest.register_node("default:sapling", {
437 description = "Sapling",
438 drawtype = "plantlike",
440 tiles = {"default_sapling.png"},
441 inventory_image = "default_sapling.png",
442 wield_image = "default_sapling.png",
444 sunlight_propagates = true,
448 fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
450 groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1},
451 sounds = default.node_sound_leaves_defaults(),
454 minetest.register_node("default:leaves", {
455 description = "Leaves",
456 drawtype = "allfaces_optional",
459 tiles = {"default_leaves.png"},
460 special_tiles = {"default_leaves_simple.png"},
462 is_ground_content = false,
463 groups = {snappy=3, leafdecay=3, flammable=2, leaves=1},
468 -- player will get sapling with 1/20 chance
469 items = {'default:sapling'},
473 -- player will get leaves only if he get no saplings,
474 -- this is because max_items is 1
475 items = {'default:leaves'},
479 sounds = default.node_sound_leaves_defaults(),
481 after_place_node = default.after_place_leaves,
484 minetest.register_node("default:apple", {
485 description = "Apple",
486 drawtype = "plantlike",
488 tiles = {"default_apple.png"},
489 inventory_image = "default_apple.png",
491 sunlight_propagates = true,
493 is_ground_content = false,
496 fixed = {-0.2, -0.5, -0.2, 0.2, 0, 0.2}
498 groups = {fleshy=3,dig_immediate=3,flammable=2,leafdecay=3,leafdecay_drop=1},
499 on_use = minetest.item_eat(2),
500 sounds = default.node_sound_leaves_defaults(),
502 after_place_node = function(pos, placer, itemstack)
503 if placer:is_player() then
504 minetest.set_node(pos, {name="default:apple", param2=1})
511 minetest.register_node("default:jungletree", {
512 description = "Jungle Tree",
513 tiles = {"default_jungletree_top.png", "default_jungletree_top.png", "default_jungletree.png"},
514 paramtype2 = "facedir",
515 is_ground_content = false,
516 groups = {tree=1,choppy=2,oddly_breakable_by_hand=1,flammable=2},
517 sounds = default.node_sound_wood_defaults(),
519 on_place = minetest.rotate_node
522 minetest.register_node("default:junglewood", {
523 description = "Junglewood Planks",
524 tiles = {"default_junglewood.png"},
525 is_ground_content = false,
526 groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1},
527 sounds = default.node_sound_wood_defaults(),
530 minetest.register_node("default:jungleleaves", {
531 description = "Jungle Leaves",
532 drawtype = "allfaces_optional",
535 tiles = {"default_jungleleaves.png"},
536 special_tiles = {"default_jungleleaves_simple.png"},
538 is_ground_content = false,
539 groups = {snappy=3, leafdecay=3, flammable=2, leaves=1},
544 -- player will get sapling with 1/20 chance
545 items = {'default:junglesapling'},
549 -- player will get leaves only if he get no saplings,
550 -- this is because max_items is 1
551 items = {'default:jungleleaves'},
555 sounds = default.node_sound_leaves_defaults(),
557 after_place_node = default.after_place_leaves,
560 minetest.register_node("default:junglesapling", {
561 description = "Jungle Sapling",
562 drawtype = "plantlike",
564 tiles = {"default_junglesapling.png"},
565 inventory_image = "default_junglesapling.png",
566 wield_image = "default_junglesapling.png",
568 sunlight_propagates = true,
572 fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
574 groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1},
575 sounds = default.node_sound_leaves_defaults(),
580 minetest.register_node("default:pine_tree", {
581 description = "Pine Tree",
582 tiles = {"default_pine_tree_top.png", "default_pine_tree_top.png",
583 "default_pine_tree.png"},
584 paramtype2 = "facedir",
585 is_ground_content = false,
586 groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
587 sounds = default.node_sound_wood_defaults(),
589 on_place = minetest.rotate_node
592 minetest.register_node("default:pine_wood", {
593 description = "Pine Wood Planks",
594 tiles = {"default_pine_wood.png"},
595 is_ground_content = false,
596 groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, wood = 1},
597 sounds = default.node_sound_wood_defaults(),
600 minetest.register_node("default:pine_needles",{
601 description = "Pine Needles",
602 drawtype = "allfaces_optional",
604 tiles = {"default_pine_needles.png"},
607 is_ground_content = false,
608 groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1},
612 {items = {"default:pine_sapling"}, rarity = 20},
613 {items = {"default:pine_needles"}}
616 sounds = default.node_sound_leaves_defaults(),
618 after_place_node = default.after_place_leaves,
621 minetest.register_node("default:pine_sapling", {
622 description = "Pine Sapling",
623 drawtype = "plantlike",
625 tiles = {"default_pine_sapling.png"},
626 inventory_image = "default_pine_sapling.png",
627 wield_image = "default_pine_sapling.png",
629 sunlight_propagates = true,
633 fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
635 groups = {snappy = 2, dig_immediate = 3, flammable = 2,
636 attached_node = 1, sapling = 1},
637 sounds = default.node_sound_leaves_defaults(),
640 minetest.register_node("default:acacia_tree", {
641 description = "Acacia Tree",
642 tiles = {"default_acacia_tree_top.png", "default_acacia_tree_top.png",
643 "default_acacia_tree.png"},
644 paramtype2 = "facedir",
645 is_ground_content = false,
646 groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
647 sounds = default.node_sound_wood_defaults(),
649 on_place = minetest.rotate_node
652 minetest.register_node("default:acacia_wood", {
653 description = "Acacia Wood Planks",
654 tiles = {"default_acacia_wood.png"},
655 is_ground_content = false,
656 groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, wood = 1},
657 sounds = default.node_sound_wood_defaults(),
660 minetest.register_node("default:acacia_leaves", {
661 description = "Acacia Leaves",
662 drawtype = "allfaces_optional",
664 tiles = {"default_acacia_leaves.png"},
666 is_ground_content = false,
667 groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1},
671 {items = {"default:acacia_sapling"}, rarity = 20},
672 {items = {"default:acacia_leaves"}}
675 sounds = default.node_sound_leaves_defaults(),
677 after_place_node = default.after_place_leaves,
680 minetest.register_node("default:acacia_sapling", {
681 description = "Acacia Tree Sapling",
682 drawtype = "plantlike",
684 tiles = {"default_acacia_sapling.png"},
685 inventory_image = "default_acacia_sapling.png",
686 wield_image = "default_acacia_sapling.png",
688 sunlight_propagates = true,
692 fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
694 groups = {snappy = 2, dig_immediate = 3, flammable = 2,
695 attached_node = 1, sapling = 1},
696 sounds = default.node_sound_leaves_defaults(),
703 minetest.register_node("default:stone_with_coal", {
704 description = "Coal Ore",
705 tiles = {"default_stone.png^default_mineral_coal.png"},
707 drop = 'default:coal_lump',
708 sounds = default.node_sound_stone_defaults(),
711 minetest.register_node("default:coalblock", {
712 description = "Coal Block",
713 tiles = {"default_coal_block.png"},
714 is_ground_content = false,
716 sounds = default.node_sound_stone_defaults(),
721 minetest.register_node("default:stone_with_iron", {
722 description = "Iron Ore",
723 tiles = {"default_stone.png^default_mineral_iron.png"},
725 drop = 'default:iron_lump',
726 sounds = default.node_sound_stone_defaults(),
729 minetest.register_node("default:steelblock", {
730 description = "Steel Block",
731 tiles = {"default_steel_block.png"},
732 is_ground_content = false,
733 groups = {cracky=1,level=2},
734 sounds = default.node_sound_stone_defaults(),
739 minetest.register_node("default:stone_with_copper", {
740 description = "Copper Ore",
741 tiles = {"default_stone.png^default_mineral_copper.png"},
743 drop = 'default:copper_lump',
744 sounds = default.node_sound_stone_defaults(),
747 minetest.register_node("default:copperblock", {
748 description = "Copper Block",
749 tiles = {"default_copper_block.png"},
750 is_ground_content = false,
751 groups = {cracky=1,level=2},
752 sounds = default.node_sound_stone_defaults(),
755 minetest.register_node("default:bronzeblock", {
756 description = "Bronze Block",
757 tiles = {"default_bronze_block.png"},
758 is_ground_content = false,
759 groups = {cracky=1,level=2},
760 sounds = default.node_sound_stone_defaults(),
765 minetest.register_node("default:stone_with_mese", {
766 description = "Mese Ore",
767 tiles = {"default_stone.png^default_mineral_mese.png"},
769 groups = {cracky = 1},
770 drop = "default:mese_crystal",
771 sounds = default.node_sound_stone_defaults(),
775 minetest.register_node("default:mese", {
776 description = "Mese Block",
777 tiles = {"default_mese_block.png"},
779 groups = {cracky = 1, level = 2},
780 sounds = default.node_sound_stone_defaults(),
787 minetest.register_node("default:stone_with_gold", {
788 description = "Gold Ore",
789 tiles = {"default_stone.png^default_mineral_gold.png"},
791 drop = "default:gold_lump",
792 sounds = default.node_sound_stone_defaults(),
795 minetest.register_node("default:goldblock", {
796 description = "Gold Block",
797 tiles = {"default_gold_block.png"},
798 is_ground_content = false,
800 sounds = default.node_sound_stone_defaults(),
805 minetest.register_node("default:stone_with_diamond", {
806 description = "Diamond Ore",
807 tiles = {"default_stone.png^default_mineral_diamond.png"},
809 drop = "default:diamond",
810 sounds = default.node_sound_stone_defaults(),
813 minetest.register_node("default:diamondblock", {
814 description = "Diamond Block",
815 tiles = {"default_diamond_block.png"},
816 is_ground_content = false,
817 groups = {cracky=1,level=3},
818 sounds = default.node_sound_stone_defaults(),
822 -- Plantlife (non-cubic)
825 minetest.register_node("default:cactus", {
826 description = "Cactus",
827 tiles = {"default_cactus_top.png", "default_cactus_top.png", "default_cactus_side.png"},
828 paramtype2 = "facedir",
829 groups = {snappy=1,choppy=3,flammable=2},
830 sounds = default.node_sound_wood_defaults(),
831 on_place = minetest.rotate_node,
833 after_dig_node = function(pos, node, metadata, digger)
834 default.dig_up(pos, node, digger)
838 minetest.register_node("default:papyrus", {
839 description = "Papyrus",
840 drawtype = "plantlike",
841 tiles = {"default_papyrus.png"},
842 inventory_image = "default_papyrus.png",
843 wield_image = "default_papyrus.png",
845 sunlight_propagates = true,
849 fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3}
851 groups = {snappy=3,flammable=2},
852 sounds = default.node_sound_leaves_defaults(),
854 after_dig_node = function(pos, node, metadata, digger)
855 default.dig_up(pos, node, digger)
859 minetest.register_node("default:dry_shrub", {
860 description = "Dry Shrub",
861 drawtype = "plantlike",
864 tiles = {"default_dry_shrub.png"},
865 inventory_image = "default_dry_shrub.png",
866 wield_image = "default_dry_shrub.png",
868 sunlight_propagates = true,
871 groups = {snappy=3,flammable=3,attached_node=1},
872 sounds = default.node_sound_leaves_defaults(),
875 fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
879 minetest.register_node("default:junglegrass", {
880 description = "Jungle Grass",
881 drawtype = "plantlike",
884 tiles = {"default_junglegrass.png"},
885 inventory_image = "default_junglegrass.png",
886 wield_image = "default_junglegrass.png",
888 sunlight_propagates = true,
891 groups = {snappy=3,flammable=2,flora=1,attached_node=1},
892 sounds = default.node_sound_leaves_defaults(),
895 fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
899 minetest.register_node("default:grass_1", {
900 description = "Grass",
901 drawtype = "plantlike",
903 tiles = {"default_grass_1.png"},
904 -- Use texture of a taller grass stage in inventory
905 inventory_image = "default_grass_3.png",
906 wield_image = "default_grass_3.png",
908 sunlight_propagates = true,
911 groups = {snappy=3,flammable=3,flora=1,attached_node=1},
912 sounds = default.node_sound_leaves_defaults(),
915 fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
918 on_place = function(itemstack, placer, pointed_thing)
919 -- place a random grass node
920 local stack = ItemStack("default:grass_"..math.random(1,5))
921 local ret = minetest.item_place(stack, placer, pointed_thing)
922 return ItemStack("default:grass_1 "..itemstack:get_count()-(1-ret:get_count()))
927 minetest.register_node("default:grass_"..i, {
928 description = "Grass",
929 drawtype = "plantlike",
931 tiles = {"default_grass_"..i..".png"},
932 inventory_image = "default_grass_"..i..".png",
933 wield_image = "default_grass_"..i..".png",
935 sunlight_propagates = true,
938 drop = "default:grass_1",
939 groups = {snappy=3,flammable=3,flora=1,attached_node=1,not_in_creative_inventory=1},
940 sounds = default.node_sound_leaves_defaults(),
943 fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
948 minetest.register_node("default:dry_grass_1", {
949 description = "Dry Grass",
950 drawtype = "plantlike",
952 tiles = {"default_dry_grass_1.png"},
953 inventory_image = "default_dry_grass_3.png",
954 wield_image = "default_dry_grass_3.png",
956 sunlight_propagates = true,
959 groups = {snappy=3,flammable=3,flora=1,attached_node=1},
960 sounds = default.node_sound_leaves_defaults(),
963 fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
966 on_place = function(itemstack, placer, pointed_thing)
967 -- place a random dry grass node
968 local stack = ItemStack("default:dry_grass_"..math.random(1,5))
969 local ret = minetest.item_place(stack, placer, pointed_thing)
970 return ItemStack("default:dry_grass_1 "..itemstack:get_count()-(1-ret:get_count()))
975 minetest.register_node("default:dry_grass_"..i, {
976 description = "Dry Grass",
977 drawtype = "plantlike",
979 tiles = {"default_dry_grass_"..i..".png"},
980 inventory_image = "default_dry_grass_"..i..".png",
981 wield_image = "default_dry_grass_"..i..".png",
983 sunlight_propagates = true,
986 groups = {snappy=3,flammable=3,flora=1,attached_node=1,not_in_creative_inventory=1},
987 drop = "default:dry_grass_1",
988 sounds = default.node_sound_leaves_defaults(),
991 fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
1000 minetest.register_node("default:water_source", {
1001 description = "Water Source",
1002 inventory_image = minetest.inventorycube("default_water.png"),
1003 drawtype = "liquid",
1006 name = "default_water_source_animated.png",
1008 type = "vertical_frames",
1016 -- New-style water source material (mostly unused)
1018 name = "default_water_source_animated.png",
1020 type = "vertical_frames",
1025 backface_culling = false,
1029 paramtype = "light",
1033 buildable_to = true,
1034 is_ground_content = false,
1037 liquidtype = "source",
1038 liquid_alternative_flowing = "default:water_flowing",
1039 liquid_alternative_source = "default:water_source",
1040 liquid_viscosity = 1,
1041 post_effect_color = {a=120, r=30, g=60, b=90},
1042 groups = {water=3, liquid=3, puts_out_fire=1},
1045 minetest.register_node("default:water_flowing", {
1046 description = "Flowing Water",
1047 inventory_image = minetest.inventorycube("default_water.png"),
1048 drawtype = "flowingliquid",
1049 tiles = {"default_water.png"},
1052 name = "default_water_flowing_animated.png",
1053 backface_culling = false,
1055 type = "vertical_frames",
1062 name = "default_water_flowing_animated.png",
1063 backface_culling = true,
1065 type = "vertical_frames",
1073 paramtype = "light",
1074 paramtype2 = "flowingliquid",
1078 buildable_to = true,
1079 is_ground_content = false,
1082 liquidtype = "flowing",
1083 liquid_alternative_flowing = "default:water_flowing",
1084 liquid_alternative_source = "default:water_source",
1085 liquid_viscosity = 1,
1086 post_effect_color = {a=120, r=30, g=60, b=90},
1087 groups = {water=3, liquid=3, puts_out_fire=1, not_in_creative_inventory=1},
1091 minetest.register_node("default:river_water_source", {
1092 description = "River Water Source",
1093 inventory_image = minetest.inventorycube("default_river_water.png"),
1094 drawtype = "liquid",
1097 name = "default_river_water_source_animated.png",
1099 type = "vertical_frames",
1108 name = "default_river_water_source_animated.png",
1110 type = "vertical_frames",
1115 backface_culling = false,
1119 paramtype = "light",
1123 buildable_to = true,
1124 is_ground_content = false,
1127 liquidtype = "source",
1128 liquid_alternative_flowing = "default:river_water_flowing",
1129 liquid_alternative_source = "default:river_water_source",
1130 liquid_viscosity = 1,
1131 liquid_renewable = false,
1133 post_effect_color = {a=120, r=30, g=76, b=90},
1134 groups = {water=3, liquid=3, puts_out_fire=1},
1137 minetest.register_node("default:river_water_flowing", {
1138 description = "Flowing River Water",
1139 inventory_image = minetest.inventorycube("default_river_water.png"),
1140 drawtype = "flowingliquid",
1141 tiles = {"default_river_water.png"},
1144 name = "default_river_water_flowing_animated.png",
1145 backface_culling = false,
1147 type = "vertical_frames",
1154 name = "default_river_water_flowing_animated.png",
1155 backface_culling = true,
1157 type = "vertical_frames",
1165 paramtype = "light",
1166 paramtype2 = "flowingliquid",
1170 buildable_to = true,
1171 is_ground_content = false,
1174 liquidtype = "flowing",
1175 liquid_alternative_flowing = "default:river_water_flowing",
1176 liquid_alternative_source = "default:river_water_source",
1177 liquid_viscosity = 1,
1178 liquid_renewable = false,
1180 post_effect_color = {a=120, r=30, g=76, b=90},
1181 groups = {water=3, liquid=3, puts_out_fire=1, not_in_creative_inventory=1},
1186 minetest.register_node("default:lava_source", {
1187 description = "Lava Source",
1188 inventory_image = minetest.inventorycube("default_lava.png"),
1189 drawtype = "liquid",
1192 name = "default_lava_source_animated.png",
1194 type = "vertical_frames",
1202 -- New-style lava source material (mostly unused)
1204 name = "default_lava_source_animated.png",
1206 type = "vertical_frames",
1211 backface_culling = false,
1214 paramtype = "light",
1215 light_source = default.LIGHT_MAX - 1,
1219 buildable_to = true,
1220 is_ground_content = false,
1223 liquidtype = "source",
1224 liquid_alternative_flowing = "default:lava_flowing",
1225 liquid_alternative_source = "default:lava_source",
1226 liquid_viscosity = 7,
1227 liquid_renewable = false,
1228 damage_per_second = 4 * 2,
1229 post_effect_color = {a=192, r=255, g=64, b=0},
1230 groups = {lava=3, liquid=2, hot=3, igniter=1},
1233 minetest.register_node("default:lava_flowing", {
1234 description = "Flowing Lava",
1235 inventory_image = minetest.inventorycube("default_lava.png"),
1236 drawtype = "flowingliquid",
1237 tiles = {"default_lava.png"},
1240 name = "default_lava_flowing_animated.png",
1241 backface_culling = false,
1243 type = "vertical_frames",
1250 name = "default_lava_flowing_animated.png",
1251 backface_culling = true,
1253 type = "vertical_frames",
1260 paramtype = "light",
1261 paramtype2 = "flowingliquid",
1262 light_source = default.LIGHT_MAX - 1,
1266 buildable_to = true,
1267 is_ground_content = false,
1270 liquidtype = "flowing",
1271 liquid_alternative_flowing = "default:lava_flowing",
1272 liquid_alternative_source = "default:lava_source",
1273 liquid_viscosity = 7,
1274 liquid_renewable = false,
1275 damage_per_second = 4 * 2,
1276 post_effect_color = {a=192, r=255, g=64, b=0},
1277 groups = {lava=3, liquid=2, hot=3, igniter=1, not_in_creative_inventory=1},
1281 -- Tools / "Advanced" crafting / Non-"natural"
1284 minetest.register_node("default:torch", {
1285 description = "Torch",
1286 drawtype = "torchlike",
1289 name = "default_torch_on_floor_animated.png",
1291 type = "vertical_frames",
1298 name="default_torch_on_ceiling_animated.png",
1300 type = "vertical_frames",
1307 name="default_torch_animated.png",
1309 type = "vertical_frames",
1316 inventory_image = "default_torch_on_floor.png",
1317 wield_image = "default_torch_on_floor.png",
1318 paramtype = "light",
1319 paramtype2 = "wallmounted",
1320 sunlight_propagates = true,
1321 is_ground_content = false,
1323 light_source = default.LIGHT_MAX - 1,
1325 type = "wallmounted",
1326 wall_top = {-0.1, 0.5-0.6, -0.1, 0.1, 0.5, 0.1},
1327 wall_bottom = {-0.1, -0.5, -0.1, 0.1, -0.5+0.6, 0.1},
1328 wall_side = {-0.5, -0.3, -0.1, -0.5+0.3, 0.3, 0.1},
1330 groups = {choppy=2,dig_immediate=3,flammable=1,attached_node=1},
1331 legacy_wallmounted = true,
1332 sounds = default.node_sound_defaults(),
1337 local chest_formspec =
1340 default.gui_bg_img..
1342 "list[current_name;main;0,0.3;8,4;]"..
1343 "list[current_player;main;0,4.85;8,1;]"..
1344 "list[current_player;main;0,6.08;8,3;8]"..
1345 "listring[current_name;main]"..
1346 "listring[current_player;main]"..
1347 default.get_hotbar_bg(0,4.85)
1349 local function get_locked_chest_formspec(pos)
1350 local spos = pos.x .. "," .. pos.y .. "," ..pos.z
1354 default.gui_bg_img..
1356 "list[nodemeta:".. spos .. ";main;0,0.3;8,4;]"..
1357 "list[current_player;main;0,4.85;8,1;]"..
1358 "list[current_player;main;0,6.08;8,3;8]"..
1359 "listring[nodemeta:".. spos .. ";main]"..
1360 "listring[current_player;main]"..
1361 default.get_hotbar_bg(0,4.85)
1365 local function has_locked_chest_privilege(meta, player)
1366 if player:get_player_name() ~= meta:get_string("owner") then
1372 minetest.register_node("default:chest", {
1373 description = "Chest",
1374 tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
1375 "default_chest_side.png", "default_chest_side.png", "default_chest_front.png"},
1376 paramtype2 = "facedir",
1377 groups = {choppy=2,oddly_breakable_by_hand=2},
1378 legacy_facedir_simple = true,
1379 is_ground_content = false,
1380 sounds = default.node_sound_wood_defaults(),
1382 on_construct = function(pos)
1383 local meta = minetest.get_meta(pos)
1384 meta:set_string("formspec", chest_formspec)
1385 meta:set_string("infotext", "Chest")
1386 local inv = meta:get_inventory()
1387 inv:set_size("main", 8*4)
1389 can_dig = function(pos,player)
1390 local meta = minetest.get_meta(pos);
1391 local inv = meta:get_inventory()
1392 return inv:is_empty("main")
1394 on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
1395 minetest.log("action", player:get_player_name()..
1396 " moves stuff in chest at "..minetest.pos_to_string(pos))
1398 on_metadata_inventory_put = function(pos, listname, index, stack, player)
1399 minetest.log("action", player:get_player_name()..
1400 " moves stuff to chest at "..minetest.pos_to_string(pos))
1402 on_metadata_inventory_take = function(pos, listname, index, stack, player)
1403 minetest.log("action", player:get_player_name()..
1404 " takes stuff from chest at "..minetest.pos_to_string(pos))
1410 minetest.register_node("default:chest_locked", {
1411 description = "Locked Chest",
1412 tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
1413 "default_chest_side.png", "default_chest_side.png", "default_chest_lock.png"},
1414 paramtype2 = "facedir",
1415 groups = {choppy=2,oddly_breakable_by_hand=2},
1416 legacy_facedir_simple = true,
1417 is_ground_content = false,
1418 sounds = default.node_sound_wood_defaults(),
1420 after_place_node = function(pos, placer)
1421 local meta = minetest.get_meta(pos)
1422 meta:set_string("owner", placer:get_player_name() or "")
1423 meta:set_string("infotext", "Locked Chest (owned by "..
1424 meta:get_string("owner")..")")
1426 on_construct = function(pos)
1427 local meta = minetest.get_meta(pos)
1428 meta:set_string("infotext", "Locked Chest")
1429 meta:set_string("owner", "")
1430 local inv = meta:get_inventory()
1431 inv:set_size("main", 8*4)
1433 can_dig = function(pos,player)
1434 local meta = minetest.get_meta(pos);
1435 local inv = meta:get_inventory()
1436 return inv:is_empty("main") and has_locked_chest_privilege(meta, player)
1438 allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
1439 local meta = minetest.get_meta(pos)
1440 if not has_locked_chest_privilege(meta, player) then
1445 allow_metadata_inventory_put = function(pos, listname, index, stack, player)
1446 local meta = minetest.get_meta(pos)
1447 if not has_locked_chest_privilege(meta, player) then
1450 return stack:get_count()
1452 allow_metadata_inventory_take = function(pos, listname, index, stack, player)
1453 local meta = minetest.get_meta(pos)
1454 if not has_locked_chest_privilege(meta, player) then
1457 return stack:get_count()
1459 on_metadata_inventory_put = function(pos, listname, index, stack, player)
1460 minetest.log("action", player:get_player_name()..
1461 " moves stuff to locked chest at "..minetest.pos_to_string(pos))
1463 on_metadata_inventory_take = function(pos, listname, index, stack, player)
1464 minetest.log("action", player:get_player_name()..
1465 " takes stuff from locked chest at "..minetest.pos_to_string(pos))
1467 on_rightclick = function(pos, node, clicker)
1468 local meta = minetest.get_meta(pos)
1469 if has_locked_chest_privilege(meta, clicker) then
1470 minetest.show_formspec(
1471 clicker:get_player_name(),
1472 "default:chest_locked",
1473 get_locked_chest_formspec(pos)
1477 on_blast = function() end,
1482 local bookshelf_formspec =
1485 default.gui_bg_img..
1487 "list[context;books;0,0.3;8,2;]"..
1488 "list[current_player;main;0,2.85;8,1;]"..
1489 "list[current_player;main;0,4.08;8,3;8]"..
1490 "listring[context;books]"..
1491 "listring[current_player;main]"..
1492 default.get_hotbar_bg(0,2.85)
1494 minetest.register_node("default:bookshelf", {
1495 description = "Bookshelf",
1496 tiles = {"default_wood.png", "default_wood.png", "default_bookshelf.png"},
1497 is_ground_content = false,
1498 groups = {choppy=3,oddly_breakable_by_hand=2,flammable=3},
1499 sounds = default.node_sound_wood_defaults(),
1501 on_construct = function(pos)
1502 local meta = minetest.get_meta(pos)
1503 meta:set_string("formspec", bookshelf_formspec)
1504 local inv = meta:get_inventory()
1505 inv:set_size("books", 8*2)
1507 can_dig = function(pos,player)
1508 local meta = minetest.get_meta(pos);
1509 local inv = meta:get_inventory()
1510 return inv:is_empty("books")
1513 allow_metadata_inventory_put = function(pos, listname, index, stack, player)
1514 local meta = minetest.get_meta(pos)
1515 local inv = meta:get_inventory()
1516 local to_stack = inv:get_stack(listname, index)
1517 if listname == "books" then
1518 if minetest.get_item_group(stack:get_name(), "book") ~= 0
1519 and to_stack:is_empty() then
1527 allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
1528 local meta = minetest.get_meta(pos)
1529 local inv = meta:get_inventory()
1530 local stack = inv:get_stack(from_list, from_index)
1531 local to_stack = inv:get_stack(to_list, to_index)
1532 if to_list == "books" then
1533 if minetest.get_item_group(stack:get_name(), "book") ~= 0
1534 and to_stack:is_empty() then
1542 on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
1543 minetest.log("action", player:get_player_name()..
1544 " moves stuff in bookshelf at "..minetest.pos_to_string(pos))
1546 on_metadata_inventory_put = function(pos, listname, index, stack, player)
1547 minetest.log("action", player:get_player_name()..
1548 " moves stuff to bookshelf at "..minetest.pos_to_string(pos))
1550 on_metadata_inventory_take = function(pos, listname, index, stack, player)
1551 minetest.log("action", player:get_player_name()..
1552 " takes stuff from bookshelf at "..minetest.pos_to_string(pos))
1558 minetest.register_node("default:sign_wall", {
1559 description = "Sign",
1560 drawtype = "nodebox",
1561 tiles = {"default_sign.png"},
1562 inventory_image = "default_sign_wall.png",
1563 wield_image = "default_sign_wall.png",
1564 paramtype = "light",
1565 paramtype2 = "wallmounted",
1566 sunlight_propagates = true,
1567 is_ground_content = false,
1570 type = "wallmounted",
1571 wall_top = {-0.4375, 0.4375, -0.3125, 0.4375, 0.5, 0.3125},
1572 wall_bottom = {-0.4375, -0.5, -0.3125, 0.4375, -0.4375, 0.3125},
1573 wall_side = {-0.5, -0.3125, -0.4375, -0.4375, 0.3125, 0.4375},
1575 groups = {choppy=2,dig_immediate=2,attached_node=1},
1576 legacy_wallmounted = true,
1577 sounds = default.node_sound_defaults(),
1579 on_construct = function(pos)
1580 --local n = minetest.get_node(pos)
1581 local meta = minetest.get_meta(pos)
1582 meta:set_string("formspec", "field[text;;${text}]")
1583 meta:set_string("infotext", "\"\"")
1585 on_receive_fields = function(pos, formname, fields, sender)
1586 --print("Sign at "..minetest.pos_to_string(pos).." got "..dump(fields))
1587 if minetest.is_protected(pos, sender:get_player_name()) then
1588 minetest.record_protection_violation(pos, sender:get_player_name())
1591 local meta = minetest.get_meta(pos)
1592 if not fields.text then return end
1593 minetest.log("action", (sender:get_player_name() or "").." wrote \""..fields.text..
1594 "\" to sign at "..minetest.pos_to_string(pos))
1595 meta:set_string("text", fields.text)
1596 meta:set_string("infotext", '"'..fields.text..'"')
1600 minetest.register_node("default:ladder", {
1601 description = "Ladder",
1602 drawtype = "signlike",
1603 tiles = {"default_ladder.png"},
1604 inventory_image = "default_ladder.png",
1605 wield_image = "default_ladder.png",
1606 paramtype = "light",
1607 paramtype2 = "wallmounted",
1608 sunlight_propagates = true,
1611 is_ground_content = false,
1613 type = "wallmounted",
1614 --wall_top = = <default>
1615 --wall_bottom = = <default>
1616 --wall_side = = <default>
1618 groups = {choppy=2,oddly_breakable_by_hand=3,flammable=2},
1619 legacy_wallmounted = true,
1620 sounds = default.node_sound_wood_defaults(),
1623 local fence_texture = "default_fence_overlay.png^default_wood.png^default_fence_overlay.png^[makealpha:255,126,126"
1624 minetest.register_node("default:fence_wood", {
1625 description = "Wooden Fence",
1626 drawtype = "fencelike",
1627 tiles = {"default_wood.png"},
1628 inventory_image = fence_texture,
1629 wield_image = fence_texture,
1630 paramtype = "light",
1631 sunlight_propagates = true,
1632 is_ground_content = false,
1635 fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7},
1637 groups = {choppy=2,oddly_breakable_by_hand=2,flammable=2},
1638 sounds = default.node_sound_wood_defaults(),
1643 minetest.register_node("default:glass", {
1644 description = "Glass",
1645 drawtype = "glasslike_framed_optional",
1646 tiles = {"default_glass.png", "default_glass_detail.png"},
1647 inventory_image = minetest.inventorycube("default_glass.png"),
1648 paramtype = "light",
1649 sunlight_propagates = true,
1650 is_ground_content = false,
1651 groups = {cracky=3,oddly_breakable_by_hand=3},
1652 sounds = default.node_sound_glass_defaults(),
1655 minetest.register_node("default:obsidian_glass", {
1656 description = "Obsidian Glass",
1657 drawtype = "glasslike",
1658 tiles = {"default_obsidian_glass.png"},
1659 paramtype = "light",
1660 is_ground_content = false,
1661 sunlight_propagates = true,
1662 sounds = default.node_sound_glass_defaults(),
1663 groups = {cracky=3,oddly_breakable_by_hand=3},
1668 minetest.register_node("default:rail", {
1669 description = "Rail",
1670 drawtype = "raillike",
1671 tiles = {"default_rail.png", "default_rail_curved.png", "default_rail_t_junction.png", "default_rail_crossing.png"},
1672 inventory_image = "default_rail.png",
1673 wield_image = "default_rail.png",
1674 paramtype = "light",
1675 sunlight_propagates = true,
1677 is_ground_content = false,
1680 -- but how to specify the dimensions for curved and sideways rails?
1681 fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2},
1683 groups = {bendy=2,dig_immediate=2,attached_node=1,connect_to_raillike=minetest.raillike_group("rail")},
1688 minetest.register_node("default:brick", {
1689 description = "Brick Block",
1690 tiles = {"default_brick.png"},
1691 is_ground_content = false,
1692 groups = {cracky=3},
1693 sounds = default.node_sound_stone_defaults(),
1697 minetest.register_node("default:meselamp", {
1698 description = "Mese Lamp",
1699 drawtype = "glasslike",
1700 tiles = {"default_meselamp.png"},
1701 paramtype = "light",
1702 sunlight_propagates = true,
1703 is_ground_content = false,
1704 groups = {cracky = 3, oddly_breakable_by_hand = 3},
1705 sounds = default.node_sound_glass_defaults(),
1706 light_source = default.LIGHT_MAX,
1713 minetest.register_node("default:cloud", {
1714 description = "Cloud",
1715 tiles = {"default_cloud.png"},
1716 is_ground_content = false,
1717 sounds = default.node_sound_defaults(),
1718 groups = {not_in_creative_inventory=1},
1721 minetest.register_node("default:nyancat", {
1722 description = "Nyan Cat",
1723 tiles = {"default_nc_side.png", "default_nc_side.png", "default_nc_side.png",
1724 "default_nc_side.png", "default_nc_back.png", "default_nc_front.png"},
1725 paramtype2 = "facedir",
1726 groups = {cracky=2},
1727 is_ground_content = false,
1728 legacy_facedir_simple = true,
1729 sounds = default.node_sound_defaults(),
1732 minetest.register_node("default:nyancat_rainbow", {
1733 description = "Nyan Cat Rainbow",
1735 "default_nc_rb.png^[transformR90", "default_nc_rb.png^[transformR90",
1736 "default_nc_rb.png", "default_nc_rb.png"
1738 paramtype2 = "facedir",
1739 groups = {cracky=2},
1740 is_ground_content = false,
1741 sounds = default.node_sound_defaults(),