summaryrefslogtreecommitdiff
path: root/cottages/nodes_furniture.lua
diff options
context:
space:
mode:
Diffstat (limited to 'cottages/nodes_furniture.lua')
-rw-r--r--cottages/nodes_furniture.lua599
1 files changed, 599 insertions, 0 deletions
diff --git a/cottages/nodes_furniture.lua b/cottages/nodes_furniture.lua
new file mode 100644
index 0000000..0be9b6e
--- /dev/null
+++ b/cottages/nodes_furniture.lua
@@ -0,0 +1,599 @@
+---------------------------------------------------------------------------------------
+-- furniture
+---------------------------------------------------------------------------------------
+-- contains:
+-- * a bed seperated into foot and head reagion so that it can be placed manually; it has
+-- no other functionality than decoration!
+-- * a sleeping mat - mostly for NPC that cannot afford a bet yet
+-- * bench - if you don't have 3dforniture:chair, then this is the next best thing
+-- * table - very simple one
+-- * shelf - for stroring things; this one is 3d
+-- * stovepipe - so that the smoke from the furnace can get away
+-- * washing place - put it over a water source and you can 'wash' yourshelf
+---------------------------------------------------------------------------------------
+-- TODO: change the textures of the bed (make the clothing white, foot path not entirely covered with cloth)
+
+local S = cottages.S
+
+-- a bed without functionality - just decoration
+minetest.register_node("cottages:bed_foot", {
+ description = S("Bed (foot region)"),
+ drawtype = "nodebox",
+ tiles = {"cottages_beds_bed_top_bottom.png", cottages.texture_furniture, "cottages_beds_bed_side.png", "cottages_beds_bed_side.png", "cottages_beds_bed_side.png", "cottages_beds_bed_side.png"},
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3},
+ sounds = default.node_sound_wood_defaults(),
+ node_box = {
+ type = "fixed",
+ fixed = {
+ -- bed
+ {-0.5, 0.0, -0.5, 0.5, 0.3, 0.5},
+
+ -- stützen
+ {-0.5, -0.5, -0.5, -0.4, 0.5, -0.4},
+ { 0.4,-0.5, -0.5, 0.5, 0.5, -0.4},
+
+ -- Querstrebe
+ {-0.4, 0.3, -0.5, 0.4, 0.5, -0.4}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5, -0.5, -0.5, 0.5, 0.3, 0.5},
+ }
+ },
+ is_ground_content = false,
+ on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
+ return cottages.sleep_in_bed( pos, node, clicker, itemstack, pointed_thing );
+ end
+})
+
+-- the bed is split up in two parts to avoid destruction of blocks on placement
+minetest.register_node("cottages:bed_head", {
+ description = S("Bed (head region)"),
+ drawtype = "nodebox",
+ tiles = {"cottages_beds_bed_top_top.png", cottages.texture_furniture, "cottages_beds_bed_side_top_r.png", "cottages_beds_bed_side_top_l.png", cottages.texture_furniture, "cottages_beds_bed_side.png"},
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3},
+ sounds = default.node_sound_wood_defaults(),
+ node_box = {
+ type = "fixed",
+ fixed = {
+ -- bed
+ {-0.5, 0.0, -0.5, 0.5, 0.3, 0.5},
+
+ -- stützen
+ {-0.5,-0.5, 0.4, -0.4, 0.5, 0.5},
+ { 0.4,-0.5, 0.4, 0.5, 0.5, 0.5},
+
+ -- Querstrebe
+ {-0.4, 0.3, 0.4, 0.4, 0.5, 0.5}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5, -0.5, -0.5, 0.5, 0.3, 0.5},
+ }
+ },
+ is_ground_content = false,
+ on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
+ return cottages.sleep_in_bed( pos, node, clicker, itemstack, pointed_thing );
+ end
+})
+
+
+-- the basic version of a bed - a sleeping mat
+-- to facilitate upgrade path straw mat -> sleeping mat -> bed, this uses a nodebox
+minetest.register_node("cottages:sleeping_mat", {
+ description = S("sleeping mat"),
+ drawtype = 'nodebox',
+ tiles = { 'cottages_sleepingmat.png' }, -- done by VanessaE
+ wield_image = 'cottages_sleepingmat.png',
+ inventory_image = 'cottages_sleepingmat.png',
+ sunlight_propagates = true,
+ paramtype = 'light',
+ paramtype2 = "facedir",
+ walkable = false,
+ groups = { snappy = 3 },
+ sounds = default.node_sound_leaves_defaults(),
+ selection_box = {
+ type = "wallmounted",
+ },
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-0.48, -0.5,-0.48, 0.48, -0.45, 0.48},
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-0.48, -0.5,-0.48, 0.48, -0.25, 0.48},
+ }
+ },
+ is_ground_content = false,
+ on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
+ return cottages.sleep_in_bed( pos, node, clicker, itemstack, pointed_thing );
+ end
+})
+
+
+
+-- furniture; possible replacement: 3dforniture:chair
+minetest.register_node("cottages:bench", {
+ drawtype = "nodebox",
+ description = S("simple wooden bench"),
+ tiles = {"cottages_minimal_wood.png", "cottages_minimal_wood.png", "cottages_minimal_wood.png", "cottages_minimal_wood.png", "cottages_minimal_wood.png", "cottages_minimal_wood.png"},
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3},
+ sounds = default.node_sound_wood_defaults(),
+ node_box = {
+ type = "fixed",
+ fixed = {
+ -- sitting area
+ {-0.5, -0.15, 0.1, 0.5, -0.05, 0.5},
+
+ -- stützen
+ {-0.4, -0.5, 0.2, -0.3, -0.15, 0.4},
+ { 0.3, -0.5, 0.2, 0.4, -0.15, 0.4},
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5, -0.5, 0, 0.5, 0, 0.5},
+ }
+ },
+ is_ground_content = false,
+ on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
+ return cottages.sit_on_bench( pos, node, clicker, itemstack, pointed_thing );
+ end,
+})
+
+
+-- a simple table; possible replacement: 3dforniture:table
+local cottages_table_def = {
+ description = S("table"),
+ drawtype = "nodebox",
+ -- top, bottom, side1, side2, inner, outer
+ tiles = {"cottages_minimal_wood.png"},
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
+ node_box = {
+ type = "fixed",
+ fixed = {
+ { -0.1, -0.5, -0.1, 0.1, 0.3, 0.1},
+ { -0.5, 0.3, -0.5, 0.5, 0.4, 0.5},
+ },
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ { -0.5, -0.5, -0.5, 0.5, 0.4, 0.5},
+ },
+ },
+ is_ground_content = false,
+}
+
+
+-- search for the workbench in AdventureTest
+local workbench = minetest.registered_nodes[ "workbench:3x3"];
+if( workbench ) then
+ cottages_table_def.tiles = {workbench.tiles[1], cottages_table_def.tiles[1]};
+ cottages_table_def.on_rightclick = workbench.on_rightclick;
+end
+-- search for the workbench from RealTEst
+workbench = minetest.registered_nodes[ "workbench:work_bench_birch"];
+if( workbench ) then
+ cottages_table_def.tiles = {workbench.tiles[1], cottages_table_def.tiles[1]};
+ cottages_table_def.on_construct = workbench.on_construct;
+ cottages_table_def.can_dig = workbench.can_dig;
+ cottages_table_def.on_metadata_inventory_take = workbench.on_metadata_inventory_take;
+ cottages_table_def.on_metadata_inventory_move = workbench.on_metadata_inventory_move;
+ cottages_table_def.on_metadata_inventory_put = workbench.on_metadata_inventory_put;
+end
+
+minetest.register_node("cottages:table", cottages_table_def );
+
+-- looks better than two slabs impersonating a shelf; also more 3d than a bookshelf
+-- the infotext shows if it's empty or not
+minetest.register_node("cottages:shelf", {
+ description = S("open storage shelf"),
+ drawtype = "nodebox",
+ -- top, bottom, side1, side2, inner, outer
+ tiles = {"cottages_minimal_wood.png"},
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
+ node_box = {
+ type = "fixed",
+ fixed = {
+
+ { -0.5, -0.5, -0.3, -0.4, 0.5, 0.5},
+ { 0.4, -0.5, -0.3, 0.5, 0.5, 0.5},
+
+ { -0.5, -0.2, -0.3, 0.5, -0.1, 0.5},
+ { -0.5, 0.3, -0.3, 0.5, 0.4, 0.5},
+ },
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
+ },
+ },
+
+ on_construct = function(pos)
+
+ local meta = minetest.get_meta(pos);
+
+ meta:set_string("formspec",
+ "size[8,8]"..
+ "list[current_name;main;0,0;8,3;]"..
+ "list[current_player;main;0,4;8,4;]")
+ meta:set_string("infotext", S("open storage shelf"))
+ local inv = meta:get_inventory();
+ inv:set_size("main", 24);
+ end,
+
+ can_dig = function( pos,player )
+ local meta = minetest.get_meta( pos );
+ local inv = meta:get_inventory();
+ return inv:is_empty("main");
+ end,
+
+ on_metadata_inventory_put = function(pos, listname, index, stack, player)
+ local meta = minetest.get_meta( pos );
+ meta:set_string('infotext', S('open storage shelf (in use)'));
+ end,
+ on_metadata_inventory_take = function(pos, listname, index, stack, player)
+ local meta = minetest.get_meta( pos );
+ local inv = meta:get_inventory();
+ if( inv:is_empty("main")) then
+ meta:set_string('infotext', S('open storage shelf (empty)'));
+ end
+ end,
+ is_ground_content = false,
+
+
+})
+
+-- so that the smoke from a furnace can get out of a building
+minetest.register_node("cottages:stovepipe", {
+ description = S("stovepipe"),
+ drawtype = "nodebox",
+ tiles = {"cottages_steel_block.png"},
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
+ node_box = {
+ type = "fixed",
+ fixed = {
+ { 0.20, -0.5, 0.20, 0.45, 0.5, 0.45},
+ },
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ { 0.20, -0.5, 0.20, 0.45, 0.5, 0.45},
+ },
+ },
+ is_ground_content = false,
+})
+
+
+-- this washing place can be put over a water source (it is open at the bottom)
+minetest.register_node("cottages:washing", {
+ description = S("washing place"),
+ drawtype = "nodebox",
+ -- top, bottom, side1, side2, inner, outer
+ tiles = {"cottages_clay.png"},
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
+ node_box = {
+ type = "fixed",
+ fixed = {
+ { -0.5, -0.5, -0.5, 0.5, -0.2, -0.2},
+
+ { -0.5, -0.5, -0.2, -0.4, 0.2, 0.5},
+ { 0.4, -0.5, -0.2, 0.5, 0.2, 0.5},
+
+ { -0.4, -0.5, 0.4, 0.4, 0.2, 0.5},
+ { -0.4, -0.5, -0.2, 0.4, 0.2, -0.1},
+
+ },
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ { -0.5, -0.5, -0.5, 0.5, 0.2, 0.5},
+ },
+ },
+ on_rightclick = function(pos, node, player)
+ -- works only with water beneath
+ local node_under = minetest.get_node( {x=pos.x, y=(pos.y-1), z=pos.z} );
+ if( not( node_under ) or node_under.name == "ignore" or (node_under.name ~= 'default:water_source' and node_under.name ~= 'default:water_flowing')) then
+ minetest.chat_send_player( player:get_player_name(), S("Sorry. This washing place is out of water. Please place it above water!"));
+ else
+ minetest.chat_send_player( player:get_player_name(), S("You feel much cleaner after some washing."));
+ end
+ end,
+ is_ground_content = false,
+
+})
+
+
+---------------------------------------------------------------------------------------
+-- functions for sitting or sleeping
+---------------------------------------------------------------------------------------
+
+cottages.allow_sit = function( player )
+ -- no check possible
+ if( not( player.get_player_velocity )) then
+ return true;
+ end
+ local velo = player:get_player_velocity();
+ if( not( velo )) then
+ return false;
+ end
+ local max_velo = 0.0001;
+ if( math.abs(velo.x) < max_velo
+ and math.abs(velo.y) < max_velo
+ and math.abs(velo.z) < max_velo ) then
+ return true;
+ end
+ return false;
+end
+
+cottages.sit_on_bench = function( pos, node, clicker, itemstack, pointed_thing )
+ if( not( clicker ) or not( default.player_get_animation ) or not( cottages.allow_sit( clicker ))) then
+ return;
+ end
+
+ local animation = default.player_get_animation( clicker );
+ local pname = clicker:get_player_name();
+
+ if( animation and animation.animation=="sit") then
+ default.player_attached[pname] = false
+ clicker:setpos({x=pos.x,y=pos.y-0.5,z=pos.z})
+ clicker:set_eye_offset({x=0,y=0,z=0}, {x=0,y=0,z=0})
+ clicker:set_physics_override(1, 1, 1)
+ default.player_set_animation(clicker, "stand", 30)
+ else
+ -- the bench is not centered; prevent the player from sitting on air
+ local p2 = {x=pos.x, y=pos.y, z=pos.z};
+ if not( node ) or node.param2 == 0 then
+ p2.z = p2.z+0.3;
+ elseif node.param2 == 1 then
+ p2.x = p2.x+0.3;
+ elseif node.param2 == 2 then
+ p2.z = p2.z-0.3;
+ elseif node.param2 == 3 then
+ p2.x = p2.x-0.3;
+ end
+
+ clicker:set_eye_offset({x=0,y=-7,z=2}, {x=0,y=0,z=0})
+ clicker:setpos( p2 )
+ default.player_set_animation(clicker, "sit", 30)
+ clicker:set_physics_override(0, 0, 0)
+ default.player_attached[pname] = true
+ end
+end
+
+cottages.sleep_in_bed = function( pos, node, clicker, itemstack, pointed_thing )
+ if( not( clicker ) or not( node ) or not( node.name ) or not( pos ) or not( cottages.allow_sit( clicker))) then
+ return;
+ end
+
+ local animation = default.player_get_animation( clicker );
+ local pname = clicker:get_player_name();
+
+ local place_name = 'place';
+ -- if only one node is present, the player can only sit;
+ -- sleeping requires a bed head+foot or two sleeping mats
+ local allow_sleep = false;
+ local new_animation = 'sit';
+
+ -- let players get back up
+ if( animation and animation.animation=="lay" ) then
+ default.player_attached[pname] = false
+ clicker:setpos({x=pos.x,y=pos.y-0.5,z=pos.z})
+ clicker:set_eye_offset({x=0,y=0,z=0}, {x=0,y=0,z=0})
+ clicker:set_physics_override(1, 1, 1)
+ default.player_set_animation(clicker, "stand", 30)
+ minetest.chat_send_player( pname, 'That was enough sleep for now. You stand up again.');
+ return;
+ end
+
+ local second_node_pos = {x=pos.x, y=pos.y, z=pos.z};
+ -- the node that will contain the head of the player
+ local p = {x=pos.x, y=pos.y, z=pos.z};
+ -- the player's head is pointing in this direction
+ local dir = node.param2;
+ -- it would be odd to sleep in half a bed
+ if( node.name=='cottages:bed_head' ) then
+ if( node.param2==0 ) then
+ second_node_pos.z = pos.z-1;
+ elseif( node.param2==1) then
+ second_node_pos.x = pos.x-1;
+ elseif( node.param2==2) then
+ second_node_pos.z = pos.z+1;
+ elseif( node.param2==3) then
+ second_node_pos.x = pos.x+1;
+ end
+ local node2 = minetest.get_node( second_node_pos );
+ if( not( node2 ) or not( node2.param2 ) or not( node.param2 )
+ or node2.name ~= 'cottages:bed_foot'
+ or node2.param2 ~= node.param2 ) then
+ allow_sleep = false;
+ else
+ allow_sleep = true;
+ end
+ place_name = 'bed';
+
+ -- if the player clicked on the foot of the bed, locate the head
+ elseif( node.name=='cottages:bed_foot' ) then
+ if( node.param2==2 ) then
+ second_node_pos.z = pos.z-1;
+ elseif( node.param2==3) then
+ second_node_pos.x = pos.x-1;
+ elseif( node.param2==0) then
+ second_node_pos.z = pos.z+1;
+ elseif( node.param2==1) then
+ second_node_pos.x = pos.x+1;
+ end
+ local node2 = minetest.get_node( second_node_pos );
+ if( not( node2 ) or not( node2.param2 ) or not( node.param2 )
+ or node2.name ~= 'cottages:bed_head'
+ or node2.param2 ~= node.param2 ) then
+ allow_sleep = false;
+ else
+ allow_sleep = true;
+ end
+ if( allow_sleep==true ) then
+ p = {x=second_node_pos.x, y=second_node_pos.y, z=second_node_pos.z};
+ end
+ place_name = 'bed';
+
+ elseif( node.name=='cottages:sleeping_mat' or node.name=='cottages:straw_mat') then
+ place_name = 'mat';
+ dir = node.param2;
+ allow_sleep = false;
+ -- search for a second mat right next to this one
+ local offset = {{x=0,z=-1}, {x=-1,z=0}, {x=0,z=1}, {x=1,z=0}};
+ for i,off in ipairs( offset ) do
+ node2 = minetest.get_node( {x=pos.x+off.x, y=pos.y, z=pos.z+off.z} );
+ if( node2.name == 'cottages:sleeping_mat' or node2.name=='cottages:straw_mat' ) then
+ -- if a second mat is found, sleeping is possible
+ allow_sleep = true;
+ dir = i-1;
+ end
+ end
+ end
+
+ -- set the right height for the bed
+ if( place_name=='bed' ) then
+ p.y = p.y+0.4;
+ end
+ if( allow_sleep==true ) then
+ -- set the right position (middle of the bed)
+ if( dir==0 ) then
+ p.z = p.z-0.5;
+ elseif( dir==1 ) then
+ p.x = p.x-0.5;
+ elseif( dir==2 ) then
+ p.z = p.z+0.5;
+ elseif( dir==3 ) then
+ p.x = p.x+0.5;
+ end
+ end
+
+ if( default.player_attached[pname] and animation.animation=="sit") then
+ -- just changing the animation...
+ if( allow_sleep==true ) then
+ default.player_set_animation(clicker, "lay", 30)
+ clicker:set_eye_offset({x=0,y=-14,z=2}, {x=0,y=0,z=0})
+ minetest.chat_send_player( pname, 'You lie down and take a nap. A right-click will wake you up.');
+ return;
+ -- no sleeping on this place
+ else
+ default.player_attached[pname] = false
+ clicker:setpos({x=pos.x,y=pos.y-0.5,z=pos.z})
+ clicker:set_eye_offset({x=0,y=0,z=0}, {x=0,y=0,z=0})
+ clicker:set_physics_override(1, 1, 1)
+ default.player_set_animation(clicker, "stand", 30)
+ minetest.chat_send_player( pname, 'That was enough sitting around for now. You stand up again.');
+ return;
+ end
+ end
+
+
+ clicker:set_eye_offset({x=0,y=-7,z=2}, {x=0,y=0,z=0})
+ clicker:setpos( p );
+ default.player_set_animation(clicker, new_animation, 30)
+ clicker:set_physics_override(0, 0, 0)
+ default.player_attached[pname] = true
+
+ if( allow_sleep==true) then
+ minetest.chat_send_player( pname, 'Aaah! What a comftable '..place_name..'. A second right-click will let you sleep.');
+ else
+ minetest.chat_send_player( pname, 'Comftable, but not good enough for a nap. Right-click again if you want to get back up.');
+ end
+end
+
+---------------------------------------------------------------------------------------
+-- crafting receipes
+---------------------------------------------------------------------------------------
+minetest.register_craft({
+ output = "cottages:bed_foot",
+ recipe = {
+ {cottages.craftitem_wool, "", "", },
+ {cottages.craftitem_wood, "", "", },
+ {cottages.craftitem_stick, "", "", }
+ }
+})
+
+minetest.register_craft({
+ output = "cottages:bed_head",
+ recipe = {
+ {"", "", cottages.craftitem_wool, },
+ {"", cottages.craftitem_stick, cottages.craftitem_wood, },
+ {"", "", cottages.craftitem_stick, }
+ }
+})
+
+minetest.register_craft({
+ output = "cottages:sleeping_mat 3",
+ recipe = {
+ {"cottages:wool_tent", "cottages:straw_mat","cottages:straw_mat" }
+ }
+})
+
+
+minetest.register_craft({
+ output = "cottages:table",
+ recipe = {
+ {"", cottages.craftitem_slab_wood, "", },
+ {"", cottages.craftitem_stick, "" }
+ }
+})
+
+minetest.register_craft({
+ output = "cottages:bench",
+ recipe = {
+ {"", cottages.craftitem_wood, "", },
+ {cottages.craftitem_stick, "", cottages.craftitem_stick, }
+ }
+})
+
+
+minetest.register_craft({
+ output = "cottages:shelf",
+ recipe = {
+ {cottages.craftitem_stick, cottages.craftitem_wood, cottages.craftitem_stick, },
+ {cottages.craftitem_stick, cottages.craftitem_wood, cottages.craftitem_stick, },
+ {cottages.craftitem_stick, "", cottages.craftitem_stick}
+ }
+})
+
+minetest.register_craft({
+ output = "cottages:washing 2",
+ recipe = {
+ {cottages.craftitem_stick, },
+ {cottages.craftitem_clay, },
+ }
+})
+
+minetest.register_craft({
+ output = "cottages:stovepipe 2",
+ recipe = {
+ {cottages.craftitem_steel, '', cottages.craftitem_steel},
+ }
+})