MineClone2/mods/PLAYER/mcl_music/init.lua

91 lines
2.3 KiB
Lua

local modname = minetest.get_current_modname()
local modpath = minetest.get_modpath(modname)
local pianowtune = "diminixed-pianowtune01"
local listeners = {}
local weather_state
local function stop_music_for_listener_name(listener_name)
if not listener_name then return end
local listener = listeners[listener_name]
if not listener then return end
local handle = listener.handle
if not handle then return end
minetest.sound_stop(handle)
listeners[listener_name].handle = nil
end
local function stop()
for _, player in pairs(minetest.get_connected_players()) do
local player_name = player:get_player_name()
stop_music_for_listener_name(player_name)
end
end
local function play()
local new_weather_state = mcl_weather.get_weather()
local was_good_weather = weather_state == "none" or weather_state == "clear"
weather_state = new_weather_state
local is_good_weather = weather_state == "none" or weather_state == "clear"
local is_weather_changed = weather_state ~= new_weather_state
if is_weather_changed or not is_good_weather then
stop()
return
end
local time = minetest.get_timeofday()
if time < 0.2 or time >= 0.8 then
stop()
return
end
for _, player in pairs(minetest.get_connected_players()) do
local player_name = player:get_player_name()
local listener = listeners[player_name]
local old_hp = listener and listener.hp
local hp = player:get_hp()
local is_hp_changed = old_hp and math.abs(old_hp - hp) > 0.00001
local handle = listener and listener.handle
if is_hp_changed and handle then
stop_music_for_listener_name(player_name)
return
end
if handle then
return
end
local spec = {
name = pianowtune,
gain = 0.3,
pitch = 1.0,
}
local parameters = {
to_player = player_name,
gain = 1.0,
fade = 0.0,
pitch = 1.0,
}
handle = minetest.sound_play(spec, parameters, false)
listeners[player_name] = {
spec = spec,
parameters = parameters,
handle = handle,
hp = hp,
}
end
minetest.after(7, play)
end
minetest.after(15, play)
minetest.register_on_joinplayer(function(player, last_login)
local player_name = player:get_player_name()
stop_music_for_listener_name(player_name)
end)
minetest.register_on_respawnplayer(function(player)
local player_name = player:get_player_name()
stop_music_for_listener_name(player_name)
end)