123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 |
- local function dist3(a, b)
- local x = a.x - b.x
- local y = a.y - b.y
- local z = a.z - b.z
- return math.sqrt(x*x + y*y + z*z)
- end
- local function random_pos(pos, dist)
- local p = {
- x=pos.x + math.random(-dist, dist),
- y=pos.y + dist,
- z=pos.z + math.random(-dist, dist),
- }
-
- while p.y > pos.y - dist do
- local n = minetest.get_node(p)
- if n.name ~= "air" and n.name ~= "ignore" then
- return p
- end
-
- p.y = p.y - 1
- end
-
- return nil
- end
- local function spawn_rock(pos, nodes)
- if pos == nil then
- return
- end
- pos.y = pos.y + 2
-
- local ns = {}
- for name,chance in pairs(nodes) do
- for i = 1,chance do
- table.insert(ns, name)
- end
- end
-
- local r = math.random() * 1.1 + .3
- local stry = math.random(6) + 1
- local strx = math.random() * .5 + .5
- local strz = math.random() * .5 + .5
-
- local lx = math.random() * 1.6 - .8
- local lz = math.random() * 1.6 - .8
-
- local r2 = math.ceil(r+1)
-
- for x = -r2,r2,1 do
- for y = -r2*stry,r2*stry,1 do
- for z = -r2,r2,1 do
-
- local p = {x=pos.x+x, y=pos.y+y, z=pos.z+z}
- local p_squash = {
- x = pos.x + (x/strx) + lx*y,
- y = pos.y + (y/stry),
- z = pos.z + (z/strz) + lz*y
- }
- local d = dist3(p_squash, pos)
-
- d = d + math.random() * .5
-
- local dd = d - r
-
- if dd <= 1 then
- minetest.set_node(p, {name=ns[math.random(#ns)]})
- else
- -- minetest.set_node(p, {name = "default:stone"})
- end
- end
- end
- end
- end
- local seed_biomes = {
- ["default:sand"] = {
- {
- ["default:desert_stone"] = 7,
- ["potions:sphalerite_ore"] = 1,
- },
- },
- ["default:desert_sand"] = {
- {
- ["default:sandstone"] = 7,
- ["potions:cinnabar_ore"] = 1,
- },
- {
- ["default:sandstone"] = 5,
- ["potions:cinnabar_ore"] = 1,
- },
-
- },
- ["default:silver_sand"] = {
- {
- ["default:stone"] = 7,
- ["potions:galena"] = 1,
- },
- },
- }
- minetest.register_node("potions:rock_seed", {
- description = "Rock Seed",
- tiles = {"default_sandstone.png^default_tool_bronzepick.png"},
- groups = {cracky = 3},
- sounds = default.node_sound_stone_defaults(),
-
- on_construct = function(pos)
- minetest.get_node_timer(pos):start(1)
- end,
-
- on_timer = function(pos)
- minetest.set_node(pos, {name="air"})
-
- -- if 1 ~= math.random(10) then
- -- return
- -- end
- print("rock seed")
- local p = minetest.find_node_near(pos, 4, {"default:sand", "default:desert_sand", "default:silver_sand"})
- local n = minetest.get_node(p)
- print(dump(n.name))
- local b = seed_biomes[n.name]
- if not b then return end
- print("b")
-
- for i = 1,(math.random(1) + 0) do
- spawn_rock(random_pos(pos, math.random(20) + 20), b[1])
- end
-
- end,
- })
- minetest.register_abm({
- nodenames = "potions:rock_seed",
- chance = 1,
- interval = 5,
- action = function(pos, node)
- minetest.get_node_timer(pos):start(2)
- end
- })
- minetest.register_decoration({
- name = "potions:rock_seed",
- deco_type = "simple",
- place_on = {"default:desert_sand", "default:silver_sand", "default:sand",},
- place_offset_y = 1,
- sidelen = 16,
- noise_params = {
- offset = -0.0105,
- scale = 0.01,
- spread = {x = 200, y = 200, z = 200},
- seed = 29724537,
- octaves = 3,
- persist = 0.7,
- },
- biomes = {"desert", "cold_desert", "sandstone_desert"},
- y_max = 1000,
- y_min = 5,
- place_offset_y = 1,
- decoration = "potions:rock_seed",
- flags = "force_placement",
- })
|