Re-add mineral sand and tweak mapgen
parent
726a080eea
commit
7e5e2f2e8c
|
@ -7,6 +7,8 @@ WATER_ALPHA = 160
|
|||
WATER_VISC = 1
|
||||
LAVA_VISC = 7
|
||||
LIGHT_MAX = 14
|
||||
SNOW_START = 24
|
||||
MINERAL_MAX = -20
|
||||
|
||||
-- Definitions made by this mod that other mods can use too
|
||||
default = {}
|
||||
|
|
|
@ -268,38 +268,65 @@ local dirt_snow = minetest.get_content_id("default:dirt_with_snow")
|
|||
local dirt_dry = minetest.get_content_id("default:dry_dirt")
|
||||
local leaves = minetest.get_content_id("default:leaves")
|
||||
local snow = minetest.get_content_id("default:snow")
|
||||
local ms = minetest.get_content_id("default:mineralsand")
|
||||
local sand = minetest.get_content_id("default:sand")
|
||||
local air = minetest.get_content_id("air")
|
||||
|
||||
local SNOW_START = 24
|
||||
|
||||
local function make_snow(min, max, data, va, rnd)
|
||||
local cnt = max.x - min.x
|
||||
for yi = 0, cnt do
|
||||
if max.y - yi >= SNOW_START + rnd then
|
||||
for xi = 0, cnt do
|
||||
for zi = 0, cnt do
|
||||
local p = {x = min.x + xi, y = max.y - yi, z = min.z + zi}
|
||||
local pi = va:indexp(p)
|
||||
if data[pi] == dirt_dry then
|
||||
data[pi] = dirt_snow
|
||||
local y1 = min.y
|
||||
local x1 = min.x
|
||||
local z1 = min.z
|
||||
local x2 = max.x
|
||||
local z2 = max.z
|
||||
local y_max = SNOW_START + rnd
|
||||
if y1 == 48 then
|
||||
y_max = y1
|
||||
end
|
||||
for yi = max.y, y_max, -1 do
|
||||
for xi = x1, x2 do
|
||||
for zi = z1, z2 do
|
||||
local pi = va:index(xi, yi, zi)
|
||||
if data[pi] == dirt_dry then
|
||||
data[pi] = dirt_snow
|
||||
end
|
||||
if data[pi] == dirt_snow then
|
||||
local opi = va:index(xi, yi + 1, zi)
|
||||
if data[opi] == air then
|
||||
data[pi] = snow
|
||||
end
|
||||
if data[pi] == dirt_snow then
|
||||
p.y = p.y + 1
|
||||
local opi = va:indexp(p)
|
||||
if data[opi] == air then
|
||||
data[pi] = snow
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
return data
|
||||
end
|
||||
|
||||
local function make_minerals(min, max, data, va)
|
||||
local x1 = min.x
|
||||
local z1 = min.z
|
||||
local x2 = max.x
|
||||
local z2 = max.z
|
||||
for yi = min.y, MINERAL_MAX do
|
||||
for xi = x1, x2 do
|
||||
for zi = z1, z2 do
|
||||
local pi = va:index(xi, yi, zi)
|
||||
local pi2 = va:index(xi, yi - 1, zi)
|
||||
if data[pi] == air and data[pi2] == sand then
|
||||
data[pi] = ms
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
return data, false
|
||||
end
|
||||
minetest.register_on_generated(function(minp, maxp, seed)
|
||||
local by = minp.y
|
||||
if not (by == -32 or by == 48) then
|
||||
return
|
||||
end
|
||||
|
||||
local pr = PseudoRandom(seed+1)
|
||||
if maxp.y >= 2 and minp.y <= 0 then
|
||||
if by == -32 then
|
||||
-- dead trees
|
||||
local perlin1 = minetest.get_perlin(230, 3, 0.6, 100)
|
||||
-- Assume X and Z lengths are equal
|
||||
|
@ -335,30 +362,6 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
|||
end
|
||||
end
|
||||
|
||||
end
|
||||
--[[TODO: dont produce that much lags!!minerals
|
||||
local MINERAL_MAX = -11
|
||||
--if maxp.y < MINERAL_MAX then
|
||||
local cnt = maxp.x-minp.x
|
||||
for yi=0, cnt do
|
||||
if minp.y+yi<MINERAL_MAX then
|
||||
for xi=0, cnt do
|
||||
for zi=0, cnt do
|
||||
local p = {x=minp.x+xi,y=minp.y+yi,z=minp.z+zi}
|
||||
local n = minetest.get_node(p)
|
||||
p.y = p.y+1
|
||||
local nn = minetest.get_node(p)
|
||||
p.y = p.y-1
|
||||
if nn and nn.name == "air" and n and n.name and n.name == "default:sand" then
|
||||
minetest.swap_node(p, {name="default:mineralsand"})
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--end]]
|
||||
|
||||
|
||||
-- Generate dry grass
|
||||
local perlin1 = minetest.get_perlin(480, 3, 0.6, 100)
|
||||
|
@ -405,16 +408,42 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
|||
end
|
||||
end
|
||||
|
||||
-- snowcaps
|
||||
|
||||
--data =
|
||||
end
|
||||
|
||||
-- snowcaps and mineral sand
|
||||
local snow_height_rnd = pr:next(0,3)
|
||||
if maxp.y >= SNOW_START then--+snow_height_rnd then
|
||||
local vm, emin, emax = minetest.get_mapgen_object("voxelmanip")
|
||||
local data = vm:get_data()
|
||||
local va = VoxelArea:new{ MinEdge = emin, MaxEdge = emax }
|
||||
data = make_snow(minp,maxp,data, va,snow_height_rnd)
|
||||
vm:set_data(data)
|
||||
vm:calc_lighting()
|
||||
vm:write_to_map(data)
|
||||
end
|
||||
|
||||
-- delay mapgen to reduce conflicts with mud regeneration
|
||||
if by == 48 then
|
||||
local timeout = 0
|
||||
while timeout < 5 do
|
||||
timeout = timeout + 1
|
||||
end
|
||||
end
|
||||
|
||||
local vm, emin, emax = minetest.get_mapgen_object("voxelmanip")
|
||||
local data = vm:get_data()
|
||||
local va = VoxelArea:new{MinEdge = emin, MaxEdge = emax}
|
||||
|
||||
if by == -32 then
|
||||
-- Generate mineral sand
|
||||
local wait = true
|
||||
data, wait = make_minerals(minp, maxp, data, va)
|
||||
|
||||
while wait do
|
||||
--wait for first manip to finish
|
||||
end
|
||||
data = make_snow(minp, maxp, data, va, snow_height_rnd)
|
||||
else
|
||||
data = make_snow(minp, maxp, data, va, snow_height_rnd)
|
||||
end
|
||||
|
||||
|
||||
-- write vmanip data
|
||||
vm:set_data(data)
|
||||
vm:calc_lighting()
|
||||
vm:write_to_map(data)
|
||||
end)
|
||||
|
||||
|
|
|
@ -1,16 +1,10 @@
|
|||
local n
|
||||
local n2
|
||||
local pos
|
||||
|
||||
function generate_tree(pos)
|
||||
|
||||
local function generate_tree(pos)
|
||||
local nu = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name
|
||||
local is_soil = minetest.get_item_group(nu, "soil")
|
||||
if is_soil == 0 then
|
||||
return
|
||||
end
|
||||
|
||||
minetest.log("action", "A sapling grows into a tree at "..minetest.pos_to_string(pos))
|
||||
|
||||
local vm = minetest.get_voxel_manip()
|
||||
local minp, maxp = vm:read_from_map({x=pos.x-16, y=pos.y, z=pos.z-16}, {x=pos.x+16, y=pos.y+16, z=pos.z+16})
|
||||
local a = VoxelArea:new{MinEdge=minp, MaxEdge=maxp}
|
||||
|
@ -44,74 +38,81 @@ end
|
|||
end)
|
||||
|
||||
local function duengen(pointed_thing)
|
||||
pos = pointed_thing.under
|
||||
n = minetest.env:get_node(pos)
|
||||
if n.name == "" then return end
|
||||
local stage = ""
|
||||
if n.name == "default:sapling" then
|
||||
if minetest.env:get_node_light(pos) then
|
||||
if math.random(1,3) < 3 then
|
||||
minetest.env:set_node(pos, {name="air"})
|
||||
local pos = pointed_thing.under
|
||||
local n = minetest.get_node_or_nil(pos)
|
||||
|
||||
if not n or not n.name then
|
||||
return
|
||||
end
|
||||
|
||||
|
||||
print(n.name)
|
||||
|
||||
local stage = ""
|
||||
if n.name == "default:sapling" and minetest.get_node_light(pos) then
|
||||
if math.random(1,20) < 5 then
|
||||
minetest.set_node(pos, {name="air"})
|
||||
generate_tree(pos)
|
||||
end
|
||||
end
|
||||
elseif string.find(n.name, "farming:wheat_") ~= nil then
|
||||
stage = tonumber(string.sub(n.name, 15))
|
||||
if math.random(1,7) < stage/3 then
|
||||
minetest.env:set_node(pos, {name="farming:wheat_8"})
|
||||
elseif stage < 7 then
|
||||
minetest.env:set_node(pos, {name="farming:wheat_"..stage+math.random(1,2)})
|
||||
--else
|
||||
--minetest.env:set_node(pos, {name="farming:wheat_"..math.random(2,3)})
|
||||
end
|
||||
elseif string.find(n.name, "farming:cotton_") ~= nil then
|
||||
stage = tonumber(string.sub(n.name, 16))
|
||||
if stage == 1 then
|
||||
minetest.env:set_node(pos, {name="farming:cotton_"..math.random(stage,2)})
|
||||
else
|
||||
minetest.env:set_node(pos, {name="farming:cotton"})
|
||||
end
|
||||
elseif string.find(n.name, "farming:pumpkin_") ~= nil then
|
||||
stage = tonumber(string.sub(n.name, 17))
|
||||
if stage == 1 then
|
||||
minetest.env:set_node(pos, {name="farming:pumpkin_"..math.random(stage,2)})
|
||||
else
|
||||
minetest.env:set_node(pos, {name="farming:pumpkin"})
|
||||
end
|
||||
|
||||
elseif n.name == "default:dirt_with_grass" then
|
||||
for i = -2, 3, 1 do
|
||||
for j = -3, 2, 1 do
|
||||
pos = pointed_thing.under
|
||||
pos = {x=pos.x+i, y=pos.y, z=pos.z+j}
|
||||
n = minetest.env:get_node(pos)
|
||||
--n2 = minetest.env:get_node({x=pos.x, y=pos.y-1, z=pos.z})
|
||||
|
||||
if n and n.name and n.name == "default:dirt_with_grass" and minetest.find_node_near(pos, 6, {"group:water"}) then
|
||||
if math.random(0,5) > 3 then
|
||||
--minetest.env:set_node(pos, {name=plant_tab[math.random(0, rnd_max)]})
|
||||
minetest.env:set_node(pointed_thing.under, {name="default:grass"})
|
||||
elseif string.find(n.name, "farming:wheat_") ~= nil then
|
||||
stage = tonumber(string.sub(n.name, 15))
|
||||
if math.random(1,7) < stage/3 then
|
||||
minetest.set_node(pos, {name="farming:wheat_8"})
|
||||
elseif stage < 7 then
|
||||
minetest.set_node(pos, {name="farming:wheat_"..stage+math.random(1,2)})
|
||||
end
|
||||
|
||||
elseif string.find(n.name, "farming:cotton_") ~= nil then
|
||||
stage = tonumber(string.sub(n.name, 16))
|
||||
if stage == 1 then
|
||||
minetest.set_node(pos, {name="farming:cotton_"..math.random(stage,2)})
|
||||
else
|
||||
minetest.set_node(pos, {name="farming:cotton"})
|
||||
end
|
||||
|
||||
elseif string.find(n.name, "farming:pumpkin_") ~= nil then
|
||||
stage = tonumber(string.sub(n.name, 17))
|
||||
if stage == 1 then
|
||||
minetest.set_node(pos, {name="farming:pumpkin_"..math.random(stage,2)})
|
||||
else
|
||||
minetest.set_node(pos, {name="farming:pumpkin"})
|
||||
end
|
||||
|
||||
elseif n.name == "default:dry_dirt" then
|
||||
for i = -2, 3, 1 do
|
||||
for j = -3, 2, 1 do
|
||||
local p = {x=pos.x+i, y=pos.y, z=pos.z+j}
|
||||
--pos =
|
||||
local n2 = minetest.get_node_or_nil(p)
|
||||
|
||||
if n2 and n2.name and n2.name == "default:dry_dirt" and minetest.find_node_near(p, 6, {"group:water"}) then
|
||||
if math.random(1,6) > 3 then
|
||||
--minetest.env:set_node(p, {name=plant_tab[math.random(0, rnd_max)]})
|
||||
minetest.set_node(pointed_thing.under, {name="default:grass"})
|
||||
else
|
||||
minetest.env:set_node(pos, {name="default:grass"})
|
||||
minetest.set_node(p, {name="default:grass"})
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
minetest.register_craftitem("default:minerals", {
|
||||
description = "Minerals",
|
||||
inventory_image = "default_minerals.png",
|
||||
liquids_pointable = false,
|
||||
--stack_max = 99,
|
||||
stack_max = 60,
|
||||
on_use = function(itemstack, user, pointed_thing)
|
||||
if pointed_thing.type == "node" then
|
||||
duengen(pointed_thing)
|
||||
if not minetest.setting_getbool("creative_mode") then itemstack:take_item() end
|
||||
if not minetest.setting_getbool("creative_mode") then
|
||||
itemstack:take_item()
|
||||
end
|
||||
return itemstack
|
||||
end
|
||||
end,
|
||||
|
|
Loading…
Reference in New Issue