Version MFF.

This commit is contained in:
sys4-fr 2018-09-08 23:25:25 +02:00
parent 7ecd043206
commit 5447526852
33 changed files with 437 additions and 1182 deletions

8
README.txt Normal file → Executable file
View File

@ -1,4 +1,4 @@
watershed 0.6.6 by paramat watershed 0.7.1 by paramat, modified by the MinetestForFun Team.
For latest stable Minetest back to 0.4.8 For Minetest 0.4.13 and later
Depends default stairs bucket Depends default farming darkage
Licenses: code WTFPL, textures CC BY-SA Licenses: WTFPL

4
depends.txt Normal file → Executable file
View File

@ -1,3 +1,3 @@
default default
bucket farming
stairs darkage

363
functions.lua Normal file → Executable file
View File

@ -1,31 +1,60 @@
--[[ MFF: Prevent trees from destroying existing blocks
This is the list of "safe" blocks in which a tree can grow
They were moved outside the local safety function for speed (I hope)
--]]
local c_air = minetest.get_content_id("air")
local c_ignore = minetest.get_content_id("ignore")
-- MFF: The local function to do safety checks
local function safely_set_block(t, k, v)
if t[k] == c_air or t[k] == c_ignore then
t[k] = v
end
end
function watershed_appletree(x, y, z, area, data) function watershed_appletree(x, y, z, area, data)
local c_tree = minetest.get_content_id("default:tree") local c_tree = minetest.get_content_id("default:tree")
local c_apple = minetest.get_content_id("default:apple") local c_apple = minetest.get_content_id("default:apple")
local c_wsappleaf = minetest.get_content_id("watershed:appleleaf") local c_wsappleaf = minetest.get_content_id("watershed:appleleaf")
for j = -2, 4 do
if j == 3 or j == 4 then -- MFF: Higher default tree with a bit of randomness
local tree_top = 5 + math.random(0, 1)
local leaves_height = tree_top - 1
local branches_height = leaves_height - 1
for j = 0, tree_top do -- MFF: Higher tree, same design
if j >= leaves_height then
for i = -2, 2 do for i = -2, 2 do
for k = -2, 2 do for k = -2, 2 do
local vil = area:index(x + i, y + j, z + k) local vil = area:index(x + i, y + j, z + k)
if math.random(64) == 2 then if math.random(64) == 2 then
data[vil] = c_apple -- MFF: Prevent trees from destroying existing blocks
safely_set_block(data, vil, c_apple)
elseif math.random(5) ~= 2 then elseif math.random(5) ~= 2 then
data[vil] = c_wsappleaf -- MFF: Prevent trees from destroying existing blocks
safely_set_block(data, vil, c_wsappleaf)
end end
end end
end end
elseif j == 2 then elseif j == branches_height then
for i = -1, 1 do for i = -1, 1 do
for k = -1, 1 do for k = -1, 1 do
if math.abs(i) + math.abs(k) == 2 then if math.abs(i) + math.abs(k) == 2 then
local vit = area:index(x + i, y + j, z + k) local vit = area:index(x + i, y + j, z + k)
data[vit] = c_tree -- MFF: Prevent trees from destroying existing blocks
safely_set_block(data, vit, c_tree)
end end
end end
end end
else else
local vit = area:index(x, y + j, z) local vit = area:index(x, y + j, z)
data[vit] = c_tree -- MFF: Prevent trees from destroying existing blocks
if j == 0 then
-- MFF: the position of the sapling itself, replace it without checking.
data[vit] = c_tree
else
safely_set_block(data, vit, c_tree)
end
end end
end end
end end
@ -34,16 +63,17 @@ function watershed_pinetree(x, y, z, area, data)
local c_wspitree = minetest.get_content_id("watershed:pinetree") local c_wspitree = minetest.get_content_id("watershed:pinetree")
local c_wsneedles = minetest.get_content_id("watershed:needles") local c_wsneedles = minetest.get_content_id("watershed:needles")
local c_snowblock = minetest.get_content_id("default:snowblock") local c_snowblock = minetest.get_content_id("default:snowblock")
for j = -4, 14 do for j = 0, 14 do
if j == 3 or j == 6 or j == 9 or j == 12 then if j == 3 or j == 6 or j == 9 or j == 12 then
for i = -2, 2 do for i = -2, 2 do
for k = -2, 2 do for k = -2, 2 do
if math.abs(i) == 2 or math.abs(k) == 2 then if math.abs(i) == 2 or math.abs(k) == 2 then
if math.random(7) ~= 2 then if math.random(7) ~= 2 then
-- MFF: Prevent trees from destroying existing blocks
local vil = area:index(x + i, y + j, z + k) local vil = area:index(x + i, y + j, z + k)
data[vil] = c_wsneedles safely_set_block(data, vil, c_wsneedles)
local vila = area:index(x + i, y + j + 1, z + k) local vila = area:index(x + i, y + j + 1, z + k)
data[vila] = c_snowblock safely_set_block(data, vila, c_snowblock)
end end
end end
end end
@ -53,10 +83,11 @@ function watershed_pinetree(x, y, z, area, data)
for k = -1, 1 do for k = -1, 1 do
if not (i == 0 and j == 0) then if not (i == 0 and j == 0) then
if math.random(11) ~= 2 then if math.random(11) ~= 2 then
-- MFF: Prevent trees from destroying existing blocks
local vil = area:index(x + i, y + j, z + k) local vil = area:index(x + i, y + j, z + k)
data[vil] = c_wsneedles safely_set_block(data, vil, c_wsneedles)
local vila = area:index(x + i, y + j + 1, z + k) local vila = area:index(x + i, y + j + 1, z + k)
data[vila] = c_snowblock safely_set_block(data, vila, c_snowblock)
end end
end end
end end
@ -65,40 +96,47 @@ function watershed_pinetree(x, y, z, area, data)
for i = -1, 1 do for i = -1, 1 do
for k = -1, 1 do for k = -1, 1 do
if not (i == 0 and j == 0) then if not (i == 0 and j == 0) then
-- MFF: Prevent trees from destroying existing blocks
local vil = area:index(x + i, y + j, z + k) local vil = area:index(x + i, y + j, z + k)
data[vil] = c_wsneedles safely_set_block(data, vil,c_wsneedles)
local vila = area:index(x + i, y + j + 1, z + k) local vila = area:index(x + i, y + j + 1, z + k)
data[vila] = c_wsneedles safely_set_block(data, vila, c_wsneedles)
local vilaa = area:index(x + i, y + j + 2, z + k) local vilaa = area:index(x + i, y + j + 2, z + k)
data[vilaa] = c_snowblock safely_set_block(data, vilaa, c_snowblock)
end end
end end
end end
end end
-- MFF: Prevent trees from destroying existing blocks
local vit = area:index(x, y + j, z) local vit = area:index(x, y + j, z)
data[vit] = c_wspitree if j == 0 then
data[vit] = c_wspitree -- No safety check for the sapling itself
else
safely_set_block(data, vit, c_wspitree)
end
end end
local vil = area:index(x, y + 15, z) local vil = area:index(x, y + 15, z)
local vila = area:index(x, y + 16, z) local vila = area:index(x, y + 16, z)
local vilaa = area:index(x, y + 17, z) local vilaa = area:index(x, y + 17, z)
data[vil] = c_wsneedles -- MFF: Prevent trees from destroying existing blocks
data[vila] = c_wsneedles safely_set_block(data, vil, c_wsneedles)
data[vilaa] = c_snowblock safely_set_block(data, vila, c_wsneedles)
safely_set_block(data, vilaa, c_snowblock)
end end
function watershed_jungletree(x, y, z, area, data) function watershed_jungletree(x, y, z, area, data)
local c_juntree = minetest.get_content_id("default:jungletree") local c_juntree = minetest.get_content_id("default:jungletree")
local c_wsjunleaf = minetest.get_content_id("watershed:jungleleaf") local c_wsjunleaf = minetest.get_content_id("watershed:jungleleaf")
local c_vine = minetest.get_content_id("watershed:vine")
local top = math.random(17,23) local top = math.random(17,23)
local branch = math.floor(top * 0.6) local branch = math.floor(top * 0.6)
for j = -5, top do for j = 0, top do
if j == top or j == top - 1 or j == branch + 1 or j == branch + 2 then if j == top or j == top - 1 or j == branch + 1 or j == branch + 2 then
for i = -2, 2 do -- leaves for i = -2, 2 do -- leaves
for k = -2, 2 do for k = -2, 2 do
local vi = area:index(x + i, y + j, z + k) local vi = area:index(x + i, y + j, z + k)
if math.random(5) ~= 2 then if math.random(5) ~= 2 then
data[vi] = c_wsjunleaf -- MFF: Prevent trees from destroying existing blocks
safely_set_block(data, vi, c_wsjunleaf)
end end
end end
end end
@ -107,64 +145,28 @@ function watershed_jungletree(x, y, z, area, data)
for k = -1, 1 do for k = -1, 1 do
if math.abs(i) + math.abs(k) == 2 then if math.abs(i) + math.abs(k) == 2 then
local vi = area:index(x + i, y + j, z + k) local vi = area:index(x + i, y + j, z + k)
data[vi] = c_juntree -- MFF: Prevent trees from destroying existing blocks
end safely_set_block(data, vi, c_juntree)
end
end
end
if j >= 0 and j <= top - 3 then -- climbable nodes
for i = -1, 1 do
for k = -1, 1 do
if math.abs(i) + math.abs(k) == 1 then
local vi = area:index(x + i, y + j, z + k)
data[vi] = c_vine
end end
end end
end end
end end
if j <= top - 3 then -- trunk if j <= top - 3 then -- trunk
local vi = area:index(x, y + j, z) local vi = area:index(x, y + j, z)
data[vi] = c_juntree -- MFF: Prevent trees from destroying existing blocks
if j == 0 then
data[vi] = c_juntree -- No safety check for the sapling itself
else
safely_set_block(data, vi, c_juntree)
end
end end
end end
end end
function watershed_acaciatree(x, y, z, area, data) function watershed_acaciatree(x, y, z, area, data)
local c_wsactree = minetest.get_content_id("watershed:acaciatree") local c_sapling = minetest.get_content_id("moretrees:acacia_sapling_ongen")
local c_wsacleaf = minetest.get_content_id("watershed:acacialeaf") local vi = area:index(x, y, z)
for j = -3, 6 do data[vi] = c_sapling
if j == 6 then
for i = -4, 4 do
for k = -4, 4 do
if not (i == 0 or k == 0) then
if math.random(7) ~= 2 then
local vil = area:index(x + i, y + j, z + k)
data[vil] = c_wsacleaf
end
end
end
end
elseif j == 5 then
for i = -2, 2, 4 do
for k = -2, 2, 4 do
local vit = area:index(x + i, y + j, z + k)
data[vit] = c_wsactree
end
end
elseif j == 4 then
for i = -1, 1 do
for k = -1, 1 do
if math.abs(i) + math.abs(k) == 2 then
local vit = area:index(x + i, y + j, z + k)
data[vit] = c_wsactree
end
end
end
else
local vit = area:index(x, y + j, z)
data[vit] = c_wsactree
end
end
end end
function watershed_flower(data, vi, noise) function watershed_flower(data, vi, noise)
@ -191,7 +193,7 @@ end
function watershed_cactus(x, y, z, area, data) function watershed_cactus(x, y, z, area, data)
local c_wscactus = minetest.get_content_id("watershed:cactus") local c_wscactus = minetest.get_content_id("watershed:cactus")
for j = -2, 4 do for j = 0, 4 do
for i = -2, 2 do for i = -2, 2 do
if i == 0 or j == 2 or (j == 3 and math.abs(i) == 2) then if i == 0 or j == 2 or (j == 3 and math.abs(i) == 2) then
local vic = area:index(x + i, y + j, z) local vic = area:index(x + i, y + j, z)
@ -217,194 +219,38 @@ local SINGLENODE = true
if SINGLENODE then if SINGLENODE then
-- Set mapgen parameters -- Set mapgen parameters
minetest.register_on_mapgen_init(function(mgparams) minetest.set_mapgen_params({mgname="singlenode", flags="nolight"})
minetest.set_mapgen_params({mgname="singlenode", flags="nolight"})
end)
-- Spawn player function. Requires chunksize = 80 nodes (the default) -- Spawn player function is useless in minetestforfun
function spawnplayer(player)
local TERCEN = -128
local TERSCA = 512
local XLSAMP = 0.1
local BASAMP = 0.3
local MIDAMP = 0.1
local CANAMP = 0.4
local ATANAMP = 1.1
local BLENEXP = 2
local xsp
local ysp
local zsp
local np_terrain = {
offset = 0,
scale = 1,
spread = {x=384, y=192, z=384},
seed = 593,
octaves = 5,
persist = 0.67
}
local np_mid = {
offset = 0,
scale = 1,
spread = {x=768, y=768, z=1},
seed = 85546,
octaves = 5,
persist = 0.5
}
local np_base = {
offset = 0,
scale = 1,
spread = {x=4096, y=4096, z=1},
seed = 8890,
octaves = 3,
persist = 0.33
}
local np_xlscale = {
offset = 0,
scale = 1,
spread = {x=8192, y=8192, z=1},
seed = -72,
octaves = 3,
persist = 0.33
}
local nobj_terrain = nil
local nobj_mid = nil
local nobj_base = nil
local nobj_xlscale = nil
for chunk = 1, 64 do
print ("[watershed] searching for spawn "..chunk)
local x0 = 80 * math.random(-32, 32) - 32
local z0 = 80 * math.random(-32, 32) - 32
local y0 = -32
local x1 = x0 + 79
local z1 = z0 + 79
local y1 = 47
local sidelen = 80
local chulensxyz = {x=sidelen, y=sidelen+2, z=sidelen}
local chulensxz = {x=sidelen, y=sidelen, z=1}
local minposxyz = {x=x0, y=y0-1, z=z0}
local minposxz = {x=x0, y=z0}
nobj_terrain = nobj_terrain or minetest.get_perlin_map(np_terrain, chulensxyz)
nobj_mid = nobj_mid or minetest.get_perlin_map(np_mid, chulensxz)
nobj_base = nobj_base or minetest.get_perlin_map(np_base, chulensxz)
nobj_xlscale = nobj_xlscale or minetest.get_perlin_map(np_xlscale, chulensxz)
local nvals_terrain = nobj_terrain:get3dMap_flat(minposxyz)
local nvals_mid = nobj_mid:get2dMap_flat(minposxz)
local nvals_base = nobj_base:get2dMap_flat(minposxz)
local nvals_xlscale = nobj_xlscale:get2dMap_flat(minposxz)
local nixz = 1
local nixyz = 1
for z = z0, z1 do
for y = y0, y1 do
for x = x0, x1 do
local n_absterrain = math.abs(nvals_terrain[nixyz])
local n_absmid = math.abs(nvals_mid[nixz])
local n_absbase = math.abs(nvals_base[nixz])
local n_xlscale = nvals_xlscale[nixz]
local n_invbase = (1 - n_absbase)
local terblen = (math.max(n_invbase, 0)) ^ BLENEXP
local grad = math.atan((TERCEN - y) / TERSCA) * ATANAMP
local densitybase = n_invbase * BASAMP + n_xlscale * XLSAMP + grad
local densitymid = n_absmid * MIDAMP + densitybase
local canexp = 0.5 + terblen * 0.5
local canamp = terblen * CANAMP
local density = n_absterrain ^ canexp * canamp * n_absmid + densitymid
if y >= 1 and density > -0.005 and density < 0 then
ysp = y + 1
xsp = x
zsp = z
break
end
nixz = nixz + 1
nixyz = nixyz + 1
end
if ysp then
break
end
nixz = nixz - 80
end
if ysp then
break
end
nixz = nixz + 80
end
if ysp then
break
end
end
print ("[watershed] spawn player ("..xsp.." "..ysp.." "..zsp..")")
player:setpos({x=xsp, y=ysp, z=zsp})
end
minetest.register_on_newplayer(function(player)
spawnplayer(player)
end)
minetest.register_on_respawnplayer(function(player)
spawnplayer(player)
return true
end)
end end
-- ABM
-- Lava-water cooling
minetest.register_abm({
nodenames = {"group:lava"},
neighbors = {"group:water"},
interval = 11,
chance = 64,
action = function(pos, node, active_object_count, active_object_count_wider)
minetest.add_node(pos, {name="default:obsidian"})
minetest.sound_play("default_cool_lava", {pos = pos, gain = 0.25})
end,
})
-- Appletree sapling -- Appletree sapling
minetest.register_abm({ function default.grow_tree(pos)
nodenames = {"watershed:appling"},
interval = 57,
chance = 3,
action = function(pos, node)
local x = pos.x local x = pos.x
local y = pos.y local y = pos.y
local z = pos.z local z = pos.z
local vm = minetest.get_voxel_manip() local vm = minetest.get_voxel_manip()
local pos1 = {x=x-2, y=y-2, z=z-2} local pos1 = {x = x - 2, y = y - 2, z = z - 2}
local pos2 = {x=x+2, y=y+4, z=z+2} local pos2 = {x = x + 2, y = y + 4, z = z + 2}
local emin, emax = vm:read_from_map(pos1, pos2) local emin, emax = vm:read_from_map(pos1, pos2)
local area = VoxelArea:new({MinEdge=emin, MaxEdge=emax}) local area = VoxelArea:new({MinEdge = emin, MaxEdge = emax})
local data = vm:get_data() local data = vm:get_data()
watershed_appletree(x, y, z, area, data) watershed_appletree(x, y, z, area, data)
vm:set_data(data) vm:set_data(data)
vm:write_to_map() vm:write_to_map()
vm:update_map() vm:update_map()
end, end
})
-- Pine sapling -- Pine sapling
minetest.register_abm({ function default.grow_pine_tree(pos)
nodenames = {"watershed:pineling"},
interval = 59,
chance = 3,
action = function(pos, node)
local x = pos.x local x = pos.x
local y = pos.y local y = pos.y
local z = pos.z local z = pos.z
local vm = minetest.get_voxel_manip() local vm = minetest.get_voxel_manip()
local pos1 = {x=x-2, y=y-4, z=z-2} local pos1 = {x = x - 2, y = y - 4, z = z - 2}
local pos2 = {x=x+2, y=y+17, z=z+2} local pos2 = {x = x + 2, y = y + 17, z = z + 2}
local emin, emax = vm:read_from_map(pos1, pos2) local emin, emax = vm:read_from_map(pos1, pos2)
local area = VoxelArea:new({MinEdge=emin, MaxEdge=emax}) local area = VoxelArea:new({MinEdge=emin, MaxEdge=emax})
local data = vm:get_data() local data = vm:get_data()
@ -412,51 +258,28 @@ minetest.register_abm({
vm:set_data(data) vm:set_data(data)
vm:write_to_map() vm:write_to_map()
vm:update_map() vm:update_map()
end, end
})
-- Acacia sapling -- Acacia sapling is already defined in Moretrees
minetest.register_abm({
nodenames = {"watershed:acacialing"},
interval = 61,
chance = 3,
action = function(pos, node)
local x = pos.x
local y = pos.y
local z = pos.z
local vm = minetest.get_voxel_manip()
local pos1 = {x=x-4, y=y-3, z=z-4}
local pos2 = {x=x+4, y=y+6, z=z+4}
local emin, emax = vm:read_from_map(pos1, pos2)
local area = VoxelArea:new({MinEdge=emin, MaxEdge=emax})
local data = vm:get_data()
watershed_acaciatree(x, y, z, area, data)
vm:set_data(data)
vm:write_to_map()
vm:update_map()
end,
})
-- Jungletree sapling -- Jungletree sapling
minetest.register_abm({ function default.grow_jungle_tree(pos)
nodenames = {"watershed:jungling"},
interval = 63,
chance = 3,
action = function(pos, node)
local x = pos.x local x = pos.x
local y = pos.y local y = pos.y
local z = pos.z local z = pos.z
local vm = minetest.get_voxel_manip() local vm = minetest.get_voxel_manip()
local pos1 = {x=x-2, y=y-5, z=z-2} local pos1 = {x = x - 2, y = y - 5, z = z - 2}
local pos2 = {x=x+2, y=y+23, z=z+2} local pos2 = {x = x + 2, y = y + 23, z = z + 2}
local emin, emax = vm:read_from_map(pos1, pos2) local emin, emax = vm:read_from_map(pos1, pos2)
local area = VoxelArea:new({MinEdge=emin, MaxEdge=emax}) local area = VoxelArea:new({MinEdge = emin, MaxEdge = emax})
local data = vm:get_data() local data = vm:get_data()
watershed_jungletree(x, y, z, area, data) watershed_jungletree(x, y, z, area, data)
vm:set_data(data) vm:set_data(data)
vm:write_to_map() vm:write_to_map()
vm:update_map() vm:update_map()
end, end
})
default.grow_new_apple_tree = default.grow_tree
default.grow_new_jungle_tree = default.grow_jungle_tree
default.grow_new_pine_tree = default.grow_pine_tree

572
init.lua Normal file → Executable file
View File

@ -1,10 +1,3 @@
-- watershed 0.6.6 by paramat
-- For latest stable Minetest and back to 0.4.8
-- Depends default stairs bucket
-- License: code WTFPL, textures CC BY-SA
-- re-add z=1 for z component of 2D noisemap size to fix crashes
-- Parameters -- Parameters
local YMIN = -33000 -- Approximate base of realm stone local YMIN = -33000 -- Approximate base of realm stone
@ -21,7 +14,8 @@ local XLSAMP = 0.1 -- Extra large scale height variation amplitude
local BASAMP = 0.3 -- Base terrain amplitude local BASAMP = 0.3 -- Base terrain amplitude
local MIDAMP = 0.1 -- Mid terrain amplitude local MIDAMP = 0.1 -- Mid terrain amplitude
local CANAMP = 0.4 -- Canyon terrain maximum amplitude local CANAMP = 0.4 -- Canyon terrain maximum amplitude
local ATANAMP = 1.1 -- Arctan function amplitude, smaller = more and larger floatlands above ridges local ATANAMP = 1.1 -- Arctan function amplitude,
-- smaller = more and larger floatlands above ridges
local BLENEXP = 2 -- Terrain blend exponent local BLENEXP = 2 -- Terrain blend exponent
local TSTONE = 0.02 -- Density threshold for stone, depth of soil at TERCEN local TSTONE = 0.02 -- Density threshold for stone, depth of soil at TERCEN
@ -29,7 +23,8 @@ local TRIVER = -0.028 -- Densitybase threshold for river surface
local TRSAND = -0.035 -- Densitybase threshold for river sand local TRSAND = -0.035 -- Densitybase threshold for river sand
local TSTREAM = -0.004 -- Densitymid threshold for stream surface local TSTREAM = -0.004 -- Densitymid threshold for stream surface
local TSSAND = -0.005 -- Densitymid threshold for stream sand local TSSAND = -0.005 -- Densitymid threshold for stream sand
local TLAVA = 2 -- Maximum densitybase threshold for lava, small because grad is non-linear local TLAVA = 2 -- Maximum densitybase threshold for lava,
-- small because grad is non-linear
local TFIS = 0.01 -- Fissure threshold, controls width local TFIS = 0.01 -- Fissure threshold, controls width
local TSEAM = 0.2 -- Seam threshold, width of seams local TSEAM = 0.2 -- Seam threshold, width of seams
local ORESCA = 512 -- Seam system vertical scale local ORESCA = 512 -- Seam system vertical scale
@ -37,13 +32,14 @@ local ORETHI = 0.002 -- Ore seam thickness tuner
local BERGDEP = 32 -- Maximum iceberg depth local BERGDEP = 32 -- Maximum iceberg depth
local TFOG = -0.04 -- Fog top densitymid threshold local TFOG = -0.04 -- Fog top densitymid threshold
local HITET = 0.35 -- High temperature threshold local biomeparams = {
local LOTET = -0.35 -- Low .. HITET = 0.35, -- High temperature threshold
local ICETET = -0.7 -- Ice .. LOTET = -0.35, -- Low ..
local HIHUT = 0.35 -- High humidity threshold ICETET = -0.7, -- Ice ..
local LOHUT = -0.35 -- Low .. HIHUT = 0.35, -- High humidity threshold
local FOGHUT = 1.0 -- Fog .. LOHUT = -0.35, -- Low ..
local BLEND = 0.02 -- Biome blend randomness BLEND = 0.02, -- Biome blend randomness
}
local flora = { local flora = {
PINCHA = 36, -- Pine tree 1/x chance per node PINCHA = 36, -- Pine tree 1/x chance per node
@ -52,132 +48,178 @@ local flora = {
GRACHA = 36, -- Grassland grasses GRACHA = 36, -- Grassland grasses
JUTCHA = 16, -- Jungletree JUTCHA = 16, -- Jungletree
JUGCHA = 16, -- Junglegrass JUGCHA = 16, -- Junglegrass
CACCHA = 2209, -- Cactus CACCHA = 800, -- Cactus
DRYCHA = 121, -- Dry shrub CACCHA_DRYGRASS = 1600,
DRYCHA = 150, -- Dry shrub
ACACHA = 1369, -- Acacia tree ACACHA = 1369, -- Acacia tree
GOGCHA = 9, -- Golden grass GOGCHA = 9, -- Golden grass
PAPCHA = 4, -- Papyrus PAPCHA = 4, -- Papyrus
DUGCHA = 16, -- Dune grass DUGCHA = 16, -- Dune grass
} }
local np = {
-- pack it in a single table to avoid "function has more than 60 upvalues"
-- 3D noises -- 3D noises
-- 3D noise for terrain -- 3D noise for terrain
local np_terrain = { terrain = {
offset = 0, offset = 0,
scale = 1, scale = 1,
spread = {x=384, y=192, z=384}, spread = {x = 384, y = 192, z = 384},
seed = 593, seed = 593,
octaves = 5, octaves = 5,
persist = 0.67 persist = 0.67
} },
-- 3D noise for fissures -- 3D noise for fissures
local np_fissure = { fissure = {
offset = 0, offset = 0,
scale = 1, scale = 1,
spread = {x=256, y=512, z=256}, spread = {x = 256, y = 512, z = 256},
seed = 20099, seed = 20099,
octaves = 5, octaves = 5,
persist = 0.5 persist = 0.5
} },
-- 3D noise for temperature
local np_temp = {
offset = 0,
scale = 1,
spread = {x=1024, y=1024, z=1024},
seed = 9130,
octaves = 3,
persist = 0.5
}
-- 3D noise for humidity
local np_humid = {
offset = 0,
scale = 1,
spread = {x=1024, y=1024, z=1024},
seed = -55500,
octaves = 3,
persist = 0.5
}
-- 3D noise for ore seam networks -- 3D noise for ore seam networks
local np_seam = { seam = {
offset = 0, offset = 0,
scale = 1, scale = 1,
spread = {x=512, y=512, z=512}, spread = {x = 512, y = 512, z = 512},
seed = -992221, seed = -992221,
octaves = 2, octaves = 2,
persist = 0.5 persist = 0.5
} },
-- 3D noise for rock strata inclination -- 3D noise for rock strata inclination
local np_strata = { strata = {
offset = 0, offset = 0,
scale = 1, scale = 1,
spread = {x=512, y=512, z=512}, spread = {x = 512, y = 512, z = 512},
seed = 92219, seed = 92219,
octaves = 3, octaves = 3,
persist = 0.5 persist = 0.5
} },
-- 3D noises for caves, from Valleys Mapgen mod by Gael-de-Sailly
cave1 = {
offset = 0,
scale = 1,
spread = {x = 32, y = 32, z = 32},
seed = -4640,
octaves = 4,
persist = 0.5
},
cave2 = {
offset = 0,
scale = 1,
seed = 8804,
spread = {x = 32, y = 32, z = 32},
octaves = 4,
persist = 0.5
},
cave3 = {
offset = 0,
scale = 1,
seed = -4780,
spread = {x = 32, y = 32, z = 32},
octaves = 4,
persist = 0.5
},
cave4 = {
offset = 0,
scale = 1,
seed = -9969,
spread = {x = 32, y = 32, z = 32},
octaves = 4,
persist = 0.5
},
-- 2D noises -- 2D noises
-- 2D noise for mid terrain / streambed height -- 2D noise for mid terrain / streambed height
local np_mid = { mid = {
offset = 0, offset = 0,
scale = 1, scale = 1,
spread = {x=768, y=768, z=768}, spread = {x = 768, y = 768, z = 768},
seed = 85546, seed = 85546,
octaves = 5, octaves = 5,
persist = 0.5 persist = 0.5
} },
-- 2D noise for base terrain / riverbed height -- 2D noise for base terrain / riverbed height
local np_base = { base = {
offset = 0, offset = 0,
scale = 1, scale = 1,
spread = {x=4096, y=4096, z=4096}, spread = {x = 1024, y = 1024, z = 1024},
seed = 8890, seed = 8890,
octaves = 3, octaves = 3,
persist = 0.33 persist = 0.33
} },
-- 2D noise for extra large scale height variation -- 2D noise for extra large scale height variation
local np_xlscale = { xlscale = {
offset = 0, offset = 0,
scale = 1, scale = 1,
spread = {x=8192, y=8192, z=8192}, spread = {x = 4096, y = 4096, z = 4096},
seed = -72, seed = -72,
octaves = 3, octaves = 3,
persist = 0.33 persist = 0.33
} },
-- 2D noise for magma surface -- 2D noise for magma surface
local np_magma = { magma = {
offset = 0, offset = 0,
scale = 1, scale = 1,
spread = {x=128, y=128, z=128}, spread = {x = 128, y = 128, z = 128},
seed = -13, seed = -13,
octaves = 2, octaves = 2,
persist = 0.5 persist = 0.5
},
-- 2D noise for temperature, the same than in Plantlife and Snowdrift
temp = {
offset = 0,
scale = 1,
spread = {x = 256, y = 256, z = 256},
seed = 112,
octaves = 3,
persist = 0.5
},
-- 2D noise for humidity
humid = {
offset = 0,
scale = 1,
spread = {x = 256, y = 256, z = 256},
seed = 72384,
octaves = 4,
persist = 0.66
},
} }
-- Do files
-- Stuff dofile(minetest.get_modpath("watershed") .. "/nodes.lua")
dofile(minetest.get_modpath("watershed") .. "/functions.lua")
-- initialize 3D and 2D noise objects to nil -- Initialize 3D and 2D noise objects to nil
local nobj_terrain = nil local nobj_terrain = nil
local nobj_fissure = nil local nobj_fissure = nil
@ -186,17 +228,40 @@ local nobj_humid = nil
local nobj_seam = nil local nobj_seam = nil
local nobj_strata = nil local nobj_strata = nil
local nobj_cave1 = nil
local nobj_cave2 = nil
local nobj_cave3 = nil
local nobj_cave4 = nil
local nobj_mid = nil local nobj_mid = nil
local nobj_base = nil local nobj_base = nil
local nobj_xlscale = nil local nobj_xlscale = nil
local nobj_magma = nil local nobj_magma = nil
dofile(minetest.get_modpath("watershed").."/nodes.lua")
dofile(minetest.get_modpath("watershed").."/functions.lua") -- Localise noise buffers
local nbuf_terrain
local nbuf_fissure
local nbuf_temp
local nbuf_humid
local nbuf_seam
local nbuf_strata
local nbuf_cave1
local nbuf_cave2
local nbuf_cave3
local nbuf_cave4
local nbuf_mid
local nbuf_base
local nbuf_xlscale
local nbuf_magma
-- Mapchunk generation function -- Mapchunk generation function
local global_seed
function watershed_chunkgen(x0, y0, z0, x1, y1, z1, area, data) function watershed_chunkgen(x0, y0, z0, x1, y1, z1, area, data)
local c_air = minetest.get_content_id("air") local c_air = minetest.get_content_id("air")
local c_ignore = minetest.get_content_id("ignore") local c_ignore = minetest.get_content_id("ignore")
@ -225,9 +290,8 @@ function watershed_chunkgen(x0, y0, z0, x1, y1, z1, area, data)
local c_clay = minetest.get_content_id("default:clay") local c_clay = minetest.get_content_id("default:clay")
local c_grass5 = minetest.get_content_id("default:grass_5") local c_grass5 = minetest.get_content_id("default:grass_5")
local c_obsidian = minetest.get_content_id("default:obsidian") local c_obsidian = minetest.get_content_id("default:obsidian")
local c_wsfreshwater = minetest.get_content_id("watershed:freshwater") local c_wsfreshwater = minetest.get_content_id("watershed:freshwater")
local c_wsmixwater = minetest.get_content_id("watershed:mixwater")
local c_wsstone = minetest.get_content_id("watershed:stone") local c_wsstone = minetest.get_content_id("watershed:stone")
local c_wsredstone = minetest.get_content_id("watershed:redstone") local c_wsredstone = minetest.get_content_id("watershed:redstone")
local c_wsgrass = minetest.get_content_id("watershed:grass") local c_wsgrass = minetest.get_content_id("watershed:grass")
@ -237,66 +301,86 @@ function watershed_chunkgen(x0, y0, z0, x1, y1, z1, area, data)
local c_wspermafrost = minetest.get_content_id("watershed:permafrost") local c_wspermafrost = minetest.get_content_id("watershed:permafrost")
local c_wslava = minetest.get_content_id("watershed:lava") local c_wslava = minetest.get_content_id("watershed:lava")
local c_wsfreshice = minetest.get_content_id("watershed:freshice") local c_wsfreshice = minetest.get_content_id("watershed:freshice")
local c_wscloud = minetest.get_content_id("watershed:cloud") local c_wscloud = minetest.get_content_id("air") -- disable clouds
local c_wsluxore = minetest.get_content_id("watershed:luxore")
local c_wsicydirt = minetest.get_content_id("watershed:icydirt") local c_wsicydirt = minetest.get_content_id("watershed:icydirt")
-- perlinmap stuff -- perlinmap stuff
local sidelen = x1 - x0 + 1 -- chunk sidelength local sidelen = x1 - x0 + 1
local chulensxyz = {x=sidelen, y=sidelen+2, z=sidelen} -- chunk dimensions, '+2' for overgeneration local sqr_sidelen = sidelen ^ 2
local chulensxz = {x=sidelen, y=sidelen, z=1} -- here x = map x, y = map z local chulensxyz = {x = sidelen, y = sidelen + 2, z = sidelen}
local minposxyz = {x=x0, y=y0-1, z=z0} local chulensxz = {x = sidelen, y = sidelen, z = 1}
local minposxz = {x=x0, y=z0} -- here x = map x, y = map z local minposxyz = {x = x0, y = y0 - 1, z = z0}
local minposxz = {x = x0, y = z0}
-- 3D and 2D noise objects created once on first mapchunk generation only -- 3D and 2D noise objects created once on first mapchunk generation only
nobj_terrain = nobj_terrain or minetest.get_perlin_map(np_terrain, chulensxyz) nobj_terrain = nobj_terrain or minetest.get_perlin_map(np.terrain, chulensxyz)
nobj_fissure = nobj_fissure or minetest.get_perlin_map(np_fissure, chulensxyz) nobj_fissure = nobj_fissure or minetest.get_perlin_map(np.fissure, chulensxyz)
nobj_temp = nobj_temp or minetest.get_perlin_map(np_temp, chulensxyz) nobj_temp = nobj_temp or minetest.get_perlin_map(np.temp, chulensxyz)
nobj_humid = nobj_humid or minetest.get_perlin_map(np_humid, chulensxyz) nobj_humid = nobj_humid or minetest.get_perlin_map(np.humid, chulensxyz)
nobj_seam = nobj_seam or minetest.get_perlin_map(np_seam, chulensxyz) nobj_seam = nobj_seam or minetest.get_perlin_map(np.seam, chulensxyz)
nobj_strata = nobj_strata or minetest.get_perlin_map(np_strata, chulensxyz) nobj_strata = nobj_strata or minetest.get_perlin_map(np.strata, chulensxyz)
nobj_mid = nobj_mid or minetest.get_perlin_map(np_mid, chulensxz) nobj_cave1 = nobj_cave1 or minetest.get_perlin_map(np.cave1, chulensxyz)
nobj_base = nobj_base or minetest.get_perlin_map(np_base, chulensxz) nobj_cave2 = nobj_cave2 or minetest.get_perlin_map(np.cave2, chulensxyz)
nobj_xlscale = nobj_xlscale or minetest.get_perlin_map(np_xlscale, chulensxz) nobj_cave3 = nobj_cave3 or minetest.get_perlin_map(np.cave3, chulensxyz)
nobj_magma = nobj_magma or minetest.get_perlin_map(np_magma, chulensxz) nobj_cave4 = nobj_cave4 or minetest.get_perlin_map(np.cave4, chulensxyz)
nobj_mid = nobj_mid or minetest.get_perlin_map(np.mid, chulensxz)
nobj_base = nobj_base or minetest.get_perlin_map(np.base, chulensxz)
nobj_xlscale = nobj_xlscale or minetest.get_perlin_map(np.xlscale, chulensxz)
nobj_magma = nobj_magma or minetest.get_perlin_map(np.magma, chulensxz)
-- 3D and 2D perlinmaps created per mapchunk -- 3D and 2D perlinmaps created per mapchunk
local nvals_terrain = nobj_terrain:get3dMap_flat(minposxyz) local nvals_terrain = nobj_terrain:get3dMap_flat(minposxyz)
local nvals_fissure = nobj_fissure:get3dMap_flat(minposxyz) local nvals_fissure = nobj_fissure:get3dMap_flat(minposxyz)
local nvals_temp = nobj_temp:get3dMap_flat(minposxyz) local nvals_temp = nobj_temp :get2dMap_flat(minposxz)
local nvals_humid = nobj_humid:get3dMap_flat(minposxyz) local nvals_humid = nobj_humid :get2dMap_flat(minposxz)
local nvals_seam = nobj_seam:get3dMap_flat(minposxyz) local nvals_seam = nobj_seam :get3dMap_flat(minposxyz)
local nvals_strata = nobj_strata:get3dMap_flat(minposxyz) local nvals_strata = nobj_strata :get3dMap_flat(minposxyz)
local nvals_mid = nobj_mid:get2dMap_flat(minposxz) local nvals_cave1 = nobj_cave1 :get3dMap_flat(minposxyz)
local nvals_base = nobj_base:get2dMap_flat(minposxz) local nvals_cave2 = nobj_cave2 :get3dMap_flat(minposxyz)
local nvals_cave3 = nobj_cave3 :get3dMap_flat(minposxyz)
local nvals_cave4 = nobj_cave4 :get3dMap_flat(minposxyz)
local nvals_mid = nobj_mid :get2dMap_flat(minposxz)
local nvals_base = nobj_base :get2dMap_flat(minposxz)
local nvals_xlscale = nobj_xlscale:get2dMap_flat(minposxz) local nvals_xlscale = nobj_xlscale:get2dMap_flat(minposxz)
local nvals_magma = nobj_magma:get2dMap_flat(minposxz) local nvals_magma = nobj_magma :get2dMap_flat(minposxz)
-- ungenerated chunk below? -- ungenerated chunk below?
local viu = area:index(x0, y0-1, z0) local viu = area:index(x0, y0 - 1, z0)
local ungen = data[viu] == c_ignore local ungen = data[viu] == c_ignore
-- mapgen loop -- mapgen loop
local nixyz = 1 -- 3D and 2D perlinmap indexes local nixyz = 1 -- 3D and 2D perlinmap indexes
local nixz = 1 local nixz = 1
local stable = {} -- stability table of true/false. is node supported from below by 2 stone or nodes on 2 stone? local stable = {} -- stability table of true/false.
local under = {} -- biome table. biome number of previous fine material placed in column -- is node supported from below by 2 stone or nodes on 2 stone?
for z = z0, z1 do -- for each xy plane progressing northwards local under = {} -- biome table.
for y = y0 - 1, y1 + 1 do -- for each x row progressing upwards -- biome number of previous fine material placed in column
local vi = area:index(x0, y, z) -- voxelmanip index for first node in this x row for z = z0, z1 do
local viu = area:index(x0, y-1, z) -- index for under node for y = y0 - 1, y1 + 1 do
for x = x0, x1 do -- for each node do local vi = area:index(x0, y, z)
local viu = area:index(x0, y - 1, z)
for x = x0, x1 do
local si = x - x0 + 1 -- stable, under tables index local si = x - x0 + 1 -- stable, under tables index
-- noise values for node -- noise values for node
local n_absterrain = math.abs(nvals_terrain[nixyz]) local n_absterrain = math.abs(nvals_terrain[nixyz])
local n_fissure = nvals_fissure[nixyz] local n_fissure = nvals_fissure[nixyz]
local n_temp = nvals_temp[nixyz]
local n_humid = nvals_humid[nixyz]
local n_seam = nvals_seam[nixyz] local n_seam = nvals_seam[nixyz]
local n_strata = nvals_strata[nixyz] local n_strata = nvals_strata[nixyz]
local n_cave1 = nvals_cave1[nixyz]
local n_cave2 = nvals_cave2[nixyz]
local n_cave3 = nvals_cave3[nixyz]
local n_cave4 = nvals_cave4[nixyz]
local n_absmid = math.abs(nvals_mid[nixz]) local n_absmid = math.abs(nvals_mid[nixz])
local n_absbase = math.abs(nvals_base[nixz]) local n_absbase = math.abs(nvals_base[nixz])
local n_xlscale = nvals_xlscale[nixz] local n_xlscale = nvals_xlscale[nixz]
local n_magma = nvals_magma[nixz] local n_magma = nvals_magma[nixz]
local n_temp = nvals_temp[nixz]
local n_humid = nvals_humid[nixz]
-- get densities -- get densities
local n_invbase = (1 - n_absbase) local n_invbase = (1 - n_absbase)
local terblen = (math.max(n_invbase, 0)) ^ BLENEXP local terblen = (math.max(n_invbase, 0)) ^ BLENEXP
@ -315,39 +399,46 @@ function watershed_chunkgen(x0, y0, z0, x1, y1, z1, area, data)
local tlava = TLAVA * (1 - n_magma ^ 4 * terblen ^ 16 * 0.6) -- lava threshold local tlava = TLAVA * (1 - n_magma ^ 4 * terblen ^ 16 * 0.6) -- lava threshold
local ysand = YSAV + n_fissure * SAMP + math.random() * 2 -- sandline local ysand = YSAV + n_fissure * SAMP + math.random() * 2 -- sandline
local bergdep = math.abs(n_seam) * BERGDEP -- iceberg depth local bergdep = math.abs(n_seam) * BERGDEP -- iceberg depth
local nofis = false -- set fissure bool local nofis = false -- set fissure bool
if math.abs(n_fissure) >= TFIS then if math.abs(n_fissure) >= TFIS
and n_cave1 ^ 2 + n_cave2 ^ 2 + n_cave3 ^ 2 + n_cave4 ^ 2 >= 0.07 then -- from Valleys Mapgen
nofis = true nofis = true
end end
local biome = false -- select biome for node local biome = false -- select biome for node
if n_temp < LOTET + (math.random() - 0.5) * BLEND then if n_temp < biomeparams.LOTET +
if n_humid < LOHUT + (math.random() - 0.5) * BLEND then (math.random() - 0.5) * biomeparams.BLEND then
if n_humid < biomeparams.LOHUT +
(math.random() - 0.5) * biomeparams.BLEND then
biome = 1 -- tundra biome = 1 -- tundra
elseif n_humid > HIHUT + (math.random() - 0.5) * BLEND then elseif n_humid > biomeparams.HIHUT +
(math.random() - 0.5) * biomeparams.BLEND then
biome = 3 -- taiga biome = 3 -- taiga
else else
biome = 2 -- snowy plains biome = 2 -- snowy plains
end end
elseif n_temp > HITET + (math.random() - 0.5) * BLEND then elseif n_temp > biomeparams.HITET +
if n_humid < LOHUT + (math.random() - 0.5) * BLEND then (math.random() - 0.5) * biomeparams.BLEND then
if n_humid < biomeparams.LOHUT +
(math.random() - 0.5) * biomeparams.BLEND then
biome = 7 -- desert biome = 7 -- desert
elseif n_humid > HIHUT + (math.random() - 0.5) * BLEND then elseif n_humid > biomeparams.HIHUT +
(math.random() - 0.5) * biomeparams.BLEND then
biome = 9 -- rainforest biome = 9 -- rainforest
else else
biome = 8 -- savanna biome = 8 -- savanna
end end
else else
if n_humid < LOHUT then if n_humid < biomeparams.LOHUT then
biome = 4 -- dry grassland biome = 4 -- dry grassland
elseif n_humid > HIHUT then elseif n_humid > biomeparams.HIHUT then
biome = 6 -- deciduous forest biome = 6 -- deciduous forest
else else
biome = 5 -- grassland biome = 5 -- grassland
end end
end end
-- overgeneration and in-chunk generation -- overgeneration and in-chunk generation
if y == y0 - 1 then -- node layer below chunk, initialise tables if y == y0 - 1 then -- node layer below chunk, initialise tables
under[si] = 0 under[si] = 0
@ -360,22 +451,21 @@ function watershed_chunkgen(x0, y0, z0, x1, y1, z1, area, data)
else -- scan top layer of chunk below else -- scan top layer of chunk below
local nodid = data[vi] local nodid = data[vi]
if nodid == c_wsstone if nodid == c_wsstone
or nodid == c_wsredstone or nodid == c_wsredstone
or nodid == c_wsdirt or nodid == c_wsdirt
or nodid == c_wspermafrost or nodid == c_wspermafrost
or nodid == c_wsluxore or nodid == c_sand
or nodid == c_sand or nodid == c_desand
or nodid == c_desand or nodid == c_mese
or nodid == c_mese or nodid == c_stodiam
or nodid == c_stodiam or nodid == c_stogold
or nodid == c_stogold or nodid == c_stocopp
or nodid == c_stocopp or nodid == c_stoiron
or nodid == c_stoiron or nodid == c_stocoal
or nodid == c_stocoal or nodid == c_sandstone
or nodid == c_sandstone or nodid == c_gravel
or nodid == c_gravel or nodid == c_clay
or nodid == c_clay or nodid == c_obsidian then
or nodid == c_obsidian then
stable[si] = 2 stable[si] = 2
else else
stable[si] = 0 stable[si] = 0
@ -390,57 +480,41 @@ function watershed_chunkgen(x0, y0, z0, x1, y1, z1, area, data)
stable[si] = 0 stable[si] = 0
under[si] = 0 under[si] = 0
elseif densitybase >= tlava - math.min(0.6 + density * 6, 0.6) elseif densitybase >= tlava - math.min(0.6 + density * 6, 0.6)
and density < tstone then -- obsidian and density < tstone then -- obsidian
data[vi] = c_obsidian data[vi] = c_obsidian
stable[si] = 1 stable[si] = 1
under[si] = 0 under[si] = 0
elseif density >= tstone and nofis -- stone cut by fissures elseif density >= tstone and nofis -- stone cut by fissures
or (density >= tstone and density < TSTONE * 1.2 and y <= YWAT) -- stone around water or (density >= tstone and density < TSTONE * 1.2 and
or (density >= tstone and density < TSTONE * 1.2 and densitybase >= triver ) -- stone around river y <= YWAT) -- stone around water
or (density >= tstone and density < TSTONE * 1.2 and densitymid >= tstream ) then -- stone around stream or (density >= tstone and density < TSTONE * 1.2 and
densitybase >= triver ) -- stone around river
or (density >= tstone and density < TSTONE * 1.2 and
densitymid >= tstream ) then -- stone around stream
local densitystr = n_strata * 0.25 + (TERCEN - y) / ORESCA local densitystr = n_strata * 0.25 + (TERCEN - y) / ORESCA
local densityper = densitystr - math.floor(densitystr) -- periodic strata 'density' -- periodic strata 'density'
local densityper = densitystr - math.floor(densitystr)
if (densityper >= 0.05 and densityper <= 0.09) -- sandstone strata if (densityper >= 0.05 and densityper <= 0.09) -- sandstone strata
or (densityper >= 0.25 and densityper <= 0.28) or (densityper >= 0.25 and densityper <= 0.28)
or (densityper >= 0.45 and densityper <= 0.47) or (densityper >= 0.45 and densityper <= 0.47)
or (densityper >= 0.74 and densityper <= 0.76) or (densityper >= 0.74 and densityper <= 0.76)
or (densityper >= 0.77 and densityper <= 0.79) or (densityper >= 0.77 and densityper <= 0.79)
or (densityper >= 0.84 and densityper <= 0.87) or (densityper >= 0.84 and densityper <= 0.87)
or (densityper >= 0.95 and densityper <= 0.98) then or (densityper >= 0.95 and densityper <= 0.98) then
data[vi] = c_sandstone if y > -84 and (y >= -80 or math.random() > 0.5) then
elseif biome == 7 and density < TSTONE * 3 then -- desert stone as surface layer data[vi] = c_sandstone
else
data[vi] = c_wsstone
end
elseif biome == 7 and density < TSTONE * 3 then
-- desert stone as surface layer
data[vi] = c_wsredstone data[vi] = c_wsredstone
elseif math.abs(n_seam) < TSEAM then elseif math.abs(n_seam) < TSEAM then
if densityper >= 0 and densityper <= ORETHI * 4 then -- ore seams -- ore seams
data[vi] = c_stocoal
elseif densityper >= 0.3 and densityper <= 0.3 + ORETHI * 4 then if densityper >= 0.55 and densityper <= 0.55 + ORETHI * 2 then
data[vi] = c_stocoal
elseif densityper >= 0.5 and densityper <= 0.5 + ORETHI * 4 then
data[vi] = c_stocoal
elseif densityper >= 0.8 and densityper <= 0.8 + ORETHI * 4 then
data[vi] = c_stocoal
elseif densityper >= 0.55 and densityper <= 0.55 + ORETHI * 2 then
data[vi] = c_gravel data[vi] = c_gravel
elseif densityper >= 0.1 and densityper <= 0.1 + ORETHI * 2 then
data[vi] = c_wsluxore
elseif densityper >= 0.2 and densityper <= 0.2 + ORETHI * 2
and math.random(2) == 2 then
data[vi] = c_stoiron
elseif densityper >= 0.65 and densityper <= 0.65 + ORETHI * 2
and math.random(2) == 2 then
data[vi] = c_stoiron
elseif densityper >= 0.4 and densityper <= 0.4 + ORETHI * 2
and math.random(3) == 2 then
data[vi] = c_stocopp
elseif densityper >= 0.6 and densityper <= 0.6 + ORETHI
and math.random(5) == 2 then
data[vi] = c_stogold
elseif densityper >= 0.7 and densityper <= 0.7 + ORETHI
and math.random(7) == 2 then
data[vi] = c_mese
elseif densityper >= 0.9 and densityper <= 0.9 + ORETHI
and math.random(11) == 2 then
data[vi] = c_stodiam
else else
data[vi] = c_wsstone data[vi] = c_wsstone
end end
@ -449,6 +523,8 @@ function watershed_chunkgen(x0, y0, z0, x1, y1, z1, area, data)
end end
stable[si] = stable[si] + 1 stable[si] = stable[si] + 1
under[si] = 0 under[si] = 0
-- fine materials
elseif density >= 0 and density < tstone and stable[si] >= 2 then -- fine materials elseif density >= 0 and density < tstone and stable[si] >= 2 then -- fine materials
if y == YWAT - 2 and math.abs(n_temp) < 0.05 then -- clay if y == YWAT - 2 and math.abs(n_temp) < 0.05 then -- clay
data[vi] = c_clay data[vi] = c_clay
@ -495,8 +571,8 @@ function watershed_chunkgen(x0, y0, z0, x1, y1, z1, area, data)
under[si] = 0 under[si] = 0
end end
elseif y >= YWAT - bergdep and y <= YWAT + bergdep / 8 -- icesheet elseif y >= YWAT - bergdep and y <= YWAT + bergdep / 8 -- icesheet
and n_temp < ICETET and density < tstone and n_temp < biomeparams.ICETET and density < tstone
and math.abs(n_fissure) > 0.01 then and nofis then
data[vi] = c_ice data[vi] = c_ice
under[si] = 12 under[si] = 12
stable[si] = 0 stable[si] = 0
@ -504,31 +580,29 @@ function watershed_chunkgen(x0, y0, z0, x1, y1, z1, area, data)
data[vi] = c_water data[vi] = c_water
under[si] = 0 under[si] = 0
stable[si] = 0 stable[si] = 0
elseif densitybase >= triver and density < tstone then -- river water not in fissures -- river water not in fissures
if n_temp < ICETET then
elseif densitybase >= triver and density < tstone then
if n_temp < biomeparams.ICETET then
data[vi] = c_wsfreshice data[vi] = c_wsfreshice
else else
if y == YWAT + 1 then data[vi] = c_wsfreshwater
data[vi] = c_wsmixwater
else
data[vi] = c_wsfreshwater
end
end end
stable[si] = 0 stable[si] = 0
under[si] = 0 under[si] = 0
elseif densitymid >= tstream and density < tstone then -- stream water not in fissures -- stream water not in fissures
if n_temp < ICETET then
elseif densitymid >= tstream and density < tstone then
if n_temp < biomeparams.ICETET then
data[vi] = c_wsfreshice data[vi] = c_wsfreshice
else else
if y == YWAT + 1 then data[vi] = c_wsfreshwater
data[vi] = c_wsmixwater
else
data[vi] = c_wsfreshwater
end
end end
stable[si] = 0 stable[si] = 0
under[si] = 0 under[si] = 0
elseif density < 0 and y >= YWAT and under[si] ~= 0 then -- air above surface node -- air above surface node
elseif density < 0 and y >= YWAT and under[si] ~= 0 then
local fnoise = n_fissure -- noise for flower colours local fnoise = n_fissure -- noise for flower colours
if under[si] == 1 then if under[si] == 1 then
data[viu] = c_wsicydirt data[viu] = c_wsicydirt
@ -547,7 +621,9 @@ function watershed_chunkgen(x0, y0, z0, x1, y1, z1, area, data)
end end
elseif under[si] == 4 then elseif under[si] == 4 then
data[viu] = c_wsdrygrass data[viu] = c_wsdrygrass
if math.random(flora.DRYCHA) == 2 then if math.random(flora.CACCHA_DRYGRASS) == 2 then
watershed_cactus(x, y, z, area, data)
elseif math.random(flora.DRYCHA) == 2 then
data[vi] = c_dryshrub data[vi] = c_dryshrub
end end
elseif under[si] == 5 then elseif under[si] == 5 then
@ -568,7 +644,7 @@ function watershed_chunkgen(x0, y0, z0, x1, y1, z1, area, data)
data[vi] = c_grass5 data[vi] = c_grass5
end end
end end
elseif under[si] == 7 and n_temp < HITET + 0.1 then elseif under[si] == 7 and n_temp < biomeparams.HITET + 0.1 then
if math.random(flora.CACCHA) == 2 then if math.random(flora.CACCHA) == 2 then
watershed_cactus(x, y, z, area, data) watershed_cactus(x, y, z, area, data)
elseif math.random(flora.DRYCHA) == 2 then elseif math.random(flora.DRYCHA) == 2 then
@ -593,34 +669,21 @@ function watershed_chunkgen(x0, y0, z0, x1, y1, z1, area, data)
end end
end end
elseif under[si] == 10 then -- dunes elseif under[si] == 10 then -- dunes
if math.random(flora.DUGCHA) == 2 and y > YSAV if math.random(flora.DUGCHA) == 2 and y > YSAV
and biome >= 4 then and biome >= 4 then
data[vi] = c_wsgoldengrass data[vi] = c_wsgoldengrass
end end
elseif under[si] == 11 and n_temp > HITET then -- hot biome riverbank elseif under[si] == 11 and n_temp > biomeparams.HITET then -- hot biome riverbank
if math.random(flora.PAPCHA) == 2 then if math.random(flora.PAPCHA) == 2 then
watershed_papyrus(x, y, z, area, data) watershed_papyrus(x, y, z, area, data)
end end
elseif under[si] == 12 -- snowy iceberg
and n_humid > LOHUT + (math.random() - 0.5) * BLEND then -- snowy iceberg elseif under[si] == 12 and n_humid > biomeparams.LOHUT +
(math.random() - 0.5) * biomeparams.BLEND then
data[vi] = c_snowblock data[vi] = c_snowblock
end end
stable[si] = 0 stable[si] = 0
under[si] = 0 under[si] = 0
elseif density < 0 and densitymid > TFOG and n_humid > FOGHUT then -- fog
data[vi] = c_wscloud
stable[si] = 0
under[si] = 0
elseif density < 0 and CLOUDS and y == y1 and y >= YCLOMIN then -- clouds
local xrq = 16 * math.floor((x - x0) / 16) -- quantise to 16x16 lattice
local zrq = 16 * math.floor((z - z0) / 16)
local yrq = 79
local qixyz = zrq * 6400 + yrq * 80 + xrq + 1 -- quantised 3D index
if math.abs(nvals_fissure[qixyz]) < nvals_humid[qixyz] * 0.1 then
data[vi] = c_wscloud
end
stable[si] = 0
under[si] = 0
else -- air else -- air
stable[si] = 0 stable[si] = 0
under[si] = 0 under[si] = 0
@ -648,7 +711,7 @@ function watershed_chunkgen(x0, y0, z0, x1, y1, z1, area, data)
end end
end end
end end
nixyz = nixyz + 1 -- increment perlinmap and voxelarea indexes along x row nixyz = nixyz + 1
nixz = nixz + 1 nixz = nixz + 1
vi = vi + 1 vi = vi + 1
viu = viu + 1 viu = viu + 1
@ -657,57 +720,15 @@ function watershed_chunkgen(x0, y0, z0, x1, y1, z1, area, data)
end end
nixz = nixz + sidelen nixz = nixz + sidelen
end end
darkage_mapgen(data, area, {x=x0, y=y0, z=z0}, {x=x1, y=y1, z=z1}, global_seed) -- Generate darkage ores
end end
-- Regenerate chunk by chat command. Dependant on chunksize = 5.
minetest.register_chatcommand("regen",{
description = "Regenerate player's current mapchunk",
privs = {server = true, rollback = true},
func = function(name, params)
local t1 = os.clock()
local player = minetest.get_player_by_name(name)
local pos = player:getpos()
local plax = math.floor(pos.x + 0.5)
local play = math.floor(pos.y + 0.5)
local plaz = math.floor(pos.z + 0.5)
local x0 = (80 * math.floor((plax + 32) / 80)) - 32
local y0 = (80 * math.floor((play + 32) / 80)) - 32
local z0 = (80 * math.floor((plaz + 32) / 80)) - 32
local x1 = x0 + 79
local y1 = y0 + 79
local z1 = z0 + 79
if y0 < YMIN or y1 > YMAX then
return
end
print ("[watershed] regenerate mapchunk")
local vm = minetest.get_voxel_manip()
local pos1 = {x = x0, y = y0 - 1, z = z0}
local pos2 = {x = x1, y = y1 + 1, z = z1}
local emin, emax = vm:read_from_map(pos1, pos2)
local area = VoxelArea:new({MinEdge=emin, MaxEdge=emax})
local data = vm:get_data()
watershed_chunkgen(x0, y0, z0, x1, y1, z1, area, data)
vm:set_data(data)
vm:write_to_map()
vm:update_map()
local chugent = math.ceil((os.clock() - t1) * 1000)
print ("[watershed] "..chugent.." ms")
end
})
-- On generated function -- On generated function
minetest.register_on_generated(function(minp, maxp, seed) minetest.register_on_generated(function(minp, maxp, seed)
global_seed = seed
if minp.y < YMIN or maxp.y > YMAX then if minp.y < YMIN or maxp.y > YMAX then
return return
end end
@ -720,21 +741,42 @@ minetest.register_on_generated(function(minp, maxp, seed)
local x0 = minp.x local x0 = minp.x
local y0 = minp.y local y0 = minp.y
local z0 = minp.z local z0 = minp.z
print ("[watershed] generate mapchunk minp ("..x0.." "..y0.." "..z0..")") print ("[watershed] generate mapchunk minp (" .. x0 .. " " .. y0 .. " " .. z0 .. ")")
local vm, emin, emax = minetest.get_mapgen_object("voxelmanip") local vm, emin, emax = minetest.get_mapgen_object("voxelmanip")
local area = VoxelArea:new{MinEdge=emin, MaxEdge=emax} local area = VoxelArea:new{MinEdge = emin, MaxEdge = emax}
local data = vm:get_data() local data = vm:get_data()
watershed_chunkgen(x0, y0, z0, x1, y1, z1, area, data) watershed_chunkgen(x0, y0, z0, x1, y1, z1, area, data)
vm:set_data(data) vm:set_data(data)
minetest.generate_ores(vm, minp, maxp)
minetest.generate_decorations(vm, minp, maxp)
vm:set_lighting({day = 0, night = 0})
vm:calc_lighting() vm:calc_lighting()
vm:write_to_map(data) vm:write_to_map(data)
vm:update_liquids() vm:update_liquids()
local chugent = math.ceil((os.clock() - t1) * 1000) local chugent = math.ceil((os.clock() - t1) * 1000)
print ("[watershed] "..chugent.." ms") print ("[watershed] " .. chugent .. " ms")
end) end)
default.register_ores()
farming.register_mgv6_decorations()
-- cherry tree
minetest.register_decoration({
deco_type = "simple",
place_on = "default:dirt_with_grass",
sidelen = 16,
noise_params = {
offset = 0,
scale = 0.005,
spread = {x=100, y=100, z=100},
seed = 278,
octaves = 2,
persist = 0.7
},
decoration = "default:mg_cherry_sapling",
height = 1,
})

0
license.txt Normal file → Executable file
View File

672
nodes.lua Normal file → Executable file
View File

@ -1,647 +1,37 @@
minetest.register_node("watershed:appleleaf", { minetest.register_alias("watershed:appleleaf", "default:leaves")
description = "Appletree leaves", minetest.register_alias("watershed:appling", "default:sapling")
drawtype = "allfaces_optional", minetest.register_alias("watershed:acaciatree", "moretrees:acacia_trunk")
visual_scale = 1.3, minetest.register_alias("watershed:acacialeaf", "moretrees:acacia_leaves")
tiles = {"default_leaves.png"}, minetest.register_alias("watershed:acacialing", "moretrees:acacia_sapling")
paramtype = "light", minetest.register_alias("watershed:pinetree", "default:pine_tree")
is_ground_content = false, minetest.register_alias("watershed:needles", "default:pine_needles")
groups = {snappy=3, flammable=2, leaves=1}, minetest.register_alias("watershed:pineling", "default:pine_sapling")
drop = { minetest.register_alias("watershed:jungleleaf", "default:jungleleaves")
max_items = 1, minetest.register_alias("watershed:jungling", "default:junglesapling")
items = {
{items = {"watershed:appling"},rarity = 20},
{items = {"watershed:appleleaf"}}
}
},
sounds = default.node_sound_leaves_defaults(),
})
minetest.register_node("watershed:appling", { minetest.register_alias("watershed:dirt", "default:dirt")
description = "Appletree sapling", minetest.register_alias("watershed:icydirt", "default:dirt_with_grass")
drawtype = "plantlike", minetest.register_alias("watershed:grass", "default:dirt_with_grass")
visual_scale = 1.0, minetest.register_alias("watershed:redstone", "default:desert_stone")
tiles = {"default_sapling.png"}, minetest.register_alias("watershed:redcobble", "default:desert_cobble")
inventory_image = "default_sapling.png", minetest.register_alias("watershed:stone", "default:stone")
wield_image = "default_sapling.png", minetest.register_alias("watershed:cactus", "default:cactus")
paramtype = "light", minetest.register_alias("watershed:goldengrass", "default:dry_shrub")
walkable = false, minetest.register_alias("watershed:drygrass", "default:dirt_with_dry_grass")
is_ground_content = false, minetest.register_alias("watershed:permafrost", "default:dirt")
selection_box = { minetest.register_alias("watershed:freshice", "default:ice")
type = "fixed", minetest.register_alias("watershed:cloud", "default:cloud")
fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} minetest.register_alias("watershed:luxore", "default:stone")
}, minetest.register_alias("watershed:light", "lantern:lamp")
groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1}, minetest.register_alias("watershed:acaciawood", "moretrees:acacia_wood")
sounds = default.node_sound_leaves_defaults(), minetest.register_alias("watershed:pinewood", "default:pinewood")
})
minetest.register_node("watershed:acaciatree", { minetest.register_alias("watershed:freshwater", "default:river_water_source")
description = "Acacia tree", minetest.register_alias("watershed:freshwaterflow", "default:river_water_flowing")
tiles = {"watershed_acaciatreetop.png", "watershed_acaciatreetop.png", "watershed_acaciatree.png"}, minetest.register_alias("watershed:lava", "default:lava_source")
paramtype2 = "facedir", minetest.register_alias("watershed:lavaflow", "default:lava_flowing")
is_ground_content = false,
groups = {tree=1,choppy=2,oddly_breakable_by_hand=1,flammable=2},
sounds = default.node_sound_wood_defaults(),
on_place = minetest.rotate_node
})
minetest.register_node("watershed:acacialeaf", {
description = "Acacia leaves",
drawtype = "allfaces_optional",
visual_scale = 1.3,
tiles = {"watershed_acacialeaf.png"},
paramtype = "light",
is_ground_content = false,
groups = {snappy=3, flammable=2, leaves=1},
drop = {
max_items = 1,
items = {
{items = {"watershed:acacialing"},rarity = 20},
{items = {"watershed:acacialeaf"}}
}
},
sounds = default.node_sound_leaves_defaults(),
})
minetest.register_node("watershed:acacialing", {
description = "Acacia tree sapling",
drawtype = "plantlike",
visual_scale = 1.0,
tiles = {"watershed_acacialing.png"},
inventory_image = "watershed_acacialing.png",
wield_image = "watershed_acacialing.png",
paramtype = "light",
walkable = false,
is_ground_content = false,
selection_box = {
type = "fixed",
fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
},
groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1},
sounds = default.node_sound_leaves_defaults(),
})
minetest.register_node("watershed:pinetree", {
description = "Pine tree",
tiles = {"watershed_pinetreetop.png", "watershed_pinetreetop.png", "watershed_pinetree.png"},
paramtype2 = "facedir",
is_ground_content = false,
groups = {tree=1,choppy=2,oddly_breakable_by_hand=1,flammable=2},
sounds = default.node_sound_wood_defaults(),
on_place = minetest.rotate_node
})
minetest.register_node("watershed:needles", {
description = "Pine needles",
drawtype = "allfaces_optional",
visual_scale = 1.3,
tiles = {"watershed_needles.png"},
paramtype = "light",
is_ground_content = false,
groups = {snappy=3},
drop = {
max_items = 1,
items = {
{items = {"watershed:pineling"},rarity = 20},
{items = {"watershed:needles"}}
}
},
sounds = default.node_sound_leaves_defaults(),
})
minetest.register_node("watershed:pineling", {
description = "Pine sapling",
drawtype = "plantlike",
visual_scale = 1.0,
tiles = {"watershed_pineling.png"},
inventory_image = "watershed_pineling.png",
wield_image = "watershed_pineling.png",
paramtype = "light",
walkable = false,
is_ground_content = false,
selection_box = {
type = "fixed",
fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
},
groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1},
sounds = default.node_sound_leaves_defaults(),
})
minetest.register_node("watershed:jungleleaf", {
description = "Jungletree leaves",
drawtype = "allfaces_optional",
visual_scale = 1.3,
tiles = {"default_jungleleaves.png"},
paramtype = "light",
is_ground_content = false,
groups = {snappy=3, flammable=2, leaves=1},
drop = {
max_items = 1,
items = {
{items = {"watershed:jungling"},rarity = 20},
{items = {"watershed:jungleleaf"}}
}
},
sounds = default.node_sound_leaves_defaults(),
})
minetest.register_node("watershed:jungling", {
description = "Jungletree sapling",
drawtype = "plantlike",
visual_scale = 1.0,
tiles = {"default_junglesapling.png"},
inventory_image = "default_junglesapling.png",
wield_image = "default_junglesapling.png",
paramtype = "light",
walkable = false,
is_ground_content = false,
selection_box = {
type = "fixed",
fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
},
groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1},
sounds = default.node_sound_leaves_defaults(),
})
minetest.register_node("watershed:dirt", {
description = "Dirt",
tiles = {"default_dirt.png"},
is_ground_content = false,
groups = {crumbly=3,soil=1},
drop = "default:dirt",
sounds = default.node_sound_dirt_defaults(),
})
minetest.register_node("watershed:icydirt", {
description = "Icy dirt",
tiles = {"watershed_icydirt.png"},
is_ground_content = false,
groups = {crumbly=1},
drop = "default:dirt",
sounds = default.node_sound_dirt_defaults({
footstep = {name="default_snow_footstep", gain=0.15},
dug = {name="default_snow_footstep", gain=0.45},
}),
})
minetest.register_node("watershed:grass", {
description = "Grass",
tiles = {"default_grass.png", "default_dirt.png", "default_grass.png"},
is_ground_content = false,
groups = {crumbly=3,soil=1},
drop = "default:dirt",
sounds = default.node_sound_dirt_defaults({
footstep = {name="default_grass_footstep", gain=0.25},
}),
})
minetest.register_node("watershed:redstone", {
description = "Red stone",
tiles = {"default_desert_stone.png"},
is_ground_content = false,
groups = {cracky=3},
drop = "watershed:redcobble",
sounds = default.node_sound_stone_defaults(),
})
minetest.register_node("watershed:redcobble", {
description = "Red cobblestone",
tiles = {"watershed_redcobble.png"},
is_ground_content = false,
groups = {cracky=3, stone=2},
sounds = default.node_sound_stone_defaults(),
})
minetest.register_node("watershed:stone", {
description = "Stone",
tiles = {"default_stone.png"},
is_ground_content = false,
groups = {cracky=3},
drop = "default:cobble",
sounds = default.node_sound_stone_defaults(),
})
minetest.register_node("watershed:cactus", {
description = "Cactus",
tiles = {"default_cactus_top.png", "default_cactus_top.png", "default_cactus_side.png"},
paramtype2 = "facedir",
is_ground_content = false,
groups = {snappy=1,choppy=3,flammable=2},
drop = "default:cactus",
sounds = default.node_sound_wood_defaults(),
on_place = minetest.rotate_node
})
minetest.register_node("watershed:goldengrass", {
description = "Golden grass",
drawtype = "plantlike",
tiles = {"watershed_goldengrass.png"},
inventory_image = "watershed_goldengrass.png",
wield_image = "watershed_goldengrass.png",
paramtype = "light",
walkable = false,
buildable_to = true,
is_ground_content = false,
groups = {snappy=3,flammable=3,flora=1,attached_node=1},
sounds = default.node_sound_leaves_defaults(),
selection_box = {
type = "fixed",
fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
},
})
minetest.register_node("watershed:drygrass", {
description = "Dry grass",
tiles = {"watershed_drygrass.png"},
is_ground_content = false,
groups = {crumbly=1,soil=1},
drop = "default:dirt",
sounds = default.node_sound_dirt_defaults({
footstep = {name="default_grass_footstep", gain=0.4},
}),
})
minetest.register_node("watershed:permafrost", {
description = "Permafrost",
tiles = {"watershed_permafrost.png"},
is_ground_content = false,
groups = {crumbly=1},
drop = "default:dirt",
sounds = default.node_sound_dirt_defaults(),
})
minetest.register_node("watershed:vine", {
description = "Jungletree vine",
drawtype = "airlike",
paramtype = "light",
walkable = false,
climbable = true,
pointable = false,
diggable = false,
buildable_to = true,
is_ground_content = false,
groups = {not_in_creative_inventory=1},
})
minetest.register_node("watershed:freshice", {
description = "Fresh ice",
tiles = {"watershed_freshice.png"},
is_ground_content = false,
paramtype = "light",
groups = {cracky=3},
sounds = default.node_sound_glass_defaults(),
})
minetest.register_node("watershed:cloud", {
description = "Cloud",
drawtype = "glasslike",
tiles = {"watershed_cloud.png"},
paramtype = "light",
is_ground_content = false,
sunlight_propagates = true,
walkable = false,
pointable = false,
diggable = false,
buildable_to = true,
post_effect_color = {a=23, r=241, g=248, b=255},
})
minetest.register_node("watershed:luxore", {
description = "Lux ore",
tiles = {"watershed_luxore.png"},
paramtype = "light",
light_source = 14,
groups = {cracky=3},
drop = "watershed:luxcrystal 8",
sounds = default.node_sound_glass_defaults(),
})
minetest.register_node("watershed:light", {
description = "Light",
tiles = {"watershed_light.png"},
paramtype = "light",
light_source = 14,
groups = {cracky=3},
sounds = default.node_sound_glass_defaults(),
})
minetest.register_node("watershed:acaciawood", {
description = "Acacia wood planks",
tiles = {"watershed_acaciawood.png"},
groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1},
sounds = default.node_sound_wood_defaults(),
})
minetest.register_node("watershed:pinewood", {
description = "Pine wood planks",
tiles = {"watershed_pinewood.png"},
groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1},
sounds = default.node_sound_wood_defaults(),
})
minetest.register_node("watershed:freshwater", {
description = "Freshwater source",
inventory_image = minetest.inventorycube("watershed_freshwater.png"),
drawtype = "liquid",
tiles = {
{
name="watershed_freshwateranim.png",
animation={type="vertical_frames",
aspect_w=16, aspect_h=16, length=2.0}
}
},
special_tiles = {
{
name="watershed_freshwateranim.png",
animation={type="vertical_frames",
aspect_w=16, aspect_h=16, length=2.0},
backface_culling = false,
}
},
alpha = WATER_ALPHA,
paramtype = "light",
is_ground_content = false,
walkable = false,
pointable = false,
diggable = false,
buildable_to = true,
drop = "",
drowning = 1,
liquidtype = "source",
liquid_alternative_flowing = "watershed:freshwaterflow",
liquid_alternative_source = "watershed:freshwater",
liquid_viscosity = WATER_VISC,
liquid_renewable = false,
liquid_range = 2,
post_effect_color = {a=64, r=100, g=150, b=200},
groups = {water=3, liquid=3, puts_out_fire=1},
})
minetest.register_node("watershed:freshwaterflow", {
description = "Flowing freshwater",
inventory_image = minetest.inventorycube("watershed_freshwater.png"),
drawtype = "flowingliquid",
tiles = {"watershed_freshwater.png"},
special_tiles = {
{
image="watershed_freshwaterflowanim.png",
backface_culling=false,
animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=0.8}
},
{
image="watershed_freshwaterflowanim.png",
backface_culling=true,
animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=0.8}
},
},
alpha = WATER_ALPHA,
paramtype = "light",
paramtype2 = "flowingliquid",
is_ground_content = false,
walkable = false,
pointable = false,
diggable = false,
buildable_to = true,
drop = "",
drowning = 1,
liquidtype = "flowing",
liquid_alternative_flowing = "watershed:freshwaterflow",
liquid_alternative_source = "watershed:freshwater",
liquid_viscosity = WATER_VISC,
liquid_renewable = false,
liquid_range = 2,
post_effect_color = {a=64, r=100, g=150, b=200},
groups = {water=3, liquid=3, puts_out_fire=1, not_in_creative_inventory=1},
})
minetest.register_node("watershed:lava", {
description = "Lava source",
inventory_image = minetest.inventorycube("default_lava.png"),
drawtype = "liquid",
tiles = {
{name="default_lava_source_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}}
},
special_tiles = {
{
name="default_lava_source_animated.png",
animation={type="vertical_frames",
aspect_w=16, aspect_h=16, length=3.0},
backface_culling = false,
}
},
paramtype = "light",
light_source = 14,
is_ground_content = false,
walkable = false,
pointable = false,
diggable = false,
buildable_to = true,
drop = "",
drowning = 1,
liquidtype = "source",
liquid_alternative_flowing = "watershed:lavaflow",
liquid_alternative_source = "watershed:lava",
liquid_viscosity = LAVA_VISC,
liquid_renewable = false,
liquid_range = 2,
damage_per_second = 8,
post_effect_color = {a=192, r=255, g=64, b=0},
groups = {lava=3, liquid=2, hot=3, igniter=1},
})
minetest.register_node("watershed:lavaflow", {
description = "Flowing lava",
inventory_image = minetest.inventorycube("default_lava.png"),
drawtype = "flowingliquid",
tiles = {"default_lava.png"},
special_tiles = {
{
image="default_lava_flowing_animated.png",
backface_culling=false,
animation={type="vertical_frames",
aspect_w=16, aspect_h=16, length=3.3}
},
{
image="default_lava_flowing_animated.png",
backface_culling=true,
animation={type="vertical_frames",
aspect_w=16, aspect_h=16, length=3.3}
},
},
paramtype = "light",
paramtype2 = "flowingliquid",
light_source = 14,
is_ground_content = false,
walkable = false,
pointable = false,
diggable = false,
buildable_to = true,
drop = "",
drowning = 1,
liquidtype = "flowing",
liquid_alternative_flowing = "watershed:lavaflow",
liquid_alternative_source = "watershed:lava",
liquid_viscosity = LAVA_VISC,
liquid_renewable = false,
liquid_range = 2,
damage_per_second = 8,
post_effect_color = {a=192, r=255, g=64, b=0},
groups = {lava=3, liquid=2, hot=3, igniter=1, not_in_creative_inventory=1},
})
minetest.register_node("watershed:mixwater", {
description = "Mixed water source",
inventory_image = minetest.inventorycube("watershed_mixwater.png"),
drawtype = "liquid",
tiles = {
{
name="watershed_mixwateranim.png",
animation={type="vertical_frames",
aspect_w=16, aspect_h=16, length=2.0}
}
},
special_tiles = {
{
name="watershed_mixwateranim.png",
animation={type="vertical_frames",
aspect_w=16, aspect_h=16, length=2.0},
backface_culling = false,
}
},
alpha = WATER_ALPHA,
paramtype = "light",
is_ground_content = false,
walkable = false,
pointable = false,
diggable = false,
buildable_to = true,
drop = "",
drowning = 1,
liquidtype = "source",
liquid_alternative_flowing = "watershed:mixwaterflow",
liquid_alternative_source = "watershed:mixwater",
liquid_viscosity = WATER_VISC,
liquid_renewable = false,
liquid_range = 2,
post_effect_color = {a=64, r=100, g=120, b=200},
groups = {water=3, liquid=3, puts_out_fire=1},
})
minetest.register_node("watershed:mixwaterflow", {
description = "Flowing mixed water",
inventory_image = minetest.inventorycube("watershed_mixwater.png"),
drawtype = "flowingliquid",
tiles = {"watershed_mixwater.png"},
special_tiles = {
{
image="watershed_mixwaterflowanim.png",
backface_culling=false,
animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=0.8}
},
{
image="watershed_mixwaterflowanim.png",
backface_culling=true,
animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=0.8}
},
},
alpha = WATER_ALPHA,
paramtype = "light",
paramtype2 = "flowingliquid",
is_ground_content = false,
walkable = false,
pointable = false,
diggable = false,
buildable_to = true,
drop = "",
drowning = 1,
liquidtype = "flowing",
liquid_alternative_flowing = "watershed:mixwaterflow",
liquid_alternative_source = "watershed:mixwater",
liquid_viscosity = WATER_VISC,
liquid_renewable = false,
liquid_range = 2,
post_effect_color = {a=64, r=100, g=120, b=200},
groups = {water=3, liquid=3, puts_out_fire=1, not_in_creative_inventory=1},
})
-- Items -- Items
minetest.register_craftitem("watershed:luxcrystal", { minetest.register_alias("watershed:luxcrystal", "default:cobble")
description = "Lux crystal",
inventory_image = "watershed_luxcrystal.png",
})
-- Crafting
minetest.register_craft({
type = "cooking",
output = "default:desert_stone",
recipe = "watershed:redcobble",
})
minetest.register_craft({
output = "watershed:light 8",
recipe = {
{"default:glass", "default:glass", "default:glass"},
{"default:glass", "watershed:luxcrystal", "default:glass"},
{"default:glass", "default:glass", "default:glass"},
},
})
minetest.register_craft({
output = "watershed:acaciawood 4",
recipe = {
{"watershed:acaciatree"},
}
})
minetest.register_craft({
output = "watershed:pinewood 4",
recipe = {
{"watershed:pinetree"},
}
})
-- Buckets
bucket.register_liquid(
"watershed:freshwater",
"watershed:freshwaterflow",
"watershed:bucket_freshwater",
"watershed_bucketfreshwater.png",
"WS Fresh Water Bucket"
)
bucket.register_liquid(
"watershed:lava",
"watershed:lavaflow",
"watershed:bucket_lava",
"bucket_lava.png",
"WS Lava Bucket"
)
-- Fuel
minetest.register_craft({
type = "fuel",
recipe = "watershed:bucket_lava",
burntime = 60,
replacements = {{"watershed:bucket_lava", "bucket:bucket_empty"}},
})
-- Register stairs and slabs
stairs.register_stair_and_slab("acaciawood", "watershed:acaciawood",
{snappy=2,choppy=2,oddly_breakable_by_hand=2,flammable=3},
{"watershed_acaciawood.png"},
"Acaciawood stair",
"Acaciawood slab",
default.node_sound_wood_defaults())
stairs.register_stair_and_slab("pinewood", "watershed:pinewood",
{snappy=2,choppy=2,oddly_breakable_by_hand=2,flammable=3},
{"watershed_pinewood.png"},
"Pinewood stair",
"Pinewood slab",
default.node_sound_wood_defaults())

Binary file not shown.

Before

Width:  |  Height:  |  Size: 340 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 359 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 682 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 731 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 364 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 330 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 136 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 771 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 780 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 713 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 683 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 746 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 155 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 207 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 311 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 716 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 860 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 897 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 406 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 693 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 802 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 366 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 686 B