master
prep@lindenlab.com 2013-04-02 17:27:20 -05:00
commit 96d87aa85e
3 changed files with 43 additions and 11 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:

View File

@ -2144,7 +2144,7 @@ void LLVOAvatar::idleUpdateVoiceVisualizer(bool voice_enabled)
{
LLVector3 tagPos = mRoot->getWorldPosition();
tagPos[VZ] -= mPelvisToFoot;
tagPos[VZ] += ( mBodySize[VZ] + mAvatarOffset[VZ] + 0.125f );
tagPos[VZ] += ( mBodySize[VZ] + 0.125f );
mVoiceVisualizer->setVoiceSourceWorldPosition( tagPos );
}
}//if ( voiceEnabled )