diff options
| author | Loren Shih <seraph@lindenlab.com> | 2010-08-13 11:12:51 -0400 | 
|---|---|---|
| committer | Loren Shih <seraph@lindenlab.com> | 2010-08-13 11:12:51 -0400 | 
| commit | 2f77724a48b51a97091a0e27f20767cfb14e78e5 (patch) | |
| tree | 0fb2b6371c1edef5d63cc68fc5e3ec1fe4a622ef /indra | |
| parent | b241d9769cf5ef21fa90e38ad21c2c4d49aab6f3 (diff) | |
EXT-8650 Can wear multiple copies of no-copy item via object links
* EXT-8688 Automatically detach same object is detected
* EXT-8689 Cleanup detachAttachmentIntoInventory code
When an object arrives as an attachment, if it's already attached then it's automatically detached.
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/newview/llappearancemgr.cpp | 32 | ||||
| -rw-r--r-- | indra/newview/llinventorybridge.cpp | 27 | ||||
| -rw-r--r-- | indra/newview/llviewerjointattachment.cpp | 37 | ||||
| -rw-r--r-- | indra/newview/llvoavatarself.cpp | 39 | ||||
| -rw-r--r-- | indra/newview/llvoavatarself.h | 1 | 
5 files changed, 63 insertions, 73 deletions
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 6fdd71bfbf..21a635e738 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -2496,29 +2496,17 @@ void LLAppearanceMgr::removeItemFromAvatar(const LLUUID& id_to_remove)  	switch (item_to_remove->getType())  	{ -	case LLAssetType::AT_CLOTHING: -		if (get_is_item_worn(id_to_remove)) -		{ -			//*TODO move here the exact removing code from LLWearableBridge::removeItemFromAvatar in the future -			LLWearableBridge::removeItemFromAvatar(item_to_remove); -		} -		break; -	case LLAssetType::AT_OBJECT: -		gMessageSystem->newMessageFast(_PREHASH_DetachAttachmentIntoInv); -		gMessageSystem->nextBlockFast(_PREHASH_ObjectData); -		gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); -		gMessageSystem->addUUIDFast(_PREHASH_ItemID, item_to_remove->getLinkedUUID()); -		gMessageSystem->sendReliable( gAgent.getRegion()->getHost()); - -		{ -			// this object might have been selected, so let the selection manager know it's gone now -			LLViewerObject *found_obj = gObjectList.findObject(item_to_remove->getLinkedUUID()); -			if (found_obj) +		case LLAssetType::AT_CLOTHING: +			if (get_is_item_worn(id_to_remove))  			{ -				LLSelectMgr::getInstance()->remove(found_obj); -			}; -		} -	default: break; +				//*TODO move here the exact removing code from LLWearableBridge::removeItemFromAvatar in the future +				LLWearableBridge::removeItemFromAvatar(item_to_remove); +			} +			break; +		case LLAssetType::AT_OBJECT: +			LLVOAvatarSelf::detachAttachmentIntoInventory(item_to_remove->getLinkedUUID()); +		default: +			break;  	}  	// *HACK: Force to remove garbage from COF. diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 9bbc6514b4..66bf325f04 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -3957,18 +3957,7 @@ void LLObjectBridge::performAction(LLInventoryModel* model, std::string action)  		LLInventoryItem* item = gInventory.getItem(mUUID);  		if(item)  		{ -			gMessageSystem->newMessageFast(_PREHASH_DetachAttachmentIntoInv); -			gMessageSystem->nextBlockFast(_PREHASH_ObjectData); -			gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); -			gMessageSystem->addUUIDFast(_PREHASH_ItemID, item->getLinkedUUID()); -			gMessageSystem->sendReliable( gAgent.getRegion()->getHost()); - -			// this object might have been selected, so let the selection manager know it's gone now -			LLViewerObject *found_obj = gObjectList.findObject(item->getLinkedUUID()); -			if (found_obj) -			{ -				LLSelectMgr::getInstance()->remove(found_obj); -			} +			LLVOAvatarSelf::detachAttachmentIntoInventory(item->getLinkedUUID());  		}  	}  	else LLItemBridge::performAction(model, action); @@ -4321,19 +4310,7 @@ void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_  				LLViewerInventoryItem *obj_item = obj_item_array.get(i);  				if (get_is_item_worn(obj_item->getUUID()))  				{ -					gMessageSystem->newMessageFast(_PREHASH_DetachAttachmentIntoInv); -					gMessageSystem->nextBlockFast(_PREHASH_ObjectData ); -					gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); -					gMessageSystem->addUUIDFast(_PREHASH_ItemID, obj_item->getLinkedUUID() ); -					 -					gMessageSystem->sendReliable( gAgent.getRegion()->getHost() ); -					 -					// this object might have been selected, so let the selection manager know it's gone now -					LLViewerObject *found_obj = gObjectList.findObject( obj_item->getLinkedUUID()); -					if (found_obj) -					{ -						LLSelectMgr::getInstance()->remove(found_obj); -					} +					LLVOAvatarSelf::detachAttachmentIntoInventory(obj_item->getLinkedUUID());  				}  			}  		} diff --git a/indra/newview/llviewerjointattachment.cpp b/indra/newview/llviewerjointattachment.cpp index 2b4b78d82d..c9335366cd 100644 --- a/indra/newview/llviewerjointattachment.cpp +++ b/indra/newview/llviewerjointattachment.cpp @@ -35,12 +35,11 @@  #include "llviewerjointattachment.h"  #include "llagentconstants.h" -  #include "llviewercontrol.h"  #include "lldrawable.h"  #include "llgl.h"  #include "llrender.h" -#include "llvoavatar.h" +#include "llvoavatarself.h"  #include "llvolume.h"  #include "pipeline.h"  #include "llspatialpartition.h" @@ -164,6 +163,9 @@ void LLViewerJointAttachment::setupDrawable(LLViewerObject *object)  //-----------------------------------------------------------------------------  BOOL LLViewerJointAttachment::addObject(LLViewerObject* object)  { +	object->extractAttachmentItemID(); + +	// Same object reattached  	if (isObjectAttached(object))  	{  		llinfos << "(same object re-attached)" << llendl; @@ -171,20 +173,19 @@ BOOL LLViewerJointAttachment::addObject(LLViewerObject* object)  		// Pass through anyway to let setupDrawable()  		// re-connect object to the joint correctly  	} - -	// Find the inventory item ID of the attached object -	LLNameValue* item_id_nv = object->getNVPair("AttachItemID"); -	if( item_id_nv ) +	 +	// Two instances of the same inventory item attached -- +	// Request detach, and kill the object in the meantime. +	if (getAttachedObject(object->getAttachmentItemID()))  	{ -		const char* s = item_id_nv->getString(); -		if( s ) -		{ -			LLUUID item_id; -			item_id.set(s); -			object->setItemID(item_id); -			lldebugs << "getNVPair( AttachItemID ) = " << item_id << llendl; -		} +		llinfos << "(same object re-attached)" << llendl; +		object->markDead(); + +		// If this happens to be attached to self, then detach. +		LLVOAvatarSelf::detachAttachmentIntoInventory(object->getAttachmentItemID()); +		return FALSE;  	} +  	mAttachedObjects.push_back(object);  	setupDrawable(object); @@ -207,7 +208,7 @@ BOOL LLViewerJointAttachment::addObject(LLViewerObject* object)  	}  	calcLOD();  	mUpdateXform = TRUE; - +	  	return TRUE;  } @@ -303,7 +304,7 @@ void LLViewerJointAttachment::removeObject(LLViewerObject *object)  	{  		mUpdateXform = FALSE;  	} -	object->setItemID(LLUUID::null); +	object->setAttachmentItemID(LLUUID::null);  }  //----------------------------------------------------------------------------- @@ -429,7 +430,7 @@ const LLViewerObject *LLViewerJointAttachment::getAttachedObject(const LLUUID &o  		 ++iter)  	{  		const LLViewerObject* attached_object = (*iter); -		if (attached_object->getItemID() == object_id) +		if (attached_object->getAttachmentItemID() == object_id)  		{  			return attached_object;  		} @@ -444,7 +445,7 @@ LLViewerObject *LLViewerJointAttachment::getAttachedObject(const LLUUID &object_  		 ++iter)  	{  		LLViewerObject* attached_object = (*iter); -		if (attached_object->getItemID() == object_id) +		if (attached_object->getAttachmentItemID() == object_id)  		{  			return attached_object;  		} diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index bddde08ca9..09e50dcb90 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -1067,7 +1067,7 @@ 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);  	} @@ -1077,7 +1077,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 @@ -1115,6 +1115,29 @@ BOOL LLVOAvatarSelf::detachObject(LLViewerObject *viewer_object)  	return FALSE;  } +// static +BOOL LLVOAvatarSelf::detachAttachmentIntoInventory(const LLUUID &item_id) +{ +	LLInventoryItem* item = gInventory.getItem(item_id); +	if (item) +	{ +		gMessageSystem->newMessageFast(_PREHASH_DetachAttachmentIntoInv); +		gMessageSystem->nextBlockFast(_PREHASH_ObjectData); +		gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); +		gMessageSystem->addUUIDFast(_PREHASH_ItemID, item_id); +		gMessageSystem->sendReliable(gAgent.getRegion()->getHost()); +		 +		// this object might have been selected, so let the selection manager know it's gone now +		LLViewerObject *found_obj = gObjectList.findObject(item_id); +		if (found_obj) +		{ +			LLSelectMgr::getInstance()->remove(found_obj); +		} +		return TRUE; +	} +	return FALSE; +} +  U32 LLVOAvatarSelf::getNumWearables(LLVOAvatarDefines::ETextureIndex i) const  {  	LLWearableType::EType type = LLVOAvatarDictionary::getInstance()->getTEWearableType(i); @@ -1625,15 +1648,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..37d24d138f 100644 --- a/indra/newview/llvoavatarself.h +++ b/indra/newview/llvoavatarself.h @@ -295,6 +295,7 @@ public:  	const std::string   getAttachedPointName(const LLUUID& inv_item_id) const;  	/*virtual*/ const LLViewerJointAttachment *attachObject(LLViewerObject *viewer_object);  	/*virtual*/ BOOL 	detachObject(LLViewerObject *viewer_object); +	static BOOL			detachAttachmentIntoInventory(const LLUUID& item_id);  	//--------------------------------------------------------------------  	// HUDs  | 
