diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 01fd861a7..6666ca2fc 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -34,6 +34,30 @@ Value 0 + AO.Period + + Comment + Period when changing stands in seconds + Persist + 1 + Type + F32 + Value + 20.0 + + Blacklist.Settings + + Comment + List for blacklisting assets DO NOT EDIT DIRECTLY use the floater + Persist + 1 + Type + LLSD + Value + + + + UserChatColor Comment diff --git a/indra/newview/llao.cpp b/indra/newview/llao.cpp index 3de678d30..a6a66f265 100644 --- a/indra/newview/llao.cpp +++ b/indra/newview/llao.cpp @@ -6,29 +6,188 @@ #include "lluictrlfactory.h" #include "llfilepicker.h" #include "llsdserialize.h" +#include "llagent.h" +#include "llvoavatar.h" +std::list LLAO::mStandOverrides; std::map LLAO::mOverrides; LLFloaterAO* LLFloaterAO::sInstance; +BOOL LLAO::mEnabled = FALSE; +F32 LLAO::mPeriod; +LLAOStandTimer* LLAO::mTimer = NULL; +LLAOStandTimer::LLAOStandTimer(F32 period) : LLEventTimer(period) +{ +} +BOOL LLAOStandTimer::tick() +{ + if(!mPaused && LLAO::isEnabled() && !LLAO::mStandOverrides.empty()) + { + LLVOAvatar* avatarp = gAgent.getAvatarObject(); + if (avatarp) + { + for ( LLVOAvatar::AnimIterator anim_it = + avatarp->mPlayingAnimations.begin(); + anim_it != avatarp->mPlayingAnimations.end(); + anim_it++) + { + if(LLAO::isStand(anim_it->first)) + { + //back is always last played, front is next + avatarp->stopMotion(LLAO::mStandOverrides.back()); + avatarp->startMotion(LLAO::mStandOverrides.front()); + LLAO::mStandOverrides.push_back(LLAO::mStandOverrides.front()); + LLAO::mStandOverrides.pop_front(); + LLFloaterAO* ao = LLFloaterAO::sInstance; + if(ao) + { + ao->mStandsCombo->setSimple(LLStringExplicit(LLAO::mStandOverrides.back().asString())); + } + } + } + } + } + return FALSE; +} + +void LLAOStandTimer::pause() +{ + if(mPaused) return; + LLVOAvatar* avatarp = gAgent.getAvatarObject(); + if (avatarp) + { + gAgent.sendAnimationRequest(LLAO::mStandOverrides.back(), ANIM_REQUEST_STOP); + avatarp->stopMotion(LLAO::mStandOverrides.back()); + } + mEventTimer.reset(); + mEventTimer.stop(); + mPaused = TRUE; +} + +void LLAOStandTimer::resume() +{ + if(!mPaused) return; + LLVOAvatar* avatarp = gAgent.getAvatarObject(); + if (avatarp) + { + gAgent.sendAnimationRequest(LLAO::mStandOverrides.back(), ANIM_REQUEST_START); + avatarp->startMotion(LLAO::mStandOverrides.back()); + } + mEventTimer.reset(); + mEventTimer.start(); + mPaused = FALSE; +} + +void LLAOStandTimer::reset() +{ + mEventTimer.reset(); +} +//static +void LLAO::setup() +{ + mEnabled = gSavedSettings.getBOOL("AO.Enabled"); + mPeriod = gSavedSettings.getF32("AO.Period"); + if(mEnabled) mTimer = new LLAOStandTimer(mPeriod); + gSavedSettings.getControl("AO.Enabled")->getSignal()->connect(boost::bind(&handleAOEnabledChanged, _1)); + gSavedSettings.getControl("AO.Period")->getSignal()->connect(boost::bind(&handleAOPeriodChanged, _1)); +} +//static +void LLAO::runAnims(BOOL enabled) +{ + LLVOAvatar* avatarp = gAgent.getAvatarObject(); + if (avatarp) + { + for ( LLVOAvatar::AnimIterator anim_it = + avatarp->mPlayingAnimations.begin(); + anim_it != avatarp->mPlayingAnimations.end(); + anim_it++) + { + if(LLAO::mOverrides.find(anim_it->first) != LLAO::mOverrides.end()) + { + LLUUID anim_id = mOverrides[anim_it->first]; + // this is an override anim + if(enabled) + { + // make override start + avatarp->startMotion(anim_id); + } + else + { + avatarp->stopMotion(anim_id); + gAgent.sendAnimationRequest(anim_id, ANIM_REQUEST_STOP); + } + } + } + } +} +//static +bool LLAO::handleAOPeriodChanged(const LLSD& newvalue) +{ + F32 value = (F32)newvalue.asReal(); + mPeriod = value; + if(mTimer) + delete mTimer; + if(mEnabled) + mTimer = new LLAOStandTimer(mPeriod); + else + mTimer = NULL; + return true; +} +//static +bool LLAO::handleAOEnabledChanged(const LLSD& newvalue) +{ + BOOL value = newvalue.asBoolean(); + mEnabled = value; + runAnims(value); + if(mTimer) + delete mTimer; + if(mEnabled) + mTimer = new LLAOStandTimer(mPeriod); + else + mTimer = NULL; + return true; +} +//static +BOOL LLAO::isStand(LLUUID _id) +{ + std::string id = _id.asString(); + //ALL KNOWN STANDS + if(id == "2408fe9e-df1d-1d7d-f4ff-1384fa7b350f") return TRUE; + if(id == "15468e00-3400-bb66-cecc-646d7c14458e") return TRUE; + if(id == "370f3a20-6ca6-9971-848c-9a01bc42ae3c") return TRUE; + if(id == "42b46214-4b44-79ae-deb8-0df61424ff4b") return TRUE; + if(id == "f22fed8b-a5ed-2c93-64d5-bdd8b93c889f") return TRUE; + return FALSE; +} //static void LLAO::refresh() { mOverrides.clear(); + mStandOverrides.clear(); LLSD settings = gSavedPerAccountSettings.getLLSD("AO.Settings"); + //S32 version = (S32)settings["version"].asInteger(); LLSD overrides = settings["overrides"]; LLSD::map_iterator sd_it = overrides.beginMap(); LLSD::map_iterator sd_end = overrides.endMap(); for( ; sd_it != sd_end; sd_it++) { - // don't allow override to be used as a trigger - if(mOverrides.find(sd_it->second.asUUID()) == mOverrides.end()) - { - // ignore if override is null key... - if(sd_it->second.asUUID().notNull()) - { - mOverrides[LLUUID(sd_it->first)] = sd_it->second.asUUID(); - } - } + // ignore if override is null key... + if(sd_it->second.asUUID().isNull() + // don't allow override to be used as a trigger + || mOverrides.find(sd_it->second.asUUID()) != mOverrides.end()) + continue; + + if(sd_it->first == "stands") + for(LLSD::array_iterator itr = sd_it->second.beginArray(); + itr != sd_it->second.endArray(); ++itr) + //list of listness + mStandOverrides.push_back(itr->asUUID()); + else if(LLAO::isStand(LLUUID(sd_it->first))) + //list of listness + mStandOverrides.push_back(sd_it->second.asUUID()); + else + //add to the list + mOverrides[LLUUID(sd_it->first)] = sd_it->second.asUUID(); } } @@ -68,9 +227,13 @@ BOOL LLFloaterAO::postBuild(void) childSetCommitCallback("line_fly_up", onCommitAnim, this); childSetCommitCallback("line_crouching", onCommitAnim, this); childSetCommitCallback("line_fly_down", onCommitAnim, this); - childSetCommitCallback("line_stand1", onCommitAnim, this); - childSetCommitCallback("line_stand2", onCommitAnim, this); - childSetCommitCallback("line_stand3", onCommitAnim, this); + LLComboBox* combo = getChild( "combo_stands"); + combo->setAllowTextEntry(TRUE,36,TRUE); + combo->setCommitCallback(onCommitStands); + combo->setCallbackUserData(this); + mStandsCombo = combo; + childSetAction("combo_stands_add", onClickStandAdd, this); + childSetAction("combo_stands_delete", onClickStandRemove, this); childSetCommitCallback("line_hover", onCommitAnim, this); childSetCommitCallback("line_sitting", onCommitAnim, this); childSetCommitCallback("line_prejump", onCommitAnim, this); @@ -93,33 +256,53 @@ std::string LLFloaterAO::idstr(LLUUID id) void LLFloaterAO::refresh() { - LLSD settings = gSavedPerAccountSettings.getLLSD("AO.Settings"); - LLSD overrides = settings["overrides"]; - childSetText("line_walking", idstr(overrides["6ed24bd8-91aa-4b12-ccc7-c97c857ab4e0"])); - childSetText("line_running", idstr(overrides["05ddbff8-aaa9-92a1-2b74-8fe77a29b445"])); - childSetText("line_crouchwalk", idstr(overrides["47f5f6fb-22e5-ae44-f871-73aaaf4a6022"])); - childSetText("line_flying", idstr(overrides["aec4610c-757f-bc4e-c092-c6e9caf18daf"])); - childSetText("line_turn_left", idstr(overrides["56e0ba0d-4a9f-7f27-6117-32f2ebbf6135"])); - childSetText("line_turn_right", idstr(overrides["2d6daa51-3192-6794-8e2e-a15f8338ec30"])); - childSetText("line_jumping", idstr(overrides["2305bd75-1ca9-b03b-1faa-b176b8a8c49e"])); - childSetText("line_fly_up", idstr(overrides["62c5de58-cb33-5743-3d07-9e4cd4352864"])); - childSetText("line_crouching", idstr(overrides["201f3fdf-cb1f-dbec-201f-7333e328ae7c"])); - childSetText("line_fly_down", idstr(overrides["20f063ea-8306-2562-0b07-5c853b37b31e"])); - childSetText("line_stand1", idstr(overrides["2408fe9e-df1d-1d7d-f4ff-1384fa7b350f"])); - childSetText("line_stand2", idstr(overrides["15468e00-3400-bb66-cecc-646d7c14458e"])); - childSetText("line_stand3", idstr(overrides["370f3a20-6ca6-9971-848c-9a01bc42ae3c"])); - childSetText("line_hover", idstr(overrides["4ae8016b-31b9-03bb-c401-b1ea941db41d"])); - childSetText("line_sitting", idstr(overrides["1a5fe8ac-a804-8a5d-7cbd-56bd83184568"])); - childSetText("line_prejump", idstr(overrides["7a4e87fe-de39-6fcb-6223-024b00893244"])); - childSetText("line_falling", idstr(overrides["666307d9-a860-572d-6fd4-c3ab8865c094"])); - childSetText("line_stride", idstr(overrides["1cb562b0-ba21-2202-efb3-30f82cdf9595"])); - childSetText("line_soft_landing", idstr(overrides["7a17b059-12b2-41b1-570a-186368b6aa6f"])); - childSetText("line_medium_landing", idstr(overrides["f4f00d6e-b9fe-9292-f4cb-0ae06ea58d57"])); - childSetText("line_hard_landing", idstr(overrides["3da1d753-028a-5446-24f3-9c9b856d9422"])); - childSetText("line_flying_slow", idstr(overrides["2b5a38b2-5e00-3a97-a495-4c826bc443e6"])); - childSetText("line_sitting_on_ground", idstr(overrides["1a2bd58e-87ff-0df8-0b4c-53e047b0bb6e"])); + childSetText("line_walking", idstr(LLAO::mOverrides[LLUUID("6ed24bd8-91aa-4b12-ccc7-c97c857ab4e0")])); + childSetText("line_running", idstr(LLAO::mOverrides[LLUUID("05ddbff8-aaa9-92a1-2b74-8fe77a29b445")])); + childSetText("line_crouchwalk", idstr(LLAO::mOverrides[LLUUID("47f5f6fb-22e5-ae44-f871-73aaaf4a6022")])); + childSetText("line_flying", idstr(LLAO::mOverrides[LLUUID("aec4610c-757f-bc4e-c092-c6e9caf18daf")])); + childSetText("line_turn_left", idstr(LLAO::mOverrides[LLUUID("56e0ba0d-4a9f-7f27-6117-32f2ebbf6135")])); + childSetText("line_turn_right", idstr(LLAO::mOverrides[LLUUID("2d6daa51-3192-6794-8e2e-a15f8338ec30")])); + childSetText("line_jumping", idstr(LLAO::mOverrides[LLUUID("2305bd75-1ca9-b03b-1faa-b176b8a8c49e")])); + childSetText("line_fly_up", idstr(LLAO::mOverrides[LLUUID("62c5de58-cb33-5743-3d07-9e4cd4352864")])); + childSetText("line_crouching", idstr(LLAO::mOverrides[LLUUID("201f3fdf-cb1f-dbec-201f-7333e328ae7c")])); + childSetText("line_fly_down", idstr(LLAO::mOverrides[LLUUID("20f063ea-8306-2562-0b07-5c853b37b31e")])); + mStandsCombo->clearRows(); + for(std::list::iterator itr = LLAO::mStandOverrides.begin();itr != LLAO::mStandOverrides.end(); + itr++) + { + mStandsCombo->add((*itr).asString()); + } + mStandsCombo->setSimple(LLStringExplicit(LLAO::mStandOverrides.back().asString())); + childSetText("line_hover", idstr(LLAO::mOverrides[LLUUID("4ae8016b-31b9-03bb-c401-b1ea941db41d")])); + childSetText("line_sitting", idstr(LLAO::mOverrides[LLUUID("1a5fe8ac-a804-8a5d-7cbd-56bd83184568")])); + childSetText("line_prejump", idstr(LLAO::mOverrides[LLUUID("7a4e87fe-de39-6fcb-6223-024b00893244")])); + childSetText("line_falling", idstr(LLAO::mOverrides[LLUUID("666307d9-a860-572d-6fd4-c3ab8865c094")])); + childSetText("line_stride", idstr(LLAO::mOverrides[LLUUID("1cb562b0-ba21-2202-efb3-30f82cdf9595")])); + childSetText("line_soft_landing", idstr(LLAO::mOverrides[LLUUID("7a17b059-12b2-41b1-570a-186368b6aa6f")])); + childSetText("line_medium_landing", idstr(LLAO::mOverrides[LLUUID("f4f00d6e-b9fe-9292-f4cb-0ae06ea58d57")])); + childSetText("line_hard_landing", idstr(LLAO::mOverrides[LLUUID("3da1d753-028a-5446-24f3-9c9b856d9422")])); + childSetText("line_flying_slow", idstr(LLAO::mOverrides[LLUUID("2b5a38b2-5e00-3a97-a495-4c826bc443e6")])); + childSetText("line_sitting_on_ground", idstr(LLAO::mOverrides[LLUUID("1a2bd58e-87ff-0df8-0b4c-53e047b0bb6e")])); } +// static +void LLFloaterAO::onCommitStands(LLUICtrl* ctrl, void* user_data) +{ + //LLFloaterAO* floater = (LLFloaterAO*)user_data; + LLUUID id = LLUUID(ctrl->getValue()); + std::list::iterator itr = std::find(LLAO::mStandOverrides.begin(),LLAO::mStandOverrides.end(),id); + LLVOAvatar* avatarp = gAgent.getAvatarObject(); + if(id.notNull() && itr != LLAO::mStandOverrides.end()) + { + //back is always last played + avatarp->stopMotion(LLAO::mStandOverrides.back()); + avatarp->startMotion(id); + LLAO::mStandOverrides.push_back(id); + LLAO::mStandOverrides.erase(itr); + LLAO::mTimer->reset(); + } + onCommitAnim(NULL,user_data); +} // static void LLFloaterAO::onCommitAnim(LLUICtrl* ctrl, void* user_data) { @@ -147,12 +330,6 @@ void LLFloaterAO::onCommitAnim(LLUICtrl* ctrl, void* user_data) if(id.notNull()) overrides["201f3fdf-cb1f-dbec-201f-7333e328ae7c"] = id; id = LLUUID(floater->childGetValue("line_fly_down").asString()); if(id.notNull()) overrides["20f063ea-8306-2562-0b07-5c853b37b31e"] = id; - id = LLUUID(floater->childGetValue("line_stand1").asString()); - if(id.notNull()) overrides["2408fe9e-df1d-1d7d-f4ff-1384fa7b350f"] = id; - id = LLUUID(floater->childGetValue("line_stand2").asString()); - if(id.notNull()) overrides["15468e00-3400-bb66-cecc-646d7c14458e"] = id; - id = LLUUID(floater->childGetValue("line_stand3").asString()); - if(id.notNull()) overrides["370f3a20-6ca6-9971-848c-9a01bc42ae3c"] = id; id = LLUUID(floater->childGetValue("line_hover").asString()); if(id.notNull()) overrides["4ae8016b-31b9-03bb-c401-b1ea941db41d"] = id; id = LLUUID(floater->childGetValue("line_sitting").asString()); @@ -173,14 +350,59 @@ void LLFloaterAO::onCommitAnim(LLUICtrl* ctrl, void* user_data) if(id.notNull()) overrides["2b5a38b2-5e00-3a97-a495-4c826bc443e6"] = id; id = LLUUID(floater->childGetValue("line_sitting_on_ground").asString()); if(id.notNull()) overrides["1a2bd58e-87ff-0df8-0b4c-53e047b0bb6e"] = id; + for(std::list::iterator itr = LLAO::mStandOverrides.begin();itr != LLAO::mStandOverrides.end(); + itr++) + { + overrides["stands"].append((*itr)); + } LLSD settings; - settings["version"] = 1; + settings["version"] = 2; settings["overrides"] = overrides; gSavedPerAccountSettings.setLLSD("AO.Settings", settings); LLAO::refresh(); floater->refresh(); } +//static +void LLFloaterAO::onClickStandRemove(void* user_data) +{ + LLFloaterAO* floater = (LLFloaterAO*)user_data; + LLUUID id = LLUUID(floater->mStandsCombo->getValue()); + std::list::iterator itr = std::find(LLAO::mStandOverrides.begin(),LLAO::mStandOverrides.end(),id); + LLVOAvatar* avatarp = gAgent.getAvatarObject(); + if(id.notNull() && itr != LLAO::mStandOverrides.end()) + { + //back is always last played, front is next + avatarp->stopMotion(id); + LLAO::mStandOverrides.erase(itr); + avatarp->startMotion(LLAO::mStandOverrides.front()); + LLAO::mStandOverrides.push_back(LLAO::mStandOverrides.front()); + LLAO::mStandOverrides.pop_front(); + + floater->refresh(); + LLAO::mTimer->reset(); + } + onCommitAnim(NULL,user_data); +} +//static +void LLFloaterAO::onClickStandAdd(void* user_data) +{ + LLFloaterAO* floater = (LLFloaterAO*)user_data; + LLUUID id = LLUUID(floater->mStandsCombo->getValue()); + std::list::iterator itr = std::find(LLAO::mStandOverrides.begin(),LLAO::mStandOverrides.end(),id); + LLVOAvatar* avatarp = gAgent.getAvatarObject(); + if(id.notNull() && itr == LLAO::mStandOverrides.end()) + { + //back is always last played + avatarp->stopMotion(LLAO::mStandOverrides.back()); + avatarp->startMotion(id); + LLAO::mStandOverrides.push_back(id); + + floater->refresh(); + LLAO::mTimer->reset(); + } + onCommitAnim(NULL,user_data); +} //static void LLFloaterAO::onClickSave(void* user_data) { @@ -208,8 +430,15 @@ void LLFloaterAO::onClickLoad(void* user_data) LLSD data; if(LLSDSerialize::fromXML(data, xml_file) >= 1) { + if(LLAO::isEnabled()) + LLAO::runAnims(FALSE); + gSavedPerAccountSettings.setLLSD("AO.Settings", data); LLAO::refresh(); + + if(LLAO::isEnabled()) + LLAO::runAnims(TRUE); + floater->refresh(); } xml_file.close(); diff --git a/indra/newview/llao.h b/indra/newview/llao.h index ccf4d9f8a..dd3576cad 100644 --- a/indra/newview/llao.h +++ b/indra/newview/llao.h @@ -3,13 +3,36 @@ #define LL_LLAO_H #include "llfloater.h" +#include "llcombobox.h" + +class LLAOStandTimer : public LLEventTimer +{ +public: + LLAOStandTimer(F32 period); + BOOL tick(); + void pause(); + void resume(); + void reset(); +private: + BOOL mPaused; +}; class LLAO { public: + static void setup(); static std::map mOverrides; - + static std::list mStandOverrides; + static BOOL isEnabled(){ return mEnabled; } + static BOOL isStand(LLUUID _id); static void refresh(); + static void runAnims(BOOL enabled); + static bool handleAOEnabledChanged(const LLSD& newvalue); + static bool handleAOPeriodChanged(const LLSD& newvalue); + static LLAOStandTimer* mTimer; +private: + static BOOL mEnabled; + static F32 mPeriod; }; class LLFloaterAO : public LLFloater @@ -21,11 +44,16 @@ public: BOOL postBuild(void); void refresh(); static void onCommitAnim(LLUICtrl* ctrl, void* user_data); + static void onCommitStands(LLUICtrl* ctrl,void* user_data); + static void onClickStandRemove(void* user_data); + static void onClickStandAdd(void* user_data); static void onClickSave(void* user_data); static void onClickLoad(void* user_data); private: virtual ~LLFloaterAO(); std::string idstr(LLUUID id); // silly utility +public: + LLComboBox* mStandsCombo; }; #endif diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 40bc12b27..c309d0e98 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -96,6 +96,7 @@ #include "llimageworker.h" // +#include "llao.h" //for setting up listener #include "lldelayeduidelete.h" #include "llbuildnewviewsscheduler.h" // @@ -687,6 +688,10 @@ bool LLAppViewer::init() settings_to_globals(); // Setup settings listeners settings_setup_listeners(); + // + // Setup AO settings listener + LLAO::setup(); + // // Modify settings based on system configuration and compile options settings_modify(); diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 640a31e8f..89272b844 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -6804,37 +6804,6 @@ void menu_toggle_control( void* user_data ) // Doubleclick actions - there can be only one gSavedSettings.setBOOL( "DoubleClickAutoPilot", FALSE ); } - // - else if(std::string(static_cast(user_data)) == "AO.Enabled") - { - LLVOAvatar* avatarp = gAgent.getAvatarObject(); - if (avatarp) - { - for ( LLVOAvatar::AnimIterator anim_it = - avatarp->mPlayingAnimations.begin(); - anim_it != avatarp->mPlayingAnimations.end(); - anim_it++) - { - if(LLAO::mOverrides.find(anim_it->first) != LLAO::mOverrides.end()) - { - // this is an override anim - if(checked) - { - // make override stop - avatarp->stopMotion(anim_it->first); - gAgent.sendAnimationRequest(anim_it->first, ANIM_REQUEST_STOP); - } - else - { - // make override start - gSavedSettings.setBOOL("AO.Enabled", TRUE); - avatarp->startMotion(anim_it->first); - } - } - } - } - } - // gSavedSettings.setBOOL(setting, !checked); } diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 9d514a745..710bfc24d 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -5097,8 +5097,12 @@ BOOL LLVOAvatar::startMotion(const LLUUID& id, F32 time_offset) // if(mIsSelf) { - if(gSavedSettings.getBOOL("AO.Enabled")) + if(LLAO::isEnabled()) { + if(LLAO::isStand(id)) + { + LLAO::mTimer->resume(); + } if(LLAO::mOverrides.find(id) != LLAO::mOverrides.end()) { // avoid infinite loops! @@ -5143,8 +5147,13 @@ BOOL LLVOAvatar::stopMotion(const LLUUID& id, BOOL stop_immediate) if (mIsSelf) { // - if(gSavedSettings.getBOOL("AO.Enabled")) + if(LLAO::isEnabled()) { + if(LLAO::isStand(id)) + { + //help the timer get started again + LLAO::mTimer->pause(); + } if( (LLAO::mOverrides.find(id) != LLAO::mOverrides.end()) && (id != LLAO::mOverrides[id]) ) { diff --git a/indra/newview/skins/default/xui/en-us/floater_ao.xml b/indra/newview/skins/default/xui/en-us/floater_ao.xml index 22c09667a..f300a51bf 100755 --- a/indra/newview/skins/default/xui/en-us/floater_ao.xml +++ b/indra/newview/skins/default/xui/en-us/floater_ao.xml @@ -1,10 +1,17 @@