Commits

Scott Lawrence  committed 83c2147 Merge

merge changes for storm-1491

  • Participants
  • Parent commits be1506b, 0ccdf3e

Comments (0)

Files changed (43)

File .hgtags

File contents unchanged.
 viewer-asset-delivery-metrics.build_server = false
 viewer-asset-delivery-metrics.build_server_tests = false
 
+# ========================================
+# Simon says
+# ========================================
+simon_viewer-dev-private.public_build = false
+
+
 # eof

File indra/llinventory/llparcel.cpp

 
 	setPreviousOwnerID(LLUUID::null);
 	setPreviouslyGroupOwned(FALSE);
+
+	setSeeAVs(TRUE);
+	setAllowGroupAVSounds(TRUE);
+	setAllowAnyAVSounds(TRUE);
+	setHaveNewParcelLimitData(FALSE);
 }
 
 void LLParcel::overrideOwner(const LLUUID& owner_id, BOOL is_group_owned)
 	msg["user_location"] = ll_sd_from_vector3(mUserLocation);
 	msg["user_look_at"] = ll_sd_from_vector3(mUserLookAt);
 	msg["landing_type"] = (U8)mLandingType;
-
+	msg["see_avs"] = (LLSD::Boolean) getSeeAVs();
+	msg["group_av_sounds"] = (LLSD::Boolean) getAllowGroupAVSounds();
+	msg["any_av_sounds"] = (LLSD::Boolean) getAllowAnyAVSounds();
 }
 
 
     msg->getStringFast( _PREHASH_ParcelData,_PREHASH_MediaURL, buffer );
     setMediaURL(buffer);
     
+	BOOL see_avs = TRUE;			// All default to true for legacy server behavior
+	BOOL any_av_sounds = TRUE;
+	BOOL group_av_sounds = TRUE;
+	bool have_new_parcel_limit_data = (msg->getSizeFast(_PREHASH_ParcelData, _PREHASH_SeeAVs) > 0);		// New version of server should send all 3 of these values
+	have_new_parcel_limit_data &= (msg->getSizeFast(_PREHASH_ParcelData, _PREHASH_AnyAVSounds) > 0);
+	have_new_parcel_limit_data &= (msg->getSizeFast(_PREHASH_ParcelData, _PREHASH_GroupAVSounds) > 0);
+	if (have_new_parcel_limit_data)
+	{
+		msg->getBOOLFast(_PREHASH_ParcelData, _PREHASH_SeeAVs, see_avs);
+		msg->getBOOLFast(_PREHASH_ParcelData, _PREHASH_AnyAVSounds, any_av_sounds);
+		msg->getBOOLFast(_PREHASH_ParcelData, _PREHASH_GroupAVSounds, group_av_sounds);
+	}
+	setSeeAVs((bool) see_avs);
+	setAllowAnyAVSounds((bool) any_av_sounds);
+	setAllowGroupAVSounds((bool) group_av_sounds);
+
+	setHaveNewParcelLimitData(have_new_parcel_limit_data);
+
     // non-optimized version
     msg->getU8 ( "ParcelData", "MediaAutoScale", mMediaAutoScale );
     

File indra/llinventory/llparcel.h

 // unused 0x06
 // unused 0x07
 // flag, unused 0x08
