Cristiano Magro
2020-10-19 a94eedd6e64c5d5e497acf3e2bff4f59a25de466
commit | author | age
c189a3 1 -- Configuration
CM 2
3 local xnopick_max_charge      = 30000 -- Maximum charge of the saw
4 -- Gives 2500 nodes on a single charge
5 local xnopick_charge_per_node = 12
6 -- Dig node cost
7
8
9 local S = technic.getter
10
11 technic.register_power_tool("technic:xnopick", xnopick_max_charge)
12
13 local mesecons_materials = minetest.get_modpath("mesecons_materials")
14
15 -- This function checks if the specified node should be dig
16 local function check_if_node_picked(pos)
17   local node = minetest.get_node(pos)
18   local node_name = node.name
19
20   if node_name:match("default:.*_with_.*") or
21     node_name:match("default:coalblock") or
22     node_name:match("technic:mineral_.*") or
23     node_name:match("xtraores:.*_ore") or
24     node_name:match("underch:.*_ore") or
25     node_name:match("underch:coal_dust") or
26     node_name:match("underch:coal_diamond") or
27     node_name:match("moreores:mineral_.*") or
28     node_name:match(".*coal_dense_ore")
29   then
30     minetest.log("action", "[Xno Pick Magic] "..node_name.." good node to collect.") --print to log
31     return true
32   end
33
34   return false
35 end
36
37 local function collect_node(user, pos, current_charge)
38   if current_charge < xnopick_charge_per_node then
39     return current_charge
40   end
41
42   local node_name = minetest.get_node(pos).name
43   local droped = minetest.get_node_drops(node_name)
a94eed 44
CM 45   minetest.handle_node_drops(user:getpos(), droped, user) 
46 --  for _, nameDroped in pairs(droped) do
47 --    --add node back into placer's inv
48 --    user:get_inventory():add_item("main",  nameDroped .. ' 1')
49 --  end
c189a3 50
CM 51   minetest.remove_node(pos)
52   local remain_charge = current_charge - xnopick_charge_per_node
53
54   return remain_charge
55 end
56
57 local function collect_block_node(user, pos, current_charge)
58   local radius = 4
59   local dropPos = {}
60   local remain_charge = current_charge
61   for z = -radius, radius do
62     dropPos.z = pos.z + z
63     for y = -radius, radius do
64       dropPos.y = pos.y + y
65       for x = -radius, radius do
66         dropPos.x = pos.x + x
67
68         if check_if_node_picked(dropPos) then
69           remain_charge = collect_node(user, dropPos, remain_charge)
70         end
71       end
72     end
73   end
74
75   return remain_charge
76 end
77
78
79
80 minetest.register_tool("technic:xnopick", {
81   description = S("Xno Pick Magic"),
82   inventory_image = "xno_superpick.png",
83
84   stack_max = 1,
85
86   wear_represents = "technic_RE_charge",
87   on_refill = technic.refill_RE_charge,
88
89   on_use = function(itemstack, user, pointed_thing)
90     if pointed_thing.type ~= "node" then
91       return itemstack
92     end
93
94     --check tool charge
95     local meta = minetest.deserialize(itemstack:get_metadata())
96     if not meta or not meta.charge or
97       meta.charge < xnopick_charge_per_node then
98       return
99     end
100
101     --check node protection
102     local pos = pointed_thing.under
103     if minetest.is_protected(pos, user:get_player_name()) then
104       minetest.record_protection_violation(pos, user:get_player_name())
105       return
106     end
107
108     --reinizializze visited struct
109     nodeVisited = Pointset.create()
110
111     --can collect only digging node
112     if not check_if_node_picked(pos) then
113       return itemstack
114     end
115
116
117     -- Send current charge to digging function so that the
118     -- chainsaw will stop after digging a number of nodes
119     meta.charge = collect_block_node(user, pos, meta.charge)
120     if not technic.creative_mode then
121       technic.set_RE_wear(itemstack, meta.charge, xnopick_max_charge)
122       itemstack:set_metadata(minetest.serialize(meta))
123     end
124     return itemstack
125
126   end,
127 })
128
129 minetest.register_craft({
130   output = "technic:xnopick",
131   recipe = {
132     {"group:wood",       "group:wood",    "group:wood",},
133     {"technic:battery",  "default:stick", "pipeworks:tube_1"},
134     {"technic:battery",  "default:stick", "pipeworks:tube_1"},
135   },
136 })
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369