Compare commits

..

41 Commits

Author SHA1 Message Date
Shyotl
be3cbc642b Update current region debug string upon cap seed request. Carry over seed cap if dead region is replaced with new. 2020-04-09 02:12:36 -05:00
Shyotl
24331d3c90 Prefer LLPointer over potential for dangling LLSpatialGroup pointers. 2020-04-09 01:56:32 -05:00
Shyotl
8a16e6c99f Merge branch 'master' of https://github.com/singularity-viewer/SingularityViewer.git 2020-04-08 18:18:19 -05:00
Shyotl
f36e8fbeca Better crashdump context. 2020-04-08 18:11:09 -05:00
Liru Færs
718ef09adf Fix removing/exporting picks when unable to add more
Wooops, wrote that wrong, must've been tired or something
2020-04-08 09:21:21 -04:00
Liru Færs
6443849ea9 Do not lookup strings in the toolbar per frame, ack! 2020-04-08 08:33:41 -04:00
Liru Færs
cbb7e473ba Merge branch 'master' of git://github.com/Shyotl/SingularityViewer 2020-04-08 06:59:48 -04:00
Liru Færs
118957362f Fix mismatched tag 2020-04-08 05:11:11 -04:00
Shyotl
ed7f73769f Potentially fix crash in LLSurface 2020-04-07 23:30:12 -05:00
Liru Færs
ae15dcb318 Merge 41224c57317b6c1b44528aa1dc1f13732cdffe6d from viewer-lion... sorta
Fixes broken default perms message sometimes popping up for certain avs
2020-04-07 16:55:58 -04:00
Liru Færs
c4af22481c Update mesh export code, cause why not. 2020-04-07 15:30:13 -04:00
Liru Færs
ae17f76bb4 Remove now unused LLIMInfo 2020-04-07 10:49:48 -04:00
Liru Færs
7e62d17fda Don't try to use region if it's null for permissions defaults 2020-04-07 05:56:06 -04:00
Liru Færs
f9185e8bc8 Fix mutelist popping up, I think
LLMuteList::add should return false if nothing new was added
2020-04-07 05:55:24 -04:00
Liru Færs
1361f9b57d Simplify selection of mute 2020-04-07 04:29:45 -04:00
Liru Færs
b86eae026b Sync to fix using gMessageSystem when it may not have the right message 2020-04-07 04:29:20 -04:00
Liru Færs
79d938a4f4 Sync LLMuteList code with upstream 2020-04-07 02:51:08 -04:00
Liru Færs
23068a70a2 Select Mute when muting object via Object profile 2020-04-06 07:53:42 -04:00
Shyotl
0aa5e0bb88 Close 'default permissions' window on client disconnect. Nonfunctional after that point anyhow. Also applying setting crashes due to null region after dc. 2020-04-05 14:56:35 -05:00
Router Gray
5040275969 [CMake] Releases shouldn't speak Greek. 2020-04-04 06:47:39 -05:00
Liru Færs
1daccf40ee Move the FMOD Powered By text, for Torric and others 2020-04-04 07:28:19 -04:00
Shyotl
4fd302286b Merge branch 'master' of https://github.com/singularity-viewer/SingularityViewer.git 2020-04-03 06:02:48 -05:00
Shyotl
18f9f19e61 Textures mid-decode potentially processing of other textures until complete. Disabled UDP texture fetch fallback when connected to official grid. 2020-04-03 06:01:58 -05:00
Liru Færs
1de6d4461a Add missing EmergencyTeleportSeconds preference to System->Security
Thanks for the heads up about this missing preferences, and for the
Spanish translation, Damian!
2020-04-03 02:53:41 -04:00
Shyotl
4198f47ab6 Fix header breakage in debug/relwithdebug 2020-04-03 00:33:19 -05:00
Shyotl
d9049ba342 Handle AISAPI throttling and status 410 a bit better. 2020-04-02 21:47:07 -05:00
Shyotl
f75ac3e4c2 Merge branch 'master' of https://github.com/singularity-viewer/SingularityViewer.git 2020-04-02 20:09:53 -05:00
Liru Færs
06698deaca A couple more sim->region changes 2020-04-02 21:08:23 -04:00
Shyotl
445eb29bd3 Bring aisapi handling closer to LL (code 499 retry, match timeout values, etc) 2020-04-02 20:07:55 -05:00
Shyotl
cc034f6841 Fix inventory scrolling issue when navigating via keyboard. 2020-04-02 20:03:08 -05:00
Liru Færs
3c368651f1 Update crashpad, thanks Rye! 2020-04-02 20:39:01 -04:00
Damian Zhaoying
321730e384 More translations fixes in Area search and menu list owners. 2020-04-02 03:02:23 -03:00
Damian Zhaoying
c2fd88670f Fix some remaining spanish translations. 2020-04-02 02:36:20 -03:00
Liru Færs
7b03103a1f April Fools!
Ha, goteem
2020-04-01 20:52:44 -04:00
Liru Færs
ac3e19c91a Merge branch 'master' of git://github.com/Shyotl/SingularityViewer 2020-04-01 20:47:23 -04:00
Liru Færs
4c7d2224e3 Fix reverted xml change, fix formatting 2020-04-01 20:43:00 -04:00
Shyotl
3ab800d99e Merge branch 'master' of https://github.com/singularity-viewer/SingularityViewer.git 2020-04-01 19:26:41 -05:00
Shyotl
332cef0f84 Disable debug logging unless RelWithDeb 2020-04-01 19:26:23 -05:00
Damian Zhaoying
9de6d7627b A lot of updates and fixes for spanish language translations. 2020-04-01 20:44:41 -03:00
Liru Færs
98b42e88c1 Fix SV-2282: Incorrect terminology for TP Sound preference UI 2020-04-01 06:56:51 -04:00
Liru Færs
e642e9561a The sim is actually the region 2020-04-01 04:42:34 -04:00
89 changed files with 1494 additions and 954 deletions

