|
1 |
| --- minetest/creative/init.lua |
| 1 | +dofile(minetest.get_modpath("creative") .. "/inventory.lua") |
2 | 2 |
|
3 |
| -creative = {} |
4 |
| -local player_inventory = {} |
5 |
| -local creative_mode = minetest.setting_getbool("creative_mode") |
6 |
| - |
7 |
| --- Create detached creative inventory after loading all mods |
8 |
| -creative.init_creative_inventory = function(owner) |
9 |
| - local owner_name = owner:get_player_name() |
10 |
| - player_inventory[owner_name] = { |
11 |
| - size = 0, |
12 |
| - filter = "", |
13 |
| - start_i = 0, |
14 |
| - tab_id = 2, |
15 |
| - } |
16 |
| - |
17 |
| - minetest.create_detached_inventory("creative_" .. owner_name, { |
18 |
| - allow_move = function(inv, from_list, from_index, to_list, to_index, count, player) |
19 |
| - if creative_mode and not to_list == "main" then |
20 |
| - return count |
21 |
| - else |
22 |
| - return 0 |
23 |
| - end |
24 |
| - end, |
25 |
| - allow_put = function(inv, listname, index, stack, player) |
26 |
| - return 0 |
27 |
| - end, |
28 |
| - allow_take = function(inv, listname, index, stack, player) |
29 |
| - if creative_mode then |
30 |
| - return -1 |
31 |
| - else |
32 |
| - return 0 |
33 |
| - end |
34 |
| - end, |
35 |
| - on_move = function(inv, from_list, from_index, to_list, to_index, count, player) |
36 |
| - end, |
37 |
| - on_put = function(inv, listname, index, stack, player) |
38 |
| - end, |
39 |
| - on_take = function(inv, listname, index, stack, player) |
40 |
| - local player_name, stack_name = player:get_player_name(), stack:get_name() |
41 |
| - --print(player_name .. " takes item from creative inventory; listname = " .. listname .. ", index = " .. index .. ", stack = " .. dump(stack:to_table())) |
42 |
| - if stack then |
43 |
| - minetest.log("action", player_name .. " takes " .. stack_name .. " from creative inventory") |
44 |
| - --print("Stack name: " .. stack_name .. ", Stack count: " .. stack:get_count()) |
45 |
| - end |
46 |
| - end, |
47 |
| - }) |
48 |
| - |
49 |
| - creative.update_creative_inventory(owner_name) |
50 |
| - --print("creative inventory size: " .. player_inventory[player_name].size) |
51 |
| -end |
52 |
| - |
53 |
| -local function tab_category(tab_id) |
54 |
| - local id_category = { |
55 |
| - nil, -- Reserved for crafting tab. |
56 |
| - minetest.registered_items, |
57 |
| - minetest.registered_nodes, |
58 |
| - minetest.registered_tools, |
59 |
| - minetest.registered_craftitems |
60 |
| - } |
61 |
| - |
62 |
| - -- If index out of range, show default ("All") page. |
63 |
| - return id_category[tab_id] or id_category[2] |
64 |
| -end |
65 |
| - |
66 |
| -function creative.update_creative_inventory(player_name) |
67 |
| - local creative_list = {} |
68 |
| - local player_inv = minetest.get_inventory({type = "detached", name = "creative_" .. player_name}) |
69 |
| - local inv = player_inventory[player_name] |
70 |
| - |
71 |
| - for name, def in pairs(tab_category(inv.tab_id)) do |
72 |
| - if not (def.groups.not_in_creative_inventory == 1) and |
73 |
| - def.description and def.description ~= "" and |
74 |
| - (def.name:find(inv.filter, 1, true) or |
75 |
| - def.description:lower():find(inv.filter, 1, true)) then |
76 |
| - creative_list[#creative_list+1] = name |
77 |
| - end |
78 |
| - end |
79 |
| - |
80 |
| - table.sort(creative_list) |
81 |
| - player_inv:set_size("main", #creative_list) |
82 |
| - player_inv:set_list("main", creative_list) |
83 |
| - inv.size = #creative_list |
84 |
| -end |
85 |
| - |
86 |
| --- Create the trash field |
87 |
| -local trash = minetest.create_detached_inventory("creative_trash", { |
88 |
| - -- Allow the stack to be placed and remove it in on_put() |
89 |
| - -- This allows the creative inventory to restore the stack |
90 |
| - allow_put = function(inv, listname, index, stack, player) |
91 |
| - if creative_mode then |
92 |
| - return stack:get_count() |
93 |
| - else |
94 |
| - return 0 |
95 |
| - end |
96 |
| - end, |
97 |
| - on_put = function(inv, listname) |
98 |
| - inv:set_list(listname, {}) |
99 |
| - end, |
100 |
| -}) |
101 |
| -trash:set_size("main", 1) |
102 |
| - |
103 |
| -creative.formspec_add = "" |
104 |
| - |
105 |
| -creative.set_creative_formspec = function(player, start_i) |
106 |
| - local player_name = player:get_player_name() |
107 |
| - local inv = player_inventory[player_name] |
108 |
| - local pagenum = math.floor(start_i / (3*8) + 1) |
109 |
| - local pagemax = math.ceil(inv.size / (3*8)) |
110 |
| - |
111 |
| - player:set_inventory_formspec([[ |
112 |
| - size[8,8.6] |
113 |
| - image[4.06,3.4;0.8,0.8;creative_trash_icon.png] |
114 |
| - list[current_player;main;0,4.7;8,1;] |
115 |
| - list[current_player;main;0,5.85;8,3;8] |
116 |
| - list[detached:creative_trash;main;4,3.3;1,1;] |
117 |
| - listring[] |
118 |
| - tablecolumns[color;text;color;text] |
119 |
| - tableoptions[background=#00000000;highlight=#00000000;border=false] |
120 |
| - button[5.4,3.2;0.8,0.9;creative_prev;<] |
121 |
| - button[7.25,3.2;0.8,0.9;creative_next;>] |
122 |
| - button[2.1,3.4;0.8,0.5;creative_search;?] |
123 |
| - button[2.75,3.4;0.8,0.5;creative_clear;X] |
124 |
| - tooltip[creative_search;Search] |
125 |
| - tooltip[creative_clear;Reset] |
126 |
| - listring[current_player;main] |
127 |
| - ]] .. |
128 |
| - "field[0.3,3.5;2.2,1;creative_filter;;" .. minetest.formspec_escape(inv.filter) .. "]" .. |
129 |
| - "field_close_on_enter[creative_filter;false]" .. |
130 |
| - "listring[detached:creative_" .. player_name .. ";main]" .. |
131 |
| - "tabheader[0,0;creative_tabs;Crafting,All,Nodes,Tools,Items;" .. tostring(inv.tab_id) .. ";true;false]" .. |
132 |
| - "list[detached:creative_" .. player_name .. ";main;0,0;8,3;" .. tostring(start_i) .. "]" .. |
133 |
| - "table[6.05,3.35;1.15,0.5;pagenum;#FFFF00," .. tostring(pagenum) .. ",#FFFFFF,/ " .. tostring(pagemax) .. "]" .. |
134 |
| - default.get_hotbar_bg(0,4.7) .. |
135 |
| - default.gui_bg .. default.gui_bg_img .. default.gui_slots |
136 |
| - .. creative.formspec_add |
137 |
| - ) |
138 |
| -end |
139 |
| - |
140 |
| -creative.set_crafting_formspec = function(player) |
141 |
| - player:set_inventory_formspec([[ |
142 |
| - size[8,8.6] |
143 |
| - list[current_player;craft;2,0.75;3,3;] |
144 |
| - list[current_player;craftpreview;6,1.75;1,1;] |
145 |
| - list[current_player;main;0,4.7;8,1;] |
146 |
| - list[current_player;main;0,5.85;8,3;8] |
147 |
| - list[detached:creative_trash;main;0,2.75;1,1;] |
148 |
| - image[0.06,2.85;0.8,0.8;creative_trash_icon.png] |
149 |
| - image[5,1.75;1,1;gui_furnace_arrow_bg.png^[transformR270] |
150 |
| - tabheader[0,0;creative_tabs;Crafting,All,Nodes,Tools,Items;1;true;false] |
151 |
| - listring[current_player;main] |
152 |
| - listring[current_player;craft] |
153 |
| - ]] .. |
154 |
| - default.get_hotbar_bg(0,4.7) .. |
155 |
| - default.gui_bg .. default.gui_bg_img .. default.gui_slots |
156 |
| - ) |
157 |
| -end |
158 |
| - |
159 |
| -minetest.register_on_joinplayer(function(player) |
160 |
| - -- If in creative mode, modify player's inventory forms |
161 |
| - if not creative_mode then |
162 |
| - return |
163 |
| - end |
164 |
| - creative.init_creative_inventory(player) |
165 |
| - creative.set_creative_formspec(player, 0) |
166 |
| -end) |
167 |
| - |
168 |
| -minetest.register_on_player_receive_fields(function(player, formname, fields) |
169 |
| - if formname ~= "" or not creative_mode then |
170 |
| - return |
171 |
| - end |
172 |
| - |
173 |
| - local player_name = player:get_player_name() |
174 |
| - local inv = player_inventory[player_name] |
175 |
| - |
176 |
| - -- If creative is turned on mid game |
177 |
| - if not inv then |
178 |
| - creative.init_creative_inventory(player) |
179 |
| - creative.set_creative_formspec(player, 0) |
180 |
| - return |
181 |
| - end |
182 |
| - |
183 |
| - if fields.quit then |
184 |
| - if inv.tab_id == 1 then |
185 |
| - creative.set_crafting_formspec(player) |
186 |
| - end |
187 |
| - elseif fields.creative_tabs then |
188 |
| - local tab = tonumber(fields.creative_tabs) |
189 |
| - inv.tab_id = tab |
190 |
| - player_inventory[player_name].start_i = 0 |
191 |
| - |
192 |
| - if tab == 1 then |
193 |
| - creative.set_crafting_formspec(player) |
194 |
| - else |
195 |
| - creative.update_creative_inventory(player_name) |
196 |
| - creative.set_creative_formspec(player, 0) |
197 |
| - end |
198 |
| - elseif fields.creative_clear then |
199 |
| - player_inventory[player_name].start_i = 0 |
200 |
| - inv.filter = "" |
201 |
| - creative.update_creative_inventory(player_name) |
202 |
| - creative.set_creative_formspec(player, 0) |
203 |
| - elseif fields.creative_search or |
204 |
| - fields.key_enter_field == "creative_filter" then |
205 |
| - player_inventory[player_name].start_i = 0 |
206 |
| - inv.filter = fields.creative_filter:lower() |
207 |
| - creative.update_creative_inventory(player_name) |
208 |
| - creative.set_creative_formspec(player, 0) |
209 |
| - else |
210 |
| - local start_i = player_inventory[player_name].start_i or 0 |
211 |
| - |
212 |
| - if fields.creative_prev then |
213 |
| - start_i = start_i - 3*8 |
214 |
| - if start_i < 0 then |
215 |
| - start_i = inv.size - (inv.size % (3*8)) |
216 |
| - if inv.size == start_i then |
217 |
| - start_i = math.max(0, inv.size - (3*8)) |
218 |
| - end |
219 |
| - end |
220 |
| - elseif fields.creative_next then |
221 |
| - start_i = start_i + 3*8 |
222 |
| - if start_i >= inv.size then |
223 |
| - start_i = 0 |
224 |
| - end |
225 |
| - end |
226 |
| - |
227 |
| - player_inventory[player_name].start_i = start_i |
228 |
| - creative.set_creative_formspec(player, start_i) |
229 |
| - end |
230 |
| -end) |
231 |
| - |
232 |
| -if creative_mode then |
233 |
| - local digtime = 42 |
234 |
| - local caps = {times = {digtime, digtime, digtime}, uses = 0, maxlevel = 256} |
| 3 | +if minetest.setting_getbool("creative_mode") then |
| 4 | + local digtime = 0.5 |
| 5 | + local caps = {times = {digtime, digtime, digtime}, uses = 0, maxlevel = 3} |
235 | 6 |
|
236 | 7 | minetest.register_item(":", {
|
237 | 8 | type = "none",
|
|
0 commit comments