-// flag, unused 0x10
+const U8 PARCEL_HIDDENAVS   = 0x10;	// avatars not visible outside of parcel.  Used for 'see avs' feature, but must be off for compatibility
 const U8 PARCEL_SOUND_LOCAL = 0x20;
 const U8 PARCEL_WEST_LINE	= 0x40;	// flag, property line on west edge
 const U8 PARCEL_SOUTH_LINE	= 0x80;	// flag, property line on south edge
 class LLAccessEntry
 {
 public:
+	LLAccessEntry()
+	:	mID(),
+		mTime(0),
+		mFlags(0)
+	{}
+
 	LLUUID		mID;		// Agent ID
 	S32			mTime;		// Time (unix seconds) when entry expires
 	U32			mFlags;		// Not used - currently should always be zero
 	void setUserLocation(const LLVector3& pos)	{ mUserLocation = pos; }
 	void setUserLookAt(const LLVector3& rot)	{ mUserLookAt = rot; }
 	void setLandingType(const ELandingType type) { mLandingType = type; }
+	void setSeeAVs(BOOL see_avs)	{ mSeeAVs = see_avs;	}
+	void setHaveNewParcelLimitData(bool have_new_parcel_data)		{ mHaveNewParcelLimitData = have_new_parcel_data;		}		// Remove this once hidden AV feature is fully available grid-wide
 
 	void setAuctionID(U32 auction_id) { mAuctionID = auction_id;}
 
 	void	setDenyAnonymous(BOOL b) { setParcelFlag(PF_DENY_ANONYMOUS, b); }
 	void	setDenyAgeUnverified(BOOL b) { setParcelFlag(PF_DENY_AGEUNVERIFIED, b); }
 	void	setRestrictPushObject(BOOL b) { setParcelFlag(PF_RESTRICT_PUSHOBJECT, b); }
+	void	setAllowGroupAVSounds(BOOL b)	{ mAllowGroupAVSounds = b;		}
+	void	setAllowAnyAVSounds(BOOL b)		{ mAllowAnyAVSounds = b;		}
 
 	void	setDrawDistance(F32 dist)	{ mDrawDistance = dist; }
 	void	setSalePrice(S32 price)		{ mSalePrice = price; }
 	const LLVector3& getUserLocation() const	{ return mUserLocation; }
 	const LLVector3& getUserLookAt() const	{ return mUserLookAt; }
 	ELandingType getLandingType() const	{ return mLandingType; }
+	BOOL getSeeAVs() const			{ return mSeeAVs;		}
+	BOOL getHaveNewParcelLimitData() const		{ return mHaveNewParcelLimitData;	}
 
 	// User-specified snapshot
 	const LLUUID&	getSnapshotID() const		{ return mSnapshotID; }
 	BOOL	getRegionDenyAgeUnverifiedOverride() const
 					{ return mRegionDenyAgeUnverifiedOverride; }
 
+	BOOL	getAllowGroupAVSounds()	const	{ return mAllowGroupAVSounds;	} 
+	BOOL	getAllowAnyAVSounds()	const	{ return mAllowAnyAVSounds;		}
+
 	F32		getDrawDistance() const			{ return mDrawDistance; }
 	S32		getSalePrice() const			{ return mSalePrice; }
 	time_t	getClaimDate() const			{ return mClaimDate; }
 	LLVector3 mUserLocation;
 	LLVector3 mUserLookAt;
 	ELandingType mLandingType;
+	BOOL mSeeAVs;							// Avatars on this parcel are visible from outside it
+	BOOL mHaveNewParcelLimitData;			// Remove once hidden AV feature is grid-wide
 	LLTimer mSaleTimerExpires;
 	LLTimer mMediaResetTimer;
 
 	BOOL				mRegionPushOverride;
 	BOOL				mRegionDenyAnonymousOverride;
 	BOOL				mRegionDenyAgeUnverifiedOverride;
+	BOOL				mAllowGroupAVSounds;
+	BOOL				mAllowAnyAVSounds;
 	
 	ParcelQuota			mQuota;
 	

File indra/llinventory/llparcelflags.h

 const S32 PARCEL_DETAILS_OWNER = 2;
 const S32 PARCEL_DETAILS_GROUP = 3;
 const S32 PARCEL_DETAILS_AREA = 4;
+const S32 PARCEL_DETAILS_ID = 5;
+const S32 PARCEL_DETAILS_SEE_AVATARS = 6;
 
 #endif

File indra/llmessage/message_prehash.cpp

 char const* const _PREHASH_FaceIndex = LLMessageStringTable::getInstance()->getString("FaceIndex");
 char const* const _PREHASH_StatusData = LLMessageStringTable::getInstance()->getString("StatusData");
 char const* const _PREHASH_ProductSKU = LLMessageStringTable::getInstance()->getString("ProductSKU");
+char const* const _PREHASH_SeeAVs = LLMessageStringTable::getInstance()->getString("SeeAVs");
+char const* const _PREHASH_AnyAVSounds = LLMessageStringTable::getInstance()->getString("AnyAVSounds");
+char const* const _PREHASH_GroupAVSounds = LLMessageStringTable::getInstance()->getString("GroupAVSounds");

File indra/llmessage/message_prehash.h

 extern char const* const _PREHASH_FaceIndex;
 extern char const* const _PREHASH_StatusData;
 extern char const* const _PREHASH_ProductSKU;
+extern char const* const _PREHASH_SeeAVs;
+extern char const* const _PREHASH_AnyAVSounds;
+extern char const* const _PREHASH_GroupAVSounds;
 #endif

File indra/lscript/lscript_compile/indra.l

 "PARCEL_DETAILS_OWNER"	{ count(); yylval.ival = PARCEL_DETAILS_OWNER; return(INTEGER_CONSTANT); }
 "PARCEL_DETAILS_GROUP"	{ count(); yylval.ival = PARCEL_DETAILS_GROUP; return(INTEGER_CONSTANT); }
 "PARCEL_DETAILS_AREA"	{ count(); yylval.ival = PARCEL_DETAILS_AREA; return(INTEGER_CONSTANT); }
+"PARCEL_DETAILS_ID"		{ count(); yylval.ival = PARCEL_DETAILS_ID; return(INTEGER_CONSTANT); }
+"PARCEL_DETAILS_SEE_AVATARS"	{ count(); yylval.ival = PARCEL_DETAILS_SEE_AVATARS; return(INTEGER_CONSTANT); }
 
 "STRING_TRIM_HEAD"	{ count(); yylval.ival = STRING_TRIM_HEAD; return(INTEGER_CONSTANT); }
 "STRING_TRIM_TAIL"	{ count(); yylval.ival = STRING_TRIM_TAIL; return(INTEGER_CONSTANT); }

File indra/newview/app_settings/keywords.ini

 PARCEL_DETAILS_GROUP	Used with llGetParcelDetails to get the parcel group id.
 PARCEL_DETAILS_AREA		Used with llGetParcelDetails to get the parcel area in square meters.
 PARCEL_DETAILS_ID		Used with llGetParcelDetails to get the parcel id.
+PARCEL_DETAILS_SEE_AVATARS	Used with llGetParcelDetails to get the avatars visibility setting.
 
 STRING_TRIM_HEAD		Used with llStringTrim to trim leading spaces from a string.
 STRING_TRIM_TAIL		Used with llStringTrim to trim trailing spaces from a string.

File indra/newview/llappviewer.cpp

File contents unchanged.

File indra/newview/llfloaterland.cpp

 	mClearBtn(NULL),
 	mMatureCtrl(NULL),
 	mPushRestrictionCtrl(NULL),
+	mSeeAvatarsCtrl(NULL),
 	mParcel(parcel)
 {
 }
 	mPushRestrictionCtrl = getChild<LLCheckBoxCtrl>( "PushRestrictCheck");
 	childSetCommitCallback("PushRestrictCheck", onCommitAny, this);
 
+	mSeeAvatarsCtrl = getChild<LLCheckBoxCtrl>( "SeeAvatarsCheck");
+	childSetCommitCallback("SeeAvatarsCheck", onCommitAny, this);
+
 	mCheckShowDirectory = getChild<LLCheckBoxCtrl>( "ShowDirectoryCheck");
 	childSetCommitCallback("ShowDirectoryCheck", onCommitAny, this);
 
 
 		mCheckEditLand		->set(FALSE);
 		mCheckEditLand		->setEnabled(FALSE);
-
+		
 		mCheckSafe			->set(FALSE);
 		mCheckSafe			->setEnabled(FALSE);
 
 		mPushRestrictionCtrl->set(FALSE);
 		mPushRestrictionCtrl->setEnabled(FALSE);
 
+		mSeeAvatarsCtrl->set(TRUE);
+		mSeeAvatarsCtrl->setEnabled(FALSE);
+
 		mLandingTypeCombo->setCurrentByIndex(0);
 		mLandingTypeCombo->setEnabled(FALSE);
 
 		BOOL can_change_terraform = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_EDIT);
 		mCheckEditLand		->set( parcel->getAllowTerraform() );
 		mCheckEditLand		->setEnabled( can_change_terraform );
