488 lines
15 KiB
Lua
Raw Normal View History

--[[
=======================================================================
Modern Tables Mod
by Micu (c) 2018
Copyright (C) 2018 Michal Cieslakiewicz
This mod contains full height tables:
* simple wooden
* simple metal
* wooden with drawer
* metal with drawer
* (optional) Tubelib-style tables and machinery legs
Drawer is a simple inventory 8x2.
Table drawer is accessible to all players. Storage table cannot be
destroyed until it is empty.
License: LGPLv2.1+
Media: CC BY-SA
=======================================================================
]]--
--[[
---------
Variables
---------
]]--
moderntables = {}
local table_nodebox = {
{ -0.5, 0.375, -0.5, 0.5, 0.5, 0.5 },
{ -0.5, -0.5, -0.5, -0.375, 0.375, -0.375 },
{ 0.375, -0.5, -0.5, 0.5, 0.375, -0.375 },
{ 0.375, -0.5, 0.375, 0.5, 0.375, 0.5 },
{ -0.5, -0.5, 0.375, -0.375, 0.375, 0.5 },
}
local table_drawer_nodebox = {
{ -0.5, 0.375, -0.5, 0.5, 0.5, 0.5 },
{ -0.5, -0.5, -0.5, -0.375, 0.375, -0.375 },
{ 0.375, -0.5, -0.5, 0.5, 0.375, -0.375 },
{ 0.375, -0.5, 0.375, 0.5, 0.375, 0.5 },
{ -0.5, -0.5, 0.375, -0.375, 0.375, 0.5 },
{ -0.5, 0.125, -0.4375, 0.5, 0.375, 0.5 },
{ -0.5, 0, -0.5, 0.5, 0.125, 0.5 },
}
local inv_formspec = "size[8,8]" ..
default.gui_bg ..
default.gui_bg_img ..
default.gui_slots ..
"list[context;inv;0,0.5;8,2;]" ..
"list[current_player;main;0,3.5;8,1;]" ..
"list[current_player;main;0,4.75;8,3;8]" ..
"listring[context;inv]" ..
"listring[current_player;main]" ..
default.get_hotbar_bg(0, 3.5)
--[[
---------
Callbacks
---------
]]--
-- do not allow to dig table with non-empty drawer
local function can_dig(pos, player)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
return inv:is_empty("inv")
end
-- init storage metadata
local function after_place_node(pos, placer, itemstack, pointed_thing)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
inv:set_size('inv', 8 * 2)
meta:set_string("formspec", inv_formspec)
end
--[[
-------
Helpers
-------
]]--
-- Simple wooden tables:
-- subname (string) is one of: acacia_wood, aspen_wood,
-- junglewood, pine_wood, wood
local function register_simple_wood_table(subname, description)
local fullname = "moderntables:simple_table_" .. subname
minetest.register_node(fullname, {
description = description,
tiles = { "default_" .. subname .. ".png", },
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = table_nodebox,
},
selection_box = {
type = "fixed",
fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 },
},
paramtype = "light",
paramtype2 = "facedir",
place_param2 = 0,
is_ground_content = false,
groups = { choppy = 2, oddly_breakable_by_hand = 2,
flammable = 2, },
sounds = default.node_sound_wood_defaults(),
on_rotate = screwdriver.disallow,
})
local slabitem = "stairs:slab_" .. subname
local wooditem = "default:" .. subname
minetest.register_craft({
output = fullname,
recipe = {
{ slabitem, slabitem, slabitem },
{ wooditem, "", wooditem },
{ wooditem, "", wooditem },
},
})
end
-- Storage wooden tables:
-- subname (string) is one of: acacia_wood, aspen_wood,
-- junglewood, pine_wood, wood
local function register_storage_wood_table(subname, description)
local fullname = "moderntables:storage_table_" .. subname
minetest.register_node(fullname, {
description = description,
tiles = {
-- up, down, right, left, back, front
"default_" .. subname .. ".png",
"default_" .. subname .. ".png",
"default_" .. subname .. ".png",
"default_" .. subname .. ".png",
"default_" .. subname .. ".png",
"default_" .. subname .. ".png^moderntables_drawer_handle.png",
},
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = table_drawer_nodebox,
},
selection_box = {
type = "fixed",
fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 },
},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
groups = { choppy = 2, oddly_breakable_by_hand = 2,
flammable = 2, },
sounds = default.node_sound_wood_defaults(),
formspec = inv_formspec,
on_rotate = screwdriver.rotate_simple,
can_dig = can_dig,
after_place_node = after_place_node,
})
local slabitem = "stairs:slab_" .. subname
local wooditem = "default:" .. subname
minetest.register_craft({
output = fullname,
recipe = {
{ slabitem, slabitem, slabitem },
{ wooditem, "default:chest", wooditem },
{ wooditem, "", wooditem },
},
})
minetest.register_craft({
output = fullname,
type = "shapeless",
recipe = { "moderntables:simple_table_" .. subname,
"default:chest" },
})
end
-- Simple metal tables:
-- subname (string) is one of: bronze, tin, copper, steel, gold
local function register_simple_metal_table(subname, description)
local fullname = "moderntables:simple_table_" .. subname
minetest.register_node(fullname, {
description = description,
tiles = {
-- up, down, right, left, back, front
"moderntables_" .. subname .. "_top.png",
"moderntables_" .. subname .. "_top.png",
"moderntables_" .. subname .. "_side.png",
"moderntables_" .. subname .. "_side.png",
"moderntables_" .. subname .. "_side.png",
"moderntables_" .. subname .. "_side.png",
},
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = table_nodebox,
},
selection_box = {
type = "fixed",
fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 },
},
paramtype = "light",
paramtype2 = "facedir",
place_param2 = 0,
is_ground_content = false,
groups = { choppy = 2, cracky = 2, crumbly = 2,
oddly_breakable_by_hand = 2, },
sounds = default.node_sound_metal_defaults(),
on_rotate = screwdriver.disallow,
})
local ingotitem = "default:" .. subname .. "_ingot"
minetest.register_craft({
output = fullname,
recipe = {
{ ingotitem, "group:wood", ingotitem },
{ ingotitem, "", ingotitem },
{ ingotitem, "", ingotitem },
},
})
end
-- Storage metal tables:
-- subname (string) is one of: bronze, tin, copper, steel, gold
local function register_storage_metal_table(subname, description)
local fullname = "moderntables:storage_table_" .. subname
minetest.register_node(fullname, {
description = description,
tiles = {
-- up, down, right, left, back, front
"moderntables_" .. subname .. "_top.png",
"moderntables_" .. subname .. "_top.png",
"moderntables_" .. subname .. "_side.png^moderntables_" .. subname .. "_drawer_side.png",
"moderntables_" .. subname .. "_side.png^moderntables_" .. subname .. "_drawer_side.png",
"moderntables_" .. subname .. "_side.png^moderntables_" .. subname .. "_drawer_side.png",
"moderntables_" .. subname .. "_side.png^moderntables_" .. subname .. "_drawer_front.png^moderntables_drawer_handle.png",
},
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = table_drawer_nodebox,
},
selection_box = {
type = "fixed",
fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 },
},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
groups = { choppy = 2, cracky = 2, crumbly = 2,
oddly_breakable_by_hand = 2, },
sounds = default.node_sound_metal_defaults(),
on_rotate = screwdriver.rotate_simple,
can_dig = can_dig,
after_place_node = after_place_node,
})
local ingotitem = "default:" .. subname .. "_ingot"
minetest.register_craft({
output = fullname,
recipe = {
{ ingotitem, "group:wood", ingotitem },
{ ingotitem, "default:chest", ingotitem },
{ ingotitem, "", ingotitem },
},
})
minetest.register_craft({
output = fullname,
type = "shapeless",
recipe = { "moderntables:simple_table_" .. subname,
"default:chest" },
})
end
--[[
------------------------------
Node and crafting registration
------------------------------
]]--
register_simple_wood_table("acacia_wood", "Simple Acacia Wood Table")
register_simple_wood_table("aspen_wood", "Simple Aspen Wood Table")
register_simple_wood_table("junglewood", "Simple Junglewood Table")
register_simple_wood_table("pine_wood", "Simple Pine Wood Table")
register_simple_wood_table("wood", "Simple Wooden Table")
register_storage_wood_table("acacia_wood", "Acacia Wood Table with Drawer")
register_storage_wood_table("aspen_wood", "Aspen Wood Table with Drawer")
register_storage_wood_table("junglewood", "Junglewood Table with Drawer")
register_storage_wood_table("pine_wood", "Pine Wood Table with Drawer")
register_storage_wood_table("wood", "Wooden Table with Drawer")
register_simple_metal_table("bronze", "Simple Bronze Metal Table")
register_simple_metal_table("tin", "Simple Tin Metal Table")
register_simple_metal_table("copper", "Simple Copper Metal Table")
register_simple_metal_table("steel", "Simple Steel Metal Table")
register_simple_metal_table("gold", "Simple Gold Metal Table")
register_storage_metal_table("bronze", "Bronze Metal Table with Drawer")
register_storage_metal_table("tin", "Tin Metal Table with Drawer")
register_storage_metal_table("copper", "Copper Metal Table with Drawer")
register_storage_metal_table("steel", "Steel Metal Table with Drawer")
register_storage_metal_table("gold", "Gold Metal Table with Drawer")
if minetest.get_modpath("tubelib") then
-- Simple Tubelib-style wooden table
minetest.register_node("moderntables:tubelib_table", {
description = "Simple Tubelib Table",
tiles = {
-- up, down, right, left, back, front
"tubelib_front.png",
"tubelib_front.png^moderntables_tubelib_legs_top.png",
"tubelib_front.png",
"tubelib_front.png",
"tubelib_front.png",
"tubelib_front.png",
},
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = table_nodebox,
},
selection_box = {
type = "fixed",
fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 },
},
paramtype = "light",
paramtype2 = "facedir",
place_param2 = 0,
is_ground_content = false,
groups = { choppy = 2, cracky = 2, crumbly = 2 },
sounds = default.node_sound_wood_defaults(),
on_rotate = screwdriver.disallow,
})
-- Tubelib-style wooden table with drawer inventory
minetest.register_node("moderntables:tubelib_storage_table", {
description = "Tubelib Table with Drawer",
tiles = {
-- up, down, right, left, back, front
"tubelib_front.png",
"tubelib_front.png^moderntables_tubelib_legs_top.png",
"tubelib_front.png^moderntables_tubelib_drawer_side.png",
"tubelib_front.png^moderntables_tubelib_drawer_side.png",
"tubelib_front.png^moderntables_tubelib_drawer_side.png",
"tubelib_front.png^moderntables_tubelib_drawer_side.png^moderntables_drawer_handle.png",
},
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = table_drawer_nodebox,
},
selection_box = {
type = "fixed",
fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 },
},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
groups = { choppy = 2, cracky = 2, crumbly = 2 },
sounds = default.node_sound_wood_defaults(),
formspec = inv_formspec,
on_rotate = screwdriver.rotate_simple,
can_dig = can_dig,
after_place_node = after_place_node,
})
-- Simple Tubelib-inspired metal table
minetest.register_node("moderntables:tubelib_metal_table", {
description = "Simple Tubelib Metal Table",
tiles = {
-- up, down, right, left, back, front
"moderntables_tubelib_metal_top.png",
"moderntables_tubelib_metal_top.png^moderntables_tubelib_legs_bottom.png",
"moderntables_tubelib_side.png",
"moderntables_tubelib_side.png",
"moderntables_tubelib_side.png",
"moderntables_tubelib_side.png"
},
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = table_nodebox,
},
selection_box = {
type = "fixed",
fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 },
},
paramtype = "light",
paramtype2 = "facedir",
place_param2 = 0,
is_ground_content = false,
groups = { choppy = 2, cracky = 2, crumbly = 2 },
sounds = default.node_sound_metal_defaults(),
on_rotate = screwdriver.disallow,
})
-- Tubelib-inspired metal table with drawer inventory
minetest.register_node("moderntables:tubelib_storage_metal_table", {
description = "Tubelib Metal Table with Drawer",
tiles = {
-- up, down, right, left, back, front
"moderntables_tubelib_metal_top.png",
"moderntables_tubelib_metal_top.png^moderntables_tubelib_legs_bottom.png",
"moderntables_tubelib_side.png^moderntables_tubelib_metal_drawer_side.png",
"moderntables_tubelib_side.png^moderntables_tubelib_metal_drawer_side.png",
"moderntables_tubelib_side.png^moderntables_tubelib_metal_drawer_side.png",
"moderntables_tubelib_side.png^moderntables_tubelib_metal_drawer_front.png^moderntables_drawer_handle.png",
},
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = table_drawer_nodebox,
},
selection_box = {
type = "fixed",
fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 },
},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
groups = { choppy = 2, cracky = 2, crumbly = 2 },
sounds = default.node_sound_metal_defaults(),
formspec = inv_formspec,
on_rotate = screwdriver.rotate_simple,
can_dig = can_dig,
after_place_node = after_place_node,
})
-- Four wooden legs with metal shoes to support Tubelib machines
minetest.register_node("moderntables:tubelib_stand", {
description = "Simple Tubelib Stand",
tiles = {
-- up, down, right, left, back, front
"moderntables_tubelib_legs_top.png",
"moderntables_tubelib_legs_bottom.png",
"moderntables_tubelib_legs_side.png",
"moderntables_tubelib_legs_side.png",
"moderntables_tubelib_legs_side.png",
"moderntables_tubelib_legs_side.png"
},
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{ -0.5, -0.5, 0.375, -0.375, 0.5, 0.5 },
{ 0.375, -0.5, 0.375, 0.5, 0.5, 0.5 },
{ -0.5, -0.5, -0.5, -0.375, 0.5, -0.375 },
{ 0.375, -0.5, -0.5, 0.5, 0.5, -0.375 },
}
},
paramtype = "light",
sunlight_propagates = true,
paramtype2 = "facedir",
place_param2 = 0,
groups = { choppy = 2, cracky = 2, crumbly = 2 },
is_ground_content = false,
sounds = default.node_sound_wood_defaults(),
on_rotate = screwdriver.disallow,
})
minetest.register_craft({
output = "moderntables:tubelib_stand",
recipe = {
{ "group:wood", "", "group:wood" },
{ "group:wood", "", "group:wood" },
{ "default:steel_ingot", "", "default:steel_ingot" },
},
})
minetest.register_craft({
output = "moderntables:tubelib_table",
type = "shapeless",
recipe = { "moderntables:tubelib_stand", "group:wood",
"group:wood", "group:wood" },
})
minetest.register_craft({
output = "moderntables:tubelib_metal_table",
type = "shapeless",
recipe = { "moderntables:tubelib_stand", "default:steel_ingot",
"default:steel_ingot", "default:steel_ingot" },
})
minetest.register_craft({
output = "moderntables:tubelib_storage_table",
type = "shapeless",
recipe = { "moderntables:tubelib_table", "default:chest" },
})
minetest.register_craft({
output = "moderntables:tubelib_storage_metal_table",
type = "shapeless",
recipe = { "moderntables:tubelib_metal_table", "default:chest" },
})
end