Auke Kok fcb66648bd Allow placing of breakable nodes.
In editing mode, you can mark places where specific
breakable nodes can be placed by placing a breakable
node. A particle appears where the node will be allowed.

In playing mode, any breakable node that can be placed
at the position can then be placed in the exact location. For
obvious reasons, it can also be digged up again with the
right tools

This does break putting things in itemframes right now, so
I do need to pass on the on_rightclick to the itemframe
still.
2017-02-25 15:12:18 -08:00

1072 lines
27 KiB
Lua

--[[
nodes.lua - basic node blocks for Inside The Box
]]--
-- table format:
-- [1] name, also used for texture
-- [2] true for stair/slab
-- [3] tool if diggable version needs to be added
-- [4] color versions?
--
-- visual marker for where breakable nodes can be placed
--
local function show_placeholder(pos, name)
local def = minetest.registered_nodes[name]
local tex = minetest.inventorycube(
def.tiles[1] and def.tiles[1].name or def.tiles[1],
def.tiles[2] and def.tiles[2].name or
def.tiles[1] and def.tiles[1].name or def.tiles[1],
def.tiles[3] and def.tiles[3].name or
def.tiles[2] and def.tiles[2].name or
def.tiles[1] and def.tiles[1].name or def.tiles[1]
)
minetest.add_particle({
pos = pos,
expirationtime = 30,
size = 5,
texture = tex,
glow = 14,
})
end
--
-- handle placement for breakable nodes
--
local on_place_breakable = function(itemstack, placer, pointed_thing)
-- not a node?
if not pointed_thing or pointed_thing.type ~= "node" then
return itemstack
end
-- placeable here?
local pos = pointed_thing.above
local node = minetest.get_node(pos)
local place = itemstack:get_name()
local name = placer:get_player_name()
-- editing or playing?
if boxes.players_editing_boxes[name] then
-- holding SHIFT?
if placer:get_player_control().sneak then
minetest.set_node(pos, {name = place})
return itemstack
end
if node.name ~= "air" and node.name ~= "nodes:placeholder" then
minetest.chat_send_player(name, "Can only place this node at an empty node. Clear the space first")
return itemstack
end
-- place placeholder information
minetest.set_node(pos, {name = "nodes:placeholder"})
local meta = minetest.get_meta(pos)
local placeable = meta:get_string("placeable")
if placeable == "" then
meta:set_string("placeable", minetest.write_json({[place] = true}))
else
local t = minetest.parse_json(placeable)
t[place] = true
meta:set_string("placeable", minetest.write_json(t))
end
-- visual cue for builder
show_placeholder(pos, place)
elseif boxes.players_in_boxes[name] then
-- check meta if we can place here
local meta = minetest.get_meta(pos)
local placeable = meta:get_string("placeable")
if placeable == "" then
return itemstack
end
local t = minetest.parse_json(placeable)
if not t[place] then
return itemstack
end
-- place and remove one from itemstack
itemstack:take_item()
minetest.set_node(pos, {name = place})
return itemstack
else
minetest.log("info", name .. " attempted to place a " .. place .. " outside a box")
return itemstack
end
end
minetest.register_node("nodes:placeholder", {
description = "Placeable node location placeholder",
inventory_image = "air.png",
wield_image = "air.png",
drawtype = "airlike",
paramtype = "light",
sunlight_propagates = true,
walkable = false,
pointable = false,
diggable = false,
buildable_to = true,
floodable = true,
air_equivalent = true,
drop = "",
groups = {not_in_creative_inventory=1},
})
local nodes = {
{"bricks_clay", true, "pickaxe", sounds.stone},
{"bricks_limestone", true, "pickaxe", sounds.stone},
{"bricks_marble", true, "pickaxe", sounds.stone},
{"bricks_sandstone", true, "pickaxe", sounds.stone},
{"bricks_stone", true, "pickaxe", sounds.stone},
{"bricks_stone_moss", true, "pickaxe", sounds.stone},
{"cobble", true, "pickaxe", sounds.stone},
{"cobble_moss", true, "pickaxe", sounds.stone},
{"limestone", true, "pickaxe", sounds.stone},
{"marble", true, "pickaxe", sounds.stone},
{"sandstone", true, "pickaxe", sounds.stone},
{"stone", true, "pickaxe", sounds.stone},
{"stone_moss", true, "pickaxe", sounds.stone},
{"bronze", false, "pickaxe", sounds.metal},
{"gold", false, "pickaxe", sounds.metal},
{"emerald", false, "pickaxe", sounds.stone},
{"iron", false, "pickaxe", sounds.metal},
{"clay", false, "shovel", sounds.dirt},
{"dirt", false, "shovel", sounds.dirt},
{"gravel", false, "shovel", sounds.gravel, 1},
{"sand", false, "shovel", sounds.sand, 1},
{"wood_dark", true, "axe", sounds.wood},
{"wood_light", true, "axe", sounds.wood},
{"wood_medium", true, "axe", sounds.wood},
{"grass", false, false, sounds.grass},
{"snow", false, "shovel", sounds.snow},
{"ice", false, "pickaxe", sounds.stone},
{"ore_black", false, "pickaxe", sounds.stone},
{"ore_blue", false, "pickaxe", sounds.stone},
{"ore_brown", false, "pickaxe", sounds.stone},
{"ore_cyan", false, "pickaxe", sounds.stone},
{"ore_gold", false, "pickaxe", sounds.stone},
{"ore_green", false, "pickaxe", sounds.stone},
{"ore_red", false, "pickaxe", sounds.stone},
}
local function make_stair_slab(name, groups, b1, b2, snd)
minetest.register_node("nodes:" .. name .. b1 .. "_stairs", {
description = name .. " stairs" .. b2,
tiles = {name .. ".png"},
drawtype = "mesh",
mesh = "stairs_stair.obj",
paramtype = "light",
paramtype2 = "facedir",
groups = groups,
selection_box = {
type = "fixed",
fixed = {
{-1/2, -1/2, -1/2, 1/2, 0, 1/2},
{-1/2, 0, 0, 1/2, 1/2, 1/2},
},
},
collision_box = {
type = "fixed",
fixed = {
{-1/2, -1/2, -1/2, 1/2, 0, 1/2},
{-1/2, 0, 0, 1/2, 1/2, 1/2},
},
},
sounds = snd,
})
minetest.register_node("nodes:" .. name .. b1 .. "_slab", {
description = name .. " slab" .. b2,
tiles = {name .. ".png"},
drawtype = "nodebox",
paramtype = "light",
paramtype2 = "facedir",
groups = groups,
node_box = {
type = "fixed",
fixed = {-1/2, -1/2, -1/2, 1/2, 0, 1/2},
},
sounds = snd,
})
end
for _, v in pairs(nodes) do
local groups = {node = 1}
if v[5] then
groups.falling_node = 1
end
if v[3] then
-- register diggable node version
groups[v[3]] = 3
minetest.register_node("nodes:" .. v[1] .. "_breakable", {
description = v[1] .. " (breakable)",
tiles = {v[1] .. ".png"},
groups = groups,
sounds = v[4],
on_place = on_place_breakable,
})
if v[2] then
make_stair_slab(v[1], groups, "_breakable", " (breakable)", v[4])
end
frame.register("nodes:" .. v[1] .. "_breakable")
end
minetest.register_node("nodes:" .. v[1], {
description = v[1],
tiles = {v[1] .. ".png"},
groups = {node = 1, unbreakable = 1},
sounds = v[4],
})
if v[2] then
make_stair_slab(v[1], {node = 1, unbreakable = 1}, "", "")
walls.register("nodes:" .. v[1] .. "_wall", v[1] .. " Wall", v[1] .. ".png", v[4])
end
end
for _, v in pairs({"yellow", "white", "violet", "red",
"pink", "orange", "magenta", "grey",
"green", "dark_grey", "dark_green", "cyan",
"brown", "blue", "black"}) do
minetest.register_node("nodes:wool_" .. v, {
description = v .. " wool",
tiles = {"wool_" .. v .. ".png"},
groups = {node = 1, unbreakable = 1},
sounds = sounds.sand,
})
make_stair_slab("wool_" .. v, {node = 1, unbreakable = 1}, "", "")
minetest.register_node("nodes:wool_" .. v .. "_breakable", {
description = v .. " wool (breakable",
tiles = {"wool_" .. v .. ".png"},
groups = {axe = 1, node = 1},
sounds = sounds.sand,
on_place = on_place_breakable,
})
make_stair_slab("wool_" .. v, {axe = 1, node = 1}, "_breakable", " (breakable)", sounds.sand)
frame.register("nodes:wool_" .. v .. "_breakable")
end
-- trunks
minetest.register_node("nodes:trunk_light_breakable", {
description = "Light Trunk (breakable)",
tiles = {"trunk_light_top.png", "trunk_light_top.png", "trunk_light.png"},
groups = {axe = 1, node = 1},
paramtype2 = "facedir",
sounds = sounds.wood,
on_place = on_place_breakable,
})
minetest.register_node("nodes:trunk_light", {
description = "Light Trunk",
tiles = {"trunk_light_top.png", "trunk_light_top.png", "trunk_light.png"},
groups = {node = 1, unbreakable = 1},
paramtype2 = "facedir",
sounds = sounds.wood,
})
frame.register("nodes:trunk_light_breakable")
minetest.register_node("nodes:trunk_medium_breakable", {
description = "Medium Trunk (breakable)",
tiles = {"trunk_medium_top.png", "trunk_medium_top.png", "trunk_medium.png"},
groups = {axe = 1, node = 1},
paramtype2 = "facedir",
sounds = sounds.wood,
on_place = on_place_breakable,
})
minetest.register_node("nodes:trunk_medium", {
description = "medium Trunk",
tiles = {"trunk_medium_top.png", "trunk_medium_top.png", "trunk_medium.png"},
groups = {node = 1, unbreakable = 1},
paramtype2 = "facedir",
sounds = sounds.wood,
})
frame.register("nodes:trunk_medium_breakable")
minetest.register_node("nodes:trunk_dark_breakable", {
description = "Dark Trunk (breakable)",
tiles = {"trunk_dark_top.png", "trunk_dark_top.png", "trunk_dark.png"},
groups = {axe = 1, node = 1},
paramtype2 = "facedir",
sounds = sounds.wood,
on_place = on_place_breakable,
})
minetest.register_node("nodes:trunk_dark", {
description = "Dark Trunk",
tiles = {"trunk_dark_top.png", "trunk_dark_top.png", "trunk_dark.png"},
groups = {node = 1, unbreakable = 1},
paramtype2 = "facedir",
sounds = sounds.wood,
})
frame.register("nodes:trunk_dark_breakable")
-- barrier
minetest.register_node("nodes:barrier", {
description = "Barrier",
pointable = true, -- make it easy to understand that it's a barrier
drawtype = "allfaces_optional",
inventory_image = "barrier.png",
tiles = {"itb_blank.png"},
sunlight_propagates = true,
paramtype = "light",
collision_box = {
type = "fixed",
-- oversized to prevent crawling through
fixed = {-1,-0.5,-1,1,1,1},
},
})
local function lamp_on_untrigger(pos)
local meta = minetest.get_meta(pos)
local node = minetest.get_node(pos)
meta:set_string("on_name", node.name)
node.name = "nodes:lamp_bar_0"
minetest.swap_node(pos, node)
end
-- glass
minetest.register_node("nodes:glass", {
description = "glass",
drawtype = "glasslike_framed_optional",
sunlight_propagates = true,
paramtype = "light",
tiles = {"glass.png"},
groups = {node = 1, unbreakable = 1},
sounds = sounds.glass,
})
minetest.register_node("nodes:glass_breakable", {
description = "glass (breakable)",
drawtype = "glasslike_framed_optional",
sunlight_propagates = true,
paramtype = "light",
tiles = {"glass.png"},
groups = {node = 1, pickaxe = 1},
sounds = sounds.glass,
on_place = on_place_breakable,
})
frame.register("nodes:glass_breakable")
-- light fixtures
for _, v in pairs({14, 11, 8, 0}) do
local on_trigger = function(pos) end
local on_untrigger = function(pos) end
if v == 0 then
on_trigger = function(pos)
local meta = minetest.get_meta(pos)
local node = minetest.get_node(pos)
local new_name = meta:get_string("on_name")
if new_name ~= "" then
node.name = new_name
minetest.swap_node(pos, node)
if string.find(new_name, "broken") then
minetest.get_node_timer(pos):start(math.random(50)/10)
end
end
end
else
on_untrigger = lamp_on_untrigger
end
minetest.register_node("nodes:lamp_bar_" .. v, {
description = "A Lamp (" .. v .. ")",
light_source = v,
sunlight_propagates = true,
tiles = {"lamp_bar.png"},
paramtype = "light",
paramtype2 = "facedir",
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {-1, 1/4, 1/4, 1, 1/2, 1/2},
},
groups = {node = 1, unbreakable = 1},
sounds = sounds.glass,
on_rotate = screwdriver.rotate_simple(),
on_trigger = on_trigger,
on_untrigger = on_untrigger,
after_dig_node = mech.after_dig,
})
end
minetest.register_node("nodes:lamp_bar_broken", {
description = "A Broken Lamp (flickering)",
light_source = 8,
sunlight_propagates = true,
tiles = {"lamp_bar.png"},
paramtype = "light",
paramtype2 = "facedir",
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {-1, 1/4, 1/4, 1, 1/2, 1/2},
},
groups = {node = 1, unbreakable = 1},
sounds = sounds.glass,
on_rotate = screwdriver.rotate_simple(),
on_trigger = function(pos) end,
on_untrigger = lamp_on_untrigger,
on_timer = function(pos)
local node = minetest.get_node(pos)
minetest.set_node(pos, {name = "nodes:lamp_bar_broken_off", param2 = node.param2})
end,
on_construct = function(pos)
minetest.get_node_timer(pos):start(math.random(50)/10)
end,
after_dig_node = mech.after_dig,
})
minetest.register_node("nodes:lamp_bar_broken_off", {
description = "A Broken Lamp (flickering, off)",
sunlight_propagates = true,
tiles = {"lamp_bar.png"},
paramtype = "light",
paramtype2 = "facedir",
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {-1, 1/4, 1/4, 1, 1/2, 1/2},
},
groups = {node = 1, unbreakable = 1},
sounds = sounds.glass,
on_rotate = screwdriver.rotate_simple(),
on_trigger = function(pos) end,
on_untrigger = lamp_on_untrigger,
on_timer = function(pos)
local node = minetest.get_node(pos)
minetest.set_node(pos, {name = "nodes:lamp_bar_broken", param2 = node.param2})
end,
on_construct = function(pos)
minetest.get_node_timer(pos):start(math.random(50)/10)
end,
after_dig_node = mech.after_dig,
})
for _, wood in ipairs({"wood_dark", "wood_light", "wood_medium"}) do
fences.register_fence("nodes:fence_" .. wood, {
description = wood .. " Fence",
texture = wood .. "_fence.png",
inventory_image = "default_fence_overlay.png^" .. wood .. ".png^default_fence_overlay.png^[makealpha:255,126,126",
wield_image = "default_fence_overlay.png^" .. wood .. ".png^default_fence_overlay.png^[makealpha:255,126,126",
groups = {node = 1, unbreakable = 1},
sounds = sounds.wood,
})
end
-- ladders, rope & vines
for _, n in pairs({
{"ladder", "signlike"},
{"rope", "plantlike"},
{"vine", "signlike"},
}) do
minetest.register_node("nodes:" .. n[1], {
description = n[1],
drawtype = n[2],
tiles = {n[1] .. ".png"},
inventory_image = n[1] .. ".png",
paramtype = "light",
paramtype2 = "wallmounted",
sunlight_propagates = true,
walkable = false,
climbable = true,
selection_box = n[2] == "signlike" and {type = "wallmounted"},
groups = {node = 1, unbreakable = 1},
sounds = sounds.wood,
})
minetest.register_node("nodes:" .. n[1] .. "_breakable", {
description = n[1] .. "(breakable)",
drawtype = n[2],
tiles = {n[1] .. ".png"},
inventory_image = n[1] .. ".png",
paramtype = "light",
paramtype2 = "wallmounted",
sunlight_propagates = true,
walkable = false,
climbable = true,
selection_box = n[2] == "signlike" and {type = "wallmounted"},
groups = {node = 1, axe = 1},
sounds = sounds.wood,
on_place = on_place_breakable,
})
frame.register("nodes:" .. n[1] .. "_breakable")
end
minetest.register_node("nodes:waterlily", {
description = "Waterlily",
drawtype = "nodebox",
sunlight_propagates = true,
tiles = {"waterlily.png"},
walkable = true,
node_box = {
type = "fixed",
fixed = {-1/2, -1/2, -1/2, 1/2, -7/16, 1/2}
},
liquids_pointable = true,
paramtype = "light",
paramtype2 = "facedir",
})
-- special nodes
-- liquids
minetest.register_node("nodes:water_source", {
description = "Water Source",
drawtype = "liquid",
tiles = {
{
name = "water_source_animated.png",
animation = {
type = "vertical_frames",
aspect_w = 16,
aspect_h = 16,
length = 2.0,
},
},
},
special_tiles = {
-- New-style water source material (mostly unused)
{
name = "water_source_animated.png",
animation = {
type = "vertical_frames",
aspect_w = 16,
aspect_h = 16,
length = 2.0,
},
backface_culling = false,
},
},
alpha = 160,
paramtype = "light",
walkable = false,
pointable = false,
diggable = false,
buildable_to = true,
is_ground_content = false,
drop = "",
drowning = 1,
liquidtype = "source",
liquid_alternative_flowing = "nodes:water_flowing",
liquid_alternative_source = "nodes:water_source",
liquid_viscosity = 1,
post_effect_color = {a = 203, r = 30, g = 60, b = 90},
groups = {water = 3, liquid = 3, puts_out_fire = 1, cools_lava = 1},
sounds = sounds.water,
})
minetest.register_node("nodes:water_flowing", {
description = "Flowing Water",
drawtype = "flowingliquid",
tiles = {"water.png"},
special_tiles = {
{
name = "water_flowing_animated.png",
backface_culling = false,
animation = {
type = "vertical_frames",
aspect_w = 16,
aspect_h = 16,
length = 0.8,
},
},
{
name = "water_flowing_animated.png",
backface_culling = true,
animation = {
type = "vertical_frames",
aspect_w = 16,
aspect_h = 16,
length = 0.8,
},
},
},
alpha = 160,
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 = "nodes:water_flowing",
liquid_alternative_source = "nodes:water_source",
liquid_viscosity = 1,
post_effect_color = {a = 203, r = 30, g = 60, b = 90},
groups = {water = 3, liquid = 3, puts_out_fire = 1,
not_in_creative_inventory = 1, cools_lava = 1},
sounds = sounds.water,
})
minetest.register_node("nodes:river_water_source", {
description = "River Water Source",
drawtype = "liquid",
tiles = {
{
name = "river_water_source_animated.png",
animation = {
type = "vertical_frames",
aspect_w = 16,
aspect_h = 16,
length = 2.0,
},
},
},
special_tiles = {
{
name = "river_water_source_animated.png",
animation = {
type = "vertical_frames",
aspect_w = 16,
aspect_h = 16,
length = 2.0,
},
backface_culling = false,
},
},
alpha = 160,
paramtype = "light",
walkable = false,
pointable = false,
diggable = false,
buildable_to = true,
is_ground_content = false,
drop = "",
drowning = 1,
liquidtype = "source",
liquid_alternative_flowing = "nodes:river_water_flowing",
liquid_alternative_source = "nodes:river_water_source",
liquid_viscosity = 1,
liquid_renewable = false,
liquid_range = 2,
post_effect_color = {a = 203, r = 30, g = 76, b = 90},
groups = {water = 3, liquid = 3, puts_out_fire = 1, cools_lava = 1},
sounds = sounds.water,
})
minetest.register_node("nodes:river_water_flowing", {
description = "Flowing River Water",
drawtype = "flowingliquid",
tiles = {"river_water.png"},
special_tiles = {
{
name = "river_water_flowing_animated.png",
backface_culling = false,
animation = {
type = "vertical_frames",
aspect_w = 16,
aspect_h = 16,
length = 0.8,
},
},
{
name = "river_water_flowing_animated.png",
backface_culling = true,
animation = {
type = "vertical_frames",
aspect_w = 16,
aspect_h = 16,
length = 0.8,
},
},
},
alpha = 160,
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 = "nodes:river_water_flowing",
liquid_alternative_source = "nodes:river_water_source",
liquid_viscosity = 1,
liquid_renewable = false,
liquid_range = 2,
post_effect_color = {a = 203, r = 30, g = 76, b = 90},
groups = {water = 3, liquid = 3, puts_out_fire = 1,
not_in_creative_inventory = 1, cools_lava = 1},
sounds = sounds.water,
})
minetest.register_node("nodes:lava_source", {
description = "Lava Source",
drawtype = "liquid",
tiles = {
{
name = "lava_source_animated.png",
animation = {
type = "vertical_frames",
aspect_w = 16,
aspect_h = 16,
length = 3.0,
},
},
},
special_tiles = {
-- New-style lava source material (mostly unused)
{
name = "lava_source_animated.png",
animation = {
type = "vertical_frames",
aspect_w = 16,
aspect_h = 16,
length = 3.0,
},
backface_culling = false,
},
},
paramtype = "light",
light_source = 8,
walkable = false,
pointable = false,
diggable = false,
buildable_to = true,
is_ground_content = false,
drop = "",
drowning = 1,
liquidtype = "source",
liquid_alternative_flowing = "nodes:lava_flowing",
liquid_alternative_source = "nodes: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},
sounds = sounds.water,
})
minetest.register_node("nodes:lava_flowing", {
description = "Flowing Lava",
drawtype = "flowingliquid",
tiles = {"lava.png"},
special_tiles = {
{
name = "lava_flowing_animated.png",
backface_culling = false,
animation = {
type = "vertical_frames",
aspect_w = 16,
aspect_h = 16,
length = 3.3,
},
},
{
name = "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 = 8,
walkable = false,
pointable = false,
diggable = false,
buildable_to = true,
is_ground_content = false,
drop = "",
drowning = 1,
liquidtype = "flowing",
liquid_alternative_flowing = "nodes:lava_flowing",
liquid_alternative_source = "nodes: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},
sounds = sounds.water,
})
-- tnt
-- fire
minetest.register_node("nodes:fire", {
description = "Fire",
drawtype = "firelike",
tiles = {
{
name = "fire_animated.png",
animation = {
type = "vertical_frames",
aspect_w = 16,
aspect_h = 16,
length = 1.6,
},
},
},
inventory_image = "fire.png",
paramtype = "light",
light_source = 13,
walkable = false,
buildable_to = true,
sunlight_propagates = true,
damage_per_second = 4,
groups = {igniter = 2, dig_immediate = 3},
drop = "",
})
frame.register("nodes:fire")
-- chests:
-- empty (fake) chest
-- chest-with-key
-- chest-with-tool
for _, name in ipairs({
"nothing",
"boxes:nexus",
"tools:axe",
"tools:pickaxe",
"tools:shovel",
"tools:sword",
"tools:flint_and_steel",
}) do
minetest.register_node("nodes:chest_with_" .. string.gsub(name, ":", "_"), {
description = "Chest with " .. name,
drawtype = "mesh",
paramtype = "light",
paramtype2 = "facedir",
mesh = "chest_close.obj",
tiles = {"chest.png"},
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
minetest.sound_play("chest_open", {pos = pos})
node.name = "nodes:chest_open"
mech.trigger(pos)
minetest.after(1.0, mech.untrigger, pos)
minetest.swap_node(pos, node)
minetest.get_node_timer(pos):start(3.0)
if name ~= "nothing" then
if itemstack:item_fits(name) then
itemstack:add_item(name)
return itemstack
end
clicker:get_inventory():add_item("main", name)
end
return itemstack
end,
})
end
minetest.register_alias("nodes:chest_with_boxes_findme_item", "nodes:chest_with_boxes_nexus")
minetest.register_node("nodes:chest_open", {
description = "Chest",
drawtype = "mesh",
paramtype = "light",
paramtype2 = "facedir",
mesh = "chest_open.obj",
tiles = {"chest.png"},
on_timer = function(pos)
minetest.sound_play("chest_close", {pos = pos})
local node = minetest.get_node(pos)
minetest.swap_node(pos, {name = "nodes:chest_with_nothing", param2 = node.param2})
end,
groups = {node = 0},
})
-- vegetation:
-- leaves
for _, v in pairs({
"leaves_light",
"leaves_medium",
"leaves_dark",
}) do
minetest.register_node("nodes:" .. v .. "_breakable", {
description = v .. " (breakable)",
drawtype = "allfaces_optional",
paramtype = "light",
tiles = {v .. ".png"},
groups = {node = 1, axe = 1},
sounds = sounds.leaves,
on_place = on_place_breakable,
})
minetest.register_node("nodes:" .. v, {
description = v,
drawtype = "allfaces_optional",
paramtype = "light",
tiles = {v .. ".png"},
groups = {node = 1, unbreakable = 1},
sounds = sounds.leaves,
})
end
-- grass variants
-- flowers
-- farming plants
-- flowerpot combos
for _, n in pairs({
{"grass_1", 56},
{"grass_2", 56},
{"grass_3", 56},
{"grass_4", 56},
{"grass_5", 56},
{"rose", 9},
{"dandelion", 9},
{"white_tulip", 9},
{"allium", 9},
{"orchid", 9},
{"daisy", 9},
{"houstonia", 9},
{"paeonia", 9},
{"wheat_stage_0", 11},
{"wheat_stage_1", 11},
{"wheat_stage_2", 11},
{"wheat_stage_3", 11},
{"wheat_stage_4", 11},
{"wheat_stage_5", 11},
{"wheat_stage_6", 11},
{"wheat_stage_7", 11},
{"potatoes_stage_0", 10},
{"potatoes_stage_1", 10},
{"potatoes_stage_2", 10},
{"potatoes_stage_3", 10},
{"carrots_stage_0", 8},
{"carrots_stage_1", 8},
{"carrots_stage_2", 8},
{"carrots_stage_3", 8},
{"sapling_1", 8},
{"sapling_2", 8},
{"sapling_3", 8},
{"sapling_4", 8},
{"sapling_5", 8},
{"sapling_6", 8},
{"fern", 9},
{"reeds", 0},
}) do
if n[2] then
minetest.register_node("nodes:" .. n[1], {
description = n[1],
drawtype = "plantlike",
place_param2 = n[2],
tiles = {n[1] .. ".png"},
paramtype = "light",
paramtype2 = "meshoptions",
sunlight_propagates = true,
walkable = false,
selection_box = {
type = "fixed",
fixed = {-1/4, -1/2, -1/4, 1/4, 1/4, 1/4},
},
sounds = sounds.grass,
})
else
minetest.register_node("nodes:" .. n[1], {
description = n[1],
drawtype = "plantlike",
tiles = {n[1] .. ".png"},
paramtype = "light",
sunlight_propagates = true,
walkable = false,
selection_box = {
type = "fixed",
fixed = {-1/4, -1/2, -1/4, 1/4, 1/4, 1/4},
},
sounds = sounds.grass,
})
end
frame.register("nodes:" .. n[1])
minetest.register_node("nodes:flowerpot_" ..n[1], {
description = "Pot with " .. n[1],
drawtype = "mesh",
mesh = "flowerpot.obj",
tiles = {
{name = "pot.png"},
{name = n[1] .. ".png"},
},
paramtype = "light",
sunlight_propagates = true,
collision_box = {
type = "fixed",
fixed = {-1/4, -1/2, -1/4, 1/4, -1/8, 1/4},
},
selection_box = {
type = "fixed",
fixed = {-1/4, -1/2, -1/4, 1/4, 1/2, 1/4},
},
sounds = sounds.wood,
})
end
-- empty flowerpot
minetest.register_node("nodes:flowerpot_empty", {
description = "Pot (empty)",
drawtype = "mesh",
mesh = "flowerpot.obj",
tiles = {
{name = "pot.png"},
{name = "itb_blank.png"},
},
paramtype = "light",
sunlight_propagates = true,
collision_box = {
type = "fixed",
fixed = {-1/4, -1/2, -1/4, 1/4, -1/8, 1/4},
},
selection_box = {
type = "fixed",
fixed = {-1/4, -1/2, -1/4, 1/4, 1/2, 1/4},
},
sounds = sounds.wood,
})
-- soil
for _, v in pairs({
"soil",
"soil_wet",
}) do
-- register diggable node version
minetest.register_node("nodes:" .. v .. "_breakable", {
description = v .. " (breakable)",
tiles = {{name = v .. ".png"}, {name = "dirt.png"}},
groups = {node = 1, shovel = 1},
sounds = sounds.dirt,
on_place = on_place_breakable,
})
minetest.register_node("nodes:" .. v, {
description = v,
tiles = {{name = v .. ".png"}, {name = "dirt.png"}},
groups = {node = 1, unbreakable = 1},
sounds = sounds.dirt,
})
frame.register("nodes:" .. v .. "_breakable")
end
-- dirt with grass,
minetest.register_node("nodes:dirt_with_grass_breakable", {
description = "Dirt with grass (breakable)",
tiles = {"grass.png", "dirt.png", "grass_side.png"},
groups = {node = 1, shovel = 1},
sounds = sounds.dirt,
on_place = on_place_breakable,
})
minetest.register_node("nodes:dirt_with_grass", {
description = "Dirt with grass",
tiles = {"grass.png", "dirt.png", "grass_side.png"},
groups = {node = 1, unbreakable = 1},
sounds = sounds.dirt,
})
frame.register("nodes:dirt_with_grass_breakable")
-- dirt with snow
minetest.register_node("nodes:dirt_with_snow_breakable", {
description = "Dirt with snow (breakable)",
tiles = {"snow.png", "dirt.png", "grass_side_snowed.png"},
groups = {node = 1, shovel = 1},
sounds = sounds.snow,
on_place = on_place_breakable,
})
minetest.register_node("nodes:dirt_with_snow", {
description = "Dirt with snow",
tiles = {"snow.png", "dirt.png", "grass_side_snowed.png"},
groups = {node = 1, unbreakable = 1},
sounds = sounds.snow,
})
frame.register("nodes:dirt_with_snow_breakable")