541 lines
15 KiB
Lua
541 lines
15 KiB
Lua
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 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 = { "sf_nodes_dirt.png" },
|
||
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 = { "sf_nodes_stone.png" },
|
||
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: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",
|
||
paramtype = "light",
|
||
tiles = { "sf_nodes_leaves.png" },
|
||
groups = { editor_breakable = 1 },
|
||
sounds = sf_sounds.node_sound_leaves_defaults(),
|
||
})
|
||
|
||
minetest.register_node("sf_nodes:conifer_needles", {
|
||
description = S("Conifer Needles"),
|
||
drawtype = "allfaces",
|
||
paramtype = "light",
|
||
tiles = { "sf_nodes_conifer_needles.png" },
|
||
groups = { editor_breakable = 1 },
|
||
sounds = sf_sounds.node_sound_leaves_defaults(),
|
||
})
|
||
|
||
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",
|
||
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",
|
||
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",
|
||
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" },
|
||
drawtype = "plantlike",
|
||
walkable = false,
|
||
visual_scale = 1.2,
|
||
selection_box = {
|
||
type = "fixed",
|
||
fixed = {-6/16, -0.5, -6/16, 6/16, 0, 6/16 },
|
||
},
|
||
})
|
||
|