local S = minetest.get_translator("sf_nodes") local WOOD_WALL_LIMIT = 6/16 local TABLE_PLATE_LIMIT = 7/16 local TABLE_LEG_LIMIT = 7/16 local TORCH_LIGHT = 8 local PROTRUDING_LEAVES_MULTIPLY_COLOR = "#d0d0d0" local EDITOR = minetest.settings:get_bool("sf_editor", false) local make_leveled_node = function(nodename, description) local def = minetest.registered_nodes[nodename] local new_groups if def.groups then new_groups = table.copy(def.groups) else new_groups = {} end new_groups.leveled_node = 1 minetest.register_node(nodename.."_level", { description = description, tiles = def.tiles, groups = new_groups, drawtype = "nodebox", node_box = { type = "leveled", fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, }, use_texture_alpha = def.use_texture_alpha, walkable = def.walkable, paramtype = "light", paramtype2 = "leveled", place_param2 = 32, sounds = def.sounds, -- Store name of original node _sf_unleveled_node_variant = nodename, }) minetest.override_item(nodename, { -- Store name of leveled node in the original node _sf_leveled_node_variant = nodename.."_level" }) end minetest.register_node("sf_nodes:dirt", { description = S("Dirt"), tiles = {{ name = "sf_nodes_dirt.png", align_style="world", scale=2 }}, sounds = sf_sounds.node_sound_dirt_defaults(), groups = { editor_breakable = 1 }, }) make_leveled_node("sf_nodes:dirt", S("Leveled Dirt")) minetest.register_node("sf_nodes:mud", { description = S("Mud"), tiles = { "sf_nodes_mud.png" }, groups = { editor_breakable = 1, mud = 1 }, sounds = sf_sounds.node_sound_mud_defaults(), }) make_leveled_node("sf_nodes:mud", S("Leveled Mud")) minetest.register_node("sf_nodes:snow", { description = S("Snow"), tiles = { "sf_nodes_snow.png" }, groups = { editor_breakable = 1, snow = 1 }, sounds = sf_sounds.node_sound_snow_defaults(), }) make_leveled_node("sf_nodes:snow", S("Leveled Snow")) minetest.register_node("sf_nodes:gravel", { description = S("Gravel"), tiles = { "sf_nodes_gravel.png" }, groups = { editor_breakable = 1 }, sounds = sf_sounds.node_sound_gravel_defaults(), }) make_leveled_node("sf_nodes:gravel", S("Leveled Gravel")) minetest.register_node("sf_nodes:stone", { description = S("Stone"), tiles = { { name = "sf_nodes_stone.png", align_style = "world", scale = 2 } }, groups = { editor_breakable = 1 }, sounds = sf_sounds.node_sound_stone_defaults(), }) make_leveled_node("sf_nodes:stone", S("Leveled Stone")) minetest.register_node("sf_nodes:stone_tile", { description = S("Stone Tile"), tiles = { { name = "sf_nodes_stone_tile.png", align_style = "world", scale = 2 } }, groups = { editor_breakable = 1 }, sounds = sf_sounds.node_sound_stone_defaults(), }) minetest.register_node("sf_nodes:stone_tile_big", { description = S("Big Stone Tile"), tiles = { { name = "sf_nodes_stone_tile_big.png", align_style = "world", scale = 2 }, { name = "sf_nodes_stone_tile_big.png", align_style = "world", scale = 2 }, { name = "sf_nodes_stone_smooth.png", align_style = "world", scale = 2 }, }, groups = { editor_breakable = 1 }, sounds = sf_sounds.node_sound_stone_defaults(), }) minetest.register_node("sf_nodes:stone_tile_huge", { description = S("Huge Stone Tile"), tiles = { { name = "sf_nodes_stone_tile_huge.png", align_style = "world", scale = 2 }, { name = "sf_nodes_stone_tile_huge.png", align_style = "world", scale = 2 }, { name = "sf_nodes_stone_smooth.png", align_style = "world", scale = 2 }, }, groups = { editor_breakable = 1 }, sounds = sf_sounds.node_sound_stone_defaults(), }) minetest.register_node("sf_nodes:stone_brick", { description = S("Stone Brick"), tiles = { { name = "sf_nodes_stone_brick.png", align_style = "world", scale = 2 } }, groups = { editor_breakable = 1 }, sounds = sf_sounds.node_sound_stone_defaults(), }) minetest.register_node("sf_nodes:stone_smooth", { description = S("Smooth Stone"), tiles = { { name = "sf_nodes_stone_smooth.png", align_style = "world", scale = 2 } }, groups = { editor_breakable = 1 }, sounds = sf_sounds.node_sound_stone_defaults(), }) make_leveled_node("sf_nodes:stone_smooth", S("Leveled Smooth Stone")) local pebbles = { 1, 2, 3, 4, 5, 6, 7 } for p=1, #pebbles do local size = pebbles[p] minetest.register_node("sf_nodes:pebble_"..size, { description = S("Pebble (size @1)", size), tiles = { { name = "sf_nodes_stone.png", align_style = "world", scale = 2 } }, paramtype = "light", drawtype = "nodebox", node_box = { type = "fixed", fixed = { -size/16, -0.5, -size/16, size/16, (size/16)-0.5, size/16 } }, groups = { editor_breakable = 1 }, sounds = sf_sounds.node_sound_stone_defaults(), }) end minetest.register_node("sf_nodes:pedestal", { description = S("Pedestal"), tiles = { "sf_nodes_pedestal_top.png", "sf_nodes_pedestal_side.png" }, groups = { editor_breakable = 1 }, drawtype = "nodebox", paramtype = "light", node_box = { type = "fixed", fixed = { { -0.5, 6/16, -0.5, 0.5, 0.5, 0.5 }, -- plate { -5/16, -7/16, -5/16, 5/16, 6/16, 5/16 }, -- body { -0.5, -0.5, -0.5, 0.5, -7/16, 0.5 }, -- base }, }, sounds = sf_sounds.node_sound_stone_defaults(), }) minetest.register_node("sf_nodes:concrete", { description = S("Concrete"), tiles = { "sf_nodes_concrete.png" }, groups = { editor_breakable = 1 }, sounds = sf_sounds.node_sound_stone_defaults(), }) make_leveled_node("sf_nodes:concrete", S("Leveled Concrete")) minetest.register_node("sf_nodes:tree", { description = S("Tree"), paramtype2 = "facedir", tiles = { "sf_nodes_tree_top.png", "sf_nodes_tree_top.png", "sf_nodes_tree.png", }, groups = { editor_breakable = 1 }, sounds = sf_sounds.node_sound_tree_defaults(), on_place = function(itemstack, placer, pointed_thing) return minetest.rotate_and_place(itemstack, placer, pointed_thing, EDITOR) end, }) local small_tree_names = { [2] = S("Tiny Tree"), [4] = S("Mini Tree"), [6] = S("Small Tree"), } for i=2, 6, 2 do minetest.register_node("sf_nodes:tree_small_"..i, { description = small_tree_names[i], paramtype2 = "facedir", tiles = { "sf_nodes_tree_top_small_"..i..".png", "sf_nodes_tree_top_small_"..i..".png", "sf_nodes_tree_small_"..i..".png", }, paramtype = "light", drawtype = "nodebox", node_box = { type = "fixed", fixed = { -i/16, -0.5, -i/16, i/16, 0.5, i/16 }, }, groups = { editor_breakable = 1 }, sounds = sf_sounds.node_sound_tree_defaults(), on_place = function(itemstack, placer, pointed_thing) return minetest.rotate_and_place(itemstack, placer, pointed_thing, EDITOR) end, }) end minetest.register_node("sf_nodes:tree_spawner1", { description = S("1×1 Tree Spawner"), tiles = { "sf_nodes_tree_spawner1_top.png", "sf_nodes_tree_spawner1_top.png", "sf_nodes_tree_spawner1.png", }, groups = { editor_breakable = 1, tree_spawner = 1 }, sounds = sf_sounds.node_sound_tree_defaults(), }) minetest.register_node("sf_nodes:tree_spawner2", { description = S("2×2 Tree Spawner"), tiles = { "sf_nodes_tree_spawner2_top.png", "sf_nodes_tree_spawner2_top.png^[transformFY", "sf_nodes_tree_spawner2.png", }, groups = { editor_breakable = 1, tree_spawner = 2 }, sounds = sf_sounds.node_sound_tree_defaults(), }) minetest.register_node("sf_nodes:leaves", { description = S("Leaves"), drawtype = "allfaces_optional", paramtype = "light", tiles = { "sf_nodes_leaves.png" }, groups = { editor_breakable = 1 }, sounds = sf_sounds.node_sound_leaves_defaults(), }) minetest.register_node("sf_nodes:leaves_protrusion", { description = S("Protruding Leaves"), drawtype = "plantlike", paramtype = "light", paramtype2 = "wallmounted", sunlight_propagates = true, tiles = { "sf_nodes_leaves_plantlike.png^[multiply:"..PROTRUDING_LEAVES_MULTIPLY_COLOR }, groups = { editor_breakable = 1 }, selection_box = { type = "fixed", fixed = { -0.5, -0.5, -0.5, 0.5, 1/16, 0.5 }, }, visual_scale = 1.3, sounds = sf_sounds.node_sound_leaves_defaults(), }) minetest.register_node("sf_nodes:conifer_needles", { description = S("Conifer Needles"), drawtype = "allfaces_optional", paramtype = "light", tiles = { "sf_nodes_conifer_needles.png" }, groups = { editor_breakable = 1 }, sounds = sf_sounds.node_sound_leaves_defaults(), }) minetest.register_node("sf_nodes:conifer_needles_protrusion", { description = S("Protruding Conifer Needles"), paramtype = "light", paramtype2 = "wallmounted", groups = { editor_breakable = 1 }, tiles = { "sf_nodes_conifer_needles_plantlike.png^[multiply:"..PROTRUDING_LEAVES_MULTIPLY_COLOR }, drawtype = "plantlike", walkable = false, visual_scale = 1.2, selection_box = { type = "fixed", fixed = { -0.5, -0.5, -0.5, 0.5, 0, 0.5 }, }, }) minetest.register_node("sf_nodes:wood", { description = S("Wooden Planks"), tiles = { "sf_nodes_wood.png" }, groups = { editor_breakable = 1 }, sounds = sf_sounds.node_sound_wood_defaults(), }) minetest.register_node("sf_nodes:plank", { description = S("Wooden Plank"), tiles = { "sf_nodes_wood_plank.png" }, paramtype = "light", paramtype2 = "4dir", drawtype = "nodebox", node_box = { type = "fixed", fixed = { -0.5, 6/16, -0.5, 0.5, 0.5, 0.5 }, }, groups = { editor_breakable = 1 }, sounds = sf_sounds.node_sound_wood_defaults(), }) minetest.register_node("sf_nodes:plank_small", { description = S("Small Wooden Plank"), tiles = { "sf_nodes_wood_plank_small.png" }, paramtype = "light", sunlight_propagates = true, drawtype = "nodebox", paramtype2 = "4dir", node_box = { type = "fixed", fixed = { -0.5, 6/16, -2/16, 0.5, 0.5, 2/16 }, }, groups = { editor_breakable = 1 }, sounds = sf_sounds.node_sound_wood_defaults(), }) minetest.register_node("sf_nodes:wood_wall", { description = S("Wooden Wall"), tiles = { { name = "sf_nodes_wood.png", align_style = "world" } }, drawtype = "nodebox", paramtype = "light", paramtype2 = "4dir", node_box = { type = "fixed", fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, -WOOD_WALL_LIMIT }, }, groups = { editor_breakable = 1 }, sounds = sf_sounds.node_sound_wood_defaults(), }) minetest.register_node("sf_nodes:wood_wall_corner_inner", { description = S("Inner Wooden Corner Wall"), tiles = { { name = "sf_nodes_wood.png", align_style = "world" } }, drawtype = "nodebox", paramtype = "light", paramtype2 = "4dir", node_box = { type = "fixed", fixed = { { -0.5, -0.5, -0.5, -WOOD_WALL_LIMIT, 0.5, 0.5 }, { -WOOD_WALL_LIMIT, -0.5, -0.5, 0.5, 0.5, -WOOD_WALL_LIMIT } }, }, groups = { editor_breakable = 1 }, sounds = sf_sounds.node_sound_wood_defaults(), }) minetest.register_node("sf_nodes:wood_wall_corner_outer", { description = S("Outer Wooden Corner Wall"), tiles = { { name = "sf_nodes_wood.png", align_style = "world" } }, drawtype = "nodebox", paramtype = "light", paramtype2 = "4dir", node_box = { type = "fixed", fixed = { { WOOD_WALL_LIMIT, -0.5, -0.5, 0.5, 0.5, -WOOD_WALL_LIMIT } }, }, groups = { editor_breakable = 1 }, sounds = sf_sounds.node_sound_wood_defaults(), }) minetest.register_node("sf_nodes:wood_table2_piece", { description = S("Table Piece"), tiles = { { name = "sf_nodes_wood.png", align_style = "world" } }, drawtype = "nodebox", paramtype = "light", paramtype2 = "4dir", node_box = { type = "fixed", fixed = { { -0.5, TABLE_PLATE_LIMIT, -0.5, 0.5, 0.5, 0.5 }, -- plate { -0.5, -0.5, -0.5, -TABLE_LEG_LIMIT, TABLE_PLATE_LIMIT, -TABLE_LEG_LIMIT }, -- leg 1 { -0.5, -0.5, TABLE_LEG_LIMIT, -TABLE_LEG_LIMIT, TABLE_PLATE_LIMIT, 0.5 }, -- leg 2 }, }, groups = { editor_breakable = 1 }, sounds = sf_sounds.node_sound_wood_defaults(), }) local darkness_pointable, darkness_drawtype, darkness_tiles if EDITOR then darkness_pointable = true darkness_drawtype = "allfaces" darkness_tiles = { "sf_nodes_darkness.png" } else darkness_pointable = false darkness_drawtype = "airlike" darkness_tiles = nil end minetest.register_node("sf_nodes:darkness", { description = S("Darkness"), pointable = darkness_pointable, walkable = false, drawtype = darkness_drawtype, tiles = darkness_tiles, paramtype = "light", wield_image = "sf_nodes_darkness.png", inventory_image = "sf_nodes_darkness.png", groups = { editor_breakable = 1 }, }) local make_liquid_node = function(nodename, tile, description, description_puddle) minetest.register_node(nodename, { description = description, walkable = false, tiles = { tile }, drawtype = "liquid", paramtype = "light", use_texture_alpha = "blend", sounds = sf_sounds.node_sound_water_defaults(), liquid_move_physics = true, move_resistance = 1, groups = { editor_breakable = 1 }, }) local def = minetest.registered_nodes[nodename] minetest.register_node(nodename.."_puddle", { description = description_puddle, walkable = false, tiles = { tile, "blank.png" }, groups = { editor_breakable = 1, leveled_node = 1, puddle = 1 }, drawtype = "nodebox", node_box = { type = "leveled", fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, }, use_texture_alpha = "blend", walkable = false, paramtype = "light", paramtype2 = "leveled", place_param2 = 32, sounds = sf_sounds.node_sound_puddle_defaults(), liquid_move_physics = false, move_resistance = 0, }) end make_liquid_node("sf_nodes:water", "sf_nodes_water.png", S("Water"), S("Water Puddle")) make_liquid_node("sf_nodes:dirty_water", "sf_nodes_dirty_water.png", S("Dirty Water"), S("Dirty Water Puddle")) -- HACK: This is a special mud with puddle footstep sounds. -- It may only be placed below puddle nodes because the puddle nodes -- themselves fail to play the puddle sound when placed above a solid node. minetest.register_node("sf_nodes:puddle_mud", { description = S("Puddle Mud"), tiles = { "sf_nodes_puddle_mud.png" }, groups = { editor_breakable = 1, mud = 2 }, sounds = sf_sounds.node_sound_puddle_defaults(), }) minetest.register_node("sf_nodes:torch_floor", { description = S("Torch (floor)"), tiles = { "sf_nodes_torch_floor_top.png", "sf_nodes_torch_floor_bottom.png", "sf_nodes_torch_floor_side.png", }, paramtype = "light", drawtype = "nodebox", node_box = { type = "fixed", fixed = { { -1/16, -0.5, -1/16, 1/16, 0, 1/16 }, -- stick }, }, light_source = TORCH_LIGHT, groups = { editor_breakable = 1, torch = 1 }, walkable = false, }) minetest.register_node("sf_nodes:torch_wall", { description = S("Torch (wall)"), tiles = { "sf_nodes_torch_wall_top.png", "sf_nodes_torch_wall_bottom.png", "sf_nodes_torch_wall_side.png", }, paramtype = "light", paramtype2 = "4dir", drawtype = "nodebox", node_box = { type = "fixed", fixed = { { -1/16, 0, 5/16, 1/16, 1/16, 0.5 }, -- holder 1 { -1/16, -3/16, 5/16, 1/16, -2/16, 0.5 }, -- holder 2 { -1/16, -4/16, 3/16, 1/16, 4/16, 5/16 }, -- stick }, }, light_source = TORCH_LIGHT, groups = { editor_breakable = 1, torch = 1 }, walkable = false, }) minetest.register_node("sf_nodes:ladder", { description = S("Ladder"), tiles = { "sf_nodes_ladder_top.png", "sf_nodes_ladder_bottom.png", "sf_nodes_ladder_side.png", "sf_nodes_ladder_side.png", "sf_nodes_ladder.png", "sf_nodes_ladder.png", }, drawtype = "nodebox", paramtype = "light", sunlight_propagates = true, use_texture_alpha = "clip", paramtype2 = "4dir", walkable = false, climbable = true, groups = { editor_breakable = 1 }, node_box = { type = "fixed", fixed = { { -0.5, -0.5, 6/16, -6/16, 0.5, 0.5 }, -- left stick { 6/16, -0.5, 6/16, 0.5, 0.5, 0.5 }, -- right stick { -6/16, 5/16, 6/16, 6/16, 7/16, 0.5 }, -- rung 1 { -6/16, 1/16, 6/16, 6/16, 3/16, 0.5 }, -- rung 2 { -6/16, -3/16, 6/16, 6/16, -1/16, 0.5 }, -- rung 3 { -6/16, -7/16, 6/16, 6/16, -5/16, 0.5 }, -- rung 4 }, }, selection_box = { type = "fixed", fixed = { -0.5, -0.5, 6/16, 0.5, 0.5, 0.5 }, }, sounds = sf_sounds.node_sound_wood_defaults(), }) minetest.register_node("sf_nodes:fern", { walkable = false, description = S("Fern"), tiles = { "sf_nodes_fern.png" }, drawtype = "plantlike", paramtype = "light", groups = { editor_breakable = 1 }, selection_box = { type = "fixed", fixed = { -6/16, -0.5, -6/16, 6/16, 0.5, 6/16 }, }, waving = 1, }) minetest.register_node("sf_nodes:grass", { walkable = false, description = S("Grass"), tiles = { "sf_nodes_grass.png" }, drawtype = "plantlike", paramtype = "light", groups = { editor_breakable = 1 }, selection_box = { type = "fixed", fixed = { -6/16, -0.5, -6/16, 6/16, 0, 6/16 }, }, waving = 1, }) minetest.register_node("sf_nodes:ivy", { walkable = false, description = S("Ivy"), tiles = { "sf_nodes_ivy.png" }, drawtype = "signlike", paramtype = "light", paramtype2 = "wallmounted", groups = { editor_breakable = 1 }, selection_box = { type = "wallmounted", fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, -7/16 }, }, }) minetest.register_node("sf_nodes:spikeplant", { description = S("Shadow Bush"), paramtype = "light", groups = { editor_breakable = 1 }, tiles = { "sf_nodes_spikeplant.png" }, drawtype = "allfaces_optional", move_resistance = 1, damage_per_second = 1, walkable = true, collision_box = { type = "fixed", fixed = {-6/16, -6/16, -6/16, 6/16, 6/16, 6/16}, }, }) minetest.register_node("sf_nodes:spikeplant_inner", { description = S("Branchy Shadow Bush"), paramtype = "light", groups = { editor_breakable = 1 }, tiles = { "sf_nodes_spikeplant_inner.png" }, drawtype = "allfaces_optional", move_resistance = 2, damage_per_second = 2, walkable = true, collision_box = { type = "fixed", fixed = {-6/16, -6/16, -6/16, 6/16, 6/16, 6/16}, }, }) minetest.register_node("sf_nodes:spikeplant_protrusion", { description = S("Protuding Shadow Bush"), paramtype = "light", groups = { editor_breakable = 1 }, tiles = { "sf_nodes_spikeplant_plantlike.png" }, drawtype = "plantlike", paramtype2 = "wallmounted", move_resistance = 1, walkable = false, damage_per_second = 1, }) minetest.register_node("sf_nodes:spikeplant_angled", { description = S("Angled Shadow Bush"), paramtype = "light", groups = { editor_breakable = 1 }, tiles = { "sf_nodes_spikeplant_plantlike.png" }, drawtype = "plantlike", paramtype2 = "meshoptions", move_resistance = 1, walkable = false, damage_per_second = 1, place_param2 = 4, }) minetest.register_node("sf_nodes:bush", { description = S("Bush"), paramtype = "light", groups = { editor_breakable = 1 }, tiles = { "sf_nodes_bush.png" }, drawtype = "allfaces_optional", collision_box = { type = "fixed", fixed = {-6/16, -6/16, -6/16, 6/16, 6/16, 6/16}, }, }) minetest.register_node("sf_nodes:bush_protrusion", { description = S("Protruding Bush"), paramtype = "light", paramtype2 = "wallmounted", groups = { editor_breakable = 1 }, tiles = { "sf_nodes_bush_plantlike.png^[multiply:"..PROTRUDING_LEAVES_MULTIPLY_COLOR }, drawtype = "plantlike", walkable = false, visual_scale = 1.2, selection_box = { type = "fixed", fixed = {-6/16, -0.5, -6/16, 6/16, 0, 6/16 }, }, })