Compare commits
41 Commits
sv-1.8.7.8
...
sv-1.8.9.8
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
be3cbc642b | ||
|
|
24331d3c90 | ||
|
|
8a16e6c99f | ||
|
|
f36e8fbeca | ||
|
|
718ef09adf | ||
|
|
6443849ea9 | ||
|
|
cbb7e473ba | ||
|
|
118957362f | ||
|
|
ed7f73769f | ||
|
|
ae15dcb318 | ||
|
|
c4af22481c | ||
|
|
ae17f76bb4 | ||
|
|
7e62d17fda | ||
|
|
f9185e8bc8 | ||
|
|
1361f9b57d | ||
|
|
b86eae026b | ||
|
|
79d938a4f4 | ||
|
|
23068a70a2 | ||
|
|
0aa5e0bb88 | ||
|
|
5040275969 | ||
|
|
1daccf40ee | ||
|
|
4fd302286b | ||
|
|
18f9f19e61 | ||
|
|
1de6d4461a | ||
|
|
4198f47ab6 | ||
|
|
d9049ba342 | ||
|
|
f75ac3e4c2 | ||
|
|
06698deaca | ||
|
|
445eb29bd3 | ||
|
|
cc034f6841 | ||
|
|
3c368651f1 | ||
|
|
321730e384 | ||
|
|
c2fd88670f | ||
|
|
7b03103a1f | ||
|
|
ac3e19c91a | ||
|
|
4c7d2224e3 | ||
|
|
3ab800d99e | ||
|
|
332cef0f84 | ||
|
|
9de6d7627b | ||
|
|
98b42e88c1 | ||
|
|
e642e9561a |
@@ -410,11 +410,11 @@
|
||||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>4614b29cc98021cf1770a8290171602b</string>
|
||||
<string>a96fda7ad5cee967823f5c94390ba35b</string>
|
||||
<key>hash_algorithm</key>
|
||||
<string>md5</string>
|
||||
<key>url</key>
|
||||
<string>https://pkg.alchemyviewer.org/repository/autobuild-external/crashpad/windows/crashpad-ce32d093.7-windows-7.tar.bz2</string>
|
||||
<string>https://pkg.alchemyviewer.org/repository/autobuild-external/crashpad/windows/crashpad-c6d76a90.194-windows-194.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows</string>
|
||||
@@ -424,18 +424,18 @@
|
||||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>d801461b7a6a40fffab828aa1e01e3e6</string>
|
||||
<string>5ff95ca1007ed2dc300b59de17453201</string>
|
||||
<key>hash_algorithm</key>
|
||||
<string>md5</string>
|
||||
<key>url</key>
|
||||
<string>https://pkg.alchemyviewer.org/repository/autobuild-external/crashpad/windows64/crashpad-ce32d093.7-windows64-7.tar.bz2</string>
|
||||
<string>https://pkg.alchemyviewer.org/repository/autobuild-external/crashpad/windows64/crashpad-c6d76a90.194-windows64-194.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows64</string>
|
||||
</map>
|
||||
</map>
|
||||
<key>version</key>
|
||||
<string>ce32d093.7</string>
|
||||
<string>c6d76a90.194</string>
|
||||
</map>
|
||||
<key>curl</key>
|
||||
<map>
|
||||
|
||||
@@ -270,6 +270,8 @@ if (NOT VIEWER_CHANNEL_GRK)
|
||||
set(VIEWER_CHANNEL_GRK "\\u03B1") # "α"
|
||||
elseif (VIEWER_CHANNEL_TYPE MATCHES "Beta")
|
||||
set(VIEWER_CHANNEL_GRK "\\u03B2") # "β"
|
||||
else()
|
||||
set(VIEWER_CHANNEL_GRK "")
|
||||
endif ()
|
||||
endif (NOT VIEWER_CHANNEL_GRK)
|
||||
|
||||
|
||||
@@ -353,8 +353,14 @@ typedef LLError::NoClassInfo _LL_CLASS_TO_LOG;
|
||||
|
||||
// NEW Macros for debugging, allow the passing of a string tag
|
||||
|
||||
#ifdef SHOW_DEBUG
|
||||
#define DO_DEBUG_LOG
|
||||
#else
|
||||
#define DO_DEBUG_LOG if (false)
|
||||
#endif
|
||||
|
||||
// Pass comma separated list of tags (currently only supports up to 0, 1, or 2)
|
||||
#define LL_DEBUGS(...) lllog(LLError::LEVEL_DEBUG, false, false, ##__VA_ARGS__)
|
||||
#define LL_DEBUGS(...) DO_DEBUG_LOG lllog(LLError::LEVEL_DEBUG, false, false, ##__VA_ARGS__)
|
||||
#define LL_INFOS(...) lllog(LLError::LEVEL_INFO, false, false, ##__VA_ARGS__)
|
||||
#define LL_WARNS(...) lllog(LLError::LEVEL_WARN, false, false, ##__VA_ARGS__)
|
||||
#define LL_ERRS(...) lllog(LLError::LEVEL_ERROR, false, false, ##__VA_ARGS__)
|
||||
@@ -363,12 +369,12 @@ typedef LLError::NoClassInfo _LL_CLASS_TO_LOG;
|
||||
|
||||
// Only print the log message once (good for warnings or infos that would otherwise
|
||||
// spam the log file over and over, such as tighter loops).
|
||||
#define LL_DEBUGS_ONCE(...) lllog(LLError::LEVEL_DEBUG, true, false, ##__VA_ARGS__)
|
||||
#define LL_DEBUGS_ONCE(...) DO_DEBUG_LOG lllog(LLError::LEVEL_DEBUG, true, false, ##__VA_ARGS__)
|
||||
#define LL_INFOS_ONCE(...) lllog(LLError::LEVEL_INFO, true, false, ##__VA_ARGS__)
|
||||
#define LL_WARNS_ONCE(...) lllog(LLError::LEVEL_WARN, true, false, ##__VA_ARGS__)
|
||||
|
||||
// No function name
|
||||
#define LL_DEBUGS_NF(...) lllog(LLError::LEVEL_DEBUG, false, true, ##__VA_ARGS__)
|
||||
#define LL_DEBUGS_NF(...) DO_DEBUG_LOG {lllog(LLError::LEVEL_DEBUG, false, true, ##__VA_ARGS__)
|
||||
#define LL_INFOS_NF(...) lllog(LLError::LEVEL_INFO, false, true, ##__VA_ARGS__)
|
||||
#define LL_WARNS_NF(...) lllog(LLError::LEVEL_WARN, false, true, ##__VA_ARGS__)
|
||||
#define LL_ERRS_NF(...) lllog(LLError::LEVEL_ERROR, false, true, ##__VA_ARGS__)
|
||||
|
||||
@@ -960,4 +960,5 @@ P(webProfileResponders);
|
||||
P(wholeModelFeeResponder);
|
||||
P(wholeModelUploadResponder);
|
||||
P2(XMLRPCResponder, connect_40s);
|
||||
P(getUpdateInfoResponder);
|
||||
P(getUpdateInfoResponder);
|
||||
P2(AISAPIResponder, connect_60s);
|
||||
@@ -58,103 +58,6 @@ const std::string SYSTEM_FROM("Second Life");
|
||||
const std::string INTERACTIVE_SYSTEM_FROM("F387446C-37C4-45f2-A438-D99CBDBB563B");
|
||||
const S32 IM_TTL = 1;
|
||||
|
||||
|
||||
/**
|
||||
* LLIMInfo
|
||||
*/
|
||||
LLIMInfo::LLIMInfo() :
|
||||
mFromGroup(FALSE),
|
||||
mParentEstateID(0),
|
||||
mOffline(0),
|
||||
mViewerThinksToIsOnline(false),
|
||||
mIMType(IM_NOTHING_SPECIAL),
|
||||
mTimeStamp(0),
|
||||
mSource(IM_FROM_SIM),
|
||||
mTTL(IM_TTL)
|
||||
{
|
||||
}
|
||||
|
||||
LLIMInfo::LLIMInfo(
|
||||
const LLUUID& from_id,
|
||||
BOOL from_group,
|
||||
const LLUUID& to_id,
|
||||
EInstantMessage im_type,
|
||||
const std::string& name,
|
||||
const std::string& message,
|
||||
const LLUUID& id,
|
||||
U32 parent_estate_id,
|
||||
const LLUUID& region_id,
|
||||
const LLVector3& position,
|
||||
LLSD data,
|
||||
U8 offline,
|
||||
U32 timestamp,
|
||||
EIMSource source,
|
||||
S32 ttl) :
|
||||
mFromID(from_id),
|
||||
mFromGroup(from_group),
|
||||
mToID(to_id),
|
||||
mParentEstateID(0),
|
||||
mRegionID(region_id),
|
||||
mPosition(position),
|
||||
mOffline(offline),
|
||||
mViewerThinksToIsOnline(false),
|
||||
mIMType(im_type),
|
||||
mID(id),
|
||||
mTimeStamp(timestamp),
|
||||
mName(name),
|
||||
mMessage(message),
|
||||
mData(data),
|
||||
mSource(source),
|
||||
mTTL(ttl)
|
||||
{
|
||||
}
|
||||
|
||||
LLIMInfo::LLIMInfo(LLMessageSystem* msg, EIMSource source, S32 ttl) :
|
||||
mViewerThinksToIsOnline(false),
|
||||
mSource(source),
|
||||
mTTL(ttl)
|
||||
{
|
||||
unpackMessageBlock(msg);
|
||||
}
|
||||
|
||||
LLIMInfo::~LLIMInfo()
|
||||
{
|
||||
}
|
||||
|
||||
void LLIMInfo::packInstantMessage(LLMessageSystem* msg) const
|
||||
{
|
||||
LL_DEBUGS() << "LLIMInfo::packInstantMessage()" << LL_ENDL;
|
||||
msg->newMessageFast(_PREHASH_ImprovedInstantMessage);
|
||||
packMessageBlock(msg);
|
||||
}
|
||||
|
||||
void LLIMInfo::packMessageBlock(LLMessageSystem* msg) const
|
||||
{
|
||||
// Construct binary bucket
|
||||
std::vector<U8> bucket;
|
||||
if (mData.has("binary_bucket"))
|
||||
{
|
||||
bucket = mData["binary_bucket"].asBinary();
|
||||
}
|
||||
pack_instant_message_block(
|
||||
msg,
|
||||
mFromID,
|
||||
mFromGroup,
|
||||
LLUUID::null,
|
||||
mToID,
|
||||
mName,
|
||||
mMessage,
|
||||
mOffline,
|
||||
mIMType,
|
||||
mID,
|
||||
mParentEstateID,
|
||||
mRegionID,
|
||||
mPosition,
|
||||
mTimeStamp,
|
||||
&bucket[0],
|
||||
bucket.size());
|
||||
}
|
||||
|
||||
void pack_instant_message(
|
||||
LLMessageSystem* msg,
|
||||
const LLUUID& from_id,
|
||||
@@ -264,124 +167,3 @@ void pack_instant_message_block(
|
||||
}
|
||||
msg->addBinaryDataFast(_PREHASH_BinaryBucket, bb, binary_bucket_size);
|
||||
}
|
||||
|
||||
void LLIMInfo::unpackMessageBlock(LLMessageSystem* msg)
|
||||
{
|
||||
msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, mFromID);
|
||||
msg->getBOOLFast(_PREHASH_MessageBlock, _PREHASH_FromGroup, mFromGroup);
|
||||
msg->getUUIDFast(_PREHASH_MessageBlock, _PREHASH_ToAgentID, mToID);
|
||||
msg->getU32Fast(_PREHASH_MessageBlock, _PREHASH_ParentEstateID, mParentEstateID);
|
||||
msg->getUUIDFast(_PREHASH_MessageBlock, _PREHASH_RegionID, mRegionID);
|
||||
msg->getVector3Fast(_PREHASH_MessageBlock, _PREHASH_Position, mPosition);
|
||||
msg->getU8Fast(_PREHASH_MessageBlock, _PREHASH_Offline, mOffline);
|
||||
U8 dialog;
|
||||
msg->getU8Fast(_PREHASH_MessageBlock, _PREHASH_Dialog, dialog);
|
||||
mIMType = (EInstantMessage) dialog;
|
||||
msg->getUUIDFast(_PREHASH_MessageBlock, _PREHASH_ID, mID);
|
||||
msg->getU32Fast(_PREHASH_MessageBlock, _PREHASH_Timestamp, mTimeStamp);
|
||||
msg->getStringFast(_PREHASH_MessageBlock, _PREHASH_FromAgentName, mName);
|
||||
|
||||
msg->getStringFast(_PREHASH_MessageBlock, _PREHASH_Message, mMessage);
|
||||
|
||||
S32 binary_bucket_size = llmin(
|
||||
MTUBYTES,
|
||||
msg->getSizeFast(
|
||||
_PREHASH_MessageBlock,
|
||||
_PREHASH_BinaryBucket));
|
||||
if(binary_bucket_size > 0)
|
||||
{
|
||||
std::vector<U8> bucket;
|
||||
bucket.resize(binary_bucket_size);
|
||||
|
||||
msg->getBinaryDataFast(
|
||||
_PREHASH_MessageBlock,
|
||||
_PREHASH_BinaryBucket,
|
||||
&bucket[0],
|
||||
0,
|
||||
0,
|
||||
binary_bucket_size);
|
||||
mData["binary_bucket"] = bucket;
|
||||
}
|
||||
else
|
||||
{
|
||||
mData.clear();
|
||||
}
|
||||
}
|
||||
|
||||
LLSD im_info_to_llsd(LLPointer<LLIMInfo> im_info)
|
||||
{
|
||||
LLSD param_version;
|
||||
param_version["version"] = 1;
|
||||
LLSD param_message;
|
||||
param_message["from_id"] = im_info->mFromID;
|
||||
param_message["from_group"] = im_info->mFromGroup;
|
||||
param_message["to_id"] = im_info->mToID;
|
||||
param_message["from_name"] = im_info->mName;
|
||||
param_message["message"] = im_info->mMessage;
|
||||
param_message["type"] = (S32)im_info->mIMType;
|
||||
param_message["id"] = im_info->mID;
|
||||
param_message["timestamp"] = (S32)im_info->mTimeStamp;
|
||||
param_message["offline"] = (S32)im_info->mOffline;
|
||||
param_message["parent_estate_id"] = (S32)im_info->mParentEstateID;
|
||||
param_message["region_id"] = im_info->mRegionID;
|
||||
param_message["position"] = ll_sd_from_vector3(im_info->mPosition);
|
||||
param_message["data"] = im_info->mData;
|
||||
param_message["source"]= im_info->mSource;
|
||||
param_message["ttl"] = im_info->mTTL;
|
||||
|
||||
LLSD param_agent;
|
||||
param_agent["agent_id"] = im_info->mFromID;
|
||||
|
||||
LLSD params;
|
||||
params["version_params"] = param_version;
|
||||
params["message_params"] = param_message;
|
||||
params["agent_params"] = param_agent;
|
||||
|
||||
return params;
|
||||
}
|
||||
|
||||
LLPointer<LLIMInfo> llsd_to_im_info(const LLSD& im_info_sd)
|
||||
{
|
||||
LLSD param_message = im_info_sd["message_params"];
|
||||
LLSD param_agent = im_info_sd["agent_params"];
|
||||
|
||||
LLPointer<LLIMInfo> im_info = new LLIMInfo(
|
||||
param_message["from_id"].asUUID(),
|
||||
param_message["from_group"].asBoolean(),
|
||||
param_message["to_id"].asUUID(),
|
||||
(EInstantMessage) param_message["type"].asInteger(),
|
||||
param_message["from_name"].asString(),
|
||||
param_message["message"].asString(),
|
||||
param_message["id"].asUUID(),
|
||||
(U32) param_message["parent_estate_id"].asInteger(),
|
||||
param_message["region_id"].asUUID(),
|
||||
ll_vector3_from_sd(param_message["position"]),
|
||||
param_message["data"],
|
||||
(U8) param_message["offline"].asInteger(),
|
||||
(U32) param_message["timestamp"].asInteger(),
|
||||
(EIMSource)param_message["source"].asInteger(),
|
||||
param_message["ttl"].asInteger());
|
||||
|
||||
return im_info;
|
||||
}
|
||||
|
||||
LLPointer<LLIMInfo> LLIMInfo::clone()
|
||||
{
|
||||
return new LLIMInfo(
|
||||
mFromID,
|
||||
mFromGroup,
|
||||
mToID,
|
||||
mIMType,
|
||||
mName,
|
||||
mMessage,
|
||||
mID,
|
||||
mParentEstateID,
|
||||
mRegionID,
|
||||
mPosition,
|
||||
mData,
|
||||
mOffline,
|
||||
mTimeStamp,
|
||||
mSource,
|
||||
mTTL);
|
||||
}
|
||||
|
||||
|
||||
@@ -225,62 +225,6 @@ extern const std::string INTERACTIVE_SYSTEM_FROM;
|
||||
// Number of retry attempts on sending the im.
|
||||
extern const S32 IM_TTL;
|
||||
|
||||
|
||||
class LLIMInfo : public LLRefCount
|
||||
{
|
||||
protected:
|
||||
LLIMInfo();
|
||||
~LLIMInfo();
|
||||
|
||||
public:
|
||||
LLIMInfo(LLMessageSystem* msg,
|
||||
EIMSource source = IM_FROM_SIM,
|
||||
S32 ttl = IM_TTL);
|
||||
|
||||
LLIMInfo(
|
||||
const LLUUID& from_id,
|
||||
BOOL from_group,
|
||||
const LLUUID& to_id,
|
||||
EInstantMessage im_type,
|
||||
const std::string& name,
|
||||
const std::string& message,
|
||||
const LLUUID& id,
|
||||
U32 parent_estate_id,
|
||||
const LLUUID& region_id,
|
||||
const LLVector3& position,
|
||||
LLSD data,
|
||||
U8 offline,
|
||||
U32 timestamp,
|
||||
EIMSource source,
|
||||
S32 ttl = IM_TTL);
|
||||
|
||||
void packInstantMessage(LLMessageSystem* msg) const;
|
||||
void packMessageBlock(LLMessageSystem* msg) const;
|
||||
void unpackMessageBlock(LLMessageSystem* msg);
|
||||
LLPointer<LLIMInfo> clone();
|
||||
public:
|
||||
LLUUID mFromID;
|
||||
BOOL mFromGroup;
|
||||
LLUUID mToID;
|
||||
U32 mParentEstateID;
|
||||
LLUUID mRegionID;
|
||||
LLVector3 mPosition;
|
||||
U8 mOffline;
|
||||
bool mViewerThinksToIsOnline;
|
||||
EInstantMessage mIMType;
|
||||
LLUUID mID;
|
||||
U32 mTimeStamp;
|
||||
std::string mName;
|
||||
std::string mMessage;
|
||||
LLSD mData;
|
||||
|
||||
EIMSource mSource;
|
||||
S32 mTTL;
|
||||
};
|
||||
|
||||
LLPointer<LLIMInfo> llsd_to_im_info(const LLSD& im_info_sd);
|
||||
LLSD im_info_to_llsd(LLPointer<LLIMInfo> im_info);
|
||||
|
||||
void pack_instant_message(
|
||||
LLMessageSystem* msgsystem,
|
||||
const LLUUID& from_id,
|
||||
|
||||
@@ -1 +1 @@
|
||||
1.8.7
|
||||
1.8.9
|
||||
|
||||
@@ -207,6 +207,7 @@ void LLPrefsAscentSys::refreshValues()
|
||||
mDisplayScriptJumps = gSavedSettings.getBOOL("AscentDisplayTotalScriptJumps");
|
||||
mNumScriptDiff = gSavedSettings.getF32("Ascentnumscriptdiff");
|
||||
mReplaceLinks = gSavedSettings.getBOOL("SinguReplaceLinks");
|
||||
mEmergencySeconds = gSavedPerAccountSettings.getU32("EmergencyTeleportSeconds");
|
||||
mLandmark = gSavedPerAccountSettings.getString("EmergencyTeleportLandmark");
|
||||
mLandmarkBackup = gSavedPerAccountSettings.getString("EmergencyTeleportLandmarkBackup");
|
||||
|
||||
@@ -353,6 +354,7 @@ void LLPrefsAscentSys::cancel()
|
||||
gSavedSettings.setBOOL("AscentDisplayTotalScriptJumps", mDisplayScriptJumps);
|
||||
gSavedSettings.setF32("Ascentnumscriptdiff", mNumScriptDiff);
|
||||
gSavedSettings.setBOOL("SinguReplaceLinks", mReplaceLinks);
|
||||
gSavedPerAccountSettings.setU32("EmergencyTeleportSeconds", mEmergencySeconds);
|
||||
gSavedPerAccountSettings.setString("EmergencyTeleportLandmark", mLandmark);
|
||||
gSavedPerAccountSettings.setString("EmergencyTeleportLandmarkBackup", mLandmarkBackup);
|
||||
|
||||
|
||||
@@ -118,6 +118,7 @@ private:
|
||||
bool mDisplayScriptJumps;
|
||||
bool mReplaceLinks;
|
||||
F32 mNumScriptDiff;
|
||||
U32 mEmergencySeconds;
|
||||
std::string mLandmark;
|
||||
std::string mLandmarkBackup;
|
||||
|
||||
|
||||
@@ -163,10 +163,11 @@ Wavefront::Wavefront(LLFace* face, LLPolyMesh* mesh, const LLXform* transform, c
|
||||
if (transform_normals) Transform(normals, transform_normals);
|
||||
|
||||
const U32 pcount = mesh ? mesh->getNumFaces() : (vb->getNumIndices()/3); //indices
|
||||
const U16 offset = face->getIndicesStart(); //indices
|
||||
const U32 offset = face->getIndicesStart(); //indices
|
||||
for (U32 i = 0; i < pcount; ++i)
|
||||
{
|
||||
triangles.push_back(tri(getIndices[i * 3 + offset] + start, getIndices[i * 3 + 1 + offset] + start, getIndices[i * 3 + 2 + offset] + start));
|
||||
const auto off = i * 3 + offset;
|
||||
triangles.push_back(tri(getIndices[off] + start, getIndices[off + 1] + start, getIndices[off + 2] + start));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -174,9 +175,9 @@ void Wavefront::Transform(vert_t& v, const LLXform* x) //recursive
|
||||
{
|
||||
LLMatrix4 m;
|
||||
x->getLocalMat4(m);
|
||||
for (vert_t::iterator iterv = v.begin(); iterv != v.end(); ++iterv)
|
||||
for (auto& i : v)
|
||||
{
|
||||
iterv->first = iterv->first * m;
|
||||
i.first = i.first * m;
|
||||
}
|
||||
|
||||
if (const LLXform* xp = x->getParent()) Transform(v, xp);
|
||||
@@ -186,9 +187,9 @@ void Wavefront::Transform(vec3_t& v, const LLXform* x) //recursive
|
||||
{
|
||||
LLMatrix4 m;
|
||||
x->getLocalMat4(m);
|
||||
for (vec3_t::iterator iterv = v.begin(); iterv != v.end(); ++iterv)
|
||||
for (auto& i : v)
|
||||
{
|
||||
*iterv = *iterv * m;
|
||||
i = i * m;
|
||||
}
|
||||
|
||||
if (const LLXform* xp = x->getParent()) Transform(v, xp);
|
||||
@@ -252,9 +253,9 @@ namespace
|
||||
asset_id_matches);
|
||||
|
||||
// See if any of the inventory items matching this sculpt id are exportable
|
||||
for (U32 i = 0; i < items.size(); i++)
|
||||
for (const auto& item : items)
|
||||
{
|
||||
const LLPermissions item_permissions = items[i]->getPermissions();
|
||||
const LLPermissions item_permissions = item->getPermissions();
|
||||
if (item_permissions.allowExportBy(gAgentID, LFSimFeatureHandler::instance().exportPolicy()))
|
||||
{
|
||||
return true;
|
||||
@@ -269,9 +270,9 @@ namespace
|
||||
}
|
||||
}
|
||||
|
||||
class LFSaveSelectedObjects : public view_listener_t
|
||||
class LFSaveSelectedObjects final : public view_listener_t
|
||||
{
|
||||
bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
|
||||
bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) override
|
||||
{
|
||||
if (LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection())
|
||||
{
|
||||
@@ -288,10 +289,10 @@ namespace
|
||||
S32 included = 0;
|
||||
for (LLObjectSelection::iterator iter = selection->begin(); iter != selection->end(); ++iter)
|
||||
{
|
||||
total++;
|
||||
++total;
|
||||
LLSelectNode* node = *iter;
|
||||
if (!can_export_node(node)) continue;
|
||||
included++;
|
||||
++included;
|
||||
wfsaver->Add(node->getObject());
|
||||
}
|
||||
if (wfsaver->obj_v.empty())
|
||||
@@ -322,12 +323,12 @@ void WavefrontSaver::Add(const LLVOAvatar* av_vo) //adds attachments, too!
|
||||
{
|
||||
offset = -av_vo->getRenderPosition();
|
||||
avatar_joint_list_t vjv = av_vo->mMeshLOD;
|
||||
for (avatar_joint_list_t::const_iterator itervj = vjv.begin(); itervj != vjv.end(); ++itervj)
|
||||
for (const auto& itervj : vjv)
|
||||
{
|
||||
const LLViewerJoint* vj = dynamic_cast<LLViewerJoint*>(*itervj);
|
||||
const auto* vj = dynamic_cast<const LLViewerJoint*>(itervj);
|
||||
if (!vj || vj->mMeshParts.empty()) continue;
|
||||
|
||||
LLViewerJointMesh* vjm = dynamic_cast<LLViewerJointMesh*>(vj->mMeshParts[0]); //highest LOD
|
||||
auto* vjm = dynamic_cast<LLViewerJointMesh*>(vj->mMeshParts[0]); //highest LOD
|
||||
if (!vjm) continue;
|
||||
|
||||
vjm->updateJointGeometry();
|
||||
@@ -355,21 +356,19 @@ void WavefrontSaver::Add(const LLVOAvatar* av_vo) //adds attachments, too!
|
||||
Add(Wavefront(face, pm, NULL, &normfix));
|
||||
}
|
||||
|
||||
for (LLVOAvatar::attachment_map_t::const_iterator iter = av_vo->mAttachmentPoints.begin(); iter != av_vo->mAttachmentPoints.end(); ++iter)
|
||||
for (const auto& ap : av_vo->mAttachmentPoints)
|
||||
{
|
||||
LLViewerJointAttachment* ja = iter->second;
|
||||
LLViewerJointAttachment* ja = ap.second;
|
||||
if (!ja) continue;
|
||||
|
||||
for (LLViewerJointAttachment::attachedobjs_vec_t::iterator itero = ja->mAttachedObjects.begin(); itero != ja->mAttachedObjects.end(); ++itero)
|
||||
for (const auto& o : ja->mAttachedObjects)
|
||||
{
|
||||
LLViewerObject* o = *itero;
|
||||
if (!o) continue;
|
||||
|
||||
std::vector<LLViewerObject*> prims;
|
||||
o->addThisAndAllChildren(prims);
|
||||
for (std::vector<LLViewerObject* >::iterator iterc = prims.begin(); iterc != prims.end(); ++iterc)
|
||||
for (const auto& c : prims)
|
||||
{
|
||||
const LLViewerObject* c = *iterc;
|
||||
if (!c) continue;
|
||||
if (LLSelectNode* n = LLSelectMgr::getInstance()->getSelection()->findNode(const_cast<LLViewerObject*>(c)))
|
||||
{
|
||||
@@ -400,9 +399,9 @@ void WavefrontSaver::Add(const LLVOAvatar* av_vo) //adds attachments, too!
|
||||
}
|
||||
namespace
|
||||
{
|
||||
class LFSaveSelectedAvatar : public view_listener_t
|
||||
class LFSaveSelectedAvatar final : public view_listener_t
|
||||
{
|
||||
bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
|
||||
bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) override
|
||||
{
|
||||
if (const LLVOAvatar* avatar = find_avatar_from_object(LLSelectMgr::getInstance()->getSelection()->getPrimaryObject()))
|
||||
{
|
||||
@@ -446,49 +445,48 @@ bool WavefrontSaver::saveFile(LLFILE* fp)
|
||||
|
||||
int num = 0;
|
||||
int index = 0;
|
||||
for (std::vector<Wavefront>::iterator w_iter = obj_v.begin(); w_iter != obj_v.end(); ++w_iter)
|
||||
for (const auto& obj : obj_v)
|
||||
{
|
||||
int count = 0;
|
||||
|
||||
std::string name = (*w_iter).name;
|
||||
std::string name = obj.name;
|
||||
if (name.empty()) name = llformat("%d", num++);
|
||||
|
||||
vert_t vertices = (*w_iter).vertices;
|
||||
vec3_t normals = (*w_iter).normals;
|
||||
tri_t triangles = (*w_iter).triangles;
|
||||
auto& vertices = obj.vertices;
|
||||
auto& normals = obj.normals;
|
||||
auto& triangles = obj.triangles;
|
||||
|
||||
//Write Object
|
||||
write_or_bust(fp, "o " + name + "\n");
|
||||
write_or_bust(fp, "o " + name + '\n');
|
||||
|
||||
//Write vertices; swap axes if necessary
|
||||
static const LLCachedControl<bool> swapYZ("OBJExportSwapYZ", false);
|
||||
const double xm = swapYZ ? -1.0 : 1.0;
|
||||
const int y = swapYZ ? 2 : 1;
|
||||
const int z = swapYZ ? 1 : 2;
|
||||
for (vert_t::iterator v_iter = vertices.begin(); v_iter != vertices.end(); ++v_iter)
|
||||
for (const auto& vert : vertices)
|
||||
{
|
||||
++count;
|
||||
const LLVector3 v = v_iter->first + offset;
|
||||
const LLVector3 v = vert.first + offset;
|
||||
write_or_bust(fp, llformat("v %f %f %f\n",v[0] * xm, v[y], v[z]));
|
||||
}
|
||||
|
||||
for (vec3_t::iterator n_iter = normals.begin(); n_iter != normals.end(); ++n_iter)
|
||||
for (const auto& n : normals)
|
||||
{
|
||||
const LLVector3 n = *n_iter;
|
||||
write_or_bust(fp, llformat("vn %f %f %f\n",n[0] * xm, n[y], n[z]));
|
||||
}
|
||||
|
||||
for (vert_t::iterator v_iter = vertices.begin(); v_iter != vertices.end(); ++v_iter)
|
||||
for (const auto& vert : vertices)
|
||||
{
|
||||
write_or_bust(fp, llformat("vt %f %f\n", v_iter->second[0], v_iter->second[1]));
|
||||
write_or_bust(fp, llformat("vt %f %f\n", vert.second[0], vert.second[1]));
|
||||
}
|
||||
|
||||
//Write triangles
|
||||
for (tri_t::iterator t_iter = triangles.begin(); t_iter != triangles.end(); ++t_iter)
|
||||
for (const auto& triangle : triangles)
|
||||
{
|
||||
const int f1 = t_iter->v0 + index + 1;
|
||||
const int f2 = t_iter->v1 + index + 1;
|
||||
const int f3 = t_iter->v2 + index + 1;
|
||||
const int f1 = triangle.v0 + index + 1;
|
||||
const int f2 = triangle.v1 + index + 1;
|
||||
const int f3 = triangle.v2 + index + 1;
|
||||
write_or_bust(fp, llformat("f %d/%d/%d %d/%d/%d %d/%d/%d\n",
|
||||
f1,f1,f1,f2,f2,f2,f3,f3,f3));
|
||||
}
|
||||
|
||||
@@ -32,16 +32,18 @@
|
||||
|
||||
// library includes
|
||||
#include "aifilepicker.h"
|
||||
#include "llavatarnamecache.h"
|
||||
#include "llnotificationsutil.h"
|
||||
|
||||
// newview includes
|
||||
#include "lfsimfeaturehandler.h"
|
||||
#include "llface.h"
|
||||
#include "llvovolume.h"
|
||||
#include "llviewerinventory.h"
|
||||
#include "llinventorymodel.h"
|
||||
#include "llinventoryfunctions.h"
|
||||
#include "llface.h"
|
||||
#include "llversioninfo.h"
|
||||
#include "llviewerinventory.h"
|
||||
#include "llviewertexturelist.h"
|
||||
#include "llvovolume.h"
|
||||
|
||||
// menu includes
|
||||
#include "llevent.h"
|
||||
@@ -74,11 +76,11 @@ typedef LLMemberListener<LLView> view_listener_t;
|
||||
|
||||
namespace DAEExportUtil
|
||||
{
|
||||
static LLUUID LL_TEXTURE_PLYWOOD = LLUUID("89556747-24cb-43ed-920b-47caed15465f");
|
||||
static LLUUID LL_TEXTURE_BLANK = LLUUID("5748decc-f629-461c-9a36-a35a221fe21f");
|
||||
static LLUUID LL_TEXTURE_INVISIBLE = LLUUID("38b86f85-2575-52a9-a531-23108d8da837");
|
||||
static LLUUID LL_TEXTURE_TRANSPARENT = LLUUID("8dcd4a48-2d37-4909-9f78-f7a9eb4ef903");
|
||||
static LLUUID LL_TEXTURE_MEDIA = LLUUID("8b5fec65-8d8d-9dc5-cda8-8fdf2716e361");
|
||||
const auto LL_TEXTURE_PLYWOOD = LLUUID("89556747-24cb-43ed-920b-47caed15465f");
|
||||
const auto LL_TEXTURE_BLANK = LLUUID("5748decc-f629-461c-9a36-a35a221fe21f");
|
||||
const auto LL_TEXTURE_INVISIBLE = LLUUID("38b86f85-2575-52a9-a531-23108d8da837");
|
||||
const auto LL_TEXTURE_TRANSPARENT = LLUUID("8dcd4a48-2d37-4909-9f78-f7a9eb4ef903");
|
||||
const auto LL_TEXTURE_MEDIA = LLUUID("8b5fec65-8d8d-9dc5-cda8-8fdf2716e361");
|
||||
|
||||
enum image_format_type
|
||||
{
|
||||
@@ -105,23 +107,17 @@ namespace DAEExportUtil
|
||||
|
||||
// See if any of the inventory items matching this texture id are exportable
|
||||
ExportPolicy policy = LFSimFeatureHandler::instance().exportPolicy();
|
||||
for (size_t i = 0; i < items.size(); i++)
|
||||
for (const auto& item : items)
|
||||
{
|
||||
const LLPermissions item_permissions = items[i]->getPermissions();
|
||||
const LLPermissions item_permissions = item->getPermissions();
|
||||
if (item_permissions.allowExportBy(gAgentID, policy))
|
||||
{
|
||||
if (name != NULL)
|
||||
{
|
||||
(*name) = items[i]->getName();
|
||||
}
|
||||
if (name) *name = item->getName();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (name != NULL)
|
||||
{
|
||||
(*name) = id.getString();
|
||||
}
|
||||
if (name) *name = id.getString();
|
||||
|
||||
return (policy & ep_full_perm) == ep_full_perm;
|
||||
}
|
||||
@@ -206,7 +202,7 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
BOOL postBuild()
|
||||
BOOL postBuild() override
|
||||
{
|
||||
mFileName = getChildView("file name editor");
|
||||
mExportBtn = getChildView("export button");
|
||||
@@ -306,14 +302,9 @@ public:
|
||||
S32 getNumExportableTextures()
|
||||
{
|
||||
S32 res = 0;
|
||||
|
||||
for (DAESaver::string_list_t::const_iterator t = mSaver.mTextureNames.begin(); t != mSaver.mTextureNames.end(); ++t)
|
||||
for (const auto& name : mSaver.mTextureNames)
|
||||
{
|
||||
std::string name = *t;
|
||||
if (!name.empty())
|
||||
{
|
||||
++res;
|
||||
}
|
||||
if (!name.empty()) ++res;
|
||||
}
|
||||
|
||||
return res;
|
||||
@@ -365,7 +356,7 @@ public:
|
||||
gIdleCallbacks.addFunction(saveTexturesWorker, this);
|
||||
}
|
||||
|
||||
class CacheReadResponder : public LLTextureCache::ReadResponder
|
||||
class CacheReadResponder final : public LLTextureCache::ReadResponder
|
||||
{
|
||||
private:
|
||||
LLPointer<LLImageFormatted> mFormattedImage;
|
||||
@@ -413,7 +404,7 @@ public:
|
||||
mImageLocal = imagelocal;
|
||||
}
|
||||
|
||||
virtual void completed(bool success)
|
||||
void completed(bool success) override
|
||||
{
|
||||
if (success && mFormattedImage.notNull() && mImageSize > 0)
|
||||
{
|
||||
@@ -546,10 +537,8 @@ void DAESaver::updateTextureInfo()
|
||||
{
|
||||
LLTextureEntry* te = obj->getTE(face_num);
|
||||
const LLUUID id = te->getID();
|
||||
if (std::find(mTextures.begin(), mTextures.end(), id) != mTextures.end())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (std::find(mTextures.begin(), mTextures.end(), id) != mTextures.end()) continue;
|
||||
|
||||
mTextures.push_back(id);
|
||||
std::string name;
|
||||
if (id != DAEExportUtil::LL_TEXTURE_BLANK && DAEExportUtil::canExportTexture(id, &name))
|
||||
@@ -566,7 +555,6 @@ void DAESaver::updateTextureInfo()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class v4adapt
|
||||
{
|
||||
private:
|
||||
@@ -579,7 +567,7 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
void DAESaver::addSource(daeElement* mesh, const char* src_id, std::string params, const std::vector<F32> &vals)
|
||||
void DAESaver::addSource(daeElement* mesh, const char* src_id, const std::string& params, const std::vector<F32> &vals)
|
||||
{
|
||||
daeElement* source = mesh->add("source");
|
||||
source->setAttribute("id", src_id);
|
||||
@@ -588,9 +576,9 @@ void DAESaver::addSource(daeElement* mesh, const char* src_id, std::string param
|
||||
src_array->setAttribute("id", llformat("%s-%s", src_id, "array").c_str());
|
||||
src_array->setAttribute("count", llformat("%d", vals.size()).c_str());
|
||||
|
||||
for (U32 i = 0; i < vals.size(); i++)
|
||||
for (const auto& val : vals)
|
||||
{
|
||||
((domFloat_array*)src_array)->getValue().append(vals[i]);
|
||||
static_cast<domFloat_array*>(src_array)->getValue().append(val);
|
||||
}
|
||||
|
||||
domAccessor* acc = daeSafeCast<domAccessor>(source->add("technique_common accessor"));
|
||||
@@ -598,10 +586,10 @@ void DAESaver::addSource(daeElement* mesh, const char* src_id, std::string param
|
||||
acc->setCount(vals.size() / params.size());
|
||||
acc->setStride(params.size());
|
||||
|
||||
for (std::string::iterator p_iter = params.begin(); p_iter != params.end(); ++p_iter)
|
||||
for (const auto& param : params)
|
||||
{
|
||||
domElement* pX = acc->add("param");
|
||||
pX->setAttribute("name", llformat("%c", *p_iter).c_str());
|
||||
pX->setAttribute("name", (LLStringUtil::null + param).c_str());
|
||||
pX->setAttribute("type", "float");
|
||||
}
|
||||
}
|
||||
@@ -650,7 +638,7 @@ void DAESaver::addPolygons(daeElement* mesh, const char* geomID, const char* mat
|
||||
{
|
||||
for (S32 i = 0; i < face->mNumIndices; i++)
|
||||
{
|
||||
U16 index = index_offset + face->mIndices[i];
|
||||
U32 index = index_offset + face->mIndices[i];
|
||||
(p->getValue()).append(index);
|
||||
if (i % 3 == 0)
|
||||
{
|
||||
@@ -710,11 +698,21 @@ void DAESaver::transformTexCoord(S32 num_vert, LLVector2* coord, LLVector3* posi
|
||||
|
||||
bool DAESaver::saveDAE(std::string filename)
|
||||
{
|
||||
// Collada expects file and folder names to be escaped
|
||||
// Note: cdom::nativePathToUri()
|
||||
// Same as in LLDAELoader::OpenFile()
|
||||
const char* allowed =
|
||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||
"abcdefghijklmnopqrstuvwxyz"
|
||||
"0123456789"
|
||||
"%-._~:\"|\\/";
|
||||
std::string uri_filename = LLURI::escape(filename, allowed);
|
||||
|
||||
mAllMaterials.clear();
|
||||
mTotalNumMaterials = 0;
|
||||
DAE dae;
|
||||
// First set the filename to save
|
||||
daeElement* root = dae.add(filename);
|
||||
daeElement* root = dae.add(uri_filename);
|
||||
|
||||
// Obligatory elements in header
|
||||
daeElement* asset = root->add("asset");
|
||||
@@ -734,9 +732,13 @@ bool DAESaver::saveDAE(std::string filename)
|
||||
up_axis->setCharData("Z_UP");
|
||||
|
||||
// File creator
|
||||
std::string author;
|
||||
if (!LLAvatarNameCache::getNSName(gAgentID, author))
|
||||
author = "Unknown";
|
||||
|
||||
daeElement* contributor = asset->add("contributor");
|
||||
contributor->add("author")->setCharData(LLAppViewer::instance()->getSecondLifeTitle() + " User");
|
||||
contributor->add("authoring_tool")->setCharData(LLAppViewer::instance()->getSecondLifeTitle() + " Collada Export");
|
||||
contributor->add("author")->setCharData(author);
|
||||
contributor->add("authoring_tool")->setCharData(LLVersionInfo::getChannelAndVersion() + " Collada Export");
|
||||
|
||||
daeElement* images = root->add("library_images");
|
||||
daeElement* geomLib = root->add("library_geometries");
|
||||
@@ -825,7 +827,6 @@ bool DAESaver::saveDAE(std::string filename)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
addSource(mesh, llformat("%s-%s", geomID, "positions").c_str(), "XYZ", position_data);
|
||||
addSource(mesh, llformat("%s-%s", geomID, "normals").c_str(), "XYZ", normal_data);
|
||||
addSource(mesh, llformat("%s-%s", geomID, "map0").c_str(), "ST", uv_data);
|
||||
@@ -845,12 +846,11 @@ bool DAESaver::saveDAE(std::string filename)
|
||||
// Add triangles
|
||||
if (gSavedSettings.getBOOL("DAEExportConsolidateMaterials"))
|
||||
{
|
||||
for (U32 objMaterial = 0; objMaterial < objMaterials.size(); objMaterial++)
|
||||
for (const auto& objMaterial : objMaterials)
|
||||
{
|
||||
int_list_t faces;
|
||||
getFacesWithMaterial(obj, objMaterials[objMaterial], &faces);
|
||||
std::string matName = objMaterials[objMaterial].name;
|
||||
addPolygons(mesh, geomID, (matName + "-material").c_str(), obj, &faces);
|
||||
getFacesWithMaterial(obj, objMaterial, &faces);
|
||||
addPolygons(mesh, geomID, (objMaterial.name + "-material").c_str(), obj, &faces);
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -888,12 +888,12 @@ bool DAESaver::saveDAE(std::string filename)
|
||||
|
||||
// Bind materials
|
||||
daeElement* tq = nodeGeometry->add("bind_material technique_common");
|
||||
for (U32 objMaterial = 0; objMaterial < objMaterials.size(); objMaterial++)
|
||||
for (const auto& objMaterial : objMaterials)
|
||||
{
|
||||
std::string matName = objMaterials[objMaterial].name;
|
||||
daeElement* instanceMaterial = tq->add("instance_material");
|
||||
instanceMaterial->setAttribute("symbol", (matName + "-material").c_str());
|
||||
instanceMaterial->setAttribute("target", ("#" + matName + "-material").c_str());
|
||||
std::string matName = objMaterial.name + "-material";
|
||||
instanceMaterial->setAttribute("symbol", matName.c_str());
|
||||
instanceMaterial->setAttribute("target", ('#' + matName).c_str());
|
||||
}
|
||||
|
||||
nodeGeometry->setAttribute("url", llformat("#%s-%s", geomID, "mesh").c_str());
|
||||
@@ -904,12 +904,12 @@ bool DAESaver::saveDAE(std::string filename)
|
||||
generateEffects(effects);
|
||||
|
||||
// Materials
|
||||
for (U32 objMaterial = 0; objMaterial < mAllMaterials.size(); objMaterial++)
|
||||
for (const auto& objMaterial : mAllMaterials)
|
||||
{
|
||||
daeElement* mat = materials->add("material");
|
||||
mat->setAttribute("id", (mAllMaterials[objMaterial].name + "-material").c_str());
|
||||
mat->setAttribute("id", (objMaterial.name + "-material").c_str());
|
||||
daeElement* matEffect = mat->add("instance_effect");
|
||||
matEffect->setAttribute("url", ("#" + mAllMaterials[objMaterial].name + "-fx").c_str());
|
||||
matEffect->setAttribute("url", ('#' + objMaterial.name + "-fx").c_str());
|
||||
}
|
||||
|
||||
root->add("scene instance_visual_scene")->setAttribute("url", "#Scene");
|
||||
@@ -930,11 +930,11 @@ DAESaver::MaterialInfo DAESaver::getMaterial(LLTextureEntry* te)
|
||||
{
|
||||
if (gSavedSettings.getBOOL("DAEExportConsolidateMaterials"))
|
||||
{
|
||||
for (U32 i=0; i < mAllMaterials.size(); i++)
|
||||
for (const auto& mat : mAllMaterials)
|
||||
{
|
||||
if (mAllMaterials[i].matches(te))
|
||||
if (mat.matches(te))
|
||||
{
|
||||
return mAllMaterials[i];
|
||||
return mat;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -944,7 +944,7 @@ DAESaver::MaterialInfo DAESaver::getMaterial(LLTextureEntry* te)
|
||||
ret.color = te->getColor();
|
||||
ret.name = llformat("Material%d", mAllMaterials.size());
|
||||
mAllMaterials.push_back(ret);
|
||||
return mAllMaterials[mAllMaterials.size() - 1];
|
||||
return ret;
|
||||
}
|
||||
|
||||
void DAESaver::getMaterials(LLViewerObject* obj, material_list_t* ret)
|
||||
@@ -954,10 +954,7 @@ void DAESaver::getMaterials(LLViewerObject* obj, material_list_t* ret)
|
||||
{
|
||||
LLTextureEntry* te = obj->getTE(face_num);
|
||||
|
||||
if (skipFace(te))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (skipFace(te)) continue;
|
||||
|
||||
MaterialInfo mat = getMaterial(te);
|
||||
|
||||
@@ -968,7 +965,7 @@ void DAESaver::getMaterials(LLViewerObject* obj, material_list_t* ret)
|
||||
}
|
||||
}
|
||||
|
||||
void DAESaver::getFacesWithMaterial(LLViewerObject* obj, MaterialInfo& mat, int_list_t* ret)
|
||||
void DAESaver::getFacesWithMaterial(LLViewerObject* obj, const MaterialInfo& mat, int_list_t* ret)
|
||||
{
|
||||
S32 num_faces = obj->getVolume()->getNumVolumeFaces();
|
||||
for (S32 face_num = 0; face_num < num_faces; ++face_num)
|
||||
@@ -985,11 +982,11 @@ void DAESaver::generateEffects(daeElement *effects)
|
||||
// Effects (face color, alpha)
|
||||
bool export_textures = gSavedSettings.getBOOL("DAEExportTextures");
|
||||
|
||||
for (U32 mat = 0; mat < mAllMaterials.size(); mat++)
|
||||
for (const auto& mat : mAllMaterials)
|
||||
{
|
||||
LLColor4 color = mAllMaterials[mat].color;
|
||||
LLColor4 color = mat.color;
|
||||
domEffect* effect = (domEffect*)effects->add("effect");
|
||||
effect->setId((mAllMaterials[mat].name + "-fx").c_str());
|
||||
effect->setId((mat.name + "-fx").c_str());
|
||||
daeElement* profile = effect->add("profile_COMMON");
|
||||
std::string colladaName;
|
||||
|
||||
@@ -999,7 +996,7 @@ void DAESaver::generateEffects(daeElement *effects)
|
||||
U32 i = 0;
|
||||
for (; i < mTextures.size(); i++)
|
||||
{
|
||||
if (mAllMaterials[mat].textureID == mTextures[i])
|
||||
if (mat.textureID == mTextures[i])
|
||||
{
|
||||
textID = mTextures[i];
|
||||
break;
|
||||
@@ -1043,19 +1040,18 @@ void DAESaver::generateEffects(daeElement *effects)
|
||||
|
||||
void DAESaver::generateImagesSection(daeElement* images)
|
||||
{
|
||||
for (U32 i=0; i < mTextureNames.size(); i++)
|
||||
for (const auto& name : mTextureNames)
|
||||
{
|
||||
std::string name = mTextureNames[i];
|
||||
if (name.empty()) continue;
|
||||
std::string colladaName = name + "_" + mImageFormat;
|
||||
std::string colladaName = name + '_' + mImageFormat;
|
||||
daeElement* image = images->add("image");
|
||||
image->setAttribute("id", colladaName.c_str());
|
||||
image->setAttribute("name", colladaName.c_str());
|
||||
image->add("init_from")->setCharData(LLURI::escape(name + "." + mImageFormat));
|
||||
image->add("init_from")->setCharData(LLURI::escape(name + '.' + mImageFormat));
|
||||
}
|
||||
}
|
||||
|
||||
class DAESaveSelectedObjects : public view_listener_t
|
||||
class DAESaveSelectedObjects final : public view_listener_t
|
||||
{
|
||||
bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
|
||||
{
|
||||
|
||||
@@ -33,50 +33,29 @@ class LLViewerObject;
|
||||
class DAESaver
|
||||
{
|
||||
public:
|
||||
class MaterialInfo
|
||||
struct MaterialInfo
|
||||
{
|
||||
public:
|
||||
LLUUID textureID;
|
||||
LLColor4 color;
|
||||
std::string name;
|
||||
|
||||
bool matches(LLTextureEntry* te)
|
||||
bool matches(LLTextureEntry* te) const
|
||||
{
|
||||
return (textureID == te->getID()) && (color == te->getColor());
|
||||
}
|
||||
|
||||
bool operator== (const MaterialInfo& rhs)
|
||||
bool operator== (const MaterialInfo& rhs) const
|
||||
{
|
||||
return (textureID == rhs.textureID) && (color == rhs.color) && (name == rhs.name);
|
||||
}
|
||||
|
||||
bool operator!= (const MaterialInfo& rhs)
|
||||
bool operator!= (const MaterialInfo& rhs) const
|
||||
{
|
||||
return !(*this == rhs);
|
||||
}
|
||||
|
||||
MaterialInfo()
|
||||
{
|
||||
}
|
||||
|
||||
MaterialInfo(const MaterialInfo& rhs)
|
||||
{
|
||||
textureID = rhs.textureID;
|
||||
color = rhs.color;
|
||||
name = rhs.name;
|
||||
}
|
||||
|
||||
MaterialInfo& operator= (const MaterialInfo& rhs)
|
||||
{
|
||||
textureID = rhs.textureID;
|
||||
color = rhs.color;
|
||||
name = rhs.name;
|
||||
return *this;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
typedef std::vector<std::pair<LLViewerObject*,std::string> > obj_info_t;
|
||||
typedef std::vector<std::pair<LLViewerObject*,std::string>> obj_info_t;
|
||||
typedef uuid_vec_t id_list_t;
|
||||
typedef std::vector<std::string> string_list_t;
|
||||
typedef std::vector<S32> int_list_t;
|
||||
@@ -97,12 +76,12 @@ public:
|
||||
|
||||
private:
|
||||
void transformTexCoord(S32 num_vert, LLVector2* coord, LLVector3* positions, LLVector3* normals, LLTextureEntry* te, LLVector3 scale);
|
||||
void addSource(daeElement* mesh, const char* src_id, std::string params, const std::vector<F32> &vals);
|
||||
void addSource(daeElement* mesh, const char* src_id, const std::string& params, const std::vector<F32> &vals);
|
||||
void addPolygons(daeElement* mesh, const char* geomID, const char* materialID, LLViewerObject* obj, int_list_t* faces_to_include);
|
||||
bool skipFace(LLTextureEntry *te);
|
||||
MaterialInfo getMaterial(LLTextureEntry* te);
|
||||
void getMaterials(LLViewerObject* obj, material_list_t* ret);
|
||||
void getFacesWithMaterial(LLViewerObject* obj, MaterialInfo& mat, int_list_t* ret);
|
||||
void getFacesWithMaterial(LLViewerObject* obj, const MaterialInfo& mat, int_list_t* ret);
|
||||
void generateEffects(daeElement *effects);
|
||||
void generateImagesSection(daeElement* images);
|
||||
};
|
||||
|
||||
@@ -40,11 +40,21 @@
|
||||
/// Classes for AISv3 support.
|
||||
///----------------------------------------------------------------------------
|
||||
|
||||
extern AIHTTPTimeoutPolicy AISAPIResponder_timeout;
|
||||
|
||||
class AISCommand final : public LLHTTPClient::ResponderWithCompleted
|
||||
{
|
||||
public:
|
||||
typedef boost::function<void()> command_func_type;
|
||||
// AISCommand - base class for retry-able HTTP requests using the AISv3 cap.
|
||||
|
||||
// Limit max in flight requests to 2. Server was aggressively throttling otherwise.
|
||||
constexpr static U8 sMaxActiveAISCommands = 4;
|
||||
static U8 sActiveAISCommands;
|
||||
static std::queue< boost::intrusive_ptr< AISCommand > > sPendingAISCommands;
|
||||
|
||||
virtual AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return AISAPIResponder_timeout; }
|
||||
|
||||
AISCommand(AISAPI::COMMAND_TYPE type, const char* name, const LLUUID& targetId, AISAPI::completion_t callback) :
|
||||
mCommandFunc(NULL),
|
||||
mRetryPolicy(new LLAdaptiveRetryPolicy(1.0, 32.0, 2.0, 10)),
|
||||
@@ -53,10 +63,30 @@ public:
|
||||
mName(name),
|
||||
mType(type)
|
||||
{}
|
||||
|
||||
virtual ~AISCommand()
|
||||
{
|
||||
if (mActive)
|
||||
{
|
||||
--sActiveAISCommands;
|
||||
while (sActiveAISCommands < sMaxActiveAISCommands && !sPendingAISCommands.empty())
|
||||
{
|
||||
sPendingAISCommands.front()->dispatch();
|
||||
sPendingAISCommands.pop();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void run( command_func_type func )
|
||||
{
|
||||
(mCommandFunc = func)();
|
||||
mCommandFunc = func;
|
||||
if (sActiveAISCommands >= sMaxActiveAISCommands)
|
||||
{
|
||||
sPendingAISCommands.push(this);
|
||||
}
|
||||
else
|
||||
{
|
||||
dispatch();
|
||||
}
|
||||
}
|
||||
|
||||
char const* getName(void) const override
|
||||
@@ -64,6 +94,17 @@ public:
|
||||
return mName;
|
||||
}
|
||||
|
||||
private:
|
||||
void dispatch()
|
||||
{
|
||||
if (LLApp::isQuitting())
|
||||
{
|
||||
return;
|
||||
}
|
||||
++sActiveAISCommands;
|
||||
mActive = true;
|
||||
(mCommandFunc)();
|
||||
}
|
||||
void markComplete()
|
||||
{
|
||||
// Command func holds a reference to self, need to release it
|
||||
@@ -72,42 +113,56 @@ public:
|
||||
mRetryPolicy->onSuccess();
|
||||
}
|
||||
|
||||
void malformedResponse() { mStatus = HTTP_INTERNAL_ERROR_OTHER; mReason = llformat("Malformed response contents (original code: %d)", mStatus); }
|
||||
|
||||
bool onFailure()
|
||||
{
|
||||
bool retry = mStatus != HTTP_INTERNAL_ERROR_OTHER && mStatus != 410; // We handle these and stop
|
||||
LL_WARNS("Inventory") << "Inventory error: " << dumpResponse() << LL_ENDL;
|
||||
if (retry) mRetryPolicy->onFailure(mStatus, getResponseHeaders());
|
||||
mRetryPolicy->onFailure(mStatus, getResponseHeaders());
|
||||
F32 seconds_to_wait;
|
||||
if (retry && mRetryPolicy->shouldRetry(seconds_to_wait))
|
||||
if (mRetryPolicy->shouldRetry(seconds_to_wait))
|
||||
{
|
||||
if (mStatus == 503)
|
||||
{
|
||||
// Pad delay a bit more since we're getting throttled.
|
||||
seconds_to_wait += 10.f + ll_frand(4.f);
|
||||
}
|
||||
LL_WARNS("Inventory") << "Retrying in " << seconds_to_wait << "seconds due to inventory error for " << getName() <<": " << dumpResponse() << LL_ENDL;
|
||||
doAfterInterval(mCommandFunc,seconds_to_wait);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Command func holds a reference to self, need to release it
|
||||
// after a success or final failure.
|
||||
// *TODO: Notify user? This seems bad.
|
||||
LL_WARNS("Inventory") << "Abort due to inventory error for " << getName() <<": " << dumpResponse() << LL_ENDL;
|
||||
mCommandFunc = no_op;
|
||||
return false;
|
||||
}
|
||||
return retry;
|
||||
}
|
||||
|
||||
protected:
|
||||
void httpCompleted() override
|
||||
{
|
||||
AISAPI::InvokeAISCommandCoro(this, getURL(), mTargetId, getContent(), mCompletionFunc, (AISAPI::COMMAND_TYPE)mType);
|
||||
// Continue through if successful or longer retrying,
|
||||
if (isGoodStatus(mStatus) || !onFailure())
|
||||
{
|
||||
markComplete();
|
||||
AISAPI::InvokeAISCommandCoro(this, getURL(), mTargetId, getContent(), mCompletionFunc, (AISAPI::COMMAND_TYPE)mType);
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
command_func_type mCommandFunc;
|
||||
LLPointer<LLHTTPRetryPolicy> mRetryPolicy;
|
||||
AISAPI::completion_t mCompletionFunc;
|
||||
const LLUUID mTargetId;
|
||||
const char* mName;
|
||||
bool mActive = false;
|
||||
AISAPI::COMMAND_TYPE mType;
|
||||
};
|
||||
|
||||
U8 AISCommand::sActiveAISCommands = 0;
|
||||
std::queue< boost::intrusive_ptr< AISCommand > > AISCommand::sPendingAISCommands;
|
||||
|
||||
//=========================================================================
|
||||
const std::string AISAPI::INVENTORY_CAP_NAME("InventoryAPIv3");
|
||||
const std::string AISAPI::LIBRARY_CAP_NAME("LibraryAPIv3");
|
||||
@@ -312,21 +367,18 @@ void AISAPI::UpdateItem(const LLUUID &itemId, const LLSD &updates, completion_t
|
||||
boost::intrusive_ptr< AISCommand > responder = new AISCommand(UPDATEITEM, "UpdateItem",itemId, callback);
|
||||
responder->run(boost::bind(&LLHTTPClient::patch, url, updates, responder/*,*/ DEBUG_CURLIO_PARAM(debug_off), keep_alive, (AIStateMachine*)NULL, 0));
|
||||
}
|
||||
void AISAPI::InvokeAISCommandCoro(AISCommand* responder,
|
||||
void AISAPI::InvokeAISCommandCoro(LLHTTPClient::ResponderWithCompleted* responder,
|
||||
std::string url,
|
||||
LLUUID targetId, LLSD result, completion_t callback, COMMAND_TYPE type)
|
||||
{
|
||||
LL_DEBUGS("Inventory") << "url: " << url << LL_ENDL;
|
||||
|
||||
auto status = responder->getStatus();
|
||||
auto status = responder->getStatus();
|
||||
|
||||
if (!responder->isGoodStatus(status) || !result.isMap())
|
||||
{
|
||||
if (!result.isMap())
|
||||
{
|
||||
responder->malformedResponse();
|
||||
}
|
||||
else if (status == 410) //GONE
|
||||
{
|
||||
LL_WARNS("Inventory") << "Inventory error: " << status << ": " << responder->getReason() << LL_ENDL;
|
||||
if (status == 410) //GONE
|
||||
{
|
||||
// Item does not exist or was already deleted from server.
|
||||
// parent folder is out of sync
|
||||
@@ -360,11 +412,12 @@ void AISAPI::InvokeAISCommandCoro(AISCommand* responder,
|
||||
}
|
||||
}
|
||||
}
|
||||
// Keep these statuses accounted for in the responder too
|
||||
if (responder->onFailure()) // If we're retrying, exit early.
|
||||
return;
|
||||
if (!result.isMap())
|
||||
{
|
||||
LL_WARNS("Inventory") << "Inventory error: Malformed response contents" << LL_ENDL;
|
||||
}
|
||||
LL_WARNS("Inventory") << ll_pretty_print_sd(result) << LL_ENDL;
|
||||
}
|
||||
else responder->markComplete();
|
||||
|
||||
gInventory.onAISUpdateReceived("AISCommand", result);
|
||||
|
||||
|
||||
@@ -72,7 +72,7 @@ private:
|
||||
static std::string getInvCap();
|
||||
static std::string getLibCap();
|
||||
|
||||
static void InvokeAISCommandCoro(class AISCommand* responder,
|
||||
static void InvokeAISCommandCoro(LLHTTPClient::ResponderWithCompleted* responder,
|
||||
std::string url, LLUUID targetId, LLSD body,
|
||||
completion_t callback, COMMAND_TYPE type);
|
||||
};
|
||||
|
||||
@@ -235,7 +235,7 @@ struct crashpad_annotation : public crashpad::Annotation {
|
||||
crashpad_annotation(const char* name) : crashpad::Annotation(T, name, buffer.data())
|
||||
{}
|
||||
void set(const std::string& src) {
|
||||
LL_INFOS() << name() << ": " << src.c_str() << LL_ENDL;
|
||||
//LL_INFOS() << name() << ": " << src.c_str() << LL_ENDL;
|
||||
const size_t min_size = llmin(SIZE, src.size());
|
||||
memcpy(buffer.data(), src.data(), min_size);
|
||||
buffer.data()[SIZE - 1] = '\0';
|
||||
@@ -243,18 +243,27 @@ struct crashpad_annotation : public crashpad::Annotation {
|
||||
}
|
||||
};
|
||||
#define DEFINE_CRASHPAD_ANNOTATION(name, len) \
|
||||
static crashpad_annotation<len> g_crashpad_annotation_##name##_buffer(#name);
|
||||
static crashpad_annotation<len> g_crashpad_annotation_##name##_buffer("sentry[tags]["#name"]");
|
||||
#define DEFINE_CRASHPAD_ANNOTATION_EXTRA(name, len) \
|
||||
static crashpad_annotation<len> g_crashpad_annotation_##name##_buffer("sentry[extra]["#name"]");
|
||||
#define SET_CRASHPAD_ANNOTATION_VALUE(name, value) \
|
||||
g_crashpad_annotation_##name##_buffer.set(value);
|
||||
#else
|
||||
#define SET_CRASHPAD_ANNOTATION_VALUE(name, value)
|
||||
#define DEFINE_CRASHPAD_ANNOTATION_EXTRA(name, len)
|
||||
#define DEFINE_CRASHPAD_ANNOTATION(name, len)
|
||||
#endif
|
||||
|
||||
DEFINE_CRASHPAD_ANNOTATION(fatal_message, 512);
|
||||
DEFINE_CRASHPAD_ANNOTATION_EXTRA(fatal_message, 512);
|
||||
DEFINE_CRASHPAD_ANNOTATION(grid_name, 64);
|
||||
DEFINE_CRASHPAD_ANNOTATION(cpu_string, 128);
|
||||
DEFINE_CRASHPAD_ANNOTATION(startup_state, 32);
|
||||
DEFINE_CRASHPAD_ANNOTATION(region_name, 64);
|
||||
DEFINE_CRASHPAD_ANNOTATION_EXTRA(cpu_string, 128);
|
||||
DEFINE_CRASHPAD_ANNOTATION_EXTRA(gpu_string, 128);
|
||||
DEFINE_CRASHPAD_ANNOTATION_EXTRA(gl_version, 128);
|
||||
DEFINE_CRASHPAD_ANNOTATION_EXTRA(session_duration, 32);
|
||||
DEFINE_CRASHPAD_ANNOTATION_EXTRA(startup_state, 32);
|
||||
DEFINE_CRASHPAD_ANNOTATION_EXTRA(memory_sys, 32);
|
||||
DEFINE_CRASHPAD_ANNOTATION_EXTRA(memory_alloc, 32);
|
||||
|
||||
////// Windows-specific includes to the bottom - nasty defines in these pollute the preprocessor
|
||||
//
|
||||
@@ -1076,6 +1085,8 @@ bool LLAppViewer::init()
|
||||
gGLManager.getGLInfo(gDebugInfo);
|
||||
gGLManager.printGLInfoString();
|
||||
|
||||
writeDebugInfo();
|
||||
|
||||
// Load Default bindings
|
||||
load_default_bindings(gSavedSettings.getBOOL("LiruUseZQSDKeys"));
|
||||
|
||||
@@ -1163,6 +1174,8 @@ bool LLAppViewer::init()
|
||||
// save the graphics card
|
||||
gDebugInfo["GraphicsCard"] = LLFeatureManager::getInstance()->getGPUString();
|
||||
|
||||
writeDebugInfo();
|
||||
|
||||
// Save the current version to the prefs file
|
||||
gSavedSettings.setString("LastRunVersion",
|
||||
LLVersionInfo::getChannelAndVersion());
|
||||
@@ -1180,6 +1193,8 @@ bool LLAppViewer::init()
|
||||
gGLActive = FALSE;
|
||||
LLViewerMedia::initClass();
|
||||
LL_INFOS("InitInfo") << "Viewer media initialized." << LL_ENDL ;
|
||||
|
||||
writeDebugInfo();
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1331,6 +1346,12 @@ bool LLAppViewer::mainLoop()
|
||||
//clear call stack records
|
||||
LL_CLEAR_CALLSTACKS();
|
||||
|
||||
#ifdef USE_CRASHPAD
|
||||
// Not event based. Update per frame
|
||||
SET_CRASHPAD_ANNOTATION_VALUE(session_duration, std::to_string(LLFrameTimer::getElapsedSeconds()));
|
||||
SET_CRASHPAD_ANNOTATION_VALUE(memory_alloc, std::to_string((LLMemory::getCurrentRSS() >> 10)/1000.f));
|
||||
#endif
|
||||
|
||||
//check memory availability information
|
||||
checkMemory() ;
|
||||
|
||||
@@ -2784,7 +2805,13 @@ void LLAppViewer::writeDebugInfo(bool isStatic)
|
||||
#else
|
||||
SET_CRASHPAD_ANNOTATION_VALUE(fatal_message, gDebugInfo["FatalMessage"].asString());
|
||||
SET_CRASHPAD_ANNOTATION_VALUE(grid_name, gDebugInfo["GridName"].asString());
|
||||
SET_CRASHPAD_ANNOTATION_VALUE(region_name, gDebugInfo["CurrentRegion"].asString());
|
||||
SET_CRASHPAD_ANNOTATION_VALUE(cpu_string, gDebugInfo["CPUInfo"]["CPUString"].asString());
|
||||
SET_CRASHPAD_ANNOTATION_VALUE(gpu_string, gDebugInfo["GraphicsCard"].asString());
|
||||
SET_CRASHPAD_ANNOTATION_VALUE(gl_version, gDebugInfo["GLInfo"]["GLVersion"].asString());
|
||||
SET_CRASHPAD_ANNOTATION_VALUE(session_duration, std::to_string(LLFrameTimer::getElapsedSeconds()));
|
||||
SET_CRASHPAD_ANNOTATION_VALUE(memory_alloc, std::to_string((LLMemory::getCurrentRSS() >> 10) / 1000.f));
|
||||
SET_CRASHPAD_ANNOTATION_VALUE(memory_sys, std::to_string(gDebugInfo["RAMInfo"]["Physical"].asInteger() * 0.001f));
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -2969,8 +2996,8 @@ void LLAppViewer::handleViewerCrash()
|
||||
gDebugInfo["ViewerExePath"] = gDirUtilp->getExecutablePathAndName();
|
||||
gDebugInfo["CurrentPath"] = gDirUtilp->getCurPath();
|
||||
gDebugInfo["Dynamic"]["SessionLength"] = F32(LLFrameTimer::getElapsedSeconds());
|
||||
gDebugInfo["StartupState"] = LLStartUp::getStartupStateString();
|
||||
gDebugInfo["Dynamic"]["RAMInfo"]["Allocated"] = (LLSD::Integer) LLMemory::getCurrentRSS() >> 10;
|
||||
gDebugInfo["StartupState"] = LLStartUp::getStartupStateString();
|
||||
gDebugInfo["FirstLogin"] = (LLSD::Boolean) gAgent.isFirstLogin();
|
||||
gDebugInfo["FirstRunThisInstall"] = gSavedSettings.getBOOL("FirstRunThisInstall");
|
||||
|
||||
@@ -4832,11 +4859,14 @@ void LLAppViewer::disconnectViewer()
|
||||
// floater_sound_preview.xml
|
||||
// floater_animation_preview.xml
|
||||
// files.
|
||||
|
||||
// A more generic mechanism would be nice..
|
||||
LLFloater* fl = static_cast<LLFloater*>(*it);
|
||||
if (fl
|
||||
&& (fl->getName() == "Image Preview"
|
||||
|| fl->getName() == "Sound Preview"
|
||||
|| fl->getName() == "Animation Preview"
|
||||
|| fl->getName() == "perm prefs"
|
||||
))
|
||||
{
|
||||
floaters_to_close.push_back(fl);
|
||||
|
||||
@@ -114,7 +114,7 @@ void LLFloaterObjectIMInfo::onClickMute()
|
||||
// [/RLVa:KB]
|
||||
|
||||
LLMuteList::instance().add(LLMute(mOwnerID, mName, mGroupOwned ? LLMute::GROUP : LLMute::AGENT));
|
||||
LLFloaterMute::showInstance();
|
||||
LLFloaterMute::showInstance()->selectMute(mOwnerID);
|
||||
close();
|
||||
}
|
||||
|
||||
|
||||
@@ -42,6 +42,7 @@
|
||||
#include "llviewerwindow.h"
|
||||
#include "lluictrlfactory.h"
|
||||
#include "llpermissions.h"
|
||||
#include "llsdserialize.h"
|
||||
#include "hippogridmanager.h"
|
||||
|
||||
extern class AIHTTPTimeoutPolicy floaterPermsResponder_timeout;
|
||||
@@ -63,6 +64,25 @@ U32 LLFloaterPerms::getEveryonePerms(std::string prefix)
|
||||
return flags;
|
||||
}
|
||||
|
||||
//static
|
||||
U32 LLFloaterPerms::getNextOwnerPerms(std::string prefix)
|
||||
{
|
||||
U32 flags = PERM_MOVE;
|
||||
if ( gSavedSettings.getBOOL(prefix+"NextOwnerCopy") )
|
||||
{
|
||||
flags |= PERM_COPY;
|
||||
}
|
||||
if ( gSavedSettings.getBOOL(prefix+"NextOwnerModify") )
|
||||
{
|
||||
flags |= PERM_MODIFY;
|
||||
}
|
||||
if ( gSavedSettings.getBOOL(prefix+"NextOwnerTransfer") )
|
||||
{
|
||||
flags |= PERM_TRANSFER;
|
||||
}
|
||||
return flags;
|
||||
}
|
||||
|
||||
//static
|
||||
U32 LLFloaterPerms::getNextOwnerPermsInverted(std::string prefix)
|
||||
{
|
||||
@@ -83,25 +103,6 @@ U32 LLFloaterPerms::getNextOwnerPermsInverted(std::string prefix)
|
||||
return flags;
|
||||
}
|
||||
|
||||
//static
|
||||
U32 LLFloaterPerms::getNextOwnerPerms(std::string prefix)
|
||||
{
|
||||
U32 flags = PERM_MOVE;
|
||||
if ( gSavedSettings.getBOOL(prefix+"NextOwnerCopy") )
|
||||
{
|
||||
flags |= PERM_COPY;
|
||||
}
|
||||
if ( gSavedSettings.getBOOL(prefix+"NextOwnerModify") )
|
||||
{
|
||||
flags |= PERM_MODIFY;
|
||||
}
|
||||
if ( gSavedSettings.getBOOL(prefix+"NextOwnerTransfer") )
|
||||
{
|
||||
flags |= PERM_TRANSFER;
|
||||
}
|
||||
return flags;
|
||||
}
|
||||
|
||||
namespace
|
||||
{
|
||||
void handle_checkboxes(LLView* view, const std::string& ctrl_name, const LLSD& value, const std::string& type)
|
||||
@@ -138,6 +139,7 @@ LLFloaterPermsDefault::LLFloaterPermsDefault(const LLSD& seed)
|
||||
LLUICtrlFactory::getInstance()->buildFloater(this, "floater_perm_prefs.xml");
|
||||
}
|
||||
|
||||
|
||||
// String equivalents of enum Categories - initialization order must match enum order!
|
||||
const std::string LLFloaterPermsDefault::sCategoryNames[CAT_LAST] =
|
||||
{
|
||||
@@ -224,41 +226,66 @@ void LLFloaterPermsDefault::onClickCancel()
|
||||
close();
|
||||
}
|
||||
|
||||
class LLFloaterPermsResponder : public LLHTTPClient::ResponderWithResult
|
||||
struct LLFloaterPermsRequester final : LLSingleton<LLFloaterPermsRequester>
|
||||
{
|
||||
friend class LLSingleton<LLFloaterPermsRequester>;
|
||||
std::string mUrl;
|
||||
LLSD mReport;
|
||||
U8 mRetriesCount = 0;
|
||||
static void init(const std::string url, const LLSD report)
|
||||
{
|
||||
auto& inst = instance();
|
||||
inst.mUrl = url;
|
||||
inst.mReport = report;
|
||||
inst.retry();
|
||||
}
|
||||
bool retry();
|
||||
};
|
||||
|
||||
class LLFloaterPermsResponder final : public LLHTTPClient::ResponderWithResult
|
||||
{
|
||||
public:
|
||||
LLFloaterPermsResponder() : LLHTTPClient::ResponderWithResult() {}
|
||||
private:
|
||||
static std::string sPreviousReason;
|
||||
|
||||
void httpFailure(void)
|
||||
void httpFailure() override
|
||||
{
|
||||
// <singu> Prevent 404s from annoying the user all the tme
|
||||
if (mStatus == HTTP_NOT_FOUND)
|
||||
LL_INFOS("FloaterPermsResponder") << "Failed to send default permissions to simulator. 404, reason: " << mReason << LL_ENDL;
|
||||
else
|
||||
// </singu>
|
||||
auto* requester = LLFloaterPermsRequester::getIfExists();
|
||||
if (!requester || requester->retry()) return;
|
||||
|
||||
LLFloaterPermsRequester::deleteSingleton();
|
||||
const std::string& reason = getReason();
|
||||
// Do not display the same error more than once in a row
|
||||
if (mReason != sPreviousReason)
|
||||
if (reason != sPreviousReason)
|
||||
{
|
||||
sPreviousReason = mReason;
|
||||
sPreviousReason = reason;
|
||||
LLSD args;
|
||||
args["REASON"] = mReason;
|
||||
args["REASON"] = reason;
|
||||
LLNotificationsUtil::add("DefaultObjectPermissions", args);
|
||||
}
|
||||
}
|
||||
void httpSuccess(void)
|
||||
void httpSuccess() override
|
||||
{
|
||||
//const LLSD& content = getContent();
|
||||
//dump_sequential_xml("perms_responder_result.xml", content);
|
||||
|
||||
// Since we have had a successful POST call be sure to display the next error message
|
||||
// even if it is the same as a previous one.
|
||||
sPreviousReason = "";
|
||||
mCapSent = true;
|
||||
LL_INFOS("FloaterPermsResponder") << "Sent default permissions to simulator" << LL_ENDL;
|
||||
LL_INFOS("ObjectPermissionsFloater") << "Default permissions successfully sent to simulator" << LL_ENDL;
|
||||
}
|
||||
/*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy() const { return floaterPermsResponder_timeout; }
|
||||
/*virtual*/ char const* getName() const { return "LLFloaterPermsResponder"; }
|
||||
AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy() const override { return floaterPermsResponder_timeout; }
|
||||
char const* getName() const override { return "LLFloaterPermsResponder"; }
|
||||
};
|
||||
|
||||
bool LLFloaterPermsRequester::retry()
|
||||
{
|
||||
if (++mRetriesCount < 5)
|
||||
{
|
||||
LLHTTPClient::post(mUrl, mReport, new LLFloaterPermsResponder);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
std::string LLFloaterPermsResponder::sPreviousReason;
|
||||
|
||||
void LLFloaterPermsDefault::sendInitialPerms()
|
||||
@@ -266,12 +293,13 @@ void LLFloaterPermsDefault::sendInitialPerms()
|
||||
if (!mCapSent)
|
||||
{
|
||||
updateCap();
|
||||
mCapSent = true;
|
||||
}
|
||||
}
|
||||
|
||||
void LLFloaterPermsDefault::updateCap()
|
||||
{
|
||||
std::string object_url = gAgent.getRegion()->getCapability("AgentPreferences");
|
||||
std::string object_url = gAgent.getRegionCapability("AgentPreferences");
|
||||
|
||||
if (!object_url.empty())
|
||||
{
|
||||
@@ -283,13 +311,24 @@ void LLFloaterPermsDefault::updateCap()
|
||||
report["default_object_perm_masks"]["NextOwner"] =
|
||||
(LLSD::Integer)LLFloaterPerms::getNextOwnerPerms(sCategoryNames[CAT_OBJECTS]);
|
||||
|
||||
LLHTTPClient::post(object_url, report, new LLFloaterPermsResponder());
|
||||
{
|
||||
std::ostringstream sent_perms_log;
|
||||
LLSDSerialize::toPrettyXML(report, sent_perms_log);
|
||||
LL_DEBUGS("ObjectPermissionsFloater") << "Sending default permissions to '"
|
||||
<< object_url << "'\n"
|
||||
<< sent_perms_log.str() << LL_ENDL;
|
||||
}
|
||||
LLFloaterPermsRequester::init(object_url, report);
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_DEBUGS("ObjectPermissionsFloater") << "AgentPreferences cap not available." << LL_ENDL;
|
||||
}
|
||||
}
|
||||
|
||||
void LLFloaterPermsDefault::ok()
|
||||
{
|
||||
// Changes were already applied to saved settings.
|
||||
// Changes were already applied automatically to saved settings.
|
||||
// Refreshing internal values makes it official.
|
||||
refresh();
|
||||
|
||||
@@ -302,11 +341,11 @@ void LLFloaterPermsDefault::cancel()
|
||||
{
|
||||
for (U32 iter = CAT_OBJECTS; iter < CAT_LAST; iter++)
|
||||
{
|
||||
gSavedSettings.setBOOL(sCategoryNames[iter]+"ShareWithGroup", mShareWithGroup[iter]);
|
||||
gSavedSettings.setBOOL(sCategoryNames[iter]+"EveryoneCopy", mEveryoneCopy[iter]);
|
||||
gSavedSettings.setBOOL(sCategoryNames[iter]+"NextOwnerCopy", mNextOwnerCopy[iter]);
|
||||
gSavedSettings.setBOOL(sCategoryNames[iter]+"NextOwnerModify", mNextOwnerModify[iter]);
|
||||
gSavedSettings.setBOOL(sCategoryNames[iter]+"NextOwnerTransfer", mNextOwnerTransfer[iter]);
|
||||
gSavedSettings.setBOOL(sCategoryNames[iter]+"ShareWithGroup", mShareWithGroup[iter]);
|
||||
gSavedSettings.setBOOL(sCategoryNames[iter]+"EveryoneCopy", mEveryoneCopy[iter]);
|
||||
gSavedPerAccountSettings.setBOOL(sCategoryNames[iter]+"EveryoneExport", mEveryoneExport[iter]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2010,7 +2010,7 @@ void LLFolderView::scrollToShowSelection()
|
||||
// However we allow scrolling for folder views with mAutoSelectOverride
|
||||
// (used in Places SP) as an exception because the selection in them
|
||||
// is not reset during items filtering. See STORM-133.
|
||||
if ( (!LLInventoryModelBackgroundFetch::instance().folderFetchActive() || mAutoSelectOverride)
|
||||
if ( (LLInventoryModelBackgroundFetch::instance().isEverythingFetched() || mAutoSelectOverride)
|
||||
&& mSelectedItems.size() )
|
||||
{
|
||||
mNeedsScroll = TRUE;
|
||||
|
||||
@@ -801,7 +801,7 @@ void LLFloaterIMPanel::addHistoryLine(const std::string &utf8msg, LLColor4 incol
|
||||
// Now we're adding the actual line of text, so erase the
|
||||
// "Foo is typing..." text segment, and the optional timestamp
|
||||
// if it was present. JC
|
||||
removeTypingIndicator(NULL);
|
||||
removeTypingIndicator(source);
|
||||
|
||||
// Actually add the line
|
||||
bool prepend_newline = true;
|
||||
@@ -1458,7 +1458,7 @@ void LLFloaterIMPanel::onSendMsg()
|
||||
|
||||
bool other_was_typing = mOtherTyping;
|
||||
addHistoryLine(utf8_text, gSavedSettings.getColor("UserChatColor"), true, gAgentID, name);
|
||||
if (other_was_typing) addTypingIndicator(mOtherTypingName);
|
||||
if (other_was_typing) addTypingIndicator(mOtherParticipantUUID);
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -1588,53 +1588,84 @@ void LLFloaterIMPanel::sendTypingState(bool typing)
|
||||
}
|
||||
|
||||
|
||||
void LLFloaterIMPanel::processIMTyping(const LLIMInfo* im_info, bool typing)
|
||||
void LLFloaterIMPanel::processIMTyping(const LLUUID& from_id, BOOL typing)
|
||||
{
|
||||
if (typing)
|
||||
{
|
||||
// other user started typing
|
||||
std::string name;
|
||||
if (!LLAvatarNameCache::getNSName(im_info->mFromID, name)) name = im_info->mName;
|
||||
addTypingIndicator(name);
|
||||
addTypingIndicator(from_id);
|
||||
}
|
||||
else
|
||||
{
|
||||
// other user stopped typing
|
||||
removeTypingIndicator(im_info);
|
||||
removeTypingIndicator(from_id);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void LLFloaterIMPanel::addTypingIndicator(const std::string &name)
|
||||
void LLFloaterIMPanel::addTypingIndicator(const LLUUID& from_id)
|
||||
{
|
||||
// we may have lost a "stop-typing" packet, don't add it twice
|
||||
if (!mOtherTyping)
|
||||
// Singu TODO: Actually implement this?
|
||||
/* Operation of "<name> is typing" state machine:
|
||||
Not Typing state:
|
||||
|
||||
User types in P2P IM chat ... Send Start Typing, save Started time,
|
||||
start Idle Timer (N seconds) go to Typing state
|
||||
|
||||
Typing State:
|
||||
|
||||
User enters a non-return character: if Now - Started > ME_TYPING_TIMEOUT, send
|
||||
Start Typing, restart Idle Timer
|
||||
User enters a return character: stop Idle Timer, send IM and Stop
|
||||
Typing, go to Not Typing state
|
||||
Idle Timer expires: send Stop Typing, go to Not Typing state
|
||||
|
||||
The recipient has a complementary state machine in which a Start Typing
|
||||
that is not followed by either an IM or another Start Typing within OTHER_TYPING_TIMEOUT
|
||||
seconds switches the sender out of typing state.
|
||||
|
||||
This has the nice quality of being self-healing for lost start/stop
|
||||
messages while adding messages only for the (relatively rare) case of a
|
||||
user who types a very long message (one that takes more than ME_TYPING_TIMEOUT seconds
|
||||
to type).
|
||||
|
||||
Note: OTHER_TYPING_TIMEOUT must be > ME_TYPING_TIMEOUT for proper operation of the state machine
|
||||
|
||||
*/
|
||||
|
||||
// We may have lost a "stop-typing" packet, don't add it twice
|
||||
if (from_id.notNull() && !mOtherTyping)
|
||||
{
|
||||
mOtherTyping = true;
|
||||
// Save im_info so that removeTypingIndicator can be properly called because a timeout has occurred
|
||||
LLAvatarNameCache::getNSName(from_id, mOtherTypingName);
|
||||
|
||||
mTypingLineStartIndex = mHistoryEditor->getWText().length();
|
||||
LLUIString typing_start = sTypingStartString;
|
||||
typing_start.setArg("[NAME]", name);
|
||||
typing_start.setArg("[NAME]", mOtherTypingName);
|
||||
addHistoryLine(typing_start, gSavedSettings.getColor4("SystemChatColor"), false);
|
||||
mOtherTypingName = name;
|
||||
mOtherTyping = true;
|
||||
|
||||
// Update speaker
|
||||
LLIMSpeakerMgr* speaker_mgr = mSpeakers;
|
||||
if ( speaker_mgr )
|
||||
{
|
||||
speaker_mgr->setSpeakerTyping(from_id, TRUE);
|
||||
}
|
||||
}
|
||||
// MBW -- XXX -- merge from release broke this (argument to this function changed from an LLIMInfo to a name)
|
||||
// Richard will fix.
|
||||
// mSpeakers->setSpeakerTyping(im_info->mFromID, TRUE);
|
||||
}
|
||||
|
||||
|
||||
void LLFloaterIMPanel::removeTypingIndicator(const LLIMInfo* im_info)
|
||||
void LLFloaterIMPanel::removeTypingIndicator(const LLUUID& from_id)
|
||||
{
|
||||
if (mOtherTyping)
|
||||
{
|
||||
// Must do this first, otherwise addHistoryLine calls us again.
|
||||
mOtherTyping = false;
|
||||
|
||||
S32 chars_to_remove = mHistoryEditor->getWText().length() - mTypingLineStartIndex;
|
||||
mHistoryEditor->removeTextFromEnd(chars_to_remove);
|
||||
if (im_info)
|
||||
|
||||
if (from_id.notNull())
|
||||
{
|
||||
mSpeakers->setSpeakerTyping(im_info->mFromID, FALSE);
|
||||
mSpeakers->setSpeakerTyping(from_id, FALSE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,7 +39,6 @@
|
||||
|
||||
class LLAvatarName;
|
||||
class LLIMSpeakerMgr;
|
||||
class LLIMInfo;
|
||||
class LLInventoryCategory;
|
||||
class LLInventoryItem;
|
||||
class LLLineEditor;
|
||||
@@ -126,7 +125,7 @@ public:
|
||||
void sessionInitReplyReceived(const LLUUID& im_session_id);
|
||||
|
||||
// Handle other participant in the session typing.
|
||||
void processIMTyping(const LLIMInfo* im_info, bool typing);
|
||||
void processIMTyping(const LLUUID& from_id, BOOL typing);
|
||||
static void chatFromLogFile(LLLogChat::ELogLineType type, std::string line, void* userdata);
|
||||
|
||||
//show error statuses to the user
|
||||
@@ -177,10 +176,10 @@ private:
|
||||
void setTyping(bool typing);
|
||||
|
||||
// Add the "User is typing..." indicator.
|
||||
void addTypingIndicator(const std::string &name);
|
||||
void addTypingIndicator(const LLUUID& from_id);
|
||||
|
||||
// Remove the "User is typing..." indicator.
|
||||
void removeTypingIndicator(const LLIMInfo* im_info);
|
||||
void removeTypingIndicator(const LLUUID& from_id = LLUUID::null);
|
||||
|
||||
void sendTypingState(bool typing);
|
||||
|
||||
|
||||
@@ -641,8 +641,7 @@ void LLIMProcessing::processNewMessage(const LLUUID& from_id,
|
||||
{
|
||||
RlvUtil::sendBusyMessage(from_id, RlvStrings::getVersion(), session_id);
|
||||
// We won't receive a typing stop message, so do that manually (see comment at the end of LLFloaterIMPanel::sendMsg)
|
||||
LLPointer<LLIMInfo> im_info = new LLIMInfo(gMessageSystem);
|
||||
gIMMgr->processIMTypingStop(im_info);
|
||||
gIMMgr->processIMTypingStop(from_id, dialog);
|
||||
}
|
||||
// [/RLVa:KB]
|
||||
else if (offline == IM_ONLINE
|
||||
@@ -918,16 +917,15 @@ void LLIMProcessing::processNewMessage(const LLUUID& from_id,
|
||||
autoresponder_finish(show_autoresponded, session_id, from_id, name, itemid, is_muted);
|
||||
}
|
||||
}
|
||||
LLPointer<LLIMInfo> im_info = new LLIMInfo(gMessageSystem);
|
||||
gIMMgr->processIMTypingStart(im_info);
|
||||
|
||||
gIMMgr->processIMTypingStart(from_id, dialog);
|
||||
script_msg_api(from_id.asString() + ", 4");
|
||||
}
|
||||
break;
|
||||
|
||||
case IM_TYPING_STOP:
|
||||
{
|
||||
LLPointer<LLIMInfo> im_info = new LLIMInfo(gMessageSystem);
|
||||
gIMMgr->processIMTypingStop(im_info);
|
||||
gIMMgr->processIMTypingStop(from_id, dialog);
|
||||
script_msg_api(from_id.asString() + ", 5");
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -1138,23 +1138,23 @@ void LLIMMgr::noteMutedUsers(LLFloaterIMPanel* floater,
|
||||
}
|
||||
}
|
||||
|
||||
void LLIMMgr::processIMTypingStart(const LLIMInfo* im_info)
|
||||
void LLIMMgr::processIMTypingStart(const LLUUID& from_id, const EInstantMessage im_type)
|
||||
{
|
||||
processIMTypingCore(im_info, TRUE);
|
||||
processIMTypingCore(from_id, im_type, TRUE);
|
||||
}
|
||||
|
||||
void LLIMMgr::processIMTypingStop(const LLIMInfo* im_info)
|
||||
void LLIMMgr::processIMTypingStop(const LLUUID& from_id, const EInstantMessage im_type)
|
||||
{
|
||||
processIMTypingCore(im_info, FALSE);
|
||||
processIMTypingCore(from_id, im_type, FALSE);
|
||||
}
|
||||
|
||||
void LLIMMgr::processIMTypingCore(const LLIMInfo* im_info, BOOL typing)
|
||||
void LLIMMgr::processIMTypingCore(const LLUUID& from_id, const EInstantMessage im_type, BOOL typing)
|
||||
{
|
||||
LLUUID session_id = computeSessionID(im_info->mIMType, im_info->mFromID);
|
||||
LLFloaterIMPanel* floater = findFloaterBySession(session_id);
|
||||
if (floater)
|
||||
LLUUID session_id = computeSessionID(im_type, from_id);
|
||||
LLFloaterIMPanel* im_floater = findFloaterBySession(session_id);
|
||||
if (im_floater)
|
||||
{
|
||||
floater->processIMTyping(im_info, typing);
|
||||
im_floater->processIMTyping(from_id, typing);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1275,10 +1275,10 @@ LLFloaterChatterBox* LLIMMgr::getFloater()
|
||||
return LLFloaterChatterBox::getInstance(LLSD());
|
||||
}
|
||||
|
||||
class LLViewerChatterBoxSessionStartReply : public LLHTTPNode
|
||||
class LLViewerChatterBoxSessionStartReply final : public LLHTTPNode
|
||||
{
|
||||
public:
|
||||
virtual void describe(Description& desc) const
|
||||
void describe(Description& desc) const override
|
||||
{
|
||||
desc.shortInfo("Used for receiving a reply to a request to initialize an ChatterBox session");
|
||||
desc.postAPI();
|
||||
@@ -1287,18 +1287,15 @@ public:
|
||||
desc.source(__FILE__, __LINE__);
|
||||
}
|
||||
|
||||
virtual void post(ResponsePtr response,
|
||||
void post(ResponsePtr response,
|
||||
const LLSD& context,
|
||||
const LLSD& input) const
|
||||
const LLSD& input) const override
|
||||
{
|
||||
LLSD body;
|
||||
LLUUID temp_session_id;
|
||||
LLUUID session_id;
|
||||
bool success;
|
||||
|
||||
body = input["body"];
|
||||
success = body["success"].asBoolean();
|
||||
temp_session_id = body["temp_session_id"].asUUID();
|
||||
LLSD body = input["body"];
|
||||
bool success = body["success"].asBoolean();
|
||||
LLUUID temp_session_id = body["temp_session_id"].asUUID();
|
||||
|
||||
if ( success )
|
||||
{
|
||||
@@ -1336,10 +1333,10 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
class LLViewerChatterBoxSessionEventReply : public LLHTTPNode
|
||||
class LLViewerChatterBoxSessionEventReply final : public LLHTTPNode
|
||||
{
|
||||
public:
|
||||
virtual void describe(Description& desc) const
|
||||
void describe(Description& desc) const override
|
||||
{
|
||||
desc.shortInfo("Used for receiving a reply to a ChatterBox session event");
|
||||
desc.postAPI();
|
||||
@@ -1348,24 +1345,18 @@ public:
|
||||
desc.source(__FILE__, __LINE__);
|
||||
}
|
||||
|
||||
virtual void post(ResponsePtr response,
|
||||
void post(ResponsePtr response,
|
||||
const LLSD& context,
|
||||
const LLSD& input) const
|
||||
const LLSD& input) const override
|
||||
{
|
||||
LLUUID session_id;
|
||||
bool success;
|
||||
|
||||
LLSD body = input["body"];
|
||||
success = body["success"].asBoolean();
|
||||
session_id = body["session_id"].asUUID();
|
||||
bool success = body["success"].asBoolean();
|
||||
LLUUID session_id = body["session_id"].asUUID();
|
||||
|
||||
if ( !success )
|
||||
{
|
||||
//throw an error dialog
|
||||
LLFloaterIMPanel* floater =
|
||||
gIMMgr->findFloaterBySession(session_id);
|
||||
|
||||
if (floater)
|
||||
if (auto* floater = gIMMgr->findFloaterBySession(session_id))
|
||||
{
|
||||
floater->showSessionEventError(
|
||||
body["event"].asString(),
|
||||
@@ -1378,46 +1369,40 @@ public:
|
||||
class LLViewerForceCloseChatterBoxSession: public LLHTTPNode
|
||||
{
|
||||
public:
|
||||
virtual void post(ResponsePtr response,
|
||||
void post(ResponsePtr response,
|
||||
const LLSD& context,
|
||||
const LLSD& input) const
|
||||
const LLSD& input) const override
|
||||
{
|
||||
LLUUID session_id;
|
||||
std::string reason;
|
||||
LLUUID session_id = input["body"]["session_id"].asUUID();
|
||||
std::string reason = input["body"]["reason"].asString();
|
||||
|
||||
session_id = input["body"]["session_id"].asUUID();
|
||||
reason = input["body"]["reason"].asString();
|
||||
|
||||
LLFloaterIMPanel* floater =
|
||||
gIMMgr ->findFloaterBySession(session_id);
|
||||
|
||||
if ( floater )
|
||||
if (auto* floater = gIMMgr ->findFloaterBySession(session_id))
|
||||
{
|
||||
floater->showSessionForceClose(reason);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
class LLViewerChatterBoxSessionAgentListUpdates : public LLHTTPNode
|
||||
class LLViewerChatterBoxSessionAgentListUpdates final : public LLHTTPNode
|
||||
{
|
||||
public:
|
||||
virtual void post(
|
||||
void post(
|
||||
ResponsePtr responder,
|
||||
const LLSD& context,
|
||||
const LLSD& input) const
|
||||
const LLSD& input) const override
|
||||
{
|
||||
const LLUUID& session_id = input["body"]["session_id"].asUUID();
|
||||
gIMMgr->processAgentListUpdates(session_id, input["body"]);
|
||||
}
|
||||
};
|
||||
|
||||
class LLViewerChatterBoxSessionUpdate : public LLHTTPNode
|
||||
class LLViewerChatterBoxSessionUpdate final : public LLHTTPNode
|
||||
{
|
||||
public:
|
||||
virtual void post(
|
||||
void post(
|
||||
ResponsePtr responder,
|
||||
const LLSD& context,
|
||||
const LLSD& input) const
|
||||
const LLSD& input) const override
|
||||
{
|
||||
LLUUID session_id = input["body"]["session_id"].asUUID();
|
||||
LLFloaterIMPanel* im_floater = gIMMgr->findFloaterBySession(session_id);
|
||||
@@ -1445,14 +1430,14 @@ void leave_group_chat(const LLUUID& from_id, const LLUUID& session_id)
|
||||
gIMMgr->removeSession(session_id);
|
||||
}
|
||||
|
||||
class LLViewerChatterBoxInvitation : public LLHTTPNode
|
||||
class LLViewerChatterBoxInvitation final : public LLHTTPNode
|
||||
{
|
||||
public:
|
||||
|
||||
virtual void post(
|
||||
void post(
|
||||
ResponsePtr response,
|
||||
const LLSD& context,
|
||||
const LLSD& input) const
|
||||
const LLSD& input) const override
|
||||
{
|
||||
//for backwards compatiblity reasons...we need to still
|
||||
//check for 'text' or 'voice' invitations...bleh
|
||||
@@ -1582,10 +1567,9 @@ public:
|
||||
LLFloaterChat::addChat(chat, TRUE, is_this_agent);
|
||||
|
||||
//K now we want to accept the invitation
|
||||
std::string url = gAgent.getRegion()->getCapability(
|
||||
"ChatSessionRequest");
|
||||
std::string url = gAgent.getRegionCapability("ChatSessionRequest");
|
||||
|
||||
if ( url != "" )
|
||||
if (!url.empty())
|
||||
{
|
||||
LLSD data;
|
||||
data["method"] = "accept invitation";
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
class LLFloaterChatterBox;
|
||||
class LLFloaterIMPanel;
|
||||
|
||||
class LLIMMgr : public LLSingleton<LLIMMgr>
|
||||
class LLIMMgr final : public LLSingleton<LLIMMgr>
|
||||
{
|
||||
public:
|
||||
enum EInvitationType
|
||||
@@ -121,8 +121,8 @@ public:
|
||||
void updateFloaterSessionID(const LLUUID& old_session_id,
|
||||
const LLUUID& new_session_id);
|
||||
|
||||
void processIMTypingStart(const LLIMInfo* im_info);
|
||||
void processIMTypingStop(const LLIMInfo* im_info);
|
||||
void processIMTypingStart(const LLUUID& from_id, const EInstantMessage im_type);
|
||||
void processIMTypingStop(const LLUUID& from_id, const EInstantMessage im_type);
|
||||
|
||||
void clearNewIMNotification();
|
||||
|
||||
@@ -209,7 +209,7 @@ private:
|
||||
void noteOfflineUsers(LLFloaterIMPanel* panel, const uuid_vec_t& ids);
|
||||
void noteMutedUsers(LLFloaterIMPanel* panel, const uuid_vec_t& ids);
|
||||
|
||||
void processIMTypingCore(const LLIMInfo* im_info, BOOL typing);
|
||||
void processIMTypingCore(const LLUUID& from_id, const EInstantMessage im_type, BOOL typing);
|
||||
|
||||
private:
|
||||
std::set<LLHandle<LLFloater> > mFloaters;
|
||||
|
||||
@@ -72,7 +72,7 @@ namespace
|
||||
{
|
||||
// This method is used to return an object to mute given an object id.
|
||||
// Its used by the LLMute constructor and LLMuteList::isMuted.
|
||||
LLViewerObject* get_object_to_mute_from_id(LLUUID object_id)
|
||||
LLViewerObject* get_object_to_mute_from_id(const LLUUID& object_id)
|
||||
{
|
||||
LLViewerObject *objectp = gObjectList.findObject(object_id);
|
||||
if ((objectp) && (!objectp->isAvatar()))
|
||||
@@ -91,11 +91,11 @@ namespace
|
||||
class LLDispatchEmptyMuteList : public LLDispatchHandler
|
||||
{
|
||||
public:
|
||||
virtual bool operator()(
|
||||
bool operator()(
|
||||
const LLDispatcher* dispatcher,
|
||||
const std::string& key,
|
||||
const LLUUID& invoice,
|
||||
const sparam_t& strings)
|
||||
const sparam_t& strings) override
|
||||
{
|
||||
LLMuteList::getInstance()->setLoaded();
|
||||
return true;
|
||||
@@ -160,10 +160,10 @@ std::string LLMute::getDisplayType() const
|
||||
LLMuteList* LLMuteList::getInstance()
|
||||
{
|
||||
// Register callbacks at the first time that we find that the message system has been created.
|
||||
static BOOL registered = FALSE;
|
||||
if( !registered && gMessageSystem != NULL)
|
||||
static bool registered = false;
|
||||
if( !registered && gMessageSystem)
|
||||
{
|
||||
registered = TRUE;
|
||||
registered = true;
|
||||
// Register our various callbacks
|
||||
gMessageSystem->setHandlerFuncFast(_PREHASH_MuteListUpdate, processMuteListUpdate);
|
||||
gMessageSystem->setHandlerFuncFast(_PREHASH_UseCachedMuteList, processUseCachedMuteList);
|
||||
@@ -206,7 +206,7 @@ BOOL LLMuteList::isLinden(const std::string& name) const
|
||||
tokenizer::iterator token_iter = tokens.begin();
|
||||
|
||||
if (token_iter == tokens.end()) return FALSE;
|
||||
token_iter++;
|
||||
++token_iter;
|
||||
if (token_iter == tokens.end()) return FALSE;
|
||||
|
||||
std::string last_name = *token_iter;
|
||||
@@ -227,7 +227,7 @@ static LLVOAvatar* find_avatar(const LLUUID& id)
|
||||
}
|
||||
else
|
||||
{
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -237,6 +237,7 @@ BOOL LLMuteList::add(const LLMute& mute, U32 flags)
|
||||
if ((mute.mType == LLMute::AGENT)
|
||||
&& isLinden(mute.mName) && (flags & LLMute::flagTextChat || flags == 0))
|
||||
{
|
||||
LL_WARNS() << "Trying to mute a Linden; ignored" << LL_ENDL;
|
||||
LLNotifications::instance().add("MuteLinden", LLSD(), LLSD());
|
||||
return FALSE;
|
||||
}
|
||||
@@ -245,6 +246,7 @@ BOOL LLMuteList::add(const LLMute& mute, U32 flags)
|
||||
if (mute.mType == LLMute::AGENT
|
||||
&& mute.mID == gAgent.getID())
|
||||
{
|
||||
LL_WARNS() << "Trying to self; ignored" << LL_ENDL;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@@ -275,67 +277,67 @@ BOOL LLMuteList::add(const LLMute& mute, U32 flags)
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_INFOS() << "duplicate mute ignored" << LL_ENDL;
|
||||
// was duplicate
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
// Need a local (non-const) copy to set up flags properly.
|
||||
LLMute localmute = mute;
|
||||
|
||||
// If an entry for the same entity is already in the list, remove it, saving flags as necessary.
|
||||
mute_set_t::iterator it = mMutes.find(localmute);
|
||||
bool duplicate = it != mMutes.end();
|
||||
if (duplicate)
|
||||
{
|
||||
// This mute is already in the list. Save the existing entry's flags if that's warranted.
|
||||
localmute.mFlags = it->mFlags;
|
||||
|
||||
mMutes.erase(it);
|
||||
// Don't need to call notifyObservers() here, since it will happen after the entry has been re-added below.
|
||||
}
|
||||
else
|
||||
{
|
||||
// Need a local (non-const) copy to set up flags properly.
|
||||
LLMute localmute = mute;
|
||||
|
||||
// If an entry for the same entity is already in the list, remove it, saving flags as necessary.
|
||||
mute_set_t::iterator it = mMutes.find(localmute);
|
||||
if (it != mMutes.end())
|
||||
{
|
||||
// This mute is already in the list. Save the existing entry's flags if that's warranted.
|
||||
localmute.mFlags = it->mFlags;
|
||||
|
||||
mMutes.erase(it);
|
||||
// Don't need to call notifyObservers() here, since it will happen after the entry has been re-added below.
|
||||
}
|
||||
else
|
||||
{
|
||||
// There was no entry in the list previously. Fake things up by making it look like the previous entry had all properties unmuted.
|
||||
localmute.mFlags = LLMute::flagAll;
|
||||
}
|
||||
// There was no entry in the list previously. Fake things up by making it look like the previous entry had all properties unmuted.
|
||||
localmute.mFlags = LLMute::flagAll;
|
||||
}
|
||||
|
||||
if(flags)
|
||||
{
|
||||
// The user passed some combination of flags. Make sure those flag bits are turned off (i.e. those properties will be muted).
|
||||
localmute.mFlags &= (~flags);
|
||||
}
|
||||
else
|
||||
{
|
||||
// The user passed 0. Make sure all flag bits are turned off (i.e. all properties will be muted).
|
||||
localmute.mFlags = 0;
|
||||
}
|
||||
if(flags)
|
||||
{
|
||||
// The user passed some combination of flags. Make sure those flag bits are turned off (i.e. those properties will be muted).
|
||||
localmute.mFlags &= (~flags);
|
||||
}
|
||||
else
|
||||
{
|
||||
// The user passed 0. Make sure all flag bits are turned off (i.e. all properties will be muted).
|
||||
localmute.mFlags = 0;
|
||||
}
|
||||
|
||||
// (re)add the mute entry.
|
||||
{
|
||||
std::pair<mute_set_t::iterator, bool> result = mMutes.insert(localmute);
|
||||
if (result.second)
|
||||
// (re)add the mute entry.
|
||||
{
|
||||
auto result = mMutes.insert(localmute);
|
||||
if (result.second)
|
||||
{
|
||||
LL_INFOS() << "Muting " << localmute.mName << " id " << localmute.mID << " flags " << localmute.mFlags << LL_ENDL;
|
||||
updateAdd(localmute);
|
||||
notifyObservers();
|
||||
notifyObserversDetailed(localmute);
|
||||
if(!(localmute.mFlags & LLMute::flagParticles))
|
||||
{
|
||||
LL_INFOS() << "Muting " << localmute.mName << " id " << localmute.mID << " flags " << localmute.mFlags << LL_ENDL;
|
||||
updateAdd(localmute);
|
||||
notifyObservers();
|
||||
notifyObserversDetailed(localmute);
|
||||
if(!(localmute.mFlags & LLMute::flagParticles))
|
||||
//Kill all particle systems owned by muted task
|
||||
if(localmute.mType == LLMute::AGENT || localmute.mType == LLMute::OBJECT)
|
||||
{
|
||||
//Kill all particle systems owned by muted task
|
||||
if(localmute.mType == LLMute::AGENT || localmute.mType == LLMute::OBJECT)
|
||||
{
|
||||
LLViewerPartSim::getInstance()->clearParticlesByOwnerID(localmute.mID);
|
||||
}
|
||||
LLViewerPartSim::getInstance()->clearParticlesByOwnerID(localmute.mID);
|
||||
}
|
||||
//mute local lights that are attached to the avatar
|
||||
LLVOAvatar *avatarp = find_avatar(localmute.mID);
|
||||
if (avatarp)
|
||||
{
|
||||
LLPipeline::removeMutedAVsLights(avatarp);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
//mute local lights that are attached to the avatar
|
||||
LLVOAvatar *avatarp = find_avatar(localmute.mID);
|
||||
if (avatarp)
|
||||
{
|
||||
LLPipeline::removeMutedAVsLights(avatarp);
|
||||
}
|
||||
return !duplicate;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -514,18 +516,14 @@ std::vector<LLMute> LLMuteList::getMutes() const
|
||||
{
|
||||
std::vector<LLMute> mutes;
|
||||
|
||||
for (mute_set_t::const_iterator it = mMutes.begin();
|
||||
it != mMutes.end();
|
||||
++it)
|
||||
for (const auto& mMute : mMutes)
|
||||
{
|
||||
mutes.push_back(*it);
|
||||
mutes.push_back(mMute);
|
||||
}
|
||||
|
||||
for (string_set_t::const_iterator it = mLegacyMutes.begin();
|
||||
it != mLegacyMutes.end();
|
||||
++it)
|
||||
for (const auto& mLegacyMute : mLegacyMutes)
|
||||
{
|
||||
LLMute legacy(LLUUID::null, *it);
|
||||
LLMute legacy(LLUUID::null, mLegacyMute);
|
||||
mutes.push_back(legacy);
|
||||
}
|
||||
|
||||
@@ -538,7 +536,7 @@ std::vector<LLMute> LLMuteList::getMutes() const
|
||||
//-----------------------------------------------------------------------------
|
||||
BOOL LLMuteList::loadFromFile(const std::string& filename)
|
||||
{
|
||||
if(!filename.size())
|
||||
if(filename.empty())
|
||||
{
|
||||
LL_WARNS() << "Mute List Filename is Empty!" << LL_ENDL;
|
||||
return FALSE;
|
||||
@@ -588,7 +586,7 @@ BOOL LLMuteList::loadFromFile(const std::string& filename)
|
||||
//-----------------------------------------------------------------------------
|
||||
BOOL LLMuteList::saveToFile(const std::string& filename)
|
||||
{
|
||||
if(!filename.size())
|
||||
if(filename.empty())
|
||||
{
|
||||
LL_WARNS() << "Mute List Filename is Empty!" << LL_ENDL;
|
||||
return FALSE;
|
||||
@@ -603,23 +601,19 @@ BOOL LLMuteList::saveToFile(const std::string& filename)
|
||||
// legacy mutes have null uuid
|
||||
std::string id_string;
|
||||
LLUUID::null.toString(id_string);
|
||||
for (string_set_t::iterator it = mLegacyMutes.begin();
|
||||
it != mLegacyMutes.end();
|
||||
++it)
|
||||
for (const auto& mLegacyMute : mLegacyMutes)
|
||||
{
|
||||
fprintf(fp, "%d %s %s|\n", (S32)LLMute::BY_NAME, id_string.c_str(), it->c_str());
|
||||
fprintf(fp, "%d %s %s|\n", (S32)LLMute::BY_NAME, id_string.c_str(), mLegacyMute.c_str());
|
||||
}
|
||||
for (mute_set_t::iterator it = mMutes.begin();
|
||||
it != mMutes.end();
|
||||
++it)
|
||||
for (const auto& mMute : mMutes)
|
||||
{
|
||||
// Don't save external mutes as they are not sent to the server and probably won't
|
||||
//be valid next time anyway.
|
||||
if (it->mType != LLMute::EXTERNAL)
|
||||
if (mMute.mType != LLMute::EXTERNAL)
|
||||
{
|
||||
it->mID.toString(id_string);
|
||||
const std::string& name = it->mName;
|
||||
fprintf(fp, "%d %s %s|%u\n", (S32)it->mType, id_string.c_str(), name.c_str(), it->mFlags);
|
||||
mMute.mID.toString(id_string);
|
||||
const std::string& name = mMute.mName;
|
||||
fprintf(fp, "%d %s %s|%u\n", (S32)mMute.mType, id_string.c_str(), name.c_str(), mMute.mFlags);
|
||||
}
|
||||
}
|
||||
fclose(fp);
|
||||
@@ -629,6 +623,9 @@ BOOL LLMuteList::saveToFile(const std::string& filename)
|
||||
|
||||
BOOL LLMuteList::isMuted(const LLUUID& id, const std::string& name, U32 flags) const
|
||||
{
|
||||
if (mMutes.empty() && mLegacyMutes.empty())
|
||||
return FALSE;
|
||||
|
||||
// for objects, check for muting on their parent prim
|
||||
LLViewerObject* mute_object = get_object_to_mute_from_id(id);
|
||||
LLUUID id_to_check = (mute_object) ? mute_object->getID() : id;
|
||||
@@ -662,10 +659,8 @@ BOOL LLMuteList::isMuted(const LLUUID& id, const std::string& name, U32 flags) c
|
||||
//-----------------------------------------------------------------------------
|
||||
void LLMuteList::requestFromServer(const LLUUID& agent_id)
|
||||
{
|
||||
std::string agent_id_string;
|
||||
std::string filename;
|
||||
agent_id.toString(agent_id_string);
|
||||
filename = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,agent_id_string) + ".cached_mute";
|
||||
std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,
|
||||
llformat("%s.cached_mute", agent_id.asString().c_str()));
|
||||
LLCRC crc;
|
||||
crc.update(filename);
|
||||
|
||||
@@ -688,10 +683,8 @@ void LLMuteList::cache(const LLUUID& agent_id)
|
||||
// Write to disk even if empty.
|
||||
if(mIsLoaded)
|
||||
{
|
||||
std::string agent_id_string;
|
||||
std::string filename;
|
||||
agent_id.toString(agent_id_string);
|
||||
filename = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,agent_id_string) + ".cached_mute";
|
||||
std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,
|
||||
llformat("%s.cached_mute", agent_id.asString().c_str()));
|
||||
saveToFile(filename);
|
||||
}
|
||||
}
|
||||
@@ -729,10 +722,8 @@ void LLMuteList::processUseCachedMuteList(LLMessageSystem* msg, void**)
|
||||
{
|
||||
LL_INFOS() << "LLMuteList::processUseCachedMuteList()" << LL_ENDL;
|
||||
|
||||
std::string agent_id_string;
|
||||
gAgent.getID().toString(agent_id_string);
|
||||
std::string filename;
|
||||
filename = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,agent_id_string) + ".cached_mute";
|
||||
std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,
|
||||
llformat("%s.cached_mute", gAgent.getID().asString().c_str()));
|
||||
LLMuteList::getInstance()->loadFromFile(filename);
|
||||
}
|
||||
|
||||
|
||||
@@ -985,7 +985,8 @@ void LLPanelAvatarPicks::processProperties(void* data, EAvatarProcessorType type
|
||||
// are no tabs in the container.
|
||||
tabs->selectFirstTab();
|
||||
bool edit(getPanelAvatar()->isEditable());
|
||||
bool can_add = self && tabs->getTabCount() < LLAgentBenefitsMgr::current().getPicksLimit();
|
||||
auto count = tabs->getTabCount();
|
||||
bool can_add = self && count < LLAgentBenefitsMgr::current().getPicksLimit();
|
||||
LLView* view = getChildView("New...");
|
||||
view->setEnabled(can_add
|
||||
// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a)
|
||||
@@ -993,7 +994,7 @@ void LLPanelAvatarPicks::processProperties(void* data, EAvatarProcessorType type
|
||||
// [/RLVa:KB]
|
||||
view->setVisible(self && edit);
|
||||
view = getChildView("Delete...");
|
||||
view->setEnabled(can_add);
|
||||
view->setEnabled(count);
|
||||
view->setVisible(self && edit);
|
||||
|
||||
//For pick import/export - RK
|
||||
@@ -1001,7 +1002,7 @@ void LLPanelAvatarPicks::processProperties(void* data, EAvatarProcessorType type
|
||||
view->setVisible(self && edit);
|
||||
view->setEnabled(can_add);
|
||||
view = getChildView("Export...");
|
||||
view->setEnabled(can_add);
|
||||
view->setEnabled(count);
|
||||
view->setVisible(self);
|
||||
|
||||
childSetVisible("loading_text", false);
|
||||
|
||||
@@ -752,7 +752,7 @@ void LLSpatialGroup::handleChildAddition(const OctreeNode* parent, OctreeNode* c
|
||||
{
|
||||
if (child->getListenerCount() == 0)
|
||||
{
|
||||
new LLSpatialGroup(child, getSpatialPartition());
|
||||
LLPointer<LLSpatialGroup> tmp = new LLSpatialGroup(child, getSpatialPartition());
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -817,7 +817,7 @@ LLSpatialPartition::LLSpatialPartition(U32 data_mask, BOOL render_by_group, U32
|
||||
mSlopRatio = 0.25f;
|
||||
mInfiniteFarClip = FALSE;
|
||||
|
||||
new LLSpatialGroup(mOctree, this);
|
||||
LLPointer<LLSpatialGroup> tmp = new LLSpatialGroup(mOctree, this);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -116,7 +116,7 @@ public:
|
||||
BOOL mParticle;
|
||||
F32 mPartSize;
|
||||
F32 mVSize;
|
||||
LLSpatialGroup* mGroup;
|
||||
LLPointer<LLSpatialGroup> mGroup;
|
||||
LL_ALIGN_16(LLFace* mFace); //associated face
|
||||
F32 mDistance;
|
||||
U32 mDrawMode;
|
||||
@@ -478,7 +478,7 @@ class LLCullResult
|
||||
public:
|
||||
LLCullResult() {}
|
||||
|
||||
typedef std::vector<LLSpatialGroup*> sg_list_t;
|
||||
typedef std::vector<LLPointer<LLSpatialGroup> > sg_list_t;
|
||||
typedef std::vector<LLDrawable*> drawable_list_t;
|
||||
typedef std::vector<LLSpatialBridge*> bridge_list_t;
|
||||
typedef std::vector<LLDrawInfo*> drawinfo_list_t;
|
||||
|
||||
@@ -493,21 +493,10 @@ void LLSurface::disconnectNeighbor(LLSurface* surfacep, U32 direction)
|
||||
{
|
||||
if (surfacep && surfacep == mNeighbors[direction])
|
||||
{
|
||||
// Iterate through surface patches, removing any connectivity to removed surface.
|
||||
// Extra branches for debugging.
|
||||
if (!gHippoGridManager->getCurrentGrid()->isSecondLife())
|
||||
mNeighbors[direction] = NULL;
|
||||
for (auto& patchp : mPatchList)
|
||||
{
|
||||
for (auto& patchp : mPatchList)
|
||||
{
|
||||
patchp->disconnectNeighbor(surfacep);
|
||||
}
|
||||
}
|
||||
if (gHippoGridManager->getCurrentGrid()->isSecondLife())
|
||||
{
|
||||
for (auto& patchp : mPatchList)
|
||||
{
|
||||
patchp->disconnectNeighbor(surfacep);
|
||||
}
|
||||
patchp->disconnectNeighbor(surfacep);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -515,46 +504,13 @@ void LLSurface::disconnectNeighbor(LLSurface* surfacep, U32 direction)
|
||||
|
||||
void LLSurface::disconnectAllNeighbors()
|
||||
{
|
||||
// Pulled out of loop to debug.
|
||||
if (mNeighbors[EAST])
|
||||
for (size_t i = 0; i < mNeighbors.size(); ++i)
|
||||
{
|
||||
mNeighbors[EAST]->disconnectNeighbor(this, gDirOpposite[EAST]);
|
||||
}
|
||||
if (mNeighbors[NORTH])
|
||||
{
|
||||
mNeighbors[NORTH]->disconnectNeighbor(this, gDirOpposite[NORTH]);
|
||||
}
|
||||
if (mNeighbors[WEST])
|
||||
{
|
||||
mNeighbors[WEST]->disconnectNeighbor(this, gDirOpposite[WEST]);
|
||||
}
|
||||
if (mNeighbors[SOUTH])
|
||||
{
|
||||
mNeighbors[SOUTH]->disconnectNeighbor(this, gDirOpposite[SOUTH]);
|
||||
}
|
||||
if (mNeighbors[NORTHEAST])
|
||||
{
|
||||
mNeighbors[NORTHEAST]->disconnectNeighbor(this, gDirOpposite[NORTHEAST]);
|
||||
}
|
||||
if (mNeighbors[NORTHWEST])
|
||||
{
|
||||
mNeighbors[NORTHWEST]->disconnectNeighbor(this, gDirOpposite[NORTHWEST]);
|
||||
}
|
||||
if (mNeighbors[SOUTHWEST])
|
||||
{
|
||||
mNeighbors[SOUTHWEST]->disconnectNeighbor(this, gDirOpposite[SOUTHWEST]);
|
||||
}
|
||||
if (mNeighbors[SOUTHEAST])
|
||||
{
|
||||
mNeighbors[SOUTHEAST]->disconnectNeighbor(this, gDirOpposite[SOUTHEAST]);
|
||||
}
|
||||
S32 i;
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
if (mNeighbors[i])
|
||||
auto& neighbor = mNeighbors[i];
|
||||
if (neighbor)
|
||||
{
|
||||
//mNeighbors[i]->disconnectNeighbor(this);
|
||||
mNeighbors[i] = NULL;
|
||||
neighbor->disconnectNeighbor(this, gDirOpposite[i]);
|
||||
neighbor = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -167,7 +167,7 @@ public:
|
||||
// +---+---+---+
|
||||
// |SW | S | SE|
|
||||
// +---+---+---+
|
||||
LLSurface *mNeighbors[8]; // Adjacent patches
|
||||
std::array<LLSurface*, 8> mNeighbors; // Adjacent patches
|
||||
|
||||
U32 mType; // Useful for identifying derived classes
|
||||
|
||||
|
||||
@@ -872,7 +872,7 @@ LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher,
|
||||
mCacheReadCount(0U),
|
||||
mCacheWriteCount(0U)
|
||||
{
|
||||
mCanUseNET = mUrl.empty() ;
|
||||
mCanUseNET = mUrl.empty() && !gHippoGridManager->getConnectedGrid()->isSecondLife();
|
||||
|
||||
if (!mCanUseNET)
|
||||
{
|
||||
@@ -1236,9 +1236,10 @@ bool LLTextureFetchWorker::doWork(S32 param)
|
||||
if (mState == LOAD_FROM_NETWORK)
|
||||
{
|
||||
static LLCachedControl<bool> use_http(gSavedSettings,"ImagePipelineUseHTTP");
|
||||
bool is_sl = gHippoGridManager->getConnectedGrid()->isSecondLife();
|
||||
|
||||
// if (mHost != LLHost::invalid) use_http = false;
|
||||
if (use_http && mCanUseHTTP && mUrl.empty()) // get http url.
|
||||
if ((is_sl || use_http) && mCanUseHTTP && mUrl.empty()) // get http url.
|
||||
{
|
||||
LLViewerRegion* region = NULL;
|
||||
if (mHost == LLHost::invalid)
|
||||
@@ -1280,6 +1281,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
|
||||
mWriteToCacheState = CAN_WRITE;
|
||||
}
|
||||
if (!mUrl.empty() && SGHostBlackList::isBlacklisted(mUrl)){
|
||||
LL_DEBUGS("Texture") << mID << "Blacklisted" << LL_ENDL;
|
||||
mCanUseHTTP = false;
|
||||
}
|
||||
if (mCanUseHTTP && !mUrl.empty())
|
||||
@@ -1292,7 +1294,12 @@ bool LLTextureFetchWorker::doWork(S32 param)
|
||||
}
|
||||
// don't return, fall through to next state
|
||||
}
|
||||
else if (mSentRequest == UNSENT && mCanUseNET)
|
||||
else if (!mCanUseNET)
|
||||
{
|
||||
LL_WARNS(LOG_TXT) << mID << "Unable to retrieve texture via HTTP and UDP unavailable (probable 404): " << mUrl << LL_ENDL;
|
||||
return true;
|
||||
}
|
||||
else if (mSentRequest == UNSENT)
|
||||
{
|
||||
LL_DEBUGS("Texture") << mID << " moving to UDP fetch. mSentRequest=" << mSentRequest << " mCanUseNET = " << mCanUseNET << LL_ENDL;
|
||||
setState(SEND_UDP_REQ);
|
||||
@@ -1821,6 +1828,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
|
||||
S32 discard = mHaveAllData ? 0 : mLoadedDiscard;
|
||||
U32 image_priority = LLWorkerThread::PRIORITY_NORMAL | mWorkPriority;
|
||||
mDecoded = FALSE;
|
||||
setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
|
||||
setState(DECODE_IMAGE_UPDATE);
|
||||
LL_DEBUGS(LOG_TXT) << mID << ": Decoding. Bytes: " << mFormattedImage->getDataSize() << " Discard: " << discard
|
||||
<< " All Data: " << mHaveAllData << LL_ENDL;
|
||||
|
||||
@@ -244,18 +244,19 @@ void LLToolBar::updateCommunicateList()
|
||||
bold_if_equal(LLFloaterMyFriends::getInstance(), frontmost_floater, mCommunicateBtn->add(LLFloaterMyFriends::getInstance()->getShortTitle(), LLSD("contacts"), ADD_TOP));
|
||||
bold_if_equal(LLFloaterChat::getInstance(), frontmost_floater, mCommunicateBtn->add(LLFloaterChat::getInstance()->getShortTitle(), LLSD("local chat"), ADD_TOP));
|
||||
mCommunicateBtn->addSeparator(ADD_TOP);
|
||||
mCommunicateBtn->add(getString("Redock Windows"), LLSD("redock"), ADD_TOP);
|
||||
static const auto redock = getString("Redock Windows");
|
||||
mCommunicateBtn->add(redock, LLSD("redock"), ADD_TOP);
|
||||
mCommunicateBtn->addSeparator(ADD_TOP);
|
||||
bold_if_equal(LLFloaterMute::getInstance(), frontmost_floater, mCommunicateBtn->add(LLFloaterMute::getInstance()->getShortTitle(), LLSD("mute list"), ADD_TOP));
|
||||
|
||||
if (gIMMgr->getIMFloaterHandles().size() > 0) mCommunicateBtn->addSeparator(ADD_TOP);
|
||||
for(std::set<LLHandle<LLFloater> >::const_iterator floater_handle_it = gIMMgr->getIMFloaterHandles().begin(); floater_handle_it != gIMMgr->getIMFloaterHandles().end(); ++floater_handle_it)
|
||||
for(const auto& handle : gIMMgr->getIMFloaterHandles())
|
||||
{
|
||||
if (LLFloaterIMPanel* im_floaterp = (LLFloaterIMPanel*)floater_handle_it->get())
|
||||
if (LLFloaterIMPanel* im_floaterp = (LLFloaterIMPanel*)handle.get())
|
||||
{
|
||||
const S32 count = im_floaterp->getNumUnreadMessages();
|
||||
std::string floater_title;
|
||||
if (count > 0) floater_title = "*";
|
||||
if (count > 0) floater_title = '*';
|
||||
floater_title.append(im_floaterp->getShortTitle());
|
||||
static const LLCachedControl<bool> show_counts("ShowUnreadIMsCounts", true);
|
||||
if (show_counts && count > 0)
|
||||
@@ -265,11 +266,14 @@ void LLToolBar::updateCommunicateList()
|
||||
{
|
||||
LLStringUtil::format_map_t args;
|
||||
args["COUNT"] = llformat("%d", count);
|
||||
floater_title += getString("IMs", args);
|
||||
static LLUIString ims = getString("IMs");
|
||||
ims.setArgList(args);
|
||||
floater_title += ims.getString();
|
||||
}
|
||||
else
|
||||
{
|
||||
floater_title += getString("IM");
|
||||
static const auto im = getString("IM");
|
||||
floater_title += im;
|
||||
}
|
||||
}
|
||||
bold_if_equal(im_floaterp, frontmost_floater, mCommunicateBtn->add(floater_title, im_floaterp->getSessionID(), ADD_TOP));
|
||||
|
||||
@@ -1368,8 +1368,7 @@ void inventory_offer_mute_callback(const LLUUID& blocked_id,
|
||||
LLMute mute(blocked_id, full_name, mute_type);
|
||||
if (LLMuteList::getInstance()->add(mute))
|
||||
{
|
||||
LLFloaterMute::showInstance();
|
||||
LLFloaterMute::getInstance()->selectMute(blocked_id);
|
||||
LLFloaterMute::showInstance()->selectMute(blocked_id);
|
||||
}
|
||||
|
||||
// purge the message queue of any previously queued inventory offers from the same source.
|
||||
|
||||
@@ -272,11 +272,10 @@ void LLViewerOctreeEntry::removeData(LLViewerOctreeEntryData* data)
|
||||
|
||||
mData[data->getDataType()] = NULL;
|
||||
|
||||
if(mGroup != NULL && !mData[LLDRAWABLE])
|
||||
if(!mGroup.isNull() && !mData[LLDRAWABLE])
|
||||
{
|
||||
LLViewerOctreeGroup* group = mGroup;
|
||||
mGroup->removeFromGroup(data);
|
||||
mGroup = NULL;
|
||||
group->removeFromGroup(data);
|
||||
|
||||
llassert(mBinIndex == -1);
|
||||
}
|
||||
|
||||
@@ -109,7 +109,7 @@ private:
|
||||
|
||||
private:
|
||||
LLViewerOctreeEntryData* mData[NUM_DATA_TYPE]; //do not use LLPointer here.
|
||||
LLViewerOctreeGroup* mGroup;
|
||||
LLPointer<LLViewerOctreeGroup> mGroup;
|
||||
|
||||
//aligned members
|
||||
LL_ALIGN_16(LLVector4a mExtents[2]);
|
||||
@@ -229,6 +229,7 @@ public:
|
||||
void handleChildRemoval(const OctreeNode* parent, const OctreeNode* child) final override;
|
||||
|
||||
OctreeNode* getOctreeNode() {return mOctreeNode;}
|
||||
const OctreeNode* getOctreeNode() const { return mOctreeNode; }
|
||||
LLViewerOctreeGroup* getParent();
|
||||
|
||||
const LLVector4a* getBounds() const {return mBounds;}
|
||||
|
||||
@@ -107,6 +107,19 @@ typedef std::map<std::string, std::string> CapabilityMap;
|
||||
|
||||
static void log_capabilities(const CapabilityMap &capmap);
|
||||
|
||||
|
||||
namespace
|
||||
{
|
||||
|
||||
void newRegionEntry(LLViewerRegion& region)
|
||||
{
|
||||
LL_INFOS("LLViewerRegion") << "Entering region [" << region.getName() << "]" << LL_ENDL;
|
||||
gDebugInfo["CurrentRegion"] = region.getName();
|
||||
LLAppViewer::instance()->writeDebugInfo();
|
||||
}
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
class LLViewerRegionImpl {
|
||||
public:
|
||||
LLViewerRegionImpl(LLViewerRegion * region, LLHost const & host)
|
||||
@@ -117,6 +130,7 @@ public:
|
||||
mSeedCapMaxAttemptsBeforeLogin(MAX_SEED_CAP_ATTEMPTS_BEFORE_LOGIN),
|
||||
mSeedCapAttempts(0),
|
||||
mHttpResponderID(0),
|
||||
mLandp(NULL),
|
||||
// I'd prefer to set the LLCapabilityListener name to match the region
|
||||
// name -- it's disappointing that's not available at construction time.
|
||||
// We could instead store an LLCapabilityListener*, making
|
||||
@@ -2090,6 +2104,9 @@ void LLViewerRegion::setSeedCapability(const std::string& url)
|
||||
LL_DEBUGS("CrossingCaps") << "Received duplicate seed capability, posting to seed " <<
|
||||
url << LL_ENDL;
|
||||
|
||||
// record that we just entered a new region
|
||||
newRegionEntry(*this);
|
||||
|
||||
//Instead of just returning we build up a second set of seed caps and compare them
|
||||
//to the "original" seed cap received and determine why there is problem!
|
||||
LLSD capabilityNames = LLSD::emptyArray();
|
||||
@@ -2104,6 +2121,8 @@ void LLViewerRegion::setSeedCapability(const std::string& url)
|
||||
mImpl->mCapabilities.clear();
|
||||
setCapability("Seed", url);
|
||||
|
||||
// record that we just entered a new region
|
||||
newRegionEntry(*this);
|
||||
LLSD capabilityNames = LLSD::emptyArray();
|
||||
mImpl->buildCapabilityNames(capabilityNames);
|
||||
|
||||
|
||||
@@ -172,6 +172,7 @@ LLViewerRegion* LLWorld::addRegion(const U64 ®ion_handle, const LLHost &host)
|
||||
{
|
||||
LL_INFOS() << "Add region with handle: " << region_handle << " on host " << host << LL_ENDL;
|
||||
LLViewerRegion *regionp = getRegionFromHandle(region_handle);
|
||||
std::string seedUrl;
|
||||
if (regionp)
|
||||
{
|
||||
LLHost old_host = regionp->getHost();
|
||||
@@ -191,9 +192,12 @@ LLViewerRegion* LLWorld::addRegion(const U64 ®ion_handle, const LLHost &host)
|
||||
}
|
||||
if (!regionp->isAlive())
|
||||
{
|
||||
LL_WARNS() << "LLWorld::addRegion exists, but isn't alive" << LL_ENDL;
|
||||
LL_WARNS() << "LLWorld::addRegion exists, but isn't alive. Removing old region and creating new" << LL_ENDL;
|
||||
}
|
||||
|
||||
// Save capabilities seed URL
|
||||
seedUrl = regionp->getCapability("Seed");
|
||||
|
||||
// Kill the old host, and then we can continue on and add the new host. We have to kill even if the host
|
||||
// matches, because all the agent state for the new camera is completely different.
|
||||
removeRegion(old_host);
|
||||
@@ -229,6 +233,11 @@ LLViewerRegion* LLWorld::addRegion(const U64 ®ion_handle, const LLHost &host)
|
||||
LL_ERRS() << "Unable to create new region!" << LL_ENDL;
|
||||
}
|
||||
|
||||
if ( !seedUrl.empty() )
|
||||
{
|
||||
regionp->setCapability("Seed", seedUrl);
|
||||
}
|
||||
|
||||
//Classic clouds
|
||||
#if ENABLE_CLASSIC_CLOUDS
|
||||
regionp->mCloudLayer.create(regionp);
|
||||
@@ -1447,6 +1456,8 @@ public:
|
||||
<< sim << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
LL_DEBUGS("CrossingCaps") << "Calling setSeedCapability from LLEstablishAgentCommunication::post. Seed cap == "
|
||||
<< input["body"]["seed-capability"] << LL_ENDL;
|
||||
regionp->setSeedCapability(input["body"]["seed-capability"]);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -3459,8 +3459,9 @@ void forAllDrawables(LLCullResult::sg_iterator begin,
|
||||
{
|
||||
for (LLCullResult::sg_iterator i = begin; i != end; ++i)
|
||||
{
|
||||
OctreeGuard guard((*i)->getOctreeNode());
|
||||
for (LLSpatialGroup::element_iter j = (*i)->getDataBegin(); j != (*i)->getDataEnd(); ++j)
|
||||
LLSpatialGroup* group = (*i).get();
|
||||
OctreeGuard guard(group->getOctreeNode());
|
||||
for (LLSpatialGroup::element_iter j = group->getDataBegin(); j != group->getDataEnd(); ++j)
|
||||
{
|
||||
func((LLDrawable*)(*j)->getDrawable());
|
||||
}
|
||||
|
||||
@@ -75,6 +75,7 @@
|
||||
width="315"
|
||||
min_width="315">
|
||||
<layout_stack
|
||||
name="Experience_profile"
|
||||
follows="all"
|
||||
height="550"
|
||||
left="0"
|
||||
@@ -151,7 +152,7 @@
|
||||
bottom="-50"
|
||||
value=""
|
||||
width="305"
|
||||
max_length="2048"/>
|
||||
max_length="2048"/>
|
||||
</layout_panel>
|
||||
<layout_panel
|
||||
follows=""
|
||||
@@ -256,6 +257,7 @@
|
||||
</text_editor>
|
||||
</layout_panel>
|
||||
<layout_panel
|
||||
name ="owner panel"
|
||||
follows="left|top|right"
|
||||
height="18"
|
||||
left="0"
|
||||
|
||||
@@ -54,4 +54,4 @@
|
||||
<on_click function="List.CopySLURL"/>
|
||||
<on_visible function="List.EnableSingleSelected"/>
|
||||
</menu_item_call>
|
||||
</menu>
|
||||
</context_menu>
|
||||
|
||||
@@ -9950,7 +9950,7 @@ You cannot copy your selection because the object '[OBJ_NAME]' is not transferra
|
||||
name="NoPermsNoRemoval"
|
||||
type="notify">
|
||||
<tag>fail</tag>
|
||||
Removal of the object '[OBJ_NAME]' from the simulator is disallowed by the permissions system.
|
||||
Removal of the object '[OBJ_NAME]' from the region is disallowed by the permissions system.
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
@@ -10221,7 +10221,7 @@ Unable to add script!
|
||||
name="AssetServerTimeoutObjReturn"
|
||||
type="notify">
|
||||
<tag>fail</tag>
|
||||
Asset server didn't respond in a timely fashion. Object returned to sim.
|
||||
Asset server didn't respond in a timely fashion. Object returned to region.
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
@@ -11694,7 +11694,7 @@ Media/audio URL blocked for [DOMAIN]
|
||||
name="RadarChatKeysRequest"
|
||||
type="alertmodal">
|
||||
An object owned by you has requested keys from your radar.
|
||||
Would you like to enable announcing keys to objects in the sim?
|
||||
Would you like to enable announcing keys to objects in the region?
|
||||
<usetemplate
|
||||
name="yesnocancelbuttons"
|
||||
yestext="Yes"
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
name="loading"
|
||||
value="loading..."/>
|
||||
<layout_stack
|
||||
name="experience_panel"
|
||||
top="0"
|
||||
left="4"
|
||||
right="-1"
|
||||
@@ -21,6 +22,7 @@
|
||||
orientation="vertical"
|
||||
follows="all">
|
||||
<layout_panel
|
||||
name="event_panel"
|
||||
bottom="0"
|
||||
left="1"
|
||||
right="-1"
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
left="0"
|
||||
width="350"
|
||||
height="330"
|
||||
name="panel_experiences_search"
|
||||
label="Search"
|
||||
follows="all">
|
||||
|
||||
@@ -44,6 +45,7 @@
|
||||
height="330"
|
||||
name="search_panel">
|
||||
<text
|
||||
name="search_text"
|
||||
left="0"
|
||||
follows="top|left|right"
|
||||
right="-1">
|
||||
@@ -63,6 +65,7 @@
|
||||
height="18"
|
||||
name="find"/>
|
||||
<text
|
||||
name="content_text"
|
||||
bottom_delta="-18"
|
||||
left="0"
|
||||
follows="top|left"
|
||||
|
||||
@@ -80,8 +80,8 @@
|
||||
<button bottom_delta="0" left="146" height="16" width="16" follows="left|bottom" image_overlay="inv_folder_trash.tga" scale_image="true" label="" tool_tip="Delete the currently selected remembered login info, if any." name="remove_login"/>
|
||||
<check_box bottom_delta="0" left="173" control_name="RememberPassword" follows="left|bottom" height="16" label="Save password" name="remember_check" width="158"/>
|
||||
|
||||
<text name="fmod_text" value="Powered By" bottom="42" height="16" left="-425" width="84" follows="right|bottom" font="SansSerif" font_style="BOLD" font_size="Large"/>
|
||||
<icon name="fmod_logo" bottom_delta="-32" height="40" left_delta="84" width="152" follows="right|bottom" image_name="FMOD_Logo"/>
|
||||
<icon name="fmod_logo" bottom="10" height="40" left="-341" width="152" follows="right|bottom" image_name="FMOD_Logo"/>
|
||||
<text name="fmod_text" value="Powered By" bottom_delta="40" height="16" left_delta="36" width="84" follows="right|bottom" font="SansSerif" font_style="BOLD" font_size="Large"/>
|
||||
|
||||
<text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
|
||||
bottom="45" drop_shadow_visible="true" follows="right|bottom"
|
||||
|
||||
@@ -115,8 +115,9 @@
|
||||
<spinner bottom_delta="0" decimal_digits="0" follows="top" height="16" increment="1" left_delta="210" max_val="9999" min_val="1" name="ScriptJumpCount" width="50" control_name="Ascentnumscriptdiff" tool_tip="Threshold for the script jump message [Default: 100]"/>
|
||||
<check_box bottom_delta="-20" left="10" follows="top" label="Restrained Love API Support (RLVa)" name="RestrainedLove" control_name="RestrainedLove" tool_tip="Allows scripts to take greater control of the viewer, if you wear compliant objects."/>
|
||||
<check_box bottom_delta="-20" follows="top" label="Replace slurls and formatted links with labels" name="SinguReplaceLinks" control_name="SinguReplaceLinks" tool_tip="While you can right click to see where they really lead by copying them, this does allow links to be misleading at first glance."/>
|
||||
<text name="EmergencyTeleportDesc" left="14" bottom_delta="-12" follows="top">Drop a landmark below to autoteleport there in the last 20 seconds before region restarts</text>
|
||||
<drop_target control_name="EmergencyTeleportLandmark" bottom_delta="-8" left="15" height="17" name="emergency_teleport_landmark_drop" width="430"/>
|
||||
<text name="EmergencyTeleportDesc" left="14" bottom_delta="-12" follows="top">Drop a landmark below to autoteleport to before region restarts</text>
|
||||
<spinner name="EmergencyTeleportSeconds" label="Seconds before restart to begin teleport attempts" label_width="380" width="432" control_name="EmergencyTeleportSeconds" bottom_delta="-26" decimal_digits="0" max_val="3600" min_val="0" follows="left|top" height="18" increment="1"/>
|
||||
<drop_target control_name="EmergencyTeleportLandmark" bottom_delta="-4" left="15" height="17" name="emergency_teleport_landmark_drop" width="430"/>
|
||||
<text name="EmergencyTeleportBackupDesc" halign="center" width="432" left="14" bottom_delta="-26" follows="top">Drop a backup landmark to autoteleport to below, should you already be at above</text>
|
||||
<drop_target control_name="EmergencyTeleportLandmarkBackup" bottom_delta="-8" left="15" height="17" name="emergency_teleport_landmark_backup_drop" width="430"/>
|
||||
</panel>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<panel border="true" left="1" bottom="-190" height="180" width="500" label="Main" name="General">
|
||||
<check_box bottom_delta="-25" control_name="AscentStoreSettingsPerAccount" follows="top" height="16" initial_value="true" label="Where applicable, save Vanity settings per-account." left="10" tool_tip="Saves settings per-account, allowing easier customization for alts." name="use_account_settings_check"/>
|
||||
<check_box bottom_delta="-20" control_name="AscentDisableTeleportScreens" follows="top" height="16" initial_value="true" label="Hide the Teleport progress screens" tool_tip="If checked, the viewer will hide the teleport progress screen, allowing you to continue to read IMs." name="disable_tp_screen_check"/>
|
||||
<check_box bottom_delta="-20" control_name="OptionPlayTpSound" follows="top" height="16" initial_value="true" label="Play the Teleport sound when moving between sims" tool_tip="Viewer will play the wooshing TP noise on teleport." name="tp_sound_check"/>
|
||||
<check_box bottom_delta="-20" control_name="OptionPlayTpSound" follows="top" height="16" initial_value="true" label="Play the Teleport sound when teleporting between regions" tool_tip="Viewer will play the wooshing TP noise on teleport." name="tp_sound_check"/>
|
||||
<check_box bottom_delta="-20" control_name="AscentDisableLogoutScreens" follows="top" height="16" initial_value="true" label="Hide the Login/Logout progress screens" tool_tip="If checked, the viewer will hide the login/logout progress screen." name="disable_logout_screen_check"/>
|
||||
<check_box bottom_delta="-20" control_name="SGDisableChatAnimation" follows="top" height="16" initial_value="false" label="Disable chat, whisper and shout animations" tool_tip="Remove chat animations from your own avatar. Effect visible to everyone" name="disable_chat_animation"/>
|
||||
<check_box bottom_delta="-20" control_name="LiruAddNotReplace" follows="top" height="16" label="Add attachments and wearables instead of replacing them" tool_tip="When double clicking or pressing enter in inventory with wearables or objects selected they will be added to your outfit, instead of replacing the wearable or object currently at their target destination." name="add_not_replace"/>
|
||||
|
||||
@@ -3252,7 +3252,7 @@ Where tag = tag string to match. Removes bot's matching the tag.
|
||||
<string name="has_left">has left</string>
|
||||
<string name="has_left_flood">is now off the radar for</string>
|
||||
<!-- [RANGE] -->
|
||||
<string name="the_sim">the sim</string>
|
||||
<string name="the_sim">the region</string>
|
||||
<string name="draw_distance">draw distance</string>
|
||||
<string name="shout_range">shout range</string>
|
||||
<string name="chat_range">chat range</string>
|
||||
|
||||
@@ -1,13 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<floater name="active_speakers" title="Participantes Activos">
|
||||
<layout_stack name="active_speakers_stack">
|
||||
<layout_panel name="panel_voice_effect"/>
|
||||
<layout_panel name="active_speakers_panel">
|
||||
<name_list name="speakers_list">
|
||||
<column label="Nombre" name="speaker_name"/>
|
||||
<column label="" name="speaking_status"/>
|
||||
</name_list>
|
||||
<slider name="speaker_volume"/>
|
||||
<button name="mute_btn" tool_tip="Ignorar la voz de este residente"/>
|
||||
</layout_panel>
|
||||
</layout_stack>
|
||||
|
||||
@@ -22,6 +22,8 @@
|
||||
<column name="Owner" label="Propietario" tool_tip="Haz doble click en cualquier resultado para marcar su posición"/>
|
||||
<column name="Group" label="Grupo" tool_tip="Haz doble click en cualquier resultado para marcar su posición"/>
|
||||
</scroll_list>
|
||||
<button name="TP" label="TP"/>
|
||||
<button name="Look" label="Ver"/>
|
||||
<text name="counter">
|
||||
Listados/Pendientes/Total
|
||||
</text>
|
||||
|
||||
@@ -24,9 +24,7 @@
|
||||
<text name="InstructSearchResidentName">
|
||||
Escribe parte del nombre del residente:
|
||||
</text>
|
||||
<line_editor name="Edit"/>
|
||||
<button label="Buscar" label_selected="Buscar" name="Find"/>
|
||||
<scroll_list name="SearchResults"/>
|
||||
</panel>
|
||||
<!-- ========================= -->
|
||||
<panel name="FriendsPanel" label="Amigos">
|
||||
@@ -34,7 +32,6 @@
|
||||
Elige a una persona:
|
||||
</text>
|
||||
<button label="Actualizar Lista" label_selected="Actualizar Lista" name="RefreshFriends" left_delta="15" width="100"/>
|
||||
<scroll_list name="Friends"/>
|
||||
</panel>
|
||||
<!-- ========================= -->
|
||||
<panel name="NearMePanel" label="Cercanos">
|
||||
@@ -46,14 +43,12 @@
|
||||
<text name="meters">
|
||||
Metros
|
||||
</text>
|
||||
<scroll_list name="NearMe"/>
|
||||
</panel>
|
||||
<!-- ========================= -->
|
||||
<panel name="KeyPanel" label="Por UUID" >
|
||||
<text name="InstructSelectResident">
|
||||
UUID del Avatar o Grupo:
|
||||
</text>
|
||||
<line_editor name="EditUUID"/>
|
||||
</panel>
|
||||
</tab_container>
|
||||
<button label="Aceptar" label_selected="Aceptar" name="ok_btn"/>
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<floater name="experiencepicker" title="Seleccionar Experiencia">
|
||||
</floater>
|
||||
113
indra/newview/skins/default/xui/es/floater_experienceprofile.xml
Normal file
113
indra/newview/skins/default/xui/es/floater_experienceprofile.xml
Normal file
@@ -0,0 +1,113 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
|
||||
|
||||
<floater title="Perfil de la Experiencia">
|
||||
<floater.string name="empty_slurl">
|
||||
(ninguno)
|
||||
</floater.string>
|
||||
<floater.string name="maturity_icon_general">
|
||||
map_event.tga
|
||||
</floater.string>
|
||||
<floater.string name="maturity_icon_moderate">
|
||||
map_event_mature.tga
|
||||
</floater.string>
|
||||
<floater.string name="maturity_icon_adult">
|
||||
map_event_adult.tga
|
||||
</floater.string>
|
||||
<name_box name="experience_title"/>
|
||||
<tab_container name="tab_container">
|
||||
<panel name="panel_experience_info">
|
||||
<scroll_container name="xp_scroll">
|
||||
<panel name="scrolling_panel">
|
||||
<layout_stack name="Experience_profile">
|
||||
<layout_panel name="top panel">
|
||||
<text name="grid_wide"/>
|
||||
<button label="Editar" name="edit_btn"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="image_panel">
|
||||
<texture_picker name="logo"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="description panel">
|
||||
<text_editor name="experience_description"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="maturity panel">
|
||||
<text name="ContentRating" width="75">
|
||||
Contenido:
|
||||
</text>
|
||||
<text name="ContentRatingText"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="location panel">
|
||||
<text name="Location" width="290">
|
||||
Ubicación:
|
||||
</text>
|
||||
<text_editor name="LocationTextText"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="marketplace panel">
|
||||
<text name="marketplace store">
|
||||
Tienda del Mercado:
|
||||
</text>
|
||||
<text_editor name="marketplace"/>
|
||||
</layout_panel>
|
||||
<layout_panel name ="owner panel">
|
||||
<text name="Owner">
|
||||
Propietario:
|
||||
</text>
|
||||
<name_box name="OwnerText"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="group_panel">
|
||||
<text name="Group">
|
||||
Grupo:
|
||||
</text>
|
||||
<name_box name="GroupText"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="perm panel">
|
||||
<button label="Permitir" name="allow_btn"/>
|
||||
<button label="Olvidar" name="forget_btn"/>
|
||||
<button label="Bloquear" name="block_btn"/>
|
||||
<text name="privileged">
|
||||
Esta experiencia está habilitada para todos los residentes.
|
||||
</text>
|
||||
<button label="Denunciar Infracción" name="report_btn" left="84" width="134"/>
|
||||
</layout_panel>
|
||||
</layout_stack>
|
||||
</panel>
|
||||
</scroll_container>
|
||||
</panel>
|
||||
<panel name="edit_panel_experience_info">
|
||||
<scroll_container name="edit_xp_scroll" >
|
||||
<panel name="edit_scrolling_panel">
|
||||
<texture_picker name="edit_logo"/>
|
||||
<text name="edit_experience_title_label" value="Nombre:"/>
|
||||
<line_editor name="edit_experience_title"/>
|
||||
<text name="edit_experience_desc_label" value="Descripción:"/>
|
||||
<text_editor name="edit_experience_description"/>
|
||||
<button name="Group_btn" label="Definir Grupo"/>
|
||||
<name_box name="edit_GroupText"/>
|
||||
<text name="edit_ContentRating">
|
||||
Contenido:
|
||||
</text>
|
||||
<combo_box label="Moderado" tool_tip="Increasing the maturity rating on an experience will reset permission for all residents which have allowed the experience." name="edit_ContentRatingText">
|
||||
<combo_item label="Adulto" name="Adult"/>
|
||||
<combo_item label="Moderado" name="Mature"/>
|
||||
<combo_item label="General" name="PG"/>
|
||||
</combo_box>
|
||||
<text name="edit_Location">
|
||||
Ubicación:
|
||||
</text>
|
||||
<text_editor name="edit_LocationTextText"/>
|
||||
<button name="location_btn" label="Definir aquí"/>
|
||||
<button name="clear_btn" label="Limpiar Ubicación"/>
|
||||
<text name="Marketplace Store text">
|
||||
Tienda del Mercado:
|
||||
</text>
|
||||
<line_editor name="edit_marketplace"/>
|
||||
<check_box tool_tip="" label="Habilitar Experiencia" name="edit_enable_btn"/>
|
||||
<check_box label="Ocultar en Búsqueda" name="edit_private_btn"/>
|
||||
<text name="changes" value="Los cambios de una experiencia pueden tardar varios minutos en mostrarse en todas las regiones."/>
|
||||
<button label="Volver" name="cancel_btn"/>
|
||||
<button label="Guardar" name="save_btn"/>
|
||||
</panel>
|
||||
</scroll_container>
|
||||
</panel>
|
||||
</tab_container>
|
||||
</floater>
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
|
||||
|
||||
<floater name="floater_experiences" title="Experiencias">
|
||||
</floater>
|
||||
@@ -24,6 +24,9 @@
|
||||
<text name="LabelAcquiredDate">
|
||||
Mie May 24 12:50:46 2006
|
||||
</text>
|
||||
<text name="LabelItemExperienceTitle" >
|
||||
Experiencia:
|
||||
</text>
|
||||
<text name="OwnerLabel">
|
||||
Puedes:
|
||||
</text>
|
||||
@@ -80,6 +83,7 @@
|
||||
Precio: [CURRENCY]
|
||||
</text>
|
||||
<line_editor name="Edit Cost"/>
|
||||
<floater.string name="loading_experience">(cargando)</floater.string>
|
||||
<string name="unknown">
|
||||
(desconocido)
|
||||
</string>
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
<button label="Restablecer" label_selected="Restablecer" name="Reset"/>
|
||||
<check_box label="Ejecutándose" name="running"/>
|
||||
<check_box label="Mono" name="mono"/>
|
||||
<check_box label="Usar Experiencia" name="enable_xp" />
|
||||
<string name="not_allowed">
|
||||
No tienes permiso para ver este script.
|
||||
</string>
|
||||
|
||||
@@ -4,6 +4,10 @@
|
||||
<floater.string name="status_selectcount">
|
||||
Primitivas: [OBJ_COUNT], LI: [LAND_IMPACT]
|
||||
</floater.string>
|
||||
<string name="Selected Face:" value="Cara Seleccionada:"/>
|
||||
<string name="Link number:" value="Enlace Nro.:"/>
|
||||
<string name="Selected prims:" value="Prim Seleccionado:"/>
|
||||
<string name="Selected objects:" value="Objetos Seleccionados:"/>
|
||||
<floater.string
|
||||
name="status_remaining_capacity">
|
||||
Capacidad remanente [LAND_CAPACITY].
|
||||
|
||||
11
indra/newview/skins/default/xui/es/menu_experiences.xml
Normal file
11
indra/newview/skins/default/xui/es/menu_experiences.xml
Normal file
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<menu name="Avatar Menu">
|
||||
<menu_item_call label="Perfil" name="Profile"/>
|
||||
<menu_item_call label="Permitir" name="Allow"/>
|
||||
<menu_item_call label="Olvidar" name="Forget"/>
|
||||
<menu_item_call label="Bloquear" name="Block"/>
|
||||
<menu_item_call label="Denunciar" name="Report"/>
|
||||
<menu_item_call label="Copiar SLURL al portapapeles" name="url_copy"/>
|
||||
<menu_item_call label="Copiar UUID al portapapeles" name="key_copy"/>
|
||||
<menu_item_call label="Copiar Nombre al portapapeles" name="name_copy"/>
|
||||
</menu>
|
||||
13
indra/newview/skins/default/xui/es/menu_groups_list.xml
Normal file
13
indra/newview/skins/default/xui/es/menu_groups_list.xml
Normal file
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<menu label="Grupos" name="groups_menu">
|
||||
<menu_item_call label="Mostrar Información del Grupo" name="show_group"/>
|
||||
<menu_item_call label="Abrir chat del grupo" name="im_group"/>
|
||||
<menu_item_call label="Abrir chat del Grupo" name="call_group"/>
|
||||
<menu_item_call label="Activar Grupo" name="activate_group"/>
|
||||
<menu_item_call label="Historial de chat" name="Chat History"/>
|
||||
<menu_item_call label="Unirse al Grupo" name="join_group"/>
|
||||
<menu_item_call label="Abandonar el Grupo" name="leave_group"/>
|
||||
<menu_item_call label="Copiar Nombre" name="copy_name"/>
|
||||
<menu_item_call label="Copiar SLURL" name="copy_url"/>
|
||||
<menu_item_call label="Copiar UUID" name="copy_key"/>
|
||||
</menu>
|
||||
@@ -21,7 +21,8 @@
|
||||
<menu_item_call label="Ejecutar Script" name="Task Set Running"/>
|
||||
<menu_item_call name="Empty Trash" label="Vaciar Papelera"/>
|
||||
<menu_item_call name="Empty Lost And Found" label="Vaciar Elementos Perdidos"/>
|
||||
<menu_item_call label="Abrir en Nueva Ventana" name="Open Folder In New Window"/>
|
||||
<menu_item_call label="Abrir Carpeta en Nueva Ventana" name="Open Folder In New Window"/>
|
||||
<menu_item_call label="Copiar UUID de la Carpeta" name="Copy Folder UUID"/>
|
||||
<menu_item_call name="New Folder" label="Carpeta nueva"/>
|
||||
<menu_item_call name="New Script" label="Script nuevo"/>
|
||||
<menu_item_call name="New Note" label="Nota nueva"/>
|
||||
|
||||
@@ -10,19 +10,15 @@
|
||||
<menu_item_check label="Objetos" name="Objects"/>
|
||||
<menu_item_check label="Líneas de Propiedad" name="Property Lines"/>
|
||||
<menu_item_check label="Terrenos en Venta" name="Parcels for Sale"/>
|
||||
<menu_item_check label="Anillos de rastreo del Radar" name="Radar Tracking Circles"/>
|
||||
<menu_item_check label="Anillos rastreo del Radar" name="Radar Tracking Circles"/>
|
||||
</menu>
|
||||
<menu name="Chat Distance Rings" label="Anillos de Rangos de Chat">
|
||||
<menu_item_check label="Mostrar Todos" name="Show All"/>
|
||||
<menu_item_separator />
|
||||
<menu name="Chat Distance Rings" label="Anillos Rangos de Chat">
|
||||
<menu_item_check label="Mostrar Todos" name="Show All"/>
|
||||
<menu_item_check label="Mostrar rango Sururros" name="Show Whisper Ring"/>
|
||||
<menu_item_check label="Mostrar rango Chat" name="Show Chat Ring"/>
|
||||
<menu_item_check label="Mostrar rango Gritos" name="Show Shout Ring"/>
|
||||
</menu>
|
||||
<menu_item_separator />
|
||||
<menu_item_call name="Stop Tracking" label="Detener Seguimiento"/>
|
||||
<menu_item_call name="Profile" label="Perfil..."/>
|
||||
<menu_item_call name="Camfollow" label="Cámara..."/>
|
||||
<menu name="Mark" label="Marcar">
|
||||
<menu_item_call name="Red" label="Rojo"/>
|
||||
<menu_item_call name="Green" label="Verde"/>
|
||||
@@ -31,5 +27,6 @@
|
||||
<menu_item_call name="Custom" label="Personalizado..."/>
|
||||
</menu>
|
||||
<menu_item_call name="Unmark" label="Desmarcar"/>
|
||||
<menu name="avs_menu" label="Avatares Seleccionados"/>
|
||||
<menu_item_check label="Texturas del Mapa" name="World Map Textures"/>
|
||||
</menu>
|
||||
|
||||
3
indra/newview/skins/default/xui/es/menu_nameeditor_avatar.xml
Executable file
3
indra/newview/skins/default/xui/es/menu_nameeditor_avatar.xml
Executable file
@@ -0,0 +1,3 @@
|
||||
<menu name="Avatar Name Editor Menu" filename="menu_avs_list.xml">
|
||||
<menu name="Text" filename="menu_texteditor.xml"/>
|
||||
</menu>
|
||||
@@ -0,0 +1,3 @@
|
||||
<menu name="Group Name Editor Menu" filename="menu_groups_list.xml">
|
||||
<menu name="Text" filename="menu_texteditor.xml"/>
|
||||
</menu>
|
||||
16
indra/newview/skins/default/xui/es/menu_objects_list.xml
Normal file
16
indra/newview/skins/default/xui/es/menu_objects_list.xml
Normal file
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<context_menu label="Objetos" name="Objects">
|
||||
<menu_item_call label="Enfocar" name="Cam To"/>
|
||||
<menu_item_call label="Seguir" name="Follow"/>
|
||||
<menu_item_call label="Mover A" name="Move To"/>
|
||||
<menu_item_call label="Teleportar A" name="Teleport To"/>
|
||||
<menu_item_call label="Sentarse" name="Sit On"/>
|
||||
<menu_item_call label="Pagar" name="Pay"/>
|
||||
<menu_item_call label="Tocar" name="Touch"/>
|
||||
<menu_item_call label="Editar" name="Edit"/>
|
||||
<menu_item_call label="Añadir a la Selección" name="Add to Selection"/>
|
||||
<menu_item_call label="Desdibujar" name="Derender"/>
|
||||
<menu_item_call label="Copiar UUID" name="Copy Key"/>
|
||||
<menu_item_call label="Copiar Nombre" name="Copy Name"/>
|
||||
<menu_item_call label="Copiar SLURL" name="Copy SLURL"/>
|
||||
</menu>
|
||||
@@ -0,0 +1,40 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<menu label="Propietario" name="Object Owner Submenu">
|
||||
<menu_item_call label="Perfil" name="Profile"/>
|
||||
<menu name="Actions" label="Acciones">
|
||||
<menu_item_call label="Perfil Web" name="Web Profile"/>
|
||||
<menu_item_call label="Pagar" name="Pay"/>
|
||||
<menu_item_call label="Mensaje Instantáneo" name="Instant Message"/>
|
||||
<menu_item_call label="Conferencia" name="Conference Chat"/>
|
||||
<menu_item_call label="Llamar" name="Call"/>
|
||||
<menu_item_call label="Llamar Conferencia" name="Conference Call"/>
|
||||
<menu_item_call label="Ofrecer Amistad" name="Add Friend"/>
|
||||
<menu_item_call label="Quitar Amistad" name="Remove Friend"/>
|
||||
<menu_item_call label="Invitar a un Grupo" name="Invite To Group"/>
|
||||
<menu_item_call label="Seguir" name="Follow"/>
|
||||
<menu_item_call label="Mover A" name="Move To"/>
|
||||
<menu_item_call label="Ofrecer Teleporte" name="Offer Teleport"/>
|
||||
<menu_item_call label="Teleportar A" name="Teleport To"/>
|
||||
<menu_item_call label="Solicitar Teleporte" name="Request Teleport"/>
|
||||
<menu_item_call label="Encontrar en el Mapa" name="Find on Map"/>
|
||||
<menu_item_call label="Compartir" name="Share"/>
|
||||
<menu_item_call label="Historial de Chat" name="Chat History"/>
|
||||
<menu_item_call label="Rastrear/No Rastrear" name="Track/Untrack"/>
|
||||
</menu>
|
||||
<menu name="Copy" label="Copiar">
|
||||
<menu_item_call label="UUID" name="Copy Key"/>
|
||||
<menu_item_call label="Nombre" name="Copy Name"/>
|
||||
<menu_item_call label="SLURL" name="Copy SLURL"/>
|
||||
</menu>
|
||||
<menu_item_call label="Enfocar" name="Focus"/>
|
||||
<menu label="Moderación" name="Moderation" create_jump_keys="">
|
||||
<menu_item_call label="Silenciar" name="Mute"/>
|
||||
<menu_item_call label="Quitar Silenciar" name="Unmute"/>
|
||||
<menu_item_call label="Prohibir en el Grupo" name="Ban From Group"/>
|
||||
<menu_item_call label="Denunciar Infracción" name="Report Abuse"/>
|
||||
<menu_item_call label="Congelar" name="Freeze"/>
|
||||
<menu_item_call label="Expulsar/Prohibir en la parcela" name="Eject/Ban from Parcel"/>
|
||||
<menu_item_call label="Expulsar del Estado" name="Eject from estate"/>
|
||||
<menu_item_call label="Expulsar y prohibir en el estado" name="Eject and ban from estate"/>
|
||||
</menu>
|
||||
</menu>
|
||||
@@ -5,7 +5,7 @@
|
||||
<menu_item_call label="Tocar" name="Object Touch">
|
||||
<on_click function="Object.Touch" />
|
||||
<on_enable function="Object.EnableTouch" userdata="Tocar" name="EnableTouch"/>
|
||||
</menu_item_call>
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Sentarse" name="Object Sit">
|
||||
<on_click function="Object.SitOrStand"/>
|
||||
<on_enable function="Object.EnableSitOrStand" userdata="Sentarse,Pararse" name="EnableSitOrStand"/>
|
||||
@@ -20,6 +20,7 @@
|
||||
<menu_item_call label="Recoger una copia" name="Take Copy"/>
|
||||
<pie_menu label="Anexar HUD" name="Object Attach HUD" />
|
||||
<pie_menu label="Anexar" name="Object Attach" />
|
||||
<pie_menu label="Anexar Mas" name="Object Attach More" />
|
||||
<menu_item_call label="Regresar..." name="Return..."/>
|
||||
<pie_menu label="Más" name="Rate Menu">
|
||||
<pie_menu label="Exportar" name="Export Menu">
|
||||
@@ -32,6 +33,8 @@
|
||||
<menu_item_call label="Explotar" name="Explode"/>
|
||||
<menu_item_call label="Medir" name="Measure"/>
|
||||
<menu_item_call label="Información" name="Data"/>
|
||||
<menu_item_call label="Ir a" name="Go To"/>
|
||||
<menu_item_call label="Seguir" name="Follow"/>
|
||||
<menu_item_call label="Recargar" name="Reload Textures"/>
|
||||
</pie_menu>
|
||||
<menu_item_call label="Silenciar" name="Object Mute"/>
|
||||
|
||||
@@ -11,22 +11,34 @@
|
||||
<menu_item_call label="Añadir Amigo" name="Add Friend"/>
|
||||
<menu_item_call label="Quitar Amigo" name="Remove Friend"/>
|
||||
<menu_item_call label="Invitar a Grupo" name="Invite To Group"/>
|
||||
<menu_item_call label="Seguir" name="Follow"/>
|
||||
<menu_item_call label="Ir a" name="Move To"/>
|
||||
<menu_item_call label="Ofrecer Teleporte" name="Offer Teleport"/>
|
||||
<menu_item_call label="Teleportar a" name="Teleport To"/>
|
||||
<menu_item_call label="Solicitar Teleporte" name="Request Teleport"/>
|
||||
<menu_item_call label="Compartir" name="Share"/>
|
||||
<menu_item_call label="Historial de Chat" name="Chat History"/>
|
||||
<menu_item_call label="Rastrear/No Rastrear" name="Track/Untrack"/>
|
||||
<menu_item_call label="Copiar UUID" name="Copy Key"/>
|
||||
<menu_item_call label="Copiar Nombres" name="Copy Names"/>
|
||||
<menu_item_call label="Copiar SLURL" name="Copy SLURL"/>
|
||||
</menu>
|
||||
<menu label="Enfoque" name="Focusing">
|
||||
<menu_item_call label="Enfocar" name="Focus"/>
|
||||
<menu_item_call label="Enfocar Siguiente" name="Focus Next"/>
|
||||
<menu_item_call label="Enfocar Anterior" name="Focus Previous"/>
|
||||
<menu_item_separator/>
|
||||
<menu_item_call label="Marcar/Desmarcar" name="Mark/Unmark"/>
|
||||
<menu_item_call label="Enfocar Siguiente Marcado" name="Focus Next Marked"/>
|
||||
<menu_item_call label="Enfocar Anterior Marcado" name="Focus Previous Marked"/>
|
||||
</menu>
|
||||
<menu name="Mark" label="Marcas">
|
||||
<menu_item_call label="Rojo" name="Red"/>
|
||||
<menu_item_call label="Verde" name="Green"/>
|
||||
<menu_item_call label="Azul" name="Blue"/>
|
||||
<menu_item_call label="Amarillo" name="Yellow"/>
|
||||
<menu_item_call label="Personalizado..." name="Custom"/>
|
||||
<menu_item_call label="Desmarcar" name="Unmark"/>
|
||||
</menu>
|
||||
<menu label="Alertas" name="Alerts">
|
||||
<menu_item_check label="Mostrar Alertas cuando un avatar" name="Display alerts in chat"/>
|
||||
<menu_item_check label="entra/abandona el sim" name="sim alerts"/>
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<context_menu name="Url Popup">
|
||||
<menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/>
|
||||
<menu_item_call label="Copiar Key al portapapeles" name="key_copy"/>
|
||||
<menu_item_call label="Seleccionar Todo" name="Select All"/>
|
||||
</context_menu>
|
||||
|
||||
@@ -1,8 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<context_menu name="Url Popup">
|
||||
<context_menu label="Grupo" name="Url Popup">
|
||||
<menu_item_call label="Mostrar la información del grupo" name="show_group"/>
|
||||
<menu_item_call label="Abrir chat del grupo" name="im_group"/>
|
||||
<menu_item_call label="Llamar en el grupo" name="call_group"/>
|
||||
<menu_item_call label="Activar Grupo" name="activate_group"/>
|
||||
<menu_item_call label="Historial de Chat" name="Chat History"/>
|
||||
<menu_item_call label="Unirse al Grupo" name="join_group"/>
|
||||
<menu_item_call label="Abandonar el Grupo" name="leave_group"/>
|
||||
<menu_item_call label="Copiar el grupo al portapapeles" name="url_copy_label"/>
|
||||
<menu_item_call label="Copiar SLurl al portapapeles" name="url_copy"/>
|
||||
<menu_item_call label="Copiar Key al portapapeles" name="key_copy"/>
|
||||
<menu_item_call label="Copiar UUID al portapapeles" name="key_copy"/>
|
||||
<menu_item_call label="Seleccionar Todo" name="Select All"/>
|
||||
</context_menu>
|
||||
|
||||
38
indra/newview/skins/default/xui/es/menu_url_object_owner.xml
Normal file
38
indra/newview/skins/default/xui/es/menu_url_object_owner.xml
Normal file
@@ -0,0 +1,38 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<context_menu label="Propietario" name="Object Owner Submenu">
|
||||
<menu_item_call label="Enviar MI..." name="send_im"/>
|
||||
<menu name="Actions" label="Acciones">
|
||||
<menu_item_call label="Perfil" name="Profile"/>
|
||||
<menu_item_call label="Perfil Web" name="Web Profile"/>
|
||||
<menu_item_call label="Pagar" name="Pay"/>
|
||||
<menu_item_call label="Llamar" name="Call"/>
|
||||
<menu_item_call label="Ofrecer Amistad" name="Add Friend"/>
|
||||
<menu_item_call label="Quitar Amistad" name="Remove Friend"/>
|
||||
<menu_item_call label="Invitar a un Grupo" name="Invite To Group"/>
|
||||
<menu_item_call label="Seguir" name="Follow"/>
|
||||
<menu_item_call label="Mover A" name="Move To"/>
|
||||
<menu_item_call label="Ofrecer Teleporte" name="Offer Teleport"/>
|
||||
<menu_item_call label="Teleportar A" name="Teleport To"/>
|
||||
<menu_item_call label="Solicitar Teleporte" name="Request Teleport"/>
|
||||
<menu_item_call label="Encontar en el Mapa" name="Find on Map"/>
|
||||
<menu_item_call label="Compartir" name="Share"/>
|
||||
<menu_item_call label="Historial de Chat" name="Chat History"/>
|
||||
<menu_item_call label="Rastrear/No Rastrear" name="Track/Untrack"/>
|
||||
<menu_item_call label="Enfocar" name="Focus"/>
|
||||
</menu>
|
||||
<menu name="Copiar">
|
||||
<menu_item_call label="Nombre" name="copy_name"/>
|
||||
<menu_item_call label="SLURL" name="url_copy"/>
|
||||
<menu_item_call label="UUID" name="key_copy"/>
|
||||
</menu>
|
||||
<menu label="Moderación" name="Moderation" create_jump_keys=""/>
|
||||
<menu_item_call label="Silenciar" name="Mute"/>
|
||||
<menu_item_call label="Quitar silencio" name="Unmute"/>
|
||||
<menu_item_call label="Prohibir en el grupo" name="Ban From Group"/>
|
||||
<menu_item_call label="Denuncair Infracción" name="Report Abuse"/>
|
||||
<menu_item_call label="Congelar" name="Freeze"/>
|
||||
<menu_item_call label="Expulsar/Prohibir en la Parcela" name="Eject/Ban from Parcel"/>
|
||||
<menu_item_call label="Expulsar del estado" name="Eject from estate"/>
|
||||
<menu_item_call label="Expulsar y prohibir del estado" name="Eject and ban from estate"/>
|
||||
</menu>
|
||||
</context_menu>
|
||||
@@ -1,12 +1,28 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<context_menu name="Url Popup" label="Objeto">
|
||||
<menu_item_call label="Perfil del objeto..." name="show_object"/>
|
||||
<menu_item_call label="Ignorar..." name="block_object"/>
|
||||
<menu_item_call label="Desbloquear" name="unblock_object"/>
|
||||
<menu_item_call label="Mostrar en el mapa" name="show_on_map"/>
|
||||
<menu_item_call label="Teleportarse a la posición del objeto" name="teleport_to_object"/>
|
||||
<menu_item_call label="Copiar el nombre del objeto al portapapeles" name="url_copy_label"/>
|
||||
<menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/>
|
||||
<menu_item_call label="Copiar Key al portapapeles" name="key_copy"/>
|
||||
<menu name="URL Actions" label="Acciones URL">
|
||||
<menu_item_call label="Perfil del objeto..." name="show_object"/>
|
||||
<menu_item_call label="Ignorar..." name="block_object"/>
|
||||
<menu_item_call label="Desbloquear" name="unblock_object"/>
|
||||
<menu_item_call label="Mostrar en el mapa" name="show_on_map"/>
|
||||
<menu_item_call label="Teleportarse a la posición del objeto" name="teleport_to_object"/>
|
||||
</menu>
|
||||
<menu name="Object" label="Objeto">
|
||||
<menu_item_call label="Enfocar" name="Cam To"/>
|
||||
<menu_item_call label="Seguir" name="Follow"/>
|
||||
<menu_item_call label="Mover A" name="Move To"/>
|
||||
<menu_item_call label="Teleportar A (ubicación actual)" name="Teleport To (current location)"/>
|
||||
<menu_item_call label="Sentarse" name="Sit On"/>
|
||||
<menu_item_call label="Pagar" name="Pay"/>
|
||||
<menu_item_call label="Tocar" name="Touch"/>
|
||||
<menu_item_call label="Editar" name="Edit"/>
|
||||
<menu_item_call label="Añadir a la Selección" name="Add to Selection"/>
|
||||
<menu_item_call label="Desdibujar" name="Derender"/>
|
||||
</menu>
|
||||
<menu name="Copy" label="Copiar">
|
||||
<menu_item_call label="Nombre" name="url_copy_label"/>
|
||||
<menu_item_call label="SLURL" name="url_copy"/>
|
||||
<menu_item_call label="UUID" name="key_copy"/>
|
||||
</menu>
|
||||
<menu_item_call label="Seleccionar Todo" name="Select All"/>
|
||||
</context_menu>
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<menu_item_call label="Subir Sonido ([UPLOADFEE])..." name="Upload Sound"/>
|
||||
<menu_item_call label="Subir Animación ([UPLOADFEE])..." name="Upload Animation"/>
|
||||
<menu_item_call label="Subir Modelo..." name="Upload Mesh"/>
|
||||
<menu_item_call label="Subir Masivo (por archivo)..." name="Bulk Upload"/>
|
||||
<menu_item_call label="Subir Masivo (Pago por archivo)..." name="Bulk Upload"/>
|
||||
<menu_item_call label="Importar Objeto XML" name="Import"/>
|
||||
<menu_item_call label="Importar con Texturas" name="Import2"/>
|
||||
<menu_item_call label="Cambiar Texturas Locales" name="Change Local Textures"/>
|
||||
@@ -134,6 +134,7 @@
|
||||
<menu_item_check label="Ítems Recibidos" name="Received Items"/>
|
||||
<menu_item_check label="Avatares Predefinidos" name="Avatar Picker"/>
|
||||
<menu_item_check label="Destinos" name="Destinations"/>
|
||||
<menu_item_check label="Experiencias..." name="Experiences..."/>
|
||||
<menu_item_call label="Mi Terreno..." name="My Land..."/>
|
||||
<menu_item_call label="Acerca del Terreno..." name="About Land..."/>
|
||||
<menu_item_call label="Comprar Terreno..." name="Buy Land..."/>
|
||||
@@ -211,7 +212,7 @@
|
||||
<menu_item_call label="Blog Oficial de Linden Lab..." name="Official Linden Blog..."/>
|
||||
<menu_item_call label="Estado del Grid..." name="Grid Status..."/>
|
||||
<menu_item_call label="Portal de Scripting..." name="Scripting Portal..."/>
|
||||
<menu_item_call label="Denunciar Abuso..." name="Report Abuse..."/>
|
||||
<menu_item_call label="Denunciar Infracción..." name="Report Abuse..."/>
|
||||
<menu_item_call label="Choques, Empujones y Golpes..." name="Bumps, Pushes &amp; Hits..."/>
|
||||
<menu label="Informe de Fallos" name="Bug Reporting" >
|
||||
<menu_item_call label="Seguimiento de Problemas Público..." name="Public Issue Tracker..."/>
|
||||
@@ -224,28 +225,27 @@
|
||||
<menu_item_call label="Informar Fallos de [SHORT_APP_NAME]..." name="Report [SHORT_APP_NAME] Bug..."/>
|
||||
<menu_item_call label="Solicitar Nueva Característica..." name="Request New Feature..."/>
|
||||
</menu>
|
||||
<menu_item_call label="[SHORT_APP_NAME] Group" name="viewer group">
|
||||
<on_click function="URLAction" userdata="secondlife:///app/group/ce736e80-376b-e057-1722-431d1daa363e/about"/>
|
||||
<menu_item_call label="Grupo [SHORT_APP_NAME]" name="viewer group">
|
||||
<on_click function="URLAction" userdata="secondlife:///app/group/d21f3901-f87d-e8df-4323-f25b23a367be/about"/>
|
||||
<on_visible function="VisibleSecondLife"/>
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Acerca de [APP_NAME]..." name="About Second Life..."/>
|
||||
<menu_item_call label="Acerca de [SHORT_APP_NAME]..." name="About Second Life..."/>
|
||||
</menu>
|
||||
<!-- ============================= -->
|
||||
<menu label="[SHORT_APP_NAME]" name="Singularity">
|
||||
<menu_item_call label="Cerrar todos los diálogos" name="Close All Dialogs"/>
|
||||
<menu_item_call label="Falso Estado Ausente" name="Fake Away Status"/>
|
||||
<menu_item_call label="Forzar Sentarse en el Piso" name="Force Ground Sit"/>
|
||||
<menu_item_call label="Animation Override..." name="Animation Override ..."/>
|
||||
<menu_item_call label="Animaciones (AO)..." name="Animation Override ..."/>
|
||||
<menu_item_check label="Pose Stand" name="Pose Stand"/>
|
||||
<menu_item_check label="Agilidad" name="Nimble"/>
|
||||
<menu_item_call label="Resincronizar Animaciones" name="Resync Animations"/>
|
||||
<menu_item_check label="Monitor de Región" name="Region Tracker"/>
|
||||
<menu_item_check label="Búsqueda en Área" name="Object Area Search"/>
|
||||
<menu_item_check label="Explorador de Sonidos" name="Sound Explorer"/>
|
||||
<menu_item_check label="Lista Negra de Assets" name="Asset Blacklist"/>
|
||||
<menu_item_check label="Lista Negra" name="Asset Blacklist"/>
|
||||
<menu_item_check label="Filtro de Media" name="Media Filter"/>
|
||||
<menu_item_check label="Mostrar Información de Audio" name="Streaming Audio Display"/>
|
||||
|
||||
<menu_item_check label="Consola de Depuración de Región" name="Region Debug Console"/>
|
||||
<menu_item_call label="Redibujar" name="Rebake"/>
|
||||
</menu>
|
||||
|
||||
@@ -89,19 +89,19 @@
|
||||
Por favor, comprueba que tienes instalado el último Visor.
|
||||
|
||||
Detalles del error: la notificación de nombre '[_NAME]' no se ha encontrado en notifications.xml.
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
<usetemplate name="okbutton" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="FloaterNotFound">
|
||||
Error: no se pudieron encontrar estos controles:
|
||||
|
||||
[CONTROLS]
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
<usetemplate name="okbutton" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="TutorialNotFound">
|
||||
Actualmente, no hay un tutorial disponible.
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
<usetemplate name="okbutton" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="GenericAlert">
|
||||
@@ -120,7 +120,7 @@ Detalles del error: la notificación de nombre '[_NAME]' no se ha enco
|
||||
|
||||
<notification name="GenericAlertOK">
|
||||
[MESSAGE]
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
<usetemplate name="okbutton" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="BadInstallation">
|
||||
@@ -208,34 +208,34 @@ canceltext="Reiniciar" yestext="Si"/>
|
||||
Ha ocurrido el siguiente error al copiar o mover a la carpeta de stock:
|
||||
|
||||
'[ERROR_CODE]'
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
<usetemplate name="okbutton" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="MerchantPasteFailed">
|
||||
Ha ocurrido el siguiente error al copiar o mover a la carpeta de stock:
|
||||
|
||||
'[ERROR_CODE]'
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
<usetemplate name="okbutton" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="MerchantTransactionFailed">
|
||||
Ha ocurrido el siguiente error en la transacción al mercado:
|
||||
|
||||
[ERROR_REASON][ERROR_DESCRIPTION]
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
<usetemplate name="okbutton" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="MerchantUnprocessableEntity">
|
||||
No hemos podido incluir este producto en tus artículos o activar la carpeta de versión. Normalmente esto ocurre porque falta información en el formulario de descripción de los artículos,
|
||||
aunque también puede deberse a errores en la estructura de carpetas. Puedes editar los artículos o comprobar si la carpeta de artículos tiene algún error.
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
<usetemplate name="okbutton" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="MerchantListingFailed">
|
||||
Ha ocurrido el siguiente error en la lista de artículos del Mercado:
|
||||
|
||||
'[ERROR_CODE]'
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
<usetemplate name="okbutton" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="MerchantFolderActivationFailed">
|
||||
@@ -248,17 +248,17 @@ aunque también puede deberse a errores en la estructura de carpetas. Puedes edi
|
||||
|
||||
<notification name="MerchantForceValidateListing">
|
||||
Para crear tu lista de artículos, hemos corregido la jerarquía del contenido de la lista.
|
||||
<usetemplate ignoretext="Recordarme que al crear una lista de artículos se modifica la jerarquía del contenido" name="okignore" yestext="OK"/>
|
||||
<usetemplate ignoretext="Recordarme que al crear una lista de artículos se modifica la jerarquía del contenido" name="okignore" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="ConfirmMerchantActiveChange">
|
||||
Esta acción cambiará el contenido activo de esta lista de artículos. ¿Quieres continuar?
|
||||
<usetemplate ignoretext="Confirmar antes de cambiar una lista de artículos activa en el Mercado" name="okcancelignore" notext="Cancelar" yestext="OK"/>
|
||||
<usetemplate ignoretext="Confirmar antes de cambiar una lista de artículos activa en el Mercado" name="okcancelignore" notext="Cancelar" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="ConfirmMerchantMoveInventory">
|
||||
Los artículos arrastrados a la ventana Artículos del mercado se mueven desde sus ubicaciones originales, no se copian. ¿Quieres continuar?
|
||||
<usetemplate ignoretext="Confirmar antes de mover un artículo desde el inventario al Mercado" name="okcancelignore" notext="Cancelar" yestext="OK"/>
|
||||
<usetemplate ignoretext="Confirmar antes de mover un artículo desde el inventario al Mercado" name="okcancelignore" notext="Cancelar" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="ConfirmListingCutOrDelete">
|
||||
@@ -266,7 +266,7 @@ aunque también puede deberse a errores en la estructura de carpetas. Puedes edi
|
||||
Si deseas conservar los artículos del Mercado, mueve o elimina el contenido de la carpeta de versión que desees modificar.
|
||||
|
||||
¿Quieres continuar?
|
||||
<usetemplate ignoretext="Confirmar antes de mover o eliminar una lista de artículos del Mercado" name="okcancelignore" notext="Cancelar" yestext="OK"/>
|
||||
<usetemplate ignoretext="Confirmar antes de mover o eliminar una lista de artículos del Mercado" name="okcancelignore" notext="Cancelar" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="ConfirmCopyToMarketplace">
|
||||
@@ -276,18 +276,18 @@ aunque también puede deberse a errores en la estructura de carpetas. Puedes edi
|
||||
|
||||
<notification name="ConfirmMerchantUnlist">
|
||||
Esta acción retirará esta lista de artículos. ¿Quieres continuar?
|
||||
<usetemplate ignoretext="Confirmar antes retirar una lista de artículos activa en el Mercado" name="okcancelignore" notext="Cancelar" yestext="OK"/>
|
||||
<usetemplate ignoretext="Confirmar antes retirar una lista de artículos activa en el Mercado" name="okcancelignore" notext="Cancelar" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="ConfirmMerchantClearVersion">
|
||||
Esta acción desactivará la carpeta de versión de la lista de artículos actual. ¿Quieres continuar?
|
||||
<usetemplate ignoretext="Confirmar antes de desactivar la carpeta de versión de una lista de artículos del Mercado" name="okcancelignore" notext="Cancelar" yestext="OK"/>
|
||||
<usetemplate ignoretext="Confirmar antes de desactivar la carpeta de versión de una lista de artículos del Mercado" name="okcancelignore" notext="Cancelar" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="AlertMerchantListingNotUpdated">
|
||||
No se ha podido actualizar esta lista de artículos.
|
||||
[[URL] Haz clic aquí] para editarla en el Mercado.
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
<usetemplate name="okbutton" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
@@ -303,22 +303,22 @@ aunque también puede deberse a errores en la estructura de carpetas. Puedes edi
|
||||
|
||||
<notification name="AlertMerchantListingActivateRequired">
|
||||
Esta lista de artículos contiene varias carpetas de versión o ninguna. Tendrás que seleccionar y activar una por tu cuenta más tarde.
|
||||
<usetemplate ignoretext="Mostrar una alerta de la activación de la carpeta de versión al crear una lista de artículos con varias carpetas de versión" name="okignore" yestext="OK"/>
|
||||
<usetemplate ignoretext="Mostrar una alerta de la activación de la carpeta de versión al crear una lista de artículos con varias carpetas de versión" name="okignore" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="AlertMerchantStockFolderSplit">
|
||||
Hemos separado los artículos en stock de diferentes tipos en carpetas distintas, para que tu carpeta esté organizada de tal forma que podamos incluirla en el Mercado.
|
||||
<usetemplate ignoretext="Mostrar alerta cuando la carpeta de stock se divida antes de incluirla en la lista" name="okignore" yestext="OK"/>
|
||||
<usetemplate ignoretext="Mostrar alerta cuando la carpeta de stock se divida antes de incluirla en la lista" name="okignore" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="AlertMerchantStockFolderEmpty">
|
||||
Hemos retirado tu lista de artículos porque el stock está vacío. Para volver a publicar tus artículos, añade más unidades a la carpeta de stock.
|
||||
<usetemplate ignoretext="Mostrar alerta cuando una lista de artículos se retire porque la carpeta de stock está vacía" name="okignore" yestext="OK"/>
|
||||
<usetemplate ignoretext="Mostrar alerta cuando una lista de artículos se retire porque la carpeta de stock está vacía" name="okignore" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="AlertMerchantVersionFolderEmpty">
|
||||
Hemos retirado tu lista de artículos porque la carpeta de versión está vacía. Para volver a publicar tus artículos, añade artículos a la carpeta de versión.
|
||||
<usetemplate ignoretext="Mostrar una alerta cuando una lista de artículos se retire porque la carpeta de versión está vacía" name="okignore" yestext="OK"/>
|
||||
<usetemplate ignoretext="Mostrar una alerta cuando una lista de artículos se retire porque la carpeta de versión está vacía" name="okignore" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="CompileQueueSaveText">
|
||||
@@ -352,7 +352,7 @@ Hubo un problema al subir la foto por la siguiente razón: [REASON]
|
||||
|
||||
<notification name="FriendsAndGroupsOnly">
|
||||
Los que no son amigos no sabrán que has elegido ignorar sus llamadas y mensajes instantáneos.
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
<usetemplate name="okbutton" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="FavoritesOnLogin">
|
||||
@@ -519,7 +519,56 @@ Los demás residentes podrán visitar la URL que hayas elegido cuando vean tu pe
|
||||
Unirse a este grupo cuesta [CURRENCY][COST].
|
||||
No tienes suficientes [CURRENCY] para unirte a este grupo.
|
||||
</notification>
|
||||
|
||||
|
||||
<notification name="CreateGroupCost">
|
||||
Crear este grupo te costará L$[COST].
|
||||
Los grupos necesitan mas de un miembro o serán eliminados.
|
||||
Por favor, invita a nuevos miembros dentro de las 48 hs.
|
||||
<usetemplate canceltext="Cancelar" name="okcancelbuttons" notext="Cancelar" yestext="Crear grupo por L$[COST]"/>
|
||||
</notification>
|
||||
|
||||
<notification name="JoinGroupInaccessible">
|
||||
Este grupo no es accesible para ti.
|
||||
<usetemplate name="okbutton" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="JoinGroupError">
|
||||
Ha ocurrido un error procesando tu petición de ingresar al grupo.
|
||||
<usetemplate name="okbutton" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="JoinGroupErrorReason">
|
||||
Imposible unirse al grupo: [reason]
|
||||
<usetemplate name="okbutton" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="JoinGroupTrialUser">
|
||||
Lo sentimos, los usuarios de prueba no pueden unirse a los grupos.
|
||||
<usetemplate name="okbutton" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="JoinGroupMaxGroups">
|
||||
No puedes unirte al grupo '[group_name]':
|
||||
Ya perteneces a [group_count] grupos, la cantidad máxima es de [max_groups]
|
||||
<usetemplate name="okbutton" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="JoinGroupClosedEnrollment">
|
||||
No puedes unirte al grupo '[group_name]':
|
||||
El grupo ya no admite más miembros.
|
||||
<usetemplate name="okbutton" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="JoinGroupSuccess" >
|
||||
Ahora formas parte del grupo
|
||||
<usetemplate name="okbutton" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="JoinGroupInsufficientFunds">
|
||||
No se pudo transferir los [CURRENCY][membership_fee] necesarios para pagar la membresía.
|
||||
<usetemplate name="okbutton" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="LandBuyPass">
|
||||
Por [CURRENCY][COST] puedes entrar a este terreno ('[PARCEL_NAME]') durante [TIME] horas. ¿Comprar un pase?
|
||||
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Aceptar"/>
|
||||
@@ -829,7 +878,7 @@ El objeto debe de haber sido borrado o estar fuera de rango.
|
||||
|
||||
<notification name="MediaFileDownloadUnsupported" label="">
|
||||
Has solicitado descargar un archivo, lo cual no está soportado dentro de [SECOND_LIFE].
|
||||
<usetemplate ignoretext="Advertir sobre descarga de archivos no soportados" name="okignore" yestext="OK"/>
|
||||
<usetemplate ignoretext="Advertir sobre descarga de archivos no soportados" name="okignore" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="CannotWriteFile">
|
||||
@@ -1062,7 +1111,7 @@ Podría ser [VALIDS]
|
||||
<notification name="CorruptedProtectedDataStore">
|
||||
No podemos completar tu nombre de usuario y contraseña. Esto puede suceder cuando cambia la configuración de la red
|
||||
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
<usetemplate name="okbutton" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="CorruptResourceFile">
|
||||
@@ -2289,6 +2338,36 @@ Se cambiarán miles de regiones, y se provocará un colapso en el espacio del se
|
||||
<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
|
||||
</notification>
|
||||
|
||||
<notification label="Seleccionar estado" name="EstateAllowedExperienceAdd">
|
||||
¿Añadir a la lista de permitidos solamente en este estado o en [ALL_ESTATES]?
|
||||
<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
|
||||
</notification>
|
||||
|
||||
<notification label="Seleccionar estado" name="EstateAllowedExperienceRemove">
|
||||
¿Quitar de la lista de permitidos solamente en este estado o en [ALL_ESTATES]?
|
||||
<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
|
||||
</notification>
|
||||
|
||||
<notification label="Seleccionar estado" name="EstateBlockedExperienceAdd">
|
||||
¿Añadir a la lista de bloqueados solamente para este estado o en [ALL_ESTATES]?
|
||||
<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
|
||||
</notification>
|
||||
|
||||
<notification label="Seleccionar estadoe" name="EstateBlockedExperienceRemove">
|
||||
¿Quitar de la lista de bloqueados solamente para este estado o en [ALL_ESTATES]?
|
||||
<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
|
||||
</notification>
|
||||
|
||||
<notification label="Seleccionar estado" name="EstateTrustedExperienceAdd">
|
||||
¿Añadir a la lista de claves solamente para este estado o en [ALL_ESTATES]?
|
||||
<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
|
||||
</notification>
|
||||
|
||||
<notification label="Seleccionar estado" name="EstateTrustedExperienceRemove">
|
||||
¿Quitar de la lista de claves solamente para este estado o en [ALL_ESTATES]?
|
||||
<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
|
||||
</notification>
|
||||
|
||||
<notification label="Confirmar la expulsión" name="EstateKickUser">
|
||||
¿Expulsar a [EVIL_USER] de este Estado?
|
||||
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Aceptar"/>
|
||||
@@ -2303,6 +2382,11 @@ Se cambiarán miles de regiones, y se provocará un colapso en el espacio del se
|
||||
¿Estás seguro de que quieres cambiar el contrato del Estado?
|
||||
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="EstateParcelAccessOverride">
|
||||
Si esta opción no está seleccionada, se anularán las restricciones establecidas por los dueños de parcelas para evitar provocaciones, matener la privacidad o proteger a los residentes menores de material para adultos. Por favor, consulta con los dueños de parcelas según sea necesario.
|
||||
<usetemplate name="okbutton" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="RegionEntryAccessBlocked">
|
||||
Tus preferencias de contenido actuales te impiden visitar la región que has seleccionado. Puedes cambiar las preferencias en Editar > Preferencias > General.
|
||||
@@ -3936,7 +4020,6 @@ Por favor, reinténtalo en unos momentos.
|
||||
<form name="form">
|
||||
<button name="Teleport" text="Teleportar"/>
|
||||
<button name="Cancel" text="Cancelar"/>
|
||||
<button name="Profile" text="Perfil"/>
|
||||
</form>
|
||||
</notification>
|
||||
|
||||
@@ -3953,7 +4036,6 @@ Por favor, reinténtalo en unos momentos.
|
||||
<form name="form">
|
||||
<button name="Yes" text="Si"/>
|
||||
<button name="No" text="No"/>
|
||||
<button name="Profile" text="Perfil"/>
|
||||
</form>
|
||||
</notification>
|
||||
|
||||
@@ -3967,7 +4049,7 @@ Por favor, reinténtalo en unos momentos.
|
||||
</notification>
|
||||
|
||||
<notification name="OfferFriendship">
|
||||
[NAME] te está ofreciendo amistad.
|
||||
[NAME_SLURL] te está ofreciendo amistad.
|
||||
|
||||
[MESSAGE]
|
||||
|
||||
@@ -3976,7 +4058,6 @@ Por favor, reinténtalo en unos momentos.
|
||||
<button name="Accept" text="Aceptar"/>
|
||||
<button name="Decline" text="Rehusar"/>
|
||||
<button name="Ignore" text="Ignorar"/>
|
||||
<button name="Profile" text="Perfil"/>
|
||||
</form>
|
||||
</notification>
|
||||
|
||||
@@ -3985,14 +4066,13 @@ Por favor, reinténtalo en unos momentos.
|
||||
</notification>
|
||||
|
||||
<notification name="OfferFriendshipNoMessage">
|
||||
[NAME] te está ofreciendo amistad.
|
||||
[NAME_SLURL] te está ofreciendo amistad.
|
||||
|
||||
(Por defecto, podrás ver si están conectados los demás).
|
||||
<form name="form">
|
||||
<button name="Accept" text="Aceptar"/>
|
||||
<button name="Decline" text="Rehusar"/>
|
||||
<button name="Ignore" text="Ignorar"/>
|
||||
<button name="Profile" text="Perfil"/>
|
||||
</form>
|
||||
</notification>
|
||||
|
||||
@@ -4004,6 +4084,14 @@ Por favor, reinténtalo en unos momentos.
|
||||
[NAME] ha rehusado tu oferta de amistad.
|
||||
</notification>
|
||||
|
||||
<notification name="FriendshipAcceptedByMe">
|
||||
Aceptado el ofrecimiento de amistad de [NAME_SLURL]. [MESSAGE]
|
||||
</notification>
|
||||
|
||||
<notification name="FriendshipDeclinedByMe">
|
||||
Rehusado el ofrecimiento de amistad de [NAME_SLURL]. [MESSAGE]
|
||||
</notification>
|
||||
|
||||
<notification name="FriendshipDissolved">
|
||||
[NAME] ha disuelto la amistad.
|
||||
</notification>
|
||||
@@ -4064,13 +4152,94 @@ Del objeto: [OBJECTNAME]; propiedad de: [NAME]?
|
||||
</form>
|
||||
</notification>
|
||||
|
||||
<notification name="ExperienceAcquireFailed">
|
||||
No se puede adquirir una experiencia nueva:
|
||||
[ERROR_MESSAGE]
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
</notification>
|
||||
|
||||
<notification name="NotInGroupExperienceProfileMessage">
|
||||
Se ha motido un cambio en el grupo de la experiencia porque el propietario no es miembro del grupo seleccionado.
|
||||
</notification>
|
||||
|
||||
<notification name="UneditableExperienceProfileMessage">
|
||||
El campo no modificable '[field]' se ha omitido al actualizar el perfil de la experiencia.
|
||||
</notification>
|
||||
|
||||
<notification name="RestrictedToOwnerExperienceProfileMessage">
|
||||
Cambios omitidos en el campo '[field]' que solo puede configurar el propietario de la experiencia.
|
||||
</notification>
|
||||
|
||||
<notification name="MaturityRatingExceedsOwnerExperienceProfileMessage">
|
||||
No puedes definir una calificación de contenido de una experiencia con un nivel superior al del propietario.
|
||||
</notification>
|
||||
|
||||
<notification name="RestrictedTermExperienceProfileMessage">
|
||||
Las condiciones siguientes han impedido la actualización del nombre o la descripción del perfil de la experiencia: [extra_info]
|
||||
</notification>
|
||||
|
||||
<notification name="TeleportedHomeExperienceRemoved">
|
||||
Has sido teleportado desde la región [region_name] porque al quitar la experiencia secondlife:///app/experience/[public_id]/profile ya no tienes permiso para entrar en la región.
|
||||
<form name="form">
|
||||
<ignore name="ignore" text="Expulsado de la región por quitar una experiencia"/>
|
||||
</form>
|
||||
</notification>
|
||||
|
||||
<notification name="TrustedExperienceEntry">
|
||||
La participación en la experiencia clave secondlife:///app/experience/[public_id]/profile te otorga permiso para entrar en la región [region_name]. Si quitas esta experiencia, puede que seas expulsado de la región.
|
||||
<form name="form">
|
||||
<ignore name="ignore" text="Admitido en una región por una experiencia"/>
|
||||
</form>
|
||||
</notification>
|
||||
|
||||
<notification name="TrustedExperiencesAvailable">
|
||||
No tienes permiso de acceso a este destino. Puedes obtener permiso para entrar en la región si aceptas una de las siguientes experiencias:
|
||||
|
||||
[EXPERIENCE_LIST]
|
||||
|
||||
Pueden estar disponibles otras experiencias clave.
|
||||
</notification>
|
||||
|
||||
<notification name="ExperienceEvent">
|
||||
La experiencia secondlife:///app/experience/[public_id]/profile permitió un objeto[EventType].
|
||||
Propietario:secondlife:///app/agent/[OwnerID]/inspect
|
||||
Nombre del objeto: [ObjectName]
|
||||
Nombre de la parcela: [ParcelName]
|
||||
</notification>
|
||||
|
||||
<notification name="ExperienceEventAttachment">
|
||||
La experiencia secondlife:///app/experience/[public_id]/profile permitió un anexo [EventType]-
|
||||
Propietario: secondlife:///app/agent/[OwnerID]/inspect
|
||||
</notification>
|
||||
|
||||
<notification name="ScriptQuestionExperience">
|
||||
'[OBJECTNAME]', un objeto de propiedad de '[NAME]', solicita tu participación en la
|
||||
experiencia[GRID_WIDE]:
|
||||
|
||||
[EXPERIENCE]
|
||||
|
||||
Una vez concedido el permiso, este mensaje no volverá a aparecer para la experiencia salvo que se revoque en el perfil de la experiencia.
|
||||
|
||||
Los scripts asociados a esta experiencia podrán hacer lo siguiente en las regiones donde la experiencia esté activa:
|
||||
|
||||
[QUESTIONS]
|
||||
¿lLo aceptas?
|
||||
<form name="form">
|
||||
<button name="BlockExperience" text="Bloquear experiencia"/>
|
||||
<button name="Mute" text="Bloquear objeto"/>
|
||||
<button name="Yes" text="Si"/>
|
||||
<button name="No" text="No"/>
|
||||
</form>
|
||||
</notification>
|
||||
|
||||
<notification name="ScriptQuestionCaution">
|
||||
'[OBJECTNAME]', un objeto propiedad de '[NAME]', querría:
|
||||
Atención: El objeto '[OBJECTNAME]', solicita un acceso pleno a tu cuenta de dólares Linden. Si le
|
||||
autorizas el acceso, podrá retirar fondos de tu cuenta en cualquier momento o vaciarla por completo, cuando lo desee y sin más advertencias.
|
||||
|
||||
[QUESTIONS]
|
||||
Si no confías en este objeto y su creador, debes denegar la solicitud. Para más información, pulsa el botón Detalles.
|
||||
[FOOTERTEXT]
|
||||
|
||||
No autorices el acceso a tu cuenta si no conoces cuál es la razón exacta.
|
||||
|
||||
¿Autorizar esta petición?
|
||||
<form name="form">
|
||||
<button name="Grant" text="Autorizar"/>
|
||||
<button name="Deny" text="Denegar"/>
|
||||
@@ -4079,9 +4248,10 @@ Si no confías en este objeto y su creador, debes denegar la solicitud. Para má
|
||||
</notification>
|
||||
|
||||
<notification name="ScriptDialog">
|
||||
'[TITLE]' de [NAME]
|
||||
[MESSAGE]
|
||||
'[TITLE]' de [NAME] (ch[CHANNEL])
|
||||
[MESSAGE]
|
||||
<form name="form">
|
||||
<button name="Mute" text="Bloquear"/>
|
||||
<button name="Ignore" text="Ignorar"/>
|
||||
</form>
|
||||
</notification>
|
||||
@@ -4090,6 +4260,7 @@ Si no confías en este objeto y su creador, debes denegar la solicitud. Para má
|
||||
'[TITLE]' de [GROUPNAME]
|
||||
[MESSAGE]
|
||||
<form name="form">
|
||||
<button name="Mute" text="Bloquear"/>
|
||||
<button name="Ignore" text="Ignorar"/>
|
||||
</form>
|
||||
</notification>
|
||||
@@ -4481,7 +4652,7 @@ Avatar '[NAME]' ha abandonado la edición de su Apariencia.
|
||||
<notification name="NoConnect">
|
||||
Tenemos problemas de conexión con [PROTOCOL] [HOSTID].
|
||||
Comprueba la configuración de la red y del servidor de seguridad.
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
<usetemplate name="okbutton" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="NoVoiceConnect">
|
||||
@@ -4531,62 +4702,62 @@ No se puede aplicar esta textura en forma inmediata ya que es no copiable y/o no
|
||||
|
||||
<notification name="SOCKS_NOT_PERMITTED">
|
||||
El Proxy Socks5 "[HOST]:[PORT]" rechazó la conexión, no permitido por el conjunto de reglas.
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
<usetemplate name="okbutton" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="SOCKS_CONNECT_ERROR">
|
||||
El Proxy Socks5 "[HOST]:[PORT]" rechazó la conexión, no se puede abrir el canal TCP
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
<usetemplate name="okbutton" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="SOCKS_NOT_ACCEPTABLE">
|
||||
El Proxy Socks5 "[HOST]:[PORT]" rechazó el sistema de autenticación seleccionado.
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
<usetemplate name="okbutton" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="SOCKS_AUTH_FAIL">
|
||||
El Proxy Socks5 [HOST]:[PORT]" ha reportado que tus credenciales son inválidas
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
<usetemplate name="okbutton" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="SOCKS_UDP_FWD_NOT_GRANTED">
|
||||
El Proxy Socks5 "[HOST]:[PORT]" rechazó el requerimiento UDP
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
<usetemplate name="okbutton" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="SOCKS_HOST_CONNECT_FAILED">
|
||||
No se puede conectar al Servidor proxy SOCKS5 "[HOST]:[PORT]"
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
<usetemplate name="okbutton" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="SOCKS_UNKNOWN_STATUS">
|
||||
Error de proxy desconocido con el servidor "[HOST]:[PORT]".
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
<usetemplate name="okbutton" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="SOCKS_INVALID_HOST">
|
||||
Dirección o puerto de proxy SOCKS no válidos "[HOST]:[PORT]".
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
<usetemplate name="okbutton" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="SOCKS_BAD_CREDS">
|
||||
Nombre de usuario o contraseña de SOCKS 5 no válidos.
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
<usetemplate name="okbutton" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="PROXY_INVALID_HTTP_HOST">
|
||||
Dirección o puerto de proxy HTTP no válidos "[HOST]:[PORT]".
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
<usetemplate name="okbutton" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="PROXY_INVALID_SOCKS_HOST">
|
||||
Dirección o puerto de proxy SOCKS no válidos "[HOST]:[PORT]".
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
<usetemplate name="okbutton" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="ChangeProxySettings">
|
||||
La configuración del puerto se activará cuando reinicies [APP_NAME]
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
<usetemplate name="okbutton" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="AuthRequest">
|
||||
@@ -4656,7 +4827,7 @@ No se puede aplicar esta textura en forma inmediata ya que es no copiable y/o no
|
||||
|
||||
<notification name="ConfirmHideUI" label="">
|
||||
Esta acción ocultará todos los botones y elementos de menú. Para restaurarlos, pulsa otra vez en [SHORTCUT].
|
||||
<usetemplate name="okcancelignore" yestext="OK" notext="Cancelar" ignoretext="Confirmar antes de ocultar la IU"/>
|
||||
<usetemplate name="okcancelignore" yestext="Aceptar" notext="Cancelar" ignoretext="Confirmar antes de ocultar la IU"/>
|
||||
</notification>
|
||||
|
||||
<notification name="PathfindingLinksets_WarnOnPhantom">
|
||||
@@ -5833,17 +6004,17 @@ porque la parcela está llena.
|
||||
|
||||
<notification name="PreferenceChatClearLog">
|
||||
Esto eliminará los registros de conversaciones anteriores y las copias de seguridad de ese archivo.
|
||||
<usetemplate ignoretext="Confirmar antes de eliminar el registro de conversaciones anteriores." name="okcancelignore" notext="Cancelar" yestext="OK"/>
|
||||
<usetemplate ignoretext="Confirmar antes de eliminar el registro de conversaciones anteriores." name="okcancelignore" notext="Cancelar" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="PreferenceChatDeleteTranscripts">
|
||||
Esta acción eliminará las transcripciones de todas las conversaciones anteriores. La lista de conversaciones pasadas no resultará afectada. Se eliminarán de la carpeta [FOLDER] todos los archivos que tengan el sufijo .txt y txt.backup
|
||||
<usetemplate ignoretext="Confirmar antes de eliminar transcripciones." name="okcancelignore" notext="Cancelar" yestext="OK"/>
|
||||
<usetemplate ignoretext="Confirmar antes de eliminar transcripciones." name="okcancelignore" notext="Cancelar" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="PreferenceChatPathChanged">
|
||||
No se pueden mover los archivos. Ruta anterior restaurada.
|
||||
<usetemplate ignoretext="No se pueden mover los archivos. Ruta anterior restaurada." name="okignore" yestext="OK"/>
|
||||
<usetemplate ignoretext="No se pueden mover los archivos. Ruta anterior restaurada." name="okignore" yestext="Aceptar"/>
|
||||
</notification>
|
||||
|
||||
<notification name="DefaultObjectPermissions">
|
||||
@@ -5903,7 +6074,7 @@ la región [REGION]?
|
||||
</notification>
|
||||
|
||||
<notification name="AntiSpamNewlineFlood">
|
||||
AntiSpam: Se ha bloqueado newline flood de [SOURCE] ( [AMOUNT] newlines).
|
||||
AntiSpam: Se ha bloqueado newline flood de secondlife:///app/agent/[SOURCE]/about ( [AMOUNT] newlines).
|
||||
</notification>
|
||||
|
||||
<notification name="BulkTemporaryUpload">
|
||||
@@ -6097,36 +6268,33 @@ Tu cuerpo, piel, pelo u ojos podrían ser los predeterminados
|
||||
</notification>
|
||||
|
||||
<notification label="Actualización Disponible" name="RecommendedUpdate">
|
||||
Una nueva versión, [RECOMMENDED_VER], para Singularity[TYPE], está disponible.
|
||||
Una nueva versión, [RECOMMENDED_VER], para [SHORT_APP_NAME].
|
||||
|
||||
Pulsa [Visit Page] para abrir
|
||||
[URL]
|
||||
para mayor información y enlaces de descarga para esta nueva versión.
|
||||
<tag>confirm</tag>
|
||||
<usetemplate name="okcancelignorecanceldefault" notext="Luego" yestext="Visitar Página" ignoretext="Ignorar notificaciones de actualizaciones recomendadas"/>
|
||||
</notification>
|
||||
|
||||
<notification label="¡Actualización Crítical!" name="UrgentUpdate">
|
||||
¡Tu versión de Singularity[TYPE] se encuentra críticamente desactualizada!
|
||||
¡Tu versión de [SHORT_APP_NAME] se encuentra críticamente desactualizada!
|
||||
|
||||
Se recomienda ENÉRGICAMENTE descargues e instales una nueva versión de este visor para evitar problemas de compatibilidad con el grid y/o de seguridad.
|
||||
|
||||
Pulsa [Visit Page] para abrir
|
||||
[URL]
|
||||
para mayor información y enlaces de descarga de nuevas versiones.
|
||||
<tag>confirm</tag>
|
||||
<usetemplate name="okcancelignorecanceldefault" notext="Luego" yestext="Visitar Página" ignoretext="Ignorar notificaciones de Actualizaciones Críticas"/>
|
||||
</notification>
|
||||
|
||||
<notification label="¡Actualización Crítica" name="UrgentUpdateModal">
|
||||
¡Tu versión de Singularity[TYPE] se encuentra críticamente desactualizada!
|
||||
¡Tu versión de [SHORT_APP_NAME] se encuentra críticamente desactualizada!
|
||||
|
||||
Se recomienda ENÉRGICAMENTE descargues e instales una nueva versión de este visor para evitar problemas de compatibilidad con el grid y/o de seguridad.
|
||||
|
||||
Pulsa [Visit Page] para abrir
|
||||
[URL]
|
||||
para mayor información y enlaces de descarga de nuevas versiones.
|
||||
<tag>confirm</tag>
|
||||
<usetemplate name="okcancelignorecanceldefault" notext="Luego" yestext="Visitar Página" ignoretext="Ignorar alertas de actualizaciones críticas"/>
|
||||
</notification>
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<panel name="ao_remote">
|
||||
<panel name="panel_bg_tab"/>
|
||||
<button label="AO Sits Off" label_selected="AO Sits On" name="ao_sit_btn"/>
|
||||
<panel name="panel_bg_tab"/>
|
||||
<button label="Forzar nadar" tool_tip="Las animaciones de vuelvo serán reemplazadas por animaciones de nado" name="ao_swim_btn"/>
|
||||
<button label="Sentarse Off" label_selected="Sentarse On" name="ao_sit_btn"/>
|
||||
<panel name="panel_ao_controls"/>
|
||||
</panel>
|
||||
|
||||
46
indra/newview/skins/default/xui/es/panel_experience_info.xml
Normal file
46
indra/newview/skins/default/xui/es/panel_experience_info.xml
Normal file
@@ -0,0 +1,46 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<panel name="panel_experience_info">
|
||||
<text name="title" value="Perfil de la Experiencia"/>
|
||||
<panel name="scrolling_panel">
|
||||
<layout_stack>
|
||||
<layout_panel name="image_panel"/>
|
||||
<layout_panel>
|
||||
<text name="experience_title"value="Kyle's Superhero RPG"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="description panel"/>
|
||||
<layout_panel name="location panel">
|
||||
<text name="Location">
|
||||
Ubicación:
|
||||
</text>
|
||||
<text name="LocationTextText">
|
||||
Algún lugar
|
||||
</text>
|
||||
<button label="Teleporte" name="teleport_btn"/>
|
||||
<button label="Mapa" name="map_btn"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="marketplace panel">
|
||||
<text name="Location">
|
||||
Tienda del mercado:
|
||||
</text>
|
||||
<text name="LocationTextText">
|
||||
algún lugar
|
||||
</text>
|
||||
</layout_panel>
|
||||
<layout_panel >
|
||||
<text name="ContentRating">
|
||||
Calificación:
|
||||
</text>
|
||||
<text name="ContentRatingText">
|
||||
Adulto
|
||||
</text>
|
||||
<text name="Owner">
|
||||
Propietario:
|
||||
</text>
|
||||
<text name="OwnerText">
|
||||
Kyle
|
||||
</text>
|
||||
</layout_panel>
|
||||
</layout_stack>
|
||||
</panel>
|
||||
</scroll_container>
|
||||
</panel>
|
||||
@@ -0,0 +1,28 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<panel>
|
||||
<panel.string name="loading">
|
||||
cargando...
|
||||
</panel.string>
|
||||
<panel.string name="panel_allowed">
|
||||
Experiencias Permitidas:
|
||||
</panel.string>
|
||||
<panel.string name="panel_blocked">
|
||||
Experiencias bloqueadas:
|
||||
</panel.string>
|
||||
<panel.string name="panel_trusted">
|
||||
Experiencias clave:
|
||||
</panel.string>
|
||||
<panel.string name="no_results">
|
||||
(vacio)
|
||||
</panel.string>
|
||||
<text name="text_name">
|
||||
Lista de experiencias
|
||||
</text>
|
||||
<name_list name="experience_list">
|
||||
<columns name="experience_name" label="Nombre"/>
|
||||
</name_list>
|
||||
<button name="btn_add" label="Añadir..."/>
|
||||
<button name="btn_remove" label="Eliminar"/>
|
||||
<button name="btn_profile" label="Perfil..."/>
|
||||
</panel>
|
||||
|
||||
26
indra/newview/skins/default/xui/es/panel_experience_log.xml
Normal file
26
indra/newview/skins/default/xui/es/panel_experience_log.xml
Normal file
@@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<panel label="Eventos">
|
||||
<string name="no_events" value="No hay eventos."/>
|
||||
<string name="loading" value="cargando..."/>
|
||||
<layout_stack name="experience_panel">
|
||||
<layout_panel name="event_panel">
|
||||
<scroll_list name="experience_log_list">
|
||||
<columns name="time" label="Hora"/>
|
||||
<columns name="event" label="Evento"/>
|
||||
<columns name="experience_name" label="Experiencia"/>
|
||||
<columns name="object_name" label="Objeto"/>
|
||||
</scroll_list>
|
||||
|
||||
<button name="btn_notify" label="Notificar"/>
|
||||
<button name="btn_profile_xp" label="Perfil"/>
|
||||
<button name="btn_report_xp" label="Denunciar"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="button_panel">
|
||||
<check_box label="Notificar todos los eventos Días" name="notify_all" width="180"/>
|
||||
<spinner left_delta="195" name="logsizespinner"/>
|
||||
<button name="btn_clear" label="Limpiar"/>
|
||||
<button name="btn_prev" label="" image_overlay="arrow_left.tga"/>
|
||||
<button name="btn_next" label="" image_overlay="arrow_right.tga"/>
|
||||
</layout_panel>
|
||||
</layout_stack>
|
||||
</panel>
|
||||
@@ -0,0 +1,38 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<panel name="panel_experiences_search" label="Buscar">
|
||||
<string name="not_found">
|
||||
'[TEXT]' no encontrado
|
||||
</string>
|
||||
<string name="no_results">
|
||||
No hay resultados
|
||||
</string>
|
||||
<string name="searching">
|
||||
Buscando...
|
||||
</string>
|
||||
<string name="loading">
|
||||
Cargando...
|
||||
</string>
|
||||
<panel name="search_panel">
|
||||
<text name="search_text">
|
||||
Ingresa una parte del nombre:
|
||||
</text>
|
||||
<button label="Ir" name="find"/>
|
||||
<text name="content_text">
|
||||
Calificación de contenido Máxima:
|
||||
</text>
|
||||
<combo_box label="Moderado" name="maturity" width="120">
|
||||
<combo_box.item label="Adulto" name="Adult"/>
|
||||
<combo_box.item label="Moderado" name="Mature"/>
|
||||
<combo_box.item label="General" name="PG"/>
|
||||
</combo_box>
|
||||
<scroll_list name="search_results">
|
||||
<columns name="maturity" label=""/>
|
||||
<columns name="experience_name" label="Nombre"/>
|
||||
<columns name="owner" label="Propietario"/>
|
||||
</scroll_list>
|
||||
|
||||
<button label="Aceptar" label_selected="Aceptar" name="ok_btn"/>
|
||||
<button label="Cancelar" name="cancel_btn"/>
|
||||
<button label="Ver Pefil" name="profile_btn"/>
|
||||
</panel>
|
||||
</panel>
|
||||
7
indra/newview/skins/default/xui/es/panel_experiences.xml
Normal file
7
indra/newview/skins/default/xui/es/panel_experiences.xml
Normal file
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
|
||||
<panel label="Experiences">
|
||||
<string name="loading_experiences" value="Cargando experiencias..."/>
|
||||
<string name="no_experiences" value="No hay experiencias."/>
|
||||
<string name="acquire" value="Adquirir una Experiencia"/>
|
||||
</panel>
|
||||
@@ -6,13 +6,6 @@
|
||||
<string name="want_apply_text">
|
||||
¿Deseas aplicar estos cambios?
|
||||
</string>
|
||||
<tab_container name="group_tab_container">
|
||||
<panel name="general_tab" />
|
||||
<panel name="roles_tab" />
|
||||
<panel name="notices_tab" />
|
||||
<panel name="voting_tab" />
|
||||
<panel name="land_money_tab" />
|
||||
</tab_container>
|
||||
<button label="Aplicar" label_selected="Aplicar" name="btn_apply"/>
|
||||
<button label="Cancelar" label_selected="Cancelar" name="btn_cancel"/>
|
||||
<button label="OK" label_selected="OK" name="btn_ok"/>
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
<panel name="experiences_tab" label="Experiencias">
|
||||
<string name="help_text">Las experiencias asociadas al grupo se listan aqu<71> en el caso de haber alguna.</string>
|
||||
<text name="panel_header">Experiencias del grupo</text>
|
||||
</panel>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<panel label="Miembros y Roles" name="roles_tab">
|
||||
<panel label="Miembros" name="roles_tab">
|
||||
<string name="default_needs_apply_text">
|
||||
En cambios sin aplicar en esta pestaña.
|
||||
</string>
|
||||
|
||||
@@ -72,51 +72,58 @@
|
||||
<check_box label="Usar botones horizontales para la ventana de contactos (Requiere Reiniciar)" tool_tip="Habilitado, los botones en los paneles de Amigos y Grupos se colocarán en la parte inferior del panel, ordendados horizontalmente, en vez de verticales a la derecha." name="horiz_butt"/>
|
||||
<text name="namesystems_text_box">Formato de nombres en las listas de:</text>
|
||||
<text name="chat_tabs_namesystem_text_box">Pestañas de Chat:</text>
|
||||
<combo_box name="chat_tabs_namesystem_combobox" width="230">
|
||||
<combo_item name="Old Names">Nombres Antiguos</combo_item>
|
||||
<combo_item name="Display Names (with Username)">Nombre a Mostrar (c/Nombre de Usuario)</combo_item>
|
||||
<combo_item name="Display Names only">Solamente Nombre a Mostrar</combo_item>
|
||||
<combo_item name="Old Names (with Display Names)">Nombres Antiguos (c/Nombre a Mostrar)</combo_item>
|
||||
</combo_box>
|
||||
<combo_box name="chat_tabs_namesystem_combobox" width="250">
|
||||
<combo_item name="Old Names">Nombres Antiguos</combo_item>
|
||||
<combo_item name="Display Names (with Username)">Nombre a Mostrar (c/Nombre de Usuario)</combo_item>
|
||||
<combo_item name="Display Names only">Solamente Nombre a Mostrar</combo_item>
|
||||
<combo_item name="Old Names (with Display Names)">Nombres Antiguos (c/Nombre a Mostrar)</combo_item>
|
||||
</combo_box>
|
||||
<text name="friends_namesystem_text_box">Amigos:</text>
|
||||
<combo_box name="friends_namesystem_combobox" width="230">
|
||||
<combo_item name="Old Names">Nombres Antiguos</combo_item>
|
||||
<combo_item name="Display Names (with Username)">Nombre a Mostrar (c/Nombre de Usuario)</combo_item>
|
||||
<combo_item name="Display Names only">Solamente Nombre a Mostrar</combo_item>
|
||||
<combo_item name="Old Names (with Display Names)">Nombres Antiguos (c/Nombre a Mostrar)</combo_item>
|
||||
</combo_box>
|
||||
<combo_box name="friends_namesystem_combobox" width="250">
|
||||
<combo_item name="Old Names">Nombres Antiguos</combo_item>
|
||||
<combo_item name="Display Names (with Username)">Nombre a Mostrar (c/Nombre de Usuario)</combo_item>
|
||||
<combo_item name="Display Names only">Solamente Nombre a Mostrar</combo_item>
|
||||
<combo_item name="Old Names (with Display Names)">Nombres Antiguos (c/Nombre a Mostrar)</combo_item>
|
||||
</combo_box>
|
||||
<text name="group_members_namesystem_text_box">Miembros de Grupos:</text>
|
||||
<combo_box name="group_members_namesystem_combobox" width="230">
|
||||
<combo_item name="Old Names">Nombres Antiguos</combo_item>
|
||||
<combo_item name="Display Names (with Username)">Nombre a Mostrar (c/Nombre de Usuario)</combo_item>
|
||||
<combo_item name="Display Names only">Solamente Nombre a Mostrar</combo_item>
|
||||
<combo_item name="Old Names (with Display Names)">Nombres Antiguos (c/Nombre a Mostrar)</combo_item>
|
||||
</combo_box>
|
||||
<combo_box name="group_members_namesystem_combobox" width="250">
|
||||
<combo_item name="Old Names">Nombres Antiguos</combo_item>
|
||||
<combo_item name="Display Names (with Username)">Nombre a Mostrar (c/Nombre de Usuario)</combo_item>
|
||||
<combo_item name="Display Names only">Solamente Nombre a Mostrar</combo_item>
|
||||
<combo_item name="Old Names (with Display Names)">Nombres Antiguos (c/Nombre a Mostrar)</combo_item>
|
||||
</combo_box>
|
||||
<text name="land_management_namesystem_text_box">Administradores de Tierras:</text>
|
||||
<combo_box name="land_management_namesystem_combobox" width="230">
|
||||
<combo_item name="Old Names">Nombres Antiguos</combo_item>
|
||||
<combo_item name="Display Names (with Username)">Nombre a Mostrar (c/Nombre de Usuario)</combo_item>
|
||||
<combo_item name="Display Names only">Solamente Nombre a Mostrar</combo_item>
|
||||
<combo_item name="Old Names (with Display Names)">Nombres Antiguos (c/Nombre a Mostrar)</combo_item>
|
||||
</combo_box>
|
||||
<combo_box name="land_management_namesystem_combobox" width="250">
|
||||
<combo_item name="Old Names">Nombres Antiguos</combo_item>
|
||||
<combo_item name="Display Names (with Username)">Nombre a Mostrar (c/Nombre de Usuario)</combo_item>
|
||||
<combo_item name="Display Names only">Solamente Nombre a Mostrar</combo_item>
|
||||
<combo_item name="Old Names (with Display Names)">Nombres Antiguos (c/Nombre a Mostrar)</combo_item>
|
||||
</combo_box>
|
||||
<text name="profile_namesystem_text_box">Perfiles:</text>
|
||||
<combo_box name="profile_namesystem_combobox" width="250">
|
||||
<combo_item name="Old Names">Nombres Antiguos</combo_item>
|
||||
<combo_item name="Display Names (with Username)">Nombre a Mostrar (c/Nombre de Usuario)</combo_item>
|
||||
<combo_item name="Display Names only">Solamente Nombre a Mostrar</combo_item>
|
||||
<combo_item name="Old Names (with Display Names)">Nombres Antiguos (c/Nombre a Mostrar)</combo_item>
|
||||
</combo_box>
|
||||
<text name="radar_namesystem_text_box">Radar:</text>
|
||||
<combo_box name="radar_namesystem_combobox" width="230">
|
||||
<combo_item name="Old Names">Nombres Antiguos</combo_item>
|
||||
<combo_item name="Display Names (with Username)">Nombre a Mostrar (c/Nombre de Usuario)</combo_item>
|
||||
<combo_item name="Display Names only">Solamente Nombre a Mostrar</combo_item>
|
||||
<combo_item name="Old Names (with Display Names)">Nombres Antiguos (c/Nombre a Mostrar)</combo_item>
|
||||
</combo_box>
|
||||
<combo_box name="radar_namesystem_combobox" width="250">
|
||||
<combo_item name="Old Names">Nombres Antiguos</combo_item>
|
||||
<combo_item name="Display Names (with Username)">Nombre a Mostrar (c/Nombre de Usuario)</combo_item>
|
||||
<combo_item name="Display Names only">Solamente Nombre a Mostrar</combo_item>
|
||||
<combo_item name="Old Names (with Display Names)">Nombres Antiguos (c/Nombre a Mostrar)</combo_item>
|
||||
</combo_box>
|
||||
<text name="speaker_namesystem_text_box">Participantes:</text>
|
||||
<combo_box name="speaker_namesystem_combobox" width="230">
|
||||
<combo_item name="Old Names">Nombres Antiguos</combo_item>
|
||||
<combo_item name="Display Names (with Username)">Nombre a Mostrar (c/Nombre de Usuario)</combo_item>
|
||||
<combo_item name="Display Names only">Solamente Nombre a Mostrar</combo_item>
|
||||
<combo_item name="Old Names (with Display Names)">Nombres Antiguos (c/Nombre a Mostrar)</combo_item>
|
||||
</combo_box>
|
||||
<combo_box name="speaker_namesystem_combobox" width="250">
|
||||
<combo_item name="Old Names">Nombres Antiguos</combo_item>
|
||||
<combo_item name="Display Names (with Username)">Nombre a Mostrar (c/Nombre de Usuario)</combo_item>
|
||||
<combo_item name="Display Names only">Solamente Nombre a Mostrar</combo_item>
|
||||
<combo_item name="Old Names (with Display Names)">Nombres Antiguos (c/Nombre a Mostrar)</combo_item>
|
||||
</combo_box>
|
||||
<check_box label="Colocar los Botones en la misma línea del nombre en los IMs (Sólo afecta en Nuevos MIs)" name="im_concise_butt"/>
|
||||
<check_box label="Botones en chat de grupo en la línea del nombre del grupo (Afecta nuevos chats de grupo)" name="group_concise_butt"/>
|
||||
<check_box label="Botones en la misma línea de título de conferencia (Afecta nuevas conferencias de Chat)" name="conf_concise_butt"/>
|
||||
<check_box label="Botón Historial abre editor externo" name="legacy_log_launch"/>
|
||||
<check_box label="Botón Historial abre editor externo" name="legacy_log_launch"/>
|
||||
<check_box label="Deshabilitar apertura atajo de Comunicación fuera de la lista de amigos" name="only_comm"/>
|
||||
<check_box label="Desplazamiento automático al final de chats cuando recuperan el foco" name="scroll_to_end_on_focus"/>
|
||||
<check_box label="Mensajes de acción en Itálica (/me)" name="italicize_actions"/>
|
||||
|
||||
@@ -135,7 +135,8 @@
|
||||
<spinner left_delta="270" name="ScriptJumpCount" tool_tip="Umbral para el mensaje de salto de scripts [Predeterminado: 100]"/>
|
||||
<check_box label="Soporte API Restrained Love (RLVa)" name="RestrainedLove" tool_tip="Permite a los scripts tomar control del visor, si tienes vestido un objeto compatible con RLVa."/>
|
||||
<check_box label="Reemplazar slurls y enlaces con etiquetas" name="SinguReplaceLinks" tool_tip="Si bien puedes hacer clic con el botón derecho para ver a dónde conducen realmente al copiarlos, esto puede hacer que los enlaces sean confusos a primera vista."/>
|
||||
<text name="EmergencyTeleportDesc" bottom_delta="-20" >Arrastra un hito para autoteleportarte en los últimos 20 segundos previos al reinicio de región</text>
|
||||
<text name="EmergencyTeleportDesc" bottom_delta="-20" >Arrastra un hito debajo para autoteleportarte antes del reinicio de la región</text>
|
||||
<spinner name="EmergencyTeleportSeconds" label="Comenzar intentos de teleporte antes del reinicio, en segundos"/>
|
||||
<drop_target name="emergency_teleport_landmark_drop" bottom_delta="-15" width="450"/>
|
||||
<text name="EmergencyTeleportBackupDesc" width="440" bottom_delta="-30" >
|
||||
Suelta aquí un hito de resguardo para autoteleportarte, si ya tienes uno en el ítem anterior</text>
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
Siempre
|
||||
</combo_item>
|
||||
</combo_box>
|
||||
<combo_box name="namesystem_combobox">
|
||||
<combo_box name="namesystem_combobox" width="166">
|
||||
<combo_item name="Old Names">
|
||||
Nombres Antiguos
|
||||
</combo_item>
|
||||
@@ -55,7 +55,7 @@
|
||||
<text name="maturity_desired_prompt">
|
||||
Quiero acceder a contenido
|
||||
</text>
|
||||
<combo_box name="maturity_desired_combobox">
|
||||
<combo_box name="maturity_desired_combobox" width="145">
|
||||
<combo_item name="Desired_Adult">
|
||||
PG, Moderado y Adulto
|
||||
</combo_item>
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
<check_box label="Sólo mis amigos y mis grupos pueden ver cuando estoy en línea" name="online_visibility" left="138"/>
|
||||
<text name="text_box2">Opciones de MI:</text>
|
||||
<string name="log_in_to_change">Iniciar sesión para cambiar</string>
|
||||
<string name="email_unverified_tooltip">Por favor verifica tu cuenta de email para habilitar el envío de IM a tu email. Puedes hacer esto en la página web del grid.</string>
|
||||
<check_box label="Enviar MI al Email ([EMAIL])" name="send_im_to_email" left="138"/>
|
||||
<check_box label="Incluir MI en la consola de Chat" name="include_im_in_chat_console" left="138"/>
|
||||
<check_box label="Mostrar horario en los IMI" name="show_timestamps_check" left="138"/>
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<panel label="Experiencias" name="Experiences">
|
||||
<panel.string name="trusted_estate_text">
|
||||
Cualquier experiencia puede ser clave.
|
||||
|
||||
Las experiencias clave tienen permiso
|
||||
de ejecución en este estado.
|
||||
|
||||
Además, si el estado no admite el
|
||||
acceso público, los residentes que
|
||||
participen en una experiencia clave
|
||||
pueden entrar en el estado y
|
||||
permanecer en él mientras se
|
||||
encuentren en dicha experiencia.
|
||||
</panel.string>
|
||||
<panel.string name="allowed_estate_text">
|
||||
Solo se permiten las experiencias
|
||||
activas en el terreno.
|
||||
|
||||
Las experiencias permitidas
|
||||
tienen permiso de ejecución
|
||||
en este estado.
|
||||
</panel.string>
|
||||
<panel.string name="blocked_estate_text">
|
||||
Solo pueden bloquearse las
|
||||
experiencias activas en el Grid.
|
||||
|
||||
Las experiencias bloqueadas no
|
||||
pueden ejecutarse en
|
||||
este estado.
|
||||
</panel.string>
|
||||
<panel.string name="estate_caption">
|
||||
Los cambios de configuración en esta pestaña afectarán a todas las regiones del estado.
|
||||
</panel.string>
|
||||
<panel.string name="allowed_parcel_text">
|
||||
Solo se permiten las experiencias
|
||||
activas en el terreno.
|
||||
|
||||
Las experiencias permitidas tienen
|
||||
permiso de ejecución en esta parcela
|
||||
si no las ha bloqueado el estado.
|
||||
</panel.string>
|
||||
<panel.string name="blocked_parcel_text">
|
||||
Puede bloquearse cualquier
|
||||
experiencia de los residentes.
|
||||
|
||||
Puede que las experiencias
|
||||
bloqueadas no se ejecuten
|
||||
en esta parcela.
|
||||
</panel.string>
|
||||
</panel>
|
||||
@@ -0,0 +1,35 @@
|
||||
<panel name="script_experience" title="Experiencia">
|
||||
<!-- <floater.string name="EXPERIENCE">EXPERIENCE!!!!</floater.string>
|
||||
|
||||
<floater.string name="Script:">Script:</floater.string>
|
||||
<floater.string name="Associated with:">Associated with:</floater.string>
|
||||
<floater.string name="You can contribute:">You can contribute:</floater.string>
|
||||
<floater.string name="Associate with:">Associate with:</floater.string>
|
||||
<floater.string name="Yes">Yes</floater.string>
|
||||
<floater.string name="No">No</floater.string>
|
||||
<floater.string name="(none)"></floater.string>
|
||||
<floater.string name="Choose Experience...">Choose Experience...</floater.string>
|
||||
<floater.string name="You are not a contributor to any experiences.">You are not a contributor to any experiences.</floater.string>
|
||||
-->
|
||||
|
||||
<button name="Expand Experience" label="Experiencia"/>
|
||||
<check_box label="Usar Experiencia"name="enable_xp"/>
|
||||
<layout_stack name="xp_details">
|
||||
<layout_panel>
|
||||
<text >Script:</text>
|
||||
<text>Asociado con:</text>
|
||||
<text>Puedes contribuir:</text>
|
||||
<text>Asociado con:</text>
|
||||
</layout_panel>
|
||||
|
||||
<layout_panel>
|
||||
<text>EasySit Animator 1.2.4</text>
|
||||
<text>Kyle's Superhero RPG</text>
|
||||
<text>Si</text>
|
||||
<combo_boxlabel="Seleccionar Experiencia..." name="Experiences..."/>
|
||||
</layout_panel>
|
||||
</layout_stack>
|
||||
<text name="No Experiences">
|
||||
No contribuyes en ninguna experiencia.
|
||||
</text>
|
||||
</panel>
|
||||
@@ -5,17 +5,13 @@
|
||||
</string>
|
||||
<string name="IMs">[COUNT] MIs</string>
|
||||
<string name="IM">1 MI</string>
|
||||
<panel bottom="0" filename="panel_bg_toolbar.xml" height="28" left="0" width="1024"/>
|
||||
<layout_stack name="toolbar_stack">
|
||||
<layout_panel name="panel1"/>
|
||||
<layout_panel name="panel2" >
|
||||
<button label="" name="chat_btn" tool_tip="Mostrar Barra de Chat. (Intro)"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="panel3"/>
|
||||
<layout_panel name="panel4">
|
||||
<flyout_button label="Comunicación" name="communicate_btn" tool_tip="Comunícate con tus amigos o grupos.(Ctrl-T)" />
|
||||
<flyout_button label="Comunicación" name="communicate_btn" tool_tip="Comunícate con tus amigos y grupos.(Ctrl-T)" />
|
||||
</layout_panel>
|
||||
<layout_panel name="panel5"/>
|
||||
<layout_panel name="panelim">
|
||||
<button label="Comunicación" name="communicate_im_btn" tool_tip="Comunícate con tus amigos o grupos.(Ctrl-T)"/>
|
||||
</layout_panel>
|
||||
@@ -38,7 +34,7 @@
|
||||
<button label="Ignorados" name="mute_list_btn"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="panelassetblacklist">
|
||||
<button label="Lista Negra Asset" name="assetblack_list_btn"/>
|
||||
<button label="Lista Negra" name="assetblack_list_btn"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="panelvoiceeffect">
|
||||
<button label="Efectos de Voz" name="voice_effects_btn"/>
|
||||
@@ -65,13 +61,13 @@
|
||||
<button label="Vista Subjetiva" name="mouselook_btn"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="panel7">
|
||||
<button label="Volar" label_selected="Stop Flying" name="fly_btn" tool_tip="Despegar(F o Inicio). Usa E/C o AvPág/RePág para ascender o descender"/>
|
||||
<button label="Volar" label_selected="No volar" name="fly_btn" tool_tip="Despegar(F o Inicio). Usa E/C o AvPág/RePág para ascender o descender"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="panelsit">
|
||||
<button label="Sentarse" label_selected="Pararse" name="sit_btn"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="panelrun">
|
||||
<button label="Correr" label_selected="Dejar de Correr" name="run_btn" tool_tip="Activar modo Correr (Ctrl-R)"/>
|
||||
<button label="Correr" label_selected="No Correr" name="run_btn" tool_tip="Activar modo Correr (Ctrl-R)"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="panelvelocity">
|
||||
<button label="Velocidad" name="run_btn"/>
|
||||
@@ -91,6 +87,9 @@
|
||||
<layout_panel name="panelappearance">
|
||||
<button label="Apariencia" name="appearance_btn"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="panelexperiences">
|
||||
<button label="Experiencias" name="experiences_btn"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="panel9">
|
||||
<button label="Buscar" name="directory_btn" tool_tip="Buscar lugares, eventos, personas, y más.(Ctrl-F)"/>
|
||||
</layout_panel>
|
||||
@@ -178,6 +177,9 @@
|
||||
<layout_panel name="panelteleporthistory">
|
||||
<button label="Historial de TP" name="teleport_history_btn"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="paneldestinations" >
|
||||
<button label="Destinos" name="destinations_btn"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="panel11">
|
||||
<button label="Mapa" name="map_btn" tool_tip="Mapa del Mundo. (Ctrl-M)"/>
|
||||
</layout_panel>
|
||||
@@ -217,7 +219,7 @@
|
||||
<button label="Temporizadores" name="fast_timers_btn"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="panelframeconsole">
|
||||
<button label="Consola Cuadros" name="frame_console_btn"/>
|
||||
<button label="Consola Frames" name="frame_console_btn"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="panelhttpconsole">
|
||||
<button label="Consola HTTP" name="http_console_btn"/>
|
||||
@@ -231,9 +233,6 @@
|
||||
<layout_panel name="paneltexturesizeconsole">
|
||||
<button label="Consola Tam. Texturas" name="texture_size_console_btn"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="panel13">
|
||||
<button label="Inventario" name="inventory_btn" tool_tip="Tus items. (Ctrl-I)"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="panelavatar" >
|
||||
<button label="Avatares Predeterminados" iname="avatar_btn"/>
|
||||
</layout_panel>
|
||||
@@ -246,6 +245,9 @@
|
||||
<layout_panel name="panelfavs">
|
||||
<button label="Favoritos" name="favs_btn"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="panel13">
|
||||
<button label="Inventario" name="inventory_btn" tool_tip="Tus items. (Ctrl-I)"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="panelreceiveditems">
|
||||
<button label="Ítems Recibidos" name="received_items_btn"/>
|
||||
</layout_panel>
|
||||
@@ -279,7 +281,7 @@
|
||||
<button label="Prueba Fuentes" name="font_test_btn"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="panelreportabuse">
|
||||
<button label="Denunciar Abuso" name="abuse_btn"/>
|
||||
<button label="Denunciar Infracción" name="abuse_btn"/>
|
||||
</layout_panel>
|
||||
<!-- Singu TODO: Re-implement f1 help.
|
||||
<layout_panel name="panelhelp">
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
name="Membership">
|
||||
<action
|
||||
description="Invitar Personas al Grupo"
|
||||
longdescription="Invitar personas al grupo usando el botón 'Invitar a un nuevo miembro' en Miembros y Roles > subpestaña Miembros."
|
||||
longdescription="Invitar personas al grupo usando el botón 'Invitar' en Miembros y Roles > subpestaña Miembros."
|
||||
name="member invite"/>
|
||||
<action
|
||||
description="Expulsar a miembros del grupo"
|
||||
@@ -34,19 +34,19 @@
|
||||
name="role properties"/>
|
||||
<action
|
||||
description="Designar miembros para el rol de Asignador"
|
||||
longdescription="Designar miembros para un rol en la sección Roles asignados de la pestaña Miembros y Roles > subpestaña Miembros. Un miembro con este poder sólo puede asignar a otros el rol que él posee."
|
||||
longdescription="Designar miembros para un rol en la lista de Roles asignados de la pestaña Miembros y Roles > subpestaña Miembros. Un miembro con este poder sólo puede asignar a otros el rol que él posee."
|
||||
name="role assign member limited"/>
|
||||
<action
|
||||
description="Designar miembros para cualquier Rol"
|
||||
longdescription="Designar miembros para cualquier rol en la sección Roles asignados de la pestaña Miembros y Roles > subpestaña Miembros. *AVISO* Todos los miembros con esta capacidad podrán asignarse a sí mismos (y a otros miembros) roles con mayores poderes de los que actualmente tienen. Potencialmente, podrían elevarse hasta poderes cercanos a los del propietario. Asegúrate de lo que estás haciendo antes de otorgar esta capacidad."
|
||||
longdescription="Designar miembros para cualquier rol en la lista de Roles asignados de la pestaña Miembros y Roles > subpestaña Miembros. *AVISO* Todos los miembros con esta capacidad podrán asignarse a sí mismos (y a otros miembros) roles con mayores poderes de los que actualmente tienen. Potencialmente, podrían elevarse hasta poderes cercanos a los del propietario. Asegúrate de lo que estás haciendo antes de otorgar esta capacidad."
|
||||
name="role assign member"/>
|
||||
<action
|
||||
description="Quitar miembros de los roles"
|
||||
longdescription="Quitar miembros de roles en la sección Capacidades asignadas de Miembros y Roles > subpestaña Roles. No se pueden quitar a los Propietarios."
|
||||
longdescription="Quitar miembros de roles en la lista de Roles asignados de Miembros y Roles > subpestaña Roles. No se pueden quitar a los Propietarios."
|
||||
name="role remove member"/>
|
||||
<action
|
||||
description="Añadir o quitar capacidades a los roles"
|
||||
longdescription="Añadir o quitar capacidades a los roles en la sección Capacidades asignadas de Miembros y Roles > subpestaña Roles. *AVISO* Todos los miembros con esta capacidad podrán asignarse a sí mismos -y a otros miembros- roles con mayores poderes de los que actualmente tienen. Potencialmente, podrían elevarse hasta poderes cercanos a los del propietario. Asegúrate de lo que estás haciendo antes de otorgar esta capacidad."
|
||||
longdescription="Añadir o quitar capacidades a los roles en la lista de Roles asignados de Miembros y Roles > subpestaña Roles. *AVISO* Todos los miembros con esta capacidad podrán asignarse a sí mismos -y a otros miembros- roles con mayores poderes de los que actualmente tienen. Potencialmente, podrían elevarse hasta poderes cercanos a los del propietario. Asegúrate de lo que estás haciendo antes de otorgar esta capacidad."
|
||||
name="role change actions"/>
|
||||
</action_set>
|
||||
<action_set
|
||||
@@ -54,7 +54,7 @@
|
||||
name="Group Identity">
|
||||
<action
|
||||
description="Cambiar la carta, emblema y 'Mostrar en la búsqueda'"
|
||||
longdescription="Cambiar la carta, emblema y 'Mostrar en la búsqueda', y qué miembros serán visibles en la información del grupo de la pestaña General."
|
||||
longdescription="Cambiar la carta, emblema y 'Mostrar en la búsqueda', Esto se hace en la sección General."
|
||||
name="group change identity"/>
|
||||
</action_set>
|
||||
<action_set
|
||||
@@ -81,11 +81,11 @@
|
||||
description="Estas capacidades incluyen poder cambiar el nombre de la parcela y su configuración pública, también si se muestra en la Búsqueda y las opciones del punto de llegada y el de teleporte."
|
||||
name="Parcel Identity">
|
||||
<action
|
||||
description="Activar/Desactivar 'Mostrar en Búsqueda' y el definir la Categoría" longdescription="Activar/Desactivar el 'Mostrar en Búsqueda' y en que Categoría se mostrará en Acerca del terreno > pestaña Opciones."
|
||||
description="Activar/Desactivar 'Mostrar en Búsqueda' y en definir la Categoría" longdescription="Activar/Desactivar el 'Mostrar en Búsqueda' y en que Categoría se mostrará en Acerca del terreno > pestaña Opciones."
|
||||
name="land find places"/>
|
||||
<action
|
||||
description="Cambiar el nombre de la parcela, la descripción, y la configuración de 'Mostrar en Búsqueda'"
|
||||
longdescription="Cambiar el nombre y descripción de la parcela, y la configuración de 'Mostrar en Búsqueda'. Se hace en Acerca del terreno > pestaña Opciones."
|
||||
description="Cambiar el nombre de la parcela, la descripción, y la configuración de 'Calificación de Contenido'"
|
||||
longdescription="Cambiar el nombre y descripción de la parcela, y la configuración de 'Calificación de Contenido'. Se hace en Acerca del terreno > pestaña Opciones."
|
||||
name="land change identity"/>
|
||||
<action
|
||||
description="Definir los puntos de llegada y teleporte"
|
||||
@@ -104,7 +104,7 @@
|
||||
name="land edit"/>
|
||||
<action
|
||||
description="Activar/desactivar varios ítems de Acerca del terreno > Opciones"
|
||||
longdescription="Activar/desactivar en un terreno del grupo los ítems de Acerca del terreno > pestaña Opciones: 'Seguro (sin daño)', 'Volar', y permitir a otros residentes: 'Crear objetos', 'Editar el terreno', 'Crear hitos', y 'Ejecutar scripts'."
|
||||
longdescription="Activar/desactivar 'Seguro (sin daño)', 'Volar', y permitir a otros residentes: 'Editar el terreno', 'Construir' 'Crear hitos', y 'Ejecutar scripts' en terrenos propiedad del grupo en Acerca del terreno > pestaña Opciones."
|
||||
name="land options"/>
|
||||
</action_set>
|
||||
<action_set
|
||||
@@ -152,7 +152,7 @@
|
||||
name="land manage passes"/>
|
||||
<action
|
||||
description="Expulsar y congelar residentes en las parcelas"
|
||||
longdescription="Los miembros con el rol con esta capacidad pueden actuar frente a un residente indeseado en una parcela del grupo pulsando con el botón derecho sobre él, Más > y seleccionando 'Expulsar...' o 'Congelar...'."
|
||||
longdescription="Los miembros en el rol con esta capacidad pueden actuar frente a un residente indeseado en una parcela del grupo pulsando con el botón derecho sobre él, Más > y seleccionando 'Expulsar...' o 'Congelar...'."
|
||||
name="land admin"/>
|
||||
</action_set>
|
||||
<action_set
|
||||
@@ -172,23 +172,23 @@
|
||||
name="land return non group"/>
|
||||
<action
|
||||
description="Modificar el paisaje usando plantas Linden"
|
||||
longdescription="La capacidad de modificar el paisaje permite poner y mover árboles Linden, plantas y arbustos. Estos ítems están en la 's Biblioteca de tu Inventario > carpeta Objetos, o pueden crearse con el botón Construir."
|
||||
longdescription="La capacidad de modificar el paisaje permite poner y mover árboles Linden, plantas y arbustos. Estos ítems están en la 's Biblioteca de tu Inventario > carpeta Objetos, o pueden crearse desde el menú Construir."
|
||||
name="land gardening"/>
|
||||
</action_set>
|
||||
<action_set
|
||||
description="Estas capacidades incluyen poderes para transferir, modificar y vender objetos pertenecientes al grupo. Estos cambios se hacen en la pestaña General de la herramienta de edición. Para ver sus configuraciones, pulsa en un objeto con el botón derecho y elige Editar."
|
||||
description="Estas capacidades incluyen poderes para transferir, modificar y vender objetos pertenecientes al grupo. Estos cambios se hacen en la pestaña General de la herramienta de construcción . Para ver sus configuraciones, pulsa en un objeto con el botón derecho y elige Editar."
|
||||
name="Object Management">
|
||||
<action
|
||||
description="Transferir objetos al grupo"
|
||||
longdescription="Transferir objetos al grupo en Editar > pestaña General."
|
||||
longdescription="Transferir objetos al grupo en Herramientas de construcción > pestaña General."
|
||||
name="object deed"/>
|
||||
<action
|
||||
description="Manipular (mover, copiar, y modificar) objetos del grupo"
|
||||
longdescription="Manipular (mover, copiar, y modificar) objetos pertenecientes al grupo en Editar > pestaña General."
|
||||
longdescription="Manipular (mover, copiar, y modificar) objetos pertenecientes al grupo en Herramientas de contrucción > pestaña General."
|
||||
name="object manipulate"/>
|
||||
<action
|
||||
description="Poner a la venta objetos propiedad del grupo"
|
||||
longdescription="Poner a la venta objetos pertenecientes al grupo en Editar > pestaña General."
|
||||
longdescription="Poner a la venta objetos pertenecientes al grupo en Herramientas de construcción > pestaña General."
|
||||
name="object set sale"/>
|
||||
</action_set>
|
||||
<action_set
|
||||
@@ -226,8 +226,7 @@
|
||||
<action_set
|
||||
description="Estas capacidades incluyen poderes para permitir o no el aceso a las sesiones de chat del grupo y al chat de voz del mismo."
|
||||
name="Chat">
|
||||
<action
|
||||
description="Unirse al Chat de Grupo"
|
||||
<action description="Unirse al Chat de Grupo"
|
||||
longdescription="Los miembros del rol con esta capacidad pueden abrir sesiones de chat del grupo, tanto de texto como de voz."
|
||||
name="join group chat"/>
|
||||
<action description="Unirse al Chat de Voz"
|
||||
@@ -237,4 +236,13 @@
|
||||
longdescription="Los miembros del rol con esta capacidad pueden controlar el acceso y las participaciones en los chats de texto y de voz del grupo."
|
||||
name="moderate group chat"/>
|
||||
</action_set>
|
||||
<action_set description="Esta capacidad incluye el poder para modificar experiencias propiedad de este grupo."
|
||||
name="experience_tools_experience">
|
||||
<action description="Administrar Experiencias"
|
||||
longdescription="Los miembros en el rol con esta capacidad pueden editar los metadatos de una experiencia."
|
||||
name="experience admin"/>
|
||||
<action description="Contribuir en Experiencias"
|
||||
longdescription="Los miembros en el rol con esta capacidad pueden contribuir con scripts para una experiencia."
|
||||
name="experience contributor"/>
|
||||
</action_set>
|
||||
</role_actions>
|
||||
|
||||
@@ -19,18 +19,18 @@ Asegurate que has ingresado el URI de inicio de sesión correcto. Un ejemplo de
|
||||
<string name="GridInfoParseError">Error de análisis XML: [XML_ERROR]</string>
|
||||
|
||||
<!-- Default Args - these arguments will be replaced in all strings -->
|
||||
<string name="SECOND_LIFE">Second Life</string>
|
||||
<string name="SECOND_LIFE_GRID">Grid Second Life</string>
|
||||
<string name="SUPPORT_SITE">Portal de Soporte de Second Life</string>
|
||||
|
||||
<string name="CURRENCY">L$</string>
|
||||
<string name="GRID_OWNER">Linden Lab</string>
|
||||
|
||||
<!-- starting up -->
|
||||
<string name="StartupDetectingHardware">Detectando hardware...</string>
|
||||
<string name="StartupLoading">Cargando [APP_NAME]...</string>
|
||||
<string name="StartupClearingCache">Limpiando caché...</string>
|
||||
<string name="StartupInitializingTextureCache">Inicializando Caché de Texturas...</string>
|
||||
<string name="StartupInitializingTextureCache0">Borrando el caché de texturas...</string>
|
||||
<string name="StartupInitializingTextureCache1">Reagrupando el volcado de pixel...</string>
|
||||
<string name="StartupInitializingTextureCache2">Preparando el fundido de texturas...</string>
|
||||
<string name="StartupInitializingTextureCache3">Booping snoot, texturally...</string>
|
||||
<string name="StartupInitializingTextureCache4">Waking lumbering giant...</string>
|
||||
<string name="StartupInitializingVFS">Inicializando VFS...</string>
|
||||
<string name="StartupRequireDriverUpdate">¡Ha fallado la inicialización gráfica. Por favor, actualiza los controladores gráficos!</string>
|
||||
|
||||
@@ -4658,12 +4658,12 @@ Intenta entrecomillando el camino al editor.
|
||||
<string name="ExperienceNameUntitled">(experiencia sin título)</string>
|
||||
<string name="Land-Scope">Activa en el terreno</string>
|
||||
<string name="Grid-Scope">Activa en el Grid</string>
|
||||
<string name="Allowed_Experiences_Tab">PERMITIDO</string>
|
||||
<string name="Blocked_Experiences_Tab">BLOQUEADO</string>
|
||||
<string name="Contrib_Experiences_Tab">COLABORADOR</string>
|
||||
<string name="Admin_Experiences_Tab">ADMIN.</string>
|
||||
<string name="Recent_Experiences_Tab">RECIENTE</string>
|
||||
<string name="Owned_Experiences_Tab">PROPIEDAD</string>
|
||||
<string name="Allowed_Experiences_Tab">Permitido</string>
|
||||
<string name="Blocked_Experiences_Tab">Bloqueado</string>
|
||||
<string name="Contrib_Experiences_Tab">Colaborador</string>
|
||||
<string name="Admin_Experiences_Tab">Administrador</string>
|
||||
<string name="Recent_Experiences_Tab">Reciente</string>
|
||||
<string name="Owned_Experiences_Tab">Propietario</string>
|
||||
<string name="ExperiencesCounter">([EXPERIENCES], máx. [MAXEXPERIENCES])</string>
|
||||
<string name="ExperiencePermission1">hacerte con tus controles</string>
|
||||
<string name="ExperiencePermission3">activar animaciones en tu avatar</string>
|
||||
|
||||
Reference in New Issue
Block a user