Aaron Suen f633e86235 Make raw ores not silk-touchable
For one thing, it's a bit overpowered when you go
right from infused still digging lode ore as loose
cobble, right to boosted-infused digging it as raw
ore.

For another, uncobbled lux stone is purposefully
labeled as just plain stone to force the player to
pay attention to light cues, but this would make
inventory management problematic once smooth
lux stone has been collected with boosted tools.
2021-03-15 00:11:05 -04:00

213 lines
5.1 KiB
Lua

-- LUALOCALS < ---------------------------------------------------------
local math, minetest, nodecore, pairs
= math, minetest, nodecore, pairs
local math_floor, math_pow
= math.floor, math.pow
-- LUALOCALS > ---------------------------------------------------------
local modname = minetest.get_current_modname()
local function reg(suff, def)
def = nodecore.underride(def, {
description = "Lode " .. suff,
name = suff:lower(),
is_ground_content = true,
groups = {cracky = 2, lodey = 1},
sounds = nodecore.sounds("nc_terrain_stony")
})
def.fullname = modname .. ":" .. def.name
def.oldnames = {"nc_iron:" .. def.name}
minetest.register_node(def.fullname, def)
return def.fullname
end
local stratstone = {}
local stratore = {}
local oretile = "(" .. modname .. "_ore.png^[mask:" .. modname .. "_mask_ore.png)"
local stonetile = "(" .. modname .. "_ore.png^[mask:" .. modname .. "_mask_sign.png^[opacity:140)"
local stone = reg("Stone", {
description = "Stone",
tiles = {"nc_terrain_stone.png^" .. stonetile},
drop_in_place = "nc_terrain:cobble",
groups = {
stone = 1,
smoothstone = 1
},
silktouch = false,
strata = stratstone
})
stratstone[1] = stone
local ore = reg("Ore", {
tiles = {"nc_terrain_stone.png^" .. oretile},
drop_in_place = modname .. ":cobble",
groups = {stone = 1},
silktouch = false,
strata = stratore
})
stratore[1] = ore
for i = 1, nodecore.hard_stone_strata do
local hst = nodecore.hard_stone_tile(i)
stratstone[i + 1] = reg("Stone_" .. i, {
description = "Stone",
tiles = {hst .. "^" .. stonetile},
drop_in_place = modname .. ((i > 1)
and (":stone_" .. (i - 1)) or ":stone"),
groups = {
stone = i + 1,
lodey = 1,
cracky = i + 2,
hard_stone = i
},
silktouch = false
})
stratore[i + 1] = reg("Ore_" .. i, {
description = "Lode Ore",
tiles = {hst .. "^" .. oretile},
drop_in_place = modname .. ":cobble",
groups = {
stone = i + 1,
lodey = 1,
cracky = i + 2,
hard_stone = i
}
})
end
reg("Cobble", {
tiles = {modname .. "_ore.png^nc_terrain_cobble.png"},
groups = {
rock = 1,
lode_cobble = 1,
cracky = 2,
lodey = 1,
cobbley = 1
},
alternate_loose = {
repack_level = 2,
groups = {
cracky = 0,
crumbly = 2,
falling_repose = 3
},
sounds = nodecore.sounds("nc_terrain_chompy")
}
})
reg("cobble_hot", {
description = "Glowing Lode Cobble",
tiles = {
"nc_terrain_gravel.png^nc_terrain_cobble.png",
modname .. "_hot.png^nc_terrain_cobble.png",
"nc_terrain_gravel.png^(" .. modname .. "_hot.png^[mask:"
.. modname .. "_mask_molten.png)^nc_terrain_cobble.png"
},
groups = {
cracky = 0,
lodey = 1,
cobbley = 1,
stack_as_node = 1,
damage_touch = 1,
damage_radiant = 1
},
stack_max = 1
})
local oreid = 0
local function regore(name, def)
oreid = oreid + 1
return minetest.register_ore(nodecore.underride(def, {
name = modname .. oreid,
ore_type = "scatter",
ore = name,
wherein = "nc_terrain:stone",
random_factor = 0,
noise_params = {
offset = 0,
scale = 4,
spread = {x = 40, y = 5, z = 40},
seed = 12497,
octaves = 3,
persist = 0.5,
flags = "eased",
},
noise_threshold = 1.3
}, def))
end
for y = 0, 7 do
local def = {
y_max = 64 - 32 * math_pow(2, y),
y_min = 64 - 32 * math_pow(2, y + 1),
clust_num_ores = math_floor(4 * math_pow(2, y)),
clust_size = math_floor(3 * math_pow(1.25, y)),
clust_scarcity = math_floor(8 * 8 * 8 * 4 * math_pow(1.25, y)),
}
if y == 7 then def.y_min = nil end
regore(ore, def)
end
regore(ore, {
y_max = 48,
clust_num_ores = 3,
clust_size = 2,
clust_scarcity = 8 * 8 * 8,
})
regore(stone, {
y_max = 32,
clust_num_ores = 4,
clust_size = 3,
clust_scarcity = 2 * 2 * 2,
})
local c_ore = minetest.get_content_id(ore)
local c_lodestone = minetest.get_content_id(stone)
local getstoneids = nodecore.memoize(function()
local stoneids = {}
for i = 1, 65535 do stoneids[i] = false end
local stratadata = nodecore.stratadata()
for _, id in pairs({
c_lodestone,
minetest.get_content_id(ore),
minetest.get_content_id("nc_terrain:stone")
}) do
stoneids[id] = true
for _, v in pairs(stratadata.altsbyid[id] or {}) do
stoneids[v] = true
end
end
return stoneids
end)
nodecore.register_mapgen_shared({
label = "lode exposure",
func = function(minp, maxp, area, data)
local stoneids = getstoneids()
local ai = area.index
for z = minp.z, maxp.z do
for y = minp.y, maxp.y do
local offs = ai(area, 0, y, z)
for x = minp.x, maxp.x do
local i = offs + x
if data[i] == c_ore then
if x == minp.x
or x == maxp.x
or y == minp.y
or y == maxp.y
or z == minp.z
or z == maxp.z
or (not stoneids[data[i - 1]])
or (not stoneids[data[i + 1]])
or (not stoneids[data[i - area.ystride]])
or (not stoneids[data[i + area.ystride]])
or (not stoneids[data[i - area.zstride]])
or (not stoneids[data[i + area.zstride]])
then data[i] = c_lodestone
end
end
end
end
end
end
})