SmallJoker
2022-06-19 bce5306abea765fed1fdfeb775ed3abd21ff2863
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
bce530 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)
bce530 55     local ndef = minetest.registered_nodes[node.name]
S 56     if not ndef or ndef.drawtype == "airlike" then
57         -- Covers "air", "ignore", unknown nodes and more.
58         return
59     end
60     local groups = ndef and ndef.groups or {}
61
62     if groups.lava then
63         return
64     end
65     if groups.water then
66         minetest.remove_node(pos)
67         return
68     end
69     ndef.on_dig(pos, node, player)
5cf765 70 end
S 71
72 local function drill_dig_it1 (player)
73     local dir=player:get_look_dir()
4f78a6 74     if math.abs(dir.x)>math.abs(dir.z) then
5cf765 75         if dir.x>0 then return 0 end
S 76         return 1
77     end
78     if dir.z>0 then return 2 end
79     return 3
80 end
81
82 local function drill_dig_it2 (pos,player)
83     pos.y=pos.y+1
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
5dd619 90     pos.y=pos.y-1
T 91     drill_dig_it0 (pos,player)
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     pos.z=pos.z+1
97     pos.y=pos.y-1
5cf765 98     drill_dig_it0 (pos,player)
S 99     pos.z=pos.z+1
100     drill_dig_it0 (pos,player)
101     pos.z=pos.z-2
102     drill_dig_it0 (pos,player)
103 end
104
105 local function drill_dig_it3 (pos,player)
106     pos.y=pos.y+1
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
5dd619 113     pos.y=pos.y-1
T 114     drill_dig_it0 (pos,player)
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     pos.x=pos.x+1
120     pos.y=pos.y-1
5cf765 121     drill_dig_it0 (pos,player)
S 122     pos.x=pos.x+1
123     drill_dig_it0 (pos,player)
124     pos.x=pos.x-2
125     drill_dig_it0 (pos,player)
126 end
127
128 local function drill_dig_it4 (pos,player)
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+1
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     pos.x=pos.x+1
142     pos.z=pos.z-2
143     drill_dig_it0 (pos,player)
144     pos.x=pos.x+1
145     drill_dig_it0 (pos,player)
146     pos.x=pos.x-2
147     drill_dig_it0 (pos,player)
148 end
149
e748af 150 local function cost_to_use(drill_type, mode)
Z 151     local mult
152     if mode == 1 then
153         mult = 1
154     elseif mode <= 4 then
155         mult = 3
156     else
157         mult = 9
158     end
159     return power_usage_per_node[drill_type] * mult
160 end
5cf765 161
e748af 162 local function drill_dig_it(pos, player, mode)
eac484 163     if mode == 1 then
S 164         drill_dig_it0(pos, player)
e23f87 165     end
a8daa4 166
eac484 167     if mode == 2 then -- 3 deep
a8daa4 168         local dir = drill_dig_it1(player)
eac484 169         if dir == 0 then -- x+
S 170             drill_dig_it0(pos, player)
171             pos.x = pos.x + 1
172             drill_dig_it0(pos, player)
173             pos.x = pos.x + 1
174             drill_dig_it0(pos, player)
e23f87 175         end
eac484 176         if dir == 1 then  -- x-
S 177             drill_dig_it0(pos, player)
e23f87 178             pos.x=pos.x-1
R 179             drill_dig_it0 (pos,player)
180             pos.x=pos.x-1
181             drill_dig_it0 (pos,player)
182         end
183         if dir==2 then  -- z+
184             drill_dig_it0 (pos,player)
185             pos.z=pos.z+1
186             drill_dig_it0 (pos,player)
187             pos.z=pos.z+1
188             drill_dig_it0 (pos,player)
189         end
190         if dir==3 then  -- z-
191             drill_dig_it0 (pos,player)
8e2cb0 192             pos.z=pos.z-1
e23f87 193             drill_dig_it0 (pos,player)
8e2cb0 194             pos.z=pos.z-1
e23f87 195             drill_dig_it0 (pos,player)
R 196         end
197     end
a8daa4 198
e23f87 199     if mode==3 then -- 3 wide
a8daa4 200         local dir = drill_dig_it1(player)
e23f87 201         if dir==0 or dir==1 then -- x
R 202             drill_dig_it0 (pos,player)
203             pos.z=pos.z+1
204             drill_dig_it0 (pos,player)
205             pos.z=pos.z-2
206             drill_dig_it0 (pos,player)
207         end
208         if dir==2 or dir==3 then  -- z
209             drill_dig_it0 (pos,player)
210             pos.x=pos.x+1
211             drill_dig_it0 (pos,player)
212             pos.x=pos.x-2
213             drill_dig_it0 (pos,player)
214         end
215     end
a8daa4 216
e23f87 217     if mode==4 then -- 3 tall, selected in the middle
R 218         drill_dig_it0 (pos,player)
5cf765 219         pos.y=pos.y-1
e23f87 220         drill_dig_it0 (pos,player)
5cf765 221         pos.y=pos.y-1
e23f87 222         drill_dig_it0 (pos,player)
R 223     end
82cba9 224
e23f87 225     if mode==5 then -- 3 x 3
R 226         local dir=player:get_look_dir()
227         if math.abs(dir.y)<0.5 then
228             dir=drill_dig_it1(player)
229                 if dir==0 or dir==1 then -- x
230                     drill_dig_it2(pos,player)
231                 end
232                 if dir==2 or dir==3 then  -- z
233                     drill_dig_it3(pos,player)
234                 end
235         else
236         drill_dig_it4(pos,player)
237         end
238     end
a8daa4 239
e23f87 240     minetest.sound_play("mining_drill", {pos = pos, gain = 1.0, max_hear_distance = 10,})
R 241 end
82cba9 242
c39498 243 local function pos_is_pointable(pos)
a41390 244     local node = minetest.get_node(pos)
c39498 245     local nodedef = minetest.registered_nodes[node.name]
Z 246     return nodedef and nodedef.pointable
247 end
248
0f6bdb 249 local function mining_drill_mkX_setmode(user, itemstack, drill_type, max_modes)
S 250     local player_name = user:get_player_name()
251     local meta = minetest.deserialize(itemstack:get_metadata()) or {}
252
253     if not meta["mode"] then
254         minetest.chat_send_player(player_name,
255             S("Use while sneaking to change Mining Drill Mk%d modes."):format(drill_type))
e23f87 256     end
0f6bdb 257     local mode = (meta["mode"] or 0) + 1
S 258     if mode > max_modes then mode = 1 end
259
260     minetest.chat_send_player(player_name,
261         S("Mining Drill Mk%d Mode %d"):format(2, mode)..
262         ": "..mining_drill_mode_text[mode][1])
263     itemstack:set_name(("technic:mining_drill_mk%d_%s"):format(drill_type, mode))
264     meta["mode"] = mode
11610c 265     itemstack:set_metadata(minetest.serialize(meta))
5cf765 266     return itemstack
e23f87 267 end
R 268
0f6bdb 269 local function mining_drill_mkX_handler(itemstack, user, pointed_thing, drill_type, max_modes)
5cf765 270     local keys = user:get_player_control()
0f6bdb 271     local meta = minetest.deserialize(itemstack:get_metadata()) or {}
S 272
273     -- Mode switching (if possible)
274     if max_modes > 1 then
275         if not meta.mode or keys.sneak then
276             return mining_drill_mkX_setmode(user, itemstack, drill_type, max_modes)
b8c902 277         end
5cf765 278     end
0f6bdb 279     if pointed_thing.type ~= "node" or not pos_is_pointable(pointed_thing.under) then
S 280         return
281     end
282     if not meta.charge then
283         return
284     end
285
286     -- Check whether the tool has enough charge
287     local charge_to_take = cost_to_use(drill_type, meta.mode or 1)
288     if meta.charge < charge_to_take then
289         return
290     end
291
292     -- Do the actual shoorting action
293     local pos = minetest.get_pointed_thing_position(pointed_thing, false)
bce530 294     drill_dig_it(pos, user, meta.mode or 1)
0f6bdb 295     if not technic.creative_mode then
S 296         meta.charge = meta.charge - charge_to_take
297         itemstack:set_metadata(minetest.serialize(meta))
298         technic.set_RE_wear(itemstack, meta.charge, max_charge[drill_type])
299     end
5cf765 300     return itemstack
S 301 end
302
0f6bdb 303 -- Simple mining drill registration
e23f87 304
e748af 305 technic.register_power_tool("technic:mining_drill", max_charge[1])
5cf765 306
e23f87 307 minetest.register_tool("technic:mining_drill", {
f90915 308     description = S("Mining Drill Mk%d"):format(1),
e23f87 309     inventory_image = "technic_mining_drill.png",
R 310     stack_max = 1,
99fd5d 311     wear_represents = "technic_RE_charge",
00d7c9 312     on_refill = technic.refill_RE_charge,
e23f87 313     on_use = function(itemstack, user, pointed_thing)
0f6bdb 314         mining_drill_mkX_handler(itemstack, user, pointed_thing, 1, 1)
eac484 315         return itemstack
e23f87 316     end,
R 317 })
0f6bdb 318
S 319 -- Mk2 registration
e23f87 320
R 321 minetest.register_tool("technic:mining_drill_mk2", {
f90915 322     description = S("Mining Drill Mk%d"):format(2),
e23f87 323     inventory_image = "technic_mining_drill_mk2.png",
99fd5d 324     wear_represents = "technic_RE_charge",
00d7c9 325     on_refill = technic.refill_RE_charge,
e23f87 326     on_use = function(itemstack, user, pointed_thing)
0f6bdb 327         mining_drill_mkX_handler(itemstack, user, pointed_thing, 2, 4)
eac484 328         return itemstack
e23f87 329     end,
R 330 })
ee0765 331
e748af 332 technic.register_power_tool("technic:mining_drill_mk2", max_charge[2])
e23f87 333
eac484 334 for i = 1, 4 do
e748af 335     technic.register_power_tool("technic:mining_drill_mk2_"..i, max_charge[2])
ee0765 336     minetest.register_tool("technic:mining_drill_mk2_"..i, {
be2f30 337         description = S("Mining Drill Mk%d Mode %d"):format(2, i),
ee0765 338         inventory_image = "technic_mining_drill_mk2.png^technic_tool_mode"..i..".png",
S 339         wield_image = "technic_mining_drill_mk2.png",
99fd5d 340         wear_represents = "technic_RE_charge",
00d7c9 341         on_refill = technic.refill_RE_charge,
ee0765 342         groups = {not_in_creative_inventory=1},
S 343         on_use = function(itemstack, user, pointed_thing)
0f6bdb 344             mining_drill_mkX_handler(itemstack, user, pointed_thing, 2, 4)
ee0765 345             return itemstack
S 346         end,
347     })
e23f87 348 end
0f6bdb 349
S 350 -- Mk3 registration
e23f87 351
R 352 minetest.register_tool("technic:mining_drill_mk3", {
f90915 353     description = S("Mining Drill Mk%d"):format(3),
e23f87 354     inventory_image = "technic_mining_drill_mk3.png",
99fd5d 355     wear_represents = "technic_RE_charge",
00d7c9 356     on_refill = technic.refill_RE_charge,
e23f87 357     on_use = function(itemstack, user, pointed_thing)
0f6bdb 358         mining_drill_mkX_handler(itemstack, user, pointed_thing, 3, 5)
S 359         return itemstack
e23f87 360     end,
R 361 })
ee0765 362
e748af 363 technic.register_power_tool("technic:mining_drill_mk3", max_charge[3])
e23f87 364
R 365 for i=1,5,1 do
e748af 366     technic.register_power_tool("technic:mining_drill_mk3_"..i, max_charge[3])
ee0765 367     minetest.register_tool("technic:mining_drill_mk3_"..i, {
be2f30 368         description = S("Mining Drill Mk%d Mode %d"):format(3, i),
ee0765 369         inventory_image = "technic_mining_drill_mk3.png^technic_tool_mode"..i..".png",
S 370         wield_image = "technic_mining_drill_mk3.png",
99fd5d 371         wear_represents = "technic_RE_charge",
00d7c9 372         on_refill = technic.refill_RE_charge,
ee0765 373         groups = {not_in_creative_inventory=1},
S 374         on_use = function(itemstack, user, pointed_thing)
0f6bdb 375             mining_drill_mkX_handler(itemstack, user, pointed_thing, 3, 5)
S 376             return itemstack
ee0765 377         end,
S 378     })
e23f87 379 end