diff options
| author | Brad Payne (Vir Linden) <vir@lindenlab.com> | 2010-08-13 14:33:30 -0400 | 
|---|---|---|
| committer | Brad Payne (Vir Linden) <vir@lindenlab.com> | 2010-08-13 14:33:30 -0400 | 
| commit | 9dcea327605870637e4a45823a1cd3540ef98d69 (patch) | |
| tree | d780f1bbfea722a658a71da98189444552f9200e /indra | |
| parent | 26b0d657f5a2c054aae6e1a1a9a4382bb2c984db (diff) | |
DEV-52580 FIX
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/newview/llinventorybridge.cpp | 43 | ||||
| -rw-r--r-- | indra/newview/llvoavatarself.cpp | 56 | ||||
| -rw-r--r-- | indra/newview/llvoavatarself.h | 7 | 
3 files changed, 76 insertions, 30 deletions
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 53622f7188..531d4c3ee9 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -3936,7 +3936,7 @@ void LLObjectBridge::performAction(LLInventoryModel* model, std::string action)  		item = (LLViewerInventoryItem*)gInventory.getItem(object_id);  		if(item && gInventory.isObjectDescendentOf(object_id, gInventory.getRootFolderID()))  		{ -			rez_attachment(item, NULL, true); // Replace if "Wear"ing. +			rez_attachment(item, NULL);  		}  		else if(item && item->isFinished())  		{ @@ -3952,10 +3952,6 @@ void LLObjectBridge::performAction(LLInventoryModel* model, std::string action)  		}  		gFocusMgr.setKeyboardFocus(NULL);  	} -	else if ("wear_add" == action) -	{ -		LLAppearanceMgr::instance().wearItemOnAvatar(mUUID, true, false); // Don't replace if adding. -	}  	else if (isRemoveAction(action))  	{  		LLInventoryItem* item = gInventory.getItem(mUUID); @@ -3989,11 +3985,6 @@ std::string LLObjectBridge::getLabelSuffix() const  {  	if (get_is_item_worn(mUUID))  	{ -		if (!isAgentAvatarValid()) -		{ -			return LLItemBridge::getLabelSuffix() + LLTrans::getString("worn"); -		} -  		std::string attachment_point_name = gAgentAvatarp->getAttachedPointName(mUUID);  		// e.g. "(worn on ...)" / "(attached to ...)" @@ -4007,10 +3998,19 @@ std::string LLObjectBridge::getLabelSuffix() const  	}  } -void rez_attachment(LLViewerInventoryItem* item, LLViewerJointAttachment* attachment, bool replace) +void rez_attachment(LLViewerInventoryItem* item, LLViewerJointAttachment* attachment)  { -	LLSD payload; -	payload["item_id"] = item->getLinkedUUID(); // Wear the base object in case this is a link. +	const LLUUID& item_id = item->getLinkedUUID(); + +	// Check for duplicate request. +	if (isAgentAvatarValid() && +		(gAgentAvatarp->attachmentWasRequested(item_id) || +		 gAgentAvatarp->isWearingAttachment(item_id))) +	{ +		llwarns << "duplicate attachment request, ignoring" << llendl; +		return; +	} +	gAgentAvatarp->addAttachmentRequest(item_id);  	S32 attach_pt = 0;  	if (isAgentAvatarValid() && attachment) @@ -4026,14 +4026,11 @@ void rez_attachment(LLViewerInventoryItem* item, LLViewerJointAttachment* attach  		}  	} -	if (!replace) -	{ -		attach_pt |= ATTACHMENT_ADD; -	} - +	LLSD payload; +	payload["item_id"] = item_id; // Wear the base object in case this is a link.  	payload["attachment_point"] = attach_pt; -	if (replace && +	if (!gSavedSettings.getBOOL("MultipleAttachments") &&  		(attachment && attachment->getNumObjects() > 0))  	{  		LLNotificationsUtil::add("ReplaceAttachment", LLSD(), payload, confirm_replace_attachment_rez); @@ -4057,11 +4054,15 @@ bool confirm_replace_attachment_rez(const LLSD& notification, const LLSD& respon  	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if (option == 0/*YES*/)  	{ -		LLViewerInventoryItem* itemp = gInventory.getItem(notification["payload"]["item_id"].asUUID()); +		LLUUID item_id = notification["payload"]["item_id"].asUUID(); +		LLViewerInventoryItem* itemp = gInventory.getItem(item_id);  		if (itemp)  		{  			U8 attachment_pt = notification["payload"]["attachment_point"].asInteger(); +			 +			if (gSavedSettings.getBOOL("MultipleAttachments")) +				attachment_pt |= ATTACHMENT_ADD;  			LLMessageSystem* msg = gMessageSystem;  			msg->newMessageFast(_PREHASH_RezSingleAttachmentFromInv); @@ -4118,7 +4119,6 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  			{  				items.push_back(std::string("Wearable And Object Separator"));  				items.push_back(std::string("Wearable And Object Wear")); -				items.push_back(std::string("Wearable Add"));  				items.push_back(std::string("Attach To"));  				items.push_back(std::string("Attach To HUD"));  				// commented out for DEV-32347 @@ -4127,7 +4127,6 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  				if (!gAgentAvatarp->canAttachMoreObjects())  				{  					disabled_items.push_back(std::string("Wearable And Object Wear")); -					disabled_items.push_back(std::string("Wearable Add"));  					disabled_items.push_back(std::string("Attach To"));  					disabled_items.push_back(std::string("Attach To HUD"));  				} diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index bddde08ca9..7e6591a194 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -1016,6 +1016,44 @@ BOOL LLVOAvatarSelf::isWearingAttachment(const LLUUID& inv_item_id) const  }  //----------------------------------------------------------------------------- +BOOL LLVOAvatarSelf::attachmentWasRequested(const LLUUID& inv_item_id) const +{ +	const F32 REQUEST_EXPIRATION_SECONDS = 5.0;  // any request older than this is ignored/removed. +	std::map<LLUUID,LLTimer>::iterator it = mAttachmentRequests.find(inv_item_id); +	if (it != mAttachmentRequests.end()) +	{ +		const LLTimer& request_time = it->second; +		F32 request_time_elapsed = request_time.getElapsedTimeF32(); +		if (request_time_elapsed > REQUEST_EXPIRATION_SECONDS) +		{ +			mAttachmentRequests.erase(it); +			return FALSE; +		} +		else +		{ +			return TRUE; +		} +	} +	else +	{ +		return FALSE; +	} +} + +//----------------------------------------------------------------------------- +void LLVOAvatarSelf::addAttachmentRequest(const LLUUID& inv_item_id) +{ +	LLTimer current_time; +	mAttachmentRequests[inv_item_id] = current_time; +} + +//----------------------------------------------------------------------------- +void LLVOAvatarSelf::removeAttachmentRequest(const LLUUID& inv_item_id) +{ +	mAttachmentRequests.erase(inv_item_id); +} + +//-----------------------------------------------------------------------------  // getWornAttachment()  //-----------------------------------------------------------------------------  LLViewerObject* LLVOAvatarSelf::getWornAttachment(const LLUUID& inv_item_id) @@ -1067,8 +1105,10 @@ const LLViewerJointAttachment *LLVOAvatarSelf::attachObject(LLViewerObject *view  	// Should just be the last object added  	if (attachment->isObjectAttached(viewer_object))  	{ -		const LLUUID& attachment_id = viewer_object->getItemID(); +		const LLUUID& attachment_id = viewer_object->getAttachmentItemID();  		LLAppearanceMgr::instance().registerAttachment(attachment_id); +		// Clear any pending requests once the attachment arrives. +		removeAttachmentRequest(attachment_id);  	}  	return attachment; @@ -1077,7 +1117,7 @@ const LLViewerJointAttachment *LLVOAvatarSelf::attachObject(LLViewerObject *view  //virtual  BOOL LLVOAvatarSelf::detachObject(LLViewerObject *viewer_object)  { -	const LLUUID attachment_id = viewer_object->getItemID(); +	const LLUUID attachment_id = viewer_object->getAttachmentItemID();  	if (LLVOAvatar::detachObject(viewer_object))  	{  		// the simulator should automatically handle permission revocation @@ -1625,15 +1665,15 @@ void LLVOAvatarSelf::setLocalTexture(ETextureIndex type, LLViewerTexture* src_te  					if (isSelf())  					{  						if (gAgentAvatarp->isUsingBakedTextures()) -					{ -						requestLayerSetUpdate(type); -					} +						{ +							requestLayerSetUpdate(type); +						}  						else -					{ -						LLVisualParamHint::requestHintUpdates(); +						{ +							LLVisualParamHint::requestHintUpdates(); +						}  					}  				} -				}  				else  				{					  					tex->setLoadedCallback(onLocalTextureLoaded, desired_discard, TRUE, FALSE, new LLAvatarTexData(getID(), type), NULL); diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h index 630afe7a0f..b129ffd986 100644 --- a/indra/newview/llvoavatarself.h +++ b/indra/newview/llvoavatarself.h @@ -291,11 +291,18 @@ protected:  public:  	void 				updateAttachmentVisibility(U32 camera_mode);  	BOOL 				isWearingAttachment(const LLUUID& inv_item_id) const; +	BOOL				attachmentWasRequested(const LLUUID& inv_item_id) const; +	void				addAttachmentRequest(const LLUUID& inv_item_id); +	void				removeAttachmentRequest(const LLUUID& inv_item_id);  	LLViewerObject* 	getWornAttachment(const LLUUID& inv_item_id);  	const std::string   getAttachedPointName(const LLUUID& inv_item_id) const;  	/*virtual*/ const LLViewerJointAttachment *attachObject(LLViewerObject *viewer_object);  	/*virtual*/ BOOL 	detachObject(LLViewerObject *viewer_object); +private: +	// Track attachments that have been requested but have not arrived yet. +	mutable std::map<LLUUID,LLTimer> mAttachmentRequests; +  	//--------------------------------------------------------------------  	// HUDs  	//--------------------------------------------------------------------  | 
