diff options
Diffstat (limited to 'unified_inventory/callbacks.lua')
-rw-r--r-- | unified_inventory/callbacks.lua | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/unified_inventory/callbacks.lua b/unified_inventory/callbacks.lua new file mode 100644 index 0000000..d8c8853 --- /dev/null +++ b/unified_inventory/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) + |