141 lines
No EOL
4.6 KiB
Lua
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 |