2023-12-07 19:25:04 +01:00

541 lines
15 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 },
},
})