-
+		
 		mCheckSafe			->set( !parcel->getAllowDamage() );
 		mCheckSafe			->setEnabled( can_change_options );
 
 			mPushRestrictionCtrl->setEnabled(can_change_options);
 		}
 
+		mSeeAvatarsCtrl->set(parcel->getSeeAVs());
+		mSeeAvatarsCtrl->setLabel(getString("see_avs_text"));
+		mSeeAvatarsCtrl->setEnabled(can_change_options && parcel->getHaveNewParcelLimitData());
+
 		BOOL can_change_landing_point = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, 
 														GP_LAND_SET_LANDING_POINT);
 		mLandingTypeCombo->setCurrentByIndex((S32)parcel->getLandingType());
 	BOOL allow_publish		= FALSE;
 	BOOL mature_publish		= self->mMatureCtrl->get();
 	BOOL push_restriction	= self->mPushRestrictionCtrl->get();
+	BOOL see_avs			= self->mSeeAvatarsCtrl->get();
 	BOOL show_directory		= self->mCheckShowDirectory->get();
 	// we have to get the index from a lookup, not from the position in the dropdown!
 	S32  category_index		= LLParcel::getCategoryFromString(self->mCategoryCombo->getSelectedValue());
 	parcel->setCategory((LLParcel::ECategory)category_index);
 	parcel->setLandingType((LLParcel::ELandingType)landing_type_index);
 	parcel->setSnapshotID(snapshot_id);
+	parcel->setSeeAVs(see_avs);
 
 	// Send current parcel data upstream to server
 	LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate( parcel );

File indra/newview/llfloaterland.h

 
 	LLCheckBoxCtrl		*mMatureCtrl;
 	LLCheckBoxCtrl		*mPushRestrictionCtrl;
+	LLCheckBoxCtrl		*mSeeAvatarsCtrl;
 
 	LLSafeHandle<LLParcelSelection>&	mParcel;
 };

File indra/newview/lllocationinputctrl.cpp

 	scripts_icon("scripts_icon"),
 	damage_icon("damage_icon"),
 	damage_text("damage_text"),
