EinsDreiDreiSieben/mods/geodes/init.lua
2025-05-04 16:01:41 +02:00

141 lines
No EOL
4.6 KiB
Lua

geodes = {}
local geode_types = {}
minetest.register_node("geodes:calcite", {
description = "Calcite",
tiles = {"calcite.png"},
groups = {cracky = 3, not_in_creative_inventory = 1},
sounds = default.node_sound_stone_defaults(),
})
minetest.register_node("geodes:amethyst_block", {
description = "Amethyst Block",
tiles = {"amethyst_block.png"},
groups = {cracky = 3, not_in_creative_inventory = 1},
sounds = default.node_sound_stone_defaults(),
})
minetest.register_node("geodes:basalt", {
description = "Basalt",
tiles = {"basalt.png"},
groups = {cracky = 3, not_in_creative_inventory = 1},
sounds = default.node_sound_stone_defaults(),
})
minetest.register_node("geodes:amethyst_crystal", {
description = "Amethyst Crystal",
tiles = {"amethyst_crystal.png"},
inventory_image = "amethyst_crystal.png",
drawtype = "plantlike",
paramtype = "light",
sunlight_propagates = true,
paramtype2 = "wallmounted",
groups = {cracky = 3, not_in_creative_inventory = 1},
sounds = default.node_sound_stone_defaults(),
node_box = {
type = "fixed",
fixed = {-5/16, -0.5, -5/16, 5/16, 5/16, 5/16}
},
selection_box = {
type = "fixed",
fixed = {-5/16, -0.5, -5/16, 5/16, 5/16, 5/16}
},
})
minetest.register_node("geodes:geode_core", {
groups = {not_in_creative_inventory = 1},
})
minetest.register_ore({
ore_type = "scatter",
ore = "geodes:geode_core",
wherein = "default:stone",
clust_scarcity = 64 * 64 * 64,
clust_num_ores = 1,
clust_size = 1,
y_max = -40,
y_min = -31000,
})
minetest.register_ore({
ore_type = "scatter",
ore = "geodes:geode_core",
wherein = "air",
clust_scarcity = 64 * 64 * 64,
clust_num_ores = 1,
clust_size = 1,
y_max = -40,
y_min = -31000,
})
minetest.register_lbm({
label = "make_geode",
name = "geodes:create_geode",
nodenames = {"geodes:geode_core"},
run_at_every_load = true,
action = function(pos, node)
if (#geode_types == 0) then
minetest.log('THE GEODES MOD REQUIRES AT LEAST ONE MOD THAT ADDS GEODES TO FUNCTION. PLEASE MAKE SURE THAT THE "amethyst_geodes" MOD IS ENABLED, OR ANOTHER MOD THAT USES THE API IS ENABLED.')
return
end
local pcgr = PcgRandom(minetest.hash_node_position(pos))
local outer, middle, inner, crystal, fill, size_min, size_max = unpack(geode_types[math.random(1, #geode_types)])
local size = pcgr:next(size_min, size_max)
for x = -size, size do
for y = -size, size do
for z = -size, size do
if minetest.get_node(pos + vector.new(x, y, z)).name ~= "air" then
if vector.distance(vector.new(x, y, z), vector.new()) < size then
minetest.set_node(pos + vector.new(x, y, z), {name = outer})
if vector.distance(vector.new(x, y, z), vector.new()) < size - 1 then
minetest.set_node(pos + vector.new(x, y, z), {name = middle})
if vector.distance(vector.new(x, y, z), vector.new()) < size - 2 then
minetest.set_node(pos + vector.new(x, y, z), {name = inner})
if vector.distance(vector.new(x, y, z), vector.new()) < size - 3 then
minetest.set_node(pos + vector.new(x, y, z), {name = fill})
end
end
end
end
end
end
end
end
if crystal ~= fill then
for x = -size +4, size -4 do
for y = -size +4, size -4 do
for z = -size +4, size -4 do
if pcgr:next(0, 10) == 0 and vector.distance(vector.new(x, y, z), vector.new()) >= size - 4 and vector.distance(vector.new(x, y, z), vector.new()) < size - 3 then
if minetest.get_node(pos + vector.new(x, y + 1, z)).name == inner then
minetest.set_node(pos + vector.new(x, y, z), {name = crystal, param2 = 0})
elseif minetest.get_node(pos + vector.new(x, y - 1, z)).name == inner then
minetest.set_node(pos + vector.new(x, y, z), {name = crystal, param2 = 1})
elseif minetest.get_node(pos + vector.new(x + 1, y, z)).name == inner then
minetest.set_node(pos + vector.new(x, y, z), {name = crystal, param2 = 2})
elseif minetest.get_node(pos + vector.new(x - 1, y, z)).name == inner then
minetest.set_node(pos + vector.new(x, y, z), {name = crystal, param2 = 3})
elseif minetest.get_node(pos + vector.new(x, y, z + 1)).name == inner then
minetest.set_node(pos + vector.new(x, y, z), {name = crystal, param2 = 4})
elseif minetest.get_node(pos + vector.new(x, y, z - 1)).name == inner then
minetest.set_node(pos + vector.new(x, y, z), {name = crystal, param2 = 5})
end
end
end
end
end
end
end,
})
function geodes.register_geode(outer, middle, inner, crystal, fill, size_min, size_max)
table.insert(geode_types, {outer, middle, inner, crystal or "air", fill or "air", size_min or 6, size_max or 11})
end