summaryrefslogtreecommitdiff
path: root/cottages/nodes_barrel.lua
diff options
context:
space:
mode:
Diffstat (limited to 'cottages/nodes_barrel.lua')
-rw-r--r--cottages/nodes_barrel.lua214
1 files changed, 214 insertions, 0 deletions
diff --git a/cottages/nodes_barrel.lua b/cottages/nodes_barrel.lua
new file mode 100644
index 0000000..4c84983
--- /dev/null
+++ b/cottages/nodes_barrel.lua
@@ -0,0 +1,214 @@
+
+---------------------------------------------------------------------
+-- a barrel and a tub - plus a function that makes 'round' objects
+---------------------------------------------------------------------
+-- IMPORTANT NOTE: The barrel requires a lot of nodeboxes. That may be
+-- too much for weak hardware!
+---------------------------------------------------------------------
+-- Functionality: right-click to open/close a barrel;
+-- punch a barrel to change between vertical/horizontal
+---------------------------------------------------------------------
+-- Changelog:
+-- 24.03.13 Can no longer be opended/closed on rightclick because that is now used for a formspec;
+-- instead, it can be filled with liquids.
+-- Filled barrels will always be closed, while empty barrels will always be open.
+
+-- pipes: table with the following entries for each pipe-part:
+-- f: radius factor; if 1, it will have a radius of half a nodebox and fill the entire nodebox
+-- h1, h2: height at witch the nodebox shall start and end; usually -0.5 and 0.5 for a full nodebox
+-- b: make a horizontal part/shelf
+-- horizontal: if 1, then x and y coordinates will be swapped
+
+-- TODO: option so that it works without nodeboxes
+
+local S = cottages.S
+
+barrel = {};
+
+-- prepare formspec
+barrel.on_construct = function( pos )
+
+ local meta = minetest.get_meta(pos);
+ local percent = math.random( 1, 100 ); -- TODO: show real filling
+
+ meta:set_string( 'formspec',
+ "size[8,9]"..
+ "image[2.6,2;2,3;default_sandstone.png^[lowpart:"..
+ (100-percent)..":default_desert_stone.png]".. -- TODO: better images
+ "label[2.2,0;"..S("Pour:").."]"..
+ "list[current_name;input;3,0.5;1,1;]"..
+ "label[5,3.3;"..S("Fill:").."]"..
+ "list[current_name;output;5,3.8;1,1;]"..
+ "list[current_player;main;0,5;8,4;]");
+
+
+ meta:set_string( 'liquid_type', '' ); -- which liquid is in the barrel?
+ meta:set_int( 'liquid_level', 0 ); -- how much of the liquid is in there?
+
+ local inv = meta:get_inventory()
+ inv:set_size("input", 1); -- to fill in new liquid
+ inv:set_size("output", 1); -- to extract liquid
+end
+
+
+-- can only be digged if there are no more vessels/buckets in any of the slots
+-- TODO: allow digging of a filled barrel? this would disallow stacking of them
+barrel.can_dig = function( pos, player )
+ local meta = minetest.get_meta(pos);
+ local inv = meta:get_inventory()
+
+ return ( inv:is_empty('input')
+ and inv:is_empty('output'));
+end
+
+
+-- the barrel received input; either a new liquid that is to be poured in or a vessel that is to be filled
+barrel.on_metadata_inventory_put = function( pos, listname, index, stack, player )
+end
+
+
+-- right-click to open/close barrel; punch to switch between horizontal/vertical position
+ minetest.register_node("cottages:barrel", {
+ description = S("barrel (closed)"),
+ paramtype = "light",
+ drawtype = "mesh",
+ mesh = "cottages_barrel_closed.obj",
+ tiles = {"cottages_barrel.png" },
+ groups = { tree = 1, snappy = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2
+ },
+ drop = "cottages:barrel",
+-- on_rightclick = function(pos, node, puncher)
+-- minetest.add_node(pos, {name = "cottages:barrel_open", param2 = node.param2})
+-- end,
+-- TODO: on_rightclick is no longer available - maybe open if empty and closed if full?
+ on_punch = function(pos, node, puncher)
+ minetest.add_node(pos, {name = "cottages:barrel_lying", param2 = node.param2})
+ end,
+
+ on_construct = function( pos )
+ return barrel.on_construct( pos );
+ end,
+ can_dig = function(pos,player)
+ return barrel.can_dig( pos, player );
+ end,
+ on_metadata_inventory_put = function(pos, listname, index, stack, player)
+ return barrel.on_metadata_inventory_put( pos, listname, index, stack, player );
+ end,
+ is_ground_content = false,
+
+ })
+
+ -- this barrel is opened at the top
+ minetest.register_node("cottages:barrel_open", {
+ description = S("barrel (open)"),
+ paramtype = "light",
+ drawtype = "mesh",
+ mesh = "cottages_barrel.obj",
+ tiles = {"cottages_barrel.png" },
+ groups = { tree = 1, snappy = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, not_in_creative_inventory=1,
+ },
+ drop = "cottages:barrel",
+-- on_rightclick = function(pos, node, puncher)
+-- minetest.add_node(pos, {name = "cottages:barrel", param2 = node.param2})
+-- end,
+ on_punch = function(pos, node, puncher)
+ minetest.add_node(pos, {name = "cottages:barrel_lying_open", param2 = node.param2})
+ end,
+ is_ground_content = false,
+ })
+
+ -- horizontal barrel
+ minetest.register_node("cottages:barrel_lying", {
+ description = S("barrel (closed), lying somewhere"),
+ paramtype = "light",
+ paramtype2 = "facedir",
+ drawtype = "mesh",
+ mesh = "cottages_barrel_closed_lying.obj",
+ tiles = {"cottages_barrel.png" },
+ groups = { tree = 1, snappy = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, not_in_creative_inventory=1,
+ },
+ drop = "cottages:barrel",
+ on_rightclick = function(pos, node, puncher)
+ minetest.add_node(pos, {name = "cottages:barrel_lying_open", param2 = node.param2})
+ end,
+ on_punch = function(pos, node, puncher)
+ if( node.param2 < 4 ) then
+ minetest.add_node(pos, {name = "cottages:barrel_lying", param2 = (node.param2+1)})
+ else
+ minetest.add_node(pos, {name = "cottages:barrel", param2 = 0})
+ end
+ end,
+ is_ground_content = false,
+ })
+
+ -- horizontal barrel, open
+ minetest.register_node("cottages:barrel_lying_open", {
+ description = S("barrel (opened), lying somewhere"),
+ paramtype = "light",
+ paramtype2 = "facedir",
+ drawtype = "mesh",
+ mesh = "cottages_barrel_lying.obj",
+ tiles = {"cottages_barrel.png" },
+ groups = { tree = 1, snappy = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, not_in_creative_inventory=1,
+ },
+ drop = "cottages:barrel",
+ on_rightclick = function(pos, node, puncher)
+ minetest.add_node(pos, {name = "cottages:barrel_lying", param2 = node.param2})
+ end,
+ on_punch = function(pos, node, puncher)
+ if( node.param2 < 4 ) then
+ minetest.add_node(pos, {name = "cottages:barrel_lying_open", param2 = (node.param2+1)})
+ else
+ minetest.add_node(pos, {name = "cottages:barrel_open", param2 = 0})
+ end
+ end,
+ is_ground_content = false,
+
+ })
+
+ -- let's hope "tub" is the correct english word for "bottich"
+ minetest.register_node("cottages:tub", {
+ description = S("tub"),
+ paramtype = "light",
+ drawtype = "mesh",
+ mesh = "cottages_tub.obj",
+ tiles = {"cottages_barrel.png" },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5, -0.5, -0.5, 0.5,-0.1, 0.5},
+ }},
+ collision_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5, -0.5, -0.5, 0.5,-0.1, 0.5},
+ }},
+ groups = { tree = 1, snappy = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2
+ },
+ is_ground_content = false,
+ })
+
+
+minetest.register_craft({
+ output = "cottages:barrel",
+ recipe = {
+ {cottages.craftitem_wood, "", cottages.craftitem_wood },
+ {cottages.craftitem_steel, "", cottages.craftitem_steel},
+ {cottages.craftitem_wood, cottages.craftitem_wood, cottages.craftitem_wood },
+ },
+})
+
+minetest.register_craft({
+ output = "cottages:tub 2",
+ recipe = {
+ {"cottages:barrel"},
+ },
+})
+
+minetest.register_craft({
+ output = "cottages:barrel",
+ recipe = {
+ {"cottages:tub"},
+ {"cottages:tub"},
+ },
+})