View File

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

View File

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

View File

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

View File

@@ -960,4 +960,5 @@ P(webProfileResponders);
P(wholeModelFeeResponder);
P(wholeModelUploadResponder);
P2(XMLRPCResponder, connect_40s);
P(getUpdateInfoResponder);
P(getUpdateInfoResponder);
P2(AISAPIResponder, connect_60s);

View File

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

View File

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

View File

@@ -1 +1 @@
1.8.7
1.8.9

View File

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

View File

@@ -118,6 +118,7 @@ private:
bool mDisplayScriptJumps;
bool mReplaceLinks;
F32 mNumScriptDiff;
U32 mEmergencySeconds;
std::string mLandmark;
std::string mLandmarkBackup;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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();
}

View File

@@ -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]);
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -172,6 +172,7 @@ LLViewerRegion* LLWorld::addRegion(const U64 &region_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 &region_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 &region_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"]);
}
};

View File

@@ -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());
}

View File

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

View File

@@ -54,4 +54,4 @@
<on_click function="List.CopySLURL"/>
<on_visible function="List.EnableSingleSelected"/>
</menu_item_call>
</menu>
</context_menu>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater name="experiencepicker" title="Seleccionar Experiencia">
</floater>

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

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<floater name="floater_experiences" title="Experiencias">
</floater>

View File

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

View File

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

View File

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

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

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

View File

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

View File

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

View File

@@ -0,0 +1,3 @@
<menu name="Avatar Name Editor Menu" filename="menu_avs_list.xml">
<menu name="Text" filename="menu_texteditor.xml"/>
</menu>

View File

@@ -0,0 +1,3 @@
<menu name="Group Name Editor Menu" filename="menu_groups_list.xml">
<menu name="Text" filename="menu_texteditor.xml"/>
</menu>

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

View File

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

View File

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

View File

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

View File

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

View File

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

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

View File

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

View File

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

View File

@@ -89,19 +89,19 @@
Por favor, comprueba que tienes instalado el último Visor.
Detalles del error: la notificación de nombre &apos;[_NAME]&apos; 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 &apos;[_NAME]&apos; 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:
&apos;[ERROR_CODE]&apos;
<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:
&apos;[ERROR_CODE]&apos;
<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:
&apos;[ERROR_CODE]&apos;
<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 &apos;[group_name]&apos;:
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 &apos;[group_name]&apos;:
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 (&apos;[PARCEL_NAME]&apos;) 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 &gt; Preferencias &gt; 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">
&apos;[OBJECTNAME]&apos;, un objeto de propiedad de &apos;[NAME]&apos;, 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">
&apos;[OBJECTNAME]&apos;, un objeto propiedad de &apos;[NAME]&apos;, querría:
Atención: El objeto &apos;[OBJECTNAME]&apos;, 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">
&apos;[TITLE]&apos; de [NAME]
[MESSAGE]
&apos;[TITLE]&apos; 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á
&apos;[TITLE]&apos; 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>

