minetest_inventory_enhanced/inventory_enhanced/init.lua

273 lines
8.2 KiB
Lua

inventory_enhanced = {}
-- Create the trash field
local trash = minetest.create_detached_inventory("trash", {
on_put = function(inv, listname, index, stack, player)
inv:set_list(listname, {})
end
})
trash:set_size("main", 1)
if creative_inventory then --disable default creative inventory
creative_inventory.set_creative_formspec = function(a,b,c) return end
end
--************************************
-- CREATIVE
--************************************
-- Create detached creative inventory when a new player joins
inventory_enhanced.init_creative_inventory = function(player)
local name = player:get_player_name()
inventory_enhanced[name] = {}
inventory_enhanced[name].size = 0
inventory_enhanced[name].filter = " "
inventory_enhanced[name].start_i = 1
local creative_inv = minetest.create_detached_inventory("creative_"..name, {
allow_move = function(inv, from_list, from_index, to_list, to_index, count, player)
if creative_enhanced.player_gamemode_is_creative 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 creative_enhanced.player_gamemode_is_creative 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)
end,
})
-- create the creative inventory for the first time with a blank filter
inventory_enhanced.filter_creative_inventory(name, " ")
end
-- set the creative inventory formspec
inventory_enhanced.set_creative_formspec = function(player, start_i)
local name = player:get_player_name()
local filter = inventory_enhanced[name]["filter"]
pagenum = math.floor(start_i / 24 + 1)
local pagemax = math.floor((inventory_enhanced[name]["size"]-1) / (6*4) + 1)
local inv = "size[13,7.5]"..
default.gui_bg..
default.gui_bg_img..
default.gui_slots..
"list[current_player;main;5,3.5;8,1;]"..
"list[current_player;main;5,4.75;8,3;8]"..
"list[current_player;craft;8,0;3,3;]"..
"list[current_player;craftpreview;12,1;1,1;]"..
"image[11,1;1,1;gui_furnace_arrow_bg.png^[transformR270]"..
"list[detached:creative_"..name..";main;0.05,1;4,6;"..tostring(start_i).."]"..
"label[1.7,7.1;"..tostring(pagenum).."/"..tostring(pagemax).."]"..
"button[0,7;1.6,1;search_previous;<<]"..
"button[2.5,7;1.6,1;search_next;>>]"..
"image[5.1,2.1;0.8,0.8;trash.png]"..
"list[detached:trash;main;5,2;1,1;]"..
"button[2.55,0.2;0.8,0.5;search;?]"..
"button[3.3,0.2;0.8,0.5;clear;X]"..
"field[0.3,0.3;2.6,1;filter;;"..filter.."]"..
default.get_hotbar_bg(5,3.5)
if armor then
inv = inv..
"list[detached:"..name.."_armor;armor;5,0;2,3;]"..
"image[6.8,0.35;1.5,3;"..armor.textures[name].preview.."]"
end
player:set_inventory_formspec(inv)
end
-- update the creative inventory whith searched content
inventory_enhanced.filter_creative_inventory = function(name, filter)
filter = string.lower(filter)
local inv = minetest.get_inventory({type="detached", name="creative_"..name})
local filtered_list = {}
for name,def in pairs(minetest.registered_items) do
if (not def.groups.not_in_inventory_enhanced or def.groups.not_in_inventory_enhanced == 0)
and def.description and def.description ~= ""
and def.name ~= "air" and def.name ~= "ignore" and def.name ~= "unknown" then
if filter == " " then -- blank filter, display everything
table.insert(filtered_list, name)
elseif string.find(string.lower(def.description), filter,1,true)
or string.find(string.lower(def.name), filter,1,true) then -- filter
table.insert(filtered_list, name)
end
end
end
table.sort(filtered_list)
inventory_enhanced[name]["size"] = #filtered_list
inv:set_size("main", #filtered_list)
inv:set_list("main", filtered_list)
end
--************************************
-- SURVIVAL
--************************************
inventory_enhanced.set_survival_formspec = function(player)
local name = player:get_player_name()
local inv = "size[8,7.5]"..
default.gui_bg..
default.gui_bg_img..
default.gui_slots..
"list[current_player;main;0,3.5;8,1;]"..
"list[current_player;main;0,4.75;8,3;8]"..
"list[current_player;craft;3,0;3,3;]"..
"list[current_player;craftpreview;7,1;1,1;]"..
"image[6,1;1,1;gui_furnace_arrow_bg.png^[transformR270]"..
"image[0.1,2.1;0.8,0.8;trash.png]"..
"list[detached:trash;main;0,2;1,1;]"..
default.get_hotbar_bg(0,3.5)
if armor then
inv = inv..
"list[detached:"..name.."_armor;armor;0,0;2,3;]"..
"image[1.8,0.35;1.5,3;"..armor.textures[name].preview.."]"
end
player:set_inventory_formspec(inv)
end
--************************************
-- register
--************************************
minetest.register_on_joinplayer(function(player)
local name = player:get_player_name()
-- Select the formspec according to player's gamemode
if creative_enhanced.player_gamemode_is_creative(name) then
inventory_enhanced.init_creative_inventory(player)
inventory_enhanced.set_creative_formspec(player, 0, 1)
else
inventory_enhanced.set_survival_formspec(player)
end
end)
minetest.register_on_leaveplayer(function(player)
-- Free the context when player leaves
local name = player:get_player_name()
if inventory_enhanced[name] then
inventory_enhanced[name] = nil
end
end)
-- register an inventory change if gamemode is enabled
if gamemode then
gamemode.register_on_change(function(name, mode)
local player = minetest.get_player_by_name(name)
if mode == 1 then
inventory_enhanced.init_creative_inventory(player)
inventory_enhanced.set_creative_formspec(player, 0, 1)
elseif mode == 0 then
inventory_enhanced.set_survival_formspec(player)
end
end)
end
-- Handle inventory formspec
minetest.register_on_player_receive_fields(function(player, formname, fields)
local name = player:get_player_name()
if fields.filter == "" then
fields.filter = " "
end
local find_i = function()
local start_i = inventory_enhanced[name].start_i
if fields.search_previous then
start_i = start_i - 24
end
if fields.search_next then
start_i = start_i + 24
end
if start_i < 0 then
start_i = start_i + 24
end
if start_i >= inventory_enhanced[name]["size"] then
start_i = start_i - 24
end
if start_i < 0 or start_i >= inventory_enhanced[name]["size"] then
start_i = 0
end
inventory_enhanced[name].start_i = start_i
return start_i
end
-- Generate the new lists
local update_filter = function(name, filter)
inventory_enhanced.filter_creative_inventory(name, filter) -- update creative inventory
inventory_enhanced[name].filter = filter-- update the context accordingly
end
local update_formspec = function(player, start_i)
if creative_enhanced.player_gamemode_is_creative(name) then
inventory_enhanced.set_creative_formspec(player, start_i)
else
inventory_enhanced.set_survival_formspec(player)
end
end
if fields.clear then
inventory_enhanced[name].start_i = 0
update_filter(name, " ")
update_formspec(player, 0, 1) -- reset to page 1
elseif fields.search and fields.filter ~= inventory_enhanced[name].filter then
inventory_enhanced[name].start_i = 0
update_filter(name, fields.filter)
update_formspec(player, 0, 1) -- reset to page 1
elseif fields.search_previous or fields.search_next then
local start_i = find_i()
update_formspec(player, start_i)
end
end)
--************************************
-- 3d_armor
--************************************
if armor then
-- Ugly workaround !
-- override armor.set_player_armor which is called when placing/removing
-- armor pieces in the inventory. We update the formspec to display the
-- dynamic preview changes
inventory_enhanced.set_player_armor = armor.set_player_armor
armor.set_player_armor = function(self,player)
local name = player:get_player_name()
inventory_enhanced.set_player_armor(self,player)
if creative_enhanced.player_gamemode_is_creative(name) then
local start_i = inventory_enhanced[name].start_i
inventory_enhanced.set_creative_formspec(player, start_i)
else
inventory_enhanced.set_survival_formspec(player)
end
end
end
minetest.log("action","inventory_enhanced loaded")