mirror of
https://github.com/minetest-mods/crafting_bench.git
synced 2024-11-08 13:33:44 +01:00
158 lines
4.7 KiB
Lua
158 lines
4.7 KiB
Lua
|
-- internationalization boilerplate
|
||
|
local MP = minetest.get_modpath(minetest.get_current_modname())
|
||
|
local S, NS = dofile(MP.."/intllib.lua")
|
||
|
|
||
|
minetest.register_alias("castle:workbench", "crafting_bench:workbench")
|
||
|
|
||
|
minetest.register_node("crafting_bench:workbench",{
|
||
|
description = S("Workbench"),
|
||
|
tiles = {
|
||
|
"crafting_bench_workbench_top.png",
|
||
|
"crafting_bench_workbench_bottom.png",
|
||
|
"crafting_bench_workbench_side.png",
|
||
|
"crafting_bench_workbench_side.png",
|
||
|
"crafting_bench_workbench_back.png",
|
||
|
"crafting_bench_workbench_front.png"
|
||
|
},
|
||
|
paramtype2 = "facedir",
|
||
|
paramtype = "light",
|
||
|
groups = {choppy=2,oddly_breakable_by_hand=2,flammable=2},
|
||
|
sounds = default.node_sound_wood_defaults(),
|
||
|
drawtype = "normal",
|
||
|
on_construct = function ( pos )
|
||
|
local meta = minetest.get_meta( pos )
|
||
|
meta:set_string( 'formspec',
|
||
|
'size[10,10;]' ..
|
||
|
default.gui_bg ..
|
||
|
default.gui_bg_img ..
|
||
|
default.gui_slots ..
|
||
|
'label[1,0;'..S('Source Material')..']' ..
|
||
|
'list[context;src;1,1;2,4;]' ..
|
||
|
'label[4,0;'..S('Recipe to Use')..']' ..
|
||
|
'list[context;rec;4,1;3,3;]' ..
|
||
|
'label[7.5,0;'..S('Craft Output')..']' ..
|
||
|
'list[context;dst;8,1;1,4;]' ..
|
||
|
'list[current_player;main;1,6;8,4;]' )
|
||
|
meta:set_string( 'infotext', S('Workbench'))
|
||
|
local inv = meta:get_inventory()
|
||
|
inv:set_size( 'src', 2 * 4 )
|
||
|
inv:set_size( 'rec', 3 * 3 )
|
||
|
inv:set_size( 'dst', 1 * 4 )
|
||
|
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_move = function(pos, from_list, from_index, to_list, to_index, count, player)
|
||
|
minetest.log("action", S("@1 moves stuff in workbench at @2", player:get_player_name(), minetest.pos_to_string(pos)))
|
||
|
end,
|
||
|
on_metadata_inventory_put = function(pos, listname, index, stack, player)
|
||
|
minetest.log("action", S("@1 moves stuff to workbench at @2", player:get_player_name(), minetest.pos_to_string(pos)))
|
||
|
end,
|
||
|
on_metadata_inventory_take = function(pos, listname, index, stack, player)
|
||
|
minetest.log("action", S("@1 takes stuff from workbench at @2", player:get_player_name(), minetest.pos_to_string(pos)))
|
||
|
end,
|
||
|
})
|
||
|
local get_recipe = function ( inv )
|
||
|
local result, needed, input
|
||
|
needed = inv:get_list( 'rec' )
|
||
|
|
||
|
result, input = minetest.get_craft_result( {
|
||
|
method = 'normal',
|
||
|
width = 3,
|
||
|
items = needed
|
||
|
})
|
||
|
|
||
|
local totalneed = {}
|
||
|
|
||
|
if result.item:is_empty() then
|
||
|
result = nil
|
||
|
else
|
||
|
result = result.item
|
||
|
for _, item in ipairs( needed ) do
|
||
|
if item ~= nil and not item:is_empty() and not inv:contains_item( 'src', item ) then
|
||
|
result = nil
|
||
|
break
|
||
|
end
|
||
|
if item ~= nil and not item:is_empty() then
|
||
|
if totalneed[item:get_name()] == nil then
|
||
|
totalneed[item:get_name()] = 1
|
||
|
else
|
||
|
totalneed[item:get_name()] = totalneed[item:get_name()] + 1
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
for name, number in pairs( totalneed ) do
|
||
|
local totallist = inv:get_list( 'src' )
|
||
|
for i, srcitem in pairs( totallist ) do
|
||
|
if srcitem:get_name() == name then
|
||
|
local taken = srcitem:take_item( number )
|
||
|
number = number - taken:get_count()
|
||
|
totallist[i] = srcitem
|
||
|
end
|
||
|
if number <= 0 then
|
||
|
break
|
||
|
end
|
||
|
end
|
||
|
if number > 0 then
|
||
|
result = nil
|
||
|
break
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
return needed, input, result
|
||
|
end
|
||
|
|
||
|
minetest.register_abm( {
|
||
|
nodenames = { 'crafting_bench:workbench' },
|
||
|
interval = 5,
|
||
|
chance = 1,
|
||
|
action = function ( pos, node )
|
||
|
local meta = minetest.get_meta( pos )
|
||
|
local inv = meta:get_inventory()
|
||
|
local result, newinput, needed
|
||
|
if not inv:is_empty( 'src' ) then
|
||
|
-- Check for a valid recipe and sufficient resources to craft it
|
||
|
needed, newinput, result = get_recipe( inv )
|
||
|
if result ~= nil and inv:room_for_item( 'dst', result ) then
|
||
|
inv:add_item( 'dst', result )
|
||
|
for i, item in pairs( needed ) do
|
||
|
if item ~= nil and item ~= '' then
|
||
|
inv:remove_item( 'src', ItemStack( item ) )
|
||
|
end
|
||
|
if newinput[i] ~= nil and not newinput[i]:is_empty() then
|
||
|
inv:add_item( 'src', newinput[i] )
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
} )
|
||
|
|
||
|
local function has_locked_chest_privilege(meta, player)
|
||
|
if player:get_player_name() ~= meta:get_string("owner") then
|
||
|
return false
|
||
|
end
|
||
|
return true
|
||
|
end
|
||
|
|
||
|
minetest.register_craft({
|
||
|
output = "crafting_bench:workbench",
|
||
|
recipe = {
|
||
|
{"default:steel_ingot","default:steel_ingot","default:steel_ingot"},
|
||
|
{"default:wood", "default:wood","default:steel_ingot"},
|
||
|
{"default:tree", "default:tree","default:steel_ingot"},
|
||
|
}
|
||
|
})
|
||
|
|
||
|
-- Hopper compatibility
|
||
|
if minetest.get_modpath("hopper") and hopper ~= nil and hopper.add_container ~= nil then
|
||
|
hopper:add_container({
|
||
|
{"top", "crafting_bench:workbench", "dst"},
|
||
|
{"side", "crafting_bench:workbench", "src"},
|
||
|
{"bottom", "crafting_bench:workbench", "src"},
|
||
|
})
|
||
|
end
|