diff options
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/newview/llinventorybridge.cpp | 19 | ||||
| -rw-r--r-- | indra/newview/llvoavatarself.cpp | 40 | ||||
| -rw-r--r-- | indra/newview/llvoavatarself.h | 7 | 
3 files changed, 63 insertions, 3 deletions
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 38f3521b2d..531d4c3ee9 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -4000,8 +4000,17 @@ std::string LLObjectBridge::getLabelSuffix() const  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) @@ -4017,6 +4026,8 @@ void rez_attachment(LLViewerInventoryItem* item, LLViewerJointAttachment* attach  		}  	} +	LLSD payload; +	payload["item_id"] = item_id; // Wear the base object in case this is a link.  	payload["attachment_point"] = attach_pt;  	if (!gSavedSettings.getBOOL("MultipleAttachments") && @@ -4043,11 +4054,13 @@ 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; diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 73ea629bc3..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) @@ -1069,6 +1107,8 @@ const LLViewerJointAttachment *LLVOAvatarSelf::attachObject(LLViewerObject *view  	{  		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; 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  	//--------------------------------------------------------------------  | 
