From d57c557eff70ca54c3d970d8f5b7c68c853f4b8e Mon Sep 17 00:00:00 2001 From: paramat Date: Sat, 25 Oct 2014 07:14:34 +0100 Subject: [PATCH] Simple boulders return. Compressed snow on paths. New snowypines. Add humidity from water distance. Re-add grass noise. Vary acaciatree height. 7 biomes --- README.txt | 2 +- functions.lua | 177 ++++++++++++++++++--------- init.lua | 183 +++++++++++++++++++--------- nodes.lua | 132 ++++++++++++++++++++ textures/riverdev_acacialeaf.png | Bin 0 -> 340 bytes textures/riverdev_acacialing.png | Bin 0 -> 359 bytes textures/riverdev_acaciatree.png | Bin 0 -> 682 bytes textures/riverdev_acaciatreetop.png | Bin 0 -> 731 bytes textures/riverdev_acaciawood.png | Bin 0 -> 364 bytes textures/riverdev_drygrass.png | Bin 0 -> 771 bytes textures/riverdev_goldengrass.png | Bin 0 -> 683 bytes textures/riverdev_icydirt.png | Bin 0 -> 746 bytes textures/riverdev_permafrost.png | Bin 0 -> 897 bytes 13 files changed, 375 insertions(+), 119 deletions(-) create mode 100644 textures/riverdev_acacialeaf.png create mode 100644 textures/riverdev_acacialing.png create mode 100644 textures/riverdev_acaciatree.png create mode 100644 textures/riverdev_acaciatreetop.png create mode 100644 textures/riverdev_acaciawood.png create mode 100644 textures/riverdev_drygrass.png create mode 100644 textures/riverdev_goldengrass.png create mode 100644 textures/riverdev_icydirt.png create mode 100644 textures/riverdev_permafrost.png diff --git a/README.txt b/README.txt index 3dfc4e8..090f7b5 100644 --- a/README.txt +++ b/README.txt @@ -1,4 +1,4 @@ -riverdev 0.5.6 by paramat +riverdev 0.5.7 by paramat For latest stable Minetest back to 0.4.8 Depends default Licenses: code WTFPL diff --git a/functions.lua b/functions.lua index 4f7ad21..7d35aef 100644 --- a/functions.lua +++ b/functions.lua @@ -89,61 +89,64 @@ function riverdev_snowypine(x, y, z, area, data) local c_snowblock = minetest.get_content_id("default:snowblock") for j = -4, 14 do if j == 3 or j == 6 or j == 9 or j == 12 then - for i = -2, 2 do for k = -2, 2 do - if math.abs(i) == 2 or math.abs(k) == 2 then - if math.random(7) ~= 2 then - local vil = area:index(x + i, y + j, z + k) - data[vil] = c_needles - local vila = area:index(x + i, y + j + 1, z + k) - data[vila] = c_snowblock + local vi = area:index(x - 2, y + j, z + k) + local via = area:index(x - 2, y + j + 1, z + k) + for i = -2, 2 do + if math.abs(i) == 1 and math.abs(k) == 1 then + data[vi] = c_pinetree + elseif math.abs(i) + math.abs(k) == 2 + or math.abs(i) + math.abs(k) == 3 then + data[vi] = c_needles + data[via] = c_snowblock end + vi = vi + 1 + via = via + 1 end end - end - elseif j == 4 or j == 7 or j == 10 then - for i = -1, 1 do + elseif j == 4 or j == 7 or j == 10 or j == 13 then for k = -1, 1 do - if not (i == 0 and j == 0) then - if math.random(11) ~= 2 then - local vil = area:index(x + i, y + j, z + k) - data[vil] = c_needles - local vila = area:index(x + i, y + j + 1, z + k) - data[vila] = c_snowblock + local vi = area:index(x - 1, y + j, z + k) + local via = area:index(x - 1, y + j + 1, z + k) + for i = -1, 1 do + if not (i == 0 and j == 0) then + data[vi] = c_needles + data[via] = c_snowblock end + vi = vi + 1 + via = via + 1 end end - end - elseif j == 13 then - for i = -1, 1 do + elseif j == 14 then for k = -1, 1 do - if not (i == 0 and j == 0) then - local vil = area:index(x + i, y + j, z + k) - data[vil] = c_needles - local vila = area:index(x + i, y + j + 1, z + k) - data[vila] = c_needles - local vilaa = area:index(x + i, y + j + 2, z + k) - data[vilaa] = c_snowblock + local vi = area:index(x - 1, y + j, z + k) + local via = area:index(x - 1, y + j + 1, z + k) + for i = -1, 1 do + if math.abs(i) + math.abs(k) == 1 then + data[vi] = c_needles + data[via] = c_snowblock + end + vi = vi + 1 + via = via + 1 end end - end end - local vit = area:index(x, y + j, z) - data[vit] = c_pinetree + local vi = area:index(x, y + j, z) + data[vi] = c_pinetree end - local vil = area:index(x, y + 15, z) - local vila = area:index(x, y + 16, z) - local vilaa = area:index(x, y + 17, z) - data[vil] = c_needles - data[vila] = c_needles - data[vilaa] = c_snowblock + local vi = area:index(x, y + 15, z) + local via = area:index(x, y + 16, z) + local viaa = area:index(x, y + 17, z) + data[vi] = c_needles + data[via] = c_needles + data[viaa] = c_snowblock end function riverdev_jungletree(x, y, z, area, data, y1) local c_juntree = minetest.get_content_id("default:jungletree") local c_junleaf = minetest.get_content_id("riverdev:jungleleaf") local c_vine = minetest.get_content_id("riverdev:vine") - local top = math.min(math.random(17,23), y1 +16 - y) -- avoid chopped trees + local top = math.random(13, math.min(y1 + 16 - y, 23)) -- avoid chopped trees local branch = math.floor(top * 0.6) for j = -5, top do if j == top or j == top - 1 or j == branch + 1 or j == branch + 2 then @@ -182,35 +185,70 @@ function riverdev_jungletree(x, y, z, area, data, y1) end end -function riverdev_boulder(x, y, z, area, data) - local np_boulder = { - offset = 0, - scale = 1, - spread = {x=16, y=16, z=16}, - seed = 5933, - octaves = 2, - persist = 0.67 - } - local chulens = {x=17, y=17, z=17} - local minpos = {x=x-8, y=y-8, z=z-8} - local nvals_boulder = minetest.get_perlin_map(np_boulder, chulens):get3dMap_flat(minpos) - local c_boulder - if math.random() < 0.2 then - c_boulder = minetest.get_content_id("default:sandstone") - else - c_boulder = minetest.get_content_id("riverdev:stone") +function riverdev_acaciatree(x, y, z, area, data) + local c_actree = minetest.get_content_id("riverdev:acaciatree") + local c_acleaf = minetest.get_content_id("riverdev:acacialeaf") + local top = 4 + math.random(3) + for j = -3, top do + if j == top 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 vi = area:index(x + i, y + j, z + k) + data[vi] = c_acleaf + end + end + end + end + elseif j == top - 1 then + for i = -2, 2, 4 do + for k = -2, 2, 4 do + local vi = area:index(x + i, y + j, z + k) + data[vi] = c_actree + end + end + elseif j == top - 2 then + for i = -1, 1 do + for k = -1, 1 do + if math.abs(i) + math.abs(k) == 2 then + local vi = area:index(x + i, y + j, z + k) + data[vi] = c_actree + end + end + end + else + local vi = area:index(x, y + j, z) + data[vi] = c_actree + end end - local avrad = 2 + math.random() * 3 - local ni = 1 +end + +function riverdev_cactus(x, y, z, area, data) + local c_cactus = minetest.get_content_id("riverdev:cactus") + for j = -2, 4 do + for i = -2, 2 do + if i == 0 or j == 2 or (j == 3 and math.abs(i) == 2) then + local vic = area:index(x + i, y + j, z) + data[vic] = c_cactus + end + end + end +end + +function riverdev_boulder(x, y, z, area, data) + local c_stone = minetest.get_content_id("riverdev:stone") + local dx = math.random() * 15 + 1 + local dy = math.random() * 15 + 1 + local dz = math.random() * 15 + 1 for k = -8, 8 do for j = -8, 8 do local vi = area:index(x-8, y+j, z+k) for i = -8, 8 do - if (i ^ 2 + j ^ 2 + k ^ 2) ^ 0.5 < avrad * (1 + nvals_boulder[ni] * 0.7) then - data[vi] = c_boulder + if (i ^ 2 * dx + j ^ 2 * dy + k ^ 2 * dz) ^ 0.5 < 8 then + data[vi] = c_stone end vi = vi + 1 - ni = ni + 1 end end end @@ -316,6 +354,29 @@ minetest.register_abm({ end, }) +-- Acacia sapling + +minetest.register_abm({ + nodenames = {"riverdev: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+7, 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() + riverdev_acaciatree(x, y, z, area, data) + vm:set_data(data) + vm:write_to_map() + vm:update_map() + end, +}) + -- Set mapgen parameters minetest.register_on_mapgen_init(function(mgparams) diff --git a/init.lua b/init.lua index 0108a94..b21f568 100644 --- a/init.lua +++ b/init.lua @@ -1,22 +1,20 @@ --- riverdev 0.5.6 by paramat +-- riverdev 0.5.7 by paramat -- For latest stable Minetest and back to 0.4.8 -- Depends default -- License: code WTFPL --- remove tunnel expansion --- add caves using 5 noises --- jungletrees auto-limit height to avoid chop --- add fissures --- 3d noise boulders, some sandstone +-- return to simple boulders +-- compressed snow on paths in taiga +-- update snowypines +-- add humidity noise from water distance +-- re-add long grasses noise +-- vary acaciatree height +-- add biomes -- TODO -- regeneration command: use of mapgen loop function --- update snowypines -- coloured stone: desertstone orange sandstone green blue violet -- inclined strata with 3d biomes of coloured stone mixes -- ores in strata --- add humidity from water distance --- add all watershed biomes --- gravel in tunnels/caves -- Parameters @@ -24,7 +22,7 @@ local YMIN = -33000 -- Y limits of realm generation local YMAX = 1024 local YWATER = 1 -- Water surface y local YSAND = 4 -- Top of beach y -local YTER = -92 -- Deepest seabed y +local YTER = -64 -- Deepest seabed y local YPINE = 47 -- Pines above this y local TERSCA = 512 -- Terrain vertical scale in nodes @@ -43,15 +41,21 @@ local TOBS = 0.025 -- Obsidian tube width local ORECHA = 1 / 5 ^ 3 -- Ore chance per stone node -- 1 / n ^ 3 where n = average distance between ores -local BOLCHA = 1 / 32 ^ 2 -- Boulder maximum chance per grass node. - -- 1 / n ^ 2 where n = average minimum distance between flora -local APPCHA = 1 / 5 ^ 2 -- Appletree maximum chance per grass node -local PINCHA = 1 / 6 ^ 2 -- Pinetree maximum chance per grass node -local JUNCHA = 1 / 4 ^ 2 -- Jungletree maximum chance per grass node -local GRACHA = 1 / 5 ^ 2 -- Grasses maximum chance per grass node -local FLOCHA = 1 / 61 ^ 2 -- Flower chance per grass node -local LOTET = -0.4 -- Low temperature threshold for taiga/snowyplains -local HITET = 0.4 -- High temperature threshold for Rainforest +local BOLCHA = 1 / 127 ^ 2 -- Boulder maximum chance per surface node + -- 1 / n ^ 2 where n = average distance between features +local APPCHA = 1 / 5 ^ 2 -- Appletree maximum chance per node +local PINCHA = 1 / 6 ^ 2 -- Pinetree maximum chance per node +local JUNCHA = 1 / 4 ^ 2 -- Jungletree maximum chance per node +local ACACHA = 1 / 47 ^ 2 -- Acaciatree maximum chance per node +local GRACHA = 1 / 4 ^ 2 -- Grasses maximum chance per node +local FLOCHA = 1 / 37 ^ 2 -- Flower chance per node +local CACCHA = 1 / 73 ^ 2 -- Cactus chance per node + +local LOTET = -0.4 -- Low temperature threshold +local HITET = 0.4 -- High +local LOHUT = -0.4 -- Low humidity threshold +local MIDHUT = 0 -- Mid +local HIHUT = 0.4 -- High -- 3D noise for highland terrain @@ -64,18 +68,18 @@ local np_terrain = { persist = 0.67 } --- 2D noise for mid terrain / river +-- 2D noise for mid terrain / river / humidity local np_mid = { offset = 0, scale = 1, - spread = {x=768, y=768, z=768}, + spread = {x=1536, y=1536, z=1536}, seed = 85546, - octaves = 5, + octaves = 6, persist = 0.4 } --- 2D noise for base terrain +-- 2D noise for base terrain / humidity local np_base = { offset = 0, @@ -115,7 +119,7 @@ local np_temp = { scale = 1, spread = {x=3072, y=3072, z=3072}, seed = 18882, - octaves = 4, + octaves = 3, persist = 0.4 } @@ -130,6 +134,17 @@ local np_tree = { persist = 0.6 } +-- 2D noise for grasses + +local np_grass = { + offset = 0, + scale = 1, + spread = {x=192, y=192, z=192}, + seed = -138, + octaves = 4, + persist = 0.7 +} + -- 3D noises for tunnels local np_weba = { @@ -204,7 +219,7 @@ local function riverdev_pathbrush(x, y, z, area, data, local c_stone = minetest.get_content_id("riverdev:stone") local c_path = minetest.get_content_id("riverdev:path") local c_wood = minetest.get_content_id("default:junglewood") - local c_ice = minetest.get_content_id("default:ice") + local c_snow = minetest.get_content_id("default:snow") if wood and math.random() < 0.2 then local vi = area:index(x, y-2, z) for j = y-2, y0-16, -1 do -- use mapblock shell @@ -226,8 +241,8 @@ local function riverdev_pathbrush(x, y, z, area, data, data[vi] = c_path end if data[via] ~= c_path and data[via] ~= c_wood - and under[si] == 3 then - data[via] = c_ice + and under[si] == 2 then + data[via] = c_snow end vi = vi + 1 via = via + 1 @@ -238,17 +253,34 @@ local function riverdev_pathbrush(x, y, z, area, data, end local function riverdev_surface(x, y, z, area, data, y1, vi, viu, - n_abspatha, n_abspathb, n_tree, n_grass, n_temp, under, si) + n_abspatha, n_abspathb, n_tree, n_grass, n_temp, n_humid, under, si) local c_grass = minetest.get_content_id("riverdev:grass") local c_grass5 = minetest.get_content_id("default:grass_5") local c_snowblock = minetest.get_content_id("default:snowblock") local c_jungrass = minetest.get_content_id("default:junglegrass") - if under[si] == 1 then -- sand - if math.random() < BOLCHA - and n_abspatha > TPFLO and n_abspathb > TPFLO then - riverdev_boulder(x, y, z, area, data) + local c_dryshrub = minetest.get_content_id("default:dry_shrub") + local c_drygrass = minetest.get_content_id("riverdev:drygrass") + local c_goldengrass = minetest.get_content_id("riverdev:goldengrass") + local c_icydirt = minetest.get_content_id("riverdev:icydirt") + if under[si] == 1 then -- tundra + data[viu] = c_icydirt + if math.random() < GRACHA * n_grass then + data[vi] = c_dryshrub end - elseif under[si] == 2 then -- forest/grassland + elseif under[si] == 2 then -- taiga + if math.random() < PINCHA * n_tree + and n_abspatha > TPFLO and n_abspathb > TPFLO then + riverdev_snowypine(x, y, z, area, data) + else + data[viu] = c_grass + data[vi] = c_snowblock + end + elseif under[si] == 3 then -- dry grassland + data[viu] = c_drygrass + if math.random() < GRACHA * n_grass then + data[vi] = c_dryshrub + end + elseif under[si] == 4 then -- forest/grassland if math.random() < BOLCHA and n_abspatha > TPFLO and n_abspathb > TPFLO then riverdev_boulder(x, y, z, area, data) @@ -266,15 +298,20 @@ local function riverdev_surface(x, y, z, area, data, y1, vi, viu, data[vi] = c_grass5 end end - elseif under[si] == 3 then -- taiga - if math.random() < PINCHA * n_tree - and n_abspatha > TPFLO and n_abspathb > TPFLO then - riverdev_snowypine(x, y, z, area, data) - else - data[viu] = c_grass - data[vi] = c_snowblock + elseif under[si] == 5 then -- desert + if math.random() < CACCHA * n_grass then + riverdev_cactus(x, y, z, area, data) end - elseif under[si] == 4 then -- rainforest + elseif under[si] == 6 then + if math.random() < ACACHA * n_tree then + riverdev_acaciatree(x, y, z, area, data) + else + data[viu] = c_drygrass + if math.random() < GRACHA * n_grass then + data[vi] = c_goldengrass + end + end + elseif under[si] == 7 then -- rainforest if math.random() < JUNCHA and n_abspatha > TPFLO / 2 and n_abspathb > TPFLO / 2 then riverdev_jungletree(x, y, z, area, data, y1) @@ -284,7 +321,12 @@ local function riverdev_surface(x, y, z, area, data, y1, vi, viu, data[vi] = c_jungrass end end - elseif under[si] == 5 and n_temp < LOTET then -- stone + elseif under[si] == 8 then -- sand + if math.random() < BOLCHA + and n_abspatha > TPFLO and n_abspathb > TPFLO then + riverdev_boulder(x, y, z, area, data) + end + elseif under[si] == 9 and n_temp < LOTET then -- stone data[vi] = c_snowblock end end @@ -321,6 +363,7 @@ minetest.register_on_generated(function(minp, maxp, seed) local c_obsidian = minetest.get_content_id("default:obsidian") local c_jungrass = minetest.get_content_id("default:junglegrass") local c_ice = minetest.get_content_id("default:ice") + local c_desand = minetest.get_content_id("default:desert_sand") local c_stodiam = minetest.get_content_id("default:stone_with_diamond") local c_stomese = minetest.get_content_id("default:stone_with_mese") local c_stogold = minetest.get_content_id("default:stone_with_gold") @@ -336,6 +379,7 @@ minetest.register_on_generated(function(minp, maxp, seed) local c_mixwater = minetest.get_content_id("riverdev:mixwater") local c_freshwaterflow = minetest.get_content_id("riverdev:freshwaterflow") local c_mixwaterflow = minetest.get_content_id("riverdev:mixwaterflow") + local c_permafrost = minetest.get_content_id("riverdev:permafrost") local sidelen = x1 - x0 + 1 -- mapgen chunk side length local overlen = sidelen + 1 -- perlinmap overgeneration horizontal side length @@ -360,6 +404,7 @@ minetest.register_on_generated(function(minp, maxp, seed) local nvals_pathb = minetest.get_perlin_map(np_pathb, chulensxz):get2dMap_flat(minposxz) local nvals_temp = minetest.get_perlin_map(np_temp, chulensxz):get2dMap_flat(minposxz) local nvals_tree = minetest.get_perlin_map(np_tree, chulensxz):get2dMap_flat(minposxz) + local nvals_grass = minetest.get_perlin_map(np_grass, chulensxz):get2dMap_flat(minposxz) --local noiset = math.ceil((os.clock() - t0) * 1000) --print ("[riverdev] noise "..noiset.." ms") @@ -383,10 +428,6 @@ minetest.register_on_generated(function(minp, maxp, seed) local nodidu = data[viu] local chunkxz = x >= x0 and z >= z0 - local n_temp = nvals_temp[nixz] - local n_tree = math.min(math.max(nvals_tree[nixz], 0), 1) - local n_grass = math.min(math.max(-nvals_tree[nixz], 0), 1) - local n_patha = nvals_patha[nixz] local n_abspatha = math.abs(n_patha) local n_zprepatha = nvals_patha[(nixz - overlen)] @@ -424,7 +465,11 @@ minetest.register_on_generated(function(minp, maxp, seed) local tobs = TOBS + (density + tstone) local n_strata = nvals_strata[nixyz] local densitystrata = grad + n_strata * 0.5 - + local n_humid = n_absbase - n_absmid + local n_temp = nvals_temp[nixz] + local n_tree = math.min(math.max(nvals_tree[nixz], 0), 1) + local n_grass = math.min(math.max(nvals_grass[nixz], 0), 1) + if chunkxz and y == y0 - 1 then -- overgeneration, initialise tables under[si] = 0 if ungen then -- guess by calculating density @@ -482,7 +527,7 @@ minetest.register_on_generated(function(minp, maxp, seed) data[vi] = c_stone -- stone end stable[si] = stable[si] + 1 - under[si] = 5 + under[si] = 9 elseif y > YSAND and ((not wood and density < 0 and under[si] ~= 0) or (wood and densitybase > trsand * 2 and densitybase < trsand * 2 + 0.002)) @@ -498,16 +543,34 @@ minetest.register_on_generated(function(minp, maxp, seed) and stable[si] >= 2 and nodid ~= c_stone then -- do not replace boulder if y <= YSAND or densitybase >= trsand then data[vi] = c_sand - under[si] = 1 - elseif n_temp < LOTET then -- taiga/snowyplains - data[vi] = c_dirt - under[si] = 3 - elseif n_temp > HITET then -- rainforest - data[vi] = c_dirt - under[si] = 4 + under[si] = 8 + elseif n_temp < LOTET then + if n_humid < MIDHUT then -- tundra + data[vi] = c_permafrost + under[si] = 1 + else -- taiga + data[vi] = c_dirt + under[si] = 2 + end + elseif n_temp > HITET then + if n_humid < LOHUT then -- desert + data[vi] = c_desand + under[si] = 5 + elseif n_humid > HIHUT then -- savanna + data[vi] = c_dirt + under[si] = 6 + else -- rainforest + data[vi] = c_dirt + under[si] = 7 + end else - data[vi] = c_dirt -- deciduous forest/grassland - under[si] = 2 + if n_humid < MIDHUT then -- drygrass + data[vi] = c_dirt + under[si] = 3 + else -- deciduous forest / grassland + data[vi] = c_dirt + under[si] = 4 + end end elseif y <= YWATER and density < tstone and nodid ~= c_stone then -- sea water data[vi] = c_water @@ -528,7 +591,7 @@ minetest.register_on_generated(function(minp, maxp, seed) and nodid ~= c_wood and nodidu ~= c_wood then riverdev_surface(x, y, z, area, data, y1, vi, viu, - n_abspatha, n_abspathb, n_tree, n_grass, n_temp, under, si) + n_abspatha, n_abspathb, n_tree, n_grass, n_temp, n_humid, under, si) stable[si] = 0 under[si] = 0 @@ -555,7 +618,7 @@ minetest.register_on_generated(function(minp, maxp, seed) and nodid ~= c_wood and nodidu ~= c_wood then riverdev_surface(x, y, z, area, data, y1, vi, viu, - n_abspatha, n_abspathb, n_tree, n_grass, n_temp, under, si) + n_abspatha, n_abspathb, n_tree, n_grass, n_temp, n_humid, under, si) end end diff --git a/nodes.lua b/nodes.lua index 2661f30..7a8af72 100644 --- a/nodes.lua +++ b/nodes.lua @@ -174,6 +174,121 @@ minetest.register_node("riverdev:jungling", { sounds = default.node_sound_leaves_defaults(), }) + +minetest.register_node("riverdev:acaciatree", { + description = "Acacia tree", + tiles = {"riverdev_acaciatreetop.png", "riverdev_acaciatreetop.png", "riverdev_acaciatree.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("riverdev:acacialeaf", { + description = "Acacia leaves", + drawtype = "allfaces_optional", + visual_scale = 1.3, + tiles = {"riverdev_acacialeaf.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy=3, flammable=2, leaves=1}, + drop = { + max_items = 1, + items = { + {items = {"riverdev:acacialing"},rarity = 20}, + {items = {"riverdev:acacialeaf"}} + } + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("riverdev:acacialing", { + description = "Acacia tree sapling", + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"riverdev_acacialing.png"}, + inventory_image = "riverdev_acacialing.png", + wield_image = "riverdev_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("riverdev:acaciawood", { + description = "Acacia wood planks", + tiles = {"riverdev_acaciawood.png"}, + groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("riverdev:goldengrass", { + description = "Golden grass", + drawtype = "plantlike", + tiles = {"riverdev_goldengrass.png"}, + inventory_image = "riverdev_goldengrass.png", + wield_image = "riverdev_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("riverdev:drygrass", { + description = "Dry grass", + tiles = {"riverdev_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("riverdev:icydirt", { + description = "Icy dirt", + tiles = {"riverdev_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("riverdev:permafrost", { + description = "Permafrost", + tiles = {"riverdev_permafrost.png"}, + is_ground_content = false, + groups = {crumbly=1}, + drop = "default:dirt", + sounds = default.node_sound_dirt_defaults(), +}) + +minetest.register_node("riverdev: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("riverdev:freshwater", { description = "Fresh Water Source", inventory_image = minetest.inventorycube("riverdev_freshwater.png"), @@ -333,6 +448,13 @@ minetest.register_craft({ } }) +minetest.register_craft({ + output = "riverdev:acaciawood 4", + recipe = { + {"riverdev:acaciatree"}, + } +}) + -- Register stairs and slabs stairs.register_stair_and_slab( @@ -345,3 +467,13 @@ stairs.register_stair_and_slab( default.node_sound_wood_defaults() ) +stairs.register_stair_and_slab( + "acaciawood", + "riverdev:acaciawood", + {snappy=2,choppy=2,oddly_breakable_by_hand=2,flammable=3}, + {"riverdev_acaciawood.png"}, + "Acaciawood stair", + "Acaciawood slab", + default.node_sound_wood_defaults() +) + diff --git a/textures/riverdev_acacialeaf.png b/textures/riverdev_acacialeaf.png new file mode 100644 index 0000000000000000000000000000000000000000..08cf3998c0c8d47ae63ddcf51878b725faec497e GIT binary patch literal 340 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPggK7CvSv7MGoE(}6-)JY5_^EKaYT zq$|{HAkZp5w`r}@W3A+()`T67MU&?&INtG?!?b|aN0qPlkkCfaxvjEY%GsaHZ~p!E z_O#UcjJZW$-cFEQzH*K7Gd=e}*AKQX63bWSx1V8iWhgj&bO&R@nG@-ecP)I6_ZLr3 zmJAkH6TB}~XH`e)9ZiOYlNGjEMROm_2y}Zas;e9j^6`Cdsh2V9%#VM6<+!Zj&n|JB z*ml6e*Gxm}b;YgaA^SgeEzw^mY*JUQ@ICYJ`Yzrsl~&#^x%0J7o*eJ?B(l$A{eC`g e>b@O5A6QpKmzL{@-S7eWkHOQ`&t;ucLK6V4LxIx( literal 0 HcmV?d00001 diff --git a/textures/riverdev_acacialing.png b/textures/riverdev_acacialing.png new file mode 100644 index 0000000000000000000000000000000000000000..07170a03d4c81eeb0916263ec90d2d4b72326908 GIT binary patch literal 359 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPq8#l9sI!}?%bfC}|PZ!4!i_^&o3#CHpIZX;h`|j0S*NUspZZe7`b&YyDy=YI~pCvE66Yh%O2Hyj^}xBl)wo9a@{D8{VP z%6Nu*;^(jbo~Nozn8tTO^k7Vbzp?TiU4Eb;)_C#QaYseSe5kLJ6g7?zz$d&nHSBmn4t22WQ%mvv4FO#s8{k+1*& literal 0 HcmV?d00001 diff --git a/textures/riverdev_acaciatree.png b/textures/riverdev_acaciatree.png new file mode 100644 index 0000000000000000000000000000000000000000..169823d41612d29e16c7faa44baae5d51b842de3 GIT binary patch literal 682 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 BUZMa1 literal 0 HcmV?d00001 diff --git a/textures/riverdev_goldengrass.png b/textures/riverdev_goldengrass.png new file mode 100644 index 0000000000000000000000000000000000000000..50f6a669c960bda5e09c6aafdaf8933268dcd40c GIT binary patch literal 683 zcmV;c0#yBpP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^n- z0y!a-y%1Ue00JvXL_t(I%XO2_Zqq;z#=jZc+qC)fL@gB#M-mCar6?p4>ZPcUQ>YMJ zk`^k2xFkK26wy9WY^V0_dWXZ-n}WpL#-sV>x8IBb0E<~)@K4OAsr;|j#PvlgyqNW6 zb8o}PtMdZ^0AqZg)($^DKMf*{;J1&5B0}K7cuBjhC@3DC+|uJIN->n;P$%+QyR8U= z@sfBk>q}mEf~t~0AlMSDGYtU9asv^sUseu_SzmZCUQ(wWqiJdgoC7Y;_T}aA4fVR} zuc=)-L$);_VF?QwI-{B!W^5y1q!oIggy>2JO8hP!JIY<0Z|f zsW1cU%t9$fYbSRvV z0?ntXtTT;PD~3uKW#yo?^+h6B>riaG5Hmv?hqAO#Du%VrZ(($LN919^?DI<3$O|2| z!OR#=RwN>!`SrWs#AW4hdA2Xj;lz>Oe;hH6PHu^aptVI=In1Z2GPx#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^n| z5g99aln_w>00L@BL_t(I%Pr4ImfJ=U0MV$qK#*ur{WPq6G#|q&-`3u=B=$g%1Zv1i zFXRiv`(gh6>rV~NFi?gF);VhJe0%fL^Td#u(t)isN)?uQ2H<^t(3>zs8KUHnS??92U{S@{fCzYJ5$U|GD@__xjEtc; z?@%?&hlDczUsa3&f65cq8ip}Ewu)%yIL+kfS+~mGDpO30dy7)T%NcE^y|Yp3+i(_vzcp3*wj!TEGzj6rP``|E8*We{9sNs&+UOcmvyAFn+2 z!q@YHah9!hwo+k0tDW0cu~@uf7;4!{AqI!Ra-1e|3^-%R!DB7h5!fDu);m>%(kopQ zJ0A{s4~G?5cpwy0Yj(=Y+%y}Z@#NsSPgrCP_+{+F+2tE+KWlD)hsa&^8lTMC_ zKnFQT za!g!r8(o#-l*lpBddIrVeJ}Jr2+?3;umlIedoYIMA+tUt<8 literal 0 HcmV?d00001 diff --git a/textures/riverdev_permafrost.png b/textures/riverdev_permafrost.png new file mode 100644 index 0000000000000000000000000000000000000000..086e1d8dc38e3718e35263b02c50db5a1b4f87c3 GIT binary patch literal 897 zcmV-{1AhF8P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i*(| z2rdo}{(^e|00RL@L_t(I%Po>iQ`=SmM$di7wk*r$RYO8}C4^_mq>q#`Nt;a;ndwXy zU3J;N+fD*WXs0bH1Snw3k_?uGEo5|W7xV|5#dp3VetiAPHm4@gN^M#WK1rxM;P>vK+lMH_O4{5n5@q(kP{f;x0$Wr#M>iXlVh@ zbIFDoe;xe8%ybi{`w}xoCF~KfHQr7v~>fjU^xDwAvv6)>@1)6sBNyW*R9a zI7F{4KjiS!30~D@bNw-6jXJLD@_zphCMPCI(*f!A0I%i|bV9tUi?x=y*?WwSHPAu` zj4`aOEYk`?ZVN+tJwOUc7{(Z5sCrc}27p!&qLe~An&XpGq_I#cmH73|9!WpN8Vf+9 z;nPd{Jl}bS?|ED%eR@fsFQ0x+mSvPn4y95F8AdUS3-grAWxCxf3R93I38PWL_OmaD z;x02YP3})O$+C=IuaE1xbUG1ADWtWQ!%rs+vl|TX_s2upL4>uIN~J;=U2^d8h~aQ} z2Zj+fuS&ZUQ4|F_in~ZDsgz4R+1kL-iue0}l3u5@S^>u1Z9ltc|L<84ia$US48rbDccTab1_qja9@iKmTMK zzDJUzjE&VfJG;Ola9x+66C#8_N{OQtNk3(BVjN>(WqFYxjL`tS{xxCLCFq3I{TjwX z>;FQL^6oYzdAqldTPf2DLf-6t;L*|oQVBsA##n1vUtc9j2jrt$wl-JsY98&NgE0nc zEseU*%E~g|KmUfBS0(6#cM{!7nZj7Cu{_;cqcE1;cfa42=4iq&ChlJ1C_$cOq=Nz9 zZhy`0-Usw|FLoG>MucI^(eWuYuS&Byg%E;X(g#3ELA6@t;nF;(XBS8*iQ+5n-<#n- Xz}kFTciJ;M00000NkvXXu0mjfcFv7^ literal 0 HcmV?d00001