diff options
author | Nyx Linden <nyx@lindenlab.com> | 2013-04-02 12:51:45 -0400 |
---|---|---|
committer | Nyx Linden <nyx@lindenlab.com> | 2013-04-02 12:51:45 -0400 |
commit | 49731dd21dec5fb8b6e5781940bab5f5fa9600a2 (patch) | |
tree | 18b9bf7f9192537ebdcffa686a70a0d519809932 /indra | |
parent | 15b91b9149a5cdcfd52c33f1dd41f4e0e757e270 (diff) |
SH-4051 FIX problem with teen account and undershirt layers
Updated logic for teen accounts, to ensure that during any transition
that they are wearing at least one undershirt wearable and one
underpants wearable.
Diffstat (limited to 'indra')
-rw-r--r-- | indra/newview/llagentwearables.cpp | 50 | ||||
-rw-r--r-- | indra/newview/llagentwearables.h | 2 |
2 files changed, 42 insertions, 10 deletions
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index ba04991a02..3cee7826fd 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -1124,14 +1124,19 @@ void LLAgentWearables::addWearableToAgentInventory(LLPointer<LLInventoryCallback cb); } -void LLAgentWearables::removeWearable(const LLWearableType::EType type, bool do_remove_all, U32 index) +void LLAgentWearables::removeWearable(const LLWearableType::EType type, bool do_remove_all, U32 index, BOOL will_replace) { - if (gAgent.isTeen() && + if (gAgent.isTeen() && (type == LLWearableType::WT_UNDERSHIRT || type == LLWearableType::WT_UNDERPANTS)) { // Can't take off underclothing in simple UI mode or on PG accounts - // TODO: enable the removing of a single undershirt/underpants if multiple are worn. - Nyx - return; + + if (getWearableCount(type) < 2 && !will_replace) + { + // if there is 0 or 1 undergarment worn, and we're not going to be immediately adding another, + // we cannot allow the removal for teen accounts + return; + } } if (getWearableCount(type) == 0) { @@ -1239,6 +1244,31 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it { llinfos << "setWearableOutfit() start" << llendl; + S32 count = wearables.count(); + llassert(items.count() == count); + S32 i; + + bool has_undershirt = false; + bool has_underpants = false; + + for (i = 0; i < count; i++) + { + LLViewerWearable* new_wearable = wearables[i]; + if (new_wearable) + { + const LLWearableType::EType type = new_wearable->getType(); + if (type == LLWearableType::WT_UNDERSHIRT) + { + has_undershirt = true; + } + if (type == LLWearableType::WT_UNDERPANTS) + { + has_underpants = true; + } + } + } + + // TODO: Removed check for ensuring that teens don't remove undershirt and underwear. Handle later if (remove) { @@ -1248,15 +1278,17 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it { if (LLWearableType::getAssetType((LLWearableType::EType)type) == LLAssetType::AT_CLOTHING) { - removeWearable((LLWearableType::EType)type, true, 0); + bool will_replace = false; + if ((type == LLWearableType::WT_UNDERSHIRT && has_undershirt) || + (type == LLWearableType::WT_UNDERPANTS && has_underpants)) + { + will_replace = true; + } + removeWearable((LLWearableType::EType)type, true, 0, will_replace); } } } - S32 count = wearables.count(); - llassert(items.count() == count); - - S32 i; for (i = 0; i < count; i++) { LLViewerWearable* new_wearable = wearables[i]; diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h index 5be4648636..f2f224a573 100644 --- a/indra/newview/llagentwearables.h +++ b/indra/newview/llagentwearables.h @@ -146,7 +146,7 @@ private: // Removing wearables //-------------------------------------------------------------------- public: - void removeWearable(const LLWearableType::EType type, bool do_remove_all /*= false*/, U32 index /*= 0*/); + void removeWearable(const LLWearableType::EType type, bool do_remove_all /*= false*/, U32 index /*= 0*/, BOOL will_replace = false); private: void removeWearableFinal(const LLWearableType::EType type, bool do_remove_all /*= false*/, U32 index /*= 0*/); protected: |