Brought in Script Limits from v-d! (Accessible from About Land)

This commit is contained in:
Lirusaito
2013-02-11 01:12:21 -05:00
parent 085d6cc806
commit cff7a2a464
13 changed files with 2006 additions and 9 deletions

View File

@@ -844,6 +844,10 @@ P(environmentRequestResponder);
P(estateChangeInfoResponder);
P(eventPollResponder);
P(fetchInventoryResponder);
P(fetchScriptLimitsAttachmentInfoResponder);
P(fetchScriptLimitsRegionDetailsResponder);
P(fetchScriptLimitsRegionInfoResponder);
P(fetchScriptLimitsRegionSummaryResponder);
P(fnPtrResponder);
P2(groupMemberDataResponder, transfer_300s);
P2(groupProposalBallotResponder, transfer_300s);

View File

@@ -244,6 +244,7 @@ set(viewer_SOURCE_FILES
llfloaterregioninfo.cpp
llfloaterreporter.cpp
llfloaterscriptdebug.cpp
llfloaterscriptlimits.cpp
llfloatersearchreplace.cpp
llfloatersellland.cpp
llfloatersettingsdebug.cpp
@@ -745,6 +746,7 @@ set(viewer_HEADER_FILES
llfloaterregioninfo.h
llfloaterreporter.h
llfloaterscriptdebug.h
llfloaterscriptlimits.h
llfloatersearchreplace.h
llfloatersellland.h
llfloatersettingsdebug.h

View File

@@ -7072,6 +7072,22 @@ This should be as low as possible, but too low may break functionality</string>
<integer>0</integer>
</array>
</map>
<key>FloaterScriptLimitsRect</key>
<map>
<key>Comment</key>
<string>Rectangle for Script Limits window</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Rect</string>
<key>Value</key>
<array>
<integer>0</integer>
<integer>500</integer>
<integer>480</integer>
<integer>0</integer>
</array>
</map>
<key>FloaterSnapshotRect</key>
<map>
<key>Comment</key>

View File

@@ -417,6 +417,27 @@ BOOL LLPanelLandGeneral::postBuild()
mBtnBuyLand = getChild<LLButton>("Buy Land...");
mBtnBuyLand->setClickedCallback(onClickBuyLand, (void*)&BUY_PERSONAL_LAND);
// note: on region change this will not be re checked, should not matter on Agni as
// 99% of the time all regions will return the same caps. In case of an erroneous setting
// to enabled the floater will just throw an error when trying to get it's cap
std::string url = gAgent.getRegion()->getCapability("LandResources");
if (!url.empty())
{
mBtnScriptLimits = getChild<LLButton>("Scripts...");
if(mBtnScriptLimits)
{
mBtnScriptLimits->setClickedCallback(onClickScriptLimits, this);
}
}
else
{
mBtnScriptLimits = getChild<LLButton>("Scripts...");
if(mBtnScriptLimits)
{
mBtnScriptLimits->setVisible(false);
}
}
mBtnBuyGroupLand = getChild<LLButton>("Buy For Group...");
mBtnBuyGroupLand->setClickedCallback(onClickBuyLand, (void*)&BUY_GROUP_LAND);
@@ -505,6 +526,7 @@ void LLPanelLandGeneral::refresh()
mTextDwell->setText(LLStringUtil::null);
mBtnBuyLand->setEnabled(FALSE);
mBtnScriptLimits->setEnabled(FALSE);
mBtnBuyGroupLand->setEnabled(FALSE);
mBtnReleaseLand->setEnabled(FALSE);
mBtnReclaimLand->setEnabled(FALSE);
@@ -720,6 +742,7 @@ void LLPanelLandGeneral::refresh()
mBtnBuyLand->setEnabled(
LLViewerParcelMgr::getInstance()->canAgentBuyParcel(parcel, false));
mBtnScriptLimits->setEnabled(true);
mBtnBuyGroupLand->setEnabled(
LLViewerParcelMgr::getInstance()->canAgentBuyParcel(parcel, true));
@@ -884,11 +907,15 @@ void LLPanelLandGeneral::onClickBuyLand(void* data)
LLViewerParcelMgr::getInstance()->startBuyLand(*for_group);
}
BOOL LLPanelLandGeneral::enableDeedToGroup(void* data)
// static
void LLPanelLandGeneral::onClickScriptLimits(void* data)
{
LLPanelLandGeneral* panelp = (LLPanelLandGeneral*)data;
LLParcel* parcel = panelp->mParcel->getParcel();
return (parcel != NULL) && (parcel->getParcelFlag(PF_ALLOW_DEED_TO_GROUP));
if(parcel != NULL)
{
LLFloaterScriptLimits::showInstance();
}
}
// static

View File

@@ -153,9 +153,9 @@ public:
void onClickSetGroup();
static void onClickInfoGroup(void*);
static void cbGroupID(LLUUID group_id, void* userdata);
static BOOL enableDeedToGroup(void*);
static void onClickDeed(void*);
static void onClickBuyLand(void* data);
static void onClickScriptLimits(void* data);
static void onClickRelease(void*);
static void onClickReclaim(void*);
static void onClickBuyPass(void* deselect_when_done);
@@ -225,6 +225,7 @@ protected:
LLTextBox* mTextDwell;
LLButton* mBtnBuyLand;
LLButton* mBtnScriptLimits;
LLButton* mBtnBuyGroupLand;
// these buttons share the same location, but

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,271 @@
/**
* @file llfloaterscriptlimits.h
* @author Gabriel Lee
* @brief Declaration of the region info and controls floater and panels.
*
* $LicenseInfo:firstyear=2004&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#ifndef LL_LLFLOATERSCRIPTLIMITS_H
#define LL_LLFLOATERSCRIPTLIMITS_H
#include <vector>
#include "llfloater.h"
#include "llhost.h"
#include "llpanel.h"
#include "llremoteparcelrequest.h"
class LLPanelScriptLimitsInfo;
class LLTabContainer;
class LLPanelScriptLimitsRegionMemory;
class LLFloaterScriptLimits : public LLFloater, public LLFloaterSingleton<LLFloaterScriptLimits>
{
friend class LLUISingleton<LLFloaterScriptLimits, VisibilityPolicy<LLFloater> >;
public:
/*virtual*/ BOOL postBuild();
// from LLPanel
virtual void refresh();
private:
LLFloaterScriptLimits(const LLSD& seed);
~LLFloaterScriptLimits();
protected:
LLTabContainer* mTab;
typedef std::vector<LLPanelScriptLimitsInfo*> info_panels_t;
info_panels_t mInfoPanels;
};
// Base class for all script limits information panels.
class LLPanelScriptLimitsInfo : public LLPanel
{
public:
LLPanelScriptLimitsInfo();
virtual BOOL postBuild();
virtual void updateChild(LLUICtrl* child_ctrl);
protected:
void initCtrl(const std::string& name);
typedef std::vector<std::string> strings_t;
LLHost mHost;
};
/////////////////////////////////////////////////////////////////////////////
// Responders
/////////////////////////////////////////////////////////////////////////////
class AIHTTPTimeoutPolicy;
extern AIHTTPTimeoutPolicy fetchScriptLimitsRegionInfoResponder_timeout;
class fetchScriptLimitsRegionInfoResponder: public LLHTTPClient::ResponderWithResult
{
public:
fetchScriptLimitsRegionInfoResponder(const LLSD& info) : mInfo(info) {};
void result(const LLSD& content);
void error(U32 status, const std::string& reason);
public:
/*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return fetchScriptLimitsRegionInfoResponder_timeout; }
/*virtual*/ char const* getName(void) const { return "fetchScriptLimitsRegionInfoResponder"; }
protected:
LLSD mInfo;
};
extern AIHTTPTimeoutPolicy fetchScriptLimitsRegionSummaryResponder_timeout;
class fetchScriptLimitsRegionSummaryResponder: public LLHTTPClient::ResponderWithResult
{
public:
fetchScriptLimitsRegionSummaryResponder(const LLSD& info) : mInfo(info) {};
void result(const LLSD& content);
void error(U32 status, const std::string& reason);
public:
/*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return fetchScriptLimitsRegionSummaryResponder_timeout; }
/*virtual*/ char const* getName(void) const { return "fetchScriptLimitsRegionSummaryResponder"; }
protected:
LLSD mInfo;
};
extern AIHTTPTimeoutPolicy fetchScriptLimitsRegionDetailsResponder_timeout;
class fetchScriptLimitsRegionDetailsResponder: public LLHTTPClient::ResponderWithResult
{
public:
fetchScriptLimitsRegionDetailsResponder(const LLSD& info) : mInfo(info) {};
void result(const LLSD& content);
void error(U32 status, const std::string& reason);
public:
/*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return fetchScriptLimitsRegionDetailsResponder_timeout; }
/*virtual*/ char const* getName(void) const { return "fetchScriptLimitsRegionDetailsResponder"; }
protected:
LLSD mInfo;
};
extern AIHTTPTimeoutPolicy fetchScriptLimitsAttachmentInfoResponder_timeout;
class fetchScriptLimitsAttachmentInfoResponder: public LLHTTPClient::ResponderWithResult
{
public:
fetchScriptLimitsAttachmentInfoResponder() {};
void result(const LLSD& content);
void error(U32 status, const std::string& reason);
public:
/*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return fetchScriptLimitsAttachmentInfoResponder_timeout; }
/*virtual*/ char const* getName(void) const { return "fetchScriptLimitsAttachmentInfoResponder"; }
protected:
};
/////////////////////////////////////////////////////////////////////////////
// Memory panel
/////////////////////////////////////////////////////////////////////////////
class LLPanelScriptLimitsRegionMemory : public LLPanelScriptLimitsInfo, LLRemoteParcelInfoObserver
{
public:
LLPanelScriptLimitsRegionMemory()
: LLPanelScriptLimitsInfo(), LLRemoteParcelInfoObserver(),
mParcelId(LLUUID()),
mGotParcelMemoryUsed(false),
mGotParcelMemoryMax(false),
mParcelMemoryMax(0),
mParcelMemoryUsed(0) {};
~LLPanelScriptLimitsRegionMemory();
// LLPanel
virtual BOOL postBuild();
void setRegionDetails(LLSD content);
void setRegionSummary(LLSD content);
BOOL StartRequestChain();
BOOL getLandScriptResources();
void clearList();
void showBeacon();
void returnObjectsFromParcel(S32 local_id);
void returnObjects();
private:
void onNameCache(const LLUUID& id,
const std::string& name);
LLSD mContent;
LLUUID mParcelId;
bool mGotParcelMemoryUsed;
bool mGotParcelMemoryUsedDetails;
bool mGotParcelMemoryMax;
S32 mParcelMemoryMax;
S32 mParcelMemoryUsed;
S32 mParcelMemoryUsedDetails;
bool mGotParcelURLsUsed;
bool mGotParcelURLsUsedDetails;
bool mGotParcelURLsMax;
S32 mParcelURLsMax;
S32 mParcelURLsUsed;
S32 mParcelURLsUsedDetails;
std::vector<LLSD> mObjectListItems;
protected:
// LLRemoteParcelInfoObserver interface:
/*virtual*/ void processParcelInfo(const LLParcelData& parcel_data);
/*virtual*/ void setParcelID(const LLUUID& parcel_id);
/*virtual*/ void setErrorStatus(U32 status, const std::string& reason);
static void onClickRefresh(void* userdata);
static void onClickHighlight(void* userdata);
static void onClickReturn(void* userdata);
};
/////////////////////////////////////////////////////////////////////////////
// Attachment panel
/////////////////////////////////////////////////////////////////////////////
class LLPanelScriptLimitsAttachment : public LLPanelScriptLimitsInfo
{
public:
LLPanelScriptLimitsAttachment()
: LLPanelScriptLimitsInfo(),
mGotAttachmentMemoryUsed(false),
mGotAttachmentMemoryUsedDetails(false),
mGotAttachmentMemoryMax(false),
mAttachmentMemoryMax(0),
mAttachmentMemoryUsed(0),
mAttachmentMemoryUsedDetails(0),
mGotAttachmentURLsUsed(false),
mGotAttachmentURLsUsedDetails(false),
mGotAttachmentURLsMax(false),
mAttachmentURLsMax(0),
mAttachmentURLsUsed(0),
mAttachmentURLsUsedDetails(0)
{};
~LLPanelScriptLimitsAttachment()
{
};
// LLPanel
virtual BOOL postBuild();
void setAttachmentDetails(LLSD content);
void setAttachmentSummary(LLSD content);
BOOL requestAttachmentDetails();
void clearList();
private:
bool mGotAttachmentMemoryUsed;
bool mGotAttachmentMemoryUsedDetails;
bool mGotAttachmentMemoryMax;
S32 mAttachmentMemoryMax;
S32 mAttachmentMemoryUsed;
S32 mAttachmentMemoryUsedDetails;
bool mGotAttachmentURLsUsed;
bool mGotAttachmentURLsUsedDetails;
bool mGotAttachmentURLsMax;
S32 mAttachmentURLsMax;
S32 mAttachmentURLsUsed;
S32 mAttachmentURLsUsedDetails;
protected:
static void onClickRefresh(void* userdata);
};
#endif

