diff --git a/ambience/14init.lua b/ambience/14init.lua new file mode 100644 index 0000000..1f4acd6 --- /dev/null +++ b/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) \ No newline at end of file diff --git a/ambience/Badinit.lua b/ambience/Badinit.lua new file mode 100644 index 0000000..ba85193 --- /dev/null +++ b/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) \ No newline at end of file diff --git a/ambience/depends.txt b/ambience/depends.txt new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/ambience/depends.txt @@ -0,0 +1 @@ +default diff --git a/ambience/init.lua b/ambience/init.lua new file mode 100644 index 0000000..1d64289 --- /dev/null +++ b/ambience/init.lua @@ -0,0 +1,690 @@ +-------------------------------------------------------------------------------------------------------- +--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-0.7}, + {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*0.5} +} + +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*1.4}, + {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 = "", + 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 = "", + 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, + }) diff --git a/ambience/init.lua.pilz.lua b/ambience/init.lua.pilz.lua new file mode 100644 index 0000000..b1d1796 --- /dev/null +++ b/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) \ No newline at end of file diff --git a/ambience/init16.lua b/ambience/init16.lua new file mode 100644 index 0000000..ba85193 --- /dev/null +++ b/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) \ No newline at end of file diff --git a/ambience/init17.lua b/ambience/init17.lua new file mode 100644 index 0000000..610bb3b --- /dev/null +++ b/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) \ No newline at end of file diff --git a/ambience/init29debug.lua b/ambience/init29debug.lua new file mode 100644 index 0000000..60bf38f --- /dev/null +++ b/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) \ No newline at end of file diff --git a/ambience/sounds/Ambivalent.ogg b/ambience/sounds/Ambivalent.ogg new file mode 100644 index 0000000..6235f93 Binary files /dev/null and b/ambience/sounds/Ambivalent.ogg differ diff --git a/ambience/sounds/AvalonShort.ogg b/ambience/sounds/AvalonShort.ogg new file mode 100644 index 0000000..5262901 Binary files /dev/null and b/ambience/sounds/AvalonShort.ogg differ diff --git a/ambience/sounds/Bats_in_Cave.ogg b/ambience/sounds/Bats_in_Cave.ogg new file mode 100644 index 0000000..810b4e5 Binary files /dev/null and b/ambience/sounds/Bats_in_Cave.ogg differ diff --git a/ambience/sounds/Best Cardinal Bird.ogg b/ambience/sounds/Best Cardinal Bird.ogg new file mode 100644 index 0000000..eaddae9 Binary files /dev/null and b/ambience/sounds/Best Cardinal Bird.ogg differ diff --git a/ambience/sounds/ComboWind.ogg b/ambience/sounds/ComboWind.ogg new file mode 100644 index 0000000..bef99e7 Binary files /dev/null and b/ambience/sounds/ComboWind.ogg differ diff --git a/ambience/sounds/Crickets_At_NightCombo.ogg b/ambience/sounds/Crickets_At_NightCombo.ogg new file mode 100644 index 0000000..8642ffa Binary files /dev/null and b/ambience/sounds/Crickets_At_NightCombo.ogg differ diff --git a/ambience/sounds/DesertMonolithMed.ogg b/ambience/sounds/DesertMonolithMed.ogg new file mode 100644 index 0000000..e282584 Binary files /dev/null and b/ambience/sounds/DesertMonolithMed.ogg differ diff --git a/ambience/sounds/EtherealShort.ogg b/ambience/sounds/EtherealShort.ogg new file mode 100644 index 0000000..b4bc2cd Binary files /dev/null and b/ambience/sounds/EtherealShort.ogg differ diff --git a/ambience/sounds/FarawayShort.ogg b/ambience/sounds/FarawayShort.ogg new file mode 100644 index 0000000..b53d5d6 Binary files /dev/null and b/ambience/sounds/FarawayShort.ogg differ diff --git a/ambience/sounds/RattleSnake.ogg b/ambience/sounds/RattleSnake.ogg new file mode 100644 index 0000000..14d7e21 Binary files /dev/null and b/ambience/sounds/RattleSnake.ogg differ diff --git a/ambience/sounds/Single_Water_Droplet.ogg b/ambience/sounds/Single_Water_Droplet.ogg new file mode 100644 index 0000000..292e62b Binary files /dev/null and b/ambience/sounds/Single_Water_Droplet.ogg differ diff --git a/ambience/sounds/SoundLicenses.txt b/ambience/sounds/SoundLicenses.txt new file mode 100644 index 0000000..f37a799 --- /dev/null +++ b/ambience/sounds/SoundLicenses.txt @@ -0,0 +1,115 @@ +--------------Music Lic: +Amethystium: +--Avalon +--Ethereal +--Faraway +--Strangely Beautiful +Used with kind permission from Ø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 diff --git a/ambience/sounds/Splash.ogg b/ambience/sounds/Splash.ogg new file mode 100644 index 0000000..4458afe Binary files /dev/null and b/ambience/sounds/Splash.ogg differ diff --git a/ambience/sounds/Spooky_Water_Drops.ogg b/ambience/sounds/Spooky_Water_Drops.ogg new file mode 100644 index 0000000..13d0839 Binary files /dev/null and b/ambience/sounds/Spooky_Water_Drops.ogg differ diff --git a/ambience/sounds/StrangelyBeautifulShort.ogg b/ambience/sounds/StrangelyBeautifulShort.ogg new file mode 100644 index 0000000..2a2dbc4 Binary files /dev/null and b/ambience/sounds/StrangelyBeautifulShort.ogg differ diff --git a/ambience/sounds/Wolves_Howling.ogg b/ambience/sounds/Wolves_Howling.ogg new file mode 100644 index 0000000..20627ed Binary files /dev/null and b/ambience/sounds/Wolves_Howling.ogg differ diff --git a/ambience/sounds/anonnp4014.ogg b/ambience/sounds/anonnp4014.ogg new file mode 100644 index 0000000..675d373 Binary files /dev/null and b/ambience/sounds/anonnp4014.ogg differ diff --git a/ambience/sounds/bensound_deepblue.ogg b/ambience/sounds/bensound_deepblue.ogg new file mode 100644 index 0000000..d576f00 Binary files /dev/null and b/ambience/sounds/bensound_deepblue.ogg differ diff --git a/ambience/sounds/bensound_ofeliasdream.ogg b/ambience/sounds/bensound_ofeliasdream.ogg new file mode 100644 index 0000000..f2c21a0 Binary files /dev/null and b/ambience/sounds/bensound_ofeliasdream.ogg differ diff --git a/ambience/sounds/bensound_slowmotion.ogg b/ambience/sounds/bensound_slowmotion.ogg new file mode 100644 index 0000000..ee31c30 Binary files /dev/null and b/ambience/sounds/bensound_slowmotion.ogg differ diff --git a/ambience/sounds/bird.ogg b/ambience/sounds/bird.ogg new file mode 100644 index 0000000..1ee96ad Binary files /dev/null and b/ambience/sounds/bird.ogg differ diff --git a/ambience/sounds/birdsongnl.ogg b/ambience/sounds/birdsongnl.ogg new file mode 100644 index 0000000..18e3a1a Binary files /dev/null and b/ambience/sounds/birdsongnl.ogg differ diff --git a/ambience/sounds/bluejay.ogg b/ambience/sounds/bluejay.ogg new file mode 100644 index 0000000..7c36417 Binary files /dev/null and b/ambience/sounds/bluejay.ogg differ diff --git a/ambience/sounds/canadianloon2.ogg b/ambience/sounds/canadianloon2.ogg new file mode 100644 index 0000000..13a59f5 Binary files /dev/null and b/ambience/sounds/canadianloon2.ogg differ diff --git a/ambience/sounds/coyote2.ogg b/ambience/sounds/coyote2.ogg new file mode 100644 index 0000000..dc29674 Binary files /dev/null and b/ambience/sounds/coyote2.ogg differ diff --git a/ambience/sounds/craw.ogg b/ambience/sounds/craw.ogg new file mode 100644 index 0000000..f8b561b Binary files /dev/null and b/ambience/sounds/craw.ogg differ diff --git a/ambience/sounds/dark_ambiance.ogg b/ambience/sounds/dark_ambiance.ogg new file mode 100644 index 0000000..8f73327 Binary files /dev/null and b/ambience/sounds/dark_ambiance.ogg differ diff --git a/ambience/sounds/deer.ogg b/ambience/sounds/deer.ogg new file mode 100644 index 0000000..792f5b6 Binary files /dev/null and b/ambience/sounds/deer.ogg differ diff --git a/ambience/sounds/drippingwater_drip_a.ogg b/ambience/sounds/drippingwater_drip_a.ogg new file mode 100644 index 0000000..9d2eb2e Binary files /dev/null and b/ambience/sounds/drippingwater_drip_a.ogg differ diff --git a/ambience/sounds/drippingwater_drip_b.ogg b/ambience/sounds/drippingwater_drip_b.ogg new file mode 100644 index 0000000..bb06e6c Binary files /dev/null and b/ambience/sounds/drippingwater_drip_b.ogg differ diff --git a/ambience/sounds/drippingwater_drip_c.ogg b/ambience/sounds/drippingwater_drip_c.ogg new file mode 100644 index 0000000..d22972a Binary files /dev/null and b/ambience/sounds/drippingwater_drip_c.ogg differ diff --git a/ambience/sounds/drowning_gasp.ogg b/ambience/sounds/drowning_gasp.ogg new file mode 100644 index 0000000..9363998 Binary files /dev/null and b/ambience/sounds/drowning_gasp.ogg differ diff --git a/ambience/sounds/earth01a.ogg b/ambience/sounds/earth01a.ogg new file mode 100644 index 0000000..e9641d3 Binary files /dev/null and b/ambience/sounds/earth01a.ogg differ diff --git a/ambience/sounds/eastern_feeling.ogg b/ambience/sounds/eastern_feeling.ogg new file mode 100644 index 0000000..d691313 Binary files /dev/null and b/ambience/sounds/eastern_feeling.ogg differ diff --git a/ambience/sounds/fiji_beach.ogg b/ambience/sounds/fiji_beach.ogg new file mode 100644 index 0000000..ee02ae3 Binary files /dev/null and b/ambience/sounds/fiji_beach.ogg differ diff --git a/ambience/sounds/frog.ogg b/ambience/sounds/frog.ogg new file mode 100644 index 0000000..84b0f15 Binary files /dev/null and b/ambience/sounds/frog.ogg differ diff --git a/ambience/sounds/gull.ogg b/ambience/sounds/gull.ogg new file mode 100644 index 0000000..10b5588 Binary files /dev/null and b/ambience/sounds/gull.ogg differ diff --git a/ambience/sounds/horned_owl.ogg b/ambience/sounds/horned_owl.ogg new file mode 100644 index 0000000..28e094a Binary files /dev/null and b/ambience/sounds/horned_owl.ogg differ diff --git a/ambience/sounds/lake_waves_2_calm.ogg b/ambience/sounds/lake_waves_2_calm.ogg new file mode 100644 index 0000000..05f3f33 Binary files /dev/null and b/ambience/sounds/lake_waves_2_calm.ogg differ diff --git a/ambience/sounds/lake_waves_2_variety.ogg b/ambience/sounds/lake_waves_2_variety.ogg new file mode 100644 index 0000000..894c534 Binary files /dev/null and b/ambience/sounds/lake_waves_2_variety.ogg differ diff --git a/ambience/sounds/peacock.ogg b/ambience/sounds/peacock.ogg new file mode 100644 index 0000000..1156e28 Binary files /dev/null and b/ambience/sounds/peacock.ogg differ diff --git a/ambience/sounds/rainymemory.ogg b/ambience/sounds/rainymemory.ogg new file mode 100644 index 0000000..78635c7 Binary files /dev/null and b/ambience/sounds/rainymemory.ogg differ diff --git a/ambience/sounds/robin2.ogg b/ambience/sounds/robin2.ogg new file mode 100644 index 0000000..f5bab98 Binary files /dev/null and b/ambience/sounds/robin2.ogg differ diff --git a/ambience/sounds/scuba1bubbles.ogg b/ambience/sounds/scuba1bubbles.ogg new file mode 100644 index 0000000..58c4b96 Binary files /dev/null and b/ambience/sounds/scuba1bubbles.ogg differ diff --git a/ambience/sounds/scuba1calm.ogg b/ambience/sounds/scuba1calm.ogg new file mode 100644 index 0000000..057f320 Binary files /dev/null and b/ambience/sounds/scuba1calm.ogg differ diff --git a/ambience/sounds/scuba1calm2.ogg b/ambience/sounds/scuba1calm2.ogg new file mode 100644 index 0000000..b88edc7 Binary files /dev/null and b/ambience/sounds/scuba1calm2.ogg differ diff --git a/ambience/sounds/scuba1interestingbubbles.ogg b/ambience/sounds/scuba1interestingbubbles.ogg new file mode 100644 index 0000000..bf93627 Binary files /dev/null and b/ambience/sounds/scuba1interestingbubbles.ogg differ diff --git a/ambience/sounds/scuba1tubulentbubbles.ogg b/ambience/sounds/scuba1tubulentbubbles.ogg new file mode 100644 index 0000000..4b1b009 Binary files /dev/null and b/ambience/sounds/scuba1tubulentbubbles.ogg differ diff --git a/ambience/sounds/seagull.ogg b/ambience/sounds/seagull.ogg new file mode 100644 index 0000000..9dab963 Binary files /dev/null and b/ambience/sounds/seagull.ogg differ diff --git a/ambience/sounds/small_waterfall.ogg b/ambience/sounds/small_waterfall.ogg new file mode 100644 index 0000000..e8aaec1 Binary files /dev/null and b/ambience/sounds/small_waterfall.ogg differ diff --git a/ambience/sounds/water_swimming_splashing.ogg b/ambience/sounds/water_swimming_splashing.ogg new file mode 100644 index 0000000..676d79c Binary files /dev/null and b/ambience/sounds/water_swimming_splashing.ogg differ diff --git a/ambience/sounds/water_swimming_splashing_breath.ogg b/ambience/sounds/water_swimming_splashing_breath.ogg new file mode 100644 index 0000000..7752c70 Binary files /dev/null and b/ambience/sounds/water_swimming_splashing_breath.ogg differ diff --git a/ambience/todo.txt b/ambience/todo.txt new file mode 100644 index 0000000..4f95977 --- /dev/null +++ b/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 diff --git a/experience/depends.txt b/experience/depends.txt new file mode 100644 index 0000000..7fb7337 --- /dev/null +++ b/experience/depends.txt @@ -0,0 +1,4 @@ +default +nalc_lib +moreores? +technic? diff --git a/experience/init.lua b/experience/init.lua new file mode 100644 index 0000000..edeedf6 --- /dev/null +++ b/experience/init.lua @@ -0,0 +1,310 @@ +--[[level1 = 100 +level1_drop = "default:steelblock 10" +]] + +local xp_table = {} +xp_table["default"] = { + "stone_with_coal 1", "stone_with_iron 1", "stone_with_copper 1", "stone_with_tin 1", + "stone_with_mese 2", "stone_with_gold 2", "stone_with_diamond 3" +} + +if minetest.get_modpath("moreores") then + xp_table["moreores"] = { + "mineral_silver 2", "mineral_mithril 5" + } +end + +if minetest.get_modpath("technic") then + xp_table["technic"] = { + "mineral_uranium 3", "mineral_chromium 4", "mineral_zinc 1", "mineral_lead 1", "mineral_sulfur 1" + } +end + +for mod, data in pairs(xp_table) do + for _, xp in ipairs(data) do + local tab = string.split(xp, " ") + nalc.def_xp(mod..":"..tab[1], tonumber(tab[2])) + end +end + +local players = {} + +MAX_HUD_EXPERIENCE = 40 + +minetest.register_on_joinplayer(function(player) + local playerName = player:get_player_name() + players[playerName] = { + + experiencebar = 0, + experiencetotal = 0, + textnumber = 0, + exphudnumber = 0, + hud = player:hud_add({ + hud_elem_type = "statbar", + position = {x=0.5,y=1}, + size = {x=20, y=5}, + text = "orb_hud.png", + number = 40, + alignment = {x=0,y=1}, + offset = {x=-200, y=-65}, + } + ), + + + hud2 = player:hud_add({ + hud_elem_type = "text", + name = "player_hud:time", + position = {x=0.5,y=1}, + text = "", + scale = {x=2,y=2}, + alignment = {x=0,y=1}, + number = 0xFF0000, --0xFFFFFF, + offset = {x=-240 , y=-65}, + } + ), + } +end) + +minetest.register_on_leaveplayer(function(player) + local playerName = player:get_player_name() + players[playerName] = nil +end) + + +--add an experience orb if player digs node from xp group +minetest.register_on_dignode(function(pos, oldnode, digger) + local namer = oldnode.name + local see_if_mineral = minetest.get_item_group(namer, "xp") + if see_if_mineral == 1 then + minetest.env:add_entity(pos, "experience:orb") + end + if see_if_mineral == 2 then + minetest.env:add_entity(pos, "experience:orb") + minetest.env:add_entity(pos, "experience:orb") + end + if see_if_mineral == 3 then + minetest.env:add_entity(pos, "experience:orb") + minetest.env:add_entity(pos, "experience:orb") + minetest.env:add_entity(pos, "experience:orb") + end + if see_if_mineral == 4 then + minetest.env:add_entity(pos, "experience:orb") + minetest.env:add_entity(pos, "experience:orb") + minetest.env:add_entity(pos, "experience:orb") + minetest.env:add_entity(pos, "experience:orb") + end + if see_if_mineral == 6 then + minetest.env:add_entity(pos, "experience:orb") + minetest.env:add_entity(pos, "experience:orb") + minetest.env:add_entity(pos, "experience:orb") + minetest.env:add_entity(pos, "experience:orb") + minetest.env:add_entity(pos, "experience:orb") + minetest.env:add_entity(pos, "experience:orb") + end + if see_if_mineral == 8 then + minetest.env:add_entity(pos, "experience:orb") + minetest.env:add_entity(pos, "experience:orb") + minetest.env:add_entity(pos, "experience:orb") + minetest.env:add_entity(pos, "experience:orb") + minetest.env:add_entity(pos, "experience:orb") + minetest.env:add_entity(pos, "experience:orb") + minetest.env:add_entity(pos, "experience:orb") + minetest.env:add_entity(pos, "experience:orb") + end +end) +--give a new player some xp +minetest.register_on_newplayer(function(player) + local file = io.open(minetest.get_worldpath().."/"..player:get_player_name().."_experience", "w") + file:write("0") + file:close() +end) +--set player's xp level to 0 if they die +minetest.register_on_dieplayer(function(player) + local file = io.open(minetest.get_worldpath().."/"..player:get_player_name().."_experience", "w") + file:write("0") + file:close() +end) + +--Allow people to collect orbs +minetest.register_globalstep(function(dtime) + + +local gameTime = minetest.get_gametime() + + + for _,player in ipairs(minetest.get_connected_players()) do + local pos = player:getpos() + pos.y = pos.y+0.5 + for _,object in ipairs(minetest.env:get_objects_inside_radius(pos, 1)) do + if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "experience:orb" then + --RIGHT HERE ADD IN THE CODE TO UPGRADE PLAYERS + object:setvelocity({x=0,y=0,z=0}) + object:get_luaentity().name = "STOP" + minetest.sound_play("orb", { + to_player = player:get_player_name(), + }) + + if io.open(minetest.get_worldpath().."/"..player:get_player_name().."_experience", "r") == nil then + local file = io.open(minetest.get_worldpath().."/"..player:get_player_name().."_experience", "w") + file:write("1") + local experience = 1 + file:close() + else + + local xp = io.open(minetest.get_worldpath().."/"..player:get_player_name().."_experience", "r") + local experience = xp:read("*l") + xp:close() + + if experience ~= nil then + local new_xp = experience + 1 + local xp_write = io.open(minetest.get_worldpath().."/"..player:get_player_name().."_experience", "w") + xp_write:write(new_xp) + xp_write:close() + --[[if new_xp == level1 then + minetest.env:add_item(pos, level1_drop) + minetest.sound_play("level_up", { + to_player = player:get_player_name(), + }) + end + ]] + end + + end + + object:remove() + end + end + for _,object in ipairs(minetest.env:get_objects_inside_radius(pos, 3)) do + if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "experience:orb" then + if object:get_luaentity().collect then + local pos1 = pos + pos1.y = pos1.y+0.2 + local pos2 = object:getpos() + local vec = {x=pos1.x-pos2.x, y=pos1.y-pos2.y, z=pos1.z-pos2.z} + vec.x = vec.x*3 + vec.y = vec.y*3 + vec.z = vec.z*3 + object:setvelocity(vec) + end + end + end + + --Loop through all connected players + for playerName,playerInfo in pairs(players) do + local player = minetest.get_player_by_name(playerName) + if player ~= nil then + + + if playerInfo["textnumber"] == nil or playerInfo["textnumber"] <= 0 then + playerInfo["textnumber"] = 0 + player:hud_change(playerInfo["hud2"], "text", playerInfo["textnumber"]) + end + + if playerInfo["experiencetotal"] == nil then + playerInfo["experiencetotal"] = 0 + player:hud_change(playerInfo["hud2"], "text", playerInfo["textnumber"]) + end + + if playerInfo["experiencetotal"] == 0 then + playerInfo["textnumber"] = 0 + player:hud_change(playerInfo["hud2"], "text", playerInfo["textnumber"]) + end + + --[[ + local xptemp = io.open(minetest.get_worldpath().."/"..player:get_player_name().."_experience", "r") + if xptemp ~= nil then + local xptemp2 = xptemp:read("*l") + end + if xptemp2 == nil then + local file = io.open(minetest.get_worldpath().."/"..player:get_player_name().."_experience", "w") + file:write("0") + playerInfo["experiencetotal"] = 0 + playerInfo["textnumber"] = 0 + file:close() + end + ]] + + local xptemp = io.open(minetest.get_worldpath().."/"..player:get_player_name().."_experience", "r") + if xptemp ~= nil then + local xptemp2 = xptemp:read("*l") + if xptemp2 ~= nil then + playerInfo["experiencetotal"] = xptemp2 + end + end + if xptemp ~= nil then + xptemp:close() + end + + + if (playerInfo["experiencetotal"]) ~= nil then + playerInfo["experiencebar"] = (playerInfo["experiencetotal"] - ((playerInfo["textnumber"]) * 40)) + end + + + --Update the players's hud xp bar + local numBars = (playerInfo["experiencebar"]/MAX_HUD_EXPERIENCE)*40 + player:hud_change(playerInfo["hud"], "number", numBars) + + while playerInfo["experiencebar"] >= MAX_HUD_EXPERIENCE do + playerInfo["textnumber"]= playerInfo["textnumber"] + 1 + player:hud_change(playerInfo["hud2"], "text", playerInfo["textnumber"]) + playerInfo["experiencebar"] = ((playerInfo["experiencetotal"]) - ((playerInfo["textnumber"]) * 40)) + local numBars = (playerInfo["experiencebar"]/MAX_HUD_EXPERIENCE)*40 + player:hud_change(playerInfo["hud"], "number", numBars) + end + + if playerInfo["experiencebar"] == 0 then + playerInfo["textnumber"] = 0 + player:hud_change(playerInfo["hud2"], "text", playerInfo["textnumber"]) + end + + + end + end + + end +end) + +minetest.register_entity("experience:orb", { + physical = true, + timer = 0, + textures = {"orb.png"}, + visual_size = {x=0.15, y=0.15}, + collisionbox = {-0.17,-0.17,-0.17,0.17,0.17,0.17}, + on_activate = function(self, staticdata) + self.object:set_armor_groups({immortal=1}) + self.object:setvelocity({x=0, y=1, z=0}) + self.object:setacceleration({x=0, y=-10, z=0}) + end, + collect = true, + on_step = function(self, dtime) + self.timer = self.timer + dtime + if (self.timer > 300) then + self.object:remove() + end + local p = self.object:getpos() + local nn = minetest.env:get_node(p).name + local noder = minetest.env:get_node(p).name + p.y = p.y - 0.3 + local nn = minetest.env:get_node(p).name + if not minetest.registered_nodes[nn] or minetest.registered_nodes[nn].walkable then + if self.physical_state then + self.object:setvelocity({x=0, y=0, z=0}) + self.object:setacceleration({x=0, y=0, z=0}) + self.physical_state = false + self.object:set_properties({ + physical = false + }) + end + else + if not self.physical_state then + self.object:setvelocity({x=0,y=0,z=0}) + self.object:setacceleration({x=0, y=-10, z=0}) + self.physical_state = true + self.object:set_properties({ + physical = true + }) + end + end + end, +}) diff --git a/experience/sounds/attributes.txt b/experience/sounds/attributes.txt new file mode 100644 index 0000000..e9fc445 --- /dev/null +++ b/experience/sounds/attributes.txt @@ -0,0 +1 @@ +http://www.freesound.org/people/partymix/sounds/24102/ diff --git a/experience/sounds/level_up.ogg b/experience/sounds/level_up.ogg new file mode 100644 index 0000000..c6eeb6e Binary files /dev/null and b/experience/sounds/level_up.ogg differ diff --git a/experience/sounds/orb.1.ogg b/experience/sounds/orb.1.ogg new file mode 100644 index 0000000..48b32a1 Binary files /dev/null and b/experience/sounds/orb.1.ogg differ diff --git a/experience/sounds/orb.2.ogg b/experience/sounds/orb.2.ogg new file mode 100644 index 0000000..6f6c2bd Binary files /dev/null and b/experience/sounds/orb.2.ogg differ diff --git a/experience/sounds/orb.3.ogg b/experience/sounds/orb.3.ogg new file mode 100644 index 0000000..3a9d69a Binary files /dev/null and b/experience/sounds/orb.3.ogg differ diff --git a/experience/sounds/orb.4.ogg b/experience/sounds/orb.4.ogg new file mode 100644 index 0000000..2a953a1 Binary files /dev/null and b/experience/sounds/orb.4.ogg differ diff --git a/experience/textures/orb.png b/experience/textures/orb.png new file mode 100644 index 0000000..5a97cc8 Binary files /dev/null and b/experience/textures/orb.png differ diff --git a/experience/textures/orb_hud.png b/experience/textures/orb_hud.png new file mode 100644 index 0000000..de9fd5e Binary files /dev/null and b/experience/textures/orb_hud.png differ diff --git a/modpack.txt b/modpack.txt new file mode 100644 index 0000000..e69de29 diff --git a/nalc_beds/depends.txt b/nalc_beds/depends.txt new file mode 100644 index 0000000..667f2ce --- /dev/null +++ b/nalc_beds/depends.txt @@ -0,0 +1 @@ +beds diff --git a/nalc_beds/init.lua b/nalc_beds/init.lua new file mode 100644 index 0000000..a95dc7b --- /dev/null +++ b/nalc_beds/init.lua @@ -0,0 +1,112 @@ +for _, colour in pairs({"white", "black", "blue", "green"}) do + -- fancy shaped bed + beds.register_bed( + "nalc_beds:fancy_bed_" .. colour, + { + description = "Fancy Bed (" .. colour .. ")", + inventory_image = "beds_bed_fancy_" .. colour .. ".png", + wield_image = "beds_bed_fancy_" .. colour .. ".png", + tiles = { + bottom = { + "beds_bed_top1_" .. colour .. ".png", + "default_wood.png", + "beds_bed_side1_" .. colour .. ".png", + "beds_bed_side1_" .. colour .. ".png^[transformFX", + "default_wood.png", + "beds_bed_foot_" .. colour .. ".png", + }, + top = { + "beds_bed_top2_" .. colour .. ".png", + "default_wood.png", + "beds_bed_side2_" .. colour .. ".png", + "beds_bed_side2_" .. colour .. ".png^[transformFX", + "beds_bed_head.png", + "default_wood.png", + } + }, + nodebox = { + bottom = { + {-0.5, -0.5, -0.5, -0.375, -0.065, -0.4375}, + {0.375, -0.5, -0.5, 0.5, -0.065, -0.4375}, + {-0.5, -0.375, -0.5, 0.5, -0.125, -0.4375}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.4375, 0.4375, -0.0625, 0.5}, + }, + top = { + {-0.5, -0.5, 0.4375, -0.375, 0.1875, 0.5}, + {0.375, -0.5, 0.4375, 0.5, 0.1875, 0.5}, + {-0.5, 0, 0.4375, 0.5, 0.125, 0.5}, + {-0.5, -0.375, 0.4375, 0.5, -0.125, 0.5}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.5, 0.4375, -0.0625, 0.4375}, + } + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.06, 1.5}, + recipe = { + {"", "", "group:stick"}, + {"wool:" .. colour, "wool:" .. colour, "wool:white"}, + {"group:wood", "group:wood", "group:wood"}, + }, + }) + -- Alias for retro compatibility + minetest.register_alias("beds:fancy_bed_"..colour.."_bottom", "nalc_beds:fancy_bed_"..colour.."_bottom") + minetest.register_alias("beds:fancy_bed_"..colour.."_top", "nalc_beds:fancy_bed_"..colour.."_top") + + -- simple shaped bed + beds.register_bed( + "nalc_beds:bed_" .. colour, + { + description = "Simple Bed (" .. colour .. ")", + inventory_image = "beds_bed_" .. colour .. ".png", + wield_image = "beds_bed_" .. colour .. ".png", + tiles = { + bottom = { + "beds_bed_top_bottom_" .. colour .. ".png^[transformR90", + "default_wood.png", + "beds_bed_side_bottom_r_" .. colour .. ".png", + "beds_bed_side_bottom_r_" .. colour .. ".png^[transformfx", + "beds_transparent.png", + "beds_bed_side_bottom_" .. colour .. ".png" + }, + top = { + "beds_bed_top_top_" .. colour .. ".png^[transformR90", + "default_wood.png", + "beds_bed_side_top_r_" .. colour .. ".png", + "beds_bed_side_top_r_" .. colour .. ".png^[transformfx", + "beds_bed_side_top.png", + "beds_transparent.png", + } + }, + nodebox = { + bottom = {-0.5, -0.5, -0.5, 0.5, 0.06, 0.5}, + top = {-0.5, -0.5, -0.5, 0.5, 0.06, 0.5}, + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.06, 1.5}, + recipe = { + {"wool:" .. colour, "wool:" .. colour, "wool:white"}, + {"group:wood", "group:wood", "group:wood"} + }, + + }) + -- Alias for retro compatibility + minetest.register_alias("beds:bed_"..colour.."_bottom", "nalc_beds:bed_"..colour.."_bottom") + minetest.register_alias("beds:bed_"..colour.."_top", "nalc_beds:bed_"..colour.."_top") + + -- Fuel + + minetest.register_craft( + { + type = "fuel", + recipe = "nalc_beds:fancy_bed_"..colour, + burntime = 13, + }) + + minetest.register_craft( + { + type = "fuel", + recipe = "nalc_beds:bed_"..colour, + burntime = 12, + }) +end diff --git a/nalc_beds/textures/beds_bed_black.png b/nalc_beds/textures/beds_bed_black.png new file mode 100755 index 0000000..888a8eb Binary files /dev/null and b/nalc_beds/textures/beds_bed_black.png differ diff --git a/nalc_beds/textures/beds_bed_blue.png b/nalc_beds/textures/beds_bed_blue.png new file mode 100755 index 0000000..85260c4 Binary files /dev/null and b/nalc_beds/textures/beds_bed_blue.png differ diff --git a/nalc_beds/textures/beds_bed_fancy_black.png b/nalc_beds/textures/beds_bed_fancy_black.png new file mode 100755 index 0000000..5ac2653 Binary files /dev/null and b/nalc_beds/textures/beds_bed_fancy_black.png differ diff --git a/nalc_beds/textures/beds_bed_fancy_blue.png b/nalc_beds/textures/beds_bed_fancy_blue.png new file mode 100755 index 0000000..92017d2 Binary files /dev/null and b/nalc_beds/textures/beds_bed_fancy_blue.png differ diff --git a/nalc_beds/textures/beds_bed_fancy_green.png b/nalc_beds/textures/beds_bed_fancy_green.png new file mode 100755 index 0000000..0c8ba63 Binary files /dev/null and b/nalc_beds/textures/beds_bed_fancy_green.png differ diff --git a/nalc_beds/textures/beds_bed_fancy_white.png b/nalc_beds/textures/beds_bed_fancy_white.png new file mode 100755 index 0000000..ffd7b4c Binary files /dev/null and b/nalc_beds/textures/beds_bed_fancy_white.png differ diff --git a/nalc_beds/textures/beds_bed_foot_black.png b/nalc_beds/textures/beds_bed_foot_black.png new file mode 100755 index 0000000..241435c Binary files /dev/null and b/nalc_beds/textures/beds_bed_foot_black.png differ diff --git a/nalc_beds/textures/beds_bed_foot_blue.png b/nalc_beds/textures/beds_bed_foot_blue.png new file mode 100755 index 0000000..8f571c7 Binary files /dev/null and b/nalc_beds/textures/beds_bed_foot_blue.png differ diff --git a/nalc_beds/textures/beds_bed_foot_green.png b/nalc_beds/textures/beds_bed_foot_green.png new file mode 100755 index 0000000..96ca5f9 Binary files /dev/null and b/nalc_beds/textures/beds_bed_foot_green.png differ diff --git a/nalc_beds/textures/beds_bed_foot_white.png b/nalc_beds/textures/beds_bed_foot_white.png new file mode 100755 index 0000000..ec854a5 Binary files /dev/null and b/nalc_beds/textures/beds_bed_foot_white.png differ diff --git a/nalc_beds/textures/beds_bed_green.png b/nalc_beds/textures/beds_bed_green.png new file mode 100755 index 0000000..8acd741 Binary files /dev/null and b/nalc_beds/textures/beds_bed_green.png differ diff --git a/nalc_beds/textures/beds_bed_side1_black.png b/nalc_beds/textures/beds_bed_side1_black.png new file mode 100755 index 0000000..656e0f0 Binary files /dev/null and b/nalc_beds/textures/beds_bed_side1_black.png differ diff --git a/nalc_beds/textures/beds_bed_side1_blue.png b/nalc_beds/textures/beds_bed_side1_blue.png new file mode 100755 index 0000000..1a40f00 Binary files /dev/null and b/nalc_beds/textures/beds_bed_side1_blue.png differ diff --git a/nalc_beds/textures/beds_bed_side1_green.png b/nalc_beds/textures/beds_bed_side1_green.png new file mode 100755 index 0000000..deb0324 Binary files /dev/null and b/nalc_beds/textures/beds_bed_side1_green.png differ diff --git a/nalc_beds/textures/beds_bed_side1_white.png b/nalc_beds/textures/beds_bed_side1_white.png new file mode 100755 index 0000000..fdd02c6 Binary files /dev/null and b/nalc_beds/textures/beds_bed_side1_white.png differ diff --git a/nalc_beds/textures/beds_bed_side2_black.png b/nalc_beds/textures/beds_bed_side2_black.png new file mode 100755 index 0000000..b1eba44 Binary files /dev/null and b/nalc_beds/textures/beds_bed_side2_black.png differ diff --git a/nalc_beds/textures/beds_bed_side2_blue.png b/nalc_beds/textures/beds_bed_side2_blue.png new file mode 100755 index 0000000..8e4131f Binary files /dev/null and b/nalc_beds/textures/beds_bed_side2_blue.png differ diff --git a/nalc_beds/textures/beds_bed_side2_green.png b/nalc_beds/textures/beds_bed_side2_green.png new file mode 100755 index 0000000..d8c1501 Binary files /dev/null and b/nalc_beds/textures/beds_bed_side2_green.png differ diff --git a/nalc_beds/textures/beds_bed_side2_white.png b/nalc_beds/textures/beds_bed_side2_white.png new file mode 100755 index 0000000..3de378c Binary files /dev/null and b/nalc_beds/textures/beds_bed_side2_white.png differ diff --git a/nalc_beds/textures/beds_bed_side_bottom_black.png b/nalc_beds/textures/beds_bed_side_bottom_black.png new file mode 100755 index 0000000..b2c676d Binary files /dev/null and b/nalc_beds/textures/beds_bed_side_bottom_black.png differ diff --git a/nalc_beds/textures/beds_bed_side_bottom_blue.png b/nalc_beds/textures/beds_bed_side_bottom_blue.png new file mode 100755 index 0000000..3689efe Binary files /dev/null and b/nalc_beds/textures/beds_bed_side_bottom_blue.png differ diff --git a/nalc_beds/textures/beds_bed_side_bottom_green.png b/nalc_beds/textures/beds_bed_side_bottom_green.png new file mode 100755 index 0000000..7f552a1 Binary files /dev/null and b/nalc_beds/textures/beds_bed_side_bottom_green.png differ diff --git a/nalc_beds/textures/beds_bed_side_bottom_r_black.png b/nalc_beds/textures/beds_bed_side_bottom_r_black.png new file mode 100755 index 0000000..526465c Binary files /dev/null and b/nalc_beds/textures/beds_bed_side_bottom_r_black.png differ diff --git a/nalc_beds/textures/beds_bed_side_bottom_r_blue.png b/nalc_beds/textures/beds_bed_side_bottom_r_blue.png new file mode 100755 index 0000000..93846de Binary files /dev/null and b/nalc_beds/textures/beds_bed_side_bottom_r_blue.png differ diff --git a/nalc_beds/textures/beds_bed_side_bottom_r_green.png b/nalc_beds/textures/beds_bed_side_bottom_r_green.png new file mode 100755 index 0000000..63a85ac Binary files /dev/null and b/nalc_beds/textures/beds_bed_side_bottom_r_green.png differ diff --git a/nalc_beds/textures/beds_bed_side_bottom_r_white.png b/nalc_beds/textures/beds_bed_side_bottom_r_white.png new file mode 100755 index 0000000..bd7c5e4 Binary files /dev/null and b/nalc_beds/textures/beds_bed_side_bottom_r_white.png differ diff --git a/nalc_beds/textures/beds_bed_side_bottom_white.png b/nalc_beds/textures/beds_bed_side_bottom_white.png new file mode 100755 index 0000000..1ff23d4 Binary files /dev/null and b/nalc_beds/textures/beds_bed_side_bottom_white.png differ diff --git a/nalc_beds/textures/beds_bed_side_top_r_black.png b/nalc_beds/textures/beds_bed_side_top_r_black.png new file mode 100755 index 0000000..3f2f808 Binary files /dev/null and b/nalc_beds/textures/beds_bed_side_top_r_black.png differ diff --git a/nalc_beds/textures/beds_bed_side_top_r_blue.png b/nalc_beds/textures/beds_bed_side_top_r_blue.png new file mode 100755 index 0000000..afa49e4 Binary files /dev/null and b/nalc_beds/textures/beds_bed_side_top_r_blue.png differ diff --git a/nalc_beds/textures/beds_bed_side_top_r_green.png b/nalc_beds/textures/beds_bed_side_top_r_green.png new file mode 100755 index 0000000..20df523 Binary files /dev/null and b/nalc_beds/textures/beds_bed_side_top_r_green.png differ diff --git a/nalc_beds/textures/beds_bed_side_top_r_white.png b/nalc_beds/textures/beds_bed_side_top_r_white.png new file mode 100755 index 0000000..e836a5f Binary files /dev/null and b/nalc_beds/textures/beds_bed_side_top_r_white.png differ diff --git a/nalc_beds/textures/beds_bed_top1_black.png b/nalc_beds/textures/beds_bed_top1_black.png new file mode 100755 index 0000000..4b9f912 Binary files /dev/null and b/nalc_beds/textures/beds_bed_top1_black.png differ diff --git a/nalc_beds/textures/beds_bed_top1_blue.png b/nalc_beds/textures/beds_bed_top1_blue.png new file mode 100755 index 0000000..b95ec67 Binary files /dev/null and b/nalc_beds/textures/beds_bed_top1_blue.png differ diff --git a/nalc_beds/textures/beds_bed_top1_green.png b/nalc_beds/textures/beds_bed_top1_green.png new file mode 100755 index 0000000..cc6d9ad Binary files /dev/null and b/nalc_beds/textures/beds_bed_top1_green.png differ diff --git a/nalc_beds/textures/beds_bed_top1_white.png b/nalc_beds/textures/beds_bed_top1_white.png new file mode 100755 index 0000000..a2eca77 Binary files /dev/null and b/nalc_beds/textures/beds_bed_top1_white.png differ diff --git a/nalc_beds/textures/beds_bed_top2_black.png b/nalc_beds/textures/beds_bed_top2_black.png new file mode 100755 index 0000000..28c567a Binary files /dev/null and b/nalc_beds/textures/beds_bed_top2_black.png differ diff --git a/nalc_beds/textures/beds_bed_top2_blue.png b/nalc_beds/textures/beds_bed_top2_blue.png new file mode 100755 index 0000000..45fec95 Binary files /dev/null and b/nalc_beds/textures/beds_bed_top2_blue.png differ diff --git a/nalc_beds/textures/beds_bed_top2_green.png b/nalc_beds/textures/beds_bed_top2_green.png new file mode 100755 index 0000000..adb02ec Binary files /dev/null and b/nalc_beds/textures/beds_bed_top2_green.png differ diff --git a/nalc_beds/textures/beds_bed_top2_white.png b/nalc_beds/textures/beds_bed_top2_white.png new file mode 100755 index 0000000..d9ee1d7 Binary files /dev/null and b/nalc_beds/textures/beds_bed_top2_white.png differ diff --git a/nalc_beds/textures/beds_bed_top_bottom_black.png b/nalc_beds/textures/beds_bed_top_bottom_black.png new file mode 100755 index 0000000..3d5f61f Binary files /dev/null and b/nalc_beds/textures/beds_bed_top_bottom_black.png differ diff --git a/nalc_beds/textures/beds_bed_top_bottom_blue.png b/nalc_beds/textures/beds_bed_top_bottom_blue.png new file mode 100755 index 0000000..2f1cfb8 Binary files /dev/null and b/nalc_beds/textures/beds_bed_top_bottom_blue.png differ diff --git a/nalc_beds/textures/beds_bed_top_bottom_green.png b/nalc_beds/textures/beds_bed_top_bottom_green.png new file mode 100755 index 0000000..f6134a9 Binary files /dev/null and b/nalc_beds/textures/beds_bed_top_bottom_green.png differ diff --git a/nalc_beds/textures/beds_bed_top_bottom_white.png b/nalc_beds/textures/beds_bed_top_bottom_white.png new file mode 100755 index 0000000..6855530 Binary files /dev/null and b/nalc_beds/textures/beds_bed_top_bottom_white.png differ diff --git a/nalc_beds/textures/beds_bed_top_top_black.png b/nalc_beds/textures/beds_bed_top_top_black.png new file mode 100755 index 0000000..b6d4ddf Binary files /dev/null and b/nalc_beds/textures/beds_bed_top_top_black.png differ diff --git a/nalc_beds/textures/beds_bed_top_top_blue.png b/nalc_beds/textures/beds_bed_top_top_blue.png new file mode 100755 index 0000000..1c3dfe8 Binary files /dev/null and b/nalc_beds/textures/beds_bed_top_top_blue.png differ diff --git a/nalc_beds/textures/beds_bed_top_top_green.png b/nalc_beds/textures/beds_bed_top_top_green.png new file mode 100755 index 0000000..a6b1375 Binary files /dev/null and b/nalc_beds/textures/beds_bed_top_top_green.png differ diff --git a/nalc_beds/textures/beds_bed_top_top_white.png b/nalc_beds/textures/beds_bed_top_top_white.png new file mode 100755 index 0000000..8667758 Binary files /dev/null and b/nalc_beds/textures/beds_bed_top_top_white.png differ diff --git a/nalc_beds/textures/beds_bed_white.png b/nalc_beds/textures/beds_bed_white.png new file mode 100755 index 0000000..730a3fb Binary files /dev/null and b/nalc_beds/textures/beds_bed_white.png differ diff --git a/nalc_default/crafting.lua b/nalc_default/crafting.lua new file mode 100644 index 0000000..cba3ba9 --- /dev/null +++ b/nalc_default/crafting.lua @@ -0,0 +1,58 @@ +minetest.register_craft( + { output = 'nalc_default:pick_gold', + recipe = { + {'default:gold_ingot', 'default:gold_ingot', 'default:gold_ingot'}, + {'', 'group:stick', ''}, + {'', 'group:stick', ''}, + } + }) + +minetest.register_craft( + { output = 'nalc_default:shovel_gold', + recipe = { + {'default:gold_ingot'}, + {'group:stick'}, + {'group:stick'}, + } + }) + +minetest.register_craft( + { output = "nalc_default:axe_gold", + recipe = { + {"default:gold_ingot", "default:gold_ingot"}, + {"default:gold_ingot", "group:stick"}, + {"", "group:stick"}, + } + }) + +minetest.register_craft( + { output = "nalc_default:sword_gold", + recipe = { + {"default:gold_ingot"}, + {"default:gold_ingot"}, + {"group:stick"}, + } + }) + +minetest.register_craft( + { output = "default:cactus 2", + recipe = { + {"nalc_default:cactus_spiky", "nalc_default:cactus_spiky"}, + }, + }) + +minetest.register_craft( + { output = "nalc_default:cactus_spiky 2", + recipe = { + {"default:cactus", "default:cactus"}, + }, + }) + +minetest.register_craft( + { output = "nalc_default:ladder_obsidian 4", + recipe = { + {"default:obsidianbrick", "", "default:obsidianbrick"}, + {"default:obsidianbrick", "default:obsidianbrick", "default:obsidianbrick"}, + {"default:obsidianbrick", "", "default:obsidianbrick"} + } + }) diff --git a/nalc_default/depends.txt b/nalc_default/depends.txt new file mode 100644 index 0000000..a770cbb --- /dev/null +++ b/nalc_default/depends.txt @@ -0,0 +1,2 @@ +default +toolranks? diff --git a/nalc_default/fences.lua b/nalc_default/fences.lua new file mode 100644 index 0000000..071b883 --- /dev/null +++ b/nalc_default/fences.lua @@ -0,0 +1,45 @@ +default.register_fence( + "nalc_default:fence_cobble", + { + description = "Cobble Fence", + texture = "default_fence_cobble.png", + material = "default:cobble", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + }) + +default.register_fence( + "nalc_default:fence_desert_cobble", + { + description = "Desert Cobble Fence", + texture = "default_fence_desert_cobble.png", + material = "default:desert_cobble", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + }) + +default.register_fence( + "nalc_default:fence_steelblock", + { + description = "Steel Block Fence", + texture = "default_fence_steelblock.png", + material = "default:steelblock", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + }) + +default.register_fence( + "nalc_default:fence_brick", + { + description = "Brick Fence", + texture = "default_fence_brick.png", + material = "default:brick", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults() + }) + +-- Aliases +minetest.register_alias("default:fence_cobble", "nalc_default:fence_cobble") +minetest.register_alias("default:fence_desert_cobble", "nalc_default:fence_desert_cobble") +minetest.register_alias("default:fence_steelblock", "nalc_default:fence_steelblock") +minetest.register_alias("default:fence_brick", "nalc_default:fence_brick") diff --git a/nalc_default/init.lua b/nalc_default/init.lua new file mode 100644 index 0000000..0699c6c --- /dev/null +++ b/nalc_default/init.lua @@ -0,0 +1,26 @@ +local modpath = minetest.get_modpath(minetest.get_current_modname()) + +-- Custom Nodes +dofile(modpath.."/nodes.lua") + +-- Custom mapgen ore generation +dofile(modpath.."/mapgen.lua") + +-- Custom Tools +dofile(modpath.."/tools.lua") + +-- Custom Crafts +dofile(modpath.."/crafting.lua") + +-- Override items +minetest.override_item( + "default:stick", + { + stack_max = 1000 + }) + +minetest.override_item( + "default:clay_lump", + { + stack_max = 200 + }) diff --git a/nalc_default/mapgen.lua b/nalc_default/mapgen.lua new file mode 100644 index 0000000..3875245 --- /dev/null +++ b/nalc_default/mapgen.lua @@ -0,0 +1,88 @@ +minetest.register_ore( + { + ore_type = "scatter", + ore = "nalc_default:desert_stone_with_coal", + wherein = "default:desert_stone", + clust_scarcity = 9 * 9 * 9, + clust_num_ores = 10, + clust_size = 3, + y_min = -113, + y_max = 64, + }) + +minetest.register_ore( + { + ore_type = "scatter", + ore = "nalc_default:desert_stone_with_iron", + wherein = "default:desert_stone", + clust_scarcity = 9 * 9 * 9, + clust_num_ores = 10, + clust_size = 3, + y_min = -113, + y_max = 64, + }) + +minetest.register_ore( + { + ore_type = "scatter", + ore = "nalc_default:desert_stone_with_copper", + wherein = "default:desert_stone", + clust_scarcity = 11 * 11 * 11, + clust_num_ores = 6, + clust_size = 3, + y_min = -113, + y_max = 64, + }) + +minetest.register_ore( + { + ore_type = "scatter", + ore = "nalc_default:desert_stone_with_tin", + wherein = "default:desert_stone", + clust_scarcity = 7 * 7 * 7, + clust_num_ores = 3, + clust_size = 7, + y_min = -113, + y_max = 12, + }) + + -- Beware of Meze +minetest.register_ore( + { + ore_type = "scatter", + ore = "nalc_default:meze", + wherein = "default:stone", + clust_scarcity = 40 * 40 * 40, + clust_num_ores = 3, + clust_size = 2, + y_min = 0, + y_max = 64, + flags = "absheight", + }) + +minetest.register_ore( + { + ore_type = "scatter", + ore = "nalc_default:meze", + wherein = "default:desert_stone", + clust_scarcity = 40 * 40 * 40, + clust_num_ores = 3, + clust_size = 2, + y_min = -113, + y_max = 64, + flags = "absheight", + }) + +-- Acid lakes in gravel: + +minetest.register_ore( + { + ore_type = "scatter", + ore = "nalc_default:acid_source", + wherein = "default:gravel", + clust_scarcity = 26 * 26 * 26, + clust_num_ores = 64, + clust_size = 5, + y_min = -30000, + y_max = 64, + }) diff --git a/nalc_default/nodes.lua b/nalc_default/nodes.lua new file mode 100644 index 0000000..78b143a --- /dev/null +++ b/nalc_default/nodes.lua @@ -0,0 +1,292 @@ +local function die_later(digger) + digger:set_hp(0) +end + +minetest.register_node( + "nalc_default:desert_stone_with_coal", + { + description = "Coal Ore", + tiles = {"default_desert_stone.png^default_mineral_coal.png"}, + is_ground_content = true, + groups = {crumbly = 1, cracky = 3}, + drop = { + items = { + {items = {"default:coal_lump"}}, + }, + }, + sounds = default.node_sound_stone_defaults(), + }) + +minetest.register_node( + "nalc_default:desert_stone_with_iron", + { + description = "Iron Ore", + tiles = {"default_desert_stone.png^default_mineral_iron.png"}, + is_ground_content = true, + groups = {cracky = 2}, + drop = { + items = { + {items = {"default:iron_lump"}}, + }, + }, + sounds = default.node_sound_stone_defaults(), + }) + +minetest.register_node( + "nalc_default:desert_stone_with_copper", + { + description = "Copper Ore", + tiles = {"default_desert_stone.png^default_mineral_copper.png"}, + is_ground_content = true, + groups = {crumbly = 1, cracky = 3}, + drop = { + items = { + {items = {"default:copper_lump"}}, + }, + }, + sounds = default.node_sound_stone_defaults(), + }) + +minetest.register_node( + "nalc_default:desert_stone_with_tin", + { + description = "Tin Ore", + tiles = {"default_desert_stone.png^default_mineral_tin.png"}, + is_ground_content = true, + groups = {crumbly = 1, cracky = 3}, + drop = { + items = { + {items = {"default:tin_lump"}}, + }, + }, + sounds = default.node_sound_stone_defaults(), + }) + +minetest.register_node( + "nalc_default:meze", + { + description = "Meze Block", + tiles = {"default_meze_block.png"}, + is_ground_content = true, + drop = "", + groups = {cracky = 1, level = 2, fall_damage_add_percent = -75}, + sounds = default.node_sound_wood_defaults(), -- Intended. + + on_dig = function(pos, node, digger) + if digger and minetest.setting_getbool("enable_damage") and not minetest.setting_getbool("creative_mode") then + minetest.after(3, die_later, digger) + minetest.chat_send_player(digger:get_player_name(), "You feel like you did a mistake.") + minetest.node_dig(pos, node, digger) + elseif digger then + minetest.node_dig(pos, node, digger) + end + end, + }) + +-- +-- Plantlife (non-cubic) +-- + +minetest.override_item( + "default:cactus", + { + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end + }) + +minetest.register_node( + "nalc_default:cactus_spiky", + { + description = "Spiky Cactus", + tiles = {"default_cactus_top.png", "default_cactus_top.png", + "default_cactus_spiky.png"}, + paramtype2 = "facedir", + groups = {snappy = 1, choppy = 3, flammable = 2}, + drop = { + items = { + {items = {"nalc_default:cactus_spiky"}}, + }, + }, + sounds = default.node_sound_wood_defaults(), + on_place = minetest.rotate_node, + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, + }) + +minetest.register_node( + "nalc_default:acid_source", + { + description = "Acid Source", + inventory_image = minetest.inventorycube("default_acid.png"), + drawtype = "liquid", + tiles = { + {name = "default_acid_source_animated.png", animation={type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 1.5}} + }, + special_tiles = { + -- New-style acid source material (mostly unused) + { + name = "default_acid_source_animated.png", + animation = {type = "vertical_frames", aspect_w= 16, aspect_h = 16, length = 1.5}, + backface_culling = false, + } + }, + alpha = 160, + paramtype = "light", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = "", + drowning = 2, + liquidtype = "source", + liquid_alternative_flowing = "nalc_default:acid_flowing", + liquid_alternative_source = "nalc_default:acid_source", + liquid_viscosity = 1, + liquid_range = 4, + damage_per_second = 3, + post_effect_color = {a = 120, r = 50, g = 90, b = 30}, + groups = {water = 3, acid = 3, liquid = 3, puts_out_fire = 1}, + }) + +minetest.register_node( + "nalc_default:acid_flowing", + { + description = "Flowing Acid", + inventory_image = minetest.inventorycube("default_acid.png"), + drawtype = "flowingliquid", + tiles = {"default_acid.png"}, + special_tiles = { + { + image = "default_acid_flowing_animated.png", + backface_culling=false, + animation={type = "vertical_frames", aspect_w= 16, aspect_h = 16, length = 0.6} + }, + { + image = "default_acid_flowing_animated.png", + backface_culling=true, + animation={type = "vertical_frames", aspect_w= 16, aspect_h = 16, length = 0.6} + }, + }, + alpha = 160, + paramtype = "light", + paramtype2 = "flowingliquid", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = "", + drowning = 2, + liquidtype = "flowing", + liquid_alternative_flowing = "nalc_default:acid_flowing", + liquid_alternative_source = "nalc_default:acid_source", + liquid_viscosity = 1, + liquid_range = 4, + damage_per_second = 3, + post_effect_color = {a = 120, r = 50, g = 90, b = 30}, + groups = {water = 3, acid = 3, liquid = 3, puts_out_fire = 1, not_in_creative_inventory = 1}, + }) + +minetest.register_node( + "nalc_default:sand_source", + { + description = "Sand Source", + inventory_image = minetest.inventorycube("default_sand.png"), + drawtype = "liquid", + tiles = {"default_sand.png"}, + alpha = 255, + paramtype = "light", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = "", + drowning = 4, + liquidtype = "source", + liquid_alternative_flowing = "nalc_default:sand_flowing", + liquid_alternative_source = "nalc_default:sand_source", + liquid_viscosity = 20, + liquid_renewable = false, + post_effect_color = {a = 250, r = 0, g = 0, b = 0}, + groups = {liquid = 3}, + }) + +minetest.register_node( + "nalc_default:sand_flowing", + { + description = "Flowing Sand", + inventory_image = minetest.inventorycube("default_sand.png"), + drawtype = "flowingliquid", + tiles = {"default_sand.png"}, + special_tiles = { + { + image = "default_sand_flowing_animated.png", + backface_culling=false, + animation={type = "vertical_frames", aspect_w= 16, aspect_h = 16, length = 0.6} + }, + { + image = "default_sand_flowing_animated.png", + backface_culling=true, + animation={type = "vertical_frames", aspect_w= 16, aspect_h = 16, length = 0.6} + }, + }, + alpha = 255, + paramtype = "light", + paramtype2 = "flowingliquid", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = "", + drowning = 4, + liquidtype = "flowing", + liquid_alternative_flowing = "nalc_default:sand_flowing", + liquid_alternative_source = "nalc_default:sand_source", + liquid_viscosity = 20, + post_effect_color = {a = 250, r = 0, g = 0, b = 0}, + groups = {liquid = 3, not_in_creative_inventory = 1}, + }) + +-- +-- Tools / "Advanced" crafting / Non-"natural" +-- + +minetest.register_node( + "nalc_default:ladder_obsidian", + { + description = "Obsidian Ladder", + drawtype = "signlike", + tiles = {"default_ladder_obsidian.png"}, + inventory_image = "default_ladder_obsidian.png", + wield_image = "default_ladder_obsidian.png", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = false, + climbable = true, + is_ground_content = false, + selection_box = { + type = "wallmounted", + --wall_top = = + --wall_bottom = = + --wall_side = = + }, + groups = {cracky = 2}, + sounds = default.node_sound_stone_defaults(), + }) + +-- Aliases +minetest.register_alias("default:desert_stone_with_coal", "nalc_default:desert_stone_with_coal") +minetest.register_alias("default:desert_stone_with_iron", "nalc_default:desert_stone_with_iron") +minetest.register_alias("default:desert_stone_with_copper", "nalc_default:desert_stone_with_copper") +minetest.register_alias("default:desert_stone_with_tin", "nalc_default:desert_stone_with_tin") +minetest.register_alias("default:meze_block", "nalc_default:meze") +minetest.register_alias("default:meze", "nalc_default:meze") +minetest.register_alias("default:cactus_spiky", "nalc_default:cactus_spiky") +minetest.register_alias("default:acid_source", "nalc_default:acid_source") +minetest.register_alias("default:acid_flowing", "nalc_default:acid_flowing") +minetest.register_alias("default:sand_source", "nalc_default:sand_source") +minetest.register_alias("default:sand_flowing", "nalc_default:sand_flowing") +minetest.register_alias("default:ladder_obsidian", "nalc_default:ladder_obsidian") diff --git a/nalc_default/textures/default_acid.png b/nalc_default/textures/default_acid.png new file mode 100755 index 0000000..a746ece Binary files /dev/null and b/nalc_default/textures/default_acid.png differ diff --git a/nalc_default/textures/default_acid_flowing_animated.png b/nalc_default/textures/default_acid_flowing_animated.png new file mode 100755 index 0000000..0e33f5b Binary files /dev/null and b/nalc_default/textures/default_acid_flowing_animated.png differ diff --git a/nalc_default/textures/default_acid_source_animated.png b/nalc_default/textures/default_acid_source_animated.png new file mode 100755 index 0000000..a2510d9 Binary files /dev/null and b/nalc_default/textures/default_acid_source_animated.png differ diff --git a/nalc_default/textures/default_cactus_spiky.png b/nalc_default/textures/default_cactus_spiky.png new file mode 100644 index 0000000..cdceed2 Binary files /dev/null and b/nalc_default/textures/default_cactus_spiky.png differ diff --git a/nalc_default/textures/default_fence_brick.png b/nalc_default/textures/default_fence_brick.png new file mode 100644 index 0000000..f1deb37 Binary files /dev/null and b/nalc_default/textures/default_fence_brick.png differ diff --git a/nalc_default/textures/default_fence_cobble.png b/nalc_default/textures/default_fence_cobble.png new file mode 100644 index 0000000..f57a2d6 Binary files /dev/null and b/nalc_default/textures/default_fence_cobble.png differ diff --git a/nalc_default/textures/default_fence_desert_cobble.png b/nalc_default/textures/default_fence_desert_cobble.png new file mode 100644 index 0000000..ed9b687 Binary files /dev/null and b/nalc_default/textures/default_fence_desert_cobble.png differ diff --git a/nalc_default/textures/default_fence_steelblock.png b/nalc_default/textures/default_fence_steelblock.png new file mode 100644 index 0000000..5706f12 Binary files /dev/null and b/nalc_default/textures/default_fence_steelblock.png differ diff --git a/nalc_default/textures/default_ladder_obsidian.png b/nalc_default/textures/default_ladder_obsidian.png new file mode 100755 index 0000000..a76bc55 Binary files /dev/null and b/nalc_default/textures/default_ladder_obsidian.png differ diff --git a/nalc_default/textures/default_ladder_obsidian_inv.png b/nalc_default/textures/default_ladder_obsidian_inv.png new file mode 100755 index 0000000..d45fbef Binary files /dev/null and b/nalc_default/textures/default_ladder_obsidian_inv.png differ diff --git a/nalc_default/textures/default_meze_block.png b/nalc_default/textures/default_meze_block.png new file mode 100755 index 0000000..f0ac3dc Binary files /dev/null and b/nalc_default/textures/default_meze_block.png differ diff --git a/nalc_default/textures/default_sand_flowing_animated.png b/nalc_default/textures/default_sand_flowing_animated.png new file mode 100755 index 0000000..55d2891 Binary files /dev/null and b/nalc_default/textures/default_sand_flowing_animated.png differ diff --git a/nalc_default/textures/default_tool_goldaxe.png b/nalc_default/textures/default_tool_goldaxe.png new file mode 100755 index 0000000..970d118 Binary files /dev/null and b/nalc_default/textures/default_tool_goldaxe.png differ diff --git a/nalc_default/textures/default_tool_goldpick.png b/nalc_default/textures/default_tool_goldpick.png new file mode 100755 index 0000000..456a337 Binary files /dev/null and b/nalc_default/textures/default_tool_goldpick.png differ diff --git a/nalc_default/textures/default_tool_goldshovel.png b/nalc_default/textures/default_tool_goldshovel.png new file mode 100755 index 0000000..b93501f Binary files /dev/null and b/nalc_default/textures/default_tool_goldshovel.png differ diff --git a/nalc_default/textures/default_tool_goldsword.png b/nalc_default/textures/default_tool_goldsword.png new file mode 100644 index 0000000..d90426b Binary files /dev/null and b/nalc_default/textures/default_tool_goldsword.png differ diff --git a/nalc_default/tools.lua b/nalc_default/tools.lua new file mode 100644 index 0000000..0cef4cd --- /dev/null +++ b/nalc_default/tools.lua @@ -0,0 +1,94 @@ +minetest.register_tool( + "nalc_default:pick_gold", + { + description = "Golden Pickaxe", + inventory_image = "default_tool_goldpick.png", + tool_capabilities = { + full_punch_interval = 1.2, + max_drop_level = 3, + groupcaps = { + cracky = {times = {[1] = 2.80, [2] = 1.15, [3] = 0.65}, uses = 15, maxlevel = 3}, + crumbly = {times = {[1] = 2.0, [2] = 0.9, [3] = 0.36}, uses = 5, maxlevel = 2}, + }, + damage_groups = {fleshy = 4}, + }, + }) + +minetest.register_tool( + "nalc_default:shovel_gold", + { + description = "Golden Shovel", + inventory_image = "default_tool_goldshovel.png", + wield_image = "default_tool_goldshovel.png^[transformR90", + tool_capabilities = { + full_punch_interval = 1.2, + max_drop_level = 1, + groupcaps = { + crumbly = {times = {[1] = 1.40, [2] = 0.60, [3] = 0.35}, uses = 15, maxlevel = 3}, + }, + damage_groups = {fleshy = 4}, + }, + }) + +minetest.register_tool( + "nalc_default:axe_gold", + { + description = "Golden Axe", + inventory_image = "default_tool_goldaxe.png", + tool_capabilities = { + full_punch_interval = 1.2, + max_drop_level = 1, + groupcaps = { + choppy = {times = {[1] = 3.08, [2] = 1.27, [3] = 0.72}, uses = 15, maxlevel = 3}, + snappy = {times = {[3] = 0.125}, uses = 0, maxlevel = 1}, + }, + damage_groups = {fleshy = 4}, + }, + }) + +minetest.register_tool( + "nalc_default:sword_gold", + { + description = "Golden Sword", + inventory_image = "default_tool_goldsword.png", + tool_capabilities = { + full_punch_interval = 0.8, + max_drop_level = 1, + groupcaps = { + snappy = {times = {[1] = 1.9, [2] = 0.85, [3] = 0.125}, uses = 10, maxlevel = 3}, + }, + damage_groups = {fleshy = 5}, + } + }) + +-- Toolranks +if minetest.get_modpath("toolranks") then + + minetest.override_item( + "nalc_default:pick_gold", + { + original_description = "Golden Pickaxe", + description = toolranks.create_description("Golden Pickaxe", 0, 1), + after_use = toolranks.new_afteruse + }) + minetest.override_item( + "nalc_default:axe_gold", + { + original_description = "Golden Axe", + description = toolranks.create_description("Golden Axe", 0, 1), + after_use = toolranks.new_afteruse + }) + minetest.override_item( + "nalc_default:shovel_gold", + { + original_description = "Golden Shovel", + description = toolranks.create_description("Golden Shovel", 0, 1), + after_use = toolranks.new_afteruse + }) +end + +-- Aliases +minetest.register_alias("default:pick_gold", "nalc_default:pick_gold") +minetest.register_alias("default:shovel_gold", "nalc_default:shovel_gold") +minetest.register_alias("default:axe_gold", "nalc_default:axe_gold") +minetest.register_alias("default:sword_gold", "nalc_default:sword_gold") diff --git a/nalc_hardtrees/depends.txt b/nalc_hardtrees/depends.txt new file mode 100644 index 0000000..aeb077e --- /dev/null +++ b/nalc_hardtrees/depends.txt @@ -0,0 +1,4 @@ +nalc_lib +default +cherry_tree? +moretrees? diff --git a/nalc_hardtrees/init.lua b/nalc_hardtrees/init.lua new file mode 100644 index 0000000..07ffcff --- /dev/null +++ b/nalc_hardtrees/init.lua @@ -0,0 +1,65 @@ +--[[ Auteur : sys4 + + Ce mod permet de : + - Ne plus casser les arbres à la main + - Supprimer haches et pioches en bois. + - Fabriquer les outils en pierre avec du silex trouvé dans le gravier + + Remarque : Les sticks sont obtenables grâce au mod youngtrees de plantlife_modpack +]] + +-- Suppression des haches et pioches en bois +minetest.unregister_item("default:axe_wood") +minetest.unregister_item("default:pick_wood") + +-- Suppression du groupe oddly_breakable_by_hand pour les nodes en bois +local wood_nodes = {} +wood_nodes["default"] = { + "tree", "pine_tree", "jungletree", "acacia_tree", "aspen_tree", + "bush_stem", "acacia_bush_stem", "pine_bush_stem", + "wood", "pine_wood", "junglewood", "acacia_wood", "aspen_wood", +} + +if minetest.get_modpath("cherry_tree") then + wood_nodes["cherry_tree"] = {"cherry_tree", "cherry_plank"} +end + +if minetest.get_modpath("moretrees") and moretrees then + wood_nodes["moretrees"] = {} + local treelist = moretrees.treelist + local j = 1 + for i in ipairs(treelist) do + if treelist[i][1] ~= "poplar_small" then + wood_nodes["moretrees"][j] = treelist[i][1].."_trunk" + wood_nodes["moretrees"][j+1] = treelist[i][1].."_planks" + j = j+2 + end + end + -- rubber_tree_trunk_empty + wood_nodes["moretrees"][#wood_nodes["moretrees"]+1] = "rubber_tree_trunk_empty" +end + +for mod, nodes in pairs(wood_nodes) do + for _,name in ipairs(nodes) do + nalc.not_hand_breakable(mod..":"..name) + end +end + +-- Recette de craft pour pioche et hache avec du silex +minetest.register_craft({ + output = "default:axe_stone", + recipe = { + {"default:flint", "default:flint", ""}, + {"default:flint", "default:stick", ""}, + {"", "default:stick", ""}, + } +}) + +minetest.register_craft({ + output = "default:pick_stone", + recipe = { + {"default:flint", "default:flint", "default:flint"}, + {"", "default:stick", ""}, + {"", "default:stick", ""}, + } +}) diff --git a/nalc_lib/depends.txt b/nalc_lib/depends.txt new file mode 100644 index 0000000..e69de29 diff --git a/nalc_lib/init.lua b/nalc_lib/init.lua new file mode 100644 index 0000000..9620388 --- /dev/null +++ b/nalc_lib/init.lua @@ -0,0 +1,49 @@ +nalc = {} + +-- Remove node from a group +local function remove_group(name, group) + local node = minetest.registered_nodes[name] + + if node then + local groups = node.groups + if groups then + for g in pairs(groups) do + if g == group then + groups[g] = 0 + minetest.log("action", "[nalc_lib] "..name.." removed from group "..group..".") + end + end + minetest.override_item(name, {groups = groups}) + else + minetest.log("warning", "[nalc_lib] "..name.." has no groups, could not remove group "..group..".") + end + else + minetest.log("warning", "[nalc_lib] "..name.." not registered, could not remove group "..group..".") + end +end + +-- Add node to group +local function add_group(name, group, value) + local node = minetest.registered_nodes[name] + + if node then + local groups = node.groups + if not groups then + groups = {} + end + groups[group] = value + + minetest.log("action", "[nalc_lib] Add group "..group.."="..value.." to "..name) + minetest.override_item(name, {groups = groups}) + end +end + +-- Add a node in xp group +function nalc.def_xp(name, value) + add_group(name, "xp", value) +end + +-- Remove node from group "oddly_breakable_by_hand" +function nalc.not_hand_breakable(name) + remove_group(name, "oddly_breakable_by_hand") +end diff --git a/nalc_mesecons/depends.txt b/nalc_mesecons/depends.txt new file mode 100644 index 0000000..02976bf --- /dev/null +++ b/nalc_mesecons/depends.txt @@ -0,0 +1,2 @@ +mesecons_detector +digilines diff --git a/nalc_mesecons/init.lua b/nalc_mesecons/init.lua new file mode 100644 index 0000000..181101c --- /dev/null +++ b/nalc_mesecons/init.lua @@ -0,0 +1,58 @@ +-- Redéfinition de la propriété digiline pour le player_detector +local GET_COMMAND = "GET" +local function object_detector_make_formspec(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", "size[9,2.5]" .. + "field[0.3, 0;9,2;scanname;Name of player to scan for (empty for any):;${scanname}]".. + "field[0.3,1.5;4,2;digiline_channel;Digiline Channel (optional):;${digiline_channel}]".. + "button_exit[7,0.75;2,3;;Save]") +end + +local object_detector_digiline = { + receptor = {}, + effector = { + action = function(pos, node, channel, msg) + local meta = minetest.get_meta(pos) + if channel == meta:get_string("digiline_channel") then + if msg == GET_COMMAND then + local objs = minetest.get_objects_inside_radius(pos, mesecon.setting("detector_radius", 6)) + + -- abort if no scan results were found + if next(objs) == nil then return false end + + local scanname = meta:get_string("scanname") + local scan_for = {} + for _, str in pairs(string.split(scanname:gsub(" ", ""), ",")) do + scan_for[str] = true + end + local every_player = scanname == "" + for _, obj in pairs(objs) do + -- "" is returned if it is not a player; "" ~= nil; so only handle objects with foundname ~= "" + local foundname = obj:get_player_name() + if foundname ~= "" then + if every_player or scan_for[foundname] then + digilines.receptor_send(pos, digilines.rules.default, channel, foundname) + break; + end + end + end + + else + meta:set_string("scanname", msg) + object_detector_make_formspec(pos) + end + end + end + }, +} + +minetest.override_item( + "mesecons_detector:object_detector_off", + { + digiline = object_detector_digiline + }) +minetest.override_item( + "mesecons_detector:object_detector_on", + { + digiline = object_detector_digiline + }) diff --git a/nalc_moreblocks/depends.txt b/nalc_moreblocks/depends.txt new file mode 100644 index 0000000..30bf095 --- /dev/null +++ b/nalc_moreblocks/depends.txt @@ -0,0 +1 @@ +moreblocks diff --git a/nalc_moreblocks/init.lua b/nalc_moreblocks/init.lua new file mode 100644 index 0000000..3d502be --- /dev/null +++ b/nalc_moreblocks/init.lua @@ -0,0 +1,44 @@ +-- Annulation des redéfinitions de crafts de moreblocks + +-- Sign wall Wood +minetest.clear_craft( + { + output = "default:sign_wall_wood", + }) +minetest.register_craft( + { + output = "default:sign_wall_wood 3", + recipe = { + {"group:wood", "group:wood", "group:wood"}, + {"group:wood", "group:wood", "group:wood"}, + {"", "group:stick", ""}, + } + }) + +-- Ladder wood +minetest.clear_craft( + { + output = "default:ladder_wood", + }) +minetest.register_craft( + { + output = "default:ladder_wood 5", + recipe = { + {"group:stick", "", "group:stick"}, + {"group:stick", "group:stick", "group:stick"}, + {"group:stick", "", "group:stick"} + } + }) + +-- Paper +minetest.clear_craft( + { + output = "default:paper", + }) +minetest.register_craft( + { + output= "default:paper", + recipe = { + {"default:papyrus", "default:papyrus", "default:papyrus"} + } + }) diff --git a/nalc_technic/depends.txt b/nalc_technic/depends.txt new file mode 100644 index 0000000..b88d3ff --- /dev/null +++ b/nalc_technic/depends.txt @@ -0,0 +1 @@ +technic diff --git a/nalc_technic/init.lua b/nalc_technic/init.lua new file mode 100644 index 0000000..3775054 --- /dev/null +++ b/nalc_technic/init.lua @@ -0,0 +1,83 @@ +-- Add superquarry machine +dofile(minetest.get_modpath(minetest.get_current_modname()).."/superquarry.lua") + +-- Add uranium to below levels +local uranium_params = {offset = 0, scale = 1, spread = {x = 100, y = 100, z = 100}, seed = 420, octaves = 3, persist = 0.7} +local uranium_threshold = 0.55 + +minetest.register_ore({ + ore_type = "scatter", + ore = "technic:mineral_uranium", + wherein = "default:stone", + clust_scarcity = 7*7*7, + clust_num_ores = 4, + clust_size = 3, + y_min = -1000, + y_max = -301, + noise_params = uranium_params, + noise_threshold = uranium_threshold, +}) + +minetest.register_ore({ + ore_type = "scatter", + ore = "technic:mineral_uranium", + wherein = "default:stone", + clust_scarcity = 6*6*6, + clust_num_ores = 4, + clust_size = 3, + y_min = -28000, + y_max = -1001, + noise_params = uranium_params, + noise_threshold = uranium_threshold, +}) + +-- Add recipes for extractor +if minetest.get_modpath("dye") then + local unifieddyes = minetest.get_modpath("unifieddyes") + local dye_recipes = + { + {"bakedclay:delphinium", "dye:cyan 4"}, + {"bakedclay:lazarus", "dye:pink 4"}, + {"bakedclay:mannagrass", "dye:dark_green 4"}, + {"bakedclay:thistle", "dye:magenta 4"}, + {"nalc:scorched_stuff", "dye:black 4"}, + {"moreflowers:wild_carrot", "dye:white 2"}, + {"moreflowers:teosinte", unifieddyes and "unifieddyes:lime 2"}, + {"morefarming:wildcarrot", "dye:white 4"}, + {"morefarming:teosinte", unifieddyes and "unifieddyes:lime 4"} + } + + for _, data in ipairs(dye_recipes) do + technic.register_extractor_recipe({input = {data[1]}, output = data[2]}) + end + + -- overwrite the existing crafting recipes + minetest.register_craft( + { + type = "shapeless", + output = "dye:cyan 1", + recipe = {"bakedclay:delphinium"} + }) + + minetest.register_craft( + { + type = "shapeless", + output = "dye:pink 1", + recipe = {"bakedclay:lazarus"} + }) + + + minetest.register_craft( + { + type = "shapeless", + output = "dye:dark_green 1", + recipe = {"bakedclay:mannagrass"} + }) + + minetest.register_craft( + { + type = "shapeless", + output = "dye:magenta 1", + recipe = {"bakedclay:thistle"} + }) +end diff --git a/nalc_technic/superquarry.lua b/nalc_technic/superquarry.lua new file mode 100644 index 0000000..f8ed62a --- /dev/null +++ b/nalc_technic/superquarry.lua @@ -0,0 +1,275 @@ +local S = technic.getter + +local tube_entry = "^pipeworks_tube_connection_metallic.png" +local cable_entry = "^technic_cable_connection_overlay.png" + +minetest.register_craft({ + recipe = { + {"moreores:mithril_block", "pipeworks:filter", "moreores:mithril_block"}, + {"technic:motor", "technic:quarry", "technic:diamond_drill_head"}, + {"technic:quarry", "technic:hv_cable", "technic:quarry"} + }, + output = "nalc_technic:superquarry", +}) + +local superquarry_dig_above_nodes = 3 -- How far above the superquarry we will dig nodes +local superquarry_max_depth = 500 +local superquarry_demand = 20000 +local superquarry_eject_dir = vector.new(0, 1, 0) + +local function set_superquarry_formspec(meta) + local radius = meta:get_int("size") + local formspec = "size[6,4.3]".. + "list[context;cache;0,1;4,3;]".. + "item_image[4.8,0;1,1;nalc_technic:superquarry]".. + "label[0,0.2;"..S("%s superquarry"):format("HV").."]".. + "field[4.3,3.5;2,1;size;"..S("Radius:")..";"..radius.."]" + if meta:get_int("enabled") == 0 then + formspec = formspec.."button[4,1;2,1;enable;"..S("Disabled").."]" + else + formspec = formspec.."button[4,1;2,1;disable;"..S("Enabled").."]" + end + local diameter = radius*2 + 1 + local nd = meta:get_int("dug") + local rel_y = superquarry_dig_above_nodes - math.floor(nd / (diameter*diameter)) + formspec = formspec.."label[0,4;"..minetest.formspec_escape( + nd == 0 and S("Digging not started") or + (rel_y < -superquarry_max_depth and S("Digging finished") or + (meta:get_int("purge_on") == 1 and S("Purging cache") or + S("Digging %d m "..(rel_y > 0 and "above" or "below").." machine") + :format(math.abs(rel_y)))) + ).."]" + formspec = formspec.."button[4,2;2,1;restart;"..S("Restart").."]" + meta:set_string("formspec", formspec) +end + +local function set_superquarry_demand(meta) + local radius = meta:get_int("size") + local diameter = radius*2 + 1 + local machine_name = S("%s superquarry"):format("HV") + if meta:get_int("enabled") == 0 or meta:get_int("purge_on") == 1 then + meta:set_string("infotext", S(meta:get_int("purge_on") == 1 and "%s purging cache" or "%s Disabled"):format(machine_name)) + meta:set_int("HV_EU_demand", 0) + elseif meta:get_int("dug") == diameter*diameter * (superquarry_dig_above_nodes+1+superquarry_max_depth) then + meta:set_string("infotext", S("%s Finished"):format(machine_name)) + meta:set_int("HV_EU_demand", 0) + else + meta:set_string("infotext", S(meta:get_int("HV_EU_input") >= superquarry_demand and "%s Active" or "%s Unpowered"):format(machine_name)) + meta:set_int("HV_EU_demand", superquarry_demand) + end +end + +local function superquarry_receive_fields(pos, formname, fields, sender) + local meta = minetest.get_meta(pos) + if fields.size and string.find(fields.size, "^[0-9]+$") then + local size = tonumber(fields.size) + if size >= 2 and size <= 8 and size ~= meta:get_int("size") then + meta:set_int("size", size) + meta:set_int("dug", 0) + end + end + if fields.enable then meta:set_int("enabled", 1) end + if fields.disable then meta:set_int("enabled", 0) end + if fields.restart then + meta:set_int("dug", 0) + meta:set_int("purge_on", 1) + end + set_superquarry_formspec(meta) + set_superquarry_demand(meta) +end + +local function superquarry_handle_purge(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local i = 0 + for _,stack in ipairs(inv:get_list("cache")) do + i = i + 1 + if stack then + local item = stack:to_table() + if item then + technic.tube_inject_item(pos, pos, superquarry_eject_dir, item) + stack:clear() + inv:set_stack("cache", i, stack) + break + end + end + end + if inv:is_empty("cache") then + meta:set_int("purge_on", 0) + end +end + +local function superquarry_run(pos, node) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + -- initialize cache for the case we load an older world + inv:set_size("cache", 12) + -- toss a coin whether we do an automatic purge. Chance 1:100 + local purge_rand = math.random() + if purge_rand <= 0.005 then + meta:set_int("purge_on", 1) + end + + if meta:get_int("enabled") and meta:get_int("HV_EU_input") >= superquarry_demand and meta:get_int("purge_on") == 0 then + local pdir = minetest.facedir_to_dir(node.param2) + local qdir = pdir.x == 1 and vector.new(0,0,-1) or + (pdir.z == -1 and vector.new(-1,0,0) or + (pdir.x == -1 and vector.new(0,0,1) or + vector.new(1,0,0))) + local radius = meta:get_int("size") + local diameter = radius*2 + 1 + local startpos = vector.add(vector.add(vector.add(pos, + vector.new(0, superquarry_dig_above_nodes, 0)), + pdir), + vector.multiply(qdir, -radius)) + local endpos = vector.add(vector.add(vector.add(startpos, + vector.new(0, -superquarry_dig_above_nodes-superquarry_max_depth, 0)), + vector.multiply(pdir, diameter-1)), + vector.multiply(qdir, diameter-1)) + local vm = VoxelManip() + local minpos, maxpos = vm:read_from_map(startpos, endpos) + local area = VoxelArea:new({MinEdge=minpos, MaxEdge=maxpos}) + local data = vm:get_data() + local c_air = minetest.get_content_id("air") + local owner = meta:get_string("owner") + local nd = meta:get_int("dug") + while nd ~= diameter*diameter * (superquarry_dig_above_nodes+1+superquarry_max_depth) do + local ry = math.floor(nd / (diameter*diameter)) + local ndl = nd % (diameter*diameter) + if ry % 2 == 1 then + ndl = diameter*diameter - 1 - ndl + end + local rq = math.floor(ndl / diameter) + local rp = ndl % diameter + if rq % 2 == 1 then rp = diameter - 1 - rp end + local digpos = vector.add(vector.add(vector.add(startpos, + vector.new(0, -ry, 0)), + vector.multiply(pdir, rp)), + vector.multiply(qdir, rq)) + local can_dig = true + if can_dig and minetest.is_protected and minetest.is_protected(digpos, owner) then + can_dig = false + end + local dignode + if can_dig then + dignode = technic.get_or_load_node(digpos) or minetest.get_node(digpos) + local dignodedef = minetest.registered_nodes[dignode.name] or {diggable=false} + if not dignodedef.diggable or (dignodedef.can_dig and not dignodedef.can_dig(digpos, nil)) then + can_dig = false + end + end + + --[[if can_dig then + for ay = startpos.y, digpos.y+1, -1 do + local checkpos = {x=digpos.x, y=ay, z=digpos.z} + local checknode = technic.get_or_load_node(checkpos) or minetest.get_node(checkpos) + if checknode.name ~= "air" then + can_dig = false + break + end + end + end --]] + + nd = nd + 1 + if can_dig then + minetest.remove_node(digpos) + local drops = minetest.get_node_drops(dignode.name, "") + for _, dropped_item in ipairs(drops) do + local left = inv:add_item("cache", dropped_item) + while not left:is_empty() do + meta:set_int("purge_on", 1) + superquarry_handle_purge(pos) + left = inv:add_item("cache", left) + end + end + break + end + end + if nd == diameter*diameter * (superquarry_dig_above_nodes+1+superquarry_max_depth) then + -- if a superquarry is finished, we enable purge mode + meta:set_int("purge_on", 1) + end + meta:set_int("dug", nd) + else + -- if a superquarry is disabled or has no power, we enable purge mode + meta:set_int("purge_on", 1) + end + -- if something triggered a purge, we handle it + if meta:get_int("purge_on") == 1 then + superquarry_handle_purge(pos) + end + set_superquarry_formspec(meta) + set_superquarry_demand(meta) +end + +local function send_move_error(player) + minetest.chat_send_player(player:get_player_name(), + S("Manually taking/removing from cache by hand is not possible. ".. + "If you can't wait, restart or disable the superquarry to start automatic purge.")) + return 0 +end + +minetest.register_node("nalc_technic:superquarry", { + description = S("%s superquarry"):format("HV"), + tiles = { + "moreores_mithril_block.png", + "moreores_mithril_block.png", + "moreores_mithril_block.png", + "moreores_mithril_block.png", + "moreores_mithril_block.png^default_tool_mesepick.png", + "moreores_mithril_block.png" + }, + inventory_image = minetest.inventorycube( + "moreores_mithril_block.png", + "moreores_mithril_block.png^default_tool_mesepick.png", + "moreores_mithril_block.png"), + paramtype2 = "facedir", + groups = {cracky=2, tubedevice=1, technic_machine=1, technic_hv=1}, + connect_sides = {"bottom", "front", "left", "right"}, + tube = { + connect_sides = {top = 1}, + -- lower priority than other tubes, so that quarries will prefer any + -- other tube to another superquarry, which could lead to server freezes + -- in certain superquarry placements (2x2 for example would never eject) + priority = 10, + can_go = function(pos, node, velocity, stack) + -- always eject the same, even if items came in another way + -- this further mitigates loops and generally avoids random sideway movement + -- that can be expected in certain superquarry placements + return { superquarry_eject_dir } + end + }, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", S("%s superquarry"):format("HV")) + meta:set_int("size", 8) + set_superquarry_formspec(meta) + set_superquarry_demand(meta) + end, + after_place_node = function(pos, placer, itemstack) + local meta = minetest.get_meta(pos) + meta:set_string("owner", placer:get_player_name()) + pipeworks.scan_for_tube_objects(pos) + end, + can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("cache") + end, + after_dig_node = pipeworks.scan_for_tube_objects, + on_receive_fields = superquarry_receive_fields, + technic_run = superquarry_run, + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + return send_move_error(player) + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + return send_move_error(player) + end, + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + return send_move_error(player) + end +}) + +technic.register_machine("HV", "nalc_technic:superquarry", technic.receiver) + +minetest.register_alias("nalc:superquarry", "nalc_technic:superquarry") diff --git a/nalc_weather/depends.txt b/nalc_weather/depends.txt new file mode 100644 index 0000000..72a60d9 --- /dev/null +++ b/nalc_weather/depends.txt @@ -0,0 +1 @@ +weather_pack diff --git a/nalc_weather/init.lua b/nalc_weather/init.lua new file mode 100644 index 0000000..91d3458 --- /dev/null +++ b/nalc_weather/init.lua @@ -0,0 +1,66 @@ +if minetest.global_exists("hw_utils") then + local np_temp = { + offset = 50, + scale = 50, + spread = {x = 500, y = 500, z = 500}, + seed = 5349, + octaves = 3, + persist = 0.5, + lacunarity = 2.0 + } + + local np_humid = { + offset = 50, + scale = 50, + spread = {x = 500, y = 500, z = 500}, + seed = 842, + octaves = 3, + persist = 0.5, + lacunarity = 2.0 + } + + local is_biome_frozen = function(position) + local posx = math.floor(position.x) + local posz = math.floor(position.z) + local noise_obj = minetest.get_perlin(np_temp) + local noise_temp = noise_obj:get2d({x = posx, y = posz}) + + -- below 35 heat biome considered to be frozen type + return noise_temp < 35 + end + + hw_utils.is_biome_frozen = function(position) + return is_biome_frozen(position) + end + + local is_biome_dry = function(position) + local posx = math.floor(position.x) + local posz = math.floor(position.z) + local noise_obj = minetest.get_perlin(np_humid) + local noise_humid = noise_obj:get2d({x = posx, y = posz}) + + -- below 50 humid biome considered to be dry type (at least by this mod) + return noise_humid < 50 + end + + hw_utils.is_biome_dry = function(position) + return is_biome_dry(position) + end + + local is_biome_tropic = function(position) + local posx = math.floor(position.x) + local posz = math.floor(position.z) + local noise_obj = minetest.get_perlin(np_humid) + local noise_humid = noise_obj:get2d({x = posx, y = posz}) + noise_obj = minetest.get_perlin(np_temp) + local noise_temp = noise_obj:get2d({x = posx, y = posz}) + + -- humid and temp values are taked by testing flying around world (not sure actually) + return noise_humid > 55 and noise_temp > 80 + end + + hw_utils.is_biome_tropic = function(position) + return is_biome_tropic(position) + end + +end