+	see_avatars_icon("see_avatars_icon"),
 	maturity_help_topic("maturity_help_topic")
 {
 }
 	mDamageText = LLUICtrlFactory::create<LLTextBox>(damage_text);
 	addChild(mDamageText);
 	
+	LLIconCtrl::Params see_avatars_icon = p.see_avatars_icon;
+	see_avatars_icon.tool_tip = LLTrans::getString("LocationCtrlSeeAVsTooltip");
+	see_avatars_icon.mouse_opaque = true;
+	mParcelIcon[SEE_AVATARS_ICON] = LLUICtrlFactory::create<LLIconCtrl>(see_avatars_icon);
+	mParcelIcon[SEE_AVATARS_ICON]->setMouseDownCallback(boost::bind(&LLLocationInputCtrl::onParcelIconClick, this, SEE_AVATARS_ICON));
+	addChild(mParcelIcon[SEE_AVATARS_ICON]);
+	
 	// Register callbacks and load the location field context menu (NB: the order matters).
 	LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Navbar.Action", boost::bind(&LLLocationInputCtrl::onLocationContextMenuItemClicked, this, _2));
 	LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Navbar.EnableMenuItem", boost::bind(&LLLocationInputCtrl::onLocationContextMenuItemEnabled, this, _2));
 		bool allow_build	= vpm->allowAgentBuild(current_parcel); // true when anyone is allowed to build. See EXT-4610.
 		bool allow_scripts	= vpm->allowAgentScripts(agent_region, current_parcel);
 		bool allow_damage	= vpm->allowAgentDamage(agent_region, current_parcel);
+		bool see_avs        = current_parcel->getSeeAVs();
 
 		// Most icons are "block this ability"
 		mParcelIcon[VOICE_ICON]->setVisible(   !allow_voice );
 		mParcelIcon[SCRIPTS_ICON]->setVisible( !allow_scripts );
 		mParcelIcon[DAMAGE_ICON]->setVisible(  allow_damage );
 		mDamageText->setVisible(allow_damage);
+		mParcelIcon[SEE_AVATARS_ICON]->setVisible( !see_avs );
 
 		// Padding goes to left of both landmark star and for sale btn
 		x -= mAddLandmarkHPad;
 	case DAMAGE_ICON:
 		LLNotificationsUtil::add("NotSafe");
 		break;
+	case SEE_AVATARS_ICON:
+		LLNotificationsUtil::add("SeeAvatars");
+		break;
 	case ICON_COUNT:
 		break;
 	// no default to get compiler warning when a new icon gets added

File indra/newview/lllocationinputctrl.h

 											push_icon,
 											build_icon,
 											scripts_icon,
-											damage_icon;
+											damage_icon,
+											see_avatars_icon;
 		Optional<LLTextBox::Params>			damage_text;
 		Params();
 	};
 	enum EParcelIcon
 	{
 		VOICE_ICON = 0,
-		FLY_ICON,
-		PUSH_ICON,
-		BUILD_ICON,
-		SCRIPTS_ICON,
-		DAMAGE_ICON,
-		ICON_COUNT
+		FLY_ICON,			// 1
+		PUSH_ICON,			// 2
+		BUILD_ICON,			// 3
+		SCRIPTS_ICON,		// 4
+		DAMAGE_ICON,		// 5
+		SEE_AVATARS_ICON,   // 6
+		ICON_COUNT			// 7 total
 	};
 
 	friend class LLUICtrlFactory;

File indra/newview/llpanellandaudio.cpp

 	mMusicURLEdit = getChild<LLLineEditor>("music_url");
 	childSetCommitCallback("music_url", onCommitAny, this);
 
+	mCheckAVSoundAny = getChild<LLCheckBoxCtrl>("all av sound check");
+	childSetCommitCallback("all av sound check", onCommitAny, this);
+
+	mCheckAVSoundGroup = getChild<LLCheckBoxCtrl>("group av sound check");
+	childSetCommitCallback("group av sound check", onCommitAny, this);
+
 	return TRUE;
 }
 
 
 		mMusicURLEdit->setText(parcel->getMusicURL());
 		mMusicURLEdit->setEnabled( can_change_media );
+
+		BOOL can_change_av_sounds = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_OPTIONS) && parcel->getHaveNewParcelLimitData();
+		mCheckAVSoundAny->set(parcel->getAllowAnyAVSounds());
+		mCheckAVSoundAny->setEnabled(can_change_av_sounds);
+
+		mCheckAVSoundGroup->set(parcel->getAllowGroupAVSounds() || parcel->getAllowAnyAVSounds());	// On if "Everyone" is on
+		mCheckAVSoundGroup->setEnabled(can_change_av_sounds && !parcel->getAllowAnyAVSounds());		// Enabled if "Everyone" is off
 	}
 }
 // static
 	BOOL voice_enabled = self->mCheckParcelEnableVoice->get();
 	BOOL voice_estate_chan = !self->mCheckParcelVoiceLocal->get();
 
