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 | 5881252ab2e9ab31b05c1a54d8ce723013eee15a (patch) | |
| tree | 5031e4f66cc11e722f874f702c09598bfb1f2050 | |
| parent | 40eda71ff0cbc73efbe7520c73406cce39d763bb (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.
| -rw-r--r-- | indra/newview/llappearancemgr.cpp | 32 | ||||
| -rw-r--r-- | indra/newview/llinventorybridge.cpp | 27 | ||||
| -rw-r--r-- | indra/newview/llviewerjointattachment.cpp | 21 | ||||
| -rw-r--r-- | indra/newview/llvoavatarself.cpp | 23 | ||||
| -rw-r--r-- | indra/newview/llvoavatarself.h | 1 | 
5 files changed, 53 insertions, 51 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 da4960b69d..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,8 +173,19 @@ BOOL LLViewerJointAttachment::addObject(LLViewerObject* object)  		// Pass through anyway to let setupDrawable()  		// re-connect object to the joint correctly  	} +	 +	// Two instances of the same inventory item attached -- +	// Request detach, and kill the object in the meantime. +	if (getAttachedObject(object->getAttachmentItemID())) +	{ +		llinfos << "(same object re-attached)" << llendl; +		object->markDead(); + +		// If this happens to be attached to self, then detach. +		LLVOAvatarSelf::detachAttachmentIntoInventory(object->getAttachmentItemID()); +		return FALSE; +	} -	object->extractAttachmentItemID();  	mAttachedObjects.push_back(object);  	setupDrawable(object); @@ -195,7 +208,7 @@ BOOL LLViewerJointAttachment::addObject(LLViewerObject* object)  	}  	calcLOD();  	mUpdateXform = TRUE; - +	  	return TRUE;  } diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 73ea629bc3..09e50dcb90 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -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); 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 | 