View File

@@ -1594,7 +1594,7 @@ void LLViewerRegion::unpackRegionHandshake()
void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)
{
capabilityNames.append("AgentState");
//capabilityNames.append("AttachmentResources"); //Script limits (llfloaterscriptlimits.cpp)
capabilityNames.append("AttachmentResources");
//capabilityNames.append("AvatarPickerSearch"); //Display name/SLID lookup (llfloateravatarpicker.cpp)
capabilityNames.append("CharacterProperties");
capabilityNames.append("ChatSessionRequest");
@@ -1621,7 +1621,7 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)
capabilityNames.append("GroupMemberData");
capabilityNames.append("GroupProposalBallot");
capabilityNames.append("HomeLocation");
//capabilityNames.append("LandResources"); //Script limits (llfloaterscriptlimits.cpp)
capabilityNames.append("LandResources");
capabilityNames.append("MapLayer");
capabilityNames.append("MapLayerGod");
capabilityNames.append("MeshUploadFlag");
@@ -1637,7 +1637,7 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)
capabilityNames.append("ProvisionVoiceAccountRequest");
capabilityNames.append("RemoteParcelRequest");
capabilityNames.append("RequestTextureDownload");
capabilityNames.append("ResourceCostSelected"); //Unreferenced?
//capabilityNames.append("ResourceCostSelected"); //Object weights (llfloaterobjectweights.cpp)
capabilityNames.append("RetrieveNavMeshSrc");
capabilityNames.append("SearchStatRequest");
capabilityNames.append("SearchStatTracking");