+	BOOL any_av_sound		= self->mCheckAVSoundAny->get();
+	BOOL group_av_sound		= TRUE;		// If set to "Everyone" then group is checked as well
+	if (!any_av_sound)
+	{	// If "Everyone" is off, use the value from the checkbox
+		group_av_sound = self->mCheckAVSoundGroup->get();
+	}
+
 	// Remove leading/trailing whitespace (common when copying/pasting)
 	LLStringUtil::trim(music_url);
 
 	parcel->setParcelFlag(PF_USE_ESTATE_VOICE_CHAN, voice_estate_chan);
 	parcel->setParcelFlag(PF_SOUND_LOCAL, sound_local);
 	parcel->setMusicURL(music_url);
+	parcel->setAllowAnyAVSounds(any_av_sound);
+	parcel->setAllowGroupAVSounds(group_av_sound);
 
 	// Send current parcel data upstream to server
 	LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate( parcel );

File indra/newview/llpanellandaudio.h

 	LLCheckBoxCtrl* mCheckParcelVoiceLocal;	
 	LLLineEditor*	mMusicURLEdit;
 	LLCheckBoxCtrl* mMusicUrlCheck;
+	LLCheckBoxCtrl* mCheckAVSoundAny;
+	LLCheckBoxCtrl* mCheckAVSoundGroup;
 
 	LLSafeHandle<LLParcelSelection>&	mParcel;
 };

File indra/newview/llpanelplaceprofile.cpp

 static std::string icon_scripts_no;
 static std::string icon_damage;
 static std::string icon_damage_no;
+static std::string icon_see_avs_on;
+static std::string icon_see_avs_off;
 
 LLPanelPlaceProfile::LLPanelPlaceProfile()
 :	LLPanelPlaceInfo(),
 	mScriptsText = getChild<LLTextBox>("scripts_value");
 	mDamageIcon = getChild<LLIconCtrl>("damage_icon");
 	mDamageText = getChild<LLTextBox>("damage_value");
+	mSeeAVsIcon = getChild<LLIconCtrl>("see_avatars_icon");
+	mSeeAVsText = getChild<LLTextBox>("see_avatars_value");
 
 	mRegionNameText = getChild<LLTextBox>("region_name");
 	mRegionTypeText = getChild<LLTextBox>("region_type");
 	icon_scripts_no = getString("icon_ScriptsNo");
 	icon_damage = getString("icon_Damage");
 	icon_damage_no = getString("icon_DamageNo");
+	icon_see_avs_on = getString("icon_SeeAVs_On");
+	icon_see_avs_off = getString("icon_SeeAVs_Off");
 
 	return TRUE;
 }
 	mScriptsText->setText(loading);
 	mDamageIcon->setValue(loading);
 	mDamageText->setText(loading);
+	mSeeAVsIcon->setValue(loading);
+	mSeeAVsText->setText(loading);
 
 	mRegionNameText->setValue(loading);
 	mRegionTypeText->setValue(loading);
 		mDamageText->setText(off);
 	}
 
+	if (parcel->getSeeAVs())
+	{
+		mSeeAVsIcon->setValue(icon_see_avs_on);
+		mSeeAVsText->setText(on);
+	}
+	else
+	{
+		mSeeAVsIcon->setValue(icon_see_avs_off);
+		mSeeAVsText->setText(off);
+	}
+
 	mRegionNameText->setText(region->getName());
 	mRegionTypeText->setText(region->getSimProductName());
 

File indra/newview/llpanelplaceprofile.h

 	LLTextBox*			mScriptsText;
 	LLIconCtrl*			mDamageIcon;
 	LLTextBox*			mDamageText;
+	LLIconCtrl*			mSeeAVsIcon;
+	LLTextBox*			mSeeAVsText;
 
 	LLTextBox*			mRegionNameText;
 	LLTextBox*			mRegionTypeText;

File indra/newview/llpaneltopinfobar.cpp

 	mParcelIcon[BUILD_ICON] = getChild<LLIconCtrl>("build_icon");
 	mParcelIcon[SCRIPTS_ICON] = getChild<LLIconCtrl>("scripts_icon");
 	mParcelIcon[DAMAGE_ICON] = getChild<LLIconCtrl>("damage_icon");
+	mParcelIcon[SEE_AVATARS_ICON] = getChild<LLIconCtrl>("see_avatars_icon");
 
 	mParcelIcon[VOICE_ICON]->setToolTip(LLTrans::getString("LocationCtrlVoiceTooltip"));
 	mParcelIcon[FLY_ICON]->setToolTip(LLTrans::getString("LocationCtrlFlyTooltip"));
 	mParcelIcon[BUILD_ICON]->setToolTip(LLTrans::getString("LocationCtrlBuildTooltip"));
 	mParcelIcon[SCRIPTS_ICON]->setToolTip(LLTrans::getString("LocationCtrlScriptsTooltip"));
 	mParcelIcon[DAMAGE_ICON]->setToolTip(LLTrans::getString("LocationCtrlDamageTooltip"));
