TechDudie
2021-02-09 43acec290067f9aca534647d46ba1f13cfeb377a
commit | author | age
e748af 1 local max_charge = {50000, 200000, 650000}
Z 2 local power_usage_per_node = {200, 500, 800}
82cba9 3
be2f30 4 local S = technic.getter
S 5
82cba9 6 minetest.register_craft({
R 7     output = 'technic:mining_drill',
8     recipe = {
d1b54a 9         {'default:tin_ingot',             'technic:diamond_drill_head', 'default:tin_ingot'},
44cb8d 10         {'technic:stainless_steel_ingot', 'basic_materials:motor',              'technic:stainless_steel_ingot'},
69487e 11         {'',                              'technic:red_energy_crystal', 'default:copper_ingot'},
82cba9 12     }
R 13 })
e23f87 14 minetest.register_craft({
R 15     output = 'technic:mining_drill_mk2',
16     recipe = {
eac484 17         {'technic:diamond_drill_head',    'technic:diamond_drill_head',   'technic:diamond_drill_head'},
S 18         {'technic:stainless_steel_ingot', 'technic:mining_drill',         'technic:stainless_steel_ingot'},
19         {'',                              'technic:green_energy_crystal', ''},
e23f87 20     }
R 21 })
22 minetest.register_craft({
23     output = 'technic:mining_drill_mk3',
24     recipe = {
eac484 25         {'technic:diamond_drill_head',    'technic:diamond_drill_head',  'technic:diamond_drill_head'},
S 26         {'technic:stainless_steel_ingot', 'technic:mining_drill_mk2',    'technic:stainless_steel_ingot'},
27         {'',                              'technic:blue_energy_crystal', ''},
e23f87 28     }
R 29 })
eac484 30 for i = 1, 4 do
ee0765 31     minetest.register_craft({
S 32         output = 'technic:mining_drill_mk3',
33         recipe = {
34             {'technic:diamond_drill_head',    'technic:diamond_drill_head',   'technic:diamond_drill_head'},
35             {'technic:stainless_steel_ingot', 'technic:mining_drill_mk2_'..i, 'technic:stainless_steel_ingot'},
36             {'',                              'technic:blue_energy_crystal',  ''},
37         }
38     })
91329b 39 end
82cba9 40
5cf765 41 local mining_drill_mode_text = {
S 42     {S("Single node.")},
43     {S("3 nodes deep.")},
44     {S("3 nodes wide.")},
45     {S("3 nodes tall.")},
46     {S("3x3 nodes.")},
47 }
48
49 local function drill_dig_it0 (pos,player)
bab851 50     if minetest.is_protected(pos, player:get_player_name()) then
S 51         minetest.record_protection_violation(pos, player:get_player_name())
52         return
53     end
00618d 54     local node = minetest.get_node(pos)
5cf765 55     if node.name == "air" or node.name == "ignore" then return end
S 56     if node.name == "default:lava_source" then return end
57     if node.name == "default:lava_flowing" then return end
a41390 58     if node.name == "default:water_source" then minetest.remove_node(pos) return end
VE 59     if node.name == "default:water_flowing" then minetest.remove_node(pos) return end
00618d 60     local def = minetest.registered_nodes[node.name]
K 61     if not def then return end
62     def.on_dig(pos, node, player)
5cf765 63 end
S 64
65 local function drill_dig_it1 (player)
66     local dir=player:get_look_dir()
4f78a6 67     if math.abs(dir.x)>math.abs(dir.z) then
5cf765 68         if dir.x>0 then return 0 end
S 69         return 1
70     end
71     if dir.z>0 then return 2 end
72     return 3
73 end
74
75 local function drill_dig_it2 (pos,player)
76     pos.y=pos.y+1
77     drill_dig_it0 (pos,player)
78     pos.z=pos.z+1
79     drill_dig_it0 (pos,player)
80     pos.z=pos.z-2
81     drill_dig_it0 (pos,player)
82     pos.z=pos.z+1
5dd619 83     pos.y=pos.y-1
T 84     drill_dig_it0 (pos,player)
85     pos.z=pos.z+1
86     drill_dig_it0 (pos,player)
87     pos.z=pos.z-2
88     drill_dig_it0 (pos,player)
89     pos.z=pos.z+1
90     pos.y=pos.y-1
5cf765 91     drill_dig_it0 (pos,player)
S 92     pos.z=pos.z+1
93     drill_dig_it0 (pos,player)
94     pos.z=pos.z-2
95     drill_dig_it0 (pos,player)
96 end
97
98 local function drill_dig_it3 (pos,player)
99     pos.y=pos.y+1
100     drill_dig_it0 (pos,player)
101     pos.x=pos.x+1
102     drill_dig_it0 (pos,player)
103     pos.x=pos.x-2
104     drill_dig_it0 (pos,player)
105     pos.x=pos.x+1
5dd619 106     pos.y=pos.y-1
T 107     drill_dig_it0 (pos,player)
108     pos.x=pos.x+1
109     drill_dig_it0 (pos,player)
110     pos.x=pos.x-2
111     drill_dig_it0 (pos,player)
112     pos.x=pos.x+1
113     pos.y=pos.y-1
5cf765 114     drill_dig_it0 (pos,player)
S 115     pos.x=pos.x+1
116     drill_dig_it0 (pos,player)
117     pos.x=pos.x-2
118     drill_dig_it0 (pos,player)
119 end
120
121 local function drill_dig_it4 (pos,player)
122     drill_dig_it0 (pos,player)
123     pos.x=pos.x+1
124     drill_dig_it0 (pos,player)
125     pos.x=pos.x-2
126     drill_dig_it0 (pos,player)
127     pos.x=pos.x+1
128     pos.z=pos.z+1
129     drill_dig_it0 (pos,player)
130     pos.x=pos.x+1
131     drill_dig_it0 (pos,player)
132     pos.x=pos.x-2
133     drill_dig_it0 (pos,player)
134     pos.x=pos.x+1
135     pos.z=pos.z-2
136     drill_dig_it0 (pos,player)
137     pos.x=pos.x+1
138     drill_dig_it0 (pos,player)
139     pos.x=pos.x-2
140     drill_dig_it0 (pos,player)
141 end
142
e748af 143 local function cost_to_use(drill_type, mode)
Z 144     local mult
145     if mode == 1 then
146         mult = 1
147     elseif mode <= 4 then
148         mult = 3
149     else
150         mult = 9
151     end
152     return power_usage_per_node[drill_type] * mult
153 end
5cf765 154
e748af 155 local function drill_dig_it(pos, player, mode)
eac484 156     if mode == 1 then
S 157         drill_dig_it0(pos, player)
e23f87 158     end
a8daa4 159
eac484 160     if mode == 2 then -- 3 deep
a8daa4 161         local dir = drill_dig_it1(player)
eac484 162         if dir == 0 then -- x+
S 163             drill_dig_it0(pos, player)
164             pos.x = pos.x + 1
165             drill_dig_it0(pos, player)
166             pos.x = pos.x + 1
167             drill_dig_it0(pos, player)
e23f87 168         end
eac484 169         if dir == 1 then  -- x-
S 170             drill_dig_it0(pos, player)
e23f87 171             pos.x=pos.x-1
R 172             drill_dig_it0 (pos,player)
173             pos.x=pos.x-1
174             drill_dig_it0 (pos,player)
175         end
176         if dir==2 then  -- z+
177             drill_dig_it0 (pos,player)
178             pos.z=pos.z+1
179             drill_dig_it0 (pos,player)
180             pos.z=pos.z+1
181             drill_dig_it0 (pos,player)
182         end
183         if dir==3 then  -- z-
184             drill_dig_it0 (pos,player)
8e2cb0 185             pos.z=pos.z-1
e23f87 186             drill_dig_it0 (pos,player)
8e2cb0 187             pos.z=pos.z-1
e23f87 188             drill_dig_it0 (pos,player)
R 189         end
190     end
a8daa4 191
e23f87 192     if mode==3 then -- 3 wide
a8daa4 193         local dir = drill_dig_it1(player)
e23f87 194         if dir==0 or dir==1 then -- x
R 195             drill_dig_it0 (pos,player)
196             pos.z=pos.z+1
197             drill_dig_it0 (pos,player)
198             pos.z=pos.z-2
199             drill_dig_it0 (pos,player)
200         end
201         if dir==2 or dir==3 then  -- z
202             drill_dig_it0 (pos,player)
203             pos.x=pos.x+1
204             drill_dig_it0 (pos,player)
205             pos.x=pos.x-2
206             drill_dig_it0 (pos,player)
207         end
208     end
a8daa4 209
e23f87 210     if mode==4 then -- 3 tall, selected in the middle
R 211         drill_dig_it0 (pos,player)
5cf765 212         pos.y=pos.y-1
e23f87 213         drill_dig_it0 (pos,player)
5cf765 214         pos.y=pos.y-1
e23f87 215         drill_dig_it0 (pos,player)
R 216     end
82cba9 217
e23f87 218     if mode==5 then -- 3 x 3
R 219         local dir=player:get_look_dir()
220         if math.abs(dir.y)<0.5 then
221             dir=drill_dig_it1(player)
222                 if dir==0 or dir==1 then -- x
223                     drill_dig_it2(pos,player)
224                 end
225                 if dir==2 or dir==3 then  -- z
226                     drill_dig_it3(pos,player)
227                 end
228         else
229         drill_dig_it4(pos,player)
230         end
231     end
a8daa4 232
e23f87 233     minetest.sound_play("mining_drill", {pos = pos, gain = 1.0, max_hear_distance = 10,})
R 234 end
82cba9 235
c39498 236 local function pos_is_pointable(pos)
a41390 237     local node = minetest.get_node(pos)
c39498 238     local nodedef = minetest.registered_nodes[node.name]
Z 239     return nodedef and nodedef.pointable
240 end
241
5cf765 242 local function mining_drill_mk2_setmode(user,itemstack)
S 243     local player_name=user:get_player_name()
244     local item=itemstack:to_table()
a8daa4 245     local mode = nil
5cf765 246     local meta=minetest.deserialize(item["metadata"])
S 247     if meta==nil then
248         meta={}
249         mode=0
e23f87 250     end
5cf765 251     if meta["mode"]==nil then
04c6f5 252         minetest.chat_send_player(player_name, S("Use while sneaking to change Mining Drill Mk%d modes."):format(2))
5cf765 253         meta["mode"]=0
S 254         mode=0
255     end
256     mode=(meta["mode"])
257     mode=mode+1
258     if mode>=5 then mode=1 end
259     minetest.chat_send_player(player_name, S("Mining Drill Mk%d Mode %d"):format(2, mode)..": "..mining_drill_mode_text[mode][1])
1765c3 260     itemstack:set_name("technic:mining_drill_mk2_"..mode);
5cf765 261     meta["mode"]=mode
11610c 262     itemstack:set_metadata(minetest.serialize(meta))
5cf765 263     return itemstack
e23f87 264 end
R 265
5cf765 266 local function mining_drill_mk3_setmode(user,itemstack)
S 267     local player_name=user:get_player_name()
268     local item=itemstack:to_table()
269     local meta=minetest.deserialize(item["metadata"])
270     if meta==nil then
271         meta={}
272         mode=0
273     end
274     if meta["mode"]==nil then
04c6f5 275         minetest.chat_send_player(player_name, S("Use while sneaking to change Mining Drill Mk%d modes."):format(3))
5cf765 276         meta["mode"]=0
S 277         mode=0
278     end
279     mode=(meta["mode"])
280     mode=mode+1
281     if mode>=6 then mode=1 end
282     minetest.chat_send_player(player_name, S("Mining Drill Mk%d Mode %d"):format(3, mode)..": "..mining_drill_mode_text[mode][1])
1765c3 283     itemstack:set_name("technic:mining_drill_mk3_"..mode);
5cf765 284     meta["mode"]=mode
11610c 285     itemstack:set_metadata(minetest.serialize(meta))
5cf765 286     return itemstack
e23f87 287 end
R 288
5cf765 289
S 290 local function mining_drill_mk2_handler(itemstack, user, pointed_thing)
291     local keys = user:get_player_control()
292     local meta = minetest.deserialize(itemstack:get_metadata())
293     if not meta or not meta.mode or keys.sneak then
294         return mining_drill_mk2_setmode(user, itemstack)
295     end
c39498 296     if pointed_thing.type ~= "node" or not pos_is_pointable(pointed_thing.under) or not meta.charge then
5cf765 297         return
S 298     end
e748af 299     local charge_to_take = cost_to_use(2, meta.mode)
Z 300     if meta.charge >= charge_to_take then
7890ff 301         local pos = minetest.get_pointed_thing_position(pointed_thing, false)
e748af 302         drill_dig_it(pos, user, meta.mode)
b8c902 303         if not technic.creative_mode then
M 304             meta.charge = meta.charge - charge_to_take
305             itemstack:set_metadata(minetest.serialize(meta))
306             technic.set_RE_wear(itemstack, meta.charge, max_charge[2])
307         end
5cf765 308     end
S 309     return itemstack
310 end
311
312 local function mining_drill_mk3_handler(itemstack, user, pointed_thing)
313     local keys = user:get_player_control()
314     local meta = minetest.deserialize(itemstack:get_metadata())
315     if not meta or not meta.mode or keys.sneak then
316         return mining_drill_mk3_setmode(user, itemstack)
317     end
c39498 318     if pointed_thing.type ~= "node" or not pos_is_pointable(pointed_thing.under) or not meta.charge then
5cf765 319         return
S 320     end
e748af 321     local charge_to_take = cost_to_use(3, meta.mode)
Z 322     if meta.charge >= charge_to_take then
7890ff 323         local pos = minetest.get_pointed_thing_position(pointed_thing, false)
e748af 324         drill_dig_it(pos, user, meta.mode)
b8c902 325         if not technic.creative_mode then
M 326             meta.charge = meta.charge - charge_to_take
327             itemstack:set_metadata(minetest.serialize(meta))
328             technic.set_RE_wear(itemstack, meta.charge, max_charge[3])
329         end
5cf765 330     end
S 331     return itemstack
e23f87 332 end
R 333
e748af 334 technic.register_power_tool("technic:mining_drill", max_charge[1])
5cf765 335
e23f87 336 minetest.register_tool("technic:mining_drill", {
f90915 337     description = S("Mining Drill Mk%d"):format(1),
e23f87 338     inventory_image = "technic_mining_drill.png",
R 339     stack_max = 1,
99fd5d 340     wear_represents = "technic_RE_charge",
00d7c9 341     on_refill = technic.refill_RE_charge,
e23f87 342     on_use = function(itemstack, user, pointed_thing)
c39498 343         if pointed_thing.type ~= "node" or not pos_is_pointable(pointed_thing.under) then
eac484 344             return itemstack
e23f87 345         end
5cf765 346         local meta = minetest.deserialize(itemstack:get_metadata())
eac484 347         if not meta or not meta.charge then
S 348             return
349         end
e748af 350         local charge_to_take = cost_to_use(1, 1)
Z 351         if meta.charge >= charge_to_take then
7890ff 352             local pos = minetest.get_pointed_thing_position(pointed_thing, false)
e748af 353             drill_dig_it(pos, user, 1)
b8c902 354             if not technic.creative_mode then
M 355                 meta.charge = meta.charge - charge_to_take
356                 itemstack:set_metadata(minetest.serialize(meta))
357                 technic.set_RE_wear(itemstack, meta.charge, max_charge[1])
358             end
eac484 359         end
S 360         return itemstack
e23f87 361     end,
R 362 })
363
364 minetest.register_tool("technic:mining_drill_mk2", {
f90915 365     description = S("Mining Drill Mk%d"):format(2),
e23f87 366     inventory_image = "technic_mining_drill_mk2.png",
99fd5d 367     wear_represents = "technic_RE_charge",
00d7c9 368     on_refill = technic.refill_RE_charge,
e23f87 369     on_use = function(itemstack, user, pointed_thing)
eac484 370         mining_drill_mk2_handler(itemstack, user, pointed_thing)
S 371         return itemstack
e23f87 372     end,
R 373 })
ee0765 374
e748af 375 technic.register_power_tool("technic:mining_drill_mk2", max_charge[2])
e23f87 376
eac484 377 for i = 1, 4 do
e748af 378     technic.register_power_tool("technic:mining_drill_mk2_"..i, max_charge[2])
ee0765 379     minetest.register_tool("technic:mining_drill_mk2_"..i, {
be2f30 380         description = S("Mining Drill Mk%d Mode %d"):format(2, i),
ee0765 381         inventory_image = "technic_mining_drill_mk2.png^technic_tool_mode"..i..".png",
S 382         wield_image = "technic_mining_drill_mk2.png",
99fd5d 383         wear_represents = "technic_RE_charge",
00d7c9 384         on_refill = technic.refill_RE_charge,
ee0765 385         groups = {not_in_creative_inventory=1},
S 386         on_use = function(itemstack, user, pointed_thing)
387             mining_drill_mk2_handler(itemstack, user, pointed_thing)
388             return itemstack
389         end,
390     })
e23f87 391 end
R 392
393 minetest.register_tool("technic:mining_drill_mk3", {
f90915 394     description = S("Mining Drill Mk%d"):format(3),
e23f87 395     inventory_image = "technic_mining_drill_mk3.png",
99fd5d 396     wear_represents = "technic_RE_charge",
00d7c9 397     on_refill = technic.refill_RE_charge,
e23f87 398     on_use = function(itemstack, user, pointed_thing)
R 399     mining_drill_mk3_handler(itemstack,user,pointed_thing)
400     return itemstack
401     end,
402 })
ee0765 403
e748af 404 technic.register_power_tool("technic:mining_drill_mk3", max_charge[3])
e23f87 405
R 406 for i=1,5,1 do
e748af 407     technic.register_power_tool("technic:mining_drill_mk3_"..i, max_charge[3])
ee0765 408     minetest.register_tool("technic:mining_drill_mk3_"..i, {
be2f30 409         description = S("Mining Drill Mk%d Mode %d"):format(3, i),
ee0765 410         inventory_image = "technic_mining_drill_mk3.png^technic_tool_mode"..i..".png",
S 411         wield_image = "technic_mining_drill_mk3.png",
99fd5d 412         wear_represents = "technic_RE_charge",
00d7c9 413         on_refill = technic.refill_RE_charge,
ee0765 414         groups = {not_in_creative_inventory=1},
S 415         on_use = function(itemstack, user, pointed_thing)
416         mining_drill_mk3_handler(itemstack,user,pointed_thing)
417         return itemstack
418         end,
419     })
e23f87 420 end