Version MFF.
							
								
								
									
										8
									
								
								README.txt
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						| @@ -1,4 +1,4 @@ | ||||
| watershed 0.6.6 by paramat | ||||
| For latest stable Minetest back to 0.4.8 | ||||
| Depends default stairs bucket | ||||
| Licenses: code WTFPL, textures CC BY-SA | ||||
| watershed 0.7.1 by paramat, modified by the MinetestForFun Team. | ||||
| For Minetest 0.4.13 and later | ||||
| Depends default farming darkage | ||||
| Licenses: WTFPL | ||||
|   | ||||
							
								
								
									
										4
									
								
								depends.txt
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						| @@ -1,3 +1,3 @@ | ||||
| default | ||||
| bucket | ||||
| stairs | ||||
| farming | ||||
| darkage | ||||
|   | ||||
							
								
								
									
										363
									
								
								functions.lua
									
									
									
									
									
										
										
										Normal file → Executable 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) | ||||
| 	local c_tree = minetest.get_content_id("default:tree") | ||||
| 	local c_apple = minetest.get_content_id("default:apple") | ||||
| 	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 k = -2, 2 do | ||||
| 				local vil = area:index(x + i, y + j, z + k) | ||||
| 				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 | ||||
| 					data[vil] = c_wsappleaf | ||||
| 					-- MFF: Prevent trees from destroying existing blocks | ||||
| 					safely_set_block(data, vil, c_wsappleaf) | ||||
| 				end | ||||
| 			end | ||||
| 			end | ||||
| 		elseif j == 2 then | ||||
| 		elseif j == branches_height 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_tree | ||||
| 					-- MFF: Prevent trees from destroying existing blocks | ||||
| 					safely_set_block(data, vit, c_tree) | ||||
| 				end | ||||
| 			end | ||||
| 			end | ||||
| 		else | ||||
| 			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 | ||||
| @@ -34,16 +63,17 @@ function watershed_pinetree(x, y, z, area, data) | ||||
| 	local c_wspitree = minetest.get_content_id("watershed:pinetree") | ||||
| 	local c_wsneedles = minetest.get_content_id("watershed:needles") | ||||
| 	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 | ||||
| 			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 | ||||
| 						-- MFF: Prevent trees from destroying existing blocks | ||||
| 						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) | ||||
| 						data[vila] = c_snowblock | ||||
| 						safely_set_block(data, vila, c_snowblock) | ||||
| 					end | ||||
| 				end | ||||
| 			end | ||||
| @@ -53,10 +83,11 @@ function watershed_pinetree(x, y, z, area, data) | ||||
| 			for k = -1, 1 do | ||||
| 				if not (i == 0 and j == 0) then | ||||
| 					if math.random(11) ~= 2 then | ||||
| 						-- MFF: Prevent trees from destroying existing blocks | ||||
| 						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) | ||||
| 						data[vila] = c_snowblock | ||||
| 						safely_set_block(data, vila, c_snowblock) | ||||
| 					end | ||||
| 				end | ||||
| 			end | ||||
| @@ -65,40 +96,47 @@ function watershed_pinetree(x, y, z, area, data) | ||||
| 			for i = -1, 1 do | ||||
| 			for k = -1, 1 do | ||||
| 				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) | ||||
| 					data[vil] = c_wsneedles | ||||
| 					safely_set_block(data, vil,c_wsneedles) | ||||
| 					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) | ||||
| 					data[vilaa] = c_snowblock | ||||
| 					safely_set_block(data, vilaa, c_snowblock) | ||||
| 				end | ||||
| 			end | ||||
| 			end | ||||
| 		end | ||||
| 		-- MFF: Prevent trees from destroying existing blocks | ||||
| 		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 | ||||
| 	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_wsneedles | ||||
| 	data[vila] = c_wsneedles | ||||
| 	data[vilaa] = c_snowblock | ||||
| 	-- MFF: Prevent trees from destroying existing blocks | ||||
| 	safely_set_block(data, vil, c_wsneedles) | ||||
| 	safely_set_block(data, vila, c_wsneedles) | ||||
| 	safely_set_block(data, vilaa, c_snowblock) | ||||
| end | ||||
|  | ||||
| function watershed_jungletree(x, y, z, area, data) | ||||
| 	local c_juntree = minetest.get_content_id("default:jungletree") | ||||
| 	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 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 | ||||
| 			for i = -2, 2 do -- leaves | ||||
| 			for k = -2, 2 do | ||||
| 				local vi = area:index(x + i, y + j, z + k) | ||||
| 				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 | ||||
| @@ -107,64 +145,28 @@ function watershed_jungletree(x, y, z, area, data) | ||||
| 			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_juntree | ||||
| 				end | ||||
| 			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 | ||||
| 					-- MFF: Prevent trees from destroying existing blocks | ||||
| 					safely_set_block(data, vi, c_juntree) | ||||
| 				end | ||||
| 			end | ||||
| 			end | ||||
| 		end | ||||
| 		if j <= top - 3 then -- trunk | ||||
| 			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 | ||||
|  | ||||
| function watershed_acaciatree(x, y, z, area, data) | ||||
| 	local c_wsactree = minetest.get_content_id("watershed:acaciatree") | ||||
| 	local c_wsacleaf = minetest.get_content_id("watershed:acacialeaf") | ||||
| 	for j = -3, 6 do | ||||
| 		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 | ||||
| 	local c_sapling = minetest.get_content_id("moretrees:acacia_sapling_ongen") | ||||
| 	local vi = area:index(x, y, z) | ||||
| 	data[vi] = c_sapling | ||||
| end | ||||
|  | ||||
| function watershed_flower(data, vi, noise) | ||||
| @@ -191,7 +193,7 @@ end | ||||
|  | ||||
| function watershed_cactus(x, y, z, area, data) | ||||
| 	local c_wscactus = minetest.get_content_id("watershed:cactus") | ||||
| 	for j = -2, 4 do | ||||
| 	for j = 0, 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) | ||||
| @@ -217,194 +219,38 @@ local SINGLENODE = true | ||||
| if SINGLENODE then | ||||
| 	-- Set mapgen parameters | ||||
|  | ||||
| 	minetest.register_on_mapgen_init(function(mgparams) | ||||
| 		minetest.set_mapgen_params({mgname="singlenode", flags="nolight"}) | ||||
| 	end) | ||||
| 	minetest.set_mapgen_params({mgname="singlenode", flags="nolight"}) | ||||
|  | ||||
| 	-- Spawn player function. Requires chunksize = 80 nodes (the default) | ||||
|  | ||||
| 	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) | ||||
| 	-- Spawn player function is useless in minetestforfun | ||||
| 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 | ||||
|  | ||||
| minetest.register_abm({ | ||||
| 	nodenames = {"watershed:appling"}, | ||||
| 	interval = 57, | ||||
| 	chance = 3, | ||||
| 	action = function(pos, node) | ||||
| 	function default.grow_tree(pos) | ||||
| 		local x = pos.x | ||||
| 		local y = pos.y | ||||
| 		local z = pos.z | ||||
| 		local vm = minetest.get_voxel_manip() | ||||
| 		local pos1 = {x=x-2, y=y-2, z=z-2} | ||||
| 		local pos2 = {x=x+2, y=y+4, 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 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() | ||||
| 		watershed_appletree(x, y, z, area, data) | ||||
| 		vm:set_data(data) | ||||
| 		vm:write_to_map() | ||||
| 		vm:update_map() | ||||
| 	end, | ||||
| }) | ||||
| 	end | ||||
|  | ||||
| -- Pine sapling | ||||
|  | ||||
| minetest.register_abm({ | ||||
| 	nodenames = {"watershed:pineling"}, | ||||
| 	interval = 59, | ||||
| 	chance = 3, | ||||
| 	action = function(pos, node) | ||||
| 	function default.grow_pine_tree(pos) | ||||
| 		local x = pos.x | ||||
| 		local y = pos.y | ||||
| 		local z = pos.z | ||||
| 		local vm = minetest.get_voxel_manip() | ||||
| 		local pos1 = {x=x-2, y=y-4, z=z-2} | ||||
| 		local pos2 = {x=x+2, y=y+17, 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 emin, emax = vm:read_from_map(pos1, pos2) | ||||
| 		local area = VoxelArea:new({MinEdge=emin, MaxEdge=emax}) | ||||
| 		local data = vm:get_data() | ||||
| @@ -412,51 +258,28 @@ minetest.register_abm({ | ||||
| 		vm:set_data(data) | ||||
| 		vm:write_to_map() | ||||
| 		vm:update_map() | ||||
| 	end, | ||||
| }) | ||||
| 	end | ||||
|  | ||||
| -- Acacia sapling | ||||
|  | ||||
| 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, | ||||
| }) | ||||
| -- Acacia sapling is already defined in Moretrees | ||||
|  | ||||
| -- Jungletree sapling | ||||
|  | ||||
| minetest.register_abm({ | ||||
| 	nodenames = {"watershed:jungling"}, | ||||
| 	interval = 63, | ||||
| 	chance = 3, | ||||
| 	action = function(pos, node) | ||||
| 	function default.grow_jungle_tree(pos) | ||||
| 		local x = pos.x | ||||
| 		local y = pos.y | ||||
| 		local z = pos.z | ||||
| 		local vm = minetest.get_voxel_manip() | ||||
| 		local pos1 = {x=x-2, y=y-5, z=z-2} | ||||
| 		local pos2 = {x=x+2, y=y+23, 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 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() | ||||
| 		watershed_jungletree(x, y, z, area, data) | ||||
| 		vm:set_data(data) | ||||
| 		vm:write_to_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
									
								
							
							
						
						| @@ -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 | ||||
|  | ||||
| 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 MIDAMP = 0.1 -- Mid terrain 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 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 TSTREAM = -0.004 -- Densitymid threshold for stream surface | ||||
| 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 TSEAM = 0.2 -- Seam threshold, width of seams | ||||
| 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 TFOG = -0.04 -- Fog top densitymid threshold | ||||
|  | ||||
| local HITET = 0.35 -- High temperature threshold | ||||
| local LOTET = -0.35 -- Low .. | ||||
| local ICETET = -0.7 -- Ice .. | ||||
| local HIHUT = 0.35 -- High humidity threshold | ||||
| local LOHUT = -0.35 -- Low .. | ||||
| local FOGHUT = 1.0 -- Fog .. | ||||
| local BLEND = 0.02 -- Biome blend randomness | ||||
| local biomeparams = { | ||||
| 	HITET = 0.35, -- High temperature threshold | ||||
| 	LOTET = -0.35, -- Low .. | ||||
| 	ICETET = -0.7, -- Ice .. | ||||
| 	HIHUT = 0.35, -- High humidity threshold | ||||
| 	LOHUT = -0.35, -- Low .. | ||||
| 	BLEND = 0.02, -- Biome blend randomness | ||||
| } | ||||
|  | ||||
| local flora = { | ||||
| 	PINCHA = 36, -- Pine tree 1/x chance per node | ||||
| @@ -52,132 +48,178 @@ local flora = { | ||||
| 	GRACHA = 36, -- Grassland grasses | ||||
| 	JUTCHA = 16, -- Jungletree | ||||
| 	JUGCHA = 16, -- Junglegrass | ||||
| 	CACCHA = 2209, -- Cactus | ||||
| 	DRYCHA = 121, -- Dry shrub | ||||
| 	CACCHA = 800, -- Cactus | ||||
| 	CACCHA_DRYGRASS = 1600, | ||||
| 	DRYCHA = 150, -- Dry shrub | ||||
| 	ACACHA = 1369, -- Acacia tree | ||||
| 	GOGCHA = 9, -- Golden grass | ||||
| 	PAPCHA = 4, -- Papyrus | ||||
| 	DUGCHA = 16, -- Dune grass | ||||
| } | ||||
|  | ||||
| local np = { | ||||
| -- pack it in a single table to avoid "function has more than 60 upvalues" | ||||
|  | ||||
| -- 3D noises | ||||
|  | ||||
| -- 3D noise for terrain | ||||
|  | ||||
| local np_terrain = { | ||||
| terrain = { | ||||
| 	offset = 0, | ||||
| 	scale = 1, | ||||
| 	spread = {x=384, y=192, z=384}, | ||||
| 	spread = {x = 384, y = 192, z = 384}, | ||||
| 	seed = 593, | ||||
| 	octaves = 5, | ||||
| 	persist = 0.67 | ||||
| } | ||||
| }, | ||||
|  | ||||
| -- 3D noise for fissures | ||||
|  | ||||
| local np_fissure = { | ||||
| fissure = { | ||||
| 	offset = 0, | ||||
| 	scale = 1, | ||||
| 	spread = {x=256, y=512, z=256}, | ||||
| 	spread = {x = 256, y = 512, z = 256}, | ||||
| 	seed = 20099, | ||||
| 	octaves = 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 | ||||
|  | ||||
| local np_seam = { | ||||
| seam = { | ||||
| 	offset = 0, | ||||
| 	scale = 1, | ||||
| 	spread = {x=512, y=512, z=512}, | ||||
| 	spread = {x = 512, y = 512, z = 512}, | ||||
| 	seed = -992221, | ||||
| 	octaves = 2, | ||||
| 	persist = 0.5 | ||||
| } | ||||
| }, | ||||
|  | ||||
| -- 3D noise for rock strata inclination | ||||
|  | ||||
| local np_strata = { | ||||
| strata = { | ||||
| 	offset = 0, | ||||
| 	scale = 1, | ||||
| 	spread = {x=512, y=512, z=512}, | ||||
| 	spread = {x = 512, y = 512, z = 512}, | ||||
| 	seed = 92219, | ||||
| 	octaves = 3, | ||||
| 	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 noise for mid terrain / streambed height | ||||
|  | ||||
| local np_mid = { | ||||
| mid = { | ||||
| 	offset = 0, | ||||
| 	scale = 1, | ||||
| 	spread = {x=768, y=768, z=768}, | ||||
| 	spread = {x = 768, y = 768, z = 768}, | ||||
| 	seed = 85546, | ||||
| 	octaves = 5, | ||||
| 	persist = 0.5 | ||||
| } | ||||
| }, | ||||
|  | ||||
| -- 2D noise for base terrain / riverbed height | ||||
|  | ||||
| local np_base = { | ||||
| base = { | ||||
| 	offset = 0, | ||||
| 	scale = 1, | ||||
| 	spread = {x=4096, y=4096, z=4096}, | ||||
| 	spread = {x = 1024, y = 1024, z = 1024}, | ||||
| 	seed = 8890, | ||||
| 	octaves = 3, | ||||
| 	persist = 0.33 | ||||
| } | ||||
| }, | ||||
|  | ||||
| -- 2D noise for extra large scale height variation | ||||
|  | ||||
| local np_xlscale = { | ||||
| xlscale = { | ||||
| 	offset = 0, | ||||
| 	scale = 1, | ||||
| 	spread = {x=8192, y=8192, z=8192}, | ||||
| 	spread = {x = 4096, y = 4096, z = 4096}, | ||||
| 	seed = -72, | ||||
| 	octaves = 3, | ||||
| 	persist = 0.33 | ||||
| } | ||||
| }, | ||||
|  | ||||
| -- 2D noise for magma surface | ||||
|  | ||||
| local np_magma = { | ||||
| magma = { | ||||
| 	offset = 0, | ||||
| 	scale = 1, | ||||
| 	spread = {x=128, y=128, z=128}, | ||||
| 	spread = {x = 128, y = 128, z = 128}, | ||||
| 	seed = -13, | ||||
| 	octaves = 2, | ||||
| 	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_fissure = nil | ||||
| @@ -186,17 +228,40 @@ local nobj_humid   = nil | ||||
| local nobj_seam    = 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_base    = nil | ||||
| local nobj_xlscale = 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 | ||||
|  | ||||
| local global_seed | ||||
| function watershed_chunkgen(x0, y0, z0, x1, y1, z1, area, data) | ||||
| 	local c_air = minetest.get_content_id("air") | ||||
| 	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_grass5 = minetest.get_content_id("default:grass_5") | ||||
| 	local c_obsidian = minetest.get_content_id("default:obsidian") | ||||
| 	 | ||||
|  | ||||
| 	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_wsredstone = minetest.get_content_id("watershed:redstone") | ||||
| 	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_wslava = minetest.get_content_id("watershed:lava") | ||||
| 	local c_wsfreshice = minetest.get_content_id("watershed:freshice") | ||||
| 	local c_wscloud = minetest.get_content_id("watershed:cloud") | ||||
| 	local c_wsluxore = minetest.get_content_id("watershed:luxore") | ||||
| 	local c_wscloud = minetest.get_content_id("air") -- disable clouds | ||||
| 	local c_wsicydirt = minetest.get_content_id("watershed:icydirt") | ||||
|  | ||||
| 	-- perlinmap stuff | ||||
| 	local sidelen = x1 - x0 + 1 -- chunk sidelength | ||||
| 	local chulensxyz = {x=sidelen, y=sidelen+2, z=sidelen} -- chunk dimensions, '+2' for overgeneration | ||||
| 	local chulensxz = {x=sidelen, y=sidelen, z=1} -- here x = map x, y = map z | ||||
| 	local minposxyz = {x=x0, y=y0-1, z=z0} | ||||
| 	local minposxz = {x=x0, y=z0} -- here x = map x, y = map z | ||||
| 	local sidelen = x1 - x0 + 1 | ||||
| 	local sqr_sidelen = sidelen ^ 2 | ||||
| 	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} | ||||
|  | ||||
| 	-- 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_fissure = nobj_fissure or minetest.get_perlin_map(np_fissure, 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_seam    = nobj_seam    or minetest.get_perlin_map(np_seam, 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_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) | ||||
| 	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_temp    = nobj_temp    or minetest.get_perlin_map(np.temp, 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_strata  = nobj_strata  or minetest.get_perlin_map(np.strata, chulensxyz) | ||||
|  | ||||
| 	nobj_cave1   = nobj_cave1  or minetest.get_perlin_map(np.cave1, chulensxyz) | ||||
| 	nobj_cave2   = nobj_cave2  or minetest.get_perlin_map(np.cave2, chulensxyz) | ||||
| 	nobj_cave3   = nobj_cave3  or minetest.get_perlin_map(np.cave3, chulensxyz) | ||||
| 	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 | ||||
| 	local nvals_terrain = nobj_terrain:get3dMap_flat(minposxyz) | ||||
| 	local nvals_fissure = nobj_fissure:get3dMap_flat(minposxyz) | ||||
| 	local nvals_temp    = nobj_temp:get3dMap_flat(minposxyz) | ||||
| 	local nvals_humid   = nobj_humid:get3dMap_flat(minposxyz) | ||||
| 	local nvals_seam    = nobj_seam:get3dMap_flat(minposxyz) | ||||
| 	local nvals_strata  = nobj_strata:get3dMap_flat(minposxyz) | ||||
| 	 | ||||
| 	local nvals_mid     = nobj_mid:get2dMap_flat(minposxz) | ||||
| 	local nvals_base    = nobj_base:get2dMap_flat(minposxz) | ||||
| 	local nvals_temp    = nobj_temp   :get2dMap_flat(minposxz) | ||||
| 	local nvals_humid   = nobj_humid  :get2dMap_flat(minposxz) | ||||
| 	local nvals_seam    = nobj_seam   :get3dMap_flat(minposxyz) | ||||
| 	local nvals_strata  = nobj_strata :get3dMap_flat(minposxyz) | ||||
|  | ||||
| 	local nvals_cave1   = nobj_cave1  :get3dMap_flat(minposxyz) | ||||
| 	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_magma   = nobj_magma:get2dMap_flat(minposxz) | ||||
| 	local nvals_magma   = nobj_magma  :get2dMap_flat(minposxz) | ||||
|  | ||||
| 	-- 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 | ||||
|  | ||||
| 	-- mapgen loop | ||||
| 	local nixyz = 1 -- 3D and 2D perlinmap indexes | ||||
| 	local nixz = 1 | ||||
| 	local stable = {} -- stability table of true/false. is node supported from below by 2 stone or nodes on 2 stone? | ||||
| 	local under = {} -- biome table. biome number of previous fine material placed in column | ||||
| 	for z = z0, z1 do -- for each xy plane progressing northwards | ||||
| 		for y = y0 - 1, y1 + 1 do -- for each x row progressing upwards | ||||
| 			local vi = area:index(x0, y, z) -- voxelmanip index for first node in this x row | ||||
| 			local viu = area:index(x0, y-1, z) -- index for under node | ||||
| 			for x = x0, x1 do -- for each node do | ||||
| 	local stable = {} -- stability table of true/false. | ||||
| 					-- is node supported from below by 2 stone or nodes on 2 stone? | ||||
| 	local under = {} -- biome table. | ||||
| 					-- biome number of previous fine material placed in column | ||||
| 	for z = z0, z1 do | ||||
| 		for y = y0 - 1, y1 + 1 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 | ||||
| 				-- noise values for node | ||||
| 				local n_absterrain = math.abs(nvals_terrain[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_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_absbase = math.abs(nvals_base[nixz]) | ||||
| 				local n_xlscale = nvals_xlscale[nixz] | ||||
| 				local n_magma = nvals_magma[nixz] | ||||
| 				local n_temp = nvals_temp[nixz] | ||||
| 				local n_humid = nvals_humid[nixz] | ||||
| 				-- get densities | ||||
| 				local n_invbase = (1 - n_absbase) | ||||
| 				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 ysand = YSAV + n_fissure * SAMP + math.random() * 2 -- sandline | ||||
| 				local bergdep = math.abs(n_seam) * BERGDEP -- iceberg depth | ||||
| 				 | ||||
|  | ||||
| 				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 | ||||
| 				end | ||||
| 				 | ||||
|  | ||||
| 				local biome = false -- select biome for node | ||||
| 				if n_temp < LOTET + (math.random() - 0.5) * BLEND then | ||||
| 					if n_humid < LOHUT + (math.random() - 0.5) * BLEND then | ||||
| 				if n_temp < biomeparams.LOTET + | ||||
| 						(math.random() - 0.5) * biomeparams.BLEND then | ||||
| 					if n_humid < biomeparams.LOHUT + | ||||
| 							(math.random() - 0.5) * biomeparams.BLEND then | ||||
| 						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 | ||||
| 					else | ||||
| 						biome = 2 -- snowy plains | ||||
| 					end | ||||
| 				elseif n_temp > HITET + (math.random() - 0.5) * BLEND then | ||||
| 					if n_humid < LOHUT + (math.random() - 0.5) * BLEND then | ||||
| 				elseif n_temp > biomeparams.HITET + | ||||
| 						(math.random() - 0.5) * biomeparams.BLEND then | ||||
| 					if n_humid < biomeparams.LOHUT + | ||||
| 							(math.random() - 0.5) * biomeparams.BLEND then | ||||
| 						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 | ||||
| 					else | ||||
| 						biome = 8 -- savanna | ||||
| 					end | ||||
| 				else | ||||
| 					if n_humid < LOHUT then | ||||
| 					if n_humid < biomeparams.LOHUT then | ||||
| 						biome = 4 -- dry grassland | ||||
| 					elseif n_humid > HIHUT then | ||||
| 					elseif n_humid > biomeparams.HIHUT then | ||||
| 						biome = 6 -- deciduous forest | ||||
| 					else | ||||
| 						biome = 5 -- grassland | ||||
| 					end | ||||
| 				end | ||||
| 				 | ||||
|  | ||||
| 				-- overgeneration and in-chunk generation | ||||
| 				if y == y0 - 1 then -- node layer below chunk, initialise tables | ||||
| 					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 | ||||
| 						local nodid = data[vi] | ||||
| 						if nodid == c_wsstone | ||||
| 						or nodid == c_wsredstone | ||||
| 						or nodid == c_wsdirt | ||||
| 						or nodid == c_wspermafrost | ||||
| 						or nodid == c_wsluxore | ||||
| 						or nodid == c_sand | ||||
| 						or nodid == c_desand | ||||
| 						or nodid == c_mese | ||||
| 						or nodid == c_stodiam | ||||
| 						or nodid == c_stogold | ||||
| 						or nodid == c_stocopp | ||||
| 						or nodid == c_stoiron | ||||
| 						or nodid == c_stocoal | ||||
| 						or nodid == c_sandstone | ||||
| 						or nodid == c_gravel | ||||
| 						or nodid == c_clay | ||||
| 						or nodid == c_obsidian then | ||||
| 								or nodid == c_wsredstone | ||||
| 								or nodid == c_wsdirt | ||||
| 								or nodid == c_wspermafrost | ||||
| 								or nodid == c_sand | ||||
| 								or nodid == c_desand | ||||
| 								or nodid == c_mese | ||||
| 								or nodid == c_stodiam | ||||
| 								or nodid == c_stogold | ||||
| 								or nodid == c_stocopp | ||||
| 								or nodid == c_stoiron | ||||
| 								or nodid == c_stocoal | ||||
| 								or nodid == c_sandstone | ||||
| 								or nodid == c_gravel | ||||
| 								or nodid == c_clay | ||||
| 								or nodid == c_obsidian then | ||||
| 							stable[si] = 2 | ||||
| 						else | ||||
| 							stable[si] = 0 | ||||
| @@ -390,57 +480,41 @@ function watershed_chunkgen(x0, y0, z0, x1, y1, z1, area, data) | ||||
| 						stable[si] = 0 | ||||
| 						under[si] = 0 | ||||
| 					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 | ||||
| 						stable[si] = 1 | ||||
| 						under[si] = 0 | ||||
| 					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 densitybase >= triver ) -- stone around river | ||||
| 					or (density >= tstone and density < TSTONE * 1.2 and densitymid >= tstream ) then -- stone around stream | ||||
| 							or (density >= tstone and density < TSTONE * 1.2 and | ||||
| 							y <= YWAT) -- stone around water | ||||
| 							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 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 | ||||
| 						or (densityper >= 0.25 and densityper <= 0.28) | ||||
| 						or (densityper >= 0.45 and densityper <= 0.47) | ||||
| 						or (densityper >= 0.74 and densityper <= 0.76) | ||||
| 						or (densityper >= 0.77 and densityper <= 0.79) | ||||
| 						or (densityper >= 0.84 and densityper <= 0.87) | ||||
| 						or (densityper >= 0.95 and densityper <= 0.98) then | ||||
| 							data[vi] = c_sandstone | ||||
| 						elseif biome == 7 and density < TSTONE * 3 then -- desert stone as surface layer | ||||
| 								or (densityper >= 0.25 and densityper <= 0.28) | ||||
| 								or (densityper >= 0.45 and densityper <= 0.47) | ||||
| 								or (densityper >= 0.74 and densityper <= 0.76) | ||||
| 								or (densityper >= 0.77 and densityper <= 0.79) | ||||
| 								or (densityper >= 0.84 and densityper <= 0.87) | ||||
| 								or (densityper >= 0.95 and densityper <= 0.98) then | ||||
| 							if y > -84 and (y >= -80 or math.random() > 0.5) then | ||||
| 								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 | ||||
| 						elseif math.abs(n_seam) < TSEAM then | ||||
| 							if densityper >= 0 and densityper <= ORETHI * 4 then -- ore seams | ||||
| 								data[vi] = c_stocoal | ||||
| 							elseif densityper >= 0.3 and densityper <= 0.3 + ORETHI * 4 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 | ||||
| 							-- ore seams | ||||
|  | ||||
| 							if densityper >= 0.55 and densityper <= 0.55 + ORETHI * 2 then | ||||
| 								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 | ||||
| 								data[vi] = c_wsstone | ||||
| 							end | ||||
| @@ -449,6 +523,8 @@ function watershed_chunkgen(x0, y0, z0, x1, y1, z1, area, data) | ||||
| 						end | ||||
| 						stable[si] = stable[si] + 1 | ||||
| 						under[si] = 0 | ||||
| 					-- 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 | ||||
| 							data[vi] = c_clay | ||||
| @@ -495,8 +571,8 @@ function watershed_chunkgen(x0, y0, z0, x1, y1, z1, area, data) | ||||
| 							under[si] = 0 | ||||
| 						end | ||||
| 					elseif y >= YWAT - bergdep and y <= YWAT + bergdep / 8 -- icesheet | ||||
| 					and n_temp < ICETET and density < tstone | ||||
| 					and math.abs(n_fissure) > 0.01 then | ||||
| 							and n_temp < biomeparams.ICETET and density < tstone | ||||
| 							and nofis then | ||||
| 						data[vi] = c_ice | ||||
| 						under[si] = 12 | ||||
| 						stable[si] = 0 | ||||
| @@ -504,31 +580,29 @@ function watershed_chunkgen(x0, y0, z0, x1, y1, z1, area, data) | ||||
| 						data[vi] = c_water | ||||
| 						under[si] = 0 | ||||
| 						stable[si] = 0 | ||||
| 					elseif densitybase >= triver and density < tstone then -- river water not in fissures | ||||
| 						if n_temp < ICETET then | ||||
| 					 -- river water not in fissures | ||||
|  | ||||
| 					elseif densitybase >= triver and density < tstone then | ||||
| 						if n_temp < biomeparams.ICETET then | ||||
| 							data[vi] = c_wsfreshice | ||||
| 						else | ||||
| 							if y == YWAT + 1 then | ||||
| 								data[vi] = c_wsmixwater | ||||
| 							else | ||||
| 								data[vi] = c_wsfreshwater | ||||
| 							end | ||||
| 							data[vi] = c_wsfreshwater | ||||
| 						end | ||||
| 						stable[si] = 0 | ||||
| 						under[si] = 0 | ||||
| 					elseif densitymid >= tstream and density < tstone then -- stream water not in fissures | ||||
| 						if n_temp < ICETET then | ||||
| 					 -- stream water not in fissures | ||||
|  | ||||
| 					elseif densitymid >= tstream and density < tstone then | ||||
| 						if n_temp < biomeparams.ICETET then | ||||
| 							data[vi] = c_wsfreshice | ||||
| 						else | ||||
| 							if y == YWAT + 1 then | ||||
| 								data[vi] = c_wsmixwater | ||||
| 							else | ||||
| 								data[vi] = c_wsfreshwater | ||||
| 							end | ||||
| 							data[vi] = c_wsfreshwater | ||||
| 						end | ||||
| 						stable[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 | ||||
| 						if under[si] == 1 then | ||||
| 							data[viu] = c_wsicydirt | ||||
| @@ -547,7 +621,9 @@ function watershed_chunkgen(x0, y0, z0, x1, y1, z1, area, data) | ||||
| 							end | ||||
| 						elseif under[si] == 4 then | ||||
| 							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 | ||||
| 							end | ||||
| 						elseif under[si] == 5 then | ||||
| @@ -568,7 +644,7 @@ function watershed_chunkgen(x0, y0, z0, x1, y1, z1, area, data) | ||||
| 									data[vi] = c_grass5 | ||||
| 								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 | ||||
| 								watershed_cactus(x, y, z, area, data) | ||||
| 							elseif math.random(flora.DRYCHA) == 2 then | ||||
| @@ -593,34 +669,21 @@ function watershed_chunkgen(x0, y0, z0, x1, y1, z1, area, data) | ||||
| 								end | ||||
| 							end | ||||
| 						elseif under[si] == 10 then -- dunes | ||||
| 							if math.random(flora.DUGCHA) == 2 and y > YSAV  | ||||
| 							and biome >= 4 then | ||||
| 							if math.random(flora.DUGCHA) == 2 and y > YSAV | ||||
| 									and biome >= 4 then | ||||
| 								data[vi] = c_wsgoldengrass | ||||
| 							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 | ||||
| 								watershed_papyrus(x, y, z, area, data) | ||||
| 							end | ||||
| 						elseif under[si] == 12 | ||||
| 						and n_humid > LOHUT + (math.random() - 0.5) * BLEND then -- snowy iceberg | ||||
| 						-- snowy iceberg | ||||
| 						elseif under[si] == 12 and n_humid > biomeparams.LOHUT + | ||||
| 								(math.random() - 0.5) * biomeparams.BLEND then | ||||
| 							data[vi] = c_snowblock | ||||
| 						end | ||||
| 						stable[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 | ||||
| 						stable[si] = 0 | ||||
| 						under[si] = 0 | ||||
| @@ -648,7 +711,7 @@ function watershed_chunkgen(x0, y0, z0, x1, y1, z1, area, data) | ||||
| 						end | ||||
| 					end | ||||
| 				end | ||||
| 				nixyz = nixyz + 1 -- increment perlinmap and voxelarea indexes along x row | ||||
| 				nixyz = nixyz + 1 | ||||
| 				nixz = nixz + 1 | ||||
| 				vi = vi + 1 | ||||
| 				viu = viu + 1 | ||||
| @@ -657,57 +720,15 @@ function watershed_chunkgen(x0, y0, z0, x1, y1, z1, area, data) | ||||
| 		end | ||||
| 		nixz = nixz + sidelen | ||||
| 	end | ||||
|  | ||||
| 	darkage_mapgen(data, area, {x=x0, y=y0, z=z0}, {x=x1, y=y1, z=z1}, global_seed) -- Generate darkage ores | ||||
| 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 | ||||
|  | ||||
| minetest.register_on_generated(function(minp, maxp, seed) | ||||
| 	global_seed = seed | ||||
| 	if minp.y < YMIN or maxp.y > YMAX then | ||||
| 		return | ||||
| 	end | ||||
| @@ -720,21 +741,42 @@ minetest.register_on_generated(function(minp, maxp, seed) | ||||
| 	local x0 = minp.x | ||||
| 	local y0 = minp.y | ||||
| 	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 area = VoxelArea:new{MinEdge=emin, MaxEdge=emax} | ||||
| 	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) | ||||
| 	minetest.generate_ores(vm, minp, maxp) | ||||
| 	minetest.generate_decorations(vm, minp, maxp) | ||||
| 	vm:set_lighting({day = 0, night = 0}) | ||||
| 	vm:calc_lighting() | ||||
| 	vm:write_to_map(data) | ||||
| 	vm:update_liquids() | ||||
| 	 | ||||
|  | ||||
| 	local chugent = math.ceil((os.clock() - t1) * 1000) | ||||
| 	print ("[watershed] "..chugent.." ms") | ||||
| 	print ("[watershed] " .. chugent .. " ms") | ||||
| 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
									
								
							
							
						
						
							
								
								
									
										672
									
								
								nodes.lua
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						| @@ -1,647 +1,37 @@ | ||||
| minetest.register_node("watershed:appleleaf", { | ||||
| 	description = "Appletree leaves", | ||||
| 	drawtype = "allfaces_optional", | ||||
| 	visual_scale = 1.3, | ||||
| 	tiles = {"default_leaves.png"}, | ||||
| 	paramtype = "light", | ||||
| 	is_ground_content = false, | ||||
| 	groups = {snappy=3, flammable=2, leaves=1}, | ||||
| 	drop = { | ||||
| 		max_items = 1, | ||||
| 		items = { | ||||
| 			{items = {"watershed:appling"},rarity = 20}, | ||||
| 			{items = {"watershed:appleleaf"}} | ||||
| 		} | ||||
| 	}, | ||||
| 	sounds = default.node_sound_leaves_defaults(), | ||||
| }) | ||||
| minetest.register_alias("watershed:appleleaf", "default:leaves") | ||||
| minetest.register_alias("watershed:appling", "default:sapling") | ||||
| minetest.register_alias("watershed:acaciatree", "moretrees:acacia_trunk") | ||||
| minetest.register_alias("watershed:acacialeaf", "moretrees:acacia_leaves") | ||||
| minetest.register_alias("watershed:acacialing", "moretrees:acacia_sapling") | ||||
| minetest.register_alias("watershed:pinetree", "default:pine_tree") | ||||
| minetest.register_alias("watershed:needles", "default:pine_needles") | ||||
| minetest.register_alias("watershed:pineling", "default:pine_sapling") | ||||
| minetest.register_alias("watershed:jungleleaf", "default:jungleleaves") | ||||
| minetest.register_alias("watershed:jungling", "default:junglesapling") | ||||
|  | ||||
| minetest.register_node("watershed:appling", { | ||||
| 	description = "Appletree sapling", | ||||
| 	drawtype = "plantlike", | ||||
| 	visual_scale = 1.0, | ||||
| 	tiles = {"default_sapling.png"}, | ||||
| 	inventory_image = "default_sapling.png", | ||||
| 	wield_image = "default_sapling.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_alias("watershed:dirt", "default:dirt") | ||||
| minetest.register_alias("watershed:icydirt", "default:dirt_with_grass") | ||||
| minetest.register_alias("watershed:grass", "default:dirt_with_grass") | ||||
| minetest.register_alias("watershed:redstone", "default:desert_stone") | ||||
| minetest.register_alias("watershed:redcobble", "default:desert_cobble") | ||||
| minetest.register_alias("watershed:stone", "default:stone") | ||||
| minetest.register_alias("watershed:cactus", "default:cactus") | ||||
| minetest.register_alias("watershed:goldengrass", "default:dry_shrub") | ||||
| minetest.register_alias("watershed:drygrass", "default:dirt_with_dry_grass") | ||||
| minetest.register_alias("watershed:permafrost", "default:dirt") | ||||
| minetest.register_alias("watershed:freshice", "default:ice") | ||||
| minetest.register_alias("watershed:cloud", "default:cloud") | ||||
| minetest.register_alias("watershed:luxore", "default:stone") | ||||
| minetest.register_alias("watershed:light", "lantern:lamp") | ||||
| minetest.register_alias("watershed:acaciawood", "moretrees:acacia_wood") | ||||
| minetest.register_alias("watershed:pinewood", "default:pinewood") | ||||
|  | ||||
| minetest.register_node("watershed:acaciatree", { | ||||
| 	description = "Acacia tree", | ||||
| 	tiles = {"watershed_acaciatreetop.png", "watershed_acaciatreetop.png", "watershed_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("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}, | ||||
| }) | ||||
| minetest.register_alias("watershed:freshwater", "default:river_water_source") | ||||
| minetest.register_alias("watershed:freshwaterflow", "default:river_water_flowing") | ||||
| minetest.register_alias("watershed:lava", "default:lava_source") | ||||
| minetest.register_alias("watershed:lavaflow", "default:lava_flowing") | ||||
|  | ||||
| -- Items | ||||
|  | ||||
| minetest.register_craftitem("watershed:luxcrystal", { | ||||
| 	description = "Lux crystal", | ||||
| 	inventory_image = "watershed_luxcrystal.png", | ||||
| }) | ||||
| minetest.register_alias("watershed:luxcrystal", "default:cobble") | ||||
|  | ||||
| -- 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()) | ||||
|   | ||||
| Before Width: | Height: | Size: 340 B | 
| Before Width: | Height: | Size: 359 B | 
| Before Width: | Height: | Size: 682 B | 
| Before Width: | Height: | Size: 731 B | 
| Before Width: | Height: | Size: 364 B | 
| Before Width: | Height: | Size: 330 B | 
| Before Width: | Height: | Size: 136 B | 
| Before Width: | Height: | Size: 771 B | 
| Before Width: | Height: | Size: 780 B | 
| Before Width: | Height: | Size: 713 B | 
| Before Width: | Height: | Size: 4.8 KiB | 
| Before Width: | Height: | Size: 5.7 KiB | 
| Before Width: | Height: | Size: 683 B | 
| Before Width: | Height: | Size: 746 B | 
| Before Width: | Height: | Size: 155 B | 
| Before Width: | Height: | Size: 207 B | 
| Before Width: | Height: | Size: 311 B | 
| Before Width: | Height: | Size: 716 B | 
| Before Width: | Height: | Size: 4.8 KiB | 
| Before Width: | Height: | Size: 5.7 KiB | 
| Before Width: | Height: | Size: 860 B | 
| Before Width: | Height: | Size: 897 B | 
| Before Width: | Height: | Size: 406 B | 
| Before Width: | Height: | Size: 693 B | 
| Before Width: | Height: | Size: 802 B | 
| Before Width: | Height: | Size: 366 B | 
| Before Width: | Height: | Size: 686 B |