From a32ed5e3cf55fb38dc5d4832e1d9b7393d329cc2 Mon Sep 17 00:00:00 2001 From: crabman77 Date: Fri, 27 Mar 2015 20:46:17 +0100 Subject: [PATCH] add an menu in soundset add an menu in soundset and and button in unified_inventory and chatcommand to display menu --- mods/soundset/depends.txt | 1 + mods/soundset/init.lua | 157 +++++++++++++++--- mods/soundset/readme.txt | 5 + mods/soundset/textures/soundset_dec.png | Bin 0 -> 5683 bytes mods/soundset/textures/soundset_inc.png | Bin 0 -> 5644 bytes mods/soundset/textures/soundset_menu_icon.png | Bin 0 -> 6349 bytes 6 files changed, 136 insertions(+), 27 deletions(-) create mode 100644 mods/soundset/depends.txt create mode 100644 mods/soundset/textures/soundset_dec.png create mode 100644 mods/soundset/textures/soundset_inc.png create mode 100644 mods/soundset/textures/soundset_menu_icon.png diff --git a/mods/soundset/depends.txt b/mods/soundset/depends.txt new file mode 100644 index 00000000..20b7c424 --- /dev/null +++ b/mods/soundset/depends.txt @@ -0,0 +1 @@ +unified_inventory? diff --git a/mods/soundset/init.lua b/mods/soundset/init.lua index 503dfe41..3a1de80e 100644 --- a/mods/soundset/init.lua +++ b/mods/soundset/init.lua @@ -3,8 +3,34 @@ minetest.log("action","[mod soundset] Loading...") sounds = {} sounds.file = minetest.get_worldpath() .. "/sounds_config.txt" sounds.gainplayers = {} +sounds.tmp = {} +local function save_sounds_config() + local input = io.open(sounds.file, "w") + if input then + input:write(minetest.serialize(sounds.gainplayers)) + input:close() + else + minetest.log("action","echec d'ouverture (mode:w) de " .. sounds.file) + end +end + + +local function load_sounds_config() + local file = io.open(sounds.file, "r") + if file then + sounds.gainplayers = minetest.deserialize(file:read("*all")) + file:close() + end + print("type: "..tostring(type(sounds.gainplayers))) + if sounds.gainplayers == nil or type(sounds.gainplayers) ~= "table" then + sounds.gainplayers = {} + end +end + +load_sounds_config() + sounds.set_sound = function(name, param) if param == "" then minetest.chat_send_player(name, "/setsound ") @@ -13,18 +39,16 @@ sounds.set_sound = function(name, param) local param_name, param_value = param:match("^(%S+)%s(%S+)$") if param_name == nil or param_value == nil then minetest.chat_send_player(name, "invalid param, /setsound ") - minetest.log("action", "invalid param, see /setsound ") return end if param_name ~= "music" and param_name ~= "ambience" and param_name ~= "mobs" and param_name ~= "other" then minetest.chat_send_player(name, "invalid param " .. param_name) - minetest.log("action", "invalid param, /setsound " .. param_name) return end local value = tonumber(param_value) if value == nil then - minetest.log("action", "invalid value, " ..param_value .. " must be number") + minetest.chat_send_player(name, "invalid value, " ..param_value .. " must be number") return end @@ -36,22 +60,12 @@ sounds.set_sound = function(name, param) if sounds.gainplayers[name][param_name] == value then minetest.chat_send_player(name, "volume " .. param_name .. " already set to " .. value) - minetest.log("action", name ..", volume " .. param_name .. " already set to " .. value) return end sounds.gainplayers[name][param_name] = value minetest.chat_send_player(name, "sound " .. param_name .. " set to " .. value) - minetest.log("action", name ..", sound " .. param_name .. " set to " .. value) - - - local input = io.open(sounds.file, "w") - if input then - input:write(minetest.serialize(sounds.gainplayers)) - input:close() - else - minetest.log("action","echec d'ouverture (mode:w) de " .. sounds.file) - end + save_sounds_config() end @@ -67,31 +81,119 @@ sounds.get_gain = function(name, sound_type) end +local formspec = "size[6,6]".. + "label[2,0;Sound Menu]".. + "label[0.3,1.2;MUSIC]".. + "image_button[1.6,1;1,1;soundset_dec.png;vmusic;-]".. + "label[2.7,1.2;%s]".. + "image_button[3.5,1;1,1;soundset_inc.png;vmusic;+]".. + "label[0,2.2;AMBIENCE]".. + "image_button[1.6,2;1,1;soundset_dec.png;vambience;-]".. + "label[2.7,2.2;%s]".. + "image_button[3.5,2;1,1;soundset_inc.png;vambience;+]".. + "button_exit[0.5,5.2;1.5,1;abort;Abort]".. + "button_exit[4,5.2;1.5,1;abort;Ok]" -local function load_sounds_config() - local file = io.open(sounds.file, "r") - if file then - sounds.gainplayers = minetest.deserialize(file:read("*all")) - file:close() - end - if sounds.gainplayers == nil then - sounds.gainplayers = {} + +local on_show_settings = function(name, music, ambience) + if not sounds.tmp[name] then + sounds.tmp[name] = {} end + sounds.tmp[name]["music"] = music + sounds.tmp[name]["ambience"] = ambience + minetest.show_formspec( name, "soundset:settings", string.format(formspec, tostring(music), tostring(ambience) )) end -load_sounds_config() +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname == "soundset:settings" then + local name = player:get_player_name() + local fmusic = sounds.tmp[name]["music"] + local fambience = sounds.tmp[name]["ambience"] + if fields["abort"] == "Ok" then + if sounds.gainplayers[name]["music"] ~= fmusic or sounds.gainplayers[name]["ambience"] ~= fambience then + sounds.gainplayers[name]["music"] = fmusic + sounds.gainplayers[name]["ambience"] = fambience + save_sounds_config() + end + sounds.tmp[name] = nil + return + elseif fields["abort"] == "Abort" then + sounds.tmp[name] = nil + return + elseif fields["vmusic"] == "+" then + if fmusic < 100 then + fmusic = fmusic +5 + if fmusic > 100 then + fmusic = 100 + end + end + elseif fields["vmusic"] == "-" then + if fmusic > 0 then + fmusic = fmusic -5 + if fmusic < 0 then + fmusic = 0 + end + end + elseif fields["vambience"] == "+" then + if fambience < 100 then + fambience = fambience +5 + if fambience > 100 then + fambience = 100 + end + end + elseif fields["vambience"] == "-" then + if fambience > 0 then + fambience = fambience -5 + if fambience < 0 then + fambience = 0 + end + end + elseif fields["quit"] == "true" then + sounds.tmp[name] = nil + return + else + return + end -minetest.register_chatcommand("setsound", { + on_show_settings(name, fmusic, fambience) + end +end) + + +if (minetest.get_modpath("unified_inventory")) then + unified_inventory.register_button("menu_soundset", { + type = "image", + image = "soundset_menu_icon.png", + tooltip = "sounds menu ", + action = function(player) + local name = player:get_player_name() + on_show_settings(name, sounds.gainplayers[name]["music"], sounds.gainplayers[name]["ambience"]) + end, + }) +end + +minetest.register_chatcommand("soundset", { + params = "", + description = "Display volume menu formspec", + privs = {interact=true}, + func = function(name, param) + on_show_settings(name, sounds.gainplayers[name]["music"], sounds.gainplayers[name]["ambience"]) + end +}) + + + +minetest.register_chatcommand("soundsets", { params = " ", - description = "set volume sound ", + description = "Set volume sound ", privs = {interact=true}, func = sounds.set_sound, }) -minetest.register_chatcommand("getsound", { +minetest.register_chatcommand("soundsetg", { params = "", - description = "print volume sound ", + description = "Display volume sound ", privs = {interact=true}, func = function(name, param) local conf = "" @@ -109,5 +211,6 @@ minetest.register_on_joinplayer(function(player) sounds.gainplayers[name] = { ["music"] = 50, ["ambience"] = 50, ["mobs"] = 50, ["other"] = 50 } end end) + minetest.log("action","[mod soundset] Loaded") diff --git a/mods/soundset/readme.txt b/mods/soundset/readme.txt index 2d37f72b..12f6fd35 100644 --- a/mods/soundset/readme.txt +++ b/mods/soundset/readme.txt @@ -4,3 +4,8 @@ by LeMagnesium and crabman77 YOUR mod can use THIS mod to have a volume that's adjustable by the player(s) 0.1 - Initial Release +0.2 - add menu setting and button for unified_inventory and chatcommand to display menu + + + +Licenses images: Author:mikhog http://opengameart.org/content/play-pause-mute-and-unmute-buttons CC0 1.0 Universal (CC0 1.0) Public Domain Dedication diff --git a/mods/soundset/textures/soundset_dec.png b/mods/soundset/textures/soundset_dec.png new file mode 100644 index 0000000000000000000000000000000000000000..0a29dea3503e86b78cdae1de584e67e19f3db447 GIT binary patch literal 5683 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 Z@jt>+^e2=;3s3+6002ovPDHLkV1o7axz+#x literal 0 HcmV?d00001 diff --git a/mods/soundset/textures/soundset_inc.png b/mods/soundset/textures/soundset_inc.png new file mode 100644 index 0000000000000000000000000000000000000000..f3dbab1b440bb4dc6b76b7a145aa3d8ca33bc26f GIT binary patch literal 5644 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 P00000NkvXXu0mjfl~;RT literal 0 HcmV?d00001