Thomas
2017-03-05 1765c31eaa758b0a522a51ae0c1748f0fbb05f23
commit | author | age
f90915 1 local mining_lasers_list = {
a6dae8 2 --    {<num>, <range of the laser shots>, <max_charge>, <charge_per_shot>},
BM 3     {"1", 7, 50000, 1000},
4     {"2", 14, 200000, 2000},
5     {"3", 21, 650000, 3000},
f90915 6 }
H 7
8 local S = technic.getter
9
2d7c1d 10 minetest.register_craft({
S 11     output = 'technic:laser_mk1',
12     recipe = {
5e4a87 13         {'default:diamond', 'technic:brass_ingot',        'default:obsidian_glass'},
Z 14         {'',                'technic:brass_ingot',        'technic:red_energy_crystal'},
68b7bc 15         {'',                '',                           'default:copper_ingot'},
49052d 16     }
BM 17 })
18 minetest.register_craft({
19     output = 'technic:laser_mk2',
20     recipe = {
68b7bc 21         {'default:diamond', 'technic:carbon_steel_ingot', 'technic:laser_mk1'},
Z 22         {'',                'technic:carbon_steel_ingot', 'technic:green_energy_crystal'},
23         {'',                '',                           'default:copper_ingot'},
49052d 24     }
BM 25 })
26 minetest.register_craft({
27     output = 'technic:laser_mk3',
28     recipe = {
68b7bc 29         {'default:diamond', 'technic:carbon_steel_ingot', 'technic:laser_mk2'},
Z 30         {'',                'technic:carbon_steel_ingot', 'technic:blue_energy_crystal'},
31         {'',                '',                           'default:copper_ingot'},
2d7c1d 32     }
S 33 })
34
42d008 35 local function laser_node(pos, node, player)
S 36     local def = minetest.registered_nodes[node.name]
37     if def and def.liquidtype ~= "none" then
f90915 38         minetest.remove_node(pos)
4d1f97 39         minetest.add_particle({
H 40             pos = pos,
cfd4cb 41             velocity = {x=0, y=2, z=0},
S 42             acceleration = {x=0, y=-1, z=0},
4d1f97 43             expirationtime = 1.5,
42d008 44             size = 6 + math.random() * 2,
S 45             texture = "smoke_puff.png^[transform" .. math.random(0, 7),
4d1f97 46         })
f90915 47         return
H 48     end
42d008 49     minetest.node_dig(pos, node, player)
f90915 50 end
H 51
42d008 52 local no_destroy = {
S 53     ["air"] = true,
54     ["default:lava_source"] = true,
55     ["default:lava_flowing"] = true,
56 }
f90915 57 local function laser_shoot(player, range, particle_texture, sound)
42d008 58     local player_pos = player:getpos()
S 59     local player_name = player:get_player_name()
f90915 60     local dir = player:get_look_dir()
H 61
42d008 62     local start_pos = vector.new(player_pos)
S 63     -- Adjust to head height
2b0a28 64     start_pos.y = start_pos.y + 1.6
4d1f97 65     minetest.add_particle({
H 66         pos = startpos,
cfd4cb 67         velocity = dir,
S 68         acceleration = vector.multiply(dir, 50),
4d1f97 69         expirationtime = range / 11,
H 70         size = 1,
42d008 71         texture = particle_texture .. "^[transform" .. math.random(0, 7),
4d1f97 72     })
42d008 73     minetest.sound_play(sound, {pos = player_pos, max_hear_distance = range})
1475ee 74     for pos in technic.trace_node_ray_fat(start_pos, dir, range) do
42d008 75         if minetest.is_protected(pos, player_name) then
S 76             minetest.record_protection_violation(pos, player_name)
77             break
78         end
79         local node = minetest.get_node_or_nil(pos)
80         if not node then
81             break
82         end
83         if not no_destroy[node.name] then
84             laser_node(pos, node, player)
85         end
4d1f97 86     end
f90915 87 end
H 88
89
90 for _, m in pairs(mining_lasers_list) do
91     technic.register_power_tool("technic:laser_mk"..m[1], m[3])
92     minetest.register_tool("technic:laser_mk"..m[1], {
93         description = S("Mining Laser Mk%d"):format(m[1]),
94         inventory_image = "technic_mining_laser_mk"..m[1]..".png",
95         stack_max = 1,
99fd5d 96         wear_represents = "technic_RE_charge",
00d7c9 97         on_refill = technic.refill_RE_charge,
f90915 98         on_use = function(itemstack, user)
5cf765 99             local meta = minetest.deserialize(itemstack:get_metadata())
f90915 100             if not meta or not meta.charge then
H 101                 return
102             end
a6dae8 103
BM 104             -- If there's enough charge left, fire the laser
105             if meta.charge >= m[4] then
f90915 106                 laser_shoot(user, m[2], "technic_laser_beam_mk"..m[1]..".png", "technic_laser_mk"..m[1])
b8c902 107                 if not technic.creative_mode then
M 108                     meta.charge = meta.charge - m[4]
109                     technic.set_RE_wear(itemstack, meta.charge, m[3])
110                     itemstack:set_metadata(minetest.serialize(meta))
111                 end
f90915 112             end
H 113             return itemstack
114         end,
115     })
116 end
117