From da66780a569712c23ae4f2996cfb4608a9f9d69d Mon Sep 17 00:00:00 2001 From: Vanessa Ezekowitz Date: Fri, 1 Apr 2016 20:02:19 -0400 Subject: copy all standard Dreambuilder mods in from the old subgame (exactly as last supplied there, updates to these mods will follow later) --- cottages/nodes_straw.lua | 578 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 578 insertions(+) create mode 100644 cottages/nodes_straw.lua (limited to 'cottages/nodes_straw.lua') 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"}, + }, +}) -- cgit v1.2.3