mirror of
https://git.minetest.land/VoxeLibre/VoxeLibre.git
synced 2024-08-25 11:27:25 +02:00
Only scan item defs once for creative inventory
This commit is contained in:
parent
20dabaa352
commit
c935e78ef4
@ -3,75 +3,89 @@ mcl_inventory.creative_inventory_size = 0
|
|||||||
-- Prepare player info table
|
-- Prepare player info table
|
||||||
local players = {}
|
local players = {}
|
||||||
|
|
||||||
|
-- Containing all the items for each Creative Mode tab
|
||||||
|
local inventory_lists = {}
|
||||||
|
|
||||||
|
-- Create tables
|
||||||
|
local builtin_filter_ids = {"\0blocks","\0deco","\0redstone","\0rail","\0food","\0tools","\0combat","\0brew","\0matr","\0misc","\0all"}
|
||||||
|
for _, f in pairs(builtin_filter_ids) do
|
||||||
|
inventory_lists[f] = {}
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[ Populate all the item tables. We only do this once. Note this mod must be
|
||||||
|
loaded after mcl_autogroup for this to work, because it required certain
|
||||||
|
groups to be set. ]]
|
||||||
|
do
|
||||||
|
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 is_redstone = function(def)
|
||||||
|
return def.mesecons or def.groups.mesecon or def.groups.mesecon_conductor_craftable or def.groups.mesecon_effecor_off
|
||||||
|
end
|
||||||
|
local is_tool = function(def)
|
||||||
|
return def.groups.tool or (def.tool_capabilities ~= nil and def.tool_capabilities.damage_groups == nil)
|
||||||
|
end
|
||||||
|
local is_weapon = function(def)
|
||||||
|
return def.groups.weapon or def.groups.weapon_ranged or def.groups.ammo or def.groups.armor_head or def.groups.armor_torso or def.groups.armor_legs or def.groups.armor_feet
|
||||||
|
end
|
||||||
|
if def.groups.building_block then
|
||||||
|
table.insert(inventory_lists["\0blocks"], name)
|
||||||
|
end
|
||||||
|
if def.groups.deco_block then
|
||||||
|
table.insert(inventory_lists["\0deco"], name)
|
||||||
|
end
|
||||||
|
if is_redstone(def) then
|
||||||
|
table.insert(inventory_lists["\0redstone"], name)
|
||||||
|
end
|
||||||
|
if def.groups.transport then
|
||||||
|
table.insert(inventory_lists["\0rail"], name)
|
||||||
|
end
|
||||||
|
if (def.groups.food and not def.groups.brewitem) or def.groups.eatable then
|
||||||
|
table.insert(inventory_lists["\0food"], name)
|
||||||
|
end
|
||||||
|
if is_tool(def) then
|
||||||
|
table.insert(inventory_lists["\0tools"], name)
|
||||||
|
end
|
||||||
|
if is_weapon(def) then
|
||||||
|
table.insert(inventory_lists["\0combat"], name)
|
||||||
|
end
|
||||||
|
if def.groups.brewitem then
|
||||||
|
table.insert(inventory_lists["\0brew"], name)
|
||||||
|
end
|
||||||
|
if def.groups.craftitem then
|
||||||
|
table.insert(inventory_lists["\0matr"], name)
|
||||||
|
end
|
||||||
|
if not def.groups.building_block and not def.groups.deco_block and not is_redstone(def) and not def.groups.transport and not def.groups.food and not def.groups.eatable and not is_tool(def) and not is_weapon(def) and not def.groups.craftitem and not def.groups.brewitem then
|
||||||
|
table.insert(inventory_lists["\0misc"], name)
|
||||||
|
end
|
||||||
|
|
||||||
|
table.insert(inventory_lists["\0all"], name)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
for _, to_sort in pairs(inventory_lists) do
|
||||||
|
table.sort(to_sort)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
local function set_inv(filter, player)
|
local function set_inv(filter, player)
|
||||||
local playername = player:get_player_name()
|
local playername = player:get_player_name()
|
||||||
local inv = minetest.get_inventory({type="detached", name="creative_"..playername})
|
local inv = minetest.get_inventory({type="detached", name="creative_"..playername})
|
||||||
inv:set_size("main", 0)
|
inv:set_size("main", 0)
|
||||||
local creative_list = {}
|
local creative_list = {}
|
||||||
for name,def in pairs(minetest.registered_items) do
|
if filter ~= "" then
|
||||||
if (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0) and def.description and def.description ~= "" then
|
if inventory_lists[filter] then -- Standard filter
|
||||||
if filter ~= "" then
|
creative_list = inventory_lists[filter]
|
||||||
local is_redstone = function(def)
|
else -- Search
|
||||||
return def.mesecons or def.groups.mesecon or def.groups.mesecon_conductor_craftable or def.groups.mesecon_effecor_off
|
for name,def in pairs(minetest.registered_items) do
|
||||||
end
|
if (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0) and def.description and def.description ~= "" then
|
||||||
local is_tool = function(def)
|
|
||||||
return def.groups.tool or (def.tool_capabilities ~= nil and def.tool_capabilities.damage_groups == nil)
|
|
||||||
end
|
|
||||||
local is_weapon = function(def)
|
|
||||||
return def.groups.weapon or def.groups.weapon_ranged or def.groups.ammo or def.groups.armor_head or def.groups.armor_torso or def.groups.armor_legs or def.groups.armor_feet
|
|
||||||
end
|
|
||||||
if filter == "\0blocks" then
|
|
||||||
if def.groups.building_block then
|
|
||||||
table.insert(creative_list, name)
|
|
||||||
end
|
|
||||||
elseif filter == "\0deco" then
|
|
||||||
if def.groups.deco_block then
|
|
||||||
table.insert(creative_list, name)
|
|
||||||
end
|
|
||||||
elseif filter == "\0redstone" then
|
|
||||||
if is_redstone(def) then
|
|
||||||
table.insert(creative_list, name)
|
|
||||||
end
|
|
||||||
elseif filter == "\0rail" then
|
|
||||||
if def.groups.transport then
|
|
||||||
table.insert(creative_list, name)
|
|
||||||
end
|
|
||||||
elseif filter == "\0food" then
|
|
||||||
if (def.groups.food and not def.groups.brewitem) or def.groups.eatable then
|
|
||||||
table.insert(creative_list, name)
|
|
||||||
end
|
|
||||||
elseif filter == "\0tools" then
|
|
||||||
if is_tool(def) then
|
|
||||||
table.insert(creative_list, name)
|
|
||||||
end
|
|
||||||
elseif filter == "\0combat" then
|
|
||||||
if is_weapon(def) then
|
|
||||||
table.insert(creative_list, name)
|
|
||||||
end
|
|
||||||
elseif filter == "\0brew" then
|
|
||||||
if def.groups.brewitem then
|
|
||||||
table.insert(creative_list, name)
|
|
||||||
end
|
|
||||||
elseif filter == "\0matr" then
|
|
||||||
if def.groups.craftitem then
|
|
||||||
table.insert(creative_list, name)
|
|
||||||
end
|
|
||||||
elseif filter == "\0misc" then
|
|
||||||
if not def.groups.building_block and not def.groups.deco_block and not is_redstone(def) and not def.groups.transport and not def.groups.food and not def.groups.eatable and not is_tool(def) and not is_weapon(def) and not def.groups.craftitem and not def.groups.brewitem then
|
|
||||||
|
|
||||||
table.insert(creative_list, name)
|
|
||||||
end
|
|
||||||
elseif filter == "\0all" then
|
|
||||||
table.insert(creative_list, name)
|
|
||||||
else --for all other
|
|
||||||
if string.find(string.lower(def.name), filter) or string.find(string.lower(def.description), filter) then
|
if string.find(string.lower(def.name), filter) or string.find(string.lower(def.description), filter) then
|
||||||
table.insert(creative_list, name)
|
table.insert(creative_list, name)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
table.sort(creative_list)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
table.sort(creative_list)
|
|
||||||
inv:set_size("main", #creative_list)
|
inv:set_size("main", #creative_list)
|
||||||
for _,itemstring in ipairs(creative_list) do
|
for _,itemstring in ipairs(creative_list) do
|
||||||
inv:add_item("main", ItemStack(itemstring))
|
inv:add_item("main", ItemStack(itemstring))
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
mcl_init
|
mcl_init
|
||||||
mcl_core
|
mcl_core
|
||||||
mcl_sounds
|
mcl_sounds
|
||||||
|
mcl_autogroup
|
||||||
3d_armor?
|
3d_armor?
|
||||||
|
Loading…
Reference in New Issue
Block a user