+	mParcelIcon[SEE_AVATARS_ICON]->setToolTip(LLTrans::getString("LocationCtrlSeeAVsTooltip"));
 
 	mParcelIcon[VOICE_ICON]->setMouseDownCallback(boost::bind(&LLPanelTopInfoBar::onParcelIconClick, this, VOICE_ICON));
 	mParcelIcon[FLY_ICON]->setMouseDownCallback(boost::bind(&LLPanelTopInfoBar::onParcelIconClick, this, FLY_ICON));
 	mParcelIcon[BUILD_ICON]->setMouseDownCallback(boost::bind(&LLPanelTopInfoBar::onParcelIconClick, this, BUILD_ICON));
 	mParcelIcon[SCRIPTS_ICON]->setMouseDownCallback(boost::bind(&LLPanelTopInfoBar::onParcelIconClick, this, SCRIPTS_ICON));
 	mParcelIcon[DAMAGE_ICON]->setMouseDownCallback(boost::bind(&LLPanelTopInfoBar::onParcelIconClick, this, DAMAGE_ICON));
+	mParcelIcon[SEE_AVATARS_ICON]->setMouseDownCallback(boost::bind(&LLPanelTopInfoBar::onParcelIconClick, this, SEE_AVATARS_ICON));
 
 	mDamageText->setText(LLStringExplicit("100%"));
 }
 		bool allow_build	= vpm->allowAgentBuild(current_parcel); // true when anyone is allowed to build. See EXT-4610.
 		bool allow_scripts	= vpm->allowAgentScripts(agent_region, current_parcel);
 		bool allow_damage	= vpm->allowAgentDamage(agent_region, current_parcel);
+		bool see_avs        = current_parcel->getSeeAVs();
 
 		// Most icons are "block this ability"
 		mParcelIcon[VOICE_ICON]->setVisible(   !allow_voice );
 		mParcelIcon[SCRIPTS_ICON]->setVisible( !allow_scripts );
 		mParcelIcon[DAMAGE_ICON]->setVisible(  allow_damage );
 		mDamageText->setVisible(allow_damage);
+		mParcelIcon[SEE_AVATARS_ICON]->setVisible( !see_avs );
 
 		layoutParcelIcons();
 	}
 	case DAMAGE_ICON:
 		LLNotificationsUtil::add("NotSafe");
 		break;
+	case SEE_AVATARS_ICON:
+		LLNotificationsUtil::add("SeeAvatars");
+		break;
 	case ICON_COUNT:
 		break;
 	// no default to get compiler warning when a new icon gets added

