diff options
author | coyot@coyot-sager-PC <coyot@coyot-sager-PC> | 2017-03-16 22:21:49 +0100 |
---|---|---|
committer | coyot@coyot-sager-PC <coyot@coyot-sager-PC> | 2017-03-16 22:21:49 +0100 |
commit | fc56311ebf05d6d6c155e097bffbff9feb0c411f (patch) | |
tree | 56445b8c652b930dfc4cec7efe51d934d151eafb /indra/newview/llappearancemgr.cpp | |
parent | 3a3da6e4a76859f32dc36491fde2992e92ae57b5 (diff) | |
parent | d7f5122ee9e12b5aec14b15517c3a4c0021544ce (diff) |
pull from viewer64 gate
Diffstat (limited to 'indra/newview/llappearancemgr.cpp')
-rw-r--r-- | indra/newview/llappearancemgr.cpp | 46 |
1 files changed, 43 insertions, 3 deletions
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index fc4be98fbd..feb981217d 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -1227,11 +1227,12 @@ void LLWearableHoldingPattern::onWearableAssetFetch(LLViewerWearable *wearable) return; } + U32 use_count = 0; for (LLWearableHoldingPattern::found_list_t::iterator iter = getFoundList().begin(); - iter != getFoundList().end(); ++iter) + iter != getFoundList().end(); ++iter) { LLFoundData& data = *iter; - if(wearable->getAssetID() == data.mAssetID) + if (wearable->getAssetID() == data.mAssetID) { // Failing this means inventory or asset server are corrupted in a way we don't handle. if ((data.mWearableType >= LLWearableType::WT_COUNT) || (wearable->getType() != data.mWearableType)) @@ -1240,9 +1241,48 @@ void LLWearableHoldingPattern::onWearableAssetFetch(LLViewerWearable *wearable) break; } - data.mWearable = wearable; + if (use_count == 0) + { + data.mWearable = wearable; + use_count++; + } + else + { + LLViewerInventoryItem* wearable_item = gInventory.getItem(data.mItemID); + if (wearable_item && wearable_item->isFinished() && wearable_item->getPermissions().allowModifyBy(gAgentID)) + { + // We can't edit and do some other interactions with same asset twice, copy it + // Note: can't update incomplete items. Usually attached from previous viewer build, but + // consider adding fetch and completion callback + LLViewerWearable* new_wearable = LLWearableList::instance().createCopy(wearable, wearable->getName()); + data.mWearable = new_wearable; + data.mAssetID = new_wearable->getAssetID(); + + // Update existing inventory item + wearable_item->setAssetUUID(new_wearable->getAssetID()); + wearable_item->setTransactionID(new_wearable->getTransactionID()); + gInventory.updateItem(wearable_item, LLInventoryObserver::INTERNAL); + wearable_item->updateServer(FALSE); + + use_count++; + } + else + { + // Note: technically a bug, LLViewerWearable can identify only one item id at a time, + // yet we are tying it to multiple items here. + // LLViewerWearable need to support more then one item. + LL_WARNS() << "Same LLViewerWearable is used by multiple items! " << wearable->getAssetID() << LL_ENDL; + data.mWearable = wearable; + } + } } } + + if (use_count > 1) + { + LL_WARNS() << "Copying wearable, multiple asset id uses! " << wearable->getAssetID() << LL_ENDL; + gInventory.notifyObservers(); + } } static void onWearableAssetFetch(LLViewerWearable* wearable, void* data) |