Gábriel
2024-03-25 d5ff69d1d9efd683d852562af6cfddac5ac69879
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()
a08ba2 251     local meta = technic.get_stack_meta(itemstack)
0f6bdb 252
a08ba2 253     if not meta:contains("mode") then
0f6bdb 254         minetest.chat_send_player(player_name,
S 255             S("Use while sneaking to change Mining Drill Mk%d modes."):format(drill_type))
e23f87 256     end
a08ba2 257     local mode = meta:get_int("mode") + 1
0f6bdb 258     if mode > max_modes then mode = 1 end
S 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))
a08ba2 264     meta:set_int("mode", mode)
5cf765 265     return itemstack
e23f87 266 end
R 267
0f6bdb 268 local function mining_drill_mkX_handler(itemstack, user, pointed_thing, drill_type, max_modes)
5cf765 269     local keys = user:get_player_control()
a08ba2 270     local meta = technic.get_stack_meta(itemstack)
0f6bdb 271
S 272     -- Mode switching (if possible)
273     if max_modes > 1 then
a08ba2 274         if not meta:contains("mode") or keys.sneak then
0f6bdb 275             return mining_drill_mkX_setmode(user, itemstack, drill_type, max_modes)
b8c902 276         end
5cf765 277     end
0f6bdb 278     if pointed_thing.type ~= "node" or not pos_is_pointable(pointed_thing.under) then
S 279         return
280     end
a08ba2 281
C 282     local charge = meta:get_int("technic:charge")
283     local mode = meta:contains("mode") and meta:get_int("mode") or 1
0f6bdb 284
S 285     -- Check whether the tool has enough charge
a08ba2 286     local charge_to_take = cost_to_use(drill_type, mode)
C 287     if charge < charge_to_take then
0f6bdb 288         return
S 289     end
290
291     -- Do the actual shoorting action
292     local pos = minetest.get_pointed_thing_position(pointed_thing, false)
a08ba2 293     drill_dig_it(pos, user, mode)
0f6bdb 294     if not technic.creative_mode then
a08ba2 295         charge = charge - charge_to_take
C 296         meta:set_int("technic:charge", charge)
297         technic.set_RE_wear(itemstack, charge, max_charge[drill_type])
0f6bdb 298     end
5cf765 299     return itemstack
S 300 end
301
0f6bdb 302 -- Simple mining drill registration
e23f87 303
e748af 304 technic.register_power_tool("technic:mining_drill", max_charge[1])
5cf765 305
e23f87 306 minetest.register_tool("technic:mining_drill", {
f90915 307     description = S("Mining Drill Mk%d"):format(1),
e23f87 308     inventory_image = "technic_mining_drill.png",
R 309     stack_max = 1,
99fd5d 310     wear_represents = "technic_RE_charge",
00d7c9 311     on_refill = technic.refill_RE_charge,
e23f87 312     on_use = function(itemstack, user, pointed_thing)
0f6bdb 313         mining_drill_mkX_handler(itemstack, user, pointed_thing, 1, 1)
eac484 314         return itemstack
e23f87 315     end,
R 316 })
0f6bdb 317
S 318 -- Mk2 registration
e23f87 319
R 320 minetest.register_tool("technic:mining_drill_mk2", {
f90915 321     description = S("Mining Drill Mk%d"):format(2),
e23f87 322     inventory_image = "technic_mining_drill_mk2.png",
99fd5d 323     wear_represents = "technic_RE_charge",
00d7c9 324     on_refill = technic.refill_RE_charge,
e23f87 325     on_use = function(itemstack, user, pointed_thing)
0f6bdb 326         mining_drill_mkX_handler(itemstack, user, pointed_thing, 2, 4)
eac484 327         return itemstack
e23f87 328     end,
R 329 })
ee0765 330
e748af 331 technic.register_power_tool("technic:mining_drill_mk2", max_charge[2])
e23f87 332
eac484 333 for i = 1, 4 do
e748af 334     technic.register_power_tool("technic:mining_drill_mk2_"..i, max_charge[2])
ee0765 335     minetest.register_tool("technic:mining_drill_mk2_"..i, {
be2f30 336         description = S("Mining Drill Mk%d Mode %d"):format(2, i),
ee0765 337         inventory_image = "technic_mining_drill_mk2.png^technic_tool_mode"..i..".png",
S 338         wield_image = "technic_mining_drill_mk2.png",
99fd5d 339         wear_represents = "technic_RE_charge",
00d7c9 340         on_refill = technic.refill_RE_charge,
ee0765 341         groups = {not_in_creative_inventory=1},
S 342         on_use = function(itemstack, user, pointed_thing)
0f6bdb 343             mining_drill_mkX_handler(itemstack, user, pointed_thing, 2, 4)
ee0765 344             return itemstack
S 345         end,
346     })
e23f87 347 end
0f6bdb 348
S 349 -- Mk3 registration
e23f87 350
R 351 minetest.register_tool("technic:mining_drill_mk3", {
f90915 352     description = S("Mining Drill Mk%d"):format(3),
e23f87 353     inventory_image = "technic_mining_drill_mk3.png",
99fd5d 354     wear_represents = "technic_RE_charge",
00d7c9 355     on_refill = technic.refill_RE_charge,
e23f87 356     on_use = function(itemstack, user, pointed_thing)
0f6bdb 357         mining_drill_mkX_handler(itemstack, user, pointed_thing, 3, 5)
S 358         return itemstack
e23f87 359     end,
R 360 })
ee0765 361
e748af 362 technic.register_power_tool("technic:mining_drill_mk3", max_charge[3])
e23f87 363
R 364 for i=1,5,1 do
e748af 365     technic.register_power_tool("technic:mining_drill_mk3_"..i, max_charge[3])
ee0765 366     minetest.register_tool("technic:mining_drill_mk3_"..i, {
be2f30 367         description = S("Mining Drill Mk%d Mode %d"):format(3, i),
ee0765 368         inventory_image = "technic_mining_drill_mk3.png^technic_tool_mode"..i..".png",
S 369         wield_image = "technic_mining_drill_mk3.png",
99fd5d 370         wear_represents = "technic_RE_charge",
00d7c9 371         on_refill = technic.refill_RE_charge,
ee0765 372         groups = {not_in_creative_inventory=1},
S 373         on_use = function(itemstack, user, pointed_thing)
0f6bdb 374             mining_drill_mkX_handler(itemstack, user, pointed_thing, 3, 5)
S 375             return itemstack
ee0765 376         end,
S 377     })
e23f87 378 end