View File

@@ -195,6 +195,7 @@
halign="center" height="20" label="Buy Land..."
label_selected="Buy Land..." left="155" mouse_opaque="true"
name="Buy Land..." scale_image="true" width="100" />
<button name="Scripts..." label="Script Info" bottom="-372" follows="left|top" height="20" left="10" width="140"/>
<button bottom="-372" enabled="false" follows="left|top" font="SansSerif"
halign="center" height="20" label="Buy For Group..."
label_selected="Buy For Group..." left="260" mouse_opaque="true"

View File

@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
can_close="true"
can_minimize="true"
can_resize="true"
min_height="260"
height="570"
help_topic="scriptlimits"
layout="topleft"
name="scriptlimits"
rect_control="FloaterScriptLimitsRect"
title="Script Information"
min_width="400"
width="480">
<tab_container
top="555"
follows="left|right|top|bottom"
layout="topleft"
left="1"
name="scriptlimits_panels"
right="-1"
tab_position="top"
bottom="0" />
</floater>

View File

@@ -0,0 +1,108 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
border="true"
mouse_opaque="false"
follows="top|left"
height="570"
label="My Avatar"
layout="topleft"
left="0"
name="script_limits_my_avatar_panel"
top="0"
width="480">
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
left="10"
name="script_memory"
top_pad="24"
width="480">
Avatar Script Usage
</text>
<text
follows="left|top"
height="16"
layout="topleft"
top_delta="18"
visible="false"/>
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
left="30"
name="memory_used"
top_delta="18"
width="480">
</text>
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
left="30"
name="urls_used"
top_delta="18"
width="480">
</text>
<text
type="string"
length="1"
follows="left|top"
height="20"
layout="topleft"
left="10"
name="loading_text"
top_delta="12"
width="480">
Loading...
</text>
<scroll_list
draw_heading="true"
follows="all"
height="409"
layout="topleft"
left_delta="0"
multi_select="true"
sort_column="0"
sort_ascending="true"
name="scripts_list"
top_delta="16"
width="460">
<column
label="Size (kb)"
name="size"
width="70" />
<column
label="URLs"
name="urls"
width="50" />
<column
label="Object"
name="name"
width="210" />
<column
label="Location"
name="location"
width="130" />
</scroll_list>
<button
follows="bottom|left"
height="19"
label="Refresh List"
layout="bottomleft"
left_pad="5"
name="refresh_list_btn"
bottom_delta="-34"
left="10"
width="100" />
</panel>

