summaryrefslogtreecommitdiff
path: root/cottages/nodes_straw.lua
diff options
context:
space:
mode:
Diffstat (limited to 'cottages/nodes_straw.lua')
-rw-r--r--cottages/nodes_straw.lua578
1 files changed, 578 insertions, 0 deletions
diff --git a/cottages/nodes_straw.lua b/cottages/nodes_straw.lua
new file mode 100644
index 0000000..a26b728
--- /dev/null
+++ b/cottages/nodes_straw.lua
@@ -0,0 +1,578 @@
+---------------------------------------------------------------------------------------
+-- straw - a very basic material
+---------------------------------------------------------------------------------------
+-- * straw mat - for animals and very poor NPC; also basis for other straw things
+-- * straw bale - well, just a good source for building and decoration
+
+local S = cottages.S
+
+local cottages_can_use = function( meta, player )
+ if( not( player) or not( meta )) then
+ return false;
+ end
+ local pname = player:get_player_name();
+ local owner = meta:get_string('owner' );
+ if( not(owner) or owner=="" or owner==pname ) then
+ return true;
+ end
+ return false;
+end
+
+
+-- an even simpler from of bed - usually for animals
+-- it is a nodebox and not wallmounted because that makes it easier to replace beds with straw mats
+minetest.register_node("cottages:straw_mat", {
+ description = S("layer of straw"),
+ drawtype = 'nodebox',
+ tiles = { 'cottages_darkage_straw.png' }, -- done by VanessaE
+ wield_image = 'cottages_darkage_straw.png',
+ inventory_image = 'cottages_darkage_straw.png',
+ sunlight_propagates = true,
+ paramtype = 'light',
+ paramtype2 = "facedir",
+ walkable = false,
+ groups = { snappy = 3 },
+ sounds = default.node_sound_leaves_defaults(),
+ 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
+})
+
+-- straw bales are a must for farming environments; if you for some reason do not have the darkage mod installed, this here gets you a straw bale
+minetest.register_node("cottages:straw_bale", {
+ drawtype = "nodebox",
+ description = S("straw bale"),
+ tiles = {"cottages_darkage_straw_bale.png"},
+ paramtype = "light",
+ groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3},
+ sounds = default.node_sound_wood_defaults(),
+ -- the bale is slightly smaller than a full node
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-0.45, -0.5,-0.45, 0.45, 0.45, 0.45},
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-0.45, -0.5,-0.45, 0.45, 0.45, 0.45},
+ }
+ },
+ is_ground_content = false,
+})
+
+-- just straw
+minetest.register_node("cottages:straw", {
+ drawtype = "normal",
+ description = S("straw"),
+ tiles = {"cottages_darkage_straw.png"},
+ groups = {snappy=3,choppy=3,oddly_breakable_by_hand=3,flammable=3},
+ sounds = default.node_sound_wood_defaults(),
+ -- the bale is slightly smaller than a full node
+ is_ground_content = false,
+})
+
+
+local cottages_formspec_treshing_floor =
+ "size[8,8]"..
+ "image[1.5,0;1,1;"..cottages.texture_stick.."]"..
+ "image[0,1;1,1;farming_wheat.png]"..
+ "list[current_name;harvest;1,1;2,1;]"..
+ "list[current_name;straw;5,0;2,2;]"..
+ "list[current_name;seeds;5,2;2,2;]"..
+ "label[1,0.5;"..S("Harvested wheat:").."]"..
+ "label[4,0.0;"..S("Straw:").."]"..
+ "label[4,2.0;"..S("Seeds:").."]"..
+ "label[0,-0.5;"..S("Threshing floor").."]"..
+ "label[0,2.5;"..S("Punch threshing floor with a stick").."]"..
+ "label[0,3.0;"..S("to get straw and seeds from wheat.").."]"..
+ "list[current_player;main;0,4;8,4;]";
+
+minetest.register_node("cottages:threshing_floor", {
+ drawtype = "nodebox",
+ description = S("threshing floor"),
+-- TODO: stone also looks pretty well for this
+ tiles = {"cottages_junglewood.png^farming_wheat.png","cottages_junglewood.png","cottages_junglewood.png^"..cottages.texture_stick},
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky=2},
+ is_ground_content = false,
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-0.50, -0.5,-0.50, 0.50, -0.40, 0.50},
+
+ {-0.50, -0.4,-0.50,-0.45, -0.20, 0.50},
+ { 0.45, -0.4,-0.50, 0.50, -0.20, 0.50},
+
+ {-0.45, -0.4,-0.50, 0.45, -0.20,-0.45},
+ {-0.45, -0.4, 0.45, 0.45, -0.20, 0.50},
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-0.50, -0.5,-0.50, 0.50, -0.20, 0.50},
+ }
+ },
+ on_construct = function(pos)
+ local meta = minetest.get_meta(pos);
+ meta:set_string("infotext", S("Threshing floor"));
+ local inv = meta:get_inventory();
+ inv:set_size("harvest", 2);
+ inv:set_size("straw", 4);
+ inv:set_size("seeds", 4);
+ meta:set_string("formspec", cottages_formspec_treshing_floor );
+ end,
+
+ after_place_node = function(pos, placer)
+ local meta = minetest.get_meta(pos);
+ meta:set_string("owner", placer:get_player_name() or "");
+ meta:set_string("infotext", S("Threshing floor (owned by %s)"):format(meta:get_string("owner") or ""));
+ meta:set_string("formspec",
+ cottages_formspec_treshing_floor..
+ "label[2.5,-0.5;"..S("Owner: %s"):format(meta:get_string("owner") or "").."]" );
+ end,
+
+ can_dig = function(pos,player)
+
+ local meta = minetest.get_meta(pos);
+ local inv = meta:get_inventory();
+ local owner = meta:get_string('owner');
+
+ if( not( inv:is_empty("harvest"))
+ or not( inv:is_empty("straw"))
+ or not( inv:is_empty("seeds"))
+ or not( player )
+ or ( owner and owner ~= '' and player:get_player_name() ~= owner )) then
+
+ return false;
+ end
+ return true;
+ end,
+
+ allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
+ local meta = minetest.get_meta(pos)
+ if( not( cottages_can_use( meta, player ))) then
+ return 0
+ end
+ return count;
+ end,
+
+ allow_metadata_inventory_put = function(pos, listname, index, stack, player)
+ local meta = minetest.get_meta(pos)
+ -- only accept input the threshing floor can use/process
+ if( listname=='straw'
+ or listname=='seeds'
+ or (listname=='harvest' and stack and stack:get_name() ~= 'farming:wheat' )) then
+ return 0;
+ end
+
+ if( not( cottages_can_use( meta, player ))) then
+ return 0
+ end
+ return stack:get_count()
+ end,
+
+ allow_metadata_inventory_take = function(pos, listname, index, stack, player)
+ local meta = minetest.get_meta(pos)
+ if( not( cottages_can_use( meta, player ))) then
+ return 0
+ end
+ return stack:get_count()
+ end,
+
+
+ on_punch = function(pos, node, puncher)
+ if( not( pos ) or not( node ) or not( puncher )) then
+ return;
+ end
+ -- only punching with a normal stick is supposed to work
+ local wielded = puncher:get_wielded_item();
+ if( not( wielded )
+ or not( wielded:get_name() )
+ or not( minetest.registered_items[ wielded:get_name() ])
+ or not( minetest.registered_items[ wielded:get_name() ].groups )
+ or not( minetest.registered_items[ wielded:get_name() ].groups.stick )) then
+ return;
+ end
+ local name = puncher:get_player_name();
+
+ local meta = minetest.get_meta(pos);
+ local inv = meta:get_inventory();
+
+ local input = inv:get_list('harvest');
+ -- we have two input slots
+ local stack1 = inv:get_stack( 'harvest', 1);
+ local stack2 = inv:get_stack( 'harvest', 2);
+
+ if( ( stack1:is_empty() and stack2:is_empty())
+ or( not( stack1:is_empty()) and stack1:get_name() ~= 'farming:wheat')
+ or( not( stack2:is_empty()) and stack2:get_name() ~= 'farming:wheat')) then
+
+-- minetest.chat_send_player( name, 'One of the input slots contains something else than wheat, or there is no wheat at all.');
+ -- update the formspec
+ meta:set_string("formspec",
+ cottages_formspec_treshing_floor..
+ "label[2.5,-0.5;"..S("Owner: %s"):format(meta:get_string("owner") or "").."]" );
+ return;
+ end
+
+ -- on average, process 25 wheat at each punch (10..40 are possible)
+ local anz_wheat = 10 + math.random( 0, 30 );
+ -- we already made sure there is only wheat inside
+ local found_wheat = stack1:get_count() + stack2:get_count();
+
+ -- do not process more wheat than present in the input slots
+ if( found_wheat < anz_wheat ) then
+ anz_wheat = found_wheat;
+ end
+
+ local overlay1 = "^farming_wheat.png";
+ local overlay2 = "^cottages_darkage_straw.png";
+ local overlay3 = "^"..cottages.texture_wheat_seed;
+
+ -- this can be enlarged by a multiplicator if desired
+ local anz_straw = anz_wheat;
+ local anz_seeds = anz_wheat;
+
+ if( inv:room_for_item('straw','cottages:straw_mat '..tostring( anz_straw ))
+ and inv:room_for_item('seeds',cottages.craftitem_seed_wheat..' '..tostring( anz_seeds ))) then
+
+ -- the player gets two kind of output
+ inv:add_item("straw",'cottages:straw_mat '..tostring( anz_straw ));
+ inv:add_item("seeds",cottages.craftitem_seed_wheat..' '..tostring( anz_seeds ));
+ -- consume the wheat
+ inv:remove_item("harvest", 'farming:wheat '..tostring( anz_wheat ));
+
+ local anz_left = found_wheat - anz_wheat;
+ if( anz_left > 0 ) then
+-- minetest.chat_send_player( name, S('You have threshed %s wheat (%s are left).'):format(anz_wheat,anz_left));
+ else
+-- minetest.chat_send_player( name, S('You have threshed the last %s wheat.'):format(anz_wheat));
+ overlay1 = "";
+ end
+ end
+
+ local hud0 = puncher:hud_add({
+ hud_elem_type = "image",
+ scale = {x = 38, y = 38},
+ text = "cottages_junglewood.png^[colorize:#888888:128",
+ position = {x = 0.5, y = 0.5},
+ alignment = {x = 0, y = 0}
+ });
+
+ local hud1 = puncher:hud_add({
+ hud_elem_type = "image",
+ scale = {x = 15, y = 15},
+ text = "cottages_junglewood.png"..overlay1,
+ position = {x = 0.4, y = 0.5},
+ alignment = {x = 0, y = 0}
+ });
+ local hud2 = puncher:hud_add({
+ hud_elem_type = "image",
+ scale = {x = 15, y = 15},
+ text = "cottages_junglewood.png"..overlay2,
+ position = {x = 0.6, y = 0.35},
+ alignment = {x = 0, y = 0}
+ });
+ local hud3 = puncher:hud_add({
+ hud_elem_type = "image",
+ scale = {x = 15, y = 15},
+ text = "cottages_junglewood.png"..overlay3,
+ position = {x = 0.6, y = 0.65},
+ alignment = {x = 0, y = 0}
+ });
+
+ local hud4 = puncher:hud_add({
+ hud_elem_type = "text",
+ text = tostring( found_wheat-anz_wheat ),
+ number = 0x00CC00,
+ alignment = {x = 0, y = 0},
+ scale = {x = 100, y = 100}, -- bounding rectangle of the text
+ position = {x = 0.4, y = 0.5},
+ });
+ if( not( anz_straw )) then
+ anz_straw = "0";
+ end
+ if( not( anz_seed )) then
+ anz_seed = "0";
+ end
+ local hud5 = puncher:hud_add({
+ hud_elem_type = "text",
+ text = '+ '..tostring( anz_straw )..' straw',
+ number = 0x00CC00,
+ alignment = {x = 0, y = 0},
+ scale = {x = 100, y = 100}, -- bounding rectangle of the text
+ position = {x = 0.6, y = 0.35},
+ });
+ local hud6 = puncher:hud_add({
+ hud_elem_type = "text",
+ text = '+ '..tostring( anz_seed )..' seeds',
+ number = 0x00CC00,
+ alignment = {x = 0, y = 0},
+ scale = {x = 100, y = 100}, -- bounding rectangle of the text
+ position = {x = 0.6, y = 0.65},
+ });
+
+
+
+ minetest.after(2, function()
+ if( puncher ) then
+ puncher:hud_remove(hud1);
+ puncher:hud_remove(hud2);
+ puncher:hud_remove(hud3);
+ puncher:hud_remove(hud4);
+ puncher:hud_remove(hud5);
+ puncher:hud_remove(hud6);
+ puncher:hud_remove(hud0);
+ end
+ end)
+ end,
+})
+
+
+local cottages_handmill_formspec = "size[8,8]"..
+ "image[0,1;1,1;"..cottages.texture_wheat_seed.."]"..
+ "list[current_name;seeds;1,1;1,1;]"..
+ "list[current_name;flour;5,1;2,2;]"..
+ "label[0,0.5;"..S("Wheat seeds:").."]"..
+ "label[4,0.5;"..S("Flour:").."]"..
+ "label[0,-0.3;"..S("Mill").."]"..
+ "label[0,2.5;"..S("Punch this hand-driven mill").."]"..
+ "label[0,3.0;"..S("to convert wheat seeds into flour.").."]"..
+ "list[current_player;main;0,4;8,4;]";
+
+minetest.register_node("cottages:handmill", {
+ description = S("mill, powered by punching"),
+ drawtype = "mesh",
+ mesh = "cottages_handmill.obj",
+ tiles = {"cottages_stone.png"},
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky=2},
+ is_ground_content = false,
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-0.50, -0.5,-0.50, 0.50, 0.25, 0.50},
+ }
+ },
+ collision_box = {
+ type = "fixed",
+ fixed = {
+ {-0.50, -0.5,-0.50, 0.50, 0.25, 0.50},
+ }
+ },
+ on_construct = function(pos)
+ local meta = minetest.get_meta(pos);
+ meta:set_string("infotext", S("Mill, powered by punching"));
+ local inv = meta:get_inventory();
+ inv:set_size("seeds", 1);
+ inv:set_size("flour", 4);
+ meta:set_string("formspec", cottages_handmill_formspec );
+ end,
+
+ after_place_node = function(pos, placer)
+ local meta = minetest.get_meta(pos);
+ meta:set_string("owner", placer:get_player_name() or "");
+ meta:set_string("infotext", S("Mill, powered by punching (owned by %s)"):format(meta:get_string("owner") or ""));
+ meta:set_string("formspec",
+ cottages_handmill_formspec..
+ "label[2.5,-0.5;"..S("Owner: %s"):format(meta:get_string('owner') or "").."]" );
+ end,
+
+ can_dig = function(pos,player)
+
+ local meta = minetest.get_meta(pos);
+ local inv = meta:get_inventory();
+ local owner = meta:get_string('owner');
+
+ if( not( inv:is_empty("flour"))
+ or not( inv:is_empty("seeds"))
+ or not( player )
+ or ( owner and owner ~= '' and player:get_player_name() ~= owner )) then
+
+ return false;
+ end
+ return true;
+ end,
+
+ allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
+ local meta = minetest.get_meta(pos)
+ if( not( cottages_can_use( meta, player ))) then
+ return 0
+ end
+ return count;
+ end,
+
+ allow_metadata_inventory_put = function(pos, listname, index, stack, player)
+ local meta = minetest.get_meta(pos)
+ -- only accept input the threshing floor can use/process
+ if( listname=='flour'
+ or (listname=='seeds' and stack and not( cottages.handmill_product[ stack:get_name()] ))) then
+ return 0;
+ end
+
+ if( not( cottages_can_use( meta, player ))) then
+ return 0
+ end
+ return stack:get_count()
+ end,
+
+ allow_metadata_inventory_take = function(pos, listname, index, stack, player)
+ local meta = minetest.get_meta(pos)
+ if( not( cottages_can_use( meta, player ))) then
+ return 0
+ end
+ return stack:get_count()
+ end,
+
+ -- this code is very similar to the threshing floor; except that it has only one input- and output-slot
+ -- and does not require the usage of a stick
+ on_punch = function(pos, node, puncher)
+ if( not( pos ) or not( node ) or not( puncher )) then
+ return;
+ end
+ local name = puncher:get_player_name();
+
+ local meta = minetest.get_meta(pos);
+ local inv = meta:get_inventory();
+
+ local input = inv:get_list('seeds');
+ local stack1 = inv:get_stack( 'seeds', 1);
+
+ if( ( stack1:is_empty())
+ or( not( stack1:is_empty())
+ and not( cottages.handmill_product[ stack1:get_name() ] ))) then
+
+ if not( stack1:is_empty() ) then
+ minetest.chat_send_player(name,"Nothing happens...")
+ end
+ -- update the formspec
+ meta:set_string("formspec",
+ cottages_handmill_formspec..
+ "label[2.5,-0.5;"..S("Owner: %s"):format(meta:get_string('owner') or "").."]" );
+ return;
+ end
+
+ -- turning the mill is a slow process; 1-21 flour are generated per turn
+ local anz = 1 + math.random( cottages.handmill_min_per_turn, cottages.handmill_max_per_turn );
+ -- we already made sure there is only wheat inside
+ local found = stack1:get_count();
+
+ -- do not process more wheat than present in the input slots
+ if( found < anz ) then
+ anz = found;
+ end
+
+ local product_stack = ItemStack( cottages.handmill_product[ stack1:get_name() ]);
+ local anz_result = anz;
+ -- items that produce more
+ if( product_stack:get_count()> 1 ) then
+ anz_result = anz * product_stack:get_count();
+ end
+
+ if( inv:room_for_item('flour', product_stack:get_name()..' '..tostring( anz_result ))) then
+
+ inv:add_item( 'flour', product_stack:get_name()..' '..tostring( anz_result ));
+ inv:remove_item( 'seeds', stack1:get_name()..' '..tostring( anz ));
+
+ local anz_left = found - anz;
+ if( anz_left > 0 ) then
+ minetest.chat_send_player( name, S('You have ground a %s (%s are left).'):format(stack1:get_definition().description,(anz_left)));
+ else
+ minetest.chat_send_player( name, S('You have ground the last %s.'):format(stack1:get_definition().description));
+ end
+
+ -- if the version of MT is recent enough, rotate the mill a bit
+ if( minetest.swap_node ) then
+ node.param2 = node.param2 + 1;
+ if( node.param2 > 3 ) then
+ node.param2 = 0;
+ end
+ minetest.swap_node( pos, node );
+ end
+ end
+ end,
+})
+
+
+
+
+---------------------------------------------------------------------------------------
+-- crafting receipes
+---------------------------------------------------------------------------------------
+-- this returns corn as well
+-- the replacements work only if the replaced slot gets empty...
+minetest.register_craft({
+ output = "cottages:straw_mat 6",
+ recipe = {
+ {cottages.craftitem_stone,'',''},
+ {"farming:wheat", "farming:wheat", "farming:wheat", },
+ },
+ replacements = {{ cottages.craftitem_stone, cottages.craftitem_seed_wheat.." 3" }},
+})
+
+-- this is a better way to get straw mats
+minetest.register_craft({
+ output = "cottages:threshing_floor",
+ recipe = {
+ {cottages.craftitem_junglewood, cottages.craftitem_chest_locked, cottages.craftitem_junglewood, },
+ {cottages.craftitem_junglewood, cottages.craftitem_stone, cottages.craftitem_junglewood, },
+ },
+})
+
+-- and a way to turn wheat seeds into flour
+minetest.register_craft({
+ output = "cottages:handmill",
+ recipe = {
+ {cottages.craftitem_stick, cottages.craftitem_stone, "", },
+ {"", cottages.craftitem_steel, "", },
+ {"", cottages.craftitem_stone, "", },
+ },
+})
+
+minetest.register_craft({
+ output = "cottages:straw_bale",
+ recipe = {
+ {"cottages:straw_mat"},
+ {"cottages:straw_mat"},
+ {"cottages:straw_mat"},
+ },
+})
+
+minetest.register_craft({
+ output = "cottages:straw",
+ recipe = {
+ {"cottages:straw_bale"},
+ },
+})
+
+minetest.register_craft({
+ output = "cottages:straw_bale",
+ recipe = {
+ {"cottages:straw"},
+ },
+})
+
+minetest.register_craft({
+ output = "cottages:straw_mat 3",
+ recipe = {
+ {"cottages:straw_bale"},
+ },
+})