Merge pull request #144 from Gaalrauch/master

Added buttons on sounds explorer window to mute all attached / rezzed sounds by avatar
meow-7.2.2
Ansariel Hiller 2025-06-16 10:00:47 +02:00 committed by GitHub
commit 45ab26b7eb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
11 changed files with 368 additions and 55 deletions

View File

@ -75,6 +75,9 @@ bool NACLFloaterExploreSounds::postBuild()
getChild<LLButton>("stop_btn")->setClickedCallback(boost::bind(&NACLFloaterExploreSounds::handleStop, this));
getChild<LLButton>("bl_btn")->setClickedCallback(boost::bind(&NACLFloaterExploreSounds::blacklistSound, this));
getChild<LLButton>("stop_locally_btn")->setClickedCallback(boost::bind(&NACLFloaterExploreSounds::handleStopLocally, this));
getChild<LLButton>("block_avatar_worn_sounds_btn")->setClickedCallback(boost::bind(&NACLFloaterExploreSounds::blacklistAvatarSoundsByFlag, this, FSAssetBlacklist::eBlacklistFlag::WORN));
getChild<LLButton>("block_avatar_rezzed_sounds_btn")->setClickedCallback(boost::bind(&NACLFloaterExploreSounds::blacklistAvatarSoundsByFlag, this, FSAssetBlacklist::eBlacklistFlag::REZZED));
getChild<LLButton>("block_avatar_gesture_sounds_btn")->setClickedCallback(boost::bind(&NACLFloaterExploreSounds::blacklistAvatarSoundsByFlag, this, FSAssetBlacklist::eBlacklistFlag::GESTURE));
mHistoryScroller = getChild<LLScrollListCtrl>("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<LLScrollListItem*> selection = mHistoryScroller->getAllSelected();
std::vector<LLScrollListItem*>::iterator selection_iter = selection.begin();
std::vector<LLScrollListItem*>::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);
}

View File

@ -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

View File

@ -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<eBlacklistFlag>(data["asset_blacklist_flag"].asInteger());
return (static_cast<int>(stored_flag) & static_cast<int>(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<S32>(existing_flag | static_cast<S32>(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<S32>(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";

View File

@ -45,11 +45,21 @@ class FSAssetBlacklist : public LLSingleton<FSAssetBlacklist>
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; };

View File

@ -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<FSAssetBlacklist::eBlacklistFlag>(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<S32>(FSAssetBlacklist::eBlacklistFlag::NONE);
const S32 last_flag_value = static_cast<S32>(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<S32>(FSAssetBlacklist::eBlacklistFlag::NONE))
{
FSAssetBlacklist::eBlacklistFlag flag = static_cast<FSAssetBlacklist::eBlacklistFlag>(flag_value);
if (flags == static_cast<S32>(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<S32>(flag);
element["alt_value"] = value;
mResultList->addElement(element, ADD_BOTTOM);
if (flags == static_cast<S32>(FSAssetBlacklist::eBlacklistFlag::NONE))
break;
}
}
}
void FSFloaterAssetBlacklist::removeElements()
{
uuid_vec_t items;
std::map<LLUUID, S32> 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);
}

View File

@ -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;

View File

@ -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)

View File

@ -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)
{

View File

@ -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;
}
}
// </FS>
// 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;
}
// </FS>
// NaCl - Antispam Registry
@ -4840,7 +4887,6 @@ void process_preload_sound(LLMessageSystem *msg, void **user_data)
return;
// </FS:ND>
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;
}
// </FS>
// NaCl - Antispam Registry

View File

@ -52,4 +52,8 @@
<button bottom_delta="0" follows="left|bottom" height="20" label="Stop" name="stop_btn" right="-10" width="95" enabled="false"/>
<button bottom_delta="0" follows="left|bottom" height="20" label="Blacklist" name="bl_btn" right="-110" width="95" enabled="false"/>
<button bottom_delta="25" follows="left|bottom" height="20" label="Block AV worn sounds" name="block_avatar_worn_sounds_btn" left="10" width="165" enabled="false"/>
<button bottom_delta="0" follows="left|bottom" height="20" label="Block AV rezzed sounds" name="block_avatar_rezzed_sounds_btn" left_delta="170" width="165" enabled="false"/>
<button bottom_delta="0" follows="left|bottom" height="20" label="Block AV gesture sounds" name="block_avatar_gesture_sounds_btn" left_delta="170" width="165" enabled="false"/>
</floater>

View File

@ -27,6 +27,20 @@
<floater.string name="asset_resident">
Resident
</floater.string>
<floater.string name="blacklist_flag_none">
</floater.string>
<floater.string name="blacklist_flag_mute_avatar_worn_objects_sounds">
Avatar worn objects sounds
</floater.string>
<floater.string name="blacklist_flag_mute_avatar_rezzed_objects_sounds">
Avatar rezzed objects sounds
</floater.string>
<floater.string name="blacklist_flag_mute_avatar_gestures_sounds">
Avatar gestures sounds
</floater.string>
<floater.string name="blacklist_flag_unknown">
Unknow flag
</floater.string>
<floater.string name="asset_unknown">
Unknown
</floater.string>
@ -82,6 +96,11 @@
label="Type"
width="60"
/>
<columns
name="flags"
label="Flags"
width="170"
/>
<columns
name="date"
label="Date"
@ -105,6 +124,7 @@
<column column="name">[UNKNOWN] Template item</column>
<column column="region">[UNKNOWN] Template item</column>
<column column="type">Unknown</column>
<column column="flags">None</column>
<column column="date">2012-12-11 13:37:00</column>
<column column="permanent">&#x2714;</column>
</row>