From f974fd8c2c8532179edea54643fb10fa4091f322 Mon Sep 17 00:00:00 2001 From: ShadowNinja Date: Sat, 28 Sep 2013 18:15:37 -0400 Subject: [PATCH] Update --- api.lua | 687 +++--------------------- bags.lua | 57 +- callbacks.lua | 182 +++++++ init.lua | 43 +- internal.lua | 223 ++++++++ register.lua | 173 ++++++ textures/ui_copper_chest_inventory.png | Bin 0 -> 11117 bytes textures/ui_furnace_inventory.png | Bin 0 -> 7383 bytes textures/ui_gold_chest_inventory.png | Bin 0 -> 5813 bytes textures/ui_hv_battery_box.png | Bin 0 -> 15941 bytes textures/ui_iron_chest_inventory.png | Bin 0 -> 6685 bytes textures/ui_lv_alloy_furnace.png | Bin 0 -> 8640 bytes textures/ui_lv_battery_box.png | Bin 0 -> 15941 bytes textures/ui_lv_electric_furnace.png | Bin 0 -> 4334 bytes textures/ui_lv_grinder.png | Bin 0 -> 4334 bytes textures/ui_mithril_chest_inventory.png | Bin 0 -> 7804 bytes textures/ui_mv_battery_box.png | Bin 0 -> 15941 bytes textures/ui_silver_chest_inventory.png | Bin 0 -> 7743 bytes textures/ui_wooden_chest_inventory.png | Bin 0 -> 7490 bytes 19 files changed, 737 insertions(+), 628 deletions(-) create mode 100644 callbacks.lua create mode 100644 internal.lua create mode 100644 register.lua create mode 100644 textures/ui_copper_chest_inventory.png create mode 100644 textures/ui_furnace_inventory.png create mode 100644 textures/ui_gold_chest_inventory.png create mode 100644 textures/ui_hv_battery_box.png create mode 100644 textures/ui_iron_chest_inventory.png create mode 100644 textures/ui_lv_alloy_furnace.png create mode 100644 textures/ui_lv_battery_box.png create mode 100644 textures/ui_lv_electric_furnace.png create mode 100644 textures/ui_lv_grinder.png create mode 100644 textures/ui_mithril_chest_inventory.png create mode 100644 textures/ui_mv_battery_box.png create mode 100644 textures/ui_silver_chest_inventory.png create mode 100644 textures/ui_wooden_chest_inventory.png diff --git a/api.lua b/api.lua index 5d04d62..d026cc0 100644 --- a/api.lua +++ b/api.lua @@ -1,656 +1,101 @@ ---data tables definitions -unified_inventory = {} -unified_inventory.players = {} -unified_inventory.current_page = {} -unified_inventory.current_index = {} -unified_inventory.items_list_size = 0 -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 = {} -unified_inventory.crafts_table ={} -unified_inventory.crafts_table_count=0 - --- default inventory page -unified_inventory.default = "craft" - --- homepos stuff -local home_gui = {} -local homepos = {} -unified_inventory.home_filename = minetest.get_worldpath()..'/unified_inventory_home' -- Create detached creative inventory after loading all mods minetest.after(0.01, function() unified_inventory.items_list = {} - 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 + 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 table.insert(unified_inventory.items_list, name) - local recipes=minetest.get_all_craft_recipes(name) - if unified_inventory.crafts_table[name]==nil then - unified_inventory.crafts_table[name] = {} - end - if recipes then - for i=1,#recipes,1 do - table.insert(unified_inventory.crafts_table[name],recipes[i]) - end - end + local recipes = minetest.get_all_craft_recipes(name) + unified_inventory.crafts_table[name] = recipes or {} end end --print(dump(unified_inventory.crafts_table)) table.sort(unified_inventory.items_list) unified_inventory.items_list_size = #unified_inventory.items_list - print ("Unified Inventory. inventory size: "..unified_inventory.items_list_size) + print("Unified Inventory. inventory size: "..#unified_inventory.items_list) end) --- register_on_joinplayer -minetest.register_on_joinplayer(function(player) - local player_name = player:get_player_name() - unified_inventory.players[player_name]={} - unified_inventory.current_index[player_name] = 1 - unified_inventory.filtered_items_list[player_name] = {} - unified_inventory.filtered_items_list[player_name] = unified_inventory.items_list - unified_inventory.filtered_items_list_size[player_name]=unified_inventory.items_list_size - unified_inventory.activefilter[player_name]="" - unified_inventory.apply_filter(player, "") - 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)) - ---crafting guide inventories -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) - if minetest.setting_getbool("creative_mode") then - return stack:get_count() - else - return 0 - end - 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) - --- refill slot -unified_inventory.refill = minetest.create_detached_inventory(player_name.."refill", { - allow_put = function(inv, listname, index, stack, player) - if minetest.setting_getbool("creative_mode") then - return stack:get_count() - else - return 0 - end - end, - on_put = function(inv, listname, index, stack, player) - inv:set_stack(listname, index, ItemStack(stack:get_name().." "..stack:get_stack_max())) - minetest.sound_play("electricity", {to_player=player_name, gain = 1.0}) - end, -}) -unified_inventory.refill:set_size("main", 1) - --- trash slot -unified_inventory.trash = minetest.create_detached_inventory("trash", { - allow_put = function(inv, listname, index, stack, player) - if minetest.setting_getbool("creative_mode") then - return stack:get_count() - else - return 0 - end - end, - on_put = function(inv, listname, index, stack, player) - inv:set_stack(listname, index, nil) - local player_name=player:get_player_name() - minetest.sound_play("trash", {to_player=player_name, gain = 1.0}) - end, -}) -unified_inventory.trash:set_size("main", 1) -end) - --- set_inventory_formspec -unified_inventory.set_inventory_formspec = function(player,formspec) - if player then - player:set_inventory_formspec(formspec) - end -end - --- get_formspec -unified_inventory.get_formspec = function(player,page) - if player==nil then return "" end - local player_name = player:get_player_name() - unified_inventory.current_page[player_name]=page - - local formspec = "size[14,10]" - - -- player inventory - formspec = formspec .. "list[current_player;main;0,4.5;8,4;]" - - -- backgrounds - formspec = formspec .. "background[-0.19,-0.2;14.38,10.55;ui_form_bg.png]" - if page=="craft" then - formspec = formspec .. "background[0.06,0.99;7.92,7.52;ui_crafting_form.png]" - end - if page=="craftguide" then - formspec = formspec .. "background[0.06,0.99;7.92,7.52;ui_craftguide_form.png]" - end - if page=="misc" then - formspec = formspec .. "background[0.06,0.99;7.92,7.52;ui_misc_form.png]" - end - if page=="bags" then - formspec = formspec .. "background[0.06,0.99;7.92,7.52;ui_bags_main_form.png]" - end - - for i=1,4 do - if page=="bag"..i then - local slots = player:get_inventory():get_stack(page, 1):get_definition().groups.bagslots - if slots == 8 then - formspec = formspec .. "background[0.06,0.99;7.92,7.52;ui_bags_sm_form.png]" - elseif slots == 16 then - formspec = formspec .. "background[0.06,0.99;7.92,7.52;ui_bags_med_form.png]" - elseif slots == 24 then - formspec = formspec .. "background[0.06,0.99;7.92,7.52;ui_bags_lg_form.png]" - end - end - end - - -- main buttons - local start_x=0 - formspec = formspec .. "image_button["..(start_x+.65*0)..",9;.8,.8;ui_craft_icon.png;craft;]" - formspec = formspec .. "image_button["..(start_x+.65*1)..",9;.8,.8;ui_craftguide_icon.png;craftguide;]" - formspec = formspec .. "image_button["..(start_x+.65*2)..",9;.8,.8;ui_bags_icon.png;bags;]" - formspec = formspec .. "image_button["..(start_x+.65*3)..",9;.8,.8;ui_sethome_icon.png;home_gui_set;]" - formspec = formspec .. "image_button["..(start_x+.65*4)..",9;.8,.8;ui_gohome_icon.png;home_gui_go;]" - if minetest.setting_getbool("creative_mode") then - formspec = formspec .. "image_button["..(start_x+.65*5)..",9;.8,.8;ui_sun_icon.png;misc_set_day;]" - formspec = formspec .. "image_button["..(start_x+.65*6)..",9;.8,.8;ui_moon_icon.png;misc_set_night;]" - formspec = formspec .. "image_button["..(start_x+.65*7)..",9;.8,.8;ui_trash_icon.png;clear_inv;]" - end - - --controls to flip items pages - start_x=9.2 - formspec = formspec .. "image_button["..(start_x+.6*0)..",9;.8,.8;ui_skip_backward_icon.png;start_list;]" - formspec = formspec .. "image_button["..(start_x+.6*1)..",9;.8,.8;ui_doubleleft_icon.png;rewind3;]" - formspec = formspec .. "image_button["..(start_x+.6*2)..",9;.8,.8;ui_left_icon.png;rewind1;]" - formspec = formspec .. "image_button["..(start_x+.6*3)..",9;.8,.8;ui_right_icon.png;forward1;]" - formspec = formspec .. "image_button["..(start_x+.6*4)..",9;.8,.8;ui_doubleright_icon.png;forward3;]" - formspec = formspec .. "image_button["..(start_x+.6*5)..",9;.8,.8;ui_skip_forward_icon.png;end_list;]" - - -- search box - formspec = formspec .. "field[9.5,8.325;3,1;searchbox;;]" - formspec = formspec .. "image_button[12.2,8.1;.8,.8;ui_search_icon.png;searchbutton;]" - - -- craft page - if page=="craft" then - formspec = formspec.."label[0,0;Crafting]" - 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:"..player_name.."refill;main;0,3;1,1;]" - formspec = formspec.."label[7,2.5;Trash:]" - formspec = formspec.."list[detached:trash;main;7,3;1,1;]" - end - end - - -- 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] - if item_name then - formspec = formspec.."label[2,0;"..item_name.."]" - local alternates = 0 - local alternate = unified_inventory.alternate[player_name] - local crafts = unified_inventory.crafts_table[item_name] - - if crafts ~= nil and #crafts>0 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 - if craft.type == "extracting" then - method="Extracting" - end - if craft.type == "compressing" then - method="Compressing" - 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 - if page=="bags" then - formspec = formspec.."label[0,0;Bags]" - formspec=formspec.."button[0,2;2,0.5;bag1;Bag 1]" - 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_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 - if page=="bag"..i then - local image = player:get_inventory():get_stack("bag"..i, 1):get_definition().inventory_image - formspec=formspec.."image[7,0;1,1;"..image.."]" - formspec=formspec.."list[current_player;bag"..i.."contents;0,1;8,3;]" - end - end - - --Items list - local list_index=unified_inventory.current_index[player_name] - local page=math.floor(list_index / (80) + 1) - local pagemax = math.floor((unified_inventory.filtered_items_list_size[player_name]-1) / (80) + 1) - local image - local item={} - for y=0,9,1 do - for x=0,7,1 do - name=unified_inventory.filtered_items_list[player_name][list_index] - if minetest.registered_items[name] then - formspec=formspec.."item_image_button["..(8.2+x*.7)..","..(1+y*.7)..";.81,.81;"..name..";item_button"..list_index..";]" - list_index=list_index+1 - end - end - end - formspec=formspec.."label[8.2,0;Page:]" - 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 -end - --- register_on_player_receive_fields -minetest.register_on_player_receive_fields(function(player, formname, fields) - local player_name = player:get_player_name() - - -- main buttons - if fields.craft then - unified_inventory.set_inventory_formspec(player, unified_inventory.get_formspec(player,"craft")) - minetest.sound_play("click", {to_player=player_name, gain = 0.1}) - return - end - - if fields.craftguide then - unified_inventory.set_inventory_formspec(player, unified_inventory.get_formspec(player,"craftguide")) - minetest.sound_play("click", {to_player=player_name, gain = 0.1}) - return - end - - if fields.bags then - unified_inventory.set_inventory_formspec(player, unified_inventory.get_formspec(player,"bags")) - minetest.sound_play("click", {to_player=player_name, gain = 0.1}) - return - end - - -- bags - for i=1,4 do - local page = "bag"..i - if fields[page] then - if player:get_inventory():get_stack(page, 1):get_definition().groups.bagslots==nil then - page = "bags" - end - unified_inventory.set_inventory_formspec(player, unified_inventory.get_formspec(player,page)) - minetest.sound_play("click", {to_player=player_name, gain = 0.1}) - return - end - end - - -- Miscellaneous - if fields.home_gui_set then - unified_inventory.set_home(player, player:getpos()) - local home = homepos[player_name] - if home ~= nil then - minetest.sound_play("dingdong", {to_player=player_name, gain = 1.0}) - minetest.chat_send_player(player_name, "Home position set to: "..math.floor(home.x)..","..math.floor(home.y)..","..math.floor(home.z)) - end - end - if fields.home_gui_go then - unified_inventory.set_inventory_formspec(player, unified_inventory.get_formspec(player,"craft")) - minetest.sound_play("teleport", {to_player=player_name, gain = 1.0}) - unified_inventory.go_home(player) - end - if fields.misc_set_day then - if minetest.get_player_privs(player_name).settime==true then - minetest.sound_play("birds", {to_player=player_name, gain = 1.0}) - minetest.env:set_timeofday((6000 % 24000) / 24000) - minetest.chat_send_player(player_name, "Time of day set to 6am") - else - minetest.chat_send_player(player_name, "You don't have settime priviledge!") - end - end - if fields.misc_set_night then - if minetest.get_player_privs(player_name).settime==true then - minetest.sound_play("owl", {to_player=player_name, gain = 1.0}) - minetest.env:set_timeofday((21000 % 24000) / 24000) - minetest.chat_send_player(player_name, "Time of day set to 9pm") - else - minetest.chat_send_player(player_name, "You don't have settime priviledge!") - end - end - - if fields.clear_inv then - local inventory = {} - player:get_inventory():set_list("main", inventory) - minetest.chat_send_player(player_name, 'Inventory Cleared!') - minetest.sound_play("trash_all", {to_player=player_name, gain = 1.0}) - end - - -- Inventory page controls - local start=math.floor(unified_inventory.current_index[player_name]/80 +1 ) - local start_i=start - local pagemax = math.floor((unified_inventory.filtered_items_list_size[player_name]-1) / (80) + 1) - - if fields.start_list then - minetest.sound_play("paperflip1", {to_player=player_name, gain = 1.0}) - start_i = 1 - end - if fields.rewind1 then - minetest.sound_play("paperflip1", {to_player=player_name, gain = 1.0}) - start_i = start_i - 1 - end - if fields.forward1 then - minetest.sound_play("paperflip1", {to_player=player_name, gain = 1.0}) - start_i = start_i + 1 - end - if fields.rewind3 then - minetest.sound_play("paperflip1", {to_player=player_name, gain = 1.0}) - start_i = start_i - 3 - end - if fields.forward3 then - minetest.sound_play("paperflip1", {to_player=player_name, gain = 1.0}) - start_i = start_i + 3 - end - if fields.end_list then - minetest.sound_play("paperflip1", {to_player=player_name, gain = 1.0}) - start_i = pagemax - end - if start_i < 1 then - start_i = 1 - end - if start_i > pagemax then - start_i = pagemax - end - if not (start_i ==start) then - 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 - minetest.sound_play("click", {to_player=player_name, gain = 0.1}) - if minetest.setting_getbool("creative_mode")==false then - unified_inventory.set_inventory_formspec(player, unified_inventory.get_formspec(player,"craftguide")) - page="craftguide" - 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 - end - - if fields.searchbutton then - unified_inventory.apply_filter(player, fields.searchbox) - unified_inventory.set_inventory_formspec(player, unified_inventory.get_formspec(player,unified_inventory.current_page[player_name])) - minetest.sound_play("paperflip2", {to_player=player_name, gain = 1.0}) - end - - -- alternate button - if fields.alternate then - minetest.sound_play("click", {to_player=player_name, gain = 0.1}) - 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 = unified_inventory.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 -local load_home = function() - local input = io.open(unified_inventory.home_filename..".home", "r") - if input then - while true do - local x = input:read("*n") - if x == nil then - break - end - local y = input:read("*n") - local z = input:read("*n") - local name = input:read("*l") - homepos[name:sub(2)] = {x = x, y = y, z = z} - end - io.close(input) - else - homepos = {} - end +local function load_home() + local input = io.open(unified_inventory.home_filename, "r") + if input then + while true do + local x = input:read("*n") + if x == nil then + break + end + local y = input:read("*n") + local z = input:read("*n") + local name = input:read("*l") + unified_inventory.home_pos[name:sub(2)] = {x = x, y = y, z = z} + end + io.close(input) + else + unified_inventory.home_pos = {} + end end -load_home() -- run it now +load_home() --- set_home -unified_inventory.set_home = function(player, pos) - local player_name=player:get_player_name() - homepos[player_name] = pos +function unified_inventory.set_home(player, pos) + local player_name = player:get_player_name() + unified_inventory.home_pos[player_name] = pos -- save the home data from the table to the file - local output = io.open(unified_inventory.home_filename..".home", "w") - for k, v in pairs(homepos) do + local output = io.open(unified_inventory.home_filename, "w") + for k, v in pairs(unified_inventory.home_pos) do if v ~= nil then - output:write(math.floor(v.x).." "..math.floor(v.y).." "..math.floor(v.z).." "..k.."\n") + output:write(math.floor(v.x).." " + ..math.floor(v.y).." " + ..math.floor(v.z).." " + ..k.."\n") end end io.close(output) end --- go_home -unified_inventory.go_home = function(player) - local pos = homepos[player:get_player_name()] - if pos~=nil then +function unified_inventory.go_home(player) + local pos = unified_inventory.home_pos[player:get_player_name()] + if pos ~= nil then player:setpos(pos) end end ---apply filter to the inventory list (create filtered copy of full one) -unified_inventory.apply_filter = function(player,filter) - local player_name = player:get_player_name() - local size=0 - local str_temp1=string.lower(filter) - if str_temp1 ~= "" then - for i=1,str_temp1:len(),1 do - if string.byte(str_temp1,i) == 91 then - str_temp1="" - end - end - end - 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 - 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 - end - - end - table.sort(unified_inventory.filtered_items_list[player_name]) - unified_inventory.filtered_items_list_size[player_name]=size - unified_inventory.current_index[player_name]=1 - unified_inventory.activefilter[player_name]=filter - unified_inventory.set_inventory_formspec(player, unified_inventory.get_formspec(player,unified_inventory.current_page[player_name])) -end - - --- update_recipe -unified_inventory.update_recipe = function(player, stack_name, alternate) - 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("output", 1, nil) - alternate = tonumber(alternate) or 1 - local crafts = unified_inventory.crafts_table[stack_name] - print(dump(crafts)) - local next=next - if next(crafts) == nil then return end -- no craft recipes - if alternate < 1 or alternate > #crafts then - alternate = 1 - end - local craft = crafts[alternate] - inv:set_stack("output", 1, craft.output) - local items=craft.items - - -- cooking, fuel, grinding, and extracting recipes - if craft.type == "cooking" or - craft.type == "fuel" or - craft.type == "grinding" or - craft.type == "extracting" or - craft.type == "compressing" then - def=unified_inventory.find_item_def(craft["items"][1]) - if def then - inv:set_stack("build", 1, def) - end - return - end - if craft.width==0 then - local build_table={1,2,3} - for i=1,3,1 do - if craft.items[i] then - def=unified_inventory.find_item_def(craft.items[i]) - if def then inv:set_stack("build", build_table[i], def) end - end - end - end - if craft.width==1 then - local build_table={1,4,7} - for i=1,3,1 do - if craft.items[i] then - def=unified_inventory.find_item_def(craft.items[i]) - if def then inv:set_stack("build", build_table[i], def) end - end - end - end - if craft.width==2 then - local build_table={1,2,4,5,7,8} - for i=1,6,1 do - if craft.items[i] then - def=unified_inventory.find_item_def(craft.items[i]) - if def then inv:set_stack("build", build_table[i], def) end - end - end - end - if craft.width==3 then - for i=1,9,1 do - if craft.items[i] then - def=unified_inventory.find_item_def(craft.items[i]) - if def then inv:set_stack("build", i, def) end - end - 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, '\"', "") - local items=unified_inventory.items_in_group(def1) - return items[1] - else - return def1 - end -end -return nil -end - -unified_inventory.items_in_group = function(group) - local items = {} - for name, item in pairs(minetest.registered_items) do - for _, g in ipairs(group:split(',')) do - if item.groups[g] then - table.insert(items,name) - end - end - end - return items -end - -- register_craft -unified_inventory.register_craft = function(options) - if options.output == nil then +function unified_inventory.register_craft(options) + if not options.output then return end local itemstack = ItemStack(options.output) if itemstack:is_empty() then return end - if unified_inventory.crafts_table[itemstack:get_name()]==nil then - unified_inventory.crafts_table[itemstack:get_name()] = {} - end - table.insert(unified_inventory.crafts_table[itemstack:get_name()],options) - --crafts_table_count=crafts_table_count+1 + unified_inventory.crafts_table[itemstack:get_name()] = + unified_inventory.crafts_table[itemstack:get_name()] or {} + + table.insert(unified_inventory.crafts_table[itemstack:get_name()], options) +end + +function unified_inventory.register_page(name, def) + unified_inventory.pages[name] = def +end + +function unified_inventory.register_button(name, def) + if not def.action then + def.action = function(player) + unified_inventory.set_inventory_formspec(player, name) + end + end + + def.name = name + + table.insert(unified_inventory.buttons, def) +end + +function unified_inventory.is_creative(playername) + if minetest.check_player_privs(playername, {creative=true}) or + minetest.setting_getbool("creative_mode") then + return true + end end diff --git a/bags.lua b/bags.lua index 4d269db..05c836a 100644 --- a/bags.lua +++ b/bags.lua @@ -3,6 +3,61 @@ -- Copyright (c) 2012 cornernote, Brett O'Donnell -- License: GPLv3 +unified_inventory.register_page("bags", { + get_formspec = function(player, formspec) + local player_name = player:get_player_name() + formspec = formspec .. "background[0.06,0.99;7.92,7.52;ui_bags_main_form.png]" + formspec = formspec.."label[0,0;Bags]" + formspec = formspec.."button[0,2;2,0.5;bag1;Bag 1]" + 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_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;]" + return formspec + end, +}) + +unified_inventory.register_button("bags", { + type = "image", + image = "ui_bags_icon.png", +}) + +for i = 1, 4 do + unified_inventory.register_page("bag"..i, { + get_formspec = function(player, formspec) + local stack = player:get_inventory():get_stack("bag"..i, 1) + local image = stack:get_definition().inventory_image + formspec = formspec.."image[7,0;1,1;"..image.."]" + formspec = formspec.."list[current_player;bag"..i.."contents;0,1;8,3;]" + local slots = stack:get_definition().groups.bagslots + if slots == 8 then + formspec = formspec.."background[0.06,0.99;7.92,7.52;ui_bags_sm_form.png]" + elseif slots == 16 then + formspec = formspec.."background[0.06,0.99;7.92,7.52;ui_bags_med_form.png]" + elseif slots == 24 then + formspec = formspec.."background[0.06,0.99;7.92,7.52;ui_bags_lg_form.png]" + end + return formspec + end, + }) +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + for i = 1, 4 do + if fields["bag"..i] then + local stack = player:get_inventory():get_stack("bag"..i, 1) + if not stack:get_definition().groups.bagslots then + return + end + unified_inventory.set_inventory_formspec(player, "bag"..i) + return + end + end +end) + minetest.register_on_joinplayer(function(player) local player_inv = player:get_inventory() local bags_inv = minetest.create_detached_inventory(player:get_player_name().."_bags",{ @@ -22,7 +77,7 @@ minetest.register_on_joinplayer(function(player) end end, allow_take = function(inv, listname, index, stack, player) - if player:get_inventory():is_empty(listname.."contents")==true then + if player:get_inventory():is_empty(listname.."contents") then return stack:get_count() else return 0 diff --git a/callbacks.lua b/callbacks.lua new file mode 100644 index 0000000..d8c8853 --- /dev/null +++ b/callbacks.lua @@ -0,0 +1,182 @@ + +minetest.register_on_joinplayer(function(player) + local player_name = player:get_player_name() + unified_inventory.players[player_name] = {} + unified_inventory.current_index[player_name] = 1 + unified_inventory.filtered_items_list[player_name] = unified_inventory.items_list + unified_inventory.activefilter[player_name] = "" + unified_inventory.apply_filter(player, "") + unified_inventory.alternate[player_name] = 1 + unified_inventory.current_item[player_name] = nil + unified_inventory.set_inventory_formspec(player, unified_inventory.default) + + -- Crafting guide inventories + 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) + if unified_inventory.is_creative(player:get_player_name()) then + return stack:get_count() + else + return 0 + end + 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) + + -- Refill slot + local refill = minetest.create_detached_inventory(player_name.."refill", { + allow_put = function(inv, listname, index, stack, player) + if unified_inventory.is_creative(player:get_player_name()) then + return stack:get_count() + else + return 0 + end + end, + on_put = function(inv, listname, index, stack, player) + local stacktable = stack:to_table() + stacktable.count = stack:get_stack_max() + inv:set_stack(listname, index, ItemStack(stacktable)) + minetest.sound_play("electricity", {to_player=player_name, gain = 1.0}) + end, + }) + refill:set_size("main", 1) +end) + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local player_name = player:get_player_name() + + for i, def in pairs(unified_inventory.buttons) do + if fields[def.name] then + def.action(player) + minetest.sound_play("click", + {to_player=player_name, gain = 0.1}) + return + end + end + + -- Inventory page controls + local start = math.floor(unified_inventory.current_index[player_name] / 80 + 1) + local start_i = start + local pagemax = math.floor((unified_inventory.filtered_items_list_size[player_name] - 1) / (80) + 1) + + if fields.start_list then + minetest.sound_play("paperflip1", + {to_player=player_name, gain = 1.0}) + start_i = 1 + end + if fields.rewind1 then + minetest.sound_play("paperflip1", + {to_player=player_name, gain = 1.0}) + start_i = start_i - 1 + end + if fields.forward1 then + minetest.sound_play("paperflip1", + {to_player=player_name, gain = 1.0}) + start_i = start_i + 1 + end + if fields.rewind3 then + minetest.sound_play("paperflip1", + {to_player=player_name, gain = 1.0}) + start_i = start_i - 3 + end + if fields.forward3 then + minetest.sound_play("paperflip1", + {to_player=player_name, gain = 1.0}) + start_i = start_i + 3 + end + if fields.end_list then + minetest.sound_play("paperflip1", + {to_player=player_name, gain = 1.0}) + start_i = pagemax + end + if start_i < 1 then + start_i = 1 + end + if start_i > pagemax then + start_i = pagemax + end + if not (start_i == start) then + unified_inventory.current_index[player_name] = (start_i - 1) * 80 + 1 + unified_inventory.set_inventory_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 do + local button = "item_button"..list_index + if fields[button] then + minetest.sound_play("click", + {to_player=player_name, gain = 0.1}) + if not unified_inventory.is_creative(player_name) then + unified_inventory.set_inventory_formspec(player, "craftguide") + page = "craftguide" + 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.current_page[player_name]) + else + if unified_inventory.is_creative(player_name) 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 + end + + if fields.searchbutton then + unified_inventory.apply_filter(player, fields.searchbox) + unified_inventory.set_inventory_formspec(player, + unified_inventory.current_page[player_name]) + minetest.sound_play("paperflip2", + {to_player=player_name, gain = 1.0}) + end + + -- alternate button + if fields.alternate then + minetest.sound_play("click", + {to_player=player_name, gain = 0.1}) + 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 = unified_inventory.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.current_page[player_name]) + end + end + end +end) + diff --git a/init.lua b/init.lua index cc170a0..3f26fef 100644 --- a/init.lua +++ b/init.lua @@ -1,11 +1,42 @@ --- Unified Inventory mod 0.4.6 +-- Unified Inventory for Minetest 0.4.8+ --- disable default creative inventory +local modpath = minetest.get_modpath(minetest.get_current_modname()) +local worldpath = minetest.get_worldpath() + +-- Data tables definitions +unified_inventory = {} +unified_inventory.activefilter = {} +unified_inventory.alternate = {} +unified_inventory.current_page = {} +unified_inventory.current_index = {} +unified_inventory.current_item = {} +unified_inventory.crafts_table = {} +unified_inventory.crafts_table_count = 0 +unified_inventory.players = {} +unified_inventory.items_list_size = 0 +unified_inventory.items_list = {} +unified_inventory.filtered_items_list_size = {} +unified_inventory.filtered_items_list = {} +unified_inventory.pages = {} +unified_inventory.buttons = {} + +-- Homepos stuff +unified_inventory.home_pos = {} +unified_inventory.home_filename = + worldpath.."/unified_inventory_home.home" + +-- Default inventory page +unified_inventory.default = "craft" + +-- Disable default creative inventory if creative_inventory then - creative_inventory.set_creative_formspec = function(player, start_i, pagenum) - return + function creative_inventory.set_creative_formspec(player, start_i, pagenum) + return end end -dofile(minetest.get_modpath("unified_inventory").."/api.lua") -dofile(minetest.get_modpath("unified_inventory").."/bags.lua") +dofile(modpath.."/api.lua") +dofile(modpath.."/internal.lua") +dofile(modpath.."/callbacks.lua") +dofile(modpath.."/register.lua") +dofile(modpath.."/bags.lua") diff --git a/internal.lua b/internal.lua new file mode 100644 index 0000000..3c01a35 --- /dev/null +++ b/internal.lua @@ -0,0 +1,223 @@ + +function unified_inventory.get_formspec(player, page) + if not player then + return "" + end + local player_name = player:get_player_name() + unified_inventory.current_page[player_name] = page + + local formspec = "size[14,10]" + + -- Player inventory + formspec = formspec .. "list[current_player;main;0,4.5;8,4;]" + + -- Background + formspec = formspec .. "background[-0.19,-0.2;14.38,10.55;ui_form_bg.png]" + + -- Current page + if unified_inventory.pages[page] then + formspec = unified_inventory.pages[page].get_formspec(player, formspec) + else + return "" -- Invalid page name + end + + -- Main buttons + local i = 0 + for i, def in pairs(unified_inventory.buttons) do + if def.type == "image" then + formspec = formspec.."image_button[" + ..(0.65 * i)..",9;0.8,0.8;" + ..minetest.formspec_escape(def.image)..";" + ..minetest.formspec_escape(def.name)..";]" + end + i = i + 1 + end + + -- Controls to flip items pages + local start_x = 9.2 + formspec = formspec .. "image_button["..(start_x + 0.6 * 0)..",9;.8,.8;ui_skip_backward_icon.png;start_list;]" + formspec = formspec .. "image_button["..(start_x + 0.6 * 1)..",9;.8,.8;ui_doubleleft_icon.png;rewind3;]" + formspec = formspec .. "image_button["..(start_x + 0.6 * 2)..",9;.8,.8;ui_left_icon.png;rewind1;]" + formspec = formspec .. "image_button["..(start_x + 0.6 * 3)..",9;.8,.8;ui_right_icon.png;forward1;]" + formspec = formspec .. "image_button["..(start_x + 0.6 * 4)..",9;.8,.8;ui_doubleright_icon.png;forward3;]" + formspec = formspec .. "image_button["..(start_x + 0.6 * 5)..",9;.8,.8;ui_skip_forward_icon.png;end_list;]" + + -- Search box + formspec = formspec .. "field[9.5,8.325;3,1;searchbox;;]" + formspec = formspec .. "image_button[12.2,8.1;.8,.8;ui_search_icon.png;searchbutton;]" + + -- Items list + local list_index = unified_inventory.current_index[player_name] + local page = math.floor(list_index / (80) + 1) + local pagemax = math.floor((unified_inventory.filtered_items_list_size[player_name] - 1) / (80) + 1) + local image = nil + local item = {} + for y = 0, 9 do + for x = 0, 7 do + name = unified_inventory.filtered_items_list[player_name][list_index] + if minetest.registered_items[name] then + formspec = formspec.."item_image_button[" + ..(8.2 + x * 0.7).."," + ..(1 + y * 0.7)..";.81,.81;" + ..name..";item_button" + ..list_index..";]" + list_index = list_index + 1 + end + end + end + formspec = formspec.."label[8.2,0;Page:]" + 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 +end + +function unified_inventory.set_inventory_formspec(player, page) + if player then + local formspec = unified_inventory.get_formspec(player, page) + player:set_inventory_formspec(formspec) + end +end + +--apply filter to the inventory list (create filtered copy of full one) +function unified_inventory.apply_filter(player, filter) + local player_name = player:get_player_name() + local size = 0 + local lfilter = string.lower(filter) + if lfilter ~= "" then + for i=1, lfilter:len() do + if lfilter:sub(i, i) == '[' then + str_temp1 = "" + break + end + end + end + 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 + local lname = string.lower(name) + local ldesc = string.lower(def.description) + if string.find(lname, lfilter) or string.find(ldesc, lfilter) then + table.insert(unified_inventory.filtered_items_list[player_name], name) + size = size + 1 + end + end + + end + table.sort(unified_inventory.filtered_items_list[player_name]) + unified_inventory.filtered_items_list_size[player_name] = size + unified_inventory.current_index[player_name] = 1 + unified_inventory.activefilter[player_name] = filter + unified_inventory.set_inventory_formspec(player, + unified_inventory.current_page[player_name]) +end + + +-- update_recipe +function unified_inventory.update_recipe(player, stack_name, alternate) + local inv = minetest.get_inventory({ + type = "detached", + name = player:get_player_name().."craftrecipe" + }) + for i = 0, inv:get_size("build") do + inv:set_stack("build", i, nil) + end + inv:set_stack("output", 1, nil) + alternate = tonumber(alternate) or 1 + local crafts = unified_inventory.crafts_table[stack_name] + --print(dump(crafts)) + if next(crafts) == nil then -- No craft recipes + return + end + if alternate < 1 or alternate > #crafts then + alternate = 1 + end + local craft = crafts[alternate] + inv:set_stack("output", 1, craft.output) + local items = craft.items + + if craft.type == "cooking" or + craft.type == "fuel" or + craft.type == "grinding" or + craft.type == "extracting" or + craft.type == "compressing" then + def = unified_inventory.find_item_def(craft["items"][1]) + if def then + inv:set_stack("build", 1, def) + end + return + end + if craft.width == 0 then + for i = 1, 3 do + if craft.items[i] then + def = unified_inventory.find_item_def(craft.items[i]) + if def then + inv:set_stack("build", i, def) + end + end + end + end + if craft.width == 1 then + local build_table={1, 4, 7} + for i = 1, 3 do + if craft.items[i] then + def = unified_inventory.find_item_def(craft.items[i]) + if def then + inv:set_stack("build", build_table[i], def) + end + end + end + end + if craft.width == 2 then + local build_table = {1, 2, 4, 5, 7, 8} + for i=1, 6 do + if craft.items[i] then + def = unified_inventory.find_item_def(craft.items[i]) + if def then + inv:set_stack("build", build_table[i], def) + end + end + end + end + if craft.width == 3 then + for i=1, 9 do + if craft.items[i] then + def = unified_inventory.find_item_def(craft.items[i]) + if def then + inv:set_stack("build", i, def) + end + end + end + end +end + +function unified_inventory.find_item_def(def) + if type(def) ~= "string" then + return nil + end + if string.find(def, "group:") then + def = string.gsub(def, "group:", "") + def = string.gsub(def, "\"", "") + if minetest.registered_nodes["default:"..def] then + return "default:"..def + end + local items = unified_inventory.items_in_group(def) + return items[1] + else + return def + end +end + +function unified_inventory.items_in_group(groups) + local items = {} + for name, item in pairs(minetest.registered_items) do + for _, group in pairs(groups:split(',')) do + if item.groups[group] then + table.insert(items, name) + end + end + end + return items +end diff --git a/register.lua b/register.lua new file mode 100644 index 0000000..ad85537 --- /dev/null +++ b/register.lua @@ -0,0 +1,173 @@ + +minetest.register_privilege("creative", { + description="Can use the creative inventory", + give_to_singleplayer = false, +}) + +local trash = minetest.create_detached_inventory("trash", { + --allow_put = function(inv, listname, index, stack, player) + -- if unified_inventory.is_creative(player:get_player_name()) then + -- return stack:get_count() + -- else + -- return 0 + -- end + --end, + on_put = function(inv, listname, index, stack, player) + inv:set_stack(listname, index, nil) + local player_name = player:get_player_name() + minetest.sound_play("trash", {to_player=player_name, gain = 1.0}) + end, +}) +trash:set_size("main", 1) + +unified_inventory.register_button("craft", { + type = "image", + image = "ui_craft_icon.png", +}) + +unified_inventory.register_button("craftguide", { + type = "image", + image = "ui_craftguide_icon.png", +}) + +unified_inventory.register_button("home_gui_set", { + type = "image", + image = "ui_sethome_icon.png", + action = function(player) + local player_name = player:get_player_name() + unified_inventory.set_home(player, player:getpos()) + local home = unified_inventory.home_pos[player_name] + if home ~= nil then + minetest.sound_play("dingdong", + {to_player=player_name, gain = 1.0}) + minetest.chat_send_player(player_name, + "Home position set to: " + ..minetest.pos_to_string(home)) + end + end, +}) + +unified_inventory.register_button("home_gui_go", { + type = "image", + image = "ui_gohome_icon.png", + action = function(player) + minetest.sound_play("teleport", + {to_player=player:get_player_name(), gain = 1.0}) + unified_inventory.go_home(player) + end, +}) + +unified_inventory.register_button("misc_set_day", { + type = "image", + image = "ui_sun_icon.png", + action = function(player) + local player_name = player:get_player_name() + if minetest.check_player_privs(player_name, {settime=true}) then + minetest.sound_play("birds", + {to_player=player_name, gain = 1.0}) + minetest.set_timeofday((6000 % 24000) / 24000) + minetest.chat_send_player(player_name, + "Time of day set to 6am") + else + minetest.chat_send_player(player_name, + "You don't have the" + .." settime priviledge!") + end + end, +}) + +unified_inventory.register_button("misc_set_night", { + type = "image", + image = "ui_moon_icon.png", + action = function(player) + local player_name = player:get_player_name() + if minetest.check_player_privs(player_name, {settime=true}) then + minetest.sound_play("owl", + {to_player=player_name, gain = 1.0}) + minetest.set_timeofday((21000 % 24000) / 24000) + minetest.chat_send_player(player_name, + "Time of day set to 9pm") + else + minetest.chat_send_player(player_name, + "You don't have the" + .." settime priviledge!") + end + end, +}) + +unified_inventory.register_button("clear_inv", { + type = "image", + image = "ui_trash_icon.png", + action = function(player) + local player_name = player:get_player_name() + if not unified_inventory.is_creative(player_name) then + minetest.chat_send_player(player_name, + "This button has been disabled outside" + .." of creative mode to prevent" + .." accidental inventory trashing." + .." Use the trash slot instead.") + return + end + player:get_inventory():set_list("main", {}) + minetest.chat_send_player(player_name, 'Inventory Cleared!') + minetest.sound_play("trash_all", + {to_player=player_name, gain = 1.0}) + end, +}) + +unified_inventory.register_page("craft", { + get_formspec = function(player, formspec) + local player_name = player:get_player_name() + formspec = formspec.."background[0.06,0.99;7.92,7.52;ui_crafting_form.png]" + formspec = formspec.."label[0,0;Crafting]" + formspec = formspec.."list[current_player;craftpreview;6,1;1,1;]" + formspec = formspec.."list[current_player;craft;2,1;3,3;]" + formspec = formspec.."label[7,2.5;Trash:]" + formspec = formspec.."list[detached:trash;main;7,3;1,1;]" + if unified_inventory.is_creative(player_name) then + formspec = formspec.."label[0,2.5;Refill:]" + formspec = formspec.."list[detached:"..player_name.."refill;main;0,3;1,1;]" + end + return formspec + end, +}) + +unified_inventory.register_page("craftguide", { + get_formspec = function(player, formspec) + local player_name = player:get_player_name() + formspec = formspec.."background[0.06,0.99;7.92,7.52;ui_craftguide_form.png]" + 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] + if item_name then + formspec = formspec.."label[2,0;"..item_name.."]" + local alternates = 0 + local alternate = unified_inventory.alternate[player_name] + local crafts = unified_inventory.crafts_table[item_name] + + if crafts ~= nil and #crafts > 0 then + alternates = #crafts + local craft = crafts[alternate] + local method = craft.type + if craft.type == "shapeless" then + method="shapeless crafting" + 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 + return formspec + end, +}) diff --git a/textures/ui_copper_chest_inventory.png b/textures/ui_copper_chest_inventory.png new file mode 100644 index 0000000000000000000000000000000000000000..debc9fcab8c09d3c5d41f905be53742169ae2bc9 GIT binary patch literal 11117 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 literal 0 HcmV?d00001 diff --git a/textures/ui_furnace_inventory.png b/textures/ui_furnace_inventory.png new file mode 100644 index 0000000000000000000000000000000000000000..ce84efb1338886456d54b69d105c3ecd0db191d8 GIT binary patch literal 7383 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 literal 0 HcmV?d00001 diff --git a/textures/ui_gold_chest_inventory.png b/textures/ui_gold_chest_inventory.png new file mode 100644 index 0000000000000000000000000000000000000000..b19524b3f6d0fdc9af23a70e621942af96be01a7 GIT binary patch literal 5813 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 literal 0 HcmV?d00001 diff --git a/textures/ui_hv_battery_box.png b/textures/ui_hv_battery_box.png new file mode 100644 index 0000000000000000000000000000000000000000..61c55debd8655a3537cbfe06edece177273c7425 GIT binary patch literal 15941 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 IJPG@M00*`>p#T5? literal 0 HcmV?d00001 diff --git a/textures/ui_iron_chest_inventory.png b/textures/ui_iron_chest_inventory.png new file mode 100644 index 0000000000000000000000000000000000000000..1785f888b045ae3b0fbcb627f6f5f7ae0ae3d9b0 GIT binary patch literal 6685 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 literal 0 HcmV?d00001 diff --git a/textures/ui_lv_alloy_furnace.png b/textures/ui_lv_alloy_furnace.png new file mode 100644 index 0000000000000000000000000000000000000000..3b98650005cad7b099fe192684572a928dd5a851 GIT binary patch literal 8640 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�^}@gjpkpMr3hl!m(|*?mW!O9_x_1DXS^b1nJ5D? z6XvT4gPiKR;GAg2cAx9r6zN7f@>ko#Sk)oX|L^H$?Lm@cr#w4QF^Dl zHS+H@_vF6!O?N>!LBe#j$5?OD!va>iNLf~FD#j&$Yq}VXhjzhN8cKk2=4jt12DmzP z1Sk_I3J~K!n}^6UvMsXr8KnQvjB>PkhGuz!I)D_gJ6z^bRt^52B)nasO&<8~4J6P% z-3KeOw+fJJt3&~De6TV*_)z`(pC2)GW+FfW0LQuh_L}>D{2`QW5*ao~|Dk^*P~2Sm z0ujv|u?&C#BlDF9Re?Z22bImJ`T zp?hDvcw{NeB{ek_^gK5Hl#Im|bArFM(#U3f59iE%UL7Dh8fDp?<&JM0QqTTr-pCd} zcft-7wSiYQyziUq^Kz(#2P*dH>*xQfYIDiYueg9HziTEM)arSl(H_j`)AhLgH4_Lv hBrv`K28*16gwT6q=b9{v_`vsI2y>ew#fQ&d|9@QiXfFT& literal 0 HcmV?d00001 diff --git a/textures/ui_lv_battery_box.png b/textures/ui_lv_battery_box.png new file mode 100644 index 0000000000000000000000000000000000000000..61c55debd8655a3537cbfe06edece177273c7425 GIT binary patch literal 15941 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 IJPG@M00*`>p#T5? literal 0 HcmV?d00001 diff --git a/textures/ui_lv_electric_furnace.png b/textures/ui_lv_electric_furnace.png new file mode 100644 index 0000000000000000000000000000000000000000..a91b241a14d1e39abac89bc5557f053c50747171 GIT binary patch literal 4334 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 literal 0 HcmV?d00001 diff --git a/textures/ui_lv_grinder.png b/textures/ui_lv_grinder.png new file mode 100644 index 0000000000000000000000000000000000000000..7af5155f76b9a234cc7eceee41874202eb1a81a3 GIT binary patch literal 4334 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
  • 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 IJPG@M00*`>p#T5? literal 0 HcmV?d00001 diff --git a/textures/ui_silver_chest_inventory.png b/textures/ui_silver_chest_inventory.png new file mode 100644 index 0000000000000000000000000000000000000000..a61c4b9690e1b5eabd23a683f3d899d7a6cae5d2 GIT binary patch literal 7743 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 literal 0 HcmV?d00001