diff --git a/indra/newview/NACLfloaterexploresounds.cpp b/indra/newview/NACLfloaterexploresounds.cpp index a58695824b..3de1368f62 100644 --- a/indra/newview/NACLfloaterexploresounds.cpp +++ b/indra/newview/NACLfloaterexploresounds.cpp @@ -75,6 +75,9 @@ bool NACLFloaterExploreSounds::postBuild() getChild("stop_btn")->setClickedCallback(boost::bind(&NACLFloaterExploreSounds::handleStop, this)); getChild("bl_btn")->setClickedCallback(boost::bind(&NACLFloaterExploreSounds::blacklistSound, this)); getChild("stop_locally_btn")->setClickedCallback(boost::bind(&NACLFloaterExploreSounds::handleStopLocally, this)); + getChild("block_avatar_worn_sounds_btn")->setClickedCallback(boost::bind(&NACLFloaterExploreSounds::blacklistAvatarSoundsByFlag, this, FSAssetBlacklist::eBlacklistFlag::WORN)); + getChild("block_avatar_rezzed_sounds_btn")->setClickedCallback(boost::bind(&NACLFloaterExploreSounds::blacklistAvatarSoundsByFlag, this, FSAssetBlacklist::eBlacklistFlag::REZZED)); + getChild("block_avatar_gesture_sounds_btn")->setClickedCallback(boost::bind(&NACLFloaterExploreSounds::blacklistAvatarSoundsByFlag, this, FSAssetBlacklist::eBlacklistFlag::GESTURE)); mHistoryScroller = getChild("sound_list"); mHistoryScroller->setCommitCallback(boost::bind(&NACLFloaterExploreSounds::handleSelection, this)); @@ -98,6 +101,9 @@ void NACLFloaterExploreSounds::handleSelection() childSetEnabled("play_locally_btn", num_selected); childSetEnabled("stop_btn", num_selected); childSetEnabled("bl_btn", num_selected); + childSetEnabled("block_avatar_worn_sounds_btn", num_selected); + childSetEnabled("block_avatar_rezzed_sounds_btn", num_selected); + childSetEnabled("block_avatar_gesture_sounds_btn", num_selected); } LLSoundHistoryItem NACLFloaterExploreSounds::getItem(const LLUUID& itemID) @@ -513,3 +519,55 @@ void NACLFloaterExploreSounds::onBlacklistAvatarNameCacheCallback(const LLUUID& } FSAssetBlacklist::getInstance()->addNewItemToBlacklist(asset_id, av_name.getCompleteName(), region_name, LLAssetType::AT_SOUND); } + +// add avatar attachments sounds to blacklist +void NACLFloaterExploreSounds::blacklistAvatarSoundsByFlag(FSAssetBlacklist::eBlacklistFlag flag) +{ + std::vector selection = mHistoryScroller->getAllSelected(); + std::vector::iterator selection_iter = selection.begin(); + std::vector::iterator selection_end = selection.end(); + + for (; selection_iter != selection_end; ++selection_iter) + { + LLSoundHistoryItem item = getItem((*selection_iter)->getValue()); + if (item.mID.isNull()) + { + continue; + } + + std::string region_name; + LLViewerRegion* cur_region = gAgent.getRegion(); + if (cur_region) + { + region_name = cur_region->getName(); + } + + blacklist_avatar_name_cache_connection_map_t::iterator it = mBlacklistAvatarNameCacheConnections.find(item.mOwnerID); + if (it != mBlacklistAvatarNameCacheConnections.end()) + { + if (it->second.connected()) + { + it->second.disconnect(); + } + mBlacklistAvatarNameCacheConnections.erase(it); + } + LLAvatarNameCache::callback_connection_t cb = LLAvatarNameCache::get( + item.mOwnerID, + boost::bind(&NACLFloaterExploreSounds::onBlacklistAvatarSoundsByFlagNameCacheCallback, this, _1, _2, item.mOwnerID, region_name, flag)); + mBlacklistAvatarNameCacheConnections.insert(std::make_pair(item.mOwnerID, cb)); + } +} + +void NACLFloaterExploreSounds::onBlacklistAvatarSoundsByFlagNameCacheCallback(const LLUUID& av_id, const LLAvatarName& av_name, const LLUUID& owner_id, const std::string& region_name, FSAssetBlacklist::eBlacklistFlag flag) +{ + blacklist_avatar_name_cache_connection_map_t::iterator it = mBlacklistAvatarNameCacheConnections.find(av_id); + if (it != mBlacklistAvatarNameCacheConnections.end()) + { + if (it->second.connected()) + { + it->second.disconnect(); + } + mBlacklistAvatarNameCacheConnections.erase(it); + } + FSAssetBlacklist::getInstance()->addNewItemToBlacklist(owner_id, av_name.getCompleteName(), region_name, LLAssetType::AT_SOUND, flag); +} diff --git a/indra/newview/NACLfloaterexploresounds.h b/indra/newview/NACLfloaterexploresounds.h index 1edce5fe09..31078a0a2b 100644 --- a/indra/newview/NACLfloaterexploresounds.h +++ b/indra/newview/NACLfloaterexploresounds.h @@ -9,6 +9,7 @@ #include "lleventtimer.h" #include "llaudioengine.h" #include "llavatarnamecache.h" +#include "fsassetblacklist.h" class LLCheckBoxCtrl; class LLScrollListCtrl; @@ -32,6 +33,7 @@ private: void handleStopLocally(); void handleSelection(); void blacklistSound(); + void blacklistAvatarSoundsByFlag(FSAssetBlacklist::eBlacklistFlag flag); LLScrollListCtrl* mHistoryScroller; LLCheckBoxCtrl* mCollisionSounds; @@ -48,6 +50,7 @@ private: blacklist_avatar_name_cache_connection_map_t mBlacklistAvatarNameCacheConnections; void onBlacklistAvatarNameCacheCallback(const LLUUID& av_id, const LLAvatarName& av_name, const LLUUID& asset_id, const std::string& region_name); + void onBlacklistAvatarSoundsByFlagNameCacheCallback(const LLUUID& av_id, const LLAvatarName& av_name, const LLUUID& asset_id, const std::string& region_name, FSAssetBlacklist::eBlacklistFlag flag); }; #endif diff --git a/indra/newview/fsassetblacklist.cpp b/indra/newview/fsassetblacklist.cpp index 845ffd6e7d..c99b4ea6c3 100644 --- a/indra/newview/fsassetblacklist.cpp +++ b/indra/newview/fsassetblacklist.cpp @@ -72,7 +72,7 @@ void FSAssetBlacklist::init() loadBlacklist(); } -bool FSAssetBlacklist::isBlacklisted(const LLUUID& id, LLAssetType::EType type) +bool FSAssetBlacklist::isBlacklisted(const LLUUID& id, LLAssetType::EType type, eBlacklistFlag flag) { if (mBlacklistData.empty()) { @@ -87,29 +87,71 @@ bool FSAssetBlacklist::isBlacklisted(const LLUUID& id, LLAssetType::EType type) } blacklisted_uuid_container_t uuids = it->second; - return (uuids.find(id) != uuids.end()); -} - -void FSAssetBlacklist::addNewItemToBlacklist(const LLUUID& id, const std::string& name, const std::string& region, LLAssetType::EType type, bool permanent /*= true*/, bool save /*= true*/) -{ - if (isBlacklisted(id, type)) + if (uuids.find(id) == uuids.end()) { - return; + return false; } + if (flag == eBlacklistFlag::NONE) + { + return true; + } + + const auto& data_it = mBlacklistData.find(id); + if (data_it == mBlacklistData.end()) + { + return false; + } + + const LLSD& data = data_it->second; + if (!data.has("asset_blacklist_flag")) + { + return false; + } + + eBlacklistFlag stored_flag = static_cast(data["asset_blacklist_flag"].asInteger()); + + return (static_cast(stored_flag) & static_cast(flag)) != 0; +} + +void FSAssetBlacklist::addNewItemToBlacklist(const LLUUID& id, const std::string& name, const std::string& region, LLAssetType::EType type, eBlacklistFlag flag /*= eBlacklistFlag::NONE*/, bool permanent /*= true*/, bool save /*= true*/) +{ LLDate curdate = LLDate((double)time_corrected()); std::string input_date = curdate.asString(); input_date.replace(input_date.find("T"), 1, " "); input_date.resize(input_date.size() - 1); LLSD data; - data["asset_name"] = name; - data["asset_region"] = region; - data["asset_type"] = type; - data["asset_date"] = input_date; - data["asset_permanent"] = permanent; - addNewItemToBlacklistData(id, data, save); + if (isBlacklisted(id, type)) + { + auto it = mBlacklistData.find(id); + if (it != mBlacklistData.end()) + { + data = it->second; + + S32 existing_flag = data.has("asset_blacklist_flag") ? data["asset_blacklist_flag"].asInteger() : 0; + data["asset_blacklist_flag"] = static_cast(existing_flag | static_cast(flag)); + + data["asset_name"] = name; + data["asset_region"] = region; + data["asset_date"] = input_date; + data["asset_permanent"] = permanent; + + addNewItemToBlacklistData(id, data, save); + } + } + else + { + data["asset_name"] = name; + data["asset_region"] = region; + data["asset_type"] = type; + data["asset_blacklist_flag"] = static_cast(flag); + data["asset_date"] = input_date; + data["asset_permanent"] = permanent; + + addNewItemToBlacklistData(id, data, save); + } } bool FSAssetBlacklist::removeItem(const LLUUID& id) @@ -122,11 +164,14 @@ bool FSAssetBlacklist::removeItem(const LLUUID& id) { return false; } + + // Erase for each possible type + for (auto& [type, container] : mBlacklistTypeContainer) + { + container.erase(id); + } LLSD data = it->second; - LLAssetType::EType type = S32toAssetType(data["asset_type"].asInteger()); - - mBlacklistTypeContainer[type].erase(id); mBlacklistData.erase(it); return data["asset_permanent"].asBoolean(); @@ -165,14 +210,50 @@ void FSAssetBlacklist::removeItemsFromBlacklist(const uuid_vec_t& ids) } } +void FSAssetBlacklist::removeFlagsFromItem(const LLUUID& id, S32 combined_flags) +{auto it = mBlacklistData.find(id); + if (it == mBlacklistData.end()) + { + return; + } + + LLSD& data = it->second; + S32 current_flags = data.has("asset_blacklist_flag") ? data["asset_blacklist_flag"].asInteger() : 0; + + current_flags &= ~combined_flags; + + if (current_flags == 0) + { + removeItemsFromBlacklist({ id }); + } + else + { + data["asset_blacklist_flag"] = current_flags; + addNewItemToBlacklistData(id, data, true); + + if (!mBlacklistChangedCallback.empty()) + { + mBlacklistChangedCallback(LLSD().with(id.asString(), data), eBlacklistOperation::BLACKLIST_ADD); + } + } +} + void FSAssetBlacklist::addNewItemToBlacklistData(const LLUUID& id, const LLSD& data, bool save) { LLAssetType::EType type = S32toAssetType(data["asset_type"].asInteger()); - addEntryToBlacklistMap(id, type); - mBlacklistData[id] = data; + auto it = mBlacklistData.find(id); + if (it != mBlacklistData.end()) + { + it->second = data; + } + else + { + addEntryToBlacklistMap(id, type); + mBlacklistData[id] = data; + } - if (type == LLAssetType::AT_SOUND) + if (type == LLAssetType::AT_SOUND && data["asset_blacklist_flag"].asInteger() == 0) { LLFileSystem::removeFile(id, LLAssetType::AT_SOUND); std::string wav_path = gDirUtilp->getExpandedFilename(LL_PATH_FS_SOUND_CACHE, id.asString()) + ".dsf"; diff --git a/indra/newview/fsassetblacklist.h b/indra/newview/fsassetblacklist.h index ea5392e96e..e9d713f449 100644 --- a/indra/newview/fsassetblacklist.h +++ b/indra/newview/fsassetblacklist.h @@ -45,11 +45,21 @@ class FSAssetBlacklist : public LLSingleton public: void init(); - bool isBlacklisted(const LLUUID& id, LLAssetType::EType type); - void addNewItemToBlacklist(const LLUUID& id, const std::string& name, const std::string& region, LLAssetType::EType type, bool permanent = true, bool save = true); + enum class eBlacklistFlag + { + NONE = 0, + WORN = 1 << 0, + REZZED = 1 << 1, + GESTURE = 1 << 2, + + LAST_FLAG = 1 << 2 + }; + bool isBlacklisted(const LLUUID& id, LLAssetType::EType type, eBlacklistFlag flag = eBlacklistFlag::NONE); + void addNewItemToBlacklist(const LLUUID& id, const std::string& name, const std::string& region, LLAssetType::EType type, eBlacklistFlag flag = eBlacklistFlag::NONE,bool permanent = true, bool save = true); void addNewItemToBlacklistData(const LLUUID& id, const LLSD& data, bool save = true); void removeItemFromBlacklist(const LLUUID& id); void removeItemsFromBlacklist(const uuid_vec_t& ids); + void removeFlagsFromItem(const LLUUID& id, S32 combined_flags); void saveBlacklist(); blacklist_data_t getBlacklistData() const { return mBlacklistData; }; diff --git a/indra/newview/fsfloaterassetblacklist.cpp b/indra/newview/fsfloaterassetblacklist.cpp index 636ae39278..aadbc6f63e 100644 --- a/indra/newview/fsfloaterassetblacklist.cpp +++ b/indra/newview/fsfloaterassetblacklist.cpp @@ -90,25 +90,51 @@ void FSFloaterAssetBlacklist::onOpen(const LLSD& key) buildBlacklist(); } +FSAssetBlacklist::eBlacklistFlag FSFloaterAssetBlacklist::getFlagFromLLSD(const LLSD& data) +{ + if (data.has("asset_blacklist_flag")) + { + return static_cast(data["asset_blacklist_flag"].asInteger()); + } + return FSAssetBlacklist::eBlacklistFlag::NONE; +} + std::string FSFloaterAssetBlacklist::getTypeString(S32 type) { switch (type) { case LLAssetType::AT_TEXTURE: return getString("asset_texture"); - case LLAssetType::AT_SOUND: - return getString("asset_sound"); case LLAssetType::AT_OBJECT: return getString("asset_object"); case LLAssetType::AT_ANIMATION: return getString("asset_animation"); case LLAssetType::AT_PERSON: return getString("asset_resident"); + case LLAssetType::AT_SOUND: + return getString("asset_sound"); default: return getString("asset_unknown"); } } +std::string FSFloaterAssetBlacklist::getFlagString(FSAssetBlacklist::eBlacklistFlag flag) +{ + switch (flag) + { + case FSAssetBlacklist::eBlacklistFlag::NONE: + return getString("blacklist_flag_none"); + case FSAssetBlacklist::eBlacklistFlag::WORN: + return getString("blacklist_flag_mute_avatar_worn_objects_sounds"); + case FSAssetBlacklist::eBlacklistFlag::REZZED: + return getString("blacklist_flag_mute_avatar_rezzed_objects_sounds"); + case FSAssetBlacklist::eBlacklistFlag::GESTURE: + return getString("blacklist_flag_mute_avatar_gestures_sounds"); + default: + return getString("blacklist_flag_unknown"); + } +} + void FSFloaterAssetBlacklist::buildBlacklist() { bool needs_sort = mResultList->isSorted(); @@ -135,44 +161,84 @@ void FSFloaterAssetBlacklist::addElementToList(const LLUUID& id, const LLSD& dat substitution["datetime"] = date.secondsSinceEpoch(); LLStringUtil::format(date_str, substitution); - LLSD element; - element["id"] = id; - element["columns"][0]["column"] = "name"; - element["columns"][0]["type"] = "text"; - element["columns"][0]["value"] = !data["asset_name"].asString().empty() ? data["asset_name"].asString() : getString("unknown_object"); - element["columns"][1]["column"] = "region"; - element["columns"][1]["type"] = "text"; - element["columns"][1]["value"] = !data["asset_region"].asString().empty() ? data["asset_region"].asString() : getString("unknown_region"); - element["columns"][2]["column"] = "type"; - element["columns"][2]["type"] = "text"; - element["columns"][2]["value"] = getTypeString(data["asset_type"].asInteger()); - element["columns"][3]["column"] = "date"; - element["columns"][3]["type"] = "text"; - element["columns"][3]["value"] = date_str; - element["columns"][4]["column"] = "permanent"; - element["columns"][4]["type"] = "text"; - element["columns"][4]["halign"] = "center"; - element["columns"][4]["value"] = data["asset_permanent"].asBoolean() ? getString("asset_permanent") : LLStringUtil::null; - element["columns"][5]["column"] = "date_sort"; - element["columns"][5]["type"] = "text"; - element["columns"][5]["value"] = llformat("%u", (U64)date.secondsSinceEpoch()); - element["columns"][6]["column"] = "asset_type"; - element["columns"][6]["type"] = "integer"; - element["columns"][6]["value"] = data["asset_type"].asInteger(); + const S32 asset_type = data["asset_type"].asInteger(); + S32 flags = data.has("asset_blacklist_flag") && data["asset_blacklist_flag"].asInteger() > 0 ? data["asset_blacklist_flag"].asInteger() : static_cast(FSAssetBlacklist::eBlacklistFlag::NONE); + const S32 last_flag_value = static_cast(FSAssetBlacklist::eBlacklistFlag::LAST_FLAG); - mResultList->addElement(element, ADD_BOTTOM); + for (S32 flag_value = 1; flag_value <= last_flag_value; flag_value <<= 1) + { + if ((flags & flag_value) || flags == static_cast(FSAssetBlacklist::eBlacklistFlag::NONE)) + { + FSAssetBlacklist::eBlacklistFlag flag = static_cast(flag_value); + + if (flags == static_cast(FSAssetBlacklist::eBlacklistFlag::NONE)) + flag = FSAssetBlacklist::eBlacklistFlag::NONE; + + LLSD element; + element["id"] = id; + element["columns"][0]["column"] = "name"; + element["columns"][0]["type"] = "text"; + element["columns"][0]["value"] = !data["asset_name"].asString().empty() ? data["asset_name"].asString() : getString("unknown_object"); + element["columns"][1]["column"] = "region"; + element["columns"][1]["type"] = "text"; + element["columns"][1]["value"] = !data["asset_region"].asString().empty() ? data["asset_region"].asString() : getString("unknown_region"); + element["columns"][2]["column"] = "type"; + element["columns"][2]["type"] = "text"; + element["columns"][2]["value"] = getTypeString(asset_type); + element["columns"][3]["column"] = "flags"; + element["columns"][3]["type"] = "text"; + element["columns"][3]["value"] = getFlagString(flag); + element["columns"][4]["column"] = "date"; + element["columns"][4]["type"] = "text"; + element["columns"][4]["value"] = date_str; + element["columns"][5]["column"] = "permanent"; + element["columns"][5]["type"] = "text"; + element["columns"][5]["halign"] = "center"; + element["columns"][5]["value"] = data["asset_permanent"].asBoolean() ? getString("asset_permanent") : LLStringUtil::null; + element["columns"][6]["column"] = "date_sort"; + element["columns"][6]["type"] = "text"; + element["columns"][6]["value"] = llformat("%u", (U64)date.secondsSinceEpoch()); + element["columns"][7]["column"] = "asset_type"; + element["columns"][7]["type"] = "integer"; + element["columns"][7]["value"] = data["asset_type"].asInteger(); + + LLSD value; + value["flag"] = static_cast(flag); + element["alt_value"] = value; + + mResultList->addElement(element, ADD_BOTTOM); + + if (flags == static_cast(FSAssetBlacklist::eBlacklistFlag::NONE)) + break; + } + } } void FSFloaterAssetBlacklist::removeElements() { - uuid_vec_t items; + std::map flags_to_remove_by_id; for (auto listitem : mResultList->getAllSelected()) { - items.emplace_back(listitem->getUUID()); + LLUUID id = listitem->getUUID(); + LLSD value = listitem->getAltValue(); + + if (value.has("flag")) + { + S32 flag = value["flag"].asInteger(); + flags_to_remove_by_id[id] |= flag; + } + else + { + // fallback: remove full item + FSAssetBlacklist::instance().removeItemsFromBlacklist({ id }); + } } - FSAssetBlacklist::instance().removeItemsFromBlacklist(items); + for (const auto& [id, flags] : flags_to_remove_by_id) + { + FSAssetBlacklist::instance().removeFlagsFromItem(id, flags); + } } void FSFloaterAssetBlacklist::onBlacklistChanged(const LLSD& data, FSAssetBlacklist::eBlacklistOperation op) @@ -185,6 +251,7 @@ void FSFloaterAssetBlacklist::onBlacklistChanged(const LLSD& data, FSAssetBlackl for (LLSD::map_const_iterator it = data.beginMap(); it != data.endMap(); ++it) { LLUUID id = LLUUID(it->first); + mResultList->deleteItems(id); LLSD insert_data = it->second; addElementToList(id, insert_data); } diff --git a/indra/newview/fsfloaterassetblacklist.h b/indra/newview/fsfloaterassetblacklist.h index 0e36346ad8..4fe1cef7d5 100644 --- a/indra/newview/fsfloaterassetblacklist.h +++ b/indra/newview/fsfloaterassetblacklist.h @@ -65,6 +65,8 @@ protected: void buildBlacklist(); std::string getTypeString(S32 type); + std::string getFlagString(FSAssetBlacklist::eBlacklistFlag source); + static FSAssetBlacklist::eBlacklistFlag getFlagFromLLSD(const LLSD& data); LLUUID mAudioSourceID; diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index c340930972..ff809b09d9 100644 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -2531,7 +2531,7 @@ void LLAvatarActions::derenderMultiple(const uuid_vec_t& agent_ids, bool permane //static void LLAvatarActions::onDerenderAvatarNameLookup(const LLUUID& agent_id, const LLAvatarName& av_name, bool permanent) { - FSAssetBlacklist::getInstance()->addNewItemToBlacklist(agent_id, av_name.getUserName(), "", LLAssetType::AT_PERSON, permanent, permanent); + FSAssetBlacklist::getInstance()->addNewItemToBlacklist(agent_id, av_name.getUserName(), "", LLAssetType::AT_PERSON, FSAssetBlacklist::eBlacklistFlag::NONE, permanent, permanent); LLViewerObject* av_obj = gObjectList.findObject(agent_id); if (av_obj) diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 9e0ec0fb49..503e989a51 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -3327,7 +3327,7 @@ void derenderObject(bool permanent) asset_type = LLAssetType::AT_OBJECT; } - FSAssetBlacklist::getInstance()->addNewItemToBlacklist(id, entry_name, region_name, asset_type, permanent, false); + FSAssetBlacklist::getInstance()->addNewItemToBlacklist(id, entry_name, region_name, asset_type, FSAssetBlacklist::eBlacklistFlag::NONE, permanent, false); if (permanent) { diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 91792f1848..0bdfa68034 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -4714,6 +4714,31 @@ void process_sound_trigger(LLMessageSystem *msg, void **) { return; } + + // Gesture sound + if (object_id == owner_id) { + if (FSAssetBlacklist::getInstance()->isBlacklisted(owner_id, LLAssetType::AT_SOUND, FSAssetBlacklist::eBlacklistFlag::GESTURE)) + { + return; + } + } + else + { + LLViewerObject* object = gObjectList.findObject(object_id); + // Attachment sound + if (object && object->isAttachment()) + { + if (FSAssetBlacklist::getInstance()->isBlacklisted(owner_id, LLAssetType::AT_SOUND, FSAssetBlacklist::eBlacklistFlag::WORN)) + { + return; + } + } + // Rezzed object sound + else if (FSAssetBlacklist::getInstance()->isBlacklisted(owner_id, LLAssetType::AT_SOUND, FSAssetBlacklist::eBlacklistFlag::REZZED)) + { + return; + } + } // // NaCl - Antispam Registry @@ -4824,6 +4849,28 @@ void process_preload_sound(LLMessageSystem *msg, void **user_data) { return; } + LLViewerObject* objectp = gObjectList.findObject(object_id); + // Gesture sound + if (object_id == owner_id) + { + if (FSAssetBlacklist::getInstance()->isBlacklisted(owner_id, LLAssetType::AT_SOUND, FSAssetBlacklist::eBlacklistFlag::GESTURE)) + { + return; + } + } + // Attachment sound + else if (objectp && objectp->isAttachment()) + { + if (FSAssetBlacklist::getInstance()->isBlacklisted(owner_id, LLAssetType::AT_SOUND, FSAssetBlacklist::eBlacklistFlag::WORN)) + { + return; + } + } + // Rezzed object sound + else if (FSAssetBlacklist::getInstance()->isBlacklisted(owner_id, LLAssetType::AT_SOUND, FSAssetBlacklist::eBlacklistFlag::REZZED)) + { + return; + } // // NaCl - Antispam Registry @@ -4840,7 +4887,6 @@ void process_preload_sound(LLMessageSystem *msg, void **user_data) return; // - LLViewerObject *objectp = gObjectList.findObject(object_id); if (!objectp) return; if (LLMuteList::getInstance()->isMuted(object_id)) return; @@ -4881,6 +4927,28 @@ void process_attached_sound(LLMessageSystem *msg, void **user_data) { return; } + LLViewerObject* objectp = gObjectList.findObject(object_id); + // Gesture sound + if (object_id == owner_id) + { + if (FSAssetBlacklist::getInstance()->isBlacklisted(owner_id, LLAssetType::AT_SOUND, FSAssetBlacklist::eBlacklistFlag::GESTURE)) + { + return; + } + } + // Attachment sound + else if (objectp && objectp->isAttachment()) + { + if (FSAssetBlacklist::getInstance()->isBlacklisted(owner_id, LLAssetType::AT_SOUND, FSAssetBlacklist::eBlacklistFlag::WORN)) + { + return; + } + } + // Rezzed object sound + else if (FSAssetBlacklist::getInstance()->isBlacklisted(owner_id, LLAssetType::AT_SOUND, FSAssetBlacklist::eBlacklistFlag::REZZED)) + { + return; + } // // NaCl - Antispam Registry diff --git a/indra/newview/skins/default/xui/en/floater_NACL_explore_sounds.xml b/indra/newview/skins/default/xui/en/floater_NACL_explore_sounds.xml index c194052347..e79e932a0a 100644 --- a/indra/newview/skins/default/xui/en/floater_NACL_explore_sounds.xml +++ b/indra/newview/skins/default/xui/en/floater_NACL_explore_sounds.xml @@ -52,4 +52,8 @@