From 47d6fbf884f82639e096250bb3f8fb5960550cb3 Mon Sep 17 00:00:00 2001
From: SmallJoker <mk939@ymail.com>
Date: Mon, 9 Oct 2017 17:07:32 +0200
Subject: [PATCH] Creative: Cache inventory items on load

---
 mods/creative/inventory.lua | 29 ++++++++++++++++++++---------
 1 file changed, 20 insertions(+), 9 deletions(-)

diff --git a/mods/creative/inventory.lua b/mods/creative/inventory.lua
index 00b2aa5..8b7f0c3 100644
--- a/mods/creative/inventory.lua
+++ b/mods/creative/inventory.lua
@@ -1,4 +1,19 @@
 local player_inventory = {}
+local inventory_cache = {}
+
+local function init_creative_cache(items)
+	inventory_cache[items] = {}
+	local i_cache = inventory_cache[items]
+
+	for name, def in pairs(items) do
+		if def.groups.not_in_creative_inventory ~= 1 and
+				def.description and def.description ~= "" then
+			i_cache[name] = def
+		end
+	end
+	table.sort(i_cache)
+	return i_cache
+end
 
 function creative.init_creative_inventory(player)
 	local player_name = player:get_player_name()
@@ -45,11 +60,11 @@ function creative.update_creative_inventory(player_name, tab_content)
 			creative.init_creative_inventory(minetest.get_player_by_name(player_name))
 	local player_inv = minetest.get_inventory({type = "detached", name = "creative_" .. player_name})
 
-	for name, def in pairs(tab_content) do
-		if not (def.groups.not_in_creative_inventory == 1) and
-				def.description and def.description ~= "" and
-				(def.name:find(inv.filter, 1, true) or
-					def.description:lower():find(inv.filter, 1, true)) then
+	local items = inventory_cache[tab_content] or init_creative_cache(tab_content)
+
+	for name, def in pairs(items) do
+		if def.name:find(inv.filter, 1, true) or
+				def.description:lower():find(inv.filter, 1, true) then
 			creative_list[#creative_list+1] = name
 		end
 	end
@@ -161,10 +176,6 @@ function creative.register_tab(name, title, items)
 	})
 end
 
-minetest.register_on_joinplayer(function(player)
-	creative.update_creative_inventory(player:get_player_name(), minetest.registered_items)
-end)
-
 creative.register_tab("all", "All", minetest.registered_items)
 creative.register_tab("nodes", "Nodes", minetest.registered_nodes)
 creative.register_tab("tools", "Tools", minetest.registered_tools)