View File

@@ -0,0 +1,141 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
border="true"
mouse_opaque="false"
follows="top|left"
height="570"
label="Region Memory"
layout="topleft"
name="script_limits_region_memory_panel"
top="0"
left="0"
width="480">
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
left="10"
name="script_memory"
top_pad="24"
width="480">
Parcel Script Memory
</text>
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
left="30"
name="parcels_listed"
top_delta="18"
visible="true"
width="480">
</text>
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
left="30"
name="memory_used"
top_delta="18"
width="480">
</text>
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
left="30"
name="urls_used"
top_delta="18"
width="480">
</text>
<text
type="string"
length="1"
follows="left|top"
height="20"
layout="topleft"
left="10"
name="loading_text"
top_delta="12"
width="480">
Loading...
</text>
<scroll_list
draw_heading="true"
follows="all"
height="409"
layout="topleft"
left_delta="0"
multi_select="true"
sort_column="0"
sort_ascending="true"
name="scripts_list"
top_delta="16"
width="460">
<column
label="Size (kb)"
name="size"
width="70" />
<column
label="URLs"
name="urls"
width="50" />
<column
label="Object"
name="name"
width="70" />
<column
label="Owner"
name="owner"
width="90" />
<column
label="Parcel"
name="parcel"
width="100" />
<column
label="Location"
name="location"
width="80" />
</scroll_list>
<button
follows="bottom|left"
height="19"
label="Refresh List"
layout="bottomleft"
left_pad="5"
name="refresh_list_btn"
bottom_delta="-34"
left="10"
width="100" />
<button
follows="bottom|right"
height="19"
label="Highlight"
visible="false"
layout="bottomright"
left="370"
name="highlight_btn"
bottom_delta="0"
width="100" />
<button
follows="bottom|right"
height="19"
label="Return"
visible="false"
layout="bottomright"
name="return_btn"
bottom_delta="0"
left_delta="-105"
width="100" />
</panel>

