init.lua 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. -------------------------------------------------------
  2. local modpath = minetest.get_modpath("exile_env_sounds")
  3. --dofile(modpath .. "/flowing_water.lua")
  4. --dofile(modpath .. "/beach_waves.lua")
  5. local ran = math.random
  6. local min = math.min
  7. ------------------------------------------------
  8. local radius = 8 -- Water node search radius around player
  9. -- End of parameters
  10. ----------------------------------------------
  11. --
  12. local function posav(npos, num)
  13. local posav = vector.new()
  14. for _, pos in ipairs(npos) do
  15. posav.x = posav.x + pos.x
  16. posav.y = posav.y + pos.y
  17. posav.z = posav.z + pos.z
  18. end
  19. posav = vector.divide(posav, num)
  20. return posav
  21. end
  22. -- Update sound for player
  23. local function update_sound(player)
  24. local player_name = player:get_player_name()
  25. local ppos = player:get_pos()
  26. local areamin = vector.subtract(ppos, radius)
  27. local areamax = vector.add(ppos, radius)
  28. --flowing water
  29. if ran()<0.7 then
  30. local water_nodes = {"nodes_nature:freshwater_flowing", "nodes_nature:salt_water_flowing"}
  31. local wpos, _ = minetest.find_nodes_in_area(areamin, areamax, water_nodes)
  32. local waters = #wpos
  33. if waters <= 2 then
  34. return
  35. end
  36. -- Find average position of water positions
  37. minetest.sound_play(
  38. "env_sounds_water",
  39. {
  40. pos = posav(wpos, waters),
  41. to_player = player_name,
  42. gain = min(0.04 + waters * 0.004, 0.4),
  43. }
  44. )
  45. end
  46. --beach sounds
  47. if ran()<0.7 then
  48. if ppos.y > radius or ppos.y < -radius then
  49. return
  50. end
  51. local water_nodes = {"nodes_nature:salt_water_flowing", "nodes_nature:salt_water_source"}
  52. local wpos, _ = minetest.find_nodes_in_area(areamin, areamax, water_nodes)
  53. local waters = #wpos
  54. if waters <= 9 then
  55. return
  56. end
  57. local ground_nodes = {"group:crumbly", "group:cracky"}
  58. local gpos = minetest.find_node_near(ppos, 2, ground_nodes)
  59. if not gpos then
  60. return
  61. end
  62. -- Find average position of water positions
  63. minetest.sound_play(
  64. "env_sounds_waves",
  65. {
  66. pos = posav(wpos, waters),
  67. to_player = player_name,
  68. gain = min(0.06 + waters * 0.006, 1),
  69. }
  70. )
  71. end
  72. end
  73. -- Update sound 'on joinplayer'
  74. minetest.register_on_joinplayer(function(player)
  75. update_sound(player)
  76. end)
  77. -- Cyclic sound update
  78. local function cyclic_update()
  79. for _, player in pairs(minetest.get_connected_players()) do
  80. update_sound(player)
  81. end
  82. minetest.after(4, cyclic_update)
  83. end
  84. minetest.after(0, cyclic_update)