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.
master
Nyx Linden 2013-04-02 12:51:45 -04:00
parent 15b91b9149
commit 49731dd21d
2 changed files with 42 additions and 10 deletions

View File

@ -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];

View File

@ -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: