-- mods/default/nodes.lua -- support for MT game translation. local S = default.get_translator --[[ Node name convention: Although many node names are in combined-word form, the required form for new node names is words separated by underscores. If both forms are used in written language (for example pinewood and pine wood) the underscore form should be used. --]] --[[ Index: Stone ----- (1. Material 2. Cobble variant 3. Brick variant 4. Modified forms) default:stone default:cobble default:stonebrick default:stone_block default:mossycobble default:desert_stone default:desert_cobble default:desert_stonebrick default:desert_stone_block default:sandstone default:sandstonebrick default:sandstone_block default:desert_sandstone default:desert_sandstone_brick default:desert_sandstone_block default:silver_sandstone default:silver_sandstone_brick default:silver_sandstone_block default:obsidian default:obsidianbrick default:obsidian_block Soft / Non-Stone ---------------- (1. Material 2. Modified forms) default:dirt default:dirt_with_grass default:dirt_with_grass_footsteps default:dirt_with_dry_grass default:dirt_with_snow default:dirt_with_rainforest_litter default:dirt_with_coniferous_litter default:dry_dirt default:dry_dirt_with_dry_grass default:permafrost default:permafrost_with_stones default:permafrost_with_moss default:sand default:desert_sand default:silver_sand default:gravel default:clay default:snow default:snowblock default:ice default:cave_ice Trees ----- (1. Trunk 2. Fabricated trunk 3. Leaves 4. Sapling 5. Fruits) default:tree default:wood default:leaves default:sapling default:apple default:jungletree default:junglewood default:jungleleaves default:junglesapling default:emergent_jungle_sapling default:pine_tree default:pine_wood default:pine_needles default:pine_sapling default:acacia_tree default:acacia_wood default:acacia_leaves default:acacia_sapling default:aspen_tree default:aspen_wood default:aspen_leaves default:aspen_sapling Ores ---- (1. In stone 2. Blocks) default:stone_with_coal default:coalblock default:stone_with_iron default:steelblock default:stone_with_copper default:copperblock default:stone_with_tin default:tinblock default:bronzeblock default:stone_with_gold default:goldblock default:stone_with_mese default:mese default:stone_with_diamond default:diamondblock Plantlife --------- default:cactus default:large_cactus_seedling default:papyrus default:dry_shrub default:junglegrass default:grass_1 default:grass_2 default:grass_3 default:grass_4 default:grass_5 default:dry_grass_1 default:dry_grass_2 default:dry_grass_3 default:dry_grass_4 default:dry_grass_5 default:fern_1 default:fern_2 default:fern_3 default:marram_grass_1 default:marram_grass_2 default:marram_grass_3 default:bush_stem default:bush_leaves default:bush_sapling default:acacia_bush_stem default:acacia_bush_leaves default:acacia_bush_sapling default:pine_bush_stem default:pine_bush_needles default:pine_bush_sapling default:blueberry_bush_leaves_with_berries default:blueberry_bush_leaves default:blueberry_bush_sapling default:sand_with_kelp Corals ------ default:coral_green default:coral_pink default:coral_cyan default:coral_brown default:coral_orange default:coral_skeleton Liquids ------- (1. Source 2. Flowing) default:water_source default:water_flowing default:river_water_source default:river_water_flowing default:lava_source default:lava_flowing Tools / "Advanced" crafting / Non-"natural" ------------------------------------------- default:bookshelf default:sign_wall_wood default:sign_wall_steel default:ladder_wood default:ladder_steel default:fence_wood default:fence_acacia_wood default:fence_junglewood default:fence_pine_wood default:fence_aspen_wood default:fence_rail_wood default:fence_rail_acacia_wood default:fence_rail_junglewood default:fence_rail_pine_wood default:fence_rail_aspen_wood default:glass default:obsidian_glass default:brick default:meselamp default:mese_post_light default:mese_post_light_acacia_wood default:mese_post_light_junglewood default:mese_post_light_pine_wood default:mese_post_light_aspen_wood Misc ---- default:cloud --]] -- Required wrapper to allow customization of default.after_place_leaves local function after_place_leaves(...) return default.after_place_leaves(...) end -- Required wrapper to allow customization of default.grow_sapling local function grow_sapling(...) return default.grow_sapling(...) end -- -- Stone -- minetest.register_node("default:stone", { description = S("Stone"), tiles = {"default_stone.png"}, groups = {cracky = 3, stone = 1}, drop = "default:cobble", legacy_mineral = true, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:cobble", { description = S("Cobblestone"), tiles = {"default_cobble.png"}, is_ground_content = false, groups = {cracky = 3, stone = 2}, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:stonebrick", { description = S("Stone Brick"), paramtype2 = "facedir", place_param2 = 0, tiles = {"default_stone_brick.png"}, is_ground_content = false, groups = {cracky = 2, stone = 1}, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:stone_block", { description = S("Stone Block"), tiles = {"default_stone_block.png"}, is_ground_content = false, groups = {cracky = 2, stone = 1}, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:mossycobble", { description = S("Mossy Cobblestone"), tiles = {"default_mossycobble.png"}, is_ground_content = false, groups = {cracky = 3, stone = 1}, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:desert_stone", { description = S("Desert Stone"), tiles = {"default_desert_stone.png"}, groups = {cracky = 3, stone = 1}, drop = "default:desert_cobble", legacy_mineral = true, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:desert_cobble", { description = S("Desert Cobblestone"), tiles = {"default_desert_cobble.png"}, is_ground_content = false, groups = {cracky = 3, stone = 2}, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:desert_stonebrick", { description = S("Desert Stone Brick"), paramtype2 = "facedir", place_param2 = 0, tiles = {"default_desert_stone_brick.png"}, is_ground_content = false, groups = {cracky = 2, stone = 1}, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:desert_stone_block", { description = S("Desert Stone Block"), tiles = {"default_desert_stone_block.png"}, is_ground_content = false, groups = {cracky = 2, stone = 1}, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:sandstone", { description = S("Sandstone"), tiles = {"default_sandstone.png"}, groups = {crumbly = 1, cracky = 3}, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:sandstonebrick", { description = S("Sandstone Brick"), paramtype2 = "facedir", place_param2 = 0, tiles = {"default_sandstone_brick.png"}, is_ground_content = false, groups = {cracky = 2}, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:sandstone_block", { description = S("Sandstone Block"), tiles = {"default_sandstone_block.png"}, is_ground_content = false, groups = {cracky = 2}, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:desert_sandstone", { description = S("Desert Sandstone"), tiles = {"default_desert_sandstone.png"}, groups = {crumbly = 1, cracky = 3}, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:desert_sandstone_brick", { description = S("Desert Sandstone Brick"), paramtype2 = "facedir", place_param2 = 0, tiles = {"default_desert_sandstone_brick.png"}, is_ground_content = false, groups = {cracky = 2}, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:desert_sandstone_block", { description = S("Desert Sandstone Block"), tiles = {"default_desert_sandstone_block.png"}, is_ground_content = false, groups = {cracky = 2}, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:silver_sandstone", { description = S("Silver Sandstone"), tiles = {"default_silver_sandstone.png"}, groups = {crumbly = 1, cracky = 3}, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:silver_sandstone_brick", { description = S("Silver Sandstone Brick"), paramtype2 = "facedir", place_param2 = 0, tiles = {"default_silver_sandstone_brick.png"}, is_ground_content = false, groups = {cracky = 2}, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:silver_sandstone_block", { description = S("Silver Sandstone Block"), tiles = {"default_silver_sandstone_block.png"}, is_ground_content = false, groups = {cracky = 2}, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:obsidian", { description = S("Obsidian"), tiles = {"default_obsidian.png"}, sounds = default.node_sound_stone_defaults(), groups = {cracky = 1, level = 2}, }) minetest.register_node("default:obsidianbrick", { description = S("Obsidian Brick"), paramtype2 = "facedir", place_param2 = 0, tiles = {"default_obsidian_brick.png"}, is_ground_content = false, sounds = default.node_sound_stone_defaults(), groups = {cracky = 1, level = 2}, }) minetest.register_node("default:obsidian_block", { description = S("Obsidian Block"), tiles = {"default_obsidian_block.png"}, is_ground_content = false, sounds = default.node_sound_stone_defaults(), groups = {cracky = 1, level = 2}, }) -- -- Soft / Non-Stone -- minetest.register_node("default:dirt", { description = S("Dirt"), tiles = {"default_dirt.png"}, groups = {crumbly = 3, soil = 1}, sounds = default.node_sound_dirt_defaults(), }) minetest.register_node("default:dirt_with_grass", { description = S("Dirt with Grass"), tiles = {"default_grass.png", "default_dirt.png", {name = "default_dirt.png^default_grass_side.png", tileable_vertical = false}}, groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, drop = "default:dirt", sounds = default.node_sound_dirt_defaults({ footstep = {name = "default_grass_footstep", gain = 0.25}, }), }) minetest.register_node("default:dirt_with_grass_footsteps", { description = S("Dirt with Grass and Footsteps"), tiles = {"default_grass.png^default_footprint.png", "default_dirt.png", {name = "default_dirt.png^default_grass_side.png", tileable_vertical = false}}, groups = {crumbly = 3, soil = 1, not_in_creative_inventory = 1}, drop = "default:dirt", sounds = default.node_sound_dirt_defaults({ footstep = {name = "default_grass_footstep", gain = 0.25}, }), }) minetest.register_node("default:dirt_with_dry_grass", { description = S("Dirt with Savanna Grass"), tiles = {"default_dry_grass.png", "default_dirt.png", {name = "default_dirt.png^default_dry_grass_side.png", tileable_vertical = false}}, groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, drop = "default:dirt", sounds = default.node_sound_dirt_defaults({ footstep = {name = "default_grass_footstep", gain = 0.4}, }), }) minetest.register_node("default:dirt_with_snow", { description = S("Dirt with Snow"), tiles = {"default_snow.png", "default_dirt.png", {name = "default_dirt.png^default_snow_side.png", tileable_vertical = false}}, groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1, snowy = 1}, drop = "default:dirt", sounds = default.node_sound_dirt_defaults({ footstep = {name = "default_snow_footstep", gain = 0.2}, }), }) minetest.register_node("default:dirt_with_rainforest_litter", { description = S("Dirt with Rainforest Litter"), tiles = { "default_rainforest_litter.png", "default_dirt.png", {name = "default_dirt.png^default_rainforest_litter_side.png", tileable_vertical = false} }, groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, drop = "default:dirt", sounds = default.node_sound_dirt_defaults({ footstep = {name = "default_grass_footstep", gain = 0.4}, }), }) minetest.register_node("default:dirt_with_coniferous_litter", { description = S("Dirt with Coniferous Litter"), tiles = { "default_coniferous_litter.png", "default_dirt.png", {name = "default_dirt.png^default_coniferous_litter_side.png", tileable_vertical = false} }, groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, drop = "default:dirt", sounds = default.node_sound_dirt_defaults({ footstep = {name = "default_grass_footstep", gain = 0.4}, }), }) minetest.register_node("default:dry_dirt", { description = S("Savanna Dirt"), tiles = {"default_dry_dirt.png"}, groups = {crumbly = 3, soil = 1}, sounds = default.node_sound_dirt_defaults(), }) minetest.register_node("default:dry_dirt_with_dry_grass", { description = S("Savanna Dirt with Savanna Grass"), tiles = {"default_dry_grass.png", "default_dry_dirt.png", {name = "default_dry_dirt.png^default_dry_grass_side.png", tileable_vertical = false}}, groups = {crumbly = 3, soil = 1}, drop = "default:dry_dirt", sounds = default.node_sound_dirt_defaults({ footstep = {name = "default_grass_footstep", gain = 0.4}, }), }) minetest.register_node("default:permafrost", { description = S("Permafrost"), tiles = {"default_permafrost.png"}, groups = {cracky = 3}, sounds = default.node_sound_dirt_defaults(), }) minetest.register_node("default:permafrost_with_stones", { description = S("Permafrost with Stones"), tiles = {"default_permafrost.png^default_stones.png", "default_permafrost.png", "default_permafrost.png^default_stones_side.png"}, groups = {cracky = 3}, sounds = default.node_sound_gravel_defaults(), }) minetest.register_node("default:permafrost_with_moss", { description = S("Permafrost with Moss"), tiles = {"default_moss.png", "default_permafrost.png", {name = "default_permafrost.png^default_moss_side.png", tileable_vertical = false}}, groups = {cracky = 3}, sounds = default.node_sound_dirt_defaults({ footstep = {name = "default_grass_footstep", gain = 0.25}, }), }) minetest.register_node("default:sand", { description = S("Sand"), tiles = {"default_sand.png"}, groups = {crumbly = 3, falling_node = 1, sand = 1}, sounds = default.node_sound_sand_defaults(), }) minetest.register_node("default:desert_sand", { description = S("Desert Sand"), tiles = {"default_desert_sand.png"}, groups = {crumbly = 3, falling_node = 1, sand = 1}, sounds = default.node_sound_sand_defaults(), }) minetest.register_node("default:silver_sand", { description = S("Silver Sand"), tiles = {"default_silver_sand.png"}, groups = {crumbly = 3, falling_node = 1, sand = 1}, sounds = default.node_sound_sand_defaults(), }) minetest.register_node("default:gravel", { description = S("Gravel"), tiles = {"default_gravel.png"}, groups = {crumbly = 2, falling_node = 1}, sounds = default.node_sound_gravel_defaults(), drop = { max_items = 1, items = { {items = {"default:flint"}, rarity = 16}, {items = {"default:gravel"}} } } }) minetest.register_node("default:clay", { description = S("Clay"), tiles = {"default_clay.png"}, groups = {crumbly = 3}, drop = "default:clay_lump 4", sounds = default.node_sound_dirt_defaults(), }) minetest.register_node("default:snow", { description = S("Snow"), tiles = {"default_snow.png"}, inventory_image = "default_snowball.png", wield_image = "default_snowball.png", paramtype = "light", buildable_to = true, floodable = true, drawtype = "nodebox", node_box = { type = "fixed", fixed = { {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5}, }, }, collision_box = { type = "fixed", fixed = { {-0.5, -0.5, -0.5, 0.5, -6 / 16, 0.5}, }, }, groups = {crumbly = 3, falling_node = 1, snowy = 1}, sounds = default.node_sound_snow_defaults(), on_construct = function(pos) pos.y = pos.y - 1 if minetest.get_node(pos).name == "default:dirt_with_grass" then minetest.set_node(pos, {name = "default:dirt_with_snow"}) end end, }) minetest.register_node("default:snowblock", { description = S("Snow Block"), tiles = {"default_snow.png"}, groups = {crumbly = 3, cools_lava = 1, snowy = 1}, sounds = default.node_sound_snow_defaults(), on_construct = function(pos) pos.y = pos.y - 1 if minetest.get_node(pos).name == "default:dirt_with_grass" then minetest.set_node(pos, {name = "default:dirt_with_snow"}) end end, }) -- 'is ground content = false' to avoid tunnels in sea ice or ice rivers minetest.register_node("default:ice", { description = S("Ice"), tiles = {"default_ice.png"}, is_ground_content = false, paramtype = "light", groups = {cracky = 3, cools_lava = 1, slippery = 3}, sounds = default.node_sound_ice_defaults(), }) -- Mapgen-placed ice with 'is ground content = true' to contain tunnels minetest.register_node("default:cave_ice", { description = S("Cave Ice"), tiles = {"default_ice.png"}, paramtype = "light", groups = {cracky = 3, cools_lava = 1, slippery = 3, not_in_creative_inventory = 1}, drop = "default:ice", sounds = default.node_sound_ice_defaults(), }) -- -- Trees -- minetest.register_node("default:tree", { description = S("Apple Tree"), tiles = {"default_tree_top.png", "default_tree_top.png", "default_tree.png"}, paramtype2 = "facedir", is_ground_content = false, groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, sounds = default.node_sound_wood_defaults(), on_place = minetest.rotate_node }) minetest.register_node("default:wood", { description = S("Apple Wood Planks"), paramtype2 = "facedir", place_param2 = 0, tiles = {"default_wood.png"}, is_ground_content = false, groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1}, sounds = default.node_sound_wood_defaults(), }) minetest.register_node("default:sapling", { description = S("Apple Tree Sapling"), drawtype = "plantlike", tiles = {"default_sapling.png"}, inventory_image = "default_sapling.png", wield_image = "default_sapling.png", paramtype = "light", sunlight_propagates = true, walkable = false, on_timer = grow_sapling, selection_box = { type = "fixed", fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} }, groups = {snappy = 2, dig_immediate = 3, flammable = 2, attached_node = 1, sapling = 1}, sounds = default.node_sound_leaves_defaults(), on_construct = function(pos) minetest.get_node_timer(pos):start(math.random(300, 1500)) end, on_place = function(itemstack, placer, pointed_thing) itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, "default:sapling", -- minp, maxp to be checked, relative to sapling pos -- minp_relative.y = 1 because sapling pos has been checked {x = -3, y = 1, z = -3}, {x = 3, y = 6, z = 3}, -- maximum interval of interior volume check 4) return itemstack end, }) minetest.register_node("default:leaves", { description = S("Apple Tree Leaves"), drawtype = "allfaces_optional", waving = 1, tiles = {"default_leaves.png"}, special_tiles = {"default_leaves_simple.png"}, paramtype = "light", is_ground_content = false, groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, drop = { max_items = 1, items = { { -- player will get sapling with 1/20 chance items = {"default:sapling"}, rarity = 20, }, { -- player will get leaves only if he get no saplings, -- this is because max_items is 1 items = {"default:leaves"}, } } }, sounds = default.node_sound_leaves_defaults(), after_place_node = after_place_leaves, }) minetest.register_node("default:apple", { description = S("Apple"), drawtype = "plantlike", tiles = {"default_apple.png"}, inventory_image = "default_apple.png", paramtype = "light", sunlight_propagates = true, walkable = false, is_ground_content = false, selection_box = { type = "fixed", fixed = {-3 / 16, -7 / 16, -3 / 16, 3 / 16, 4 / 16, 3 / 16} }, groups = {fleshy = 3, dig_immediate = 3, flammable = 2, leafdecay = 3, leafdecay_drop = 1, food_apple = 1}, on_use = minetest.item_eat(2), sounds = default.node_sound_leaves_defaults(), after_place_node = function(pos, placer, itemstack) minetest.set_node(pos, {name = "default:apple", param2 = 1}) end, after_dig_node = function(pos, oldnode, oldmetadata, digger) if oldnode.param2 == 0 then minetest.set_node(pos, {name = "default:apple_mark"}) minetest.get_node_timer(pos):start(math.random(300, 1500)) end end, }) minetest.register_node("default:apple_mark", { description = S("Apple Marker"), inventory_image = "default_apple.png^default_invisible_node_overlay.png", wield_image = "default_apple.png^default_invisible_node_overlay.png", drawtype = "airlike", paramtype = "light", sunlight_propagates = true, walkable = false, pointable = false, diggable = false, buildable_to = true, drop = "", groups = {not_in_creative_inventory = 1}, on_timer = function(pos, elapsed) if not minetest.find_node_near(pos, 1, "default:leaves") then minetest.remove_node(pos) elseif minetest.get_node_light(pos) < 11 then minetest.get_node_timer(pos):start(200) else minetest.set_node(pos, {name = "default:apple"}) end end }) minetest.register_node("default:jungletree", { description = S("Jungle Tree"), tiles = {"default_jungletree_top.png", "default_jungletree_top.png", "default_jungletree.png"}, paramtype2 = "facedir", is_ground_content = false, groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, sounds = default.node_sound_wood_defaults(), on_place = minetest.rotate_node }) minetest.register_node("default:junglewood", { description = S("Jungle Wood Planks"), paramtype2 = "facedir", place_param2 = 0, tiles = {"default_junglewood.png"}, is_ground_content = false, groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1}, sounds = default.node_sound_wood_defaults(), }) minetest.register_node("default:jungleleaves", { description = S("Jungle Tree Leaves"), drawtype = "allfaces_optional", waving = 1, tiles = {"default_jungleleaves.png"}, special_tiles = {"default_jungleleaves_simple.png"}, paramtype = "light", is_ground_content = false, groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, drop = { max_items = 1, items = { {items = {"default:junglesapling"}, rarity = 20}, {items = {"default:jungleleaves"}} } }, sounds = default.node_sound_leaves_defaults(), after_place_node = after_place_leaves, }) minetest.register_node("default:junglesapling", { description = S("Jungle Tree Sapling"), drawtype = "plantlike", tiles = {"default_junglesapling.png"}, inventory_image = "default_junglesapling.png", wield_image = "default_junglesapling.png", paramtype = "light", sunlight_propagates = true, walkable = false, on_timer = grow_sapling, selection_box = { type = "fixed", fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} }, groups = {snappy = 2, dig_immediate = 3, flammable = 2, attached_node = 1, sapling = 1}, sounds = default.node_sound_leaves_defaults(), on_construct = function(pos) minetest.get_node_timer(pos):start(math.random(300, 1500)) end, on_place = function(itemstack, placer, pointed_thing) itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, "default:junglesapling", -- minp, maxp to be checked, relative to sapling pos -- minp_relative.y = 1 because sapling pos has been checked {x = -2, y = 1, z = -2}, {x = 2, y = 15, z = 2}, -- maximum interval of interior volume check 4) return itemstack end, }) minetest.register_node("default:emergent_jungle_sapling", { description = S("Emergent Jungle Tree Sapling"), drawtype = "plantlike", tiles = {"default_emergent_jungle_sapling.png"}, inventory_image = "default_emergent_jungle_sapling.png", wield_image = "default_emergent_jungle_sapling.png", paramtype = "light", sunlight_propagates = true, walkable = false, on_timer = grow_sapling, selection_box = { type = "fixed", fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} }, groups = {snappy = 2, dig_immediate = 3, flammable = 2, attached_node = 1, sapling = 1}, sounds = default.node_sound_leaves_defaults(), on_construct = function(pos) minetest.get_node_timer(pos):start(math.random(300, 1500)) end, on_place = function(itemstack, placer, pointed_thing) itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, "default:emergent_jungle_sapling", -- minp, maxp to be checked, relative to sapling pos {x = -3, y = -5, z = -3}, {x = 3, y = 31, z = 3}, -- maximum interval of interior volume check 4) return itemstack end, }) minetest.register_node("default:pine_tree", { description = S("Pine Tree"), tiles = {"default_pine_tree_top.png", "default_pine_tree_top.png", "default_pine_tree.png"}, paramtype2 = "facedir", is_ground_content = false, groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3}, sounds = default.node_sound_wood_defaults(), on_place = minetest.rotate_node }) minetest.register_node("default:pine_wood", { description = S("Pine Wood Planks"), paramtype2 = "facedir", place_param2 = 0, tiles = {"default_pine_wood.png"}, is_ground_content = false, groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, sounds = default.node_sound_wood_defaults(), }) minetest.register_node("default:pine_needles",{ description = S("Pine Needles"), drawtype = "allfaces_optional", tiles = {"default_pine_needles.png"}, waving = 1, paramtype = "light", is_ground_content = false, groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, drop = { max_items = 1, items = { {items = {"default:pine_sapling"}, rarity = 20}, {items = {"default:pine_needles"}} } }, sounds = default.node_sound_leaves_defaults(), after_place_node = after_place_leaves, }) minetest.register_node("default:pine_sapling", { description = S("Pine Tree Sapling"), drawtype = "plantlike", tiles = {"default_pine_sapling.png"}, inventory_image = "default_pine_sapling.png", wield_image = "default_pine_sapling.png", paramtype = "light", sunlight_propagates = true, walkable = false, on_timer = grow_sapling, selection_box = { type = "fixed", fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} }, groups = {snappy = 2, dig_immediate = 3, flammable = 3, attached_node = 1, sapling = 1}, sounds = default.node_sound_leaves_defaults(), on_construct = function(pos) minetest.get_node_timer(pos):start(math.random(300, 1500)) end, on_place = function(itemstack, placer, pointed_thing) itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, "default:pine_sapling", -- minp, maxp to be checked, relative to sapling pos -- minp_relative.y = 1 because sapling pos has been checked {x = -2, y = 1, z = -2}, {x = 2, y = 14, z = 2}, -- maximum interval of interior volume check 4) return itemstack end, }) minetest.register_node("default:acacia_tree", { description = S("Acacia Tree"), tiles = {"default_acacia_tree_top.png", "default_acacia_tree_top.png", "default_acacia_tree.png"}, paramtype2 = "facedir", is_ground_content = false, groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, sounds = default.node_sound_wood_defaults(), on_place = minetest.rotate_node }) minetest.register_node("default:acacia_wood", { description = S("Acacia Wood Planks"), paramtype2 = "facedir", place_param2 = 0, tiles = {"default_acacia_wood.png"}, is_ground_content = false, groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1}, sounds = default.node_sound_wood_defaults(), }) minetest.register_node("default:acacia_leaves", { description = S("Acacia Tree Leaves"), drawtype = "allfaces_optional", tiles = {"default_acacia_leaves.png"}, special_tiles = {"default_acacia_leaves_simple.png"}, waving = 1, paramtype = "light", is_ground_content = false, groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, drop = { max_items = 1, items = { {items = {"default:acacia_sapling"}, rarity = 20}, {items = {"default:acacia_leaves"}} } }, sounds = default.node_sound_leaves_defaults(), after_place_node = after_place_leaves, }) minetest.register_node("default:acacia_sapling", { description = S("Acacia Tree Sapling"), drawtype = "plantlike", tiles = {"default_acacia_sapling.png"}, inventory_image = "default_acacia_sapling.png", wield_image = "default_acacia_sapling.png", paramtype = "light", sunlight_propagates = true, walkable = false, on_timer = grow_sapling, selection_box = { type = "fixed", fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16} }, groups = {snappy = 2, dig_immediate = 3, flammable = 2, attached_node = 1, sapling = 1}, sounds = default.node_sound_leaves_defaults(), on_construct = function(pos) minetest.get_node_timer(pos):start(math.random(300, 1500)) end, on_place = function(itemstack, placer, pointed_thing) itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, "default:acacia_sapling", -- minp, maxp to be checked, relative to sapling pos -- minp_relative.y = 1 because sapling pos has been checked {x = -4, y = 1, z = -4}, {x = 4, y = 7, z = 4}, -- maximum interval of interior volume check 4) return itemstack end, }) minetest.register_node("default:aspen_tree", { description = S("Aspen Tree"), tiles = {"default_aspen_tree_top.png", "default_aspen_tree_top.png", "default_aspen_tree.png"}, paramtype2 = "facedir", is_ground_content = false, groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3}, sounds = default.node_sound_wood_defaults(), on_place = minetest.rotate_node }) minetest.register_node("default:aspen_wood", { description = S("Aspen Wood Planks"), paramtype2 = "facedir", place_param2 = 0, tiles = {"default_aspen_wood.png"}, is_ground_content = false, groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, sounds = default.node_sound_wood_defaults(), }) minetest.register_node("default:aspen_leaves", { description = S("Aspen Tree Leaves"), drawtype = "allfaces_optional", tiles = {"default_aspen_leaves.png"}, waving = 1, paramtype = "light", is_ground_content = false, groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, drop = { max_items = 1, items = { {items = {"default:aspen_sapling"}, rarity = 20}, {items = {"default:aspen_leaves"}} } }, sounds = default.node_sound_leaves_defaults(), after_place_node = after_place_leaves, }) minetest.register_node("default:aspen_sapling", { description = S("Aspen Tree Sapling"), drawtype = "plantlike", tiles = {"default_aspen_sapling.png"}, inventory_image = "default_aspen_sapling.png", wield_image = "default_aspen_sapling.png", paramtype = "light", sunlight_propagates = true, walkable = false, on_timer = grow_sapling, selection_box = { type = "fixed", fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, 0.5, 3 / 16} }, groups = {snappy = 2, dig_immediate = 3, flammable = 3, attached_node = 1, sapling = 1}, sounds = default.node_sound_leaves_defaults(), on_construct = function(pos) minetest.get_node_timer(pos):start(math.random(300, 1500)) end, on_place = function(itemstack, placer, pointed_thing) itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, "default:aspen_sapling", -- minp, maxp to be checked, relative to sapling pos -- minp_relative.y = 1 because sapling pos has been checked {x = -2, y = 1, z = -2}, {x = 2, y = 12, z = 2}, -- maximum interval of interior volume check 4) return itemstack end, }) -- -- Ores -- minetest.register_node("default:stone_with_coal", { description = S("Coal Ore"), tiles = {"default_stone.png^default_mineral_coal.png"}, groups = {cracky = 3}, drop = "default:coal_lump", sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:coalblock", { description = S("Coal Block"), tiles = {"default_coal_block.png"}, is_ground_content = false, groups = {cracky = 3}, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:stone_with_iron", { description = S("Iron Ore"), tiles = {"default_stone.png^default_mineral_iron.png"}, groups = {cracky = 2}, drop = "default:iron_lump", sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:steelblock", { description = S("Steel Block"), tiles = {"default_steel_block.png"}, is_ground_content = false, groups = {cracky = 1, level = 2}, sounds = default.node_sound_metal_defaults(), }) minetest.register_node("default:stone_with_copper", { description = S("Copper Ore"), tiles = {"default_stone.png^default_mineral_copper.png"}, groups = {cracky = 2}, drop = "default:copper_lump", sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:copperblock", { description = S("Copper Block"), tiles = {"default_copper_block.png"}, is_ground_content = false, groups = {cracky = 1, level = 2}, sounds = default.node_sound_metal_defaults(), }) minetest.register_node("default:stone_with_tin", { description = S("Tin Ore"), tiles = {"default_stone.png^default_mineral_tin.png"}, groups = {cracky = 2}, drop = "default:tin_lump", sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:tinblock", { description = S("Tin Block"), tiles = {"default_tin_block.png"}, is_ground_content = false, groups = {cracky = 1, level = 2}, sounds = default.node_sound_metal_defaults(), }) minetest.register_node("default:bronzeblock", { description = S("Bronze Block"), tiles = {"default_bronze_block.png"}, is_ground_content = false, groups = {cracky = 1, level = 2}, sounds = default.node_sound_metal_defaults(), }) minetest.register_node("default:stone_with_mese", { description = S("Mese Ore"), tiles = {"default_stone.png^default_mineral_mese.png"}, groups = {cracky = 1}, drop = "default:mese_crystal", sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:mese", { description = S("Mese Block"), tiles = {"default_mese_block.png"}, paramtype = "light", groups = {cracky = 1, level = 2}, sounds = default.node_sound_stone_defaults(), light_source = 3, }) minetest.register_node("default:stone_with_gold", { description = S("Gold Ore"), tiles = {"default_stone.png^default_mineral_gold.png"}, groups = {cracky = 2}, drop = "default:gold_lump", sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:goldblock", { description = S("Gold Block"), tiles = {"default_gold_block.png"}, is_ground_content = false, groups = {cracky = 1}, sounds = default.node_sound_metal_defaults(), }) minetest.register_node("default:stone_with_diamond", { description = S("Diamond Ore"), tiles = {"default_stone.png^default_mineral_diamond.png"}, groups = {cracky = 1}, drop = "default:diamond", sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:diamondblock", { description = S("Diamond Block"), tiles = {"default_diamond_block.png"}, is_ground_content = false, groups = {cracky = 1, level = 3}, sounds = default.node_sound_stone_defaults(), }) -- -- Plantlife (non-cubic) -- minetest.register_node("default:cactus", { description = S("Cactus"), tiles = {"default_cactus_top.png", "default_cactus_top.png", "default_cactus_side.png"}, paramtype2 = "facedir", groups = {choppy = 3}, sounds = default.node_sound_wood_defaults(), on_place = minetest.rotate_node, }) minetest.register_node("default:large_cactus_seedling", { description = S("Large Cactus Seedling"), drawtype = "plantlike", tiles = {"default_large_cactus_seedling.png"}, inventory_image = "default_large_cactus_seedling.png", wield_image = "default_large_cactus_seedling.png", paramtype = "light", sunlight_propagates = true, walkable = false, selection_box = { type = "fixed", fixed = { -5 / 16, -0.5, -5 / 16, 5 / 16, 0.5, 5 / 16 } }, groups = {choppy = 3, dig_immediate = 3, attached_node = 1}, sounds = default.node_sound_wood_defaults(), on_place = function(itemstack, placer, pointed_thing) itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, "default:large_cactus_seedling", {x = -2, y = -1, z = -2}, {x = 2, y = 5, z = 2}, 4) return itemstack end, on_construct = function(pos) -- Normal cactus farming adds 1 cactus node by ABM, -- interval 12s, chance 83. -- Consider starting with 5 cactus nodes. We make sure that growing a -- large cactus is not a faster way to produce new cactus nodes. -- Confirmed by experiment, when farming 5 cacti, on average 1 new -- cactus node is added on average every -- 83 / 5 = 16.6 intervals = 16.6 * 12 = 199.2s. -- Large cactus contains on average 14 cactus nodes. -- 14 * 199.2 = 2788.8s. -- Set random range to average to 2789s. minetest.get_node_timer(pos):start(math.random(1859, 3719)) end, on_timer = function(pos) local node_under = minetest.get_node_or_nil( {x = pos.x, y = pos.y - 1, z = pos.z}) if not node_under then -- Node under not yet loaded, try later minetest.get_node_timer(pos):start(300) return end if minetest.get_item_group(node_under.name, "sand") == 0 then -- Seedling dies minetest.remove_node(pos) return end local light_level = minetest.get_node_light(pos) if not light_level or light_level < 13 then -- Too dark for growth, try later in case it's night minetest.get_node_timer(pos):start(300) return end minetest.log("action", "A large cactus seedling grows into a large" .. "cactus at ".. minetest.pos_to_string(pos)) default.grow_large_cactus(pos) end, }) minetest.register_node("default:papyrus", { description = S("Papyrus"), drawtype = "plantlike", tiles = {"default_papyrus.png"}, inventory_image = "default_papyrus.png", wield_image = "default_papyrus.png", paramtype = "light", sunlight_propagates = true, walkable = false, selection_box = { type = "fixed", fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, }, groups = {snappy = 3, flammable = 2}, sounds = default.node_sound_leaves_defaults(), after_dig_node = function(pos, node, metadata, digger) default.dig_up(pos, node, digger) end, }) minetest.register_node("default:dry_shrub", { description = S("Dry Shrub"), drawtype = "plantlike", waving = 1, tiles = {"default_dry_shrub.png"}, inventory_image = "default_dry_shrub.png", wield_image = "default_dry_shrub.png", paramtype = "light", paramtype2 = "meshoptions", place_param2 = 4, sunlight_propagates = true, walkable = false, buildable_to = true, groups = {snappy = 3, flammable = 3, attached_node = 1}, sounds = default.node_sound_leaves_defaults(), selection_box = { type = "fixed", fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 4 / 16, 6 / 16}, }, }) minetest.register_node("default:junglegrass", { description = S("Jungle Grass"), drawtype = "plantlike", waving = 1, visual_scale = 1.69, tiles = {"default_junglegrass.png"}, inventory_image = "default_junglegrass.png", wield_image = "default_junglegrass.png", paramtype = "light", sunlight_propagates = true, walkable = false, buildable_to = true, groups = {snappy = 3, flora = 1, attached_node = 1, grass = 1, junglegrass = 1, flammable = 1}, sounds = default.node_sound_leaves_defaults(), selection_box = { type = "fixed", fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16}, }, }) minetest.register_node("default:grass_1", { description = S("Grass"), drawtype = "plantlike", waving = 1, tiles = {"default_grass_1.png"}, -- Use texture of a taller grass stage in inventory inventory_image = "default_grass_3.png", wield_image = "default_grass_3.png", paramtype = "light", sunlight_propagates = true, walkable = false, buildable_to = true, groups = {snappy = 3, flora = 1, attached_node = 1, grass = 1, normal_grass = 1, flammable = 1}, sounds = default.node_sound_leaves_defaults(), selection_box = { type = "fixed", fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16}, }, on_place = function(itemstack, placer, pointed_thing) -- place a random grass node local stack = ItemStack("default:grass_" .. math.random(1,5)) local ret = minetest.item_place(stack, placer, pointed_thing) return ItemStack("default:grass_1 " .. itemstack:get_count() - (1 - ret:get_count())) end, }) for i = 2, 5 do minetest.register_node("default:grass_" .. i, { description = S("Grass"), drawtype = "plantlike", waving = 1, tiles = {"default_grass_" .. i .. ".png"}, inventory_image = "default_grass_" .. i .. ".png", wield_image = "default_grass_" .. i .. ".png", paramtype = "light", sunlight_propagates = true, walkable = false, buildable_to = true, drop = "default:grass_1", groups = {snappy = 3, flora = 1, attached_node = 1, not_in_creative_inventory = 1, grass = 1, normal_grass = 1, flammable = 1}, sounds = default.node_sound_leaves_defaults(), selection_box = { type = "fixed", fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16}, }, }) end minetest.register_node("default:dry_grass_1", { description = S("Savanna Grass"), drawtype = "plantlike", waving = 1, tiles = {"default_dry_grass_1.png"}, inventory_image = "default_dry_grass_3.png", wield_image = "default_dry_grass_3.png", paramtype = "light", sunlight_propagates = true, walkable = false, buildable_to = true, groups = {snappy = 3, flammable = 3, flora = 1, attached_node = 1, grass = 1, dry_grass = 1}, sounds = default.node_sound_leaves_defaults(), selection_box = { type = "fixed", fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16}, }, on_place = function(itemstack, placer, pointed_thing) -- place a random dry grass node local stack = ItemStack("default:dry_grass_" .. math.random(1, 5)) local ret = minetest.item_place(stack, placer, pointed_thing) return ItemStack("default:dry_grass_1 " .. itemstack:get_count() - (1 - ret:get_count())) end, }) for i = 2, 5 do minetest.register_node("default:dry_grass_" .. i, { description = S("Savanna Grass"), drawtype = "plantlike", waving = 1, tiles = {"default_dry_grass_" .. i .. ".png"}, inventory_image = "default_dry_grass_" .. i .. ".png", wield_image = "default_dry_grass_" .. i .. ".png", paramtype = "light", sunlight_propagates = true, walkable = false, buildable_to = true, groups = {snappy = 3, flammable = 3, flora = 1, attached_node = 1, not_in_creative_inventory = 1, grass = 1, dry_grass = 1}, drop = "default:dry_grass_1", sounds = default.node_sound_leaves_defaults(), selection_box = { type = "fixed", fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -1 / 16, 6 / 16}, }, }) end minetest.register_node("default:fern_1", { description = S("Fern"), drawtype = "plantlike", waving = 1, tiles = {"default_fern_1.png"}, inventory_image = "default_fern_1.png", wield_image = "default_fern_1.png", paramtype = "light", sunlight_propagates = true, walkable = false, buildable_to = true, groups = {snappy = 3, flammable = 3, flora = 1, grass = 1, fern = 1, attached_node = 1}, sounds = default.node_sound_leaves_defaults(), selection_box = { type = "fixed", fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -0.25, 6 / 16}, }, on_place = function(itemstack, placer, pointed_thing) -- place a random fern node local stack = ItemStack("default:fern_" .. math.random(1, 3)) local ret = minetest.item_place(stack, placer, pointed_thing) return ItemStack("default:fern_1 " .. itemstack:get_count() - (1 - ret:get_count())) end, }) for i = 2, 3 do minetest.register_node("default:fern_" .. i, { description = S("Fern"), drawtype = "plantlike", waving = 1, visual_scale = 2, tiles = {"default_fern_" .. i .. ".png"}, inventory_image = "default_fern_" .. i .. ".png", wield_image = "default_fern_" .. i .. ".png", paramtype = "light", sunlight_propagates = true, walkable = false, buildable_to = true, groups = {snappy = 3, flammable = 3, flora = 1, attached_node = 1, grass = 1, fern = 1, not_in_creative_inventory = 1}, drop = "default:fern_1", sounds = default.node_sound_leaves_defaults(), selection_box = { type = "fixed", fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -0.25, 6 / 16}, }, }) end minetest.register_node("default:marram_grass_1", { description = S("Marram Grass"), drawtype = "plantlike", waving = 1, tiles = {"default_marram_grass_1.png"}, inventory_image = "default_marram_grass_1.png", wield_image = "default_marram_grass_1.png", paramtype = "light", sunlight_propagates = true, walkable = false, buildable_to = true, groups = {snappy = 3, flammable = 3, flora = 1, grass = 1, marram_grass = 1, attached_node = 1}, sounds = default.node_sound_leaves_defaults(), selection_box = { type = "fixed", fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -0.25, 6 / 16}, }, on_place = function(itemstack, placer, pointed_thing) -- place a random marram grass node local stack = ItemStack("default:marram_grass_" .. math.random(1, 3)) local ret = minetest.item_place(stack, placer, pointed_thing) return ItemStack("default:marram_grass_1 " .. itemstack:get_count() - (1 - ret:get_count())) end, }) for i = 2, 3 do minetest.register_node("default:marram_grass_" .. i, { description = S("Marram Grass"), drawtype = "plantlike", waving = 1, tiles = {"default_marram_grass_" .. i .. ".png"}, inventory_image = "default_marram_grass_" .. i .. ".png", wield_image = "default_marram_grass_" .. i .. ".png", paramtype = "light", sunlight_propagates = true, walkable = false, buildable_to = true, groups = {snappy = 3, flammable = 3, flora = 1, attached_node = 1, grass = 1, marram_grass = 1, not_in_creative_inventory = 1}, drop = "default:marram_grass_1", sounds = default.node_sound_leaves_defaults(), selection_box = { type = "fixed", fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -0.25, 6 / 16}, }, }) end minetest.register_node("default:bush_stem", { description = S("Bush Stem"), drawtype = "plantlike", visual_scale = 1.41, tiles = {"default_bush_stem.png"}, inventory_image = "default_bush_stem.png", wield_image = "default_bush_stem.png", paramtype = "light", sunlight_propagates = true, groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, sounds = default.node_sound_wood_defaults(), selection_box = { type = "fixed", fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16}, }, }) minetest.register_node("default:bush_leaves", { description = S("Bush Leaves"), drawtype = "allfaces_optional", tiles = {"default_leaves_simple.png"}, paramtype = "light", groups = {snappy = 3, flammable = 2, leaves = 1}, drop = { max_items = 1, items = { {items = {"default:bush_sapling"}, rarity = 5}, {items = {"default:bush_leaves"}} } }, sounds = default.node_sound_leaves_defaults(), after_place_node = after_place_leaves, }) minetest.register_node("default:bush_sapling", { description = S("Bush Sapling"), drawtype = "plantlike", tiles = {"default_bush_sapling.png"}, inventory_image = "default_bush_sapling.png", wield_image = "default_bush_sapling.png", paramtype = "light", sunlight_propagates = true, walkable = false, on_timer = grow_sapling, selection_box = { type = "fixed", fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} }, groups = {snappy = 2, dig_immediate = 3, flammable = 2, attached_node = 1, sapling = 1}, sounds = default.node_sound_leaves_defaults(), on_construct = function(pos) minetest.get_node_timer(pos):start(math.random(300, 1500)) end, on_place = function(itemstack, placer, pointed_thing) itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, "default:bush_sapling", -- minp, maxp to be checked, relative to sapling pos {x = -1, y = 0, z = -1}, {x = 1, y = 1, z = 1}, -- maximum interval of interior volume check 2) return itemstack end, }) minetest.register_node("default:blueberry_bush_leaves_with_berries", { description = S("Blueberry Bush Leaves with Berries"), drawtype = "allfaces_optional", tiles = {"default_blueberry_bush_leaves.png^default_blueberry_overlay.png"}, paramtype = "light", groups = {snappy = 3, flammable = 2, leaves = 1, dig_immediate = 3}, drop = "default:blueberries", sounds = default.node_sound_leaves_defaults(), node_dig_prediction = "default:blueberry_bush_leaves", after_dig_node = function(pos, oldnode, oldmetadata, digger) minetest.set_node(pos, {name = "default:blueberry_bush_leaves"}) minetest.get_node_timer(pos):start(math.random(300, 1500)) end, }) minetest.register_node("default:blueberry_bush_leaves", { description = S("Blueberry Bush Leaves"), drawtype = "allfaces_optional", tiles = {"default_blueberry_bush_leaves.png"}, paramtype = "light", groups = {snappy = 3, flammable = 2, leaves = 1}, drop = { max_items = 1, items = { {items = {"default:blueberry_bush_sapling"}, rarity = 5}, {items = {"default:blueberry_bush_leaves"}} } }, sounds = default.node_sound_leaves_defaults(), on_timer = function(pos, elapsed) if minetest.get_node_light(pos) < 11 then minetest.get_node_timer(pos):start(200) else minetest.set_node(pos, {name = "default:blueberry_bush_leaves_with_berries"}) end end, after_place_node = after_place_leaves, }) minetest.register_node("default:blueberry_bush_sapling", { description = S("Blueberry Bush Sapling"), drawtype = "plantlike", tiles = {"default_blueberry_bush_sapling.png"}, inventory_image = "default_blueberry_bush_sapling.png", wield_image = "default_blueberry_bush_sapling.png", paramtype = "light", sunlight_propagates = true, walkable = false, on_timer = grow_sapling, selection_box = { type = "fixed", fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} }, groups = {snappy = 2, dig_immediate = 3, flammable = 2, attached_node = 1, sapling = 1}, sounds = default.node_sound_leaves_defaults(), on_construct = function(pos) minetest.get_node_timer(pos):start(math.random(300, 1500)) end, on_place = function(itemstack, placer, pointed_thing) itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, "default:blueberry_bush_sapling", -- minp, maxp to be checked, relative to sapling pos {x = -1, y = 0, z = -1}, {x = 1, y = 1, z = 1}, -- maximum interval of interior volume check 2) return itemstack end, }) minetest.register_node("default:acacia_bush_stem", { description = S("Acacia Bush Stem"), drawtype = "plantlike", visual_scale = 1.41, tiles = {"default_acacia_bush_stem.png"}, inventory_image = "default_acacia_bush_stem.png", wield_image = "default_acacia_bush_stem.png", paramtype = "light", sunlight_propagates = true, groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, sounds = default.node_sound_wood_defaults(), selection_box = { type = "fixed", fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16}, }, }) minetest.register_node("default:acacia_bush_leaves", { description = S("Acacia Bush Leaves"), drawtype = "allfaces_optional", tiles = {"default_acacia_leaves_simple.png"}, paramtype = "light", groups = {snappy = 3, flammable = 2, leaves = 1}, drop = { max_items = 1, items = { {items = {"default:acacia_bush_sapling"}, rarity = 5}, {items = {"default:acacia_bush_leaves"}} } }, sounds = default.node_sound_leaves_defaults(), after_place_node = after_place_leaves, }) minetest.register_node("default:acacia_bush_sapling", { description = S("Acacia Bush Sapling"), drawtype = "plantlike", tiles = {"default_acacia_bush_sapling.png"}, inventory_image = "default_acacia_bush_sapling.png", wield_image = "default_acacia_bush_sapling.png", paramtype = "light", sunlight_propagates = true, walkable = false, on_timer = grow_sapling, selection_box = { type = "fixed", fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, 2 / 16, 3 / 16} }, groups = {snappy = 2, dig_immediate = 3, flammable = 2, attached_node = 1, sapling = 1}, sounds = default.node_sound_leaves_defaults(), on_construct = function(pos) minetest.get_node_timer(pos):start(math.random(300, 1500)) end, on_place = function(itemstack, placer, pointed_thing) itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, "default:acacia_bush_sapling", -- minp, maxp to be checked, relative to sapling pos {x = -1, y = 0, z = -1}, {x = 1, y = 1, z = 1}, -- maximum interval of interior volume check 2) return itemstack end, }) minetest.register_node("default:pine_bush_stem", { description = S("Pine Bush Stem"), drawtype = "plantlike", visual_scale = 1.41, tiles = {"default_pine_bush_stem.png"}, inventory_image = "default_pine_bush_stem.png", wield_image = "default_pine_bush_stem.png", paramtype = "light", sunlight_propagates = true, groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, sounds = default.node_sound_wood_defaults(), selection_box = { type = "fixed", fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16}, }, }) minetest.register_node("default:pine_bush_needles", { description = S("Pine Bush Needles"), drawtype = "allfaces_optional", tiles = {"default_pine_needles.png"}, paramtype = "light", groups = {snappy = 3, flammable = 2, leaves = 1}, drop = { max_items = 1, items = { {items = {"default:pine_bush_sapling"}, rarity = 5}, {items = {"default:pine_bush_needles"}} } }, sounds = default.node_sound_leaves_defaults(), after_place_node = after_place_leaves, }) minetest.register_node("default:pine_bush_sapling", { description = S("Pine Bush Sapling"), drawtype = "plantlike", tiles = {"default_pine_bush_sapling.png"}, inventory_image = "default_pine_bush_sapling.png", wield_image = "default_pine_bush_sapling.png", paramtype = "light", sunlight_propagates = true, walkable = false, on_timer = grow_sapling, selection_box = { type = "fixed", fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16} }, groups = {snappy = 2, dig_immediate = 3, flammable = 2, attached_node = 1, sapling = 1}, sounds = default.node_sound_leaves_defaults(), on_construct = function(pos) minetest.get_node_timer(pos):start(math.random(300, 1500)) end, on_place = function(itemstack, placer, pointed_thing) itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, "default:pine_bush_sapling", -- minp, maxp to be checked, relative to sapling pos {x = -1, y = 0, z = -1}, {x = 1, y = 1, z = 1}, -- maximum interval of interior volume check 2) return itemstack end, }) minetest.register_node("default:sand_with_kelp", { description = S("Kelp"), drawtype = "plantlike_rooted", waving = 1, tiles = {"default_sand.png"}, special_tiles = {{name = "default_kelp.png", tileable_vertical = true}}, inventory_image = "default_kelp.png", wield_image = "default_kelp.png", paramtype = "light", paramtype2 = "leveled", groups = {snappy = 3}, selection_box = { type = "fixed", fixed = { {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, {-2/16, 0.5, -2/16, 2/16, 3.5, 2/16}, }, }, node_dig_prediction = "default:sand", node_placement_prediction = "", sounds = default.node_sound_sand_defaults({ dig = {name = "default_dig_snappy", gain = 0.2}, dug = {name = "default_grass_footstep", gain = 0.25}, }), on_place = function(itemstack, placer, pointed_thing) -- Call on_rightclick if the pointed node defines it if pointed_thing.type == "node" and placer and not placer:get_player_control().sneak then local node_ptu = minetest.get_node(pointed_thing.under) local def_ptu = minetest.registered_nodes[node_ptu.name] if def_ptu and def_ptu.on_rightclick then return def_ptu.on_rightclick(pointed_thing.under, node_ptu, placer, itemstack, pointed_thing) end end local pos = pointed_thing.under if minetest.get_node(pos).name ~= "default:sand" then return itemstack end local height = math.random(4, 6) local pos_top = {x = pos.x, y = pos.y + height, z = pos.z} local node_top = minetest.get_node(pos_top) local def_top = minetest.registered_nodes[node_top.name] local player_name = placer:get_player_name() if def_top and def_top.liquidtype == "source" and minetest.get_item_group(node_top.name, "water") > 0 then if not minetest.is_protected(pos, player_name) and not minetest.is_protected(pos_top, player_name) then minetest.set_node(pos, {name = "default:sand_with_kelp", param2 = height * 16}) if not minetest.is_creative_enabled(player_name) then itemstack:take_item() end else minetest.chat_send_player(player_name, "Node is protected") minetest.record_protection_violation(pos, player_name) end end return itemstack end, after_destruct = function(pos, oldnode) minetest.set_node(pos, {name = "default:sand"}) end }) -- -- Corals -- local function coral_on_place(itemstack, placer, pointed_thing) if pointed_thing.type ~= "node" or not placer then return itemstack end local player_name = placer:get_player_name() local pos_under = pointed_thing.under local pos_above = pointed_thing.above local node_under = minetest.get_node(pos_under) local def_under = minetest.registered_nodes[node_under.name] if def_under and def_under.on_rightclick and not placer:get_player_control().sneak then return def_under.on_rightclick(pos_under, node_under, placer, itemstack, pointed_thing) or itemstack end if node_under.name ~= "default:coral_skeleton" or minetest.get_node(pos_above).name ~= "default:water_source" then return itemstack end if minetest.is_protected(pos_under, player_name) or minetest.is_protected(pos_above, player_name) then default.log_player_action(placer, "tried to place", itemstack:get_name(), "at protected position", pos_under) minetest.record_protection_violation(pos_under, player_name) return itemstack end node_under.name = itemstack:get_name() minetest.set_node(pos_under, node_under) if not minetest.is_creative_enabled(player_name) then itemstack:take_item() end return itemstack end minetest.register_node("default:coral_green", { description = S("Green Coral"), drawtype = "plantlike_rooted", waving = 1, paramtype = "light", tiles = {"default_coral_skeleton.png"}, special_tiles = {{name = "default_coral_green.png", tileable_vertical = true}}, inventory_image = "default_coral_green.png", wield_image = "default_coral_green.png", groups = {snappy = 3}, selection_box = { type = "fixed", fixed = { {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, }, }, node_dig_prediction = "default:coral_skeleton", node_placement_prediction = "", sounds = default.node_sound_stone_defaults({ dig = {name = "default_dig_snappy", gain = 0.2}, dug = {name = "default_grass_footstep", gain = 0.25}, }), on_place = coral_on_place, after_destruct = function(pos, oldnode) minetest.set_node(pos, {name = "default:coral_skeleton"}) end, }) minetest.register_node("default:coral_pink", { description = S("Pink Coral"), drawtype = "plantlike_rooted", waving = 1, paramtype = "light", tiles = {"default_coral_skeleton.png"}, special_tiles = {{name = "default_coral_pink.png", tileable_vertical = true}}, inventory_image = "default_coral_pink.png", wield_image = "default_coral_pink.png", groups = {snappy = 3}, selection_box = { type = "fixed", fixed = { {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, }, }, node_dig_prediction = "default:coral_skeleton", node_placement_prediction = "", sounds = default.node_sound_stone_defaults({ dig = {name = "default_dig_snappy", gain = 0.2}, dug = {name = "default_grass_footstep", gain = 0.25}, }), on_place = coral_on_place, after_destruct = function(pos, oldnode) minetest.set_node(pos, {name = "default:coral_skeleton"}) end, }) minetest.register_node("default:coral_cyan", { description = S("Cyan Coral"), drawtype = "plantlike_rooted", waving = 1, paramtype = "light", tiles = {"default_coral_skeleton.png"}, special_tiles = {{name = "default_coral_cyan.png", tileable_vertical = true}}, inventory_image = "default_coral_cyan.png", wield_image = "default_coral_cyan.png", groups = {snappy = 3}, selection_box = { type = "fixed", fixed = { {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16}, }, }, node_dig_prediction = "default:coral_skeleton", node_placement_prediction = "", sounds = default.node_sound_stone_defaults({ dig = {name = "default_dig_snappy", gain = 0.2}, dug = {name = "default_grass_footstep", gain = 0.25}, }), on_place = coral_on_place, after_destruct = function(pos, oldnode) minetest.set_node(pos, {name = "default:coral_skeleton"}) end, }) minetest.register_node("default:coral_brown", { description = S("Brown Coral"), tiles = {"default_coral_brown.png"}, groups = {cracky = 3}, drop = "default:coral_skeleton", sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:coral_orange", { description = S("Orange Coral"), tiles = {"default_coral_orange.png"}, groups = {cracky = 3}, drop = "default:coral_skeleton", sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:coral_skeleton", { description = S("Coral Skeleton"), tiles = {"default_coral_skeleton.png"}, groups = {cracky = 3}, sounds = default.node_sound_stone_defaults(), }) -- -- Liquids -- minetest.register_node("default:water_source", { description = S("Water Source"), drawtype = "liquid", waving = 3, tiles = { { name = "default_water_source_animated.png", backface_culling = false, animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 2.0, }, }, { name = "default_water_source_animated.png", backface_culling = true, animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 2.0, }, }, }, use_texture_alpha = "blend", paramtype = "light", walkable = false, pointable = false, diggable = false, buildable_to = true, is_ground_content = false, drop = "", drowning = 1, liquidtype = "source", liquid_alternative_flowing = "default:water_flowing", liquid_alternative_source = "default:water_source", liquid_viscosity = 1, post_effect_color = {a = 103, r = 30, g = 60, b = 90}, groups = {water = 3, liquid = 3, cools_lava = 1}, sounds = default.node_sound_water_defaults(), }) minetest.register_node("default:water_flowing", { description = S("Flowing Water"), drawtype = "flowingliquid", waving = 3, tiles = {"default_water.png"}, special_tiles = { { name = "default_water_flowing_animated.png", backface_culling = false, animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 0.5, }, }, { name = "default_water_flowing_animated.png", backface_culling = true, animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 0.5, }, }, }, use_texture_alpha = "blend", paramtype = "light", paramtype2 = "flowingliquid", walkable = false, pointable = false, diggable = false, buildable_to = true, is_ground_content = false, drop = "", drowning = 1, liquidtype = "flowing", liquid_alternative_flowing = "default:water_flowing", liquid_alternative_source = "default:water_source", liquid_viscosity = 1, post_effect_color = {a = 103, r = 30, g = 60, b = 90}, groups = {water = 3, liquid = 3, not_in_creative_inventory = 1, cools_lava = 1}, sounds = default.node_sound_water_defaults(), }) minetest.register_node("default:river_water_source", { description = S("River Water Source"), drawtype = "liquid", tiles = { { name = "default_river_water_source_animated.png", backface_culling = false, animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 2.0, }, }, { name = "default_river_water_source_animated.png", backface_culling = true, animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 2.0, }, }, }, use_texture_alpha = "blend", paramtype = "light", walkable = false, pointable = false, diggable = false, buildable_to = true, is_ground_content = false, drop = "", drowning = 1, liquidtype = "source", liquid_alternative_flowing = "default:river_water_flowing", liquid_alternative_source = "default:river_water_source", liquid_viscosity = 1, -- Not renewable to avoid horizontal spread of water sources in sloping -- rivers that can cause water to overflow riverbanks and cause floods. -- River water source is instead made renewable by the 'force renew' -- option used in the 'bucket' mod by the river water bucket. liquid_renewable = false, liquid_range = 2, post_effect_color = {a = 103, r = 30, g = 76, b = 90}, groups = {water = 3, liquid = 3, cools_lava = 1}, sounds = default.node_sound_water_defaults(), }) minetest.register_node("default:river_water_flowing", { description = S("Flowing River Water"), drawtype = "flowingliquid", tiles = {"default_river_water.png"}, special_tiles = { { name = "default_river_water_flowing_animated.png", backface_culling = false, animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 0.5, }, }, { name = "default_river_water_flowing_animated.png", backface_culling = true, animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 0.5, }, }, }, use_texture_alpha = "blend", paramtype = "light", paramtype2 = "flowingliquid", walkable = false, pointable = false, diggable = false, buildable_to = true, is_ground_content = false, drop = "", drowning = 1, liquidtype = "flowing", liquid_alternative_flowing = "default:river_water_flowing", liquid_alternative_source = "default:river_water_source", liquid_viscosity = 1, liquid_renewable = false, liquid_range = 2, post_effect_color = {a = 103, r = 30, g = 76, b = 90}, groups = {water = 3, liquid = 3, not_in_creative_inventory = 1, cools_lava = 1}, sounds = default.node_sound_water_defaults(), }) minetest.register_node("default:lava_source", { description = S("Lava Source"), drawtype = "liquid", tiles = { { name = "default_lava_source_animated.png", backface_culling = false, animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 3.0, }, }, { name = "default_lava_source_animated.png", backface_culling = true, animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 3.0, }, }, }, paramtype = "light", light_source = default.LIGHT_MAX - 1, walkable = false, pointable = false, diggable = false, buildable_to = true, is_ground_content = false, drop = "", drowning = 1, liquidtype = "source", liquid_alternative_flowing = "default:lava_flowing", liquid_alternative_source = "default:lava_source", liquid_viscosity = 7, liquid_renewable = false, damage_per_second = 4 * 2, post_effect_color = {a = 191, r = 255, g = 64, b = 0}, groups = {lava = 3, liquid = 2, igniter = 1}, }) minetest.register_node("default:lava_flowing", { description = S("Flowing Lava"), drawtype = "flowingliquid", tiles = {"default_lava.png"}, special_tiles = { { name = "default_lava_flowing_animated.png", backface_culling = false, animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 3.3, }, }, { name = "default_lava_flowing_animated.png", backface_culling = true, animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 3.3, }, }, }, paramtype = "light", paramtype2 = "flowingliquid", light_source = default.LIGHT_MAX - 1, walkable = false, pointable = false, diggable = false, buildable_to = true, is_ground_content = false, drop = "", drowning = 1, liquidtype = "flowing", liquid_alternative_flowing = "default:lava_flowing", liquid_alternative_source = "default:lava_source", liquid_viscosity = 7, liquid_renewable = false, damage_per_second = 4 * 2, post_effect_color = {a = 191, r = 255, g = 64, b = 0}, groups = {lava = 3, liquid = 2, igniter = 1, not_in_creative_inventory = 1}, }) -- -- Tools / "Advanced" crafting / Non-"natural" -- local bookshelf_formspec = "size[8,7;]" .. "list[context;books;0,0.3;8,2;]" .. "list[current_player;main;0,2.85;8,1;]" .. "list[current_player;main;0,4.08;8,3;8]" .. "listring[context;books]" .. "listring[current_player;main]" .. default.get_hotbar_bg(0,2.85) local function update_bookshelf(pos) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() local invlist = inv:get_list("books") local formspec = bookshelf_formspec -- Inventory slots overlay local bx, by = 0, 0.3 local n_written, n_empty = 0, 0 for i = 1, 16 do if i == 9 then bx = 0 by = by + 1 end local stack = invlist[i] if stack:is_empty() then formspec = formspec .. "image[" .. bx .. "," .. by .. ";1,1;default_bookshelf_slot.png]" else local metatable = stack:get_meta():to_table() or {} if metatable.fields and metatable.fields.text then n_written = n_written + stack:get_count() else n_empty = n_empty + stack:get_count() end end bx = bx + 1 end meta:set_string("formspec", formspec) if n_written + n_empty == 0 then meta:set_string("infotext", S("Empty Bookshelf")) else meta:set_string("infotext", S("Bookshelf (@1 written, @2 empty books)", n_written, n_empty)) end end local default_bookshelf_def = { description = S("Bookshelf"), tiles = {"default_wood.png", "default_wood.png", "default_wood.png", "default_wood.png", "default_bookshelf.png", "default_bookshelf.png"}, paramtype2 = "facedir", is_ground_content = false, groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, sounds = default.node_sound_wood_defaults(), on_construct = function(pos) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() inv:set_size("books", 8 * 2) update_bookshelf(pos) end, can_dig = function(pos,player) local inv = minetest.get_meta(pos):get_inventory() return inv:is_empty("books") end, allow_metadata_inventory_put = function(pos, listname, index, stack) if minetest.get_item_group(stack:get_name(), "book") ~= 0 then return stack:get_count() end return 0 end, on_metadata_inventory_put = function(pos) update_bookshelf(pos) end, on_metadata_inventory_take = function(pos) update_bookshelf(pos) end, on_blast = function(pos) local drops = {} default.get_inventory_drops(pos, "books", drops) drops[#drops+1] = "default:bookshelf" minetest.remove_node(pos) return drops end, } default.set_inventory_action_loggers(default_bookshelf_def, "bookshelf") minetest.register_node("default:bookshelf", default_bookshelf_def) local function register_sign(material, desc, def) minetest.register_node("default:sign_wall_" .. material, { description = desc, drawtype = "nodebox", tiles = {"default_sign_wall_" .. material .. ".png"}, inventory_image = "default_sign_" .. material .. ".png", wield_image = "default_sign_" .. material .. ".png", paramtype = "light", paramtype2 = "wallmounted", sunlight_propagates = true, is_ground_content = false, walkable = false, use_texture_alpha = "opaque", node_box = { type = "wallmounted", wall_top = {-0.4375, 0.4375, -0.3125, 0.4375, 0.5, 0.3125}, wall_bottom = {-0.4375, -0.5, -0.3125, 0.4375, -0.4375, 0.3125}, wall_side = {-0.5, -0.3125, -0.4375, -0.4375, 0.3125, 0.4375}, }, groups = def.groups, legacy_wallmounted = true, sounds = def.sounds, on_construct = function(pos) local meta = minetest.get_meta(pos) meta:set_string("formspec", "field[text;;${text}]") end, on_receive_fields = function(pos, formname, fields, sender) local player_name = sender:get_player_name() if minetest.is_protected(pos, player_name) then minetest.record_protection_violation(pos, player_name) return end local text = fields.text if not text then return end if #text > 512 then minetest.chat_send_player(player_name, S("Text too long")) return end text = text:gsub("[%z-\8\11-\31\127]", "") -- strip naughty control characters (keeps \t and \n) default.log_player_action(sender, ("wrote %q to the sign at"):format(text), pos) local meta = minetest.get_meta(pos) meta:set_string("text", text) if #text > 0 then meta:set_string("infotext", S('"@1"', text)) else meta:set_string("infotext", '') end end, }) end register_sign("wood", S("Wooden Sign"), { sounds = default.node_sound_wood_defaults(), groups = {choppy = 2, attached_node = 1, flammable = 2, oddly_breakable_by_hand = 3} }) register_sign("steel", S("Steel Sign"), { sounds = default.node_sound_metal_defaults(), groups = {cracky = 2, attached_node = 1} }) minetest.register_node("default:ladder_wood", { description = S("Wooden Ladder"), drawtype = "signlike", tiles = {"default_ladder_wood.png"}, inventory_image = "default_ladder_wood.png", wield_image = "default_ladder_wood.png", paramtype = "light", paramtype2 = "wallmounted", sunlight_propagates = true, walkable = false, climbable = true, is_ground_content = false, selection_box = { type = "wallmounted", --wall_top = = --wall_bottom = = --wall_side = = }, groups = {choppy = 2, oddly_breakable_by_hand = 3, flammable = 2}, legacy_wallmounted = true, sounds = default.node_sound_wood_defaults(), }) minetest.register_node("default:ladder_steel", { description = S("Steel Ladder"), drawtype = "signlike", tiles = {"default_ladder_steel.png"}, inventory_image = "default_ladder_steel.png", wield_image = "default_ladder_steel.png", paramtype = "light", paramtype2 = "wallmounted", sunlight_propagates = true, walkable = false, climbable = true, is_ground_content = false, selection_box = { type = "wallmounted", --wall_top = = --wall_bottom = = --wall_side = = }, groups = {cracky = 2}, sounds = default.node_sound_metal_defaults(), }) default.register_fence("default:fence_wood", { description = S("Apple Wood Fence"), texture = "default_fence_wood.png", inventory_image = "default_fence_overlay.png^default_wood.png^" .. "default_fence_overlay.png^[makealpha:255,126,126", wield_image = "default_fence_overlay.png^default_wood.png^" .. "default_fence_overlay.png^[makealpha:255,126,126", material = "default:wood", groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, sounds = default.node_sound_wood_defaults() }) default.register_fence("default:fence_acacia_wood", { description = S("Acacia Wood Fence"), texture = "default_fence_acacia_wood.png", inventory_image = "default_fence_overlay.png^default_acacia_wood.png^" .. "default_fence_overlay.png^[makealpha:255,126,126", wield_image = "default_fence_overlay.png^default_acacia_wood.png^" .. "default_fence_overlay.png^[makealpha:255,126,126", material = "default:acacia_wood", groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, sounds = default.node_sound_wood_defaults() }) default.register_fence("default:fence_junglewood", { description = S("Jungle Wood Fence"), texture = "default_fence_junglewood.png", inventory_image = "default_fence_overlay.png^default_junglewood.png^" .. "default_fence_overlay.png^[makealpha:255,126,126", wield_image = "default_fence_overlay.png^default_junglewood.png^" .. "default_fence_overlay.png^[makealpha:255,126,126", material = "default:junglewood", groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, sounds = default.node_sound_wood_defaults() }) default.register_fence("default:fence_pine_wood", { description = S("Pine Wood Fence"), texture = "default_fence_pine_wood.png", inventory_image = "default_fence_overlay.png^default_pine_wood.png^" .. "default_fence_overlay.png^[makealpha:255,126,126", wield_image = "default_fence_overlay.png^default_pine_wood.png^" .. "default_fence_overlay.png^[makealpha:255,126,126", material = "default:pine_wood", groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, sounds = default.node_sound_wood_defaults() }) default.register_fence("default:fence_aspen_wood", { description = S("Aspen Wood Fence"), texture = "default_fence_aspen_wood.png", inventory_image = "default_fence_overlay.png^default_aspen_wood.png^" .. "default_fence_overlay.png^[makealpha:255,126,126", wield_image = "default_fence_overlay.png^default_aspen_wood.png^" .. "default_fence_overlay.png^[makealpha:255,126,126", material = "default:aspen_wood", groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, sounds = default.node_sound_wood_defaults() }) default.register_fence_rail("default:fence_rail_wood", { description = S("Apple Wood Fence Rail"), texture = "default_fence_rail_wood.png", inventory_image = "default_fence_rail_overlay.png^default_wood.png^" .. "default_fence_rail_overlay.png^[makealpha:255,126,126", wield_image = "default_fence_rail_overlay.png^default_wood.png^" .. "default_fence_rail_overlay.png^[makealpha:255,126,126", material = "default:wood", groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, sounds = default.node_sound_wood_defaults() }) default.register_fence_rail("default:fence_rail_acacia_wood", { description = S("Acacia Wood Fence Rail"), texture = "default_fence_rail_acacia_wood.png", inventory_image = "default_fence_rail_overlay.png^default_acacia_wood.png^" .. "default_fence_rail_overlay.png^[makealpha:255,126,126", wield_image = "default_fence_rail_overlay.png^default_acacia_wood.png^" .. "default_fence_rail_overlay.png^[makealpha:255,126,126", material = "default:acacia_wood", groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, sounds = default.node_sound_wood_defaults() }) default.register_fence_rail("default:fence_rail_junglewood", { description = S("Jungle Wood Fence Rail"), texture = "default_fence_rail_junglewood.png", inventory_image = "default_fence_rail_overlay.png^default_junglewood.png^" .. "default_fence_rail_overlay.png^[makealpha:255,126,126", wield_image = "default_fence_rail_overlay.png^default_junglewood.png^" .. "default_fence_rail_overlay.png^[makealpha:255,126,126", material = "default:junglewood", groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, sounds = default.node_sound_wood_defaults() }) default.register_fence_rail("default:fence_rail_pine_wood", { description = S("Pine Wood Fence Rail"), texture = "default_fence_rail_pine_wood.png", inventory_image = "default_fence_rail_overlay.png^default_pine_wood.png^" .. "default_fence_rail_overlay.png^[makealpha:255,126,126", wield_image = "default_fence_rail_overlay.png^default_pine_wood.png^" .. "default_fence_rail_overlay.png^[makealpha:255,126,126", material = "default:pine_wood", groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, sounds = default.node_sound_wood_defaults() }) default.register_fence_rail("default:fence_rail_aspen_wood", { description = S("Aspen Wood Fence Rail"), texture = "default_fence_rail_aspen_wood.png", inventory_image = "default_fence_rail_overlay.png^default_aspen_wood.png^" .. "default_fence_rail_overlay.png^[makealpha:255,126,126", wield_image = "default_fence_rail_overlay.png^default_aspen_wood.png^" .. "default_fence_rail_overlay.png^[makealpha:255,126,126", material = "default:aspen_wood", groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 2}, sounds = default.node_sound_wood_defaults() }) minetest.register_node("default:glass", { description = S("Glass"), drawtype = "glasslike_framed_optional", tiles = {"default_glass.png", "default_glass_detail.png"}, use_texture_alpha = "clip", -- only needed for stairs API paramtype = "light", sunlight_propagates = true, is_ground_content = false, groups = {cracky = 3, oddly_breakable_by_hand = 3}, sounds = default.node_sound_glass_defaults(), }) minetest.register_node("default:obsidian_glass", { description = S("Obsidian Glass"), drawtype = "glasslike_framed_optional", tiles = {"default_obsidian_glass.png", "default_obsidian_glass_detail.png"}, use_texture_alpha = "clip", -- only needed for stairs API paramtype = "light", is_ground_content = false, sunlight_propagates = true, sounds = default.node_sound_glass_defaults(), groups = {cracky = 3}, }) minetest.register_node("default:brick", { description = S("Brick Block"), paramtype2 = "facedir", place_param2 = 0, tiles = { "default_brick.png^[transformFX", "default_brick.png", }, is_ground_content = false, groups = {cracky = 3}, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:meselamp", { description = S("Mese Lamp"), drawtype = "glasslike", tiles = {"default_meselamp.png"}, paramtype = "light", sunlight_propagates = true, is_ground_content = false, groups = {cracky = 3, oddly_breakable_by_hand = 3}, sounds = default.node_sound_glass_defaults(), light_source = default.LIGHT_MAX, }) default.register_mesepost("default:mese_post_light", { description = S("Apple Wood Mese Post Light"), texture = "default_fence_wood.png", material = "default:wood", }) default.register_mesepost("default:mese_post_light_acacia_wood", { description = S("Acacia Wood Mese Post Light"), texture = "default_fence_acacia_wood.png", material = "default:acacia_wood", }) default.register_mesepost("default:mese_post_light_junglewood", { description = S("Jungle Wood Mese Post Light"), texture = "default_fence_junglewood.png", material = "default:junglewood", }) default.register_mesepost("default:mese_post_light_pine_wood", { description = S("Pine Wood Mese Post Light"), texture = "default_fence_pine_wood.png", material = "default:pine_wood", }) default.register_mesepost("default:mese_post_light_aspen_wood", { description = S("Aspen Wood Mese Post Light"), texture = "default_fence_aspen_wood.png", material = "default:aspen_wood", }) -- -- Misc -- minetest.register_node("default:cloud", { description = S("Cloud"), tiles = {"default_cloud.png"}, is_ground_content = false, sounds = default.node_sound_defaults(), groups = {not_in_creative_inventory = 1}, }) -- -- register trees for leafdecay -- if minetest.get_mapgen_setting("mg_name") == "v6" then default.register_leafdecay({ trunks = {"default:tree"}, leaves = {"default:apple", "default:leaves"}, radius = 2, }) default.register_leafdecay({ trunks = {"default:jungletree"}, leaves = {"default:jungleleaves"}, radius = 3, }) else default.register_leafdecay({ trunks = {"default:tree"}, leaves = {"default:apple", "default:leaves"}, radius = 3, }) default.register_leafdecay({ trunks = {"default:jungletree"}, leaves = {"default:jungleleaves"}, radius = 2, }) end default.register_leafdecay({ trunks = {"default:pine_tree"}, leaves = {"default:pine_needles"}, radius = 3, }) default.register_leafdecay({ trunks = {"default:acacia_tree"}, leaves = {"default:acacia_leaves"}, radius = 2, }) default.register_leafdecay({ trunks = {"default:aspen_tree"}, leaves = {"default:aspen_leaves"}, radius = 3, }) default.register_leafdecay({ trunks = {"default:bush_stem"}, leaves = {"default:bush_leaves"}, radius = 1, }) default.register_leafdecay({ trunks = {"default:acacia_bush_stem"}, leaves = {"default:acacia_bush_leaves"}, radius = 1, }) default.register_leafdecay({ trunks = {"default:pine_bush_stem"}, leaves = {"default:pine_bush_needles"}, radius = 1, })