File indra/newview/llpaneltopinfobar.h

 	enum EParcelIcon
 	{
 		VOICE_ICON = 0,
-		FLY_ICON,
-		PUSH_ICON,
-		BUILD_ICON,
-		SCRIPTS_ICON,
-		DAMAGE_ICON,
-		ICON_COUNT
+		FLY_ICON,			// 1
+		PUSH_ICON,			// 2
+		BUILD_ICON,			// 3
+		SCRIPTS_ICON,		// 4
+		DAMAGE_ICON,		// 5
+		SEE_AVATARS_ICON,	// 6
+		ICON_COUNT			// 7 total
 	};
 
 	/**

File indra/newview/llviewermedia.cpp

File contents unchanged.

File indra/newview/llviewermessage.cpp

File contents unchanged.

File indra/newview/llvoavatar.cpp

 			llinfos << "Re-requesting AvatarAppearance for object: "  << getID() << llendl;
 			LLAvatarPropertiesProcessor::getInstance()->sendAvatarTexturesRequest(getID());
 			mRuthTimer.reset();
-	}
-	else
-	{
+		}
+		else
+		{
 			llinfos << "That's okay, we already have a non-default shape for object: "  << getID() << llendl;
 			// we don't really care.
 		}

File indra/newview/skins/default/textures/icons/Parcel_SeeAVsOff_Dark.png

Added
New image

File indra/newview/skins/default/textures/icons/Parcel_SeeAVsOff_Light.png

Added
New image

File indra/newview/skins/default/textures/icons/Parcel_SeeAVsOn_Dark.png

Added
New image

File indra/newview/skins/default/textures/icons/Parcel_SeeAVsOn_Light.png

Added
New image

File indra/newview/skins/default/textures/textures.xml

-<!--
+<!--
 This file contains metadata about how to load, display, and scale textures for rendering in the UI.
 Images do *NOT* have to appear in this file in order to use them as textures in the UI...simply refer
 to them by filename (relative to textures directory).
  <texture name="Parcel_ScriptsNo_Dark" file_name="icons/Parcel_ScriptsNo_Dark.png" preload="false" />
  <texture name="Parcel_Voice_Dark" file_name="icons/Parcel_Voice_Dark.png" preload="false" />
  <texture name="Parcel_VoiceNo_Dark" file_name="icons/Parcel_VoiceNo_Dark.png" preload="false" />
+ <texture name="Parcel_SeeAVsOff_Dark" file_name="icons/Parcel_SeeAVsOff_Dark.png" preload="false" />
+ <texture name="Parcel_SeeAVsOn_Dark" file_name="icons/Parcel_SeeAVsOn_Dark.png" preload="false" />
+ <texture name="Parcel_SeeAVsOff_Light" file_name="icons/Parcel_SeeAVsOff_Light.png" preload="false" />
+ <texture name="Parcel_SeeAVsOn_Light" file_name="icons/Parcel_SeeAVsOn_Light.png" preload="false" />
 
  <texture name="Parcel_BuildNo_Light" file_name="icons/Parcel_BuildNo_Light.png" preload="false" />
  <texture name="Parcel_FlyNo_Light" file_name="icons/Parcel_FlyNo_Light.png" preload="false" />

File indra/newview/skins/default/xui/da/notifications.xml

File contents unchanged.

File indra/newview/skins/default/xui/de/notifications.xml

File contents unchanged.

File indra/newview/skins/default/xui/en/floater_about_land.xml

              name="push_restrict_region_text">
                 No Pushing (Region Override)
             </panel.string>
+            <panel.string
+             name="see_avs_text">
+                 See and chat with residents on this parcel
+            </panel.string>
             <text
              type="string"
              length="1"
              name="check group scripts"
              top_delta="0"
              width="70" />
-            <text
+           <text
              type="string"
              text_color="white"
              length="1"
              type="string"
              length="1"
              follows="left|top"
+             text_color="white"
              height="16"
              layout="topleft"
-             left="220"
-             top="180"
+             left="230"
+             top="174"
+             name="allow_label5"
+             width="278">
+              Allow Residents on other parcels to:
+            </text>
+            <check_box
+             height="16"
+             label="See Avatars"
+             follows="top"
+             layout="topleft"
+             left="230"
+             name="SeeAvatarsCheck"
+             tool_tip="Allows residents on other parcels to see and chat with residents on this parcel, and you to see and chat with them."
+             width="120" />
+            <text
+             type="string"
+             length="1"
+             follows="left|top"
+             height="16"
+             layout="topleft"
+             left="230"
+             top="230"
              text_color="white"
              name="landing_point"
              word_wrap="true"
              label_selected="Set"
              layout="topleft"
              name="Set"
-             right="-68"
+             left="230"
              tool_tip="Sets the landing point where visitors arrive. Sets to your avatar&apos;s location inside this parcel."
              width="50" />
             <button
              left_pad="5"
              name="Clear"
              tool_tip="Clear the landing point"
-             right="-10"
              width="55" />
             <text
              type="string"
              follows="left|top"
              height="16"
              layout="topleft"
-             left="220"
+             left="230"
              top_pad="10"
              name="Teleport Routing: "
              width="200">
              name="check sound local"
              left_pad="0"
              width="292" />
+          <text
+             type="string"
+             length="1"
+             follows="left|top"
+             height="16"
+             layout="topleft"
+             left="10"
+             name="Avatar Sounds:"
+             top_pad="10"
+             width="100">
+               Avatar Sounds:
+          </text>
+          <check_box
+             height="16"
+             label="Everyone"
+             layout="topleft"
+             left_pad="0"
+             name="all av sound check"
+             top_delta="0"
+             width="130" />
+          <check_box
+             height="16"
+             label="Group"
+             layout="topleft"
+             left_pad="0"
+             name="group av sound check"
+             top_delta="0"
+             width="70" />
             <text
              type="string"
              length="1"

File indra/newview/skins/default/xui/en/floater_web_content.xml

File contents unchanged.

File indra/newview/skins/default/xui/en/menu_viewer.xml

                  function="Floater.Toggle"
                  parameter="region_debug_console" />
             </menu_item_check>
+            <menu_item_check
+             label="Region Debug Console"
+             name="Region Debug Console"
+             shortcut="control|shift|`"
+             use_mac_ctrl="true">
+                <menu_item_check.on_check
+                 function="Floater.Visible"
+                 parameter="region_debug_console" />
+                <menu_item_check.on_click
+                 function="Floater.Toggle"
+                 parameter="region_debug_console" />
+            </menu_item_check>
             <menu_item_separator />
 
             <menu_item_check

File indra/newview/skins/default/xui/en/notifications.xml

 
   <notification
    icon="notify.tga"
+   name="SeeAvatars"
+   persist="true"
+   type="notify"
+   unique="true">
+This parcel hides avatars and text chat from another parcel.   You can&apos;t see other residents outside the parcel, and those outside are not able to see you.  Regular text chat on channel 0 is also blocked.
+  </notification>
+
+  <notification
+   icon="notify.tga"
    name="ScriptsStopped"
    persist="true"
    type="notify">

File indra/newview/skins/default/xui/en/panel_place_profile.xml

      name="icon_DamageNo"
      translate="false"
      value="Parcel_DamageNo_Dark" />
+    <string
+     name="icon_SeeAVs_Off"
+     translate="false"
+     value="Parcel_SeeAVsOff_Dark" />
+    <string
+     name="icon_SeeAVs_On"
+     translate="false"
+     value="Parcel_SeeAVsOn_Dark" />
     <button
      follows="top|left"
      height="24"
                  title="Parcel">
                     <panel
                      follows="all"
-                     height="175"
+                     height="200"
                      layout="topleft"
                      left="0"
                      name="parcel_characteristics_panel"
                          top_delta="0"
                          value="Off"
                          width="60" />
+                        <icon
+                         follows="top|left"
+                         height="18"
+                         image_name="Parcel_SeeAVsOff_Dark"
+                         layout="topleft"
+                         left="10"
+                         name="see_avatars_icon"
+                         top_pad="7"
+                         width="22" />
+                        <text
+                         follows="left|top"
+                         height="14"
+                         layout="topleft"
+                         left_pad="8"
+                         name="see_avatars_label"
+                         value="See Avatars:"
+                         width="90" />
+                        <text
+                         follows="left|top"
+                         height="14"
+                         layout="topleft"
+                         left_pad="0"
+                         name="see_avatars_value"
+                         value="Off"
+                         width="60" />
                         <button
                          follows="bottom|right"
                          height="23"

File indra/newview/skins/default/xui/en/panel_topinfo_bar.xml

     visible="false"
     width="14"
     />
+  <icon
+    follows="right|top"
+    height="13"
+    image_name="Parcel_SeeAVsOff_Light"
+    left="2"
+    name="see_avatars_icon"
+    top="3"
+    visible="false"
+    width="14"
+    />
   <text
     follows="right|top"
     font="SansSerifSmall"

File indra/newview/skins/default/xui/en/strings.xml

 Returns the maximum number of prims allowed on the parcel at pos
 	</string>
 	<string name="LSLTipText_llGetParcelDetails" translate="false">
-list llGetParcelDetails(vector pos, list params)
-Returns the parcel details specified in params for the parcel at pos.
-Params is one or more of: PARCEL_DETAILS_NAME, _DESC, _OWNER, _GROUP, _AREA
-	</string>
+    list llGetParcelDetails(vector pos, list params)
+    Returns the parcel details specified in params for the parcel at pos.
+    Params is one or more of: PARCEL_DETAILS_NAME, _DESC, _OWNER, _GROUP, _AREA, _ID, _SEE_AVATARS
+  </string>
 	<string name="LSLTipText_llSetLinkPrimitiveParams" translate="false">
 llSetLinkPrimitiveParams(integer linknumber, list rules)
 Sets primitive parameters for linknumber based on rules
   <string name="LocationCtrlAdultIconTooltip">Adult Region</string>
   <string name="LocationCtrlModerateIconTooltip">Moderate Region</string>
   <string name="LocationCtrlGeneralIconTooltip">General Region</string>
+  <string name="LocationCtrlSeeAVsTooltip">Avatars visible and chat allowed outside of this parcel</string>
 
   <!-- Strings used by the (currently Linux) auto-updater app -->
 	<string name="UpdaterWindowTitle">

File indra/newview/skins/default/xui/en/widgets/location_input.xml

 	font="SansSerifSmall"
 	text_color="TextFgColor"
 	/>
+  <see_avatars_icon
+    name="see_avatars_icon"
+    width="22"
+    height="18"
+    top="21"
+    follows="right|top"
+    image_name="Parcel_SeeAVsOff_Light"
+    />
   <combo_button
 		name="Location History"
                 label=""

File indra/newview/skins/default/xui/es/notifications.xml

File contents unchanged.

File indra/newview/skins/default/xui/fr/notifications.xml

File contents unchanged.

File indra/newview/skins/default/xui/pl/notifications.xml

File contents unchanged.

File indra/newview/skins/default/xui/pt/notifications.xml

File contents unchanged.

File indra/newview/skins/minimal/xui/en/widgets/location_input.xml

 	  font="SansSerifSmall"
 	  text_color="TextFgColor"
 	/>
+  <see_avatars_icon
+    name="see_avatars_icon"
+    width="0"
+    height="0"
+    visible="false" 
+    top="21"
+    follows="right|top"
+    />
   <combo_button
 		name="Location History"
                 label=""