Pull and merge from ssh://hg@bitbucket.org/lindenlab/viewer-release.

master
Todd Stinson 2012-05-25 18:45:27 -07:00
commit b8bc62a514
32 changed files with 1178 additions and 507 deletions

View File

@ -112,6 +112,17 @@ viewer-mesh.login_channel = "Project Viewer - Mesh"
viewer-mesh.viewer_grid = aditi
viewer-mesh.email = shining@lists.lindenlab.com
# ========================================
# viewer-adult-check
# ========================================
viewer-adult-check.viewer_channel = "Project Viewer - AdultCheck"
viewer-adult-check.login_channel = "Project Viewer - AdultCheck"
viewer-adult-check.viewer_grid = agni
viewer-adult-check.build_debug_release_separately = true
viewer-adult-check.build_CYGWIN_Debug = false
viewer-adult-check.build_viewer_update_version_manager = false
# ================
# oz
# ================

View File

@ -46,7 +46,7 @@ LLKeyStringTranslatorFunc* LLKeyboard::mStringTranslator = NULL; // Used for l10
// Class Implementation
//
LLKeyboard::LLKeyboard() : mCallbacks(NULL), mNumpadDistinct(ND_NUMLOCK_OFF)
LLKeyboard::LLKeyboard() : mCallbacks(NULL)
{
S32 i;

View File

@ -62,14 +62,6 @@ class LLWindowCallbacks;
class LLKeyboard
{
public:
typedef enum e_numpad_distinct
{
ND_NEVER,
ND_NUMLOCK_OFF,
ND_NUMLOCK_ON
} ENumpadDistinct;
public:
LLKeyboard();
virtual ~LLKeyboard();
@ -107,8 +99,6 @@ public:
static BOOL keyFromString(const std::string& str, KEY *key); // False on failure
static std::string stringFromKey(KEY key);
static std::string stringFromAccelerator( MASK accel_mask, KEY key );
e_numpad_distinct getNumpadDistinct() { return mNumpadDistinct; }
void setNumpadDistinct(e_numpad_distinct val) { mNumpadDistinct = val; }
void setCallbacks(LLWindowCallbacks *cbs) { mCallbacks = cbs; }
F32 getKeyElapsedTime( KEY key ); // Returns time in seconds since key was pressed.
@ -135,8 +125,6 @@ protected:
static LLKeyStringTranslatorFunc* mStringTranslator; // Used for l10n + PC/Mac/Linux accelerator labeling
e_numpad_distinct mNumpadDistinct;
EKeyboardInsertMode mInsertMode;
static std::map<KEY,std::string> sKeysToNames;

View File

@ -299,28 +299,11 @@ void LLKeyboardMacOSX::scanKeyboard()
BOOL LLKeyboardMacOSX::translateNumpadKey( const U16 os_key, KEY *translated_key )
{
if(mNumpadDistinct == ND_NUMLOCK_ON)
{
std::map<U16, KEY>::iterator iter= mTranslateNumpadMap.find(os_key);
if(iter != mTranslateNumpadMap.end())
{
*translated_key = iter->second;
return TRUE;
}
}
return translateKey(os_key, translated_key);
}
U16 LLKeyboardMacOSX::inverseTranslateNumpadKey(const KEY translated_key)
{
if(mNumpadDistinct == ND_NUMLOCK_ON)
{
std::map<KEY, U16>::iterator iter= mInvTranslateNumpadMap.find(translated_key);
if(iter != mInvTranslateNumpadMap.end())
{
return iter->second;
}
}
return inverseTranslateKey(translated_key);
}

View File

@ -312,29 +312,11 @@ void LLKeyboardSDL::scanKeyboard()
BOOL LLKeyboardSDL::translateNumpadKey( const U16 os_key, KEY *translated_key)
{
if(mNumpadDistinct == ND_NUMLOCK_ON)
{
std::map<U16, KEY>::iterator iter= mTranslateNumpadMap.find(os_key);
if(iter != mTranslateNumpadMap.end())
{
*translated_key = iter->second;
return TRUE;
}
}
BOOL success = translateKey(os_key, translated_key);
return success;
return translateKey(os_key, translated_key);
}
U16 LLKeyboardSDL::inverseTranslateNumpadKey(const KEY translated_key)
{
if(mNumpadDistinct == ND_NUMLOCK_ON)
{
std::map<KEY, U16>::iterator iter= mInvTranslateNumpadMap.find(translated_key);
if(iter != mInvTranslateNumpadMap.end())
{
return iter->second;
}
}
return inverseTranslateKey(translated_key);
}

View File

@ -299,69 +299,13 @@ void LLKeyboardWin32::scanKeyboard()
BOOL LLKeyboardWin32::translateExtendedKey(const U16 os_key, const MASK mask, KEY *translated_key)
{
if(mNumpadDistinct == ND_NUMLOCK_ON)
{
std::map<U16, KEY>::iterator iter = mTranslateNumpadMap.find(os_key);
if (iter != mTranslateNumpadMap.end())
{
*translated_key = iter->second;
return TRUE;
}
}
BOOL success = translateKey(os_key, translated_key);
if(mNumpadDistinct != ND_NEVER) {
if(!success) return success;
if(mask & MASK_EXTENDED)
{
// this is where we'd create new keycodes for extended keys
// the set of extended keys includes the 'normal' arrow keys and
// the pgup/dn/insert/home/end/delete cluster above the arrow keys
// see http://windowssdk.msdn.microsoft.com/en-us/library/ms646280.aspx
// only process the return key if numlock is off
if(((mNumpadDistinct == ND_NUMLOCK_OFF &&
!(GetKeyState(VK_NUMLOCK) & 1))
|| mNumpadDistinct == ND_NUMLOCK_ON) &&
*translated_key == KEY_RETURN) {
*translated_key = KEY_PAD_RETURN;
}
}
else
{
// the non-extended keys, those are in the numpad
switch (*translated_key)
{
case KEY_LEFT:
*translated_key = KEY_PAD_LEFT; break;
case KEY_RIGHT:
*translated_key = KEY_PAD_RIGHT; break;
case KEY_UP:
*translated_key = KEY_PAD_UP; break;
case KEY_DOWN:
*translated_key = KEY_PAD_DOWN; break;
case KEY_HOME:
*translated_key = KEY_PAD_HOME; break;
case KEY_END:
*translated_key = KEY_PAD_END; break;
case KEY_PAGE_UP:
*translated_key = KEY_PAD_PGUP; break;
case KEY_PAGE_DOWN:
*translated_key = KEY_PAD_PGDN; break;
case KEY_INSERT:
*translated_key = KEY_PAD_INS; break;
case KEY_DELETE:
*translated_key = KEY_PAD_DEL; break;
}
}
}
return success;
return translateKey(os_key, translated_key);
}
U16 LLKeyboardWin32::inverseTranslateExtendedKey(const KEY translated_key)
{
// if numlock is on, then we need to translate KEY_PAD_FOO to the corresponding number pad number
if((mNumpadDistinct == ND_NUMLOCK_ON) && (GetKeyState(VK_NUMLOCK) & 1))
if(GetKeyState(VK_NUMLOCK) & 1)
{
std::map<KEY, U16>::iterator iter = mInvTranslateNumpadMap.find(translated_key);
if (iter != mInvTranslateNumpadMap.end())

View File

@ -201,7 +201,8 @@ void LLControlVariable::setValue(const LLSD& new_value, bool saved_value)
}
LLSD storable_value = getComparableValue(new_value);
bool value_changed = llsd_compare(getValue(), storable_value) == FALSE;
LLSD original_value = getValue();
bool value_changed = llsd_compare(original_value, storable_value) == FALSE;
if(saved_value)
{
// If we're going to save this value, return to default but don't fire
@ -237,7 +238,7 @@ void LLControlVariable::setValue(const LLSD& new_value, bool saved_value)
if(value_changed)
{
mCommitSignal(this, storable_value);
firePropertyChanged(original_value);
}
}
@ -249,12 +250,13 @@ void LLControlVariable::setDefaultValue(const LLSD& value)
// *NOTE: Default values are not saved, only read.
LLSD comparable_value = getComparableValue(value);
bool value_changed = (llsd_compare(getValue(), comparable_value) == FALSE);
LLSD original_value = getValue();
bool value_changed = (llsd_compare(original_value, comparable_value) == FALSE);
resetToDefault(false);
mValues[0] = comparable_value;
if(value_changed)
{
firePropertyChanged();
firePropertyChanged(original_value);
}
}
@ -277,6 +279,8 @@ void LLControlVariable::resetToDefault(bool fire_signal)
{
//The first setting is always the default
//Pop to it and fire off the listener
LLSD originalValue = mValues.back();
while(mValues.size() > 1)
{
mValues.pop_back();
@ -284,7 +288,7 @@ void LLControlVariable::resetToDefault(bool fire_signal)
if(fire_signal)
{
firePropertyChanged();
firePropertyChanged(originalValue);
}
}

View File

@ -98,7 +98,7 @@ class LLControlVariable : public LLRefCount
public:
typedef boost::signals2::signal<bool(LLControlVariable* control, const LLSD&), boost_boolean_combiner> validate_signal_t;
typedef boost::signals2::signal<void(LLControlVariable* control, const LLSD&)> commit_signal_t;
typedef boost::signals2::signal<void(LLControlVariable* control, const LLSD&, const LLSD&)> commit_signal_t;
private:
std::string mName;
@ -146,11 +146,11 @@ public:
void setHiddenFromSettingsEditor(bool hide);
void setComment(const std::string& comment);
void firePropertyChanged()
{
mCommitSignal(this, mValues.back());
}
private:
void firePropertyChanged(const LLSD &pPreviousValue)
{
mCommitSignal(this, mValues.back(), pPreviousValue);
}
LLSD getComparableValue(const LLSD& value);
bool llsd_compare(const LLSD& a, const LLSD & b);
};

View File

@ -6356,17 +6356,6 @@
<key>Value</key>
<integer>0</integer>
</map>
<key>NumpadControl</key>
<map>
<key>Comment</key>
<string>How numpad keys control your avatar. 0 = Like the normal arrow keys, 1 = Numpad moves avatar when numlock is off, 2 = Numpad moves avatar regardless of numlock (use this if you have no numlock)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>S32</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>ObjectCacheEnabled</key>
<map>
<key>Comment</key>
@ -13516,5 +13505,16 @@
<key>Value</key>
<integer>0</integer>
</map>
<key>AdultCheckEnablePurchse</key>
<map>
<key>Comment</key>
<string>Hack to allow QA testing of purchasing land regardless of maturity rating.</string>
<key>Persist</key>
<integer>0</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
</map>
</llsd>

View File

@ -81,6 +81,7 @@
#include "llviewermenu.h"
#include "llviewerobjectlist.h"
#include "llviewerparcelmgr.h"
#include "llviewerregion.h"
#include "llviewerstats.h"
#include "llviewerwindow.h"
#include "llvoavatarself.h"
@ -112,6 +113,94 @@ const F32 MAX_FIDGET_TIME = 20.f; // seconds
// The agent instance.
LLAgent gAgent;
class LLTeleportRequest
{
public:
LLTeleportRequest();
virtual ~LLTeleportRequest();
virtual bool canRestartTeleport();
virtual void startTeleport() = 0;
virtual void restartTeleport();
protected:
private:
};
class LLTeleportRequestViaLandmark : public LLTeleportRequest
{
public:
LLTeleportRequestViaLandmark(const LLUUID &pLandmarkId);
virtual ~LLTeleportRequestViaLandmark();
virtual bool canRestartTeleport();
virtual void startTeleport();
virtual void restartTeleport();
protected:
inline const LLUUID &getLandmarkId() const {return mLandmarkId;};
private:
LLUUID mLandmarkId;
};
class LLTeleportRequestViaLure : public LLTeleportRequestViaLandmark
{
public:
LLTeleportRequestViaLure(const LLUUID &pLureId, BOOL pIsLureGodLike);
virtual ~LLTeleportRequestViaLure();
virtual bool canRestartTeleport();
virtual void startTeleport();
protected:
inline BOOL isLureGodLike() const {return mIsLureGodLike;};
private:
BOOL mIsLureGodLike;
};
class LLTeleportRequestViaLocation : public LLTeleportRequest
{
public:
LLTeleportRequestViaLocation(const LLVector3d &pPosGlobal);
virtual ~LLTeleportRequestViaLocation();
virtual bool canRestartTeleport();
virtual void startTeleport();
virtual void restartTeleport();
protected:
inline const LLVector3d &getPosGlobal() const {return mPosGlobal;};
private:
LLVector3d mPosGlobal;
};
class LLTeleportRequestViaLocationLookAt : public LLTeleportRequestViaLocation
{
public:
LLTeleportRequestViaLocationLookAt(const LLVector3d &pPosGlobal);
virtual ~LLTeleportRequestViaLocationLookAt();
virtual bool canRestartTeleport();
virtual void startTeleport();
virtual void restartTeleport();
protected:
private:
};
//--------------------------------------------------------------------
// Statics
//
@ -245,6 +334,19 @@ LLAgent::LLAgent() :
mAgentAccess(new LLAgentAccess(gSavedSettings)),
mCanEditParcel(false),
mTeleportSourceSLURL(new LLSLURL),
mCurrentTeleportRequest(),
mFailedTeleportRequest(),
mTeleportFinishedSlot(),
mTeleportFailedSlot(),
mIsMaturityRatingChangingDuringTeleport(false),
mMaturityRatingChange(0U),
mIsDoSendMaturityPreferenceToServer(false),
mMaturityPreferenceConfirmCallback(NULL),
mMaturityPreferenceRequestId(0U),
mMaturityPreferenceResponseId(0U),
mMaturityPreferenceNumRetries(0U),
mLastKnownRequestMaturity(SIM_ACCESS_MIN),
mLastKnownResponseMaturity(SIM_ACCESS_MIN),
mTeleportState( TELEPORT_NONE ),
mRegionp(NULL),
@ -330,8 +432,18 @@ void LLAgent::init()
gSavedSettings.getControl("PreferredMaturity")->getValidateSignal()->connect(boost::bind(&LLAgent::validateMaturity, this, _2));
gSavedSettings.getControl("PreferredMaturity")->getSignal()->connect(boost::bind(&LLAgent::handleMaturity, this, _2));
mLastKnownResponseMaturity = static_cast<U8>(gSavedSettings.getU32("PreferredMaturity"));
mLastKnownRequestMaturity = mLastKnownResponseMaturity;
mIsDoSendMaturityPreferenceToServer = true;
LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback(boost::bind(&LLAgent::parcelChangedCallback));
if (!mTeleportFinishedSlot.connected())
{
mTeleportFinishedSlot = LLViewerParcelMgr::getInstance()->setTeleportFinishedCallback(boost::bind(&LLAgent::handleTeleportFinished, this));
}
if (!mTeleportFailedSlot.connected())
{
mTeleportFailedSlot = LLViewerParcelMgr::getInstance()->setTeleportFailedCallback(boost::bind(&LLAgent::handleTeleportFailed, this));
}
mInitialized = TRUE;
}
@ -342,6 +454,14 @@ void LLAgent::init()
void LLAgent::cleanup()
{
mRegionp = NULL;
if (mTeleportFinishedSlot.connected())
{
mTeleportFinishedSlot.disconnect();
}
if (mTeleportFailedSlot.connected())
{
mTeleportFailedSlot.disconnect();
}
}
//-----------------------------------------------------------------------------
@ -2371,49 +2491,277 @@ bool LLAgent::isAdult() const
return mAgentAccess->isAdult();
}
void LLAgent::setTeen(bool teen)
{
mAgentAccess->setTeen(teen);
}
//static
int LLAgent::convertTextToMaturity(char text)
{
return LLAgentAccess::convertTextToMaturity(text);
}
bool LLAgent::sendMaturityPreferenceToServer(int preferredMaturity)
class LLMaturityPreferencesResponder : public LLHTTPClient::Responder
{
if (!getRegion())
return false;
// Update agent access preference on the server
std::string url = getRegion()->getCapability("UpdateAgentInformation");
if (!url.empty())
public:
LLMaturityPreferencesResponder(LLAgent *pAgent, U8 pPreferredMaturity, U8 pPreviousMaturity, LLAgent::maturity_preferences_callback_t pMaturityPreferencesCallback);
virtual ~LLMaturityPreferencesResponder();
virtual void result(const LLSD &pContent);
virtual void error(U32 pStatus, const std::string& pReason);
protected:
private:
U8 parseMaturityFromServerResponse(const LLSD &pContent);
LLAgent *mAgent;
U8 mPreferredMaturity;
U8 mPreviousMaturity;
LLAgent::maturity_preferences_callback_t mMaturityPreferencesCallback;
};
LLMaturityPreferencesResponder::LLMaturityPreferencesResponder(LLAgent *pAgent, U8 pPreferredMaturity, U8 pPreviousMaturity, LLAgent::maturity_preferences_callback_t pMaturityPreferencesCallback)
: LLHTTPClient::Responder(),
mAgent(pAgent),
mPreferredMaturity(pPreferredMaturity),
mPreviousMaturity(pPreviousMaturity),
mMaturityPreferencesCallback(pMaturityPreferencesCallback)
{
}
LLMaturityPreferencesResponder::~LLMaturityPreferencesResponder()
{
}
void LLMaturityPreferencesResponder::result(const LLSD &pContent)
{
U8 actualMaturity = parseMaturityFromServerResponse(pContent);
if (actualMaturity != mPreferredMaturity)
{
// Set new access preference
LLSD access_prefs = LLSD::emptyMap();
if (preferredMaturity == SIM_ACCESS_PG)
{
access_prefs["max"] = "PG";
}
else if (preferredMaturity == SIM_ACCESS_MATURE)
{
access_prefs["max"] = "M";
}
if (preferredMaturity == SIM_ACCESS_ADULT)
{
access_prefs["max"] = "A";
}
LLSD body = LLSD::emptyMap();
body["access_prefs"] = access_prefs;
llinfos << "Sending access prefs update to " << (access_prefs["max"].asString()) << " via capability to: "
<< url << llendl;
LLHTTPClient::post(url, body, new LLHTTPClient::Responder()); // Ignore response
return true;
llwarns << "while attempting to change maturity preference from '" << LLViewerRegion::accessToString(mPreviousMaturity)
<< "' to '" << LLViewerRegion::accessToString(mPreferredMaturity) << "', the server responded with '"
<< LLViewerRegion::accessToString(actualMaturity) << "' [value:" << static_cast<U32>(actualMaturity) << ", llsd:"
<< pContent << "]" << llendl;
}
mAgent->handlePreferredMaturityResult(actualMaturity);
if (!mMaturityPreferencesCallback.empty())
{
mMaturityPreferencesCallback(actualMaturity);
}
}
void LLMaturityPreferencesResponder::error(U32 pStatus, const std::string& pReason)
{
llwarns << "while attempting to change maturity preference from '" << LLViewerRegion::accessToString(mPreviousMaturity)
<< "' to '" << LLViewerRegion::accessToString(mPreferredMaturity) << "', we got an error because '"
<< pReason << "' [status:" << pStatus << "]" << llendl;
mAgent->handlePreferredMaturityError();
if (!mMaturityPreferencesCallback.empty())
{
mMaturityPreferencesCallback(mPreviousMaturity);
}
}
U8 LLMaturityPreferencesResponder::parseMaturityFromServerResponse(const LLSD &pContent)
{
// stinson 05/24/2012 Pathfinding regions have re-defined the response behavior. In the old server code,
// if you attempted to change the preferred maturity to the same value, the response content would be an
// undefined LLSD block. In the new server code with pathfinding, the response content should always be
// defined. Thus, the check for isUndefined() can be replaced with an assert after pathfinding is merged
// into server trunk and fully deployed.
U8 maturity = SIM_ACCESS_MIN;
if (pContent.isUndefined())
{
maturity = mPreferredMaturity;
}
else
{
llassert(!pContent.isUndefined());
llassert(pContent.isMap());
if (!pContent.isUndefined() && pContent.isMap())
{
// stinson 05/24/2012 Pathfinding regions have re-defined the response syntax. The if statement catches
// the new syntax, and the else statement catches the old syntax. After pathfinding is merged into
// server trunk and fully deployed, we can remove the else statement.
if (pContent.has("access_prefs"))
{
llassert(pContent.has("access_prefs"));
llassert(pContent.get("access_prefs").isMap());
llassert(pContent.get("access_prefs").has("max"));
llassert(pContent.get("access_prefs").get("max").isString());
if (pContent.get("access_prefs").isMap() && pContent.get("access_prefs").has("max") &&
pContent.get("access_prefs").get("max").isString())
{
LLSD::String actualPreference = pContent.get("access_prefs").get("max").asString();
LLStringUtil::trim(actualPreference);
maturity = LLViewerRegion::shortStringToAccess(actualPreference);
}
}
else if (pContent.has("max"))
{
llassert(pContent.get("max").isString());
if (pContent.get("max").isString())
{
LLSD::String actualPreference = pContent.get("max").asString();
LLStringUtil::trim(actualPreference);
maturity = LLViewerRegion::shortStringToAccess(actualPreference);
}
}
}
}
return maturity;
}
void LLAgent::setMaturityPreferenceAndConfirm(U32 preferredMaturity, maturity_preferences_callback_t pMaturityPreferencesCallback)
{
llassert(mMaturityPreferenceConfirmCallback == NULL);
mMaturityPreferenceConfirmCallback = pMaturityPreferencesCallback;
gSavedSettings.setU32("PreferredMaturity", static_cast<U32>(preferredMaturity));
// PreferredMaturity has a signal hook on change that will call LLAgent::sendMaturityPreferenceToServer
// sendMaturityPreferenceToServer will use mMaturityPreferenceConfirmCallback in the LLHTTPResponder
// This allows for confirmation that the server has officially received the maturity preference change
mMaturityPreferenceConfirmCallback = NULL;
}
void LLAgent::handlePreferredMaturityResult(U8 pServerMaturity)
{
// Update the number of responses received
++mMaturityPreferenceResponseId;
llassert(mMaturityPreferenceResponseId <= mMaturityPreferenceRequestId);
// Update the last known server maturity response
mLastKnownResponseMaturity = pServerMaturity;
// Ignore all responses if we know there are more unanswered requests that are expected
if (mMaturityPreferenceResponseId == mMaturityPreferenceRequestId)
{
// If we received a response that matches the last known request, then we are good
if (mLastKnownRequestMaturity == mLastKnownResponseMaturity)
{
mMaturityPreferenceNumRetries = 0;
llassert(static_cast<U8>(gSavedSettings.getU32("PreferredMaturity")) == mLastKnownResponseMaturity);
}
// Else, the viewer is out of sync with the server, so let's try to re-sync with the
// server by re-sending our last known request. Cap the re-tries at 3 just to be safe.
else if (++mMaturityPreferenceNumRetries <= 3)
{
llinfos << "Retrying attempt #" << mMaturityPreferenceNumRetries << " to set viewer preferred maturity to '"
<< LLViewerRegion::accessToString(mLastKnownRequestMaturity) << "'" << llendl;
sendMaturityPreferenceToServer(mLastKnownRequestMaturity);
}
// Else, the viewer is style out of sync with the server after 3 retries, so inform the user
else
{
mMaturityPreferenceNumRetries = 0;
reportPreferredMaturityError();
}
}
}
void LLAgent::handlePreferredMaturityError()
{
// Update the number of responses received
++mMaturityPreferenceResponseId;
llassert(mMaturityPreferenceResponseId <= mMaturityPreferenceRequestId);
// Ignore all responses if we know there are more unanswered requests that are expected
if (mMaturityPreferenceResponseId == mMaturityPreferenceRequestId)
{
mMaturityPreferenceNumRetries = 0;
// If we received a response that matches the last known request, then we are synced with
// the server, but not quite sure why we are
if (mLastKnownRequestMaturity == mLastKnownResponseMaturity)
{
llwarns << "Got an error but maturity preference '" << LLViewerRegion::accessToString(mLastKnownRequestMaturity)
<< "' seems to be in sync with the server" << llendl;
mMaturityPreferenceNumRetries = 0;
}
// Else, the more likely case is that the last request does not match the last response,
// so inform the user
else
{
reportPreferredMaturityError();
}
}
}
void LLAgent::reportPreferredMaturityError()
{
// Get the last known maturity request from the user activity
std::string preferredMaturity = LLViewerRegion::accessToString(mLastKnownRequestMaturity);
LLStringUtil::toLower(preferredMaturity);
// Get the last known maturity response from the server
std::string actualMaturity = LLViewerRegion::accessToString(mLastKnownResponseMaturity);
LLStringUtil::toLower(actualMaturity);
// Notify the user
LLSD args = LLSD::emptyMap();
args["PREFERRED_MATURITY"] = preferredMaturity;
args["ACTUAL_MATURITY"] = actualMaturity;
LLNotificationsUtil::add("MaturityChangeError", args);
// Check the saved settings to ensure that we are consistent. If we are not consistent, update
// the viewer, but do not send anything to server
U8 localMaturity = static_cast<U8>(gSavedSettings.getU32("PreferredMaturity"));
if (localMaturity != mLastKnownResponseMaturity)
{
bool tmpIsDoSendMaturityPreferenceToServer = mIsDoSendMaturityPreferenceToServer;
mIsDoSendMaturityPreferenceToServer = false;
llinfos << "Setting viewer preferred maturity to '" << LLViewerRegion::accessToString(mLastKnownResponseMaturity) << "'" << llendl;
gSavedSettings.setU32("PreferredMaturity", static_cast<U32>(mLastKnownResponseMaturity));
mIsDoSendMaturityPreferenceToServer = tmpIsDoSendMaturityPreferenceToServer;
}
}
void LLAgent::sendMaturityPreferenceToServer(U8 pPreferredMaturity)
{
// Only send maturity preference to the server if enabled
if (mIsDoSendMaturityPreferenceToServer)
{
// Increment the number of requests. The handlers manage a separate count of responses.
++mMaturityPreferenceRequestId;
// Update the last know maturity request
mLastKnownRequestMaturity = pPreferredMaturity;
// Create a response handler
LLHTTPClient::ResponderPtr responderPtr = LLHTTPClient::ResponderPtr(new LLMaturityPreferencesResponder(this, pPreferredMaturity, mLastKnownResponseMaturity, mMaturityPreferenceConfirmCallback));
// If we don't have a region, report it as an error
if (getRegion() == NULL)
{
responderPtr->error(0U, "region is not defined");
}
else
{
// Find the capability to send maturity preference
std::string url = getRegion()->getCapability("UpdateAgentInformation");
// If the capability is not defined, report it as an error
if (url.empty())
{
responderPtr->error(0U, "capability 'UpdateAgentInformation' is not defined for region");
}
else
{
// Set new access preference
LLSD access_prefs = LLSD::emptyMap();
access_prefs["max"] = LLViewerRegion::accessToShortString(pPreferredMaturity);
LLSD body = LLSD::emptyMap();
body["access_prefs"] = access_prefs;
llinfos << "Sending viewer preferred maturity to '" << LLViewerRegion::accessToString(pPreferredMaturity)
<< "' via capability to: " << url << llendl;
LLSD headers;
LLHTTPClient::post(url, body, responderPtr, headers, 30.0f);
}
}
}
return false;
}
BOOL LLAgent::getAdminOverride() const
@ -2436,11 +2784,6 @@ void LLAgent::setGodLevel(U8 god_level)
mAgentAccess->setGodLevel(god_level);
}
void LLAgent::setAOTransition()
{
mAgentAccess->setTransition();
}
const LLAgentAccess& LLAgent::getAgentAccess()
{
return *mAgentAccess;
@ -2451,9 +2794,9 @@ bool LLAgent::validateMaturity(const LLSD& newvalue)
return mAgentAccess->canSetMaturity(newvalue.asInteger());
}
void LLAgent::handleMaturity(const LLSD& newvalue)
void LLAgent::handleMaturity(const LLSD &pNewValue)
{
sendMaturityPreferenceToServer(newvalue.asInteger());
sendMaturityPreferenceToServer(static_cast<U8>(pNewValue.asInteger()));
}
//----------------------------------------------------------------------------
@ -3463,6 +3806,73 @@ bool LLAgent::teleportCore(bool is_local)
return true;
}
bool LLAgent::hasRestartableFailedTeleportRequest()
{
return hasFailedTeleportRequest() && mFailedTeleportRequest->canRestartTeleport();
}
void LLAgent::restartFailedTeleportRequest()
{
if (hasRestartableFailedTeleportRequest())
{
mFailedTeleportRequest->restartTeleport();
}
}
void LLAgent::clearFailedTeleportRequest()
{
if (hasFailedTeleportRequest())
{
mFailedTeleportRequest.reset();
}
}
void LLAgent::setMaturityRatingChangeDuringTeleport(U8 pMaturityRatingChange)
{
mIsMaturityRatingChangingDuringTeleport = true;
mMaturityRatingChange = pMaturityRatingChange;
}
void LLAgent::handleTeleportFinished()
{
if (hasCurrentTeleportRequest())
{
mCurrentTeleportRequest.reset();
}
if (hasFailedTeleportRequest())
{
clearFailedTeleportRequest();
}
if (mIsMaturityRatingChangingDuringTeleport)
{
// notify user that the maturity preference has been changed
std::string maturityRating = LLViewerRegion::accessToString(mMaturityRatingChange);
LLStringUtil::toLower(maturityRating);
LLSD args;
args["RATING"] = maturityRating;
LLNotificationsUtil::add("PreferredMaturityChanged", args);
mIsMaturityRatingChangingDuringTeleport = false;
}
}
void LLAgent::handleTeleportFailed()
{
if (hasCurrentTeleportRequest())
{
mFailedTeleportRequest = mCurrentTeleportRequest;
}
if (mIsMaturityRatingChangingDuringTeleport)
{
// notify user that the maturity preference has been changed
std::string maturityRating = LLViewerRegion::accessToString(mMaturityRatingChange);
LLStringUtil::toLower(maturityRating);
LLSD args;
args["RATING"] = maturityRating;
LLNotificationsUtil::add("PreferredMaturityChanged", args);
mIsMaturityRatingChangingDuringTeleport = false;
}
}
void LLAgent::teleportRequest(
const U64& region_handle,
const LLVector3& pos_local,
@ -3494,6 +3904,12 @@ void LLAgent::teleportRequest(
// Landmark ID = LLUUID::null means teleport home
void LLAgent::teleportViaLandmark(const LLUUID& landmark_asset_id)
{
mCurrentTeleportRequest = LLTeleportRequestPtr(new LLTeleportRequestViaLandmark(landmark_asset_id));
mCurrentTeleportRequest->startTeleport();
}
void LLAgent::doTeleportViaLandmark(const LLUUID& landmark_asset_id)
{
LLViewerRegion *regionp = getRegion();
if(regionp && teleportCore())
@ -3509,6 +3925,12 @@ void LLAgent::teleportViaLandmark(const LLUUID& landmark_asset_id)
}
void LLAgent::teleportViaLure(const LLUUID& lure_id, BOOL godlike)
{
mCurrentTeleportRequest = LLTeleportRequestPtr(new LLTeleportRequestViaLure(lure_id, godlike));
mCurrentTeleportRequest->startTeleport();
}
void LLAgent::doTeleportViaLure(const LLUUID& lure_id, BOOL godlike)
{
LLViewerRegion* regionp = getRegion();
if(regionp && teleportCore())
@ -3558,6 +3980,12 @@ void LLAgent::teleportCancel()
void LLAgent::teleportViaLocation(const LLVector3d& pos_global)
{
mCurrentTeleportRequest = LLTeleportRequestPtr(new LLTeleportRequestViaLocation(pos_global));
mCurrentTeleportRequest->startTeleport();
}
void LLAgent::doTeleportViaLocation(const LLVector3d& pos_global)
{
LLViewerRegion* regionp = getRegion();
U64 handle = to_region_handle(pos_global);
@ -3600,6 +4028,12 @@ void LLAgent::teleportViaLocation(const LLVector3d& pos_global)
// Teleport to global position, but keep facing in the same direction
void LLAgent::teleportViaLocationLookAt(const LLVector3d& pos_global)
{
mCurrentTeleportRequest = LLTeleportRequestPtr(new LLTeleportRequestViaLocationLookAt(pos_global));
mCurrentTeleportRequest->startTeleport();
}
void LLAgent::doTeleportViaLocationLookAt(const LLVector3d& pos_global)
{
mbTeleportKeepsLookAt = true;
gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE); // detach camera form avatar, so it keeps direction
@ -4034,5 +4468,148 @@ LLAgentQueryManager::~LLAgentQueryManager()
{
}
// EOF
//-----------------------------------------------------------------------------
// LLTeleportRequest
//-----------------------------------------------------------------------------
LLTeleportRequest::LLTeleportRequest()
{
}
LLTeleportRequest::~LLTeleportRequest()
{
}
bool LLTeleportRequest::canRestartTeleport()
{
return false;
}
void LLTeleportRequest::restartTeleport()
{
llassert(0);
}
//-----------------------------------------------------------------------------
// LLTeleportRequestViaLandmark
//-----------------------------------------------------------------------------
LLTeleportRequestViaLandmark::LLTeleportRequestViaLandmark(const LLUUID &pLandmarkId)
: LLTeleportRequest(),
mLandmarkId(pLandmarkId)
{
}
LLTeleportRequestViaLandmark::~LLTeleportRequestViaLandmark()
{
}
bool LLTeleportRequestViaLandmark::canRestartTeleport()
{
return true;
}
void LLTeleportRequestViaLandmark::startTeleport()
{
gAgent.doTeleportViaLandmark(getLandmarkId());
}
void LLTeleportRequestViaLandmark::restartTeleport()
{
gAgent.doTeleportViaLandmark(getLandmarkId());
}
//-----------------------------------------------------------------------------
// LLTeleportRequestViaLure
//-----------------------------------------------------------------------------
LLTeleportRequestViaLure::LLTeleportRequestViaLure(const LLUUID &pLureId, BOOL pIsLureGodLike)
: LLTeleportRequestViaLandmark(pLureId),
mIsLureGodLike(pIsLureGodLike)
{
}
LLTeleportRequestViaLure::~LLTeleportRequestViaLure()
{
}
bool LLTeleportRequestViaLure::canRestartTeleport()
{
// stinson 05/17/2012 : cannot restart a teleport via lure because of server-side restrictions
// The current scenario is as follows:
// 1. User A initializes a request for User B to teleport via lure
// 2. User B accepts the teleport via lure request
// 3. The server sees the init request from User A and the accept request from User B and matches them up
// 4. The server then removes the paired requests up from the "queue"
// 5. The server then fails User B's teleport for reason of maturity level (for example)
// 6. User B's viewer prompts user to increase their maturity level profile value.
// 7. User B confirms and accepts increase in maturity level
// 8. User B's viewer then attempts to teleport via lure again
// 9. This request will time-out on the viewer-side because User A's initial request has been removed from the "queue" in step 4
return false;
}
void LLTeleportRequestViaLure::startTeleport()
{
gAgent.doTeleportViaLure(getLandmarkId(), isLureGodLike());
}
//-----------------------------------------------------------------------------
// LLTeleportRequestViaLocation
//-----------------------------------------------------------------------------
LLTeleportRequestViaLocation::LLTeleportRequestViaLocation(const LLVector3d &pPosGlobal)
: LLTeleportRequest(),
mPosGlobal(pPosGlobal)
{
}
LLTeleportRequestViaLocation::~LLTeleportRequestViaLocation()
{
}
bool LLTeleportRequestViaLocation::canRestartTeleport()
{
return true;
}
void LLTeleportRequestViaLocation::startTeleport()
{
gAgent.doTeleportViaLocation(getPosGlobal());
}
void LLTeleportRequestViaLocation::restartTeleport()
{
gAgent.doTeleportViaLocation(getPosGlobal());
}
//-----------------------------------------------------------------------------
// LLTeleportRequestViaLocationLookAt
//-----------------------------------------------------------------------------
LLTeleportRequestViaLocationLookAt::LLTeleportRequestViaLocationLookAt(const LLVector3d &pPosGlobal)
: LLTeleportRequestViaLocation(pPosGlobal)
{
}
LLTeleportRequestViaLocationLookAt::~LLTeleportRequestViaLocationLookAt()
{
}
bool LLTeleportRequestViaLocationLookAt::canRestartTeleport()
{
return true;
}
void LLTeleportRequestViaLocationLookAt::startTeleport()
{
gAgent.doTeleportViaLocationLookAt(getPosGlobal());
}
void LLTeleportRequestViaLocationLookAt::restartTeleport()
{
gAgent.doTeleportViaLocationLookAt(getPosGlobal());
}
// EOF

View File

@ -35,6 +35,8 @@
#include "llcoordframe.h" // for mFrameAgent
#include "llvoavatardefines.h"
#include <boost/function.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/signals2.hpp>
extern const BOOL ANIMATE;
@ -56,6 +58,9 @@ class LLAgentAccess;
class LLSLURL;
class LLPauseRequestHandle;
class LLUIColor;
class LLTeleportRequest;
typedef boost::shared_ptr<LLTeleportRequest> LLTeleportRequestPtr;
//--------------------------------------------------------------------
// Types
@ -556,9 +561,6 @@ private:
// Teleport Actions
//--------------------------------------------------------------------
public:
void teleportRequest(const U64& region_handle,
const LLVector3& pos_local, // Go to a named location home
bool look_at_from_camera = false);
void teleportViaLandmark(const LLUUID& landmark_id); // Teleport to a landmark
void teleportHome() { teleportViaLandmark(LLUUID::null); } // Go home
void teleportViaLure(const LLUUID& lure_id, BOOL godlike); // To an invited location
@ -569,6 +571,44 @@ public:
protected:
bool teleportCore(bool is_local = false); // Stuff for all teleports; returns true if the teleport can proceed
//--------------------------------------------------------------------
// Teleport State
//--------------------------------------------------------------------
public:
inline bool hasCurrentTeleportRequest() {return (mCurrentTeleportRequest != NULL);};
inline bool hasFailedTeleportRequest() {return (mFailedTeleportRequest != NULL);};
bool hasRestartableFailedTeleportRequest();
void restartFailedTeleportRequest();
void clearFailedTeleportRequest();
void setMaturityRatingChangeDuringTeleport(U8 pMaturityRatingChange);
private:
friend class LLTeleportRequest;
friend class LLTeleportRequestViaLandmark;
friend class LLTeleportRequestViaLure;
friend class LLTeleportRequestViaLocation;
friend class LLTeleportRequestViaLocationLookAt;
LLTeleportRequestPtr mCurrentTeleportRequest;
LLTeleportRequestPtr mFailedTeleportRequest;
boost::signals2::connection mTeleportFinishedSlot;
boost::signals2::connection mTeleportFailedSlot;
bool mIsMaturityRatingChangingDuringTeleport;
U8 mMaturityRatingChange;
void teleportRequest(const U64& region_handle,
const LLVector3& pos_local, // Go to a named location home
bool look_at_from_camera = false);
void doTeleportViaLandmark(const LLUUID& landmark_id); // Teleport to a landmark
void doTeleportViaLure(const LLUUID& lure_id, BOOL godlike); // To an invited location
void doTeleportViaLocation(const LLVector3d& pos_global); // To a global location - this will probably need to be deprecated
void doTeleportViaLocationLookAt(const LLVector3d& pos_global);// To a global location, preserving camera rotation
void handleTeleportFinished();
void handleTeleportFailed();
//--------------------------------------------------------------------
// Teleport State
//--------------------------------------------------------------------
@ -614,8 +654,6 @@ public:
const LLAgentAccess& getAgentAccess();
BOOL canManageEstate() const;
BOOL getAdminOverride() const;
// ! BACKWARDS COMPATIBILITY ! This function can go away after the AO transition (see llstartup.cpp).
void setAOTransition();
private:
LLAgentAccess * mAgentAccess;
@ -650,13 +688,29 @@ public:
bool isTeen() const;
bool isMature() const;
bool isAdult() const;
void setTeen(bool teen);
void setMaturity(char text);
static int convertTextToMaturity(char text);
bool sendMaturityPreferenceToServer(int preferredMaturity); // ! "U8" instead of "int"?
static int convertTextToMaturity(char text);
typedef boost::function<void (U8)> maturity_preferences_callback_t;
void setMaturityPreferenceAndConfirm(U32 preferredMaturity, maturity_preferences_callback_t pMaturityPreferencesCallback);
private:
bool mIsDoSendMaturityPreferenceToServer;
maturity_preferences_callback_t mMaturityPreferenceConfirmCallback;
unsigned int mMaturityPreferenceRequestId;
unsigned int mMaturityPreferenceResponseId;
unsigned int mMaturityPreferenceNumRetries;
U8 mLastKnownRequestMaturity;
U8 mLastKnownResponseMaturity;
void sendMaturityPreferenceToServer(U8 pPreferredMaturity);
friend class LLMaturityPreferencesResponder;
void handlePreferredMaturityResult(U8 pServerMaturity);
void handlePreferredMaturityError();
void reportPreferredMaturityError();
// Maturity callbacks for PreferredMaturity control variable
void handleMaturity(const LLSD& newvalue);
void handleMaturity(const LLSD &pNewValue);
bool validateMaturity(const LLSD& newvalue);

View File

@ -33,8 +33,7 @@ LLAgentAccess::LLAgentAccess(LLControlGroup& savedSettings) :
mSavedSettings(savedSettings),
mAccess(SIM_ACCESS_PG),
mAdminOverride(false),
mGodLevel(GOD_NOT),
mAOTransition(false)
mGodLevel(GOD_NOT)
{
}
@ -133,18 +132,6 @@ bool LLAgentAccess::isAdult() const
return mAccess >= SIM_ACCESS_ADULT;
}
void LLAgentAccess::setTeen(bool teen)
{
if (teen)
{
mAccess = SIM_ACCESS_PG;
}
else
{
mAccess = SIM_ACCESS_MATURE;
}
}
//static
int LLAgentAccess::convertTextToMaturity(char text)
{
@ -182,16 +169,6 @@ void LLAgentAccess::setMaturity(char text)
mSavedSettings.setU32("PreferredMaturity", preferred_access);
}
void LLAgentAccess::setTransition()
{
mAOTransition = true;
}
bool LLAgentAccess::isInTransition() const
{
return mAOTransition;
}
bool LLAgentAccess::canSetMaturity(S32 maturity)
{
if (isGodlike()) // Gods can always set their Maturity level

View File

@ -59,13 +59,10 @@ public:
bool isMature() const;
bool isAdult() const;
void setTeen(bool teen);
void setMaturity(char text);
static int convertTextToMaturity(char text);
void setTransition(); // sets the transition bit, which defaults to false
bool isInTransition() const;
bool canSetMaturity(S32 maturity);
private:
@ -73,13 +70,6 @@ private:
U8 mGodLevel;
bool mAdminOverride;
// this should be deleted after the 60-day AO transition.
// It should be safe to remove it in Viewer 2009
// It's set by a special short-term flag in login.cgi
// called ao_transition. When that's gone, this can go, along with
// all of the code that depends on it.
bool mAOTransition;
LLControlGroup& mSavedSettings;
};

View File

@ -51,6 +51,9 @@
#include "llviewerregion.h"
#include "lluictrlfactory.h"
#include "llviewerwindow.h"
#ifndef STINSON_ADULT_CHECK_HACK
#include "llviewercontrol.h"
#endif // STINSON_ADULT_CHECK_HACK
LLFloaterBuyContents::LLFloaterBuyContents(const LLSD& key)
: LLFloater(key)
@ -64,7 +67,11 @@ BOOL LLFloaterBuyContents::postBuild()
getChild<LLUICtrl>("buy_btn")->setCommitCallback( boost::bind(&LLFloaterBuyContents::onClickBuy, this));
getChildView("item_list")->setEnabled(FALSE);
#ifndef STINSON_ADULT_CHECK_HACK
getChildView("buy_btn")->setEnabled(gSavedSettings.getBOOL("AdultCheckEnablePurchse"));
#else // STINSON_ADULT_CHECK_HACK
getChildView("buy_btn")->setEnabled(FALSE);
#endif // STINSON_ADULT_CHECK_HACK
getChildView("wear_check")->setEnabled(FALSE);
setDefaultBtn("cancel_btn"); // to avoid accidental buy (SL-43130)
@ -163,7 +170,11 @@ void LLFloaterBuyContents::inventoryChanged(LLViewerObject* obj,
}
// default to turning off the buy button.
#ifndef STINSON_ADULT_CHECK_HACK
getChildView("buy_btn")->setEnabled(gSavedSettings.getBOOL("AdultCheckEnablePurchse"));
#else // STINSON_ADULT_CHECK_HACK
getChildView("buy_btn")->setEnabled(FALSE);
#endif // STINSON_ADULT_CHECK_HACK
LLUUID owner_id;
BOOL is_group_owned;

View File

@ -41,6 +41,9 @@
#include "llweb.h"
#include "llwindow.h"
#include "llappviewer.h"
#ifndef STINSON_ADULT_CHECK_HACK
#include "llviewercontrol.h"
#endif // STINSON_ADULT_CHECK_HACK
static const S32 STANDARD_BUY_AMOUNT = 2000;
static const S32 MINIMUM_BALANCE_AMOUNT = 0;
@ -156,7 +159,11 @@ void LLFloaterBuyCurrencyUI::draw()
}
// disable the Buy button when we are not able to buy
#ifndef STINSON_ADULT_CHECK_HACK
getChildView("buy_btn")->setEnabled(gSavedSettings.getBOOL("AdultCheckEnablePurchse") || mManager.canBuy());
#else // STINSON_ADULT_CHECK_HACK
getChildView("buy_btn")->setEnabled(mManager.canBuy());
#endif // STINSON_ADULT_CHECK_HACK
LLFloater::draw();
}

View File

@ -1305,7 +1305,11 @@ void LLFloaterBuyLandUI::refreshUI()
agrees_to_covenant = check->get();
}
#ifndef STINSON_ADULT_CHECK_HACK
getChildView("buy_btn")->setEnabled(gSavedSettings.getBOOL("AdultCheckEnablePurchse") || (mCanBuy && mSiteValid && willHaveEnough && !mTransaction && agrees_to_covenant));
#else // STINSON_ADULT_CHECK_HACK
getChildView("buy_btn")->setEnabled(mCanBuy && mSiteValid && willHaveEnough && !mTransaction && agrees_to_covenant);
#endif // STINSON_ADULT_CHECK_HACK
}
void LLFloaterBuyLandUI::startBuyPreConfirm()

View File

@ -1865,23 +1865,8 @@ BOOL LLPanelLandOptions::postBuild()
childSetCommitCallback("ShowDirectoryCheck", onCommitAny, this);
if (gAgent.getAgentAccess().isInTransition())
{
// during the AO transition, this combo has an Adult item.
// Post-transition, it goes away. We can remove this conditional
// after the transition and just use the "else" clause.
mCategoryCombo = getChild<LLComboBox>( "land category with adult");
childSetCommitCallback("land category with adult", onCommitAny, this);
}
else
{
// this is the code that should be preserved post-transition
// you could also change the XML to set visibility and enabled true.
mCategoryCombo = getChild<LLComboBox>( "land category");
childSetCommitCallback("land category", onCommitAny, this);
}
mCategoryCombo->setVisible(true);
mCategoryCombo->setEnabled(true);
mCategoryCombo = getChild<LLComboBox>( "land category");
childSetCommitCallback("land category", onCommitAny, this);
mMatureCtrl = getChild<LLCheckBoxCtrl>( "MatureCheck");

View File

@ -435,6 +435,8 @@ BOOL LLFloaterPreference::postBuild()
gSavedSettings.getControl("ChatBubbleOpacity")->getSignal()->connect(boost::bind(&LLFloaterPreference::onNameTagOpacityChange, this, _2));
gSavedSettings.getControl("PreferredMaturity")->getSignal()->connect(boost::bind(&LLFloaterPreference::onChangeMaturity, this));
LLTabContainer* tabcontainer = getChild<LLTabContainer>("pref core");
if (!tabcontainer->selectTab(gSavedSettings.getS32("LastPrefTab")))
tabcontainer->selectFirstTab();

View File

@ -251,7 +251,11 @@ void LLSidepanelTaskInfo::disableAll()
mOpenBtn->setEnabled(FALSE);
mPayBtn->setEnabled(FALSE);
#ifndef STINSON_ADULT_CHECK_HACK
mBuyBtn->setEnabled(gSavedSettings.getBOOL("AdultCheckEnablePurchse"));
#else // STINSON_ADULT_CHECK_HACK
mBuyBtn->setEnabled(FALSE);
#endif // STINSON_ADULT_CHECK_HACK
}
void LLSidepanelTaskInfo::refresh()

View File

@ -3211,17 +3211,6 @@ bool process_login_success_response()
gSavedSettings.setU32("PreferredMaturity", preferredMaturity);
}
// During the AO transition, this flag will be true. Then the flag will
// go away. After the AO transition, this code and all the code that
// uses it can be deleted.
text = response["ao_transition"].asString();
if (!text.empty())
{
if (text == "1")
{
gAgent.setAOTransition();
}
}
text = response["start_location"].asString();
if(!text.empty())

View File

@ -338,15 +338,6 @@ static bool handleUploadBakedTexOldChanged(const LLSD& newvalue)
}
static bool handleNumpadControlChanged(const LLSD& newvalue)
{
if (gKeyboard)
{
gKeyboard->setNumpadDistinct(static_cast<LLKeyboard::e_numpad_distinct>(newvalue.asInteger()));
}
return true;
}
static bool handleWLSkyDetailChanged(const LLSD&)
{
if (gSky.mVOWLSkyp.notNull())
@ -645,7 +636,6 @@ void settings_setup_listeners()
gSavedSettings.getControl("RenderUseStreamVBO")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
gSavedSettings.getControl("RenderPreferStreamDraw")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
gSavedSettings.getControl("WLSkyDetail")->getSignal()->connect(boost::bind(&handleWLSkyDetailChanged, _2));
gSavedSettings.getControl("NumpadControl")->getSignal()->connect(boost::bind(&handleNumpadControlChanged, _2));
gSavedSettings.getControl("JoystickAxis0")->getSignal()->connect(boost::bind(&handleJoystickChanged, _2));
gSavedSettings.getControl("JoystickAxis1")->getSignal()->connect(boost::bind(&handleJoystickChanged, _2));
gSavedSettings.getControl("JoystickAxis2")->getSignal()->connect(boost::bind(&handleJoystickChanged, _2));

View File

@ -116,6 +116,9 @@
#include "lltoolgrab.h"
#include "llwindow.h"
#include "boost/unordered_map.hpp"
#ifndef STINSON_ADULT_CHECK_HACK
#include "llviewercontrol.h"
#endif // STINSON_ADULT_CHECK_HACK
using namespace LLVOAvatarDefines;
@ -299,7 +302,6 @@ BOOL enable_buy_land(void*);
void handle_test_male(void *);
void handle_test_female(void *);
void handle_toggle_pg(void*);
void handle_dump_attachments(void *);
void handle_dump_avatar_local_textures(void*);
void handle_debug_avatar_textures(void*);
@ -340,7 +342,11 @@ void LLMenuParcelObserver::changed()
{
gMenuHolder->childSetEnabled("Land Buy Pass", LLPanelLandGeneral::enableBuyPass(NULL));
#ifndef STINSON_ADULT_CHECK_HACK
BOOL buyable = gSavedSettings.getBOOL("AdultCheckEnablePurchse") || enable_buy_land(NULL);
#else // STINSON_ADULT_CHECK_HACK
BOOL buyable = enable_buy_land(NULL);
#endif // STINSON_ADULT_CHECK_HACK
gMenuHolder->childSetEnabled("Land Buy", buyable);
gMenuHolder->childSetEnabled("Buy Land...", buyable);
}
@ -1586,23 +1592,6 @@ class LLAdvancedTestFemale : public view_listener_t
}
};
///////////////
// TOGGLE PG //
///////////////
class LLAdvancedTogglePG : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
handle_toggle_pg(NULL);
return true;
}
};
class LLAdvancedForceParamsToDefault : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@ -3255,6 +3244,12 @@ void append_aggregate(std::string& string, const LLAggregatePermissions& ag_perm
bool enable_buy_object()
{
#ifndef STINSON_ADULT_CHECK_HACK
if (gSavedSettings.getBOOL("AdultCheckEnablePurchse"))
{
return true;
}
#endif // STINSON_ADULT_CHECK_HACK
// In order to buy, there must only be 1 purchaseable object in
// the selection manger.
if(LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() != 1) return false;
@ -5971,6 +5966,12 @@ class LLWorldEnableBuyLand : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
#ifndef STINSON_ADULT_CHECK_HACK
if (gSavedSettings.getBOOL("AdultCheckEnablePurchse"))
{
return true;
}
#endif // STINSON_ADULT_CHECK_HACK
bool new_value = LLViewerParcelMgr::getInstance()->canAgentBuyParcel(
LLViewerParcelMgr::getInstance()->selectionEmpty()
? LLViewerParcelMgr::getInstance()->getAgentParcel()
@ -6670,15 +6671,6 @@ void handle_test_female(void*)
//gGestureList.requestResetFromServer( FALSE );
}
void handle_toggle_pg(void*)
{
gAgent.setTeen( !gAgent.isTeen() );
LLFloaterWorldMap::reloadIcons(NULL);
llinfos << "PG status set to " << (S32)gAgent.isTeen() << llendl;
}
void handle_dump_attachments(void*)
{
if(!isAgentAvatarValid()) return;
@ -8239,7 +8231,6 @@ void initialize_menus()
view_listener_t::addMenu(new LLAdvancedTestMale(), "Advanced.TestMale");
view_listener_t::addMenu(new LLAdvancedTestFemale(), "Advanced.TestFemale");
view_listener_t::addMenu(new LLAdvancedTogglePG(), "Advanced.TogglePG");
// Advanced > Character (toplevel)
view_listener_t::addMenu(new LLAdvancedForceParamsToDefault(), "Advanced.ForceParamsToDefault");

View File

@ -42,6 +42,7 @@
#include "llinventorydefines.h"
#include "lllslconstants.h"
#include "llregionhandle.h"
#include "llsd.h"
#include "llsdserialize.h"
#include "llteleportflags.h"
#include "lltransactionflags.h"
@ -107,6 +108,7 @@
#include "llagentui.h"
#include "llpanelblockedlist.h"
#include "llpanelplaceprofile.h"
#include "llviewerregion.h"
#include <boost/algorithm/string/split.hpp> //
#include <boost/regex.hpp>
@ -5389,23 +5391,114 @@ static void process_money_balance_reply_extended(LLMessageSystem* msg)
}
}
void handle_maturity_preference_change_and_reteleport(U8 pActualMaturityRating, U8 pRequestedMaturityRating)
{
bool isMaturityPreferenceElevated = false;
switch (pActualMaturityRating)
{
case SIM_ACCESS_MIN :
switch (pRequestedMaturityRating)
{
case SIM_ACCESS_MIN :
isMaturityPreferenceElevated = true;
break;
case SIM_ACCESS_PG :
case SIM_ACCESS_MATURE :
case SIM_ACCESS_ADULT :
default :
isMaturityPreferenceElevated = false;
break;
}
break;
case SIM_ACCESS_PG :
switch (pRequestedMaturityRating)
{
case SIM_ACCESS_MIN :
case SIM_ACCESS_PG :
isMaturityPreferenceElevated = true;
break;
case SIM_ACCESS_MATURE :
case SIM_ACCESS_ADULT :
default :
isMaturityPreferenceElevated = false;
break;
}
break;
case SIM_ACCESS_MATURE :
switch (pRequestedMaturityRating)
{
case SIM_ACCESS_MIN :
case SIM_ACCESS_PG :
case SIM_ACCESS_MATURE :
isMaturityPreferenceElevated = true;
break;
case SIM_ACCESS_ADULT :
default :
isMaturityPreferenceElevated = false;
break;
}
break;
case SIM_ACCESS_ADULT :
switch (pRequestedMaturityRating)
{
case SIM_ACCESS_MIN :
case SIM_ACCESS_PG :
case SIM_ACCESS_MATURE :
case SIM_ACCESS_ADULT :
isMaturityPreferenceElevated = true;
break;
default :
isMaturityPreferenceElevated = false;
break;
}
break;
default :
isMaturityPreferenceElevated = false;
break;
}
bool handle_special_notification_callback(const LLSD& notification, const LLSD& response)
if (isMaturityPreferenceElevated)
{
gAgent.setMaturityRatingChangeDuringTeleport(pActualMaturityRating);
gAgent.restartFailedTeleportRequest();
}
else
{
LLSD args;
args["RATING"] = LLViewerRegion::accessToString(pRequestedMaturityRating);
LLNotificationsUtil::add("MaturityCouldNotBeChanged", args);
gAgent.clearFailedTeleportRequest();
}
}
bool handle_prompt_for_maturity_level_change_callback(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (0 == option)
{
// set the preference to the maturity of the region we're calling
int preferredMaturity = notification["payload"]["_region_access"].asInteger();
gSavedSettings.setU32("PreferredMaturity", preferredMaturity);
gAgent.sendMaturityPreferenceToServer(preferredMaturity);
U8 preferredMaturity = static_cast<U8>(notification["payload"]["_region_access"].asInteger());
gSavedSettings.setU32("PreferredMaturity", static_cast<U32>(preferredMaturity));
}
return false;
}
// notify user that the maturity preference has been changed
LLSD args;
args["RATING"] = LLViewerRegion::accessToString(preferredMaturity);
LLNotificationsUtil::add("PreferredMaturityChanged", args);
bool handle_prompt_for_maturity_level_change_and_reteleport_callback(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (0 == option)
{
// set the preference to the maturity of the region we're calling
U8 preferredMaturity = static_cast<U8>(notification["payload"]["_region_access"].asInteger());
gAgent.setMaturityPreferenceAndConfirm(static_cast<U32>(preferredMaturity), boost::bind(&handle_maturity_preference_change_and_reteleport, _1, preferredMaturity));
}
else
{
gAgent.clearFailedTeleportRequest();
}
return false;
@ -5414,39 +5507,86 @@ bool handle_special_notification_callback(const LLSD& notification, const LLSD&
// some of the server notifications need special handling. This is where we do that.
bool handle_special_notification(std::string notificationID, LLSD& llsdBlock)
{
int regionAccess = llsdBlock["_region_access"].asInteger();
llsdBlock["REGIONMATURITY"] = LLViewerRegion::accessToString(regionAccess);
// we're going to throw the LLSD in there in case anyone ever wants to use it
LLNotificationsUtil::add(notificationID+"_Notify", llsdBlock);
U8 regionAccess = static_cast<U8>(llsdBlock["_region_access"].asInteger());
std::string regionMaturity = LLViewerRegion::accessToString(regionAccess);
LLStringUtil::toLower(regionMaturity);
llsdBlock["REGIONMATURITY"] = regionMaturity;
bool returnValue = false;
LLNotificationPtr maturityLevelNotification;
std::string notifySuffix = "_Notify";
if (regionAccess == SIM_ACCESS_MATURE)
{
if (gAgent.isTeen())
{
LLNotificationsUtil::add(notificationID+"_KB", llsdBlock);
return true;
gAgent.clearFailedTeleportRequest();
maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_AdultsOnlyContent", llsdBlock);
returnValue = true;
notifySuffix = "_NotifyAdultsOnly";
}
else if (gAgent.prefersPG())
{
LLNotificationsUtil::add(notificationID+"_Change", llsdBlock, llsdBlock, handle_special_notification_callback);
return true;
if ((LLStringUtil::compareStrings(notificationID, "RegionEntryAccessBlocked") == 0) &&
gAgent.hasRestartableFailedTeleportRequest())
{
maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_ChangeAndReTeleport", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_and_reteleport_callback);
returnValue = true;
}
else
{
gAgent.clearFailedTeleportRequest();
maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_Change", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_callback);
returnValue = true;
}
}
else if (LLStringUtil::compareStrings(notificationID, "RegionEntryAccessBlocked") == 0)
{
gAgent.clearFailedTeleportRequest();
maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_PreferencesOutOfSync", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_callback);
returnValue = true;
}
}
else if (regionAccess == SIM_ACCESS_ADULT)
{
if (!gAgent.isAdult())
{
LLNotificationsUtil::add(notificationID+"_KB", llsdBlock);
return true;
gAgent.clearFailedTeleportRequest();
maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_AdultsOnlyContent", llsdBlock);
returnValue = true;
notifySuffix = "_NotifyAdultsOnly";
}
else if (gAgent.prefersPG() || gAgent.prefersMature())
{
LLNotificationsUtil::add(notificationID+"_Change", llsdBlock, llsdBlock, handle_special_notification_callback);
return true;
if ((LLStringUtil::compareStrings(notificationID, "RegionEntryAccessBlocked") == 0) &&
gAgent.hasRestartableFailedTeleportRequest())
{
maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_ChangeAndReTeleport", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_and_reteleport_callback);
returnValue = true;
}
else
{
gAgent.clearFailedTeleportRequest();
maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_Change", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_callback);
returnValue = true;
}
}
else if (LLStringUtil::compareStrings(notificationID, "RegionEntryAccessBlocked") == 0)
{
gAgent.clearFailedTeleportRequest();
maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_PreferencesOutOfSync", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_callback);
returnValue = true;
}
}
return false;
if ((maturityLevelNotification == NULL) || maturityLevelNotification->isIgnored())
{
// Given a simple notification if no maturityLevelNotification is set or it is ignore
LLNotificationsUtil::add(notificationID + notifySuffix, llsdBlock);
}
return returnValue;
}
bool attempt_standard_notification(LLMessageSystem* msgsystem)
@ -5490,16 +5630,20 @@ bool attempt_standard_notification(LLMessageSystem* msgsystem)
RegionEntryAccessBlocked
RegionEntryAccessBlocked_Notify
RegionEntryAccessBlocked_NotifyAdultsOnly
RegionEntryAccessBlocked_Change
RegionEntryAccessBlocked_KB
RegionEntryAccessBlocked_AdultsOnlyContent
RegionEntryAccessBlocked_ChangeAndReTeleport
LandClaimAccessBlocked
LandClaimAccessBlocked_Notify
LandClaimAccessBlocked_NotifyAdultsOnly
LandClaimAccessBlocked_Change
LandClaimAccessBlocked_KB
LandClaimAccessBlocked_AdultsOnlyContent
LandBuyAccessBlocked
LandBuyAccessBlocked_Notify
LandBuyAccessBlocked_NotifyAdultsOnly
LandBuyAccessBlocked_Change
LandBuyAccessBlocked_KB
LandBuyAccessBlocked_AdultsOnlyContent
-----------------------------------------------------------------------*/
if (handle_special_notification(notificationID, llsdBlock))
@ -5551,6 +5695,30 @@ void process_alert_message(LLMessageSystem *msgsystem, void **user_data)
}
}
bool handle_not_age_verified_alert(const std::string &pAlertName)
{
LLNotificationPtr notification = LLNotificationsUtil::add(pAlertName);
if ((notification == NULL) || notification->isIgnored())
{
LLNotificationsUtil::add(pAlertName + "_Notify");
}
return true;
}
bool handle_special_alerts(const std::string &pAlertName)
{
bool isHandled = false;
if (LLStringUtil::compareStrings(pAlertName, "NotAgeVerified") == 0)
{
isHandled = handle_not_age_verified_alert(pAlertName);
}
return isHandled;
}
void process_alert_core(const std::string& message, BOOL modal)
{
// HACK -- handle callbacks for specific alerts. It also is localized in notifications.xml
@ -5574,7 +5742,10 @@ void process_alert_core(const std::string& message, BOOL modal)
// Allow the server to spawn a named alert so that server alerts can be
// translated out of English.
std::string alert_name(message.substr(ALERT_PREFIX.length()));
LLNotificationsUtil::add(alert_name);
if (!handle_special_alerts(alert_name))
{
LLNotificationsUtil::add(alert_name);
}
}
else if (message.find(NOTIFY_PREFIX) == 0)
{
@ -6151,6 +6322,9 @@ void process_teleport_failed(LLMessageSystem *msg, void**)
std::string big_reason;
LLSD args;
// Let the interested parties know that teleport failed.
LLViewerParcelMgr::getInstance()->onTeleportFailed();
// if we have additional alert data
if (msg->has(_PREHASH_AlertInfo) && msg->getSizeFast(_PREHASH_AlertInfo, _PREHASH_Message) > 0)
{
@ -6209,9 +6383,6 @@ void process_teleport_failed(LLMessageSystem *msg, void**)
LLNotificationsUtil::add("CouldNotTeleportReason", args);
// Let the interested parties know that teleport failed.
LLViewerParcelMgr::getInstance()->onTeleportFailed();
if( gAgent.getTeleportState() != LLAgent::TELEPORT_NONE )
{
gAgent.setTeleportState( LLAgent::TELEPORT_NONE );

View File

@ -654,6 +654,31 @@ std::string LLViewerRegion::accessToShortString(U8 sim_access)
}
}
// static
U8 LLViewerRegion::shortStringToAccess(const std::string &sim_access)
{
U8 accessValue;
if (LLStringUtil::compareStrings(sim_access, "PG") == 0)
{
accessValue = SIM_ACCESS_PG;
}
else if (LLStringUtil::compareStrings(sim_access, "M") == 0)
{
accessValue = SIM_ACCESS_MATURE;
}
else if (LLStringUtil::compareStrings(sim_access, "A") == 0)
{
accessValue = SIM_ACCESS_ADULT;
}
else
{
accessValue = SIM_ACCESS_MIN;
}
return accessValue;
}
// static
void LLViewerRegion::processRegionInfo(LLMessageSystem* msg, void**)
{

View File

@ -202,6 +202,7 @@ public:
// Returns "M", "PG", "A" etc.
static std::string accessToShortString(U8 sim_access);
static U8 shortStringToAccess(const std::string &sim_access);
// Return access icon name
static std::string getAccessIcon(U8 sim_access);

View File

@ -1700,9 +1700,6 @@ LLViewerWindow::LLViewerWindow(const Params& p)
// Can't have spaces in settings.ini strings, so use underscores instead and convert them.
LLStringUtil::replaceChar(mOverlayTitle, '_', ' ');
// sync the keyboard's setting with the saved setting
gSavedSettings.getControl("NumpadControl")->firePropertyChanged();
mDebugText = new LLDebugText(this);
mWorldViewRectScaled = calcScaledRect(mWorldViewRectRaw, mDisplayScale);

View File

@ -1354,79 +1354,13 @@ Only large parcels can be listed in search.
top="150"
width="430" />
<combo_box
enabled="false"
height="23"
layout="topleft"
left="20"
top="194"
name="land category with adult"
visible="false"
width="140">
<combo_box.item
label="Any Category"
name="item0"
value="any" />
<combo_box.item
label="Linden Location"
name="item1"
value="linden" />
<combo_box.item
label="Adult"
name="item2"
value="adult" />
<combo_box.item
label="Arts &amp; Culture"
name="item3"
value="arts" />
<combo_box.item
label="Business"
name="item4"
value="store" />
<combo_box.item
label="Educational"
name="item5"
value="educational" />
<combo_box.item
label="Gaming"
name="item6"
value="game" />
<combo_box.item
label="Hangout"
name="item7"
value="gather" />
<combo_box.item
label="Newcomer Friendly"
name="item8"
value="newcomer" />
<combo_box.item
label="Parks &amp; Nature"
name="item9"
value="park" />
<combo_box.item
label="Residential"
name="item10"
value="home" />
<combo_box.item
label="Shopping"
name="item11"
value="shopping" />
<combo_box.item
label="Rental"
name="item13"
value="rental" />
<combo_box.item
label="Other"
name="item12"
value="other" />
</combo_box>
<combo_box
enabled="false"
enabled="true"
height="23"
layout="topleft"
left="20"
top="194"
name="land category"
visible="false"
visible="true"
width="140">
<combo_box.item
label="Any Category"
@ -1989,11 +1923,11 @@ Only large parcels can be listed in search.
<check_box
follows="top|left"
height="16"
label="Have been age-verified [ESTATE_AGE_LIMIT]"
label="Are age 18 or older [ESTATE_AGE_LIMIT]"
layout="topleft"
left_delta="0"
name="limit_age_verified"
tool_tip="Residents must be age verified to access this parcel. See the [SUPPORT_SITE] for more information."
tool_tip="Residents must be age 18 or older to access this parcel. See the [SUPPORT_SITE] for more information."
top_pad="4"
width="278" />
<check_box

View File

@ -3098,12 +3098,6 @@
<menu_item_call.on_click
function="Advanced.TestFemale" />
</menu_item_call>
<menu_item_call
label="Toggle PG"
name="Toggle PG">
<menu_item_call.on_click
function="Advanced.TogglePG" />
</menu_item_call>
<menu_item_check
label="Allow Select Avatar"
name="Allow Select Avatar">

View File

@ -4070,9 +4070,7 @@ Are you sure you want to change the Estate Covenant?
name="RegionEntryAccessBlocked"
type="alertmodal">
<tag>fail</tag>
You are not allowed in that Region due to your maturity Rating. This may be a result of a lack of information validating your age.
Please verify you have the latest Viewer installed, and go to the Knowledge Base for details on accessing areas with this maturity rating.
The region you're trying to visit contains content exceeding your current preferences. You can change your preferences using Me &gt; Preferences &gt; General.
<usetemplate
name="okbutton"
yestext="OK"/>
@ -4080,13 +4078,11 @@ Please verify you have the latest Viewer installed, and go to the Knowledge Base
<notification
icon="alertmodal.tga"
name="RegionEntryAccessBlocked_KB"
name="RegionEntryAccessBlocked_AdultsOnlyContent"
type="alertmodal">
<tag>fail</tag>
<tag>confirm</tag>
You are not allowed in that region due to your maturity Rating.
Go to the Knowledge Base for more information about maturity Ratings?
The region you're trying to visit contains [REGIONMATURITY] content, which is accessible to adults only.
<url option="0" name="url">
http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
</url>
@ -4094,7 +4090,7 @@ Go to the Knowledge Base for more information about maturity Ratings?
name="okcancelignore"
yestext="Go to Knowledge Base"
notext="Close"
ignoretext="I can&apos;t enter this Region, due to restrictions of the maturity Rating"/>
ignoretext="The region you&apos;re trying to visit contains content, which is accessible to adults only."/>
</notification>
<notification
@ -4102,47 +4098,109 @@ Go to the Knowledge Base for more information about maturity Ratings?
name="RegionEntryAccessBlocked_Notify"
type="notifytip">
<tag>fail</tag>
You are not allowed in that region due to your maturity Rating.
The region you're trying to visit contains [REGIONMATURITY] content, but your current preferences are set to exclude [REGIONMATURITY] content.
</notification>
<notification
icon="notifytip.tga"
name="RegionEntryAccessBlocked_NotifyAdultsOnly"
type="notifytip">
<tag>fail</tag>
The region you're trying to visit contains content, which is accessible to adults only.
</notification>
<notification
icon="alertmodal.tga"
name="RegionEntryAccessBlocked_ChangeAndReTeleport"
type="alertmodal">
<tag>fail</tag>
<tag>confirm</tag>
The region you're trying to visit contains [REGIONMATURITY] content, but your current preferences are set to exclude [REGIONMATURITY] content. We can change your preferences and continue with the teleport, or you can cancel this teleport.
<form name="form">
<button
index="0"
name="OK"
text="Change and continue"/>
<button
default="true"
index="1"
name="Cancel"
text="Cancel"/>
<ignore name="ignore" text="The region you&apos;re trying to visit contains content excluded by your preferences. We can change your preferences and continue with the teleport."/>
</form>
</notification>
<notification
icon="alertmodal.tga"
name="RegionEntryAccessBlocked_Change"
type="alertmodal">
<tag>fail</tag>
<tag>fail</tag>
<tag>confirm</tag>
You are not allowed in that Region due to your maturity Rating preference.
To enter the desired region, please change your maturity Rating preference. This will allow you to search for and access [REGIONMATURITY] content. To undo any changes, go to Me &gt; Preferences &gt; General.
<form name="form">
The region you're trying to visit contains [REGIONMATURITY] content, but your current preferences are set to exclude [REGIONMATURITY] content. We can change your preferences, or you can cancel the teleport. After your preferences are changed, you will need to attempt the teleport again.
<form name="form">
<button
index="0"
name="OK"
text="Change Preference"/>
<button
text="Change preferences"/>
<button
default="true"
index="1"
name="Cancel"
text="Close"/>
<ignore name="ignore" text="My chosen Rating preference prevents me from entering a Region"/>
text="Cancel"/>
<ignore name="ignore" text="The region you&apos;re trying to visit contains content excluded by your preferences. We can change your preferences. Then, you will need to attempt the teleport again."/>
</form>
</notification>
<notification
icon="notifytip.tga"
icon="alertmodal.tga"
name="RegionEntryAccessBlocked_PreferencesOutOfSync"
type="alertmodal">
<tag>fail</tag>
We are having technical difficulties with your teleport because your preferences are out of sync with the server.
<usetemplate
name="okbutton"
yestext="OK"/>
</notification>
<notification
icon="alertmodal.tga"
name="PreferredMaturityChanged"
type="notifytip">
Your maturity Rating preference is now [RATING].
type="alertmodal">
You won't receive any more notifications that you're about to visit a region with [RATING] content. You may change your content preferences in the future by using Me &gt; Preferences &gt; General from the menu bar.
<tag>confirm</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
</notification>
<notification
icon="alertmodal.tga"
name="MaturityCouldNotBeChanged"
type="alertmodal">
We were unable to change your preferences to view [RATING] content at this time. Please change your preferences by using Me &gt; Preferences &gt; General from the menu bar, and then attempt your teleport again.
<tag>confirm</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
</notification>
<notification
icon="alertmodal.tga"
name="MaturityChangeError"
type="alertmodal">
We were unable to change your preferences to view [PREFERRED_MATURITY] content at this time. Your preferences have been reset to view [ACTUAL_MATURITY] content. You may attempt to change your preferences again by using Me &gt; Preferences &gt; General from the menu bar.
<tag>confirm</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
</notification>
<notification
icon="alertmodal.tga"
name="LandClaimAccessBlocked"
type="alertmodal">
You cannot claim this land due to your maturity Rating. This may be a result of a lack of information validating your age.
Please verify you have the latest Viewer installed, and go to the Knowledge Base for details on accessing areas with this maturity rating.
<tag>fail</tag>
The land you're trying to claim has a maturity rating exceeding your current preferences. You can change your preferences using Me &gt; Preferences &gt; General.
<tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@ -4150,12 +4208,10 @@ Please verify you have the latest Viewer installed, and go to the Knowledge Base
<notification
icon="alertmodal.tga"
name="LandClaimAccessBlocked_KB"
name="LandClaimAccessBlocked_AdultsOnlyContent"
type="alertmodal">
You cannot claim this land due to your maturity Rating.
Go to the Knowledge Base for more information about maturity Ratings?
<tag>fail</tag>
Only adults can claim this land.
<tag>fail</tag>
<tag>confirm</tag>
<url option="0" name="url">
http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
@ -4164,41 +4220,52 @@ Go to the Knowledge Base for more information about maturity Ratings?
name="okcancelignore"
yestext="Go to Knowledge Base"
notext="Close"
ignoretext="I can&apos;t claim this Land, due to restrictions of the maturity Rating"/>
ignoretext="Only adults can claim this land."/>
</notification>
<notification
icon="notifytip.tga"
name="LandClaimAccessBlocked_Notify"
type="notifytip">
You cannot claim this land due to your maturity Rating.
<tag>fail</tag>
The land you're trying to claim contains [REGIONMATURITY] content, but your current preferences are set to exclude [REGIONMATURITY] content.
<tag>fail</tag>
</notification>
<notification
icon="notifytip.tga"
name="LandClaimAccessBlocked_NotifyAdultsOnly"
type="notifytip">
<tag>fail</tag>
The land you're trying to claim contains content, which is accessible to adults only.
</notification>
<notification
icon="alertmodal.tga"
name="LandClaimAccessBlocked_Change"
type="alertmodal">
You cannot claim this land due to your maturity Rating preference.
You can click &apos;Change Preference&apos; to raise your maturity Rating preference now and allow you to enter. You will be able to search and access [REGIONMATURITY] content from now on. If you later want to change this setting back, go to Me &gt; Preferences &gt; General.
The land you're trying to claim contains [REGIONMATURITY] content, but your current preferences are set to exclude [REGIONMATURITY] content. We can change your preferences, then you can try claiming the land again.
<tag>fail</tag>
<tag>confirm</tag>
<usetemplate
name="okcancelignore"
yestext="Change Preference"
notext="Close"
ignoretext="My chosen Rating preference prevents me from claiming Land"/>
<form name="form">
<button
index="0"
name="OK"
text="Change preferences"/>
<button
default="true"
index="1"
name="Cancel"
text="Cancel"/>
<ignore name="ignore" text="The land you&apos;re trying to claim contains content excluded by your preferences."/>
</form>
</notification>
<notification
icon="alertmodal.tga"
name="LandBuyAccessBlocked"
type="alertmodal">
You cannot buy this land due to your maturity Rating. This may be a result of a lack of information validating your age.
Please verify you have the latest Viewer installed, and go to the Knowledge Base for details on accessing areas with this maturity rating.
<tag>fail</tag>
The land you're trying to buy has a maturity rating exceeding your current preferences. You can change your preferences using Me &gt; Preferences &gt; General.
<tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@ -4206,11 +4273,9 @@ Please verify you have the latest Viewer installed, and go to the Knowledge Base
<notification
icon="alertmodal.tga"
name="LandBuyAccessBlocked_KB"
name="LandBuyAccessBlocked_AdultsOnlyContent"
type="alertmodal">
You cannot buy this land due to your maturity Rating.
Go to the Knowledge Base for more information about maturity Ratings?
Only adults can buy this land.
<tag>confirm</tag>
<tag>fail</tag>
<url option="0" name="url">
@ -4220,31 +4285,44 @@ Go to the Knowledge Base for more information about maturity Ratings?
name="okcancelignore"
yestext="Go to Knowledge Base"
notext="Close"
ignoretext="I can&apos;t buy this Land, due to restrictions of the maturity Rating"/>
ignoretext="Only adults can buy this land."/>
</notification>
<notification
icon="notifytip.tga"
name="LandBuyAccessBlocked_Notify"
type="notifytip">
You cannot buy this land due to your maturity Rating.
<tag>fail</tag>
The land you're trying to buy contains [REGIONMATURITY] content, but your current preferences are set to exclude [REGIONMATURITY] content.
<tag>fail</tag>
</notification>
<notification
icon="notifytip.tga"
name="LandBuyAccessBlocked_NotifyAdultsOnly"
type="notifytip">
<tag>fail</tag>
The land you're trying to buy contains content, which is accessible to adults only.
</notification>
<notification
icon="alertmodal.tga"
name="LandBuyAccessBlocked_Change"
type="alertmodal">
You cannot buy this land due to your maturity Rating preference.
You can click &apos;Change Preference&apos; to raise your maturity Rating preference now and allow you to enter. You will be able to search and access [REGIONMATURITY] content from now on. If you later want to change this setting back, go to Me &gt; Preferences &gt; General.
The land you're trying to buy contains [REGIONMATURITY] content, but your current preferences are set to exclude [REGIONMATURITY] content. We can change your preferences, then you can try buying the land again.
<tag>confirm</tag>
<tag>fail</tag>
<usetemplate
name="okcancelignore"
yestext="Change Preference"
notext="Close"
ignoretext="My chosen Rating preference prevents me from buying Land"/>
<form name="form">
<button
index="0"
name="OK"
text="Change preferences"/>
<button
default="true"
index="1"
name="Cancel"
text="Cancel"/>
<ignore name="ignore" text="The land you&apos;re trying to buy contains content excluded by your preferences."/>
</form>
</notification>
<notification
@ -4399,10 +4477,11 @@ Type a short announcement which will be sent to everyone in this region.
label="Changed Region Maturity"
name="RegionMaturityChange"
type="alertmodal">
The maturity rating for this region has been updated.
It may take some time for the change to be reflected on the map.
To enter Adult regions, Residents must be Account Verified, either by age-verification or payment-verification.
The maturity rating for this region has been changed.
It may take some time for this change to be reflected on the map.
<usetemplate
name="okbutton"
yestext="OK"/>
</notification>
<notification
@ -5108,20 +5187,20 @@ Would you like to automatically wear the clothing you are about to create?
icon="alertmodal.tga"
name="NotAgeVerified"
type="alertmodal">
<tag>fail</tag>
To access adult content and areas in Second Life you must be at least 18 years old. Please visit our age verification page to confirm you are over 18.
Note this will launch your web browser.
[_URL]
<tag>confirm</tag>
<url option="0" name="url">
https://secondlife.com/my/account/verification.php
</url>
The location you're trying to visit is restricted to residents age 18 and over.
<tag>fail</tag>
<usetemplate
ignoretext="I have not verified my age"
name="okcancelignore"
notext="Cancel"
yestext="Go to Age Verification"/>
ignoretext="I am not old enough to visit age restricted areas."
name="okignore"
yestext="OK"/>
</notification>
<notification
icon="notifytip.tga"
name="NotAgeVerified_Notify"
type="notifytip">
Location restricted to age 18 and over.
<tag>fail</tag>
</notification>
<notification
@ -5268,7 +5347,7 @@ Terrain.raw downloaded
icon="notifytip.tga"
name="GestureMissing"
type="notifytip">
Hmm. Gesture [NAME] is missing from the database.
Gesture [NAME] is missing from the database.
<tag>fail</tag>
</notification>
@ -5806,9 +5885,7 @@ You can only claim public land in the Region you&apos;re in.
persist="true"
type="notify">
<tag>fail</tag>
You aren&apos;t allowed in that Region due to your maturity Rating. You may need to validate your age and/or install the latest Viewer.
Please go to the Knowledge Base for details on accessing areas with this maturity Rating.
The region you're trying to visit contains content exceeding your current preferences. You can change your preferences using Me &gt; Preferences &gt; General.
</notification>
<notification
@ -5840,11 +5917,11 @@ You do not have proper payment status to enter this region.
<notification
icon="notify.tga"
name="MustGetAgeRgion"
name="MustGetAgeRegion"
persist="true"
type="notify">
<tag>fail</tag>
You must be age-verified to enter this region.
You must be age 18 or over to enter this region.
</notification>
<notification
@ -5853,7 +5930,7 @@ You must be age-verified to enter this region.
persist="true"
type="notify">
<tag>fail</tag>
You must be age-verified to enter this parcel.
You must be age 18 or over to enter this parcel.
</notification>
<notification

View File

@ -149,11 +149,11 @@
<check_box
follows="top|left"
height="16"
label="Have been age-verified"
label="Are age 18 or older"
layout="topleft"
left_delta="0"
name="limit_age_verified"
tool_tip="Residents must be age verified to access this estate. See the [SUPPORT_SITE] for more information."
tool_tip="Residents must be age 18 or older to access this estate. See the [SUPPORT_SITE] for more information."
top_pad="2"
width="278" />

View File

@ -45,6 +45,9 @@ Go to &apos;Welcome Island Public&apos; to repeat the tutorial.
<message name="no_inventory_host">
The inventory system is currently unavailable.
</message>
<message name="MustGetAgeRegion">
You must be age 18 or over to enter this region.
</message>
</message_set>
<message_set name="progress">
<message name="sending_dest">

View File

@ -111,18 +111,6 @@ namespace tut
ensure("1 isMature", !aa.isMature());
ensure("1 isAdult", !aa.isAdult());
// this is kinda bad -- setting this forces maturity to MATURE but !teen != Mature anymore
aa.setTeen(false);
ensure("2 isTeen", !aa.isTeen());
ensure("2 isMature", aa.isMature());
ensure("2 isAdult", !aa.isAdult());
// have to flip it back and make sure it still works
aa.setTeen(true);
ensure("3 isTeen", aa.isTeen());
ensure("3 isMature", !aa.isMature());
ensure("3 isAdult", !aa.isAdult());
// check the conversion routine
ensure_equals("1 conversion", SIM_ACCESS_PG, aa.convertTextToMaturity('P'));
ensure_equals("2 conversion", SIM_ACCESS_MATURE, aa.convertTextToMaturity('M'));
@ -131,21 +119,21 @@ namespace tut
// now try the other method of setting it - PG
aa.setMaturity('P');
ensure("4 isTeen", aa.isTeen());
ensure("4 isMature", !aa.isMature());
ensure("4 isAdult", !aa.isAdult());
ensure("2 isTeen", aa.isTeen());
ensure("2 isMature", !aa.isMature());
ensure("2 isAdult", !aa.isAdult());
// Mature
aa.setMaturity('M');
ensure("5 isTeen", !aa.isTeen());
ensure("5 isMature", aa.isMature());
ensure("5 isAdult", !aa.isAdult());
ensure("3 isTeen", !aa.isTeen());
ensure("3 isMature", aa.isMature());
ensure("3 isAdult", !aa.isAdult());
// Adult
aa.setMaturity('A');
ensure("6 isTeen", !aa.isTeen());
ensure("6 isMature", aa.isMature());
ensure("6 isAdult", aa.isAdult());
ensure("4 isTeen", !aa.isTeen());
ensure("4 isMature", aa.isMature());
ensure("4 isAdult", aa.isAdult());
}
@ -239,18 +227,6 @@ namespace tut
cgr.declareU32("PreferredMaturity", SIM_ACCESS_PG, "declared_for_test", FALSE);
LLAgentAccess aa(cgr);
ensure("1 transition starts false", !aa.isInTransition());
aa.setTransition();
ensure("2 transition now true", aa.isInTransition());
}
template<> template<>
void agentaccess_object_t::test<6>()
{
LLControlGroup cgr("test");
cgr.declareU32("PreferredMaturity", SIM_ACCESS_PG, "declared_for_test", FALSE);
LLAgentAccess aa(cgr);
cgr.setU32("PreferredMaturity", SIM_ACCESS_ADULT);
aa.setMaturity('M');
ensure("1 preferred maturity pegged to M when maturity is M", cgr.getU32("PreferredMaturity") == SIM_ACCESS_MATURE);