added tabs to players inventory

This commit is contained in:
cale 2016-09-25 11:32:17 +02:00
parent 9988f3f181
commit b2784e0bfc
5 changed files with 96 additions and 218 deletions

View File

@ -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")

View File

@ -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) <celeron55@gmail.com>
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.

View File

@ -1 +0,0 @@
default

View File

@ -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

View File

@ -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",