Add gui to list craft recipes for some stones
This commit is contained in:
parent
86da47b922
commit
45532ebe6d
|
@ -7,6 +7,71 @@
|
|||
|
||||
local S = minetest.get_translator(minetest.get_current_modname())
|
||||
|
||||
local recipes = {
|
||||
{"mcl_core:cobble", "mcl_stairs:slab_cobble", "mcl_walls:cobble", "mcl_stairs:stair_cobble"},
|
||||
{"mcl_core:granite", "mcl_stairs:slab_granite", "mcl_walls:granite", "mcl_stairs:stair_granite", "mcl_core:granite_smooth", "mcl_stairs:stair_granite_smooth", "mcl_stairs:slab_granite_smooth"},
|
||||
{"mcl_core:diorite", "mcl_stairs:slab_diorite", "mcl_walls:diorite", "mcl_stairs:stair_diorite", "mcl_core:diorite_smooth", "mcl_stairs:stair_diorite_smooth", "mcl_stairs:slab_diorite_smooth"},
|
||||
}
|
||||
|
||||
|
||||
local FMT = {
|
||||
item_image_button = "item_image_button[%f,%f;%f,%f;%s;%s;%s]",
|
||||
item_image = "item_image[%f,%f;%f,%f;%s]",
|
||||
}
|
||||
|
||||
local function show_stonecutter_formspec(items, input)
|
||||
local cut_items = {}
|
||||
|
||||
local x_len = 0
|
||||
local y_len = 0.5
|
||||
|
||||
if items ~= nil then
|
||||
for index, value in pairs(items) do
|
||||
x_len = x_len + 1
|
||||
if x_len > 5 then
|
||||
y_len = y_len + 1
|
||||
x_len = 1
|
||||
end
|
||||
local test = string.format(FMT.item_image_button,x_len+1,y_len,1,1, value, value, "")
|
||||
cut_items[index] = test
|
||||
end
|
||||
end
|
||||
|
||||
local formspec = "size[9,8.75]"..
|
||||
"label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]"..
|
||||
"label[1,0.1;"..minetest.formspec_escape(minetest.colorize("#313131", S("Stonecutter"))).."]"..
|
||||
"list[context;main;0,0;8,4;]"..
|
||||
"list[current_player;main;0,4.5;9,3;9]"..
|
||||
mcl_formspec.get_itemslot_bg(0,4.5,9,3)..
|
||||
"list[current_player;main;0,7.74;9,1;]"..
|
||||
mcl_formspec.get_itemslot_bg(0,7.74,9,1)..
|
||||
"list[context;input;0.5,1.7;1,1;]"..
|
||||
mcl_formspec.get_itemslot_bg(0.5,1.7,1,1)..
|
||||
"list[context;output;7.5,1.7;1,1;]"..
|
||||
mcl_formspec.get_itemslot_bg(7.5,1.7,1,1)..
|
||||
table.concat(cut_items)..
|
||||
"listring[context;output]"..
|
||||
"listring[current_player;main]"..
|
||||
"listring[context;input]"..
|
||||
"listring[current_player;main]"
|
||||
|
||||
return formspec
|
||||
end
|
||||
|
||||
local function update_stonecutter_slots(meta)
|
||||
local inv = meta:get_inventory()
|
||||
local input = inv:get_stack("input", 1)
|
||||
local name = input:get_name()
|
||||
|
||||
local new_output
|
||||
for index, value in pairs(recipes) do
|
||||
if name == value[1] then
|
||||
meta:set_string("formspec", show_stonecutter_formspec(recipes[index]))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
minetest.register_node("mcl_stonecutter:stonecutter", {
|
||||
description = S("Stone Cutter"),
|
||||
_tt_help = S("Used to cut stone like materials."),
|
||||
|
@ -46,6 +111,64 @@ minetest.register_node("mcl_stonecutter:stonecutter", {
|
|||
_mcl_blast_resistance = 3.5,
|
||||
_mcl_hardness = 3.5,
|
||||
sounds = mcl_sounds.node_sound_stone_defaults(),
|
||||
|
||||
allow_metadata_inventory_take = function(pos, listname, index, stack, player)
|
||||
local name = player:get_player_name()
|
||||
if minetest.is_protected(pos, name) then
|
||||
minetest.record_protection_violation(pos, name)
|
||||
return 0
|
||||
else
|
||||
return stack:get_count()
|
||||
end
|
||||
end,
|
||||
on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
|
||||
local meta = minetest.get_meta(pos)
|
||||
if from_list == "output" and to_list == "input" then
|
||||
local inv = meta:get_inventory()
|
||||
for i=1, inv:get_size("input") do
|
||||
if i ~= to_index then
|
||||
local istack = inv:get_stack("input", i)
|
||||
istack:set_count(math.max(0, istack:get_count() - count))
|
||||
inv:set_stack("input", i, istack)
|
||||
end
|
||||
end
|
||||
end
|
||||
update_stonecutter_slots(meta)
|
||||
end,
|
||||
allow_metadata_inventory_put = function(pos, listname, index, stack, player)
|
||||
local name = player:get_player_name()
|
||||
if minetest.is_protected(pos, name) then
|
||||
minetest.record_protection_violation(pos, name)
|
||||
return 0
|
||||
elseif listname == "output" then
|
||||
return 0
|
||||
else
|
||||
return stack:get_count()
|
||||
end
|
||||
end,
|
||||
on_metadata_inventory_put = function(pos, listname, index, stack, player)
|
||||
local meta = minetest.get_meta(pos)
|
||||
update_stonecutter_slots(meta)
|
||||
end,
|
||||
|
||||
on_construct = function(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
inv:set_size("input", 1)
|
||||
inv:set_size("output", 1)
|
||||
local form = show_stonecutter_formspec()
|
||||
meta:set_string("formspec", form)
|
||||
end,
|
||||
|
||||
on_rightclick = function(pos, node, player, itemstack)
|
||||
local name = player:get_player_name()
|
||||
if not player:get_player_control().sneak then
|
||||
local meta = minetest.get_meta(pos)
|
||||
--show_stonecutter_formspec(name, "main", player)
|
||||
update_stonecutter_slots(meta)
|
||||
--meta:set_string("formspec", show_stonecutter_formspec(items[1]))
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
|
|
Loading…
Reference in New Issue