summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
authorNyx Linden <nyx@lindenlab.com>2013-04-02 12:51:45 -0400
committerNyx Linden <nyx@lindenlab.com>2013-04-02 12:51:45 -0400
commit49731dd21dec5fb8b6e5781940bab5f5fa9600a2 (patch)
tree18b9bf7f9192537ebdcffa686a70a0d519809932 /indra
parent15b91b9149a5cdcfd52c33f1dd41f4e0e757e270 (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.cpp50
-rw-r--r--indra/newview/llagentwearables.h2
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: