Merge branch 'master' of https://vcs.firestormviewer.org/phoenix-firestorm
# Conflicts: # indra/newview/fsfloaterim.hmaster
commit
d3c3df624b
|
|
@ -167,8 +167,8 @@ jobs:
|
|||
path_sep="\\"
|
||||
fi
|
||||
function find_most_recent_bundle() {
|
||||
local pattern="$1-.*$2-.*"
|
||||
local most_recent_file=$(ls -t "${{ github.workspace }}" | grep "$pattern" | head -1)
|
||||
local pattern="$1-.*$2[-_]+.*"
|
||||
local most_recent_file=$(ls -t "${{ github.workspace }}" | egrep "$pattern" | head -1)
|
||||
if [ -z "$most_recent_file" ]; then
|
||||
echo ""
|
||||
else
|
||||
|
|
|
|||
|
|
@ -1140,11 +1140,11 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>eebbcd0757dd28646ebb4505e7af140e</string>
|
||||
<string>9d9f72f50cffe7443e4b58f009ffc1f4</string>
|
||||
<key>hash_algorithm</key>
|
||||
<string>md5</string>
|
||||
<key>url</key>
|
||||
<string>file:///opt/firestorm/fmodstudio-2.02.13-darwin64-6.tar.bz2</string>
|
||||
<string>file:///opt/firestorm/fmodstudio-2.02.15-darwin64-9.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>darwin64</string>
|
||||
|
|
@ -1154,11 +1154,11 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>5fee0f9587f50531211ff9e1e860692f</string>
|
||||
<string>79fb2f09d2c81ed6464e11af36566910</string>
|
||||
<key>hash_algorithm</key>
|
||||
<string>md5</string>
|
||||
<key>url</key>
|
||||
<string>file:///opt/firestorm/fmodstudio-2.02.13-linux64-230861132.tar.bz2</string>
|
||||
<string>file:///opt/firestorm/fmodstudio-2.02.15-linux64-231741426.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>linux64</string>
|
||||
|
|
@ -1168,11 +1168,11 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>99c928b18a0d2f08b0ee33fca90c4118</string>
|
||||
<string>c1bce2b362c31345200297a4010626e9</string>
|
||||
<key>hash_algorithm</key>
|
||||
<string>md5</string>
|
||||
<key>url</key>
|
||||
<string>file:///c:/cygwin/opt/firestorm/fmodstudio-2.02.13-windows-230860911.tar.bz2</string>
|
||||
<string>file:///c:/cygwin/opt/firestorm/fmodstudio-2.02.15-windows-231741106.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows</string>
|
||||
|
|
@ -1182,18 +1182,18 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>01946a6427d126570607c02b75560f02</string>
|
||||
<string>cd0e8f58fece3eac0b5ebe21f354bf8c</string>
|
||||
<key>hash_algorithm</key>
|
||||
<string>md5</string>
|
||||
<key>url</key>
|
||||
<string>file:///c:/cygwin/opt/firestorm/fmodstudio-2.02.13-windows64-230860913.tar.bz2</string>
|
||||
<string>file:///c:/cygwin/opt/firestorm/fmodstudio-2.02.15-windows64-231741113.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows64</string>
|
||||
</map>
|
||||
</map>
|
||||
<key>version</key>
|
||||
<string>2.02.13</string>
|
||||
<string>2.02.15</string>
|
||||
</map>
|
||||
<key>fontconfig</key>
|
||||
<map>
|
||||
|
|
|
|||
|
|
@ -49,6 +49,8 @@
|
|||
|
||||
#include "httpstats.h"
|
||||
|
||||
#include "indra_constants.h" // <FS> Clownflare changes
|
||||
|
||||
// *DEBUG: "[curl:bugs] #1420" problem and testing.
|
||||
//
|
||||
// A pipelining problem, https://sourceforge.net/p/curl/bugs/1420/,
|
||||
|
|
@ -525,6 +527,7 @@ HttpStatus HttpOpRequest::prepareRequest(HttpService * service)
|
|||
check_curl_easy_setopt(mCurlHandle, CURLOPT_SEEKDATA, getHandle());
|
||||
|
||||
check_curl_easy_setopt(mCurlHandle, CURLOPT_COOKIEFILE, "");
|
||||
check_curl_easy_setopt(mCurlHandle, CURLOPT_USERAGENT, APP_NAME.c_str()); // <FS> Clownflare changes
|
||||
|
||||
if (gpolicy.mSslCtxCallback)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -44,7 +44,12 @@ static const char* subdirs = "0123456789abcdef";
|
|||
|
||||
LLDiskCache::LLDiskCache(const std::string cache_dir,
|
||||
const uintmax_t max_size_bytes,
|
||||
const bool enable_cache_debug_info) :
|
||||
const bool enable_cache_debug_info
|
||||
// <FS:Beq> Add High/Low water mark support
|
||||
,const F32 highwater_mark_percent
|
||||
,const F32 lowwater_mark_percent
|
||||
// </FS:Beq>
|
||||
) :
|
||||
mCacheDir(cache_dir),
|
||||
mMaxSizeBytes(max_size_bytes),
|
||||
mEnableCacheDebugInfo(enable_cache_debug_info)
|
||||
|
|
@ -113,6 +118,8 @@ void LLDiskCache::purge()
|
|||
#else
|
||||
std::string cache_path(mCacheDir);
|
||||
#endif
|
||||
uintmax_t file_size_total = 0; // <FS:Beq/> try to make simple cache less naive.
|
||||
|
||||
if (boost::filesystem::is_directory(cache_path, ec) && !ec.failed())
|
||||
{
|
||||
// <FS:Ansariel> Optimize asset simple disk cache
|
||||
|
|
@ -137,6 +144,7 @@ void LLDiskCache::purge()
|
|||
{
|
||||
continue;
|
||||
}
|
||||
file_size_total += file_size; // <FS:Beq/> try to make simple cache less naive.
|
||||
|
||||
file_info.push_back(file_info_t(file_time, { file_size, file_path }));
|
||||
}
|
||||
|
|
@ -145,52 +153,106 @@ void LLDiskCache::purge()
|
|||
}
|
||||
}
|
||||
|
||||
// <FS:Beq> add high water/low water thresholds to reduce the churn in the cache.
|
||||
LL_DEBUGS("LLDiskCache") << "Cache is " << (int)(((F32)file_size_total)/mMaxSizeBytes*100.0) << "% full" << LL_ENDL;
|
||||
if( file_size_total < mMaxSizeBytes * (mHighPercent/100) )
|
||||
{
|
||||
// Nothing to do here
|
||||
LL_DEBUGS("LLDiskCache") << "Not exceded high water - do nothing" << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
// If we reach here we are above the trigger level so we must purge until we've removed enough to take us down to the low water mark.
|
||||
// </FS:Beq>
|
||||
std::sort(file_info.begin(), file_info.end(), [](file_info_t& x, file_info_t& y)
|
||||
{
|
||||
return x.first > y.first;
|
||||
return x.first < y.first; // <FS:Beq/> sort oldest to newest, to we can remove the oldest files first.
|
||||
});
|
||||
|
||||
LL_INFOS() << "Purging cache to a maximum of " << mMaxSizeBytes << " bytes" << LL_ENDL;
|
||||
|
||||
// <FS:Beq> add high water/low water thresholds to reduce the churn in the cache.
|
||||
auto target_size = (uintmax_t)(mMaxSizeBytes * (mLowPercent/100));
|
||||
LL_INFOS() << "Purging cache to a maximum of " << target_size << " bytes" << LL_ENDL;
|
||||
// </FS:Beq>
|
||||
|
||||
// <FS:Beq> Extra accounting to track the retention of static assets
|
||||
//std::vector<bool> file_removed;
|
||||
std::vector<S32> file_removed;
|
||||
int keep{0};
|
||||
int del{0};
|
||||
int skip{0};
|
||||
enum class purge_action { delete_file=0, keep_file, skip_file };
|
||||
std::map<std::string,purge_action> file_removed;
|
||||
auto keep{file_info.size()};
|
||||
auto del{0};
|
||||
auto skip{0};
|
||||
// </FS:Beq>
|
||||
if (mEnableCacheDebugInfo)
|
||||
{
|
||||
file_removed.reserve(file_info.size());
|
||||
}
|
||||
uintmax_t file_size_total = 0;
|
||||
// <FS:Beq> revised purge logic to track amount removed not retained to shortern loop
|
||||
// uintmax_t file_size_total = 0;
|
||||
// if (mEnableCacheDebugInfo)
|
||||
// {
|
||||
// file_removed.reserve(file_info.size());
|
||||
// }
|
||||
// uintmax_t file_size_total = 0;
|
||||
// for (file_info_t& entry : file_info)
|
||||
// {
|
||||
// file_size_total += entry.second.first;
|
||||
|
||||
// bool should_remove = file_size_total > mMaxSizeBytes;
|
||||
// // <FS> Make sure static assets are not eliminated
|
||||
// S32 action{ should_remove ? 0 : 1 };
|
||||
// if (should_remove)
|
||||
// {
|
||||
// auto uuid_as_string = gDirUtilp->getBaseFileName(entry.second.second, true);
|
||||
// uuid_as_string = uuid_as_string.substr(mCacheFilenamePrefix.size() + 1, 36);// skip "sl_cache_" and trailing "_N"
|
||||
// // LL_INFOS() << "checking UUID=" <<uuid_as_string<< LL_ENDL;
|
||||
// if (std::find(mSkipList.begin(), mSkipList.end(), uuid_as_string) != mSkipList.end())
|
||||
// {
|
||||
// // this is one of our protected items so no purging
|
||||
// should_remove = false;
|
||||
// action = 2;
|
||||
// updateFileAccessTime(entry.second.second); // force these to the front of the list next time so that purge size works
|
||||
// }
|
||||
// }
|
||||
// // </FS>
|
||||
// if (mEnableCacheDebugInfo)
|
||||
// {
|
||||
// // <FS> Static asset stuff
|
||||
// //file_removed.push_back(should_remove);
|
||||
// file_removed.push_back(action);
|
||||
// }
|
||||
uintmax_t deleted_size_total = 0;
|
||||
for (file_info_t& entry : file_info)
|
||||
{
|
||||
file_size_total += entry.second.first;
|
||||
// first check if we still need to delete more files
|
||||
bool should_remove = (file_size_total - deleted_size_total) > target_size;
|
||||
|
||||
bool should_remove = file_size_total > mMaxSizeBytes;
|
||||
// <FS> Make sure static assets are not eliminated
|
||||
S32 action{ should_remove ? 0 : 1 };
|
||||
if (should_remove)
|
||||
auto action{ should_remove ? purge_action::delete_file : purge_action::keep_file };
|
||||
if (!should_remove)
|
||||
{
|
||||
auto uuid_as_string = gDirUtilp->getBaseFileName(entry.second.second, true);
|
||||
uuid_as_string = uuid_as_string.substr(mCacheFilenamePrefix.size() + 1, 36);// skip "sl_cache_" and trailing "_N"
|
||||
// LL_INFOS() << "checking UUID=" <<uuid_as_string<< LL_ENDL;
|
||||
if (std::find(mSkipList.begin(), mSkipList.end(), uuid_as_string) != mSkipList.end())
|
||||
{
|
||||
// this is one of our protected items so no purging
|
||||
should_remove = false;
|
||||
action = 2;
|
||||
updateFileAccessTime(entry.second.second); // force these to the front of the list next time so that purge size works
|
||||
}
|
||||
break;
|
||||
}
|
||||
// </FS>
|
||||
|
||||
auto this_file_size = entry.second.first;
|
||||
deleted_size_total += this_file_size;
|
||||
auto uuid_as_string = gDirUtilp->getBaseFileName(entry.second.second, true);
|
||||
uuid_as_string = uuid_as_string.substr(mCacheFilenamePrefix.size() + 1, 36);// skip "sl_cache_" and trailing "_N"
|
||||
// LL_INFOS() << "checking UUID=" <<uuid_as_string<< LL_ENDL;
|
||||
if (std::find(mSkipList.begin(), mSkipList.end(), uuid_as_string) != mSkipList.end())
|
||||
{
|
||||
// this is one of our protected items so no purging
|
||||
should_remove = false;
|
||||
action = purge_action::skip_file;
|
||||
updateFileAccessTime(entry.second.second); // force these to the front of the list next time so that purge size works
|
||||
skip++;
|
||||
}
|
||||
else{
|
||||
del++;
|
||||
}
|
||||
keep--;
|
||||
if (mEnableCacheDebugInfo)
|
||||
{
|
||||
// <FS> Static asset stuff
|
||||
//file_removed.push_back(should_remove);
|
||||
file_removed.push_back(action);
|
||||
// <FS> Static asset stuff
|
||||
//file_removed.push_back(should_remove);
|
||||
file_removed.emplace(entry.second.second, action);
|
||||
}
|
||||
// </FS>
|
||||
if (should_remove)
|
||||
{
|
||||
boost::filesystem::remove(entry.second.second, ec);
|
||||
|
|
@ -200,37 +262,52 @@ void LLDiskCache::purge()
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
// <FS:Beq> update the debug logging to be more useful
|
||||
auto end_time = std::chrono::high_resolution_clock::now();
|
||||
auto execute_time = std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time).count();
|
||||
// </FS:Beq>
|
||||
if (mEnableCacheDebugInfo)
|
||||
{
|
||||
auto end_time = std::chrono::high_resolution_clock::now();
|
||||
auto execute_time = std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time).count();
|
||||
// <FS:Beq> update the debug logging to be more useful
|
||||
// auto end_time = std::chrono::high_resolution_clock::now();
|
||||
// auto execute_time = std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time).count();
|
||||
// </FS:Beq>
|
||||
|
||||
// Log afterward so it doesn't affect the time measurement
|
||||
// Logging thousands of file results can take hundreds of milliseconds
|
||||
auto deleted_so_far = 0; // <FS:Beq/> update the debug logging to be more useful
|
||||
for (size_t i = 0; i < file_info.size(); ++i)
|
||||
{
|
||||
const file_info_t& entry = file_info[i];
|
||||
// <FS> Static asset stuff
|
||||
deleted_so_far += entry.second.first; // <FS:Beq/> update the debug logging to be more useful
|
||||
//const bool removed = file_removed[i];
|
||||
//const std::string action = removed ? "DELETE:" : "KEEP:";
|
||||
std::string action{};
|
||||
switch (file_removed[i])
|
||||
{
|
||||
default:
|
||||
case 0:
|
||||
action = "KEEP";
|
||||
keep++;
|
||||
break;
|
||||
case 1:
|
||||
|
||||
// Check if the file exists in the map
|
||||
auto& filename{ entry.second.second };
|
||||
if (file_removed.find(filename) != file_removed.end()) {
|
||||
// File found in the map, retrieve the corresponding enum value
|
||||
switch (file_removed[filename]) {
|
||||
case purge_action::delete_file:
|
||||
action = "DELETE";
|
||||
del++;
|
||||
break;
|
||||
case 2:
|
||||
break;
|
||||
case purge_action::skip_file:
|
||||
action = "STATIC";
|
||||
skip++;
|
||||
break;
|
||||
break;
|
||||
default:
|
||||
// Handle any unexpected enum value
|
||||
action = "UNKNOWN";
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
action = "KEEP";
|
||||
}
|
||||
// </FS>
|
||||
|
||||
// have to do this because of LL_INFO/LL_END weirdness
|
||||
|
|
@ -240,14 +317,22 @@ void LLDiskCache::purge()
|
|||
line << entry.first << " ";
|
||||
line << entry.second.first << " ";
|
||||
line << entry.second.second;
|
||||
line << " (" << file_size_total << "/" << mMaxSizeBytes << ")";
|
||||
line << " (" << file_size_total - deleted_so_far << "/" << mMaxSizeBytes << ")"; // <FS:Beq/> update the debug logging to be more useful
|
||||
LL_INFOS() << line.str() << LL_ENDL;
|
||||
}
|
||||
|
||||
LL_INFOS() << "Total dir size after purge is " << dirFileSize(mCacheDir) << LL_ENDL;
|
||||
LL_INFOS() << "Cache purge took " << execute_time << " ms to execute for " << file_info.size() << " files" << LL_ENDL;
|
||||
LL_INFOS() << "Deleted: " << del << " Skipped: " << skip << " Kept: " << keep << LL_ENDL; // <FS:Beq/> Extra accounting to track the retention of static assets
|
||||
// <FS:Beq> make the summary stats more easily enabled.
|
||||
}
|
||||
// <FS:Beq> update the debug logging to be more useful
|
||||
// LL_INFOS() << "Total dir size after purge is " << dirFileSize(mCacheDir) << LL_ENDL;
|
||||
// LL_INFOS() << "Cache purge took " << execute_time << " ms to execute for " << file_info.size() << " files" << LL_ENDL;
|
||||
|
||||
auto newCacheSize = updateCacheSize(file_size_total - deleted_size_total);
|
||||
LL_INFOS("LLDiskCache") << "Total dir size after purge is " << newCacheSize << LL_ENDL;
|
||||
LL_INFOS("LLDiskCache") << "Cache purge took " << execute_time << " ms to execute for " << file_info.size() << " files" << LL_ENDL;
|
||||
// </FS:Beq>
|
||||
LL_INFOS("LLDiskCache") << "Deleted: " << del << " Skipped: " << skip << " Kept: " << keep << LL_ENDL; // <FS:Beq/> Extra accounting to track the retention of static assets
|
||||
LL_INFOS("LLDiskCache") << "Total of " << deleted_size_total << " bytes removed." << LL_ENDL; // <FS:Beq/> Extra accounting to track the retention of static assets
|
||||
// } <FS:Beq/> this bracket was moved up a few lines.
|
||||
}
|
||||
|
||||
const std::string LLDiskCache::assetTypeToString(LLAssetType::EType at)
|
||||
|
|
@ -534,8 +619,32 @@ void LLDiskCache::removeOldVFSFiles()
|
|||
}
|
||||
}
|
||||
|
||||
uintmax_t LLDiskCache::dirFileSize(const std::string& dir)
|
||||
// <FS:Beq> Lets not scan every single time if we can avoid it eh?
|
||||
// uintmax_t LLDiskCache::dirFileSize(const std::string& dir)
|
||||
// {
|
||||
uintmax_t LLDiskCache::updateCacheSize(const uintmax_t newsize)
|
||||
{
|
||||
mStoredCacheSize = newsize;
|
||||
mLastScanTime = system_clock::now();
|
||||
return mStoredCacheSize;
|
||||
}
|
||||
|
||||
uintmax_t LLDiskCache::dirFileSize(const std::string& dir, bool force )
|
||||
{
|
||||
using namespace std::chrono;
|
||||
const seconds cache_duration{ 120 };// A rather arbitrary number. it takes 5 seconds+ on a fast drive to scan 80K+ items. purge runs every minute and will update. so 120 should mean we never need a superfluous cache scan.
|
||||
|
||||
const auto current_time = system_clock::now();
|
||||
|
||||
const auto time_difference = duration_cast<seconds>(current_time - mLastScanTime);
|
||||
|
||||
// Check if the cached result can be used
|
||||
if( !force && time_difference < cache_duration )
|
||||
{
|
||||
LL_DEBUGS("LLDiskCache") << "Using cached result: " << mStoredCacheSize << LL_ENDL;
|
||||
return mStoredCacheSize;
|
||||
}
|
||||
// </FS:Beq>
|
||||
uintmax_t total_file_size = 0;
|
||||
|
||||
/**
|
||||
|
|
@ -577,7 +686,10 @@ uintmax_t LLDiskCache::dirFileSize(const std::string& dir)
|
|||
}
|
||||
}
|
||||
|
||||
return total_file_size;
|
||||
// <FS:Beq> Lets not scan every single time if we can avoid it eh?
|
||||
// return total_file_size;
|
||||
return updateCacheSize(total_file_size);
|
||||
// </FS:Beq>
|
||||
}
|
||||
|
||||
LLPurgeDiskCacheThread::LLPurgeDiskCacheThread() :
|
||||
|
|
|
|||
|
|
@ -63,6 +63,9 @@
|
|||
#define _LLDISKCACHE
|
||||
|
||||
#include "llsingleton.h"
|
||||
#include <chrono>
|
||||
using namespace std::chrono;
|
||||
|
||||
|
||||
class LLDiskCache :
|
||||
public LLParamSingleton<LLDiskCache>
|
||||
|
|
@ -92,7 +95,18 @@ class LLDiskCache :
|
|||
* if there are bugs, we can ask uses to enable this
|
||||
* setting and send us their logs
|
||||
*/
|
||||
const bool enable_cache_debug_info);
|
||||
const bool enable_cache_debug_info,
|
||||
// <FS:Beq> Add high/low threshold controls for cache purging
|
||||
/**
|
||||
* A floating point percentage of the max_size_bytes above which the cache purge will trigger.
|
||||
*/
|
||||
const F32 highwater_mark_percent,
|
||||
/**
|
||||
* A floating point percentage of the max_size_bytes which the cache purge will aim to reach once triggered.
|
||||
*/
|
||||
const F32 lowwater_mark_percent
|
||||
// </FS:Beq>
|
||||
);
|
||||
|
||||
virtual ~LLDiskCache() = default;
|
||||
|
||||
|
|
@ -157,6 +171,10 @@ class LLDiskCache :
|
|||
|
||||
// <FS:Ansariel> Better asset cache size control
|
||||
void setMaxSizeBytes(uintmax_t size) { mMaxSizeBytes = size; }
|
||||
// <FS:Beq> High/Low water control
|
||||
void setHighWaterPercentage(F32 HiPct) { mHighPercent = llclamp(HiPct, mLowPercent, 100.0); };
|
||||
void setLowWaterPercentage(F32 LowPct) { mLowPercent = llclamp(LowPct, 0.0, mHighPercent); };
|
||||
// </FS:Beq>
|
||||
|
||||
private:
|
||||
/**
|
||||
|
|
@ -164,7 +182,8 @@ class LLDiskCache :
|
|||
* directory. Primarily used here to determine the directory size
|
||||
* before and after the cache purge
|
||||
*/
|
||||
uintmax_t dirFileSize(const std::string& dir);
|
||||
uintmax_t updateCacheSize(const uintmax_t newsize); // <FS:Beq/> enable time based caching of dirfilesize except when force is true.
|
||||
uintmax_t dirFileSize(const std::string& dir, bool force=false); // <FS:Beq/> enable time based caching of dirfilesize except when force is true.
|
||||
|
||||
/**
|
||||
* Utility function to convert an LLAssetType enum into a
|
||||
|
|
@ -172,6 +191,13 @@ class LLDiskCache :
|
|||
*/
|
||||
const std::string assetTypeToString(LLAssetType::EType at);
|
||||
|
||||
/**
|
||||
* cache the directory size cos it takes forever to calculate it
|
||||
*
|
||||
*/
|
||||
uintmax_t mStoredCacheSize{ 0 };
|
||||
time_point<system_clock> mLastScanTime{ };
|
||||
|
||||
private:
|
||||
/**
|
||||
* The maximum size of the cache in bytes. After purge is called, the
|
||||
|
|
@ -179,6 +205,10 @@ class LLDiskCache :
|
|||
* less than this value
|
||||
*/
|
||||
uintmax_t mMaxSizeBytes;
|
||||
// <FS:Beq> High/Low water control
|
||||
F32 mHighPercent { 95.0 };
|
||||
F32 mLowPercent { 70.0 };
|
||||
// </FS:Beq>
|
||||
|
||||
/**
|
||||
* The folder that holds the cached files. The consumer of this
|
||||
|
|
|
|||
|
|
@ -332,6 +332,18 @@ void LLExperienceCache::requestExperiences()
|
|||
std::string urlBase = mCapability("GetExperienceInfo");
|
||||
if (urlBase.empty())
|
||||
{
|
||||
// <FS:Beq> FIRE-33046 reduce logging of warning in OS grids with no experiences capability
|
||||
#ifdef OPENSIM
|
||||
if( LLGridManager::instance().isInOpenSim() )
|
||||
{
|
||||
// In Opensim this can occur if the grid does not have experiences capability. make it a debug
|
||||
LL_DEBUGS("ExperienceCache") << "No Experience capability." << LL_ENDL;
|
||||
}
|
||||
else
|
||||
// Danger: Dangling 'else'
|
||||
// In SL, this is a sign of a problem as everything should have experience capability so flag it as a warning still.
|
||||
#endif
|
||||
// </FS:Beq>
|
||||
LL_WARNS("ExperienceCache") << "No Experience capability." << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -72,7 +72,11 @@ typedef enum e_chat_style
|
|||
CHAT_STYLE_IRC,
|
||||
CHAT_STYLE_HISTORY,
|
||||
CHAT_STYLE_TELEPORT_SEP,
|
||||
CHAT_STYLE_MODERATOR
|
||||
// <FS:Zi> Add a distinct color for server side group chat replay
|
||||
// CHAT_STYLE_MODERATOR
|
||||
CHAT_STYLE_MODERATOR,
|
||||
CHAT_STYLE_SERVER_HISTORY
|
||||
// </FS:Zi>
|
||||
}EChatStyle;
|
||||
|
||||
// A piece of chat
|
||||
|
|
|
|||
|
|
@ -53,6 +53,8 @@
|
|||
#include "llvoavatarself.h" // for gAgentAvatarp
|
||||
#include "llavatarnamecache.h"
|
||||
|
||||
#include "fsassetblacklist.h"
|
||||
|
||||
constexpr S32 MAX_ANIMATIONS = 100;
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
|
|
@ -157,13 +159,13 @@ BOOL AnimationExplorer::postBuild()
|
|||
{
|
||||
mAnimationScrollList = getChild<LLScrollListCtrl>("animation_list");
|
||||
mStopButton = getChild<LLButton>("stop_btn");
|
||||
mRevokeButton = getChild<LLButton>("revoke_btn");
|
||||
mBlacklistButton = getChild<LLButton>("blacklist_btn");
|
||||
mStopAndRevokeButton = getChild<LLButton>("stop_and_revoke_btn");
|
||||
mNoOwnedAnimationsCheckBox = getChild<LLCheckBoxCtrl>("no_owned_animations_check");
|
||||
|
||||
mAnimationScrollList->setCommitCallback(boost::bind(&AnimationExplorer::onSelectAnimation, this));
|
||||
mStopButton->setCommitCallback(boost::bind(&AnimationExplorer::onStopPressed, this));
|
||||
mRevokeButton->setCommitCallback(boost::bind(&AnimationExplorer::onRevokePressed, this));
|
||||
mBlacklistButton->setCommitCallback(boost::bind(&AnimationExplorer::onBlacklistPressed, this));
|
||||
mStopAndRevokeButton->setCommitCallback(boost::bind(&AnimationExplorer::onStopAndRevokePressed, this));
|
||||
mNoOwnedAnimationsCheckBox->setCommitCallback(boost::bind(&AnimationExplorer::onOwnedCheckToggled, this));
|
||||
|
||||
|
|
@ -199,7 +201,7 @@ void AnimationExplorer::onSelectAnimation()
|
|||
S32 column = mAnimationScrollList->getColumn("animation_id")->mIndex;
|
||||
mCurrentAnimationID = item->getColumn(column)->getValue().asUUID();
|
||||
|
||||
column = mAnimationScrollList->getColumn("played_by")->mIndex;
|
||||
column = mAnimationScrollList->getColumn("object_id")->mIndex;
|
||||
mCurrentObject = item->getColumn(column)->getValue().asUUID();
|
||||
|
||||
startMotion(mCurrentAnimationID);
|
||||
|
|
@ -214,23 +216,35 @@ void AnimationExplorer::onStopPressed()
|
|||
}
|
||||
}
|
||||
|
||||
void AnimationExplorer::onRevokePressed()
|
||||
void AnimationExplorer::onBlacklistPressed()
|
||||
{
|
||||
if (mCurrentObject.notNull())
|
||||
onStopPressed();
|
||||
LLScrollListItem* item = mAnimationScrollList->getFirstSelected();
|
||||
if (!item)
|
||||
{
|
||||
LLViewerObject* vo = gObjectList.findObject(mCurrentObject);
|
||||
|
||||
if (vo)
|
||||
{
|
||||
gAgentAvatarp->revokePermissionsOnObject(vo);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
S32 column = mAnimationScrollList->getColumn("played_by")->mIndex;
|
||||
std::string region_name{};
|
||||
if (gAgent.getRegion())
|
||||
{
|
||||
region_name = gAgent.getRegion()->getName();
|
||||
}
|
||||
FSAssetBlacklist::getInstance()->addNewItemToBlacklist(mCurrentAnimationID, item->getColumn(column)->getValue(), region_name, LLAssetType::AT_ANIMATION);
|
||||
}
|
||||
|
||||
void AnimationExplorer::onStopAndRevokePressed()
|
||||
{
|
||||
onStopPressed();
|
||||
onRevokePressed();
|
||||
|
||||
if (mCurrentObject.notNull())
|
||||
{
|
||||
if (LLViewerObject* vo = gObjectList.findObject(mCurrentObject); vo)
|
||||
{
|
||||
gAgentAvatarp->revokePermissionsOnObject(vo);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void AnimationExplorer::onOwnedCheckToggled()
|
||||
|
|
@ -316,11 +330,10 @@ void AnimationExplorer::updateList(F64 current_timestamp)
|
|||
|
||||
// go through the list of playing animations to find out if this animation played by
|
||||
// this object is still running
|
||||
for (LLVOAvatar::AnimSourceIterator anim_iter = gAgentAvatarp->mAnimationSources.begin();
|
||||
anim_iter != gAgentAvatarp->mAnimationSources.end(); ++anim_iter)
|
||||
for (const auto& [anim_object_id, anim_anim_id] : gAgentAvatarp->mAnimationSources)
|
||||
{
|
||||
// object and animation found
|
||||
if (anim_iter->first == object_id && anim_iter->second == anim_id)
|
||||
if (anim_object_id == object_id && anim_anim_id == anim_id)
|
||||
{
|
||||
// set text to "Still playing" and break out of this loop
|
||||
played_text->setText(LLTrans::getString("animation_explorer_still_playing"));
|
||||
|
|
@ -343,8 +356,7 @@ void AnimationExplorer::updateList(F64 current_timestamp)
|
|||
}
|
||||
|
||||
std::string prio_text = LLTrans::getString("animation_explorer_unknown_priority");
|
||||
LLKeyframeMotion* motion = dynamic_cast<LLKeyframeMotion*>(gAgentAvatarp->findMotion(anim_id));
|
||||
if (motion)
|
||||
if (LLKeyframeMotion* motion = dynamic_cast<LLKeyframeMotion*>(gAgentAvatarp->findMotion(anim_id)); motion)
|
||||
{
|
||||
prio_text = llformat("%d", (S32)motion->getPriority());
|
||||
}
|
||||
|
|
@ -367,8 +379,7 @@ void AnimationExplorer::addAnimation(const LLUUID& id, const LLUUID& played_by,
|
|||
std::string playedByName = played_by.asString();
|
||||
|
||||
// find out if the object is still in reach
|
||||
LLViewerObject* vo = gObjectList.findObject(played_by);
|
||||
if (vo)
|
||||
if (LLViewerObject* vo = gObjectList.findObject(played_by); vo)
|
||||
{
|
||||
// if it was an avatar, get the name here
|
||||
if (vo->isAvatar())
|
||||
|
|
@ -450,8 +461,7 @@ void AnimationExplorer::addAnimation(const LLUUID& id, const LLUUID& played_by,
|
|||
|
||||
void AnimationExplorer::onAvatarNameCallback(const LLUUID& id, const LLAvatarName& av_name)
|
||||
{
|
||||
auto iter = mAvatarNameCacheConnections.find(id);
|
||||
if (iter != mAvatarNameCacheConnections.end())
|
||||
if (auto iter = mAvatarNameCacheConnections.find(id); iter != mAvatarNameCacheConnections.end())
|
||||
{
|
||||
if (iter->second.connected())
|
||||
{
|
||||
|
|
@ -478,10 +488,8 @@ void AnimationExplorer::requestNameCallback(LLMessageSystem* msg)
|
|||
LLUUID object_id;
|
||||
msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_ObjectID, object_id, index);
|
||||
|
||||
uuid_vec_t::iterator iter;
|
||||
iter = std::find(mRequestedIDs.begin(), mRequestedIDs.end(), object_id);
|
||||
// if this is one of the objects we were looking for, process the data
|
||||
if (iter != mRequestedIDs.end())
|
||||
if (auto iter = std::find(mRequestedIDs.begin(), mRequestedIDs.end(), object_id); iter != mRequestedIDs.end())
|
||||
{
|
||||
// get the name of the object
|
||||
std::string object_name;
|
||||
|
|
@ -502,11 +510,9 @@ void AnimationExplorer::updateListEntry(const LLUUID& id, const std::string& nam
|
|||
S32 played_by_column = mAnimationScrollList->getColumn("played_by")->mIndex;
|
||||
|
||||
// find all scroll list entries with this object UUID and update the names there
|
||||
std::vector<LLScrollListItem*> items = mAnimationScrollList->getAllData();
|
||||
for (std::vector<LLScrollListItem*>::iterator list_iter = items.begin(); list_iter != items.end(); ++list_iter)
|
||||
for (LLScrollListItem* item : mAnimationScrollList->getAllData())
|
||||
{
|
||||
LLScrollListItem* item = *list_iter;
|
||||
LLUUID list_object_id = item->getColumn(object_id_column)->getValue().asUUID();
|
||||
const LLUUID& list_object_id = item->getColumn(object_id_column)->getValue().asUUID();
|
||||
|
||||
if (id == list_object_id)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -100,7 +100,7 @@ class AnimationExplorer
|
|||
|
||||
LLScrollListCtrl* mAnimationScrollList;
|
||||
LLButton* mStopButton;
|
||||
LLButton* mRevokeButton;
|
||||
LLButton* mBlacklistButton;
|
||||
LLButton* mStopAndRevokeButton;
|
||||
LLCheckBoxCtrl* mNoOwnedAnimationsCheckBox;
|
||||
|
||||
|
|
@ -126,7 +126,7 @@ class AnimationExplorer
|
|||
|
||||
void onSelectAnimation();
|
||||
void onStopPressed();
|
||||
void onRevokePressed();
|
||||
void onBlacklistPressed();
|
||||
void onStopAndRevokePressed();
|
||||
void onOwnedCheckToggled();
|
||||
};
|
||||
|
|
|
|||
|
|
@ -2952,6 +2952,28 @@
|
|||
<key>Value</key>
|
||||
<integer>2048</integer>
|
||||
</map>
|
||||
<key>FSDiskCacheHighWaterPercent</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Trigger point above which we should start to clear out older cache entries</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<integer>95.0</integer>
|
||||
</map>
|
||||
<key>FSDiskCacheLowWaterPercent</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Level to drain cache to once it goes over the high water limit.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<integer>70.0</integer>
|
||||
</map>
|
||||
<key>CacheLocation</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
|
|||
|
|
@ -173,6 +173,7 @@ FSAreaSearch::FSAreaSearch(const LLSD& key) :
|
|||
mRequestNeedsSent(false),
|
||||
mRlvBehaviorCallbackConnection()
|
||||
{
|
||||
LLViewerRegion::sFSAreaSearchActive = true;
|
||||
mFactoryMap["area_search_list_panel"] = LLCallbackMap(createPanelList, this);
|
||||
mFactoryMap["area_search_find_panel"] = LLCallbackMap(createPanelFind, this);
|
||||
mFactoryMap["area_search_filter_panel"] = LLCallbackMap(createPanelFilter, this);
|
||||
|
|
@ -182,12 +183,13 @@ FSAreaSearch::FSAreaSearch(const LLSD& key) :
|
|||
// Register an idle update callback
|
||||
gIdleCallbacks.addFunction(idle, this);
|
||||
|
||||
mParcelChangedObserver = new FSParcelChangeObserver(this);
|
||||
LLViewerParcelMgr::getInstance()->addObserver(mParcelChangedObserver);
|
||||
mParcelChangedObserver = std::make_unique<FSParcelChangeObserver>(this);
|
||||
LLViewerParcelMgr::getInstance()->addObserver(mParcelChangedObserver.get());
|
||||
}
|
||||
|
||||
FSAreaSearch::~FSAreaSearch()
|
||||
{
|
||||
LLViewerRegion::sFSAreaSearchActive = false;
|
||||
if (!gIdleCallbacks.deleteFunction(idle, this))
|
||||
{
|
||||
LL_WARNS("FSAreaSearch") << "FSAreaSearch::~FSAreaSearch() failed to delete callback" << LL_ENDL;
|
||||
|
|
@ -209,9 +211,8 @@ FSAreaSearch::~FSAreaSearch()
|
|||
|
||||
if (mParcelChangedObserver)
|
||||
{
|
||||
LLViewerParcelMgr::getInstance()->removeObserver(mParcelChangedObserver);
|
||||
delete mParcelChangedObserver;
|
||||
mParcelChangedObserver = NULL;
|
||||
LLViewerParcelMgr::getInstance()->removeObserver(mParcelChangedObserver.get());
|
||||
mParcelChangedObserver = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -252,9 +253,7 @@ void FSAreaSearch::draw()
|
|||
|
||||
for (const auto item : items)
|
||||
{
|
||||
LLViewerObject* objectp = gObjectList.findObject(item->getUUID());
|
||||
|
||||
if (objectp)
|
||||
if (LLViewerObject* objectp = gObjectList.findObject(item->getUUID()); objectp)
|
||||
{
|
||||
const std::string& objectName = mObjectDetails[item->getUUID()].description;
|
||||
gObjectList.addDebugBeacon(objectp->getPositionAgent(), objectName, mBeaconColor, mBeaconTextColor, beacon_line_width);
|
||||
|
|
@ -299,7 +298,7 @@ void* FSAreaSearch::createPanelFilter(void* data)
|
|||
void* FSAreaSearch::createPanelAdvanced(void* data)
|
||||
{
|
||||
FSAreaSearch* self = (FSAreaSearch*)data;
|
||||
self->mPanelAdvanced = new FSPanelAreaSearchAdvanced(self);
|
||||
self->mPanelAdvanced = new FSPanelAreaSearchAdvanced();
|
||||
return self->mPanelAdvanced;
|
||||
}
|
||||
|
||||
|
|
@ -324,8 +323,7 @@ void FSAreaSearch::checkRegion()
|
|||
if (mActive)
|
||||
{
|
||||
// Check if we changed region, and if we did, clear the object details cache.
|
||||
LLViewerRegion* region = gAgent.getRegion(); // getRegion can return NULL if disconnected.
|
||||
if (region && (region != mLastRegion))
|
||||
if (LLViewerRegion* region = gAgent.getRegion(); region && (region != mLastRegion))
|
||||
{
|
||||
if (!mExcludeNeighborRegions)
|
||||
{
|
||||
|
|
@ -459,8 +457,7 @@ void FSAreaSearch::findObjects()
|
|||
if (object_it.second.request == FSObjectProperties::NEED || object_it.second.request == FSObjectProperties::SENT)
|
||||
{
|
||||
const LLUUID& id = object_it.second.id;
|
||||
LLViewerObject* objectp = gObjectList.findObject(id);
|
||||
if (!objectp)
|
||||
if (LLViewerObject* objectp = gObjectList.findObject(id); !objectp)
|
||||
{
|
||||
object_it.second.request = FSObjectProperties::FAILED;
|
||||
mRequested--;
|
||||
|
|
@ -1035,8 +1032,7 @@ void FSAreaSearch::matchObject(FSObjectProperties& details, LLViewerObject* obje
|
|||
row_params.columns.add(cell_params);
|
||||
|
||||
cell_params.column = "land_impact";
|
||||
F32 cost = objectp->getLinksetCost();
|
||||
if (cost > F_ALMOST_ZERO)
|
||||
if (F32 cost = objectp->getLinksetCost(); cost > F_ALMOST_ZERO)
|
||||
{
|
||||
cell_params.value = cost;
|
||||
}
|
||||
|
|
@ -1098,14 +1094,11 @@ void FSAreaSearch::updateObjectCosts(const LLUUID& object_id, F32 object_cost, F
|
|||
return;
|
||||
}
|
||||
|
||||
FSScrollListCtrl* result_list = mPanelList->getResultList();
|
||||
if (result_list)
|
||||
if (FSScrollListCtrl* result_list = mPanelList->getResultList(); result_list)
|
||||
{
|
||||
LLScrollListItem* list_row = result_list->getItem(LLSD(object_id));
|
||||
if (list_row)
|
||||
if (LLScrollListItem* list_row = result_list->getItem(LLSD(object_id)); list_row)
|
||||
{
|
||||
LLScrollListColumn* list_column = result_list->getColumn("land_impact");
|
||||
if (list_column)
|
||||
if (LLScrollListColumn* list_column = result_list->getColumn("land_impact"); list_column)
|
||||
{
|
||||
LLScrollListCell* linkset_cost_cell = list_row->getColumn(list_column->mIndex);
|
||||
linkset_cost_cell->setValue(LLSD(link_cost));
|
||||
|
|
@ -1160,8 +1153,7 @@ void FSAreaSearch::avatarNameCacheCallback(const LLUUID& id, const LLAvatarName&
|
|||
|
||||
void FSAreaSearch::callbackLoadFullName(const LLUUID& id, const std::string& full_name )
|
||||
{
|
||||
auto iter = mNameCacheConnections.find(id);
|
||||
if (iter != mNameCacheConnections.end())
|
||||
if (auto iter = mNameCacheConnections.find(id); iter != mNameCacheConnections.end())
|
||||
{
|
||||
if (iter->second.connected())
|
||||
{
|
||||
|
|
@ -1444,8 +1436,7 @@ void FSPanelAreaSearchList::onDoubleClick()
|
|||
}
|
||||
|
||||
const LLUUID& object_id = item->getUUID();
|
||||
LLViewerObject* objectp = gObjectList.findObject(object_id);
|
||||
if (objectp)
|
||||
if (LLViewerObject* objectp = gObjectList.findObject(object_id); objectp)
|
||||
{
|
||||
FSObjectProperties& details = mFSAreaSearch->mObjectDetails[object_id];
|
||||
LLTracker::trackLocation(objectp->getPositionGlobal(), details.name, "", LLTracker::LOCATION_ITEM);
|
||||
|
|
@ -2060,10 +2051,6 @@ BOOL FSPanelAreaSearchFind::postBuild()
|
|||
return LLPanel::postBuild();
|
||||
}
|
||||
|
||||
// virtual
|
||||
FSPanelAreaSearchFind::~FSPanelAreaSearchFind()
|
||||
{ }
|
||||
|
||||
void FSPanelAreaSearchFind::onButtonClickedClear()
|
||||
{
|
||||
mNameLineEditor->clear();
|
||||
|
|
@ -2180,10 +2167,6 @@ BOOL FSPanelAreaSearchFilter::postBuild()
|
|||
return LLPanel::postBuild();
|
||||
}
|
||||
|
||||
// virtual
|
||||
FSPanelAreaSearchFilter::~FSPanelAreaSearchFilter()
|
||||
{ }
|
||||
|
||||
void FSPanelAreaSearchFilter::onCommitCheckbox()
|
||||
{
|
||||
mFSAreaSearch->setFilterLocked(mCheckboxLocked->get());
|
||||
|
|
@ -2280,10 +2263,6 @@ FSPanelAreaSearchOptions::FSPanelAreaSearchOptions(FSAreaSearch* pointer)
|
|||
mEnableCallbackRegistrar.add("AreaSearch.EnableColumn", boost::bind(&FSPanelAreaSearchOptions::onEnableColumnVisibilityChecked, this, _2));
|
||||
}
|
||||
|
||||
// virtual
|
||||
FSPanelAreaSearchOptions::~FSPanelAreaSearchOptions()
|
||||
{ }
|
||||
|
||||
void FSPanelAreaSearchOptions::onCommitCheckboxDisplayColumn(const LLSD& userdata)
|
||||
{
|
||||
const std::string& column_name = userdata.asStringRef();
|
||||
|
|
@ -2306,11 +2285,6 @@ bool FSPanelAreaSearchOptions::onEnableColumnVisibilityChecked(const LLSD& userd
|
|||
// Advanced tab
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
FSPanelAreaSearchAdvanced::FSPanelAreaSearchAdvanced(FSAreaSearch* pointer)
|
||||
: LLPanel()
|
||||
{
|
||||
}
|
||||
|
||||
BOOL FSPanelAreaSearchAdvanced::postBuild()
|
||||
{
|
||||
mCheckboxClickTouch = getChild<LLCheckBoxCtrl>("double_click_touch");
|
||||
|
|
@ -2319,7 +2293,3 @@ BOOL FSPanelAreaSearchAdvanced::postBuild()
|
|||
|
||||
return LLPanel::postBuild();
|
||||
}
|
||||
|
||||
// virtual
|
||||
FSPanelAreaSearchAdvanced::~FSPanelAreaSearchAdvanced()
|
||||
{ }
|
||||
|
|
|
|||
|
|
@ -217,7 +217,7 @@ private:
|
|||
|
||||
class FSParcelChangeObserver;
|
||||
friend class FSParcelChangeObserver;
|
||||
FSParcelChangeObserver* mParcelChangedObserver;
|
||||
std::unique_ptr<FSParcelChangeObserver> mParcelChangedObserver;
|
||||
|
||||
LLTabContainer* mTab;
|
||||
FSPanelAreaSearchList* mPanelList;
|
||||
|
|
@ -332,7 +332,7 @@ class FSPanelAreaSearchFind
|
|||
LOG_CLASS(FSPanelAreaSearchFind);
|
||||
public:
|
||||
FSPanelAreaSearchFind(FSAreaSearch* pointer);
|
||||
virtual ~FSPanelAreaSearchFind();
|
||||
virtual ~FSPanelAreaSearchFind() = default;
|
||||
|
||||
/*virtual*/ BOOL postBuild();
|
||||
/*virtual*/ BOOL handleKeyHere(KEY key,MASK mask);
|
||||
|
|
@ -365,7 +365,7 @@ class FSPanelAreaSearchFilter
|
|||
LOG_CLASS(FSPanelAreaSearchFilter);
|
||||
public:
|
||||
FSPanelAreaSearchFilter(FSAreaSearch* pointer);
|
||||
virtual ~FSPanelAreaSearchFilter();
|
||||
virtual ~FSPanelAreaSearchFilter() = default;
|
||||
|
||||
/*virtual*/ BOOL postBuild();
|
||||
|
||||
|
|
@ -410,7 +410,7 @@ class FSPanelAreaSearchOptions
|
|||
LOG_CLASS(FSPanelAreaSearchOptions);
|
||||
public:
|
||||
FSPanelAreaSearchOptions(FSAreaSearch* pointer);
|
||||
virtual ~FSPanelAreaSearchOptions();
|
||||
virtual ~FSPanelAreaSearchOptions() = default;
|
||||
|
||||
private:
|
||||
void onCommitCheckboxDisplayColumn(const LLSD& userdata);
|
||||
|
|
@ -430,8 +430,8 @@ class FSPanelAreaSearchAdvanced
|
|||
{
|
||||
LOG_CLASS(FSPanelAreaSearchAdvanced);
|
||||
public:
|
||||
FSPanelAreaSearchAdvanced(FSAreaSearch* pointer);
|
||||
virtual ~FSPanelAreaSearchAdvanced();
|
||||
FSPanelAreaSearchAdvanced() = default;
|
||||
virtual ~FSPanelAreaSearchAdvanced() = default;
|
||||
|
||||
/*virtual*/ BOOL postBuild();
|
||||
|
||||
|
|
|
|||
|
|
@ -54,6 +54,9 @@ LLAssetType::EType S32toAssetType(S32 assetindex)
|
|||
case 6:
|
||||
type = LLAssetType::AT_OBJECT;
|
||||
break;
|
||||
case 20:
|
||||
type = LLAssetType::AT_ANIMATION;
|
||||
break;
|
||||
case 45:
|
||||
type = LLAssetType::AT_PERSON;
|
||||
break;
|
||||
|
|
@ -76,8 +79,7 @@ bool FSAssetBlacklist::isBlacklisted(const LLUUID& id, LLAssetType::EType type)
|
|||
return false;
|
||||
}
|
||||
|
||||
blacklist_type_map_t::iterator it;
|
||||
it = mBlacklistTypeContainer.find(type);
|
||||
blacklist_type_map_t::iterator it = mBlacklistTypeContainer.find(type);
|
||||
|
||||
if (it == mBlacklistTypeContainer.end())
|
||||
{
|
||||
|
|
@ -114,8 +116,7 @@ bool FSAssetBlacklist::removeItem(const LLUUID& id)
|
|||
{
|
||||
gObjectList.removeDerenderedItem(id);
|
||||
|
||||
blacklist_data_t::iterator it;
|
||||
it = mBlacklistData.find(id);
|
||||
blacklist_data_t::iterator it = mBlacklistData.find(id);
|
||||
|
||||
if (it == mBlacklistData.end())
|
||||
{
|
||||
|
|
@ -133,9 +134,7 @@ bool FSAssetBlacklist::removeItem(const LLUUID& id)
|
|||
|
||||
void FSAssetBlacklist::removeItemFromBlacklist(const LLUUID& id)
|
||||
{
|
||||
uuid_vec_t ids;
|
||||
ids.push_back(id);
|
||||
removeItemsFromBlacklist(ids);
|
||||
removeItemsFromBlacklist({ id });
|
||||
}
|
||||
|
||||
void FSAssetBlacklist::removeItemsFromBlacklist(const uuid_vec_t& ids)
|
||||
|
|
@ -145,13 +144,13 @@ void FSAssetBlacklist::removeItemsFromBlacklist(const uuid_vec_t& ids)
|
|||
bool need_save = false;
|
||||
LLSD data;
|
||||
|
||||
for (uuid_vec_t::const_iterator it = ids.begin(); it != ids.end(); ++it)
|
||||
for (const auto& id : ids)
|
||||
{
|
||||
if (removeItem(*it))
|
||||
if (removeItem(id))
|
||||
{
|
||||
need_save = true;
|
||||
}
|
||||
data.append((*it).asString());
|
||||
data.append(id.asString());
|
||||
}
|
||||
|
||||
if (need_save)
|
||||
|
|
@ -161,7 +160,7 @@ void FSAssetBlacklist::removeItemsFromBlacklist(const uuid_vec_t& ids)
|
|||
|
||||
if (!mBlacklistChangedCallback.empty())
|
||||
{
|
||||
mBlacklistChangedCallback(data, BLACKLIST_REMOVE);
|
||||
mBlacklistChangedCallback(data, eBlacklistOperation::BLACKLIST_REMOVE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -194,7 +193,7 @@ void FSAssetBlacklist::addNewItemToBlacklistData(const LLUUID& id, const LLSD& d
|
|||
|
||||
if (!mBlacklistChangedCallback.empty())
|
||||
{
|
||||
mBlacklistChangedCallback(LLSD().with(id.asString(), data), BLACKLIST_ADD);
|
||||
mBlacklistChangedCallback(LLSD().with(id.asString(), data), eBlacklistOperation::BLACKLIST_ADD);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -205,18 +204,13 @@ bool FSAssetBlacklist::addEntryToBlacklistMap(const LLUUID& id, LLAssetType::ETy
|
|||
return false;
|
||||
}
|
||||
|
||||
blacklist_type_map_t::iterator it;
|
||||
it = mBlacklistTypeContainer.find(type);
|
||||
|
||||
if (it != mBlacklistTypeContainer.end())
|
||||
if (auto it = mBlacklistTypeContainer.find(type); it != mBlacklistTypeContainer.end())
|
||||
{
|
||||
mBlacklistTypeContainer[type].insert(id);
|
||||
}
|
||||
else
|
||||
{
|
||||
blacklisted_uuid_container_t cont;
|
||||
cont.insert(id);
|
||||
mBlacklistTypeContainer[type] = cont;
|
||||
mBlacklistTypeContainer[type] = blacklisted_uuid_container_t{ id };
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
@ -233,7 +227,7 @@ void FSAssetBlacklist::loadBlacklist()
|
|||
{
|
||||
for (LLSD::map_const_iterator itr = data.beginMap(); itr != data.endMap(); ++itr)
|
||||
{
|
||||
LLUUID uid = LLUUID(itr->first);
|
||||
LLUUID uid{ itr->first };
|
||||
LLXORCipher cipher(MAGIC_ID.mData, UUID_BYTES);
|
||||
cipher.decrypt(uid.mData, UUID_BYTES);
|
||||
LLSD entry_data = itr->second;
|
||||
|
|
@ -273,7 +267,7 @@ void FSAssetBlacklist::loadBlacklist()
|
|||
LLSDSerialize::fromXMLDocument(datallsd, oldfile);
|
||||
for (LLSD::map_const_iterator itr = datallsd.beginMap(); itr != datallsd.endMap(); ++itr)
|
||||
{
|
||||
LLUUID uid = LLUUID(itr->first);
|
||||
LLUUID uid{ itr->first };
|
||||
LLSD data = itr->second;
|
||||
if (uid.isNull() || !data.has("entry_name") || !data.has("entry_type") || !data.has("entry_date"))
|
||||
{
|
||||
|
|
@ -310,14 +304,14 @@ void FSAssetBlacklist::saveBlacklist()
|
|||
llofstream save_file(mBlacklistFileName.c_str());
|
||||
LLSD savedata;
|
||||
|
||||
for (blacklist_data_t::const_iterator itr = mBlacklistData.begin(); itr != mBlacklistData.end(); ++itr)
|
||||
for (const auto& [id, data] : mBlacklistData)
|
||||
{
|
||||
if (itr->second["asset_permanent"].asBoolean())
|
||||
if (data["asset_permanent"].asBoolean())
|
||||
{
|
||||
LLUUID shadow_id(itr->first);
|
||||
LLUUID shadow_id{ id };
|
||||
LLXORCipher cipher(MAGIC_ID.mData, UUID_BYTES);
|
||||
cipher.encrypt(shadow_id.mData, UUID_BYTES);
|
||||
savedata[shadow_id.asString()] = itr->second;
|
||||
savedata[shadow_id.asString()] = data;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -29,15 +29,15 @@
|
|||
#ifndef FS_ASSETBLACKLIST_H
|
||||
#define FS_ASSETBLACKLIST_H
|
||||
|
||||
#include <boost/unordered_map.hpp>
|
||||
#include <boost/unordered_set.hpp>
|
||||
#include <unordered_map>
|
||||
#include <unordered_set>
|
||||
|
||||
#include "llsingleton.h"
|
||||
#include "llassettype.h"
|
||||
|
||||
typedef boost::unordered_set<LLUUID, FSUUIDHash> blacklisted_uuid_container_t;
|
||||
typedef std::map<LLAssetType::EType, blacklisted_uuid_container_t> blacklist_type_map_t;
|
||||
typedef boost::unordered_map<LLUUID, LLSD, FSUUIDHash> blacklist_data_t;
|
||||
using blacklisted_uuid_container_t = std::unordered_set<LLUUID, FSUUIDHash>;
|
||||
using blacklist_type_map_t = std::map<LLAssetType::EType, blacklisted_uuid_container_t>;
|
||||
using blacklist_data_t = std::unordered_map<LLUUID, LLSD, FSUUIDHash>;
|
||||
|
||||
class FSAssetBlacklist : public LLSingleton<FSAssetBlacklist>
|
||||
{
|
||||
|
|
@ -54,7 +54,7 @@ public:
|
|||
|
||||
blacklist_data_t getBlacklistData() const { return mBlacklistData; };
|
||||
|
||||
enum eBlacklistOperation
|
||||
enum class eBlacklistOperation
|
||||
{
|
||||
BLACKLIST_ADD,
|
||||
BLACKLIST_REMOVE
|
||||
|
|
|
|||
|
|
@ -803,6 +803,7 @@ public:
|
|||
}
|
||||
else if ((mSourceType == CHAT_SOURCE_AGENT || (mSourceType == CHAT_SOURCE_SYSTEM && mType == CHAT_TYPE_RADAR))
|
||||
&& !mAvatarID.isNull()
|
||||
&& chat.mChatStyle != CHAT_STYLE_SERVER_HISTORY
|
||||
&& chat.mChatStyle != CHAT_STYLE_HISTORY)
|
||||
{
|
||||
// ...from a normal user, lookup the name and fill in later.
|
||||
|
|
@ -831,6 +832,7 @@ public:
|
|||
// [/RLVa:KB]
|
||||
}
|
||||
else if (chat.mChatStyle == CHAT_STYLE_HISTORY ||
|
||||
chat.mChatStyle == CHAT_STYLE_SERVER_HISTORY ||
|
||||
(mSourceType == CHAT_SOURCE_AGENT || (mSourceType == CHAT_SOURCE_SYSTEM && mType == CHAT_TYPE_RADAR)))
|
||||
{
|
||||
//if it's an avatar name with a username add formatting
|
||||
|
|
@ -1508,12 +1510,19 @@ void FSChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
|
|||
delimiter_style = "BOLD";
|
||||
}
|
||||
|
||||
bool message_from_log = chat.mChatStyle == CHAT_STYLE_HISTORY;
|
||||
bool message_from_log = (chat.mChatStyle == CHAT_STYLE_HISTORY || chat.mChatStyle == CHAT_STYLE_SERVER_HISTORY);
|
||||
bool teleport_separator = chat.mSourceType == CHAT_SOURCE_TELEPORT;
|
||||
// We graying out chat history by graying out messages that contains full date in a time string
|
||||
if (message_from_log && !is_conversation_log)
|
||||
{
|
||||
txt_color = LLUIColorTable::instance().getColor("ChatHistoryMessageFromLog");
|
||||
if (chat.mChatStyle == CHAT_STYLE_HISTORY)
|
||||
{
|
||||
txt_color = LLUIColorTable::instance().getColor("ChatHistoryMessageFromLog");
|
||||
}
|
||||
else if (chat.mChatStyle == CHAT_STYLE_SERVER_HISTORY)
|
||||
{
|
||||
txt_color = LLUIColorTable::instance().getColor("ChatHistoryMessageFromServerLog");
|
||||
}
|
||||
body_message_params.color(txt_color);
|
||||
body_message_params.readonly_color(txt_color);
|
||||
name_params.color(txt_color);
|
||||
|
|
|
|||
|
|
@ -1025,7 +1025,7 @@ LLSD FSData::getSystemInfo()
|
|||
sysinfo1 += llformat("%s\n\n", info["SERVER_VERSION"].asString().c_str());
|
||||
|
||||
sysinfo1 += llformat("CPU: %s\n", info["CPU"].asString().c_str());
|
||||
sysinfo1 += llformat("Memory: %d MB\n", info["MEMORY_MB"].asInteger());
|
||||
sysinfo1 += llformat("Memory: %d MB (Used: %d MB)\n", info["MEMORY_MB"].asInteger(), info["USED_RAM"].asInteger());
|
||||
sysinfo1 += llformat("OS: %s\n", info["OS_VERSION"].asString().c_str());
|
||||
sysinfo1 += llformat("Graphics Card Vendor: %s\n", info["GRAPHICS_CARD_VENDOR"].asString().c_str());
|
||||
sysinfo1 += llformat("Graphics Card: %s\n", info["GRAPHICS_CARD"].asString().c_str());
|
||||
|
|
|
|||
|
|
@ -100,6 +100,8 @@ std::string FSFloaterAssetBlacklist::getTypeString(S32 type)
|
|||
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");
|
||||
default:
|
||||
|
|
@ -112,11 +114,9 @@ void FSFloaterAssetBlacklist::buildBlacklist()
|
|||
bool needs_sort = mResultList->isSorted();
|
||||
mResultList->setNeedsSort(false);
|
||||
|
||||
blacklist_data_t data = FSAssetBlacklist::instance().getBlacklistData();
|
||||
|
||||
for (blacklist_data_t::const_iterator iterator = data.begin(); iterator != data.end(); ++iterator)
|
||||
for (const auto& [id, data] : FSAssetBlacklist::instance().getBlacklistData())
|
||||
{
|
||||
addElementToList(iterator->first, iterator->second);
|
||||
addElementToList(id, data);
|
||||
}
|
||||
|
||||
mResultList->setNeedsSort(needs_sort);
|
||||
|
|
@ -166,11 +166,10 @@ void FSFloaterAssetBlacklist::addElementToList(const LLUUID& id, const LLSD& dat
|
|||
void FSFloaterAssetBlacklist::removeElements()
|
||||
{
|
||||
uuid_vec_t items;
|
||||
std::vector<LLScrollListItem*> list = mResultList->getAllSelected();
|
||||
|
||||
for (std::vector<LLScrollListItem*>::const_iterator it = list.begin(); it != list.end(); ++it)
|
||||
for (auto listitem : mResultList->getAllSelected())
|
||||
{
|
||||
items.push_back((*it)->getUUID());
|
||||
items.emplace_back(listitem->getUUID());
|
||||
}
|
||||
|
||||
FSAssetBlacklist::instance().removeItemsFromBlacklist(items);
|
||||
|
|
@ -178,7 +177,7 @@ void FSFloaterAssetBlacklist::removeElements()
|
|||
|
||||
void FSFloaterAssetBlacklist::onBlacklistChanged(const LLSD& data, FSAssetBlacklist::eBlacklistOperation op)
|
||||
{
|
||||
if (op == FSAssetBlacklist::BLACKLIST_ADD)
|
||||
if (op == FSAssetBlacklist::eBlacklistOperation::BLACKLIST_ADD)
|
||||
{
|
||||
bool need_sort = mResultList->isSorted();
|
||||
mResultList->setNeedsSort(false);
|
||||
|
|
@ -216,8 +215,7 @@ void FSFloaterAssetBlacklist::onRemoveAllTemporaryBtn()
|
|||
void FSFloaterAssetBlacklist::onSelectionChanged()
|
||||
{
|
||||
bool enabled = false;
|
||||
size_t num_selected = mResultList->getAllSelected().size();
|
||||
if (num_selected == 1)
|
||||
if (size_t num_selected = mResultList->getAllSelected().size(); num_selected == 1)
|
||||
{
|
||||
const LLScrollListItem* item = mResultList->getFirstSelected();
|
||||
S32 name_column = mResultList->getColumn("asset_type")->mIndex;
|
||||
|
|
@ -257,8 +255,7 @@ void FSFloaterAssetBlacklist::onStopBtn()
|
|||
return;
|
||||
}
|
||||
|
||||
LLAudioSource* audio_source = gAudiop->findAudioSource(mAudioSourceID);
|
||||
if (audio_source && !audio_source->isDone())
|
||||
if (LLAudioSource* audio_source = gAudiop->findAudioSource(mAudioSourceID); audio_source && !audio_source->isDone())
|
||||
{
|
||||
audio_source->play(LLUUID::null);
|
||||
}
|
||||
|
|
@ -307,8 +304,7 @@ BOOL FSFloaterAssetBlacklist::tick()
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
LLAudioSource* audio_source = gAudiop->findAudioSource(mAudioSourceID);
|
||||
if (!audio_source || audio_source->isDone())
|
||||
if (LLAudioSource* audio_source = gAudiop->findAudioSource(mAudioSourceID); !audio_source || audio_source->isDone())
|
||||
{
|
||||
childSetVisible("play_btn", true);
|
||||
childSetVisible("stop_btn", false);
|
||||
|
|
@ -348,8 +344,7 @@ namespace FSFloaterAssetBlacklistMenu
|
|||
|
||||
if (command == "remove")
|
||||
{
|
||||
FSFloaterAssetBlacklist* floater = LLFloaterReg::findTypedInstance<FSFloaterAssetBlacklist>("fs_asset_blacklist");
|
||||
if (floater)
|
||||
if (FSFloaterAssetBlacklist* floater = LLFloaterReg::findTypedInstance<FSFloaterAssetBlacklist>("fs_asset_blacklist"); floater)
|
||||
{
|
||||
floater->removeElements();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -81,9 +81,9 @@
|
|||
|
||||
#include <boost/regex.hpp> // <FS:Zi> FIRE-24133 - Redirect chat channel messages
|
||||
|
||||
const F32 ME_TYPING_TIMEOUT = 4.0f;
|
||||
const F32 OTHER_TYPING_TIMEOUT = 9.0f;
|
||||
const F32 NAME_REFRESH_TIMEOUT = 300.0f;
|
||||
constexpr F32 ME_TYPING_TIMEOUT = 4.0f;
|
||||
constexpr F32 OTHER_TYPING_TIMEOUT = 9.0f;
|
||||
constexpr F32 NAME_REFRESH_TIMEOUT = 300.0f;
|
||||
|
||||
floater_showed_signal_t FSFloaterIM::sIMFloaterShowedSignal;
|
||||
|
||||
|
|
@ -192,7 +192,7 @@ BOOL FSFloaterIM::focusFirstItem(BOOL prefer_text_fields, BOOL focus_flash)
|
|||
{
|
||||
mInputEditor->setFocus(TRUE);
|
||||
onTabInto();
|
||||
if(focus_flash)
|
||||
if (focus_flash)
|
||||
{
|
||||
gFocusMgr.triggerFocusFlash();
|
||||
}
|
||||
|
|
@ -202,7 +202,7 @@ BOOL FSFloaterIM::focusFirstItem(BOOL prefer_text_fields, BOOL focus_flash)
|
|||
void FSFloaterIM::onFocusLost()
|
||||
{
|
||||
LLIMModel::getInstance()->resetActiveSessionID();
|
||||
|
||||
|
||||
LLChicletBar::getInstance()->getChicletPanel()->setChicletToggleState(mSessionID, false);
|
||||
}
|
||||
|
||||
|
|
@ -230,8 +230,8 @@ void FSFloaterIM::onClose(bool app_quitting)
|
|||
//
|
||||
// Last change:
|
||||
// EXT-3516 X Button should end IM session, _ button should hide
|
||||
|
||||
|
||||
|
||||
|
||||
// AO: Make sure observers are removed on close
|
||||
mVoiceChannelStateChangeConnection.disconnect();
|
||||
if(LLVoiceClient::instanceExists())
|
||||
|
|
@ -250,7 +250,7 @@ void FSFloaterIM::onSnooze()
|
|||
{
|
||||
LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(mSessionID);
|
||||
|
||||
if (session == NULL)
|
||||
if (!session)
|
||||
{
|
||||
LL_WARNS("FSFloaterIM") << "Empty session." << LL_ENDL;
|
||||
return;
|
||||
|
|
@ -261,7 +261,7 @@ void FSFloaterIM::onSnooze()
|
|||
|
||||
LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(mSessionID);
|
||||
|
||||
if (is_call_with_chat && voice_channel != NULL && voice_channel->isActive())
|
||||
if (is_call_with_chat && voice_channel && voice_channel->isActive())
|
||||
{
|
||||
LLSD payload;
|
||||
payload["session_id"] = mSessionID;
|
||||
|
|
@ -289,8 +289,7 @@ void FSFloaterIM::confirmSnooze()
|
|||
|
||||
void FSFloaterIM::snoozeDurationCallback(const LLSD& notification, const LLSD& response)
|
||||
{
|
||||
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
|
||||
if (0 == option)
|
||||
if (S32 option = LLNotificationsUtil::getSelectedOption(notification, response); 0 == option)
|
||||
{
|
||||
std::istringstream duration_str(response["duration"].asString());
|
||||
S32 duration(-1);
|
||||
|
|
@ -329,7 +328,8 @@ void FSFloaterIM::newIMCallback(const LLSD& data){
|
|||
LLUUID session_id = data["session_id"].asUUID();
|
||||
|
||||
FSFloaterIM* floater = LLFloaterReg::findTypedInstance<FSFloaterIM>("fs_impanel", session_id);
|
||||
if (floater == NULL) return;
|
||||
if (!floater)
|
||||
return;
|
||||
|
||||
// update if visible or max pending messages exceeded, otherwise will be updated when opened
|
||||
static LLCachedControl<S32> fsMaxPendingIMMessages(gSavedSettings, "FSMaxPendingIMMessages");
|
||||
|
|
@ -374,9 +374,9 @@ void FSFloaterIM::sendMsgFromInputEditor(EChatType type)
|
|||
LLWString text = mInputEditor->getWText();
|
||||
LLWStringUtil::trim(text);
|
||||
LLWStringUtil::replaceChar(text,182,'\n'); // Convert paragraph symbols back into newlines.
|
||||
if(!text.empty())
|
||||
if (!text.empty())
|
||||
{
|
||||
if(type == CHAT_TYPE_OOC)
|
||||
if (type == CHAT_TYPE_OOC)
|
||||
{
|
||||
std::string tempText = wstring_to_utf8str( text );
|
||||
tempText = gSavedSettings.getString("FSOOCPrefix") + " " + tempText + " " + gSavedSettings.getString("FSOOCPostfix");
|
||||
|
|
@ -421,20 +421,20 @@ void FSFloaterIM::sendMsgFromInputEditor(EChatType type)
|
|||
skin_indicator = skin_indicator.substr(0, 1); // "FS 4.4.1f os", "FS 4.4.1v", "FS 4.4.1a", "FS 4.4.1s os", "FS 4.4.1m os" etc.
|
||||
}
|
||||
// </FS:PP>
|
||||
|
||||
|
||||
//Address size check
|
||||
#if ADDRESS_SIZE == 32
|
||||
std::string str_address_size_tag = "32";
|
||||
#else
|
||||
std::string str_address_size_tag = "";
|
||||
#endif
|
||||
|
||||
|
||||
//OpenSim check
|
||||
std::string str_opensim_tag;
|
||||
#ifdef OPENSIM
|
||||
str_opensim_tag = " os";
|
||||
#endif
|
||||
|
||||
|
||||
//Operating System check
|
||||
#if LL_WINDOWS
|
||||
std::string str_operating_system_tag = "W";
|
||||
|
|
@ -443,31 +443,29 @@ void FSFloaterIM::sendMsgFromInputEditor(EChatType type)
|
|||
#elif LL_DARWIN
|
||||
std::string str_operating_system_tag = "M";
|
||||
#endif
|
||||
|
||||
|
||||
//RLV check
|
||||
std::string str_rlv_enabled = "";
|
||||
if(RlvHandler::isEnabled())
|
||||
if (RlvHandler::isEnabled())
|
||||
str_rlv_enabled = "*";
|
||||
|
||||
|
||||
|
||||
// Text mode check
|
||||
std::string str_viewer_mode = "";
|
||||
|
||||
|
||||
// Unfortunately, we have to cheat a little here. Ideally we'd have
|
||||
// a method defined to check if the viewer is running in Text Mode.
|
||||
// For now, we will use the same method as used in llappviewer.cpp(LLAppViewer::getViewerInfo())
|
||||
static LLCachedControl<std::string> FSViewerMode(gSavedSettings, "SessionSettingsFile");
|
||||
std::string viewer_mode(FSViewerMode);
|
||||
LLStringUtil::toLower(viewer_mode);
|
||||
if(viewer_mode == "settings_text.xml")
|
||||
if (viewer_mode == "settings_text.xml")
|
||||
str_viewer_mode = "T";
|
||||
|
||||
|
||||
|
||||
//Build it up
|
||||
size_t insert_pos = is_irc_me_prefix(utf8_text) ? 4 : 0;
|
||||
|
||||
|
||||
//For testing/beta groups, we display the build version since it doesn't speed by and this might change often
|
||||
if(FSData::getInstance()->isTestingGroup(mSessionID))
|
||||
if (FSData::getInstance()->isTestingGroup(mSessionID))
|
||||
{
|
||||
if(chat_prefix_testing)
|
||||
utf8_text.insert(insert_pos, ("(" + str_address_size_tag + str_operating_system_tag + " " + LLVersionInfo::getInstance()->getBuildVersion() + skin_indicator + str_viewer_mode + str_rlv_enabled + str_opensim_tag + ") "));
|
||||
|
|
@ -479,7 +477,7 @@ void FSFloaterIM::sendMsgFromInputEditor(EChatType type)
|
|||
utf8_text.insert(insert_pos, ("(" + str_address_size_tag + str_operating_system_tag + " " + LLVersionInfo::getInstance()->getShortVersion() + skin_indicator + str_viewer_mode + str_rlv_enabled + str_opensim_tag + ") "));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// <FS:Techwolf Lupindo> Allow user to send system info.
|
||||
if (mDialog == IM_NOTHING_SPECIAL && utf8_text.find("/sysinfo") == 0)
|
||||
{
|
||||
|
|
@ -487,9 +485,9 @@ void FSFloaterIM::sendMsgFromInputEditor(EChatType type)
|
|||
utf8_text = system_info["Part1"].asString() + system_info["Part2"].asString();
|
||||
}
|
||||
// </FS:Techwolf Lupindo>
|
||||
|
||||
|
||||
sendMsg(utf8_text);
|
||||
|
||||
|
||||
mInputEditor->setText(LLStringUtil::null);
|
||||
}
|
||||
}
|
||||
|
|
@ -515,12 +513,12 @@ void FSFloaterIM::sendMsg(const std::string& msg)
|
|||
//std::string utf8_text = utf8str_truncate(msg, MAX_MSG_BUF_SIZE - 1);
|
||||
std::string utf8_text = msg;
|
||||
// </FS:CR>
|
||||
|
||||
|
||||
if ( (RlvActions::hasBehaviour(RLV_BHVR_SENDIM)) || (RlvActions::hasBehaviour(RLV_BHVR_SENDIMTO)) )
|
||||
{
|
||||
const LLIMModel::LLIMSession* pIMSession = LLIMModel::instance().findIMSession(mSessionID);
|
||||
RLV_ASSERT(pIMSession);
|
||||
|
||||
|
||||
bool fRlvFilter = !pIMSession;
|
||||
if (pIMSession)
|
||||
{
|
||||
|
|
@ -539,13 +537,11 @@ void FSFloaterIM::sendMsg(const std::string& msg)
|
|||
fRlvFilter = true;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
LLSpeakerMgr::speaker_list_t speakers;
|
||||
pIMSession->mSpeakers->getSpeakerList(&speakers, TRUE);
|
||||
for (LLSpeakerMgr::speaker_list_t::const_iterator itSpeaker = speakers.begin();
|
||||
itSpeaker != speakers.end(); ++itSpeaker)
|
||||
for (const auto& pSpeaker : speakers)
|
||||
{
|
||||
const LLSpeaker* pSpeaker = *itSpeaker;
|
||||
if ( (gAgent.getID() != pSpeaker->mID) && (!RlvActions::canSendIM(pSpeaker->mID)) )
|
||||
{
|
||||
fRlvFilter = true;
|
||||
|
|
@ -559,14 +555,14 @@ void FSFloaterIM::sendMsg(const std::string& msg)
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (fRlvFilter)
|
||||
{
|
||||
utf8_text = RlvStrings::getString(RlvStringKeys::Blocked::SendIm);
|
||||
}
|
||||
}
|
||||
// [/RLVa:KB]
|
||||
|
||||
|
||||
if (mSessionInitialized)
|
||||
{
|
||||
LLIMModel::sendMessage(utf8_text, mSessionID, mOtherParticipantUUID, mDialog);
|
||||
|
|
@ -576,7 +572,7 @@ void FSFloaterIM::sendMsg(const std::string& msg)
|
|||
//queue up the message to send once the session is initialized
|
||||
mQueuedMsgsForInit.append(utf8_text);
|
||||
}
|
||||
|
||||
|
||||
updateMessages();
|
||||
}
|
||||
|
||||
|
|
@ -588,17 +584,17 @@ FSFloaterIM::~FSFloaterIM()
|
|||
|
||||
LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::IM, (LLView*)this);
|
||||
mVoiceChannelStateChangeConnection.disconnect();
|
||||
if(LLVoiceClient::instanceExists())
|
||||
if (LLVoiceClient::instanceExists())
|
||||
{
|
||||
LLVoiceClient::getInstance()->removeObserver((LLVoiceClientStatusObserver*)this);
|
||||
}
|
||||
|
||||
|
||||
LLIMModel::LLIMSession* pIMSession = LLIMModel::instance().findIMSession(mSessionID);
|
||||
if ((pIMSession) && (pIMSession->mSessionType == LLIMModel::LLIMSession::P2P_SESSION))
|
||||
{
|
||||
LLAvatarTracker::instance().removeParticularFriendObserver(mOtherParticipantUUID, this);
|
||||
}
|
||||
|
||||
|
||||
// Clean up any stray name cache connections
|
||||
if (mAvatarNameCacheConnection.connected())
|
||||
{
|
||||
|
|
@ -755,7 +751,7 @@ void FSFloaterIM::onChange(EStatusType status, const std::string &channelURI, bo
|
|||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
updateCallButton();
|
||||
}
|
||||
|
||||
|
|
@ -764,13 +760,13 @@ void FSFloaterIM::updateCallButton()
|
|||
// hide/show call button
|
||||
bool voice_enabled = LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking();
|
||||
LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(mSessionID);
|
||||
|
||||
|
||||
if (!session)
|
||||
{
|
||||
getChild<LLButton>("call_btn")->setEnabled(FALSE);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
bool session_initialized = session->mSessionInitialized;
|
||||
bool callback_enabled = session->mCallBackEnabled;
|
||||
|
||||
|
|
@ -793,7 +789,7 @@ void FSFloaterIM::updateButtons(bool is_call_started)
|
|||
void FSFloaterIM::changed(U32 mask)
|
||||
{
|
||||
LL_DEBUGS("FSFloaterIM") << "FSFloaterIM::changed(U32 mask)" << LL_ENDL;
|
||||
|
||||
|
||||
if(LLAvatarActions::isFriend(mOtherParticipantUUID))
|
||||
{
|
||||
bool is_online = LLAvatarTracker::instance().isBuddyOnline(mOtherParticipantUUID);
|
||||
|
|
@ -841,7 +837,7 @@ BOOL FSFloaterIM::postBuild()
|
|||
// support sysinfo button -Zi
|
||||
mSysinfoButton = getChild<LLButton>("send_sysinfo_btn");
|
||||
onSysinfoButtonVisibilityChanged(FALSE);
|
||||
|
||||
|
||||
// type-specfic controls
|
||||
LLIMModel::LLIMSession* pIMSession = LLIMModel::instance().findIMSession(mSessionID);
|
||||
if (pIMSession)
|
||||
|
|
@ -859,11 +855,11 @@ BOOL FSFloaterIM::postBuild()
|
|||
LL_DEBUGS("FSFloaterIM") << "adding FSFloaterIM removing/adding particularfriendobserver" << LL_ENDL;
|
||||
LLAvatarTracker::instance().removeParticularFriendObserver(mOtherParticipantUUID, this);
|
||||
LLAvatarTracker::instance().addParticularFriendObserver(mOtherParticipantUUID, this);
|
||||
|
||||
|
||||
// Disable "Add friend" button for friends.
|
||||
LL_DEBUGS("FSFloaterIM") << "add_friend_btn check start" << LL_ENDL;
|
||||
getChild<LLButton>("add_friend_btn")->setEnabled(!LLAvatarActions::isFriend(mOtherParticipantUUID));
|
||||
|
||||
|
||||
// Disable "Teleport" button if friend is offline
|
||||
if(LLAvatarActions::isFriend(mOtherParticipantUUID))
|
||||
{
|
||||
|
|
@ -931,7 +927,7 @@ BOOL FSFloaterIM::postBuild()
|
|||
LLVoiceClient::getInstance()->addObserver((LLVoiceClientStatusObserver*)this);
|
||||
|
||||
// </AO>
|
||||
|
||||
|
||||
mInputEditor = getChild<LLChatEntry>("chat_editor");
|
||||
mChatHistory = getChild<FSChatHistory>("chat_history");
|
||||
mChatLayoutPanel = getChild<LLLayoutPanel>("chat_layout_panel");
|
||||
|
|
@ -977,7 +973,7 @@ BOOL FSFloaterIM::postBuild()
|
|||
{
|
||||
// if not, give the user a choice, whether to enable the version prefix or not
|
||||
LLSD args;
|
||||
LLNotificationsUtil::add("FirstJoinSupportGroup2", args, LLSD(),boost::bind(&FSFloaterIM::enableViewerVersionCallback, this, _1, _2));
|
||||
LLNotificationsUtil::add("FirstJoinSupportGroup2", args, LLSD(), boost::bind(&FSFloaterIM::enableViewerVersionCallback, this, _1, _2));
|
||||
}
|
||||
}
|
||||
// </FS:Zi> Viewer version popup
|
||||
|
|
@ -1009,7 +1005,7 @@ BOOL FSFloaterIM::postBuild()
|
|||
std::string session_name(LLIMModel::instance().getName(mSessionID));
|
||||
updateSessionName(session_name, session_name);
|
||||
}
|
||||
|
||||
|
||||
//*TODO if session is not initialized yet, add some sort of a warning message like "starting session...blablabla"
|
||||
//see LLFloaterIMPanel for how it is done (IB)
|
||||
|
||||
|
|
@ -1177,7 +1173,8 @@ FSFloaterIM* FSFloaterIM::show(const LLUUID& session_id)
|
|||
{
|
||||
closeHiddenIMToasts();
|
||||
|
||||
if (!gIMMgr->hasSession(session_id)) return NULL;
|
||||
if (!gIMMgr->hasSession(session_id))
|
||||
return nullptr;
|
||||
|
||||
if (!isChatMultiTab())
|
||||
{
|
||||
|
|
@ -1199,7 +1196,7 @@ FSFloaterIM* FSFloaterIM::show(const LLUUID& session_id)
|
|||
FSFloaterIM* floater = getInstance(session_id);
|
||||
if (!floater)
|
||||
{
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if (isChatMultiTab())
|
||||
|
|
@ -1274,7 +1271,7 @@ void FSFloaterIM::setDocked(bool docked, bool pop_on_undock)
|
|||
LLNotificationsUI::LLScreenChannel* channel = static_cast<LLNotificationsUI::LLScreenChannel*>
|
||||
(LLNotificationsUI::LLChannelManager::getInstance()->
|
||||
findChannelByID(LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
|
||||
|
||||
|
||||
if(!isChatMultiTab())
|
||||
{
|
||||
LLTransientDockableFloater::setDocked(docked, pop_on_undock);
|
||||
|
|
@ -1296,7 +1293,7 @@ void FSFloaterIM::setVisible(BOOL visible)
|
|||
LLTransientDockableFloater::setVisible(visible);
|
||||
|
||||
// update notification channel state
|
||||
if(channel)
|
||||
if (channel)
|
||||
{
|
||||
channel->updateShowToastsState();
|
||||
channel->redrawToasts();
|
||||
|
|
@ -1321,10 +1318,9 @@ void FSFloaterIM::setVisible(BOOL visible)
|
|||
}
|
||||
}
|
||||
|
||||
if(!visible)
|
||||
if (!visible)
|
||||
{
|
||||
LLIMChiclet* chiclet = LLChicletBar::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(mSessionID);
|
||||
if(chiclet)
|
||||
if (LLIMChiclet* chiclet = LLChicletBar::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(mSessionID); chiclet)
|
||||
{
|
||||
chiclet->setToggleState(false);
|
||||
}
|
||||
|
|
@ -1350,7 +1346,7 @@ void FSFloaterIM::setMinimized(BOOL b)
|
|||
|
||||
BOOL FSFloaterIM::getVisible()
|
||||
{
|
||||
if(isChatMultiTab())
|
||||
if (isChatMultiTab())
|
||||
{
|
||||
FSFloaterIMContainer* im_container = FSFloaterIMContainer::getInstance();
|
||||
|
||||
|
|
@ -1375,7 +1371,7 @@ BOOL FSFloaterIM::getVisible()
|
|||
//static
|
||||
bool FSFloaterIM::toggle(const LLUUID& session_id)
|
||||
{
|
||||
if(!isChatMultiTab())
|
||||
if (!isChatMultiTab())
|
||||
{
|
||||
FSFloaterIM* floater = LLFloaterReg::findTypedInstance<FSFloaterIM>("fs_impanel", session_id);
|
||||
if (floater && floater->getVisible() && floater->hasFocus())
|
||||
|
|
@ -1385,7 +1381,7 @@ bool FSFloaterIM::toggle(const LLUUID& session_id)
|
|||
floater->setVisible(false);
|
||||
return false;
|
||||
}
|
||||
else if(floater && (!floater->isDocked() || (floater->getVisible() && !floater->hasFocus())))
|
||||
else if (floater && (!floater->isDocked() || (floater->getVisible() && !floater->hasFocus())))
|
||||
{
|
||||
floater->setVisible(TRUE);
|
||||
floater->setFocus(TRUE);
|
||||
|
|
@ -1422,8 +1418,7 @@ void FSFloaterIM::sessionInitReplyReceived(const LLUUID& im_session_id)
|
|||
}
|
||||
|
||||
// updating "Call" button from group/ad-hoc control panel here to enable it without placing into draw() (EXT-4796)
|
||||
LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(im_session_id);
|
||||
if (session)
|
||||
if (LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(im_session_id); session)
|
||||
{
|
||||
if ((session->isGroupSessionType() && gAgent.isInGroup(im_session_id)) || session->isAdHocSessionType())
|
||||
{
|
||||
|
|
@ -1433,7 +1428,6 @@ void FSFloaterIM::sessionInitReplyReceived(const LLUUID& im_session_id)
|
|||
|
||||
//*TODO here we should remove "starting session..." warning message if we added it in postBuild() (IB)
|
||||
|
||||
|
||||
//need to send delayed messaged collected while waiting for session initialization
|
||||
if (mQueuedMsgsForInit.size())
|
||||
{
|
||||
|
|
@ -1454,7 +1448,6 @@ void FSFloaterIM::updateMessages()
|
|||
//<FS:HG> FS-1734 seperate name and text styles for moderator
|
||||
bool highlight_mods_chat = gSavedSettings.getBOOL("FSHighlightGroupMods");
|
||||
|
||||
|
||||
std::list<LLSD> messages;
|
||||
|
||||
// we shouldn't reset unread message counters if IM floater doesn't have focus
|
||||
|
|
@ -1483,7 +1476,7 @@ void FSFloaterIM::updateMessages()
|
|||
LLUUID from_id = msg["from_id"].asUUID();
|
||||
std::string from = msg["from"].asString();
|
||||
std::string message = msg["message"].asString();
|
||||
bool is_history = msg["is_history"].asBoolean();
|
||||
S32 is_history = msg["is_history"].asInteger();
|
||||
bool is_region_msg = msg["is_region_msg"].asBoolean();
|
||||
|
||||
LLChat chat;
|
||||
|
|
@ -1491,7 +1484,10 @@ void FSFloaterIM::updateMessages()
|
|||
chat.mSessionID = mSessionID;
|
||||
chat.mFromName = from;
|
||||
chat.mTimeStr = time;
|
||||
chat.mChatStyle = is_history ? CHAT_STYLE_HISTORY : chat.mChatStyle;
|
||||
if (is_history)
|
||||
{
|
||||
chat.mChatStyle = (EChatStyle) is_history;
|
||||
}
|
||||
if (is_region_msg)
|
||||
{
|
||||
chat.mSourceType = CHAT_SOURCE_REGION;
|
||||
|
|
@ -1537,7 +1533,7 @@ void FSFloaterIM::updateMessages()
|
|||
{
|
||||
chat.mText = message;
|
||||
}
|
||||
|
||||
|
||||
mChatHistory->appendMessage(chat, chat_args);
|
||||
mLastMessageIndex = msg["index"].asInteger();
|
||||
|
||||
|
|
@ -1596,8 +1592,7 @@ void FSFloaterIM::onInputEditorFocusLost()
|
|||
|
||||
void FSFloaterIM::onInputEditorKeystroke()
|
||||
{
|
||||
std::string text = mInputEditor->getText();
|
||||
if (!text.empty())
|
||||
if (!mInputEditor->getText().empty())
|
||||
{
|
||||
setTyping(true);
|
||||
}
|
||||
|
|
@ -1610,13 +1605,13 @@ void FSFloaterIM::onInputEditorKeystroke()
|
|||
|
||||
void FSFloaterIM::setTyping(bool typing)
|
||||
{
|
||||
if ( typing )
|
||||
if (typing)
|
||||
{
|
||||
// Started or proceeded typing, reset the typing timeout timer
|
||||
mTypingTimeoutTimer.reset();
|
||||
}
|
||||
|
||||
if ( mMeTyping != typing )
|
||||
if (mMeTyping != typing)
|
||||
{
|
||||
// Typing state is changed
|
||||
mMeTyping = typing;
|
||||
|
|
@ -1633,7 +1628,7 @@ void FSFloaterIM::setTyping(bool typing)
|
|||
if ( mShouldSendTypingState && mDialog == IM_NOTHING_SPECIAL && !(FSData::instance().isSupport(mOtherParticipantUUID) && FSData::instance().isAgentFlag(gAgentID, FSData::NO_SUPPORT)))
|
||||
// </FS:Techwolf Lupindo>
|
||||
{
|
||||
if ( mMeTyping )
|
||||
if (mMeTyping)
|
||||
{
|
||||
if ( mTypingTimer.getElapsedTimeF32() > 1.f )
|
||||
{
|
||||
|
|
@ -1654,12 +1649,11 @@ void FSFloaterIM::setTyping(bool typing)
|
|||
LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
|
||||
if (speaker_mgr)
|
||||
speaker_mgr->setSpeakerTyping(gAgent.getID(), FALSE);
|
||||
|
||||
}
|
||||
|
||||
void FSFloaterIM::processIMTyping(const LLUUID& from_id, BOOL typing)
|
||||
{
|
||||
if ( typing )
|
||||
if (typing)
|
||||
{
|
||||
// other user started typing
|
||||
addTypingIndicator(from_id);
|
||||
|
|
@ -1681,7 +1675,7 @@ void FSFloaterIM::processAgentListUpdates(const LLSD& body)
|
|||
if (body.isMap() && body.has("agent_updates") && body["agent_updates"].isMap())
|
||||
{
|
||||
LLSD::map_const_iterator update_it;
|
||||
for(update_it = body["agent_updates"].beginMap();
|
||||
for (update_it = body["agent_updates"].beginMap();
|
||||
update_it != body["agent_updates"].endMap();
|
||||
++update_it)
|
||||
{
|
||||
|
|
@ -1724,7 +1718,7 @@ void FSFloaterIM::processAgentListUpdates(const LLSD& body)
|
|||
joined_uuids.begin(), joined_uuids.end(),
|
||||
std::back_inserter(intersection));
|
||||
|
||||
if (intersection.size() > 0)
|
||||
if (!intersection.empty())
|
||||
{
|
||||
sendParticipantsAddedNotification(intersection);
|
||||
}
|
||||
|
|
@ -1776,30 +1770,6 @@ void FSFloaterIM::processChatHistoryStyleUpdate(const LLSD& newvalue)
|
|||
}
|
||||
}
|
||||
|
||||
void FSFloaterIM::processSessionUpdate(const LLSD& session_update)
|
||||
{
|
||||
// *TODO : verify following code when moderated mode will be implemented
|
||||
if ( false && session_update.has("moderated_mode") &&
|
||||
session_update["moderated_mode"].has("voice") )
|
||||
{
|
||||
BOOL voice_moderated = session_update["moderated_mode"]["voice"];
|
||||
const std::string session_label = LLIMModel::instance().getName(mSessionID);
|
||||
|
||||
if (voice_moderated)
|
||||
{
|
||||
setTitle(session_label + std::string(" ") + LLTrans::getString("IM_moderated_chat_label"));
|
||||
}
|
||||
else
|
||||
{
|
||||
setTitle(session_label);
|
||||
}
|
||||
|
||||
// *TODO : uncomment this when/if LLPanelActiveSpeakers panel will be added
|
||||
//update the speakers dropdown too
|
||||
//mSpeakerPanel->setVoiceModerationCtrlMode(voice_moderated);
|
||||
}
|
||||
}
|
||||
|
||||
BOOL FSFloaterIM::handleDragAndDrop(S32 x, S32 y, MASK mask,
|
||||
BOOL drop, EDragAndDropType cargo_type,
|
||||
void *cargo_data, EAcceptance *accept,
|
||||
|
|
@ -1849,7 +1819,7 @@ BOOL FSFloaterIM::handleDragAndDrop(S32 x, S32 y, MASK mask,
|
|||
bool FSFloaterIM::dropCallingCard(LLInventoryItem* item, bool drop)
|
||||
{
|
||||
bool rv = true;
|
||||
if(item && item->getCreatorUUID().notNull())
|
||||
if (item && item->getCreatorUUID().notNull())
|
||||
{
|
||||
uuid_vec_t ids;
|
||||
ids.push_back(item->getCreatorUUID());
|
||||
|
|
@ -1877,7 +1847,7 @@ bool FSFloaterIM::dropCallingCard(LLInventoryItem* item, bool drop)
|
|||
bool FSFloaterIM::dropCategory(LLInventoryCategory* category, bool drop)
|
||||
{
|
||||
bool rv = true;
|
||||
if(category)
|
||||
if (category)
|
||||
{
|
||||
LLInventoryModel::cat_array_t cats;
|
||||
LLInventoryModel::item_array_t items;
|
||||
|
|
@ -1888,7 +1858,7 @@ bool FSFloaterIM::dropCategory(LLInventoryCategory* category, bool drop)
|
|||
LLInventoryModel::EXCLUDE_TRASH,
|
||||
buddies);
|
||||
S32 count = items.size();
|
||||
if(count == 0)
|
||||
if (count == 0)
|
||||
{
|
||||
rv = false;
|
||||
}
|
||||
|
|
@ -1921,13 +1891,13 @@ bool FSFloaterIM::dropCategory(LLInventoryCategory* category, bool drop)
|
|||
bool FSFloaterIM::dropPerson(LLUUID* person_id, bool drop)
|
||||
{
|
||||
bool res = person_id && person_id->notNull();
|
||||
if(res)
|
||||
if (res)
|
||||
{
|
||||
uuid_vec_t ids;
|
||||
ids.push_back(*person_id);
|
||||
|
||||
res = canAddSelectedToChat(ids);
|
||||
if(res && drop)
|
||||
if (res && drop)
|
||||
{
|
||||
// these people will be added during the next draw() call
|
||||
// (so they can be added all at once)
|
||||
|
|
@ -2067,7 +2037,7 @@ void FSFloaterIM::addTypingIndicator(const LLUUID& from_id)
|
|||
|
||||
void FSFloaterIM::removeTypingIndicator(const LLUUID& from_id)
|
||||
{
|
||||
if ( mOtherTyping )
|
||||
if (mOtherTyping)
|
||||
{
|
||||
mOtherTyping = false;
|
||||
|
||||
|
|
@ -2112,7 +2082,7 @@ void FSFloaterIM::closeHiddenIMToasts()
|
|||
};
|
||||
|
||||
LLNotificationsUI::LLScreenChannel* channel = LLNotificationsUI::LLChannelManager::getNotificationScreenChannel();
|
||||
if (channel != NULL)
|
||||
if (channel)
|
||||
{
|
||||
channel->closeHiddenToasts(IMToastMatcher());
|
||||
}
|
||||
|
|
@ -2126,7 +2096,7 @@ void FSFloaterIM::confirmLeaveCallCallback(const LLSD& notification, const LLSD&
|
|||
bool snooze = payload["snooze"].asBoolean();
|
||||
|
||||
FSFloaterIM* im_floater = LLFloaterReg::findTypedInstance<FSFloaterIM>("fs_impanel", session_id);
|
||||
if (option == 0 && im_floater != NULL)
|
||||
if (option == 0 && im_floater)
|
||||
{
|
||||
LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(session_id);
|
||||
if (session)
|
||||
|
|
@ -2165,15 +2135,19 @@ void FSFloaterIM::initIMFloater()
|
|||
void FSFloaterIM::sRemoveTypingIndicator(const LLSD& data)
|
||||
{
|
||||
LLUUID session_id = data["session_id"];
|
||||
if (session_id.isNull()) return;
|
||||
if (session_id.isNull())
|
||||
return;
|
||||
|
||||
LLUUID from_id = data["from_id"];
|
||||
if (gAgentID == from_id || LLUUID::null == from_id) return;
|
||||
if (gAgentID == from_id || LLUUID::null == from_id)
|
||||
return;
|
||||
|
||||
FSFloaterIM* floater = FSFloaterIM::findInstance(session_id);
|
||||
if (!floater) return;
|
||||
if (!floater)
|
||||
return;
|
||||
|
||||
if (IM_NOTHING_SPECIAL != floater->mDialog) return;
|
||||
if (IM_NOTHING_SPECIAL != floater->mDialog)
|
||||
return;
|
||||
|
||||
floater->removeTypingIndicator();
|
||||
}
|
||||
|
|
@ -2197,7 +2171,7 @@ void FSFloaterIM::onClickCloseBtn(bool app_quitting)
|
|||
LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(
|
||||
mSessionID);
|
||||
|
||||
if (session == NULL)
|
||||
if (!session)
|
||||
{
|
||||
LL_WARNS("FSFloaterIM") << "Empty session." << LL_ENDL;
|
||||
return;
|
||||
|
|
@ -2225,16 +2199,16 @@ void FSFloaterIM::onClickCloseBtn(bool app_quitting)
|
|||
// <FS:Zi> Viewer version popup
|
||||
BOOL FSFloaterIM::enableViewerVersionCallback(const LLSD& notification,const LLSD& response)
|
||||
{
|
||||
S32 option=LLNotificationsUtil::getSelectedOption(notification,response);
|
||||
S32 option = LLNotificationsUtil::getSelectedOption(notification,response);
|
||||
|
||||
BOOL result=FALSE;
|
||||
if(option==0) // "yes"
|
||||
BOOL result = FALSE;
|
||||
if (option == 0) // "yes"
|
||||
{
|
||||
result=TRUE;
|
||||
result = TRUE;
|
||||
}
|
||||
|
||||
gSavedSettings.setBOOL("FSSupportGroupChatPrefix3",result);
|
||||
gSavedSettings.setBOOL("FSSupportGroupChatPrefixTesting",result);
|
||||
gSavedSettings.setBOOL("FSSupportGroupChatPrefix3", result);
|
||||
gSavedSettings.setBOOL("FSSupportGroupChatPrefixTesting", result);
|
||||
return result;
|
||||
}
|
||||
// </FS:Zi>
|
||||
|
|
@ -2334,45 +2308,14 @@ bool FSFloaterIM::canAddSelectedToChat(const uuid_vec_t& uuids)
|
|||
{
|
||||
// For a P2P session just check if we are not adding the other participant.
|
||||
|
||||
for (uuid_vec_t::const_iterator id = uuids.begin();
|
||||
id != uuids.end(); ++id)
|
||||
for (const auto& uuid : uuids)
|
||||
{
|
||||
if (*id == mOtherParticipantUUID)
|
||||
if (uuid == mOtherParticipantUUID)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// For a conference session we need to check against the list from LLSpeakerMgr,
|
||||
// because this list may change when participants join or leave the session.
|
||||
|
||||
// Ansariel: Disabled the check because the sim doesn't clear somebody off the
|
||||
// speaker list if they crash or relog and they can't be re-added in that case.
|
||||
/*
|
||||
LLSpeakerMgr::speaker_list_t speaker_list;
|
||||
LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
|
||||
if (speaker_mgr)
|
||||
{
|
||||
speaker_mgr->getSpeakerList(&speaker_list, true);
|
||||
}
|
||||
|
||||
for (uuid_vec_t::const_iterator id = uuids.begin();
|
||||
id != uuids.end(); ++id)
|
||||
{
|
||||
for (LLSpeakerMgr::speaker_list_t::const_iterator it = speaker_list.begin();
|
||||
it != speaker_list.end(); ++it)
|
||||
{
|
||||
const LLPointer<LLSpeaker>& speaker = *it;
|
||||
if (*id == speaker->mID)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
@ -2389,7 +2332,7 @@ void FSFloaterIM::addSessionParticipants(const uuid_vec_t& uuids)
|
|||
}
|
||||
else
|
||||
{
|
||||
if(findInstance(mSessionID))
|
||||
if (findInstance(mSessionID))
|
||||
{
|
||||
// remember whom we have invited, to notify others later, when the invited ones actually join
|
||||
mInvitedParticipants.insert(mInvitedParticipants.end(), uuids.begin(), uuids.end());
|
||||
|
|
@ -2410,7 +2353,7 @@ void FSFloaterIM::addP2PSessionParticipants(const LLSD& notification, const LLSD
|
|||
LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(mSessionID);
|
||||
|
||||
// first check whether this is a voice session
|
||||
bool is_voice_call = voice_channel != NULL && voice_channel->isActive();
|
||||
bool is_voice_call = voice_channel && voice_channel->isActive();
|
||||
|
||||
uuid_vec_t temp_ids;
|
||||
uuid_vec_t invited_ids;
|
||||
|
|
@ -2422,12 +2365,11 @@ void FSFloaterIM::addP2PSessionParticipants(const LLSD& notification, const LLSD
|
|||
LLUUID session_id = mSessionID;
|
||||
|
||||
// then we can close the current session
|
||||
if(findInstance(mSessionID))
|
||||
if (findInstance(mSessionID))
|
||||
{
|
||||
// remember whom we have invited, to notify others later, when the invited ones actually join
|
||||
mInvitedParticipants.insert(mInvitedParticipants.end(), uuids.begin(), uuids.end());
|
||||
|
||||
invited_ids.insert(invited_ids.end(), mInvitedParticipants.begin(), mInvitedParticipants.end());
|
||||
std::copy(uuids.begin(), uuids.end(), std::back_inserter(mInvitedParticipants));
|
||||
std::copy(mInvitedParticipants.begin(), mInvitedParticipants.end(), std::back_inserter(invited_ids));
|
||||
|
||||
// Ansariel: This will result in the floater actually being closed as opposed in CHUI!
|
||||
onClose(false);
|
||||
|
|
|
|||
|
|
@ -113,7 +113,6 @@ public:
|
|||
void onVisibilityChange(BOOL new_visibility);
|
||||
void processIMTyping(const LLUUID& from_id, BOOL typing);
|
||||
void processAgentListUpdates(const LLSD& body);
|
||||
void processSessionUpdate(const LLSD& session_update);
|
||||
|
||||
void updateChatHistoryStyle();
|
||||
static void processChatHistoryStyleUpdate(const LLSD& newvalue);
|
||||
|
|
|
|||
|
|
@ -40,14 +40,14 @@
|
|||
#include "lltoolbarview.h"
|
||||
#include "llvoiceclient.h"
|
||||
|
||||
static const F32 VOICE_STATUS_UPDATE_INTERVAL = 1.0f;
|
||||
constexpr F32 VOICE_STATUS_UPDATE_INTERVAL = 1.0f;
|
||||
|
||||
//
|
||||
// FSFloaterIMContainer
|
||||
//
|
||||
FSFloaterIMContainer::FSFloaterIMContainer(const LLSD& seed)
|
||||
: LLMultiFloater(seed),
|
||||
mActiveVoiceFloater(NULL),
|
||||
mActiveVoiceFloater(nullptr),
|
||||
mCurrentVoiceState(VOICE_STATE_NONE),
|
||||
mForceVoiceStateUpdate(false),
|
||||
mIsAddingNewSession(false)
|
||||
|
|
@ -186,7 +186,8 @@ void FSFloaterIMContainer::addFloater(LLFloater* floaterp,
|
|||
BOOL select_added_floater,
|
||||
LLTabContainer::eInsertionPoint insertion_point)
|
||||
{
|
||||
if(!floaterp) return;
|
||||
if (!floaterp)
|
||||
return;
|
||||
|
||||
// already here
|
||||
if (floaterp->getHost() == this)
|
||||
|
|
@ -385,14 +386,12 @@ void FSFloaterIMContainer::setMinimized(BOOL b)
|
|||
{
|
||||
if (mTabContainer)
|
||||
{
|
||||
FSFloaterNearbyChat* nearby_floater = dynamic_cast<FSFloaterNearbyChat*>(mTabContainer->getCurrentPanel());
|
||||
if (nearby_floater)
|
||||
if (FSFloaterNearbyChat* nearby_floater = dynamic_cast<FSFloaterNearbyChat*>(mTabContainer->getCurrentPanel()); nearby_floater)
|
||||
{
|
||||
nearby_floater->handleMinimized(b);
|
||||
}
|
||||
|
||||
FSFloaterIM* im_floater = dynamic_cast<FSFloaterIM*>(mTabContainer->getCurrentPanel());
|
||||
if (im_floater)
|
||||
if (FSFloaterIM* im_floater = dynamic_cast<FSFloaterIM*>(mTabContainer->getCurrentPanel()); im_floater)
|
||||
{
|
||||
im_floater->handleMinimized(b);
|
||||
}
|
||||
|
|
@ -405,7 +404,8 @@ void FSFloaterIMContainer::setMinimized(BOOL b)
|
|||
void FSFloaterIMContainer::sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id, BOOL has_offline_msg)
|
||||
{
|
||||
LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(session_id);
|
||||
if (!session) return;
|
||||
if (!session)
|
||||
return;
|
||||
|
||||
FSFloaterIM::onNewIMReceived(session_id);
|
||||
}
|
||||
|
|
@ -413,8 +413,7 @@ void FSFloaterIMContainer::sessionAdded(const LLUUID& session_id, const std::str
|
|||
//virtual
|
||||
void FSFloaterIMContainer::sessionRemoved(const LLUUID& session_id)
|
||||
{
|
||||
FSFloaterIM* iMfloater = LLFloaterReg::findTypedInstance<FSFloaterIM>("fs_impanel", session_id);
|
||||
if (iMfloater != NULL)
|
||||
if (FSFloaterIM* iMfloater = LLFloaterReg::findTypedInstance<FSFloaterIM>("fs_impanel", session_id); iMfloater)
|
||||
{
|
||||
iMfloater->closeFloater();
|
||||
}
|
||||
|
|
@ -535,7 +534,7 @@ LLFloater* FSFloaterIMContainer::getCurrentVoiceFloater()
|
|||
{
|
||||
if (!LLVoiceClient::instance().voiceEnabled())
|
||||
{
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if (LLVoiceChannelProximal::getInstance() == LLVoiceChannel::getCurrentVoiceChannel())
|
||||
|
|
@ -551,7 +550,7 @@ LLFloater* FSFloaterIMContainer::getCurrentVoiceFloater()
|
|||
return im_floater;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void FSFloaterIMContainer::addFlashingSession(const LLUUID& session_id)
|
||||
|
|
@ -573,8 +572,7 @@ void FSFloaterIMContainer::checkFlashing()
|
|||
|
||||
void FSFloaterIMContainer::sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id)
|
||||
{
|
||||
avatarID_panel_map_t::iterator found = mSessions.find(old_session_id);
|
||||
if (found != mSessions.end())
|
||||
if (avatarID_panel_map_t::iterator found = mSessions.find(old_session_id); found != mSessions.end())
|
||||
{
|
||||
LLFloater* floaterp = found->second;
|
||||
mSessions.erase(found);
|
||||
|
|
|
|||
|
|
@ -183,25 +183,35 @@ BOOL FSFloaterStreamTitle::postBuild()
|
|||
mUpdateConnection = instance.setUpdateCallback([this](std::string_view streamtitle) { updateStreamTitle(streamtitle); });
|
||||
updateStreamTitle(instance.getCurrentStreamTitle());
|
||||
|
||||
mHistoryBtn->setCommitCallback(std::bind(&FSFloaterStreamTitle::openHistory, this));
|
||||
mHistoryBtn->setCommitCallback(std::bind(&FSFloaterStreamTitle::toggleHistory, this));
|
||||
mHistoryBtn->setIsToggledCallback([](LLUICtrl*, const LLSD&) { return LLFloaterReg::instanceVisible("fs_streamtitlehistory"); });
|
||||
|
||||
|
||||
setVisibleCallback(boost::bind(&FSFloaterStreamTitle::closeHistory, this));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void FSFloaterStreamTitle::openHistory() noexcept
|
||||
void FSFloaterStreamTitle::toggleHistory() noexcept
|
||||
{
|
||||
LLFloater* root_floater = gFloaterView->getParentFloater(this);
|
||||
FSFloaterStreamTitleHistory* history_floater = LLFloaterReg::showTypedInstance<FSFloaterStreamTitleHistory>("fs_streamtitlehistory");
|
||||
FSFloaterStreamTitleHistory* history_floater = LLFloaterReg::findTypedInstance<FSFloaterStreamTitleHistory>("fs_streamtitlehistory");
|
||||
|
||||
if (root_floater)
|
||||
if (!history_floater)
|
||||
{
|
||||
root_floater->addDependentFloater(history_floater);
|
||||
history_floater->setOwnerOrigin(root_floater);
|
||||
history_floater = LLFloaterReg::showTypedInstance<FSFloaterStreamTitleHistory>("fs_streamtitlehistory");
|
||||
if (root_floater && history_floater)
|
||||
{
|
||||
root_floater->addDependentFloater(history_floater);
|
||||
history_floater->setOwnerOrigin(root_floater);
|
||||
mHistory = history_floater->getHandle();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
closeHistory();
|
||||
}
|
||||
|
||||
mHistory = history_floater->getHandle();
|
||||
}
|
||||
|
||||
void FSFloaterStreamTitle::closeHistory() noexcept
|
||||
|
|
|
|||
|
|
@ -108,7 +108,7 @@ private:
|
|||
BOOL tick() override;
|
||||
|
||||
void updateStreamTitle(std::string_view streamtitle) noexcept;
|
||||
void openHistory() noexcept;
|
||||
void toggleHistory() noexcept;
|
||||
void closeHistory() noexcept;
|
||||
void checkTitleWidth() noexcept;
|
||||
|
||||
|
|
|
|||
|
|
@ -51,17 +51,16 @@ void FSLSLBridgeRequest_Failure(LLSD const &aData)
|
|||
|
||||
void FSLSLBridgeRequestRadarPos_Success(LLSD const &aData)
|
||||
{
|
||||
FSRadar* radar = FSRadar::getInstance();
|
||||
LL_DEBUGS("FSLSLBridge") << ll_pretty_print_sd(aData) << LL_ENDL;
|
||||
if (radar && aData.has(LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS_CONTENT))
|
||||
if (aData.has(LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS_CONTENT))
|
||||
{
|
||||
std::string strContent = aData[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS_CONTENT].asString();
|
||||
//LL_INFOS("FSLSLBridge") << "Got info: " << strContent << LL_ENDL;
|
||||
// AO: parse content into pairs of [agent UUID,agent zHeight] , update our radar for each one
|
||||
|
||||
|
||||
LLUUID targetAv;
|
||||
F32 targetZ;
|
||||
|
||||
|
||||
typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
|
||||
boost::char_separator<char> sep(", ");
|
||||
tokenizer tokens(strContent, sep);
|
||||
|
|
@ -69,9 +68,8 @@ void FSLSLBridgeRequestRadarPos_Success(LLSD const &aData)
|
|||
{
|
||||
targetAv = LLUUID(*(tok_iter++));
|
||||
targetZ = (F32)::atof((*tok_iter).c_str());
|
||||
|
||||
FSRadarEntry* entry = radar->getEntry(targetAv);
|
||||
if (entry)
|
||||
|
||||
if (auto entry = FSRadar::getInstance()->getEntry(targetAv); entry)
|
||||
{
|
||||
entry->setZOffset(targetZ);
|
||||
//LL_INFOS("FSLSLBridge") << targetAv << " ::: " << targetZ << LL_ENDL;
|
||||
|
|
|
|||
|
|
@ -60,7 +60,7 @@
|
|||
#include "rlvactions.h"
|
||||
#include "rlvhandler.h"
|
||||
|
||||
static const F32 FS_RADAR_LIST_UPDATE_INTERVAL = 1.f;
|
||||
constexpr F32 FS_RADAR_LIST_UPDATE_INTERVAL = 1.f;
|
||||
|
||||
/**
|
||||
* Periodically updates the nearby people list while the Nearby tab is active.
|
||||
|
|
@ -98,7 +98,7 @@ FSRadar::FSRadar() :
|
|||
mNameFormatCallbackConnection(),
|
||||
mAgeAlertCallbackConnection()
|
||||
{
|
||||
mRadarListUpdater = new FSRadarListUpdater(boost::bind(&FSRadar::updateRadarList, this));
|
||||
mRadarListUpdater = std::make_unique<FSRadarListUpdater>(std::bind(&FSRadar::updateRadarList, this));
|
||||
|
||||
// Use the callback from LLAvatarNameCache here or we might update the names too early!
|
||||
LLAvatarNameCache::getInstance()->addUseDisplayNamesCallback(boost::bind(&FSRadar::updateNames, this));
|
||||
|
|
@ -110,13 +110,6 @@ FSRadar::FSRadar() :
|
|||
|
||||
FSRadar::~FSRadar()
|
||||
{
|
||||
delete mRadarListUpdater;
|
||||
|
||||
for (const auto& [av_id, entry] : mEntryList)
|
||||
{
|
||||
delete entry;
|
||||
}
|
||||
|
||||
if (mShowUsernamesCallbackConnection.connected())
|
||||
{
|
||||
mShowUsernamesCallbackConnection.disconnect();
|
||||
|
|
@ -216,14 +209,13 @@ void FSRadar::updateRadarList()
|
|||
|
||||
F32 drawRadius(sRenderFarClip);
|
||||
const LLVector3d& posSelf = gAgent.getPositionGlobal();
|
||||
LLViewerRegion* own_reg = gAgent.getRegion();
|
||||
LLUUID regionSelf;
|
||||
if (own_reg)
|
||||
if (LLViewerRegion* own_reg = gAgent.getRegion(); own_reg)
|
||||
{
|
||||
regionSelf = own_reg->getRegionID();
|
||||
}
|
||||
bool alertScripts = mRadarAlertRequest; // save the current value, so it doesn't get changed out from under us by another thread
|
||||
time_t now = time(NULL);
|
||||
time_t now = time(nullptr);
|
||||
|
||||
//STEP 0: Clear model data
|
||||
mRadarEnterAlerts.clear();
|
||||
|
|
@ -259,10 +251,8 @@ void FSRadar::updateRadarList()
|
|||
// Remove old avatars from our list
|
||||
for (const auto& avid : removed_vec)
|
||||
{
|
||||
entry_map_t::iterator found = mEntryList.find(avid);
|
||||
if (found != mEntryList.end())
|
||||
if (entry_map_t::iterator found = mEntryList.find(avid); found != mEntryList.end())
|
||||
{
|
||||
delete found->second;
|
||||
mEntryList.erase(found);
|
||||
}
|
||||
}
|
||||
|
|
@ -270,18 +260,18 @@ void FSRadar::updateRadarList()
|
|||
// Add new avatars
|
||||
for (const auto& avid : added_vec)
|
||||
{
|
||||
mEntryList[avid] = new FSRadarEntry(avid);
|
||||
mEntryList.emplace(avid, std::make_shared<FSRadarEntry>(avid));
|
||||
}
|
||||
|
||||
speakermgr->update(TRUE);
|
||||
|
||||
//STEP 2: Transform detected model list data into more flexible multimap data structure;
|
||||
//TS: Count avatars in chat range and in the same region
|
||||
U32 inChatRange = 0;
|
||||
U32 inSameRegion = 0;
|
||||
U32 inChatRange{ 0 };
|
||||
U32 inSameRegion{ 0 };
|
||||
std::vector<LLVector3d>::const_iterator
|
||||
pos_it = positions.begin(),
|
||||
pos_end = positions.end();
|
||||
pos_end = positions.end();
|
||||
uuid_vec_t::const_iterator
|
||||
item_it = avatar_ids.begin(),
|
||||
item_end = avatar_ids.end();
|
||||
|
|
@ -290,7 +280,6 @@ void FSRadar::updateRadarList()
|
|||
//
|
||||
//2a. For each detected av, gather up all data we would want to display or use to drive alerts
|
||||
//
|
||||
|
||||
LLUUID avId = static_cast<LLUUID>(*item_it);
|
||||
LLVector3d avPos = static_cast<LLVector3d>(*pos_it);
|
||||
|
||||
|
|
@ -300,7 +289,7 @@ void FSRadar::updateRadarList()
|
|||
}
|
||||
|
||||
// Skip modelling this avatar if its basic data is either inaccessible, or it's a dummy placeholder
|
||||
FSRadarEntry* ent = getEntry(avId);
|
||||
auto ent = getEntry(avId);
|
||||
LLViewerRegion* reg = world->getRegionFromPosGlobal(avPos);
|
||||
if (!ent) // don't update this radar listing if data is inaccessible
|
||||
{
|
||||
|
|
@ -311,12 +300,9 @@ void FSRadar::updateRadarList()
|
|||
LLVOAvatar* avVo = (LLVOAvatar*)gObjectList.findObject(avId);
|
||||
|
||||
static LLUICachedControl<bool> sFSShowDummyAVsinRadar("FSShowDummyAVsinRadar");
|
||||
if (!sFSShowDummyAVsinRadar)
|
||||
if (!sFSShowDummyAVsinRadar && avVo && avVo->mIsDummy)
|
||||
{
|
||||
if (avVo && avVo->mIsDummy)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
bool is_muted = mutelist->isMuted(avId);
|
||||
|
|
@ -654,7 +640,7 @@ void FSRadar::updateRadarList()
|
|||
if (mRadarOffsetRequests.size() > 0)
|
||||
{
|
||||
static const std::string prefix = "getZOffsets|";
|
||||
std::string msg = "";
|
||||
std::string msg {};
|
||||
U32 updatesPerRequest = 0;
|
||||
while (mRadarOffsetRequests.size() > 0)
|
||||
{
|
||||
|
|
@ -666,7 +652,7 @@ void FSRadar::updateRadarList()
|
|||
msg = msg.substr(0, msg.size() - 1);
|
||||
bridge.viewerToLSL(prefix + msg, FSLSLBridgeRequestRadarPos_Success);
|
||||
//LL_INFOS() << " OFFSET REQUEST SEGMENT"<< prefix << msg << LL_ENDL;
|
||||
msg = "";
|
||||
msg.clear();
|
||||
updatesPerRequest = 0;
|
||||
}
|
||||
}
|
||||
|
|
@ -832,31 +818,27 @@ void FSRadar::updateRadarList()
|
|||
|
||||
void FSRadar::requestRadarChannelAlertSync()
|
||||
{
|
||||
F32 timeNow = gFrameTimeSeconds;
|
||||
if ((timeNow - FSRADAR_CHAT_MIN_SPACING) > mRadarLastRequestTime)
|
||||
if (F32 timeNow = gFrameTimeSeconds; (timeNow - FSRADAR_CHAT_MIN_SPACING) > mRadarLastRequestTime)
|
||||
{
|
||||
mRadarLastRequestTime = timeNow;
|
||||
mRadarAlertRequest = true;
|
||||
}
|
||||
}
|
||||
|
||||
FSRadarEntry* FSRadar::getEntry(const LLUUID& avatar_id)
|
||||
std::shared_ptr<FSRadarEntry> FSRadar::getEntry(const LLUUID& avatar_id)
|
||||
{
|
||||
entry_map_t::iterator found = mEntryList.find(avatar_id);
|
||||
if (found == mEntryList.end())
|
||||
if (entry_map_t::iterator found = mEntryList.find(avatar_id); found != mEntryList.end())
|
||||
{
|
||||
return nullptr;
|
||||
return found->second;
|
||||
}
|
||||
return found->second;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void FSRadar::teleportToAvatar(const LLUUID& targetAv)
|
||||
// Teleports user to last scanned location of nearby avatar
|
||||
// Note: currently teleportViaLocation is disrupted by enforced landing points set on a parcel.
|
||||
{
|
||||
LLWorld* world = LLWorld::getInstance();
|
||||
FSRadarEntry* entry = getEntry(targetAv);
|
||||
if (entry)
|
||||
if (auto entry = getEntry(targetAv); entry)
|
||||
{
|
||||
LLVector3d avpos = entry->mGlobalPos;
|
||||
if (avpos.mdV[VZ] == AVATAR_UNKNOWN_Z_OFFSET)
|
||||
|
|
@ -867,7 +849,7 @@ void FSRadar::teleportToAvatar(const LLUUID& targetAv)
|
|||
{
|
||||
// <FS:TS> FIRE-20862: Teleport the configured offset toward the center of the region from the
|
||||
// avatar's reported position
|
||||
LLViewerRegion* avreg = world->getRegionFromPosGlobal(avpos);
|
||||
LLViewerRegion* avreg = LLWorld::getInstance()->getRegionFromPosGlobal(avpos);
|
||||
if (avreg)
|
||||
{
|
||||
LLVector3d region_center = avreg->getCenterGlobal();
|
||||
|
|
@ -964,8 +946,7 @@ void FSRadar::onRadarReportToClicked(const LLSD& userdata)
|
|||
bool FSRadar::radarReportToCheck(const LLSD& userdata)
|
||||
{
|
||||
const std::string menu_item = userdata.asString();
|
||||
bool report_to = gSavedSettings.getBOOL("FSMilkshakeRadarToasts");
|
||||
if (report_to)
|
||||
if (gSavedSettings.getBOOL("FSMilkshakeRadarToasts"))
|
||||
{
|
||||
return (menu_item == "radar_toasts");
|
||||
}
|
||||
|
|
@ -1000,8 +981,7 @@ void FSRadar::checkTracking()
|
|||
|
||||
void FSRadar::updateTracking()
|
||||
{
|
||||
FSRadarEntry* entry = getEntry(mTrackedAvatarId);
|
||||
if (entry)
|
||||
if (auto entry = getEntry(mTrackedAvatarId); entry)
|
||||
{
|
||||
if (LLTracker::getTrackedPositionGlobal() != entry->mGlobalPos)
|
||||
{
|
||||
|
|
@ -1039,8 +1019,7 @@ void FSRadar::updateNames()
|
|||
|
||||
void FSRadar::updateName(const LLUUID& avatar_id)
|
||||
{
|
||||
FSRadarEntry* entry = getEntry(avatar_id);
|
||||
if (entry)
|
||||
if (auto entry = getEntry(avatar_id); entry)
|
||||
{
|
||||
entry->updateName();
|
||||
}
|
||||
|
|
@ -1056,8 +1035,7 @@ void FSRadar::updateAgeAlertCheck()
|
|||
|
||||
void FSRadar::updateNotes(const LLUUID& avatar_id, std::string_view notes)
|
||||
{
|
||||
FSRadarEntry* entry = getEntry(avatar_id);
|
||||
if (entry)
|
||||
if (auto entry = getEntry(avatar_id); entry)
|
||||
{
|
||||
entry->setNotes(notes);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,14 +30,14 @@
|
|||
#include "llsingleton.h"
|
||||
|
||||
#include "fsradarentry.h"
|
||||
#include <boost/unordered_map.hpp>
|
||||
#include <unordered_map>
|
||||
|
||||
class LLAvatarName;
|
||||
|
||||
const U32 FSRADAR_MAX_AVATARS_PER_ALERT = 6; // maximum number of UUIDs we can cram into a single channel radar alert message
|
||||
const U32 FSRADAR_COARSE_OFFSET_INTERVAL = 7; // seconds after which we query the bridge for a coarse location adjustment
|
||||
const U32 FSRADAR_MAX_OFFSET_REQUESTS = 60; // 2048 / UUID size, leaving overhead space
|
||||
const U32 FSRADAR_CHAT_MIN_SPACING = 6; // minimum delay between radar chat messages
|
||||
constexpr U32 FSRADAR_MAX_AVATARS_PER_ALERT{ 6 }; // maximum number of UUIDs we can cram into a single channel radar alert message
|
||||
constexpr U32 FSRADAR_COARSE_OFFSET_INTERVAL{ 7 }; // seconds after which we query the bridge for a coarse location adjustment
|
||||
constexpr U32 FSRADAR_MAX_OFFSET_REQUESTS{ 60 }; // 2048 / UUID size, leaving overhead space
|
||||
constexpr U32 FSRADAR_CHAT_MIN_SPACING{ 6 }; // minimum delay between radar chat messages
|
||||
|
||||
typedef enum e_radar_name_format
|
||||
{
|
||||
|
|
@ -63,7 +63,7 @@ class FSRadar
|
|||
virtual ~FSRadar();
|
||||
|
||||
public:
|
||||
typedef boost::unordered_map<const LLUUID, FSRadarEntry*, FSUUIDHash> entry_map_t;
|
||||
typedef std::unordered_map<const LLUUID, std::shared_ptr<FSRadarEntry>, FSUUIDHash> entry_map_t;
|
||||
entry_map_t getRadarList() { return mEntryList; }
|
||||
|
||||
void startTracking(const LLUUID& avatar_id);
|
||||
|
|
@ -80,13 +80,13 @@ public:
|
|||
static bool radarReportToCheck(const LLSD& userdata);
|
||||
|
||||
void getCurrentData(std::vector<LLSD>& entries, LLSD& stats) const { entries = mRadarEntriesData; stats = mAvatarStats; }
|
||||
FSRadarEntry* getEntry(const LLUUID& avatar_id);
|
||||
std::shared_ptr<FSRadarEntry> getEntry(const LLUUID& avatar_id);
|
||||
|
||||
// internals
|
||||
class Updater
|
||||
{
|
||||
public:
|
||||
typedef boost::function<void()> callback_t;
|
||||
typedef std::function<void()> callback_t;
|
||||
Updater(callback_t cb)
|
||||
: mCallback(cb)
|
||||
{ }
|
||||
|
|
@ -100,7 +100,7 @@ public:
|
|||
mCallback();
|
||||
}
|
||||
|
||||
callback_t mCallback;
|
||||
callback_t mCallback;
|
||||
};
|
||||
|
||||
typedef boost::signals2::signal<void(const std::vector<LLSD>& entries, const LLSD& stats)> radar_update_callback_t;
|
||||
|
|
@ -110,13 +110,13 @@ public:
|
|||
}
|
||||
|
||||
private:
|
||||
void updateRadarList();
|
||||
void updateTracking();
|
||||
void checkTracking();
|
||||
void radarAlertMsg(const LLUUID& agent_id, const LLAvatarName& av_name, std::string_view postMsg);
|
||||
void updateAgeAlertCheck();
|
||||
void updateRadarList();
|
||||
void updateTracking();
|
||||
void checkTracking();
|
||||
void radarAlertMsg(const LLUUID& agent_id, const LLAvatarName& av_name, std::string_view postMsg);
|
||||
void updateAgeAlertCheck();
|
||||
|
||||
Updater* mRadarListUpdater;
|
||||
std::unique_ptr<Updater> mRadarListUpdater;
|
||||
|
||||
struct RadarFields
|
||||
{
|
||||
|
|
@ -125,7 +125,7 @@ private:
|
|||
bool lastIgnore;
|
||||
};
|
||||
|
||||
typedef boost::unordered_map<LLUUID, RadarFields, FSUUIDHash> radarfields_map_t;
|
||||
typedef std::unordered_map<LLUUID, RadarFields, FSUUIDHash> radarfields_map_t;
|
||||
radarfields_map_t mLastRadarSweep;
|
||||
entry_map_t mEntryList;
|
||||
|
||||
|
|
|
|||
|
|
@ -418,8 +418,7 @@ LLColor4 LGGContactSets::colorize(const LLUUID& uuid, const LLColor4& cur_color,
|
|||
}
|
||||
else
|
||||
{
|
||||
FSRadarEntry* entry = FSRadar::getInstance()->getEntry(uuid);
|
||||
if ( (entry && entry->getIsLinden()) || (!entry && FSCommon::isLinden(uuid)) )
|
||||
if (auto entry = FSRadar::getInstance()->getEntry(uuid); (entry && entry->getIsLinden()) || (!entry && FSCommon::isLinden(uuid)) )
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -3892,8 +3892,10 @@ LLSD LLAppViewer::getViewerInfo() const
|
|||
}
|
||||
|
||||
// CPU
|
||||
LLMemory::updateMemoryInfo();
|
||||
info["CPU"] = gSysCPU.getCPUString();
|
||||
info["MEMORY_MB"] = LLSD::Integer(gSysMemory.getPhysicalMemoryKB().valueInUnits<LLUnits::Megabytes>());
|
||||
info["USED_RAM"] = LLSD::Real(LLMemory::getAllocatedMemKB().valueInUnits<LLUnits::Megabytes>());
|
||||
info["CONCURRENCY"] = LLSD::Integer((S32)boost::thread::hardware_concurrency()); // <FS:Beq> Add hardware concurrency to info
|
||||
// Moved hack adjustment to Windows memory size into llsys.cpp
|
||||
info["OS_VERSION"] = LLOSInfo::instance().getOSString();
|
||||
|
|
@ -5195,7 +5197,10 @@ bool LLAppViewer::initCache()
|
|||
// </FS:Ansariel>
|
||||
|
||||
const std::string cache_dir = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, cache_dir_name);
|
||||
LLDiskCache::initParamSingleton(cache_dir, disk_cache_size, enable_cache_debug_info);
|
||||
// <FS:Beq> Improve cache purge triggering
|
||||
// LLDiskCache::initParamSingleton(cache_dir, disk_cache_size, enable_cache_debug_info);
|
||||
LLDiskCache::initParamSingleton(cache_dir, disk_cache_size, enable_cache_debug_info, gSavedSettings.getF32("FSDiskCacheHighWaterPercent"), gSavedSettings.getF32("FSDiskCacheLowWaterPercent"));
|
||||
// </FS:Beq>
|
||||
|
||||
if (!read_only)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1196,7 +1196,7 @@ DWORD WINAPI purgeThread( LPVOID lpParameter )
|
|||
|
||||
for( auto dir : vctDirs )
|
||||
{
|
||||
LL_INFOS("CachePurge") << "Removing an old cache" << LL_ENDL;
|
||||
LL_INFOS("LLDiskCache") << "Removing an old cache" << LL_ENDL; // <FS:Beq/> consistent tagging to help searching log files
|
||||
deleteCacheDirectory( dir );
|
||||
}
|
||||
|
||||
|
|
@ -1214,7 +1214,7 @@ void LLAppViewerWin32::startCachePurge()
|
|||
|
||||
if( !hThread )
|
||||
{
|
||||
LL_WARNS("CachePurge") << "CreateThread failed: " << GetLastError() << LL_ENDL;
|
||||
LL_WARNS("LLDiskCache") << "CreateThread failed: " << GetLastError() << LL_ENDL; // <FS:Beq/> consistent tagging to help searching log files
|
||||
}
|
||||
else
|
||||
SetThreadPriority( hThread, THREAD_MODE_BACKGROUND_BEGIN );
|
||||
|
|
|
|||
|
|
@ -1862,7 +1862,7 @@ bool LLAvatarActions::canZoomIn(const LLUUID& idAgent)
|
|||
else
|
||||
{
|
||||
// Special case for SL since interest list changes
|
||||
FSRadarEntry* entry = FSRadar::getInstance()->getEntry(idAgent);
|
||||
auto entry = FSRadar::getInstance()->getEntry(idAgent);
|
||||
#ifdef OPENSIM
|
||||
if (LLGridManager::getInstance()->isInOpenSim())
|
||||
{
|
||||
|
|
@ -1871,7 +1871,7 @@ bool LLAvatarActions::canZoomIn(const LLUUID& idAgent)
|
|||
else
|
||||
#endif
|
||||
{
|
||||
return (entry != NULL);
|
||||
return (entry != nullptr);
|
||||
}
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
|
@ -1882,8 +1882,7 @@ void LLAvatarActions::zoomIn(const LLUUID& idAgent)
|
|||
// <FS:Ansariel> Firestorm radar support
|
||||
//handle_zoom_to_object(idAgent);
|
||||
|
||||
FSRadarEntry* entry = FSRadar::getInstance()->getEntry(idAgent);
|
||||
if (entry)
|
||||
if (auto entry = FSRadar::getInstance()->getEntry(idAgent); entry)
|
||||
{
|
||||
handle_zoom_to_object(idAgent, entry->getGlobalPos());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -444,6 +444,7 @@ void inventory_offer_handler(LLOfferInfo* info)
|
|||
}
|
||||
|
||||
report_to_nearby_chat(LLTrans::getString(message_type, chat_args));
|
||||
make_ui_sound("UISndInventoryOffer");
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
||||
|
|
|
|||
|
|
@ -1032,7 +1032,9 @@ void LLIMModel::LLIMSession::addMessage(const std::string& from,
|
|||
const LLUUID& from_id,
|
||||
const std::string& utf8_text,
|
||||
const std::string& time,
|
||||
const bool is_history, // comes from a history file or chat server
|
||||
// <FS:Zi> Add a distinct color for server side group chat replay
|
||||
// const bool is_history, // comes from a history file or chat server
|
||||
const S32 is_history, // comes from a history file or chat server
|
||||
const bool is_region_msg,
|
||||
const U32 timestamp) // may be zero
|
||||
{
|
||||
|
|
@ -1101,7 +1103,9 @@ void LLIMModel::LLIMSession::addMessagesFromHistoryCache(const chat_message_list
|
|||
LL_DEBUGS("ChatHistory") << mSessionID << ": Adding history cache message: " << msg << LL_ENDL;
|
||||
|
||||
// Add message from history cache to the display
|
||||
addMessage(from, from_id, msg[LL_IM_TEXT], msg[LL_IM_TIME], true, false, 0); // from history data, not region message, no timestamp
|
||||
// <FS:Zi> Add a distinct color for server side group chat replay
|
||||
// addMessage(from, from_id, msg[LL_IM_TEXT], msg[LL_IM_TIME], true, false, 0); // from history data, not region message, no timestamp
|
||||
addMessage(from, from_id, msg[LL_IM_TEXT], msg[LL_IM_TIME], CHAT_STYLE_HISTORY, false, 0); // from history data, not region message, no timestamp
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1309,7 +1313,9 @@ void LLIMModel::LLIMSession::addMessagesFromServerHistory(const LLSD& history,
|
|||
message["time"] = chat_time_str;
|
||||
message["timestamp"] = (S32)history_msg_timestamp;
|
||||
message["index"] = (LLSD::Integer)mMsgs.size();
|
||||
message["is_history"] = true;
|
||||
// <FS:Zi> Add a distinct color for server side group chat replay
|
||||
// message["is_history"] = true;
|
||||
message["is_history"] = CHAT_STYLE_SERVER_HISTORY;
|
||||
mMsgs.push_front(message);
|
||||
|
||||
LL_DEBUGS("ChatHistory") << mSessionID << ": push_front() adding group chat history message " << message << LL_ENDL;
|
||||
|
|
@ -1356,12 +1362,16 @@ void LLIMModel::LLIMSession::chatFromLogFile(LLLogChat::ELogLineType type, const
|
|||
if (type == LLLogChat::LOG_LINE)
|
||||
{
|
||||
LL_DEBUGS("ChatHistory") << "chatFromLogFile() adding LOG_LINE message from " << msg << LL_ENDL;
|
||||
self->addMessage("", LLSD(), msg["message"].asString(), "", true, false, 0); // from history data, not region message, no timestamp
|
||||
// <FS:Zi> Add a distinct color for server side group chat replay
|
||||
// self->addMessage("", LLSD(), msg["message"].asString(), "", true, false, 0); // from history data, not region message, no timestamp
|
||||
self->addMessage("", LLSD(), msg["message"].asString(), "", CHAT_STYLE_HISTORY, false, 0); // from history data, not region message, no timestamp
|
||||
}
|
||||
else if (type == LLLogChat::LOG_LLSD)
|
||||
{
|
||||
LL_DEBUGS("ChatHistory") << "chatFromLogFile() adding LOG_LLSD message from " << msg << LL_ENDL;
|
||||
self->addMessage(msg["from"].asString(), msg["from_id"].asUUID(), msg["message"].asString(), msg["time"].asString(), true, false, 0); // from history data, not region message, no timestamp
|
||||
// <FS:Zi> Add a distinct color for server side group chat replay
|
||||
// self->addMessage(msg["from"].asString(), msg["from_id"].asUUID(), msg["message"].asString(), msg["time"].asString(), true, false, 0); // from history data, not region message, no timestamp
|
||||
self->addMessage(msg["from"].asString(), msg["from_id"].asUUID(), msg["message"].asString(), msg["time"].asString(), CHAT_STYLE_HISTORY, false, 0); // from history data, not region message, no timestamp
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1717,7 +1727,9 @@ bool LLIMModel::addToHistory(const LLUUID& session_id,
|
|||
|
||||
// <FS:Ansariel> Forward IM to nearby chat if wanted
|
||||
std::string timestr = LLLogChat::timestamp2LogString(timestamp, false);
|
||||
session->addMessage(from, from_id, utf8_text, timestr, false, is_region_msg, timestamp); //might want to add date separately
|
||||
// <FS:Zi> Add a distinct color for server side group chat replay
|
||||
// session->addMessage(from, from_id, utf8_text, timestr, false, is_region_msg, timestamp); //might want to add date separately
|
||||
session->addMessage(from, from_id, utf8_text, timestr, CHAT_STYLE_NORMAL, is_region_msg, timestamp); //might want to add date separately
|
||||
|
||||
static LLCachedControl<bool> show_im_in_chat(gSavedSettings, "FSShowIMInChatHistory");
|
||||
if (show_im_in_chat && !is_announcement)
|
||||
|
|
@ -4650,7 +4662,7 @@ public:
|
|||
{
|
||||
if ( body.has("session_info") )
|
||||
{
|
||||
im_floater->processSessionUpdate(body["session_info"]);
|
||||
//im_floater->processSessionUpdate(body["session_info"]); // <FS:Ansariel> Method does nothing
|
||||
|
||||
// Send request for chat history, if enabled.
|
||||
if (gSavedPerAccountSettings.getBOOL("FetchGroupChatHistory"))
|
||||
|
|
@ -4747,14 +4759,15 @@ public:
|
|||
const LLSD& input) const
|
||||
{
|
||||
LLUUID session_id = input["body"]["session_id"].asUUID();
|
||||
// <FS:Ansariel> [FS communication UI]
|
||||
//LLFloaterIMSession* im_floater = LLFloaterIMSession::findInstance(session_id);
|
||||
FSFloaterIM* im_floater = FSFloaterIM::findInstance(session_id);
|
||||
// </FS:Ansariel> [FS communication UI]
|
||||
if ( im_floater )
|
||||
{
|
||||
im_floater->processSessionUpdate(input["body"]["info"]);
|
||||
}
|
||||
// <FS:Ansariel> Method does nothing
|
||||
//// <FS:Ansariel> [FS communication UI]
|
||||
////LLFloaterIMSession* im_floater = LLFloaterIMSession::findInstance(session_id);
|
||||
//FSFloaterIM* im_floater = FSFloaterIM::findInstance(session_id);
|
||||
//// </FS:Ansariel> [FS communication UI]
|
||||
//if ( im_floater )
|
||||
//{
|
||||
// im_floater->processSessionUpdate(input["body"]["info"]);
|
||||
//}
|
||||
LLIMSpeakerMgr* im_mgr = LLIMModel::getInstance()->getSpeakerManager(session_id);
|
||||
if (im_mgr)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -99,7 +99,9 @@ public:
|
|||
const LLUUID& from_id,
|
||||
const std::string& utf8_text,
|
||||
const std::string& time,
|
||||
const bool is_history,
|
||||
// <FS:Zi> Add a distinct color for server side group chat replay
|
||||
// const bool is_history,
|
||||
const S32 is_history,
|
||||
const bool is_region_msg,
|
||||
U32 timestamp);
|
||||
|
||||
|
|
|
|||
|
|
@ -1353,19 +1353,12 @@ BOOL LLNetMap::handleToolTipAgent(const LLUUID& avatar_id)
|
|||
// aka radar when above 1020m.
|
||||
if (isHigher1020mBug)
|
||||
{
|
||||
FSRadar* radar = FSRadar::getInstance();
|
||||
if (radar)
|
||||
if (auto entry = FSRadar::getInstance()->getEntry(avatar_id); entry)
|
||||
{
|
||||
FSRadarEntry* entry = radar->getEntry(avatar_id);
|
||||
if (entry)
|
||||
if (F32 radar_distance = entry->getRange(); radar_distance > AVATAR_UNKNOWN_RANGE)
|
||||
{
|
||||
F32 radar_distance = entry->getRange();
|
||||
|
||||
if (radar_distance > AVATAR_UNKNOWN_RANGE)
|
||||
{
|
||||
distance = radar_distance;
|
||||
isHigher1020mBug = false;
|
||||
}
|
||||
distance = radar_distance;
|
||||
isHigher1020mBug = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1176,6 +1176,13 @@ void LLPanelProfileSecondLife::apply(LLAvatarData* data)
|
|||
|
||||
void LLPanelProfileSecondLife::processProperties(void* data, EAvatarProcessorType type)
|
||||
{
|
||||
// discard UDP replies for profile data if profile capability is available
|
||||
// otherwise we will truncate profile descriptions to the old UDP limits
|
||||
if (!gAgent.getRegionCapability(PROFILE_PROPERTIES_CAP).empty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (APT_PROPERTIES == type)
|
||||
{
|
||||
const LLAvatarData* avatar_data = static_cast<const LLAvatarData*>(data);
|
||||
|
|
@ -2990,6 +2997,13 @@ void LLPanelProfileFirstLife::onDiscardDescriptionChanges()
|
|||
// <FS:Beq> Restore UDP profiles
|
||||
void LLPanelProfileFirstLife::processProperties(void * data, EAvatarProcessorType type)
|
||||
{
|
||||
// discard UDP replies for profile data if profile capability is available
|
||||
// otherwise we will truncate profile first life descriptions to the old UDP limits
|
||||
if (!gAgent.getRegionCapability(PROFILE_PROPERTIES_CAP).empty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (APT_PROPERTIES == type)
|
||||
{
|
||||
const LLAvatarData* avatar_data = static_cast<const LLAvatarData*>(data);
|
||||
|
|
@ -3204,6 +3218,13 @@ void LLPanelProfileNotes::processProperties(LLAvatarNotes* avatar_notes)
|
|||
// <FS:Beq> Restore UDP profiles
|
||||
void LLPanelProfileNotes::processProperties(void * data, EAvatarProcessorType type)
|
||||
{
|
||||
// discard UDP replies for profile data if profile capability is available
|
||||
// otherwise we will truncate profile notes to the old UDP limits
|
||||
if (!gAgent.getRegionCapability(PROFILE_PROPERTIES_CAP).empty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (APT_NOTES == type)
|
||||
{
|
||||
LLAvatarNotes* avatar_notes = static_cast<LLAvatarNotes*>(data);
|
||||
|
|
|
|||
|
|
@ -76,6 +76,7 @@ static LLPanelInjector<LLSidepanelInventory> t_inventory("sidepanel_inventory");
|
|||
|
||||
static const char * const INBOX_BUTTON_NAME = "inbox_btn";
|
||||
static const char * const INBOX_LAYOUT_PANEL_NAME = "inbox_layout_panel";
|
||||
static const char * const INBOX_RELOAD_BUTTON_NAME = "reload_received_items_btn"; // <FS:Zi> Add reload button to inventory inbox
|
||||
static const char * const INVENTORY_LAYOUT_STACK_NAME = "inventory_layout_stack";
|
||||
static const char * const MARKETPLACE_INBOX_PANEL = "marketplace_inbox";
|
||||
|
||||
|
|
@ -198,6 +199,12 @@ BOOL LLSidepanelInventory::postBuild()
|
|||
LLTabContainer* tabs = mPanelMainInventory->getChild<LLTabContainer>("inventory filter tabs");
|
||||
tabs->setCommitCallback(boost::bind(&LLSidepanelInventory::updateVerbs, this));
|
||||
|
||||
// <FS:Zi> Add reload button to inventory inbox
|
||||
if (LLButton* reload_inbox_btn = getChild<LLButton>(INBOX_RELOAD_BUTTON_NAME) ; reload_inbox_btn)
|
||||
{
|
||||
reload_inbox_btn->setClickedCallback(boost::bind(&LLSidepanelInventory::onReloadInboxClicked, this));
|
||||
}
|
||||
// </FS:Zi>
|
||||
/*
|
||||
EXT-4846 : "Can we suppress the "Landmarks" and "My Favorites" folder since they have their own Task Panel?"
|
||||
Deferring this until 2.1.
|
||||
|
|
@ -834,3 +841,16 @@ void LLSidepanelInventory::cleanup()
|
|||
}
|
||||
// </FS:Ansariel>
|
||||
}
|
||||
|
||||
// <FS:Zi> Add reload button to inventory inbox
|
||||
void LLSidepanelInventory::onReloadInboxClicked()
|
||||
{
|
||||
const LLUUID inbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX, true);
|
||||
|
||||
if (LLViewerInventoryCategory* cat = gInventory.getCategory(inbox_id); cat)
|
||||
{
|
||||
cat->setVersion(LLViewerInventoryCategory::VERSION_UNKNOWN);
|
||||
cat->fetch();
|
||||
}
|
||||
}
|
||||
// </FS:Zi>
|
||||
|
|
|
|||
|
|
@ -117,6 +117,7 @@ protected:
|
|||
void onWearButtonClicked();
|
||||
void onPlayButtonClicked();
|
||||
void onTeleportButtonClicked();
|
||||
void onReloadInboxClicked(); // <FS:Zi> Add reload button to inventory inbox
|
||||
public:
|
||||
void onBackButtonClicked();
|
||||
|
||||
|
|
|
|||
|
|
@ -1087,6 +1087,20 @@ void handleDiskCacheSizeChanged(const LLSD& newValue)
|
|||
}
|
||||
// </FS:Ansariel>
|
||||
|
||||
// <FS:Beq> Better asset cache purge control
|
||||
void handleDiskCacheHighWaterPctChanged(const LLSD& newValue)
|
||||
{
|
||||
const auto new_high = newValue.asReal();
|
||||
LLDiskCache::getInstance()->setHighWaterPercentage(new_high);
|
||||
}
|
||||
|
||||
void handleDiskCacheLowWaterPctChanged(const LLSD& newValue)
|
||||
{
|
||||
const auto new_low = newValue.asReal();
|
||||
LLDiskCache::getInstance()->setLowWaterPercentage(new_low);
|
||||
}
|
||||
// </FS:Beq>
|
||||
|
||||
void handleTargetFPSChanged(const LLSD& newValue)
|
||||
{
|
||||
const auto targetFPS = gSavedSettings.getU32("TargetFPS");
|
||||
|
|
@ -1464,7 +1478,10 @@ void settings_setup_listeners()
|
|||
|
||||
// <FS:Ansariel> Better asset cache size control
|
||||
setting_setup_signal_listener(gSavedSettings, "FSDiskCacheSize", handleDiskCacheSizeChanged);
|
||||
|
||||
// <FS:Beq> Better asset cache purge control
|
||||
setting_setup_signal_listener(gSavedSettings, "FSDiskCacheHighWaterPercent", handleDiskCacheHighWaterPctChanged);
|
||||
setting_setup_signal_listener(gSavedSettings, "FSDiskCacheLowWaterPercent", handleDiskCacheLowWaterPctChanged);
|
||||
// </FS:Beq>
|
||||
|
||||
// <FS:Zi> Handle IME text input getting enabled or disabled
|
||||
#if LL_SDL2
|
||||
|
|
|
|||
|
|
@ -5220,6 +5220,16 @@ void process_avatar_animation(LLMessageSystem *mesgsys, void **user_data)
|
|||
mesgsys->getUUIDFast(_PREHASH_AnimationList, _PREHASH_AnimID, animation_id, i);
|
||||
mesgsys->getS32Fast(_PREHASH_AnimationList, _PREHASH_AnimSequenceID, anim_sequence_id, i);
|
||||
|
||||
// <FS:Zi> Asset blacklist
|
||||
if (FSAssetBlacklist::getInstance()->isBlacklisted(animation_id, LLAssetType::AT_ANIMATION))
|
||||
{
|
||||
// stop animation for onlookers; this won't help with deformers, but at least the
|
||||
// user themselves doesn't see it, and everyone who comes in after this won't either
|
||||
gAgent.sendAnimationRequest(animation_id, ANIM_REQUEST_STOP);
|
||||
continue;
|
||||
}
|
||||
// </FS:Zi>
|
||||
|
||||
avatarp->mSignaledAnimations[animation_id] = anim_sequence_id;
|
||||
|
||||
// *HACK: Disabling flying mode if it has been enabled shortly before the agent
|
||||
|
|
|
|||
|
|
@ -106,6 +106,7 @@
|
|||
const S32 MAX_CAP_REQUEST_ATTEMPTS = 30;
|
||||
const U32 DEFAULT_MAX_REGION_WIDE_PRIM_COUNT = 15000;
|
||||
|
||||
bool LLViewerRegion::sFSAreaSearchActive = false; // <FS:Beq/> FIRE-32688 Area Search improvements
|
||||
BOOL LLViewerRegion::sVOCacheCullingEnabled = FALSE;
|
||||
S32 LLViewerRegion::sLastCameraUpdated = 0;
|
||||
S32 LLViewerRegion::sNewObjectCreationThrottle = -1;
|
||||
|
|
|
|||
|
|
@ -478,6 +478,7 @@ public:
|
|||
std::vector<U32> mMapAvatars;
|
||||
std::vector<LLUUID> mMapAvatarIDs;
|
||||
|
||||
static bool sFSAreaSearchActive; // <FS:Beq/> FIRE-32688 Area Search improvements
|
||||
static BOOL sVOCacheCullingEnabled; //vo cache culling enabled or not.
|
||||
static S32 sLastCameraUpdated;
|
||||
|
||||
|
|
|
|||
|
|
@ -432,6 +432,7 @@ F32 LLVOCacheEntry::getSquaredPixelThreshold(bool is_front)
|
|||
|
||||
bool LLVOCacheEntry::isAnyVisible(const LLVector4a& camera_origin, const LLVector4a& local_camera_origin, F32 dist_threshold)
|
||||
{
|
||||
if( LLViewerRegion::sFSAreaSearchActive ) { return true; } // <FS:Beq/> FIRE-32688 Area Search improvements
|
||||
LLOcclusionCullingGroup* group = (LLOcclusionCullingGroup*)getGroup();
|
||||
if(!group)
|
||||
{
|
||||
|
|
@ -928,7 +929,10 @@ S32 LLVOCachePartition::cull(LLCamera &camera, bool do_occlusion)
|
|||
|
||||
//process back objects selection
|
||||
selectBackObjects(camera, LLVOCacheEntry::getSquaredPixelThreshold(mFrontCull),
|
||||
do_occlusion && use_object_cache_occlusion);
|
||||
// <FS:Beq> FIRE-32688 Area Search improvements
|
||||
// do_occlusion && use_object_cache_occlusion);
|
||||
do_occlusion && use_object_cache_occlusion && !LLViewerRegion::sFSAreaSearchActive);
|
||||
// </FS:Beq>
|
||||
return 0; //nothing changed, reduce frequency of culling
|
||||
}
|
||||
}
|
||||
|
|
@ -942,7 +946,10 @@ S32 LLVOCachePartition::cull(LLCamera &camera, bool do_occlusion)
|
|||
camera.calcRegionFrustumPlanes(region_agent, gAgentCamera.mDrawDistance);
|
||||
|
||||
mFrontCull = TRUE;
|
||||
LLVOCacheOctreeCull culler(&camera, mRegionp, region_agent, do_occlusion && use_object_cache_occlusion,
|
||||
// <FS:Beq> FIRE-32688 Area Search improvements
|
||||
// LLVOCacheOctreeCull culler(&camera, mRegionp, region_agent, do_occlusion && use_object_cache_occlusion,
|
||||
LLVOCacheOctreeCull culler(&camera, mRegionp, region_agent, do_occlusion && use_object_cache_occlusion && !LLViewerRegion::sFSAreaSearchActive,
|
||||
// </FS:Beq>
|
||||
LLVOCacheEntry::getSquaredPixelThreshold(mFrontCull), this);
|
||||
culler.traverse(mOctree);
|
||||
|
||||
|
|
|
|||
|
|
@ -77,7 +77,7 @@
|
|||
font="SansSerifMedium"
|
||||
name="inbox_btn"
|
||||
height="35"
|
||||
width="308"
|
||||
width="270"
|
||||
image_unselected="MarketplaceBtn_Off"
|
||||
image_selected="MarketplaceBtn_Selected"
|
||||
halign="left"
|
||||
|
|
@ -88,6 +88,14 @@
|
|||
pad_left="35"
|
||||
top="0"
|
||||
left="10" />
|
||||
<button
|
||||
name="reload_received_items_btn"
|
||||
height="35"
|
||||
width="35"
|
||||
left_pad="3"
|
||||
follows="top|right"
|
||||
image_overlay="Refresh_Off"
|
||||
tool_tip="Reload the received items list." />
|
||||
<text
|
||||
type="string"
|
||||
length="1"
|
||||
|
|
@ -95,7 +103,7 @@
|
|||
layout="topleft"
|
||||
height="13"
|
||||
top="10"
|
||||
right="-20"
|
||||
right="-58"
|
||||
name="inbox_fresh_new_count"
|
||||
font="SansSerifMedium"
|
||||
halign="right"
|
||||
|
|
|
|||
|
|
@ -1358,6 +1358,11 @@
|
|||
<color
|
||||
name="ChatHistoryMessageFromLog"
|
||||
reference="Gray" />
|
||||
<!-- <FS:Zi> Add a distinct color for server side group chat replay -->
|
||||
<color
|
||||
name="ChatHistoryMessageFromServerLog"
|
||||
value=".37 .51 .38 1" />
|
||||
<!-- </FS:Zi> -->
|
||||
<color
|
||||
name="AreaSearchBeaconColor"
|
||||
reference="Blue_80" />
|
||||
|
|
|
|||
|
|
@ -32,9 +32,6 @@
|
|||
<panel.string name="area_text">
|
||||
Sahə
|
||||
</panel.string>
|
||||
<panel.string name="area_size_text">
|
||||
[AREA] m²
|
||||
</panel.string>
|
||||
<panel.string name="auction_id_text">
|
||||
Hərrac ID-si: [ID]
|
||||
</panel.string>
|
||||
|
|
@ -132,9 +129,6 @@
|
|||
<text name="PriceLabel">
|
||||
Sahə:
|
||||
</text>
|
||||
<text name="PriceText">
|
||||
4048 m²
|
||||
</text>
|
||||
<text name="Traffic:">
|
||||
Trafik:
|
||||
</text>
|
||||
|
|
@ -180,9 +174,6 @@
|
|||
<text name="covenant_timestamp_text">
|
||||
Axırınci dəyişiklər: 31 dekabr 1969 il., cümə, 16:00:00
|
||||
</text>
|
||||
<text name="region_section_lbl">
|
||||
Region:
|
||||
</text>
|
||||
<text name="region_name_text">
|
||||
Yüklənir...
|
||||
</text>
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@
|
|||
<text name="scale_label">Ölçü:</text>
|
||||
<text name="glow_focus_label">Parlaqlığın fokusu:</text>
|
||||
<text name="glow_size_label">Parlaqlığın ölçüsü:</text>
|
||||
<text name="star_brightness_label">Ulduzların parlaqlığı:</text>
|
||||
<text name="star_brightness_label" width="140">Ulduzların parlaqlığı:</text>
|
||||
</layout_panel>
|
||||
<layout_panel name="lp_4">
|
||||
<text name="label">Ay:</text>
|
||||
|
|
|
|||
|
|
@ -99,7 +99,8 @@ Maksimum animasiya uzunluğu: [MAX_LENGTH] sn.
|
|||
</floater.string>
|
||||
<floater.string name="E_ST_NO_XLT_EASEOUT">
|
||||
EaseOut dəyərləri alınmadı.
|
||||
</floater.string name="E_ST_NO_XLT_HAND">
|
||||
</floater.string>
|
||||
<floater.string name="E_ST_NO_XLT_HAND">
|
||||
Hand morph dəyəri alınmadı.
|
||||
</floater.string>
|
||||
<floater.string name="E_ST_NO_XLT_EMOTE">
|
||||
|
|
@ -128,10 +129,10 @@ Maksimum animasiya uzunluğu: [MAX_LENGTH] sn.
|
|||
<combo_box.item label="Sərbəst" name="Relaxed"/>
|
||||
<combo_box.item label="Göstərir" name="PointBoth"/>
|
||||
<combo_box.item label="Qapalı" name="Fist"/>
|
||||
<combo_box.item label="Sol xash" name="RelaxedLeft"/>
|
||||
<combo_box.item label="Sol sərbəst" name="RelaxedLeft"/>
|
||||
<combo_box.item label="Sol göstərir" name="PointLeft"/>
|
||||
<combo_box.item label="Sol qapalı" name="FistLeft"/>
|
||||
<combo_box.item label="Sağ xaş" name="RelaxedRight"/>
|
||||
<combo_box.item label="Sağ sərbəst" name="RelaxedRight"/>
|
||||
<combo_box.item label="Sağ göstərir" name="PointRight"/>
|
||||
<combo_box.item label="Sağ qapalı" name="FistRight"/>
|
||||
<combo_box.item label="Sağ salam verir" name="SaluteRight"/>
|
||||
|
|
|
|||
|
|
@ -66,6 +66,6 @@
|
|||
</fs_scroll_list>
|
||||
</panel>
|
||||
</tab_container>
|
||||
<button label="ОК" label_selected="ОК" name="ok_btn"/>
|
||||
<button label="OK" label_selected="OK" name="ok_btn"/>
|
||||
<button label="Ləğv et" label_selected="Ləğv et" name="cancel_btn"/>
|
||||
</floater>
|
||||
|
|
|
|||
|
|
@ -14,6 +14,6 @@
|
|||
<text name="hours_textbox">
|
||||
saat
|
||||
</text>
|
||||
<button label="ОК" name="ok_btn"/>
|
||||
<button label="OK" name="ok_btn"/>
|
||||
<button label="Ləğv et" name="cancel_btn"/>
|
||||
</floater>
|
||||
|
|
|
|||
|
|
@ -8,9 +8,9 @@
|
|||
</floater.string>
|
||||
<text name="beamcolor_text">
|
||||
Hansı rəng ilkin və hansı son olduğunu
|
||||
göstərmək üçün siçandan istifadə edin
|
||||
Başlanğıc üçün sol düyməni istifadə edin.
|
||||
Son üçün sağ düyməni istifadə edin.
|
||||
göstərmək üçün siçandan istifadə edin.
|
||||
Başlanğıc üçün sol düyməni istifadə edin.
|
||||
Son üçün sağ düyməni istifadə edin.
|
||||
</text>
|
||||
<color_swatch name="BeamColor_Preview" tool_tip="Rəng seçimini açmaq üçün toxunun" />
|
||||
<text name="beamcolor_text2">
|
||||
|
|
|
|||
|
|
@ -30,11 +30,11 @@
|
|||
<text name="GroupLabel">
|
||||
Qrup:
|
||||
</text>
|
||||
<check_box label="Paylaş" name="share_with_group" tool_tip="Позволить всем участникам выбранной группы получить установленные вам права на этот объект. Для включения ролевых ограничений необходимо произвести сделку."/>
|
||||
<check_box label="Paylaş" name="share_with_group" tool_tip="Seçilmiş qrupun bütün üzvlərinə bu obyektdə təyin etdiyiniz hüquqları almağa icazə verin. Rol məhdudiyyətlərini aktivləşdirmək üçün müqavilə bağlamalısınız."/>
|
||||
<text name="AnyoneLabel">
|
||||
Hamısı:
|
||||
</text>
|
||||
<check_box label="Köçürt" name="everyone_copy" tool_tip="Копию объекта может взять любой желающий. Объект и все его содержимое должны копироваться и передаваться."/>
|
||||
<check_box label="Köçürt" name="everyone_copy" tool_tip="Hər kəs obyektin köçürtməsin götürə bilər. Obyekt və onun bütün məzmunu köçürülə və paylaşıla bilməlidir."/>
|
||||
<text left="200" name="NextOwnerLabel">
|
||||
Yeni Sahibi:
|
||||
</text>
|
||||
|
|
|
|||
|
|
@ -103,7 +103,7 @@ Daha kiçik bir sahə seçməyə çalışın.
|
|||
</floater.string>
|
||||
<floater.string name="info_price_string">
|
||||
L$ [PRICE]
|
||||
(L$ [PRICE_PER_SQM]/м²)
|
||||
(L$ [PRICE_PER_SQM]/m²)
|
||||
[SOLD_WITH_OBJECTS]
|
||||
</floater.string>
|
||||
<floater.string name="insufficient_land_credits">
|
||||
|
|
@ -181,7 +181,7 @@ Daha kiçik bir sahə seçməyə çalışın.
|
|||
</text>
|
||||
<text name="info_price">
|
||||
L$ 1500
|
||||
(L$ 1,1/м²)
|
||||
(L$ 1,1/m²)
|
||||
obyektlər daxil satılıb
|
||||
</text>
|
||||
<text name="info_action">
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@
|
|||
<check_box label="İndi t. et" name="apply_immediate" width="100" />
|
||||
<button label="LSL köç."
|
||||
tool_tip="Rəng dəyərini <r, g, b>. formatda LSL rəng vektoruna köçürdür" name="copy_lsl_btn" width="80" />
|
||||
<button label="ОК" label_selected="ОК" name="select_btn"/>
|
||||
<button label="OK" label_selected="OK" name="select_btn"/>
|
||||
<button label="Ləğv et" label_selected="Ləğv et" name="cancel_btn"/>
|
||||
<text name="Current color:">
|
||||
^ Cari rəng ^
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
Qrafikanın öncədən təyinini sil
|
||||
</string>
|
||||
<string name="title_camera">
|
||||
Камеры Kameranın öncədən təyinini sil
|
||||
Kameranın öncədən təyinini sil
|
||||
</string>
|
||||
<text name="Preset">
|
||||
Öncədən təyini seçin
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@
|
|||
<panel name="edit_scrolling_panel">
|
||||
<text name="edit_experience_title_label" value="Adı:"/>
|
||||
<text name="edit_experience_desc_label" value="Təsviri:"/>
|
||||
<button name="Group_btn" label="Группа"/>
|
||||
<button name="Group_btn" label="Qrup"/>
|
||||
<text name="edit_ContentRating">
|
||||
Reytinq:
|
||||
</text>
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<floater name="avatarrendersettings" title="Исключения отображения аватара">
|
||||
<floater name="avatarrendersettings" title="Avatar göstərmə istisnaları">
|
||||
<floater.string name="av_render_never">Heç vaxt</floater.string>
|
||||
<floater.string name="av_render_always">Tam olaraq</floater.string>
|
||||
<filter_editor label="Фильтр аватаров" name="filter_input" />
|
||||
<filter_editor label="Avatar süzgəci" name="filter_input" />
|
||||
<menu_button name="plus_btn" tool_tip="Siyahıya yeni şəxs əlavə et"/>
|
||||
<name_list name="avatar_list">
|
||||
<name_list.columns label="Ad" name="name" />
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@
|
|||
<menu_button name="gear_btn" tool_tip="Əlavə seçimlər"/>
|
||||
<button name="new_gesture_btn" tool_tip="Yeni jest yarat"/>
|
||||
<button name="activate_btn" tool_tip="Seçilmiş jesti aktivləşdirin/deaktiv et"/>
|
||||
<check_box label="Только активные" name="FSShowOnlyActiveGestures" width="150"/>
|
||||
<check_box label="Yalnız aktiv" name="FSShowOnlyActiveGestures" width="150"/>
|
||||
<button name="del_btn" tool_tip="Bu jesti sil"/>
|
||||
</panel>
|
||||
<button label="Dəyişdir" name="edit_btn" tool_tip="Seçilmiş jesti dəyişdirmək üçün pəncərəni açır."/>
|
||||
|
|
|
|||
|
|
@ -63,12 +63,12 @@
|
|||
<text name="target_avatar_name">
|
||||
(xarakter yoxdur)
|
||||
</text>
|
||||
<button label="Xarici torpaqda skriptlərlə xarakter obyektlərini silin" label_selected="Xarici ölkədə skriptlərlə xarakter obyektlərini silin" name="Delete Target's Scripted Objects On Others Land" tool_tip="Удаление всех объектов со скриптами, принадлежащих персонажу, на земле, не принадлежащей персонажу. «Не копируемые» объекты будут возвращены."/>
|
||||
<button label="*Bütün* ərazilərdə skriptlərlə simvol obyektlərini silin" label_selected="*Bütün* ərazilərdə skriptlərlə simvol obyektlərini silin" name="Delete Target's Scripted Objects On *Any* Land" tool_tip="Удаление всех объектов со скриптами, принадлежащих персонажу, в этом регионе. «Не копируемые» объекты будут возвращены."/>
|
||||
<button label="*BÜTÜN* xarakter obyektlərini silin" label_selected="*BÜTÜN* xarakter obyektlərini silin" name="Delete *ALL* Of Target's Objects" tool_tip="Удаление всех объектов, принадлежащих персонажу, в этом регионе. «Не копируемые» объекты будут возвращены."/>
|
||||
<button label="Toqquşmaların ən fəal iştirakçıları" label_selected="Toqquşmaların ən fəal iştirakçıları" name="Get Top Colliders" tool_tip="Список объектов, для которых наблюдается больше всего детализированных обратных вызовов" width="260"/>
|
||||
<button label="Ən yaxşı skriptləri yükləyin" label_selected="Ən yaxşı skriptləri yükləyin" name="Get Top Scripts" tool_tip="Список объектов, в которых скрипты выполняются дольше всего" width="200"/>
|
||||
<button label="Skript Xülasəsi" label_selected="Skript Xülasəsi" name="Scripts digest" tool_tip="Список всех скриптов с числом использований по каждому из них" width="160"/>
|
||||
<button label="Xarici torpaqda skriptlərlə xarakter obyektlərini silin" label_selected="Xarici regionda skriptlərlə xarakter obyektlərini silin" name="Delete Target's Scripted Objects On Others Land" tool_tip="Hədəfin sahibi olmayan torpaqda hədəfə məxsus bütün skript obyektlərini silin. Köçürülə bilməyən obyektlər geri qaytarılacaq."/>
|
||||
<button label="*Bütün* ərazilərdə skriptlərlə simvol obyektlərini silin" label_selected="*Bütün* ərazilərdə skriptlərlə simvol obyektlərini silin" name="Delete Target's Scripted Objects On *Any* Land" tool_tip="Bu bölgədəki hədəfə məxsus bütün skript obyektlərini silin. Köçürülə bilməyən obyektlər geri qaytarılacaq."/>
|
||||
<button label="*BÜTÜN* xarakter obyektlərini silin" label_selected="*BÜTÜN* xarakter obyektlərini silin" name="Delete *ALL* Of Target's Objects" tool_tip="Bu bölgədəki hədəfə məxsus bütün obyektləri silin. Köçürülə bilməyən obyektlər geri qaytarılacaq."/>
|
||||
<button label="Toqquşmaların ən fəal iştirakçıları" label_selected="Toqquşmaların ən fəal iştirakçıları" name="Get Top Colliders" tool_tip="Ən çox ətraflı geri çağırışlı obyekt siyahısı" width="260"/>
|
||||
<button label="Ən yaxşı skriptləri yükləyin" label_selected="Ən yaxşı skriptləri yükləyin" name="Get Top Scripts" tool_tip="Skriptlərin ən uzun müddət işlədiyi obyektlərin siyahısı" width="200"/>
|
||||
<button label="Skript Xülasəsi" label_selected="Skript Xülasəsi" name="Scripts digest" tool_tip="Bütün skriptlərin siyahısını və hər birinin baş vermə sayını alır" width="160"/>
|
||||
</panel>
|
||||
<panel label="Sorğu" name="request">
|
||||
<text name="Destination:">
|
||||
|
|
|
|||
|
|
@ -1,17 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<floater name="panel_im">
|
||||
<floater.string name="call_btn_start">
|
||||
Conv_toolbar_open_call
|
||||
</floater.string>
|
||||
<floater.string name="call_btn_stop">
|
||||
Conv_toolbar_hang_up
|
||||
</floater.string>
|
||||
<floater.string name="collapseline_icon" value="Conv_collapse_to_one_line"/>
|
||||
<floater.string name="expandline_icon" value="Conv_expand_one_line"/>
|
||||
<floater.string name="collapse_icon" value="Conv_toolbar_collapse"/>
|
||||
<floater.string name="expand_icon" value="Conv_toolbar_expand"/>
|
||||
<floater.string name="tear_off_icon" value="Conv_toolbar_arrow_ne"/>
|
||||
<floater.string name="return_icon" value="Conv_toolbar_arrow_sw"/>
|
||||
<floater.string name="participant_added" value="[NAME] dəvət edildi."/>
|
||||
<floater.string name="multiple_participants_added" value="[NAME] dəvət edildilər."/>
|
||||
<floater.string name="tooltip_to_separate_window" value="Bu söhbəti ayrı bir pəncərədə aç"/>
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
Təsviri:
|
||||
</text>
|
||||
<text name="preview_label">
|
||||
Şəkilin göstərmə üsulu:
|
||||
Göstərmə üsulu:
|
||||
</text>
|
||||
<combo_box label="Geyim növü" name="clothing_type_combo">
|
||||
<item label="Şəkil" name="Image" value="Şəkil"/>
|
||||
|
|
@ -23,9 +23,11 @@
|
|||
</combo_box>
|
||||
<text name="bad_image_text">
|
||||
Şəkil oxudula bilmədi.
|
||||
|
||||
Şəkili 24-bit TGA faylı olaraq saxlayıb yenidən yoxlayın.
|
||||
</text>
|
||||
<check_box label="İtkisiz sıxlaşdırmadan istifadə et" name="lossless_check"/>
|
||||
<check_box label="İtkisiz şıxlaşdırma" name="lossless_check"/>
|
||||
<check_box name="temp_check" label="Müvəqqəti. (pulsuz)" tool_tip="O, serverdəki şəkli müvəqqəti və buna görə də pulsuz olaraq təyin edir, lakin o, yalnız qısa müddət ərzində mövcud olacaq - bundan sonra o, silinəcək." />
|
||||
<button label="Ləğv et" name="cancel_btn"/>
|
||||
<button label="Yüklə (L$[AMOUNT])" name="ok_btn"/>
|
||||
</floater>
|
||||
|
|
@ -8,9 +8,9 @@
|
|||
<text name="LabelItemNameTitle">Adı:</text>
|
||||
<text name="LabelItemDescTitle">Təsviri:</text>
|
||||
<text name="LabelCreatorTitle">Yaradıcı:</text>
|
||||
<button label="Профиль…" name="BtnCreator"/>
|
||||
<button label="Profil…" name="BtnCreator"/>
|
||||
<text name="LabelOwnerTitle">Sahibi:</text>
|
||||
<button label="Профиль…" name="BtnOwner"/>
|
||||
<button label="Profil…" name="BtnOwner"/>
|
||||
<text name="LabelAcquiredTitle">Alınıb:</text>
|
||||
<text name="LabelAcquiredDate">Ç. 24 May 12:50:46 2006</text>
|
||||
<text name="LabelItemExperienceTitle">Macəra:</text>
|
||||
|
|
|
|||
|
|
@ -14,8 +14,8 @@
|
|||
<spinner label="Fırlanma oxu" name="JoystickAxis3"/>
|
||||
<spinner label="Miqyas oxu" name="JoystickAxis6"/>
|
||||
<check_box label="Miqyaslama" name="ZoomDirect"/>
|
||||
<check_box label="3D kursoru" name="Cursor3D" left="320" />
|
||||
<check_box label="Avtomatik səviyyələndirmə" name="AutoLeveling"/>
|
||||
<check_box label="3D kursor" name="Cursor3D" left="280" />
|
||||
<check_box label="Avtomatik səviyyələndirmə" name="AutoLeveling" left="370"/>
|
||||
<text name="Control Modes:">
|
||||
Idarə etmə rejimləri:
|
||||
</text>
|
||||
|
|
|
|||
|
|
@ -265,7 +265,7 @@
|
|||
<panel name="weights_and_warning_panel">
|
||||
<button label="Çəki və haqqı hesablayın" name="calculate_btn" tool_tip="Çəki və haqqı hesablayın"/>
|
||||
<button label="Ləğv et" name="cancel_btn"/>
|
||||
<button label="Yüklə" name="ok_btn" tool_tip="Загрузить в симулятор"/>
|
||||
<button label="Yüklə" name="ok_btn" tool_tip="Simulyatora yüklə"/>
|
||||
<button label="Seçimləri silin və formanı sıfırlayın" name="reset_btn"/>
|
||||
<!-- ========== WEIGHTS ==========-->
|
||||
<text name="upload_fee">Qiymət: L$ [FEE]</text>
|
||||
|
|
|
|||
|
|
@ -103,10 +103,10 @@
|
|||
</panel>
|
||||
<panel label="Yolu yoxla" name="test_panel">
|
||||
<text name="ctrl_click_label">
|
||||
Başlanqıc nöqtəsini seçmək üçün Ctrl-toxunuş
|
||||
Başlanqıc nöqtəsi üçün Ctrl-toxunuş
|
||||
</text>
|
||||
<text name="shift_click_label">
|
||||
Sonuncu nöqtəni seçmək üçün Shift-toxunuş
|
||||
Son nöqtəsi üçün Shift-toxunuş
|
||||
</text>
|
||||
<text name="character_width_label">
|
||||
Avatar genişliyi
|
||||
|
|
|
|||
|
|
@ -165,7 +165,7 @@
|
|||
D
|
||||
</text>
|
||||
<line_editor name="edit_d_value" tool_tip="D növlü xarakterlər üçün keçilə bilməsi. Xarakter nümunəsi - fərqli."/>
|
||||
<button label="Применить изменения" name="apply_edit_values"/>
|
||||
<button label="Dəyişikləri tətbiq et" name="apply_edit_values"/>
|
||||
<text name="suggested_use_a_label">
|
||||
(Humanoid)
|
||||
</text>
|
||||
|
|
|
|||
|
|
@ -10,6 +10,6 @@
|
|||
<check_box label="köçürtmək" name="next_owner_copy"/>
|
||||
<check_box initial_value="true" label="satmaq/paylaşmaq" name="next_owner_transfer"/>
|
||||
</panel>
|
||||
<button label="ОК" label_selected="ОК" name="ok"/>
|
||||
<button label="OK" label_selected="OK" name="ok"/>
|
||||
<button label="Ləğv et" label_selected="Ləğv et" name="cancel"/>
|
||||
</floater>
|
||||
|
|
|
|||
|
|
@ -459,8 +459,8 @@
|
|||
</text>
|
||||
<slider_bar name="SB_Roll" width="110"/>
|
||||
<button name="Reset_Roll" label="S" tool_tip="Susmaya görə olan vəziyyətə qaytarın."/>
|
||||
<text name="T_Zoom_Speed" tool_tip="Ölçünün sürət həssaslığını tənzimləyir. Əgər dəqiqliklə hərəkət etmək çətindirsə, daha aşağı dəyərlər istifadə edin." width="100">
|
||||
Yaxınlaşdırma tezliyi
|
||||
<text name="T_Zoom_Speed" tool_tip="Yaxınlaşdırmanın sürət həssaslığını tənzimləyir. Əgər dəqiqliklə hərəkət etmək çətindirsə, daha aşağı dəyərlər istifadə edin." width="100">
|
||||
Yaxınlaşdır.sürəti
|
||||
</text>
|
||||
<slider_bar name="SB_Zoom_Speed" width="110"/>
|
||||
<button name="Reset_Zoom_Speed" label="S" tool_tip="Susmaya görə olan vəziyyətə qaytarın."/>
|
||||
|
|
@ -533,11 +533,11 @@
|
|||
</panel>
|
||||
</panel>
|
||||
|
||||
<panel name="P_Misc" label="Разное">
|
||||
<panel name="P_Misc" label="Əlavə">
|
||||
<panel name="P_Misc_Settings">
|
||||
<check_box label="Avatar kliklənməsi kameranın yerləşməsini saxlayır" name="clickonavatarkeepscamera"
|
||||
<check_box label="Avatar kliklənməsi kameranın yerləşməsini saxla" name="clickonavatarkeepscamera"
|
||||
tool_tip="Adətən avatar üzərinə basmaqla kameranın yerləşməsi sıfırlanır. Bu seçim bu davranışı düzəldir."/>
|
||||
<check_box label="Teleportdan sonra kamera yerləşməsini sıfırla" name="FSResetCameraOnTP"
|
||||
<check_box label="Tp-dan sonra kamera yerləşməsini sıfırla" name="FSResetCameraOnTP"
|
||||
tool_tip="Bir qayda olaraq, teleportasiya zamanı (region daxilində) kamera yerləşməsi sıfırlanır. Bu seçim bu davranışın qarşısını alır."/>
|
||||
<check_box label="Minimum kamera məsafəsini deaktiv edin" name="disableminzoomdist"
|
||||
tool_tip="Kamera və obyekt arasında ən yaxın məsafə məhdudiyyətini söndürür."/>
|
||||
|
|
|
|||
|
|
@ -78,23 +78,23 @@
|
|||
<text name="T_Zoom" tool_tip="Real mənada bu, yaxınlaşdırma funksiyasıdır. Bu, görünüş pəncərəsindəki baxış sahəsini dəyişəcək. Bu, Ctrl+0 və ya Ctrl+8 düymələrini basmaqla eynidir. QEYD. Əgər siz flycam-ı (3D SpacenNavigator) aktiv etmisinizsə, bu işləməyəcək.">
|
||||
Baxış bucağı
|
||||
</text>
|
||||
<button name="Reset_Camera_Angle" label="С" tool_tip="Susmaya görə olan vəziyyətə qaytarın."/>
|
||||
<button name="Reset_Camera_Angle" label="S" tool_tip="Susmaya görə olan vəziyyətə qaytarın."/>
|
||||
<text name="T_Zoom_Speed" tool_tip="Controls how fast/slow the camera will zoom in and out. Higher values produce slower and smother zoom.">
|
||||
Sür. miqyas
|
||||
</text>
|
||||
<button name="Reset_Zoom_Time" label="С" tool_tip="Susmaya görə olan vəziyyətə qaytarın."/>
|
||||
<button name="Reset_Zoom_Time" label="S" tool_tip="Susmaya görə olan vəziyyətə qaytarın."/>
|
||||
<text name="T_Camera_Lag" tool_tip="Avatar hərəkətindən kamera gecikməsi dəyəri (0 = heç biri, 30 = avatar sürəti).">
|
||||
Gecikmə
|
||||
</text>
|
||||
<button name="Reset_Camera_Lag" label="С" tool_tip="Susmaya görə olan vəziyyətə qaytarın."/>
|
||||
<button name="Reset_Camera_Lag" label="S" tool_tip="Susmaya görə olan vəziyyətə qaytarın."/>
|
||||
<text name="T_Camera_Offset" tool_tip="Kameranın defolt baxış nöqtəsindən nə qədər uzaqlaşdığına/sürüşdürülməsinə nəzarət edir.">
|
||||
Sürüşdürmə
|
||||
</text>
|
||||
<button name="Reset_Camera_Offset" label="С" tool_tip="Susmaya görə olan vəziyyətə qaytarın."/>
|
||||
<button name="Reset_Camera_Offset" label="S" tool_tip="Susmaya görə olan vəziyyətə qaytarın."/>
|
||||
<text name="T_Camera_Smoothing" tool_tip="Kameranın nə qədər hamar sürətlənməsinə və dayanmasına nəzarət edir. Daha yüksək dəyərlər daha hamar (və bir qədər yavaş) hərəkət verir.">
|
||||
Hamalaşdırma
|
||||
</text>
|
||||
<button name="Reset_Camera_Smoothing" label="С" tool_tip="Susmaya görə olan vəziyyətə qaytarın."/>
|
||||
<button name="Reset_Camera_Smoothing" label="S" tool_tip="Susmaya görə olan vəziyyətə qaytarın."/>
|
||||
</panel>
|
||||
</panel>
|
||||
|
||||
|
|
@ -123,7 +123,7 @@
|
|||
<panel name="P_Add_Cam_Opt_Settings">
|
||||
<check_box name="clickonavatarkeepscamera" label="Kamera yerləşməsini yadda saxlayın"
|
||||
tool_tip="Adətən avatarın üzərinə basmaqla kameranın yerləşməsi sıfırlanır. Bu seçim bu davranışı düzəldir."/>
|
||||
<check_box name="FSResetCameraOnTP" label="Teleportdan sonra kamera yerləşməsini sıfırlayın"
|
||||
<check_box name="FSResetCameraOnTP" label="Tp-dan sonra kamera yerləşməsini sıfırlayın"
|
||||
tool_tip="Bir qayda olaraq, teleportasiya zamanı (region daxilində) kameranın yerləşməsi sıfırlanır. Bu seçim bu davranışın qarşısını alır."/>
|
||||
<check_box name="disableminzoomdist" label="Minimum məsafəni söndürün"
|
||||
tool_tip="Obyektə ən yaxın kamera məsafəsi ilə bağlı məhdudiyyəti söndürür."/>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<floater name="prefs_graphics_advanced" title="Расширенные настройки графики">
|
||||
<floater name="prefs_graphics_advanced" title="Əlavə qrafika seçimləri">
|
||||
<text name="GeneralText">
|
||||
Ümumi
|
||||
</text>
|
||||
|
|
@ -20,7 +20,7 @@
|
|||
<text name="IndirectMaxComplexityText">
|
||||
0
|
||||
</text>
|
||||
<slider label="Maksimum Həcmli Sayı:" name="IndirectMaxNonImpostors"/>
|
||||
<slider label="Maksimum Avatar Sayı:" name="IndirectMaxNonImpostors"/>
|
||||
<text name="IndirectMaxNonImpostorsText">
|
||||
0
|
||||
</text>
|
||||
|
|
@ -42,8 +42,8 @@
|
|||
(az = daha parlaq, 0 – susmaya görə parlaqlıq)
|
||||
</text>
|
||||
<check_box label="Anizatrop filtrasiya (aktiv olanda daha gec olur)" name="ani"/>
|
||||
<check_box label="Разрешить сжатие текстур (yenidən başlatmalar tələb olunur)" name="texture compression" tool_tip="Сжатие текстур в видеопамяти, что позволяет загружать текстуры большего размера за счет некоторого падения качества цвета."/>
|
||||
<check_box label="Включить поддержку HiDPI дисплея (yenidən başlatma tələb olunur)" name="use HiDPI" tool_tip="Разрешить OpenGL отображение с высоким разрешением."/>
|
||||
<check_box label="Tekstur sıxlaşdırması (yen.başlatma tələb olunur)" name="texture compression" tool_tip="Video yaddaşda teksturların sıxılması. Rəng keyfiyyətində müəyyən itkilər hesabına daha böyük teksturaları yükləməyə imkan verir."/>
|
||||
<check_box label="HiDPI displey dəstəyi (yen. başlatma tələb olunur)" name="use HiDPI" tool_tip="OpenGL-in yüksək nisbət ilə göstərilməsinə icazə verir."/>
|
||||
<text name="antialiasing label">
|
||||
Hamarlaşdırma:
|
||||
</text>
|
||||
|
|
@ -72,7 +72,7 @@
|
|||
<text name="ObjectMeshDetailText">
|
||||
Aşağı
|
||||
</text>
|
||||
<slider label="Гибкие примитивы:" name="FlexibleMeshDetail"/>
|
||||
<slider label="Çevik primitivlər:" name="FlexibleMeshDetail"/>
|
||||
<text name="FlexibleMeshDetailText">
|
||||
Aşağı
|
||||
</text>
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@
|
|||
<radio_item label="HTTP proxy istifadə et" name="OtherHTTPProxy" tool_tip="Veb səhifələrə daxil olarkən HTTP proxy istifadə edilsin." value="Veb"/>
|
||||
<radio_item label="SOCKS 5 server istifadə et" name="OtherSocksProxy" tool_tip="Veb saytlarla bağlı olmayan HTTP trafiki SOCKS 5 serverindən keçirilsin." value="SOCKS"/>
|
||||
</radio_group>
|
||||
<button label="ОК" label_selected="ОК" name="OK"/>
|
||||
<button label="OK" label_selected="OK" name="OK"/>
|
||||
<button label="Ləğv et" label_selected="Ləğv et" name="Cancel"/>
|
||||
</floater>
|
||||
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@
|
|||
<text right="-128" name="aspect_ratio" width="128">
|
||||
Önizləmə
|
||||
</text>
|
||||
<combo_box width="100" name="combo_aspect_ratio" tool_tip="Предварительный просмотр с фиксированным соотношением сторон">
|
||||
<combo_box width="100" name="combo_aspect_ratio" tool_tip="Sabit aspekt nisbətində önizləmə">
|
||||
</combo_box>
|
||||
</panel>
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<floater name="search replace" title="Axtar / Əvəz et">
|
||||
<check_box label="Böyük kiçik hərflərə diqqət etmə" left="50" name="case_text" width="140" />
|
||||
<check_box label="Registeri nəzərə al" left="18" name="case_text" width="120" />
|
||||
<check_box label="Yuxarıdan aşağıya axtar" name="find_previous" />
|
||||
<button label="Axtar" label_selected="Axtar" name="search_btn" />
|
||||
<button label="Əvəz et" label_selected="Əvəz et" name="replace_btn" />
|
||||
|
|
|
|||
|
|
@ -72,7 +72,7 @@
|
|||
</panel>
|
||||
</view>
|
||||
<text name="image_res_text">
|
||||
[WIDTH] (en) x [HEIGHT] (hündürlük) пикс.
|
||||
[WIDTH] (en) x [HEIGHT] (hündürlük) piks.
|
||||
</text>
|
||||
<text name="file_size_label">
|
||||
[SIZE] KB
|
||||
|
|
|
|||
|
|
@ -8,22 +8,21 @@
|
|||
Telehub qoşulmamışdır.
|
||||
</text>
|
||||
<text name="help_text_connected">
|
||||
Qaldırmaq üçün "Qoşulmamış" düyməsini basın.
|
||||
Ayırılmaq üçün "Ayır" düyməsini basın.
|
||||
</text>
|
||||
<text name="help_text_not_connected">
|
||||
Obyekti seçin və "Telehuba qoşul" düyməsini basın.
|
||||
</text>
|
||||
<button label="Telehuba qoşul" name="connect_btn"/>
|
||||
<button label="Qoşulmamış" name="disconnect_btn"/>
|
||||
<button label="Ayır" name="disconnect_btn"/>
|
||||
<text name="spawn_points_text">
|
||||
Görünmə nöqtələri (obyektlər deyil, ancaq mövqeylər):
|
||||
Gəliş nöqtələri (obyektlər deyil, ancaq mövqeylər):
|
||||
</text>
|
||||
<button label="Görünmə nöqtəsi əlavə et" name="add_spawn_point_btn"/>
|
||||
<button label="Görünmə nöqtəsini sil" name="remove_spawn_point_btn"/>
|
||||
<button label="Gəliş nöqtəsi əlavə et" name="add_spawn_point_btn" width="140"/>
|
||||
<button label="Gəliş nöqtəsini sil" name="remove_spawn_point_btn"/>
|
||||
<text name="spawn_point_help">
|
||||
Pozisiyayı göstərmək üçün obyekti seçin və "Görünmə nöqtəsi əlavə et" düyməsini basın.
|
||||
Sonra obyekti köçürə və ya silə bilərsiniz.
|
||||
Pozisiyalar telehubun mərkəzi ilə əlaqəlidir.
|
||||
Seçilmiş bir şeyi dünyada vurğulamaq üçün siyahıdan elementi seçin.
|
||||
Yerləşməni göstərmək üçün obyekti seçin və "Əlavə et" düyməsini basın. Sonra obyekti köçürə və ya silə bilərsiniz.
|
||||
Yerləşmələr telehubun mərkəzi ilə əlaqəlidir.
|
||||
Seçilmiş bir şeyi dünyada vurğulamaq üçün bir obyekt seçin.
|
||||
</text>
|
||||
</floater>
|
||||
|
|
|
|||
|
|
@ -277,21 +277,21 @@
|
|||
<text name="label position">
|
||||
Yerləşim (metr)
|
||||
</text>
|
||||
<button name="copy_pos_btn" label="К" tool_tip="Yerləşməni köçürt"/>
|
||||
<button name="paste_pos_btn" label="В" tool_tip="Yerləşməni yapışdır"/>
|
||||
<button name="paste_pos_clip_btn" label="в" tool_tip="Yerləşməni buferdən daxil et"/>
|
||||
<button name="copy_pos_btn" label="K" tool_tip="Yerləşməni köçürt"/>
|
||||
<button name="paste_pos_btn" label="Y" tool_tip="Yerləşməni yapışdır"/>
|
||||
<button name="paste_pos_clip_btn" label="y" tool_tip="Yerləşməni buferdən daxil et"/>
|
||||
<text name="label size">
|
||||
Ölçü (metr)
|
||||
</text>
|
||||
<button name="copy_size_btn" label="К" tool_tip="Ölçünü köçürt"/>
|
||||
<button name="paste_size_btn" label="В" tool_tip="Ölçünü yapışdır"/>
|
||||
<button name="paste_size_clip_btn" label="в" tool_tip="Ölçünü buferdən daxil et"/>
|
||||
<button name="copy_size_btn" label="K" tool_tip="Ölçünü köçürt"/>
|
||||
<button name="paste_size_btn" label="Y" tool_tip="Ölçünü yapışdır"/>
|
||||
<button name="paste_size_clip_btn" label="y" tool_tip="Ölçünü buferdən daxil et"/>
|
||||
<text name="label rotation">
|
||||
Döngə (dərəcə)
|
||||
</text>
|
||||
<button name="copy_rot_btn" label="К" tool_tip="Döngəni köçürt"/>
|
||||
<button name="paste_rot_btn" label="В" tool_tip="Döngəni yapışdır"/>
|
||||
<button name="paste_rot_clip_btn" label="в" tool_tip="Döngəni buferdən daxil et"/>
|
||||
<button name="copy_rot_btn" label="K" tool_tip="Döngəni köçürt"/>
|
||||
<button name="paste_rot_btn" label="Y" tool_tip="Döngəni yapışdır"/>
|
||||
<button name="paste_rot_clip_btn" label="y" tool_tip="Döngəni buferdən daxil et"/>
|
||||
<button label="Köçürt" name="copy_params_btn" tool_tip="Seçimləri buferə köçürt"/>
|
||||
<button label="Yapışdır" name="paste_params_btn" tool_tip="Seçimləri buferdən yapışdır"/>
|
||||
<combo_box name="comboBaseType">
|
||||
|
|
@ -577,7 +577,7 @@ Aşğ. ↔ Əaşğ.
|
|||
Sahə: [AREA] m²
|
||||
</text>
|
||||
<button label="Torpaq haqqında" label_selected="Torpaq haqqında" name="button about land"/>
|
||||
<check_box label="Показать владельцев" name="checkbox show owners" tool_tip="Цвет участка в зависимости от типа владения: Зеленый = ваша земля Голубой = земля вашей группы Красный = чужая земля Желтый = для продажи Фиолетовый = для аукциона Серый = общая"/>
|
||||
<check_box label="Sahibləri göstər" name="checkbox show owners" tool_tip="Mülkiyyət növündən asılı olaraq sahə rəngi: Yaşıl = torpağınızdır Göy = qrupunuzun torpağı Qırmızı = yad torpaq Sarı = satış üçün Bənövşəyi = hərrac üçün Boz = ümumi"/>
|
||||
<text name="label_parcel_modify">
|
||||
Sahəni dəyişdir
|
||||
</text>
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@
|
|||
URL-ünvanlar
|
||||
</floater.string>
|
||||
<floater.string name="memory">
|
||||
Yaddaş (КБ)
|
||||
Yaddaş (KB)
|
||||
</floater.string>
|
||||
<text name="title_text">
|
||||
Yüklənir...
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@
|
|||
<text name="external_tos_required">
|
||||
Davam etmək üçün https://my.secondlife.com saytına daxil olun, hesabınıza giriş edin və Xidmət Şərtlərini qəbul edin. Təşəkkürlər!
|
||||
</text>
|
||||
<check_box label="" name="agree_chk"/>
|
||||
<check_box label="Oxudum və razılaşdım" name="agree_chk"/>
|
||||
<text name="agree_list">
|
||||
Mən Second Life istifadəçi müqaviləsinin, münaqişələrin həllinə dair şərtlərin və konfidensiallığa dair tələblərinin, həmçinin qrup və ya sinif tələblərinin münaqişələrin həlli üçün imtina edilməsini qəbul edirəm.
|
||||
</text>
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
Bing appID açarı təsdiqlənməyib. Yenidən cəhd edin.
|
||||
</string>
|
||||
<string name="google_api_key_not_verified">
|
||||
Ключ Google API açarı təsdiqlənməyib. Yenidən cəhd edin.
|
||||
Google API açarı təsdiqlənməyib. Yenidən cəhd edin.
|
||||
</string>
|
||||
<string name="bing_api_key_verified">
|
||||
Bing appID açarı təsdiqlənib.
|
||||
|
|
@ -45,11 +45,11 @@
|
|||
<text name="bing_api_key_label">
|
||||
Bing [http://www.bing.com/developers/createapp.aspx AppID]:
|
||||
</text>
|
||||
<!-- <button label="Подтвердить" name="verify_bing_api_key_btn"/> -->
|
||||
<button label="Təsdiq et" name="verify_bing_api_key_btn"/>
|
||||
<text name="google_api_key_label">
|
||||
Google [http://code.google.com/apis/language/translate/v2/getting_started.html#auth API açarı]:
|
||||
</text>
|
||||
<!-- <button label="Подтвердить" name="verify_google_api_key_btn"/> -->
|
||||
<button label="Təsdiq et" name="verify_google_api_key_btn"/>
|
||||
<text name="google_links_text">
|
||||
[http://code.google.com/apis/language/translate/v2/pricing.html Qiymətlər] | [https://code.google.com/apis/console Statistika]
|
||||
</text>
|
||||
|
|
|
|||
|
|
@ -106,7 +106,7 @@
|
|||
Roxanne
|
||||
</string>
|
||||
<string name="effect_Rumble">
|
||||
Урчание
|
||||
Bozarma
|
||||
</string>
|
||||
<string name="effect_Sabrina">
|
||||
Sabrina
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@
|
|||
<menu_item_call label="Skeleti sıfırla" name="Reset Skeleton"/>
|
||||
<menu_item_call label="Skelet və animasiyanı sıfırla" name="Reset Skeleton And Animations"/>
|
||||
<menu_item_call label="Meş LOD sıfırlanması" name="Reset Mesh LOD" />
|
||||
<context_menu label="Управление" name="Annoyance">
|
||||
<context_menu label="İdarə" name="Annoyance">
|
||||
<menu_item_call label="Blokla" name="Avatar Mute"/>
|
||||
<menu_item_call label="Blokdan çıxart" name="Avatar Unmute"/>
|
||||
<menu_item_call label="Şikayət" name="abuse"/>
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@
|
|||
<context_menu label="Moderator seçimləri" name="Moderator Options">
|
||||
<menu_item_call label="Mətni söhbətə icazə ver" name="AllowTextChat"/>
|
||||
<menu_item_call label="Mətni söhbəti qadağan et" name="ForbidTextChat"/>
|
||||
<menu_item_call label="Səsli söhbəti qadağan et"name="ModerateVoiceMuteSelected"/>
|
||||
<menu_item_call label="Səsli söhbəti qadağan et" name="ModerateVoiceMuteSelected"/>
|
||||
<menu_item_call label="Səsli söhbətə icazə ver" name="ModerateVoiceUnMuteSelected"/>
|
||||
</context_menu>
|
||||
<menu_item_call label="Qadağan et" name="BanMember"/>
|
||||
|
|
|
|||
|
|
@ -24,5 +24,5 @@
|
|||
<menu_item_check label="Tam adı: Göstərilən adı (İstifadəçi adı) kimi" name="format_displayname_username" />
|
||||
<menu_item_check label="Axtarış filterini göstər" name="friend_filter" />
|
||||
</menu>
|
||||
<menu_item_check label="Статус онлайн для друзей" name="GlobalOnlineStatusToggle" />
|
||||
<menu_item_check label="Dostlar üçün daxilolma statusu" name="GlobalOnlineStatusToggle" />
|
||||
</context_menu>
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@
|
|||
<menu_item_call label="Yeni əlcəklər" name="New Gloves"/>
|
||||
<menu_item_call label="Yeni mayka" name="New Undershirt"/>
|
||||
<menu_item_call label="Yenu tuman" name="New Underpants"/>
|
||||
<menu_item_call label="Yeni alfaа" name="New Alpha"/>
|
||||
<menu_item_call label="Yeni alfa" name="New Alpha"/>
|
||||
<menu_item_call label="Yeni fizika" name="New Physics"/>
|
||||
<menu_item_call label="Yeni döymə" name="New Tattoo"/>
|
||||
</menu>
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<menu name="IMChiclet P2P Menu">
|
||||
<menu_item_call label="Profili göstər" name="Show Profile"/>
|
||||
<menu_item_call label="Dost əlavə et"name="Add Friend"/>
|
||||
<menu_item_call label="Dost əlavə et" name="Add Friend"/>
|
||||
<menu_item_call label="Sessiyanı göstər" name="Send IM"/>
|
||||
<menu_item_call label="Sessiyanı bitir" name="End Session"/>
|
||||
</menu>
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@
|
|||
<menu_item_call label="Don" name="Skirt"/>
|
||||
<menu_item_call label="Ayaqqabı" name="Shoes"/>
|
||||
<menu_item_call label="Corablar" name="Socks"/>
|
||||
<menu_item_call label="Куртку" name="Jacket"/>
|
||||
<menu_item_call label="Pencək" name="Jacket"/>
|
||||
<menu_item_call label="Əlcəklər" name="Gloves"/>
|
||||
<menu_item_call label="Mayka" name="Self Undershirt"/>
|
||||
<menu_item_call label="Tuman" name="Self Underpants"/>
|
||||
|
|
@ -18,7 +18,7 @@
|
|||
<menu_item_call label="Bütün paltarı" name="All Clothes"/>
|
||||
</context_menu>
|
||||
<context_menu label="Ayır" name="Inspect Self Detach"/>
|
||||
<menu_item_call label="Отделить все" name="Detach All"/>
|
||||
<menu_item_call label="Hamısını ayır" name="Detach All"/>
|
||||
</context_menu>
|
||||
<menu_item_call label="Geyimi dəyiş" name="Chenge Outfit"/>
|
||||
<menu_item_call label="Geyimi dəyişdir" name="Edit Outfit"/>
|
||||
|
|
|
|||
|
|
@ -111,7 +111,7 @@
|
|||
<menu_item_call label="İM Göndər" name="Send Instant Message"/>
|
||||
<menu_item_call label="Teleport təklif et" name="Offer Teleport..."/>
|
||||
<menu_item_call label="Teleport tələb et" name="Request Teleport..."/>
|
||||
<menu_item_call label="Начать конференц чат" name="Conference Chat"/>
|
||||
<menu_item_call label="Konfrans söhbətə başla" name="Conference Chat"/>
|
||||
<menu_item_call label="Aktivləşdirm" name="Activate"/>
|
||||
<menu_item_call label="Deaktivləşdir" name="Deactivate"/>
|
||||
<menu_item_call label="Ayrı saxla" name="Save As"/>
|
||||
|
|
@ -125,8 +125,8 @@
|
|||
<menu_item_call label="Teksturasını yenilə" name="Texture Refresh Attachment" />
|
||||
<menu_item_call label="Özündən ayır" name="Detach From Yourself"/>
|
||||
<menu_item_call label="Çıxart" name="Take Off"/>
|
||||
<menu_item_call name="Settings Apply Local" label="Применить только к себе"/>
|
||||
<menu_item_call name="Settings Apply Parcel" label="Применить к Участку"/>
|
||||
<menu_item_call name="Settings Apply Local" label="Yalnız özümə tətbiq et"/>
|
||||
<menu_item_call name="Settings Apply Parcel" label="Sahəyə tətbiq et"/>
|
||||
<menu_item_call label="Ticarət mərkəzinin məhsul siyahılarına köçürt" name="Marketplace Copy"/>
|
||||
<menu_item_call label="Ticarət mərkəzinin məhsul siyahılarına daşı" name="Marketplace Move"/>
|
||||
<menu_item_call label="--seçim yoxdur--" name="--no options--"/>
|
||||
|
|
|
|||
|
|
@ -40,5 +40,4 @@
|
|||
<menu_item_check label="Heçbiri" name="None"/>
|
||||
</menu>
|
||||
</menu>
|
||||
</menu>
|
||||
</menu_bar>
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
<menu_item_call label="Şəkil çək" name="take_snapshot"/>
|
||||
<menu_item_call label="Şəkili sil" name="remove_photo"/>
|
||||
<context_menu label="Yeni paltar" name="New Clothes">
|
||||
<menu_item_call label="Yeni köynəkа" name="New Shirt"/>
|
||||
<menu_item_call label="Yeni köynək" name="New Shirt"/>
|
||||
<menu_item_call label="Yeni şalvar" name="New Pants"/>
|
||||
<menu_item_call label="Yeni ayaqqabı" name="New Shoes"/>
|
||||
<menu_item_call label="Yeni corablar" name="New Socks"/>
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@
|
|||
<menu_item_call label="Qrupdan çıxart" name="EjectSelected"/>
|
||||
<menu_item_call label="Mətni söhbətə icazə ver" name="AllowTextChat"/>
|
||||
<menu_item_call label="Mətni söhbəti qadağan et" name="ForbidTextChat"/>
|
||||
<menu_item_call label="Səsli söhbəti qadağan et"name="ModerateVoiceMuteSelected"/>
|
||||
<menu_item_call label="Səsli söhbəti qadağan et" name="ModerateVoiceMuteSelected"/>
|
||||
<menu_item_call label="Səsli söhbətə icazə ver" name="ModerateVoiceUnMuteSelected"/>
|
||||
<menu_item_call label="Hamının səsli söhbətini qadağan et" name="ModerateVoiceMute"/>
|
||||
<menu_item_call label="Hamının səsli söhbətinə icazə ver" name="ModerateVoiceUnmute"/>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<toggleable_menu name="menu_blocked_plus">
|
||||
<menu_item_call label="Sakini adı ilə blokla..." name="block_resident_by_name" />
|
||||
<menu_item_call label="Obyekti adına görə blokla..."name="block_object_by_name" />
|
||||
<menu_item_call label="Obyekti adına görə blokla..." name="block_object_by_name" />
|
||||
</toggleable_menu>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<toggleable_menu name="menu_people_contact_sets_add">
|
||||
<menu_item_call label="Dəst əlavə et..." name="add_set" />
|
||||
<menu_item_call label="Kontakt əlavə et..."name="add_contact" />
|
||||
<menu_item_call label="Kontakt əlavə et..." name="add_contact" />
|
||||
</toggleable_menu>
|
||||
|
|
|
|||
|
|
@ -2,5 +2,5 @@
|
|||
<toggleable_menu name="menu_group_plus">
|
||||
<menu_item_check label="Tarixə görə sırala" name="sort_most" />
|
||||
<menu_item_check label="Adına görə sırala" name="sort_name" />
|
||||
<menu_item_check name="view_icons" label="Показать иконки" />
|
||||
<menu_item_check name="view_icons" label="Nişanları göstər" />
|
||||
</toggleable_menu>
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@
|
|||
<pie_slice label="Fizika" name="Self Physics"/>
|
||||
<pie_slice label="Alfa" name="Self Alpha"/>
|
||||
</pie_menu>
|
||||
<pie_slice label="Юбку" name="Skirt"/>
|
||||
<pie_slice label="Don" name="Skirt"/>
|
||||
</pie_menu>
|
||||
<pie_menu name="Pie Object Detach HUD"/>
|
||||
<pie_menu label="Ayır >" name="Pie Object Detach">
|
||||
|
|
@ -50,7 +50,7 @@
|
|||
<pie_slice label="Jestlər..." name="Gestures"/>
|
||||
<pie_menu label="Görünüş >" name="Appearance >">
|
||||
<pie_slice label="Forma" name="Edit My Shape"/>
|
||||
<pie_menu name="ResetMenu" label="Сброс >">
|
||||
<pie_menu name="ResetMenu" label="Sıfırla >">
|
||||
<pie_slice label="Skel. & Anim." name="Reset Skeleton And Animations"/>
|
||||
<pie_slice label="Skelet" name="Reset Skeleton"/>
|
||||
<pie_slice label="Mesh LOD" name="Reset Mesh LOD"/>
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@
|
|||
<pie_slice label="Tekstur.yenilə" name="Texture Refresh"/>
|
||||
<pie_slice label="Skelet" name="Reset Skeleton"/>
|
||||
</pie_menu>
|
||||
<pie_menu name="DerenderMenu" label="Неотображать >">
|
||||
<pie_menu name="DerenderMenu" label="Göstərmə >">
|
||||
<pie_slice label="Həmişə" name="DerenderPermanent"/>
|
||||
<pie_slice label="Müvəqqəti" name="Derender"/>
|
||||
</pie_menu>
|
||||
|
|
|
|||
|
|
@ -1,19 +1,19 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<toggleable_menu name="Avatar Profile Menu">
|
||||
<menu_item_call label="İM" name="im"/>
|
||||
<menu_item_call label="Teleport təklif et" name="offer_teleport"/>
|
||||
<menu_item_call label="Teleport sorğula" name="request_teleport"/>
|
||||
<menu_item_call label="Səsli zəng" name="voice_call"/>
|
||||
<menu_item_call label="Söhbət jurnalına bax..." name="chat_history"/>
|
||||
<menu_item_call label="Dost əlavə et"name="add_friend"/>
|
||||
<menu_item_call label="Dostluqdan sil" name="remove_friend"/>
|
||||
<menu_item_call label="Qrupa dəvət et..." name="invite_to_group"/>
|
||||
<menu_item_call label="İcazələr" name="agent_permissions"/>
|
||||
<menu_item_call label="Xəritə" name="map"/>
|
||||
<menu_item_call label="Paylaş" name="share"/>
|
||||
<menu_item_call label="Ödə" name="pay"/>
|
||||
<menu_item_check label="Blokla/Blokdan çıxart" name="block_unblock"/>
|
||||
<menu_item_call label="Göstərilən adı köçürt" name="copy_display_name"/>
|
||||
<menu_item_call label="İstifadəçi adını köçürt" name="copy_name"/>
|
||||
<menu_item_call label="İdentifikasiyasını köçürt" name="copy_id"/>
|
||||
<menu_item_call label="İM" name="im" />
|
||||
<menu_item_call label="Teleport təklif et" name="offer_teleport" />
|
||||
<menu_item_call label="Teleport sorğula" name="request_teleport" />
|
||||
<menu_item_call label="Səsli zəng" name="voice_call" />
|
||||
<menu_item_call label="Söhbət jurnalına bax..." name="chat_history" />
|
||||
<menu_item_call label="Dost əlavə et" name="add_friend" />
|
||||
<menu_item_call label="Dostluqdan sil" name="remove_friend" />
|
||||
<menu_item_call label="Qrupa dəvət et..." name="invite_to_group" />
|
||||
<menu_item_call label="İcazələr" name="agent_permissions" />
|
||||
<menu_item_call label="Xəritə" name="map" />
|
||||
<menu_item_call label="Paylaş" name="share" />
|
||||
<menu_item_call label="Ödə" name="pay" />
|
||||
<menu_item_check label="Blokla/Blokdan çıxart" name="block_unblock" />
|
||||
<menu_item_call label="Göstərilən adı köçürt" name="copy_display_name" />
|
||||
<menu_item_call label="İstifadəçi adını köçürt" name="copy_name" />
|
||||
<menu_item_call label="İdentifikasiyasını köçürt" name="copy_id" />
|
||||
</toggleable_menu>
|
||||
|
|
|
|||
|
|
@ -163,32 +163,6 @@
|
|||
</menu>
|
||||
</menu>
|
||||
|
||||
<!-- <menu label="Положение солнца" name="Environment Settings">
|
||||
<menu_item_check label="Восход" name="Sunrise"/>
|
||||
<menu_item_check label="Полдень" name="Noon"/>
|
||||
<menu_item_check label="Закат" name="Sunset"/>
|
||||
<menu_item_check label="Полночь" name="Midnight"/>
|
||||
<menu_item_check label="Время острова" name="Revert to Region Default"/>
|
||||
</menu>
|
||||
<menu label="Редактор окружающей среды" name="Environment Editor">
|
||||
<menu_item_call label="Параметры среды..." name="Environment Settings"/>
|
||||
<menu name="Water Presets" label="Предустановки воды">
|
||||
<menu_item_call label="Новая предустановка..." name="new_water_preset"/>
|
||||
<menu_item_call label="Редактировать предустановку..." name="edit_water_preset"/>
|
||||
<menu_item_call label="Удалить предустановку..." name="delete_water_preset"/>
|
||||
</menu>
|
||||
<menu name="Sky Presets" label="Предустановки неба">
|
||||
<menu_item_call label="Новая предустановка..." name="new_sky_preset"/>
|
||||
<menu_item_call label="Редактировать предустановку..." name="edit_sky_preset"/>
|
||||
<menu_item_call label="Удалить предустановку..." name="delete_sky_preset"/>
|
||||
</menu>
|
||||
<menu name="Day Presets" label="Предустановки дня">
|
||||
<menu_item_call label="Новая предустановка..." name="new_day_preset"/>
|
||||
<menu_item_call label="Редактировать предустановку..." name="edit_day_preset"/>
|
||||
<menu_item_call label="Удалить предустановку..." name="delete_day_preset"/>
|
||||
</menu>
|
||||
</menu> -->
|
||||
|
||||
<menu name="photo_and_video" label="Şəkil və video">
|
||||
<menu_item_call label="Şəkil alətləri" name="phototools_item_call"/>
|
||||
<menu_item_call label="Kamera alətləri" name="cameratools_item_call"/>
|
||||
|
|
|
|||
|
|
@ -94,7 +94,7 @@
|
|||
</mimetype>
|
||||
<mimetype name="video/vnd.secondlife.qt.legacy">
|
||||
<label name="vnd.secondlife.qt.legacy_label">
|
||||
Видео (QuickTime)
|
||||
Video (QuickTime)
|
||||
</label>
|
||||
</mimetype>
|
||||
<mimetype name="application/javascript">
|
||||
|
|
|
|||
|
|
@ -26,16 +26,10 @@ Xəta təfərrüatları: "[_NAME]" adlı bildiriş notifications.xml f
|
|||
<notification name="TutorialNotFound">
|
||||
Hazırda heç bir dərslik yoxdur
|
||||
</notification>
|
||||
<notification name="GenericAlert">
|
||||
[MESSAGE]
|
||||
</notification>
|
||||
<notification name="GenericAlertYesCancel">
|
||||
[MESSAGE]
|
||||
<usetemplate name="okcancelbuttons" notext="Ləğv et" yestext="Bəli"/>
|
||||
</notification>
|
||||
<notification name="GenericAlertOK">
|
||||
[MESSAGE]
|
||||
</notification>
|
||||
<notification name="BadInstallation">
|
||||
[APP_NAME] yenilənərkən xəta baş verdi. Klientin [https://www.firestormviewer.org/downloads ən son versiyasını yükləyin].
|
||||
</notification>
|
||||
|
|
@ -195,7 +189,7 @@ Zəhmət olmasa, bir element seçin və yenidən cəhd edin.
|
|||
</notification>
|
||||
<notification name="AllowMultipleViewers">
|
||||
Birdən çox tətbiqin [APP_NAME] icrası dəstəklənmir. Bu, tekstur keşinin münaqişələrinə, zədələnmə, performans və vizual yavaşlamaya səbəb ola bilər.
|
||||
<usetemplate name="okbutton" yestext="ОК"/>
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
</notification>
|
||||
<notification name="GrantModifyRights">
|
||||
Başqa sakinə dəyişdirmə hüquqlarının verilməsi ona HƏR obyektinizi dəyişdirməyə, silməyə və ya götürməyə imkan verəcək. Bu icazənin verilməsində ÇOX diqqətli olun.
|
||||
|
|
@ -421,7 +415,7 @@ Silahın işləməsi üçün skriptlər icra edilməlidir.
|
|||
Birdən çox üz seçildi.
|
||||
Bu hərəkəti davam etdirsəniz, obyektin hər seçilmiş üzünə ayrıca media nümunəsi yerləşdiriləcək.
|
||||
Medianı yalnız bir üzdə yerləşdirmək üçün "Üzü seçmək" əmrini seçin və obyektin istədiyiniz üzünə basın, sonra "Əlavə et" düyməsini basın.
|
||||
<usetemplate ignoretext="Медиа будет помещено на несколько выбранных граней" name="okcancelignore" notext="Ləğv et" yestext="Bəli"/>
|
||||
<usetemplate ignoretext="Media bir neçə seçilmiş üzün üstünə tətbiq olunacaq" name="okcancelignore" notext="Ləğv et" yestext="Bəli"/>
|
||||
</notification>
|
||||
<notification name="MustBeInParcel">
|
||||
Teleportasiya nöqtəsini təyin etmək üçün siz sahədə olmalısınız.
|
||||
|
|
@ -651,7 +645,7 @@ Obyekt əhatə dairəsindən kənarda ola və ya silinə bilər.
|
|||
</notification>
|
||||
<notification name="MediaFileDownloadUnsupported">
|
||||
Siz [APP_NAME] tərəfindən dəstəklənməyən fayl endirilməsi üçün sorğu göndərmisiniz.
|
||||
<usetemplate ignoretext="Предупреждать о загрузке неподдерживаемых файлов" name="okignore" yestext="Bəli"/>
|
||||
<usetemplate ignoretext="Dəstəklənməyən faylları endirmək barədə xəbərdarlıq edin" name="okignore" yestext="Bəli"/>
|
||||
</notification>
|
||||
<notification name="CannotWriteFile">
|
||||
[[FILE]] faylını yazmaq mümkün deyil
|
||||
|
|
@ -777,7 +771,7 @@ Bütün satın alınan əşyaları eyni bölgəyə köçürün.
|
|||
<notification name="PromptGoToCurrencyPage">
|
||||
[EXTRA]
|
||||
|
||||
Перейти на [_URL] для получения информации о покупке L$?
|
||||
L$ almaq haqqında məlumat üçün [_URL] ünvanına keçmək istədiyinə əminsiniz?
|
||||
<url name="url">
|
||||
http://secondlife.com/app/currency/
|
||||
</url>
|
||||
|
|
@ -1196,7 +1190,7 @@ Bu, adətən müvəqqəti bir problemdir. Seçimləri düzəldin və bir neçə
|
|||
Qrup üçün torpaq almaq mümkün deyil:
|
||||
Sizin aktiv qrupunuz üçün torpaq almaq hüququnuz yoxdur.
|
||||
</notification>
|
||||
<notification label="Добавить друга" name="AddFriendWithMessage">
|
||||
<notification label="Dost əlavə et" name="AddFriendWithMessage">
|
||||
Dostlar xəritədə bir-birlərini izləmək və onlayn statuslarını görmək üçün icazə verə bilərlər.
|
||||
|
||||
[NAME] adlı şəxsə dostluq sorğusu göndərilsin?
|
||||
|
|
@ -1421,9 +1415,9 @@ Bu [AREA] m² torpaq "[GROUP_NAME]" qrupuna ötürülsün?
|
|||
Ekran seçimləri səviyyəsi təhlükəsiz olaraq təyin edilib, çünki -safe seçimi müəyyən edilib.
|
||||
</notification>
|
||||
<notification name="DisplaySetToRecommendedGPUChange">
|
||||
Установлен рекомендуемый уровень настроек отображения, так как графическая карта изменена:
|
||||
с "[LAST_GPU]"
|
||||
на "[THIS_GPU]"
|
||||
Qrafik kartı dəyişdirildiyinə görə tövsiyə olunmuş göstərmə profili təyin olunub:
|
||||
əvvəlki "[LAST_GPU]"
|
||||
cari "[THIS_GPU]"
|
||||
</notification>
|
||||
<notification name="DisplaySetToRecommendedFeatureChange">
|
||||
Göstərmə alt sistemi dəyişdirildiyi üçün tövsiyə olunan displey seçimləri səviyyəsi təyin edilir.
|
||||
|
|
@ -1635,7 +1629,7 @@ Zəhmət olmasa, bir obyekt seçin və yenidən cəhd edin.
|
|||
[AGENT] torpaq sahibini bloklananlar siyahısına əlavə etmək mümkün deyil.
|
||||
</notification>
|
||||
<notification name="GroupIsAlreadyInList">
|
||||
<nolink>[GROUP]</nolink> уже находится в списке допущенных групп.
|
||||
<nolink>[GROUP]</nolink> artıq icazə verilən qruplar siyahısındadır.
|
||||
</notification>
|
||||
<notification name="AgentIsAlreadyInList">
|
||||
[AGENT] artıq [LIST_TYPE] siyahınızdadır.
|
||||
|
|
@ -1816,12 +1810,12 @@ Bütün gələn dostluq sorğularını rədd et rejimi aktivdir.
|
|||
</notification>
|
||||
<notification name="RejectAllGroupInvitesModeSet">
|
||||
Bütün gələn qrup dəvətlərini rədd et rejimi aktivdir.
|
||||
Входящие групповые приглашения от кого-либо теперь будут отклоняться автоматически. Bu səbəbə görə sizə məlumat verilməyəcək.
|
||||
Hər kəsdən gələn qrup dəvətləri indi avtomatik olaraq rədd ediləcək. Bu səbəbə görə sizə məlumat verilməyəcək.
|
||||
<usetemplate ignoretext="Bütün qrup dəvətlərini rədd etmək üçün statusumu dəyişirəm" name="okignore" yestext="Bəli"/>
|
||||
</notification>
|
||||
<notification name="JoinedTooManyGroupsMember">
|
||||
Qrupların maksimum sayına çatdınız. Qoşulmazdan əvvəl hər hansı bir qrupdan ayrılın və ya təklifi rədd edin.
|
||||
[NAME] пригласил вас вступить в группу как участник.
|
||||
[NAME] qrupa üzv kimi qoşulmaq təklif etdi.
|
||||
<usetemplate name="okcancelbuttons" notext="Rədd edt" yestext="Qoşul"/>
|
||||
</notification>
|
||||
<notification name="JoinedTooManyGroups">
|
||||
|
|
@ -1979,7 +1973,7 @@ Onu silmək istərdinizmi?
|
|||
[HISTORY_ENTRY] yerinə teleport etmək istədiyinizə əminsiniz?
|
||||
<usetemplate ignoretext="Tarixçədə bir yerə teleportasiyanı təsdiqləyin" name="okcancelignore" notext="Ləğv et" yestext="Teleport ol"/>
|
||||
</notification>
|
||||
<notification label="Сообщение всем в моем землевладении" name="MessageEstate">
|
||||
<notification label="Torpaq mülkiyyətimdə hər kəsə mesaj" name="MessageEstate">
|
||||
Hazırda mülkünüzdə olan bütün sakinlər üçün qısa bir elan daxil edin.
|
||||
<form name="form">
|
||||
<button name="OK" text="OK"/>
|
||||
|
|
@ -2296,7 +2290,7 @@ Zəhmət olmasa, bir obyekt seçin və yenidən cəhd edin.
|
|||
Eyni zamanda bir neçə obyektin məzmununu ala bilməzsiniz.
|
||||
Zəhmət olmasa, bir obyekt seçin və yenidən cəhd edin.
|
||||
</notification>
|
||||
<notification label="Нельзя купить содержимое" name="BuyContentsOneOwner">
|
||||
<notification label="Məzmunu almaq mümkün deyil" name="BuyContentsOneOwner">
|
||||
Eyni zamanda müxtəlif sahiblərdən obyektləri ala bilməzsiniz.
|
||||
Zəhmət olmasa, bir obyekt seçin və yenidən cəhd edin.
|
||||
</notification>
|
||||
|
|
@ -2407,7 +2401,7 @@ Element(lər) daşınılsın?
|
|||
</notification>
|
||||
<notification name="ConfirmAddingChatParticipants">
|
||||
Mövcud söhbətə iştirakçı əlavə etdiyiniz zaman yeni söhbət yaradılacaq. Bütün iştirakçılar yeni söhbət haqqında bildirişlər alacaqlar.
|
||||
<usetemplate ignoretext="Söhbət iştirakçılarının əlavə edilməsini təsdiqləyin" name="okcancelignore" notext="Ləğv et" yestext="ОК"/>
|
||||
<usetemplate ignoretext="Söhbət iştirakçılarının əlavə edilməsini təsdiqləyin" name="okcancelignore" notext="Ləğv et" yestext="OK"/>
|
||||
</notification>
|
||||
<notification name="ConfirmQuit">
|
||||
Çıxmaq istədiyinizdə əminsiniz?
|
||||
|
|
@ -2680,8 +2674,8 @@ Domen: [MEDIADOMAIN]
|
|||
URL: [MEDIAURL]
|
||||
<form name="form">
|
||||
<button name="Do Now" text="İndi [ACTION]"/>
|
||||
<button name="RememberDomain" text="[CONDITION] Разрешить этому домену"/>
|
||||
<button name="RememberURL" text="[CONDITION] Разрешить этому URL"/>
|
||||
<button name="RememberDomain" text="[CONDITION] Bu domenə icazə ver"/>
|
||||
<button name="RememberURL" text="[CONDITION] Bu URL üçün icazə ver"/>
|
||||
</form>
|
||||
</notification>
|
||||
<notification name="MediaAlertSingle">
|
||||
|
|
@ -2712,9 +2706,9 @@ URL: [AUDIOURL]
|
|||
Domen: [AUDIODOMAIN]
|
||||
URL: [AUDIOURL]
|
||||
<form name="form">
|
||||
<button name="Do Now" text="[ACTION] Сейчас"/>
|
||||
<button name="RememberDomain" text="[CONDITION] Разрешить этому домену"/>
|
||||
<button name="RememberURL" text="[CONDITION] Разрешить этому URL"/>
|
||||
<button name="Do Now" text="[ACTION] İndi"/>
|
||||
<button name="RememberDomain" text="[CONDITION] Bu domenə icazə ver"/>
|
||||
<button name="RememberURL" text="[CONDITION] Bu URL üçün icazə ver"/>
|
||||
</form>
|
||||
</notification>
|
||||
<notification name="AudioAlertSingle">
|
||||
|
|
@ -2808,7 +2802,7 @@ Mövzu: [SUBJECT], Mesaj: [MESSAGE]
|
|||
Əsas əmlaklar arasında avadanlıq siyahısı göndərmək mümkün deyil.
|
||||
</notification>
|
||||
<notification name="UnableToLoadNotecard">
|
||||
Невозможно загрузить заметку.
|
||||
Qeydi yükləmək mümkün deyil.
|
||||
Yenidən cəhd edin.
|
||||
</notification>
|
||||
<notification name="ScriptMissing">
|
||||
|
|
@ -2893,21 +2887,6 @@ Daha kiçik bir sahə seçməyə çalışın.
|
|||
<notification name="NoContentToSearch">
|
||||
Axtarmaq üçün ən azı bir növ məzmun seçin ("Ümumi", "Ortam" vəya "Yetkin").
|
||||
</notification>
|
||||
<notification name="SystemMessage">
|
||||
[MESSAGE]
|
||||
</notification>
|
||||
<notification name="FlickrConnect">
|
||||
[MESSAGE]
|
||||
</notification>
|
||||
<notification name="PaymentReceived">
|
||||
[MESSAGE]
|
||||
</notification>
|
||||
<notification name="PaymentSent">
|
||||
[MESSAGE]
|
||||
</notification>
|
||||
<notification name="PaymentFailure">
|
||||
[MESSAGE]
|
||||
</notification>
|
||||
<notification name="EventNotification">
|
||||
Hadisə bildirişi:
|
||||
|
||||
|
|
@ -2993,7 +2972,7 @@ Burada uça bilməzsiniz.
|
|||
<usetemplate name="okbutton" yestext="Regionu bərpa et"/>
|
||||
</notification>
|
||||
<notification name="DynamicPathfindingDisabled">
|
||||
В этом регионе не разрешен динамический поиск пути. Возможны нарушения работы скриптовых объектов с использованием вызовов LSL поиска пути.
|
||||
Bu regionda dinamik yol axtarışı söndürülüb. Yol axtaran LSL çağırışlarından istifadə edən skriptli obyektlər bu regionda gözlənildiyi kimi işləməyə bilər.
|
||||
</notification>
|
||||
<notification name="PathfindingCannotRebakeNavmesh">
|
||||
Bir xəta baş verdi. Şəbəkə və ya server problemi ola bilər və ya sizin tikinti icazəniz yoxdur. Bəzən sistemdən çıxmaq və yenidən daxil olmaq bu problemi həll edə bilər.
|
||||
|
|
@ -3662,7 +3641,7 @@ Aşağıdakı sakinlərlə:
|
|||
Aşağıdakı əşyalarla paylaşmaq istədiyinizə əminsiniz?
|
||||
|
||||
<nolink>[ITEMS]</nolink>
|
||||
<usetemplate name="okcancelbuttons" notext="Ləğv et" yestext="ОК"/>
|
||||
<usetemplate name="okcancelbuttons" notext="Ləğv et" yestext="OK"/>
|
||||
</notification>
|
||||
<notification name="ItemsShared">
|
||||
Əşyalar uğurla paylaşıldı.
|
||||
|
|
@ -3740,10 +3719,10 @@ https://wiki.firestormviewer.org/fs_voice
|
|||
<usetemplate ignoretext="Səs serverinə qoşulma zamanı problemlər yarandı" name="okignore" yestext="Bəli"/>
|
||||
</notification>
|
||||
<notification name="NoVoiceConnect-GIAB">
|
||||
Проблемы соединения с речевым сервером:
|
||||
Səs serverinə qoşulmaq mümkün deyil:
|
||||
|
||||
Голосовое общение будет недоступно.
|
||||
Проверьте настройки сети и брандмауэра.
|
||||
Səsli rabitə mövcud olmayacaq.
|
||||
Zəhmət olmasa şəbəkənizi və təhlükəsizlik divarı quraşdırmanızı yoxlayın.
|
||||
[https://wiki.firestormviewer.org/fs_voice]
|
||||
</notification>
|
||||
<notification name="AvatarRezLeftNotification">
|
||||
|
|
@ -3811,8 +3790,7 @@ Görünüş sahəsini fırlatmaq üçün dünyanın istənilən yerinə basın v
|
|||
Burada fərdiləşdirilə bilən görünülən adınızı təyin edin. Bu, dəyişdirilə bilməyən unikal istifadəçi adınıza əlavədir. Siz seçimlərdə digər insanların adlarını necə gördüyünüzü dəyişə bilərsiniz.
|
||||
</notification>
|
||||
<notification label="Kamera" name="HintView">
|
||||
Для изменения вида из камеры используйте инструменты "Вращение" и "Сдвиг". При нажатии клавиши Esc или переходе вид из камеры возвращается к исходному состоянию.
|
||||
Kamera görünüşünüzü dəyişdirmək üçün Fırlatma və Sürüşdürmə idarəetmə elementlərindən istifadə edin. Esc düyməsinə basmaqla və ya gəzməklə görünüşünüzü sıfırlayın.
|
||||
Kamera görünüşünüzü dəyişdirmək üçün "Döndər" və "Sürüşdür" idarəetmə elementlərindən istifadə edin. Esc düyməsinə basmaqla və ya gəzməklə görünüşünüzü sıfırlayın.
|
||||
</notification>
|
||||
<notification label="Avadanlıq siyahısı" name="HintInventory">
|
||||
Elementləri tapmaq üçün avadanlıq siyahınızı yoxlayın. Ən yeni elementləri Son pəncərəsində asanlıqla tapmaq olar.
|
||||
|
|
@ -3863,7 +3841,6 @@ Görünüş sahəsini fırlatmaq üçün dünyanın istənilən yerinə basın v
|
|||
Proksi seçimləri [APP_NAME] tətbiqini yenidən başlatdıqdan sonra qüvvəyə minir.
|
||||
</notification>
|
||||
<notification name="AuthRequest">
|
||||
Сайт по адресу "<nolink>[HOST_NAME]</nolink>" в царстве "in realm "[REALM]" требует имени пользователя и пароля.
|
||||
"[REALM]" " sahəsində " "<nolink>[HOST_NAME]</nolink>" saytı istifadəçi adı və parol tələb edir.
|
||||
<form name="form">
|
||||
<input name="username" text="İstifadəçi adı"/>
|
||||
|
|
@ -3961,7 +3938,7 @@ Davam edilsin?
|
|||
<notification name="PathfindingLinksets_MismatchOnRestricted_MismatchOnVolume">
|
||||
Bəzi seçilmiş keçid dəstləri keçiddə icazə məhdudiyyətlərinə görə '[REQUESTED_TYPE]' olaraq təyin edilə bilməz. Bu keçid dəstləri əvəzinə "[RESTRICTED_TYPE]" olaraq təyin ediləcək.
|
||||
|
||||
Bəzi seçilmiş keçid dəstləri '[REQUESTED_TYPE]' olaraq təyin edilə bilməz, çünki forma qabarıq deyil. Тип использования этих наборов связей не изменится.
|
||||
Bəzi seçilmiş keçid dəstləri '[REQUESTED_TYPE]' olaraq təyin edilə bilməz, çünki forma qabarıq deyil. Bu keçid dəstlərinin istifadə növü dəyişilməyəcək.
|
||||
|
||||
Davam edilsin?
|
||||
<usetemplate ignoretext="Bəzi seçilmiş link dəstləri keçidlər dəstində icazə məhdudiyyətləri və forma qeyri-qabarıq olduğu üçün təyin edilə bilməz." name="okcancelignore" notext="Ləğv et" yestext="Bəli"/>
|
||||
|
|
@ -3971,7 +3948,7 @@ Davam edilsin?
|
|||
|
||||
Bəzi seçilmiş keçid dəstləri keçiddə icazə məhdudiyyətlərinə görə '[REQUESTED_TYPE]' olaraq təyin edilə bilməz. Bu keçid dəstləri əvəzinə "[RESTRICTED_TYPE]" olaraq təyin ediləcək.
|
||||
|
||||
Bəzi seçilmiş keçid dəstləri '[REQUESTED_TYPE]' olaraq təyin edilə bilməz, çünki forma qabarıq deyil. Тип использования этих наборов связей не изменится.
|
||||
Bəzi seçilmiş keçid dəstləri '[REQUESTED_TYPE]' olaraq təyin edilə bilməz, çünki forma qabarıq deyil. Bu keçid dəstlərinin istifadə növü dəyişilməyəcək.
|
||||
|
||||
Davam edilsin?
|
||||
<usetemplate ignoretext="Bəzi seçilmiş keçid dəstlərinin fantom bayrağı dəyişdiriləcək, digərləri isə keçid setindəki icazə məhdudiyyətləri və forma qeyri-qabarıq olduğu üçün təyin edilə bilməz." name="okcancelignore" notext="Ləğv et" yestext="Bəli"/>
|
||||
|
|
@ -4094,9 +4071,6 @@ Intel drayver veb-saytını yoxlamaq istəyirsiniz?
|
|||
[SYSINFO]
|
||||
<usetemplate name="okcancelbuttons" yestext="Göndər" notext="Ləğv et"/>
|
||||
</notification>
|
||||
<notification name="BlockLoginInfo">
|
||||
[REASON]
|
||||
</notification>
|
||||
<notification name="TestversionExpired">
|
||||
[APP_NAME] tətbiqinin bu sınaq versiyasının vaxtı keçib və daha istifadə edilə bilməz.
|
||||
</notification>
|
||||
|
|
@ -4247,11 +4221,11 @@ Cəhd ləğv edildi.
|
|||
</notification>
|
||||
<notification name="PathfindingReturnMultipleItems">
|
||||
Siz [NUM_ITEMS] elementi qaytarırsınız. Davam etmək istədiyinizə əminsiniz?
|
||||
<usetemplate ignoretext="Вы уверены, что хотите вернуть несколько объектов?" name="okcancelignore" notext="Xeyr" yestext="Bəli"/>
|
||||
<usetemplate ignoretext="Bir neçə obyekti qaytarmaq istədiyiniə əminsiniz?" name="okcancelignore" notext="Xeyr" yestext="Bəli"/>
|
||||
</notification>
|
||||
<notification name="PathfindingDeleteMultipleItems">
|
||||
Siz [NUM_ITEMS] elementi silirsiniz. Davam etmək istədiyinizə əminsiniz?
|
||||
<usetemplate ignoretext="Вы уверены, что хотите удалить несколько объектов?" name="okcancelignore" notext="Xeyr" yestext="Bəli"/>
|
||||
<usetemplate ignoretext="Bir neçə obyekti silmək istədiyiniə əminsiniz?" name="okcancelignore" notext="Xeyr" yestext="Bəli"/>
|
||||
</notification>
|
||||
<notification name="AvatarFrozen">
|
||||
[AV_FREEZER] sizi dondurdu. Siz hərəkət edə və ya dünya ilə əlaqə saxlaya bilməzsiniz.
|
||||
|
|
@ -4391,7 +4365,7 @@ O, dolu ola və ya tezliklə yenidən başlaya bilər.
|
|||
Seçilmiş obyekti saxlamaq mümkün deyil: "[OBJ_NAME]" obyekti köçürülmür.
|
||||
</notification>
|
||||
<notification name="NoModNoTaking">
|
||||
Нельзя забрать выбранное: вам не разрешено изменять объект "[OBJ_NAME]".
|
||||
Seçilmişləri götürmək mümkün deyil: "[OBJ_NAME]" obyektinə dəyişiklik etmək icazəniz yoxdur
|
||||
</notification>
|
||||
<notification name="RezDestInternalError">
|
||||
Daxili xəta: naməlum növ təyinat yeri.
|
||||
|
|
@ -4594,7 +4568,7 @@ daşımaq mümkün deyil, çünki siz navigasiya şəbəkəsini region sərhədl
|
|||
Tələb olunan obyekti yaratmaq mümkün deyil. Region artıq doludur.
|
||||
</notification>
|
||||
<notification name="CantCreateAnimatedObjectTooLarge">
|
||||
НевTələb olunan animasiya obyektini yaratmaq mümkün deyil, çünki o, rig üçbucaq limitini keçib.
|
||||
Tələb olunan animasiya obyektini yaratmaq mümkün deyil, çünki o, rig üçbucaq limitini keçib.
|
||||
</notification>
|
||||
<notification name="CantAttackMultipleObjOneSpot">
|
||||
Eyni nöqtəyə birdən çox obyekt əlavə edə bilməzsiniz.
|
||||
|
|
@ -4702,10 +4676,10 @@ daşımaq mümkün deyil, çünki siz navigasiya şəbəkəsini region sərhədl
|
|||
Əlavə edilmiş obyekti yerə atmaq alınmadı: burada yerə atmaq icazəniz yoxdur.
|
||||
</notification>
|
||||
<notification name="CantDropAttachmentInsufficientLandResources">
|
||||
Əlavə edilmiş obyekti yerə atmaq alınmadı: не хватает свободных земельных ресурсов.
|
||||
Əlavə edilmiş obyekti yerə atmaq alınmadı: boş torpaq resursları çatışmır.
|
||||
</notification>
|
||||
<notification name="CantDropAttachmentInsufficientResources">
|
||||
Əlavə edilmiş obyektləri yerə atmaq alınmadı:: не хватает свободных ресурсов.
|
||||
Əlavə edilmiş obyektləri yerə atmaq alınmadı: boş resurslar çatışmır.
|
||||
</notification>
|
||||
<notification name="CantDropObjectFullParcel">
|
||||
Obyekti bura atmaq olmaz. Sahə artıq doludur.
|
||||
|
|
@ -4806,7 +4780,7 @@ Daha kiçik bir sahə seçməyə çalışın.
|
|||
Regionda reklamlara icazə verilmir.
|
||||
</notification>
|
||||
<notification name="LandPassExpireSoon">
|
||||
Ваш пропуск на эту землю скоро закончится.
|
||||
Bu torpağa icazənamənin müddəti tezliklə bitəcək
|
||||
</notification>
|
||||
<notification name="CantSitNoSuitableSurface">
|
||||
Oturmaq üçün uyğun səth yoxdur. Başqa yerdə cəhd edin.
|
||||
|
|
@ -4964,9 +4938,6 @@ Onlar xətaları həll etmək üçün http://opensimulator.org/wiki/inventory is
|
|||
<notification name="DefaultObjectPermissions">
|
||||
Defolt obyekt icazələrini yadda saxlayarkən problem baş verdi: [REASON]. Lütfən, defolt icazələri daha sonra təyin etməyə cəhd edin.
|
||||
</notification>
|
||||
<notification name="OutfitPhotoLoadError">
|
||||
[REASON]
|
||||
</notification>
|
||||
<notification name="AddPaymentMethod">
|
||||
Növbəti səhifədə L$ məbləği seçin və
|
||||
Sifariş yerləşdir düyməsini basın. Ödəniş zamanı
|
||||
|
|
@ -5203,14 +5174,14 @@ hansı nişandan istifadə etmək istərdiniz?
|
|||
<usetemplate ignoretext="Mənə bildirin ki, onlayn statusun görünməsinə keçid bir qədər vaxt apara bilər" name="okignore" yestext="Bəli"/>
|
||||
</notification>
|
||||
<notification name="RenderVolumeLODFactorWarning">
|
||||
ВНИМАНИЕ: уровень детализации (LOD) установлен на высокий
|
||||
XƏBƏRDARLIQ: Dətallaşdırma səviyyəsi (LOD) yüksək olaraq təyin edilib
|
||||
|
||||
Для повседневного использования достаточно уровня в диапазоне 1-3.
|
||||
Попробуйте заменить объекты, которые выглядят деформированными при таких значениях.
|
||||
Gündəlik istifadə üçün 1-3 aralığında səviyyə kifayətdir.
|
||||
Bu səviyyələrdə əyri görünən obyektləri əvəz etməyə çalışın.
|
||||
|
||||
Уровень LOD > 3: добавляет задержки. Рекомендуется только для фотографии.
|
||||
Уровень LOD > 4: использовать в особых случаях. Возврат после relog.
|
||||
Уровень LOD > 8: не имеет реального эффекта. Может вызвать ошибки.
|
||||
LOD > 3 səviyyəsi: gecikmə əlavə edir. Yalnız şəkil üçün tövsiyə olunur.
|
||||
LOD > 4 səviyyəsi: xüsusi hallarda istifadə edin. Yenidən daxil olduqdan sonra geri qayıdır.
|
||||
LOD > 8 səviyyəsi: real təsiri yoxdur. Səhvlərə səbəb ola bilər.
|
||||
</notification>
|
||||
<notification name="CurrencyURIOverrideReceived">
|
||||
Bu bölgə üçüncü tərəf valyuta portalını təyin etməyi seçdi.
|
||||
|
|
|
|||
|
|
@ -7,10 +7,10 @@
|
|||
<check_box name="ao_default" label="Susmaya görə" tool_tip="Bu animasiya dəstini sistemə daxil olanda başlatmaq." width="20" />
|
||||
<button name="ao_add" tool_tip="Yeni animasiya qrupu yaratmaq." />
|
||||
<button name="ao_remove" tool_tip="Bu animasiya dəstini silmək." />
|
||||
<check_box name="ao_sit_override" label="Oturmaq" tool_tip="Oturma animasiyasını yenidən təyin etmək istəyirsinizsə işarələyin." width="100" />
|
||||
<check_box name="ao_sit_override" label="Oturuş" tool_tip="Oturma animasiyasını yenidən təyin etmək istəyirsinizsə işarələyin." width="100" />
|
||||
<check_box name="ao_smart" label="Ağıllı" tool_tip="Ağıllı rejim, oturmaq animasiyasının obyektin öz animasiyası ilə münaqişə edib-etməyəcəyini müəyyən etməyə çalışır və təyinatını müvəqqəti olaraq söndürür."
|
||||
left_pad="4" right="-1" height="16" />
|
||||
<check_box name="ao_disable_stands_in_mouselook" label="Mouselookda Duruşlarını Aradan Qaldır" tool_tip="Əgər öz duruş animasiyanızı saxlamaq istəyirsinizsə, bu nişanı qoyun." width="100" />
|
||||
<check_box name="ao_disable_stands_in_mouselook" label="Mouselook-da duruşları söndür" tool_tip="Əgər öz duruş animasiyanızı saxlamaq istəyirsinizsə, bu nişanı qoyun." width="100" />
|
||||
<combo_box name="ao_state_selection_combo" tool_tip="Düzəliş üçün animasiya vəziyyətini seçin." />
|
||||
<panel name="ao_animation_move_trash_panel" >
|
||||
<button name="ao_move_up" tool_tip="Seçilmiş animasiyanı siyahıda yuxarıya doğru daşıyın." />
|
||||
|
|
|
|||
|
|
@ -2,5 +2,5 @@
|
|||
<panel name="camera_preset_item">
|
||||
<text name="preset_name" value="Susmaya görə"/>
|
||||
<button name="delete_btn" tool_tip="Öncədən təyini sil"/>
|
||||
<button name="reset_btn" tool_tip="Susmaya görə olan öncədən təyini sıfırla">
|
||||
<button name="reset_btn" tool_tip="Susmaya görə olan öncədən təyini sıfırla"/>
|
||||
</panel>
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<panel name="edit_eyes_panel">
|
||||
<panel name="avatar_eye_color_panel">
|
||||
<texture_picker label="Göz bəbəyi" name="Iris" tool_tip="Şəkil seçmək üçün klikləyin"/>
|
||||
<texture_picker label="Göz bəbəyi" name="Iris" tool_tip="Şəkil seçmək üçün basın"/>
|
||||
</panel>
|
||||
<panel name="accordion_panel">
|
||||
<accordion name="wearable_accordion">
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue