Add support for MT 5 game translation (rebasing ) (#2466)
[oweals/minetest_game.git] / mods / creative / inventory.lua
1 -- creative/inventory.lua
2
3 -- support for MT game translation.
4 local S = creative.get_translator
5
6 local player_inventory = {}
7 local inventory_cache = {}
8
9 local function init_creative_cache(items)
10         inventory_cache[items] = {}
11         local i_cache = inventory_cache[items]
12
13         for name, def in pairs(items) do
14                 if def.groups.not_in_creative_inventory ~= 1 and
15                                 def.description and def.description ~= "" then
16                         i_cache[name] = def
17                 end
18         end
19         table.sort(i_cache)
20         return i_cache
21 end
22
23 function creative.init_creative_inventory(player)
24         local player_name = player:get_player_name()
25         player_inventory[player_name] = {
26                 size = 0,
27                 filter = "",
28                 start_i = 0
29         }
30
31         minetest.create_detached_inventory("creative_" .. player_name, {
32                 allow_move = function(inv, from_list, from_index, to_list, to_index, count, player2)
33                         local name = player2 and player2:get_player_name() or ""
34                         if not creative.is_enabled_for(name) or
35                                         to_list == "main" then
36                                 return 0
37                         end
38                         return count
39                 end,
40                 allow_put = function(inv, listname, index, stack, player2)
41                         return 0
42                 end,
43                 allow_take = function(inv, listname, index, stack, player2)
44                         local name = player2 and player2:get_player_name() or ""
45                         if not creative.is_enabled_for(name) then
46                                 return 0
47                         end
48                         return -1
49                 end,
50                 on_move = function(inv, from_list, from_index, to_list, to_index, count, player2)
51                 end,
52                 on_take = function(inv, listname, index, stack, player2)
53                         if stack and stack:get_count() > 0 then
54                                 minetest.log("action", player_name .. " takes " .. stack:get_name().. " from creative inventory")
55                         end
56                 end,
57         }, player_name)
58
59         return player_inventory[player_name]
60 end
61
62 function creative.update_creative_inventory(player_name, tab_content)
63         local creative_list = {}
64         local inv = player_inventory[player_name] or
65                         creative.init_creative_inventory(minetest.get_player_by_name(player_name))
66         local player_inv = minetest.get_inventory({type = "detached", name = "creative_" .. player_name})
67
68         local items = inventory_cache[tab_content] or init_creative_cache(tab_content)
69
70         for name, def in pairs(items) do
71                 if def.name:find(inv.filter, 1, true) or
72                                 def.description:lower():find(inv.filter, 1, true) then
73                         creative_list[#creative_list+1] = name
74                 end
75         end
76
77         table.sort(creative_list)
78         player_inv:set_size("main", #creative_list)
79         player_inv:set_list("main", creative_list)
80         inv.size = #creative_list
81 end
82
83 -- Create the trash field
84 local trash = minetest.create_detached_inventory("creative_trash", {
85         -- Allow the stack to be placed and remove it in on_put()
86         -- This allows the creative inventory to restore the stack
87         allow_put = function(inv, listname, index, stack, player)
88                 return stack:get_count()
89         end,
90         on_put = function(inv, listname)
91                 inv:set_list(listname, {})
92         end,
93 })
94 trash:set_size("main", 1)
95
96 creative.formspec_add = ""
97
98 function creative.register_tab(name, title, items)
99         sfinv.register_page("creative:" .. name, {
100                 title = title,
101                 is_in_nav = function(self, player, context)
102                         return creative.is_enabled_for(player:get_player_name())
103                 end,
104                 get = function(self, player, context)
105                         local player_name = player:get_player_name()
106                         creative.update_creative_inventory(player_name, items)
107                         local inv = player_inventory[player_name]
108                         local start_i = inv.start_i or 0
109                         local pagenum = math.floor(start_i / (3*8) + 1)
110                         local pagemax = math.ceil(inv.size / (3*8))
111                         return sfinv.make_formspec(player, context,
112                                 "label[6.2,3.35;" .. minetest.colorize("#FFFF00", tostring(pagenum)) .. " / " .. tostring(pagemax) .. "]" ..
113                                 [[
114                                         image[4.06,3.4;0.8,0.8;creative_trash_icon.png]
115                                         listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]
116                                         list[detached:creative_trash;main;4,3.3;1,1;]
117                                         listring[]
118                                         image_button[5.4,3.25;0.8,0.8;creative_prev_icon.png;creative_prev;]
119                                         image_button[7.2,3.25;0.8,0.8;creative_next_icon.png;creative_next;]
120                                         image_button[2.1,3.25;0.8,0.8;creative_search_icon.png;creative_search;]
121                                         image_button[2.75,3.25;0.8,0.8;creative_clear_icon.png;creative_clear;]
122                                         tooltip[creative_search;S("Search")]
123                                         tooltip[creative_clear;S("Reset")]
124                                         tooltip[creative_prev;S("Previous page")]
125                                         tooltip[creative_next;S("Next page")]
126                                         listring[current_player;main]
127                                         field_close_on_enter[creative_filter;false]
128                                 ]] ..
129                                 "field[0.3,3.5;2.2,1;creative_filter;;" .. minetest.formspec_escape(inv.filter) .. "]" ..
130                                 "listring[detached:creative_" .. player_name .. ";main]" ..
131                                 "list[detached:creative_" .. player_name .. ";main;0,0;8,3;" .. tostring(start_i) .. "]" ..
132                                 creative.formspec_add, true)
133                 end,
134                 on_enter = function(self, player, context)
135                         local player_name = player:get_player_name()
136                         local inv = player_inventory[player_name]
137                         if inv then
138                                 inv.start_i = 0
139                         end
140                 end,
141                 on_player_receive_fields = function(self, player, context, fields)
142                         local player_name = player:get_player_name()
143                         local inv = player_inventory[player_name]
144                         assert(inv)
145
146                         if fields.creative_clear then
147                                 inv.start_i = 0
148                                 inv.filter = ""
149                                 creative.update_creative_inventory(player_name, items)
150                                 sfinv.set_player_inventory_formspec(player, context)
151                         elseif fields.creative_search or
152                                         fields.key_enter_field == "creative_filter" then
153                                 inv.start_i = 0
154                                 inv.filter = fields.creative_filter:lower()
155                                 creative.update_creative_inventory(player_name, items)
156                                 sfinv.set_player_inventory_formspec(player, context)
157                         elseif not fields.quit then
158                                 local start_i = inv.start_i or 0
159
160                                 if fields.creative_prev then
161                                         start_i = start_i - 3*8
162                                         if start_i < 0 then
163                                                 start_i = inv.size - (inv.size % (3*8))
164                                                 if inv.size == start_i then
165                                                         start_i = math.max(0, inv.size - (3*8))
166                                                 end
167                                         end
168                                 elseif fields.creative_next then
169                                         start_i = start_i + 3*8
170                                         if start_i >= inv.size then
171                                                 start_i = 0
172                                         end
173                                 end
174
175                                 inv.start_i = start_i
176                                 sfinv.set_player_inventory_formspec(player, context)
177                         end
178                 end
179         })
180 end
181
182 creative.register_tab("all", S("All"), minetest.registered_items)
183 creative.register_tab("nodes", S("Nodes"), minetest.registered_nodes)
184 creative.register_tab("tools", S("Tools"), minetest.registered_tools)
185 creative.register_tab("craftitems", S("Items"), minetest.registered_craftitems)
186
187 local old_homepage_name = sfinv.get_homepage_name
188 function sfinv.get_homepage_name(player)
189         if creative.is_enabled_for(player:get_player_name()) then
190                 return "creative:all"
191         else
192                 return old_homepage_name(player)
193         end
194 end