View File

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

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

View File

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

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

View File

@@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel name="panel_experiences_search" label="Buscar">
<string name="not_found">
&apos;[TEXT]&apos; 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>

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -5,7 +5,7 @@
name="Membership">
<action
description="Invitar Personas al Grupo"
longdescription="Invitar personas al grupo usando el botón &apos;Invitar a un nuevo miembro&apos; en Miembros y Roles &gt; subpestaña Miembros."
longdescription="Invitar personas al grupo usando el botón &apos;Invitar&apos; en Miembros y Roles &gt; 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 &gt; 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 &gt; 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 &gt; 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 &gt; 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 &gt; 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 &gt; 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 &gt; 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 &gt; 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 &apos;Mostrar en la búsqueda&apos;"
longdescription="Cambiar la carta, emblema y &apos;Mostrar en la búsqueda&apos;, y qué miembros serán visibles en la información del grupo de la pestaña General."
longdescription="Cambiar la carta, emblema y &apos;Mostrar en la búsqueda&apos;, 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 &apos;Mostrar en Búsqueda&apos; y el definir la Categoría" longdescription="Activar/Desactivar el &apos;Mostrar en Búsqueda&apos; y en que Categoría se mostrará en Acerca del terreno &gt; pestaña Opciones."
description="Activar/Desactivar &apos;Mostrar en Búsqueda&apos; y en definir la Categoría" longdescription="Activar/Desactivar el &apos;Mostrar en Búsqueda&apos; y en que Categoría se mostrará en Acerca del terreno &gt; pestaña Opciones."
name="land find places"/>
<action
description="Cambiar el nombre de la parcela, la descripción, y la configuración de &apos;Mostrar en Búsqueda&apos;"
longdescription="Cambiar el nombre y descripción de la parcela, y la configuración de &apos;Mostrar en Búsqueda&apos;. Se hace en Acerca del terreno &gt; pestaña Opciones."
description="Cambiar el nombre de la parcela, la descripción, y la configuración de &apos;Calificación de Contenido&apos;"
longdescription="Cambiar el nombre y descripción de la parcela, y la configuración de &apos;Calificación de Contenido&apos;. Se hace en Acerca del terreno &gt; 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 &gt; Opciones"
longdescription="Activar/desactivar en un terreno del grupo los ítems de Acerca del terreno &gt; pestaña Opciones: &apos;Seguro (sin daño)&apos;, &apos;Volar&apos;, y permitir a otros residentes: &apos;Crear objetos&apos;, &apos;Editar el terreno&apos;, &apos;Crear hitos&apos;, y &apos;Ejecutar scripts&apos;."
longdescription="Activar/desactivar &apos;Seguro (sin daño)&apos;, &apos;Volar&apos;, y permitir a otros residentes: &apos;Editar el terreno&apos;, &apos;Construir&apos; &apos;Crear hitos&apos;, y &apos;Ejecutar scripts&apos; en terrenos propiedad del grupo en Acerca del terreno &gt; 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 &gt; y seleccionando &apos;Expulsar...&apos; o &apos;Congelar...&apos;."
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 &gt; y seleccionando &apos;Expulsar...&apos; o &apos;Congelar...&apos;."
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 &apos;s Biblioteca de tu Inventario &gt; 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 &apos;s Biblioteca de tu Inventario &gt; 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 &gt; pestaña General."
longdescription="Transferir objetos al grupo en Herramientas de construcción &gt; 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 &gt; pestaña General."
longdescription="Manipular (mover, copiar, y modificar) objetos pertenecientes al grupo en Herramientas de contrucción &gt; 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 &gt; pestaña General."
longdescription="Poner a la venta objetos pertenecientes al grupo en Herramientas de construcción &gt; 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>

View File

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