From 63a98538112d2a27826072521231f6ff56b6139b Mon Sep 17 00:00:00 2001 From: sfence Date: Sun, 25 Feb 2024 23:10:39 +0100 Subject: [PATCH] Remove attached sounds when the active object is removed (#14341) --- src/client/client.cpp | 8 ++++++++ src/client/client.h | 3 +++ src/network/clientpackethandler.cpp | 1 + src/server.cpp | 16 ++++++++++++++++ src/server.h | 1 + src/serverenvironment.cpp | 25 +++++++++++++------------ src/serverenvironment.h | 2 ++ 7 files changed, 44 insertions(+), 12 deletions(-) diff --git a/src/client/client.cpp b/src/client/client.cpp index 435775d87..1f315252e 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -2123,3 +2123,11 @@ const std::string &Client::getFormspecPrepend() const { return m_env.getLocalPlayer()->formspec_prepend; } + +void Client::removeActiveObjectSounds(u16 id) +{ + for (auto it : m_sounds_to_objects) { + if (it.second == id) + m_sound->stopSound(it.first); + } +} diff --git a/src/client/client.h b/src/client/client.h index 9f898e78a..ae003c011 100644 --- a/src/client/client.h +++ b/src/client/client.h @@ -471,6 +471,9 @@ private: bool canSendChatMessage() const; + // remove sounds attached to object + void removeActiveObjectSounds(u16 id); + float m_packetcounter_timer = 0.0f; float m_connection_reinit_timer = 0.1f; float m_avg_rtt_timer = 0.0f; diff --git a/src/network/clientpackethandler.cpp b/src/network/clientpackethandler.cpp index 10ecdd34c..f62730d43 100644 --- a/src/network/clientpackethandler.cpp +++ b/src/network/clientpackethandler.cpp @@ -471,6 +471,7 @@ void Client::handleCommand_ActiveObjectRemoveAdd(NetworkPacket* pkt) for (u16 i = 0; i < removed_count; i++) { *pkt >> id; m_env.removeActiveObject(id); + removeActiveObjectSounds(id); } // Read added objects diff --git a/src/server.cpp b/src/server.cpp index 5973ab555..66f485573 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -2264,6 +2264,22 @@ void Server::fadeSound(s32 handle, float step, float gain) m_playing_sounds.erase(it); } +void Server::stopAttachedSounds(u16 id) +{ + assert(id); + + for (auto it = m_playing_sounds.begin(); it != m_playing_sounds.end(); ) { + const ServerPlayingSound &sound = it->second; + + if (sound.object == id) { + // Remove sound reference + it = m_playing_sounds.erase(it); + } + else + it++; + } +} + void Server::sendRemoveNode(v3s16 p, std::unordered_set *far_players, float far_d_nodes) { diff --git a/src/server.h b/src/server.h index de7f9931c..aeb18e592 100644 --- a/src/server.h +++ b/src/server.h @@ -239,6 +239,7 @@ public: s32 playSound(ServerPlayingSound ¶ms, bool ephemeral=false); void stopSound(s32 handle); void fadeSound(s32 handle, float step, float gain); + void stopAttachedSounds(u16 id); // Envlock std::set getPlayerEffectivePrivs(const std::string &name); diff --git a/src/serverenvironment.cpp b/src/serverenvironment.cpp index 275433546..f3fe2c731 100644 --- a/src/serverenvironment.cpp +++ b/src/serverenvironment.cpp @@ -1253,10 +1253,7 @@ void ServerEnvironment::clearObjects(ClearObjectsMode mode) return false; } - // Tell the object about removal - obj->removingFromEnvironment(); - // Deregister in scripting api - m_script->removeObjectReference(obj); + processActiveObjectRemove(obj, id); // Delete active object return true; @@ -1976,10 +1973,7 @@ void ServerEnvironment::removeRemovedObjects() } } - // Tell the object about removal - obj->removingFromEnvironment(); - // Deregister in scripting api - m_script->removeObjectReference(obj); + processActiveObjectRemove(obj, id); // Delete return true; @@ -2216,10 +2210,7 @@ void ServerEnvironment::deactivateFarObjects(bool _force_delete) return false; } - // Tell the object about removal - obj->removingFromEnvironment(); - // Deregister in scripting api - m_script->removeObjectReference(obj); + processActiveObjectRemove(obj, id); // Delete active object return true; @@ -2282,6 +2273,16 @@ bool ServerEnvironment::saveStaticToBlock( return true; } +void ServerEnvironment::processActiveObjectRemove(ServerActiveObject *obj, u16 id) +{ + // Tell the object about removal + obj->removingFromEnvironment(); + // Deregister in scripting api + m_script->removeObjectReference(obj); + // stop attached sounds + m_server->stopAttachedSounds(id); +} + PlayerDatabase *ServerEnvironment::openPlayerDatabase(const std::string &name, const std::string &savedir, const Settings &conf) { diff --git a/src/serverenvironment.h b/src/serverenvironment.h index 6238b2ae2..5f38827f7 100644 --- a/src/serverenvironment.h +++ b/src/serverenvironment.h @@ -454,6 +454,8 @@ private: bool saveStaticToBlock(v3s16 blockpos, u16 store_id, ServerActiveObject *obj, const StaticObject &s_obj, u32 mod_reason); + void processActiveObjectRemove(ServerActiveObject *obj, u16 id); + /* Member variables */