зеркало из
				https://github.com/sys4-fr/server-nalc.git
				synced 2025-10-31 20:45:22 +01:00 
			
		
		
		
	* Update ambience mod
- Add musics and sounds from original mod wich was removed by MFF - Add musics from mpd mod This ambience mod add /volume command that display a form to change musics and ambience volume. This is player independant. * Remove soundset and music mod * Fix warning caused by undefined global variable in kpgmobs/wolf.lua
Этот коммит содержится в:
		
							
								
								
									
										390
									
								
								mods/ambience/14init.lua
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										390
									
								
								mods/ambience/14init.lua
									
									
									
									
									
										Обычный файл
									
								
							| @@ -0,0 +1,390 @@ | ||||
| -------------------------------------------------------------------------------------------------------- | ||||
| --Ambiance Configuration for version .14 | ||||
|  | ||||
| local max_frequency_all = 1000 --the larger you make this number the lest frequent ALL sounds will happen recommended values between 100-2000. | ||||
|  | ||||
| --for frequencies below use a number between 0 and max_frequency_all | ||||
| --for volumes below, use a number between 0.0 and 1, the larger the number the louder the sounds | ||||
| local night_frequency = 20  --owls, wolves  | ||||
| local night_volume = 0.9   | ||||
| local night_frequent_frequency = 150  --crickets | ||||
| local night_frequent_volume = 0.9 | ||||
| local day_frequency = 100  --crow, bluejay, cardinal | ||||
| local day_volume = 0.9  | ||||
| local day_frequent_frequency = 1000  --crow, bluejay, cardinal | ||||
| local day_frequent_volume = 0.18 | ||||
| local cave_frequency = 10  --bats | ||||
| local cave_volume = 1.0   | ||||
| local cave_frequent_frequency = 70  --drops of water dripping | ||||
| local cave_frequent_volume = 1.0  | ||||
| local water_frequent_frequency = 1000  --water sounds | ||||
| local water_frequent_volume = 1.0  | ||||
| local music_frequency = 7  --music (suggestion: keep this one low like around 6) | ||||
| local music_volume = 0.3  | ||||
| --End of Config | ||||
| ---------------------------------------------------------------------------------------------------- | ||||
| local played_on_start = false | ||||
| local night = { | ||||
| 	handler = {}, | ||||
| 	frequency = night_frequency, | ||||
| 	{name="horned_owl", length=3, gain=night_volume}, | ||||
| 	{name="Wolves_Howling", length=11,  gain=night_volume}, | ||||
| 	{name="ComboWind", length=17,  gain=night_volume} | ||||
| } | ||||
|  | ||||
| local night_frequent = { | ||||
| 	handler = {}, | ||||
| 	frequency = night_frequent_frequency, | ||||
| 	{name="Crickets_At_NightCombo", length=69, gain=night_frequent_volume} | ||||
| } | ||||
|  | ||||
| local day = { | ||||
| 	handler = {}, | ||||
| 	frequency = day_frequency, | ||||
| 	{name="Best Cardinal Bird", length=4, gain=day_volume}, | ||||
| 	{name="craw", length=3, gain=day_volume}, | ||||
| 	{name="bluejay", length=18, gain=day_volume}, | ||||
| 	{name="ComboWind", length=17,  gain=day_volume} | ||||
| } | ||||
|  | ||||
| local day_frequent = { | ||||
| 	handler = {}, | ||||
| 	frequency = day_frequent_frequency, | ||||
| 	{name="robin2", length=16, gain=day_frequent_volume}, | ||||
| 	{name="birdsongnl", length=13, gain=day_frequent_volume}, | ||||
| 	{name="bird", length=30, gain=day_frequent_volume}, | ||||
| 	{name="Best Cardinal Bird", length=4, gain=day_frequent_volume}, | ||||
| 	{name="craw", length=3, gain=day_frequent_volume}, | ||||
| 	{name="bluejay", length=18, gain=day_frequent_volume}, | ||||
| 	{name="ComboWind", length=17,  gain=day_frequent_volume*3} | ||||
| } | ||||
|  | ||||
|  | ||||
| local cave = { | ||||
| 	handler = {}, | ||||
| 	frequency = cave_frequency, | ||||
| 	{name="Bats_in_Cave", length=5, gain=cave_volume} | ||||
| } | ||||
|  | ||||
| local cave_frequent = { | ||||
| 	handler = {}, | ||||
| 	frequency = cave_frequent_frequency, | ||||
| 	{name="drippingwater_drip_a", length=2, gain=cave_frequent_volume}, | ||||
| 	{name="drippingwater_drip_b", length=2, gain=cave_frequent_volume}, | ||||
| 	{name="drippingwater_drip_c", length=2, gain=cave_frequent_volume}, | ||||
| 	{name="Single_Water_Droplet", length=3, gain=cave_frequent_volume}, | ||||
| 	{name="Spooky_Water_Drops", length=7, gain=cave_frequent_volume} | ||||
| } | ||||
|  | ||||
| local water = { | ||||
| 	handler = {}, | ||||
| 	frequency = 0,--dolphins dont fit into small lakes | ||||
| 	{name="dolphins", length=6}, | ||||
| 	{name="dolphins_screaming", length=16.5} | ||||
| } | ||||
|  | ||||
| local water_frequent = { | ||||
| 	handler = {}, | ||||
| 	frequency = water_frequent_frequency, | ||||
| 	on_stop = "drowning_gasp", | ||||
| 	on_start = "Splash", | ||||
| 	{name="scuba1bubbles", length=11, gain=water_frequent_volume}, | ||||
| 	{name="scuba1calm", length=10},  --not sure why but sometimes I get errors when setting gain=water_frequent_volume here. | ||||
| 	{name="scuba1calm2", length=8.5, gain=water_frequent_volume}, | ||||
| 	{name="scuba1interestingbubbles", length=11, gain=water_frequent_volume}, | ||||
| 	{name="scuba1tubulentbubbles", length=10.5, gain=water_frequent_volume} | ||||
| } | ||||
|  | ||||
| local flowing_water = { | ||||
| 	handler = {}, | ||||
| 	frequency = 1000, | ||||
| 	{name="small_waterfall", length=14, gain=.4} | ||||
| } | ||||
| local flowing_water2 = { | ||||
| 	handler = {}, | ||||
| 	frequency = 1000, | ||||
| 	{name="small_waterfall", length=11, gain=.3} | ||||
| } | ||||
|  | ||||
| local lava = { | ||||
| 	handler = {}, | ||||
| 	frequency = 1000, | ||||
| 	{name="earth01a", length=20} | ||||
| } | ||||
| local lava2 = { | ||||
| 	handler = {}, | ||||
| 	frequency = 1000, | ||||
| 	{name="earth01a", length=15} | ||||
| } | ||||
|  | ||||
| local play_music = minetest.setting_getbool("music") or false | ||||
| local music = { | ||||
| 	handler = {}, | ||||
| 	frequency = music_frequency, | ||||
| 	{name="mtest", length=4*60+33, gain=music_volume}, | ||||
| 	{name="echos", length=2*60+26, gain=music_volume}, | ||||
| 	{name="FoamOfTheSea", length=1*60+50, gain=music_volume}, | ||||
| 	{name="eastern_feeling", length=3*60+51, gain=music_volume}, | ||||
| 	{name="Mass_Effect_Uncharted_Worlds", length=2*60+29, gain=music_volume}, | ||||
| 	{name="dark_ambiance", length=44, gain=music_volume} | ||||
| } | ||||
|  | ||||
| local is_daytime = function() | ||||
| 	return (minetest.env:get_timeofday() > 0.2 and  minetest.env:get_timeofday() < 0.8) | ||||
| end | ||||
|  | ||||
| --[[old | ||||
| local nodes_in_range = function(pos, search_distance, node_name) | ||||
| 	local search_p = {x=0, y=0, z=0} | ||||
| 	local nodes_found = 0 | ||||
| 	for p_x=(pos.x-search_distance), (pos.x+search_distance) do | ||||
| 		for p_y=(pos.y-search_distance), (pos.y+search_distance) do | ||||
| 			for p_z=(pos.z-search_distance), (pos.z+search_distance) do | ||||
| 				local search_n = minetest.env:get_node({x=p_x, y=p_y, z=p_z}) | ||||
| 				if search_n.name == node_name then | ||||
| 					nodes_found = nodes_found + 1 | ||||
| 				end | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
| 	return nodes_found | ||||
| 	--minetest.chat_send_all("Range: " .. tostring(search_distance) .. " | Found (" .. node_name .. ": " .. nodes_found .. ")") | ||||
| end --]] | ||||
|  | ||||
| local nodes_in_range = function(pos, search_distance, node_name) | ||||
| 	minp = {x=pos.x-search_distance,y=pos.y-search_distance, z=pos.z-search_distance} | ||||
| 	maxp = {x=pos.x+search_distance,y=pos.y+search_distance, z=pos.z+search_distance} | ||||
| 	nodes = minetest.env:find_nodes_in_area(minp, maxp, node_name) | ||||
| --	minetest.chat_send_all("Found (" .. node_name .. ": " .. #nodes .. ")") | ||||
| 	return #nodes | ||||
| end | ||||
|  | ||||
|  | ||||
| local get_ambience = function(player) | ||||
| 	local pos = player:getpos() | ||||
| 	pos.y = pos.y+1.0 | ||||
| 	local nodename = minetest.env:get_node(pos).name | ||||
| 	if string.find(nodename, "default:water") then | ||||
| 		if music then | ||||
| 			return {water=water, water_frequent=water_frequent, music=music} | ||||
| 		else | ||||
| 			return {water=water, water_frequent=water_frequent} | ||||
| 		end | ||||
| 	end | ||||
| 	if nodes_in_range(pos, 7, "default:lava_flowing")>5 or nodes_in_range(pos, 7, "default:lava_source")>5 then | ||||
| 		if music then | ||||
| 			return {lava=lava, lava2=lava2, music=music}		 | ||||
| 		else | ||||
| 			return {lava=lava} | ||||
| 		end | ||||
| 	end | ||||
| 	if nodes_in_range(pos, 7, "default:water_flowing")>5 then | ||||
| 		if music then | ||||
| 			return {flowing_water=flowing_water, flowing_water2=flowing_water2, music=music} | ||||
| 		else | ||||
| 			return {flowing_water=flowing_water, flowing_water2=flowing_water2} | ||||
| 		end | ||||
| 	end | ||||
| 	if player:getpos().y < 0 then | ||||
| 		if music then | ||||
| 			return {cave=cave, cave_frequent=cave_frequent, music=music} | ||||
| 		else | ||||
| 			return {cave=cave, cave_frequent=cave_frequent} | ||||
| 		end | ||||
| 	end | ||||
| 	if is_daytime() then | ||||
| 		if music then | ||||
| 			return {day=day, day_frequent=day_frequent, music=music} | ||||
| 		else | ||||
| 			return {day=day, day_frequent=day_frequent} | ||||
| 		end | ||||
| 	else | ||||
| 		if music then | ||||
| 			return {night=night, night_frequent=night_frequent, music=music} | ||||
| 		else | ||||
| 			return {night=night, night_frequent=night_frequent} | ||||
| 		end | ||||
| 	end | ||||
| end | ||||
|  | ||||
| -- start playing the sound, set the handler and delete the handler after sound is played | ||||
| local play_sound = function(player, list, number) | ||||
| 	local player_name = player:get_player_name() | ||||
| 	if list.handler[player_name] == nil then | ||||
| 		local gain = 1.0 | ||||
| 		if list[number].gain ~= nil then | ||||
| 			gain = list[number].gain | ||||
| 		end | ||||
| 		local handler = minetest.sound_play(list[number].name, {to_player=player_name, gain=gain}) | ||||
| 		if handler ~= nil then | ||||
| 			list.handler[player_name] = handler | ||||
| 			minetest.after(list[number].length, function(args) | ||||
| 				local list = args[1] | ||||
| 				local player_name = args[2] | ||||
| 				if list.handler[player_name] ~= nil then | ||||
| 					minetest.sound_stop(list.handler[player_name]) | ||||
| 					list.handler[player_name] = nil | ||||
| 				end | ||||
| 			end, {list, player_name}) | ||||
| 		end | ||||
| 	end | ||||
| end | ||||
|  | ||||
| -- stops all sounds that are not in still_playing | ||||
| local stop_sound = function(still_playing, player) | ||||
| 	local player_name = player:get_player_name() | ||||
| 	if still_playing.cave == nil then | ||||
| 		local list = cave | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.cave_frequent == nil then | ||||
| 		local list = cave_frequent | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.night == nil then | ||||
| 		local list = night | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.night_frequent == nil then | ||||
| 		local list = night_frequent | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.day == nil then | ||||
| 		local list = day | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.day_frequent == nil then | ||||
| 		local list = day_frequent | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.music == nil then | ||||
| 		local list = music | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.flowing_water == nil then | ||||
| 		local list = flowing_water | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.flowing_water2 == nil then | ||||
| 		local list = flowing_water2 | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.lava == nil then | ||||
| 		local list = lava | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end	 | ||||
| 	if still_playing.lava2 == nil then | ||||
| 		local list = lava2 | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end		 | ||||
| 	if still_playing.water == nil then | ||||
| 		local list = water | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.water_frequent == nil then | ||||
| 		local list = water_frequent | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then				 | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 				played_on_start = false | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| end | ||||
|  | ||||
| local timer = 0 | ||||
| minetest.register_globalstep(function(dtime) | ||||
| 	timer = timer+dtime | ||||
| 	if timer < 1 then | ||||
| 		return | ||||
| 	end | ||||
| 	timer = 0 | ||||
|  | ||||
| 	for _,player in ipairs(minetest.get_connected_players()) do | ||||
| 		local ambiences = get_ambience(player) | ||||
| 		stop_sound(ambiences, player) | ||||
| 		for _,ambience in pairs(ambiences) do | ||||
| 			if math.random(1, 1000) <= ambience.frequency then | ||||
| 				if ambience.on_start ~= nil and played_on_start == false then | ||||
| 					played_on_start = true | ||||
| 					minetest.sound_play(ambience.on_start, {to_player=player:get_player_name()})					 | ||||
| 				end | ||||
| 				play_sound(player, ambience, math.random(1, #ambience)) | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
| end) | ||||
							
								
								
									
										439
									
								
								mods/ambience/Badinit.lua
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										439
									
								
								mods/ambience/Badinit.lua
									
									
									
									
									
										Обычный файл
									
								
							| @@ -0,0 +1,439 @@ | ||||
| -------------------------------------------------------------------------------------------------------- | ||||
| --Ambiance Configuration for version .16 | ||||
|  | ||||
| local max_frequency_all = 1000 --the larger you make this number the lest frequent ALL sounds will happen recommended values between 100-2000. | ||||
|  | ||||
| --for frequencies below use a number between 0 and max_frequency_all | ||||
| --for volumes below, use a number between 0.0 and 1, the larger the number the louder the sounds | ||||
| local night_frequency = 20  --owls, wolves  | ||||
| local night_volume = 0.9   | ||||
| local night_frequent_frequency = 150  --crickets | ||||
| local night_frequent_volume = 0.9 | ||||
| local day_frequency = 100  --crow, bluejay, cardinal | ||||
| local day_volume = 0.9  | ||||
| local day_frequent_frequency = 1000  --crow, bluejay, cardinal | ||||
| local day_frequent_volume = 0.18 | ||||
| local cave_frequency = 10  --bats | ||||
| local cave_volume = 1.0   | ||||
| local cave_frequent_frequency = 70  --drops of water dripping | ||||
| local cave_frequent_volume = 1.0  | ||||
| local beach_frequency = 20  --seagulls | ||||
| local beach_volume = 1.0   | ||||
| local beach_frequent_frequency = 1000  --waves | ||||
| local beach_frequent_volume = 1.0  | ||||
| local water_frequent_frequency = 1000  --water sounds | ||||
| local water_frequent_volume = 1.0  | ||||
| local music_frequency = 7  --music (suggestion: keep this one low like around 6) | ||||
| local music_volume = 0.3  | ||||
| --End of Config | ||||
| ---------------------------------------------------------------------------------------------------- | ||||
| local played_on_start = false | ||||
| local night = { | ||||
| 	handler = {}, | ||||
| 	frequency = night_frequency, | ||||
| 	{name="horned_owl", length=3, gain=night_volume}, | ||||
| 	{name="Wolves_Howling", length=11,  gain=night_volume}, | ||||
| 	{name="ComboWind", length=17,  gain=night_volume} | ||||
| } | ||||
|  | ||||
| local night_frequent = { | ||||
| 	handler = {}, | ||||
| 	frequency = night_frequent_frequency, | ||||
| 	{name="Crickets_At_NightCombo", length=69, gain=night_frequent_volume} | ||||
| } | ||||
|  | ||||
| local day = { | ||||
| 	handler = {}, | ||||
| 	frequency = day_frequency, | ||||
| 	{name="Best Cardinal Bird", length=4, gain=day_volume}, | ||||
| 	{name="craw", length=3, gain=day_volume}, | ||||
| 	{name="bluejay", length=18, gain=day_volume}, | ||||
| 	{name="ComboWind", length=17,  gain=day_volume} | ||||
| } | ||||
|  | ||||
| local day_frequent = { | ||||
| 	handler = {}, | ||||
| 	frequency = day_frequent_frequency, | ||||
| 	{name="robin2", length=16, gain=day_frequent_volume}, | ||||
| 	{name="birdsongnl", length=13, gain=day_frequent_volume}, | ||||
| 	{name="bird", length=30, gain=day_frequent_volume}, | ||||
| 	{name="Best Cardinal Bird", length=4, gain=day_frequent_volume}, | ||||
| 	{name="craw", length=3, gain=day_frequent_volume}, | ||||
| 	{name="bluejay", length=18, gain=day_frequent_volume}, | ||||
| 	{name="ComboWind", length=17,  gain=day_frequent_volume*3} | ||||
| } | ||||
|  | ||||
|  | ||||
| local cave = { | ||||
| 	handler = {}, | ||||
| 	frequency = cave_frequency, | ||||
| 	{name="Bats_in_Cave", length=5, gain=cave_volume} | ||||
| } | ||||
|  | ||||
| local cave_frequent = { | ||||
| 	handler = {}, | ||||
| 	frequency = cave_frequent_frequency, | ||||
| 	{name="drippingwater_drip_a", length=2, gain=cave_frequent_volume}, | ||||
| 	{name="drippingwater_drip_b", length=2, gain=cave_frequent_volume}, | ||||
| 	{name="drippingwater_drip_c", length=2, gain=cave_frequent_volume}, | ||||
| 	{name="Single_Water_Droplet", length=3, gain=cave_frequent_volume}, | ||||
| 	{name="Spooky_Water_Drops", length=7, gain=cave_frequent_volume} | ||||
| } | ||||
|  | ||||
| local beach = { | ||||
| 	handler = {}, | ||||
| 	frequency = beach_frequency, | ||||
| 	{name="seagull", length=4.5, gain=beach_volume} | ||||
| } | ||||
|  | ||||
| local beach_frequent = { | ||||
| 	handler = {}, | ||||
| 	frequency = beach_frequent_frequency, | ||||
| 	{name="fiji_beach", length=43.5, gain=beach_frequent_volume} | ||||
| } | ||||
|  | ||||
|  | ||||
| local water = { | ||||
| 	handler = {}, | ||||
| 	frequency = 0,--dolphins dont fit into small lakes | ||||
| 	{name="dolphins", length=6}, | ||||
| 	{name="dolphins_screaming", length=16.5} | ||||
| } | ||||
|  | ||||
| local water_frequent = { | ||||
| 	handler = {}, | ||||
| 	frequency = water_frequent_frequency, | ||||
| 	on_stop = "drowning_gasp", | ||||
| 	on_start = "Splash", | ||||
| 	{name="scuba1bubbles", length=11, gain=water_frequent_volume}, | ||||
| 	{name="scuba1calm", length=10},  --not sure why but sometimes I get errors when setting gain=water_frequent_volume here. | ||||
| 	{name="scuba1calm2", length=8.5, gain=water_frequent_volume}, | ||||
| 	{name="scuba1interestingbubbles", length=11, gain=water_frequent_volume}, | ||||
| 	{name="scuba1tubulentbubbles", length=10.5, gain=water_frequent_volume} | ||||
| } | ||||
|  | ||||
| local flowing_water = { | ||||
| 	handler = {}, | ||||
| 	frequency = 1000, | ||||
| 	{name="small_waterfall", length=14, gain=.4} | ||||
| } | ||||
| local flowing_water2 = { | ||||
| 	handler = {}, | ||||
| 	frequency = 1000, | ||||
| 	{name="small_waterfall", length=11, gain=.3} | ||||
| } | ||||
|  | ||||
| local lava = { | ||||
| 	handler = {}, | ||||
| 	frequency = 1000, | ||||
| 	{name="earth01a", length=20} | ||||
| } | ||||
| local lava2 = { | ||||
| 	handler = {}, | ||||
| 	frequency = 1000, | ||||
| 	{name="earth01a", length=15} | ||||
| } | ||||
|  | ||||
|  | ||||
| local play_music = minetest.setting_getbool("music") or false | ||||
| local music = { | ||||
| 	handler = {}, | ||||
| 	frequency = music_frequency, | ||||
| 	{name="mtest", length=4*60+33, gain=music_volume}, | ||||
| 	{name="echos", length=2*60+26, gain=music_volume}, | ||||
| 	{name="FoamOfTheSea", length=1*60+50, gain=music_volume}, | ||||
| 	{name="eastern_feeling", length=3*60+51, gain=music_volume}, | ||||
| 	{name="Mass_Effect_Uncharted_Worlds", length=2*60+29, gain=music_volume}, | ||||
| 	{name="dark_ambiance", length=44, gain=music_volume} | ||||
| } | ||||
|  | ||||
| local is_daytime = function() | ||||
| 	return (minetest.env:get_timeofday() > 0.2 and  minetest.env:get_timeofday() < 0.8) | ||||
| end | ||||
|  | ||||
| --[[old | ||||
| local nodes_in_range = function(pos, search_distance, node_name) | ||||
| 	local search_p = {x=0, y=0, z=0} | ||||
| 	local nodes_found = 0 | ||||
| 	for p_x=(pos.x-search_distance), (pos.x+search_distance) do | ||||
| 		for p_y=(pos.y-search_distance), (pos.y+search_distance) do | ||||
| 			for p_z=(pos.z-search_distance), (pos.z+search_distance) do | ||||
| 				local search_n = minetest.env:get_node({x=p_x, y=p_y, z=p_z}) | ||||
| 				if search_n.name == node_name then | ||||
| 					nodes_found = nodes_found + 1 | ||||
| 				end | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
| 	return nodes_found | ||||
| 	--minetest.chat_send_all("Range: " .. tostring(search_distance) .. " | Found (" .. node_name .. ": " .. nodes_found .. ")") | ||||
| end --]] | ||||
|  | ||||
| local nodes_in_range = function(pos, search_distance, node_name) | ||||
| 	minp = {x=pos.x-search_distance,y=pos.y-search_distance, z=pos.z-search_distance} | ||||
| 	maxp = {x=pos.x+search_distance,y=pos.y+search_distance, z=pos.z+search_distance} | ||||
| 	nodes = minetest.env:find_nodes_in_area(minp, maxp, node_name) | ||||
| --	minetest.chat_send_all("Found (" .. node_name .. ": " .. #nodes .. ")") | ||||
| 	return #nodes | ||||
| end | ||||
|  | ||||
|  | ||||
| local get_ambience = function(player) | ||||
| 	local pos = player:getpos() | ||||
| 	pos.y = pos.y+1.0 | ||||
| 	local nodename = minetest.env:get_node(pos).name | ||||
| 	if string.find(nodename, "default:water") then | ||||
| 		if music then | ||||
| 			return {water=water, water_frequent=water_frequent, music=music} | ||||
| 		else | ||||
| 			return {water=water, water_frequent=water_frequent} | ||||
| 		end | ||||
| 	end | ||||
| 	if nodes_in_range(pos, 7, "default:lava_flowing")>5 or nodes_in_range(pos, 7, "default:lava_source")>5 then | ||||
| 		if music then | ||||
| 			return {lava=lava, lava2=lava2, music=music}		 | ||||
| 		else | ||||
| 			return {lava=lava} | ||||
| 		end | ||||
| 	end | ||||
| 	if nodes_in_range(pos, 7, "default:water_flowing")>5 then | ||||
| 		if music then | ||||
| 			return {flowing_water=flowing_water, flowing_water2=flowing_water2, music=music} | ||||
| 		else | ||||
| 			return {flowing_water=flowing_water, flowing_water2=flowing_water2} | ||||
| 		end | ||||
| 	end | ||||
| 	pos.y = pos.y-2  | ||||
| 	nodename = minetest.env:get_node(pos).name | ||||
| 	--minetest.chat_send_all("Found " .. nodename .. pos.y ) | ||||
| 	if string.find(nodename, "default:sand") and pos.y < 5 then | ||||
| 		if music then | ||||
| 			return {beach=beach, beach_frequent=beach_frequent, music=music} | ||||
| 		else | ||||
| 			return {beach=beach, beach_frequent=beach_frequent} | ||||
| 		end | ||||
| 	end | ||||
| 	if player:getpos().y < 0 then | ||||
| 		if music then | ||||
| 			return {cave=cave, cave_frequent=cave_frequent, music=music} | ||||
| 		else | ||||
| 			return {cave=cave, cave_frequent=cave_frequent} | ||||
| 		end | ||||
| 	end | ||||
| 	if is_daytime() then | ||||
| 		if music then | ||||
| 			return {day=day, day_frequent=day_frequent, music=music} | ||||
| 		else | ||||
| 			return {day=day, day_frequent=day_frequent} | ||||
| 		end | ||||
| 	else | ||||
| 		if music then | ||||
| 			return {night=night, night_frequent=night_frequent, music=music} | ||||
| 		else | ||||
| 			return {night=night, night_frequent=night_frequent} | ||||
| 		end | ||||
| 	end | ||||
| end | ||||
|  | ||||
| -- start playing the sound, set the handler and delete the handler after sound is played | ||||
| local play_sound = function(player, list, number) | ||||
| 	local player_name = player:get_player_name() | ||||
| 	if list.handler[player_name] == nil then | ||||
| 		local gain = 1.0 | ||||
| 		if list[number].gain ~= nil then | ||||
| 			gain = list[number].gain | ||||
| 		end | ||||
| 		local handler = minetest.sound_play(list[number].name, {to_player=player_name, gain=gain}) | ||||
| 		if handler ~= nil then | ||||
| 			list.handler[player_name] = handler | ||||
| 			minetest.after(list[number].length, function(args) | ||||
| 				local list = args[1] | ||||
| 				local player_name = args[2] | ||||
| 				if list.handler[player_name] ~= nil then | ||||
| 					minetest.sound_stop(list.handler[player_name]) | ||||
| 					list.handler[player_name] = nil | ||||
| 				end | ||||
| 			end, {list, player_name}) | ||||
| 		end | ||||
| 	end | ||||
| end | ||||
|  | ||||
| -- stops all sounds that are not in still_playing | ||||
| local stop_sound = function(still_playing, player) | ||||
| 	local player_name = player:get_player_name() | ||||
| 	if still_playing.cave == nil then | ||||
| 		local list = cave | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.cave_frequent == nil then | ||||
| 		local list = cave_frequent | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.beach == nil then | ||||
| 		local list = beach | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.beach_frequent == nil then | ||||
| 		local list = beach_frequent | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
|  | ||||
| 	if still_playing.night == nil then | ||||
| 		local list = night | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.night_frequent == nil then | ||||
| 		local list = night_frequent | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.day == nil then | ||||
| 		local list = day | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.day_frequent == nil then | ||||
| 		local list = day_frequent | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.music == nil then | ||||
| 		local list = music | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.flowing_water == nil then | ||||
| 		local list = flowing_water | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.flowing_water2 == nil then | ||||
| 		local list = flowing_water2 | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.lava == nil then | ||||
| 		local list = lava | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end	 | ||||
| 	if still_playing.lava2 == nil then | ||||
| 		local list = lava2 | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end		 | ||||
| 	if still_playing.water == nil then | ||||
| 		local list = water | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.water_frequent == nil then | ||||
| 		local list = water_frequent | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then				 | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 				played_on_start = false | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| end | ||||
|  | ||||
| local timer = 0 | ||||
| minetest.register_globalstep(function(dtime) | ||||
| 	timer = timer+dtime | ||||
| 	if timer < 1 then | ||||
| 		return | ||||
| 	end | ||||
| 	timer = 0 | ||||
|  | ||||
| 	for _,player in ipairs(minetest.get_connected_players()) do | ||||
| 		local ambiences = get_ambience(player) | ||||
| 		stop_sound(ambiences, player) | ||||
| 		for _,ambience in pairs(ambiences) do | ||||
| 			if math.random(1, 1000) <= ambience.frequency then | ||||
| 				if ambience.on_start ~= nil and played_on_start == false then | ||||
| 					played_on_start = true | ||||
| 					minetest.sound_play(ambience.on_start, {to_player=player:get_player_name()})					 | ||||
| 				end | ||||
| 				play_sound(player, ambience, math.random(1, #ambience)) | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
| end) | ||||
| @@ -1,9 +0,0 @@ | ||||
| Ambience Lite mod for Minetest | ||||
|  | ||||
| Based on Immersive Sounds .36 mod by Neuromancer and optimized to run on servers with new fire sounds added when Fire Redo mod is detected... | ||||
|  | ||||
| 0.1 - Initial release | ||||
| 0.2 - Code change and new water sounds added | ||||
| 0.3 - Works with Fire Redo mod to provide fire sounds | ||||
| 0.4 - Code optimized | ||||
| 0.5 - Changed to kilbiths smaller sound files and removed canadianloon1, adjusted timings | ||||
							
								
								
									
										4
									
								
								mods/ambience/depends.txt
									
									
									
									
									
										
										
										Исполняемый файл → Обычный файл
									
								
							
							
						
						
									
										4
									
								
								mods/ambience/depends.txt
									
									
									
									
									
										
										
										Исполняемый файл → Обычный файл
									
								
							| @@ -1,5 +1 @@ | ||||
| default | ||||
| fire? | ||||
| bakedclay? | ||||
| ethereal? | ||||
| soundset? | ||||
|   | ||||
							
								
								
									
										956
									
								
								mods/ambience/init.lua
									
									
									
									
									
										
										
										Исполняемый файл → Обычный файл
									
								
							
							
						
						
									
										956
									
								
								mods/ambience/init.lua
									
									
									
									
									
										
										
										Исполняемый файл → Обычный файл
									
								
							| @@ -1,266 +1,690 @@ | ||||
|  | ||||
| --= Ambience lite by TenPlus1 (16th April 2015) | ||||
|  | ||||
| local max_frequency_all = 1000 -- larger number means more frequent sounds (100-2000) | ||||
| local SOUNDVOLUME = 1 | ||||
|  | ||||
| -- compatibility with soundset mod | ||||
| local get_volume | ||||
| if (minetest.get_modpath("soundset")) ~= nil then | ||||
| 	get_volume = soundset.get_gain | ||||
| else | ||||
| 	get_volume = function (player_name, sound_type) return SOUNDVOLUME end | ||||
| 	-- set volume command | ||||
| 	minetest.register_chatcommand("svol", { | ||||
| 		params = "<svol>", | ||||
| 		description = "set sound volume (0.1 to 1.0)", | ||||
| 		privs = {server=true}, | ||||
| 		func = function(name, param) | ||||
| 			if tonumber(param) then | ||||
| 				SOUNDVOLUME = tonumber(param) | ||||
| 				minetest.chat_send_player(name, "Sound volume set.") | ||||
| 			else | ||||
| 				minetest.chat_send_player(name, "Sound volume no set, bad param.") | ||||
| 			end | ||||
| 		end, | ||||
| 	}) | ||||
| end | ||||
|  | ||||
|  | ||||
| -- sound sets | ||||
| local night = { | ||||
| 	handler = {},		frequency = 40, | ||||
| 	{name="hornedowl",	length=2}, | ||||
| 	{name="wolves",		length=4}, | ||||
| 	{name="cricket",	length=6}, | ||||
| 	{name="deer",		length=7}, | ||||
| 	{name="frog",		length=1}, | ||||
| } | ||||
|  | ||||
| local day = { | ||||
| 	handler = {},			frequency = 40, | ||||
| 	{name="cardinal",		length=3}, | ||||
| 	{name="bluejay",		length=6}, | ||||
| 	{name="craw",			length=3}, | ||||
| 	{name="canadianloon2",	length=14}, | ||||
| 	{name="robin",			length=4}, | ||||
| 	{name="bird1",			length=11}, | ||||
| 	{name="bird2",			length=6}, | ||||
| 	{name="crestedlark",	length=6}, | ||||
| 	{name="peacock",		length=2} | ||||
| } | ||||
|  | ||||
| local high_up = { | ||||
| 	handler = {},			frequency = 40, | ||||
| 	{name="craw",			length=3}, | ||||
| 	{name="wind",			length=9.5}, | ||||
| } | ||||
|  | ||||
| local cave = { | ||||
| 	handler = {},			frequency = 60, | ||||
| 	{name="drippingwater1",	length=1.5}, | ||||
| 	{name="drippingwater2",	length=1.5} | ||||
| } | ||||
|  | ||||
| local beach = { | ||||
| 	handler = {},			frequency = 40, | ||||
| 	{name="seagull",		length=4.5}, | ||||
| 	{name="beach",			length=13}, | ||||
| 	{name="gull",			length=1} | ||||
| } | ||||
|  | ||||
| local desert = { | ||||
| 	handler = {},			frequency = 20, | ||||
| 	{name="coyote",			length=2.5}, | ||||
| 	{name="desertwind",		length=8} | ||||
| } | ||||
|  | ||||
| local flowing_water = { | ||||
| 	handler = {},			frequency = 1000, | ||||
| 	{name="waterfall",		length=6} | ||||
| } | ||||
|  | ||||
| local underwater = { | ||||
| 	handler = {},			frequency = 1000, | ||||
| 	{name="scuba",			length=8} | ||||
| } | ||||
|  | ||||
| local splash = { | ||||
| 	handler = {},			frequency = 1000, | ||||
| 	{name="swim_splashing",	length=3}, | ||||
| } | ||||
|  | ||||
| local lava = { | ||||
| 	handler = {},			frequency = 1000, | ||||
| 	{name="lava",			length=7} | ||||
| } | ||||
|  | ||||
| local smallfire = { | ||||
| 	handler = {},			frequency = 1000, | ||||
| 	{name="fire_small",		length=6} | ||||
| } | ||||
|  | ||||
| local largefire = { | ||||
| 	handler = {},			frequency = 1000, | ||||
| 	{name="fire_large",		length=8} | ||||
| } | ||||
|  | ||||
| local get_num_nodes = function(pos, nodes) | ||||
| 	return #minetest.find_nodes_in_area( | ||||
| 		{x=pos.x-6,y=pos.y-2, z=pos.z-6}, | ||||
| 		{x=pos.x+6,y=pos.y+3, z=pos.z+6}, | ||||
| 		nodes | ||||
| 	) | ||||
| end | ||||
|  | ||||
| -- check where player is and which sounds are played | ||||
| local get_ambience = function(player) | ||||
|  | ||||
| 	-- where am I? | ||||
| 	local pos = player:getpos() | ||||
|  | ||||
| 	-- what is around me? | ||||
| 	local nod_head = minetest.get_node({x=pos.x,y=pos.y+1.4, z=pos.z}).name | ||||
| 	if string.find(nod_head, "water_") then | ||||
| 		return {underwater=underwater} | ||||
| 	end | ||||
| 	local nod_feet = minetest.get_node({x=pos.x,y=pos.y+0.2, z=pos.z}).name | ||||
| 	if string.find(nod_feet, "water_") then | ||||
| 		return {splash=splash} | ||||
| 	end | ||||
|  | ||||
| 	--= START Ambiance | ||||
|  | ||||
| 	-- is fire redo mod active? | ||||
| 	if fire and fire.mod and fire.mod == "redo" then | ||||
| 		local num_fire = get_num_nodes(pos, {"fire:basic_flame", "bakedclay:safe_fire"}) | ||||
| 		--print("num_fire:"..dump(num_fire)) | ||||
| 		if num_fire > 8 then | ||||
| 			return {largefire=largefire} | ||||
| 		elseif num_fire > 0 then | ||||
| 			return {smallfire=smallfire} | ||||
| 		end | ||||
| 	end | ||||
|  | ||||
| 	local num_lava = get_num_nodes(pos, {"default:lava_flowing", "default:lava_source"}) | ||||
| 	--print("num_lava:"..dump(num_lava)) | ||||
| 	if num_lava > 5 then | ||||
| 		return {lava=lava} | ||||
| 	end | ||||
|  | ||||
| 	local num_water_flowing = get_num_nodes(pos, {"default:water_flowing", "default:river_water_flowing"}) | ||||
| 	--print("num_water_flowing:"..dump(num_water_flowing)) | ||||
| 	if num_water_flowing > 30 then | ||||
| 		return {flowing_water=flowing_water} | ||||
| 	end | ||||
|  | ||||
| 	if pos.y < 7 and pos.y > 0 then | ||||
| 		local num_water_source = get_num_nodes(pos, {"default:water_source", "default:river_water_source"}) | ||||
| 		--print("num_water_source:"..dump(num_water_source)) | ||||
| 		if num_water_source > 100 then | ||||
| 			return {beach=beach} | ||||
| 		end | ||||
| 	end | ||||
|  | ||||
| 	local num_desert = get_num_nodes(pos, {"default:desert_sand", "default:desert_stone"}) | ||||
| 	--print("num_desert:"..dump(num_desert)) | ||||
| 	if num_desert > 150 then | ||||
| 		return {desert=desert} | ||||
| 	end | ||||
|  | ||||
| 	if pos.y > 60 then | ||||
| 		return {high_up=high_up} | ||||
| 	end | ||||
|  | ||||
| 	if pos.y < -10 then | ||||
| 		return {cave=cave} | ||||
| 	end | ||||
|  | ||||
| 	if minetest.get_timeofday() > 0.2 and minetest.get_timeofday() < 0.8 then | ||||
| 		return {day=day} | ||||
| 	else | ||||
| 		return {night=night} | ||||
| 	end | ||||
|  | ||||
| 	-- END Ambiance | ||||
|  | ||||
| end | ||||
|  | ||||
| -- play sound, set handler then delete handler when sound finished | ||||
| local play_sound = function(player, list, number) | ||||
|  | ||||
| 	local player_name = player:get_player_name() | ||||
|  | ||||
| 	if list.handler[player_name] == nil then | ||||
|  | ||||
| 		local gain = get_volume(player:get_player_name(), "ambience") | ||||
| 		local handler = minetest.sound_play(list[number].name, {to_player=player_name, gain=gain}) | ||||
|  | ||||
| 		if handler then | ||||
| 			list.handler[player_name] = handler | ||||
|  | ||||
| 			minetest.after(list[number].length, function(args) | ||||
| 				local list = args[1] | ||||
| 				local player_name = args[2] | ||||
|  | ||||
| 				if list.handler[player_name] then | ||||
| 					minetest.sound_stop(list.handler[player_name]) | ||||
| 					list.handler[player_name] = nil | ||||
| 				end | ||||
| 			end, {list, player_name}) | ||||
| 		end | ||||
| 	end | ||||
| end | ||||
|  | ||||
| -- stop sound in still_playing | ||||
| local stop_sound = function (list, player) | ||||
|  | ||||
| 	local player_name = player:get_player_name() | ||||
|  | ||||
| 	if list.handler[player_name] then | ||||
| 		if list.on_stop then | ||||
| 			minetest.sound_play(list.on_stop, {to_player=player:get_player_name(),gain=get_volume(player:get_player_name(), "ambience")}) | ||||
| 		end | ||||
| 		minetest.sound_stop(list.handler[player_name]) | ||||
| 		list.handler[player_name] = nil | ||||
| 	end | ||||
|  | ||||
| end | ||||
|  | ||||
| -- check sounds that are not in still_playing | ||||
| local still_playing = function(still_playing, player) | ||||
| 	if not still_playing.cave then				stop_sound(cave, player) end | ||||
| 	if not still_playing.high_up then			stop_sound(high_up, player) end | ||||
| 	if not still_playing.beach then				stop_sound(beach, player) end | ||||
| 	if not still_playing.desert then			stop_sound(desert, player) end | ||||
| 	if not still_playing.night then				stop_sound(night, player) end | ||||
| 	if not still_playing.day then				stop_sound(day, player) end | ||||
| 	if not still_playing.flowing_water then		stop_sound(flowing_water, player) end | ||||
| 	if not still_playing.splash then			stop_sound(splash, player) end | ||||
| 	if not still_playing.underwater then		stop_sound(underwater, player) end | ||||
| 	if not still_playing.lava then				stop_sound(lava, player) end | ||||
| 	if not still_playing.smallfire then			stop_sound(smallfire, player) end | ||||
| 	if not still_playing.largefire then			stop_sound(largefire, player) end | ||||
| end | ||||
|  | ||||
|  | ||||
| local function tick() | ||||
| 	for _,player in ipairs(minetest.get_connected_players()) do | ||||
| 		local playername = player:get_player_name() | ||||
| 		local gain = get_volume(playername, "ambience")		 | ||||
| 		if gain > 0 then | ||||
| 			--local t1 = os.clock() | ||||
| 			local ambiences = get_ambience(player) | ||||
| 			--print ("[AMBIENCE] "..math.ceil((os.clock() - t1) * 1000).." ms") | ||||
| 			still_playing(ambiences, player) | ||||
| 			for _,ambience in pairs(ambiences) do | ||||
| 				if math.random(1, 1000) <= ambience.frequency then | ||||
| 					play_sound(player, ambience, math.random(1, #ambience)) | ||||
| 				end | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
| 	minetest.after(1, tick) | ||||
| end | ||||
|  | ||||
| minetest.after(10, tick) | ||||
| -------------------------------------------------------------------------------------------------------- | ||||
| --Ambience Configuration for version .34 | ||||
| --Added Faraway & Ethereal by Amethystium | ||||
|  | ||||
| --Working on: | ||||
| --removing magic leap when not enough air under feet. | ||||
|  | ||||
|  | ||||
| --find out why wind stops while flying | ||||
| --add an extra node near feet to handle treading water as a special case, and don't have to use node under feet. which gets | ||||
| 	--invoked when staning on a ledge near water. | ||||
| --reduce redundant code (stopplay and add ambience to list) | ||||
|  | ||||
| local max_frequency_all = 1000 --the larger you make this number the lest frequent ALL sounds will happen recommended values between 100-2000. | ||||
|  | ||||
| --for frequencies below use a number between 0 and max_frequency_all | ||||
| --for volumes below, use a number between 0.0 and 1, the larger the number the louder the sounds | ||||
| local night_frequency = 20  --owls, wolves  | ||||
| local night_volume = 0.9   | ||||
| local night_frequent_frequency = 150  --crickets | ||||
| local night_frequent_volume = 0.9 | ||||
| local day_frequency = 80  --crow, bluejay, cardinal | ||||
| local day_volume = 0.9  | ||||
| local day_frequent_frequency = 250  --crow, bluejay, cardinal | ||||
| local day_frequent_volume = 0.18 | ||||
| local cave_frequency = 10  --bats | ||||
| local cave_volume = 1.0   | ||||
| local cave_frequent_frequency = 70  --drops of water dripping | ||||
| local cave_frequent_volume = 1.0  | ||||
| local beach_frequency = 20  --seagulls | ||||
| local beach_volume = 1.0   | ||||
| local beach_frequent_frequency = 1000  --waves | ||||
| local beach_frequent_volume = 1.0  | ||||
| local water_frequent_frequency = 1000  --water sounds | ||||
| local water_frequent_volume = 1.0  | ||||
| local desert_frequency = 20  --coyote | ||||
| local desert_volume = 1.0   | ||||
| local desert_frequent_frequency = 700  --desertwind | ||||
| local desert_frequent_volume = 1.0  | ||||
| local swimming_frequent_frequency = 1000  --swimming splashes | ||||
| local swimming_frequent_volume = 1.0  | ||||
| local water_surface_volume = 1.0   -- sloshing water | ||||
| local lava_volume = 1.0 --lava | ||||
| local flowing_water_volume = .4  --waterfall | ||||
| local splashing_water_volume = 1 | ||||
| local music_frequency = 7  --music (suggestion: keep this one low like around 6) | ||||
| local music_volume = 0.3  | ||||
|  | ||||
| --End of Config | ||||
| ---------------------------------------------------------------------------------------------------- | ||||
| local ambiences | ||||
| local counter=0--***************** | ||||
| local SOUNDVOLUME = 1 | ||||
| local MUSICVOLUME = 1 | ||||
| local sound_vol = 1 | ||||
| local volume = {} | ||||
| local last_x_pos = 0 | ||||
| local last_y_pos = 0 | ||||
| local last_z_pos = 0 | ||||
| local node_under_feet | ||||
| local node_at_upper_body | ||||
| local node_at_lower_body | ||||
| local node_3_under_feet | ||||
| local played_on_start = false | ||||
| local world_path = minetest.get_worldpath() | ||||
|  | ||||
| local function load_volumes() | ||||
| 	local file, err = io.open(world_path.."/ambience_volumes", "r") | ||||
| 	if err then | ||||
| 		return  | ||||
| 	end | ||||
| 	for line in file:lines() do | ||||
| 		local config_line = string.split(line, ":") | ||||
| 		volume[config_line[1]] = {music=config_line[2],sound=config_line[3]} | ||||
| 	end | ||||
| 	file:close() | ||||
| end | ||||
|  | ||||
| load_volumes() | ||||
|  | ||||
| local night = { | ||||
| 	handler = {}, | ||||
| 	frequency = night_frequency, | ||||
| 	{name="horned_owl", length=3, gain=night_volume}, | ||||
| 	{name="Wolves_Howling", length=11,  gain=night_volume}, | ||||
| 	{name="ComboWind", length=17,  gain=night_volume}, | ||||
| 	{name="deer", length=8, gain=night_volume*2}, | ||||
| 	{name="frog", length=1, gain=night_volume} | ||||
| } | ||||
|  | ||||
| local night_frequent = { | ||||
| 	handler = {}, | ||||
| 	frequency = night_frequent_frequency, | ||||
| 	{name="Crickets_At_NightCombo", length=69, gain=night_frequent_volume} | ||||
| } | ||||
|  | ||||
| local day = { | ||||
| 	handler = {}, | ||||
| 	frequency = day_frequency, | ||||
| 	{name="Best Cardinal Bird", length=4, gain=day_volume}, | ||||
| 	{name="craw", length=3, gain=day_volume}, | ||||
| 	{name="bluejay", length=7, gain=day_volume}, | ||||
| 	{name="ComboWind", length=17,  gain=day_volume}, | ||||
| 	{name="canadianloon2", length=15, gain=day_volume}, | ||||
| 	{name="peacock", length=3, gain=day_volume} | ||||
| } | ||||
|  | ||||
| local day_frequent = { | ||||
| 	handler = {}, | ||||
| 	frequency = day_frequent_frequency, | ||||
| 	{name="robin2", length=16, gain=day_frequent_volume}, | ||||
| 	{name="birdsongnl", length=13, gain=day_frequent_volume}, | ||||
| 	{name="bird", length=30, gain=day_frequent_volume}, | ||||
| 	{name="Best Cardinal Bird", length=4, gain=day_frequent_volume}, | ||||
| 	{name="craw", length=3, gain=day_frequent_volume}, | ||||
| 	{name="bluejay", length=7, gain=day_frequent_volume}, | ||||
| 	{name="ComboWind", length=17,  gain=day_frequent_volume*3} | ||||
| } | ||||
| local swimming_frequent = { | ||||
| 	handler = {}, | ||||
| 	frequency = day_frequent_frequency, | ||||
| 	{name="water_swimming_splashing_breath", length=11.5, gain=swimming_frequent_volume}, | ||||
| 	{name="water_swimming_splashing", length=9, gain=swimming_frequent_volume} | ||||
| } | ||||
|  | ||||
| local cave = { | ||||
| 	handler = {}, | ||||
| 	frequency = cave_frequency, | ||||
| 	{name="Bats_in_Cave", length=5, gain=cave_volume} | ||||
| } | ||||
|  | ||||
| local cave_frequent = { | ||||
| 	handler = {}, | ||||
| 	frequency = cave_frequent_frequency, | ||||
| 	{name="drippingwater_drip_a", length=2, gain=cave_frequent_volume}, | ||||
| 	{name="drippingwater_drip_b", length=2, gain=cave_frequent_volume}, | ||||
| 	{name="drippingwater_drip_c", length=2, gain=cave_frequent_volume}, | ||||
| 	{name="Single_Water_Droplet", length=3, gain=cave_frequent_volume}, | ||||
| 	{name="Spooky_Water_Drops", length=7, gain=cave_frequent_volume} | ||||
| } | ||||
|  | ||||
| local beach = { | ||||
| 	handler = {}, | ||||
| 	frequency = beach_frequency, | ||||
| 	{name="seagull", length=4.5, gain=beach_volume}, | ||||
| 	{name="gull", length=2, gain=beach_volume} | ||||
| } | ||||
|  | ||||
| local beach_frequent = { | ||||
| 	handler = {}, | ||||
| 	frequency = beach_frequent_frequency, | ||||
| 	{name="fiji_beach", length=43.5, gain=beach_frequent_volume} | ||||
| } | ||||
|  | ||||
| local desert = { | ||||
| 	handler = {}, | ||||
| 	frequency = desert_frequency, | ||||
| 	{name="coyote2", length=2.5, gain=desert_volume}, | ||||
| 	{name="RattleSnake", length=8, gain=desert_volume} | ||||
| } | ||||
|  | ||||
| local desert_frequent = { | ||||
| 	handler = {}, | ||||
| 	frequency = desert_frequent_frequency, | ||||
| 	{name="DesertMonolithMed", length=34.5, gain=desert_frequent_volume} | ||||
| } | ||||
|  | ||||
| local flying = { | ||||
| 	handler = {}, | ||||
| 	frequency = 1000, | ||||
| 	on_start = "nothing_yet", | ||||
| 	on_stop = "nothing_yet", | ||||
| 	{name="ComboWind", length=17,  gain=1} | ||||
| } | ||||
|  | ||||
| local water = { | ||||
| 	handler = {}, | ||||
| 	frequency = 0,--dolphins dont fit into small lakes | ||||
| 	{name="dolphins", length=6, gain=1}, | ||||
| 	{name="dolphins_screaming", length=16.5, gain=1} | ||||
| } | ||||
|  | ||||
| local water_frequent = { | ||||
| 	handler = {}, | ||||
| 	frequency = water_frequent_frequency, | ||||
| 	on_stop = "drowning_gasp", | ||||
| 	--on_start = "Splash", | ||||
| 	{name="scuba1bubbles", length=11, gain=water_frequent_volume}, | ||||
| 	{name="scuba1calm", length=10, gain=water_frequent_volume},  --not sure why but sometimes I get errors when setting gain=water_frequent_volume here. | ||||
| 	{name="scuba1calm2", length=8.5, gain=water_frequent_volume}, | ||||
| 	{name="scuba1interestingbubbles", length=11, gain=water_frequent_volume}, | ||||
| 	{name="scuba1tubulentbubbles", length=10.5, gain=water_frequent_volume} | ||||
| } | ||||
|  | ||||
| local water_surface = { | ||||
| 	handler = {}, | ||||
| 	frequency = 1000, | ||||
| 	on_stop = "Splash", | ||||
| 	on_start = "Splash", | ||||
| 	{name="lake_waves_2_calm", length=9.5, gain=water_surface_volume}, | ||||
| 	{name="lake_waves_2_variety", length=13.1, gain=water_surface_volume} | ||||
| } | ||||
| local splashing_water = { | ||||
| 	handler = {}, | ||||
| 	frequency = 1000, | ||||
| 	{name="Splash", length=1.22, gain=splashing_water_volume} | ||||
| } | ||||
|  | ||||
| local flowing_water = { | ||||
| 	handler = {}, | ||||
| 	frequency = 1000, | ||||
| 	{name="small_waterfall", length=14, gain=flowing_water_volume} | ||||
| } | ||||
| local flowing_water2 = { | ||||
| 	handler = {}, | ||||
| 	frequency = 1000, | ||||
| 	{name="small_waterfall", length=11, gain=flowing_water_volume} | ||||
| } | ||||
|  | ||||
| local lava = { | ||||
| 	handler = {}, | ||||
| 	frequency = 1000, | ||||
| 	{name="earth01a", length=20, gain=lava_volume} | ||||
| } | ||||
| local lava2 = { | ||||
| 	handler = {}, | ||||
| 	frequency = 1000, | ||||
| 	{name="earth01a", length=15, gain=lava_volume} | ||||
| } | ||||
|  | ||||
|  | ||||
| local play_music = minetest.setting_getbool("music") or false | ||||
| local music = { | ||||
| 	handler = {}, | ||||
| 	frequency = music_frequency, | ||||
| 	is_music=true, | ||||
| 	{name="StrangelyBeautifulShort", length=3*60+.5, gain=music_volume*.7}, | ||||
| 	{name="AvalonShort", length=2*60+58, gain=music_volume*1.4}, | ||||
| 	--{name="mtest", length=4*60+33, gain=music_volume}, | ||||
| 	--{name="echos", length=2*60+26, gain=music_volume}, | ||||
| 	--{name="FoamOfTheSea", length=1*60+50, gain=music_volume}, | ||||
| 	{name="eastern_feeling", length=3*60+51, gain=music_volume}, | ||||
| 	--{name="Mass_Effect_Uncharted_Worlds", length=2*60+29, gain=music_volume}, | ||||
| 	{name="EtherealShort", length=3*60+4, gain=music_volume*.7}, | ||||
| 	{name="FarawayShort", length=3*60+5, gain=music_volume*.7}, | ||||
| 	{name="dark_ambiance", length=44, gain=music_volume}, | ||||
| 	{name="Ambivalent", length=2*60+31, gain=music_volume}, | ||||
| 	{name="anonnp4014", length=2*60+31, gain=music_volume*1.6}, | ||||
| 	{name="bensound_deepblue", length=4*60+49, gain=music_volume}, | ||||
| 	{name="bensound_ofeliasdream", length=4*60+59, gain=music_volume}, | ||||
| 	{name="bensound_slowmotion", length=3*60+27, gain=music_volume}, | ||||
| 	{name="rainymemory", length=2*60+8, gain=music_volume} | ||||
| } | ||||
|  | ||||
| local ambienceList = { | ||||
| 	night=night, | ||||
| 	night_frequent=night_frequent, | ||||
| 	day=day, | ||||
| 	day_frequent=day_frequent, | ||||
| 	swimming_frequent=swimming_frequent, | ||||
| 	cave=cave, | ||||
| 	cave_frequent=cave_frequent, | ||||
| 	beach=beach, | ||||
| 	beach_frequent=beach_frequent, | ||||
| 	desert=desert, | ||||
| 	desert_frequent=desert_frequent, | ||||
| 	flying=flying, | ||||
| 	water=water, | ||||
| 	water_frequent=water_frequent, | ||||
| 	water_surface=water_surface, | ||||
| 	splashing_water=splashing_water, | ||||
| 	flowing_water=flowing_water, | ||||
| 	flowing_water2=flowing_water2, | ||||
| 	lava=lava, | ||||
| 	lava2=lava2, | ||||
| 	music=music, | ||||
| } | ||||
|  | ||||
| local is_daytime = function() | ||||
| 	return (minetest.env:get_timeofday() > 0.2 and  minetest.env:get_timeofday() < 0.8) | ||||
| end | ||||
|  | ||||
| local nodes_in_range = function(pos, search_distance, node_name) | ||||
| 	local minp = {x=pos.x-search_distance,y=pos.y-search_distance, z=pos.z-search_distance} | ||||
| 	local maxp = {x=pos.x+search_distance,y=pos.y+search_distance, z=pos.z+search_distance} | ||||
| 	local nodes = minetest.env:find_nodes_in_area(minp, maxp, node_name) | ||||
| 	--minetest.chat_send_all("Found (" .. node_name .. ": " .. #nodes .. ")") | ||||
| 	return #nodes | ||||
| end | ||||
|  | ||||
| local nodes_in_coords = function(minp, maxp, node_name) | ||||
| 	local nodes = minetest.env:find_nodes_in_area(minp, maxp, node_name) | ||||
| 	--minetest.chat_send_all("Found (" .. node_name .. ": " .. #nodes .. ")") | ||||
| 	return #nodes | ||||
| end | ||||
|  | ||||
| local atleast_nodes_in_grid = function(pos, search_distance, height, node_name, threshold) | ||||
| 	local counter = counter +1 | ||||
| --	minetest.chat_send_all("counter: (" .. counter .. ")") | ||||
| 	local minp = {x=pos.x-search_distance,y=height, z=pos.z+20} | ||||
| 	local maxp = {x=pos.x+search_distance,y=height, z=pos.z+20} | ||||
| 	local nodes = minetest.env:find_nodes_in_area(minp, maxp, node_name) | ||||
| --	minetest.chat_send_all("z+Found (" .. node_name .. ": " .. #nodes .. ")") | ||||
| 	if #nodes >= threshold then | ||||
| 		return true | ||||
| 	end | ||||
| 	local totalnodes = #nodes | ||||
| 	minp = {x=pos.x-search_distance,y=height, z=pos.z-20} | ||||
| 	maxp = {x=pos.x+search_distance,y=height, z=pos.z-20} | ||||
| 	nodes = minetest.env:find_nodes_in_area(minp, maxp, node_name) | ||||
| --	minetest.chat_send_all("z-Found (" .. node_name .. ": " .. #nodes .. ")") | ||||
| 	if #nodes >= threshold then | ||||
| 		return true | ||||
| 	end | ||||
| 	totalnodes = totalnodes + #nodes | ||||
| 	maxp = {x=pos.x+20,y=height, z=pos.z+search_distance} | ||||
| 	minp = {x=pos.x+20,y=height, z=pos.z-search_distance} | ||||
| 	nodes = minetest.env:find_nodes_in_area(minp, maxp, node_name)	 | ||||
| --	minetest.chat_send_all("x+Found (" .. node_name .. ": " .. #nodes .. ")") | ||||
| 	if #nodes >= threshold then | ||||
| 		return true | ||||
| 	end | ||||
| 	totalnodes = totalnodes + #nodes | ||||
| 	maxp = {x=pos.x-20,y=height, z=pos.z+search_distance} | ||||
| 	minp = {x=pos.x-20,y=height, z=pos.z-search_distance} | ||||
| 	nodes = minetest.env:find_nodes_in_area(minp, maxp, node_name)	 | ||||
| --	minetest.chat_send_all("x+Found (" .. node_name .. ": " .. #nodes .. ")")	 | ||||
| 	if #nodes >= threshold then | ||||
| 		return true | ||||
| 	end | ||||
| 	totalnodes = totalnodes + #nodes | ||||
| --	minetest.chat_send_all("Found total(" .. totalnodes .. ")") | ||||
| 	if totalnodes >= threshold*2 then | ||||
| 		return true | ||||
| 	end	 | ||||
| 	return false | ||||
| end | ||||
|  | ||||
| local get_immediate_nodes = function(pos) | ||||
| 	pos.y = pos.y-1 | ||||
| 	node_under_feet = minetest.env:get_node(pos).name | ||||
| 	pos.y = pos.y-3 | ||||
| 	node_3_under_feet = minetest.env:get_node(pos).name | ||||
| 	pos.y = pos.y+3 | ||||
| 	pos.y = pos.y+2.2 | ||||
| 	node_at_upper_body = minetest.env:get_node(pos).name | ||||
| 	pos.y = pos.y-1.19    | ||||
| 	node_at_lower_body = minetest.env:get_node(pos).name | ||||
| 	pos.y = pos.y+0.99   | ||||
| 	--minetest.chat_send_all("node_under_feet(" .. nodename .. ")") | ||||
| end  | ||||
|  | ||||
|  | ||||
| local get_ambience = function(player) | ||||
| 	local player_is_climbing = false | ||||
| 	local player_is_descending = false | ||||
| 	local player_is_moving_horiz = false | ||||
| 	local standing_in_water = false | ||||
| 	local pos = player:getpos() | ||||
| 	get_immediate_nodes(pos) | ||||
|  | ||||
| 	if last_x_pos ~=pos.x or last_z_pos ~=pos.z then  | ||||
| 		player_is_moving_horiz = true  | ||||
| 	end | ||||
| 	if pos.y > last_y_pos+.5   then  | ||||
| 		player_is_climbing = true  | ||||
| 	end | ||||
| 	if pos.y < last_y_pos-.5  then  | ||||
| 		player_is_descending = true  | ||||
| 	end | ||||
| 	 | ||||
| 	last_x_pos =pos.x | ||||
| 	last_z_pos =pos.z	 | ||||
| 	last_y_pos =pos.y | ||||
| 	 | ||||
| 	if string.find(node_at_upper_body, "default:water") then | ||||
| 		if music then | ||||
| 			return {water=water, water_frequent=water_frequent, music=music} | ||||
| 		else | ||||
| 			return {water=water, water_frequent=water_frequent} | ||||
| 		end | ||||
| 	elseif node_at_upper_body == "air" then | ||||
| 		if string.find(node_at_lower_body, "default:water") or string.find(node_under_feet, "default:water") then | ||||
| 		    --minetest.chat_send_all("bottom counted as water") | ||||
| 			--we found air at upperbody, and water at lower body.  Now there are 4 possibilities: | ||||
| 			--Key: under feet, moving or not | ||||
| 			--swimming 			w, m swimming | ||||
| 			--walking in water  nw, m splashing | ||||
| 			--treading water    w, nm  sloshing | ||||
| 			--standing in water nw, nm	beach trumps, then sloshing					 | ||||
| 			if player_is_moving_horiz then | ||||
| 				if string.find(node_under_feet, "default:water") then | ||||
| 					if music then | ||||
| 						return {swimming_frequent=swimming_frequent, music=music} | ||||
| 					else | ||||
| 						return {swimming_frequent} | ||||
| 					end	 | ||||
| 				else --didn't find water under feet: walking in water			 | ||||
| 					if music then | ||||
| 						return {splashing_water=splashing_water, music=music} | ||||
| 					else | ||||
| 						return {splashing_water} | ||||
| 					end	 | ||||
| 				end | ||||
| 			else--player is not moving: treading water | ||||
| 				if string.find(node_under_feet, "default:water") then | ||||
| 					if music then | ||||
| 						return {water_surface=water_surface, music=music} | ||||
| 					else | ||||
| 						return {water_surface} | ||||
| 					end	 | ||||
| 				else --didn't find water under feet				 | ||||
| 					standing_in_water = true | ||||
| 				end			 | ||||
| 		    end | ||||
| 		end	 | ||||
| 	end | ||||
| --	minetest.chat_send_all("----------") | ||||
| --	if not player_is_moving_horiz then | ||||
| --		minetest.chat_send_all("not moving horiz") | ||||
| --	else | ||||
| --		minetest.chat_send_all("moving horiz") | ||||
| --	end	 | ||||
| --	minetest.chat_send_all("nub:" ..node_at_upper_body) | ||||
| --	minetest.chat_send_all("nlb:" ..node_at_lower_body) | ||||
| --	minetest.chat_send_all("nuf:" ..node_under_feet) | ||||
| --	minetest.chat_send_all("----------") | ||||
| 	 | ||||
| 	 | ||||
| --	if player_is_moving_horiz then | ||||
| --		minetest.chat_send_all("playermoving") | ||||
| --	end | ||||
| --	if player_is_climbing then | ||||
| --			minetest.chat_send_all("player Climbing") | ||||
| --	end | ||||
| --	minetest.chat_send_all("nub:" ..node_at_upper_body) | ||||
| --	minetest.chat_send_all("nlb:" ..node_at_lower_body) | ||||
| --	minetest.chat_send_all("nuf:" ..node_under_feet) | ||||
| --	minetest.chat_send_all("n3uf:" ..node_3_under_feet) | ||||
| --	 | ||||
| 	--local air_or_ignore = {air=true,ignore=true} | ||||
| --	minp = {x=pos.x-3,y=pos.y-4, z=pos.z-3} | ||||
| --	maxp = {x=pos.x+3,y=pos.y-1, z=pos.z+3} | ||||
| 	--local air_under_player = nodes_in_coords(minp, maxp, "air") | ||||
| 	--local ignore_under_player = nodes_in_coords(minp, maxp, "ignore") | ||||
| 	--local air_plus_ignore_under = air_under_player + ignore_under_player | ||||
| --	minetest.chat_send_all("airUnder:" ..air_under_player) | ||||
| --	minetest.chat_send_all("ignoreUnder:" ..ignore_under_player) | ||||
| --	minetest.chat_send_all("a+i:" ..air_plus_ignore_under) | ||||
| --	minetest.chat_send_all("counter: (" .. counter .. "-----------------)") | ||||
| 	--minetest.chat_send_all(air_or_ignore[node_under_feet]) | ||||
| --	if (player_is_moving_horiz or player_is_climbing) and air_or_ignore[node_at_upper_body] and air_or_ignore[node_at_lower_body] | ||||
| --	 and air_or_ignore[node_under_feet] and air_plus_ignore_under == 196 and not player_is_descending then  | ||||
| 	--minetest.chat_send_all("flying!!!!")	 | ||||
| 	--	if music then | ||||
| 		--	return {flying=flying, music=music} | ||||
| 	--	else | ||||
| 		---	return {flying} | ||||
| --		end	 | ||||
| --	end | ||||
| 	--minetest.chat_send_all("not flying!!!!")	 | ||||
|  | ||||
| 	if nodes_in_range(pos, 7, "default:lava_flowing")>5 or nodes_in_range(pos, 7, "default:lava_source")>5 then | ||||
| 		if music then | ||||
| 			return {lava=lava, lava2=lava2, music=music}		 | ||||
| 		else | ||||
| 			return {lava=lava} | ||||
| 		end | ||||
| 	end | ||||
| 	if nodes_in_range(pos, 6, "default:water_flowing")>45 then | ||||
| 		if music then | ||||
| 			return {flowing_water=flowing_water, flowing_water2=flowing_water2, music=music} | ||||
| 		else | ||||
| 			return {flowing_water=flowing_water, flowing_water2=flowing_water2} | ||||
| 		end | ||||
| 	end	 | ||||
|  | ||||
|  | ||||
| --if we are near sea level and there is lots of water around the area | ||||
| 	if pos.y < 7 and pos.y >0 and atleast_nodes_in_grid(pos, 60, 1, "default:water_source", 51 ) then | ||||
| 		if music then | ||||
| 			return {beach=beach, beach_frequent=beach_frequent, music=music} | ||||
| 		else | ||||
| 			return {beach=beach, beach_frequent=beach_frequent} | ||||
| 		end		 | ||||
| 	end | ||||
| 	if standing_in_water then | ||||
| 		if music then | ||||
| 			return {water_surface=water_surface, music=music} | ||||
| 		else | ||||
| 			return {water_surface} | ||||
| 		end	 | ||||
| 	end | ||||
| 	 | ||||
| 	 | ||||
| 	local desert_in_range = (nodes_in_range(pos, 6, "default:desert_sand")+nodes_in_range(pos, 6, "default:desert_stone")) | ||||
| 	--minetest.chat_send_all("desertcount: " .. desert_in_range .. ",".. pos.y ) | ||||
| 	if  desert_in_range >250 then | ||||
| 		if music then | ||||
| 			return {desert=desert, desert_frequent=desert_frequent, music=music} | ||||
| 		else | ||||
| 			return {desert=desert, desert_frequent=desert_frequent} | ||||
| 		end | ||||
| 	end	 | ||||
|  | ||||
| --	pos.y = pos.y-2  | ||||
| --	nodename = minetest.env:get_node(pos).name | ||||
| --	minetest.chat_send_all("Found " .. nodename .. pos.y ) | ||||
| 	 | ||||
|  | ||||
| 	if player:getpos().y < 0 then | ||||
| 		if music then | ||||
| 			return {cave=cave, cave_frequent=cave_frequent, music=music} | ||||
| 		else | ||||
| 			return {cave=cave, cave_frequent=cave_frequent} | ||||
| 		end | ||||
| 	end | ||||
| 	if is_daytime() then | ||||
| 		if music then | ||||
| 			return {day=day, day_frequent=day_frequent, music=music} | ||||
| 		else | ||||
| 			return {day=day, day_frequent=day_frequent} | ||||
| 		end | ||||
| 	else | ||||
| 		if music then | ||||
| 			return {night=night, night_frequent=night_frequent, music=music} | ||||
| 		else | ||||
| 			return {night=night, night_frequent=night_frequent} | ||||
| 		end | ||||
| 	end | ||||
| end | ||||
|  | ||||
| -- start playing the sound, set the handler and delete the handler after sound is played | ||||
| local play_sound = function(player, list, number, is_music) | ||||
| 	local player_name = player:get_player_name() | ||||
| 	if list.handler[player_name] == nil then | ||||
| 		local gain = 1.0 | ||||
| 		if list[number].gain ~= nil then | ||||
| 			if is_music then 				 | ||||
| 				gain = list[number].gain*volume[player_name].music | ||||
| 				--minetest.chat_send_all("gain music: " .. gain ) | ||||
| 			else | ||||
| 				gain = list[number].gain*volume[player_name].sound | ||||
| 				--minetest.chat_send_all("gain sound: " .. gain ) | ||||
| 			end | ||||
| 		end | ||||
| 		local handler = minetest.sound_play(list[number].name, {to_player=player_name, gain=gain}) | ||||
| 		if handler ~= nil then | ||||
| 			list.handler[player_name] = handler | ||||
| 			minetest.after(list[number].length, function(args) | ||||
| 				local list = args[1] | ||||
| 				local player_name = args[2] | ||||
| 				if list.handler[player_name] ~= nil then | ||||
| 					minetest.sound_stop(list.handler[player_name]) | ||||
| 					list.handler[player_name] = nil | ||||
| 				end | ||||
| 			end, {list, player_name}) | ||||
| 		end | ||||
| 	end | ||||
| end | ||||
|  | ||||
| -- stops all sounds that are not in still_playing | ||||
| local stop_sound = function(still_playing, player) | ||||
| 	local player_name = player:get_player_name() | ||||
| 	for key,value in pairs(ambienceList) do | ||||
| 		if still_playing[key] == nil then | ||||
| 			if value.handler[player_name] ~= nil then | ||||
| 				if value.on_stop ~= nil then | ||||
| 					minetest.sound_play(value.on_stop, {to_player=player_name,gain=volume[player_name].sound}) | ||||
| 				end | ||||
| 				minetest.sound_stop(value.handler[player_name]) | ||||
| 				value.handler[player_name] = nil | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
| end | ||||
|  | ||||
| local timer = 0 | ||||
| minetest.register_globalstep(function(dtime) | ||||
| 	timer = timer+dtime | ||||
| 	if timer < 1 then | ||||
| 		return | ||||
| 	end | ||||
| 	timer = 0 | ||||
|  | ||||
| 	for _,player in ipairs(minetest.get_connected_players()) do | ||||
| 		ambiences = get_ambience(player) | ||||
| 		stop_sound(ambiences, player) | ||||
| 		for _,ambience in pairs(ambiences) do | ||||
| 			if math.random(1, 1000) <= ambience.frequency then			 | ||||
| --				if(played_on_start) then | ||||
| --				--	minetest.chat_send_all("playedOnStart "  ) | ||||
| --				else | ||||
| --				--	minetest.chat_send_all("FALSEplayedOnStart "  ) | ||||
| --				end | ||||
| 				if ambience.on_start ~= nil and played_on_start == false then | ||||
| 					played_on_start = true | ||||
| 					minetest.sound_play(ambience.on_start, {to_player=player:get_player_name(),gain=SOUNDVOLUME})					 | ||||
| 				end | ||||
| 			--	minetest.chat_send_all("ambience: " ..ambience ) | ||||
| 			--	if ambience.on_start ~= nil and played_on_start_flying == false then | ||||
| 			--		played_on_start_flying = true | ||||
| 			--		minetest.sound_play(ambience.on_start, {to_player=player:get_player_name()})					 | ||||
| 			--	end | ||||
| 				local is_music =false | ||||
| 				if ambience.is_music ~= nil then | ||||
| 					is_music = true | ||||
| 				end | ||||
| 				play_sound(player, ambience, math.random(1, #ambience),is_music) | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
| end) | ||||
|  | ||||
| minetest.register_on_joinplayer( | ||||
| 	function(player) | ||||
| 		if volume[player:get_player_name()] == nil then | ||||
| 			volume[player:get_player_name()] = {music=MUSICVOLUME, sound=SOUNDVOLUME} | ||||
| 		end | ||||
| 	end) | ||||
|  | ||||
| minetest.register_chatcommand( | ||||
| 	"volume", | ||||
| 	{ | ||||
| 		description = "View sliders to set sound a music volume", | ||||
| 		func = function(name,param) | ||||
| 			minetest.show_formspec( | ||||
| 				name, | ||||
| 				"ambience:volume", | ||||
| 				"size[6,3.5]" .. | ||||
| 					"label[0,0.5;Music]" .. | ||||
| 					"scrollbar[0,1;5.8,0.4;horizontal;music;" .. volume[name].music * 1000 .. "]" .. | ||||
| 					"label[0,1.5;Sound]" .. | ||||
| 					"scrollbar[0,2;5.8,0.4;horizontal;sound;" .. volume[name].sound * 1000 .. "]" .. | ||||
| 					"button_exit[2,2.8;2,0.8;quit;Done]" | ||||
| 			) | ||||
| 		end, | ||||
| 	}) | ||||
|  | ||||
| minetest.register_on_player_receive_fields( | ||||
| 	function(player, formname, fields) | ||||
| 		if formname ~= "ambience:volume" then | ||||
| 			return false | ||||
| 		end | ||||
| 		minetest.log(dump(fields)) | ||||
| 		if fields.quit ~= "true" then | ||||
| 			volume[player:get_player_name()].music = tonumber(string.split(fields.music,":")[2]) / 1000 | ||||
| 			volume[player:get_player_name()].sound = tonumber(string.split(fields.sound,":")[2]) / 1000 | ||||
| 		end | ||||
| 		if fields.quit then | ||||
| 			local file, err = io.open(world_path.."/ambience_volumes", "w") | ||||
| 			if not err then | ||||
| 				for item in pairs(volume) do | ||||
| 					file:write(item..":"..volume[item].music..":"..volume[item].sound.."\n") | ||||
| 				end | ||||
| 				file:close() | ||||
| 			end | ||||
| 		end | ||||
| 		return true | ||||
| 	end) | ||||
|  | ||||
| minetest.register_chatcommand( | ||||
| 	"svol", | ||||
| 	{ | ||||
| 		params = "<svol>", | ||||
| 		description = "set volume of sounds, default 1 normal volume.", | ||||
| 		privs = {server=true}, | ||||
| 		func = function(name, param) | ||||
| 			SOUNDVOLUME = param | ||||
| 			--	local player = minetest.env:get_player_by_name(name) | ||||
| 			--	ambiences = get_ambience(player) | ||||
| 			--	stop_sound({}, player) | ||||
| 			minetest.chat_send_player(name, "Sound volume set.") | ||||
| 		end, | ||||
| 	}) | ||||
|  | ||||
| minetest.register_chatcommand( | ||||
| 	"mvol", | ||||
| 	{ | ||||
| 		params = "<mvol>", | ||||
| 		description = "set volume of music, default 1 normal volume.", | ||||
| 		privs = {server=true}, | ||||
| 		func = function(name, param) | ||||
| 			MUSICVOLUME = param | ||||
| 			--	local player = minetest.env:get_player_by_name(name) | ||||
| 			--	stop_sound({}, player) | ||||
| 			--	ambiences = get_ambience(player)	 | ||||
| 			minetest.chat_send_player(name, "Music volume set.") | ||||
| 		end, | ||||
| 	})	 | ||||
|   | ||||
							
								
								
									
										287
									
								
								mods/ambience/init.lua.pilz.lua
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										287
									
								
								mods/ambience/init.lua.pilz.lua
									
									
									
									
									
										Обычный файл
									
								
							| @@ -0,0 +1,287 @@ | ||||
| local night = { | ||||
| 	handler = {}, | ||||
| 	frequency = 10, | ||||
| 	{name="horned_owl", length=3}, | ||||
| 	{name="Wolves_Howling", length=11}, | ||||
| 	{name="ComboWind", length=17}, | ||||
| } | ||||
|  | ||||
| local night_frequent = { | ||||
| 	handler = {}, | ||||
| 	frequency = 25, | ||||
| 	{name="Crickets_At_NightCombo", length=69}, | ||||
| } | ||||
|  | ||||
| local day = { | ||||
| 	handler = {}, | ||||
| 	frequency = 5, | ||||
| 	{name="Best Cardinal Bird", length=4}, | ||||
| 	{name="craw", length=3}, | ||||
| 	{name="bluejay", length=18}, | ||||
| 	{name="ComboWind", length=17}, | ||||
| } | ||||
|  | ||||
| local day_frequent = { | ||||
| 	handler = {}, | ||||
| 	frequency = 25, | ||||
| 	{name="robin2", length=16}, | ||||
| 	{name="birdsongnl", length=12.5}, | ||||
| 	{name="bird", length=30}, | ||||
| } | ||||
|  | ||||
| local cave = { | ||||
| 	handler = {}, | ||||
| 	frequency = 5, | ||||
| 	{name="Bats_in_Cave", length=5}, | ||||
| } | ||||
|  | ||||
| local cave_frequent = { | ||||
| 	handler = {}, | ||||
| 	frequency = 100, | ||||
| 	{name="drippingwater_drip_a", length=2}, | ||||
| 	{name="drippingwater_drip_b", length=2}, | ||||
| 	{name="drippingwater_drip_c", length=2}, | ||||
| 	{name="Single_Water_Droplet", length=3}, | ||||
| 	{name="Spooky_Water_Drops", length=7}, | ||||
| } | ||||
|  | ||||
| local water = { | ||||
| 	handler = {}, | ||||
| 	frequency = 0,--dolphins dont fit into small lakes | ||||
| 	{name="dolphins", length=6}, | ||||
| 	{name="dolphins_screaming", length=16.5}, | ||||
| } | ||||
|  | ||||
| local water_frequent = { | ||||
| 	handler = {}, | ||||
| 	frequency = 100, | ||||
| 	on_stop = "drowning_gasp", | ||||
| 	{name="scuba1bubbles", length=11}, | ||||
| 	{name="scuba1calm", length=10}, | ||||
| 	{name="scuba1calm2", length=8.5}, | ||||
| 	{name="scuba1interestingbubbles", length=11}, | ||||
| 	{name="scuba1tubulentbubbles", length=10.5}, | ||||
| } | ||||
|  | ||||
| local splash = { | ||||
| 	handler = {}, | ||||
| 	frequency = 100, | ||||
| 	{name="Splash", length=1.5}, | ||||
| } | ||||
|  | ||||
| local play_music = minetest.setting_getbool("music") or false | ||||
| local music = { | ||||
| 	handler = {}, | ||||
| 	frequency = 1, | ||||
| 	{name="mtest", length=4*60+33, gain=0.3}, | ||||
| 	{name="music_1", length=1*60+52, gain=0.3}, | ||||
| 	{name="ambiance", length=19, gain=0.3}, | ||||
| 	{name="dark_ambiance", length=46, gain=0.3}, | ||||
| 	{name="eastern_feeling", length=3*60+51, gain=0.3}, | ||||
| 	{name="echos", length=2*60+26, gain=0.3}, | ||||
| 	{name="FoamOfTheSea", length=1*60+50, gain=0.3}, | ||||
| } | ||||
|  | ||||
| local is_daytime = function() | ||||
| 	return (minetest.env:get_timeofday() > 0.2 and  minetest.env:get_timeofday() < 0.8) | ||||
| end | ||||
|  | ||||
| local get_ambience = function(player) | ||||
| 	local table = {} | ||||
|  | ||||
| 	local play_water = false | ||||
| 	local play_splash = false | ||||
| 	local play_day = false | ||||
| 	local play_cave = false | ||||
| 	local play_night = false | ||||
|  | ||||
| 	local pos = player:getpos() | ||||
| 	pos.y = pos.y+1.5 | ||||
| 	local nodename = minetest.env:get_node(pos).name | ||||
| 	if string.find(nodename, "default:water") then | ||||
| 		play_water = true | ||||
| 	elseif nodename == "air" then | ||||
| 		pos.y = pos.y-1.5 | ||||
| 		local nodename = minetest.env:get_node(pos).name | ||||
| 		if string.find(nodename, "default:water") then | ||||
| 			play_splash = true | ||||
| 		end | ||||
| 	end | ||||
| 	if player:getpos().y < 0 then | ||||
| 		play_cave = true | ||||
| 	elseif is_daytime() then | ||||
| 		play_day = true | ||||
| 	else | ||||
| 		play_night = true | ||||
| 	end | ||||
|  | ||||
| 	if play_music then | ||||
| 		table.music = music | ||||
| 	end | ||||
| 	if play_water then | ||||
| 		table.water = water | ||||
| 		table.water_frequent = water_frequent | ||||
| 		return table | ||||
| 	end | ||||
| 	if play_splash then | ||||
| 		table.splash = splash | ||||
| 	end | ||||
| 	if play_day then | ||||
| 		table.day = day | ||||
| 		table.day_frequent = day_frequent | ||||
| 	elseif play_night then | ||||
| 		table.night = night | ||||
| 		table.night_frequent = night_frequent | ||||
| 	elseif play_cave then | ||||
| 		table.cave = cave | ||||
| 		table.cave_frequent = cave_frequent | ||||
| 	end | ||||
| 	return table | ||||
| end | ||||
|  | ||||
| -- start playing the sound, set the handler and delete the handler after sound is played | ||||
| local play_sound = function(player, list, number) | ||||
| 	local player_name = player:get_player_name() | ||||
| 	if list.handler[player_name] == nil then | ||||
| 		local gain = 1.0 | ||||
| 		if list[number].gain ~= nil then | ||||
| 			gain = list[number].gain | ||||
| 		end | ||||
| 		local handler = minetest.sound_play(list[number].name, {to_player=player_name, gain=gain}) | ||||
| 		if handler ~= nil then | ||||
| 			list.handler[player_name] = handler | ||||
| 			minetest.after(list[number].length, function(args) | ||||
| 				local list = args[1] | ||||
| 				local player_name = args[2] | ||||
| 				if list.handler[player_name] ~= nil then | ||||
| 					minetest.sound_stop(list.handler[player_name]) | ||||
| 					list.handler[player_name] = nil | ||||
| 				end | ||||
| 			end, {list, player_name}) | ||||
| 		end | ||||
| 	end | ||||
| end | ||||
|  | ||||
| -- stops all sounds that are not in still_playing | ||||
| local stop_sound = function(still_playing, player) | ||||
| 	local player_name = player:get_player_name() | ||||
| 	if still_playing.cave == nil then | ||||
| 		local list = cave | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.cave_frequent == nil then | ||||
| 		local list = cave_frequent | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.night == nil then | ||||
| 		local list = night | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.night_frequent == nil then | ||||
| 		local list = night_frequent | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.day == nil then | ||||
| 		local list = day | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.day_frequent == nil then | ||||
| 		local list = day_frequent | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.music == nil then | ||||
| 		local list = music | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.water == nil then | ||||
| 		local list = water | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.water_frequent == nil then | ||||
| 		local list = water_frequent | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.splash == nil then | ||||
| 		local list = splash | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| end | ||||
|  | ||||
| local timer = 0 | ||||
| minetest.register_globalstep(function(dtime) | ||||
| 	timer = timer+dtime | ||||
| 	if timer < 1 then | ||||
| 		return | ||||
| 	end | ||||
| 	timer = 0 | ||||
|  | ||||
| 	for _,player in ipairs(minetest.get_connected_players()) do | ||||
| 		local ambiences = get_ambience(player) | ||||
| 		stop_sound(ambiences, player) | ||||
| 		for _,ambience in pairs(ambiences) do | ||||
| 			if math.random(1, 100) <= ambience.frequency then | ||||
| 				play_sound(player, ambience, math.random(1, #ambience)) | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
| end) | ||||
							
								
								
									
										439
									
								
								mods/ambience/init16.lua
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										439
									
								
								mods/ambience/init16.lua
									
									
									
									
									
										Обычный файл
									
								
							| @@ -0,0 +1,439 @@ | ||||
| -------------------------------------------------------------------------------------------------------- | ||||
| --Ambiance Configuration for version .16 | ||||
|  | ||||
| local max_frequency_all = 1000 --the larger you make this number the lest frequent ALL sounds will happen recommended values between 100-2000. | ||||
|  | ||||
| --for frequencies below use a number between 0 and max_frequency_all | ||||
| --for volumes below, use a number between 0.0 and 1, the larger the number the louder the sounds | ||||
| local night_frequency = 20  --owls, wolves  | ||||
| local night_volume = 0.9   | ||||
| local night_frequent_frequency = 150  --crickets | ||||
| local night_frequent_volume = 0.9 | ||||
| local day_frequency = 100  --crow, bluejay, cardinal | ||||
| local day_volume = 0.9  | ||||
| local day_frequent_frequency = 1000  --crow, bluejay, cardinal | ||||
| local day_frequent_volume = 0.18 | ||||
| local cave_frequency = 10  --bats | ||||
| local cave_volume = 1.0   | ||||
| local cave_frequent_frequency = 70  --drops of water dripping | ||||
| local cave_frequent_volume = 1.0  | ||||
| local beach_frequency = 20  --seagulls | ||||
| local beach_volume = 1.0   | ||||
| local beach_frequent_frequency = 1000  --waves | ||||
| local beach_frequent_volume = 1.0  | ||||
| local water_frequent_frequency = 1000  --water sounds | ||||
| local water_frequent_volume = 1.0  | ||||
| local music_frequency = 7  --music (suggestion: keep this one low like around 6) | ||||
| local music_volume = 0.3  | ||||
| --End of Config | ||||
| ---------------------------------------------------------------------------------------------------- | ||||
| local played_on_start = false | ||||
| local night = { | ||||
| 	handler = {}, | ||||
| 	frequency = night_frequency, | ||||
| 	{name="horned_owl", length=3, gain=night_volume}, | ||||
| 	{name="Wolves_Howling", length=11,  gain=night_volume}, | ||||
| 	{name="ComboWind", length=17,  gain=night_volume} | ||||
| } | ||||
|  | ||||
| local night_frequent = { | ||||
| 	handler = {}, | ||||
| 	frequency = night_frequent_frequency, | ||||
| 	{name="Crickets_At_NightCombo", length=69, gain=night_frequent_volume} | ||||
| } | ||||
|  | ||||
| local day = { | ||||
| 	handler = {}, | ||||
| 	frequency = day_frequency, | ||||
| 	{name="Best Cardinal Bird", length=4, gain=day_volume}, | ||||
| 	{name="craw", length=3, gain=day_volume}, | ||||
| 	{name="bluejay", length=18, gain=day_volume}, | ||||
| 	{name="ComboWind", length=17,  gain=day_volume} | ||||
| } | ||||
|  | ||||
| local day_frequent = { | ||||
| 	handler = {}, | ||||
| 	frequency = day_frequent_frequency, | ||||
| 	{name="robin2", length=16, gain=day_frequent_volume}, | ||||
| 	{name="birdsongnl", length=13, gain=day_frequent_volume}, | ||||
| 	{name="bird", length=30, gain=day_frequent_volume}, | ||||
| 	{name="Best Cardinal Bird", length=4, gain=day_frequent_volume}, | ||||
| 	{name="craw", length=3, gain=day_frequent_volume}, | ||||
| 	{name="bluejay", length=18, gain=day_frequent_volume}, | ||||
| 	{name="ComboWind", length=17,  gain=day_frequent_volume*3} | ||||
| } | ||||
|  | ||||
|  | ||||
| local cave = { | ||||
| 	handler = {}, | ||||
| 	frequency = cave_frequency, | ||||
| 	{name="Bats_in_Cave", length=5, gain=cave_volume} | ||||
| } | ||||
|  | ||||
| local cave_frequent = { | ||||
| 	handler = {}, | ||||
| 	frequency = cave_frequent_frequency, | ||||
| 	{name="drippingwater_drip_a", length=2, gain=cave_frequent_volume}, | ||||
| 	{name="drippingwater_drip_b", length=2, gain=cave_frequent_volume}, | ||||
| 	{name="drippingwater_drip_c", length=2, gain=cave_frequent_volume}, | ||||
| 	{name="Single_Water_Droplet", length=3, gain=cave_frequent_volume}, | ||||
| 	{name="Spooky_Water_Drops", length=7, gain=cave_frequent_volume} | ||||
| } | ||||
|  | ||||
| local beach = { | ||||
| 	handler = {}, | ||||
| 	frequency = beach_frequency, | ||||
| 	{name="seagull", length=4.5, gain=beach_volume} | ||||
| } | ||||
|  | ||||
| local beach_frequent = { | ||||
| 	handler = {}, | ||||
| 	frequency = beach_frequent_frequency, | ||||
| 	{name="fiji_beach", length=43.5, gain=beach_frequent_volume} | ||||
| } | ||||
|  | ||||
|  | ||||
| local water = { | ||||
| 	handler = {}, | ||||
| 	frequency = 0,--dolphins dont fit into small lakes | ||||
| 	{name="dolphins", length=6}, | ||||
| 	{name="dolphins_screaming", length=16.5} | ||||
| } | ||||
|  | ||||
| local water_frequent = { | ||||
| 	handler = {}, | ||||
| 	frequency = water_frequent_frequency, | ||||
| 	on_stop = "drowning_gasp", | ||||
| 	on_start = "Splash", | ||||
| 	{name="scuba1bubbles", length=11, gain=water_frequent_volume}, | ||||
| 	{name="scuba1calm", length=10},  --not sure why but sometimes I get errors when setting gain=water_frequent_volume here. | ||||
| 	{name="scuba1calm2", length=8.5, gain=water_frequent_volume}, | ||||
| 	{name="scuba1interestingbubbles", length=11, gain=water_frequent_volume}, | ||||
| 	{name="scuba1tubulentbubbles", length=10.5, gain=water_frequent_volume} | ||||
| } | ||||
|  | ||||
| local flowing_water = { | ||||
| 	handler = {}, | ||||
| 	frequency = 1000, | ||||
| 	{name="small_waterfall", length=14, gain=.4} | ||||
| } | ||||
| local flowing_water2 = { | ||||
| 	handler = {}, | ||||
| 	frequency = 1000, | ||||
| 	{name="small_waterfall", length=11, gain=.3} | ||||
| } | ||||
|  | ||||
| local lava = { | ||||
| 	handler = {}, | ||||
| 	frequency = 1000, | ||||
| 	{name="earth01a", length=20} | ||||
| } | ||||
| local lava2 = { | ||||
| 	handler = {}, | ||||
| 	frequency = 1000, | ||||
| 	{name="earth01a", length=15} | ||||
| } | ||||
|  | ||||
|  | ||||
| local play_music = minetest.setting_getbool("music") or false | ||||
| local music = { | ||||
| 	handler = {}, | ||||
| 	frequency = music_frequency, | ||||
| 	{name="mtest", length=4*60+33, gain=music_volume}, | ||||
| 	{name="echos", length=2*60+26, gain=music_volume}, | ||||
| 	{name="FoamOfTheSea", length=1*60+50, gain=music_volume}, | ||||
| 	{name="eastern_feeling", length=3*60+51, gain=music_volume}, | ||||
| 	{name="Mass_Effect_Uncharted_Worlds", length=2*60+29, gain=music_volume}, | ||||
| 	{name="dark_ambiance", length=44, gain=music_volume} | ||||
| } | ||||
|  | ||||
| local is_daytime = function() | ||||
| 	return (minetest.env:get_timeofday() > 0.2 and  minetest.env:get_timeofday() < 0.8) | ||||
| end | ||||
|  | ||||
| --[[old | ||||
| local nodes_in_range = function(pos, search_distance, node_name) | ||||
| 	local search_p = {x=0, y=0, z=0} | ||||
| 	local nodes_found = 0 | ||||
| 	for p_x=(pos.x-search_distance), (pos.x+search_distance) do | ||||
| 		for p_y=(pos.y-search_distance), (pos.y+search_distance) do | ||||
| 			for p_z=(pos.z-search_distance), (pos.z+search_distance) do | ||||
| 				local search_n = minetest.env:get_node({x=p_x, y=p_y, z=p_z}) | ||||
| 				if search_n.name == node_name then | ||||
| 					nodes_found = nodes_found + 1 | ||||
| 				end | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
| 	return nodes_found | ||||
| 	--minetest.chat_send_all("Range: " .. tostring(search_distance) .. " | Found (" .. node_name .. ": " .. nodes_found .. ")") | ||||
| end --]] | ||||
|  | ||||
| local nodes_in_range = function(pos, search_distance, node_name) | ||||
| 	minp = {x=pos.x-search_distance,y=pos.y-search_distance, z=pos.z-search_distance} | ||||
| 	maxp = {x=pos.x+search_distance,y=pos.y+search_distance, z=pos.z+search_distance} | ||||
| 	nodes = minetest.env:find_nodes_in_area(minp, maxp, node_name) | ||||
| --	minetest.chat_send_all("Found (" .. node_name .. ": " .. #nodes .. ")") | ||||
| 	return #nodes | ||||
| end | ||||
|  | ||||
|  | ||||
| local get_ambience = function(player) | ||||
| 	local pos = player:getpos() | ||||
| 	pos.y = pos.y+1.0 | ||||
| 	local nodename = minetest.env:get_node(pos).name | ||||
| 	if string.find(nodename, "default:water") then | ||||
| 		if music then | ||||
| 			return {water=water, water_frequent=water_frequent, music=music} | ||||
| 		else | ||||
| 			return {water=water, water_frequent=water_frequent} | ||||
| 		end | ||||
| 	end | ||||
| 	if nodes_in_range(pos, 7, "default:lava_flowing")>5 or nodes_in_range(pos, 7, "default:lava_source")>5 then | ||||
| 		if music then | ||||
| 			return {lava=lava, lava2=lava2, music=music}		 | ||||
| 		else | ||||
| 			return {lava=lava} | ||||
| 		end | ||||
| 	end | ||||
| 	if nodes_in_range(pos, 7, "default:water_flowing")>5 then | ||||
| 		if music then | ||||
| 			return {flowing_water=flowing_water, flowing_water2=flowing_water2, music=music} | ||||
| 		else | ||||
| 			return {flowing_water=flowing_water, flowing_water2=flowing_water2} | ||||
| 		end | ||||
| 	end | ||||
| 	pos.y = pos.y-2  | ||||
| 	nodename = minetest.env:get_node(pos).name | ||||
| 	--minetest.chat_send_all("Found " .. nodename .. pos.y ) | ||||
| 	if string.find(nodename, "default:sand") and pos.y < 5 then | ||||
| 		if music then | ||||
| 			return {beach=beach, beach_frequent=beach_frequent, music=music} | ||||
| 		else | ||||
| 			return {beach=beach, beach_frequent=beach_frequent} | ||||
| 		end | ||||
| 	end | ||||
| 	if player:getpos().y < 0 then | ||||
| 		if music then | ||||
| 			return {cave=cave, cave_frequent=cave_frequent, music=music} | ||||
| 		else | ||||
| 			return {cave=cave, cave_frequent=cave_frequent} | ||||
| 		end | ||||
| 	end | ||||
| 	if is_daytime() then | ||||
| 		if music then | ||||
| 			return {day=day, day_frequent=day_frequent, music=music} | ||||
| 		else | ||||
| 			return {day=day, day_frequent=day_frequent} | ||||
| 		end | ||||
| 	else | ||||
| 		if music then | ||||
| 			return {night=night, night_frequent=night_frequent, music=music} | ||||
| 		else | ||||
| 			return {night=night, night_frequent=night_frequent} | ||||
| 		end | ||||
| 	end | ||||
| end | ||||
|  | ||||
| -- start playing the sound, set the handler and delete the handler after sound is played | ||||
| local play_sound = function(player, list, number) | ||||
| 	local player_name = player:get_player_name() | ||||
| 	if list.handler[player_name] == nil then | ||||
| 		local gain = 1.0 | ||||
| 		if list[number].gain ~= nil then | ||||
| 			gain = list[number].gain | ||||
| 		end | ||||
| 		local handler = minetest.sound_play(list[number].name, {to_player=player_name, gain=gain}) | ||||
| 		if handler ~= nil then | ||||
| 			list.handler[player_name] = handler | ||||
| 			minetest.after(list[number].length, function(args) | ||||
| 				local list = args[1] | ||||
| 				local player_name = args[2] | ||||
| 				if list.handler[player_name] ~= nil then | ||||
| 					minetest.sound_stop(list.handler[player_name]) | ||||
| 					list.handler[player_name] = nil | ||||
| 				end | ||||
| 			end, {list, player_name}) | ||||
| 		end | ||||
| 	end | ||||
| end | ||||
|  | ||||
| -- stops all sounds that are not in still_playing | ||||
| local stop_sound = function(still_playing, player) | ||||
| 	local player_name = player:get_player_name() | ||||
| 	if still_playing.cave == nil then | ||||
| 		local list = cave | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.cave_frequent == nil then | ||||
| 		local list = cave_frequent | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.beach == nil then | ||||
| 		local list = beach | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.beach_frequent == nil then | ||||
| 		local list = beach_frequent | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
|  | ||||
| 	if still_playing.night == nil then | ||||
| 		local list = night | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.night_frequent == nil then | ||||
| 		local list = night_frequent | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.day == nil then | ||||
| 		local list = day | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.day_frequent == nil then | ||||
| 		local list = day_frequent | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.music == nil then | ||||
| 		local list = music | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.flowing_water == nil then | ||||
| 		local list = flowing_water | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.flowing_water2 == nil then | ||||
| 		local list = flowing_water2 | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.lava == nil then | ||||
| 		local list = lava | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end	 | ||||
| 	if still_playing.lava2 == nil then | ||||
| 		local list = lava2 | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end		 | ||||
| 	if still_playing.water == nil then | ||||
| 		local list = water | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.water_frequent == nil then | ||||
| 		local list = water_frequent | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then				 | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 				played_on_start = false | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| end | ||||
|  | ||||
| local timer = 0 | ||||
| minetest.register_globalstep(function(dtime) | ||||
| 	timer = timer+dtime | ||||
| 	if timer < 1 then | ||||
| 		return | ||||
| 	end | ||||
| 	timer = 0 | ||||
|  | ||||
| 	for _,player in ipairs(minetest.get_connected_players()) do | ||||
| 		local ambiences = get_ambience(player) | ||||
| 		stop_sound(ambiences, player) | ||||
| 		for _,ambience in pairs(ambiences) do | ||||
| 			if math.random(1, 1000) <= ambience.frequency then | ||||
| 				if ambience.on_start ~= nil and played_on_start == false then | ||||
| 					played_on_start = true | ||||
| 					minetest.sound_play(ambience.on_start, {to_player=player:get_player_name()})					 | ||||
| 				end | ||||
| 				play_sound(player, ambience, math.random(1, #ambience)) | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
| end) | ||||
							
								
								
									
										474
									
								
								mods/ambience/init17.lua
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										474
									
								
								mods/ambience/init17.lua
									
									
									
									
									
										Обычный файл
									
								
							| @@ -0,0 +1,474 @@ | ||||
| -------------------------------------------------------------------------------------------------------- | ||||
| --Ambiance Configuration for version .17 | ||||
|  | ||||
| local max_frequency_all = 1000 --the larger you make this number the lest frequent ALL sounds will happen recommended values between 100-2000. | ||||
|  | ||||
| --for frequencies below use a number between 0 and max_frequency_all | ||||
| --for volumes below, use a number between 0.0 and 1, the larger the number the louder the sounds | ||||
| local night_frequency = 20  --owls, wolves  | ||||
| local night_volume = 0.9   | ||||
| local night_frequent_frequency = 150  --crickets | ||||
| local night_frequent_volume = 0.9 | ||||
| local day_frequency = 100  --crow, bluejay, cardinal | ||||
| local day_volume = 0.9  | ||||
| local day_frequent_frequency = 1000  --crow, bluejay, cardinal | ||||
| local day_frequent_volume = 0.18 | ||||
| local cave_frequency = 10  --bats | ||||
| local cave_volume = 1.0   | ||||
| local cave_frequent_frequency = 70  --drops of water dripping | ||||
| local cave_frequent_volume = 1.0  | ||||
| local beach_frequency = 20  --seagulls | ||||
| local beach_volume = 1.0   | ||||
| local beach_frequent_frequency = 1000  --waves | ||||
| local beach_frequent_volume = 1.0  | ||||
| local water_frequent_frequency = 1000  --water sounds | ||||
| local water_frequent_volume = 1.0  | ||||
| local music_frequency = 0  --music (suggestion: keep this one low like around 6) | ||||
| local music_volume = 0.3  | ||||
| --End of Config | ||||
| ---------------------------------------------------------------------------------------------------- | ||||
| local played_on_start = false | ||||
| local night = { | ||||
| 	handler = {}, | ||||
| 	frequency = night_frequency, | ||||
| 	{name="horned_owl", length=3, gain=night_volume}, | ||||
| 	{name="Wolves_Howling", length=11,  gain=night_volume}, | ||||
| 	{name="ComboWind", length=17,  gain=night_volume} | ||||
| } | ||||
|  | ||||
| local night_frequent = { | ||||
| 	handler = {}, | ||||
| 	frequency = night_frequent_frequency, | ||||
| 	{name="Crickets_At_NightCombo", length=69, gain=night_frequent_volume} | ||||
| } | ||||
|  | ||||
| local day = { | ||||
| 	handler = {}, | ||||
| 	frequency = day_frequency, | ||||
| 	{name="Best Cardinal Bird", length=4, gain=day_volume}, | ||||
| 	{name="craw", length=3, gain=day_volume}, | ||||
| 	{name="bluejay", length=18, gain=day_volume}, | ||||
| 	{name="ComboWind", length=17,  gain=day_volume} | ||||
| } | ||||
|  | ||||
| local day_frequent = { | ||||
| 	handler = {}, | ||||
| 	frequency = day_frequent_frequency, | ||||
| 	{name="robin2", length=16, gain=day_frequent_volume}, | ||||
| 	{name="birdsongnl", length=13, gain=day_frequent_volume}, | ||||
| 	{name="bird", length=30, gain=day_frequent_volume}, | ||||
| 	{name="Best Cardinal Bird", length=4, gain=day_frequent_volume}, | ||||
| 	{name="craw", length=3, gain=day_frequent_volume}, | ||||
| 	{name="bluejay", length=18, gain=day_frequent_volume}, | ||||
| 	{name="ComboWind", length=17,  gain=day_frequent_volume*3} | ||||
| } | ||||
|  | ||||
|  | ||||
| local cave = { | ||||
| 	handler = {}, | ||||
| 	frequency = cave_frequency, | ||||
| 	{name="Bats_in_Cave", length=5, gain=cave_volume} | ||||
| } | ||||
|  | ||||
| local cave_frequent = { | ||||
| 	handler = {}, | ||||
| 	frequency = cave_frequent_frequency, | ||||
| 	{name="drippingwater_drip_a", length=2, gain=cave_frequent_volume}, | ||||
| 	{name="drippingwater_drip_b", length=2, gain=cave_frequent_volume}, | ||||
| 	{name="drippingwater_drip_c", length=2, gain=cave_frequent_volume}, | ||||
| 	{name="Single_Water_Droplet", length=3, gain=cave_frequent_volume}, | ||||
| 	{name="Spooky_Water_Drops", length=7, gain=cave_frequent_volume} | ||||
| } | ||||
|  | ||||
| local beach = { | ||||
| 	handler = {}, | ||||
| 	frequency = beach_frequency, | ||||
| 	{name="seagull", length=4.5, gain=beach_volume} | ||||
| } | ||||
|  | ||||
| local beach_frequent = { | ||||
| 	handler = {}, | ||||
| 	frequency = beach_frequent_frequency, | ||||
| 	{name="fiji_beach", length=43.5, gain=beach_frequent_volume} | ||||
| } | ||||
|  | ||||
|  | ||||
| local water = { | ||||
| 	handler = {}, | ||||
| 	frequency = 0,--dolphins dont fit into small lakes | ||||
| 	{name="dolphins", length=6}, | ||||
| 	{name="dolphins_screaming", length=16.5} | ||||
| } | ||||
|  | ||||
| local water_frequent = { | ||||
| 	handler = {}, | ||||
| 	frequency = water_frequent_frequency, | ||||
| 	on_stop = "drowning_gasp", | ||||
| 	on_start = "Splash", | ||||
| 	{name="scuba1bubbles", length=11, gain=water_frequent_volume}, | ||||
| 	{name="scuba1calm", length=10},  --not sure why but sometimes I get errors when setting gain=water_frequent_volume here. | ||||
| 	{name="scuba1calm2", length=8.5, gain=water_frequent_volume}, | ||||
| 	{name="scuba1interestingbubbles", length=11, gain=water_frequent_volume}, | ||||
| 	{name="scuba1tubulentbubbles", length=10.5, gain=water_frequent_volume} | ||||
| } | ||||
|  | ||||
| local water_surface = { | ||||
| 	handler = {}, | ||||
| 	frequency = 10, | ||||
| 	on_start = "Splash", | ||||
| 	{name="lake_waves_2_calm", length=9.5}, | ||||
| 	{name="lake_waves_2_variety", length=13.1} | ||||
| } | ||||
|  | ||||
| local flowing_water = { | ||||
| 	handler = {}, | ||||
| 	frequency = 1000, | ||||
| 	{name="small_waterfall", length=14, gain=.4} | ||||
| } | ||||
| local flowing_water2 = { | ||||
| 	handler = {}, | ||||
| 	frequency = 1000, | ||||
| 	{name="small_waterfall", length=11, gain=.3} | ||||
| } | ||||
|  | ||||
| local lava = { | ||||
| 	handler = {}, | ||||
| 	frequency = 1000, | ||||
| 	{name="earth01a", length=20} | ||||
| } | ||||
| local lava2 = { | ||||
| 	handler = {}, | ||||
| 	frequency = 1000, | ||||
| 	{name="earth01a", length=15} | ||||
| } | ||||
|  | ||||
|  | ||||
| local play_music = minetest.setting_getbool("music") or false | ||||
| local music = { | ||||
| 	handler = {}, | ||||
| 	frequency = music_frequency, | ||||
| 	{name="mtest", length=4*60+33, gain=music_volume}, | ||||
| 	{name="echos", length=2*60+26, gain=music_volume}, | ||||
| 	{name="FoamOfTheSea", length=1*60+50, gain=music_volume}, | ||||
| 	{name="eastern_feeling", length=3*60+51, gain=music_volume}, | ||||
| 	{name="Mass_Effect_Uncharted_Worlds", length=2*60+29, gain=music_volume}, | ||||
| 	{name="dark_ambiance", length=44, gain=music_volume} | ||||
| } | ||||
|  | ||||
| local is_daytime = function() | ||||
| 	return (minetest.env:get_timeofday() > 0.2 and  minetest.env:get_timeofday() < 0.8) | ||||
| end | ||||
|  | ||||
| --[[old | ||||
| local nodes_in_range = function(pos, search_distance, node_name) | ||||
| 	local search_p = {x=0, y=0, z=0} | ||||
| 	local nodes_found = 0 | ||||
| 	for p_x=(pos.x-search_distance), (pos.x+search_distance) do | ||||
| 		for p_y=(pos.y-search_distance), (pos.y+search_distance) do | ||||
| 			for p_z=(pos.z-search_distance), (pos.z+search_distance) do | ||||
| 				local search_n = minetest.env:get_node({x=p_x, y=p_y, z=p_z}) | ||||
| 				if search_n.name == node_name then | ||||
| 					nodes_found = nodes_found + 1 | ||||
| 				end | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
| 	return nodes_found | ||||
| 	--minetest.chat_send_all("Range: " .. tostring(search_distance) .. " | Found (" .. node_name .. ": " .. nodes_found .. ")") | ||||
| end --]] | ||||
|  | ||||
| local nodes_in_range = function(pos, search_distance, node_name) | ||||
| 	minp = {x=pos.x-search_distance,y=pos.y-search_distance, z=pos.z-search_distance} | ||||
| 	maxp = {x=pos.x+search_distance,y=pos.y+search_distance, z=pos.z+search_distance} | ||||
| 	nodes = minetest.env:find_nodes_in_area(minp, maxp, node_name) | ||||
| --	minetest.chat_send_all("Found (" .. node_name .. ": " .. #nodes .. ")") | ||||
| 	return #nodes | ||||
| end | ||||
|  | ||||
|  | ||||
| local get_ambience = function(player) | ||||
| 	local pos = player:getpos() | ||||
| 	pos.y = pos.y+1.0 | ||||
| 	local nodename = minetest.env:get_node(pos).name | ||||
| 	if string.find(nodename, "default:water") then | ||||
| 		if music then | ||||
| 			return {water=water, water_frequent=water_frequent, music=music} | ||||
| 		else | ||||
| 			return {water=water, water_frequent=water_frequent} | ||||
| 		end | ||||
| 	elseif nodename == "air" then | ||||
| 		pos.y = pos.y-1.5 | ||||
| 		local nodename = minetest.env:get_node(pos).name | ||||
| 		pos.y = pos.y+1.5 | ||||
| 		if string.find(nodename, "default:water") then | ||||
| 			if music then | ||||
| 				return {water_surface=water_surface, music=music} | ||||
| 			else | ||||
| 				return {water_surface} | ||||
| 			end		 | ||||
| 		end	 | ||||
| 	end | ||||
|  | ||||
| 	if nodes_in_range(pos, 7, "default:lava_flowing")>5 or nodes_in_range(pos, 7, "default:lava_source")>5 then | ||||
| 		if music then | ||||
| 			return {lava=lava, lava2=lava2, music=music}		 | ||||
| 		else | ||||
| 			return {lava=lava} | ||||
| 		end | ||||
| 	end | ||||
| 	if nodes_in_range(pos, 7, "default:water_flowing")>5 then | ||||
| 		if music then | ||||
| 			return {flowing_water=flowing_water, flowing_water2=flowing_water2, music=music} | ||||
| 		else | ||||
| 			return {flowing_water=flowing_water, flowing_water2=flowing_water2} | ||||
| 		end | ||||
| 	end	 | ||||
| 	pos.y = pos.y-2  | ||||
| 	nodename = minetest.env:get_node(pos).name | ||||
| 	--minetest.chat_send_all("Found " .. nodename .. pos.y ) | ||||
| 	if string.find(nodename, "default:sand") and pos.y < 5 then | ||||
| 		if music then | ||||
| 			return {beach=beach, beach_frequent=beach_frequent, music=music} | ||||
| 		else | ||||
| 			return {beach=beach, beach_frequent=beach_frequent} | ||||
| 		end | ||||
| 	end | ||||
| 	if player:getpos().y < 0 then | ||||
| 		if music then | ||||
| 			return {cave=cave, cave_frequent=cave_frequent, music=music} | ||||
| 		else | ||||
| 			return {cave=cave, cave_frequent=cave_frequent} | ||||
| 		end | ||||
| 	end | ||||
| 	if is_daytime() then | ||||
| 		if music then | ||||
| 			return {day=day, day_frequent=day_frequent, music=music} | ||||
| 		else | ||||
| 			return {day=day, day_frequent=day_frequent} | ||||
| 		end | ||||
| 	else | ||||
| 		if music then | ||||
| 			return {night=night, night_frequent=night_frequent, music=music} | ||||
| 		else | ||||
| 			return {night=night, night_frequent=night_frequent} | ||||
| 		end | ||||
| 	end | ||||
| end | ||||
|  | ||||
| -- start playing the sound, set the handler and delete the handler after sound is played | ||||
| local play_sound = function(player, list, number) | ||||
| 	local player_name = player:get_player_name() | ||||
| 	if list.handler[player_name] == nil then | ||||
| 		local gain = 1.0 | ||||
| 		if list[number].gain ~= nil then | ||||
| 			gain = list[number].gain | ||||
| 		end | ||||
| 		local handler = minetest.sound_play(list[number].name, {to_player=player_name, gain=gain}) | ||||
| 		if handler ~= nil then | ||||
| 			list.handler[player_name] = handler | ||||
| 			minetest.after(list[number].length, function(args) | ||||
| 				local list = args[1] | ||||
| 				local player_name = args[2] | ||||
| 				if list.handler[player_name] ~= nil then | ||||
| 					minetest.sound_stop(list.handler[player_name]) | ||||
| 					list.handler[player_name] = nil | ||||
| 				end | ||||
| 			end, {list, player_name}) | ||||
| 		end | ||||
| 	end | ||||
| end | ||||
|  | ||||
| -- stops all sounds that are not in still_playing | ||||
| local stop_sound = function(still_playing, player) | ||||
| 	local player_name = player:get_player_name() | ||||
| 	if still_playing.cave == nil then | ||||
| 		local list = cave | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.cave_frequent == nil then | ||||
| 		local list = cave_frequent | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.beach == nil then | ||||
| 		local list = beach | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.beach_frequent == nil then | ||||
| 		local list = beach_frequent | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
|  | ||||
| 	if still_playing.night == nil then | ||||
| 		local list = night | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.night_frequent == nil then | ||||
| 		local list = night_frequent | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.day == nil then | ||||
| 		local list = day | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.day_frequent == nil then | ||||
| 		local list = day_frequent | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.music == nil then | ||||
| 		local list = music | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.flowing_water == nil then | ||||
| 		local list = flowing_water | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.flowing_water2 == nil then | ||||
| 		local list = flowing_water2 | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.lava == nil then | ||||
| 		local list = lava | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end	 | ||||
| 	if still_playing.lava2 == nil then | ||||
| 		local list = lava2 | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end		 | ||||
| 	if still_playing.water == nil then | ||||
| 		local list = water | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.water_surface == nil then | ||||
| 		local list = water_surface | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then				 | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 				played_on_start = false | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.water_frequent == nil then | ||||
| 		local list = water_frequent | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then				 | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 				minetest.chat_send_all("list.on_stop " .. list.on_stop  )				 | ||||
| 		--		played_on_start = false | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
|  | ||||
|  | ||||
| 	 | ||||
| end | ||||
|  | ||||
| local timer = 0 | ||||
| minetest.register_globalstep(function(dtime) | ||||
| 	timer = timer+dtime | ||||
| 	if timer < 1 then | ||||
| 		return | ||||
| 	end | ||||
| 	timer = 0 | ||||
|  | ||||
| 	for _,player in ipairs(minetest.get_connected_players()) do | ||||
| 		local ambiences = get_ambience(player) | ||||
| 		stop_sound(ambiences, player) | ||||
| 		for _,ambience in pairs(ambiences) do | ||||
| 			if math.random(1, 1000) <= ambience.frequency then | ||||
| 				if ambience.on_start ~= nil and played_on_start == false then | ||||
| 					played_on_start = true | ||||
| 					minetest.sound_play(ambience.on_start, {to_player=player:get_player_name()})					 | ||||
| 				end | ||||
| 				play_sound(player, ambience, math.random(1, #ambience)) | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
| end) | ||||
							
								
								
									
										722
									
								
								mods/ambience/init29debug.lua
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										722
									
								
								mods/ambience/init29debug.lua
									
									
									
									
									
										Обычный файл
									
								
							| @@ -0,0 +1,722 @@ | ||||
| -------------------------------------------------------------------------------------------------------- | ||||
| --Ambiance Configuration for version .29    | ||||
| --working on Flying | ||||
| --PROB:  wind stops short even though it says we are still flying and don't hear the start sound. | ||||
| --really BIG prob, it ruins water meaning you hear beach while treading water.  (find out if still hear it in .28) because | ||||
| --it is fairly rare in .29 | ||||
| --need a separate onstart variable for flying | ||||
|  | ||||
|  | ||||
| local max_frequency_all = 1000 --the larger you make this number the lest frequent ALL sounds will happen recommended values between 100-2000. | ||||
|  | ||||
| --for frequencies below use a number between 0 and max_frequency_all | ||||
| --for volumes below, use a number between 0.0 and 1, the larger the number the louder the sounds | ||||
| local night_frequency = 20  --owls, wolves  | ||||
| local night_volume = 0.9   | ||||
| local night_frequent_frequency = 150  --crickets | ||||
| local night_frequent_volume = 0.9 | ||||
| local day_frequency = 100  --crow, bluejay, cardinal | ||||
| local day_volume = 0.9  | ||||
| local day_frequent_frequency = 1000  --crow, bluejay, cardinal | ||||
| local day_frequent_volume = 0.18 | ||||
| local cave_frequency = 10  --bats | ||||
| local cave_volume = 1.0   | ||||
| local cave_frequent_frequency = 70  --drops of water dripping | ||||
| local cave_frequent_volume = 1.0  | ||||
| local beach_frequency = 20  --seagulls | ||||
| local beach_volume = 1.0   | ||||
| local beach_frequent_frequency = 1000  --waves | ||||
| local beach_frequent_volume = 1.0  | ||||
| local water_frequent_frequency = 1000  --water sounds | ||||
| local water_frequent_volume = 1.0  | ||||
| local desert_frequency = 20  --coyote | ||||
| local desert_volume = 1.0   | ||||
| local desert_frequent_frequency = 700  --desertwind | ||||
| local desert_frequent_volume = 1.0  | ||||
| local swimming_frequent_frequency = 1000  --swimming splashes | ||||
| local swimming_frequent_volume = 1.0  | ||||
| local music_frequency = 0  --music (suggestion: keep this one low like around 6) | ||||
| local music_volume = 0.3  | ||||
| --End of Config | ||||
| ---------------------------------------------------------------------------------------------------- | ||||
| local counter=0--***************** | ||||
| local last_x_pos = 0 | ||||
| local last_y_pos = 0 | ||||
| local last_z_pos = 0 | ||||
| local node_under_feet | ||||
| local node_at_upper_body | ||||
| local node_at_lower_body | ||||
| local node_3_under_feet | ||||
|  | ||||
| local played_on_start = false | ||||
| local played_on_start_flying = false | ||||
|  | ||||
| local night = { | ||||
| 	handler = {}, | ||||
| 	frequency = night_frequency, | ||||
| 	{name="horned_owl", length=3, gain=night_volume}, | ||||
| 	{name="Wolves_Howling", length=11,  gain=night_volume}, | ||||
| 	{name="ComboWind", length=17,  gain=night_volume} | ||||
| } | ||||
|  | ||||
| local night_frequent = { | ||||
| 	handler = {}, | ||||
| 	frequency = night_frequent_frequency, | ||||
| 	{name="Crickets_At_NightCombo", length=69, gain=night_frequent_volume} | ||||
| } | ||||
|  | ||||
| local day = { | ||||
| 	handler = {}, | ||||
| 	frequency = day_frequency, | ||||
| 	{name="Best Cardinal Bird", length=4, gain=day_volume}, | ||||
| 	{name="craw", length=3, gain=day_volume}, | ||||
| 	{name="bluejay", length=18, gain=day_volume}, | ||||
| 	{name="ComboWind", length=17,  gain=day_volume} | ||||
| } | ||||
|  | ||||
| local day_frequent = { | ||||
| 	handler = {}, | ||||
| 	frequency = day_frequent_frequency, | ||||
| 	{name="robin2", length=16, gain=day_frequent_volume}, | ||||
| 	{name="birdsongnl", length=13, gain=day_frequent_volume}, | ||||
| 	{name="bird", length=30, gain=day_frequent_volume}, | ||||
| 	{name="Best Cardinal Bird", length=4, gain=day_frequent_volume}, | ||||
| 	{name="craw", length=3, gain=day_frequent_volume}, | ||||
| 	{name="bluejay", length=18, gain=day_frequent_volume}, | ||||
| 	{name="ComboWind", length=17,  gain=day_frequent_volume*3} | ||||
| } | ||||
| local swimming_frequent = { | ||||
| 	handler = {}, | ||||
| 	frequency = day_frequent_frequency, | ||||
| 	{name="water_swimming_splashing_breath", length=11.5, gain=swimming_frequent_volume}, | ||||
| 	{name="water_swimming_splashing", length=9, gain=swimming_frequent_volume} | ||||
| } | ||||
|  | ||||
| local cave = { | ||||
| 	handler = {}, | ||||
| 	frequency = cave_frequency, | ||||
| 	{name="Bats_in_Cave", length=5, gain=cave_volume} | ||||
| } | ||||
|  | ||||
| local cave_frequent = { | ||||
| 	handler = {}, | ||||
| 	frequency = cave_frequent_frequency, | ||||
| 	{name="drippingwater_drip_a", length=2, gain=cave_frequent_volume}, | ||||
| 	{name="drippingwater_drip_b", length=2, gain=cave_frequent_volume}, | ||||
| 	{name="drippingwater_drip_c", length=2, gain=cave_frequent_volume}, | ||||
| 	{name="Single_Water_Droplet", length=3, gain=cave_frequent_volume}, | ||||
| 	{name="Spooky_Water_Drops", length=7, gain=cave_frequent_volume} | ||||
| } | ||||
|  | ||||
| local beach = { | ||||
| 	handler = {}, | ||||
| 	frequency = beach_frequency, | ||||
| 	{name="seagull", length=4.5, gain=beach_volume} | ||||
| } | ||||
|  | ||||
| local beach_frequent = { | ||||
| 	handler = {}, | ||||
| 	frequency = beach_frequent_frequency, | ||||
| 	{name="fiji_beach", length=43.5, gain=beach_frequent_volume} | ||||
| } | ||||
|  | ||||
| local desert = { | ||||
| 	handler = {}, | ||||
| 	frequency = desert_frequency, | ||||
| 	{name="coyote2", length=2.5, gain=desert_volume}, | ||||
| 	{name="RattleSnake", length=8, gain=desert_volume} | ||||
| } | ||||
|  | ||||
| local desert_frequent = { | ||||
| 	handler = {}, | ||||
| 	frequency = desert_frequent_frequency, | ||||
| 	{name="DesertMonolithMed", length=34.5, gain=desert_frequent_volume} | ||||
| } | ||||
|  | ||||
| local flying = { | ||||
| 	handler = {}, | ||||
| 	frequency = 1000, | ||||
| 	on_start = "crystal_airlines", | ||||
| 	on_stop = "nothing_yet", | ||||
| 	{name="ComboWind", length=17,  gain=1} | ||||
| } | ||||
|  | ||||
| local water = { | ||||
| 	handler = {}, | ||||
| 	frequency = 0,--dolphins dont fit into small lakes | ||||
| 	{name="dolphins", length=6}, | ||||
| 	{name="dolphins_screaming", length=16.5} | ||||
| } | ||||
|  | ||||
| local water_frequent = { | ||||
| 	handler = {}, | ||||
| 	frequency = water_frequent_frequency, | ||||
| 	on_stop = "drowning_gasp", | ||||
| 	--on_start = "Splash", | ||||
| 	{name="scuba1bubbles", length=11, gain=water_frequent_volume}, | ||||
| 	{name="scuba1calm", length=10},  --not sure why but sometimes I get errors when setting gain=water_frequent_volume here. | ||||
| 	{name="scuba1calm2", length=8.5, gain=water_frequent_volume}, | ||||
| 	{name="scuba1interestingbubbles", length=11, gain=water_frequent_volume}, | ||||
| 	{name="scuba1tubulentbubbles", length=10.5, gain=water_frequent_volume} | ||||
| } | ||||
|  | ||||
| local water_surface = { | ||||
| 	handler = {}, | ||||
| 	frequency = 1000, | ||||
| 	on_stop = "Splash", | ||||
| 	on_start = "Splash", | ||||
| 	{name="lake_waves_2_calm", length=9.5}, | ||||
| 	{name="lake_waves_2_variety", length=13.1} | ||||
| } | ||||
| local splashing_water = { | ||||
| 	handler = {}, | ||||
| 	frequency = 1000, | ||||
| 	{name="Splash", length=1.22, gain=1} | ||||
| } | ||||
|  | ||||
| local flowing_water = { | ||||
| 	handler = {}, | ||||
| 	frequency = 1000, | ||||
| 	{name="small_waterfall", length=14, gain=.4} | ||||
| } | ||||
| local flowing_water2 = { | ||||
| 	handler = {}, | ||||
| 	frequency = 1000, | ||||
| 	{name="small_waterfall", length=11, gain=.3} | ||||
| } | ||||
|  | ||||
| local lava = { | ||||
| 	handler = {}, | ||||
| 	frequency = 1000, | ||||
| 	{name="earth01a", length=20} | ||||
| } | ||||
| local lava2 = { | ||||
| 	handler = {}, | ||||
| 	frequency = 1000, | ||||
| 	{name="earth01a", length=15} | ||||
| } | ||||
|  | ||||
|  | ||||
| local play_music = minetest.setting_getbool("music") or false | ||||
| local music = { | ||||
| 	handler = {}, | ||||
| 	frequency = music_frequency, | ||||
| 	{name="mtest", length=4*60+33, gain=music_volume}, | ||||
| 	{name="echos", length=2*60+26, gain=music_volume}, | ||||
| 	{name="FoamOfTheSea", length=1*60+50, gain=music_volume}, | ||||
| 	{name="eastern_feeling", length=3*60+51, gain=music_volume}, | ||||
| 	{name="Mass_Effect_Uncharted_Worlds", length=2*60+29, gain=music_volume}, | ||||
| 	{name="dark_ambiance", length=44, gain=music_volume} | ||||
| } | ||||
|  | ||||
| local is_daytime = function() | ||||
| 	return (minetest.env:get_timeofday() > 0.2 and  minetest.env:get_timeofday() < 0.8) | ||||
| end | ||||
|  | ||||
| local nodes_in_range = function(pos, search_distance, node_name) | ||||
| 	minp = {x=pos.x-search_distance,y=pos.y-search_distance, z=pos.z-search_distance} | ||||
| 	maxp = {x=pos.x+search_distance,y=pos.y+search_distance, z=pos.z+search_distance} | ||||
| 	nodes = minetest.env:find_nodes_in_area(minp, maxp, node_name) | ||||
| 	--minetest.chat_send_all("Found (" .. node_name .. ": " .. #nodes .. ")") | ||||
| 	return #nodes | ||||
| end | ||||
|  | ||||
| local nodes_in_coords = function(minp, maxp, node_name) | ||||
| 	nodes = minetest.env:find_nodes_in_area(minp, maxp, node_name) | ||||
| 	--minetest.chat_send_all("Found (" .. node_name .. ": " .. #nodes .. ")") | ||||
| 	return #nodes | ||||
| end | ||||
|  | ||||
| local atleast_nodes_in_grid = function(pos, search_distance, height, node_name, threshold) | ||||
| --	counter = counter +1 | ||||
| --	minetest.chat_send_all("counter: (" .. counter .. ")") | ||||
| 	minp = {x=pos.x-search_distance,y=height, z=pos.z+20} | ||||
| 	maxp = {x=pos.x+search_distance,y=height, z=pos.z+20} | ||||
| 	nodes = minetest.env:find_nodes_in_area(minp, maxp, node_name) | ||||
| --	minetest.chat_send_all("z+Found (" .. node_name .. ": " .. #nodes .. ")") | ||||
| 	if #nodes >= threshold then | ||||
| 		return true | ||||
| 	end | ||||
| 	totalnodes = #nodes | ||||
| 	minp = {x=pos.x-search_distance,y=height, z=pos.z-20} | ||||
| 	maxp = {x=pos.x+search_distance,y=height, z=pos.z-20} | ||||
| 	nodes = minetest.env:find_nodes_in_area(minp, maxp, node_name) | ||||
| --	minetest.chat_send_all("z-Found (" .. node_name .. ": " .. #nodes .. ")") | ||||
| 	if #nodes >= threshold then | ||||
| 		return true | ||||
| 	end | ||||
| 	totalnodes = totalnodes + #nodes | ||||
| 	maxp = {x=pos.x+20,y=height, z=pos.z+search_distance} | ||||
| 	minp = {x=pos.x+20,y=height, z=pos.z-search_distance} | ||||
| 	nodes = minetest.env:find_nodes_in_area(minp, maxp, node_name)	 | ||||
| --	minetest.chat_send_all("x+Found (" .. node_name .. ": " .. #nodes .. ")") | ||||
| 	if #nodes >= threshold then | ||||
| 		return true | ||||
| 	end | ||||
| 	totalnodes = totalnodes + #nodes | ||||
| 	maxp = {x=pos.x-20,y=height, z=pos.z+search_distance} | ||||
| 	minp = {x=pos.x-20,y=height, z=pos.z-search_distance} | ||||
| 	nodes = minetest.env:find_nodes_in_area(minp, maxp, node_name)	 | ||||
| --	minetest.chat_send_all("x+Found (" .. node_name .. ": " .. #nodes .. ")")	 | ||||
| 	if #nodes >= threshold then | ||||
| 		return true | ||||
| 	end | ||||
| 	totalnodes = totalnodes + #nodes | ||||
| --	minetest.chat_send_all("Found total(" .. totalnodes .. ")") | ||||
| 	if totalnodes >= threshold*2 then | ||||
| 		return true | ||||
| 	end	 | ||||
| 	return false | ||||
| end | ||||
|  | ||||
| local get_immediate_nodes = function(pos) | ||||
| 	pos.y = pos.y-1 | ||||
| 	node_under_feet = minetest.env:get_node(pos).name | ||||
| 	pos.y = pos.y-3 | ||||
| 	node_3_under_feet = minetest.env:get_node(pos).name | ||||
| 	pos.y = pos.y+3 | ||||
| 	pos.y = pos.y+2.2 | ||||
| 	node_at_upper_body = minetest.env:get_node(pos).name | ||||
| 	pos.y = pos.y-1.19    | ||||
| 	node_at_lower_body = minetest.env:get_node(pos).name | ||||
| 	pos.y = pos.y+0.99   --1.6 | ||||
| 	--minetest.chat_send_all("node_under_feet(" .. nodename .. ")") | ||||
| end  | ||||
|  | ||||
|  | ||||
| local get_ambience = function(player) | ||||
| 	local player_is_climbing = false | ||||
| 	local player_is_descending = false | ||||
| 	local player_is_moving_horiz = false | ||||
| 	local standing_in_water = false | ||||
| 	local pos = player:getpos() | ||||
| 	get_immediate_nodes(pos) | ||||
|  | ||||
| 	if last_x_pos ~=pos.x or last_z_pos ~=pos.z then  | ||||
| 		player_is_moving_horiz = true  | ||||
| 	end | ||||
| 	if pos.y > last_y_pos+.5   then  | ||||
| 		player_is_climbing = true  | ||||
| 	end | ||||
| 	if pos.y < last_y_pos-.5  then  | ||||
| 		player_is_descending = true  | ||||
| 	end | ||||
| 	 | ||||
| 	last_x_pos =pos.x | ||||
| 	last_z_pos =pos.z	 | ||||
| 	last_y_pos =pos.y | ||||
| 	 | ||||
| 	if string.find(node_at_upper_body, "default:water") then | ||||
| 		if music then | ||||
| 			return {water=water, water_frequent=water_frequent, music=music} | ||||
| 		else | ||||
| 			return {water=water, water_frequent=water_frequent} | ||||
| 		end | ||||
| 	elseif node_at_upper_body == "air" then | ||||
| 		if string.find(node_at_lower_body, "default:water") then | ||||
| 		    --minetest.chat_send_all("bottom counted as water") | ||||
| 			--we found air at upperbody, and water at lower body.  Now there are 4 possibilities: | ||||
| 			--Key: under feet, moving or not | ||||
| 			--swimming 			w, m swimming | ||||
| 			--walking in water  nw, m splashing | ||||
| 			--treading water    w, nm  sloshing | ||||
| 			--standing in water nw, nm	beach trumps, then sloshing					 | ||||
| 			if player_is_moving_horiz then | ||||
| 				if string.find(node_under_feet, "default:water") then | ||||
| 					if music then | ||||
| 						return {swimming_frequent=swimming_frequent, music=music} | ||||
| 					else | ||||
| 						return {swimming_frequent} | ||||
| 					end	 | ||||
| 				else --didn't find water under feet: walking in water			 | ||||
| 					if music then | ||||
| 						return {splashing_water=splashing_water, music=music} | ||||
| 					else | ||||
| 						return {splashing_water} | ||||
| 					end	 | ||||
| 				end | ||||
| 			else--player is not moving | ||||
| 				if string.find(node_under_feet, "default:water") then | ||||
| 					if music then | ||||
| 						return {water_surface=water_surface, music=music} | ||||
| 					else | ||||
| 						return {water_surface} | ||||
| 					end	 | ||||
| 				else --didn't find water under feet				 | ||||
| 					standing_in_water = true | ||||
| 				end			 | ||||
| 		    end | ||||
| 		end	 | ||||
| 	end | ||||
| 	if player_is_moving_horiz then | ||||
| 		minetest.chat_send_all("playermoving") | ||||
| 	end | ||||
| 	if player_is_climbing then | ||||
| 			minetest.chat_send_all("player Climbing") | ||||
| 	end | ||||
| 	minetest.chat_send_all("nub:" ..node_at_upper_body) | ||||
| 	minetest.chat_send_all("nlb:" ..node_at_lower_body) | ||||
| 	minetest.chat_send_all("nuf:" ..node_under_feet) | ||||
| 	minetest.chat_send_all("n3uf:" ..node_3_under_feet) | ||||
| 	 | ||||
| 	local air_or_ignore = {air=true,ignore=true} | ||||
| 	--minetest.chat_send_all(air_or_ignore[node_under_feet]) | ||||
| 	if (player_is_moving_horiz or player_is_climbing) and air_or_ignore[node_at_upper_body] and air_or_ignore[node_at_lower_body] | ||||
| 	 and air_or_ignore[node_under_feet] and air_or_ignore[node_3_under_feet] and not player_is_descending then  | ||||
| 	minetest.chat_send_all("flying!!!!")	 | ||||
| 		if music then | ||||
| 			return {flying=flying, music=music} | ||||
| 		else | ||||
| 			return {flying} | ||||
| 		end	 | ||||
| 	end | ||||
| 	minetest.chat_send_all("not flying!!!!")	 | ||||
|  | ||||
| 	if nodes_in_range(pos, 7, "default:lava_flowing")>5 or nodes_in_range(pos, 7, "default:lava_source")>5 then | ||||
| 		if music then | ||||
| 			return {lava=lava, lava2=lava2, music=music}		 | ||||
| 		else | ||||
| 			return {lava=lava} | ||||
| 		end | ||||
| 	end | ||||
| 	if nodes_in_range(pos, 6, "default:water_flowing")>45 then | ||||
| 		if music then | ||||
| 			return {flowing_water=flowing_water, flowing_water2=flowing_water2, music=music} | ||||
| 		else | ||||
| 			return {flowing_water=flowing_water, flowing_water2=flowing_water2} | ||||
| 		end | ||||
| 	end	 | ||||
|  | ||||
|  | ||||
| --if we are near sea level and there is lots of water around the area | ||||
| 	if pos.y < 7 and pos.y >0 and atleast_nodes_in_grid(pos, 60, 1, "default:water_source", 51 ) then | ||||
| 		if music then | ||||
| 			return {beach=beach, beach_frequent=beach_frequent, music=music} | ||||
| 		else | ||||
| 			return {beach=beach, beach_frequent=beach_frequent} | ||||
| 		end		 | ||||
| 	end | ||||
| 	if standing_in_water then | ||||
| 		if music then | ||||
| 			return {water_surface=water_surface, music=music} | ||||
| 		else | ||||
| 			return {water_surface} | ||||
| 		end	 | ||||
| 	end | ||||
| 	 | ||||
| 	 | ||||
| 	desert_in_range = (nodes_in_range(pos, 6, "default:desert_sand")+nodes_in_range(pos, 6, "default:desert_stone")) | ||||
| 	--minetest.chat_send_all("desertcount: " .. desert_in_range .. ",".. pos.y ) | ||||
| 	if  desert_in_range >250 then | ||||
| 		if music then | ||||
| 			return {desert=desert, desert_frequent=desert_frequent, music=music} | ||||
| 		else | ||||
| 			return {desert=desert, desert_frequent=desert_frequent} | ||||
| 		end | ||||
| 	end	 | ||||
|  | ||||
| 	pos.y = pos.y-2  | ||||
| 	nodename = minetest.env:get_node(pos).name | ||||
| --	minetest.chat_send_all("Found " .. nodename .. pos.y ) | ||||
| 	 | ||||
|  | ||||
| 	if player:getpos().y < 0 then | ||||
| 		if music then | ||||
| 			return {cave=cave, cave_frequent=cave_frequent, music=music} | ||||
| 		else | ||||
| 			return {cave=cave, cave_frequent=cave_frequent} | ||||
| 		end | ||||
| 	end | ||||
| 	if is_daytime() then | ||||
| 		if music then | ||||
| 			return {day=day, day_frequent=day_frequent, music=music} | ||||
| 		else | ||||
| 			return {day=day, day_frequent=day_frequent} | ||||
| 		end | ||||
| 	else | ||||
| 		if music then | ||||
| 			return {night=night, night_frequent=night_frequent, music=music} | ||||
| 		else | ||||
| 			return {night=night, night_frequent=night_frequent} | ||||
| 		end | ||||
| 	end | ||||
| end | ||||
|  | ||||
| -- start playing the sound, set the handler and delete the handler after sound is played | ||||
| local play_sound = function(player, list, number) | ||||
| 	local player_name = player:get_player_name() | ||||
| 	if list.handler[player_name] == nil then | ||||
| 		local gain = 1.0 | ||||
| 		if list[number].gain ~= nil then | ||||
| 			gain = list[number].gain | ||||
| 		end | ||||
| 		local handler = minetest.sound_play(list[number].name, {to_player=player_name, gain=gain}) | ||||
| 		if handler ~= nil then | ||||
| 			list.handler[player_name] = handler | ||||
| 			minetest.after(list[number].length, function(args) | ||||
| 				local list = args[1] | ||||
| 				local player_name = args[2] | ||||
| 				if list.handler[player_name] ~= nil then | ||||
| 					minetest.sound_stop(list.handler[player_name]) | ||||
| 					list.handler[player_name] = nil | ||||
| 				end | ||||
| 			end, {list, player_name}) | ||||
| 		end | ||||
| 	end | ||||
| end | ||||
|  | ||||
| -- stops all sounds that are not in still_playing | ||||
| local stop_sound = function(still_playing, player) | ||||
| 	local player_name = player:get_player_name() | ||||
| 	if still_playing.cave == nil then | ||||
| 		local list = cave | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.cave_frequent == nil then | ||||
| 		local list = cave_frequent | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.swimming_frequent == nil then | ||||
| 		local list = swimming_frequent | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.beach == nil then | ||||
| 		local list = beach | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.beach_frequent == nil then | ||||
| 		local list = beach_frequent | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.desert == nil then | ||||
| 		local list = desert | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.desert_frequent == nil then | ||||
| 		local list = desert_frequent | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.night == nil then | ||||
| 		local list = night | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.night_frequent == nil then | ||||
| 		local list = night_frequent | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.day == nil then | ||||
| 		local list = day | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.day_frequent == nil then | ||||
| 		local list = day_frequent | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.music == nil then | ||||
| 		local list = music | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.flowing_water == nil then | ||||
| 		local list = flowing_water | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.flowing_water2 == nil then | ||||
| 		local list = flowing_water2 | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.lava == nil then | ||||
| 		local list = lava | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end	 | ||||
| 	if still_playing.lava2 == nil then | ||||
| 		local list = lava2 | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end		 | ||||
| 	if still_playing.water == nil then | ||||
| 		local list = water | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.water_surface == nil then | ||||
| 		local list = water_surface | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then				 | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 				played_on_start = false | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.water_frequent == nil then | ||||
| 		local list = water_frequent | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then				 | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 		--		minetest.chat_send_all("list.on_stop " .. list.on_stop  )				 | ||||
| 				played_on_start = false | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end | ||||
| 	if still_playing.flying == nil then | ||||
| 		--minetest.chat_send_all("begin stop flying "   ) | ||||
| 		local list = flying | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 		--	minetest.chat_send_all("handler flying "   ) | ||||
| 			if list.on_stop ~= nil then | ||||
| 			--	minetest.chat_send_all("onstop flying"   ) | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 				played_on_start = false | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end	 | ||||
| 	if still_playing.splashing_water == nil then | ||||
| 		local list = splashing_water | ||||
| 		if list.handler[player_name] ~= nil then | ||||
| 			if list.on_stop ~= nil then | ||||
| 				minetest.sound_play(list.on_stop, {to_player=player:get_player_name()}) | ||||
| 			end | ||||
| 			minetest.sound_stop(list.handler[player_name]) | ||||
| 			list.handler[player_name] = nil | ||||
| 		end | ||||
| 	end	 | ||||
| 	 | ||||
| end | ||||
|  | ||||
| local timer = 0 | ||||
| minetest.register_globalstep(function(dtime) | ||||
| 	timer = timer+dtime | ||||
| 	if timer < 1 then | ||||
| 		return | ||||
| 	end | ||||
| 	timer = 0 | ||||
|  | ||||
| 	for _,player in ipairs(minetest.get_connected_players()) do | ||||
| 		local ambiences = get_ambience(player) | ||||
| 		stop_sound(ambiences, player) | ||||
| 		for _,ambience in pairs(ambiences) do | ||||
| 			if math.random(1, 1000) <= ambience.frequency then			 | ||||
| 				if(played_on_start) then | ||||
| 				--	minetest.chat_send_all("playedOnStart "  ) | ||||
| 				else | ||||
| 				--	minetest.chat_send_all("FALSEplayedOnStart "  ) | ||||
| 				end | ||||
| 				if ambience.on_start ~= nil and played_on_start == false then | ||||
| 					played_on_start = true | ||||
| 					minetest.sound_play(ambience.on_start, {to_player=player:get_player_name()})					 | ||||
| 				end | ||||
| 				minetest.chat_send_all("ambience: " ..ambience ) | ||||
| 			--	if ambience.on_start ~= nil and played_on_start_flying == false then | ||||
| 			--		played_on_start_flying = true | ||||
| 			--		minetest.sound_play(ambience.on_start, {to_player=player:get_player_name()})					 | ||||
| 			--	end | ||||
| 				play_sound(player, ambience, math.random(1, #ambience)) | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
| end) | ||||
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/Ambivalent.ogg
									
									
									
									
									
										Исполняемый файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/Ambivalent.ogg
									
									
									
									
									
										Исполняемый файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/AvalonShort.ogg
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/AvalonShort.ogg
									
									
									
									
									
										Обычный файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/Bats_in_Cave.ogg
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/Bats_in_Cave.ogg
									
									
									
									
									
										Обычный файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/Best Cardinal Bird.ogg
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/Best Cardinal Bird.ogg
									
									
									
									
									
										Обычный файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/ComboWind.ogg
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/ComboWind.ogg
									
									
									
									
									
										Обычный файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/Crickets_At_NightCombo.ogg
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/Crickets_At_NightCombo.ogg
									
									
									
									
									
										Обычный файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/DesertMonolithMed.ogg
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/DesertMonolithMed.ogg
									
									
									
									
									
										Обычный файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/EtherealShort.ogg
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/EtherealShort.ogg
									
									
									
									
									
										Обычный файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/FarawayShort.ogg
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/FarawayShort.ogg
									
									
									
									
									
										Обычный файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/RattleSnake.ogg
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/RattleSnake.ogg
									
									
									
									
									
										Обычный файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/Single_Water_Droplet.ogg
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/Single_Water_Droplet.ogg
									
									
									
									
									
										Обычный файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										233
									
								
								mods/ambience/sounds/SoundLicenses.txt
									
									
									
									
									
										
										
										Исполняемый файл → Обычный файл
									
								
							
							
						
						
									
										233
									
								
								mods/ambience/sounds/SoundLicenses.txt
									
									
									
									
									
										
										
										Исполняемый файл → Обычный файл
									
								
							| @@ -1,118 +1,115 @@ | ||||
| --------------Music Lic: | ||||
| Amethystium: | ||||
| --Avalon | ||||
| --Ethereal | ||||
| --Faraway | ||||
| --Strangely Beautiful | ||||
|  | ||||
| "I can't give you a formal license (legal paperwork) for it, but as long as it's non-commercial I can give you my personal blessing and guarantee that you won't get in trouble for using it :) If that's enough just feel free to use any of my tracks. Please credit the music properly though, and include a link to www.amethystium.com and www.am.mu (it's the same site right now, but the latter will be a label/music store site soon). | ||||
| Best regards, | ||||
| <EFBFBD>ystein Ramfjord" | ||||
|  | ||||
| Jordach: | ||||
| --dark_ambiance | ||||
| --eastern_feeling | ||||
| These sounds are used for the Mod for Minetest; Ambiance. | ||||
| The included sounds are http://creativecommons.org/licenses/by-nc-sa/3.0/  | ||||
| Not Used:--mtest | ||||
|  | ||||
| -----------Sound Lic: | ||||
| --Nightime Sound, Recorded by Mike Koenig, License: Attribution 3.0 http://soundbible.com/951-Nightime.html | ||||
| --Crickets At Night Sound, License: Attribution 3.0 | Recorded by Mike Koenig |http://soundbible.com/365-Crickets-At-Night.html | ||||
|  | ||||
| --Medium Pack Of Wolves Howling, License: Public Domain | Recorded by fws.gov, http://soundbible.com/277-Medium-Pack-Of-Wolves-Howling.html | ||||
|  | ||||
| --Horned Owl Sound, License: Attribution 3.0 | Recorded by Mike Koenig , http://soundbible.com/1851-Horned-Owl.html | ||||
| --Bats In Cave Sound, License: Attr-Noncommercial 3.0 | Recorded by Mike Koenig , http://soundbible.com/1939-Bats-In-Cave.html | ||||
|  | ||||
| --Spooky Water Drops Sound, License: Attribution 3.0 | Recorded by Mike Koenig, http://soundbible.com/380-Spooky-Water-Drops.html | ||||
|  | ||||
|  | ||||
| -- Single Water Droplet Sound, License: Attribution 3.0 | Recorded by Mike Koenig, http://soundbible.com/384-Single-Water-Droplet.html | ||||
|  | ||||
| --HollowWind, Black Boe, Creative Commons 0 License, http://www.freesound.org/people/Black%20Boe/sounds/22331/ | ||||
|  | ||||
| --drippingwater*.ogg sounds: CC0, Dripping Water Mod, by kddekadenz, http://minetest.net/forum/viewtopic.php?id=1688 | ||||
|  | ||||
| --best cardinal bird: License: Attribution 3.0 | Recorded by PsychoBird,  http://soundbible.com/1515-Best-Cardinal-Bird.html | ||||
|  | ||||
| --birdsongnl: the Attribution License, HerbertBoland, http://www.freesound.org/people/HerbertBoland/sounds/28312/  (end) | ||||
|  | ||||
| --robin2:  Attribution License, reinsamba, http://www.freesound.org/people/reinsamba/sounds/32479/  (end) | ||||
|  | ||||
| --Craw.WAV, Attribution License, inchadney, http://www.freesound.org/people/inchadney/sounds/52450/ | ||||
|  | ||||
| --bluejay.wav,  Creative Commons 0 License,  UncleSigmund, http://www.freesound.org/people/UncleSigmund/sounds/42382/ | ||||
|  | ||||
| --scuba1*.ogg- digifishmusic, Attribution License, http://www.freesound.org/people/digifishmusic/sounds/45521/ | ||||
|  | ||||
| --Underwater Pool - Attribution 3.0 | Recorded by Mike Koenig, http://soundbible.com/1660-Underwater-Pool.html | ||||
|  | ||||
| --dolphin_screaming - Creative Commons 0 License, felix.blume, http://www.freesound.org/people/felix.blume/sounds/161691/ | ||||
|  | ||||
| --dolphins - Attribution Noncommercial License,  acclivity, http://www.freesound.org/people/acclivity/sounds/13691/ | ||||
|  | ||||
| ComboWind uses: | ||||
| --wind-in-the-trees -Attribution License, laurent, http://www.freesound.org/people/laurent/sounds/16995/ | ||||
| --drygrassInWind- Creative Commons 0 License, felix.blume, http://www.freesound.org/people/felix.blume/sounds/146436/ | ||||
|  | ||||
| --Splash: Attribution 3.0 | Recorded by BlastwaveFx.com, http://soundbible.com/546-Fish-Splashing.html | ||||
|  | ||||
| --small_waterfall Attribution License, volivieri, http://www.freesound.org/people/volivieri/sounds/38390/ | ||||
|  | ||||
| --Lake_Waves_2*, Attribution License, Benboncan, http://www.freesound.org/people/Benboncan/sounds/67884/ | ||||
|  | ||||
| --water_swimming_splashing*, Attribution Noncommercial License, Robinhood76, http://www.freesound.org/people/Robinhood76/sounds/79657/ | ||||
|  | ||||
| --earth01a, Creative Commons 0 License., Halion , http://www.freesound.org/people/Halion/sounds/17785 | ||||
|  | ||||
| --fiji_beach, Creative Commons 0 License, c97059890, http://www.freesound.org/people/c97059890/sounds/21754/ | ||||
|  | ||||
| --seagull, Attribution Noncommercial License., hazure,  http://www.freesound.org/people/hazure/sounds/23707/, | ||||
|  | ||||
| desert: | ||||
| coyote2, Attribution License, rogerforeman, http://www.freesound.org/people/rogerforeman/sounds/68068/ | ||||
| http://www.freesound.org/people/Proxima4/sounds/104319/ | ||||
| Desert Monolith.wav, Creative Commons 0 License, Proxima4, http://www.freesound.org/people/Proxima4/sounds/104319/ | ||||
| Rattlesnake Rattle, Public Domain, fws.gov,  http://soundbible.com/237-Rattlesnake-Rattle.html | ||||
|  | ||||
| flying: | ||||
| crystal_airlines: Attribution License, suonho, http://www.freesound.org/people/suonho/sounds/56364/ | ||||
|  | ||||
| ----------------Not used yet: | ||||
| desert: | ||||
| Desert Simple.wav, Creative Commons 0 License, Proxima4, http://www.freesound.org/people/Proxima4/sounds/104320/ | ||||
|  | ||||
|  313hummer (Jordan Craige)   | ||||
| --echos  http://soundcloud.com/jordan-craige/echos-1 | ||||
| Creative Commons Attribution license (reuse allowed)  Attribution 3.0 Unported (CC BY 3.0) | ||||
| Not Used:--FoamOfTheSea http://soundcloud.com/jordan-craige/foam-of-the-sea | ||||
|  | ||||
| xi-intersection: | ||||
| http://soundcloud.com/xi-intersection/mass-effect-uncharted-worlds  Creative Commons License | ||||
| --not used: | ||||
| http://soundcloud.com/xi-intersection/donkey-kong-country-2-flight | ||||
| http://soundcloud.com/kogyo/kogyo-skalar-m1 | ||||
|  | ||||
| lava: | ||||
| http://www.freesound.org/people/Halion/sounds/17785/ (almost as good cc)  (combine with rocks falling?) | ||||
| http://www.freesound.org/people/pushtobreak/sounds/17823/ (attrib non cc really good) | ||||
| http://www.freesound.org/people/klankbeeld/sounds/123970/ (horror rhythm) | ||||
| Rockfall in mine.wav http://www.freesound.org/people/Benboncan/sounds/60085/ | ||||
|  | ||||
|  | ||||
| http://www.freesound.org/people/snotch/sounds/96175/ (mud volcano) | ||||
|  | ||||
| --natural night sounds in Boquete.wav,  Attribution License, laurent, http://www.freesound.org/people/laurent/sounds/15851/ | ||||
| http://www.freesound.org/people/Dynamicell/sounds/17553/ | ||||
| http://www.freesound.org/people/juskiddink/sounds/78955/ aspen tree in wind | ||||
| http://www.freesound.org/people/Benboncan/sounds/69761/ wind in hedge birds animals | ||||
|  | ||||
|  | ||||
| ButterflyTea: | ||||
| Creative Commons : Attribution-Noncommercial-Share Alike 3.0 | ||||
| http://www.jamendo.com/en/track/904012/dance-of-magical-flowers | ||||
| http://www.jamendo.com/en/track/904013/magic-of-the-seventh-world | ||||
| http://www.jamendo.com/en/track/904016/in-search-of-the-soul | ||||
|  | ||||
| zero-project | ||||
| --------------Music Lic: | ||||
| Amethystium: | ||||
| --Avalon | ||||
| --Ethereal | ||||
| --Faraway | ||||
| --Strangely Beautiful | ||||
| Used with kind permission from <20>ystein Ramfjord / AM.mu Records | ||||
|  | ||||
| Jordach: | ||||
| --dark_ambiance | ||||
| --eastern_feeling | ||||
| These sounds are used for the Mod for Minetest; Ambiance. | ||||
| The included sounds are http://creativecommons.org/licenses/by-nc-sa/3.0/  | ||||
| Not Used:--mtest | ||||
|  | ||||
| -----------Sound Lic: | ||||
| --Nightime Sound, Recorded by Mike Koenig, License: Attribution 3.0 http://soundbible.com/951-Nightime.html | ||||
| --Crickets At Night Sound, License: Attribution 3.0 | Recorded by Mike Koenig |http://soundbible.com/365-Crickets-At-Night.html | ||||
|  | ||||
| --Medium Pack Of Wolves Howling, License: Public Domain | Recorded by fws.gov, http://soundbible.com/277-Medium-Pack-Of-Wolves-Howling.html | ||||
|  | ||||
| --Horned Owl Sound, License: Attribution 3.0 | Recorded by Mike Koenig , http://soundbible.com/1851-Horned-Owl.html | ||||
| --Bats In Cave Sound, License: Attr-Noncommercial 3.0 | Recorded by Mike Koenig , http://soundbible.com/1939-Bats-In-Cave.html | ||||
|  | ||||
| --Spooky Water Drops Sound, License: Attribution 3.0 | Recorded by Mike Koenig, http://soundbible.com/380-Spooky-Water-Drops.html | ||||
|  | ||||
|  | ||||
| -- Single Water Droplet Sound, License: Attribution 3.0 | Recorded by Mike Koenig, http://soundbible.com/384-Single-Water-Droplet.html | ||||
|  | ||||
| --HollowWind, Black Boe, Creative Commons 0 License, http://www.freesound.org/people/Black%20Boe/sounds/22331/ | ||||
|  | ||||
| --drippingwater*.ogg sounds: CC0, Dripping Water Mod, by kddekadenz, http://minetest.net/forum/viewtopic.php?id=1688 | ||||
|  | ||||
| --best cardinal bird: License: Attribution 3.0 | Recorded by PsychoBird,  http://soundbible.com/1515-Best-Cardinal-Bird.html | ||||
|  | ||||
| --birdsongnl: the Attribution License, HerbertBoland, http://www.freesound.org/people/HerbertBoland/sounds/28312/  (end) | ||||
|  | ||||
| --robin2:  Attribution License, reinsamba, http://www.freesound.org/people/reinsamba/sounds/32479/  (end) | ||||
|  | ||||
| --Craw.WAV, Attribution License, inchadney, http://www.freesound.org/people/inchadney/sounds/52450/ | ||||
|  | ||||
| --bluejay.wav,  Creative Commons 0 License,  UncleSigmund, http://www.freesound.org/people/UncleSigmund/sounds/42382/ | ||||
|  | ||||
| --scuba1*.ogg- digifishmusic, Attribution License, http://www.freesound.org/people/digifishmusic/sounds/45521/ | ||||
|  | ||||
| --Underwater Pool - Attribution 3.0 | Recorded by Mike Koenig, http://soundbible.com/1660-Underwater-Pool.html | ||||
|  | ||||
| --dolphin_screaming - Creative Commons 0 License, felix.blume, http://www.freesound.org/people/felix.blume/sounds/161691/ | ||||
|  | ||||
| --dolphins - Attribution Noncommercial License,  acclivity, http://www.freesound.org/people/acclivity/sounds/13691/ | ||||
|  | ||||
| ComboWind uses: | ||||
| --wind-in-the-trees -Attribution License, laurent, http://www.freesound.org/people/laurent/sounds/16995/ | ||||
| --drygrassInWind- Creative Commons 0 License, felix.blume, http://www.freesound.org/people/felix.blume/sounds/146436/ | ||||
|  | ||||
| --Splash: Attribution 3.0 | Recorded by BlastwaveFx.com, http://soundbible.com/546-Fish-Splashing.html | ||||
|  | ||||
| --small_waterfall Attribution License, volivieri, http://www.freesound.org/people/volivieri/sounds/38390/ | ||||
|  | ||||
| --Lake_Waves_2*, Attribution License, Benboncan, http://www.freesound.org/people/Benboncan/sounds/67884/ | ||||
|  | ||||
| --water_swimming_splashing*, Attribution Noncommercial License, Robinhood76, http://www.freesound.org/people/Robinhood76/sounds/79657/ | ||||
|  | ||||
| --earth01a, Creative Commons 0 License., Halion , http://www.freesound.org/people/Halion/sounds/17785 | ||||
|  | ||||
| --fiji_beach, Creative Commons 0 License, c97059890, http://www.freesound.org/people/c97059890/sounds/21754/ | ||||
|  | ||||
| --seagull, Attribution Noncommercial License., hazure,  http://www.freesound.org/people/hazure/sounds/23707/, | ||||
|  | ||||
| desert: | ||||
| coyote2, Attribution License, rogerforeman, http://www.freesound.org/people/rogerforeman/sounds/68068/ | ||||
| http://www.freesound.org/people/Proxima4/sounds/104319/ | ||||
| Desert Monolith.wav, Creative Commons 0 License, Proxima4, http://www.freesound.org/people/Proxima4/sounds/104319/ | ||||
| Rattlesnake Rattle, Public Domain, fws.gov,  http://soundbible.com/237-Rattlesnake-Rattle.html | ||||
|  | ||||
| flying: | ||||
| crystal_airlines: Attribution License, suonho, http://www.freesound.org/people/suonho/sounds/56364/ | ||||
|  | ||||
| ----------------Not used yet: | ||||
| desert: | ||||
| Desert Simple.wav, Creative Commons 0 License, Proxima4, http://www.freesound.org/people/Proxima4/sounds/104320/ | ||||
|  | ||||
|  313hummer (Jordan Craige)   | ||||
| --echos  http://soundcloud.com/jordan-craige/echos-1 | ||||
| Creative Commons Attribution license (reuse allowed)  Attribution 3.0 Unported (CC BY 3.0) | ||||
| Not Used:--FoamOfTheSea http://soundcloud.com/jordan-craige/foam-of-the-sea | ||||
|  | ||||
| xi-intersection: | ||||
| http://soundcloud.com/xi-intersection/mass-effect-uncharted-worlds  Creative Commons License | ||||
| --not used: | ||||
| http://soundcloud.com/xi-intersection/donkey-kong-country-2-flight | ||||
| http://soundcloud.com/kogyo/kogyo-skalar-m1 | ||||
|  | ||||
| lava: | ||||
| http://www.freesound.org/people/Halion/sounds/17785/ (almost as good cc)  (combine with rocks falling?) | ||||
| http://www.freesound.org/people/pushtobreak/sounds/17823/ (attrib non cc really good) | ||||
| http://www.freesound.org/people/klankbeeld/sounds/123970/ (horror rhythm) | ||||
| Rockfall in mine.wav http://www.freesound.org/people/Benboncan/sounds/60085/ | ||||
|  | ||||
|  | ||||
| http://www.freesound.org/people/snotch/sounds/96175/ (mud volcano) | ||||
|  | ||||
| --natural night sounds in Boquete.wav,  Attribution License, laurent, http://www.freesound.org/people/laurent/sounds/15851/ | ||||
| http://www.freesound.org/people/Dynamicell/sounds/17553/ | ||||
| http://www.freesound.org/people/juskiddink/sounds/78955/ aspen tree in wind | ||||
| http://www.freesound.org/people/Benboncan/sounds/69761/ wind in hedge birds animals | ||||
|  | ||||
|  | ||||
| ButterflyTea: | ||||
| Creative Commons : Attribution-Noncommercial-Share Alike 3.0 | ||||
| http://www.jamendo.com/en/track/904012/dance-of-magical-flowers | ||||
| http://www.jamendo.com/en/track/904013/magic-of-the-seventh-world | ||||
| http://www.jamendo.com/en/track/904016/in-search-of-the-soul | ||||
|  | ||||
| zero-project | ||||
|   | ||||
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/Splash.ogg
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/Splash.ogg
									
									
									
									
									
										Обычный файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/Spooky_Water_Drops.ogg
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/Spooky_Water_Drops.ogg
									
									
									
									
									
										Обычный файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/StrangelyBeautifulShort.ogg
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/StrangelyBeautifulShort.ogg
									
									
									
									
									
										Обычный файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/Wolves_Howling.ogg
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/Wolves_Howling.ogg
									
									
									
									
									
										Обычный файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/anonnp4014.ogg
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/anonnp4014.ogg
									
									
									
									
									
										Обычный файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/beach.ogg
									
									
									
									
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/beach.ogg
									
									
									
									
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/bensound_deepblue.ogg
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/bensound_deepblue.ogg
									
									
									
									
									
										Обычный файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/bensound_ofeliasdream.ogg
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/bensound_ofeliasdream.ogg
									
									
									
									
									
										Обычный файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/bensound_slowmotion.ogg
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/bensound_slowmotion.ogg
									
									
									
									
									
										Обычный файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/bird.ogg
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/bird.ogg
									
									
									
									
									
										Обычный файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/bird1.ogg
									
									
									
									
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/bird1.ogg
									
									
									
									
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/bird2.ogg
									
									
									
									
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/bird2.ogg
									
									
									
									
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/birdsongnl.ogg
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/birdsongnl.ogg
									
									
									
									
									
										Обычный файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										0
									
								
								mods/ambience/sounds/bluejay.ogg
									
									
									
									
									
										
										
										Исполняемый файл → Обычный файл
									
								
							
							
						
						
									
										0
									
								
								mods/ambience/sounds/bluejay.ogg
									
									
									
									
									
										
										
										Исполняемый файл → Обычный файл
									
								
							
							
								
								
									
										0
									
								
								mods/ambience/sounds/canadianloon2.ogg
									
									
									
									
									
										
										
										Исполняемый файл → Обычный файл
									
								
							
							
						
						
									
										0
									
								
								mods/ambience/sounds/canadianloon2.ogg
									
									
									
									
									
										
										
										Исполняемый файл → Обычный файл
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/cardinal.ogg
									
									
									
									
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/cardinal.ogg
									
									
									
									
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										0
									
								
								mods/ambience/sounds/coyote.ogg → mods/ambience/sounds/coyote2.ogg
									
									
									
									
									
										
										
										Исполняемый файл → Обычный файл
									
								
							
							
						
						
									
										0
									
								
								mods/ambience/sounds/coyote.ogg → mods/ambience/sounds/coyote2.ogg
									
									
									
									
									
										
										
										Исполняемый файл → Обычный файл
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/craw.ogg
									
									
									
									
									
										
										
										Исполняемый файл → Обычный файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/craw.ogg
									
									
									
									
									
										
										
										Исполняемый файл → Обычный файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/crestedlark.ogg
									
									
									
									
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/crestedlark.ogg
									
									
									
									
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/cricket.ogg
									
									
									
									
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/cricket.ogg
									
									
									
									
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/dark_ambiance.ogg
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/dark_ambiance.ogg
									
									
									
									
									
										Обычный файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										0
									
								
								mods/ambience/sounds/deer.ogg
									
									
									
									
									
										
										
										Исполняемый файл → Обычный файл
									
								
							
							
						
						
									
										0
									
								
								mods/ambience/sounds/deer.ogg
									
									
									
									
									
										
										
										Исполняемый файл → Обычный файл
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/desertwind.ogg
									
									
									
									
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/desertwind.ogg
									
									
									
									
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/drippingwater1.ogg
									
									
									
									
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/drippingwater1.ogg
									
									
									
									
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/drippingwater2.ogg
									
									
									
									
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/drippingwater2.ogg
									
									
									
									
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/drippingwater_drip_a.ogg
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/drippingwater_drip_a.ogg
									
									
									
									
									
										Обычный файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/drippingwater_drip_b.ogg
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/drippingwater_drip_b.ogg
									
									
									
									
									
										Обычный файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/drippingwater_drip_c.ogg
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/drippingwater_drip_c.ogg
									
									
									
									
									
										Обычный файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/drowning_gasp.ogg
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/drowning_gasp.ogg
									
									
									
									
									
										Обычный файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/earth01a.ogg
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/earth01a.ogg
									
									
									
									
									
										Обычный файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/eastern_feeling.ogg
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/eastern_feeling.ogg
									
									
									
									
									
										Обычный файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/fiji_beach.ogg
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/fiji_beach.ogg
									
									
									
									
									
										Обычный файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										0
									
								
								mods/ambience/sounds/frog.ogg
									
									
									
									
									
										
										
										Исполняемый файл → Обычный файл
									
								
							
							
						
						
									
										0
									
								
								mods/ambience/sounds/frog.ogg
									
									
									
									
									
										
										
										Исполняемый файл → Обычный файл
									
								
							
							
								
								
									
										0
									
								
								mods/ambience/sounds/gull.ogg
									
									
									
									
									
										
										
										Исполняемый файл → Обычный файл
									
								
							
							
						
						
									
										0
									
								
								mods/ambience/sounds/gull.ogg
									
									
									
									
									
										
										
										Исполняемый файл → Обычный файл
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/horned_owl.ogg
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/horned_owl.ogg
									
									
									
									
									
										Обычный файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/hornedowl.ogg
									
									
									
									
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/hornedowl.ogg
									
									
									
									
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/lake_waves_2_calm.ogg
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/lake_waves_2_calm.ogg
									
									
									
									
									
										Обычный файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/lake_waves_2_variety.ogg
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/lake_waves_2_variety.ogg
									
									
									
									
									
										Обычный файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/lava.ogg
									
									
									
									
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/lava.ogg
									
									
									
									
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										0
									
								
								mods/ambience/sounds/peacock.ogg
									
									
									
									
									
										
										
										Исполняемый файл → Обычный файл
									
								
							
							
						
						
									
										0
									
								
								mods/ambience/sounds/peacock.ogg
									
									
									
									
									
										
										
										Исполняемый файл → Обычный файл
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/rainymemory.ogg
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/rainymemory.ogg
									
									
									
									
									
										Обычный файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/robin.ogg
									
									
									
									
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/robin.ogg
									
									
									
									
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/robin2.ogg
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/robin2.ogg
									
									
									
									
									
										Обычный файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/scuba.ogg
									
									
									
									
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/scuba.ogg
									
									
									
									
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/scuba1bubbles.ogg
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/scuba1bubbles.ogg
									
									
									
									
									
										Обычный файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/scuba1calm.ogg
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/scuba1calm.ogg
									
									
									
									
									
										Обычный файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/scuba1calm2.ogg
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/scuba1calm2.ogg
									
									
									
									
									
										Обычный файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/scuba1interestingbubbles.ogg
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/scuba1interestingbubbles.ogg
									
									
									
									
									
										Обычный файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/scuba1tubulentbubbles.ogg
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/scuba1tubulentbubbles.ogg
									
									
									
									
									
										Обычный файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										0
									
								
								mods/ambience/sounds/seagull.ogg
									
									
									
									
									
										
										
										Исполняемый файл → Обычный файл
									
								
							
							
						
						
									
										0
									
								
								mods/ambience/sounds/seagull.ogg
									
									
									
									
									
										
										
										Исполняемый файл → Обычный файл
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/small_waterfall.ogg
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/small_waterfall.ogg
									
									
									
									
									
										Обычный файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/swim_splashing.ogg
									
									
									
									
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/swim_splashing.ogg
									
									
									
									
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/water_swimming_splashing.ogg
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/water_swimming_splashing.ogg
									
									
									
									
									
										Обычный файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/water_swimming_splashing_breath.ogg
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/water_swimming_splashing_breath.ogg
									
									
									
									
									
										Обычный файл
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/waterfall.ogg
									
									
									
									
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/waterfall.ogg
									
									
									
									
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/wind.ogg
									
									
									
									
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/wind.ogg
									
									
									
									
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/wolves.ogg
									
									
									
									
									
								
							
							
						
						
									
										
											Двоичные данные
										
									
								
								mods/ambience/sounds/wolves.ogg
									
									
									
									
									
								
							
										
											Двоичный файл не отображается.
										
									
								
							
							
								
								
									
										11
									
								
								mods/ambience/todo.txt
									
									
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										11
									
								
								mods/ambience/todo.txt
									
									
									
									
									
										Обычный файл
									
								
							| @@ -0,0 +1,11 @@ | ||||
| To Do: | ||||
|  | ||||
| -add random_volume parameter to night normal, day normal, & cave normal sounds to create feeling of distance. | ||||
|  | ||||
| m-get constant birds more quiet during the day | ||||
| m-bats seem way too frequent now? | ||||
| m-when playing multiplayer seems to increase frequency of music & normal sounds to the point where they are obnoxious | ||||
| m-which songs should go with which environments?   Dark songs in caves or night, light sounds during day. | ||||
| m-may be drowning out some of the normal sound effects like walking on stone. | ||||
| l-what about other weird bubble  | ||||
| l-put in wind/ wind in trees during day and night | ||||
		Ссылка в новой задаче
	
	Block a user