diff --git a/mods/armor/init.lua b/mods/armor/init.lua index c571d16..830e4ce 100644 --- a/mods/armor/init.lua +++ b/mods/armor/init.lua @@ -73,8 +73,14 @@ function armor.update_armor(name, pl) armor.save_armor() end -default.inv_form = default.inv_form .. "list[detached:armor_%s;main;0,0.5;2,2;]" -default.inv_form = default.inv_form.. default.itemslot_bg(0,0.5,2,2) + +default.player_inventory.register_tab({ + name = "Armor", + formspec = default.player_inventory.get_default_inventory_formspec() .. + "list[detached:armor_%s;main;3,0.5;2,2;]" .. + default.itemslot_bg(3,0.5,2,2) +}) + function armor.load_armor() local input = io.open(armor.armor_file, "r") diff --git a/mods/creative/README.txt b/mods/creative/README.txt deleted file mode 100644 index 7d49b98..0000000 --- a/mods/creative/README.txt +++ /dev/null @@ -1,22 +0,0 @@ -Minetest 0.4 mod: creative -========================== - -Implements creative mode. - -Switch on by using the "creative_mode" setting. - -Registered items that -- have a description, and -- do not have the group not_in_creative_inventory -are added to the creative inventory. - -License of source code and media files: ---------------------------------------- -Copyright (C) 2012 Perttu Ahola (celeron55) - -This program is free software. It comes without any warranty, to -the extent permitted by applicable law. You can redistribute it -and/or modify it under the terms of the Do What The Fuck You Want -To Public License, Version 2, as published by Sam Hocevar. See -http://sam.zoy.org/wtfpl/COPYING for more details. - diff --git a/mods/creative/depends.txt b/mods/creative/depends.txt deleted file mode 100644 index 4ad96d5..0000000 --- a/mods/creative/depends.txt +++ /dev/null @@ -1 +0,0 @@ -default diff --git a/mods/creative/init.lua b/mods/creative/init.lua deleted file mode 100644 index 74e20bc..0000000 --- a/mods/creative/init.lua +++ /dev/null @@ -1,182 +0,0 @@ --- minetest/creative/init.lua - -creative_inventory = {} -creative_inventory.creative_inventory_size = 0 - --- Create detached creative inventory after loading all mods -minetest.after(0, function() - local inv = minetest.create_detached_inventory("creative", { - allow_move = function(inv, from_list, from_index, to_list, to_index, count, player) - if minetest.setting_getbool("creative_mode") then - return count - else - return 0 - end - end, - 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 -1 - else - return 0 - end - end, - on_move = function(inv, from_list, from_index, to_list, to_index, count, player) - end, - on_put = function(inv, listname, index, stack, player) - end, - on_take = function(inv, listname, index, stack, player) - --print(player:get_player_name().." takes item from creative inventory; listname="..dump(listname)..", index="..dump(index)..", stack="..dump(stack)) - if stack then - minetest.log("action", player:get_player_name().." takes "..dump(stack:get_name()).." from creative inventory") - --print("stack:get_name()="..dump(stack:get_name())..", stack:get_count()="..dump(stack:get_count())) - end - end, - }) - local creative_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 - table.insert(creative_list, name) - end - end - table.sort(creative_list) - inv:set_size("main", #creative_list) - for _,itemstring in ipairs(creative_list) do - inv:add_item("main", ItemStack(itemstring)) - end - creative_inventory.creative_inventory_size = #creative_list - --print("creative inventory size: "..dump(creative_inventory.creative_inventory_size)) -end) - --- Create the trash field -local trash = minetest.create_detached_inventory("creative_trash", { - -- Allow the stack to be placed and remove it in on_put() - -- This allows the creative inventory to restore the stack - 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, "") - end, -}) -trash:set_size("main", 1) - - -creative_inventory.set_creative_formspec = function(player, start_i, pagenum) - pagenum = math.floor(pagenum) - local pagemax = math.floor((creative_inventory.creative_inventory_size-1) / (6*4) + 1) - player:set_inventory_formspec( - "size[13,7.5]".. - --"image[6,0.6;1,2;player.png]".. - default.gui_colors.. - default.gui_bg.. - "list[current_player;main;5,3.5;8,1;]".. - default.itemslot_bg(5,3.5,8,1).. - "list[current_player;main;5,4.75;8,3;8]".. - default.itemslot_bg(5,4.75,8,3).. - "list[current_player;craft;8,0;3,3;]".. - default.itemslot_bg(8,0,3,3).. - "list[current_player;craftpreview;12,1;1,1;]".. - default.itemslot_bg(12,1,1,1).. - "list[detached:creative;main;0.3,0.5;4,6;"..tostring(start_i).."]".. - default.itemslot_bg(0.3,0.5,4,6).. - "label[2.0,6.55;"..tostring(pagenum).."/"..tostring(pagemax).."]".. - "button[0.3,6.5;1.6,1;creative_prev;<<]".. - "button[2.7,6.5;1.6,1;creative_next;>>]".. - "listring[current_player;main]".. - "listring[current_player;craft]".. - "listring[current_player;main]".. - "listring[detached:creative;main]".. - "label[5,1.5;Trash:]".. - "list[detached:creative_trash;main;5,2;1,1;]".. - default.itemslot_bg(5,2,1,1) - ) -end -minetest.register_on_joinplayer(function(player) - -- If in creative mode, modify player's inventory forms - if not minetest.setting_getbool("creative_mode") then - return - end - creative_inventory.set_creative_formspec(player, 0, 1) -end) -minetest.register_on_player_receive_fields(function(player, formname, fields) - if not minetest.setting_getbool("creative_mode") then - return - end - -- Figure out current page from formspec - local current_page = 0 - local formspec = player:get_inventory_formspec() - local start_i = string.match(formspec, "list%[detached:creative;main;[%d.]+,[%d.]+;[%d.]+,[%d.]+;(%d+)%]") - start_i = tonumber(start_i) or 0 - - if fields.creative_prev then - start_i = start_i - 4*6 - end - if fields.creative_next then - start_i = start_i + 4*6 - end - - if start_i < 0 then - start_i = start_i + 4*6 - end - if start_i >= creative_inventory.creative_inventory_size then - start_i = start_i - 4*6 - end - - if start_i < 0 or start_i >= creative_inventory.creative_inventory_size then - start_i = 0 - end - - creative_inventory.set_creative_formspec(player, start_i, start_i / (6*4) + 1) -end) - -if minetest.setting_getbool("creative_mode") then - local digtime = 0.5 - minetest.register_item(":", { - type = "none", - wield_image = "wieldhand.png", - wield_scale = {x=1,y=1,z=2.5}, - range = 10, - tool_capabilities = { - full_punch_interval = 0.5, - max_drop_level = 3, - groupcaps = { - crumbly = {times={[1]=digtime, [2]=digtime, [3]=digtime}, uses=0, maxlevel=3}, - cracky = {times={[1]=digtime, [2]=digtime, [3]=digtime}, uses=0, maxlevel=3}, - snappy = {times={[1]=digtime, [2]=digtime, [3]=digtime}, uses=0, maxlevel=3}, - choppy = {times={[1]=digtime, [2]=digtime, [3]=digtime}, uses=0, maxlevel=3}, - quests = {times={[1]=digtime, [2]=digtime, [3]=digtime}, uses=0, maxlevel=3}, - ray = {times={[1]=digtime, [2]=digtime, [3]=digtime}, uses=0, maxlevel=3}, - oddly_breakable_by_hand = {times={[1]=digtime, [2]=digtime, [3]=digtime}, uses=0, maxlevel=3}, - }, - damage_groups = {fleshy = 10}, - } - }) - - minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack) - return true - end) - - function minetest.handle_node_drops(pos, drops, digger) - if not digger or not digger:is_player() then - return - end - local inv = digger:get_inventory() - if inv then - for _,item in ipairs(drops) do - item = ItemStack(item):get_name() - if not inv:contains_item("main", item) then - inv:add_item("main", item) - end - end - end - end - -end diff --git a/mods/default/player.lua b/mods/default/player.lua index 2425a3d..abc3ebb 100644 --- a/mods/default/player.lua +++ b/mods/default/player.lua @@ -1,4 +1,76 @@ default.gui_color_theme = 2 +default.player_inventory = {} +default.player_inventory.tabs = {} +default.player_inventory.contexts = {} + +function default.player_inventory.register_tab(def) + table.insert(default.player_inventory.tabs, def) +end + +function default.player_inventory.get_formspec(tab) + if not(default.player_inventory.tabs[tab]) then + return "" + end + + local formspec = default.player_inventory.tabs[tab].formspec + local tabs = {} + + for i,v in ipairs(default.player_inventory.tabs) do + table.insert(tabs, v.name) + end + + formspec = formspec .. "tabheader[0,0;tabs;"..table.concat(tabs, ",")..";" .. tostring(tab) .. ";true;false]" + return formspec +end + +function default.player_inventory.set_tab(name, i) + if not(default.player_inventory.contexts[name]) then + default.player_inventory.contexts[name] = { + tab = 1 + } + end + + default.player_inventory.contexts[name].tab = i +end + +function default.player_inventory.update(player) + if not(player) then + return + end + + local name = player:get_player_name() + + if not(default.player_inventory.contexts[name]) then + default.player_inventory.contexts[name] = { + tab = 1 + } + end + + local tab = default.player_inventory.contexts[name].tab or 1 + local formspec = default.player_inventory.get_formspec(tab) + player:set_inventory_formspec(string.format(formspec, player:get_player_name())) +end + +function default.player_inventory.get_default_inventory_formspec() + local formspec = "size[8,7.5;]" .. + default.gui_colors .. + default.gui_bg .. + "list[current_player;main;0,3.5;8,4;]" .. + default.itemslot_bg(0,3.5,8,4) + return formspec +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if not(formname == "") then + return + end + + local name = player:get_player_name() + if fields.tabs then + default.player_inventory.set_tab(name, tonumber(fields.tabs)) + default.player_inventory.update(player) + end +end) function default.itemslot_bg(x,y,w,h) if default.gui_color_theme == 1 then @@ -32,16 +104,17 @@ elseif default.gui_color_theme == 4 then default.text_color = "#FFF" end -default.inv_form = "size[8,7.5;]" -default.inv_form = default.inv_form..default.gui_colors -default.inv_form = default.inv_form..default.gui_bg -default.inv_form = default.inv_form.."list[current_player;main;0,3.5;8,4;]" -default.inv_form = default.inv_form..default.itemslot_bg(0,3.5,8,4) -default.inv_form = default.inv_form.."label[2.5,0;Crafting:]" -default.inv_form = default.inv_form.."list[current_player;craft;2.5,0.5;3,1;]" -default.inv_form = default.inv_form..default.itemslot_bg(2.5,0.5,3,1) -default.inv_form = default.inv_form.."list[current_player;craftpreview;3.5,1.5;1,1;]" -default.inv_form = default.inv_form..default.itemslot_bg(3.5,1.5,1,1) +default.inv_form = default.player_inventory.get_default_inventory_formspec() +default.inv_form = default.inv_form.."list[current_player;craft;1.5,1;3,1;]" +default.inv_form = default.inv_form..default.itemslot_bg(1.5,1,3,1) +default.inv_form = default.inv_form.."list[current_player;craftpreview;5.5,1;1,1;]" +default.inv_form = default.inv_form..default.itemslot_bg(5.5,1,1,1) + +default.player_inventory.register_tab({ + name = "Crafting", + formspec = default.inv_form +}) + default.craft_form = "size[8,7.5;]" default.craft_form = default.craft_form..default.gui_colors @@ -56,9 +129,13 @@ default.craft_form = default.craft_form..default.itemslot_bg(5,1,1,1) default.player_anim = {} minetest.register_on_joinplayer(function(player) + local name = player:get_player_name() + player:hud_set_hotbar_image("gui_hotbar.png") player:hud_set_hotbar_selected_image("gui_hotbar_selected.png") - player:set_inventory_formspec(default.inv_form:format(player:get_player_name())) + + default.player_inventory.set_tab(name, 1) + default.player_inventory.update(player) player:set_properties({ mesh = "character.x",