ShadowNinja
2013-10-30 be2f30a1a2f5b6c2aae7fd4cf8231aec2da0844d
commit | author | age
ee0765 1 local mining_drill_max_charge      = 60000
S 2 local mining_drill_mk2_max_charge  = 240000
3 local mining_drill_mk3_max_charge  = 960000
4 local mining_drill_power_usage     = 200
5 local mining_drill_mk2_power_usage = 600
6 local mining_drill_mk3_power_usage = 1800
82cba9 7
be2f30 8 local S = technic.getter
S 9
82cba9 10 minetest.register_craft({
R 11     output = 'technic:mining_drill',
12     recipe = {
eac484 13         {'technic:stainless_steel_ingot', 'technic:diamond_drill_head', 'technic:stainless_steel_ingot'},
S 14         {'technic:stainless_steel_ingot', 'technic:motor',              'technic:stainless_steel_ingot'},
15         {'',                              'technic:red_energy_crystal', 'moreores:copper_ingot'},
82cba9 16     }
R 17 })
e23f87 18 minetest.register_craft({
R 19     output = 'technic:mining_drill_mk2',
20     recipe = {
eac484 21         {'technic:diamond_drill_head',    'technic:diamond_drill_head',   'technic:diamond_drill_head'},
S 22         {'technic:stainless_steel_ingot', 'technic:mining_drill',         'technic:stainless_steel_ingot'},
23         {'',                              'technic:green_energy_crystal', ''},
e23f87 24     }
R 25 })
26 minetest.register_craft({
27     output = 'technic:mining_drill_mk3',
28     recipe = {
eac484 29         {'technic:diamond_drill_head',    'technic:diamond_drill_head',  'technic:diamond_drill_head'},
S 30         {'technic:stainless_steel_ingot', 'technic:mining_drill_mk2',    'technic:stainless_steel_ingot'},
31         {'',                              'technic:blue_energy_crystal', ''},
e23f87 32     }
R 33 })
eac484 34 for i = 1, 4 do
ee0765 35     minetest.register_craft({
S 36         output = 'technic:mining_drill_mk3',
37         recipe = {
38             {'technic:diamond_drill_head',    'technic:diamond_drill_head',   'technic:diamond_drill_head'},
39             {'technic:stainless_steel_ingot', 'technic:mining_drill_mk2_'..i, 'technic:stainless_steel_ingot'},
40             {'',                              'technic:blue_energy_crystal',  ''},
41         }
42     })
91329b 43 end
82cba9 44
eac484 45 function drill_dig_it(pos, player, drill_type, mode)
e23f87 46     local charge
eac484 47     if mode == 1 then
S 48         drill_dig_it0(pos, player)
e23f87 49     end
R 50     
eac484 51     if mode == 2 then -- 3 deep
S 52         dir = drill_dig_it1(player)
53         if dir == 0 then -- x+
54             drill_dig_it0(pos, player)
55             pos.x = pos.x + 1
56             drill_dig_it0(pos, player)
57             pos.x = pos.x + 1
58             drill_dig_it0(pos, player)
e23f87 59         end
eac484 60         if dir == 1 then  -- x-
S 61             drill_dig_it0(pos, player)
e23f87 62             pos.x=pos.x-1
R 63             drill_dig_it0 (pos,player)
64             pos.x=pos.x-1
65             drill_dig_it0 (pos,player)
66         end
67         if dir==2 then  -- z+
68             drill_dig_it0 (pos,player)
69             pos.z=pos.z+1
70             drill_dig_it0 (pos,player)
71             pos.z=pos.z+1
72             drill_dig_it0 (pos,player)
73         end
74         if dir==3 then  -- z-
75             drill_dig_it0 (pos,player)
76             pos.z=pos.z+1
77             drill_dig_it0 (pos,player)
78             pos.z=pos.z+1
79             drill_dig_it0 (pos,player)
80         end
81     end
82     
83     if mode==3 then -- 3 wide
84         dir=drill_dig_it1(player)
85         if dir==0 or dir==1 then -- x
86             drill_dig_it0 (pos,player)
87             pos.z=pos.z+1
88             drill_dig_it0 (pos,player)
89             pos.z=pos.z-2
90             drill_dig_it0 (pos,player)
91         end
92         if dir==2 or dir==3 then  -- z
93             drill_dig_it0 (pos,player)
94             pos.x=pos.x+1
95             drill_dig_it0 (pos,player)
96             pos.x=pos.x-2
97             drill_dig_it0 (pos,player)
98         end
99     end
100     
101     if mode==4 then -- 3 tall, selected in the middle
102         drill_dig_it0 (pos,player)
103         pos.y=pos.y+1
104         drill_dig_it0 (pos,player)
105         pos.y=pos.y-2
106         drill_dig_it0 (pos,player)
107     end
82cba9 108
e23f87 109     if mode==5 then -- 3 x 3
R 110         local dir=player:get_look_dir()
111         if math.abs(dir.y)<0.5 then
112             dir=drill_dig_it1(player)
113                 if dir==0 or dir==1 then -- x
114                     drill_dig_it2(pos,player)
115                 end
116                 if dir==2 or dir==3 then  -- z
117                     drill_dig_it3(pos,player)
118                 end
119         else
120         drill_dig_it4(pos,player)
121         end
122     end
123     
124     if drill_type==1 then charge=mining_drill_power_usage end
125     if drill_type==2 then 
126         if  mode==1 then charge=mining_drill_mk2_power_usage end
127         if (mode==2 or mode==3 or mode==4) then charge=mining_drill_mk2_power_usage*3 end
128     end
129     if drill_type==3 then 
130         if  mode==1 then charge=mining_drill_power_usage end
131         if (mode==2 or mode==3 or mode==4) then charge=mining_drill_mk2_power_usage*6 end
132         if mode==5 then charge=mining_drill_mk2_power_usage*9 end
133     end
134     minetest.sound_play("mining_drill", {pos = pos, gain = 1.0, max_hear_distance = 10,})
135     return charge
136 end
82cba9 137
e23f87 138 function drill_dig_it0 (pos,player)
82cba9 139     local node=minetest.env:get_node(pos)
R 140     if node.name == "air" or node.name == "ignore" then return end
141     if node.name == "default:lava_source" then return end
142     if node.name == "default:lava_flowing" then return end
143     if node.name == "default:water_source" then minetest.env:remove_node(pos) return end
144     if node.name == "default:water_flowing" then minetest.env:remove_node(pos) return end
145     minetest.node_dig(pos,node,player)
e23f87 146 end
82cba9 147
e23f87 148 function drill_dig_it1 (player)
R 149     local dir=player:get_look_dir()
150     if math.abs(dir.x)>math.abs(dir.z) then 
151         if dir.x>0 then return 0 end
152         return 1
153     end
154     if dir.z>0 then return 2 end
155     return 3
156 end
157
158 function drill_dig_it2 (pos,player)
159     drill_dig_it0 (pos,player)
160     pos.z=pos.z+1
161     drill_dig_it0 (pos,player)
162     pos.z=pos.z-2
163     drill_dig_it0 (pos,player)
164     pos.z=pos.z+1
165     pos.y=pos.y+1
166     drill_dig_it0 (pos,player)
167     pos.z=pos.z+1
168     drill_dig_it0 (pos,player)
169     pos.z=pos.z-2
170     drill_dig_it0 (pos,player)
171     pos.z=pos.z+1
172     pos.y=pos.y-2
173     drill_dig_it0 (pos,player)
174     pos.z=pos.z+1
175     drill_dig_it0 (pos,player)
176     pos.z=pos.z-2
177     drill_dig_it0 (pos,player)
178 end
179 function drill_dig_it3 (pos,player)
180     drill_dig_it0 (pos,player)
181     pos.x=pos.x+1
182     drill_dig_it0 (pos,player)
183     pos.x=pos.x-2
184     drill_dig_it0 (pos,player)
185     pos.x=pos.x+1
186     pos.y=pos.y+1
187     drill_dig_it0 (pos,player)
188     pos.x=pos.x+1
189     drill_dig_it0 (pos,player)
190     pos.x=pos.x-2
191     drill_dig_it0 (pos,player)
192     pos.x=pos.x+1
193     pos.y=pos.y-2
194     drill_dig_it0 (pos,player)
195     pos.x=pos.x+1
196     drill_dig_it0 (pos,player)
197     pos.x=pos.x-2
198     drill_dig_it0 (pos,player)
199 end
200
201 function drill_dig_it4 (pos,player)
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     pos.x=pos.x+1
208     pos.z=pos.z+1
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     pos.x=pos.x+1
215     pos.z=pos.z-2
216     drill_dig_it0 (pos,player)
217     pos.x=pos.x+1
218     drill_dig_it0 (pos,player)
219     pos.x=pos.x-2
220     drill_dig_it0 (pos,player)
221 end
222
ee0765 223 technic.register_power_tool("technic:mining_drill", mining_drill_max_charge)
e23f87 224 minetest.register_tool("technic:mining_drill", {
be2f30 225     description = S("Mining Drill Mk1"),
e23f87 226     inventory_image = "technic_mining_drill.png",
R 227     stack_max = 1,
228     on_use = function(itemstack, user, pointed_thing)
eac484 229         if pointed_thing.type ~= "node" then
S 230             return itemstack
e23f87 231         end
eac484 232         local meta = get_item_meta(itemstack:get_metadata())
S 233         if not meta or not meta.charge then
234             return
235         end
236         if meta.charge - mining_drill_power_usage > 0 then
237             local pos = minetest.get_pointed_thing_position(pointed_thing, above)
238             charge_to_take = drill_dig_it(pos, user, 1, 1)
239             meta.charge = meta.charge - mining_drill_power_usage
240             itemstack:set_metadata(set_item_meta(meta))
241             technic.set_RE_wear(itemstack, meta.charge, mining_drill_max_charge)
242         end
243         return itemstack
e23f87 244     end,
R 245 })
246
247 minetest.register_tool("technic:mining_drill_mk2", {
be2f30 248     description = S("Mining Drill Mk2"),
e23f87 249     inventory_image = "technic_mining_drill_mk2.png",
R 250     on_use = function(itemstack, user, pointed_thing)
eac484 251         mining_drill_mk2_handler(itemstack, user, pointed_thing)
S 252         return itemstack
e23f87 253     end,
R 254 })
ee0765 255
S 256 technic.register_power_tool("technic:mining_drill_mk2", mining_drill_mk2_max_charge)
e23f87 257
eac484 258 for i = 1, 4 do
ee0765 259     technic.register_power_tool("technic:mining_drill_mk2_"..i, mining_drill_mk2_max_charge)
S 260     minetest.register_tool("technic:mining_drill_mk2_"..i, {
be2f30 261         description = S("Mining Drill Mk%d Mode %d"):format(2, i),
ee0765 262         inventory_image = "technic_mining_drill_mk2.png^technic_tool_mode"..i..".png",
S 263         wield_image = "technic_mining_drill_mk2.png",
264         groups = {not_in_creative_inventory=1},
265         on_use = function(itemstack, user, pointed_thing)
266             mining_drill_mk2_handler(itemstack, user, pointed_thing)
267             return itemstack
268         end,
269     })
e23f87 270 end
R 271
272 minetest.register_tool("technic:mining_drill_mk3", {
be2f30 273     description = S("Mining Drill Mk3"),
e23f87 274     inventory_image = "technic_mining_drill_mk3.png",
R 275     on_use = function(itemstack, user, pointed_thing)
276     mining_drill_mk3_handler(itemstack,user,pointed_thing)
277     return itemstack
278     end,
279 })
ee0765 280
S 281 technic.register_power_tool("technic:mining_drill_mk3", mining_drill_mk3_max_charge)
e23f87 282
R 283 for i=1,5,1 do
ee0765 284     technic.register_power_tool("technic:mining_drill_mk3_"..i, mining_drill_mk3_max_charge)
S 285     minetest.register_tool("technic:mining_drill_mk3_"..i, {
be2f30 286         description = S("Mining Drill Mk%d Mode %d"):format(3, i),
ee0765 287         inventory_image = "technic_mining_drill_mk3.png^technic_tool_mode"..i..".png",
S 288         wield_image = "technic_mining_drill_mk3.png",
289         groups = {not_in_creative_inventory=1},
290         on_use = function(itemstack, user, pointed_thing)
291         mining_drill_mk3_handler(itemstack,user,pointed_thing)
292         return itemstack
293         end,
294     })
e23f87 295 end
R 296
eac484 297 function mining_drill_mk2_handler(itemstack, user, pointed_thing)
S 298     local keys = user:get_player_control()
299     local player_name = user:get_player_name()
300     local meta = get_item_meta(itemstack:get_metadata())
301     if not meta or not meta.mode or keys.sneak then
302         return mining_drill_mk2_setmode(user, itemstack)
303     end
304     if pointed_thing.type ~= "node" or not meta.charge then
305         return
306     end
307     if meta.charge - mining_drill_power_usage > 0 then
308         local pos = minetest.get_pointed_thing_position(pointed_thing, above)
309         local charge_to_take = drill_dig_it(pos, user, 2, meta.mode)
310         meta.charge = meta.charge - charge_to_take
311         meta.charge = math.max(meta.charge, 0)
312         itemstack:set_metadata(set_item_meta(meta))
313         technic.set_RE_wear(itemstack, meta.charge, mining_drill_mk2_max_charge)
e23f87 314     end
R 315     return itemstack
316 end
317
eac484 318 function mining_drill_mk3_handler(itemstack, user, pointed_thing)
S 319     local keys = user:get_player_control()
320     local player_name = user:get_player_name()
321     local meta = get_item_meta(itemstack:get_metadata())
322     if not meta or not meta.mode or keys.sneak then
323         return mining_drill_mk3_setmode(user, itemstack)
324     end
325     if pointed_thing.type ~= "node" or not meta.charge then
326         return
327     end
328     if meta.charge - mining_drill_power_usage > 0 then
329         local pos = minetest.get_pointed_thing_position(pointed_thing, above)
330         local charge_to_take = drill_dig_it(pos, user, 3, meta.mode)
331         meta.charge = meta.charge - charge_to_take
332         meta.charge = math.max(meta.charge, 0)
333         itemstack:set_metadata(set_item_meta(meta))
334         technic.set_RE_wear(itemstack, meta.charge, mining_drill_mk3_max_charge)
e23f87 335     end
R 336     return itemstack
337 end
338
eac484 339 mining_drill_mode_text = {
be2f30 340     {S("Single node.")},
S 341     {S("3 nodes deep.")},
342     {S("3 nodes wide.")},
343     {S("3 nodes tall.")},
344     {S("3x3 nodes.")},
e23f87 345 }
R 346
347 function mining_drill_mk2_setmode(user,itemstack)
348     local player_name=user:get_player_name()
349     local item=itemstack:to_table()
350     local meta=get_item_meta(item["metadata"])
351     if meta==nil then
352         meta={}
353         mode=0
354     end
355     if meta["mode"]==nil then
be2f30 356         minetest.chat_send_player(player_name, S("Hold shift and use to change Mining Drill Mk%d modes."):format(2))
e23f87 357         meta["mode"]=0
R 358         mode=0
359     end
360     mode=(meta["mode"])
361     mode=mode+1
362     if mode>=5 then mode=1 end
be2f30 363     minetest.chat_send_player(player_name, S("Mining Drill Mk%d Mode %d"):format(2, mode)..": "..mining_drill_mode_text[mode][1])
e23f87 364     item["name"]="technic:mining_drill_mk2_"..mode
R 365     meta["mode"]=mode
366     item["metadata"]=set_item_meta(meta)
367     itemstack:replace(item)
368     return itemstack
369 end
370
371 function mining_drill_mk3_setmode(user,itemstack)
372     local player_name=user:get_player_name()
373     local item=itemstack:to_table()
374     local meta=get_item_meta(item["metadata"])
375     if meta==nil then
376         meta={}
377         mode=0
378     end
379     if meta["mode"]==nil then
be2f30 380         minetest.chat_send_player(player_name, S("Hold shift and use to change Mining Drill Mk%d modes."):format(3))
e23f87 381         meta["mode"]=0
R 382         mode=0
383     end
384     mode=(meta["mode"])
385     mode=mode+1
386     if mode>=6 then mode=1 end
be2f30 387     minetest.chat_send_player(player_name, S("Mining Drill Mk%d Mode %d"):format(3, mode)..": "..mining_drill_mode_text[mode][1])
e23f87 388     item["name"]="technic:mining_drill_mk3_"..mode
R 389     meta["mode"]=mode
390     item["metadata"]=set_item_meta(meta)
391     itemstack:replace(item)
392     return itemstack
393 end
ee0765 394