View File

@@ -3169,6 +3169,60 @@ Drag folders to this area and click "Send to Marketplace" to list them for sale
<string name="RegionInfoAllowedResidents">Allowed Residents: ([ALLOWEDAGENTS], max [MAXACCESS])</string>
<string name="RegionInfoAllowedGroups">Allowed groups: ([ALLOWEDGROUPS], max [MAXACCESS])</string>
<!-- script limits floater -->
<string name="ScriptLimitsParcelScriptMemory">Parcel Script Memory</string>
<string name="ScriptLimitsParcelsOwned">Parcels Listed: [PARCELS]</string>
<string name="ScriptLimitsMemoryUsed">Memory used: [COUNT] kb out of [MAX] kb; [AVAILABLE] kb available</string>
<string name="ScriptLimitsMemoryUsedSimple">Memory used: [COUNT] kb</string>
<string name="ScriptLimitsParcelScriptURLs">Parcel Script URLs</string>
<string name="ScriptLimitsURLsUsed">URLs used: [COUNT] out of [MAX]; [AVAILABLE] available</string>
<string name="ScriptLimitsURLsUsedSimple">URLs used: [COUNT]</string>
<string name="ScriptLimitsRequestError">Error requesting information</string>
<string name="ScriptLimitsRequestNoParcelSelected">No Parcel Selected</string>
<string name="ScriptLimitsRequestWrongRegion">Error: script information is only available in your current region</string>
<string name="ScriptLimitsRequestWaiting">Retrieving information...</string>
<string name="ScriptLimitsRequestDontOwnParcel">You do not have permission to examine this parcel</string>
<string name="SITTING_ON">Sitting On</string>
<string name="ATTACH_CHEST">Chest</string>
<string name="ATTACH_HEAD">Head</string>
<string name="ATTACH_LSHOULDER">Left Shoulder</string>
<string name="ATTACH_RSHOULDER">Right Shoulder</string>
<string name="ATTACH_LHAND">Left Hand</string>
<string name="ATTACH_RHAND">Right Hand</string>
<string name="ATTACH_LFOOT">Left Foot</string>
<string name="ATTACH_RFOOT">Right Foot</string>
<string name="ATTACH_BACK">Back</string>
<string name="ATTACH_PELVIS">Pelvis</string>
<string name="ATTACH_MOUTH">Mouth</string>
<string name="ATTACH_CHIN">Chin</string>
<string name="ATTACH_LEAR">Left Ear</string>
<string name="ATTACH_REAR">Right Ear</string>
<string name="ATTACH_LEYE">Left Eye</string>
<string name="ATTACH_REYE">Right Eye</string>
<string name="ATTACH_NOSE">Nose</string>
<string name="ATTACH_RUARM">Right Upper Arm</string>
<string name="ATTACH_RLARM">Right Lower Arm</string>
<string name="ATTACH_LUARM">Left Upper Arm</string>
<string name="ATTACH_LLARM">Left Lower Arm</string>
<string name="ATTACH_RHIP">Right Hip</string>
<string name="ATTACH_RULEG">Right Upper Leg</string>
<string name="ATTACH_RLLEG">Right Lower Leg</string>
<string name="ATTACH_LHIP">Left Hip</string>
<string name="ATTACH_LULEG">Left Upper Leg</string>
<string name="ATTACH_LLLEG">Left Lower Leg</string>
<string name="ATTACH_BELLY">Belly</string>
<string name="ATTACH_RPEC">Right Pec</string>
<string name="ATTACH_LPEC">Left Pec</string>
<string name="ATTACH_HUD_CENTER_2">HUD Center 2</string>
<string name="ATTACH_HUD_TOP_RIGHT">HUD Top Right</string>
<string name="ATTACH_HUD_TOP_CENTER">HUD Top Center</string>
<string name="ATTACH_HUD_TOP_LEFT">HUD Top Left</string>
<string name="ATTACH_HUD_CENTER_1">HUD Center 1</string>
<string name="ATTACH_HUD_BOTTOM_LEFT">HUD Bottom Left</string>
<string name="ATTACH_HUD_BOTTOM">HUD Bottom</string>
<string name="ATTACH_HUD_BOTTOM_RIGHT">HUD Bottom Right</string>
<!-- panel contents -->
<string name="PanelContentsNewScript">New Script</string>
@@ -4069,6 +4123,9 @@ Try enclosing path to the editor with double quotes.
<string name="ExternalEditorCommandParseError">Error parsing the external editor command.</string>
<string name="ExternalEditorFailedToRun">External editor failed to run.</string>
<string name="Left">Left</string>
<string name="Right">Right</string>
<!-- Pathfinding -->
<string name="Pathfinding_Wiki_URL">http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer</string>
<string name="Pathfinding_Object_Attr_None">None</string>
@@ -4076,9 +4133,6 @@ Try enclosing path to the editor with double quotes.
<string name="Pathfinding_Object_Attr_Character">Character</string>
<string name="Pathfinding_Object_Attr_MultiSelect">(Multiple)</string>
<string name="Left">Left</string>
<string name="Right">Right</string>
<!-- teleport_strings.xml's strings we need -->
<string name="completed_from">Teleport completed from</string>