Aaron Suen 19de5dfd1e mapgen_shared improvements.
- Register def tables instead of bare funcs.
- Add labels for mod logic use.
- Automatically skip for singlenode mapgens,
  e.g. for the skyblock modpack.
2020-01-12 10:30:02 -05:00

199 lines
4.8 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 stone = reg("Stone", {
description = "Stone",
tiles = {"nc_terrain_stone.png^(" .. modname .. "_ore.png^[mask:"
.. modname .. "_mask_ore.png^[opacity:48)"},
drop_in_place = "nc_terrain:cobble",
strata = stratstone
})
stratstone[1] = stone
local ore = reg("Ore", {
tiles = {"nc_terrain_stone.png^(" .. modname .. "_ore.png^[mask:"
.. modname .. "_mask_ore.png)"},
drop_in_place = modname .. ":cobble",
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 .. "^(" .. modname .. "_ore.png^[mask:"
.. modname .. "_mask_ore.png^[opacity:48)"},
drop_in_place = modname .. ((i > 1)
and (":stone_" .. (i - 1)) or ":stone"),
groups = {
lodey = 1,
cracky = i + 2,
hard_stone = i
}
})
stratore[i + 1] = reg("Ore_" .. i, {
description = "Lode Ore",
tiles = {hst .. "^(" .. modname .. "_ore.png^[mask:"
.. modname .. "_mask_ore.png)"},
drop_in_place = modname .. ":cobble",
groups = {
lodey = 1,
cracky = i + 2,
hard_stone = i
}
})
end
reg("Cobble", {
tiles = {modname .. "_ore.png^nc_terrain_cobble.png"},
groups = {
lode_cobble = 1,
cracky = 2,
lodey = 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},
damage_per_second = 2,
on_punch = nodecore.node_punch_hurt
})
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 = {}
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 function bad(x, y, z)
local c = data[area:index(x, y, z)]
return not stoneids[c]
end
for z = minp.z, maxp.z do
for y = minp.y, maxp.y do
for x = minp.x, maxp.x do
local i = area:index(x, y, z)
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 bad(x + 1, y, z)
or bad(x - 1, y, z)
or bad(x, y + 1, z)
or bad(x, y - 1, z)
or bad(x, y, z + 1)
or bad(x, y, z - 1)
then data[i] = c_lodestone
end
end
end
end
end
end
})