diff --git a/depends.txt b/depends.txt deleted file mode 100644 index 562cf63..0000000 --- a/depends.txt +++ /dev/null @@ -1 +0,0 @@ -default diff --git a/unified_inventory/aaa_recipeshook/depends.txt b/unified_inventory/aaa_recipeshook/depends.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/unified_inventory/aaa_recipeshook/depends.txt @@ -0,0 +1 @@ + diff --git a/unified_inventory/aaa_recipeshook/init.lua b/unified_inventory/aaa_recipeshook/init.lua new file mode 100644 index 0000000..d1ce1e9 --- /dev/null +++ b/unified_inventory/aaa_recipeshook/init.lua @@ -0,0 +1,27 @@ +-- override minetest.register_craft +crafts_table ={} +crafts_table_count=0 + +local minetest_register_craft = minetest.register_craft +minetest.register_craft = function (options) + minetest_register_craft(options) + register_craft(options) +end + +-- register_craft +register_craft = function(options) + if options.output == nil then + return + end + local itemstack = ItemStack(options.output) + if itemstack:is_empty() then + return + end + if crafts_table[itemstack:get_name()]==nil then + crafts_table[itemstack:get_name()] = {} + end + table.insert(crafts_table[itemstack:get_name()],options) + crafts_table_count=crafts_table_count+1 +end + + diff --git a/unified_inventory/modpack.txt b/unified_inventory/modpack.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/unified_inventory/modpack.txt @@ -0,0 +1 @@ + diff --git a/init.lua b/unified_inventory/unified_inventory/api.lua similarity index 56% rename from init.lua rename to unified_inventory/unified_inventory/api.lua index ec96e89..db0a069 100644 --- a/init.lua +++ b/unified_inventory/unified_inventory/api.lua @@ -1,12 +1,5 @@ ---loading modules -modpath=minetest.get_modpath("unified_inventory") -dofile(modpath.."/bags.lua") - --- expose api +--data tables definitions unified_inventory = {} --- define buttons -unified_inventory.buttons = {} -unified_inventory.control_buttons = {} unified_inventory.players = {} unified_inventory.current_page = {} unified_inventory.current_index = {} @@ -15,11 +8,13 @@ unified_inventory.items_list = {} unified_inventory.filtered_items_list_size = {} unified_inventory.filtered_items_list = {} unified_inventory.activefilter = {} +unified_inventory.alternate = {} +unified_inventory.current_item = {} -- default inventory page unified_inventory.default = "craft" - +-- homepos stuff local home_gui = {} local homepos = {} unified_inventory.home_filename = minetest.get_worldpath()..'/unified_inventory_home' @@ -48,7 +43,25 @@ minetest.register_on_joinplayer(function(player) unified_inventory.filtered_items_list_size[player_name]=unified_inventory.items_list_size unified_inventory.activefilter[player_name]="" unified_inventory.apply_filter(player_name, "") + unified_inventory.alternate[player_name] = 1 + unified_inventory.current_item[player_name] =nil unified_inventory.set_inventory_formspec(player,unified_inventory.get_formspec(player, unified_inventory.default)) + + local inv = minetest.create_detached_inventory(player:get_player_name().."craftrecipe",{ + allow_put = function(inv, listname, index, stack, player) + return 0 + end, + allow_take = function(inv, listname, index, stack, player) + return 0 + end, + allow_move = function(inv, from_list, from_index, to_list, to_index, count, player) + return 0 + end, + }) + inv:set_size("output", 1) + inv:set_size("build", 3*3) + inv:set_size("cook", 1) + inv:set_size("fuel", 1) end) -- set_inventory_formspec @@ -95,15 +108,11 @@ unified_inventory.get_formspec = function(player,page) formspec = formspec .. "field[9.195,8.325;3,1;searchbox;;]" formspec = formspec .. "button[12,8;1.2,1;searchbutton;Search]" - if page=="main" then - return formspec - end - -- craft page if page=="craft" then formspec = formspec.."label[0,0;Crafting]" - formspec = formspec.."list[current_player;craftpreview;5.25,2;1,1;]" - formspec = formspec.."list[current_player;craft;1.75,1;3,3;]" + formspec = formspec.."list[current_player;craftpreview;6,1;1,1;]" + formspec = formspec.."list[current_player;craft;2,1;3,3;]" if minetest.setting_getbool("creative_mode") then formspec = formspec.."label[0,2.5;Refill:]" formspec = formspec.."list[detached:refill;main;0,3;1,1;]" @@ -115,6 +124,45 @@ unified_inventory.get_formspec = function(player,page) -- craft guide page if page=="craftguide" then formspec = formspec.."label[0,0;Crafting Guide]" + formspec = formspec.."list[detached:"..player_name.."craftrecipe;build;2,1;3,3;]" + formspec = formspec.."list[detached:"..player_name.."craftrecipe;output;6,1;1,1;]" + formspec = formspec.."label[2,0.5;Input:]" + formspec = formspec.."label[6,0.5;Output:]" + formspec = formspec.."label[6,2.6;Method:]" + local item_name=unified_inventory.current_item[player_name] + --print (dump(item_name)) + if item_name then + local alternates = 0 + local alternate = unified_inventory.alternate[player_name] + local crafts = crafts_table[item_name] + + if crafts ~= nil then + alternates = #crafts + local craft = crafts[alternate] + local method = "Crafting" + if craft.type == "shapeless" then + method="Crafting" + end + if craft.type == "cooking" then + method="Cooking" + end + if craft.type == "fuel" then + method="Fuel" + end + if craft.type == "grinding" then + method="Grinding" + end + if craft.type == "alloy" then + method="Alloy cooking" + end + formspec = formspec.."label[6,3;"..method.."]" + end + + if alternates > 1 then + formspec = formspec.."label[0,2.6;Recipe "..tostring(alternate).." of "..tostring(alternates).."]" + formspec = formspec.."button[0,3.15;2,1;alternate;Alternate]" + end + end end -- bags @@ -124,10 +172,10 @@ unified_inventory.get_formspec = function(player,page) formspec=formspec.."button[2,2;2,0.5;bag2;Bag 2]" formspec=formspec.."button[4,2;2,0.5;bag3;Bag 3]" formspec=formspec.."button[6,2;2,0.5;bag4;Bag 4]" - formspec=formspec.."list[detached:"..player:get_player_name().."_bags;bag1;0.5,1;1,1;]" - formspec=formspec.."list[detached:"..player:get_player_name().."_bags;bag2;2.5,1;1,1;]" - formspec=formspec.."list[detached:"..player:get_player_name().."_bags;bag3;4.5,1;1,1;]" - formspec=formspec.."list[detached:"..player:get_player_name().."_bags;bag4;6.5,1;1,1;]" + formspec=formspec.."list[detached:"..player_name.."_bags;bag1;0.5,1;1,1;]" + formspec=formspec.."list[detached:"..player_name.."_bags;bag2;2.5,1;1,1;]" + formspec=formspec.."list[detached:"..player_name.."_bags;bag3;4.5,1;1,1;]" + formspec=formspec.."list[detached:"..player_name.."_bags;bag4;6.5,1;1,1;]" end for i=1,4 do @@ -143,7 +191,7 @@ unified_inventory.get_formspec = function(player,page) formspec = formspec.."label[0,0;Miscellaneous]" formspec=formspec.."button[0,1;2,0.5;home_gui_set;Set Home]" formspec=formspec.."button_exit[2,1;2,0.5;home_gui_go;Go Home]" - local home = homepos[player:get_player_name()] + local home = homepos[player_name] if home ~= nil then formspec = formspec formspec=formspec.."label[4,.9;Home set to:]" @@ -171,7 +219,7 @@ unified_inventory.get_formspec = function(player,page) end end formspec=formspec.."label[8.2,0;Page:]" - formspec=formspec.."label[9,0;"..page.."/"..pagemax.."]" + formspec=formspec.."label[9,0;"..page.." of "..pagemax.."]" formspec=formspec.."label[8.2,0.4;Filter:]" formspec=formspec.."label[9,0.4;"..unified_inventory.activefilter[player_name].."]" return formspec @@ -211,7 +259,7 @@ unified_inventory.refill:set_size("main", 1) minetest.register_on_player_receive_fields(function(player, formname, fields) local player_name = player:get_player_name() - -- main + -- main buttons if fields.craft then unified_inventory.set_inventory_formspec(player, unified_inventory.get_formspec(player,"craft")) return @@ -244,7 +292,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end end - -- Miscellanous + -- Miscellaneous if fields.home_gui_set then unified_inventory.set_inventory_formspec(player, unified_inventory.get_formspec(player,"misc")) unified_inventory.set_home(player, player:getpos()) @@ -254,12 +302,12 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) unified_inventory.go_home(player) end if fields.misc_set_day then - minetest.env:set_timeofday((12000 % 24000) / 24000) - minetest.chat_send_player(player_name, "Time of day set to noon.") + minetest.env:set_timeofday((6000 % 24000) / 24000) + minetest.chat_send_player(player_name, "Time of day set to 6am") end if fields.misc_set_night then - minetest.env:set_timeofday(0) - minetest.chat_send_player(player_name, "Time of day set to midnight.") + minetest.env:set_timeofday((21000 % 24000) / 24000) + minetest.chat_send_player(player_name, "Time of day set to 9pm") end -- Inventory page controls @@ -295,22 +343,28 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) unified_inventory.current_index[player_name] = (start_i-1)*80+1 unified_inventory.set_inventory_formspec(player, unified_inventory.get_formspec(player,unified_inventory.current_page[player_name])) end - + + -- Item list buttons local list_index=unified_inventory.current_index[player_name] + local page=unified_inventory.current_page[player_name] for i=0,80,1 do local button="item_button"..list_index if fields[button] then - local input={} - input=minetest.get_craft_recipe(unified_inventory.filtered_items_list[player_name][list_index]) - print (dump(input)) - if minetest.setting_getbool("creative_mode") then - local inv = player:get_inventory() - dst_stack={} - dst_stack["name"] = unified_inventory.filtered_items_list[player_name][list_index] - dst_stack["count"]=99 - if inv:room_for_item("main",dst_stack) then - inv:add_item("main",dst_stack) - end + if page=="craftguide" then + unified_inventory.current_item[player_name] = unified_inventory.filtered_items_list[player_name][list_index] + unified_inventory.alternate[player_name] = 1 + unified_inventory.update_recipe (player, unified_inventory.filtered_items_list[player_name][list_index], 1) + unified_inventory.set_inventory_formspec(player, unified_inventory.get_formspec(player,unified_inventory.current_page[player_name])) + else + if minetest.setting_getbool("creative_mode") then + local inv = player:get_inventory() + dst_stack={} + dst_stack["name"] = unified_inventory.filtered_items_list[player_name][list_index] + dst_stack["count"]=99 + if inv:room_for_item("main",dst_stack) then + inv:add_item("main",dst_stack) + end + end end end list_index=list_index+1 @@ -321,6 +375,27 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) unified_inventory.set_inventory_formspec(player, unified_inventory.get_formspec(player,unified_inventory.current_page[player_name])) end + -- alternate button + if fields.alternate then + local item_name=unified_inventory.current_item[player_name] + if item_name then + local alternates = 0 + local alternate=unified_inventory.alternate[player_name] + local crafts = crafts_table[item_name] + if crafts ~= nil then + alternates = #crafts + end + if alternates > 1 then + alternate=alternate+1 + if alternate>alternates then + alternate=1 + end + unified_inventory.alternate[player_name]=alternate + unified_inventory.update_recipe (player, unified_inventory.current_item[player_name], alternate) + unified_inventory.set_inventory_formspec(player, unified_inventory.get_formspec(player,unified_inventory.current_page[player_name])) + end + end + end end) -- load_home @@ -365,14 +440,19 @@ unified_inventory.go_home = function(player) end end ---apply filter to the inventory list +--apply filter to the inventory list (create filtered copy of full one) unified_inventory.apply_filter = function(player_name,filter) local size=0 + local str_temp1=string.lower(filter) + local str_temp2 + local str_temp3 unified_inventory.filtered_items_list[player_name]={} for name,def in pairs(minetest.registered_items) do if (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0) and def.description and def.description ~= "" then - if string.find(def.name, filter) or string.find(def.description, filter) then + str_temp2=string.lower(def.name) + str_temp3=string.lower(def.description) + if string.find(str_temp2, str_temp1) or string.find(str_temp3, str_temp1) then table.insert(unified_inventory.filtered_items_list[player_name], name) size=size+1 end @@ -387,3 +467,160 @@ unified_inventory.apply_filter = function(player_name,filter) end +-- update_recipe +unified_inventory.update_recipe = function(player, stack_name, alternate) + --print("Lookup:"..stack_name) + local inv = minetest.get_inventory({type="detached", name=player:get_player_name().."craftrecipe"}) + for i=0,inv:get_size("build"),1 do + inv:set_stack("build", i, nil) + end + inv:set_stack("cook", 1, nil) + inv:set_stack("fuel", 1, nil) + + inv:set_stack("output", 1, stack_name) + local def + alternate = tonumber(alternate) or 1 + local crafts = crafts_table[stack_name] + if crafts == nil then + --minetest.chat_send_player(player:get_player_name(), "no recipe available for "..stack_name) + return + end + if alternate < 1 or alternate > #crafts then + alternate = 1 + end + local craft = crafts[alternate] + print (dump(craft)) + --minetest.chat_send_player(player:get_player_name(), "recipe for "..stack_name..": "..dump(craft)) + + local itemstack = ItemStack(craft.output) + inv:set_stack("output", 1, itemstack) + + -- cook + if craft.type == "cooking" then + def=unified_inventory.find_item_def(craft.recipe) + if def then + inv:set_stack("build", 1, def) + end + return + end + -- fuel + if craft.type == "fuel" then + def=unified_inventory.find_item_def(craft.recipe) + if def then + inv:set_stack("build", 1, def) + end + return + end + -- build (shaped or shapeless) + if craft.recipe[1] then + def=unified_inventory.find_item_def(craft.recipe[1]) + if def then + inv:set_stack("build", 1, def) + else + def=unified_inventory.find_item_def(craft.recipe[1][1]) + if def then + inv:set_stack("build", 1, def) + end + def=unified_inventory.find_item_def(craft.recipe[1][2]) + if def then + inv:set_stack("build", 2, def) + end + def=unified_inventory.find_item_def(craft.recipe[1][3]) + if def then + inv:set_stack("build", 3, def) + end + end + end + if craft.recipe[2] then + def=unified_inventory.find_item_def(craft.recipe[2]) + if def then + inv:set_stack("build", 2, def) + else + def=unified_inventory.find_item_def(craft.recipe[2][1]) + if def then + inv:set_stack("build", 4, def) + end + def=unified_inventory.find_item_def(craft.recipe[2][2]) + if def then + inv:set_stack("build", 5, def) + end + def=unified_inventory.find_item_def(craft.recipe[2][3]) + if def then + inv:set_stack("build", 6, def) + end + end + end + + if craft.recipe[3] then + def=unified_inventory.find_item_def(craft.recipe[3]) + if def then + inv:set_stack("build", 3, def) + else + def=unified_inventory.find_item_def(craft.recipe[3][1]) + if def then + inv:set_stack("build", 7, def) + end + def=unified_inventory.find_item_def(craft.recipe[3][2]) + if def then + inv:set_stack("build", 8, def) + end + def=unified_inventory.find_item_def(craft.recipe[3][3]) + if def then + inv:set_stack("build", 9, def) + end + end + end + if craft.recipe[4] then + def=unified_inventory.find_item_def(craft.recipe[4]) + if def then + inv:set_stack("build", 4, def) + end + end + if craft.recipe[5] then + def=unified_inventory.find_item_def(craft.recipe[5]) + if def then + inv:set_stack("build", 5, def) + end + end + if craft.recipe[6] then + def=unified_inventory.find_item_def(craft.recipe[6]) + if def then + inv:set_stack("build", 6, def) + end + end + if craft.recipe[7] then + def=unified_inventory.find_item_def(craft.recipe[7]) + if def then + inv:set_stack("build", 7, def) + end + end + if craft.recipe[8] then + def=unified_inventory.find_item_def(craft.recipe[8]) + if def then + inv:set_stack("build", 8, def) + end + end + if craft.recipe[9] then + def=unified_inventory.find_item_def(craft.recipe[9]) + if def then + inv:set_stack("build", 9, def) + end + end +end + +unified_inventory.find_item_def = function(def1) +if type(def1)=="string" then + if string.find(def1, "group:") then + def1=string.gsub(def1, "group:", "") + def1=string.gsub(def1, '\"', "") + for name,def in pairs(minetest.registered_items) do + if def.groups[def1] == 1 and def.groups.not_in_creative_inventory ~= 1 then + return def + end + end + else + return def1 + end +end +return nil +end diff --git a/bags.lua b/unified_inventory/unified_inventory/bags.lua similarity index 100% rename from bags.lua rename to unified_inventory/unified_inventory/bags.lua diff --git a/unified_inventory/unified_inventory/depends.txt b/unified_inventory/unified_inventory/depends.txt new file mode 100644 index 0000000..2feb7d0 --- /dev/null +++ b/unified_inventory/unified_inventory/depends.txt @@ -0,0 +1 @@ +aaa_recipeshook diff --git a/unified_inventory/unified_inventory/init.lua b/unified_inventory/unified_inventory/init.lua new file mode 100644 index 0000000..80855b3 --- /dev/null +++ b/unified_inventory/unified_inventory/init.lua @@ -0,0 +1,4 @@ +-- load api +dofile(minetest.get_modpath("unified_inventory").."/api.lua") + +dofile(minetest.get_modpath("unified_inventory").."/bags.lua") diff --git a/textures/bags_large.png b/unified_inventory/unified_inventory/textures/bags_large.png similarity index 100% rename from textures/bags_large.png rename to unified_inventory/unified_inventory/textures/bags_large.png diff --git a/textures/bags_medium.png b/unified_inventory/unified_inventory/textures/bags_medium.png similarity index 100% rename from textures/bags_medium.png rename to unified_inventory/unified_inventory/textures/bags_medium.png diff --git a/textures/bags_small.png b/unified_inventory/unified_inventory/textures/bags_small.png similarity index 100% rename from textures/bags_small.png rename to unified_inventory/unified_inventory/textures/bags_small.png