From 7e5e2f2e8cbad19bdc77a64862954f5bf027eabf Mon Sep 17 00:00:00 2001 From: BlockMen Date: Sat, 9 Aug 2014 14:54:58 +0200 Subject: [PATCH] Re-add mineral sand and tweak mapgen --- mods/default/init.lua | 2 + mods/default/mapgen.lua | 141 +++++++++++++++++++++++--------------- mods/default/minerals.lua | 113 +++++++++++++++--------------- 3 files changed, 144 insertions(+), 112 deletions(-) diff --git a/mods/default/init.lua b/mods/default/init.lua index 36623ff..336162e 100644 --- a/mods/default/init.lua +++ b/mods/default/init.lua @@ -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 = {} diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index 87e9836..bc979ce 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -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= 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) diff --git a/mods/default/minerals.lua b/mods/default/minerals.lua index 282865b..937e784 100644 --- a/mods/default/minerals.lua +++ b/mods/default/minerals.lua @@ -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,