Re-add mineral sand and tweak mapgen

master
BlockMen 2014-08-09 14:54:58 +02:00
parent 726a080eea
commit 7e5e2f2e8c
3 changed files with 144 additions and 112 deletions

View File

@ -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 = {}

View File

@ -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)

View File

@ -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,