Implement minetest.sound_fade()
authorsfan5 <sfan5@live.de>
Fri, 10 Apr 2020 20:53:08 +0000 (22:53 +0200)
committerLoïc Blot <nerzhul@users.noreply.github.com>
Sat, 11 Apr 2020 11:12:51 +0000 (13:12 +0200)
doc/client_lua_api.txt
src/script/lua_api/l_client.cpp
src/script/lua_api/l_client.h
src/script/lua_api/l_nodemeta.cpp

index 3612f851bc84af636a26666a84b31531139bcd95..2c8ffd4d46672914913caa688c34ae68b7e54cd2 100644 (file)
@@ -734,6 +734,13 @@ Call these functions only at load time!
     * `spec` is a `SimpleSoundSpec`
     * `parameters` is a sound parameter table
 * `minetest.sound_stop(handle)`
+    * `handle` is a handle returned by `minetest.sound_play`
+* `minetest.sound_fade(handle, step, gain)`
+    * `handle` is a handle returned by `minetest.sound_play`
+    * `step` determines how fast a sound will fade.
+      Negative step will lower the sound volume, positive step will increase
+      the sound volume.
+    * `gain` the target gain for the fade.
 
 ### Timing
 * `minetest.after(time, func, ...)`
index fba18249293566ed6abb414d2b97eae1b5495e09..e30c0526013264cf153692d697bb8c57d2045cb5 100644 (file)
@@ -209,7 +209,7 @@ int ModApiClient::l_gettext(lua_State *L)
        return 1;
 }
 
-// get_node(pos)
+// get_node_or_nil(pos)
 // pos = {x=num, y=num, z=num}
 int ModApiClient::l_get_node_or_nil(lua_State *L)
 {
@@ -228,6 +228,7 @@ int ModApiClient::l_get_node_or_nil(lua_State *L)
        return 1;
 }
 
+// get_langauge()
 int ModApiClient::l_get_language(lua_State *L)
 {
 #ifdef _WIN32
@@ -244,6 +245,7 @@ int ModApiClient::l_get_language(lua_State *L)
        return 2;
 }
 
+// get_wielded_item()
 int ModApiClient::l_get_wielded_item(lua_State *L)
 {
        Client *client = getClient(L);
@@ -266,12 +268,14 @@ int ModApiClient::l_get_meta(lua_State *L)
        return 1;
 }
 
+// sound_play(spec, parameters)
 int ModApiClient::l_sound_play(lua_State *L)
 {
        ISoundManager *sound = getClient(L)->getSoundManager();
 
        SimpleSoundSpec spec;
        read_soundspec(L, 1, spec);
+
        float gain = 1.0f;
        float pitch = 1.0f;
        bool looped = false;
@@ -293,21 +297,32 @@ int ModApiClient::l_sound_play(lua_State *L)
                }
        }
 
-       handle = sound->playSound(spec.name, looped, gain * spec.gain, 0.0f, pitch);
+       handle = sound->playSound(spec.name, looped, gain * spec.gain, spec.fade, pitch);
        lua_pushinteger(L, handle);
 
        return 1;
 }
 
+// sound_stop(handle)
 int ModApiClient::l_sound_stop(lua_State *L)
 {
-       u32 handle = luaL_checkinteger(L, 1);
+       s32 handle = luaL_checkinteger(L, 1);
 
        getClient(L)->getSoundManager()->stopSound(handle);
 
        return 0;
 }
 
+// sound_fade(handle, step, gain)
+int ModApiClient::l_sound_fade(lua_State *L)
+{
+       s32 handle = luaL_checkinteger(L, 1);
+       float step = readParam<float>(L, 2);
+       float gain = readParam<float>(L, 3);
+       getClient(L)->getSoundManager()->fadeSound(handle, step, gain);
+       return 0;
+}
+
 // get_server_info()
 int ModApiClient::l_get_server_info(lua_State *L)
 {
@@ -426,6 +441,7 @@ void ModApiClient::Initialize(lua_State *L, int top)
        API_FCT(get_meta);
        API_FCT(sound_play);
        API_FCT(sound_stop);
+       API_FCT(sound_fade);
        API_FCT(get_server_info);
        API_FCT(get_item_def);
        API_FCT(get_node_def);
index 6d1f70b1d3160cbf6962d30dfd84f5e4e7423dca..5dc3efdade45ebeacc9212bbd27a4432748f495d 100644 (file)
@@ -69,6 +69,7 @@ private:
        // get_node(pos)
        static int l_get_node_or_nil(lua_State *L);
 
+       // get_language()
        static int l_get_language(lua_State *L);
 
        // get_wielded_item()
@@ -77,10 +78,15 @@ private:
        // get_meta(pos)
        static int l_get_meta(lua_State *L);
 
+       // sound_play(spec, parameters)
        static int l_sound_play(lua_State *L);
 
+       // sound_stop(handle)
        static int l_sound_stop(lua_State *L);
 
+       // sound_fade(handle, step, gain)
+       static int l_sound_fade(lua_State *L);
+
        // get_server_info()
        static int l_get_server_info(lua_State *L);
 
index 229ce73dbc044cc27078ec40451b70405e5e2c33..57052cb42b587a14d22556afe93773eb6fa8c75b 100644 (file)
@@ -55,11 +55,13 @@ Metadata* NodeMetaRef::getmeta(bool auto_create)
 
 void NodeMetaRef::clearMeta()
 {
+       SANITY_CHECK(!m_is_local);
        m_env->getMap().removeNodeMetadata(m_p);
 }
 
 void NodeMetaRef::reportMetadataChange(const std::string *name)
 {
+       SANITY_CHECK(!m_is_local);
        // NOTE: This same code is in rollback_interface.cpp
        // Inform other things that the metadata has changed
        NodeMetadata *meta = dynamic_cast<NodeMetadata*>(m_meta);