technic-cd2025/technic/tools/mining_lasers.lua
Zefram 68b7bcc28e split default iron/steel into three metals
Override the default mod's iron/steel substance, replacing it with three
metals: wrought iron (pure iron), carbon steel (iron alloyed with a little
carbon), and cast iron (iron alloyed with lots of carbon).  Wrought iron
is easiest to refine, then cast iron, and carbon steel the most difficult,
matching the historical progression.  Recipes that used default steel are
changed to use one of the three, the choice of alloy for each application
being both somewhat realistic and also matching up with game progression.

The default:steel{_ingot,block} items are identified specifically with
wrought iron.  This makes the default refining recipes work appropriately.
Iron-using recipes defined outside technic are thus necessarily
reinterpreted to use wrought iron, which is mostly appropriate.
Some objects are renamed accordingly.

Rather than use the default steel textures for wrought iron, with technic
providing textures for the other two, technic now provides textures for
all three metals.  This avoids problems that would occur with texture
packs that provide default_steel_{ingot,block} textures that are not
intended to support this wrought-iron/carbon-steel/cast-iron distinction.
A texture pack can provide a distinct set of three textures specifically
for the situation where this distinction is required.

Incidentally make grinding and alloy cooking recipes work correctly when
ingredients are specified by alias.
2014-05-22 20:57:50 +02:00

191 lines
5.1 KiB
Lua

local r_corr = 0.25 -- Remove a bit more nodes (if shooting diagonal) to let it look like a hole (sth like antialiasing)
local mining_lasers_list = {
-- {<num>, <range of the laser shots>, <max_charge>, <charge_per_shot>},
{"1", 7, 50000, 1000},
{"2", 14, 200000, 2000},
{"3", 21, 650000, 3000},
}
local f_1 = 0.5 - r_corr
local f_2 = 0.5 + r_corr
local S = technic.getter
minetest.register_craft({
output = 'technic:laser_mk1',
recipe = {
{'default:diamond', 'technic:carbon_steel_ingot', 'technic:red_energy_crystal'},
{'', 'technic:carbon_steel_ingot', 'technic:carbon_steel_ingot'},
{'', '', 'default:copper_ingot'},
}
})
minetest.register_craft({
output = 'technic:laser_mk2',
recipe = {
{'default:diamond', 'technic:carbon_steel_ingot', 'technic:laser_mk1'},
{'', 'technic:carbon_steel_ingot', 'technic:green_energy_crystal'},
{'', '', 'default:copper_ingot'},
}
})
minetest.register_craft({
output = 'technic:laser_mk3',
recipe = {
{'default:diamond', 'technic:carbon_steel_ingot', 'technic:laser_mk2'},
{'', 'technic:carbon_steel_ingot', 'technic:blue_energy_crystal'},
{'', '', 'default:copper_ingot'},
}
})
local function get_used_dir(dir)
local abs_dir = {x = math.abs(dir.x),
y = math.abs(dir.y),
z = math.abs(dir.z)}
local dir_max = math.max(abs_dir.x, abs_dir.y, abs_dir.z)
if dir_max == abs_dir.x then
local tab = {"x", {x = 1, y = dir.y / dir.x, z = dir.z / dir.x}}
if dir.x >= 0 then
tab[3] = "+"
end
return tab
end
if dir_max == abs_dir.y then
local tab = {"y", {x = dir.x / dir.y, y = 1, z = dir.z / dir.y}}
if dir.y >= 0 then
tab[3] = "+"
end
return tab
end
local tab = {"z", {x = dir.x / dir.z, y = dir.y / dir.z, z = 1}}
if dir.z >= 0 then
tab[3] = "+"
end
return tab
end
local function node_tab(z, d)
local n1 = math.floor(z * d + f_1)
local n2 = math.floor(z * d + f_2)
if n1 == n2 then
return {n1}
end
return {n1, n2}
end
local function laser_node(pos, player)
local node = minetest.get_node(pos)
if node.name == "air"
or node.name == "ignore"
or node.name == "default:lava_source"
or node.name == "default:lava_flowing" then
return
end
if minetest.is_protected(pos, player:get_player_name()) then
minetest.record_protection_violation(pos, player:get_player_name())
return
end
if node.name == "default:water_source"
or node.name == "default:water_flowing" then
minetest.remove_node(pos)
minetest.add_particle(pos,
{x=0, y=2, z=0},
{x=0, y=-1, z=0},
1.5,
8,
false,
"smoke_puff.png")
return
end
if player then
minetest.node_dig(pos, node, player)
end
end
local function laser_nodes(pos, dir, player, range)
local t_dir = get_used_dir(dir)
local dir_typ = t_dir[1]
if t_dir[3] == "+" then
f_tab = {1, range}
else
f_tab = {-range, -1}
end
local d_ch = t_dir[2]
if dir_typ == "x" then
for d = f_tab[1],f_tab[2],1 do
local x = d
local ytab = node_tab(d_ch.y, d)
local ztab = node_tab(d_ch.z, d)
for _, y in pairs(ytab) do
for _, z in pairs(ztab) do
laser_node({x = pos.x + x, y = pos.y + y, z = pos.z + z}, player)
end
end
end
return
end
if dir_typ == "y" then
for d = f_tab[1], f_tab[2] do
local xtab = node_tab(d_ch.x, d)
local y = d
local ztab = node_tab(d_ch.z, d)
for _, x in pairs(xtab) do
for _, z in pairs(ztab) do
laser_node({x = pos.x + x, y = pos.y + y, z = pos.z + z}, player)
end
end
end
return
end
for d = f_tab[1], f_tab[2] do
local xtab = node_tab(d_ch.x, d)
local ytab = node_tab(d_ch.y, d)
local z = d
for _, x in pairs(xtab) do
for _, y in pairs(ytab) do
laser_node({x = pos.x + x, y = pos.y + y, z = pos.z + z}, player)
end
end
end
end
local function laser_shoot(player, range, particle_texture, sound)
local playerpos = player:getpos()
local dir = player:get_look_dir()
local startpos = {x = playerpos.x, y = playerpos.y + 1.6, z = playerpos.z}
local mult_dir = vector.multiply(dir, 50)
minetest.add_particle(startpos, dir, mult_dir, range / 11, 1, false, particle_texture)
laser_nodes(vector.round(startpos), dir, player, range)
minetest.sound_play(sound, {pos = playerpos, gain = 1.0, max_hear_distance = range})
end
for _, m in pairs(mining_lasers_list) do
technic.register_power_tool("technic:laser_mk"..m[1], m[3])
minetest.register_tool("technic:laser_mk"..m[1], {
description = S("Mining Laser Mk%d"):format(m[1]),
inventory_image = "technic_mining_laser_mk"..m[1]..".png",
stack_max = 1,
wear_represents = "technic_RE_charge",
on_refill = technic.refill_RE_charge,
on_use = function(itemstack, user)
local meta = minetest.deserialize(itemstack:get_metadata())
if not meta or not meta.charge then
return
end
-- If there's enough charge left, fire the laser
if meta.charge >= m[4] then
meta.charge = meta.charge - m[4]
laser_shoot(user, m[2], "technic_laser_beam_mk"..m[1]..".png", "technic_laser_mk"..m[1])
technic.set_RE_wear(itemstack, meta.charge, m[3])
itemstack:set_metadata(minetest.serialize(meta))
end
return itemstack
end,
})
end